我试图开始在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 $
这就是我最终想到的:
(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))))
我不是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传递额外的参数。也许您可以在Emacs Wiki的相应部分找到更多信息?