zsh和emacs'(e)shell之间的优缺点

时间:2010-10-12 17:51:02

标签: shell emacs zsh eshell

我目前已切换到emacs(aquamacs),并且正在将我的整个工作流程一次一步地迁移到它中(org-mode,dired等,来自探路者,符号速度等)。

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

我的问题:

  1. 可以被视为zsh的超集(即,eshell可以做zsh可以做的所有事情,还有更多)?我认为与标准shell(bash,zsh,ksh,tcsh等)相比,eshell缺少相当多的东西,否则它将成为标准shell之一(如果我错误地想到这一点,请纠正我)。 / p>

  2. 在zsh上使用eshell有什么主要限制?任何人都会从zsh切换到eshell并觉得你批评错过zsh的某些方面?

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

  4. 进一步,从一个通常的shell改为eshell的任何资源?关于工作流迁移的建议?

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

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

  7. 提前thnx。

3 个答案:

答案 0 :(得分:41)

关于M-x eshell

  1. Eshell不是一个独立的shell;它是在纯elisp中实现的,因此无法在emacs外部运行,这就是为什么它不是标准shell之一。它没有像bash / zsh / etc这样的脚本语言。有;它有elisp,以及一些命令解释的东西,使调用elisp更清洁。

  2. 我不能和zsh vs 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之间过于频繁地复制和粘贴,那么它可能不会是一场胜利,你将不得不花时间定制它以使你感到满意。< / p>

  7. 作为eshell的替代方法,M-x shell运行正常的shell,在其下面解释所有命令(因此无法访问elisp函数),同时命令行编辑(因此可编程完成,历史记录等) 。)由emacs完成。我用它来做ssh。

    另一个替代方案是M-x term,它是emacs中的终端模拟器,通常在下面运行一个shell,shell执行所有正常操作。然后绝对不需要转换/调整步骤。

答案 1 :(得分:7)

不同的语法

由于eshell允许将elisp代码与shell命令混合使用,因此它有一些相当不寻常的语法,您需要注意这一点。

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

file $(which foo)

但在eshell中,这意味着基本与

相同
file (which foo)

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

Symbol's function definition is void: which

事实证明,在eshell中编写它的方法实际上是

file ${which foo}

可移植性

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

我认为我已经看到了完成绝对路径时的一些不满,因为驱动器号后面的冒号,但这不是一个显示阻止......

答案 2 :(得分:0)

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

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

eshell只是elisped shell而且那些不擅长交互/滚动命令,例如topless等。