在操作员模式下更换动作

时间:2014-04-14 10:45:22

标签: vim

我正在尝试在与运营商一起使用时更改ge动作的功能。我希望它不会在目标词的最后一个字符上运行,而是只使用直到目标词的最后一个字符,类似于w

示例:

foo bar
     ^

应该导致 当fooar使用光标位于^

时,foar代替dge

我对Vimscript一无所知,现在我非常依赖exe。我写的这个快速尝试似乎充满了错误。变量似乎根本不起作用。

我的主要想法是在操作员模式下键入ge并且希望使用正确的参数调用函数时逃避。然后在起始位置设置一个标记,向左移动一列(以确保它可以重复运动,即使这只是操作员模式),移动ge的设定量然后移动一个列右(我的主要目标在这里)并删除直到设置标记。

如果有人能够指出我所犯的错误,我们将不胜感激!

function! FixGE(count, operator)
    exe 'normal m['
    exe 'normal h'
    exe count.'normal ge'
    exe 'normal l'
    exe operator.'normal `['
endfunction
onoremap ge <esc>:call FixGE(v:prevcount, v:operator)<cr>

2 个答案:

答案 0 :(得分:1)

使用gef运算符可以在不更改t动作的情况下解决您的示例:

  • dTo
  • dF(d + F +&lt; space&gt;)

如果您仍然觉得需要覆盖ge的默认行为,请检查Ingo Karkat's plugin, CountJump : Create custom motions and text objects via repeated jumps

DESCRIPTION
Though it is not difficult to write a custom movement (basically a :map
that executes some kind of search or jump) and a custom text-object (an
:omap that selects a range of text), this is too complex for a novice user
and often repetitive. 

答案 1 :(得分:1)

这有点接近(未经测试):

function! FixGE(count, operator)
    exe 'normal m['
    exe 'normal h'
    exe 'normal ' . a:count . 'ge'
    exe 'normal l'
    exe 'normal ' . a:operator . '`['
endfunction
onoremap ge <esc>:call FixGE(v:prevcount, v:operator)<cr>

函数参数必须使用:a前缀(或者我认为是sigil)。我知道count是保留变量::let count = 7给出错误。我认为将它用作函数参数是可以的。

我还将:normal放在两行的开头,而不是在中间。