Editing Markdown pipe tables in Emacs

John J. Camilleri picture John J. Camilleri · Jan 11, 2013 · Viewed 7.1k times · Source

I like to write in Markdown and often find myself needing tables. Are there any good ways of editing Markdown's pipe tables in Emacs? I am referring to this kind of syntax:

| Header | Header | Right |
|--------|--------|------:|
|  Cell  |  Cell  |  $10  |
|  Cell  |  Cell  |  $20  |

I first tried Emacs' table mode which is nice, but is designed for "grid tables" which are not supported by Markdown (let's say in Github's Markdown).

There is also org-mode's table mode which can be used as a minor mode. This comes pretty close; but the intersections are now replaced by + characters and there is no support the alignment colon. So org-tblmode first gives me something like this:

| Header | Header | Right |
|--------+--------+-------|
| Cell   | Cell   | $10   |
| Cell   | Cell   | $20   |

which I then need to manually edit to the following (editing intersection characters and adding alignment colon):

| Header | Header | Right |
|--------|--------|------:|
| Cell   | Cell   | $10   |
| Cell   | Cell   | $20   |

Is there some may that org-tblmode can also handle this? What else do you use/suggest for editing Markdown's pipe tables in Emacs?

Answer

Alexander I.Grafov picture Alexander I.Grafov · Jan 3, 2014

OrgMode has nice function orgtbl-to-generic for converting orgmode' tables to alien formats. I found simple example defining custom convertor based on orgtbl-to-generic: https://gist.github.com/yryozo/5807243. Also see explanation of ORGTBL RECEIVE/SEND features here: http://dynamic-thinking.blogspot.ru/2009/11/orgtbl-mode.html. You need to define custom orgtbl-to-gfm function in Emacs and place it to your autoload then you may use minor mode orgtbl-mode for editing tables.

Small restriction: only right and left column alignments supported because Emacs OrgMode inside self doesn't supports central alignment.

See above sample org-mode source:

<!---
#+ORGTBL: SEND sample orgtbl-to-gfm
| Column 1      | Column 2 |
|---------------+----------|
|               | <l>      |
| Sample line 1 | 100      |
| Sample line 2 | 200      |
-->

And the result in markdown converted from the org-mode source:

<!--- BEGIN RECEIVE ORGTBL sample -->
| Column 1 | Column 2 |
|---|---|
| Sample line 1 | 100 |
| Sample line 2 | 200 |
<!--- END RECEIVE ORGTBL sample -->

Both them placed in the same file.