consulta-reemplazar en macro de teclado


7

Permítanme definir una macro de teclado: entro C-x (, luego empiezo con M-<, luego escribo M-%para consultar y reemplazar algunas apariciones de foo por barra . De las 3 ocurrencias encontradas, reemplazo solo las 2 últimas, luego guardo con C-x C-sy termino el kbd-macro con C-x ). ¡¡Bien hecho!!

Si ahora ejecuto el kbd-macro en otro búfer, no me preguntará si quiero reemplazar foo por barra , ¡reproducirá exactamente mis respuestas anteriores de no-sí-sí y reemplazará las ocurrencias segunda y tercera! ¡No pedirá las 4tas o 5tas ocurrencias (este 2do búfer contiene más foo s) !! Esto no es lo que esperaba cuando definí la macro. Quería que llamara query-replacey me dejara responder sus preguntas ...

Aparte de la pregunta: ¿No te parece mal? [Puedo M-x edit-last-kbd-macroy veo lo que está grabado y entiendo la lógica de todo, pero todavía encuentro esto incorrecto.]

Pregunta real: ¿Qué podría haber usado en lugar de query-replacehacer que mi kbd-macro funcione como se esperaba?


1
Personalmente, no lo encuentro mal. La macro del teclado registra todas las pulsaciones de teclas, incluidas las que se especifican para las entradas, M-%y las reproduce exactamente. Nunca he visto, y no esperaría, una macro que tuviera partes interactivas. Probablemente sea mejor escribir una función elisp interactiva normal en este punto.
Tikhon Jelvis

Simple. Finalice su macro de teclado antes de responder cualquiera de las consultas. EDITAR: Acabo de probarlo, tal vez no sea tan simple. Supongo que alguien podría escribir un nuevo comando start-kbd-macro-dwim.
nispio

Respuestas:


6

Las macros de Emacs reproducen todo lo que el usuario ingresa en el transcurso de la macro, a menos que escapen de la macro. La forma de escapar de una macro en progreso es con C-x q kbd-macro-query.

Específicamente, creo que debe ingresar la edición recursiva, que puede solicitar un comando en minibúfer antes de continuar con la macro.

Creo que quieres definir tu query-replacecuando llamas a la macro.

  • F3 iniciar la macro
  • M-< saltar al principio
  • C-u C-x q para entrar en una edición recursiva
  • C-M-c para salir de edición recursiva
  • ... resto de acciones macro
  • F4 para guardar y repetir

En el siguiente kmacro-end-or-call-macro, saltará al comienzo del búfer e ingresará una edición recursiva, donde puede llamar query-replace. Luego, cuando salga de la edición recursiva C-M-c, continuará la macro desde ese punto.

Si desea solicitar un argumento alternativo para query-replace, podría tener sentido escribir una función de envoltura interactiva simple en query-replacelugar de usar una edición recursiva.


1
A menos que esté malentendido, esto está grabando todo menos la llamada a query-replace. Ni siquiera parece que esto salvará el FROM-STRINGo TO-STRING.
nispio

1
Sí, eso es exactamente lo que estaba diciendo. Si la sustitución de consultas debe usarse de forma interactiva dentro de la macro, sin hacer un reemplazo completo, no creo que una macro sea apropiada
fue el

3

Esto no parece un gran ajuste para una macro de teclado, ya que desea solicitar la entrada del usuario. Es de suponer que desea grabar una macro porque esta es una query-replaceque tiene la intención de hacer con frecuencia. Si no puede hacer que la macro del teclado haga lo que busca, puede crear una combinación de teclas para su llamada específica de la query-replacesiguiente manera:

(global-set-key (kbd "C-c q")   ;; Create a key binding for "Ctrl+c, q"
  (lambda () (interactive)      ;; Define an anonymous interactive funcion
  (query-replace "foo" "bar"    ;; Query-replace "foo" with "bar"
   nil                          ;; Don't require matching whole words
   1 (buffer-end 1))))          ;; Run from beginning to end of buffer

Puede agregar esto a su archivo init y estará disponible para usted la próxima vez que inicie emacs, o puede tomarlo para una prueba de manejo pegándolo en el *scratch*búfer y ejecutándolo M-x eval-buffer. Está obligado a hacerlo C-c q, pero eso se puede modificar fácilmente a lo que quieras.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.