目次
問題の内容
Vimで文章を書いていた折、アンダースコアが赤くハイライトされました。
ただ、いつもこうなるわけではなく、首をかしげました。
原因(markdown.vim)
ネット検索をしたら、同じ現象に遭遇した方が原因を書いていらっしゃいました。それによると、Markdownのsyntaxを定義しているファイルの
syn match markdownError "\w\@<=_\w\@="
という行が原因とのことでした。これを読み、「そういえば、Markdownファイルを編集している時にこの現象に遭遇しているな」と気づきました。
「\w\@<=_\w\@=」について調べてみました。
\wはアルファベット、数字、アンダースコアにマッチします。 通常の正規表現だと [0-9A-Za-z_] です。 \@<=は「A\@<=B」のように使うと、直前にAがあるBにマッチします。 \w\@<=_ に当てはめると、直前に「アルファベット、数字、アンダースコア」が あるアンダースコアにマッチします。 (例)1_ a_ K_ 3___ のアンダースコア部分 \@=は「AB\@=」のように使うと、直後にBがあるAにマッチします。 _\w\@= に当てはめると、直後に「アルファベット、数字、アンダースコア」が あるアンダースコアにマッチします。 (例)_2 _f _J ___k のアンダースコア部分 よって、上記のパターンを組み合わせた \w\@<=_\w\@= は次のような テキストのアンダースコア部分にマッチします。 (例) a_a a_1 2_B J__w (例)smile___laugh zB_1rk g2_____Hkk
つまり、アンダースコアの両側に「アルファベット、数字、アンダースコア」がある場合にハイライトしているようです。
対応(ハイライトのリンクを解除)
Markdownのsyntaxを定義しているファイル(markdown.vim)において今回の問題に関係している部分は次の2行です。
syn match markdownError "\w\@<=_\w\@=" hi def link markdownError Error
Vimのヘルプに
リンクを作るには: :hi[ghlight][!] [default] link {from-group} {to-group} リンクを削除するには: :hi[ghlight][!] [default] link {from-group} NONE
と書かれています。この知識から
hi def link markdownError Error
は markdownError というグループを Error というグループにリンクさせていることが分かります。Errorにマッチした部分は赤く着色されるようになっているのですが、それがmarkdownErrorにも適用されます。このため、\w\@<=_\w\@= にマッチする部分が赤く着色されているのです。
先程のヘルプの内容からリンクを解除するには
:hi[ghlight][!] [default] link {from-group} NONE
を使えば良いと分かります。なお、[ ]で囲まれた部分については
[] 角カッコで囲まれた文字は省略可能。
とVimのヘルプに書かれています。
以上の知識から.vimrcに以下の記述をしました。
augroup clear_markdownError_highlight autocmd! autocmd FileType markdown highlight link markdownError NONE augroup END
これでMarkdownファイルの編集中にアンダースコアが赤くハイライトすることはなくなりました。
markdown.vimの場所
Markdownのsyntaxを定義しているmarkdown.vimファイルの場所を書いておきます。
aptでDebian11にインストールしたVimでは
/usr/share/vim/vim82/syntax
にありました。
一方、ソースからビルドして~/.localにインストールしたVimでは
~/.local/share/vim/vim90/syntax
にありました。