私は最近Zshを使い始めましたが、それは素晴らしいです。残念ながら、私が「メイン」プロジェクトと考えるプロジェクトでは、すべてが遅いです。つまり、コマンドを実行するたびに(たとえば、ls
)、コマンドが実行されてから端末を再び使用できるようになるまでに約5秒の遅延があります。
Zshを非常に遅くするこの1つのレポについて何が違うのでしょうか? Zshを使い始める前に問題はなかったので、これはZsh固有のものだと思います。 git clean
を試しましたが、目立った違いはありませんでした。
それが重要な場合は、Mac OS Xを使用しています。
更新:私の.zshenv
の次の行が、それを遅くしているものであることがわかります:
[[ -s "$HOME/.rvm/scripts/rvm" ]] && . "$HOME/.rvm/scripts/rvm" # Load RVM function
その行をコメントすると、約3秒かかってから約1秒かかります。残念ながら、私のプロジェクトの多くはRVMを使用しているため、この行が必要です。今何をすべきかわかりません。
更新2:これは特にoh-my-zshの問題のようです。 ~/.oh-my-zsh/oh-my-zsh.sh
をロードしない場合、問題はありません。
これをgit configに追加すると、zshはステータスをチェックしなくなります
_git config --add oh-my-zsh.hide-status 1
git config --add oh-my-zsh.hide-dirty 1
_
lib/git.zsh には、2つの中心的なgit関数があります。
git_Prompt_info()
parse_git_dirty()
各メソッドには、無効にするためのgit configスイッチがあります。
oh-my-zsh.hide-status
_oh-my-zsh.hide-dirty
_一部のテーマは独自のgitクエリを作成し、場合によっては これらのフラグを無視 にします。
Oh_my_zshは、各コマンドの後にリポジトリのステータスをチェックするため、一部のリポジトリでは遅いようです。この動作は、新しいバージョンの.oh_my_zshでオーバーライドできます。 .zshrcの次の行のコメントを外します。
DISABLE_UNTRACKED_FILES_DIRTY = "true"
この後、ターミナルを再起動するか、次を実行します。
ソース〜/ .zshrc
コマンドごとにgitやrvmを呼び出すテーマにすることもできます。
私にとっては、ZSH_THEME="juanghurtadoto"
からZSH_THEME="miloshadzic"
は、すべてのコマンドの後に2秒の遅延を完全に削除しました。
テーマは https://github.com/robbyrussell/oh-my-zsh/wiki/themes で見つけることができます
oh-my-zsh
を高速化するさまざまな方法があります。詳細は、「 zshの起動が非常に遅い 」で説明されています。プラグインセクションをクリーンアップします。
たとえば、ブログ投稿「 oh-my-zsh git-svn Prompt slownessの修正 」では、潜在的な問題としてparse_git_dirty
関数に言及しています。
私にとっては、VirtualBox(ゲスト)で同期フォルダーを使用しているため低速です。 OS X(ホスト)で十分に高速で有効にしたいのです。リポジトリに保存され、ゲストとホストの両方で変更するローカル構成設定を使用する代わりに、ゲストのみのグローバル構成設定を使用します:
git config --global --add oh-my-zsh.hide-dirty 1
単一のレポだけが必要な場合:
git config --add oh-my-zsh.hide-dirty 1
私はついにそれを理解しました。私のプロジェクトには、大量のファイル(20,000など)を含むrake
フォルダーがありました。私はそのフォルダーが何のためにあったのか分かりませんが、削除しました。Zshはもはや遅くなく、私のアプリはまだ動作しているようです。
git
以外のバージョン管理プログラムを気にしない場合は、_vcs_info
_内のすべての_*.zsh-theme
_ sを無効にして、ネイティブのgit
コマンドに置き換えることができます。
たとえば、次の方法で_agnoster.zsh-theme
_を微調整します。
vcs_info
_を含むすべての行をコメント/削除します。Prompt_git()
関数のコードを編集:
_ref="$vcs_info_msg_0_"
_に
ref="$(git branch 2>/dev/null | grep -Po '(?<=\* ).*$')"
したがって、基本的に、すべての_vcs_info
_アクションを無効にし、代わりにネイティブのgit
コマンドを使用してレポのステータスを確認します。その結果、git以外のディレクトリで作業するのと同じ速さで、便利なgitプロンプトを表示できます。この小さな変更により、zshはgitリポジトリ内で4〜5倍速く動作します。
注:use GNU grep not BSD grep。
上記の回答は私の問題を解決しませんでした。私の場合、関数git_Prompt_status
他の人よりも時間がかかりすぎます。そこで、私は〜/ .oh-my-zsh/lib/git.zshを変更し、git_Prompt_status
私の早期復帰バージョンの関数:
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
}
ZSH_THEME_GIT_Prompt_MODIFIEDを未定のマークとして使用していますが、任意のステータスを選択してそれを示したり、より高速なgit_Prompt_status
あなたの場合の機能。