如何在创建必要的线条时粘贴块以仅为块提供空间?

时间:2013-02-13 18:52:42

标签: vim

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

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

有办法吗?

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

注意:我使用set virtualedit=all能够粘贴所述空行中的任意列。

2 个答案:

答案 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插件也可以帮助您像这样粘贴。