代码之家  ›  专栏  ›  技术社区  ›  ZyX

丢弃<expr>映射中的计数

  •  4
  • ZyX  · 技术社区  · 14 年前

    例如,我有以下表达式映射:

        function! DelNthSpace()
            let col=match(getline('.'), '[[:blank:] ]', col('.'), v:count1)
            return virtcol([line('.'), col+1])."|s \e"
        endfunction
        nnoremap  s DelNthSpace()
    
    你看, v:count1 已在此处处理。但是如果我试图用位于虚拟列的函数替换第二个空间 35 (如果将光标放在RETURN语句上,则会尝试转到列 235 替换它,因为它将从 2s 2{DelNthSpace()} -gt; 235|s ^[ . 现在我准备的是毫无用处的 | 在返回语句的开头,它会消耗不需要的计数,但我不喜欢这个解决方案,因为它使用两个动作而不是一个。

    更新 :我应该提供更多的上下文:

    function! ToNthSpace()
        let col=match(getline('.'), '[[:blank:] ]', col('.'), v:count1)
        return virtcol([line('.'), col+1])."|"
    endfunction
    noremap <expr> s ToNthSpace()
    

    有许多函数正在使用这些函数,我们模仿replace命令,但对其参数进行音译(因此,在调用 r$ii 将用替换字符 $ 并插入 i , \tr$ii 将用替换字符 ∬ ,之间的关系相同 t \tt 还有一些是运动。因为这些函数定义了运动,所以我不能使用 :<C-u> ,它将离开视觉模式(或者我将不得不添加一个hack,它将告诉从哪个模式函数被调用)。我不知道这一点,我不能为正常模式和视觉模式定义不同的映射。

    2 回复  |  直到 6 年前
        1
  •  2
  •   too much php    14 年前

    无法让Vim忽略 <expr> 但是,可以轻松地更改映射以使函数正常工作:

    nnoremap s :<C-U>exe 'normal!' DelNthSpace()<CR>
    

    :help v:count 有关使用的信息 CTRL+U 删除计数。

        2
  •  0
  •   doraemon    6 年前

    总结@alexey提到的内容以及我的测试 operator-pending 模式,您可以执行以下操作

    nnoremap <expr> s "@_" . ToNthSpace()
    vnoremap <expr> s "@_" . ToNthSpace()
    onoremap <expr> s printf(":normal %s\<cr>", ToNthSpace())
    

    然后 2 已经在示例中键入的内容将无效