在VIM中,文本块在可视模式下阻塞,然后粘贴块,将其粘贴到光标给出的所需列之后,但粘贴就地,覆盖当前行和后续行的内容.
有时我不想要这个,我想要的是粘贴一个带有光标位置给出的缩进的块,但粘贴在新的空行内,而不覆盖文本.
有没有办法做到这一点?
目前,要实现这一点,我创建了大量空行,然后粘贴块,消除了剩余的空行(不是很聪明......).
注意:我set virtualedit=all用来粘贴所说空行中的任何一列.
您可以尝试如下操作。逐块拉动某些内容,定位光标并点击<Leader>p,无论您的引导键是什么。
function! FancyPaste()
let paste = split(@", '\n')
let spaces = repeat(' ', col('.')-1)
call map(paste, 'spaces . v:val')
call append(line('.'), paste)
endfunction
nnoremap <Leader>p :call FancyPaste()<CR>
Run Code Online (Sandbox Code Playgroud)
当然,您可以将映射更改为您想要的任何内容;这只是一个建议。
更新:这是一个接受参数的版本。例如,这可以让您从系统剪贴板进行粘贴。它还使用virtcol()代替来col()考虑可能的使用'virtualedit':
function! FancyPaste(reg)
let paste = split(getreg(a:reg), '\n')
let spaces = repeat(' ', virtcol('.')-1)
call map(paste, 'spaces . v:val')
call append(line('.'), paste)
endfunction
nnoremap <Leader>p :call FancyPaste('"')<CR>
nnoremap <Leader>cp :call FancyPaste('+')<CR>
Run Code Online (Sandbox Code Playgroud)
请记住,它只会缩进空格,而不是制表符。使用适当数量的制表符(如果需要的话还可以使用空格)缩进需要一些额外的代码行,但这是完全可行的。