使用 Emacs align-regexp 格式化表格

使用 Emacs align-regexp 格式化表格

Vim 有简洁的表格插件,可让您快速对齐某些文本。我经常使用它来沿着某个字符对齐代码块(主要是像=和 这样的=>)。但它在临时表格方面也做得很好。给定类似

|Name|Rank|No.|
|Stan Ridgway|Private First Class|8797|
|John Rambo|Private|889897|
|George S. Patton|General|0879797|

很容易得到这样的结果:

| Name             | Rank                | No.     |
| Stan Ridgway     | Private First Class | 8797    |
| John Rambo       | Private             | 889897  |
| George S. Patton | General             | 0879797 |

选择它(或者简单地将光标放在第一行),然后执行:Tabularize /|

由于我目前正在尝试将 Emacs 和 Vi 进行交叉融合,从双方那里窃取经验,寻找匹配的插件等,因此我想在 Emacs 中做同样的事情。现在,对于前面提到的=/=>内容,align它运行良好,甚至可以自动完成大多数事情。

至于更复杂的东西,还有align-regexp。我敢猜测,这可能只是获取正确的正则表达式来提供给它的问题(可能是在C-u带前缀的扩展版本中)。

对这个方向或其他功能/包有什么建议吗?

答案1

输入M-x orgtbl-mode,然后C-c C-c

| Name             | Rank                |     No. |
| Stan Ridgway     | Private First Class |    8797 |
| John Rambo       | Private             |  889897 |
| George S. Patton | General             | 0879797 |

答案2

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

关于正则表达式: \(\s-*\)默认情况下存在,因此您只需输入|
关于0:它意味着没有额外的尾随空格,即:|longest-field-in-column|

引自对齐命令

Repeating align-regexp

Arguably, for daily use, it’s better to define some adhoc align command, e.g.

  (defun align-repeat (start end regexp)
    "Repeat alignment with respect to 
     the given regular expression."
    (interactive "r\nsAlign regexp: ")
    (align-regexp start end 
        (concat "\\(\\s-*\\)" regexp) 1 1 t))

相关内容