在VIM中,文本块在可视模式下阻塞,然后粘贴块,将其粘贴到光标给出的所需列之后,但就地粘贴,覆盖当前行和后续行的内容。
有时我不想要这个,我想要的是粘贴一个带有光标位置给出的缩进的块,但粘贴在新的空行内,而不覆盖文本。
有办法吗?
目前,要实现这一点,我创建了大量空行,然后粘贴块,消除了剩余的空行(不是很聪明......)。
注意:我使用set virtualedit=all
能够粘贴所述空行中的任意列。
答案 0 :(得分:4)
您可以尝试以下内容。无论你的领导关键是什么,按块方式抽出一些东西,定位光标并点击<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>
您当然可以将映射更改为您想要的任何内容;这只是一个建议。
更新:这是一个接受参数的版本。这就是你,例如改为从系统剪贴板粘贴。它还使用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>
请记住,它只会缩进空格,而不是制表符。使用适当数量的选项卡(以及需要时的空格)缩进将需要一些额外的代码行,但是非常可行。
答案 1 :(得分:0)
如果我理解你想要的是什么,你可以根据ex命令和=
运算符来尝试:
nmap <leader>p :put "<cr>'[=']
另一种可能性:
nmap <leader>p :let @"=@"<cr>]p
@"=@"
似乎让Vim忘记了复制的行,字符和]p
粘贴重新缩进。
UnconditionalPaste插件也可以帮助您像这样粘贴。