在小数点上对齐数字的垂直列


9

我在Emacs中写了这篇文章。为了使表格看起来更好,我决定调整间距,使小数点整齐地排列。来自数据库的原始格式如下所示:

emacs                11505 227          3.6       3.3         1.9         68.9          93.5        68         
vi                   1087  289          11.1      6.9         2.9         71.7          96.2        9          
wolfram-mathematica  2993  360          4         2.2         1.9         66.7          92.5        51         

那已经很接近了,但是我想让各列正确对齐,并且所有的数字都对齐。第四列应如下所示:

 3.6
11.1
 4

我玩过align命令,但找不到自动对齐表格(可选)小数点的方法。由于某些原因,这些说明根本无法对齐任何内容:

也可以使用将数字相对于小数点对齐M-- M-x align

Answers:


8

首先,您需要确保缓冲区处于文本模式

M-x text-mode

一旦处于文本模式,C-- M-x align(将调用text-dollar-figure对齐规则)将垂直对齐第一个小数。但是它无法对齐第二个小数列。另外,它无法对齐没有明确小数点的数字(例如wolfram-mathematica的平均分数为4)。要解决此问题,您需要在中调整规则的值align-rules-list

(text-dollar-figure
  (regexp . "\\$?\\(\\s-+[0-9]+\\)\\.?")
  (modes . align-text-modes)
  (repeat . t)
  (spacing . 2)
  (justify . t)
  (run-if lambda nil
      (eq '- current-prefix-arg)))

这可以做一些事情:

  • regexp现在允许可选的尾随时间。
  • 通过启用重复,数字的每个实例都会对齐。
  • 为了增加可读性,我添加了2个空格而不是一个空格。

结果:

emacs                11505  227   3.6  3.3  1.9  68.9  93.5   68         
vi                    1087  289  11.1  6.9  2.9  71.7  96.2    9          
wolfram-mathematica   2993  360   4    2.2  1.9  66.7  92.5   51         

一种或多或少的等效方法是定义一个调用align-regexp以下函数的函数:

(defun align-decimal (start end)
    "Align a table of numbers on (optional) decimal points."
    (interactive "r")
    (align-regexp start end "\\(\\s-*\\)\\$?\\(\\s-+[0-9]+\\)\\.?"
                  -2 0 t))

在这种情况下,我将groups参数设置为负数以打开右对齐并设置spacing为0,以便尽可能保留原始间距。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.