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

pep*_*ico 5 vim

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

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

有没有办法做到这一点?

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

注意:我set virtualedit=all用来粘贴所说空行中的任何一列.

Øss*_*sse 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>
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)

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