vim - 複数の単語をインポートしたテキストで複数回置き換える

vim - 複数の単語をインポートしたテキストで複数回置き換える

book1下のテキストでおよびをにbook2置き換えるには、2行目と3行目の先頭に移動してクリックしますpenpen(ドット)は単語を置き換えます。

pen;
book1;
book2;
book3;

しかし、複数の単語をインポートされたテキストに置き換える方法は?たとえば、私はbook 1andをbook 2次に変更したいと思います。pen

今後:

pen;
book 1;
book 2;
book 3;

後ろに:

pen;
pen;
pen;
book 3;

単語を2回引っ張らずに交換しbook 1て交換できますか?キーバインディングがいいと思いますか?book 2pen

答え1

この機能があまりにも頻繁に必要であるため、これを簡素化し、最大速度を可能にするプラグインを作成しました。レジスタと交換

プラグインは、gr{モーション}/テキストオブジェクト、全行、または現在の選択に含まれるテキストをレジスタの内容に置き換える2-in-1コマンドを提供します。前のテキストはブラックホールレジスタから削除されます。つまり、消える。多くのエッジケースを透過的に処理し、.標準コマンドを使用して迅速な繰り返しを可能にします。気に入らない場合は、そのページに代替案へのリンクがあります。 (@s1n7azのコードスニペットのように動作しますが、プラグインとしてはより複雑で強力です。)

答え2

このRedditコメント私が得た最高のソリューションです。とても簡単です。

基本レジスタを変更せずにテキストを置き換えるコマンドを定義しました。たぶんこれはあなたにも役立ちます。おそらくこれをベースにしたようですが、どこでアイデアを得たのかはよく覚えていませんが、実装する前にどこかが見たようです。

nnoremap <silent> cp :let g:substitutemotion_reg = v:register
            \ <bar> set opfunc=SubstituteMotion<CR>g@

" substitute {motion} text with contents of a register function!
SubstituteMotion(type, ...)
    let l:reg = g:substitutemotion_reg
    if a:0
        " visual mode, use '< and '> marks
        silent exe "normal! `<" . a:type . "`>\"_c\<c-r>" . l:reg . "\<esc>"
    elseif a:type == 'line'
        " linewise
        silent exe "normal! '[V']\"_c\<c-r>" . l:reg . "\<esc>"
    elseif a:type == 'block'
        " blockwise-visual
        silent exe "normal! `[\<C-V>`]\"_c\<c-r>" . l:reg . "\<esc>"
    else
        " characterwise
        silent exe "normal! `[v`]\"_c\<c-r>" . l:reg . "\<esc>"
    endif endfunction 

これを使用するには、cpi(など)を入力すると、最も近い角かっこペア内のテキストがデフォルトのレジスタの内容に置き換えられます。

関連情報