Vimで、文字列を別のところに「持って行って置換する」効率的な方法は?

  • 53
    いいね
  • 11
    コメント
この記事は最終更新日から1年以上が経過しています。

Vimで、文字列を別のところに「持って行って置換する」効率的な方法は?

前置き

これは私が答えを知っているパズルではなく、Vimmer諸氏への純粋な質問です。

「Vimで文字列を別のところに「持って行って置換する」効率的な方法は?」

意味がよく伝わるように例で説明します。

たとえば、以下のような文章を書いているとき。

BEFORE:
Lorem ipsum dolor sit amet, consectetur adipisicing elit,
sed do eiusmod tempor incididunt ut labore et dolore magna
aliqua. Ut enim ad minim veniam, quis nostrud exercitation
ullamco laboris nisi ut aliquip ex ea commodo consequat.
Duis aute irure dolor in reprehenderit in voluptate velit
esse cillum dolore eu fugiat nulla pariatur. Excepteur
sint occaecat cupidatat non proident, sunt in culpa qui
officia deserunt mollit anim id est laborum.

カーソルは現在 BEFORE:dolor in reprehenderit の初めの d にあるとし、モードはノーマルモードだとします。

BEFORE: で太字にした中ほどの dolor in reprehenderit を、三行上の ut labore et doloreの箇所に「持って行って置換する」ということをやりたいのです。つまり編集後は以下の AFTER: のようになっていてほしいということです。

AFTER:
Lorem ipsum dolor sit amet, consectetur adipisicing elit,
sed do eiusmod tempor incididunt dolor in reprehenderit magna
aliqua. Ut enim ad minim veniam, quis nostrud exercitation
ullamco laboris nisi ut aliquip ex ea commodo consequat.
Duis aute irure dolor in reprehenderit in voluptate velit
esse cillum dolore eu fugiat nulla pariatur. Excepteur
sint occaecat cupidatat non proident, sunt in culpa qui
officia deserunt mollit anim id est laborum.

どのようなキーシーケンスで編集するのが効率的かという問題です。終了時のカーソル位置はどこにあってもかまいません。

素朴な解答例

素朴な解答例としては

  • 3yw(持って行く文字列をコピーする)
  • 3k2w(目的地に移動する)
  • P(ペーストする)
  • 4de(不要な部分を削除)

という11キーが考えられますが、もっと短くならないのかなと思っています。

ご教示いただければありがたいです。

追記1. 説明補足

上に書いた「例」はあくまで例でして、私が特に疑問に思っているのは P や p でペーストして d でデリートするしかないのかな、ということでした。言葉足らずだったので補足します。

テキストを編集していてよく出会う状況なので何か改善の余地はないかなと思って書いています。

追記2. コメント欄で紹介された各種方法

コメント欄でいろんな方法やTipsをご教示くださり、ありがとうございます。

  • 3k2w で目的地に行く代わりに、g# の「現在の単語を含む文字列を上方向に検索」で "dolor" から "dolore" まで行ける。
  • 4cw で挿入モードに入り、<Ctrl-R>0<ESC> で「レジスタ0からペースト」を使う手がある。ピリオドキーでの反復ができる。
  • 「ヴィジュアルモードで p を打つとヤンクした文字列で選択範囲が置換される」
  • "_d4wP を使うと、削除時に消去専用レジスタ "_ が使われるので、ペーストがうまくいく。

なぜか結城の環境では「ヴィジュアルモードで p を打つとヤンクした文字列で選択範囲が置換される」が効かなかったです。実は私が求めていたものはこの機能のような気がします。何か設定があるのかしら。→解決。以下の追記3.を参照。

プラグインの紹介もありがとうございます。

  • プラグイン: vim-operator-replace
  • プラグイン: vim-visualstar

「カーソル下の一単語とヤンクしてきた文字列を置き換える」キーシーケンスを割り当てる。

nnoremap ciy ciw<C-r>0<ESC>

追記3. 自分の環境で v_p が効かなかった理由

結城の環境で「ヴィジュアルモードで p を打つとヤンクした文字列で選択範囲が置換される」機能が効かなかったのは、~/.vimrc

set clipboard=unnamed,autoselect

していたためでした。この設定だとヴィジュアルモードでの選択内容がすぐクリップボードと無名レジスタにヤンクされてしまいます。

set clipboard=unnamed

に修正したところビジュアルモードでの p による置換が効くようになりました。

@kanno_kannoさんにご指摘いただきました。感謝。