Help us understand the problem. What is going on with this article?

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

More than 5 years have passed since last update.

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さんにご指摘いただきました。感謝。

hyuki
数学青春物語『数学ガール』の作者。プログラミング入門書や暗号入門書なども書いてます。
https://mm.hyuki.net/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした