В чем разница между shell, eshell и термином в Emacs?

60

В Emacs я могу запустить оболочку, используя следующие команды:

M-x term

M-x shell

M-x eshell

В чем разница между этими тремя?

Кшитиз Шарма
источник

Ответы:

61

shellсамый старый из этих 3 вариантов. Он использует Emacs comint-modeдля запуска подоболочки (например bash). В этом режиме вы используете Emacs для редактирования командной строки. Подпроцесс не видит ввод, пока вы не нажмете Enter. Emacs действует как тупой терминал. Он поддерживает цветовые коды, но не такие вещи, как перемещение курсора, поэтому вы не можете запускать приложения, основанные на curses.

termэмулятор терминала, написанный на Emacs Lisp В этом режиме нажимаемые клавиши отправляются непосредственно в подпроцесс; вы используете любые возможности редактирования строк, которые предоставляет оболочка, а не Emacs. Он также позволяет запускать программы, которые используют расширенные возможности терминала, такие как перемещение курсора (например, вы можете запускать nanoили lessвнутри Emacs).

eshellэто оболочка, реализованная непосредственно в Emacs Lisp Вы не используете bashкакую-либо другую оболочку как подпроцесс. В результате синтаксис не совсем совпадает с bashили sh. Это позволяет такие вещи, как перенаправление вывода процесса непосредственно в буфер Emacs (try echo hello >#<buffer results>).

CJM
источник
19

Согласно странице Xahlee :

shell является стандартным интерфейсом emacs для интерфейса командной строки операционной системы.

term(ansi-term довольно похож на термин сегодня. Это были разные пакеты, но теперь оба определены в term.el) - эмулятор терминала. Он ведет себя как специальное терминальное приложение, такое как {xterm, gnome-terminal, puTTY}. Он совместим с большим количеством приложений оболочки, чем интерфейс оболочки emacs, но стандартные ключи emacs, такие как движущийся курсор, здесь не работают (потому что он эмулирует терминал).

eshellэто оболочка, написанная полностью на emacs lisp Примечание: это не эмулятор bash. Eshell сам по себе является оболочкой, но похож на bash или другие оболочки.

Что вы должны использовать?

Это зависит от ваших предпочтений.

shell подходит для общего использования классических / стандартных команд оболочки Unix, таких как {grep, du, ls, sort, cat, head, tail, uname,…}.

term & ansi-term хороши, если вы хотите запускать такие вещи, как ssh или другой интерактивный интерфейс командной строки (например, оболочка {python, ruby, lisp}), или текстовое приложение с графическим интерфейсом, такое как {vim, synaptic,…}.

eshell особенно хорошо в Microsoft Windows, где bash не установлен, или, если вы являетесь программистом emacs lisp, потому что eshell имеет прямой доступ к emacs lisp.

CodyChan
источник
Все упомянутые вами команды (grep, du, ls и т. Д.) Являются программами и командами, встроенными в оболочку. eshellбудет иметь их тоже, если у вас установлены эти программы.
Барт Louwers
1
@Bart попытайтесь удалить ваш grep в вашей системе и выполнить действие grep в eshell, вы обнаружите, что grep в eshell не является grep в вашей системе, which grepв eshll говорит, что «eshell / grep - это» скомпилированная функция Lisp в `em- unix.el ', потому что grep в вашей системе может быть выполнен в eshell, как я уже говорил, eshell очень полезен в MS, где не установлено множество небольших инструментов, таких как grep.
CodyChan