Deixe-me definir uma macro de teclado: entro C-x (, depois começo M-<e digito M-%para substituir por consulta algumas ocorrências de foo por barra . Das 3 ocorrências encontradas, substituo apenas as 2 últimas, depois salvo com C-x C-se termino a macro kbd com C-x ). Bem feito!!
Se agora eu executar o kbd-macro em outro buffer, ele não perguntará se eu quero substituir foo por barra , ele reproduzirá exatamente minhas respostas anteriores não-sim-sim e substituirá a 2ª e a 3ª ocorrências! Não solicitará a quarta ou a quinta ocorrências (esse segundo buffer contém mais foo s) !! Não é o que eu esperava quando defini a macro. Eu queria que ele ligasse query-replace
e deixe-me responder às suas perguntas ...
Além da pergunta: você não acha isso errado? [Eu posso M-x edit-last-kbd-macro
ver o que está registrado e entender a lógica de tudo, mas ainda acho isso errado.]
Pergunta real: O que eu poderia ter usado query-replace
para fazer meu kbd-macro funcionar como esperado?
M-%
- e as reproduz exatamente. Eu nunca vi e não esperaria uma macro com partes interativas. Você provavelmente está melhor escrevendo uma função elisp interativa normal neste momento.start-kbd-macro-dwim
.Respostas:
As macros do Emacs reproduzem tudo o que o usuário digita ao longo da macro, a menos que ele escape da macro. A maneira de escapar de uma macro em andamento é com C-x q
kbd-macro-query
.Especificamente, acredito que você precisa inserir a edição recursiva, que pode solicitar um comando no minibuffer antes de continuar a macro.
Eu acho que você deseja definir o seu
query-replace
quando chamar a macro.No próximo
kmacro-end-or-call-macro
, ele pulará para o início do buffer e entrará em uma edição recursiva, para a qual você pode ligarquery-replace
. Então, quando você sair da edição recursiva, C-M-cela continuará a macro a partir desse ponto.Se você deseja solicitar um argumento alternativo
query-replace
, pode fazer sentido escrever uma função simples de wrapper interativo emquery-replace
vez de usar uma edição recursiva.fonte
query-replace
. Nem parece que isso salvará oFROM-STRING
ouTO-STRING
.Isso não parece ser um ótimo ajuste para uma macro de teclado, pois você deseja solicitar a entrada do usuário. Presumivelmente, você deseja gravar uma macro, porque esta é a
query-replace
sua intenção com freqüência. Se você não conseguir fazer com que a macro do teclado faça o que procura, crie uma combinação de teclas para sua chamada específica daquery-replace
seguinte maneira:Você pode adicionar isso ao seu arquivo init e ele estará disponível para você na próxima vez que iniciar o emacs, ou você pode fazer um test drive colando-o no
*scratch*
buffer e executando-oM-x eval-buffer
. É obrigatórioC-c q
, mas isso pode ser facilmente modificado para o que você quiser.fonte