VimでMarkdown出力してみた

/web/tool

Note: この記事は、3年以上前に書かれています。Webの進化は速い!情報の正確性は自己責任で判断してください。

素の状態でもカッコ良いテキスト記法、Markdownを実用するアレコレ。あるいは如何にして私はMarkdown形式の実用化に至ったか。

Markdownに関しては前回のSugamoでも触れたけれど、まあかっこ良い「はてな記法」と考えて差し支えない。Vimで使うと、HTMLほど気合い入れなくても色分け表示できるし、ちょっとしたメモ書きやブログの下書きとして重宝してます。HTML直書きも許容するゆるーい記法ってのもポイント高いね

そして俺は思った。これ使って「gf」していけば、VimWiki要らないんじゃね?

まずは王道から

ここら辺を参考にゴニョゴニョやってみたのですが。僕の環境ではquickrun.vimを使った結果表示ができませんでした。

なのでquickrun.vimのソースを参考に、こんなの書いて使っていた訳です。

  1. nnoremap \m :!pandoc -f markdown -t html -o /tmp/__markdown.html "%"; open /tmp/__markdown.html<CR><CR>

pandoc で「/tmp/__markdown.html」として書き出し、ファイルを開く。pandocは文書変換用のHaskellライブラリで、Macport経由で入れました。それを使って適当な名前をつけた一時ファイルとして書き出し、Firefoxなんかで開く訳ですね。

これは動きました。実用上は問題なし。
ただし欠点が3つ。

  1. HTMLソースが汚い
  2. dlとかtableが使えない
  3. pandocのインストールには2時間かかる

3.はともかくとして、1.と2.は問題。特に1.が深刻で、何故だか閉じタグの「>」手前で改行が発生し、ソースががたがたになっていたのです。正規表現で変換は可能だけど、二度手間以上に気力を削ぎます。ダメだ。なんとかしなきゃ。

Markdown.plを試す

という訳で、「どーしよーかなー」と思っていたところ、よく見れば公式にはもともと「Markdown.pl」という変換スクリプトが置いてあるじゃありませんか。馬鹿め、何故これを利用しなかった。記法まとめる段階で気付いとけ、という話ですね。

  1. nnoremap \m :!perl /Applications/local/Markdown.pl --html4tags "%" > /tmp/__markdown.html; open /tmp/__markdown.html<CR><CR>

で、できたのがコレ。pandocのときと殆ど同じですね。Markdown.pl は結果を標準出力で返していたので、「> /tmp/__markdown.html」のところでシェルからファイルに書き出してます。

Markdown.pl の出力ではHTMLソースも綺麗で、ダウンロードして適当な場所に放り込んだスクリプトを叩くだけと、実に簡単です。定義リスト(<dl>)やテーブルの出力も、Markdown Extra for perl パッチを当ててやると使えるようになりました。

順風満帆! ここまで来ると欲が出てきます。

並べて確認したいよね?

ここまでの例は、出力したHTMLをブラウザで開いて確認してました。無論それでも良いんですが... 「確認」の目的はHTMLソースのチェックであることが多かったので、出力したソース(HTML)を現在のソース(MKD)の横に表示させてやれば良いんではないかと。となると、「open /tmp/_markdown.html」の代わりに「:vsplit /tmp/_markdown.html」とでもしてやれば良いんです。しかし主旨が「比較」であるなら...

nnoremap  \m :!perl ~/Sites/Git/Markdown/Markdown.pl --html4tags "%" > /tmp/__markdown.html;<CR>
\           :vert diffsplit /tmp/__markdown.html<CR>
\           :highlight DiffChange guibg=grey0<CR>
\           :highlight DiffAdd guibg=grey0<CR>
\           :highlight DiffText gui=NONE, guibg=grey0<CR>
\           :highlight DiffDelete guibg=grey0<CR>

diffで良いじゃん! 差分が多すぎて目が痛いので強調表示を抑える指定を加えてますが、実質2行でできてますね。diffの良いところは、どっちかをスクロールして確認したときに、もう片方も連動して動くところです。それが嫌なら「:diffoff」すれば良いし、その前に「:%diffput」なり「:%diffget」なりしてやれば、元ファイルのHTML一括変換も可能です。その上で開いたウィンドウを閉じてしまえば、見た目上はほかむらさんの作った変換スクリプトと変わらない訳です。

まあRubyてのが気に入らなくて作ったんですけどね。

もっとも、シンタックスをMarkdownからHTMLに変更するためにはファイルタイプの変更もしなくてはいけません。そもそも元の「.mkd」ファイルも維持したい僕としては、元ファイルを直接変換してしまうのはリスキーであります。なのでdiffで確認し、問題なければ「/tmp/__markdown.html」を任意のファイル名で保存する方法を採ります。

完成形

nnoremap \m :call DisplayMarkdown()<CR>
function! DisplayMarkdown()
    !perl ~/Sites/Git/Markdown/Markdown.pl --html4tags "%" > /tmp/__markdown.html;
    vert diffsplit /tmp/__markdown.html
    highlight DiffChange guibg=grey0
    highlight DiffAdd    guibg=grey0
    highlight DiffText   gui=NONE, guibg=grey0
    highlight DiffDelete guibg=grey0
    call cursor(1,1)
"    %diffput
"    wincmd c
"    set ft=html
"    diffoff<CR>
endfunction

さすがにワンライナーもなんだかなー、というか更新しにくいかと思ってスクリプト化してみたのがコレ。

コメント部はいろいろメモ。「wincmd」でコマンドラインからウィンドウ操作できる、というのが何気に一番の収穫。たとえば「wincmd l」は「<C-w>l」と同じだし、「wincmd c」で「<C-w>c」よろしくウィンドウを閉じれる。VimScript書くときには使えるね!

Note: スパム対策が面倒なので、コメント投稿を廃止しました。以前のコメントは残します。
ご意見・ご要望はtwitter@sigwygかはてブコメントにて。