1

我正在尝试开始在 emacs 中使用 eshell 代替 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 $ 
4

2 回答 2

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))))
于 2012-02-24T17:59:51.377 回答
0

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

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

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

于 2012-02-23T20:32:31.590 回答