2012-06-05 752 views
5

A veces, tengo un archivo de texto como este en Emacs:texto de alineación derecha en Emacs

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

me gustaría derecho -align los números (el uso de espacios), convirtiéndolo en algo como esto :

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

¿Cómo se puede hacer esto en Emacs?

+0

org-mode y una mesa? – Reactormonk

+1

table-mode, org-mode no es necesario aquí, aunque generalmente es muy útil –

+0

Al final prefiero una solución basada en 'rect' [solución] (http://stackoverflow.com/a/10916207/357313). –

Respuesta

8

align-regexp puede hacer esto. Marca de la región, y luego usar:

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

Ese debe ser el enfoque más simple.

(Editar: De hecho, usted ni siquiera necesita para separar ese dígito final; \(\s-+[0-9]+\) funciona igual de bien para la expresión regular.)

Ver los mensajes interactivos y Chfalign-regexpRET y la variable align-rules-list por lo que realmente está haciendo.

La parte notable es que mediante la especificación de un número negativo para el grupo, align-regexp establece el atributo justify:

`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. 

Alternativamente, las diversas opciones de edición de mesa también pueden tratar con esto (por ejemplo, org, ses, mesa -capture/release), o puede hacerlo con un patrón de reemplazo elisp.

p. Ej. Lo siguiente debería hacer más o menos lo que está buscando, siempre que el archivo ya esté usando espacios para la alineación (puede usar untabify para eliminar las pestañas si no), y que todas las líneas tienen la misma longitud (es decir, los espacios finales son necesario en algunas líneas si la columna final es de longitud variable).

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

Cuestiones relacionadas