Преимущества и недостатки оболочки zsh и emacs' (e)

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

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

мои вопросы:

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

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

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

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

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

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

Спасибо заранее.

3 ответа

Решение

Относительно 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. Если вы делаете все в emacs, это полезно, потому что иногда проще соединить команды elisp с другими командами через eshell. Если вы не обнаружите, что копируете и вставляете между emacs и вашей оболочкой слишком часто, это, вероятно, не будет победой, и вам придется потратить время на то, чтобы настроить его так, чтобы вам было удобно.

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

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

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

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

Следует обратить внимание на синтаксис расширения команд: zsh использует синтаксис

file $(which foo)

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

file (which foo)

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

Определение функции символа недействительно:

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

file ${which foo}

портативность

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

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

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

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

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

Другие вопросы по тегам