Hatena::Groupvim

ドゥユーワナビカマヴィマー?

2011/07/20 (Wed)

【一応解決?】パターンとの格闘2

07:28 | 【一応解決?】パターンとの格闘2 - ドゥユーワナビカマヴィマー? を含むブックマーク はてなブックマーク - 【一応解決?】パターンとの格闘2 - ドゥユーワナビカマヴィマー?

今すごく詰まっていることがあります。

それは、たとえば、

hoge ### fuga lin

というテキストがあって、

通常###から行末までをハイライトさせるけれど、

行末にこのように

hoge ### fuga lin #

"#"が付くと、以降は文字列"#$"を発見するまでは、行末であってもregionが継続するというものです。

すごく簡単に見えて、行末の消費が厄介なのです。

syntax region Highlight start=/###/ end=/$/ contains=Expand
syntax region Expand start=/#$/ end=/#\$/ contained transparent

とやった程度では、二番目の条件である、拡張したときに"#$"で終わるというのを満たせません。("#$"のある行の行末まで伸びてしまいます)。

逆にkeependやexcludenlを使ったら、nextgroupを指定しても読み込まずにハイライトが終了してしまいます。

思ったよりも難問で手を焼いています。


一応解決↓

syntax region sowMetaComment start=/###/ end=/.\ze#$\|$\|#\$/ skipnl skipwhite  nextgroup=sowMetaCommentContinue
syntax region sowMetaCommentContinue start=/#$/ end=/#\$/ keepend contained

2011/07/16 (Sat)

パターンとの戦い1

20:43 | パターンとの戦い1 - ドゥユーワナビカマヴィマー? を含むブックマーク はてなブックマーク - パターンとの戦い1 - ドゥユーワナビカマヴィマー?

ここ最近、主にsyntaxファイルや、検索コマンドの定義に時間を費やしているので、作業は必然的に、パターンとの戦いになります。

その過程で、新しいパターンの書き方を発見しては、その都度以前書いた、めんどくせぇ書き方を修正する作業を繰り返しています。

大抵、動かないときは自分のパターンの書き方がまずかったりするわけです。

が、なんで動かないのかよく分からないことも結構あるわけです。

これからしばらくは、詰まったところについての記録をしていく予定です。

今日詰まったところ

否定のコレクション[^;]の中に、空白文字も含めて、[^;\s](";"と空白文字以外)を実現したかったのですが、これではなぜか空白文字を正しく認識しない。

    syntax match sowTag /;[^;\s]\{-1,};/

とすると、空白文字を含んでしまったりして具合が悪い。

[^; \t]と書くことで解決した。

なぜかは知らないけれど、コレクションの中に\sを使うと正しく挙動しないようですね。

これを知ったので、前回のソースで使っていた

syntax region sowUrl start=/h\?ttps\?:\/\// end=/[\[\]<>"{}|\\\^`]\|\_s/me=s-1 nextgroup=sowUrlAttribute skipwhite skipnl

のendの部分も、わざわざ分けずに書くことができるようになりました。

syntax region sowUrl start=/h\?ttps\?:\/\// end=/[\[\]<>"{}|\\\^` \t\n]/me=s-1 nextgroup=sowUrlAttribute skipwhite skipnl

どっちの方が動作が速いのかは分かりません。もしかしたら前の方が早いのかも知れませんが。

しかし、なぜ\sが使えないのか。謎です。

追記:よく見たら、[:blank:]という表現もあるのですね。

コレクションの中ではこっち使えとヘルプに書いていましたね。見逃していました。

2011/07/15 (Fri)

【解決しました】パターン/\zsを使ったsyntaxについて分かる人教えて。

23:47 | 【解決しました】パターン/\zsを使ったsyntaxについて分かる人教えて。 - ドゥユーワナビカマヴィマー? を含むブックマーク はてなブックマーク - 【解決しました】パターン/\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の適用だけの問題ならそれで済むのですけれど、タグの検索のときはさすがに、/\@<=を使ってたら明らかに時間かかりそうですからね。