2012-03-29 13 views
6

¿Cómo puedo usar emacs operación de cadena-insert-rectángulo para añadir un vector de números para una serie de líneas? Por ejemplo, tengo esta versión abreviada de un montón de entradas de texto en mi memoria intermedia emacs:emacs string-insert-rectangle vector of numbers?

element01 8 111111111011010000100000001100101000001111101111011111111000 
element01 8 111101101010101001111111111000111110111111011110100101010111 
element01 8 111111011001001110111010111111100111010110101011111010110011 
element01 8 111111111111111111111111010111101101011101011111000001100000 
element01 8 111100111111011111100110110000001011110101000011111011111101 
element01 8 111001001011000000011100000101001001100101101011101101011011 
element01 8 111011111101101111111111111101101010111110111011111101011011 
element01 8 101101111101101111000110111101111010111011101111001101001011 
element02 6 110101110101100101100101000111010101110111001001101111111011 
element02 6 111001011001001011101110111100111101101011111111111011111101 
element02 6 101111100111010111111010010101111101111111101101111011111011 
element02 6 111101111111111100111110110111101011111001001101101100111111 
element02 6 111111010111101111010011110111001100001000101010111111111101 
element02 6 111110111001101111111100111011110000011011100100100111111010 
element03 13 110011011111111111101011100111111110011111110100111010011111 
element03 13 100011101000111110101101000000000001110110110011110110111101 
element03 13 101100011100011111110111110110101101111111110110110100101111 
element03 13 111111011110101110101011010111110000010111111011100100011111 
element03 13 011100110110110111100101110101111110111100101110010111110011 
element03 13 100111111111100100111110110110111111111101011101110110110111 
element03 13 101111111111110101110110111011111110111101110110111111111111 
element03 13 111110010111110110101111110110111111111110101111111101110011 
element03 13 100111111101110110110110111110111010111110110011111111110111 
element03 13 110100110111110110110100111010110100110110110110110101111111 
element03 13 011111011010111101101001011100111110010111111011111101011010 
element03 13 011101111110010000111000000101101010111110100010110110110110 
element03 13 110100110110110010101010100011100011000000110011011100110100 
element03 13 010101101010110010111100101001001010111001100111110000011011 
[...] 

Y quiero agregar una columna entre la segunda y tercera columna que va a tener este aspecto:

element01 8 id1 111111111011010000100000001100101000001111101111011111111000 
element01 8 id2 111101101010101001111111111000111110111111011110100101010111 
element01 8 id3 111111011001001110111010111111100111010110101011111010110011 
element01 8 id4 111111111111111111111111010111101101011101011111000001100000 
element01 8 id5 111100111111011111100110110000001011110101000011111011111101 
element01 8 id6 111001001011000000011100000101001001100101101011101101011011 
element01 8 id7 111011111101101111111111111101101010111110111011111101011011 
element01 8 id8 101101111101101111000110111101111010111011101111001101001011 
element02 6 id9 110101110101100101100101000111010101110111001001101111111011 
element02 6 id10 111001011001001011101110111100111101101011111111111011111101 
element02 6 id11 101111100111010111111010010101111101111111101101111011111011 
element02 6 id12 111101111111111100111110110111101011111001001101101100111111 
element02 6 id13 111111010111101111010011110111001100001000101010111111111101 
element02 6 id14 111110111001101111111100111011110000011011100100100111111010 
element03 13 id15 110011011111111111101011100111111110011111110100111010011111 
element03 13 id16 100011101000111110101101000000000001110110110011110110111101 
element03 13 id17 101100011100011111110111110110101101111111110110110100101111 
element03 13 id18 111111011110101110101011010111110000010111111011100100011111 
element03 13 id19 011100110110110111100101110101111110111100101110010111110011 
element03 13 id20 100111111111100100111110110110111111111101011101110110110111 
element03 13 id21 101111111111110101110110111011111110111101110110111111111111 
element03 13 id22 111110010111110110101111110110111111111110101111111101110011 
element03 13 id23 100111111101110110110110111110111010111110110011111111110111 
element03 13 id24 110100110111110110110100111010110100110110110110110101111111 
element03 13 id25 011111011010111101101001011100111110010111111011111101011010 
element03 13 id26 011101111110010000111000000101101010111110100010110110110110 
element03 13 id27 110100110110110010101010100011100011000000110011011100110100 
element03 13 id28 010101101010110010111100101001001010111001100111110000011011 
[...] 

