Hatena::ブログ(Diary)

hchbaw記

2010-04-07

zsh の補完関数 _git を速くしたい!(その2)

前回はダメダメでした…orz

前回分は、zsh関数 _multi_parts に巨大な集合を渡しちゃうとうまくないというところのみ踏まえてね。

結果として、 1/15 くらいになりました。ホっ (^^;

目標 Linuxカーネルのソースのトップディレクリから `git checkout -- [TAB]` してもなんとか結果が返ってきてほしい。

というとこに目標を置きます、考えた方針は以下。

  1. 高速な _multi_parts 関数を書く
  2. __git_files 関数を全く違うものに置き替えちゃう
  3. __git_files 関数をちょこっといじる

方針 __git_files 関数をちょこっといじる、ということにします。

やってみたいなと思うのが _multi_parts を呼ぶ前にできるだけ files を小さくできないかな、というところです。(これでダメだったらばあたしにはむり…)

とうわけで zsh関数です。

#autoload +X

__git_files () {
  local expl files ls_opts opts gitdir gitcdup

  zparseopts -D -E -a opts -- -cached -deleted -modified -others -ignored -unmerged -killed

  gitdir=$(_call_program gitdir git rev-parse --git-dir 2>/dev/null)
  __git_command_successful || return

  gitcdup=$(_call_program gitcdup git rev-parse --show-cdup 2>/dev/null)
  __git_command_successful || return

  ls_opts=("--exclude-per-directory=.gitignore")
  [[ -f "$gitdir/info/exclude" ]] && ls_opts+="--exclude-from=$gitdir/info/exclude"

  local pathspec="${gitcdup}${PREFIX}"
  if [[ $#PREFIX -gt 0 ]]; then
    pathspec=${pathspec}*
  fi

  files=$(_call_program files git ls-files -z --full-name $ls_opts $opts -- $pathspec 2>/dev/null)
  __git_command_successful || return
  files=(${(ps:\0:)"$(__git_files_relative $files)"})
  __git_command_successful || return

  local k
  if [[ $#PREFIX -gt 0 ]]; then
     (( k=${#${(s./.)PREFIX}} + 1 ))
  else
    k=1
  fi

  files=(${(uI:${k}:@)files/\/*//})

  #_message $opts

  _wanted files expl 'index file' _multi_parts $@ - / files
}

プロファイルの抜粋です。一番下は __git_files 関数の中身を _files のみにしちゃったもの。(^^

(before) 16194.98 16194.98   99.77%     10.62    10.62    0.07%  _git
( after)   948.83   948.83   99.36%     10.22    10.22    1.07%  _git
(_files)    11.08    11.08   54.12%      7.62     7.62   37.21%  _git

gist はコチラ!

http://gist.github.com/358895

試してみたい向きには、__git_files 関数を再定義してみてくださいね。

バグってるじゃんとか、もっともっと速くできるよ!というご意見や情報があったらばおしえてくれるとうれしいです m(__)m

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/hchbaw/20100407/1270648891