我创建了一个映射来将当前行向上移动一行。映射有意想不到的效果
:map _ ddkP
它的工作原理,除了在第一行执行时,它删除第一行。
我预计什么都不会发生,因为他们在第一行执行dd
,k
,P
,没有任何反应。我哪里错了?
我创建了一个映射来将当前行向上移动一行。映射有意想不到的效果
:map _ ddkP
它的工作原理,除了在第一行执行时,它删除第一行。
我预计什么都不会发生,因为他们在第一行执行dd
,k
,P
,没有任何反应。我哪里错了?
你必须使用一个map
命令计算表达式,所以你必须添加<expr>
和使用来检查,如果你的光标在该文件的第一行的功能。
所以,这个功能添加到您的vimrc
文件:
function! Swap()
if line('.') > 1
return 'ddkP'
endif
return ''
endfunction
,并使用以下命令map
:
:map <expr> _ Swap()
这样,当if
条件成功只会将互换额度。
当你dd
,k
,P
,这些命令分别执行:
因为它们是隔离的,所以一个命令失败并不妨碍进一步执行c ommands。在你的情况下,Vim无法向上移动一行,但它可以完美粘贴在当前行的上方。
当作为单个命令执行时,作为宏,命令失败会停止执行整个宏,并且不执行其他命令。
在你的例子中,第一步dd
工作,但k
不能移动当前行上方的光标,一切都停止了:Vim甚至从未尝试执行P
。
解决这个“第一线”问题的一种方法是编写一个类似于Birei答案的函数。
另一种方法是使用不同的命令,当您在第一行时会引发错误。
nnoremap _ :move-2<CR>
此外还有不堵塞剪贴板/寄存器的好处。