Vimで単語を囲む方法をいくつか - 2018-04-23 - ククログ

ククログ

株式会社クリアコード > ククログ > Vimで単語を囲む方法をいくつか

Vimで単語を囲む方法をいくつか

横山です。

社内から「Vimで単語をクォーテーション("..."など)で囲むのによい方法はないか」という質問をもらったので、調べたことをまとめました。

主に4つくらいのやり方がありそうだったので、順番に紹介します。

  • 普通に入力

  • ciw

  • 置換

  • プラグイン

普通に入力

普通にiでインサートモードに切り替えて入力する方法です。

ポイントは、単語単位で移動することと、ドットコマンドを活用することです。

  1. bで単語の先頭に移動

  2. "を入力

  3. eで単語の末尾に移動

  4. lで右側に移動

  5. .(ドット)を入力(直前の編集操作が繰り返されて、"が入力される)

以下は、phw/peekwavexx/screenkey(どちらもAPTでインストール可能)を使って取得したGIFアニメです。

normal

ciw

cから始まるコマンドを使うことで、文字列を削除(カット)しつつインサートモードに切り替えることができます。

削除対象範囲は以下のように柔軟に指定できます(以下は一例です)。

  • cw: カーソル位置から単語の末尾まで

  • cb: カーソル位置から単語の先頭まで

  • ciw: カーソル位置の単語の先頭から末尾まで

  • c0: カーソル位置から行頭まで

  • c$: カーソル位置から行末まで

  • cG: カーソル位置からファイル末尾まで

削除した部分はレジスタに保持されているので、ペーストすることができます。よって、囲みたい文字を続けて入力した後で、その間にペーストするという方法が使えます。囲みたい文字は同じ文字であることが多いので、続けて入力できるとだいぶ楽になります。

  1. ciwでカーソル位置の単語の先頭から末尾までをカットしてインサートモードに切り替え

  2. "を2つ(開始と終了)入力

  3. Escでノーマルモードに切り替え

  4. Pでカーソル位置の左側にカットした単語をペースト

ci

よく使う括弧の種類や対象範囲が決まっている場合、以下のようにマッピングすると便利です。

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の生産性を高める12の方法 | POSTD

置換

同じ文字で囲みたい単語が複数ある場合は、置換を使うと時間短縮になって、漏れも防げます。

置換には正規表現が使えますが、Vimの正規表現はエスケープ対象の文字が少し特殊なので注意が必要です。 例えば、+()をメタ文字として扱うときはエスケープが必要です。

以下の例は、カーソルがある行の単語([0-9A-Za-z_]+)をすべて"..."で囲みます。

例: :s/\(\w\+\)/"\1"/g

正規表現のオプションにcを付けると、逐一置換するかどうかの確認をすることができます。ファイル全体を対象とする場合などは、意図しない置換を防げて安全かもしれません。

例: :%s/\(\w\+\)/"\1"/gc

また、いちいち入力するのは面倒なので、コマンド履歴を活用するのがおすすめです。 同じ置換を繰り返すのであれば、:でコマンドモードに切り替えた後に<C-p>で履歴をたどれます。 少し違うことをしたいときなどは、コマンドモードに切り替えた後に<C-f>でコマンドウィンドウを開けば、履歴を修正してから実行することもできます。

以下の例は、対象を丸括弧1内の文字列のみにしてから置換を実行しています。

例: :%s/(\(\w\+\))/("\1")/gc

sub

プラグイン

プラグインを使って実現することもできます。有名なのはtpope/vim-surroundですが、後発のrhysd/vim-operator-surroundも、ドットコマンドで繰り返せるなどの利点があっておすすめです。

参考: 犬製 Vim プラグイン紹介3本立て - はやくプログラムになりたい

設定例:

  1. インストール

  2. <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までお越しください。(反応が遅れてもよければ、いつ書き込んでもらっても大丈夫です。)

  1. 昔は、中括弧({})や大括弧([])と特に区別したいときは小括弧と言っていた記憶があるのですが、最近はそれぞれ丸括弧、波括弧、角括弧と言うらしいです。