Message ID | 221f88b9-fc91-479f-8d08-f530796e2d13@gmail.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | completion for git-reflog show | expand |
Rubén Justo <rjusto@gmail.com> writes: > Let's have a function to get the current subcommand when completing > commands that follow the syntax: > > git <command> <subcommand> > > As a convenience, let's allow an optional "default subcommand" to be > returned if none is found. > > Signed-off-by: Rubén Justo <rjusto@gmail.com> > --- > contrib/completion/git-completion.bash | 20 ++++++++++++++++++++ > 1 file changed, 20 insertions(+) > > diff --git a/contrib/completion/git-completion.bash b/contrib/completion/git-completion.bash > index 916e137021..5f2e904b56 100644 > --- a/contrib/completion/git-completion.bash > +++ b/contrib/completion/git-completion.bash > @@ -575,6 +575,26 @@ __gitcomp_subcommand () > fi > } > > +# Find the current subcommand for commands that follow the syntax: > +# > +# git <command> <subcommand> > +# > +# 1: List of possible subcommands. > +# 2: Optional subcommand to return when none is found. > +__git_find_subcommand () > +{ > + local subcommand subcommands="$1" default_subcommand="$2" Are the callers expected to form "$1" by concatenating known tokens with a space? I am just wondering if we can avoid looping, e.g. local nextword=${words[__git_cmd_idx+1]} case " $subcommands " in *" $nextword "*) echo "$nextword" return ;; esac It hopefully should not be a huge deal either way, though. > + > + for subcommand in $subcommands; do > + if [ "$subcommand" = "${words[__git_cmd_idx+1]}" ]; then > + echo $subcommand > + return > + fi > + done > + > + echo $default_subcommand > +} > + > # Execute 'git ls-files', unless the --committable option is specified, in > # which case it runs 'git diff-index' to find out the files that can be > # committed. It return paths relative to the directory specified in the first
On 26-ene-2024 09:30:44, Junio C Hamano wrote: > Rubén Justo <rjusto@gmail.com> writes: > > > Let's have a function to get the current subcommand when completing > > commands that follow the syntax: > > > > git <command> <subcommand> > > > > As a convenience, let's allow an optional "default subcommand" to be > > returned if none is found. > > > > Signed-off-by: Rubén Justo <rjusto@gmail.com> > > --- > > contrib/completion/git-completion.bash | 20 ++++++++++++++++++++ > > 1 file changed, 20 insertions(+) > > > > diff --git a/contrib/completion/git-completion.bash b/contrib/completion/git-completion.bash > > index 916e137021..5f2e904b56 100644 > > --- a/contrib/completion/git-completion.bash > > +++ b/contrib/completion/git-completion.bash > > @@ -575,6 +575,26 @@ __gitcomp_subcommand () > > fi > > } > > > > +# Find the current subcommand for commands that follow the syntax: > > +# > > +# git <command> <subcommand> > > +# > > +# 1: List of possible subcommands. > > +# 2: Optional subcommand to return when none is found. > > +__git_find_subcommand () > > +{ > > + local subcommand subcommands="$1" default_subcommand="$2" > > Are the callers expected to form "$1" by concatenating known tokens > with a space? > > I am just wondering if we can avoid looping, e.g. > > local nextword=${words[__git_cmd_idx+1]} > case " $subcommands " in > *" $nextword "*) > echo "$nextword" > return > ;; > esac > I like the idea; and it works: $ words=("a" "b"); __git_cmd_idx=0; __git_find_subcommand "a b" "test" b $ : simulate that the user moves the cursor backwards $ words=("a" "" "b"); __git_cmd_idx=0; __git_find_subcommand "a b" "test" test $ : simulate that the user moves the cursor backwards $ words=("a" " " "b"); __git_cmd_idx=0; __git_find_subcommand "a b" "test" test But functions like __git_find_on_cmdline or __git-find_last_on_cmdline are already iterating. I feel we should keep the loop. Thank you.
diff --git a/contrib/completion/git-completion.bash b/contrib/completion/git-completion.bash index 916e137021..5f2e904b56 100644 --- a/contrib/completion/git-completion.bash +++ b/contrib/completion/git-completion.bash @@ -575,6 +575,26 @@ __gitcomp_subcommand () fi } +# Find the current subcommand for commands that follow the syntax: +# +# git <command> <subcommand> +# +# 1: List of possible subcommands. +# 2: Optional subcommand to return when none is found. +__git_find_subcommand () +{ + local subcommand subcommands="$1" default_subcommand="$2" + + for subcommand in $subcommands; do + if [ "$subcommand" = "${words[__git_cmd_idx+1]}" ]; then + echo $subcommand + return + fi + done + + echo $default_subcommand +} + # Execute 'git ls-files', unless the --committable option is specified, in # which case it runs 'git diff-index' to find out the files that can be # committed. It return paths relative to the directory specified in the first
Let's have a function to get the current subcommand when completing commands that follow the syntax: git <command> <subcommand> As a convenience, let's allow an optional "default subcommand" to be returned if none is found. Signed-off-by: Rubén Justo <rjusto@gmail.com> --- contrib/completion/git-completion.bash | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+)