J'ai récemment commencé à utiliser Zsh et c'est génial. Malheureusement, pour le projet que je considère comme mon projet "principal", tout est lent. Ce que je veux dire, c'est que chaque fois que j'exécute une commande - ls
, par exemple - il y a un délai d'environ cinq secondes entre le moment où la commande est exécutée et le moment où je peux réutiliser le terminal.
Qu'est-ce qui pourrait être différent dans ce dépôt qui rend Zsh si lent? Je suppose que c'est une chose spécifique à Zsh car il n'y avait aucun problème avant de commencer à utiliser Zsh. J'ai essayé de faire un git clean
mais cela n'a pas fait de différence notable.
Je suis sur Mac OS X, si cela importe.
pdate: Il s'avère que cette ligne de mon .zshenv
est ce qui ralentissait:
[[ -s "$HOME/.rvm/scripts/rvm" ]] && . "$HOME/.rvm/scripts/rvm" # Load RVM function
Si je commente cette ligne, cela prend de 3 secondes environ à 1 seconde environ. Malheureusement, j'ai besoin de cette ligne, car beaucoup de mes projets utilisent RVM. Je ne sais plus quoi faire maintenant.
pdate 2: cela semble être spécifiquement une chose oh-my-zsh. Si je ne charge pas ~/.oh-my-zsh/oh-my-zsh.sh
, Je n'ai pas le problème.
Vous pouvez l'ajouter à votre configuration git et zsh ne vérifiera plus l'état
git config --add oh-my-zsh.hide-status 1
git config --add oh-my-zsh.hide-dirty 1
Il y a deux fonctions centrales de git dans in lib/git.zsh :
git_Prompt_info()
parse_git_dirty()
Chaque méthode a un commutateur git config pour le désactiver:
oh-my-zsh.hide-status
oh-my-zsh.hide-dirty
Certains thèmes créent leurs propres requêtes git et parfois ignorez ces drapeaux .
Oh_my_zsh semble être lent pour certains repos car il vérifie l'état du dépôt après chaque commande. Ce comportement peut être remplacé dans la nouvelle version de .oh_my_zsh. Décommentez simplement la ligne suivante dans .zshrc:
DISABLE_UNTRACKED_FILES_DIRTY = "true"
Après cela, redémarrez votre terminal ou exécutez ce qui suit:
source ~/.zshrc
Il pourrait s'agir du thème appelant des trucs git et rvm après chaque commande.
Pour moi, changer ZSH_THEME="juanghurtadoto"
à ZSH_THEME="miloshadzic"
a supprimé complètement le délai de 2 secondes après chaque commande.
Les thèmes peuvent être trouvés sur https://github.com/robbyrussell/oh-my-zsh/wiki/themes
Il existe différentes façons d'accélérer un oh-my-zsh
, comme détaillé dans " zsh démarre incroyablement lentement ", nettoyant la section plugin.
Par exemple, le billet de blog " Correction de la lenteur de l'invite oh-my-zsh git-svn " mentionne le parse_git_dirty
fonctionne comme un problème potentiel.
Pour moi, c'est lent sur VirtualBox (l'invité) car j'utilise un dossier synchronisé. Je veux toujours qu'il soit activé sur OS X (l'hôte) où il est assez rapide. Au lieu d'utiliser un paramètre de configuration local qui est stocké avec le dépôt et le changerait à la fois sur l'invité et l'hôte, j'utilise un paramètre de configuration global uniquement sur l'invité:
git config --global --add oh-my-zsh.hide-dirty 1
Si je le veux juste pour un seul repo:
git config --add oh-my-zsh.hide-dirty 1
Je l'ai finalement compris. Mon projet avait un dossier rake
avec une tonne de fichiers (comme 20 000). Je ne sais pas à quoi servait ce dossier, mais je l'ai supprimé, Zsh n'est plus lent et mon application semble toujours fonctionner.
Si vous ne vous souciez pas d'un autre programme de contrôle de version mais git
, vous pouvez simplement désactiver tous les vcs_info
Dans votre *.zsh-theme
Et les remplacer par git
natif commandes.
Par exemple, je modifie mon agnoster.zsh-theme
En:
vcs_info
,éditez le code dans la fonction Prompt_git()
à partir de:
ref="$vcs_info_msg_0_"
À
ref="$(git branch 2>/dev/null | grep -Po '(?<=\* ).*$')"
Donc, fondamentalement, je viens de désactiver toutes les actions vcs_info
, Et d'utiliser à la place une commande native git
pour vérifier les états du dépôt. En conséquence, je peux toujours voir mon invite git utile avec une vitesse aussi rapide que de travailler dans un répertoire non-git. Avec cette petite modification, mon zsh peut fonctionner 4 à 5 fois plus rapidement dans git repos.
Remarque: utilisez GNU grep et non BSD grep.
Les réponses ci-dessus n'ont pas résolu mon problème. Dans mon cas, la fonction git_Prompt_status
prend trop de temps que les autres. J'ai donc modifié ~/.oh-my-zsh/lib/git.zsh, en remplaçant git_Prompt_status
fonction avec ma première version de retour:
function git_Prompt_status() {
STATUS="$ZSH_THEME_GIT_Prompt_MODIFIED$STATUS"
echo $STATUS
return
local INDEX STATUS
INDEX=$(command git status --porcelain -b 2> /dev/null)
STATUS=""
if $(echo "$INDEX" | command grep -E '^\?\? ' &> /dev/null); then
STATUS="$ZSH_THEME_GIT_Prompt_UNTRACKED$STATUS"
fi
if $(echo "$INDEX" | grep '^A ' &> /dev/null); then
STATUS="$ZSH_THEME_GIT_Prompt_ADDED$STATUS"
Elif $(echo "$INDEX" | grep '^M ' &> /dev/null); then
STATUS="$ZSH_THEME_GIT_Prompt_ADDED$STATUS"
Elif $(echo "$INDEX" | grep '^MM ' &> /dev/null); then
STATUS="$ZSH_THEME_GIT_Prompt_ADDED$STATUS"
fi
if $(echo "$INDEX" | grep '^ M ' &> /dev/null); then
STATUS="$ZSH_THEME_GIT_Prompt_MODIFIED$STATUS"
Elif $(echo "$INDEX" | grep '^AM ' &> /dev/null); then
STATUS="$ZSH_THEME_GIT_Prompt_MODIFIED$STATUS"
Elif $(echo "$INDEX" | grep '^MM ' &> /dev/null); then
STATUS="$ZSH_THEME_GIT_Prompt_MODIFIED$STATUS"
Elif $(echo "$INDEX" | grep '^ T ' &> /dev/null); then
STATUS="$ZSH_THEME_GIT_Prompt_MODIFIED$STATUS"
fi
if $(echo "$INDEX" | grep '^R ' &> /dev/null); then
STATUS="$ZSH_THEME_GIT_Prompt_RENAMED$STATUS"
fi
if $(echo "$INDEX" | grep '^ D ' &> /dev/null); then
STATUS="$ZSH_THEME_GIT_Prompt_DELETED$STATUS"
Elif $(echo "$INDEX" | grep '^D ' &> /dev/null); then
STATUS="$ZSH_THEME_GIT_Prompt_DELETED$STATUS"
Elif $(echo "$INDEX" | grep '^AD ' &> /dev/null); then
STATUS="$ZSH_THEME_GIT_Prompt_DELETED$STATUS"
fi
if $(command git rev-parse --verify refs/stash >/dev/null 2>&1); then
STATUS="$ZSH_THEME_GIT_Prompt_STASHED$STATUS"
fi
if $(echo "$INDEX" | grep '^UU ' &> /dev/null); then
STATUS="$ZSH_THEME_GIT_Prompt_UNMERGED$STATUS"
fi
if $(echo "$INDEX" | grep '^## [^ ]\+ .*ahead' &> /dev/null); then
STATUS="$ZSH_THEME_GIT_Prompt_AHEAD$STATUS"
fi
if $(echo "$INDEX" | grep '^## [^ ]\+ .*behind' &> /dev/null); then
STATUS="$ZSH_THEME_GIT_Prompt_BEHIND$STATUS"
fi
if $(echo "$INDEX" | grep '^## [^ ]\+ .*diverged' &> /dev/null); then
STATUS="$ZSH_THEME_GIT_Prompt_DIVERGED$STATUS"
fi
echo $STATUS
}
Bien que j'utilise ZSH_THEME_GIT_Prompt_MODIFIED comme marque indéterminée, vous pouvez choisir n'importe quel état que vous souhaitez indiquer ou mettre en œuvre un _ beaucoup plus rapide git_Prompt_status
fonctionne dans votre cas.