我目前已切换到emacs(aquamacs),并且正在将我的整个工作流程一次一步地迁移到它中(org-mode,dired等,来自探路者,符号速度等)。
我尚未尝试的一件事(似乎是迄今为止最大的障碍)是内置的emacs shell(shell和/或eshell,这里称为“eshell”),因为有zsh为我设置完美。不确定是否有办法实质上反映/最小化所需的转换/适应步骤.....
我的问题:
可以被视为zsh的超集(即,eshell可以做zsh可以做的所有事情,还有更多)?我认为与标准shell(bash,zsh,ksh,tcsh等)相比,eshell缺少相当多的东西,否则它将成为标准shell之一(如果我错误地想到这一点,请纠正我)。 / p>
在zsh上使用eshell有什么主要限制?任何人都会从zsh切换到eshell并觉得你批评错过zsh的某些方面?
是否有人知道进行zsh / eshell功能比较的任何链接/资源?
进一步,从一个通常的shell改为eshell的任何资源?关于工作流迁移的建议?
如果eshell不像zsh那样“强大”,那么eshell对zsh有什么优势呢?有关在emacs中使用eshell的任何提示和技巧,可以说明学习它的时间吗?
是否应该放弃eshell并继续使用zsh,如果它能完成我认为我需要的一切?或者是少数“权力工作流程”值得(我不知道)?
答案 0 :(得分:41)
关于M-x eshell
:
Eshell不是一个独立的shell;它是在纯elisp中实现的,因此无法在emacs外部运行,这就是为什么它不是标准shell之一。它没有像bash / zsh / etc这样的脚本语言。有;它有elisp,以及一些命令解释的东西,使调用elisp更清洁。
我不能和zsh vs eshell说话,但我大多是从bash切换到eshell。 95%的时间,eshell会毫无问题地完成我想要或需要的一切。我不把它用于ssh。此外,您无法在流程启动后对其进行后台处理(但您可以将其开始后台运行)。
这将非常困难,因为zsh有一个完整的脚本语言,而eshell基本上是一个elisp解释器的接口。你在互动外壳中寻找什么? Eshell可能会做大部分工作。命令行上的条件语句和循环?当然。别名,函数,通配符,可编程完成?肯定。
我迁移的方式基本上是从头开始。每当我遇到一些我不喜欢或者我希望它做的事情时,我会弄清楚如何让它做我想做的事。例如,eshell使用pcomplete.el进行可编程完成,因此添加完成函数非常简单。
与emacs的整合对我来说是一个巨大的胜利。您可以将elisp函数通过管道传递给shell命令。对于一个愚蠢的例子,请尝试:
message "hello world" | cut -f 1 -d ' '
一些命令(特别是grep)被放入emacs缓冲区,例如你可以快速跳转到结果。
取决于您在emacs中花费多少时间。如果您在emacs中执行所有,那么它很有用,因为有时通过eshell将elisp命令与其他命令组合在一起会更容易。如果你没有发现自己在emacs和shell之间过于频繁地复制和粘贴,那么它可能不会是一场胜利,你将不得不花时间定制它以使你感到满意。< / p>
作为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
而且那些不擅长交互/滚动命令,例如top
,less
等。