34

我目前已切换到 emacs (aquamacs),并且正在将我的整个工作流程一次一步迁移到其中(org-mode、dired 等,从路径查找器、符号速度等)。

我还没有尝试的一件事(并且似乎是迄今为止最大的障碍)是内置的 emacs shell(shell 和/或 eshell,这里称为“eshell”),因为 zsh 设置完美我。不确定是否有办法基本上镜像/最小化所需的转换/适应步骤.....

我的问题:

  1. eshell 可以被视为 zsh 的超集(即,eshell 可以做 zsh 可以做的所有事情,还有更多)?我认为与标准 shell(bash、zsh、ksh、tcsh 等)相比,eshell 缺少很多,否则它将是标准 shell 之一(如果我这样想是错误的,请纠正我)。

  2. 在 zsh 上使用 eshell的主要限制是什么?有没有人从 zsh 切换到 eshell 并觉得 zsh 的某些方面你非常想念?

  3. 任何人都知道进行 zsh/eshell 功能比较的任何链接/资源吗?

  4. 此外,有什么资源可以从一个普通的 shell 更改为 eshell 吗?关于工作流迁移的建议?

  5. 如果eshell不如zsh“强大”,那么eshell比zsh有什么优势?在 emacs 中使用 eshell 的任何提示和技巧可以说明学习它所花费的时间?

  6. 如果它做了我认为我需要的一切,是否应该放弃 eshell 并继续使用 zsh ?还是少数“权力工作流程”值得(我不知道)?

提前谢谢。

4

3 回答 3

41

关于M-x eshell

  1. Eshell 不是独立的 shell;它是在纯 elisp 中实现的,因此不能在 emacs 之外运行,这就是为什么它不是标准 shell 之一的原因。它没有自己的脚本语言,如 bash/zsh/等。有; 它有 elisp 和一些命令解释的东西,使调用 elisp 更干净一些。

  2. 我不能说 zsh 和 eshell,但我主要是从 bash 切换到 eshell。95% 的时间,eshell 可以毫无问题地完成我想要或需要的一切。我不将它用于 ssh。此外,一旦启动进程,您就不能在后台启动它(但您可以在后台启动它)。

  3. 这真的很难,因为 zsh 有一个完整的脚本语言,而 eshell 基本上是 elisp 解释器的一个接口。您在交互式外壳中寻找什么?Eshell 可能可以完成大部分工作。命令行上的条件语句和循环?当然。别名、函数、通配符、可编程补全?当然。

  4. 我迁移的方式基本上是从头开始。每次我遇到我不喜欢或希望它发生的事情时,我都会想办法让它做我想做的事。例如,eshell 使用 pcomplete.el 进行可编程补全,因此添加补全函数非常容易。

  5. 与 emacs 的集成对我来说是一个巨大的胜利。您可以将 elisp 函数通过管道传输到 shell 命令。举个愚蠢的例子,试试:

    message "hello world" | cut -f 1 -d ' '
    一些命令(特别是 grep)被放入 emacs 缓冲区,因此您可以快速跳转到结果。

  6. 取决于你真正花多少时间在 emacs 上。如果您在 emacs 中执行所有操作,它会很有用,因为有时通过 eshell 将 elisp 命令与其他命令一起使用管道会更容易。如果您没有发现自己在 emacs 和 shell 之间过于频繁地复制和粘贴,那么这可能不会是一场胜利,您将不得不花时间将其定制到您对它感到满意的程度。

作为 eshell 的替代方案,M-x shell在其下运​​行您的普通 shell,它解释所有命令(因此无法访问 elisp 函数),而命令行编辑(因此可编程完成、历史记录等)由 emacs 完成。我将它用于 ssh。

另一种选择是M-x term,它是 emacs 中的终端仿真器,通常在下面运行一个 shell,shell 完成所有正常的事情。然后绝对不需要转换/适应步骤。

于 2010-10-12T20:20:36.017 回答
7

不同的语法

由于eshell允许将elisp代码与 shell 命令混合,它有一些相当不寻常的语法,你需要小心。

需要注意的一件事是命令扩展zsh的语法:使用语法

file $(which foo)

但这eshell意味着基本上与

file (which foo)

这意味着在file评估 elisp 表达式的结果上运行命令(which foo),这通常会导致如下错误:

Symbol 的函数定义为 void:which

原来在eshell中这样写的方式其实是

file ${which foo}

可移植性

由于eshell是用平台中立的 Emacs Lisp 代码编写的,因此它在 Windows-native Emacsen 上的工作方式与在 *nix 上的工作方式基本相同,开箱即用(当然你可能会想要coreutils等等);开始使用 * nix shell-modeshell 可能至少有点棘手。

不过,由于驱动器号后面的冒号,我想我已经看到了完成绝对路径的一些问题,但这并不完全是一个阻碍......

于 2011-03-19T21:47:15.473 回答
0

我认为您的所有 6 个问题都可以转化为一个问题:所有可以在 zsh 中完成的事情都可以在Emacs中完成?答案是肯定的,而且还有更多。我不会说 shell、eshell 或其他一些 Emacs 模式,但我只是说Emacs

shell, eshell 只是 Emacs 的模式,如果我能找到一种方法或模式至少可以做 zsh 可以做的任何事情,所以它回答了你的问题。方式是ansi-termEmacs 中的模式,它可以完美地在 Emacs 中运行 zsh,如果你不能在 shell 或 eshell 中完成你的工作,你可以ansi-term在 Emacs 中切换到模式,所以你的问题已经消失了。

eshell只是省略了shell,那些不擅长交互/滚动命令,例如top,less等。

于 2015-08-27T15:02:26.233 回答