Alinear columnas verticales de números en el punto decimal

9

Escribí esta publicación en Emacs. Para que las tablas se vean bien, decidí ajustar el espacio para que los decimales se alineen perfectamente. El formato original de la base de datos se veía así:

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         

Eso está bastante cerca, pero quiero que las columnas estén justificadas y todos los dígitos alineados. La cuarta columna debería verse así:

 3.6
11.1
 4

Jugué con los comandos de alineación y no pude encontrar una manera de alinear automáticamente la tabla en el punto decimal (opcional). Por alguna razón, estas instrucciones no pueden alinear nada en absoluto:

Las figuras también se pueden alinear con respecto al punto decimal, usando M-- M-x align.

Jon Ericson
fuente

Respuestas:

8

Primero, debe asegurarse de que el búfer esté en modo Texto :

M-x text-mode

Una vez en modo texto, C-- M-x align(que invoca la text-dollar-figureregla de alineación) alineará el primer decimal verticalmente. Pero no puede alinear la segunda columna decimal. Además, no alinea los números que no tienen un punto decimal explícito (como el puntaje promedio de Wolfram-Mathica de 4). Para solucionarlo, querrás ajustar el valor de la regla en 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)))

Eso hace algunas cosas:

  • La expresión regular ahora permite un período final opcional.
  • Al activar la repetición, cada instancia de un número se alinea.
  • Agregué 2 espacios en lugar de solo uno para facilitar la lectura.

El resultado:

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         

Un método más o menos equivalente es definir una función que llame a 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))

En este caso, configuro el groupsparámetro en un número negativo para activar la justificación derecha y spacingen 0 para preservar el espaciado original tanto como sea posible.

Jon Ericson
fuente