uzutaka blog

Game Engineering and Programming

OS X 10.9 Mavericks上でzshの動作が極端に遅くなる問題を解決

OS X Mavericks上でzshの動作が異常に遅くなる現象が起きました.
以下のgifのように,入力したコマンドの反映が追いつかない状況です.

f:id:uzutaka:20131024050827g:plain

.zshrcを始めとする設定ファイルはdotfilesとしてgitで管理していたので,ユーザ側の設定はOS X Mountain Lionで正常に動いていたときと全く同じです.

調査したところoh-my-zshのvi-modeプラグインの中で呼ばれているzle reset-promptの処理が原因であるとわかりました.

# $HOME/.oh-my-zsh/plugins/vi-mode/vi-mode.plugin.zsh

function zle-keymap-select zle-line-init zle-line-finish {
   # The terminal must be in application mode when ZLE is active for $terminfo
   # values to be valid.
    if (( ${+terminfo[smkx]} )); then
    printf '%s' ${terminfo[smkx]}
    fi
    if (( ${+terminfo[rmkx]} )); then
    printf '%s' ${terminfo[rmkx]}
    fi

    zle reset-prompt     # コマンド1行ごとに大きな遅延を起こしている
    zle -R
}

zle -N zle-line-init
zle -N zle-line-finish
zle -N zle-keymap-select

vi-modeプラグイン自体も正常に動作しておらず,vimのmodeに応じたインジケータが表示されなかったのでプラグインを.zshrcから外すことで解決としました.
なお oh-my-zsh内で''zle reset-prompt''が使われているのは2013年10月現在ではvi-modeプラグインのみでした.

$ ag reset-prompt $HOME/.oh-my-zsh
plugins/vi-mode/vi-mode.plugin.zsh
13:  # zle reset-prompt

プラグインを追加する際はご注意ください.