我创建了一个映射来将当前行向上移动一行.
:map _ ddkP
Run Code Online (Sandbox Code Playgroud)
它工作,除了在第一行执行时,它删除第一行.
我希望不会有事,因为他们我执行dd,k,P在第一行,什么都不会发生.我哪里错了?
当你这样做dd,k,P,命令分别执行:
由于它们是隔离的,因此一个命令中的失败不会阻止执行其他命令.在你的情况下,Vim无法向上移动一行,但它可以完美地粘贴在当前行之上.
当作为单个命令执行时,作为宏,命令中的故障停止执行整个宏,并且不执行进一步的命令.
在你的例子中,第一步,dd但是k不能将光标移动到当前行上方的行上,并且一切都停止了:Vim甚至都没有尝试执行P.
解决这个"第一线"问题的一种方法是编写一个像Birei的回答一样的函数.
另一种方法是使用不同的命令,当你在第一行时抛出错误.
nnoremap _ :move-2<CR>
Run Code Online (Sandbox Code Playgroud)
具有不堵塞剪贴板/寄存器的额外好处.
请参阅Vim wiki上的此页面.