Aligner les colonnes verticales de nombres sur le point décimal

9

J'ai écrit ce post dans Emacs. Afin de rendre les tableaux agréables, j'ai décidé d'ajuster l'espacement afin que les décimales s'alignent parfaitement. Le format d'origine de la base de données ressemblait à ceci:

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         

C'est assez proche, mais je veux que les colonnes soient justifiées à droite et que tous les chiffres soient alignés. La quatrième colonne devrait ressembler à:

 3.6
11.1
 4

J'ai joué avec les commandes d'alignement et je n'ai pas pu trouver un moyen d'aligner automatiquement le tableau sur le point décimal (facultatif). Pour une raison quelconque, ces instructions n'alignent rien du tout:

Les chiffres peuvent également être alignés par rapport à la virgule décimale, à l'aide de M-- M-x align.

Jon Ericson
la source

Réponses:

8

Tout d'abord, vous devez vous assurer que le tampon est en mode texte :

M-x text-mode

Une fois en mode texte, C-- M-x align(qui invoque la text-dollar-figurerègle d'alignement) alignera la première décimale verticalement. Mais il ne parvient pas à aligner la deuxième colonne décimale. De plus, il ne parvient pas à aligner les nombres qui n'ont pas de point décimal explicite (comme le score moyen de 4 de wolfram-mathématique). Pour résoudre ce problème, vous souhaiterez ajuster la valeur de la règle dans 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)))

Cela fait plusieurs choses:

  • L'expression régulière permet désormais une période de fin facultative.
  • En activant la répétition, chaque instance d'un nombre est alignée.
  • J'ai ajouté 2 espaces au lieu d'un seul pour plus de lisibilité.

Le résultat:

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         

Une méthode plus ou moins équivalente consiste à définir une fonction qui appelle 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))

Dans ce cas, j'ai défini le groupsparamètre sur un nombre négatif pour activer la justification à droite et spacingsur 0 afin de préserver autant que possible l'espacement d'origine.

Jon Ericson
la source