Вопрос или проблема
Я использую macOS 10.15.2 с iTerm2, zsh 5.7.1 и oh-my-zsh (тема robbyrussell).
Я заметил, что отображение подсказки немного медленнее по сравнению с bash. Например, если я нажимаю enter, курсор сначала переходит в начало следующей строки, а затем, спустя некоторое время, появляется подсказка оболочки, и курсор перемещается на свое естественное место. Например, если → ~
— это подсказка, когда я нахожусь в своей домашней папке, а []
— это мой курсор, когда я нажимаю enter, я вижу:
0 – Простой статус
→ ~ []
1 – Немедленно после нажатия enter
[]
2 – Вернуться к простому статусу
→ ~ []
Эта медлительность особенно заметна, когда я быстро нажимаю enter несколько раз. В этом случае я вижу несколько пустых строк. Вот что я вижу
→ ~
→ ~
→ ~
→ ~
→ ~
→ ~
→ ~
→ ~
→ ~ []
Я родом из bash оболочки, и когда я использую bash, такой медлительности нет. Я не уверен, является ли это проблемой oh-my-zsh или это его естественное поведение. Я хотел бы узнать больше об этом и, в конечном итоге, как это исправить. Спасибо.
PS: проблема заключается в oh-my-zsh, и она сохраняется даже если я отключаю все плагины.
PPS: Я ранее задавал этот вопрос на SO. Спасибо user1934428 за его помощь и за то, что он предложил перенести этот вопрос сюда.
Я не знаю, что oh-my-zsh ставит в подсказку по умолчанию. Возможно, он пытается определить состояние контроля версий, это очень популярный компонент подсказки, который может занимать много времени.
Чтобы увидеть, что происходит, включите трассировку команд с помощью set -x
.
→ ~ → ~ set -x трассировка команд, которые выполняются для расчета подсказки → ~ трассировка команд, которые выполняются для расчета подсказки → ~ set +x +zsh:3> set +x → ~ → ~
Если трассировка настолько длинная, что выходит за пределы экрана, перенаправьте её в файл с помощью
exec 2>zsh.err
Это перенаправляет все сообщения об ошибках в файл, а не только трассировку. Чтобы снова получить трассировки и ошибки на терминале, выполните
exec 2>/dev/tty
Вы можете настроить формат трассировки через PS4
. Это строка формата, которая может содержать экранирования для подсказок. Например, чтобы добавить точную информацию о времени:
PS4='%D{%s.%9.}+%N:%i> '
Проверка, грязная ли директория git, кажется, вызывает задержку.
Чтобы ускорить ответ оболочки, отключите проверку, грязная ли директория, выполнив в вашем терминале:
git config --add oh-my-zsh.hide-dirty 1
Не забудьте перезапустить все ваши оболочки.
У меня была такая же проблема, и именно git_prompt_info
вызывал замедление работы оболочки. Имейте в виду, что некоторые темы oh-my-zsh используют плагин git, своего рода “жестко закодированный” в их подсказках.
Так что рассмотрите вариант из списка, который вы можете получить с помощью этой команды
grep --files-without-match "git" ~/.oh-my-zsh/themes/*
Я исправил проблему, изменив ~/.zshrc
и раскомментировав эту переменную окружения:
# Раскомментируйте следующую строку, если хотите отключить пометку непроверенных файлов
# в VCS как грязных. Это значительно ускоряет проверку статуса репозитория
# для больших репозиториев.
DISABLE_UNTRACKED_FILES_DIRTY="true"
Надеюсь, это поможет!
Я исправил это на своем ноутбуке, перейдя в папку ~/.oh-my-zsh, затем выполнив git pull
. Около ~1200 коммитов ждало выполнения. Затем я закрыл iTerm и снова его открыл. Вы получите уведомление о том, что oh-my-zsh обновляется.
Пользователи Mac: +prompt_git
— это то, что так долго занимает время, но реальная причина — новая лицензия Xcode.
Если вы используете git
, который идет в комплекте с Xcode, вероятно, есть обновленная лицензия, которую вам нужно было принять.
Выполните sudo xcodebuild -license
и примите новую лицензию, ваша подсказка ZSH должна вернуться к нормальной скорости.
Подсказка терминала dev контейнера vscode была медленной для меня, занимая несколько секунд, чтобы вернуться к подсказке после выполнения любой команды. set -x
показал, что проблема связана с командой git ls-files
, используемой для обновления текста ветки/грязи в подсказке для большого репозитория. Странно, что сама команда git ls-files
не была медленной.
Настройка git config codespaces-theme.hide-status 1
решила проблему.
Проверка, грязная ли директория git, кажется, вызывает задержку.
git config --global oh-my-zsh.hide-dirty 1
это ускорит процесс.
Ответ или решение
Как ускорить вывод командной строки oh-my-zsh: пошаговое руководство
Использование оболочки zsh с oh-my-zsh как конфигурацией может приводить к задержкам в выводе команды, что особенно заметно для пользователей, привыкших к bash. Если вы столкнулись с проблемой медленной работы приглашения в оболочке zsh (как описано в вашем вопросе), этот материал поможет вам разобраться с проблемой и ускорить работу вашей командной строки.
Проблема
На вашем macOS 10.15.2 с iTerm2 и zsh 5.7.1 наблюдаются заметные задержки при выводе приглашения командной строки. Это проявляется в том, что после нажатия Enter
курсор сначала выскакивает на новую строку, и только потом отображается само приглашение, что создает впечатление о том, что командная строка работает медленно. Это также вы можете заметить при быстром нажатии Enter
, когда создаются пустые строки из-за задержки отрисовки.
Возможные причины замедления
- Проблемы с плагинами и темами: Некоторые темы и плагины oh-my-zsh, особенно те, которые включают проверку статуса git-репозитория, могут значительно замедлять работу приглашения.
- Необходимость в обновлении: Иногда установка обновлений oh-my-zsh может улучшить ситуацию.
- Лицензии Xcode: Если вы используете git, встроенный в Xcode, необходимо также убедиться, что вы согласились с последними версиями лицензий.
Решения
Вот несколько шагов, которые помогут вам устранить утром:
-
Проверка и отключение задерживающих плагинов:
- Замените тему robbyrussell на более простую, которая не использует плагины git или менее ресурсозатратные варианты.
- Используйте команду, чтобы найти темы, которые не содержат поддержку git, при этом проверив:
grep --files-without-match "git" ~/.oh-my-zsh/themes/*
-
Оптимизация настроек git:
- Отключите отслеживание изменений в репозитории, если это не критично для вашей работы:
git config --global oh-my-zsh.hide-dirty 1
- Включите настройку для скрытия незакрепленных файлов:
DISABLE_UNTRACKED_FILES_DIRTY="true"
- Отключите отслеживание изменений в репозитории, если это не критично для вашей работы:
-
Проверка обновлений:
- Зайдите в папку
~/.oh-my-zsh
, выполните команду:git pull
- Это позволит вам загрузить последние коммиты и исправления, что может помочь устранить проблемы с производительностью.
- Зайдите в папку
-
Принятие условий лицензии Xcode:
- Если вы используете git из Xcode, возможно, вам нужно принять новую лицензию:
sudo xcodebuild -license
- Если вы используете git из Xcode, возможно, вам нужно принять новую лицензию:
-
Отладка с использованием
set -x
:- Для диагностики проблемы активируйте трассировку:
set -x
- Это позволит увидеть, какие команды выполняются для формирования вашего приглашения. Если вывод окажется слишком длинным, перенаправьте вывод в файл:
exec 2>zsh.err
- Для диагностики проблемы активируйте трассировку:
Заключение
Производительность вашего zsh-приглашения может существенно повлиять на общую результативность работы в терминале. Примените предложенные шаги, и, скорее всего, вы заметите увеличение скорости реакции вашей командной строки. Эффективная настройка среды разработки является ключом к повышению вашей продуктивности, поэтому рекомендуем регулярно проверять и оптимизировать свои конфигурации.