Como salvar uma macro de teclado como uma função Lisp?

41

Com muita frequência, eu precisaria executar o conjunto de etapas que exigem vários pressionamentos de tecla. Para a mesma sessão, essas etapas podem ser gravadas em uma macro do teclado.

Um exemplo é salvar uma operação de pesquisa / substituição executada com frequência como uma macro do teclado. Mas essa macro é perdida quando eu saio do emacs.

Como posso salvar minha macro de teclado usada com frequência como uma função Lisp?

Por uma questão de simplicidade, quero salvar a ação de substituir "abc" por "def" como uma função para poder reutilizá-lo nas sessões do emacs.

Kaushal Modi
fonte

Respostas:

48

Aqui estão as etapas que você pode seguir:

  • Selecione a região que deseja fazer a substituição da pesquisa.
  • Comece a gravar macro.

    M-x start-kbd-macro

  • Faça o necessário M-x query-replace-regexp(substitua "abc" por "def") e use-o !para forçar a substituição da pesquisa em toda a região.
  • Pare de gravar macro.

    M-x kmacro-end-or-call-macro.

  • Faça M-x kmacro-name-last-macroe dê à macro um nome descritivo como replace-abc-with-def. Você poderá chamar essa macro novamente fazendo isso M-x replace-abc-with-def.
  • Agora salve essa macro como uma função em um arquivo carregado durante a inicialização do emacs; por exemplo init.el,.
    • M-x insert-kbd-macro
    • Selecione sua macro nomeada para ser inserida lá.

A replace-abc-with-defdefinição da função criada automaticamente é assim:

(fset 'replace-abc-with-def
   (lambda (&optional arg) "Keyboard macro." (interactive "p") (kmacro-exec-ring-item (quote ([59 39 return 97 98 99 return 100 101 102 return 33] 0 "%d")) arg)))

Agora você pode M-x replace-abc-with-defem todas as suas sessões do emacs.

Kaushal Modi
fonte
1
+1 para insert-kbd-macro. Essa é a resposta para a pergunta (e o restante desta resposta fornece ajuda adicional).
Drew
6
Observe também que o Emacs pode gerar dois formatos diferentes para macros do teclado. Qual você obtém quando insert-kbd-macrodepende se o nomeou usando kmacro-name-last-macro(como na resposta acima) ou name-last-kbd-macro.
Phll
1
Observe que, se você usar o name-last-kbd-macroformato (conforme mencionado por @phils acima), terá uma string, não uma função. fsetAo somar isso a um símbolo, você pode executar a macro usando Mx, mas não a chama de lisp ( commandp-> t, functionp-> nil). Estranhamente, mesmo chamá-lo via call-interactivelynão funciona (embora você possa usá execute-kbd-macro-lo).
pyrocrasty 12/03
24

O elmacro já foi mencionado pelo @lunaryorn, mas como autor deste pacote, achei que seria bom dar um exemplo.

Se você gravar uma macro como esta:

F3 C-e M-b M-u C-a C-n F4

Então doing M-x elmacro-show-last-macro upcase-last-wordproduz um buffer com:

(defun upcase-last-word ()
  "Change me!"
  (interactive)
  (move-end-of-line 1)
  (backward-word 1)
  (upcase-word 1)
  (move-beginning-of-line 1)
  (next-line 1 1))
Silex
fonte
17

O pacote elmacro permite visualizar a última macro gravada com o Emacs Lisp adequado M-x elmacro-show-last-macro.

lunaryorn
fonte
7
Alguém recomendando o meu pacote \ o /
Silex 08/10