Vim構文の部分一致

Sep 29 2020

Vim構文ファイルで改行文字を一致させようとしています。Vim内でパターンを使用すると機能するようにできますが、構文ファイルに挿入すると、新しい行がある場合とその場合に強調表示されません。そうすべき。

私は新しい行の試合のために使用することを正規表現の一部である:\_s(もしてみました\nと。\(\n\|\s\))

パターン: [,(]\(\_s*\w\+:\)\?\_s*\zs\w\+

パターンの簡略版:([,(]\_s*\zs\w\+質問の例と目的についても同じ)

内部の構文ファイルコード.vim/syntax/python.vim:

syn match pythonFunctionParam '[,(]\_s*\zs\w\+'
[...]
hi link pythonFunctionParam Error
[...]
let b:current_syntax = 'python'

tryを再現するためのサンプルテストファイルは次のtest.pyとおりです。

a(matched_by_all=2, matched_by_all="anything")
b(  matched_by_all=3,
    matched_only_by_vim_search='test'
)
c(
    matched_only_by_vim_search=3
    matched_by_none="it's normal"
)

Vim統合検索(/[,(]\_s*\zs\w\+)を使用すると、それらの一致が得られます。

  matched_by_all    matched_by_all
    matched_by_all
    matched_only_by_vim_search


    matched_only_by_vim_search
    

だからすべてが期待していた

syn match同じ正規表現で構文を使用すると、異なる一致が得られます(一致が少なくなります)。

  matched_by_all    matched_by_all
    matched_by_all






が一致する(か,、同じ行にあるかはわかりますが、新しい行かどうかはわかりません。

だから私の質問は:私の構文ファイルで同じ一致を取得する方法は?

回答

1 MaximKim Sep 29 2020 at 21:17

vimのシンタックスマッチ正規表現エンジンのように見えるが好きではない\zsと\_s。削除する\zsと、一致するものが表示されます。

私は別のアプローチで行きます:

  1. 関数パラメーターを含む透過的な関数呼び出し領域を定義する
  2. 含まれる関数パラメーターを定義する
syn region pythonFunctionCall start='\k\+\_s*(\zs' end='\ze)' contains=pythonFunctionParam transparent keepend
syn match pythonFunctionParam '\k\+\(\s*=\s*[^,]\+\)\?' contained
hi link pythonFunctionParam Error

注:pythonFunctionParamは、調整できる単純な例です。

1 filbranden Sep 29 2020 at 21:53

\zsパターンの開始と同じ行で一致する必要があるという点で、構文一致での動作には明示的な例外があります。

参照:help syn-multi-line:

パターンには、行末に一致する「\ n」を含めることができます。ほとんどの場合、これは期待どおりに機能しますが、いくつかの例外があります。

オフセット付きの開始パターンを使用する場合、試合の開始を次の行で開始することはできません。ただし、強調表示は次の行から開始できます。アイテムを使用するに\zsは、試合の開始が別の行に移動しないことも必要です。

代わりに、幅ゼロの後読み一致を使用することで、これを回避できます。

syn match pythonFunctionParam '\([,(]\_s*\)\@<=\w\+'

ただし、この種の一致はより高価になる傾向があることに注意してください。使用する場合は、その範囲を制限してみてください。Vimの構文エンジンは、一致を絞り込むのに役立つ他のメカニズムも提供します。たとえば、特定のグループが特定の他のグループ内で発生した場合にのみ一致させることができます。これにより、より単純な一致を使用してこの種の構文を実装できる場合があります。