2009-10-02 16 views
40

Estaba leyendo este artículo sobre cómo crear mac vi: vi sequence macro y vi una macro útil para crear una secuencia en el búfer.macro Emacs para generar una secuencia?

1.
2.
...
100.

En VI, el truco es que uno puede golpear ctrl-a lo largo de un número y se añadirá una a ella, por lo que este hizo la macro fácil. Quiero poder hacer lo mismo en emacs.

Respuesta

56

Si está utilizando Emacs 23 (y tal vez 22?), Utilice kmacro-insert-counter que está vinculado a C-x C-k TAB de forma predeterminada. Así, por tu ejemplo, que haría:

C-x (C-x C-k TAB . RET C-x)

así que empieza macro, por inserción contador seguido de, nueva línea, macro extremo ''. Luego C-x e e e e e e e etc. O M-1 0 0 C-x e para obtener 100 de ellos.

EDIT:

olvidó mencionar que puede poner el contador a un valor inicial también. Por ejemplo, para comenzar en 1 en lugar de 0, haga M-1 C-x C-k C-c.

Y si no desea que el contador se incremente en un punto en particular, prefímalo con C-u. Por supuesto, las teclas se vuelven un poco ridículas en este punto, por lo que normalmente ato una clave para insertar-pero-no-incrementar.

+1

Sigue siendo pertinente: 'kmacro-set-counter Cx Ck cc' ' kmacro-agrega -counter Cx Ck Ca' 'kmacro-insert-counter Cx Ck TAB' Así que la idea es establecer el contador. Luego defina la macro y dentro de la macro inserte e incremente el contador. A continuación, ejecute repetidamente la macro. Esto puede haber sido obvio para otros lectores pero inicialmente no lo entendí. – Cheeso

17

Emacs 23 admite fragmentos elisp en el texto de reemplazo de replace-regexp.

