3

Я знаю, что, находясь в Vim (и Vi тоже, я думаю), если я хочу временно получить доступ к оболочке, я могу сделать одну из нескольких вещей:

  • Используйте :sh (aka :shell), затем выйдите из оболочки, чтобы вернуться в Vim
  • Используйте :sus (aka :suspend :st или :stop), затем используйте fg чтобы вернуться в Vim
  • Используйте :! <command> для передачи команд через Vim в оболочку
  • Используйте :mksession <filename> для сохранения сеанса, выйдите из Vim, а затем восстановите сеанс с помощью :source <filename> после возврата в Vim (по общему признанию, это, вероятно, слишком громоздко для большинства "временных" нужд доступа к оболочке)
  • Используйте программное обеспечение для работы с окнами, такое как screen, tmux и т.д.

Мой вопрос заключается в том, каковы технические и практические различия первых двух вариантов - использование :sh против использования :sus? На страницах справки Vim похоже, что единственное отличие состоит в том, что с :sus вы либо автоматически записываете буфер (если установлено «autowrite»), либо рискуете потерять отредактированные буферы, если никогда не вернетесь в Vim, тогда как с :sh у вас нет выбора , кроме как вернуться к Vim сессии при выходе из оболочки.

Существуют ли какие-либо иные различия, как технически (например, использование памяти и процессора), так и связанные с производительностью причины, по которым пользователь Vim может выбрать один метод из другого в других ситуациях?

2 ответа2

6

Для меня самое большое различие между :suspend и :shell том, что с первым вы возвращаетесь к исходной оболочке, тогда как последний запускает новую подоболочку. Это означает, что (неэкспортированные) переменные среды доступны в первом, но не во втором. С точки зрения производительности, в зависимости от ваших настроек (например, в ~/.bashrc), запуск новой оболочки может привести к заметной задержке.

В общем, нет правильного или неправильного ответа на ваш вопрос. Vim (как производная от философии Unix) позволяет вам находить и выбирать свой собственный стиль. Лично я всегда делаю серьезные правки в GVIM и использую консоль Vim только для коротких тактических правок (например, быстрое изменение в конфигурационных файлах). У меня также всегда открыто несколько терминалов, поэтому я лучше переключаюсь на другой терминал с помощью Alt + Tab, чем на оболочку из Vim.

3

Использование :sh создает новый процесс - дочерний процесс процесса vi - и запускает новую оболочку. :sus переводит редактор в приостановленное состояние и позволяет родительскому процессу (обычно вашей оболочке входа в систему или основной оболочке в окне) вернуть управление.  Итак :sh использует чуть больше ресурсов.  Но большая разница в том, что если вы запустите :sh а затем выполните cd (изменить каталог), установите переменную оболочки / переменную среды, измените лимит процесса (ulimit) или что-то еще, что напрямую влияет на оболочку, то эти эффекты ) исчезнет, когда вы вернетесь в редактор (выйдя из оболочки).  И наоборот, если вы вернетесь к своей основной оболочке, то эффекты все равно будут присутствовать при выходе из редактора.

И ответ Инго о том, что (не экспортируемые) переменные оболочки в родительской оболочке недоступны в подоболочке, также верен.

О, еще одна вещь:: :sh , вероятно, даст вам экземпляр оболочки с именем $SHELL .  Если ваша родительская оболочка является чем-то другим, то это, очевидно, будет другим отличием.


Редактировать:

О, еще кое-что, о чем я только что подумал: в зависимости от того, какую оболочку вы используете (bash, C shell, zsh и т.д.) И какие настройки у вас действуют, подоболочка, вероятно, не будет иметь доступа к истории команд основной оболочки ( например !-2 или ).  В качестве тривиального следствия, которое вы, вероятно, уже заметили, fg который вы должны ввести, чтобы вернуться в редактор после добавления :sus , добавляется в историю команд основной оболочки.  Я часто сохраняюсь и выхожу из редактора, а потом сразу говорю себе: «О! Я забыл изменить «Шалтай» на «Шалтай». », И наберите !!Войдите, чтобы вернуться в редактор, только чтобы застать врасплох тот факт, что !! вызывает команду fg .  В Баш, вы можете предотвратить это, установив HISTIGNORE в fg (или добавление fg : с , к существующему списку HISTIGNORE если таковые имеются).

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .