読者です 読者をやめる 読者になる 読者になる

"TODO:" を目立たせたいと思った、どのファイルでも

タイトルの通り、"TODO" とか "NOTE" とか、そんな目印を目立たせたい、と。
しかもここでは、ファイルタイプ関係なく*1、どのドキュメントにおいても一律、全て同じスタイルのハイライトで構わない、というかむしろそうしたいと考え、その方向で検討しています。

結果、.vimrc の任意の箇所に以下のよう、設定を施しました。;

" コメント中の特定の単語を強調表示する
augroup HilightsForce
  autocmd!
  autocmd WinEnter,BufRead,BufNew,Syntax * :silent! call matchadd('Todo', '\(TODO\|NOTE\|INFO\|XXX\|TEMP\):')
  autocmd WinEnter,BufRead,BufNew,Syntax * highlight Todo guibg=Red guifg=White
augroup END

指定の文字列のアルファベット部は全て大文字で、かつ直後にコロン : で結んだ場合にのみハイライトされるようにしています。
これは単に個人的な好みの問題です。

例えば "TODO" の場合。

単に "TODO" とタイプしてもハイライトはされません。コロン ":" がないので。
また "todo:" とか "Todo:" 等と、大文字-小文字が異なってもハイライトされません。

この度、この度参考にさせていただいた主なリソースは以下の通りです。
有難い。感謝です。;

» In vim, how do I highlight TODO: and FIXME:? - Stack Overflow
» Vim : Highlight the word TODO for every filetype - Stack Overflow
» ちくパ — Vimでどんなファイルタイプでもコメント中の特定の単語をハイライトする

と言うことで、今回の作業で知ったこと、感じた事メモ。



きっかけ

思考のスピードにアウトプットが付いて行けない時って少なからずあって、でも逃すのは大変嫌なので、自分の場合、まず出し尽くすこと最優先っ、と所構わず "TODO" はじめ「後で見よーね」的印をバンバン投下しながら作業を進めることが結構あります。

そしてひと段落付いた所で改めて、その印を辿るわけですが、その巡回作業は検索機能で行っていました。とりあえずそれで事足りると。

そんな中ボンヤリと ~/.vim/colors を眺めていたのです。

そこで幾つかのテーマで "TODO" という文字列の部分が反転し、ガッチリ目立っているのを見て「あ、いいな」と思ったのです。

どこの設定が効いているのか

解は冒頭の通りで、やりたい事は実現できるようにはなったのですが、ひとつどうしても腑に落ちないことがありまして。

当初の勘違い、それはカラースキームではない

最初何も分からなかった時、~/.vim/colors の各サンプルになるよう "TODO" という文字列がハイライトされるのは、カラースキームによるものだと思っていました。

と言うことで、目的のカラースキームを有難く頂き適用してみるのですが、ハイライトされず。

今思えば当然なのですが、その時は「どうしてサンプルみたくならないんだろう」と言うのがリアクションでした。

またサンプル見ると、どうやらファイルタイプは ruby のよう。
とっかかり作業は markdown だったため、そのせいかと、ruby 見てみると、ハイライトされる。

じゃ、どこ

Like all syntax highlighting, TODO, FIXME, XXX, et cetera depend on which type of file you are editing. These keywords are defined in the syntax files for your chosen language.

The examples I quoted are from c.vim

$VIMRUNTIME/syntax/ にあるアレらですね。

上の引用のごとく、$VIMRUNTIME/syntax/c.vim を覗いてみると、それっぽいのがいる。;

syn keyword cTodo contained TODO FIXME XXX

けど何か違う気がしてならない...と言うか、":h group-name" で見てたのと違う。;

   *Todo           o 特別な注意が必要なもの; 大抵はTODO FIXME XXXなど  
                     のキーワード

何かもっと上の偉いところから定義している奴が居るんじゃないだろうかと。いやそれよか、そもそももっとハッキリと "Todo" ってのを定義している場所を知りたいな、と。

:verbose hi Todo

これ後で知ったのですが... orz

'verbose' を0でない値にしてハイライトグループの一覧を表示すると、最後に設定さ
れた場所も表示される。例:
:verbose hi Comment
Comment xxx term=bold ctermfg=4 guifg=Blue
Last set from /home/mool/vim/vim7/runtime/syntax/syncolor.vim

そうそう、こう言うのを知りたかったの。

で、結果指し示された場所は $VIMRUNTIME/syntax/syncolor.vim

...え?

マーク(*)されている名前が優先グループ、その他はマイナーグループである。優先グ
ループには、"syntax.vim" によりデフォルトのハイライト手法が定義されている。マ
イナーグループは優先グループにリンクされ、リンクした先と同じハイライト手法にな
る。ファイル "syntax.vim" が読込まれた後でコマンド ":highlight" を使えば、その
デフォルトを上書することができる。

syntax.vim じゃないんだ、と思いました。

個人の設定を定義するのは?

構文ハイライトに別の色を使うには、色を設定するVimスクリプトを作ればよい。その
ファイルを 'runtimepath' 中 ('runtimepath' は $VIMRUNTIME を含む) のディレクト
リに置くと、その設定がデフォルトの色設定を上書きする。こうして ":syntax reset"
コマンドを実行すると、それらの色が有効になる。

Unixでは~/.vim/after/syntax/syncolor.vimファイルを使うとよい。例: >

とある。

けど、ここでは参照先に倣い、.vimrc の中で定義しました。

これが本当の正解かどうかわかりませんが、はいおしまい.

*1:現時点での自分の作業スタイルを考えると、キーワードに対するハイライトをファイルタイプ単位で切り分けると言う事に余り意味を見い出せないかな、と感じたのがあります。これは人それぞれだと思います。