From a9aa363fdbd8e7bf01f61baa6c5b8b161ef0ac29 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aljaz=CC=8C=20=22g5pw=22=20Srebrnic=CC=8C?= Date: Tue, 23 Oct 2012 09:13:20 +0200 Subject: [PATCH] Added initial zsh completion support to git_index zsh now completes all arguments and all directories inside $GIT_REPO_DIR. This is till buggy because not all directories in $GIT_REPO_DIR are actual git projects. Next update will include completing the list in the .git_index file. --- lib/git/aliases.sh | 2 + lib/git/repo_index.sh | 88 ++++++++++++++++++++++++++++--------------- 2 files changed, 59 insertions(+), 31 deletions(-) diff --git a/lib/git/aliases.sh b/lib/git/aliases.sh index a7d3bb9..f27eadd 100644 --- a/lib/git/aliases.sh +++ b/lib/git/aliases.sh @@ -146,5 +146,7 @@ if [ $shell = "bash" ]; then # If you know how to rewrite _git_index_tab_completion() for zsh, please send me a pull request! complete -o nospace -F _git_index_tab_completion git_index complete -o nospace -F _git_index_tab_completion $git_index_alias +else + compdef _git_index_tab_completion git_index $git_index_alias fi diff --git a/lib/git/repo_index.sh b/lib/git/repo_index.sh index 0c0c181..8ec1c95 100644 --- a/lib/git/repo_index.sh +++ b/lib/git/repo_index.sh @@ -281,40 +281,66 @@ function _git_index_batch_cmd() { } -# Bash tab completion function for git_index() -function _git_index_tab_completion() { - _check_git_index - local curw - IFS=$'\n' - COMPREPLY=() - curw=${COMP_WORDS[COMP_CWORD]} +if [ $shell = 'bash' ]; then + # Bash tab completion function for git_index() + function _git_index_tab_completion() { + _check_git_index + local curw + IFS=$'\n' + COMPREPLY=() + curw=${COMP_WORDS[COMP_CWORD]} - # If the first part of $curw matches a high-level directory, - # then match on sub-directories for that project - local project=$(echo "$curw" | cut -d "/" -f1) - local base_path=$(\grep "/$project$" "$GIT_REPO_DIR/.git_index" | sed 's/ /\\ /g') + # If the first part of $curw matches a high-level directory, + # then match on sub-directories for that project + local project=$(echo "$curw" | cut -d "/" -f1) + local base_path=$(\grep "/$project$" "$GIT_REPO_DIR/.git_index" | sed 's/ /\\ /g') - # If matching project path was found and curr string contains a /, then complete project sub-directories - if [[ -n "$base_path" && $curw == */* ]]; then - local search_path=$(echo "$curw" | sed "s:^${project/\\/\\\\\\}::") - COMPREPLY=($(compgen -d "$base_path$search_path" | \grep -v "/.git" | sed -e "s:$base_path:$project:" -e "s:$:/:" )) + # If matching project path was found and curr string contains a /, then complete project sub-directories + if [[ -n "$base_path" && $curw == */* ]]; then + local search_path=$(echo "$curw" | sed "s:^${project/\\/\\\\\\}::") + COMPREPLY=($(compgen -d "$base_path$search_path" | \grep -v "/.git" | sed -e "s:$base_path:$project:" -e "s:$:/:" )) - # If curr string starts with /, tab complete top-level directories in root project dir - elif ([ $shell = "bash" ] && [ "${curw:0:1}" = "/" ]) || \ - ([ $shell = "zsh" ] && [ "${curw[1,1]}" = "/" ]); then - COMPREPLY=($(compgen -d "$GIT_REPO_DIR$curw" | sed -e "s:$GIT_REPO_DIR/::" -e "s:^:/:")) + # If curr string starts with /, tab complete top-level directories in root project dir + elif ([ $shell = "bash" ] && [ "${curw:0:1}" = "/" ]) || \ + ([ $shell = "zsh" ] && [ "${curw[1,1]}" = "/" ]); then + COMPREPLY=($(compgen -d "$GIT_REPO_DIR$curw" | sed -e "s:$GIT_REPO_DIR/::" -e "s:^:/:")) - # If curr string starts with --, tab complete commands - elif ([ $shell = "bash" ] && [ "${curw:0:2}" = "--" ]) || \ - ([ $shell = "zsh" ] && [ "${curw[1,2]}" = "--" ]); then - local commands="--list\n--rebuild\n--update-all\n--batch-cmd\n--count-by-host" - COMPREPLY=($(compgen -W '$(echo -e "\n"$commands)' -- $curw)) + # If curr string starts with --, tab complete commands + elif ([ $shell = "bash" ] && [ "${curw:0:2}" = "--" ]) || \ + ([ $shell = "zsh" ] && [ "${curw[1,2]}" = "--" ]); then + local commands="--list\n--rebuild\n--update-all\n--batch-cmd\n--count-by-host" + COMPREPLY=($(compgen -W '$(echo -e "\n"$commands)' -- $curw)) - # Else, tab complete the entries in .git_index - else - COMPREPLY=($(compgen -W '$(sed -e "s:.*/::" -e "s:$:/:" "$GIT_REPO_DIR/.git_index" | sort)' -- $curw)) - fi - IFS=$' \t\n' - return 0 -} + # Else, tab complete the entries in .git_index + else + COMPREPLY=($(compgen -W '$(sed -e "s:.*/::" -e "s:$:/:" "$GIT_REPO_DIR/.git_index" | sort)' -- $curw)) + fi + IFS=$' \t\n' + return 0 + } +else + function _git_index_tab_completion() { + typeset -A opt_args + _arguments \ + "--rebuild[Rebuild repository index]" \ + "--update-all[Update all indexed repositories]" \ + "--update-all-with-notifications[Update all indexed repositories with notifications]" \ + "--list[List all repositories currently present in the index]" \ + "--count-by-host[Count all repositories per host]" \ + "--batch-cmd+[Run a git command on all repositories]:git command:->git_command" \ + ":Project name:->projects" \ + && return 0 + + + case "$state" in + projects) + _files -/ -W $GIT_REPO_DIR + ;; + git_command) + ;; + esac + + return 1; + } +fi