LoginSignup
4
6

More than 5 years have passed since last update.

orgtblを保存時にGitHub Flavored Markdown形式に置き換え

Last updated at Posted at 2016-10-31

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

ご指導ご鞭撻のほどお願いします!

↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓


  1. ※コメント頂いた内容を反映しました。 

4
6
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
6