rcmdnk's blog

20131117_vim-markdown_200_200

vimにおけるMarkdown環境について。 現在のVimではSyntaxもデフォルトで入っていたり、 いくつかプラグインもありますが、 ちょっと気に食わないところがあったのでその辺を改良したと言う話です。

Sponsored Links

現在あるSyntax

Default

何も入れない状態でもvim/syntax/markdown.vimファイルがVimの中に用意されているのでmarkdownファイルを開くと色付けがされます。

デフォルトSyntax

こんな感じ。

この場合、*.md等のファイルはMarkdownではなく modula2 のものと判断されてしまうので、これを変更するためには

" md as markdown, instead of modula2
autocmd MyAutoGroup BufNewFile,BufRead *.{md,mdwn,mkd,mkdn,mark*} set filetype=markdown

こんな感じで.vimrcの中で適当にmd等の拡張子をmarkdownと判断させる様にしておくと md拡張子でもmarkdownのsyntaxが適用されます。

また、最後に見れるように、*等はitalic表示になりますが、 これが閉じられないと永遠とitalicが続いてしまうので、 italicなハイライトを止めておきたい時は

" Disable highlight italic in Markdown
autocmd MyAutoGroup FileType markdown hi! def link markdownItalic LineNr

こんな感じで.vimrcに書いておけitalic表示を止めることが出来ますが、 これだと*~*となってる所でも全て止められてしまいます。

