Emacsにはorgtblという素晴らしいマイナーモードがあって
非常に簡単に表を書けるのですが、GitHub Flavored Markdownとは
微妙に書式が異なるので、Markdownで表を書くときに不便です。
orgtblの場合
| aaa | bbb |
|-----+-----|
| 100 | 200 |
| 300 | 400 |
この+
を|
に置き換える必要があります。
GFMの場合
| aaa | bbb |
|-----|-----|
| 100 | 200 |
| 300 | 400 |
どうするか?
メジャーモードがmarkdown-mode
のときだけ、
ファイル保存時にorgtblの書式をGFMに変換します。
init.el等に以下のように記載します。 1
(defun convert-orgtbl-to-gfm ()
"バッファ内のorgtblをGFMのテーブルに変換します。"
(interactive)
(save-excursion
(goto-char (point-min))
;; |----+-----+----|の行を見つけたら|----|-----|----|に置き換える
(while (re-search-forward
(rx bol (* (syntax whitespace)) "|" ;; 行頭 "|"
(+ (+ "-") (group "+")) ;; "---+ の連続 ("+" だけキャプチャ)
(+ "-") "|" ;; 最後の列 "|"
(* "\s") eol) ;; 行末
nil t)
(replace-match (replace-regexp-in-string (rx "+") "|" (match-string-no-properties 0))))))
(defun my-markdown-hook ()
(orgtbl-mode t)
(add-hook 'before-save-hook
'convert-orgtbl-to-gfm
nil
t ;; buffer-local
))
(add-hook 'markdown-mode-hook 'my-markdown-hook)
これで、markdown-modeでファイル保存時に、orgtblがGFMのテーブルに置き換わります。
このテーブルを再びEmacs上で編集し始めると、元のorgtbl形式に勝手に戻るのですが、
また保存時にはGFM形式に変換されるので問題ありません。
わからなかったこと
正規表現のカッコが2重になっていまして(\\(-+\\(\\+\\)\\)+-+
)
この真ん中のカッコ内の+
を|
に置き換えたいのですが、
replace-match
などでどうやって真ん中のカッコを指定したらいいか
わかりませんでした。
結局今のところ、該当行を見つけて、その範囲内でreplace-string
する
という微妙な感じの処理をしています。1
ご指導ご鞭撻のほどお願いします!
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
-
※コメント頂いた内容を反映しました。 ↩