Преимущества и недостатки оболочки zsh и emacs '(e) - PullRequest
32 голосов
/ 12 октября 2010

В настоящее время я переключился на emacs (aquamacs) и в настоящее время выполняю процесс перехода на него всего своего рабочего процесса по одному шагу за раз (режим org, dired и т. Д., От pathfinder, скорости записи и т. Д.).

Единственное, что мне еще предстоит попробовать (и, похоже, пока что является самым большим препятствием), это встроенная оболочка emacs (shell и / или eshell, здесь и далее называемая «eshell»), из-зачтобы Zsh настроил идеально для меня.не уверен, есть ли способ по существу отразить / минимизировать необходимые шаги преобразования / адаптации .....

мои вопросы:

  1. может рассматриваться как надмножествоиз zsh (т.е. eshell может делать все, что может zsh, плюс еще)?я предполагаю, что eshell не хватает по сравнению со стандартными оболочками (bash, zsh, ksh, tcsh и т. д.), иначе это будет одна из стандартных оболочек (поправьте меня, если я ошибаюсь, думая об этом таким образом).

  2. Каковы ограничения main при использовании eshell поверх zsh?все люди переходят с zsh на eshell и чувствуют, что есть некоторые аспекты zsh, которые вы критически пропустили?

  3. кто-нибудь знает о каких-либо ссылках / ресурсах, проводящих сравнение функций zsh / eshell?

  4. далее, есть ли какие-либо ресурсы по переходу с обычной оболочки на eshell?совет по миграции рабочего процесса?

  5. если eshell не такой "мощный", как zsh, то какое преимущество имеет eshell перед zsh?какие-нибудь советы и рекомендации по использованию eshell в emacs, которые бы иллюстрировали время, потраченное на его изучение?

  6. стоит ли просто отказаться от eshell и продолжать использовать zsh, если он делает все, о чем я думает мне нужно?или те немногие «рабочие процессы питания» стоят того (о чем я не знаю)?

thnx заранее.

Ответы [ 3 ]

41 голосов
/ 13 октября 2010

Относительно M-x eshell:

  1. Eshell не является отдельной оболочкой; он реализован в чистом elisp, поэтому не может быть запущен вне emacs, поэтому это не одна из стандартных оболочек. У него нет собственного языка сценариев, такого как bash / zsh / etc. иметь; у него есть elisp и некоторые вещи для интерпретации команд, чтобы сделать вызов elisp немного чище.

  2. Я не могу говорить с zsh против eshell, но я в основном перешел с bash на eshell. В 95% случаев eshell делает все, что я хочу или нуждаюсь, без каких-либо проблем. Я не использую это для SSH. Кроме того, нельзя запустить фоновый процесс после его запуска (но вы можете запустить его в фоновом режиме).

  3. Это будет действительно сложно, потому что у zsh есть полный язык сценариев, тогда как eshell - это в основном интерфейс для интерпретатора elisp. Что вы ищете в интерактивной оболочке? Eshell, вероятно, может сделать большую часть этого. Условные операторы и циклы в командной строке? Конечно. Псевдонимы, функции, шаблоны, программируемое завершение? Конечно.

  4. Способ, которым я мигрировал, заключался в том, чтобы начать с нуля. Каждый раз, когда я сталкивался с чем-то, что мне не нравилось, или я хотел, чтобы это делалось, я придумывал, как заставить это делать то, что я хочу. Например, eshell использует pcomplete.el для программируемого завершения, поэтому добавить функции завершения довольно просто.

  5. Интеграция с emacs - большая победа для меня. У вас могут быть функции elisp, переданные в командную оболочку. Для глупого примера попробуйте:

    message "hello world" | cut -f 1 -d ' '
    Некоторые команды (в частности, grep) помещаются в буферы Emacs, например, Вы можете быстро перейти к результатам.
  6. Зависит от того, сколько времени вы действительно проводите в Emacs. Если вы делаете all в emacs, это полезно, потому что иногда проще объединить команды elisp с другими командами через eshell. Если вы не обнаружите, что копируете и вставляете между emacs и вашей оболочкой слишком часто, это, вероятно, не будет победой, и вам придется потратить время на то, чтобы настроить его так, чтобы вам было удобно.

В качестве альтернативы eshell, M-x shell запускает обычную оболочку, которая интерпретирует все команды (поэтому не имеет доступа к функциям elisp) при редактировании из командной строки (и, следовательно, программируемое завершение, история и т. Д.) сделано Emacs. Я использую его для SSH.

Еще одна альтернатива - M-x term, которая является эмулятором терминала в emacs и обычно запускает оболочку, а оболочка выполняет все свои обычные действия. Тогда абсолютно никаких шагов преобразования / адаптации не требуется.

7 голосов
/ 20 марта 2011

Различный синтаксис

Поскольку eshell позволяет смешивать код elisp с командами оболочки, он имеет довольно необычный синтаксис, с которым вам нужно быть осторожным.

OneОстерегайтесь синтаксиса расширения команд: zsh использует синтаксис

file $(which foo)

, но в eshell это означает в основном то же самое, что и

file (which foo)

, что означаетвыполнить команду file в результате вычисления выражения elisp (which foo), что обычно приводит к ошибке, подобной этой:

Symbol's function definition is void: which

Оказывается, что способ написать это в eshell на самом деле

file ${which foo}

Переносимость

Поскольку eshell написан на независящем от платформы Emacs Lisp-коде, он работает по существу в Windows Emacsen, как и в * nix, верноиз коробки (хотя, конечно, вы, вероятно, захотите coreutils и тому подобное);заставить shell-mode работать с * nix-оболочкой там, по-видимому, по крайней мере, немного сложнее.

Я думаю, что я видел некоторую неожиданность с завершением абсолютных путей, хотя из-за двоеточия после буквы диска, ноэто не совсем шоу-стоппер ...

0 голосов
/ 27 августа 2015

Я думаю, что все ваши 6 вопросов могут быть переведены только на один вопрос: все можно сделать в zsh, что можно сделать в Emacs ?Ответ: ДА и другие.Я бы не сказал, shell, eshell или другой режим Emacs, но я просто скажу Emacs .

shell, eshell просто режим Emacs, если я могу найти способ или режим хотя бы вкоторый может делать все, что может сделать zsh, поэтому он отвечает на ваш вопрос.В Emacs есть режим ansi-term, он может прекрасно запускать zsh внутри Emacs, если вы не можете выполнять свою работу в оболочке или eshell, вы можете переключиться в режим ansi-term в Emacs, так что ваш вопрос исчез.

eshell только что элиспед shell, и они не очень хороши для интерактивных / прокручиваемых команд, таких как top, less и т. Д.

...