恥は/dev/nullへ by 初心者

プログラミング素人がのろのろと学んだことをつづっています♪

Vimでアンダースコアがハイライトした話

目次


問題の内容

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

にありました。


参考にしたサイト

VimでMarkdownファイル中の`_`がエラーハイライトされてしまう問題の対処

vim正規表現リファレンス - Qiita