RD をやめてMarkdown にする (emacs + howm)
[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 #
は,=
よりもタイプしづらい
howm でMarkdown を書く方法
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 を大きくする手もあるが 等幅にしておきたいので色調整でなんとかする.
(左端)
- いままでの howm-mode + outline-mode
- markdown-mode のデフォルト
- markdown-mode 用face をカスタマイズ
- 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-edit やcolor-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