Промпт oh-my-zsh медленный: как это исправить

Вопрос или проблема

Я использую 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, когда создаются пустые строки из-за задержки отрисовки.

Возможные причины замедления

  1. Проблемы с плагинами и темами: Некоторые темы и плагины oh-my-zsh, особенно те, которые включают проверку статуса git-репозитория, могут значительно замедлять работу приглашения.
  2. Необходимость в обновлении: Иногда установка обновлений oh-my-zsh может улучшить ситуацию.
  3. Лицензии Xcode: Если вы используете git, встроенный в Xcode, необходимо также убедиться, что вы согласились с последними версиями лицензий.

Решения

Вот несколько шагов, которые помогут вам устранить утром:

  1. Проверка и отключение задерживающих плагинов:

    • Замените тему robbyrussell на более простую, которая не использует плагины git или менее ресурсозатратные варианты.
    • Используйте команду, чтобы найти темы, которые не содержат поддержку git, при этом проверив:
      grep --files-without-match "git" ~/.oh-my-zsh/themes/*
  2. Оптимизация настроек git:

    • Отключите отслеживание изменений в репозитории, если это не критично для вашей работы:
      git config --global oh-my-zsh.hide-dirty 1
    • Включите настройку для скрытия незакрепленных файлов:
      DISABLE_UNTRACKED_FILES_DIRTY="true"
  3. Проверка обновлений:

    • Зайдите в папку ~/.oh-my-zsh, выполните команду:
      git pull
    • Это позволит вам загрузить последние коммиты и исправления, что может помочь устранить проблемы с производительностью.
  4. Принятие условий лицензии Xcode:

    • Если вы используете git из Xcode, возможно, вам нужно принять новую лицензию:
      sudo xcodebuild -license
  5. Отладка с использованием set -x:

    • Для диагностики проблемы активируйте трассировку:
      set -x
    • Это позволит увидеть, какие команды выполняются для формирования вашего приглашения. Если вывод окажется слишком длинным, перенаправьте вывод в файл:
      exec 2>zsh.err

Заключение

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

Оцените материал
Добавить комментарий

Капча загружается...