如何为emacs eshell定义备用命令

时间:2012-02-23 19:56:24

标签: emacs eshell

我正在尝试使用eshell代替emacs中的bash,但我在很大程度上依赖于我多年来编写的bash函数。我想配置eshell以在发生“未找到命令”条件时调用bash,以防有问题的命令被实现为bash函数。

有一个引人注目的变量eshell-alternate-command-hook,听起来像是定制的,但我缺乏elisp技能干扰了我的成功。

这是我的最大努力:

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

但是当我测试它时,它不起作用:

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

2 个答案:

答案 0 :(得分:1)

这是我最终提出的:

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

答案 1 :(得分:0)

我不是eshell guru,但是在使用这个钩子的地方,我看到它只接收一个参数 - 命令,你试图执行,所以你的代码看起来像

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

但它不起作用,因为你需要返回elisp函数,而不是命令名称(根据文档)。如果你想运行bash,那么你需要返回带有完整路径的字符串,但我还没有找到如何将其他参数传递给bash。也许您可以在corresponding section on Emacs Wiki找到更多信息?