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

LGTM

Looks Good To Me

RD をやめてMarkdown にする (emacs + howm)

emacs

[2016-06-15] 追記: markdown-mode をアップデートしたら動かなくなったのを修正

みなさん, いろんなところにメモを書いていると思います.

私は長らくRD Format で書いていましたが, 度々Markdown にしようかと考えてました.

2年くらい, 思いつくたびに後回しにしていましたが... 今日はっきりと「Markdown のほうがよい理由」にぶち当たってしまったので, 残念ですがRD やめてみようと思います.

しばらく使ってみて, Markdown が肌に合わなければ 戻します.

なぜ Markdown?

メリット > デメリット と感じるまでに 2年かかった.

メリット

  • Blockquote(引用) が表現できる
    • 今回のモチベーションはこれ
    • web 上で "引用" が多様されるようになってきた
      • 手元のメモに転記するときに引用を表現できないと, まあまあ意味不明
  • 流行に乗ってる感じがする
    • markdown で書かれた文章が増えた. ドキュメントフォーマットを変換することなく手元のメモに書ける可能性が高い

デメリット

  • 既存のメモ(RD) をMarkdown に変換するコストがバカにならない
  • 慣れたRD からMarkdown に変えることで, 新規メモを書くコストが増える
  • 使い続けている howm との相性がよくわからない *1
  • emacs + markdown-mode だと, 見た目がちょっとイマイチ (gfm-mode でもNG)
  • Markdown# ヘッダー と,コード片中の# コメント の区別がつきにくい *2
  • # は, = よりもタイプしづらい

howmMarkdown を書く方法

howm は, どうもRD を前提として書かれている節があります.

そのままではMarkdown で書きづらいので 少し手を入れます.

howm-mode のMarkdown 対応

howm は既にインストールされているものとして, .emacs を次のように修正します.

+(defvar howm-view-title-header "#")  ; this should be evaluated in advance to handle markdown
+
 (autoload 'howm-menu "howm" "Hitori Otegaru Wiki Modoki" t)

 ;;; global configs
 (global-set-key "\C-c,," 'howm-menu)
 (setq howm-menu-lang 'ja)

-(add-to-list 'auto-mode-alist '("\\.txt$" . outline-mode))
+; file associations
+(defun markdown-text-mode ()
+  (markdown-mode)       ; major
+  (outline-minor-mode)  ; minor
+)
+(add-to-list 'auto-mode-alist '("\\.txt$" . markdown-text-mode))

; disable auto-fill-mode
(add-hook 'howm-mode-hook '(lambda () (auto-fill-mode -1)))
ちょっとだけ解説
(defvar howm-view-title-header "#")

howm-view-title-header のデフォルトは = ですが, 上書きします.

howm 内の 様々なemacs lisp から参照されるため, 必ず howm をロードする前に評価 します.

(add-to-list 'auto-mode-alist '("\\.txt$" . markdown-text-mode))

もともとtext 編集にoutline-mode を使っていたこともあり,

  • major mode: markdown-mode
  • minor mode: outline-mode

にします.

余談ですが, outline-mode をminor にした場合 そのままのkeybind では動かないことがあるので, 私はこうしてます.

(add-hook 'outline-minor-mode-hook '(lambda () (local-set-key "\C-c\C-o" outline-mode-prefix-map)))

markdown-mode の見た目を良くする

よくないところ

一番目立ってほしい ヘッダー部分のアピールが足りない

正直 もうちょっとがんばってほしいところ. *3

font を大きくする手もあるが 等幅にしておきたいので色調整でなんとかする.

f:id:codeout:20140415235408p:plain

(左端)

  1. いままでの howm-mode + outline-mode
  2. markdown-mode のデフォルト
  3. markdown-mode 用face をカスタマイズ
  4. markdown-mode の中までカスタマイズ

(右端)

私は右端が好みです.

カスタマイズ

.emacs を次のように修正します.

上の画像の

  • 3 にしたい: 下の a. のみ追加
  • 4 にしたい: 下の a. + b. を追加

b のコードは markdown-mode の内部に入り込みすぎているので, あまりやりたくない.

a だけでガマンできるなら そっちがいいですね. 迷いますが, 私は a. + b. です.

+(add-hook 'markdown-mode-hook '(lambda ()
   ; a.
+  (custom-set-faces
+   '(markdown-header-face-1 ((t (:inherit howm-mode-title-face markdown-header-face))))
+   '(markdown-header-face-2 ((t (:inherit outline-2 markdown-header-face))))
+   '(markdown-header-face-3 ((t (:inherit outline-3 markdown-header-face))))
+   '(markdown-header-face-4 ((t (:inherit outline-4 markdown-header-face))))
+   '(markdown-header-face-5 ((t (:inherit outline-5 markdown-header-face))))
+   '(markdown-header-face-6 ((t (:inherit outline-6 markdown-header-face)))))
+
   ; b.
+  (add-to-list 'markdown-mode-font-lock-keywords-basic
+    (cons markdown-regex-header-1-atx '((1 markdown-header-face-1)
+                                        (2 markdown-header-face-1)
+                                        (3 markdown-header-face-1))))
+  (add-to-list 'markdown-mode-font-lock-keywords-basic
+    (cons markdown-regex-header-2-atx '((1 markdown-header-face-2)
+                                        (2 markdown-header-face-2)
+                                        (3 markdown-header-face-2))))
+  (add-to-list 'markdown-mode-font-lock-keywords-basic
+    (cons markdown-regex-header-3-atx '((1 markdown-header-face-3)
+                                        (2 markdown-header-face-3)
+                                        (3 markdown-header-face-3))))
+  (add-to-list 'markdown-mode-font-lock-keywords-basic
+    (cons markdown-regex-header-4-atx '((1 markdown-header-face-4)
+                                        (2 markdown-header-face-4)
+                                        (3 markdown-header-face-4))))
+  (add-to-list 'markdown-mode-font-lock-keywords-basic
+    (cons markdown-regex-header-5-atx '((1 markdown-header-face-5)
+                                        (2 markdown-header-face-5)
+                                        (3 markdown-header-face-5))))
+  (add-to-list 'markdown-mode-font-lock-keywords-basic
+    (cons markdown-regex-header-6-atx '((1 markdown-header-face-6)
+                                        (2 markdown-header-face-6)
+                                        (3 markdown-header-face-6))))
+))

