5

在 VIM 中,在可视模式下拉出文本块,然后粘贴块,将其粘贴到光标给定的所需列之后,但在原地粘贴,覆盖当前行和后续行的内容。

有时我不想要这个,我想要的是粘贴一个带有光标位置给定的缩进的块,但粘贴在新的空行内,而不覆盖文本。

有没有办法做到这一点?

目前,为了实现这一点,我创建了大量的空行,然后粘贴块,消除之后剩余的空行(不是很聪明......)。

注意:我曾经set virtualedit=all能够粘贴到上述空行中的任何列。

4

2 回答 2

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>

请记住,它只会缩进空格,而不是制表符。使用适当数量的制表符(如果需要,还有空格)缩进将需要一些额外的代码行,但这是完全可行的。

于 2013-02-13T19:59:19.630 回答
0

如果我正确理解您想要什么,您可以根据 ex 命令和=运算符尝试此操作:

nmap <leader>p :put "<cr>'[=']

另一种可能:

nmap <leader>p :let @"=@"<cr>]p

@"=@"似乎让 Vim 忘记了被复制的行、字符方式和]p重新缩进的粘贴。

UnconditionalPaste插件也可以帮助你像那样粘贴。

于 2013-02-13T22:49:28.630 回答