後は、引用部分(>)やバックチック(`)による コード表示などが適用されないのがちょっと悲しいところ。

tpope/vim-markdown

tpope/vim-markdown は恐らく一番古い?プラグイン。

上のデフォルトのプラグインを作ってる人のもので vimの中に入っているものよりも古いので これをわざわざ入れる必要はありません。

一つだけ利点としては、このプラグインの中のftdetect/markdown.vim では他のmodula2を無視してmdファイルもmarkdownとしてくれる、と言うくらい ですが、これだけなら上の様にvimrc内で変更できます。

tpopeのSyntax

Syntaxとしてはほとんど一緒で上の例の中では全く一緒。

plasticboy/vim-markdown

plasticboy/vim-markdown は一番最近更新があるプラグイン(現段階で2ヶ月前)。

恐らく今一番良いもの。 今まではこれを使っていました。

このプラグインを入れると、foldに関しても取り扱ってくれるようになります。 (#等タイトル毎にfold)

このプラグインで一つ注意が必要なのは、このプラグインではmarkdownのfiletypeを mkdと設定するので、 他のプラグインでmarkdownというファイルタイプを見て何か行う様な 物を使うときには注意が必要です。 ファイルタイプがmkdの時もmarkdown用の物を適用するよう変更しなくてはいけません。 (結構ハマる所)

plasticboyのSyntax

*でのイタリックの件等、その行だけでとどまる様にしてあるので、 余計なハイライトがつかなくなって良い感じです。

ただ、このプラグインでsyntaxで問題なのは

  • htmlがハイライトされない。
  • インラインURLがハイライトされない。
  • ()がどこにあってもハイライトされる。
  • スペルチェックが効かない。

追記: 2014/10/27

最新版ではインラインの一部(html…となってるもの)はハイライトされる様になって、 ()がどこでもハイライトされる問題は解消された模様。

スペルチェックも効くようになっています。

追記ここまで

3番目はある意味意図的なのかもしれませんが、 htmlのSyntaxはsyntax/mkd.vim中で

runtime! syntax/html.vim

とわざわざ呼んでるにも関わらず反映されてません。 また、インラインURLも導入してあるのですが、これも上手く反映されてません。

4つ目が今回何とかしようと思った一番の動機ですが、 markdownは普通の文章を書くことが多いにもかかわらず、 この中でスペルチェックが使えないのは結構痛いです。

今まで、英文なんかを書いた時にふとチェックして、全く見つからないので Vimのチェックはそんなものか、と思ってましたが、このプラグインが悪さをしてました。

hallison/vim-markdown

hallison/vim-markdown はvim.orgにも登録されてる vim-script/Markdown のと同じ(Markdownの方は古いまま)ものです。

このプラグインは上の plasticboy/vim-markdown をforkしたものですが、 更新は随分前に止まっています。

Markdownの方がvim.orgに登録されてるので、そちらのが更に古いわけですが、 そちらを使ってる人も多いかも。

hallisonのSyntax

これはこんな感じ。

最大の問題は*等の後に連続して文字があったり []の後に()等が無いと、永遠と探し続けて以後、ずっとおかしな ハイライトになってしまうこと。

引用部分やバックチックコードが使えますが、ちょっとこれだと使い物にならない感じ。。。

改良版: rcmdnk/vim-markdown

というわけで、自分で改良版を作りました。

plasticboy版をフォークしたものです。

ファイルタイプについては他のプラグインとの兼ね合いもあるのでmarkdownとし、 さらにplasticboyではmarkdown.ideaなど、拡張子の後にさらに 付け加えた形も同定出来る様にしてあるのですが、ここ .old.tmpを加えて*markdown.oldなどとした時もmarkdownファイルとして 扱えるようにしました。 もちろん*.mdもmarkdownに。

syntax/markdown.vimとオリジナルのsyntax/mkd.vimとのdiffはこんな感じ。

vim-markdown.diff

結果、こんな感じになっています。

rcmdnkのSyntax

plasticboyと比べて

  • htmlをハイライト。
    • <code><pre>はMarkdown用のコードハイライト。
  • コードブロックの両端`<code>等の部分はタグとして別色に。
  • URLやメールアドレスをハイライト。
  • PHP Markdown Extraの対応。
    • コードブロック(~~~)。
    • フットノート。
  • ただの()だけの時はハイライトしない。
  • スペルチェックを殆どの場所(URLとか以外)で有効に。
  • Liquid Tag (Octopressで使用時などに便利)をハイライト。
    • codeblockについては内部は字下げコードブロック等と同様の色に。
    • commentについてはcommentタグを含め中身も違う色に。

一部、<~>で囲われた所が変ですが、htmlの方との兼ね合いで 余りいじるとconflictするので取り敢えずは中にURLがあるときなど、 簡単なところだけ扱う様にしてあります。

加えて、せっかくなので

vimでmarkdownのクォート内をシンタックスハイライトする方法とプラグイン

ここで紹介されてるjoker1007/vim-markdown-quote-syntax にちょっと手を加えてvim-markdownの中に入れさせてもらいました。

上の例の一番下に適用したものが載っています。 Triple backtickの時に加え、Octopressのcodeblockタグや PHP Markdown Extraの~によるcodeblockでも対応するようにしました。

コードブロック内をそのまま他のコードブロック同様の色にしたい場合は、

let g:vim_markdown_codeblock_syntax=0

とすると元に戻ります。

ちなみに、javaのsyntaxを入れると、スペルチェックが殆どの場所で 有効でなくなってしまうのでjavaは外してあります。

終わりに

OctopressのブログをMarkdownで書くのに、これで大分やりやすくなりました。

ちょこちょこと編集するたびにまだ足りないとこなどを付け加えていったので まだあるかもしれませんが、syntaxファイルの書き方(特にvimの正規表現について) ちょっと学べた感じが良かったです。

これやろうと思ったきっかけがもともと vim-jp/issues で日本語をスペルチェックから外す、というものが採用されて入った、 というのを見たからで、新しいパッチ(88以降)を入れて

set spelllang+=cjk

とすると日本語が外されます。

今までは日本語が入るファイルでスペルチェックが鬱陶しいので 基本nospellな状態で使ってましたが、 これで最初からスペルチェックを有効にしても大丈夫な部分が増えるので、 特にMarkdownで文章を書くときなんかは この新しいスペルオプションと新しいSyntaxでかなり捗ると思います。

ちなみに、上で使っている例の元ファイルは

vim-markdown.markdown

また、colorschemeはron、 htmlの色について一部修正:

" html
hi link htmlItalic LineNr
hi link htmlBold WarningMsg
hi link htmlBoldItalic ErrorMsg

の状態で作り:TOhtmlコマンドでhtml化してあります。 (一部URL等についてはhtmlの色になってしまうので<a...等は後で外してます。)

追記: 2014/10/30

アップデートしました。

VimでMarkdownの環境を整える その2

追記ここまで

Sponsored Links
Sponsored Links