substituição de consulta na macro do teclado

7

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-replacee deixe-me responder às suas perguntas ...

Além da pergunta: você não acha isso errado? [Eu posso M-x edit-last-kbd-macrover 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-replacepara fazer meu kbd-macro funcionar como esperado?

phs
fonte
11
Pessoalmente, não acho errado. A macro do teclado registra todas as teclas digitadas - incluindo as que especificam as entradas 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.
Tikhon Jelvis
Simples. Finalize a macro do teclado antes de responder a qualquer uma das perguntas. EDIT: Eu apenas tentei, talvez não seja tão simples. Eu acho que alguém poderia escrever um novo comando start-kbd-macro-dwim.
Nispio 17/10/2014

Respostas:

6

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-replacequando chamar a macro.

  • F3 iniciar a macro
  • M-< pule para o começo
  • C-u C-x q para inserir uma edição recursiva
  • C-M-c para sair da edição recursiva
  • ... restante das ações macro
  • F4 para salvar e repita

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 ligar query-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 em query-replacevez de usar uma edição recursiva.

dgtized
fonte
11
A menos que eu esteja entendendo mal, isso está gravando tudo, menos a chamada query-replace. Nem parece que isso salvará o FROM-STRINGou TO-STRING.
Nispio 18/10/2014
11
Sim, é exatamente isso que eu estava dizendo. Se consulta substituição precisa ser usado de forma interativa dentro da macro, sem fazer a substituir tudo, eu não acho que uma macro é apropriado
dgtized
3

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-replacesua 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 da query-replaceseguinte maneira:

(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

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-o M-x eval-buffer. É obrigatório C-c q, mas isso pode ser facilmente modificado para o que você quiser.

nispio
fonte