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-replace
y me dejara responder sus preguntas ...
Aparte de la pregunta: ¿No te parece mal? [Puedo M-x edit-last-kbd-macro
y 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-replace
hacer que mi kbd-macro funcione como se esperaba?
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.start-kbd-macro-dwim
.Respuestas:
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-replace
cuando llamas a la macro.En el siguiente
kmacro-end-or-call-macro
, saltará al comienzo del búfer e ingresará una edición recursiva, donde puede llamarquery-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 enquery-replace
lugar de usar una edición recursiva.fuente
query-replace
. Ni siquiera parece que esto salvará elFROM-STRING
oTO-STRING
.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-replace
que 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 laquery-replace
siguiente manera: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ándoloM-x eval-buffer
. Está obligado a hacerloC-c q
, pero eso se puede modificar fácilmente a lo que quieras.fuente