在 VIM 中,在可视模式下拉出文本块,然后粘贴块,将其粘贴到光标给定的所需列之后,但在原地粘贴,覆盖当前行和后续行的内容。
有时我不想要这个,我想要的是粘贴一个带有光标位置给定的缩进的块,但粘贴在新的空行内,而不覆盖文本。
有没有办法做到这一点?
目前,为了实现这一点,我创建了大量的空行,然后粘贴块,消除之后剩余的空行(不是很聪明......)。
注意:我曾经set virtualedit=all
能够粘贴到上述空行中的任何列。
在 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>
您当然可以将映射更改为您想要的任何内容;这只是一个建议。
更新:这是一个接受参数的版本。这让您例如从系统剪贴板粘贴。它还使用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>
请记住,它只会缩进空格,而不是制表符。使用适当数量的制表符(如果需要,还有空格)缩进将需要一些额外的代码行,但这是完全可行的。
如果我正确理解您想要什么,您可以根据 ex 命令和=
运算符尝试此操作:
nmap <leader>p :put "<cr>'[=']
另一种可能:
nmap <leader>p :let @"=@"<cr>]p
这@"=@"
似乎让 Vim 忘记了被复制的行、字符方式和]p
重新缩进的粘贴。
UnconditionalPaste插件也可以帮助你像那样粘贴。