我創建了一個映射來將當前行向上移動一行。映射有意想不到的效果
: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>
此外還有不堵塞剪貼板/寄存器的好處。