diff options
Diffstat (limited to 'misc/fish_completion')
-rw-r--r-- | misc/fish_completion/git-bug | 129 |
1 files changed, 78 insertions, 51 deletions
diff --git a/misc/fish_completion/git-bug b/misc/fish_completion/git-bug index edbfa81b..28e66532 100644 --- a/misc/fish_completion/git-bug +++ b/misc/fish_completion/git-bug @@ -1,30 +1,36 @@ # fish completion for git-bug -*- shell-script -*- -function __git-bug_debug +function __git_bug_debug set file "$BASH_COMP_DEBUG_FILE" if test -n "$file" echo "$argv" >> $file end end -function __git-bug_perform_completion - __git-bug_debug "Starting __git-bug_perform_completion with: $argv" +function __git_bug_perform_completion + __git_bug_debug "Starting __git_bug_perform_completion with: $argv" set args (string split -- " " "$argv") set lastArg "$args[-1]" - __git-bug_debug "args: $args" - __git-bug_debug "last arg: $lastArg" + __git_bug_debug "args: $args" + __git_bug_debug "last arg: $lastArg" set emptyArg "" if test -z "$lastArg" - __git-bug_debug "Setting emptyArg" + __git_bug_debug "Setting emptyArg" set emptyArg \"\" end - __git-bug_debug "emptyArg: $emptyArg" + __git_bug_debug "emptyArg: $emptyArg" + + if not type -q "$args[1]" + # This can happen when "complete --do-complete git-bug" is called when running this script. + __git_bug_debug "Cannot find $args[1]. No completions." + return + end set requestComp "$args[1] __complete $args[2..-1] $emptyArg" - __git-bug_debug "Calling $requestComp" + __git_bug_debug "Calling $requestComp" set results (eval $requestComp 2> /dev/null) set comps $results[1..-2] @@ -34,9 +40,9 @@ function __git-bug_perform_completion # completions must be prefixed with the flag set flagPrefix (string match -r -- '-.*=' "$lastArg") - __git-bug_debug "Comps: $comps" - __git-bug_debug "DirectiveLine: $directiveLine" - __git-bug_debug "flagPrefix: $flagPrefix" + __git_bug_debug "Comps: $comps" + __git_bug_debug "DirectiveLine: $directiveLine" + __git_bug_debug "flagPrefix: $flagPrefix" for comp in $comps printf "%s%s\n" "$flagPrefix" "$comp" @@ -46,92 +52,113 @@ function __git-bug_perform_completion end # This function does three things: -# 1- Obtain the completions and store them in the global __git-bug_comp_results -# 2- Set the __git-bug_comp_do_file_comp flag if file completion should be performed +# 1- Obtain the completions and store them in the global __git_bug_comp_results +# 2- Set the __git_bug_comp_do_file_comp flag if file completion should be performed # and unset it otherwise # 3- Return true if the completion results are not empty -function __git-bug_prepare_completions +function __git_bug_prepare_completions # Start fresh - set --erase __git-bug_comp_do_file_comp - set --erase __git-bug_comp_results + set --erase __git_bug_comp_do_file_comp + set --erase __git_bug_comp_results # Check if the command-line is already provided. This is useful for testing. - if not set --query __git-bug_comp_commandLine - set __git-bug_comp_commandLine (commandline) + if not set --query __git_bug_comp_commandLine + # Use the -c flag to allow for completion in the middle of the line + set __git_bug_comp_commandLine (commandline -c) end - __git-bug_debug "commandLine is: $__git-bug_comp_commandLine" + __git_bug_debug "commandLine is: $__git_bug_comp_commandLine" - set results (__git-bug_perform_completion "$__git-bug_comp_commandLine") - set --erase __git-bug_comp_commandLine - __git-bug_debug "Completion results: $results" + set results (__git_bug_perform_completion "$__git_bug_comp_commandLine") + set --erase __git_bug_comp_commandLine + __git_bug_debug "Completion results: $results" if test -z "$results" - __git-bug_debug "No completion, probably due to a failure" + __git_bug_debug "No completion, probably due to a failure" # Might as well do file completion, in case it helps - set --global __git-bug_comp_do_file_comp 1 - return 0 + set --global __git_bug_comp_do_file_comp 1 + return 1 end set directive (string sub --start 2 $results[-1]) - set --global __git-bug_comp_results $results[1..-2] + set --global __git_bug_comp_results $results[1..-2] + + __git_bug_debug "Completions are: $__git_bug_comp_results" + __git_bug_debug "Directive is: $directive" - __git-bug_debug "Completions are: $__git-bug_comp_results" - __git-bug_debug "Directive is: $directive" + set shellCompDirectiveError 1 + set shellCompDirectiveNoSpace 2 + set shellCompDirectiveNoFileComp 4 + set shellCompDirectiveFilterFileExt 8 + set shellCompDirectiveFilterDirs 16 if test -z "$directive" set directive 0 end - set compErr (math (math --scale 0 $directive / 1) % 2) + set compErr (math (math --scale 0 $directive / $shellCompDirectiveError) % 2) if test $compErr -eq 1 - __git-bug_debug "Received error directive: aborting." + __git_bug_debug "Received error directive: aborting." # Might as well do file completion, in case it helps - set --global __git-bug_comp_do_file_comp 1 - return 0 + set --global __git_bug_comp_do_file_comp 1 + return 1 end - set nospace (math (math --scale 0 $directive / 2) % 2) - set nofiles (math (math --scale 0 $directive / 4) % 2) + set filefilter (math (math --scale 0 $directive / $shellCompDirectiveFilterFileExt) % 2) + set dirfilter (math (math --scale 0 $directive / $shellCompDirectiveFilterDirs) % 2) + if test $filefilter -eq 1; or test $dirfilter -eq 1 + __git_bug_debug "File extension filtering or directory filtering not supported" + # Do full file completion instead + set --global __git_bug_comp_do_file_comp 1 + return 1 + end + + set nospace (math (math --scale 0 $directive / $shellCompDirectiveNoSpace) % 2) + set nofiles (math (math --scale 0 $directive / $shellCompDirectiveNoFileComp) % 2) - __git-bug_debug "nospace: $nospace, nofiles: $nofiles" + __git_bug_debug "nospace: $nospace, nofiles: $nofiles" # Important not to quote the variable for count to work - set numComps (count $__git-bug_comp_results) - __git-bug_debug "numComps: $numComps" + set numComps (count $__git_bug_comp_results) + __git_bug_debug "numComps: $numComps" if test $numComps -eq 1; and test $nospace -ne 0 # To support the "nospace" directive we trick the shell # by outputting an extra, longer completion. - __git-bug_debug "Adding second completion to perform nospace directive" - set --append __git-bug_comp_results $__git-bug_comp_results[1]. + __git_bug_debug "Adding second completion to perform nospace directive" + set --append __git_bug_comp_results $__git_bug_comp_results[1]. end if test $numComps -eq 0; and test $nofiles -eq 0 - __git-bug_debug "Requesting file completion" - set --global __git-bug_comp_do_file_comp 1 + __git_bug_debug "Requesting file completion" + set --global __git_bug_comp_do_file_comp 1 end # If we don't want file completion, we must return true even if there # are no completions found. This is because fish will perform the last # completion command, even if its condition is false, if no other # completion command was triggered - return (not set --query __git-bug_comp_do_file_comp) + return (not set --query __git_bug_comp_do_file_comp) end -# Remove any pre-existing completions for the program since we will be handling all of them -# TODO this cleanup is not sufficient. Fish completions are only loaded once the user triggers -# them, so the below deletion will not work as it is run too early. What else can we do? +# Since Fish completions are only loaded once the user triggers them, we trigger them ourselves +# so we can properly delete any completions provided by another script. +# The space after the the program name is essential to trigger completion for the program +# and not completion of the program name itself. +complete --do-complete "git-bug " > /dev/null 2>&1 +# Using '> /dev/null 2>&1' since '&>' is not supported in older versions of fish. + +# Remove any pre-existing completions for the program since we will be handling all of them. complete -c git-bug -e -# The order in which the below two lines are defined is very important so that __git-bug_prepare_completions -# is called first. It is __git-bug_prepare_completions that sets up the __git-bug_comp_do_file_comp variable. +# The order in which the below two lines are defined is very important so that __git_bug_prepare_completions +# is called first. It is __git_bug_prepare_completions that sets up the __git_bug_comp_do_file_comp variable. # # This completion will be run second as complete commands are added FILO. -# It triggers file completion choices when __git-bug_comp_do_file_comp is set. -complete -c git-bug -n 'set --query __git-bug_comp_do_file_comp' +# It triggers file completion choices when __git_bug_comp_do_file_comp is set. +complete -c git-bug -n 'set --query __git_bug_comp_do_file_comp' # This completion will be run first as complete commands are added FILO. -# The call to __git-bug_prepare_completions will setup both __git-bug_comp_results abd __git-bug_comp_do_file_comp. +# The call to __git_bug_prepare_completions will setup both __git_bug_comp_results and __git_bug_comp_do_file_comp. # It provides the program's completion choices. -complete -c git-bug -n '__git-bug_prepare_completions' -f -a '$__git-bug_comp_results' +complete -c git-bug -n '__git_bug_prepare_completions' -f -a '$__git_bug_comp_results' |