[2016-06-15] 追記:

markdown-mode をアップデートしたら; b. 部分が動かなくなったので下記のようにする.

; b.
  (dotimes (num 6)
    (let* ((num1 (1+ num))
           (matcher (intern (format "markdown-match-heading-%s-atx" num1)))
           (face (intern (format "markdown-header-face-%s" num1))))
      (delete `(,matcher .
                ((4 markdown-header-delimiter-face)
                 (5 ,face)
                 (6 markdown-header-delimiter-face)))
              markdown-mode-font-lock-keywords-basic)
      (add-to-list 'markdown-mode-font-lock-keywords-basic
                   `(,matcher .
                     ((4 ,face)
                      (5 ,face)
                      (6 ,face))))
      ))

既存のメモ(RD) をMarkdown に変換する方法

あとで戻せるよう, branch を切っておく.

cd _howm-directory_  # 環境により異なります
git checkout -b markdown

ざっとMarkdown に変換

下のようなshell script を実行し, おおまかに変換します.

for i in **/*.txt; do
    echo $i

    sed -i '' -e 's/^====== /###### /' $i
    sed -i '' -e 's/^===== /##### /' $i
    sed -i '' -e 's/^==== /#### /' $i
    sed -i '' -e 's/^=== /### /' $i
    sed -i '' -e 's/^== /## /' $i
    sed -i '' -e 's/^= /# /' $i
    sed -i '' -E 's/^( *)\(([0-9])\)/\1\2. /' $i
done

確認します.

git diff

ざっと見て

git diff -w | egrep "^\+"|wc
   69798  376338 4316486
git diff -w | egrep "^\-"|wc
   69798  376338 4316486

変に消えている行がなければ, 一旦

git commit -am 'Roughly converted RD files into markdown'

変換もれ, 変換しすぎ を手動修正

このままだと, 変換もれや変換しすぎがあると思います.

emacs ならmoccur-editcolor-moccur を駆使して手動修正します.

(これがつらい...)

M-x moccur-grep-find
Directory: _howm-directory_  # 環境により異なります
Input Regexp and FileMask: ^=

確認します.

git diff

問題なさそうなら

git commit -am 'Manually converted RD files into markdown'

timestamp 変更

多くのメモを更新したため, このままだとメモのtimestamp に基づくhowm の機能 (howm-list-recent など) がうまく動きません.

下のようなshell script を実行し, せめてメモ作成時のtimestamp にしておきます.

for i in **/*.txt; do
    echo $i
    touch -t `echo $i | sed 's/.*\///g' | sed 's/..\.txt//g' | sed 's/-//g'` $i
done

*1:howm すごい便利. テキストをたくさん書くemacs 好きにはオススメ

*2:#によるヘッダーにしたいのは, 単にgrep しやすくするため

*3:色は好みによるところが大きいので, 汎用化してからpull request にしたい