Sejajarkan kolom vertikal angka pada titik desimal

9

Saya menulis posting ini di Emacs. Agar tabel terlihat bagus, saya memutuskan untuk menyesuaikan spasi sehingga desimal berbaris dengan rapi. Format asli dari database terlihat seperti ini:

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         

Itu cukup dekat, tetapi saya ingin kolom yang tepat dibenarkan dan semua angka berbaris. Kolom keempat akan terlihat seperti:

 3.6
11.1
 4

Saya bermain-main dengan perintah penyelarasan dan tidak dapat menemukan cara untuk menyelaraskan tabel secara otomatis pada titik desimal (opsional). Untuk beberapa alasan, petunjuk ini gagal menyejajarkan apa pun:

Angka-angka juga dapat disejajarkan sehubungan dengan titik desimal, menggunakan M-- M-x align.

Jon Ericson
sumber

Jawaban:

8

Pertama, Anda perlu memastikan bahwa buffer dalam mode Teks :

M-x text-mode

Setelah dalam mode teks, C-- M-x align(yang menjalankan text-dollar-figureaturan penyelarasan) akan menyelaraskan desimal pertama secara vertikal. Tetapi gagal untuk menyelaraskan kolom desimal kedua. Plus itu gagal untuk menyelaraskan angka yang tidak memiliki titik desimal eksplisit (seperti skor rata-rata wolfram-mathematica sebesar 4). Untuk memperbaikinya, Anda harus menyesuaikan nilai aturan di 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)))

Itu melakukan beberapa hal:

  • Regexp sekarang memungkinkan untuk periode trailing opsional.
  • Dengan menghidupkan ulang, setiap instance nomor disejajarkan.
  • Saya menambahkan 2 spasi alih-alih hanya satu untuk dibaca.

Hasil:

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         

Metode yang kurang lebih setara adalah untuk mendefinisikan fungsi yang memanggil 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))

Dalam hal ini, saya mengatur groupsparameter ke angka negatif untuk mengaktifkan justifikasi kanan dan spacingke 0 untuk mempertahankan jarak asli sebanyak mungkin.

Jon Ericson
sumber