Skip to content

Instantly share code, notes, and snippets.

@ynkdir
Created July 16, 2011 03:48
Show Gist options
  • Save ynkdir/1085982 to your computer and use it in GitHub Desktop.
Save ynkdir/1085982 to your computer and use it in GitHub Desktop.
:syntax の \zs と \@<=
等幅フォント表示
単純化して説明してみます。
\zs について。
:syntax match Attr1 /\(http:\/\/\S\+\s\+\)\zs\(\S\+\)/
\zs と \ze はパターンとしては意味を持ちません。
あってもなくてもマッチするかしないかは変わりません。
syntax で使う場合はマッチしたテキストのどの部分を強調表示するかを指定す
るだけのものと考えていいと思います。
(\ze はマッチ後のカーソルの位置に影響するけどとりあえずおいておく)
例1:
カーソル: v
テキスト: http://example.com/ tag
|------->
前方に向かって http://... を検索する。
この場合はマッチする。
カーソル: v
テキスト: http://example.com/ tag
|------------------>|-->|
^ ^^
| |+--- \(\S\+\)
| +---- \zs
+----------------------- \(http:\/\/\S\+\s\+\)
カーソル: v
テキスト: http://example.com/ tag
|-----------------------|
|---|
^
+---- \zs
http://... 全体がマッチしているが、
\zs の指定により tag の部分のみが強調表示される。
例2:
カーソル: v
テキスト: http://example.com/ tag
|------->
前方に向かって http://... を検索する。
この場合はマッチしない。
\@<= について。
:syntax match Attr2 /\(http:\/\/\S\+\s\+\)\@<=\(\S\+\)/
\@<= はカーソルの位置からテキストの先頭に向かってさかのぼって検索するこ
とができます。
\zs を使った場合と \@<= を使った場合のマッチしたときのカーソルの位置に注
目してください。
例3:
カーソル: v
テキスト: http://example.com/ tag
<-------|
後方に向かって http://... を検索する。
この場合はマッチしない。
例4:
カーソル: v
テキスト: http://example.com/ tag
<-------|
後方に向かって http://... を検索する。
この場合はマッチする。
カーソル: v
テキスト: http://example.com/ tag
|<------------------|-->|
^^
|+--- \(\S\+\)
+---- \(http:\/\/\S\+\s\+\)\@<=
(マッチする位置としてはこの位置になる)
カーソル: v
テキスト: http://example.com/ tag
|---|
\@<= は幅ゼロマッチなので url はマッチには含まれない。
Url と組み合わせてみます。
:syntax match Url /http:\/\/\S\+/
:syntax match Attr1 /\(http:\/\/\S\+\s\+\)\zs\(\S\+\)/
:syntax match Attr2 /\(http:\/\/\S\+\s\+\)\@<=\(\S\+\)/
カーソル: v
テキスト: http://example.com/ tag
この位置では Url と Attr1 がマッチします。
同じ位置でマッチした場合は後から定義した方が優先されますが、
Attr1 は \zs の指定によりマッチ位置が後ろにずれるので、
より前でマッチした方を優先するルールにより Url がマッチします。
(このへんのルールは自分もよくわかってません。実装未確認)
Url がマッチしたのでその分だけカーソルは前進します。
カーソル: v
テキスト: http://example.com/ tag
|-------------------|
Url
カーソルはスペースの上です。
この位置ではどれもマッチしないのでさらに前進します。
カーソル: v
テキスト: http://example.com/ tag
|-------------------|---|
Url Attr2
この位置では Attr2 がマッチします (例4参照)。
ここでなぜ Attr1 がマッチしないかは例2参照。
単純に Url を強調表示して、Url の後ろに単語があればそれも強調表示する、
ということであれば nextgroup を使う方法もあります。
:syntax match Url /http:\/\/\S\+/ nextgroup=Attr skipwhite
:syntax match Attr /\S\+/ contained
nextgroup=Attr で Url の次に Attr が来ることを定義しています。
skipwhite は Url と Attr の間の空白はスキップする、という指定です。
contained は Attr がそれ単体ではマッチしないことを意味します (トップレベ
ルではマッチしない)。この場合は、nextgroup の指定により Url の次にある場
合のみマッチします。
とりあえず参考までに。
url が連続した場合とか考えると \@<= の方がシンプルでいいのかな。。。
他にも contains=... を使ったりいろいろありますね。
説明べたなのと理解があやふやなのでなにがなにやらもうしわけない。。。
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment