構文ハイライト領域/キーワードの重複


7

Linux logrotateスクリプトの構文ファイルを書き込もうとしています。

多くの場合、これらには、回転アクションの前または後に実行されるスクリプトのインライン定義が含まれています。

例(cups-daemonUbuntu 14.04で提供されるlogrotateスクリプト):

    prerotate
            if [ -e /var/run/cups/cupsd.pid ]; then
                    invoke-rc.d --quiet cups stop > /dev/null
                    touch /var/run/cups/cupsd.stopped
            fi
    endscript
    postrotate
            if [ -e /var/run/cups/cupsd.stopped ]; then
                    rm /var/run/cups/cupsd.stopped
                    invoke-rc.d --quiet cups start > /dev/null
                    sleep 10
            fi
    endscript

両方に方法はありますか?

  • キーワードとして強調表示prerotatepostrotate
  • リージョンとしてすべての間にハイライトしますか?

私はそれらのどちらかに対して適切な強調表示を定義するかもしれませんが、両方に対してはそうではないようです。

" this works
syntax keyword LogrotateKeyword prerotate postrotate endscript

" this also works
syntax region LogrotateScript start=/prerotate/ms=e+1 end=/endscript/me=s-1

これで、同じ構文ファイル内の両方が、使用される規則の順序に関係なく、キーワードの強調表示のみを生成します。

私が試したmatch(と\zs/ \zeまたは先読み/ lookbehinds)の代わりにregion、あまりにも。またmatch、キーワードとインラインスクリプトの両方に使用してみました。定義が重複しないことを期待して、結果はまったく同じように見えます。

インラインスクリプトのデフォルトの色をそのまま使用することもありますが、インラインスタッフには他のlogrotateキーワードが含まれていることがよくあり、混乱を招く可能性があります。

ほとんどの場合、この問題には関係ありません。パッチ1-1529(pi-rho PPA)を適用したVim 7.4およびUbuntu 14.04。


logrotate構文ファイルが完成したら、共有してください。持っているといいですね。
muru、2016年

@muru こちらです。:)あなたの優秀な答えをありがとう
ルカシュゴルスキ

回答:


5

いくつかの実験の後、これが機能するものです:

syntax keyword LogrotateKeyword prerotate postrotate endscript contained
syntax region LogrotateScript start=/\v^\s*(pre|post)rotate\s*$/rs=e+1 end=/^\s*endscript\s*$/re=s-1 keepend contains=LogrotateKeyword

1つのsyntaxセットを重複している別のセットと連携させるに、より広い一致内により狭い一致を含めることができます

この場合:

  • キーワードをとしてcontained、リージョンをキーワードを含むものとしてマークします。キーワードをマークする必要はありませんが、これらのキーワードの性質を考慮すると、有効な場合は常にこのリージョンが付随します。
  • keependキーワードの一致によって領域の終わりの一致が不明瞭にならないように使用する必要がありました。
  • 行全体をカバーするより広い正規表現を選択したので、強調表示はこれらの行に拡張されません(または、色付きの背景を設定すると、非常に奇妙に見えます)。

Vimのシェルスクリプト構文強調表示と組み合わせる:

syntax include @sh syntax/sh.vim
syntax keyword LogrotateKeyword prerotate postrotate endscript contained
syntax region LogrotateScript start=/\v^\s*(pre|post)rotate\s*$/rs=e+1 end=/^\s*endscript\s*$/re=s-1 keepend contains=LogrotateKeyword,@sh
highlight LogrotateKeyword ctermfg=yellow 

私は得ます:

ここに画像の説明を入力してください

/ 、/の代わりにreand を使用したことに注意してください。他のオプションでは、キーワードをシェルスクリプト構文と組み合わせても機能しませんでした。理由はわかりません。rsmshsmehe


次の方が良いでしょう:

syntax region LogrotateScript matchgroup=LogrotateKeyword start=/\v(pre|post)rotate/ end=/endscript/ contains=@sh

この場合、私は利用しmatchgroupます:

                                                        :syn-matchgroup
        "matchgroup" can be used to highlight the start and/or end pattern
        differently than the body of the region.  Example: 
  :syntax region String matchgroup=Quote start=+"+  skip=+\\"+  end=+"+
       This will highlight the quotes with the "Quote" group, and the text in
        between with the "String" group.

振り返ると、matchgroupこの問題を正確に解決するためのものでした。matchgroug区切り文字を個別に強調表示できるので、区切りキーワードを個別にリストする必要はありません。


許可されたrs/ msオプションの小さなグラフを次に示します。
マイケル-クレイシャーキーは
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.