9881


atom や Sublime Text での `cmd + d` みたいな操作を  
Vim でやりたいのですが、どのようにすればいいか分からないです。

例えば単語 `content` を選択して、  
`cmd + d` でその単語以下の `content` を探して選択してくれて  
その後にその `content` の部分を書き換える

というのを Vim でやりたいのですが  
どのようにすればいいでしょうか？

説明が分かりづらくて、申し訳ありません…。  
よろしくお願いします。


CC BY-SA 3.0
2015-05-07T04:03:06.663
9879
2015-05-17T06:08:30.560
9617
question
vim sublimetext atom-editor
Vim での文字選択、置換について


プラグインなどを用いない方法を解説しておきます。

`*` でカーソルの下にある単語 (ここでは便宜上 _foo_ とします) を検索し、`:%s//bar/g` とすることで、バッファ内の全部の _foo_
を _bar_ に置換できます。

仮に、最初の単語以下の範囲に限定したいならば、 `*` で検索した後に `N` か `Ctrl` + `o` で元の場所に戻って、
`:.,$s//bar/g` すると良いでしょう。前者の置換範囲が `%` でバッファ全体だったのに対し、後者では `.,$`
で現在の位置から終わりまでというように変わっていることに注目してください。

このように基本的なコマンドを組み合わせて目的を達成するのが、素の Vim
流です。ただし組み合わせですから、他にもいろんな方法(組み合わせ)が考えられます。その中から、自分の手に馴染む方法を模索するのが良いでしょう。


CC BY-SA 3.0
2015-05-07T04:29:37.550
9881
2015-05-07T04:29:37.550
208
9879
answer


# KoRoN さんの説明で十分だと思いますがヘルプ参照方法等を補足しました。

素のVimで「現在行からファイルの最終行までの一部の`content`を`change`に置換する」手順を説明します。  
まず、素のVimでは置換対象だけの`content`を先に選択しておくことは出来ないです。  
(置換対象の`content`と非対象の`content`で前後の文字が異なれば正規表現を使ってうまく対象の`content`だけを引っ掛けることは可能かもしれません)  
代わりに置換時に実際に置換するか否かを毎回確認させるようにします。  
`  
:.,$s/content/change/gc  
`  
各文字の説明  
`:` ←コマンドラインモード  
`.,$` ←現在行からファイルの最終行まで (`:h [range]` および `:h :range`)  
`s` ←置き換える (`:h :s`)  
`g` ←行中の全ての`content`を置換対象にする (`:h s_flags`)  
`c` ←置換動作(する/しない/置換して終了/全置換 等)を毎回確認する (`:h s_c`)

もしがカーソルが`content`のいずれかの文字上にある場合は`content`と直接入力する代わりに、`<C-R><C-W>`を入力することでも`content`を挿入できます。(`:h
c_CTRL-R_CTRL-W`)


CC BY-SA 3.0
2015-05-07T05:52:43.497
9884
2015-05-07T05:52:43.497
2687
9879
answer


私がよく使っている置換の方も紹介させて頂きます。

### # 全行で置換

コマンドモードで以下の入力します。

> :%s/変換前の文字列/返還後の文字列/g

  * %の部分は範囲を入力する部分で、%は１行目から最終行までの意味になります。 
  * sは置換をするコマンドになります。
  * 最後のgはオプションで、gを使わない場合は、１行に変換前の文字列が２つ以上合った場合、最初のものしか置換されません。

### # 行で範囲指定して置換

> :10,20s/変換前の文字列/返還後の文字列/g

  * 10行目から20行目の範囲で置換をします。
  * :set nu して行番号を表示しておくと便利です。

### # 範囲を選択してから置換

Shift+V してから jjjjとか打って移動します。  
すると行が選択されます。  
選択された状態でコマンドモードに移ります。

> :'<,'>s/変換前の文字列/返還後の文字列/g

選択範囲を表す '<,'> は勝手に入力されます。  
後は一緒です。

### # 確認しながら置換する時

  * /検索文字列 と入力して、検索文字列に移動します。
  * cw で検索文字列を置換（change word）します。
  * n . n . n . と入力して次の検索（next）と直前のコマンド（置換）を繰り返します。
  * 置換しない場合は n n n と検索するだけで、置換をスキップします。

※ ちょっと文章で説明するのが難しい。伝わったかな？

vimは慣れちゃうとキーボードから手を動かさず、置換ができるので、便利です。


CC BY-SA 3.0
2015-05-17T05:48:18.103
10277
2015-05-17T06:08:30.560
2015-05-17T06:08:30.560
9529
9529
9879
answer