completions: [git] Added git help completions

This patch adds completions for the help subcommand of git.
This commit is contained in:
Gustaf Johansson 2018-05-12 22:56:35 +02:00 committed by Fabian Homborg
parent 88e6930b57
commit 23eb63eb2f

View file

@ -14,7 +14,7 @@ function __fish_git_commits
# For fish, at the time of writing, out of 12200 commits, 7 commits need 8 characters. # For fish, at the time of writing, out of 12200 commits, 7 commits need 8 characters.
# And since this takes about 1/3rd of the time that disambiguating takes... # And since this takes about 1/3rd of the time that disambiguating takes...
command git log --pretty=tformat:"%H"\t"%<(64,trunc)%s" --all --max-count=1000 2>/dev/null \ command git log --pretty=tformat:"%H"\t"%<(64,trunc)%s" --all --max-count=1000 2>/dev/null \
| string replace -r '^([0-9a-f]{10})[0-9a-f]*\t(.*)' '$1\t$2' | string replace -r '^([0-9a-f]{10})[0-9a-f]*\t(.*)' '$1\t$2'
end end
function __fish_git_recent_commits function __fish_git_recent_commits
@ -28,8 +28,8 @@ function __fish_git_branches
# This is much faster than using `git branch`, # This is much faster than using `git branch`,
# and avoids having to deal with localized "detached HEAD" messages. # and avoids having to deal with localized "detached HEAD" messages.
command git for-each-ref --format='%(refname)' refs/heads/ refs/remotes/ \ command git for-each-ref --format='%(refname)' refs/heads/ refs/remotes/ \
| string replace -r '^refs/heads/(.*)$' '$1\tLocal Branch' \ | string replace -r '^refs/heads/(.*)$' '$1\tLocal Branch' \
| string replace -r '^refs/remotes/(.*)$' '$1\tRemote Branch' | string replace -r '^refs/remotes/(.*)$' '$1\tRemote Branch'
end end
function __fish_git_unique_remote_branches function __fish_git_unique_remote_branches
@ -38,9 +38,9 @@ function __fish_git_unique_remote_branches
# E.g. if only alice has a "frobulate" branch # E.g. if only alice has a "frobulate" branch
# `git checkout frobulate` is equivalent to `git checkout -b frobulate --track alice/frobulate`. # `git checkout frobulate` is equivalent to `git checkout -b frobulate --track alice/frobulate`.
command git for-each-ref --format="%(refname:strip=3)" \ command git for-each-ref --format="%(refname:strip=3)" \
--sort="refname:strip=3" \ --sort="refname:strip=3" \
"refs/remotes/*/$match*" "refs/remotes/*/*/**" | \ "refs/remotes/*/$match*" "refs/remotes/*/*/**" | \
uniq -u uniq -u
end end
function __fish_git_tags function __fish_git_tags
@ -115,7 +115,7 @@ function __fish_git_files
# --ignore-submodules=all was added in git 1.7.2, released July 2010. # --ignore-submodules=all was added in git 1.7.2, released July 2010.
set -l use_next set -l use_next
command git status --porcelain -z --ignore-submodules=all \ command git status --porcelain -z --ignore-submodules=all \
| while read -lz -d '' line | while read -lz -d '' line
# The entire line is the "from" from a rename. # The entire line is the "from" from a rename.
if set -q use_next[1] if set -q use_next[1]
if contains -- $use_next $argv if contains -- $use_next $argv
@ -169,7 +169,8 @@ function __fish_git_files
case 'A ' AM AD case 'A ' AM AD
# Additions are only shown here if they are staged. # Additions are only shown here if they are staged.
# Otherwise it's an untracked file. # Otherwise it's an untracked file.
contains -- added $argv; or contains -- all-staged $argv contains -- added $argv
or contains -- all-staged $argv
and printf '%s\t%s\n' "$file" $added_desc and printf '%s\t%s\n' "$file" $added_desc
case '*M' case '*M'
# Modified # Modified
@ -180,7 +181,8 @@ function __fish_git_files
# which means it is staged. # which means it is staged.
# This is useless for many commands - e.g. `checkout` won't do anything with this. # This is useless for many commands - e.g. `checkout` won't do anything with this.
# So it needs to be requested explicitly. # So it needs to be requested explicitly.
contains -- modified-staged $argv; or contains -- all-staged $argv contains -- modified-staged $argv
or contains -- all-staged $argv
and printf '%s\t%s\n' "$file" $staged_modified_desc and printf '%s\t%s\n' "$file" $staged_modified_desc
case '*D' case '*D'
contains -- deleted $argv contains -- deleted $argv
@ -190,7 +192,8 @@ function __fish_git_files
# There is both X unmodified and Y either M or D ("not updated") # There is both X unmodified and Y either M or D ("not updated")
# and Y is D and X is unmodified or [MARC] ("deleted in work tree"). # and Y is D and X is unmodified or [MARC] ("deleted in work tree").
# For our purposes, we assume this is a staged deletion. # For our purposes, we assume this is a staged deletion.
contains -- deleted-staged $argv; or contains -- all-staged $argv contains -- deleted-staged $argv
or contains -- all-staged $argv
and printf '%s\t%s\n' "$file" $staged_deleted_desc and printf '%s\t%s\n' "$file" $staged_deleted_desc
case "$dq" # a literal '??' case "$dq" # a literal '??'
# Untracked # Untracked
@ -226,7 +229,8 @@ end
function __fish_git_needs_command function __fish_git_needs_command
set cmd (commandline -opc) set cmd (commandline -opc)
set -l skip_next 1 set -l skip_next 1
set -q cmd[2]; or return 0 set -q cmd[2]
or return 0
# Skip first word because it's "git" or a wrapper # Skip first word because it's "git" or a wrapper
for c in $cmd[2..-1] for c in $cmd[2..-1]
test $skip_next -eq 0 test $skip_next -eq 0
@ -374,6 +378,12 @@ function __fish_git_reflog
command git reflog --no-decorate 2>/dev/null | string replace -r '[0-9a-f]* (.+@\{[0-9]+\}): (.*)$' '$1\t$2' command git reflog --no-decorate 2>/dev/null | string replace -r '[0-9a-f]* (.+@\{[0-9]+\}): (.*)$' '$1\t$2'
end end
function __fish_git_help_all_concepts
git help -g | string match -e -r '^ \w+' | while read -l concept desc
printf "%s\tConcept: %s\n" $concept (string trim $desc)
end
end
function __fish_git_diff_opt -a option function __fish_git_diff_opt -a option
switch $option switch $option
case diff-algorithm case diff-algorithm
@ -503,7 +513,7 @@ complete -c git -n '__fish_git_using_command diff show' -l stat -d 'Generate a d
complete -c git -n '__fish_git_using_command diff show' -l summary -d 'Output a condensed summary of extended header information' complete -c git -n '__fish_git_using_command diff show' -l summary -d 'Output a condensed summary of extended header information'
complete -c git -n '__fish_git_using_command diff show' -l textconv -d 'Allow external text conversion filters to be run when comparing binary files' complete -c git -n '__fish_git_using_command diff show' -l textconv -d 'Allow external text conversion filters to be run when comparing binary files'
complete -c git -n '__fish_git_using_command diff show' -l word-diff -d 'Show a word diff' complete -c git -n '__fish_git_using_command diff show' -l word-diff -d 'Show a word diff'
complete -c git -n '__fish_git_using_command diff show' -l word-diff-regex -d 'Use <regex> to decide what a word is' complete -c git -n '__fish_git_using_command diff show' -l word-diff-regex -d 'Use <regex> to decide what a word is'
complete -c git -n '__fish_git_using_command diff show' -s a -l text -d 'Treat all files as text' complete -c git -n '__fish_git_using_command diff show' -s a -l text -d 'Treat all files as text'
complete -c git -n '__fish_git_using_command diff show' -s B -l break-rewrites -d 'Break complete rewrite changes into pairs of delete and create' complete -c git -n '__fish_git_using_command diff show' -s B -l break-rewrites -d 'Break complete rewrite changes into pairs of delete and create'
complete -c git -n '__fish_git_using_command diff show' -s b -l ignore-space-change -d 'Ignore changes in amount of whitespace' complete -c git -n '__fish_git_using_command diff show' -s b -l ignore-space-change -d 'Ignore changes in amount of whitespace'
@ -707,7 +717,7 @@ complete -f -c git -n '__fish_git_using_command diff' -a '(__fish_git_files modi
function __fish_git_diffmerge_tools -a cmd function __fish_git_diffmerge_tools -a cmd
git $cmd --tool-help | \ git $cmd --tool-help | \
while read -l line while read -l line
string match -q 'The following tools are valid, but not currently available:' -- $line string match -q 'The following tools are valid, but not currently available:' -- $line
and break and break
string replace -f -r '^\t\t(\w+).*$' '$1' -- $line string replace -f -r '^\t\t(\w+).*$' '$1' -- $line
@ -740,7 +750,7 @@ complete -f -c git -n '__fish_git_needs_command' -a init -d 'Create an empty git
# TODO options # TODO options
### log ### log
complete -c git -n '__fish_git_needs_command' -a shortlog -d 'Show commit shortlog' complete -c git -n '__fish_git_needs_command' -a shortlog -d 'Show commit shortlog'
complete -c git -n '__fish_git_needs_command' -a log -d 'Show commit logs' complete -c git -n '__fish_git_needs_command' -a log -d 'Show commit logs'
complete -c git -n '__fish_git_using_command log; and not contains -- -- (commandline -op)' -a '(__fish_git_refs) (__fish_git_ranges)' complete -c git -n '__fish_git_using_command log; and not contains -- -- (commandline -op)' -a '(__fish_git_refs) (__fish_git_ranges)'
@ -1242,6 +1252,46 @@ complete -f -c git -n '__fish_git_using_command blame' -s s -d 'Suppress the aut
complete -f -c git -n '__fish_git_using_command blame' -s e -l show-email -d 'Show the author email instead of author name' complete -f -c git -n '__fish_git_using_command blame' -s e -l show-email -d 'Show the author email instead of author name'
complete -f -c git -n '__fish_git_using_command blame' -s w -d 'Ignore whitespace changes' complete -f -c git -n '__fish_git_using_command blame' -s w -d 'Ignore whitespace changes'
### help
complete -f -c git -n '__fish_git_using_command help' -a '(__fish_git_help_all_concepts)'
complete -f -c git -n '__fish_git_using_command help' -a add -d 'Add file contents to the index'
complete -f -c git -n '__fish_git_using_command help' -a apply -d 'Apply a patch on a git index file and a working tree'
complete -f -c git -n '__fish_git_using_command help' -a archive -d 'Create an archive of files from a named tree'
complete -f -c git -n '__fish_git_using_command help' -a bisect -d 'Find the change that introduced a bug by binary search'
complete -f -c git -n '__fish_git_using_command help' -a blame -d 'Show what revision and author last modified each line of a file'
complete -f -c git -n '__fish_git_using_command help' -a branch -d 'List, create, or delete branches'
complete -f -c git -n '__fish_git_using_command help' -a checkout -d 'Checkout and switch to a branch'
complete -f -c git -n '__fish_git_using_command help' -a cherry-pick -d 'Apply the change introduced by an existing commit'
complete -f -c git -n '__fish_git_using_command help' -a clean -d 'Remove untracked files from the working tree'
complete -f -c git -n '__fish_git_using_command help' -a clone -d 'Clone a repository into a new directory'
complete -f -c git -n '__fish_git_using_command help' -a commit -d 'Record changes to the repository'
complete -f -c git -n '__fish_git_using_command help' -a config -d 'Set and read git configuration variables'
complete -f -c git -n '__fish_git_using_command help' -a diff -d 'Show changes between commits, commit and working tree, etc'
complete -f -c git -n '__fish_git_using_command help' -a difftool -d 'Open diffs in a visual tool'
complete -f -c git -n '__fish_git_using_command help' -a fetch -d 'Download objects and refs from another repository'
complete -f -c git -n '__fish_git_using_command help' -a filter-branch -d 'Rewrite branches'
complete -f -c git -n '__fish_git_using_command help' -a format-patch -d 'Generate patch series to send upstream'
complete -f -c git -n '__fish_git_using_command help' -a grep -d 'Print lines matching a pattern'
complete -f -c git -n '__fish_git_using_command help' -a init -d 'Create an empty git repository or reinitialize an existing one'
complete -f -c git -n '__fish_git_using_command help' -a log -d 'Show commit logs'
complete -f -c git -n '__fish_git_using_command help' -a merge -d 'Join two or more development histories together'
complete -f -c git -n '__fish_git_using_command help' -a mergetool -d 'Run merge conflict resolution tools to resolve merge conflicts'
complete -f -c git -n '__fish_git_using_command help' -a mv -d 'Move or rename a file, a directory, or a symlink'
complete -f -c git -n '__fish_git_using_command help' -a prune -d 'Prune all unreachable objects from the object database'
complete -f -c git -n '__fish_git_using_command help' -a pull -d 'Fetch from and merge with another repository or a local branch'
complete -f -c git -n '__fish_git_using_command help' -a push -d 'Update remote refs along with associated objects'
complete -f -c git -n '__fish_git_using_command help' -a rebase -d 'Forward-port local commits to the updated upstream head'
complete -f -c git -n '__fish_git_using_command help' -a remote -d 'Manage set of tracked repositories'
complete -f -c git -n '__fish_git_using_command help' -a reset -d 'Reset current HEAD to the specified state'
complete -f -c git -n '__fish_git_using_command help' -a revert -d 'Revert an existing commit'
complete -f -c git -n '__fish_git_using_command help' -a rm -d 'Remove files from the working tree and from the index'
complete -f -c git -n '__fish_git_using_command help' -a show -d 'Shows the last commit of a branch'
complete -f -c git -n '__fish_git_using_command help' -a show-branch -d 'Shows the commits on branches'
complete -f -c git -n '__fish_git_using_command help' -a stash -d 'Stash away changes'
complete -f -c git -n '__fish_git_using_command help' -a status -d 'Show the working tree status'
complete -f -c git -n '__fish_git_using_command help' -a submodule -d 'Initialize, update or inspect submodules'
complete -f -c git -n '__fish_git_using_command help' -a tag -d 'Create, list, delete or verify a tag object signed with GPG'
complete -f -c git -n '__fish_git_using_command help' -a whatchanged -d 'Show logs with difference each commit introduces'
## Custom commands (git-* commands installed in the PATH) ## Custom commands (git-* commands installed in the PATH)
complete -c git -n '__fish_git_needs_command' -a '(__fish_git_custom_commands)' -d 'Custom command' complete -c git -n '__fish_git_needs_command' -a '(__fish_git_custom_commands)' -d 'Custom command'