2012-06-05 12 views
5

Manchmal habe ich eine Textdatei wie dies in Emacs:Rechts-align Text in Emacs

some text  123  17 
other text 1  0 
still more 12  8 
last one  1234 123 

Ich möchte rechts -align die Zahlen (mit Leerzeichen), es in so etwas wie dies zu ändern :

some text  123  17 
other text  1  0 
still more  12  8 
last one  1234 123 

Wie kann dies in Emacs getan werden?

+0

org-Modus und eine Tabelle? – Reactormonk

+1

Table-Mode, Org-Modus nicht notwendig hier, obwohl in der Regel sehr nützlich –

+0

Am Ende bevorzuge ich eine 'rect' basierte [Lösung] (http://StackOverflow.com/A/10916207/357313). –

Antwort

8

align-regexp kann dies tun. Markieren Sie den Bereich, und verwenden Sie dann:

C-uM-xalign-regexpRET\(\s-+[0-9]*\)[0-9]RET-1RET4RETy

, dass die einfachste Ansatz sein sollte.

(Edit: In der Tat, Sie brauchen noch nicht einmal, dass Endziffer zu trennen; \(\s-+[0-9]+\) funktioniert genauso gut für den regexp.)

die interaktiven Eingabeaufforderungen und Chfalign-regexpRET und die Variable für das, was das tatsächlich tut.

Der bemerkenswert ist, dass durch eine negative Zahl für die Gruppe spezifizieren, align-regexp setzt das justify Attribut:

`justify' 
It is possible with `regexp' and `group' to identify a 
character group that contains more than just whitespace 
characters. By default, any non-whitespace characters in 
that group will also be deleted while aligning the 
alignment character. However, if the `justify' attribute 
is set to a non-nil value, only the initial whitespace 
characters within that group will be deleted. This has 
the effect of right-justifying the characters that remain, 
and can be used for outdenting or just plain old right- 
justification. 

Alternativ können die verschiedenen Tabellenbearbeitungsmöglichkeiten auch damit umgehen können (zB org, ses, Tabelle -capture/release), oder Sie könnten es mit einem elisp Ersatzmuster tun.

z.B. Folgendes sollte mehr oder weniger dem entsprechen, wonach Sie suchen, vorausgesetzt, dass die Datei bereits Leerzeichen für die Ausrichtung verwendet (Sie können untabify verwenden, um die Registerkarten zu entfernen, falls dies nicht der Fall ist) und dass alle Zeilen die gleiche Länge haben benötigt in einigen Zeilen, wenn die letzte Spalte unterschiedliche Länge hat).

C-M-%\([0-9]+\)\([[:space:]]+\)RET RET\,(format (concat "%" (number-to-string (1- (length \&))) "d ") (string-to-number \1))