横山です。
社内から「Vimで単語をクォーテーション("..."など)で囲むのによい方法はないか」という質問をもらったので、調べたことをまとめました。
主に4つくらいのやり方がありそうだったので、順番に紹介します。
-
普通に入力
-
ciw
-
置換
-
プラグイン
普通に入力
普通にi
でインサートモードに切り替えて入力する方法です。
ポイントは、単語単位で移動することと、ドットコマンドを活用することです。
-
b
で単語の先頭に移動 -
"
を入力 -
e
で単語の末尾に移動 -
l
で右側に移動 -
.
(ドット)を入力(直前の編集操作が繰り返されて、"
が入力される)
以下は、phw/peekとwavexx/screenkey(どちらもAPTでインストール可能)を使って取得したGIFアニメです。
ciw
c
から始まるコマンドを使うことで、文字列を削除(カット)しつつインサートモードに切り替えることができます。
削除対象範囲は以下のように柔軟に指定できます(以下は一例です)。
-
cw
: カーソル位置から単語の末尾まで -
cb
: カーソル位置から単語の先頭まで -
ciw
: カーソル位置の単語の先頭から末尾まで -
c0
: カーソル位置から行頭まで -
c$
: カーソル位置から行末まで -
cG
: カーソル位置からファイル末尾まで
削除した部分はレジスタに保持されているので、ペーストすることができます。よって、囲みたい文字を続けて入力した後で、その間にペーストするという方法が使えます。囲みたい文字は同じ文字であることが多いので、続けて入力できるとだいぶ楽になります。
-
ciw
でカーソル位置の単語の先頭から末尾までをカットしてインサートモードに切り替え -
"
を2つ(開始と終了)入力 -
Esc
でノーマルモードに切り替え -
P
でカーソル位置の左側にカットした単語をペースト
よく使う括弧の種類や対象範囲が決まっている場合、以下のようにマッピングすると便利です。
nnoremap <Leader>s" ciw""<Esc>P
nnoremap <Leader>s' ciw''<Esc>P
nnoremap <Leader>s` ciw``<Esc>P
nnoremap <Leader>s( ciw()<Esc>P
nnoremap <Leader>s{ ciw{}<Esc>P
nnoremap <Leader>s[ ciw[]<Esc>P
置換
同じ文字で囲みたい単語が複数ある場合は、置換を使うと時間短縮になって、漏れも防げます。
置換には正規表現が使えますが、Vimの正規表現はエスケープ対象の文字が少し特殊なので注意が必要です。
例えば、+
や()
をメタ文字として扱うときはエスケープが必要です。
以下の例は、カーソルがある行の単語([0-9A-Za-z_]+
)をすべて"..."で囲みます。
例: :s/\(\w\+\)/"\1"/g
正規表現のオプションにc
を付けると、逐一置換するかどうかの確認をすることができます。ファイル全体を対象とする場合などは、意図しない置換を防げて安全かもしれません。
例: :%s/\(\w\+\)/"\1"/gc
また、いちいち入力するのは面倒なので、コマンド履歴を活用するのがおすすめです。
同じ置換を繰り返すのであれば、:
でコマンドモードに切り替えた後に<C-p>
で履歴をたどれます。
少し違うことをしたいときなどは、コマンドモードに切り替えた後に<C-f>
でコマンドウィンドウを開けば、履歴を修正してから実行することもできます。
以下の例は、対象を丸括弧1内の文字列のみにしてから置換を実行しています。
例: :%s/(\(\w\+\))/("\1")/gc
プラグイン
プラグインを使って実現することもできます。有名なのはtpope/vim-surroundですが、後発のrhysd/vim-operator-surroundも、ドットコマンドで繰り返せるなどの利点があっておすすめです。
参考: 犬製 Vim プラグイン紹介3本立て - はやくプログラムになりたい
設定例:
-
インストール
-
<Leader>s
などにマッピング(sはsurroundのs)-
例:
map <Leader>s <Plug>(operator-surround-append)
-
<Leader>sw"
でカーソル位置から単語の末尾まで囲める -
b<Leader>sw"
でカーソル位置の単語の先頭から末尾まで囲める -
<Leader>s$"
でカーソル位置から行末まで囲める -
(
などは自動で閉じる文字を判別してくれる
-
まとめとおしらせ
ClearCode.vimの一環として、Vimについて調べたことをまとめました。ClearCode.vimはGitterとGitHubでやっているので、質問などがある方は社内外を問わずお気軽にコメントください。リアルタイムで質問したい方は、毎週水曜日の18:30-19:00はほぼ確実に見ているので、この時間にGitterまでお越しください。(反応が遅れてもよければ、いつ書き込んでもらっても大丈夫です。)
-
昔は、中括弧({})や大括弧([])と特に区別したいときは小括弧と言っていた記憶があるのですが、最近はそれぞれ丸括弧、波括弧、角括弧と言うらしいです。 ↩