7

個人的なメモ用に非常に単純な Vim 構文ファイルがあります。人の名前を強調したいので、Twitter のような構文を選びました@jonathan

私は試した:

syntax match notesPerson "\<@\S\+"

意味: で始まり@、少なくとも 1 つの非空白文字を含む単語。問題は、それ@が Vim 正規表現の特殊文字のように見えることです。

通常のトリックである角かっこでエスケープ\@して囲みます[@]が、うまくいきませんでした。(^|\s)(行頭または空白の先頭)のようなことを試すこともできますが、それはまさに word-boundary が解決しようとしている問題です。

強調表示は単純化された正規表現で機能するため、これは何よりも適切な正規表現を見つける問題です。私は何が欠けていますか?

4

1 に答える 1

13

@\vその前のパターンのどこかにあることによって「非常に魔法の」モードを有効にした場合にのみ、特殊文字です@

ここで別の問題があります:@は新しい単語を開始しません。\<perl/PCRE のような単なる「単語の境界」\bではなく、「<em>左の単語の境界」(ヘルプでは「単語の始まり」) は\<、何らかのキーワード文字が後に続く必要があることを意味します。通常はキーワード文字ではないため@、パターン\<@は決して一致しません。(そして、それが のようなものであった としても、前述の理由から、これは間違いなくあなたが望むものではない\bような構造に一致します。)abc@def

\k\@<!@\k\S*代わりに使用する必要があります: の前にキーワード文字がない\k\@<!ことを確認し、名前の最初の文字がキーワード文字であることを確認します (おそらく も使用できます)。@\k\S*@\<\S\+

別の解決策があります。オプションに含め @'iskeyword'、正規表現をそのままにしておきます。

:setlocal iskeyword+=@-@

:help 'isfname'ここで が使用される理由については、を参照してください@-@。('iskeyword'オプションの構文はまったく同じであり、実際、説明のためにそこにリダイレクトされます。)

于 2012-12-18T20:43:05.623 に答える