2014-02-15 79 views
3

我創建了一個映射來將當前行向上移動一行。映射有意想不到的效果

:map _ ddkP 

它的工作原理,除了在第一行執行時,它刪除第一行。

我預計什麼都不會發生,因爲他們在第一行執行dd,k,P,沒有任何反應。我哪裏錯了?

回答

1

你必須使用一個map命令計算表達式,所以你必須添加<expr>和使用來檢查,如果你的光標在該文件的第一行的功能。

所以,這個功能添加到您的vimrc文件:

function! Swap() 
    if line('.') > 1 
     return 'ddkP' 
    endif 
    return '' 
endfunction 

,並使用以下命令map

:map <expr> _ Swap() 

這樣,當if條件成功只會將互換額度。

8

當你ddkP,這些命令分別執行:

  1. 當前行被刪除
  2. 光標向上移動一行
  3. 先前猛拉線之上的粘貼的當前行

因爲它們是隔離的,所以一個命令失敗並不妨礙進一步執行c ommands。在你的情況下,Vim無法向上移動一行,但它可以完美粘貼在當前行的上方。

當作爲單個命令執行時,作爲宏,命令失敗會停止執行整個宏,並且不執行其他命令。

在你的例子中,第一步dd工作,但k不能移動當前行上方的光標,一切都停止了:Vim甚至從未嘗試執行P

解決這個「第一線」問題的一種方法是編寫一個類似於Birei答案的函數。

另一種方法是使用不同的命令,當您在第一行時會引發錯誤。

nnoremap _ :move-2<CR> 

此外還有不堵塞剪貼板/寄存器的好處。

請參閱this page on the Vim wiki

相關問題