web-dev-qa-db-ja.com

Vimは複数の「#」の後のすべてのテキストを強調表示します

一連の_#_ハッシュの後にテキストが表示される場合は、テキストを太字にしようとしています。これは私の_.vimrc_の行です:

_au BufRead,BufNewFile *.txt hi header cterm=cyan ctermbg=red
_

そして私の試みた正規表現:

_au BufRead,BufNewFile *.txt syn match header /\n#+\zs.*\ze/
au BufRead,BufNewFile *.txt syn match header /^#+\zs.*\ze/ "Why doesn't ^ work?
_

この種類のは機能しますが、_#_ sおよび一部の誤ったテキストにも一致します。また、非常に遅く、私のMacBookで一致するのに約10秒かかります:

_au BufRead,BufNewFile *.txt syn match header /\zs\n#*\w*\ze/
_

何が間違っているのかわかりません。これらはオンライン正規表現テスターで機能します。

このテスター では、正規表現^#*(.*)は完全に機能し、最初のキャプチャグループと一致します。これをvimに翻訳するにはどうすればよいですか?

乾杯。

1
haz

1つ以上の一致の乗数は\+です。バックスラッシュ(または\v「非常に魔法の」修飾子)を忘れました。最後に\zeを使用するのは不要です。 ^は行のすべての先頭で一致します\n2番目の行からのみ一致します。 Vimは特別な正規表現方言を使用しているため、さまざまなWebサイトで説明されている内容を調整する必要がある場合があることに注意してください。 :help patternページは、最も信頼できる最高のリファレンスです。

syn match header /^#\+\zs.*/

また、構文の追加は、既存の構文規則によって隠されている可能性があります。 containedin=ALLを追加してみることができますが、それは一般的な解決策ではありません。既存の構文を分析し、構文ごとに特別なソリューションを作成する必要がある場合があります。別の方法として、:matchコマンドを使用することもできます。これは、構文の強調表示の上で(そして独立して)機能します。欠点は、これがwindow-localであるため、これを特定のバッファにのみ適用する場合、またはウィンドウ分割にも適用する場合は、:autocmdマジックが必要です。

match header /^#\+\zs.*/

スタイル批評

au BufRead,BufNewFile *.txt syn matchを使用すると、ファイルタイプの検出(*.txtの(ここでは暗黙の)ファイルタイプへのマッピング)、ファイルタイプのカスタマイズ、構文の強調表示など、いくつかの側面が混在します。物事を分離する方がよりクリーン(そしてより拡張可能)です:

  1. textファイルタイプを定義します:au BufRead,BufNewFile *.txt setf text。この検出は、Vimバージョンにすでに存在している可能性があります。
  2. ~/.vim/syntax/text.vim(または既存の構文を拡張する場合は~/.vim/after/syntax/text.vim)で構文の強調表示(または拡張)を定義します。
2
Ingo Karkat