¿Cómo puedo usar algo como cadena-insert-rectángulo en emacs para agregar esta nueva tercera columna con el aumento de recuento de número?

PD: Sé que podría hacer esto con un/etc script bash/Perl/Python, en esta pregunta estoy preguntando si esto puede hacerse fácilmente con emacs.

Respuesta

24

creo que la solución más sencilla consiste en marcar el primer carácter de la tercera columna original en la primera línea, punto de movimiento para el mismo carácter de la última línea y, a continuación, escriba:

CuCxrNRET RETid%d

de números rectángulo de líneas es una función Lisp compilado interactiva en `rect.el'.

se ve obligada a C-x r N.

(de números rectángulo líneas de Inicio Fin START-AT & FORMATO opcional) números

insertar en frente de la región-rectángulo.

START-AT, si no es nada, debe ser un número desde el que comenzar contar. FORMAT, si no es nulo, debe ser una cadena de formato para pasar para "formatear" junto con el recuento de líneas. Cuando se llama interactivamente con un argumento de prefijo, solicite START-AT y FORMAT.

La expresión regular-sustituyen y técnicas de macro son dos excelentes herramientas de uso general para saberlo, pero rectángulo de número de líneas es más o menos a medida para esta misma pregunta.

Editar: no me había fijado en ese momento, pero resulta que esta es una nueva característica en Emacs 24. Las versiones anteriores de Emacs se traducirán a esa secuencia C-x r n (minúscula n), que dirige una función completamente diferente.

+0

¡Gran característica nueva! –

+0

¿Hay alguna manera de contar hacia atrás? – NeilenMarais

+0

No está integrado en este comando, no (aunque se me ocurre que un argumento de prefijo numérico podría usarse para indicar el valor del paso, como una mejora útil). – phils

0

Esta es una manera de hacerlo en emacs, por desgracia, este enfoque no utiliza cuerdas-insert-rectángulo. Además, este enfoque asume groseramente que hay más de 10 caracteres en cada línea. La hilaridad seguirá si ese no es el caso. M-x doit lo invocará.

(defun doit() 
    (interactive) 
    (save-excursion 
    (beginning-of-buffer) 
    (let ((n 1)) 
     (while (< (point) (point-max)) 
     (forward-char 10) 
     (insert "id" (int-to-string n) " ") 
     (end-of-line) 
     (forward-line) 
     (incf n))))) 
7

Puede utilizar query-replace-regexp directamente, mediante la adición de una nueva columna con el partido cuente \#.

Las coincidencias buscan 3 columnas separadas por espacios, que se almacenarán en las cadenas de subcombina \1 en \3. La cadena reemplazada agrega una nueva columna usando el recuento de coincidencias.

Versión 1 (más simple, pero comienza a 0):

M-x query-replace-regexp RET 
^\(\w+\)\ +\(\w+\)\ +\(\w+\)$ RET 
\1 \2 id\# \3 RET 

Nota Solía ​​espacios de juego y la sustitución. Puedes usar pestañas en su lugar.

Versión 2 (Lisp utiliza para personalizar el número de filas con la función +1):

M-x query-replace-regexp RET 
^\(\w+\)\ +\(\w+\)\ +\(\w+\)$ RET 
\,(format "%s %s id%d %s" \1 \2 (+1 \#) \3) RET 
+0

Esto es brillante, gracias! – 719016

+0

Una nota que phils realmente proporcionó una respuesta usando un comando rectangular. –

+0

He estado usando Emacs durante 25 años y nunca he sabido sobre \ # - ¡esto es genial! –

1

Aquí es un registro de cómo se puede solucionar con una macro de teclado. Que yo sepa que no puede resolver esto con un solo string-insert-rectangle.

Cuando se requiere una entrada de registro, solía un

C-1 C-x r n 
      number-to-register 
C-x (  kmacro-start-macro 
C-M-f  forward-sexp [3 times] 
C-M-b  backward-sexp 
C-u C-x r i 
      insert-register 
C-x r + increment-register 
C-x)  kmacro-end-macro 
C-SPC  set-mark-command 
M->  end-of-buffer 
C-x C-k r apply-macro-to-region-lines