2014-02-15 48 views
3

我创建了一个映射来将当前行向上移动一行。映射有意想不到的效果

:map _ ddkP 

它的工作原理,除了在第一行执行时,它删除第一行。

我预计什么都不会发生,因为他们在第一行执行dd,k,P,没有任何反应。我哪里错了?

回答

1

你必须使用一个map命令计算表达式,所以你必须添加<expr>和使用来检查,如果你的光标在该文件的第一行的功能。

所以,这个功能添加到您的vimrc文件:

function! Swap() 
    if line('.') > 1 
     return 'ddkP' 
    endif 
    return '' 
endfunction 

,并使用以下命令map

:map <expr> _ Swap() 

这样,当if条件成功只会将互换额度。

8

当你ddkP,这些命令分别执行:

  1. 当前行被删除
  2. 光标向上移动一行
  3. 先前猛拉线之上的粘贴的当前行

因为它们是隔离的,所以一个命令失败并不妨碍进一步执行c ommands。在你的情况下,Vim无法向上移动一行,但它可以完美粘贴在当前行的上方。

当作为单个命令执行时,作为宏,命令失败会停止执行整个宏,并且不执行其他命令。

在你的例子中,第一步dd工作,但k不能移动当前行上方的光标,一切都停止了:Vim甚至从未尝试执行P

解决这个“第一线”问题的一种方法是编写一个类似于Birei答案的函数。

另一种方法是使用不同的命令,当您在第一行时会引发错误。

nnoremap _ :move-2<CR> 

此外还有不堵塞剪贴板/寄存器的好处。

请参阅this page on the Vim wiki

相关问题