映射具有意想不到的效果

cou*_*que 3 vim

我创建了一个映射来将当前行向上移动一行.

:map _ ddkP
Run Code Online (Sandbox Code Playgroud)

它工作,除了在第一行执行时,它删除第一行.

我希望不会有事,因为他们我执行dd,k,P在第一行,什么都不会发生.我哪里错了?

rom*_*inl 8

当你这样做dd,k,P,命令分别执行:

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

由于它们是隔离的,因此一个命令中的失败不会阻止执行其他命令.在你的情况下,Vim无法向上移动一行,但它可以完美地粘贴在当前行之上.

当作为单个命令执行时,作为宏,命令中的故障停止执行整个宏,并且不执行进一步的命令.

在你的例子中,第一步,dd但是k不能将光标移动到当前行上方的行上,并且一切都停止了:Vim甚至都没有尝试执行P.

解决这个"第一线"问题的一种方法是编写一个像Birei的回答一样的函数.

另一种方法是使用不同的命令,当你在第一行时抛出错误.

nnoremap _ :move-2<CR>
Run Code Online (Sandbox Code Playgroud)

具有不堵塞剪贴板/寄存器的额外好处.

请参阅Vim wiki上的此页面.