match berry very much

http://d.hatena.ne.jp/thinca/20091121/1258748377 で match っていうのをはじめて知った ( http://vim-users.jp/2009/07/hack40/ に普通に載ってるんだけど華麗にスルーしてた ) ので早速 :help :match 。はー highlight group と pattern strings 間の関係を定義できる command か。普通に highlight するには syntax しかないと思ってた。てあれ ? もしかして manual とか plugin で highlight させる場合ってこっちが canonical なのか ? 「文法」を定義する syntax に対して「一致するもの」を定義する match って位置づけだよなたぶんてことは今回の目的 ( 不可視文字を表示する ) 的にはこれを使うべき、ということか。 :help highlight<Tab> するとー、あー最後の方に "match-highlight" てのがあった。うーんこれ :help user-manual で出てこないのか。うぅむ。

で、つらつら help を眺めていると :2match と :3match というのもあると ( :help :2match )。以下 help 超訳。なので引用にしなくてもいい ?

:match と同様だが別々の match を設定する。つまり 3 つの match が同時に使用できる。同じ位置に複数の match が存在する場合もっとも小さい数字の match が優先される。

":3match" は matchparen プラグインにより使用される。手動では ":match" を、他のプラグインで ":2match" を使用することを推奨する。

Vim documentation: pattern

てことは今回は :2match を使えばいいのかー、と思ったんだけどいや待てこれってつまり同時に 1 つの plugin しか match highlighting できないわけだよな。うーん 2 とか 3 とか接頭辞に使ってるだせー混乱の元になりそうな気がする。と思ったのでちょい戻って :match の説明を読み直すと matcharg() とか getmatches() とか matchadd() とかもあるから見とけとの記述が。なんかこれっぽそうじゃね ? ということで :help :help 。

で、正解は matchadd() だった。これを ( 中略 ) 下記参照。

matchadd() は対になっている matchdelete() が必要とする id を返すみたいなのでそれを cache and manage 最後に eliminate な感じでテケトーに書いたらなんか動いた。これで :match も :2match も手つかずで済んだ。最初 "<abuf>" 指定が必要だとわかった時点で動かないもんだと思っていたので一発で表示されてしまってどこか寂しい。てかこれ今見てみると別に不可視文字のため以外にも使えるな。 pattern の定義を global variable から引っ張るようにすれば .vimrc でいろいろ融通きくわ。

一応それなりに overhead があるのでやっぱり BufWinEnter に引っかけてるけどやっぱりまだわかっていないので BufEnter に切り替えるのも辞さない覚悟で。ただまぁ BufEnter にすると id のまわりが速くて精神的にくるものがあるのでできるだけ辞すつもりで。

でまぁこの plugin を使うと tab space も Error で表示されるので ( colorscheme によっては ) help が血みどろになる罠。 syntax を使っていたときは help buffer にのみ :set list listchars=tab:\ \ する autocmd を書いていたんだけどmatch highlighting は syntax highlighting を常に上書きするらしい ( :help matchadd() の 2 段落目最後の文 ) ので tab space を SpecialKey group に map させている 'list' は上書きされてしまう、ということみたい。今これを何とかしようという段階で普通に :match Error /\t/ を適当な key に map しておいて手動で呼び出すという運用しかないかなぁと諦めつつあるところ。