我创建了一个映射来将当前行向上移动一行。
:map _ ddkP
它有效,除了在第一行执行时,它删除第一行。
我希望不会发生任何事情,因为我在第一行执行dd
,k
,P
,没有任何反应。我哪里错了?
答案 0 :(得分:8)
执行dd
,k
,P
时,命令会单独执行:
由于它们是隔离的,因此一个命令中的失败不会阻止执行其他命令。在你的情况下,Vim无法向上移动一行,但它可以完美地粘贴在当前行之上。
当作为单个命令执行时,作为宏,命令中的失败将停止执行整个宏,并且不执行其他命令。
在您的示例中,第一步dd
有效,但k
无法将光标移动到当前行上方的行上,并且一切都已停止:Vim甚至从未尝试执行{ {1}}。
处理“第一线”问题的一种方法是编写一个像Birei的回答一样的函数。
另一种方法是使用不同的命令,当你在第一行时抛出错误。
P
具有不堵塞剪贴板/寄存器的额外好处。
答案 1 :(得分:1)
您必须使用map
命令来评估表达式,因此您必须添加<expr>
并使用一个函数来检查您的光标是否在文件的第一行。
因此,请将此功能添加到vimrc
文件中:
function! Swap()
if line('.') > 1
return 'ddkP'
endif
return ''
endfunction
并使用以下map
命令:
:map <expr> _ Swap()
这样它只会在if
条件成功时交换行。