views:

275

answers:

3

Is anyone aware of an emacs mode or function that will reformat a buffer holding a delimited file such that each delimiter (e.g. tab) defines a "column" with the width of each column set to the longest entry?

I can reset the tab-width variable but that makes all columns equal width. I would much prefer variable-width columns if possible (like how a spreadsheet program like excel would display such a file after resizing the columns).

A: 

Let's assume your delimiter is TAB. Mark the whole buffer, then:

C-u M-x align-regexp \(\s-*\)TAB RET RET RET y

Where TAB in there is an actual tab char. See my similar answer here:

http://stackoverflow.com/questions/970759/how-to-align-arguments-to-functions-in-emacs/971435#971435

scottfrazer
Looks like you meant:C-u M-x align-regexp RET \(\s-*\)TAB RET RET RET yThat works in emacs 23, but seems to give an error "not enough arguments for format string" in emacs 21 (which is still present on some systems that I use) .To be really picky it also expands all the columns by a tab stop, but I guess a global replace would take care of that.
Alex Stoddard
+8  A: 

Check out Org mode's table editor.

huaiyuan
+1  A: 

Org-mode as suggested by huaiyuan did just what I wanted.

To give an example to others, after I installed org-mode I found the following to work well.

Open a new file in org-mode C-x C-f table.org and then M-x org-table-import to import the delimited file. And your done.

The C-| command didn't work for me to convert pre-existing buffer contents into a table, it just inserted a new table, but I don't know org-mode yet.

Alex Stoddard
`C-|` works if the region is *active*, which (for me) means highlighting the region using the mouse, and then typing `C-|`.
Trey Jackson