Search code examples
emacseshell

How to define an alternate command for emacs eshell


I'm trying to start using eshell in place of bash within emacs, but I rely heavily on bash functions that I have written over the years. I'd like to configure eshell to invoke bash whenever a "command not found" condition occurs, in case the command in question is implemented as a bash function.

There is a variable tantalizingly named eshell-alternate-command-hook that sounds like it is made to order, but my lack of elisp skill is interfering with my success I think.

This is my best 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)))

But when I test it, it doesn't work:

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

Solution

  • This is what I eventually came up with:

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