Выровнять вертикальные столбцы чисел по десятичной запятой

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

Я поиграл с командами выравнивания и не смог найти способ автоматического выравнивания таблицы по (необязательной) десятичной точке. По какой-то причине эти инструкции вообще ничего не выравнивают:

Цифры также можно выровнять относительно десятичной точки, используя M-- M-x align.

Джон Эриксон
источник

Ответы:

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)))

Это делает несколько вещей:

  • Регулярное выражение теперь позволяет использовать дополнительный конечный период.
  • При включении повтора каждый экземпляр числа выравнивается.
  • Я добавил 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параметра отрицательное число, чтобы включить правое выравнивание, и spacing0, чтобы максимально сохранить исходный интервал.

Джон Эриксон
источник