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

标签 shell emacs zsh eshell

我目前已切换到 emacs (aquamacs),并且正在将我的整个工作流程一次一步地迁移到其中(组织模式、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 能满足我认为我所需要的一切,人们是否应该放弃 eshell 并继续使用 zsh?还是少数“强大的工作流程”值得(我不知道)?

提前致谢。

最佳答案

关于M-x eshell:

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

  2. 我无法比较 zsh 与 eshell,但我大部分时间都从 bash 切换到 eshell。 95% 的情况下,eshell 可以毫无问题地完成我想要或需要的一切。我不使用它进行 ssh。此外,一旦进程启动,您就无法将其置于后台(但您可以在后台启动它)。

  3. 这将非常困难,因为 zsh 有完整的脚本语言,而 eshell 基本上是 elisp 解释器的接口(interface)。您在交互式 shell 中寻找什么? 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 会执行所有正常操作。那么绝对不需要任何转换/适应步骤。

关于shell - zsh 和 emacs 的 (e)shell 之间的优缺点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3917534/

相关文章:

Python --command 命令行选项

linux - 创建动态别名,是否可能?

node.js - ts-node-dev 错误选项 : --transpileOnly and bad option: --ignoreWatch

Emacs:使用数字键盘为命令参数添加前缀

Ruby Rbenv 试图从 Bundle 运行 Zeus,尽管它是一个全局性的 gem(使用 ZSH)

linux - 用于多线程文件处理的 Shell 脚本

linux - Bash 脚本 - 如何只匹配 4 字节十六进制值中的 1 个字节

shell脚本: single quote in execute

emacs24 语义补全

scala - 重新定义 emacs 的 ENSIME scala 模式中的键