Pregunta sobre text-alignment, emacs – Alinear a la derecha el texto en Emacs

6

A veces, tengo un archivo de texto como este en Emacs:

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

me gustaríaCorrecto-alinear los números (usando espacios), cambiándolos 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?

modo org y una mesa? Reactormonk
Al final prefiero unrect basadosolución. Michel de Ruiter
Modo tabla, modo org no es necesario aquí, aunque en general es muy útil High Performance Mark

Tu respuesta

1   la respuesta
11

align-regexp puede hacer esto Marque la región y luego use:

C-uM-x align-regexp JUBILADO \(\s-+[0-9]*\)[0-9] JUBILADO -1 JUBILADO 4 JUBILADO y

Ese debería ser el enfoque más simple.

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

Ver las indicaciones interactivas yC-hf align-regexp JUBILADO y elalign-rules-list Variable para lo que realmente está haciendo.

La parte notable es que al especificar un número negativo para el grupo,align-regexp establece eljustify atributo:

`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 tablas también pueden lidiar con esto (por ejemplo, org, ses, table-capture / release), o podría hacerlo con un patrón de reemplazo elisp.

p.ej. Lo siguiente debe hacer más o menos lo que está buscando, siempre que el archivo ya esté usando espacios para la alineación (puede usaruntabify para eliminar las pestañas, si no es así, y que todas las líneas tienen la misma longitud (es decir, se necesitan espacios al final de algunas líneas si la columna final es de longitud variable).

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

Simplemente me divertí mirando hacia atrás, viendo los espacios en blanco en el grupo de alineación delalign-regexp patrón, y pensando "Oh no, ¿qué escribí aquí?" antes de leer mi propia explicación de por qué estaba bien :) (¡Obviamente la justificación no es una característica que he usado con regularidad!) phils

Preguntas relacionadas