sci

最果て風呂

Markdown 環境を変えてみた

はてなブログでも Markdown で書けるようになっていた。記事の作成方法はエディタで .md を書き、jekyll で .html を生成し、ブラウザで確認しながら修正していくというもの。そしてこれをブログにコピペして投稿するという流れ。

自分が Markdown を使いはじめた時にはいろいろ試行錯誤して環境を整えた。慣れたエディタで入力できるし、手元にデータが残るので一石二鳥なのだ。ただ、自分の環境では fenced code blocks の部分に未対応だった。そのため、この部分はブラウザ上で修正しなければならなくて面倒だった。

基本的には標準の Markdown で書いていきたいのだけれど、時代も変わったので各種のフレーバーを楽しんでみることにした。そもそも標準ってどれなんだろう?

jekyll の対応

まずは jekyll の設定。マニュアルによると kramdown でも fenced code blocks に対応しているそうなのだが、自分の環境ではうまく生成されなかった。そこで、エンジンを kramdown から redcarpet に変更し、highlighter に pygments を指定した。これで シンタックスハイライトをうまく表現できるようになった。

markdown: redcarpet
redcarpet:
    extensions: ["tables"]
highlighter: pygments

Emacs の対応

次は Emacs の設定。今までは markdown-mode を使っていたのだが、これは fenced code blocks に対応しておらず、行頭 4 文字スペースが必要になる。このように記述しないとハイライトがおかしくなってしまうのだ。

このためソースファイルからコピーしてきたものをそのまま使うことができず、範囲選択をしてから C-x C-i でカーソル移動させるとか、C-x r t してからスペースを 4 回押すとか、はたまた C-u 4 C-x TAB したりの ひと手間 が必要だった。

で、調べてみると gfm-mode というのがあって、これにするとハイライトが問題なく色付けされるようになる。ただ、word-wrap も一緒に有効にされてしまうので、自分的にはつらい。

モードラインに Wrap が表示されているけど動きは期待通りになった。これは (visual-line-mode -1) を設定したら消えた。また、リターンでのインデントが勝手に移動させられてしまうようになったけど、M-j を使えば大丈夫だわ。これは (electric-indent-local-mode -1) を設定すると良いらしい。

ということで Markdown に関する設定は下記のようになった。

;;; gfm-mode の設定
(autoload 'gfm-mode "markdown-mode"
  "Major mode for editing Markdown files" t)
(add-to-list 'auto-mode-alist '("\\.md$" . gfm-mode))
(defun markdown-custom ()
  "gfm-mode-hook"
  (setq markdown-command
        "/usr/local/bin/ruby -Ku -S redcarpet --render hard_wrap")
  (setq word-wrap nil)
  (visual-line-mode -1)
  (electric-indent-local-mode -1))
(add-hook 'gfm-mode-hook '(lambda() (markdown-custom)))

おわりに

kramdown とは table の扱いが異なっていて修正が必要だったり、parse_block_html のオプション mardkwon="1" が使えなくて <div> を削除しなければならず移行に手間取ってしまった。まぁこれらは標準ではないからそれを使っていた自分が……

あと、Vim だとこんな面倒な設定をする必要がないんだけどね。長いソースを貼るとシンタックスハイライトがおかしくなるけど、そこはほれ、バッファ全体を評価してると遅くなるし、改行指向だから。

これ、また他のエンジンに変えるとなると相当面倒になるなぁ。

追記

kramdown での fenced code blocks については下記の設定でいけた。表も現状の書き方で認識された。ただ、ハイライトがうまくいかない。pygments が使えるようになるまで redcarpet にしておくかな。

markdown: kramdown
kramdown:
    input: GFM