2012-03-31 68 views
3

所以我發現Vim的一個常見任務是將PUT放到行的開頭或行的末尾。所以我的映射可能是:Vim - 使用可選的寄存器前綴映射

nmap <Leader>p $p 
nmap <Leader>P 0P 

但是,我真正想要做的是在放置前可選擇包含一個寄存器。

因此,例如「A,P會把從註冊到該行的開頭。

有沒有辦法做到這一點與映射?

回答

4

您可以在一行中做到這一點使用<expr>映射:

nnoremap <expr> \p '$"'.v:register.v:count1.'p' 
nnoremap <expr> \P '0"'.v:register.v:count1.'P' 
2

這是完全可能的。我第一次不過,我覺得這個解決方案是可能的:https://stackoverflow.com/a/290723/15934,但<expr>不會讓我們將光標移動如我們所願,而不能用於normal

不過,我們可以這樣做:

function! s:PutAt(where) 
    " <setline($+1> appends, but <setline(0> does not insert, hence the hack 
    " with getline to build a list of what should be at the start of the buffer. 
    let line = a:where ==1 
     \ ? [getreg(), getline(1)] 
     \ : getreg() 
    call setline(a:where, line) 
endfunction 

nnoremap <silent> <leader>P :call <sid>PutAt(1)<cr> 
nnoremap <silent> <leader>p :call <sid>PutAt(line('$')+1)<cr> 
+0

他談論在該行,而不是文件的開始/結束加入。順便說一句,''映射確實允許你移動一個遊標,你只需要將遊標移動命令添加到表達式的結果中。 – ZyX 2012-03-31 16:33:27