vim-users.jp

Vim Advent Calendar 2012 ujihisa 3

Posted at 2013/02/20
このエントリーをはてなブックマークに追加

Vim Advent Calendar の 82 日目の記事です。 昨日はthincaさんによるLive Coding で painter.vim(仮) 作ったで、業界に衝撃が走りました。僕も勤務先の会社で「友達が作ったんだぜ、すごいだろ」とどや顔で披露しました。

本記事はpainter.vimとはまるで違う、地味なトピックです。

unite-file_rec

unite.vim標準のsourceであるfile_recは以下の正規表現にマッチする候補を無視します。

 \%(^\|/\)\.$\|\~$\|\.\%(o\|exe\|dll\|bak\|sw[po]\|class\)$\|\%(^\|/\)\%(\.hg\|\.git\|\.bzr\|\.svn\|tags\%(-.*\)\?\)\%($\|/\)

たとえば.gitというディレクトリを見つけると、それ以下のファイル/ディレクトリを探索しないようになります。このおかげで探索、つまりキャッシュ作成がとても速くなります。

無視するパターンの変更

上記無視リストを別のパターンで上書きしたいときは、unite#custom_source()を使います。 たとえば”target”という名前に完全一致するディレクトリがあるときはそれ以下のファイルをすべて無視したいときは、~/.vimrcに以下のように記述します。

call unite#custom_source('file_rec', 'ignore_pattern', '\<target\>')

この場合、前述のデフォルトの無視リスト(.gitなど)は上書きされるため、:Unite file_recは.git以下の膨大量のファイルも探索します。

無視するパターンの追加

デフォルトのパターンを用いつつ、無視するパターンを新たに追加したい場合、以下のように一つの大きな別の正規表現を作ることで対処できます。

call unite#custom_source('file_rec', 'ignore_pattern', '\%(^\|/\)\.$\|\~$\|\.\%(o\|exe\|dll\|bak\|sw[po]\|class\)$\|\%(^\|/\)\%(\.hg\|\.git\|\.bzr\|\.svn\|tags\%(-.*\)\?\)\%($\|/\)\|\<target\>')

しかし

  • 可読性に問題あり
  • unite本家のデフォルトのfile_recignore_patternが変更されたときにいちいち手動で追従しないといけないのが大変

などの問題点があります

解決

デフォルトのignore_patternを取得して、その後文字列として結合します。以下のように~/.vimrcに記述します。

call unite#custom_source('file_rec', 'ignore_pattern', (unite#sources#file_rec#define()[0]['ignore_pattern']) . '\|\<target\>')

まず前提として、Vimが~/.vimrcを読み込んで実行しているときには、まだuniteそのものも、file_rec sourceも初期化されていません。なのでまずunite#sources#file_rec#define()を用いて強制的に初期化させ、デフォルトのignore_patternを生成させます。次にその返り値をそのまま使います。

ujihisa

もどる
blog comments powered by Disqus