5

関数が次の形式に従う DSL の vim 構文の強調表示を作成しています。

# A function with no arguments
<function>

# A function with arguments
<function(arg1, arg2)>

# A function with text
<function block of normal text>

# A function with args and text
<function(arg1,arg2) text>

# Line breaks are allowed pretty much everywhere.
<function(
        arg1,
        arg2)
    a block of text>

# As is nesting
<function(<subfunc>) Some text with <another(subfunction) etc.>>

# Backslash escape
<function(single arg with a comma: "\,") contained bracket between quotes: "\>">

これはテキスト処理言語 (ステロイドのマークダウンを考えてください) であるため、テキスト ブロックは非制限的でなければなりません。

このためのvim構文ファイルを書くのに苦労しています。

できます

syn region myFunction start='<' end='>' skip='\\>'
syn region myArgs start='(' end=')' skip='\\)'

ただし、次の例では括弧が誤って強調表示されているため、をmyFunction含めることはできません。myArgs

<function(arg) some text (with parenthesis) that aren't arguments>

具体的には、関数名と引数リストをリージョンのすぐ先頭でのみ強調表示したいと考えています。しかし、私はできません

syn region myFunction start='<(regex to match name and arg list)' ...

恐ろしいことではなかったとしてもregex to match name and arg list、これにより、ネストされた関数を構文で強調表示する能力が損なわれるためです。

私が欲しいnextgroupのはstarta のようなものですがsyntax region、見つかりません。

これは可能ですか?vimscriptでこれを行うにはどうすればよいですか?

4

2 に答える 2

5

<領域の先頭文字と重複する関数名に対して含まれる構文一致を定義し、その後に続く出現ではなく、その直後のみとの一致を試みるためにmyFunction使用します。nextgroupmyArgs

:syn region myFunction start='<' end='>' contains=myFunctionName
:syn match myFunctionName '<\i\+' contained nextgroup=myArgs
:syn region myArgs start='(' end=')' contained

matchgroup編集:これは、<...>要素を使用したバリアントです。を開始要素に使用することはmatchgroupできませんmyFunctionName

:syn region myFunction start='<' matchgroup=myMarker end='>' contains=myFunctionName
:syn match myFunctionName '<\i\+' contained nextgroup=myArgs contains=myMarker
:syn match myMarker '<' contained
:syn region myArgs start='(' end=')' contained
于 2012-11-29T07:39:44.980 に答える
2

ハイライトをより細かく制御するために、これらを試すこともできます。

syn region myFunction start='<' end='[^\\]>' contains=myFunctionName
syn match myFunctionName '<\i\+'hs=s+1 contained nextgroup=myArgs
syn region myArgs start='('hs=s+1 end=')'he=s-1 contained contains=myFunction
于 2012-11-29T08:07:58.897 に答える