2009-10-20 8 views
2

Comment puis-je définir une commande emacs X qui fait quelque chose, puis appelle une autre commande emacs Y et copie également l'interface interactive de la commande Y?Définir une commande emacs qui appelle une autre commande emacs (en conservant les infos interactives)

Je veux définir une version altenative de requête avec la valeur temporarilly remplacer basculée de cas fold-search:

(defun alt-query-replace (a b c d e) 
    (interactive) 
    (let ((case-fold-search (not case-fold-search)) 
    (query-replace a b c d e))) 

Cela ne fonctionne pas. Quand j'appelle alt-query-replace, il dit "mauvais nombre d'arguments". Je veux que l'interface interactive de alt-query-replace soit identique à query-replace. Dois-je inspecter le code source de query-replace ou existe-t-il une approche générale?

Répondre

4

Utilisez appel de manière interactive:


(defun alt-query-replace() 
    (interactive) 
    (let ((case-fold-search (not case-fold-search))) 
    (call-interactively 'query-replace))) 
+0

Est-ce que le code passe comme par magie tous les args jusqu'à 'requête replace' comme si elle était appelé directement? –

5

Vous pouvez conseiller la fonction d'origine, si vous souhaitez modifier son comportement au lieu d'appeler une fonction distincte.

De chapter 17.3 Around-Advice de GNU Emacs Lisp Reference Manual:

Around-conseils vous permet de « wrap » une expression Lisp « autour de » la définition de la fonction originale.

(defadvice foo (around foo-around) 
    "Ignore case in `foo'." 
    (let ((case-fold-search t)) 
    ad-do-it)) 

Dans votre cas, vous pouvez écrire:

(defadvice query-replace (around alt-query-replace (from-string to-string &optional delimited start end)) 
    (let ((case-fold-search (not case-fold-search))) 
     ad-do-it)) 
(ad-activate 'query-replace) 
+0

J'ai remarqué que les gens ont 'ad-activate' fait séparément du conseil original, mais vous pouvez avoir activé dans la ligne originale' autour de alt-query-replace (...) activate'. –

Questions connexes