2012-03-31 55 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