2010-06-25 7 views
3

Je définis généralement de nouvelles raccourcis clavier dans emacs en utilisant Représentation de la frappe Emacs confusion

"C-x (" --> (command kmacro-start-macro) 
"C-x)" --> (kmacro-end-macro) 
(name-last-kbd-macro) 
(insert-kbd-macro) 
Mais le code qu'il génère est différent du code que j'ai lu et modifié dans divers modes majeurs/mineurs et autres utilitaires emacs.
Je suis récemment tombé sur this poste de blog qui efface une partie de ma confusion.

Existe-t-il un outil emacs qui simplifie la représentation des touches? Idéalement celui qui se traduit par ahk keystroke notation à n'importe quelle notation de frappes emacs saine. Éditer: une autre lecture pour effacer ma confusion: keybinding guide par Jari Aalto.

Répondre

5

La séquence que vous spécifiez simplifie la représentation de la séquence de touches. Ce qui vous reste est essentiellement l'ensemble des frappes que vous avez tapé. Il est déjà demandé si vous pouvez convertir un emacs macro into elisp. Peut-être que vous demandez si cela pourrait être rendu plus humainement lisible?

Si oui, alors vous avez de la chance.

Vous pouvez utiliser la macro kbd pour convertir la représentation imprimée de séquences de touches dans le vecteur équivalent de séquences de touches.

Par exemple, la séquence qui se traduit par un query-replace de 3 avec tj ressemble: M-% 3 RET RET tj!

Eh bien, vous pouvez définir manuellement que avec:

(fset 'my-hand-crafted-kbd-macro (kbd "M-% 3 RET tj RET !")) 

Et ce morceau de code elisp devrait générer ci-dessus pour vous si vous avez nommé votre macro 'my-hand-crafted-kbd-macro:

(defun insert-pretty-kbd-macro (macro-name) 
    (interactive (list (intern (completing-read 
           "Insert kbd macro (name): " 
           obarray 
           (lambda (elt) 
           (and (fboundp elt) 
            (or (stringp (symbol-function elt)) 
             (vectorp (symbol-function elt)) 
             (get elt 'kmacro)))) 
           t)))) 
    (interactive) 
    (insert "(fset '") 
    (prin1 macro-name (current-buffer)) 
    (insert "\n (kbd \"") 
    (insert (key-description (symbol-function macro-name))) 
    (insert "\"))\n")) 

Pour obtenir ceci pour se produire automatiquement quand vous finissez une macro de clavier Cx), vous pouvez utiliser ce conseil:

(defadvice kmacro-end-macro (after kmacro-end-macro-name-it-and-insert activate) 
    "user wants to insert elisp to reproduce the last kbd macro" 
    (let ((name (read-string "Name for this kbd macro: "))) 
    (insert "(fset '") 
    (insert name) 
    (insert "\n (kbd \"") 
    (insert (key-description last-kbd-macro)) 
    (insert "\"))\n"))) 
+0

Serait-il possible d'incorporer les 3 premières étapes de la recette simple dans ma question? – Naveen

+0

@Naveen Oui, je peux regarder ça la semaine prochaine. –

1

Merci Trey.
J'ai combiné nom-dernier-kbd-macro avec votre insert-pretty-kbd-macro en nom-et-insert-last-kbd-macro

(defun name-and-insert-last-kbd-macro (macro-name) 
    (interactive (list (intern (completing-read 
           "Insert kbd macro (name): " 
           obarray 
           t)))) 
    (interactive) 
    (insert "(fset '") 
    (prin1 macro-name (current-buffer)) 
    (insert "\n (kbd \"") 
    (fset symbol last-kbd-macro) 
    (insert (key-description (symbol-function symbol))) 
    (insert "\"))\n"))
maintenant, je peux commencer à définir une macro avec f8,
fin et test/run avec f9
, et le nom et l'insérer avec f10:
(global-set-key [f8] 'kmacro-start-macro) 
(global-set-key [f9] 'kmacro-end-and-call-macro) 
(global-set-key [f10] 'name-and-insert-last-kbd-macro) 
(global-set-key [f12] 'menu-bar-open) ; originally bound to F10 

+0

Il y a du code que j'ai ajouté à ma réponse pour l'accrocher automatiquement lorsque vous avez terminé une macro. –

0

J'ai fait un paquet qui permet à peu près exactement cela à https://github.com/Silex/elmacro

il a quelques bizarreries, mais cela fonctionne assez bien ... par exemple, macro suivante:

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

Génère les éléments suivants:

(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))