2012-12-18 21 views
7

私は非常にシンプルなVim構文ファイルを持っています。私は人々の名前を強調したいと思い、Twitterのような構文@jonathanを選択しました。Vim構文で@で始まる単語を強調表示する方法は?

私が試した:

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

を意味する:言葉は@から始まると少なくとも一つの非空白文字を持ちます。問題は、@がVim正規表現の特殊文字のようです。

私は\@をエスケープしようとしましたが、括弧内には[@]が含まれていますが、これはうまくいかなかった。私は(^|\s)(行または空白の先頭)のようなものを試すことができますが、それは単語境界が解決しようとする問題です。

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

+0

なぜ '\'を '\ S \ +'でエスケープしましたか? '@'が 'vim'の中の特殊文字とみなされるなら' @ \ S + 'か' \ @ \ S + 'を試してください。私はそれについて知らない。 –

+0

@RohitJain vim構文はBREに由来するためです。特別であるためにはエスケープする必要があります。 – ZyX

+0

@ ZyX ..ああ!私はそれを知らなかった。ありがとう:) –

答えて

13

@は、@より前のパターンに\vを配置して「非常に魔法」モードを有効にした場合のみ、特殊文字です。ここに別の問題があります。@は新しい単語を開始しません。 \<は、\<の後にいくつかのキーワード文字を続けなければならないことを意味する "単語境界"(ヘルプ: "単語の始まり")を意味するperl/PCREのような単なる "単語境界"ではありません。 @は通常はキーワード文字パターン\<@ではないため、一致することはありません(\bのようなものであっても、あなたが望むものではないのは[email protected]のような構造に一致します)。

あなたが代わりに\k\@<[email protected]\k\S*を使用する必要があります:\k\@<!@は、任意のキーワードの文字が付いていないことを保証し、\k\S*は、名前の最初の文字がキーワード1(あなたはおそらくも@\<\S\+を使用すること)であることを確認します。

別のソリューションがあります:'iskeyword'オプションへ@を含めると、そのまま正規表現を残す:。

setlocal [email protected]@ 

を(私はここ@[email protected]を使用する理由の説明のために:h 'isfname'を参照してください'iskeyword'はまったく同じ構文を持っており、リダイレクトしますそこにあなたの説明があります)

+0

素晴らしい作品!詳細な説明をありがとう。 – jpalardy

関連する問題