kick the base

Houdiniと、CG技術と、日々のこと。

Vim: キーマッピング基礎4 - very magic/nomagic検索

コピペではなく自分自身で.vimrcを育てていこうシリーズ第4回目、キーマッピング編の最終話です。

前回までのお話

  • 最終的なキーマッピング
  • デフォルト状態でVimを起動する方法
  • Vimの環境
  • 表記方法
  • 記事の見解

などは毎回書いてもしょうがないので、キーマッピングの最初の記事をご参照ください。

Vim: キーマッピング基礎1

今回解説する部分のキーマッピング

let mapleader = "\<Space>"
nnoremap <Leader>/ /\v
nnoremap <Leader>?  ?\v

マップリーダーをスペースキーに割り当て

まずはマップリーダーとはなんぞやという話ですが、これは単純に自身のカスタムマッピングに使うキーです。

言葉にするとちょっと分かりにくいですが、とても簡単な話で下記設定を行うとスペースキーを押した後に他のキーを押すことで好きな機能を呼び出せるという機能です。

let mapleader = "\<Space>"

このマップリーダーですが、デフォルトでは\に割り当てられていてホームポジションから遠いのでこのようなカスタマイズを行っています。

<Leader>と組み合わせてvery magic検索を行う

ここが本記事のメインとなります。設定自体は実に単純で、下記2行のコードです。

nnoremap <Leader>/ /\v
nnoremap <Leader>?  ?\v

この設定が意味するところは以下のとおりです。

キーストローク プロンプト 意味
<Space>/ /\v 正方向のvery magic検索を行う
<Space>? ?\v 逆方向のvery magic検索を行う

キーストロークは良いとして、very magic検索とはなんでしょうか。以下に詳細を解説していきます。

very magic(very nomagic)検索とは

まず基本としてVimの検索機能についておさらいしましょう。

検索の基本

キーストローク 意味
/ /に続けた文字で正方向の検索を行う
? ?に続けた文字で逆方向の検索を行う

こんな感じでした。例は下記のとおりです。

正方向の検索

キーストローク バッファ
{start} This is a pen.
This is an apple.
/This This is a pen.
This is an apple.

逆方向の検索

キーストローク バッファ
{start} This is a pen.
This is an apple.
?This This is a pen.
This is an apple.

Vimの正規表現

ここで郵便番号にマッチする正規表現を書いてみましょう。郵便番号は下記2つのパターンにマッチするものとします。

  • 〒{数字3文字}-{数字4文字}
  • ZIP:{数字3文字}-{数字4文字}

答えはこんな感じです。

/\(〒\|ZIP:\)\d\{3}-\d\{4}*1

エスケープ文字多っ!ちょっと引きますね。しかもちょっと分かりにくいルールがあります。

  • (…)は開きカッコも閉じカッコもエスケープが必要。すなわち\(…\)となる。
  • |はエスケープが必要。すなわち\|となる。
  • {…}閉じカッコはエスケープを省略しても良い。すなわち\{…\}または\{…}となる。

波括弧だけ省略できるところが余計分かりにくいですね。省略をしないで丁寧に書けば下記のとおりです。

/\(〒\|ZIP:\)\d\{3\}-\d\{4\}

省略をしなかったのでエスケープ文字が2個増えました。これは書くのも読むのも厳しい。

しかし安心してください。Vimには正規表現をPerlやPython、Rubyに近い形で記述できるオプションがあるのです。それがvery magicパターンです。

very magicパターンを使う

very magicパターンを使うには/キーに続けて\vを入力します。するとその後に続けて一般的な正規表現が使用できるようになります。very magic検索の正規表現パターンは下記のとおりです。

/\v(〒|ZIP:)\d{3}-\d{4}

純粋な正規表現部分は(〒|ZIP:)\d{3}-\d{4}です。これは僕らがよく知る正規表現ですね!

お察しの通り、逆方向にvery magic検索をしたいときは?\vでOKです。

very nomagicパターンを使う

/に続けて\Vを記載することで使用できます。very nomagic検索では(ざっくりといえば)バックスラッシュのみが特殊な意味を持ち、それ以外はすべてその文字そのものを示すようになります。

つまり、特殊なパターンマッチを意識せず、文字列そのものを検索したい時に利用することになります。

例えば下記ふたつの文字列があるとしましょう

  • なん...だと....!?
  • なんこつ派だとっちめろ

素直に/なん...だと....と検索すると、なんこつ派だとっちめろにもマッチしてしまいます。これは.改行文字以外のどの1文字にもマッチするメタ文字として認識されてしまうために起こります。

これを防ぐには、very nomagic検索を使用すれば良いでしょう。

/\Vなん...だと....

これで.は文字そのままの意味のドットとして扱われるようになり、「なんこつ派だとっちめろ」にはマッチしなくなりました。

very magic検索まとめ

very magic検索は多用するため、マップリーダー + 検索記号(/または?)で呼び出せるようにしたのが先に上げたキーマッピングだったわけです。*2

下記動画の通り<Space>/を押すと、プロンプトに/\vが挿入されるのがわかると思います。

f:id:kickbase:20161001145735g:plain

ちなみに、very nomagic検索は使用頻度が高くないためキーマッピングしていません。使うときは/\Vと入力するようにしています。

まとめ

マップリーダーの設定と合わせたった3行のコードでしたが、かなり長い説明になってしまいました。しかしvery magic検索はよく使うので、Vimデフォルトの正規表現は使いづらいなあと思っていた方にはぜひオススメしたい方法です。

これにて「自分で作る.vimrcキーマッピング基礎編」は終了です。

続きはまたいつかどこかで。

*1:この正規表現では波括弧のエスケープ文字省略を行っています

*2:本来ならvery magic検索をデフォルト検索に設定したいところですが、Vimにはない模様。残念。ご存じの方はご教授頂きたいです。