Wyrównaj pionowe kolumny liczb z przecinkiem

9

Napisałem ten post w Emacsie. Aby tabele wyglądały ładnie, postanowiłem dopasować odstępy, aby ułamki dziesiętne były równo ustawione. Oryginalny format z bazy danych wyglądał następująco:

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         

To dość blisko, ale chcę, aby kolumny były wyjustowane, a wszystkie cyfry ustawione w jednej linii. Czwarta kolumna powinna wyglądać następująco:

 3.6
11.1
 4

I bawił się align poleceń i nie mógł znaleźć sposób, aby automatycznie wyrównać tabelę na (opcjonalnie) przecinku. Z jakiegoś powodu te instrukcje w ogóle niczego nie wyrównują:

Liczby można również wyrównać względem punktu dziesiętnego, używając M-- M-x align.

Jon Ericson
źródło

Odpowiedzi:

8

Najpierw musisz się upewnić, że bufor jest w trybie tekstowym :

M-x text-mode

Po C-- M-x alignprzejściu do trybu tekstowego (który wywołuje text-dollar-figureregułę wyrównania) wyrównuje pierwszą liczbę dziesiętną pionowo. Ale nie wyrównuje drugiej kolumny dziesiętnej. Ponadto nie wyrównuje liczb, które nie mają wyraźnego przecinka (np. Średni wynik wolfram-mathematica wynoszący 4). Aby to naprawić, musisz dostosować wartość reguły w 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)))

To robi kilka rzeczy:

  • Wyrażenie regularne pozwala teraz na opcjonalny okres końcowy.
  • Po włączeniu powtarzania każde wystąpienie liczby jest wyrównane.
  • Dodałem 2 spacje zamiast tylko jednego dla czytelności.

Wynik:

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         

Mniej więcej równoważną metodą jest zdefiniowanie funkcji, która wywołuje 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))

W takim przypadku ustawiam groupsparametr na liczbę ujemną, aby włączyć justowanie po prawej stronie, i spacingna 0, aby zachować jak najwięcej oryginalnych odstępów.

Jon Ericson
źródło