2012-01-25 16 views

回答

4

也許最簡單的方法是在不希望它們被刪除時使用大寫字母標記。如果標記所在的行被刪除,它將被移動到下一行。

另一個選項是lockmarks命令。 lockmarks採用命令運行並將大多數標記鎖定在其當前行號,直到命令完成。如果你想這樣做的時候,你可能需要一些映射那會lockmarks你,例如這原來dd加入到標記保護:

nnoremap dd :lockmarks normal! dd<cr> 

nnoremap dd :lockmarks delete<cr> 

問題是你失去了指定一個計數爲dd的能力。這可以通過使用v:count要解決這個問題,但後來我們就需要execute來獲取插值:

nnoremap dd :<c-u>execute 'lockmarks normal! ' . v:count . 'dd'<cr> 

然後你必須定義你經常使用的每個刪除操作這樣的映射。

因此,可能使用大寫字母標記將會更容易。你只需要記住使用它們。

1

@Kurt Hutchinson的一個補充答案:可以定義一個運算符函數。在這種情況下,你不需要定義每個刪除命令的映射關係,而是重新定義d

let s:typetochar={ 
      \ 'char': 'v', 
      \ 'line': 'V', 
      \'block': "\<C-v>", 
     \} 
function! DeleteOperator(type) 
    execute 'lockmarks normal! `["'.v:register.'d'.s:typetochar[a:type].'`]' 
endfunction 
function! s:Delete() 
    set opfunc=DeleteOperator 
    return '[email protected]' 
endfunction 
nnoremap <expr> d <SID>Delete() 
nnoremap <expr> dd <SID>Delete().'[email protected]' 
vnoremap d :<C-u>lockmarks normal! gvd<CR> 

注意dd映射:爲d實際使用[email protected],應該有[email protected](擴展到[email protected]@)你在那裏輸入dd。所以爲了使用清潔劑dd你必須創建一個映射。