frecuencia me defino macros de teclado que siguen este patrón:

  • Copiar un bloque de texto
  • Vaya a un número que yo quiero para incrementar en el bloque copiado de texto con isearch
  • Active la marque y mueva el punto para definir una región que abarque el número
  • Mx replace-regexp
  • En el mensaje "Reemplazar regexp", ingrese \([0-9]+\) para capturar un grupo o f uno o más dígitos
  • En la "expresión regular Reemplazar ([0-9] +) con:", introduzca \,(1+ \#1), en donde , indica que una forma elisp para sustituir sigue, 1+ es una función de incremento, y \#1 es el primer texto de coincidencia capturado, interpretado como un número.

Después de tomar un minuto para definir la macro de teclado, esto me permite tener casi la conveniencia de cortar y pegar para generar un montón de bloques de código casi idénticos, como por case declaraciones.

Tenga en cuenta que esta técnica se puede adaptar fácilmente a, p. números dobles (\,(* 2 \#1)) o lo que sea. Incluso puede usarlo para sustituir el siguiente elemento en una secuencia arbitraria mediante el uso de una combinación de 'position y 'nth, pero no entraré en eso ahora :).

+1

gracias por demostrar cómo usar replace-regexp para sustituir un contador por texto –

+0

'\, (eval-expression)' es muy claro en la consulta replace regexps! Tuve que volver a numerar una secuencia de números de superíndice a partir de 1. Todos estaban en las etiquetas SMF '[sup]', comenzando con 63. Así que hice esta consulta reemplazar regexp para iniciarlos desde 1: '(predeterminado \ [sup \] [0-9] + \ [\/sup \] '→' [sup] \, (kmacro-insert-counter 1) [/ sup] '. Sin embargo, los reemplazó con algo así como [sup] Nuevo contador de macros value: 1 (1) [/ sup] 00 ". ¿Cómo podría solucionar esto (además de volver a extraer ese texto adicional)? – Geremia

+1

@Geremia: Esto es lo que tenía que hacer:' C'-':' '(setq kmacro- counter 0) 'y luego:' \ [sup \] [0-9] + \ [\/sup \] '→' [sup] \, (print (setq kmacro-counter (1+ kmacro-counter))) '. – Geremia

1

Hay también:

C-u M-! jot -s '.C-q C-j' 10

No es pura elisp, pero tiene el mismo efecto. Podría escribir una macro con nombre para ejecutarlo por usted.

+1

donde puedo encontrar el comando jot? –

+0

'jot' y 'seq' hacen lo mismo para estos propósitos. Si está en Unix, casi seguramente tiene al menos uno de ellos instalado.q –

51

Los que sienten que hay demasiados trucos para memorizar podrían encontrar la adquisición de algunos elisp más rentable:

 
M-: (dotimes (i 20) (insert (format "%2d.\n" (1+ i)))) 
+6

+1 para mencionando 'M-:' ('eval-expression'), nunca escuché al respecto. –

+0

@TörökGábor' \, (eval-expression) 'está ordenado en consulta reemplazar regexps, también. – Geremia

3

Si se enciende el modo menor CUA (cua-mode), puede seleccionar una columna de texto y luego llénelo con una secuencia de números utilizando cua-sequence-rectangle (vinculado a M-n de forma predeterminada).

Esto es lo mismo que se menciona en el video al que se conectó Török Gábor, pero ahora está escrito aquí, por lo que no tiene que mirar todo el video a menos que lo desee. Es un buen video

+4

También vale la pena señalar que en estos días no se necesita 'cua-mode' * para numerar un rectángulo; dado que 24.1 hay una operación rectangular regular' rectangle-number-lines' unida a 'C-x r N'. (* o 'cua-selection-mode', que es definitivamente la opción preferible para aquellos que no usan' cua-mode' como estándar.) – phils

+2

También puedo vincular a [emacs string-insert-rectangle vector of numbers ?] (http://stackoverflow.com/a/9932745/324105) también. – phils

9

Desde el lanzamiento 24.3 de Emacs (I creen realmente desde el lanzamiento 24.0), la secuencia de pulsaciones de teclas se ha simplificado:

<F3> <F3> . <ENTER> <F4>

luego repetir <F4> clave repetirá la macro.

El truco es que, después de haber comenzado una macro con <F3>, una segunda pulsación de tecla <F3> insertará el valor actual del contador de la macro de teclado en la memoria intermedia, e incrementa el contador en 1.

Otros trucos:

  • <F3> C-u 2 <F3> . <ENTER> <F4> incrementará con 2 (en lugar de +1)
  • C-u 100 <F3> <F3> . <ENTER> C-u 50 <F4> comenzará a las 100 y terminan a 149
  • C-x C-k C-f %03d <ENTER> <F3> <F3> . <ENTER> <F4> se rellenará con cero como "000"

Fuente: Keyboard Macro Counter sección en el manual de Emacs.

+2

Para preestablecer el contador, solo necesita un prefijo numérico arg. por ejemplo, 'C-u 100 . RET '. Un argumento de prefijo para '' indica cuántas veces se debe repetir la macro (incluida la grabación), así que para contar de 100 a 149 inmediatamente se puede terminar con 'C-u 50 ' en lugar de solo ''. – phils

+0

Gracias phils. Mejore mi respuesta (y conocimiento) con sus comentarios. – thdox

+0

'F3 F3 X F4' es una ** gran ** mejora con respecto a' Cx (Cx Ck TAB X Cx) 'en términos de facilidad de uso para un macro desechable - y ahora no tengo que venir aquí porque olvidé el combo de acrobacias clave. Espero que esta respuesta brote hasta la cima, donde pertenece. –

0

Puede utilizar shell-command-on-region lo contrario:

C-u M-! seq 1 100|xargs -I{} echo {}"." 
0

He aquí una definición de función simple para esto:

(defun insert-range (START END &optional STEP FORMAT) 
    "Inserts a range of integers from START to END with STEP (default to 1) 
in a given format (default to \"\\n%d\")" 
    (interactive 
    (list (read-number "Start: " 1) 
     (read-number "End: " 10) 
     (read-number "Step: " 1) 
     (read-string "Format (default to \"\\n%d\"): " nil nil "\n%d"))) 
    (dotimes (i (1+ (/ (- END START) STEP))) 
    (insert (format FORMAT (+ START (* i STEP)))) 
) 
) 
Cuestiones relacionadas