From 386b8c394e972d9c2b2ed8752f24652ba91a1691 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Thu, 16 Jul 2015 13:32:23 -0400 Subject: [PATCH] got bash completion working for "git annex" not just "git-annex" This needs a patch to git to cause the git-annex completion to be auto-loaded when completing "git annex ". Otherwise, it will only load when "git-annex" is tab completed. Once loaded, it works for both uses. I've submitted the git patch to the git mailing list. --- Makefile | 2 +- bash-completion.bash | 25 +++++++++++++++++++ ..._d45570fd750ae8d69dedc3edeef0cc10._comment | 8 +++--- doc/git-annex.mdwn | 12 --------- 4 files changed, 29 insertions(+), 18 deletions(-) create mode 100644 bash-completion.bash diff --git a/Makefile b/Makefile index 2f7d3b2443..ddc56e3f88 100644 --- a/Makefile +++ b/Makefile @@ -49,7 +49,7 @@ install: build install-docs Build/InstallDesktopFile ln -sf git-annex $(DESTDIR)$(PREFIX)/bin/git-annex-shell ./Build/InstallDesktopFile $(PREFIX)/bin/git-annex || true install -d $(DESTDIR)$(PREFIX)/share/bash-completion/completions - ./git-annex --bash-completion-script git-annex > $(DESTDIR)$(PREFIX)/share/bash-completion/completions/git-annex + install -m 0644 bash-completion.bash $(DESTDIR)$(PREFIX)/share/bash-completion/completions/git-annex test: git-annex ./git-annex test diff --git a/bash-completion.bash b/bash-completion.bash new file mode 100644 index 0000000000..b0367c0308 --- /dev/null +++ b/bash-completion.bash @@ -0,0 +1,25 @@ +# Use git-annex's built-in bash completion +# This bash completion is generated by the option parser, so it covers all +# commands, all options, and will never go out of date! +source <(git-annex --bash-completion-script git-annex) + +# Called by git's bash completion script when completing "git annex" +_git_annex() { + local cmdline + CMDLINE=(--bash-completion-index $(($COMP_CWORD - 1))) + + local seen_git + local seen_annex + for arg in ${COMP_WORDS[@]}; do + if [ "$arg" = git ] && [ -z "$seen_git" ]; then + seen_git=1 + CMDLINE=(${CMDLINE[@]} --bash-completion-word git-annex) + elif [ "$arg" = annex ] && [ -z "$seen_annex" ]; then + seen_annex=1 + else + CMDLINE=(${CMDLINE[@]} --bash-completion-word $arg) + fi + done + + COMPREPLY=( $(git-annex "${CMDLINE[@]}") ) +} diff --git a/doc/forum/bash_completion/comment_5_d45570fd750ae8d69dedc3edeef0cc10._comment b/doc/forum/bash_completion/comment_5_d45570fd750ae8d69dedc3edeef0cc10._comment index 050c81d2c2..d6797b5e14 100644 --- a/doc/forum/bash_completion/comment_5_d45570fd750ae8d69dedc3edeef0cc10._comment +++ b/doc/forum/bash_completion/comment_5_d45570fd750ae8d69dedc3edeef0cc10._comment @@ -3,13 +3,11 @@ subject="""comment 5""" date="2015-07-15T15:44:11Z" content=""" -I've recently added built-in bash completion to git-annex, which is output -by the `--bash-completion-script` option. It knows about all sub-commands, +I've recently added built-in bash completion to git-annex, enabled by the +`bash-completion.bash` file. It knows about all sub-commands, and all options, and will automatically always be up-to-date with the argument parser! Currently, it only works for completing "git-annex", not "git annex". -Supporting the latter would probably require some hacks to git's own bash -completion code, or possibly a smart way to hook into it.. Help with that -would be appreciated. +I have submitted a patch to git's bash completion to make the latter work. """]] diff --git a/doc/git-annex.mdwn b/doc/git-annex.mdwn index 5cbab59781..73894c0d85 100644 --- a/doc/git-annex.mdwn +++ b/doc/git-annex.mdwn @@ -763,18 +763,6 @@ may not be explicitly listed on their individual man pages. Overrides git configuration settings. May be specified multiple times. -# COMMAND-LINE TAB COMPLETION - -To enable bash completion, paste this into your shell prompt: - - source <(git-annex --bash-completion-script git-annex) - -The output of "git-annex --bash-completion-script git-annex" can also -be written to a bash completion file so bash loads it automatically. - -This bash completion is generated by the option parser, so it covers all -commands, all options, and will never go out of date! - # CONFIGURATION VIA .git/config Like other git commands, git-annex is configured via `.git/config`.