2012-02-23 3 views
1

J'essaie de commencer à utiliser eshell à la place de bash dans emacs, mais je me fie beaucoup aux fonctions bash que j'ai écrites au fil des années. Je voudrais configurer eshell pour appeler bash chaque fois qu'une condition «commande non trouvée» se produit, dans le cas où la commande en question est implémentée en tant que fonction bash.Comment définir une autre commande pour emacs eshell

Il ya une variable nommée eshell-alternate-command-hook qui sonne comme si elle est faite sur commande, mais mon manque de compétences élisp interfère avec mon succès, je pense.

Ceci est mon meilleur effort:

(add-hook 'eshell-alternate-command-hook 'invoke-bash t t) 
(defun invoke-bash (command args) 
    (throw 'eshell-replace-command 
    (list "bash -c" command args))) 

Mais quand je le tester, il ne fonctionne pas:

c:/temp $ lsd 
Wrong number of arguments: (lambda (command args) (throw (quote eshell-replace-command) (list "bash -c" command args))), 1 
c:/temp $ 

Répondre

1

C'est ce que je suis venu avec la suite:

(defun invoke-bash (command) 
(progn 
    (setq invoke-bash-cmd (concat "bash -c \"" command " " (mapconcat 'identity eshell-last-arguments " ") "\"")) 
    (message invoke-bash-cmd) 
    (throw 'eshell-replace-command 
    (eshell-parse-command invoke-bash-cmd)))) 
+0

essayer quelque chose comme ceci: https://gist.github.com/1903146, bien que je ne l'avais pas essayé –

+0

Merci, je vois que progn est vestigial et pas nécessaire, même si cela ne semblait pas fonctionner quand j'ai utilisé ' laissez 'au lieu de' setq '. (Peut-être que j'ai fait quelque chose de mal) – wytten

+0

étrange que 'let' ne fonctionne pas pour vous. Le but principal de 'let' est la création de variables dans un contexte local. Dans votre code, parce que 'invoke-bash-cmd' n'est pas déclaré dans le contexte local, ce sera une variable globale –

0

Je ne suis pas ESHELL gourou, mais à l'endroit où ce crochet est utilisé, je vois qu'il ne reçoit qu'un seul argument - commande, que vous essayez d'exécuter, de sorte que votre code pourrait ressembler à

(add-hook 'eshell-alternate-command-hook 'invoke-bash) 
(defun invoke-bash (command) 
    (throw 'eshell-replace-command 
    (list "bash -c" command))) 

mais cela ne fonctionne pas, parce que vous devez retourner la fonction elisp, pas le nom de la commande (selon la documentation). Si vous voulez exécuter bash, alors vous devez retourner la chaîne avec le chemin complet, mais je n'ai pas trouvé comment passer des arguments supplémentaires à bash. Peut-être que vous pouvez trouver plus dans corresponding section on Emacs Wiki?

+0

qui a aidé; Je suis allé plus loin mais je suis encore coincé: '(defun invoke-bash (commande) (lancer 'eshell-replace-command (eshell-parse-commande (concat" bash -c "commande eshell-last-arguments)))) ' Si l'argument est" pom.xml ", je reçois le message 'Argument de type incorrect: characterp," pom.xml "', donc j'ai l'impression d'être proche maintenant. – wytten

Questions connexes