2011-12-30 21 views
10

Digamos que tengo este archivo de texto tabulado:cómo colapsar espacios en blanco en una región?

field1  variable_length_field variable_length_field 
aaaaaa  aaaa      aaaaaaaaa 
bbbbbb  bbbbbbbbbbbbbbbbbbbb  bbbb 

Como puedo transformarla en:

field1 variable_length_field variable_length_field 
aaaaaa aaaa aaaaaaaaa 
bbbbbb bbbbbbbbbbbbbbbbbbbb bbbb 

Sé que podría utilizar replace-regexp en la región, pero las expresiones regulares de Emacs no vienen de forma natural . Estaba buscando algo como delete-whitespace-rectangle, pero eso no hace lo que esperaba, o lo estoy usando mal. Tener la capacidad de hacer esto por columnas Sería deseable también, es decir:

field1  variable_length_field variable_length_field 
aaaaaa  aaaa aaaaaaaaa 
bbbbbb  bbbbbbbbbbbbbbbbbbbb bbbb 
+0

¿Dónde entra el _rectangle_ en esto? – sarnold

+0

Hay dos rectángulos que pueden colapsarse en una columna cada uno, pero encontrarlos requiere escaneo, suponiendo que los campos de datos no sean de ancho fijo. – seh

+0

Usted menciona que el archivo está "tabulado", lo que quiero decir no es que los espacios en blanco que se separan sean caracteres de tabulación, sino que los campos están alineados a la izquierda. ¿Es el caso que ninguno de los campos puede contener espacios en blanco? – seh

Respuesta

13

Esta función debe hacer el truco:

(defun just-one-space-in-region (beg end) 
    "replace all whitespace in the region with single spaces" 
    (interactive "r") 
    (save-excursion 
    (save-restriction 
     (narrow-to-region beg end) 
     (goto-char (point-min)) 
     (while (re-search-forward "\\s-+" nil t) 
     (replace-match " "))))) 

Y, puesto que la cuestión se ha actualizado para aplicarse a espacios en una rectángulo, intente esto:

(require 'rect) 
(defun just-one-space-in-rect-line (start end) 
    (save-restriction 
    (save-match-data 
     (narrow-to-region (+ (point) start) 
         (+ (point) end)) 
     (while (re-search-forward "\\s-+" nil t) 
     (replace-match " "))))) 
(defun just-one-space-in-rect (start end) 
    "replace all whitespace in the rectangle with single spaces" 
    (interactive "r") 
    (apply-on-rectangle 'just-one-space-in-rect-line start end)) 
+0

Eso es casi perfecto. Esto funciona para toda una región pero no en rectángulos, pregunta aclarada. – user525602

+1

segunda versión es perfecto! Intenté aprender a usar rectángulos en elisp ayer para resolver esto, pero no pude hacerlo bien. Este es un gran ejemplo para aprender. ¡Gracias! – user525602

0

¿Está utilizando un IDE? Si está utilizando algo como Eclipse, puede formatear las opciones de espacio en blanco dentro de él. (En Eclipse, presione CTRL + 3 y busque 'formateador'. ¡Me disculpo por no recordar la ruta exacta!) Luego, debería poder resaltar todo y presionar ctrl + shift + G para auto = formatear todo.

¡Avísenos si ayuda! (O, si desea convertir el código que lo hará, háganos saber el idioma.)

+1

"Emacs" aparece en las etiquetas _y_ cuerpo de la pregunta. :) – sarnold

+0

Lo siento, todavía nuevo. Buena suerte. – Salmontres

3

Puede ocuparse de los requisitos de su rectángulo usando las funciones de edición de rectángulo de cua-mode *.

  1. M-xcua-selection-modeRET o (cua-selection-mode 1)
    (yo mismo, tienen activada esta función de forma permanente).

  2. Marque el rectángulo dentro del cual desea colapsar el espacio en blanco, usando C-RET y las teclas de movimiento normales.

  3. Call cua-replace-in-rectangle:
    M-r\s-+RETSPCRET

  4. C-RET de nuevo para finalizar la edición rectángulo.

(*) Esto no funcionará si necesita campos a la derecha del rectángulo que se mantengan alineados, como en este caso lo que se necesita para insertar nuevos espacios para compensar las que se han extraído. Puede usar 2C-split y 2C-merge o simplemente matar/tirar del rectángulo más a la derecha para evitarlo.

+0

Acabo de llegar a esta respuesta. ¿Le importaría explicar por qué '\ s- +' coincide con cualquier cantidad de espacios? Entiendo que '\ s' es un espacio, y que' + 'significa uno o más, pero ¿por qué el signo' -'? –

+2

No, '\ s' no significa un espacio (¡no todos los idiomas regex son iguales!). En Emacs, '\ s' significa un carácter de * sintaxis * indicado por el siguiente carácter. El código '-' es para la clase de sintaxis de espacios en blanco. También puede usar un espacio en lugar de un guión, pero el guión es más legible. Ver 'C-h i g (elisp) Regexp Backslash RET' y luego buscar en la página' \ sCODE' – phils

9

realmente no responder a su pregunta, pero no es

M-SPC runs the command just-one-space, which is an interactive 
compiled Lisp function in `simple.el'. 

It is bound to M-SPC. 

(just-one-space &optional N) 

Delete all spaces and tabs around point, leaving one space (or N spaces). 

[back] 

que es útil cuando se desea eliminar los espacios en blanco en uno de los casos. Puede ser adecuado para un caso macro donde las eliminaciones están en líneas aleatorias sin un patrón fijo.

Cuestiones relacionadas