2011/07/15 (Fri)
【解決しました】パターン/\zsを使ったsyntaxについて分かる人教えて。
|【ynkdirさん、お時間取っていただいて丁寧な解説、ありがとうございます。/\zsは前方検索のため、sowUrlがマッチしてカーソルが前に進んだ後の場所からではマッチしないようです。一方、/\@<=は後方検索のため、souUrlがマッチしてカーソルが前に進んでも問題なくマッチするようです。】
----
マッチで/\zs /\zeという、マッチのスタート位置、エンド位置を設定できる便利なアトムがあります。
今日は、この/\zsがうまく働いてくれないというトラブルに見舞われました。
これでsyntaxファイルの編集に詰まって、4時間くらい無駄に費やしてしまいました。
作っていたのは、
"http://hoge.jp tag"のように、
本文中のURLの後に来た文字列をタグと判断して色をつける構文ファイルなのですが、
syntax match sowUrlAttribute /h\?ttps\?:\/\/[^\[\]<>"{}|\\\^`\s]\{-}[\[\]<>"{}|\\\^`]\{-}\s\+\zs\S\+/
↑このスクリプト単品だと、もくろみ通りに、"http://hoge.jp tag"の"tag"の部分をハイライトさせられます。
だけど、
syntax region sowUrl start=/h\?ttps\?:\/\// end=/[\[\]<>"{}|\\\^`]\|\s\|$/me=s-1 syntax match sowUrlAttribute /h\?ttps\?:\/\/[^\[\]<>"{}|\\\^`\s]\{-}[\[\]<>"{}|\\\^`]\{-}\s\+\zs\S\+/
のように、
urlの部分もハイライトさせると、途端になぜか"tag"に色をつけてくれなくなってしまうんですよね。
それで色々試して、
syntax region sowUrl start=/h\?ttps\?:\/\// end=/[\[\]<>"{}|\\\^`]\|\s\|$/me=s-1 syntax match sowUrlAttribute /\(h\?ttps\?:\/\/[^\[\]<>"{}|\\\^`\s]\{-}[\[\]<>"{}|\\\^`]\{-}\s\+\)\@<=\S\+/
のように、/\@<=(幅ゼロの肯定後読み)を使うと、理想通りの挙動をするようになりました。
これを踏まえると、/\zsでシンタックスハイライトが機能しないのは仕様なんでしょうか?
ヘルプには、「処理速度を気にするなら動作が軽い/\zsを使ってね」とあるので、
私としては、なるべく/\zsを使ったやり方でやるか、それか全く別のアプローチで実現させたいですね。
まだsyntaxの適用だけの問題ならそれで済むのですけれど、タグの検索のときはさすがに、/\@<=を使ってたら明らかに時間かかりそうですからね。
コメント