GitHub Flavored Markdown をもっと Vim でハイライトする vim-gfm-syntax つくった

Vim にはデフォルトで Markdown のドキュメントをハイライトするためのファイルが同梱されています.基本的にはこれで満足なのですが,僕が書くのはほぼ GitHub Flavored Markdown(GFM: GitHub で使える拡張された Markdown 記法)なので,一部ハイライトされない構文があります.

そこで,既存のハイライトに GFM 向けのハイライトを追加する vim-gfm-syntax という Vim プラグインをつくりました.インストールは一般的な他のプラグインと同じです.ハイライトを追加するだけなので,設定済みの markdown ファイルタイプの設定を壊すことは無いはずです.

github.com

入れる前 入れた後
before after

このプラグインを入れると,デフォルトで markdown ファイルタイプのファイルを読んだ時に次のハイライトが追加されます.

  1. テーブル記法
  2. 絵文字記法 (e.g. :dog:)
  3. タスクリスト記法 (e.g. - [x])
  4. 打ち消し線記法 (e.g. ~~取り消された文~~)
  5. issue 番号記法 (e.g. #123)
  6. メンション記法 (e.g. @rhysd)
  7. インラインコード記法(コードブロック記法を含まない) (e.g. code)

1〜6 は GFM 特有の記法で,デフォルトでは全くハイライトされないものです.7 を入れた理由は後の方で説明します.

デフォルトですべてのハイライトが常に有効になるようになっていますが,挙動をある程度制御できるようにいくつかのカスタマイズ方法を提供しています.

ほしい構文だけハイライトする

vim-gfm-syntax では上記のうちほしいものだけをハイライトできます. g:gfm_syntax_highlight_ で始まる変数でそれぞれの構文をハイライトするかどうかを決められます.(詳細は README をご覧ください)

特定の場合だけハイライトしてほしい

commonmark などの普通の(?) Markdown 記法を使う時は上記ハイライトをしてほしくない場合もあると思います.なので,特定のファイルタイプだけハイライトを追加するようにカスタマイズできるようになっています.例えば下記は markdown.gfm というサブファイルタイプをつくって,特定のファイルでのみ追加のファイルタイプを有効にするようにしています.markdown.gfmmarkdown のサブファイルタイプなので markdown の設定も読み込まれます.

" デフォルトでハイライトしない
let g:gfm_syntax_enable = 0
" filetype が 'markdown.gfm' のときだけハイライトを追加する
let g:gfm_syntax_enable_filetypes = ['markdown.gfm']
" 'README.md' というファイルを編集する時は filetype を markdown.gfm にして GFM ハイライトを有効にする
autocmd BufRead,BufNew,BufNewFile README.md setlocal ft=markdown.gfm

ハイライトの色を変えたい

ハイライトの色合いは使っているカラースキームで決まるため,このプラグインが設定しているデフォルトの色合いがベストとは限りません.そのため,ColorScheme autocmd イベントでハイライト色を上書きできるようになっています.

例えば下記は githubFlavoredMarkdownCode(インラインコード記法のハイライト定義)を CursorLine と同じになるように上書きしています.

autocmd ColorScheme * highlight link githubFlavoredMarkdownCode CursorLine

CursorLine は一例で,:hi コマンドでハイライト一覧を見て選ぶことができます.また,githubFlavoredMarkdown で始まる各種コードハイライト名は コード を直接参照してください.

コードブロックのシンタックスハイライト

標準の Markdown ハイライトが対応済みです.

let g:markdown_fenced_languages = ['cpp', 'ruby', 'json']

のようにすると C++RubyJSON のコードブロックがそれぞれの言語の構文でハイライトされます.ただし,数を増やしすぎると Markdown ハイライトの読み込みが重くなってしまうので注意です.

インラインコードのハイライト

Vim の標準の構文ハイライトでは,コード記法は ` のみがハイライトされ,その中身が表示されません.そのため,インラインコードを多用するライブラリのドキュメントではインラインコードの範囲が分かりにくくなります.実は標準のハイライトではデフォルトのハイライトが設定されていないだけで下記のように markdownCode ハイライトを定義してやると色をつけてくれます.

autocmd ColorScheme * highlight link markdownCode Constant

にも関わらず冒頭の 7. を追加したのは,markdownCode だと ``` で始まるコードブロックも一緒にハイライトされてしまうためです.ここは好みですが,文中のインラインコードだけハイライトしてほしい場合はこれではできないため,今回は githubFlavoredMarkdownCode を新たに追加しました.

Well-tested

themis.vim を使って各種ハイライトやカスタマイズ機能をテストしています.また,Travis CI も利用しています.