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 に答える