From 73aea657787709f4d83f4866cf5cc08be4a47e77 Mon Sep 17 00:00:00 2001 From: Tim <45259958+carlfriedrich@users.noreply.github.com> Date: Wed, 11 Jan 2023 10:57:16 +0100 Subject: [PATCH] Add bash completions for git-forgit (#235) When using forgit as a subcommand of git, put 'git-forgit.bash' in one of the following places and it will be loaded automatically on tab completion of 'git forgit' or any configured git aliases of it: - /usr/share/bash-completion/completions - ~/.local/share/bash-completion/completions --- README.md | 2 + completions/git-forgit.bash | 106 ++++++++++++++++++++++++++++++++++++ 2 files changed, 108 insertions(+) create mode 100755 completions/git-forgit.bash diff --git a/README.md b/README.md index 20418ab4..05651b30 100644 --- a/README.md +++ b/README.md @@ -289,6 +289,8 @@ export FORGIT_LOG_FZF_OPTS=' - `gd` supports specifying revision(eg, `gd HEAD~`, `gd v1.0 README.md`). - Call `gi` with arguments to get the wanted `.gitignore` contents directly(eg, `gi cmake c++`). - You can use the commands as sub-commands of `git`, see [#147](https://github.com/wfxr/forgit/issues/147) for details. +- Put [completions/git-forgit.bash](https://github.com/wfxr/forgit/blob/master/completions/git-forgit.bash) in + `~/.local/share/bash-completion/completions` to have bash tab completion for `git forgit` and configured git aliases. ### 📃 License diff --git a/completions/git-forgit.bash b/completions/git-forgit.bash new file mode 100755 index 00000000..cf9c02ba --- /dev/null +++ b/completions/git-forgit.bash @@ -0,0 +1,106 @@ +# forgit completions for bash + +# When using forgit as a subcommand of git, put this file in one of the +# following places and it will be loaded automatically on tab completion of +# 'git forgit' or any configured git aliases of it: +# +# /usr/share/bash-completion/completions +# ~/.local/share/bash-completion/completions + +_git_branch_delete() +{ + __gitcomp_nl "$(__git_heads)" +} + +_git_checkout_branch() +{ + __gitcomp_nl "$(__git branch -a --format '%(refname:short)')" +} + +_git_checkout_file() +{ + __gitcomp_nl "$(__git ls-files --modified)" +} + +_git_checkout_tag() +{ + __gitcomp_nl "$(__git_tags)" +} + +_git_stash_show() +{ + __gitcomp_nl "$(__git stash list | sed -n -e 's/:.*//p')" +} + +# Completion for git-forgit +# This includes git aliases, e.g. "alias.cb=forgit checkout_branch" will +# correctly complete available branches on "git cb". +_git_forgit() +{ + local subcommand cword cur prev cmds + + subcommand="${COMP_WORDS[1]}" + if [[ "$subcommand" != "forgit" ]] + then + # Forgit is obviously called via a git alias. Get the original + # aliased subcommand and proceed as if it was the previous word. + prev=$(git config --get "alias.$subcommand" | cut -d' ' -f 2) + cword=$((${COMP_CWORD} + 1)) + else + cword=${COMP_CWORD} + prev=${COMP_WORDS[COMP_CWORD-1]} + fi + + cur=${COMP_WORDS[COMP_CWORD]} + + cmds=" + add + blame + branch_delete + checkout_branch + checkout_commit + checkout_file + checkout_tag + cherry_pick + cherry_pick_from_branch + clean + diff + fixup + ignore + log + rebase + reset_head + revert_commit + stash_show + stash_push + " + + case ${cword} in + 2) + COMPREPLY=($(compgen -W "${cmds}" -- ${cur})) + ;; + 3) + case ${prev} in + add) _git_add ;; + branch_delete) _git_branch_delete ;; + checkout_branch) _git_checkout_branch ;; + checkout_commit) _git_checkout ;; + checkout_file) _git_checkout_file ;; + checkout_tag) _git_checkout_tag ;; + cherry_pick) _git_cherry_pick ;; + cherry_pick_from_branch) _git_checkout_branch ;; + clean) _git_clean ;; + diff) _git_diff ;; + fixup) _git_branch ;; + log) _git_log ;; + rebase) _git_rebase ;; + reset_head) _git_reset ;; + revert_commit) _git_revert ;; + stash_show) _git_stash_show ;; + esac + ;; + *) + COMPREPLY=() + ;; + esac +}