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

VimでMarkdownを書いている時にプレビューしなくても *強調* 表示を目立たせる

Vim、便利ですね。
Markdown、便利ですね。

じゃあVimでMarkdownは……?

べりー便利!!

……さて、VimでMarkdownと言ったら、僕の場合はquickrun.vimか、previm*1を使ってきました。

その辺の話は、以下でも書いています。
note103.hateblo.jp

もう2年以上前の記事なので多少情報が古いかもしれませんが、この時にやりたかったことや考えていたことの多くは今もそんなに変わっていないと思います。

そしてまた、VimでMarkdownといったら、けっこう最近めに出た以下における、mattnさんの記事が大変充実していて良かったです*2
gihyo.jp

ちなみに同誌同号の同特集は、その記事にかぎらず全般的にとても良かったですね。
同じくmattnさんのIDE化記事も大変参考になりましたし、KoRoNさんのコラムも非常に面白かったです*3

さてしかし、上で紹介されているようなMarkdownの使い方というのは、基本的に仕上がり(変換後の姿)を見るためにはVimから一旦離れて、ブラウザでプレビューすることが想定されていると思います。

でも、Vimをお使いの皆さんなら誰もがそう思うのではと思うんですが、「Vimから出たくない!」って……思いませんか?
わざわざブラウザに目を移してチェックするなんて……と。

ぼくは思います。いや、もちろんprevimは素晴らしいですし、最近だとこちらも近い感じがしましたが、
Vim に channel が実装されたので Markdown をプレビューするプラグインを作りました - Blank File

でも僕はやっぱり、Vimから出ずにいろいろ完結したいんです!

はい。
で、もしかしたら理想としては、quickrun的にコマンドを実行した途端ウィンドウが上下(OR左右)に分割して、そっちにブラウザみたいなビュワーがサラッと出てきてプレビューが見える、とかだったら素敵だなあ、とかも思ったりするのですが、ちょっと自分的にそれを実現させるのはハードルが高すぎるので、じゃあとりあえずはシンタックス機能による構文ハイライトでその辺が見分けられればいいか、それで十分だな、と。(一気にハードル下がった)

……なんてことを言うと、「え、それはすでに出来るのでは?」と思われるかもしれませんし、実際ある程度はそうなのですが、今回の本題はある意味ここからで、たしかに既存のMarkdownファイルのシンタックス機能でも「#」の見出しや「-」「*」によるリスト、およびリンク文字列などは通常テキストとは別の感じでハイライトされるのですが、なぜか「*」や「_」で囲まれた強調表示に関してはというか、こっちが勢いよく「**強調!**」とか囲っても「なに?」みたいな感じでほぼ無反応です。

「ほぼ」というのは、まあ具体的には以下を見て頂けるとわかると思うのですが(最後の2行)、

f:id:note103:20160317003856p:plain

最後の「**」や「__」で囲んだ部分、虚ろな感じでとりあえずボールドになっているのがわかるでしょうか。たしかに強調……されてるけど……わかりづらい!
しかもその上の「*」「_」1個で囲ってる部分に至っては完全に無反応だし。

ということで、もうこの辺はさすがに諦めなのかなー、と。とりあえずそういうのもブラウザで見れば太字なりイタリックなりで反映されているし、結局ブラウザで確認しろってことだよな……みたいに思っていたのですが、でもやっぱり、「もっと便利になりたい!」という思いは冷めやらず。

なにしろ僕は普段本の編集をする都合上、長文をグネグネといじっては構成することのくり返しで、そういうときに「この部分、なんか理由はわからないけど後から重要になってくる気がするからとりあえず今ちょっとマークしておいて、あとでまた読み返しにこよう」とか思うことが多く、そういうときにそのマークしておきたいところを「*」で囲っておいて、それが他の部分とは明快に違って見える! とかなってたらやっぱり大変便利なんですよね。

で、そういう不満というか、要望をけっこう長きにわたって抱えていたんですが、そんな折にふと読んでいた以下の記事。
rcmdnk.github.io

そこで紹介されている、構文ハイライトの様子がこちらなのですが。
http://rcmdnk.github.io/rawhtml/vim-markdown/rcmdnk-vim-markdown-20141030.html

その中ほどにある以下の部分……

f:id:note103:20160317003813p:plain

あれ、なんか強調表示がハイライトされている……? それもかなり、鮮やかに!?

自分がやりたかったのはまさにこういうことなんだけど……これ、どうなってるんだろう? と。

最初は、そちらで紹介されているプラグイン rcmdnk/vim-markdown を指定された通りに入れればそうなるのかな……とも思ったのですが、考えてみたら僕はすでにそれを入れていた&とくに上記のような強調表示はされていなかったので、そういうことでもなさそうで。

というか、自分が何か設定ミスしているのかなあ、とか疑っていたら、ほぼ同じ疑問を持っていた人がここにもお一人。
q.hatena.ne.jp

たぶん、この方も僕と同じようにそのサンプルHTMLを見て、「なぜ自分のは強調部分がハイライトされないのだろう……」と思ったと思うのですが。
で、それに対して示されたベストアンサーも見たものの、それは余りやりたくないかも……とか思いつつ。

で、そこからまたかなり長い時間ハマっていたのですが、その試行錯誤の経緯は全部カットして結論だけ書くと、同プラグイン作者 @rcmdnk さんのブログで、そのMarkdown関連の別記事をじっくり読み返していたら、
http://rcmdnk.github.io/blog/2013/11/17/computer-vim/

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

vim-markdown.markdown

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

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

の状態で作り(略)

とあって。

この部分、それ以前にも何度も読んでいたはずなのですが、完全に読み落としていました。

つまりここのところ、

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

これをvimrcに追記すると……

f:id:note103:20160317003754p:plain

できたじゃん!

ということで。
まあじつのところ、その記述がVimの中の何にどう働きかけてこれを実現させているのかは皆目理解できていませんが、ともあれしかし、vimrcにちらっとその数行を書くだけで希望の挙動をしているわけですから、現時点ではそれで充分です。

そしてこの点、もしかしたら前述の人力検索にも回答しておいたほうが、後から同じ問題で引っかかった人の役に立つかな……とも思い中ですが、同時にこんな問題で検索する人、俺の他にいないか……とも思ったり。どうなんだろう。

ともあれしかし(再)これにより個人的にはもうよほどのことでなければわざわざブラウザまでチェックしに行くことはなくなりました。

長文を編集しているときにもウェイウェイ気になったところを「*」で囲んでマークして回れますし、その他ちょっとしたメモとか、あと業務の週報とかもMarkdownで書いていますが、それらももちろんVim上のシンタックスハイライトで充分。

Markdownのシンタックスハイライトを充実させてくださっている方々、そして上記記事&プラグインを書かれた @rcmdnk さん、ありがとうございます。

*1:とはいえ実は、最近プラグインのパッケージ管理をNeoBundleからdein.vimに変えたあたりのタイミングでprevimの方がまともに動かなくなってしまって、deinが関係しているかどうかもわからないのだけど、とりあえずそれで最近そちらは起動していない。問題解消したら&原因が判明したらまた何か書くかも。

*2:最近と書いたが1年以上前だった。通読したのが最近だった。

*3:ロボットハンドの喩えやメタプログラムの話など、短い記事だけど目から鱗ポイントが多かった。