VimでMarkdownをカンタンにHTML化する
以前に上の記事を書いたのは、もう1年以上前のこと。だから、というわけでもないのだけど、少し方法がアップデートされているので差分を記してみておきます。
まず、以前の方法を簡単にまとめると、
- Markdown記法で何か書く。
- 自作の md2html.pl で変換。
- HTML化された文書の出来上がり。
というもので、シェル上のコマンドで言うと、こんな感じ*1。
$ perl md2html.pl in.md > out.html
それがその後、Perl界の先輩である @karupanerura さんから、それだったらこう書けるよ! と教えて頂きまして。
$ cat in.md | Markdown.pl > out.html
つまり、わざわざそういうスクリプトを使わなくても、Perlの Text::Markdown モジュールをインストール済みなら Markdown.pl コマンドを使えるので、それを通せば変換できるよ、と。
それで、その後はありがたく1年ほどその方法にて変換作業をしていたのですが、ふとこれ、Vim のほうにショートカットを仕込めるはずだなあ、と思いまして。
以下のようにマッピングしてみました。
nnoremap <Leader>mh :%! Markdown.pl %<CR>
使っているところ。
変換後に、Vimプラグインの previm を使ってブラウザで確認しています。
で、とりあえずこれだけでもOKといえばOKなのですが、僕の性格的にはソースのファイル(バッファ)を上書きしてしまうのは結構抵抗があるので、変換後のHTMLは別のバッファに保存して、元のファイルは 残しておけるように以下のような関数を vimrc に設定してみました。
function! s:Markdown2HTML() execute ":%y" execute ":new" execute ":0put +" execute ":w ".strftime('%Y-%m-%d-%H-%M').".html" execute ":%! Markdown.pl %" execute ":w" endfunction nnoremap <Leader>mh :<C-u>call <SID>Markdown2HTML()<CR><CR>
ん〜む……なんだかむっちゃ冗長感溢れていますが、リファクタリングはまた学習の進度に沿ってということで……。
とりあえずやっていることとしては、
":%y" <= バッファ全体をコピー
":new" <= 新規バッファを水平分割で作成
":0put +" <= コピーしておいたテキストを新規バッファへペースト
":w ".strftime('%Y-%m-%d-%H-%M').".html" <= 新規バッファを現在日時分秒を元にしたファイル名で保存(この時はまだMarkdown書式)
":%! Markdown.pl %" <= 保存したバッファでテキストをMarkdownからHTMLへ変換
":w" <= HTMLファイルを保存
という感じです。
動いている様子は、こんな。
便利!!
成果
さて上記でサンプル的に使ったMarkdownファイルですが、じつは本日パブリッシュしたこちらの記事でした。
冒頭に示した記事でも書いたように、Perl入学式では各回のレポートを参加したサポーターさんに書いてもらって、その校正&ブログUPは可能な範囲でぼくが担当したりしています。
*1:厳密にはちょっと当時の設定と違うのだけど、実際の構造を把握しやすいように少しアレンジした。