Answers:
shell
是这3个选择中最古老的。它使用Emacs comint-mode
来运行子外壳(例如bash
)。在这种模式下,您正在使用Emacs编辑命令行。直到您按Enter键,子流程才会看到任何输入。Emacs的行为就像一个愚蠢的终端。它确实支持颜色代码,但是不支持移动光标,因此您不能运行基于curses的应用程序。
term
是用Emacs Lisp编写的终端模拟器。在这种模式下,您所按的键将直接发送到子流程。您正在使用外壳提供的任何行编辑功能,而不是Emacs的功能。它还允许您运行使用高级终端功能(如光标移动)的程序(例如,您可以在Emacs中运行nano
或less
在Emacs中运行)。
eshell
是直接在Emacs Lisp中实现的shell。您没有在运行bash
或将任何其他Shell作为子进程。结果,语法与bash
或不太相同sh
。它允许诸如将进程的输出直接重定向到Emacs缓冲区(try echo hello >#<buffer results>
)之类的事情。
根据Xahlee页面:
shell
是操作系统命令行界面的标准emacs界面。
term
(ansi-term与今天的term几乎相同。它们是不同的程序包,但现在都在term.el中定义)是终端仿真器。它的行为就像一个专用的终端应用程序,例如{xterm,gnome-terminal,puTTY}。它比emacs shell界面兼容更多的shell应用程序,但是标准的emacs键(例如,移动光标)在这里不起作用(因为它是在模拟终端。)
eshell
是完全用emacs lisp编写的shell。注意:它不是bash模拟器。Eshell本身就是一个外壳,但类似于bash或其他外壳。
您应该使用哪个?
这取决于您的喜好。
shell
非常适合经典/标准unix shell命令的常规使用,例如{grep,du,ls,sort,cat,head,tail,uname,…}。
term & ansi-term
如果您想运行ssh之类的东西或其他命令行交互界面(例如{python,ruby,lisp} shell)或基于文本的GUI应用程序(例如{vim,synaptic等),则非常有用。
eshell
尤其适用于未安装bash的Microsoft Windows,或者如果您是emacs lisp编程器,则因为eshell可以直接访问emacs lisp。
which grep
在eshll中说“ eshell / grep是`em-中的Lisp编译函数” unix.el',因为您系统中的grep可以在eshell中执行,就像我说过的,eshell在MS中非常有用,因为MS中没有安装很多小工具,例如grep。
eshell
如果您已经安装了这些程序,它们也将具有它们。