Alinhar colunas verticais de números no ponto decimal

9

Eu escrevi este post no Emacs. Para fazer com que as tabelas tenham uma boa aparência, decidi ajustar o espaçamento para que os decimais se alinhem perfeitamente. O formato original do banco de dados era assim:

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         

É bem parecido, mas quero as colunas justificadas e todos os dígitos alinhados. A quarta coluna deve se parecer com:

 3.6
11.1
 4

Eu brinquei com os comandos de alinhamento e não consegui encontrar uma maneira de alinhar automaticamente a tabela no ponto decimal (opcional). Por alguma razão, estas instruções não conseguem alinhar nada:

As figuras também podem ser alinhadas com relação ao ponto decimal, usando M-- M-x align.

Jon Ericson
fonte

Respostas:

8

Primeiro, você precisa ter certeza de que o buffer está no modo de texto :

M-x text-mode

Uma vez no modo de texto, C-- M-x align(que chama a text-dollar-figureregra de alinhamento) alinhará o primeiro decimal verticalmente. Mas ele não alinha a segunda coluna decimal. Além disso, ele falha ao alinhar números que não possuem um ponto decimal explícito (como a pontuação média de 4 de wolfram-mathematica). Para corrigir isso, convém ajustar o valor da regra em 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)))

Isso faz algumas coisas:

  • O regexp agora permite um período de rastreamento opcional.
  • Ao ativar a repetição, cada instância de um número é alinhada.
  • Eu adicionei 2 espaços em vez de apenas um para facilitar a leitura.

O 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         

Um método mais ou menos equivalente é definir uma função que chama 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))

Nesse caso, defino o groupsparâmetro como um número negativo para ativar a justificação spacingà direita e a 0 para preservar o espaçamento original o máximo possível.

Jon Ericson
fonte