vimにおけるMarkdown環境について。 現在のVimではSyntaxもデフォルトで入っていたり、 いくつかプラグインもありますが、 ちょっと気に食わないところがあったのでその辺を改良したと言う話です。
現在あるSyntax
Default
何も入れない状態でもvim/syntax/markdown.vim
ファイルがVimの中に用意されているのでmarkdown
ファイルを開くと色付けがされます。
こんな感じ。
この場合、*.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内で変更できます。
Syntaxとしてはほとんど一緒で上の例の中では全く一緒。
plasticboy/vim-markdown
plasticboy/vim-markdown は一番最近更新があるプラグイン(現段階で2ヶ月前)。
恐らく今一番良いもの。 今まではこれを使っていました。
このプラグインを入れると、foldに関しても取り扱ってくれるようになります。
(#
等タイトル毎にfold)
このプラグインで一つ注意が必要なのは、このプラグインではmarkdownのfiletypeを
mkd
と設定するので、
他のプラグインでmarkdown
というファイルタイプを見て何か行う様な
物を使うときには注意が必要です。
ファイルタイプがmkd
の時もmarkdown用の物を適用するよう変更しなくてはいけません。
(結構ハマる所)
*
でのイタリックの件等、その行だけでとどまる様にしてあるので、
余計なハイライトがつかなくなって良い感じです。
ただ、このプラグインで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に登録されてるので、そちらのが更に古いわけですが、 そちらを使ってる人も多いかも。
これはこんな感じ。
最大の問題は*
等の後に連続して文字があったり
[]
の後に()
等が無いと、永遠と探し続けて以後、ずっとおかしな
ハイライトになってしまうこと。
引用部分やバックチックコードが使えますが、ちょっとこれだと使い物にならない感じ。。。
改良版: rcmdnk/vim-markdown
というわけで、自分で改良版を作りました。
plasticboy版をフォークしたものです。
ファイルタイプについては他のプラグインとの兼ね合いもあるのでmarkdown
とし、
さらにplasticboy
ではmarkdown.idea
など、拡張子の後にさらに
付け加えた形も同定出来る様にしてあるのですが、ここ
.old
と.tmp
を加えて*markdown.old
などとした時もmarkdownファイルとして
扱えるようにしました。
もちろん*.md
もmarkdownに。
syntax/markdown.vim
とオリジナルのsyntax/mkd.vim
とのdiffはこんな感じ。
結果、こんな感じになっています。
plasticboyと比べて
- htmlをハイライト。
<code>
や<pre>
はMarkdown用のコードハイライト。
- コードブロックの両端
`
や<code>
等の部分はタグとして別色に。 - URLやメールアドレスをハイライト。
- PHP Markdown Extraの対応。
- コードブロック(
~~~
)。 - フットノート。
- コードブロック(
- ただの
()
だけの時はハイライトしない。 - スペルチェックを殆どの場所(URLとか以外)で有効に。
- Liquid Tag (Octopressで使用時などに便利)をハイライト。
- codeblockについては内部は字下げコードブロック等と同様の色に。
- commentについてはcommentタグを含め中身も違う色に。
一部、<~>
で囲われた所が変ですが、htmlの方との兼ね合いで
余りいじるとconflictするので取り敢えずは中にURLがあるときなど、
簡単なところだけ扱う様にしてあります。
加えて、せっかくなので
ここで紹介されてる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でかなり捗ると思います。
ちなみに、上で使っている例の元ファイルは
また、colorschemeはron
、
htmlの色について一部修正:
" html
hi link htmlItalic LineNr
hi link htmlBold WarningMsg
hi link htmlBoldItalic ErrorMsg
の状態で作り:TOhtml
コマンドでhtml化してあります。
(一部URL等についてはhtmlの色になってしまうので<a...
等は後で外してます。)