Hi, On Sun, May 06, 2012 at 01:14:25PM +0200, SZEDER Gábor wrote: > On Sat, May 05, 2012 at 05:23:20PM +0200, Felipe Contreras wrote: > > +__git_func_wrap () > > +{ > > + if [[ -n ${ZSH_VERSION-} ]]; then > > + emulate -L bash > > + setopt KSH_TYPESET > > + > > + # workaround zsh's bug that leaves 'words' as a special > > + # variable in versions < 4.3.12 > > + typeset -h words > > + > > + # workaround zsh's bug that quotes spaces in the COMPREPLY > > + # array if IFS doesn't contain spaces. > > + typeset -h IFS > > + fi > > + local cur words cword prev > > + _get_comp_words_by_ref -n =: cur words cword prev > > + __git_func "$@" > > +} > > + > > +_GIT_complete () > > +{ > > + local name="${2-$1}" > > + eval "$(typeset -f __git_func_wrap | sed -e "s/__git_func/_$name/")" > > Still don't like the subshell and sed here ... > > > + complete -o bashdefault -o default -o nospace -F _${name}_wrap $1 2>/dev/null \ > > + || complete -o default -o nospace -F _${name}_wrap $1 > > +} > > + > > +_GIT_complete git > > +_GIT_complete gitk > > ... because it adds delay when the completion script is loaded. But I > still don't have ideas how to avoid them. Ok, I think I got it. How about this on top of Felipe's patch? diff --git a/contrib/completion/git-completion.bash b/contrib/completion/git-completion.bash index f300b87d..8c18db92 100755 --- a/contrib/completion/git-completion.bash +++ b/contrib/completion/git-completion.bash @@ -2688,19 +2688,19 @@ __git_func_wrap () fi local cur words cword prev _get_comp_words_by_ref -n =: cur words cword prev - __git_func "$@" + $1 } _GIT_complete () { - local name="${2-$1}" - eval "$(typeset -f __git_func_wrap | sed -e "s/__git_func/_$name/")" - complete -o bashdefault -o default -o nospace -F _${name}_wrap $1 2>/dev/null \ - || complete -o default -o nospace -F _${name}_wrap $1 + local wrapper="__git_wrap_$1" + eval "$wrapper () { __git_func_wrap $2 ; }" + complete -o bashdefault -o default -o nospace -F $wrapper $1 2>/dev/null \ + || complete -o default -o nospace -F $wrapper $1 } -_GIT_complete git -_GIT_complete gitk +_GIT_complete git _git +_GIT_complete gitk _gitk # The following are necessary only for Cygwin, and only are needed # when the user has tab-completed the executable name and consequently The point is that __git_func_wrap() is not a template function processed by _GIT_complete() (or whatever we'll end up calling it) anymore, but simply a wrapper function around existing completion functions. The name of the completion function to be invoked should be given as argument. _GIT_complete() then uses 'eval' to create another wrapper function to invoke __git_func_wrap() with the name of the desired completion function. The name of this dynamically created wrapper function is derived from the name of the command or alias, i.e. for 'gf' it will be __git_wrap_gf(). The overhead of the additional function call is not even measureable, while it would spare the overhead of fork()ing a subshell and fork()+exec()ing 'sed' twice when loading the completion script and then for each subsequent alias. Best, Gábor -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html