diff --git a/completions/fleek.bash b/completions/fleek.bash index 1c4602ed..6121bf22 100644 --- a/completions/fleek.bash +++ b/completions/fleek.bash @@ -1,325 +1,338 @@ -# bash completion V2 for fleek -*- shell-script -*- - -__fleek_debug() -{ - if [[ -n ${BASH_COMP_DEBUG_FILE:-} ]]; then - echo "$*" >> "${BASH_COMP_DEBUG_FILE}" - fi -} - -# Macs have bash3 for which the bash-completion package doesn't include -# _init_completion. This is a minimal version of that function. -__fleek_init_completion() -{ - COMPREPLY=() - _get_comp_words_by_ref "$@" cur prev words cword -} - -# This function calls the fleek program to obtain the completion -# results and the directive. It fills the 'out' and 'directive' vars. -__fleek_get_completion_results() { - local requestComp lastParam lastChar args - - # Prepare the command to request completions for the program. - # Calling ${words[0]} instead of directly fleek allows to handle aliases - args=("${words[@]:1}") - requestComp="${words[0]} __complete ${args[*]}" - - lastParam=${words[$((${#words[@]}-1))]} - lastChar=${lastParam:$((${#lastParam}-1)):1} - __fleek_debug "lastParam ${lastParam}, lastChar ${lastChar}" - - if [ -z "${cur}" ] && [ "${lastChar}" != "=" ]; then - # If the last parameter is complete (there is a space following it) - # We add an extra empty parameter so we can indicate this to the go method. - __fleek_debug "Adding extra empty parameter" - requestComp="${requestComp} ''" - fi - - # When completing a flag with an = (e.g., fleek -n=) - # bash focuses on the part after the =, so we need to remove - # the flag part from $cur - if [[ "${cur}" == -*=* ]]; then - cur="${cur#*=}" - fi - - __fleek_debug "Calling ${requestComp}" - # Use eval to handle any environment variables and such - out=$(eval "${requestComp}" 2>/dev/null) - - # Extract the directive integer at the very end of the output following a colon (:) - directive=${out##*:} - # Remove the directive - out=${out%:*} - if [ "${directive}" = "${out}" ]; then - # There is not directive specified - directive=0 - fi - __fleek_debug "The completion directive is: ${directive}" - __fleek_debug "The completions are: ${out}" -} - -__fleek_process_completion_results() { - local shellCompDirectiveError=1 - local shellCompDirectiveNoSpace=2 - local shellCompDirectiveNoFileComp=4 - local shellCompDirectiveFilterFileExt=8 - local shellCompDirectiveFilterDirs=16 - - if [ $((directive & shellCompDirectiveError)) -ne 0 ]; then - # Error code. No completion. - __fleek_debug "Received error from custom completion go code" - return - else - if [ $((directive & shellCompDirectiveNoSpace)) -ne 0 ]; then - if [[ $(type -t compopt) = "builtin" ]]; then - __fleek_debug "Activating no space" - compopt -o nospace - else - __fleek_debug "No space directive not supported in this version of bash" - fi - fi - if [ $((directive & shellCompDirectiveNoFileComp)) -ne 0 ]; then - if [[ $(type -t compopt) = "builtin" ]]; then - __fleek_debug "Activating no file completion" - compopt +o default - else - __fleek_debug "No file completion directive not supported in this version of bash" - fi - fi - fi - - # Separate activeHelp from normal completions - local completions=() - local activeHelp=() - __fleek_extract_activeHelp - - if [ $((directive & shellCompDirectiveFilterFileExt)) -ne 0 ]; then - # File extension filtering - local fullFilter filter filteringCmd - - # Do not use quotes around the $completions variable or else newline - # characters will be kept. - for filter in ${completions[*]}; do - fullFilter+="$filter|" - done - - filteringCmd="_filedir $fullFilter" - __fleek_debug "File filtering command: $filteringCmd" - $filteringCmd - elif [ $((directive & shellCompDirectiveFilterDirs)) -ne 0 ]; then - # File completion for directories only - - # Use printf to strip any trailing newline - local subdir - subdir=$(printf "%s" "${completions[0]}") - if [ -n "$subdir" ]; then - __fleek_debug "Listing directories in $subdir" - pushd "$subdir" >/dev/null 2>&1 && _filedir -d && popd >/dev/null 2>&1 || return - else - __fleek_debug "Listing directories in ." - _filedir -d - fi - else - __fleek_handle_completion_types - fi - - __fleek_handle_special_char "$cur" : - __fleek_handle_special_char "$cur" = - - # Print the activeHelp statements before we finish - if [ ${#activeHelp[*]} -ne 0 ]; then - printf "\n"; - printf "%s\n" "${activeHelp[@]}" - printf "\n" - - # The prompt format is only available from bash 4.4. - # We test if it is available before using it. - if (x=${PS1@P}) 2> /dev/null; then - printf "%s" "${PS1@P}${COMP_LINE[@]}" - else - # Can't print the prompt. Just print the - # text the user had typed, it is workable enough. - printf "%s" "${COMP_LINE[@]}" - fi - fi -} - -# Separate activeHelp lines from real completions. -# Fills the $activeHelp and $completions arrays. -__fleek_extract_activeHelp() { - local activeHelpMarker="_activeHelp_ " - local endIndex=${#activeHelpMarker} - - while IFS='' read -r comp; do - if [ "${comp:0:endIndex}" = "$activeHelpMarker" ]; then - comp=${comp:endIndex} - __fleek_debug "ActiveHelp found: $comp" - if [ -n "$comp" ]; then - activeHelp+=("$comp") - fi - else - # Not an activeHelp line but a normal completion - completions+=("$comp") - fi - done < <(printf "%s\n" "${out}") -} - -__fleek_handle_completion_types() { - __fleek_debug "__fleek_handle_completion_types: COMP_TYPE is $COMP_TYPE" - - case $COMP_TYPE in - 37|42) - # Type: menu-complete/menu-complete-backward and insert-completions - # If the user requested inserting one completion at a time, or all - # completions at once on the command-line we must remove the descriptions. - # https://github.com/spf13/cobra/issues/1508 - local tab=$'\t' comp - while IFS='' read -r comp; do - [[ -z $comp ]] && continue - # Strip any description - comp=${comp%%$tab*} - # Only consider the completions that match - if [[ $comp == "$cur"* ]]; then - COMPREPLY+=("$comp") - fi - done < <(printf "%s\n" "${completions[@]}") - ;; - - *) - # Type: complete (normal completion) - __fleek_handle_standard_completion_case - ;; - esac -} - -__fleek_handle_standard_completion_case() { - local tab=$'\t' comp - - # Short circuit to optimize if we don't have descriptions - if [[ "${completions[*]}" != *$tab* ]]; then - IFS=$'\n' read -ra COMPREPLY -d '' < <(compgen -W "${completions[*]}" -- "$cur") - return 0 - fi - - local longest=0 - local compline - # Look for the longest completion so that we can format things nicely - while IFS='' read -r compline; do - [[ -z $compline ]] && continue - # Strip any description before checking the length - comp=${compline%%$tab*} - # Only consider the completions that match - [[ $comp == "$cur"* ]] || continue - COMPREPLY+=("$compline") - if ((${#comp}>longest)); then - longest=${#comp} - fi - done < <(printf "%s\n" "${completions[@]}") - - # If there is a single completion left, remove the description text - if [ ${#COMPREPLY[*]} -eq 1 ]; then - __fleek_debug "COMPREPLY[0]: ${COMPREPLY[0]}" - comp="${COMPREPLY[0]%%$tab*}" - __fleek_debug "Removed description from single completion, which is now: ${comp}" - COMPREPLY[0]=$comp - else # Format the descriptions - __fleek_format_comp_descriptions $longest - fi -} - -__fleek_handle_special_char() -{ - local comp="$1" - local char=$2 - if [[ "$comp" == *${char}* && "$COMP_WORDBREAKS" == *${char}* ]]; then - local word=${comp%"${comp##*${char}}"} - local idx=${#COMPREPLY[*]} - while [[ $((--idx)) -ge 0 ]]; do - COMPREPLY[$idx]=${COMPREPLY[$idx]#"$word"} - done - fi -} - -__fleek_format_comp_descriptions() -{ - local tab=$'\t' - local comp desc maxdesclength - local longest=$1 - - local i ci - for ci in ${!COMPREPLY[*]}; do - comp=${COMPREPLY[ci]} - # Properly format the description string which follows a tab character if there is one - if [[ "$comp" == *$tab* ]]; then - __fleek_debug "Original comp: $comp" - desc=${comp#*$tab} - comp=${comp%%$tab*} - - # $COLUMNS stores the current shell width. - # Remove an extra 4 because we add 2 spaces and 2 parentheses. - maxdesclength=$(( COLUMNS - longest - 4 )) - - # Make sure we can fit a description of at least 8 characters - # if we are to align the descriptions. - if [[ $maxdesclength -gt 8 ]]; then - # Add the proper number of spaces to align the descriptions - for ((i = ${#comp} ; i < longest ; i++)); do - comp+=" " - done - else - # Don't pad the descriptions so we can fit more text after the completion - maxdesclength=$(( COLUMNS - ${#comp} - 4 )) - fi - - # If there is enough space for any description text, - # truncate the descriptions that are too long for the shell width - if [ $maxdesclength -gt 0 ]; then - if [ ${#desc} -gt $maxdesclength ]; then - desc=${desc:0:$(( maxdesclength - 1 ))} - desc+="…" - fi - comp+=" ($desc)" - fi - COMPREPLY[ci]=$comp - __fleek_debug "Final comp: $comp" - fi - done -} - -__start_fleek() -{ - local cur prev words cword split - - COMPREPLY=() - - # Call _init_completion from the bash-completion package - # to prepare the arguments properly - if declare -F _init_completion >/dev/null 2>&1; then - _init_completion -n "=:" || return - else - __fleek_init_completion -n "=:" || return - fi - - __fleek_debug - __fleek_debug "========= starting completion logic ==========" - __fleek_debug "cur is ${cur}, words[*] is ${words[*]}, #words[@] is ${#words[@]}, cword is $cword" - - # The user could have moved the cursor backwards on the command-line. - # We need to trigger completion from the $cword location, so we need - # to truncate the command-line ($words) up to the $cword location. - words=("${words[@]:0:$cword+1}") - __fleek_debug "Truncated words[*]: ${words[*]}," - - local out directive - __fleek_get_completion_results - __fleek_process_completion_results -} - -if [[ $(type -t compopt) = "builtin" ]]; then - complete -o default -F __start_fleek fleek -else - complete -o default -o nospace -F __start_fleek fleek -fi - -# ex: ts=4 sw=4 et filetype=sh + [i]  # bash completion V2 for fleek -*- shell-script -*- +   +  __fleek_debug() +  { +   if [[ -n ${BASH_COMP_DEBUG_FILE-} ]]; then +   echo "$*" >> "${BASH_COMP_DEBUG_FILE}" +   fi +  } +   +  # Macs have bash3 for which the bash-completion package doesn't include +  # _init_completion. This is a minimal version of that function. +  __fleek_init_completion() +  { +   COMPREPLY=() +   _get_comp_words_by_ref "$@" cur prev words cword +  } +   +  # This function calls the fleek program to obtain the completion +  # results and the directive. It fills the 'out' and 'directive' vars. +  __fleek_get_completion_results() { +   local requestComp lastParam lastChar args +   +   # Prepare the command to request completions for the program. +   # Calling ${words[0]} instead of directly fleek allows to handle aliases +   args=("${words[@]:1}") +   requestComp="${words[0]} __complete ${args[*]}" +   +   lastParam=${words[$((${#words[@]}-1))]} +   lastChar=${lastParam:$((${#lastParam}-1)):1} +   __fleek_debug "lastParam ${lastParam}, lastChar ${lastChar}" +   +   if [[ -z ${cur} && ${lastChar} != = ]]; then +   # If the last parameter is complete (there is a space following it) +   # We add an extra empty parameter so we can indicate this to the go method. +   __fleek_debug "Adding extra empty parameter" +   requestComp="${requestComp} ''" +   fi +   +   # When completing a flag with an = (e.g., fleek -n=) +   # bash focuses on the part after the =, so we need to remove +   # the flag part from $cur +   if [[ ${cur} == -*=* ]]; then +   cur="${cur#*=}" +   fi +   +   __fleek_debug "Calling ${requestComp}" +   # Use eval to handle any environment variables and such +   out=$(eval "${requestComp}" 2>/dev/null) +   +   # Extract the directive integer at the very end of the output following a colon (:) +   directive=${out##*:} +   # Remove the directive +   out=${out%:*} +   if [[ ${directive} == "${out}" ]]; then +   # There is not directive specified +   directive=0 +   fi +   __fleek_debug "The completion directive is: ${directive}" +   __fleek_debug "The completions are: ${out}" +  } +   +  __fleek_process_completion_results() { +   local shellCompDirectiveError=1 +   local shellCompDirectiveNoSpace=2 +   local shellCompDirectiveNoFileComp=4 +   local shellCompDirectiveFilterFileExt=8 +   local shellCompDirectiveFilterDirs=16 +   local shellCompDirectiveKeepOrder=32 +   +   if (((directive & shellCompDirectiveError) != 0)); then +   # Error code. No completion. +   __fleek_debug "Received error from custom completion go code" +   return +   else +   if (((directive & shellCompDirectiveNoSpace) != 0)); then +   if [[ $(type -t compopt) == builtin ]]; then +   __fleek_debug "Activating no space" +   compopt -o nospace +   else +   __fleek_debug "No space directive not supported in this version of bash" +   fi +   fi +   if (((directive & shellCompDirectiveKeepOrder) != 0)); then +   if [[ $(type -t compopt) == builtin ]]; then +   # no sort isn't supported for bash less than < 4.4 +   if [[ ${BASH_VERSINFO[0]} -lt 4 || ( ${BASH_VERSINFO[0]} -eq 4 && ${BASH_VERSINFO[1]} -lt 4 ) ]]; then +   __fleek_debug "No sort directive not supported in this version of bash" +   else +   __fleek_debug "Activating keep order" +   compopt -o nosort +   fi +   else +   __fleek_debug "No sort directive not supported in this version of bash" +   fi +   fi +   if (((directive & shellCompDirectiveNoFileComp) != 0)); then +   if [[ $(type -t compopt) == builtin ]]; then +   __fleek_debug "Activating no file completion" +   compopt +o default +   else +   __fleek_debug "No file completion directive not supported in this version of bash" +   fi +   fi +   fi +   +   # Separate activeHelp from normal completions +   local completions=() +   local activeHelp=() +   __fleek_extract_activeHelp +   +   if (((directive & shellCompDirectiveFilterFileExt) != 0)); then +   # File extension filtering +   local fullFilter filter filteringCmd +   +   # Do not use quotes around the $completions variable or else newline +   # characters will be kept. +   for filter in ${completions[*]}; do +   fullFilter+="$filter|" +   done +   +   filteringCmd="_filedir $fullFilter" +   __fleek_debug "File filtering command: $filteringCmd" +   $filteringCmd +   elif (((directive & shellCompDirectiveFilterDirs) != 0)); then +   # File completion for directories only +   +   local subdir +   subdir=${completions[0]} +   if [[ -n $subdir ]]; then +   __fleek_debug "Listing directories in $subdir" +   pushd "$subdir" >/dev/null 2>&1 && _filedir -d && popd >/dev/null 2>&1 || return +   else +   __fleek_debug "Listing directories in ." +   _filedir -d +   fi +   else +   __fleek_handle_completion_types +   fi +   +   __fleek_handle_special_char "$cur" : +   __fleek_handle_special_char "$cur" = +   +   # Print the activeHelp statements before we finish +   if ((${#activeHelp[*]} != 0)); then +   printf "\n"; +   printf "%s\n" "${activeHelp[@]}" +   printf "\n" +   +   # The prompt format is only available from bash 4.4. +   # We test if it is available before using it. +   if (x=${PS1@P}) 2> /dev/null; then +   printf "%s" "${PS1@P}${COMP_LINE[@]}" +   else +   # Can't print the prompt. Just print the +   # text the user had typed, it is workable enough. +   printf "%s" "${COMP_LINE[@]}" +   fi +   fi +  } +   +  # Separate activeHelp lines from real completions. +  # Fills the $activeHelp and $completions arrays. +  __fleek_extract_activeHelp() { +   local activeHelpMarker="_activeHelp_ " +   local endIndex=${#activeHelpMarker} +   +   while IFS='' read -r comp; do +   if [[ ${comp:0:endIndex} == $activeHelpMarker ]]; then +   comp=${comp:endIndex} +   __fleek_debug "ActiveHelp found: $comp" +   if [[ -n $comp ]]; then +   activeHelp+=("$comp") +   fi +   else +   # Not an activeHelp line but a normal completion +   completions+=("$comp") +   fi +   done <<<"${out}" +  } +   +  __fleek_handle_completion_types() { +   __fleek_debug "__fleek_handle_completion_types: COMP_TYPE is $COMP_TYPE" +   +   case $COMP_TYPE in +   37|42) +   # Type: menu-complete/menu-complete-backward and insert-completions +   # If the user requested inserting one completion at a time, or all +   # completions at once on the command-line we must remove the descriptions. +   # https://github.com/spf13/cobra/issues/1508 +   local tab=$'\t' comp +   while IFS='' read -r comp; do +   [[ -z $comp ]] && continue +   # Strip any description +   comp=${comp%%$tab*} +   # Only consider the completions that match +   if [[ $comp == "$cur"* ]]; then +   COMPREPLY+=("$comp") +   fi +   done < <(printf "%s\n" "${completions[@]}") +   ;; +   +   *) +   # Type: complete (normal completion) +   __fleek_handle_standard_completion_case +   ;; +   esac +  } +   +  __fleek_handle_standard_completion_case() { +   local tab=$'\t' comp +   +   # Short circuit to optimize if we don't have descriptions +   if [[ "${completions[*]}" != *$tab* ]]; then +   IFS=$'\n' read -ra COMPREPLY -d '' < <(compgen -W "${completions[*]}" -- "$cur") +   return 0 +   fi +   +   local longest=0 +   local compline +   # Look for the longest completion so that we can format things nicely +   while IFS='' read -r compline; do +   [[ -z $compline ]] && continue +   # Strip any description before checking the length +   comp=${compline%%$tab*} +   # Only consider the completions that match +   [[ $comp == "$cur"* ]] || continue +   COMPREPLY+=("$compline") +   if ((${#comp}>longest)); then +   longest=${#comp} +   fi +   done < <(printf "%s\n" "${completions[@]}") +   +   # If there is a single completion left, remove the description text +   if ((${#COMPREPLY[*]} == 1)); then +   __fleek_debug "COMPREPLY[0]: ${COMPREPLY[0]}" +   comp="${COMPREPLY[0]%%$tab*}" +   __fleek_debug "Removed description from single completion, which is now: ${comp}" +   COMPREPLY[0]=$comp +   else # Format the descriptions +   __fleek_format_comp_descriptions $longest +   fi +  } +   +  __fleek_handle_special_char() +  { +   local comp="$1" +   local char=$2 +   if [[ "$comp" == *${char}* && "$COMP_WORDBREAKS" == *${char}* ]]; then +   local word=${comp%"${comp##*${char}}"} +   local idx=${#COMPREPLY[*]} +   while ((--idx >= 0)); do +   COMPREPLY[idx]=${COMPREPLY[idx]#"$word"} +   done +   fi +  } +   +  __fleek_format_comp_descriptions() +  { +   local tab=$'\t' +   local comp desc maxdesclength +   local longest=$1 +   +   local i ci +   for ci in ${!COMPREPLY[*]}; do +   comp=${COMPREPLY[ci]} +   # Properly format the description string which follows a tab character if there is one +   if [[ "$comp" == *$tab* ]]; then +   __fleek_debug "Original comp: $comp" +   desc=${comp#*$tab} +   comp=${comp%%$tab*} +   +   # $COLUMNS stores the current shell width. +   # Remove an extra 4 because we add 2 spaces and 2 parentheses. +   maxdesclength=$(( COLUMNS - longest - 4 )) +   +   # Make sure we can fit a description of at least 8 characters +   # if we are to align the descriptions. +   if ((maxdesclength > 8)); then +   # Add the proper number of spaces to align the descriptions +   for ((i = ${#comp} ; i < longest ; i++)); do +   comp+=" " +   done +   else +   # Don't pad the descriptions so we can fit more text after the completion +   maxdesclength=$(( COLUMNS - ${#comp} - 4 )) +   fi +   +   # If there is enough space for any description text, +   # truncate the descriptions that are too long for the shell width +   if ((maxdesclength > 0)); then +   if ((${#desc} > maxdesclength)); then +   desc=${desc:0:$(( maxdesclength - 1 ))} +   desc+="…" +   fi +   comp+=" ($desc)" +   fi +   COMPREPLY[ci]=$comp +   __fleek_debug "Final comp: $comp" +   fi +   done +  } +   +  __start_fleek() +  { +   local cur prev words cword split +   +   COMPREPLY=() +   +   # Call _init_completion from the bash-completion package +   # to prepare the arguments properly +   if declare -F _init_completion >/dev/null 2>&1; then +   _init_completion -n =: || return +   else +   __fleek_init_completion -n =: || return +   fi +   +   __fleek_debug +   __fleek_debug "========= starting completion logic ==========" +   __fleek_debug "cur is ${cur}, words[*] is ${words[*]}, #words[@] is ${#words[@]}, cword is $cword" +   +   # The user could have moved the cursor backwards on the command-line. +   # We need to trigger completion from the $cword location, so we need +   # to truncate the command-line ($words) up to the $cword location. +   words=("${words[@]:0:$cword+1}") +   __fleek_debug "Truncated words[*]: ${words[*]}," +   +   local out directive +   __fleek_get_completion_results +   __fleek_process_completion_results +  } +   +  if [[ $(type -t compopt) = "builtin" ]]; then +   complete -o default -F __start_fleek fleek +  else +   complete -o default -o nospace -F __start_fleek fleek +  fi +   +  # ex: ts=4 sw=4 et filetype=sh diff --git a/completions/fleek.fish b/completions/fleek.fish index 1ea2ff8e..60fa6c6a 100644 --- a/completions/fleek.fish +++ b/completions/fleek.fish @@ -1,177 +1,235 @@ -# fish completion for fleek -*- shell-script -*- - -function __fleek_debug - set -l file "$BASH_COMP_DEBUG_FILE" - if test -n "$file" - echo "$argv" >> $file - end -end - -function __fleek_perform_completion - __fleek_debug "Starting __fleek_perform_completion" - - # Extract all args except the last one - set -l args (commandline -opc) - # Extract the last arg and escape it in case it is a space - set -l lastArg (string escape -- (commandline -ct)) - - __fleek_debug "args: $args" - __fleek_debug "last arg: $lastArg" - - # Disable ActiveHelp which is not supported for fish shell - set -l requestComp "FLEEK_ACTIVE_HELP=0 $args[1] __complete $args[2..-1] $lastArg" - - __fleek_debug "Calling $requestComp" - set -l results (eval $requestComp 2> /dev/null) - - # Some programs may output extra empty lines after the directive. - # Let's ignore them or else it will break completion. - # Ref: https://github.com/spf13/cobra/issues/1279 - for line in $results[-1..1] - if test (string trim -- $line) = "" - # Found an empty line, remove it - set results $results[1..-2] - else - # Found non-empty line, we have our proper output - break - end - end - - set -l comps $results[1..-2] - set -l directiveLine $results[-1] - - # For Fish, when completing a flag with an = (e.g., -n=) - # completions must be prefixed with the flag - set -l flagPrefix (string match -r -- '-.*=' "$lastArg") - - __fleek_debug "Comps: $comps" - __fleek_debug "DirectiveLine: $directiveLine" - __fleek_debug "flagPrefix: $flagPrefix" - - for comp in $comps - printf "%s%s\n" "$flagPrefix" "$comp" - end - - printf "%s\n" "$directiveLine" -end - -# This function does two things: -# - Obtain the completions and store them in the global __fleek_comp_results -# - Return false if file completion should be performed -function __fleek_prepare_completions - __fleek_debug "" - __fleek_debug "========= starting completion logic ==========" - - # Start fresh - set --erase __fleek_comp_results - - set -l results (__fleek_perform_completion) - __fleek_debug "Completion results: $results" - - if test -z "$results" - __fleek_debug "No completion, probably due to a failure" - # Might as well do file completion, in case it helps - return 1 - end - - set -l directive (string sub --start 2 $results[-1]) - set --global __fleek_comp_results $results[1..-2] - - __fleek_debug "Completions are: $__fleek_comp_results" - __fleek_debug "Directive is: $directive" - - set -l shellCompDirectiveError 1 - set -l shellCompDirectiveNoSpace 2 - set -l shellCompDirectiveNoFileComp 4 - set -l shellCompDirectiveFilterFileExt 8 - set -l shellCompDirectiveFilterDirs 16 - - if test -z "$directive" - set directive 0 - end - - set -l compErr (math (math --scale 0 $directive / $shellCompDirectiveError) % 2) - if test $compErr -eq 1 - __fleek_debug "Received error directive: aborting." - # Might as well do file completion, in case it helps - return 1 - end - - set -l filefilter (math (math --scale 0 $directive / $shellCompDirectiveFilterFileExt) % 2) - set -l dirfilter (math (math --scale 0 $directive / $shellCompDirectiveFilterDirs) % 2) - if test $filefilter -eq 1; or test $dirfilter -eq 1 - __fleek_debug "File extension filtering or directory filtering not supported" - # Do full file completion instead - return 1 - end - - set -l nospace (math (math --scale 0 $directive / $shellCompDirectiveNoSpace) % 2) - set -l nofiles (math (math --scale 0 $directive / $shellCompDirectiveNoFileComp) % 2) - - __fleek_debug "nospace: $nospace, nofiles: $nofiles" - - # If we want to prevent a space, or if file completion is NOT disabled, - # we need to count the number of valid completions. - # To do so, we will filter on prefix as the completions we have received - # may not already be filtered so as to allow fish to match on different - # criteria than the prefix. - if test $nospace -ne 0; or test $nofiles -eq 0 - set -l prefix (commandline -t | string escape --style=regex) - __fleek_debug "prefix: $prefix" - - set -l completions (string match -r -- "^$prefix.*" $__fleek_comp_results) - set --global __fleek_comp_results $completions - __fleek_debug "Filtered completions are: $__fleek_comp_results" - - # Important not to quote the variable for count to work - set -l numComps (count $__fleek_comp_results) - __fleek_debug "numComps: $numComps" - - if test $numComps -eq 1; and test $nospace -ne 0 - # We must first split on \t to get rid of the descriptions to be - # able to check what the actual completion will be. - # We don't need descriptions anyway since there is only a single - # real completion which the shell will expand immediately. - set -l split (string split --max 1 \t $__fleek_comp_results[1]) - - # Fish won't add a space if the completion ends with any - # of the following characters: @=/:., - set -l lastChar (string sub -s -1 -- $split) - if not string match -r -q "[@=/:.,]" -- "$lastChar" - # In other cases, to support the "nospace" directive we trick the shell - # by outputting an extra, longer completion. - __fleek_debug "Adding second completion to perform nospace directive" - set --global __fleek_comp_results $split[1] $split[1]. - __fleek_debug "Completions are now: $__fleek_comp_results" - end - end - - if test $numComps -eq 0; and test $nofiles -eq 0 - # To be consistent with bash and zsh, we only trigger file - # completion when there are no other completions - __fleek_debug "Requesting file completion" - return 1 - end - end - - return 0 -end - -# 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. -# Only do this if the program can be found, or else fish may print some errors; besides, -# the existing completions will only be loaded if the program can be found. -if type -q "fleek" - # The space after the program name is essential to trigger completion for the program - # and not completion of the program name itself. - # Also, we use '> /dev/null 2>&1' since '&>' is not supported in older versions of fish. - complete --do-complete "fleek " > /dev/null 2>&1 -end - -# Remove any pre-existing completions for the program since we will be handling all of them. -complete -c fleek -e - -# The call to __fleek_prepare_completions will setup __fleek_comp_results -# which provides the program's completion choices. -complete -c fleek -n '__fleek_prepare_completions' -f -a '$__fleek_comp_results' - + [i]  # fish completion for fleek -*- shell-script -*- +   +  function __fleek_debug +   set -l file "$BASH_COMP_DEBUG_FILE" +   if test -n "$file" +   echo "$argv" >> $file +   end +  end +   +  function __fleek_perform_completion +   __fleek_debug "Starting __fleek_perform_completion" +   +   # Extract all args except the last one +   set -l args (commandline -opc) +   # Extract the last arg and escape it in case it is a space +   set -l lastArg (string escape -- (commandline -ct)) +   +   __fleek_debug "args: $args" +   __fleek_debug "last arg: $lastArg" +   +   # Disable ActiveHelp which is not supported for fish shell +   set -l requestComp "FLEEK_ACTIVE_HELP=0 $args[1] __complete $args[2..-1] $lastArg" +   +   __fleek_debug "Calling $requestComp" +   set -l results (eval $requestComp 2> /dev/null) +   +   # Some programs may output extra empty lines after the directive. +   # Let's ignore them or else it will break completion. +   # Ref: https://github.com/spf13/cobra/issues/1279 +   for line in $results[-1..1] +   if test (string trim -- $line) = "" +   # Found an empty line, remove it +   set results $results[1..-2] +   else +   # Found non-empty line, we have our proper output +   break +   end +   end +   +   set -l comps $results[1..-2] +   set -l directiveLine $results[-1] +   +   # For Fish, when completing a flag with an = (e.g., -n=) +   # completions must be prefixed with the flag +   set -l flagPrefix (string match -r -- '-.*=' "$lastArg") +   +   __fleek_debug "Comps: $comps" +   __fleek_debug "DirectiveLine: $directiveLine" +   __fleek_debug "flagPrefix: $flagPrefix" +   +   for comp in $comps +   printf "%s%s\n" "$flagPrefix" "$comp" +   end +   +   printf "%s\n" "$directiveLine" +  end +   +  # this function limits calls to __fleek_perform_completion, by caching the result behind $__fleek_perform_completion_once_result +  function __fleek_perform_completion_once +   __fleek_debug "Starting __fleek_perform_completion_once" +   +   if test -n "$__fleek_perform_completion_once_result" +   __fleek_debug "Seems like a valid result already exists, skipping __fleek_perform_completion" +   return 0 +   end +   +   set --global __fleek_perform_completion_once_result (__fleek_perform_completion) +   if test -z "$__fleek_perform_completion_once_result" +   __fleek_debug "No completions, probably due to a failure" +   return 1 +   end +   +   __fleek_debug "Performed completions and set __fleek_perform_completion_once_result" +   return 0 +  end +   +  # this function is used to clear the $__fleek_perform_completion_once_result variable after completions are run +  function __fleek_clear_perform_completion_once_result +   __fleek_debug "" +   __fleek_debug "========= clearing previously set __fleek_perform_completion_once_result variable ==========" +   set --erase __fleek_perform_completion_once_result +   __fleek_debug "Succesfully erased the variable __fleek_perform_completion_once_result" +  end +   +  function __fleek_requires_order_preservation +   __fleek_debug "" +   __fleek_debug "========= checking if order preservation is required ==========" +   +   __fleek_perform_completion_once +   if test -z "$__fleek_perform_completion_once_result" +   __fleek_debug "Error determining if order preservation is required" +   return 1 +   end +   +   set -l directive (string sub --start 2 $__fleek_perform_completion_once_result[-1]) +   __fleek_debug "Directive is: $directive" +   +   set -l shellCompDirectiveKeepOrder 32 +   set -l keeporder (math (math --scale 0 $directive / $shellCompDirectiveKeepOrder) % 2) +   __fleek_debug "Keeporder is: $keeporder" +   +   if test $keeporder -ne 0 +   __fleek_debug "This does require order preservation" +   return 0 +   end +   +   __fleek_debug "This doesn't require order preservation" +   return 1 +  end +   +   +  # This function does two things: +  # - Obtain the completions and store them in the global __fleek_comp_results +  # - Return false if file completion should be performed +  function __fleek_prepare_completions +   __fleek_debug "" +   __fleek_debug "========= starting completion logic ==========" +   +   # Start fresh +   set --erase __fleek_comp_results +   +   __fleek_perform_completion_once +   __fleek_debug "Completion results: $__fleek_perform_completion_once_result" +   +   if test -z "$__fleek_perform_completion_once_result" +   __fleek_debug "No completion, probably due to a failure" +   # Might as well do file completion, in case it helps +   return 1 +   end +   +   set -l directive (string sub --start 2 $__fleek_perform_completion_once_result[-1]) +   set --global __fleek_comp_results $__fleek_perform_completion_once_result[1..-2] +   +   __fleek_debug "Completions are: $__fleek_comp_results" +   __fleek_debug "Directive is: $directive" +   +   set -l shellCompDirectiveError 1 +   set -l shellCompDirectiveNoSpace 2 +   set -l shellCompDirectiveNoFileComp 4 +   set -l shellCompDirectiveFilterFileExt 8 +   set -l shellCompDirectiveFilterDirs 16 +   +   if test -z "$directive" +   set directive 0 +   end +   +   set -l compErr (math (math --scale 0 $directive / $shellCompDirectiveError) % 2) +   if test $compErr -eq 1 +   __fleek_debug "Received error directive: aborting." +   # Might as well do file completion, in case it helps +   return 1 +   end +   +   set -l filefilter (math (math --scale 0 $directive / $shellCompDirectiveFilterFileExt) % 2) +   set -l dirfilter (math (math --scale 0 $directive / $shellCompDirectiveFilterDirs) % 2) +   if test $filefilter -eq 1; or test $dirfilter -eq 1 +   __fleek_debug "File extension filtering or directory filtering not supported" +   # Do full file completion instead +   return 1 +   end +   +   set -l nospace (math (math --scale 0 $directive / $shellCompDirectiveNoSpace) % 2) +   set -l nofiles (math (math --scale 0 $directive / $shellCompDirectiveNoFileComp) % 2) +   +   __fleek_debug "nospace: $nospace, nofiles: $nofiles" +   +   # If we want to prevent a space, or if file completion is NOT disabled, +   # we need to count the number of valid completions. +   # To do so, we will filter on prefix as the completions we have received +   # may not already be filtered so as to allow fish to match on different +   # criteria than the prefix. +   if test $nospace -ne 0; or test $nofiles -eq 0 +   set -l prefix (commandline -t | string escape --style=regex) +   __fleek_debug "prefix: $prefix" +   +   set -l completions (string match -r -- "^$prefix.*" $__fleek_comp_results) +   set --global __fleek_comp_results $completions +   __fleek_debug "Filtered completions are: $__fleek_comp_results" +   +   # Important not to quote the variable for count to work +   set -l numComps (count $__fleek_comp_results) +   __fleek_debug "numComps: $numComps" +   +   if test $numComps -eq 1; and test $nospace -ne 0 +   # We must first split on \t to get rid of the descriptions to be +   # able to check what the actual completion will be. +   # We don't need descriptions anyway since there is only a single +   # real completion which the shell will expand immediately. +   set -l split (string split --max 1 \t $__fleek_comp_results[1]) +   +   # Fish won't add a space if the completion ends with any +   # of the following characters: @=/:., +   set -l lastChar (string sub -s -1 -- $split) +   if not string match -r -q "[@=/:.,]" -- "$lastChar" +   # In other cases, to support the "nospace" directive we trick the shell +   # by outputting an extra, longer completion. +   __fleek_debug "Adding second completion to perform nospace directive" +   set --global __fleek_comp_results $split[1] $split[1]. +   __fleek_debug "Completions are now: $__fleek_comp_results" +   end +   end +   +   if test $numComps -eq 0; and test $nofiles -eq 0 +   # To be consistent with bash and zsh, we only trigger file +   # completion when there are no other completions +   __fleek_debug "Requesting file completion" +   return 1 +   end +   end +   +   return 0 +  end +   +  # 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. +  # Only do this if the program can be found, or else fish may print some errors; besides, +  # the existing completions will only be loaded if the program can be found. +  if type -q "fleek" +   # The space after the program name is essential to trigger completion for the program +   # and not completion of the program name itself. +   # Also, we use '> /dev/null 2>&1' since '&>' is not supported in older versions of fish. +   complete --do-complete "fleek " > /dev/null 2>&1 +  end +   +  # Remove any pre-existing completions for the program since we will be handling all of them. +  complete -c fleek -e +   +  # this will get called after the two calls below and clear the $__fleek_perform_completion_once_result global +  complete -c fleek -n '__fleek_clear_perform_completion_once_result' +  # The call to __fleek_prepare_completions will setup __fleek_comp_results +  # which provides the program's completion choices. +  # If this doesn't require order preservation, we don't use the -k flag +  complete -c fleek -n 'not __fleek_requires_order_preservation && __fleek_prepare_completions' -f -a '$__fleek_comp_results' +  # otherwise we use the -k flag +  complete -k -c fleek -n '__fleek_requires_order_preservation && __fleek_prepare_completions' -f -a '$__fleek_comp_results' diff --git a/completions/fleek.zsh b/completions/fleek.zsh index 30204568..c22f816c 100644 --- a/completions/fleek.zsh +++ b/completions/fleek.zsh @@ -1,205 +1,212 @@ -#compdef fleek - -# zsh completion for fleek -*- shell-script -*- - -__fleek_debug() -{ - local file="$BASH_COMP_DEBUG_FILE" - if [[ -n ${file} ]]; then - echo "$*" >> "${file}" - fi -} - -_fleek() -{ - local shellCompDirectiveError=1 - local shellCompDirectiveNoSpace=2 - local shellCompDirectiveNoFileComp=4 - local shellCompDirectiveFilterFileExt=8 - local shellCompDirectiveFilterDirs=16 - - local lastParam lastChar flagPrefix requestComp out directive comp lastComp noSpace - local -a completions - - __fleek_debug "\n========= starting completion logic ==========" - __fleek_debug "CURRENT: ${CURRENT}, words[*]: ${words[*]}" - - # The user could have moved the cursor backwards on the command-line. - # We need to trigger completion from the $CURRENT location, so we need - # to truncate the command-line ($words) up to the $CURRENT location. - # (We cannot use $CURSOR as its value does not work when a command is an alias.) - words=("${=words[1,CURRENT]}") - __fleek_debug "Truncated words[*]: ${words[*]}," - - lastParam=${words[-1]} - lastChar=${lastParam[-1]} - __fleek_debug "lastParam: ${lastParam}, lastChar: ${lastChar}" - - # For zsh, when completing a flag with an = (e.g., fleek -n=) - # completions must be prefixed with the flag - setopt local_options BASH_REMATCH - if [[ "${lastParam}" =~ '-.*=' ]]; then - # We are dealing with a flag with an = - flagPrefix="-P ${BASH_REMATCH}" - fi - - # Prepare the command to obtain completions - requestComp="${words[1]} __complete ${words[2,-1]}" - if [ "${lastChar}" = "" ]; then - # If the last parameter is complete (there is a space following it) - # We add an extra empty parameter so we can indicate this to the go completion code. - __fleek_debug "Adding extra empty parameter" - requestComp="${requestComp} \"\"" - fi - - __fleek_debug "About to call: eval ${requestComp}" - - # Use eval to handle any environment variables and such - out=$(eval ${requestComp} 2>/dev/null) - __fleek_debug "completion output: ${out}" - - # Extract the directive integer following a : from the last line - local lastLine - while IFS='\n' read -r line; do - lastLine=${line} - done < <(printf "%s\n" "${out[@]}") - __fleek_debug "last line: ${lastLine}" - - if [ "${lastLine[1]}" = : ]; then - directive=${lastLine[2,-1]} - # Remove the directive including the : and the newline - local suffix - (( suffix=${#lastLine}+2)) - out=${out[1,-$suffix]} - else - # There is no directive specified. Leave $out as is. - __fleek_debug "No directive found. Setting do default" - directive=0 - fi - - __fleek_debug "directive: ${directive}" - __fleek_debug "completions: ${out}" - __fleek_debug "flagPrefix: ${flagPrefix}" - - if [ $((directive & shellCompDirectiveError)) -ne 0 ]; then - __fleek_debug "Completion received error. Ignoring completions." - return - fi - - local activeHelpMarker="_activeHelp_ " - local endIndex=${#activeHelpMarker} - local startIndex=$((${#activeHelpMarker}+1)) - local hasActiveHelp=0 - while IFS='\n' read -r comp; do - # Check if this is an activeHelp statement (i.e., prefixed with $activeHelpMarker) - if [ "${comp[1,$endIndex]}" = "$activeHelpMarker" ];then - __fleek_debug "ActiveHelp found: $comp" - comp="${comp[$startIndex,-1]}" - if [ -n "$comp" ]; then - compadd -x "${comp}" - __fleek_debug "ActiveHelp will need delimiter" - hasActiveHelp=1 - fi - - continue - fi - - if [ -n "$comp" ]; then - # If requested, completions are returned with a description. - # The description is preceded by a TAB character. - # For zsh's _describe, we need to use a : instead of a TAB. - # We first need to escape any : as part of the completion itself. - comp=${comp//:/\\:} - - local tab="$(printf '\t')" - comp=${comp//$tab/:} - - __fleek_debug "Adding completion: ${comp}" - completions+=${comp} - lastComp=$comp - fi - done < <(printf "%s\n" "${out[@]}") - - # Add a delimiter after the activeHelp statements, but only if: - # - there are completions following the activeHelp statements, or - # - file completion will be performed (so there will be choices after the activeHelp) - if [ $hasActiveHelp -eq 1 ]; then - if [ ${#completions} -ne 0 ] || [ $((directive & shellCompDirectiveNoFileComp)) -eq 0 ]; then - __fleek_debug "Adding activeHelp delimiter" - compadd -x "--" - hasActiveHelp=0 - fi - fi - - if [ $((directive & shellCompDirectiveNoSpace)) -ne 0 ]; then - __fleek_debug "Activating nospace." - noSpace="-S ''" - fi - - if [ $((directive & shellCompDirectiveFilterFileExt)) -ne 0 ]; then - # File extension filtering - local filteringCmd - filteringCmd='_files' - for filter in ${completions[@]}; do - if [ ${filter[1]} != '*' ]; then - # zsh requires a glob pattern to do file filtering - filter="\*.$filter" - fi - filteringCmd+=" -g $filter" - done - filteringCmd+=" ${flagPrefix}" - - __fleek_debug "File filtering command: $filteringCmd" - _arguments '*:filename:'"$filteringCmd" - elif [ $((directive & shellCompDirectiveFilterDirs)) -ne 0 ]; then - # File completion for directories only - local subdir - subdir="${completions[1]}" - if [ -n "$subdir" ]; then - __fleek_debug "Listing directories in $subdir" - pushd "${subdir}" >/dev/null 2>&1 - else - __fleek_debug "Listing directories in ." - fi - - local result - _arguments '*:dirname:_files -/'" ${flagPrefix}" - result=$? - if [ -n "$subdir" ]; then - popd >/dev/null 2>&1 - fi - return $result - else - __fleek_debug "Calling _describe" - if eval _describe "completions" completions $flagPrefix $noSpace; then - __fleek_debug "_describe found some completions" - - # Return the success of having called _describe - return 0 - else - __fleek_debug "_describe did not find completions." - __fleek_debug "Checking if we should do file completion." - if [ $((directive & shellCompDirectiveNoFileComp)) -ne 0 ]; then - __fleek_debug "deactivating file completion" - - # We must return an error code here to let zsh know that there were no - # completions found by _describe; this is what will trigger other - # matching algorithms to attempt to find completions. - # For example zsh can match letters in the middle of words. - return 1 - else - # Perform file completion - __fleek_debug "Activating file completion" - - # We must return the result of this command, so it must be the - # last command, or else we must store its result to return it. - _arguments '*:filename:_files'" ${flagPrefix}" - fi - fi - fi -} - -# don't run the completion function when being source-ed or eval-ed -if [ "$funcstack[1]" = "_fleek" ]; then - _fleek -fi + [i]  #compdef fleek +  compdef _fleek fleek +   +  # zsh completion for fleek -*- shell-script -*- +   +  __fleek_debug() +  { +   local file="$BASH_COMP_DEBUG_FILE" +   if [[ -n ${file} ]]; then +   echo "$*" >> "${file}" +   fi +  } +   +  _fleek() +  { +   local shellCompDirectiveError=1 +   local shellCompDirectiveNoSpace=2 +   local shellCompDirectiveNoFileComp=4 +   local shellCompDirectiveFilterFileExt=8 +   local shellCompDirectiveFilterDirs=16 +   local shellCompDirectiveKeepOrder=32 +   +   local lastParam lastChar flagPrefix requestComp out directive comp lastComp noSpace keepOrder +   local -a completions +   +   __fleek_debug "\n========= starting completion logic ==========" +   __fleek_debug "CURRENT: ${CURRENT}, words[*]: ${words[*]}" +   +   # The user could have moved the cursor backwards on the command-line. +   # We need to trigger completion from the $CURRENT location, so we need +   # to truncate the command-line ($words) up to the $CURRENT location. +   # (We cannot use $CURSOR as its value does not work when a command is an alias.) +   words=("${=words[1,CURRENT]}") +   __fleek_debug "Truncated words[*]: ${words[*]}," +   +   lastParam=${words[-1]} +   lastChar=${lastParam[-1]} +   __fleek_debug "lastParam: ${lastParam}, lastChar: ${lastChar}" +   +   # For zsh, when completing a flag with an = (e.g., fleek -n=) +   # completions must be prefixed with the flag +   setopt local_options BASH_REMATCH +   if [[ "${lastParam}" =~ '-.*=' ]]; then +   # We are dealing with a flag with an = +   flagPrefix="-P ${BASH_REMATCH}" +   fi +   +   # Prepare the command to obtain completions +   requestComp="${words[1]} __complete ${words[2,-1]}" +   if [ "${lastChar}" = "" ]; then +   # If the last parameter is complete (there is a space following it) +   # We add an extra empty parameter so we can indicate this to the go completion code. +   __fleek_debug "Adding extra empty parameter" +   requestComp="${requestComp} \"\"" +   fi +   +   __fleek_debug "About to call: eval ${requestComp}" +   +   # Use eval to handle any environment variables and such +   out=$(eval ${requestComp} 2>/dev/null) +   __fleek_debug "completion output: ${out}" +   +   # Extract the directive integer following a : from the last line +   local lastLine +   while IFS='\n' read -r line; do +   lastLine=${line} +   done < <(printf "%s\n" "${out[@]}") +   __fleek_debug "last line: ${lastLine}" +   +   if [ "${lastLine[1]}" = : ]; then +   directive=${lastLine[2,-1]} +   # Remove the directive including the : and the newline +   local suffix +   (( suffix=${#lastLine}+2)) +   out=${out[1,-$suffix]} +   else +   # There is no directive specified. Leave $out as is. +   __fleek_debug "No directive found. Setting do default" +   directive=0 +   fi +   +   __fleek_debug "directive: ${directive}" +   __fleek_debug "completions: ${out}" +   __fleek_debug "flagPrefix: ${flagPrefix}" +   +   if [ $((directive & shellCompDirectiveError)) -ne 0 ]; then +   __fleek_debug "Completion received error. Ignoring completions." +   return +   fi +   +   local activeHelpMarker="_activeHelp_ " +   local endIndex=${#activeHelpMarker} +   local startIndex=$((${#activeHelpMarker}+1)) +   local hasActiveHelp=0 +   while IFS='\n' read -r comp; do +   # Check if this is an activeHelp statement (i.e., prefixed with $activeHelpMarker) +   if [ "${comp[1,$endIndex]}" = "$activeHelpMarker" ];then +   __fleek_debug "ActiveHelp found: $comp" +   comp="${comp[$startIndex,-1]}" +   if [ -n "$comp" ]; then +   compadd -x "${comp}" +   __fleek_debug "ActiveHelp will need delimiter" +   hasActiveHelp=1 +   fi +   +   continue +   fi +   +   if [ -n "$comp" ]; then +   # If requested, completions are returned with a description. +   # The description is preceded by a TAB character. +   # For zsh's _describe, we need to use a : instead of a TAB. +   # We first need to escape any : as part of the completion itself. +   comp=${comp//:/\\:} +   +   local tab="$(printf '\t')" +   comp=${comp//$tab/:} +   +   __fleek_debug "Adding completion: ${comp}" +   completions+=${comp} +   lastComp=$comp +   fi +   done < <(printf "%s\n" "${out[@]}") +   +   # Add a delimiter after the activeHelp statements, but only if: +   # - there are completions following the activeHelp statements, or +   # - file completion will be performed (so there will be choices after the activeHelp) +   if [ $hasActiveHelp -eq 1 ]; then +   if [ ${#completions} -ne 0 ] || [ $((directive & shellCompDirectiveNoFileComp)) -eq 0 ]; then +   __fleek_debug "Adding activeHelp delimiter" +   compadd -x "--" +   hasActiveHelp=0 +   fi +   fi +   +   if [ $((directive & shellCompDirectiveNoSpace)) -ne 0 ]; then +   __fleek_debug "Activating nospace." +   noSpace="-S ''" +   fi +   +   if [ $((directive & shellCompDirectiveKeepOrder)) -ne 0 ]; then +   __fleek_debug "Activating keep order." +   keepOrder="-V" +   fi +   +   if [ $((directive & shellCompDirectiveFilterFileExt)) -ne 0 ]; then +   # File extension filtering +   local filteringCmd +   filteringCmd='_files' +   for filter in ${completions[@]}; do +   if [ ${filter[1]} != '*' ]; then +   # zsh requires a glob pattern to do file filtering +   filter="\*.$filter" +   fi +   filteringCmd+=" -g $filter" +   done +   filteringCmd+=" ${flagPrefix}" +   +   __fleek_debug "File filtering command: $filteringCmd" +   _arguments '*:filename:'"$filteringCmd" +   elif [ $((directive & shellCompDirectiveFilterDirs)) -ne 0 ]; then +   # File completion for directories only +   local subdir +   subdir="${completions[1]}" +   if [ -n "$subdir" ]; then +   __fleek_debug "Listing directories in $subdir" +   pushd "${subdir}" >/dev/null 2>&1 +   else +   __fleek_debug "Listing directories in ." +   fi +   +   local result +   _arguments '*:dirname:_files -/'" ${flagPrefix}" +   result=$? +   if [ -n "$subdir" ]; then +   popd >/dev/null 2>&1 +   fi +   return $result +   else +   __fleek_debug "Calling _describe" +   if eval _describe $keepOrder "completions" completions $flagPrefix $noSpace; then +   __fleek_debug "_describe found some completions" +   +   # Return the success of having called _describe +   return 0 +   else +   __fleek_debug "_describe did not find completions." +   __fleek_debug "Checking if we should do file completion." +   if [ $((directive & shellCompDirectiveNoFileComp)) -ne 0 ]; then +   __fleek_debug "deactivating file completion" +   +   # We must return an error code here to let zsh know that there were no +   # completions found by _describe; this is what will trigger other +   # matching algorithms to attempt to find completions. +   # For example zsh can match letters in the middle of words. +   return 1 +   else +   # Perform file completion +   __fleek_debug "Activating file completion" +   +   # We must return the result of this command, so it must be the +   # last command, or else we must store its result to return it. +   _arguments '*:filename:_files'" ${flagPrefix}" +   fi +   fi +   fi +  } +   +  # don't run the completion function when being source-ed or eval-ed +  if [ "$funcstack[1]" = "_fleek" ]; then +   _fleek +  fi diff --git a/internal/flake/flake.go b/internal/flake/flake.go index 85fc1874..c1d1e18c 100644 --- a/internal/flake/flake.go +++ b/internal/flake/flake.go @@ -279,7 +279,6 @@ func (f *Flake) Write(includeSystems bool, message string) error { } var bling *fleek.Bling - fmt.Println(f.Config.Bling) switch f.Config.Bling { case "high": bling, err = fleek.HighBling() @@ -295,7 +294,7 @@ func (f *Flake) Write(includeSystems bool, message string) error { if err != nil { return err } - fmt.Println(bling.Name) + data := Data{ Config: f.Config, Bling: bling, @@ -463,7 +462,6 @@ func (f *Flake) Apply() error { func (f *Flake) runNix(cmd string, cmdLine []string) ([]byte, error) { command := exec.Command(cmd, cmdLine...) command.Stdin = os.Stdin - fmt.Println(f.Config.UserFlakeDir()) command.Dir = f.Config.UserFlakeDir() command.Env = os.Environ() if f.Config.Unfree { diff --git a/internal/fleekcli/eject.go b/internal/fleekcli/eject.go index 92d59055..b1d418a4 100644 --- a/internal/fleekcli/eject.go +++ b/internal/fleekcli/eject.go @@ -60,7 +60,7 @@ func eject(cmd *cobra.Command) error { return err } // TODO app trans - fin.Info.Println("Run the following commands from the flake directory to apply your changes:") + fin.Info.Println(app.Trans("generate.runFlake")) for _, system := range fl.Config.Systems { // nix run --impure home-manager/master -- -b bak switch --flake .#bjk@ghanima diff --git a/internal/fleekcli/generate.go b/internal/fleekcli/generate.go index 45458da5..7883e48f 100644 --- a/internal/fleekcli/generate.go +++ b/internal/fleekcli/generate.go @@ -101,7 +101,7 @@ func generate(cmd *cobra.Command) error { return nil } // TODO app trans - fin.Info.Println("Run the following commands from the flake directory to apply your changes:") + fin.Info.Println(app.Trans("generate.runFlake")) for _, system := range fl.Config.Systems { // nix run --impure home-manager/master -- -b bak switch --flake .#bjk@ghanima diff --git a/locales/en.yml b/locales/en.yml index c5e9a783..00892119 100644 --- a/locales/en.yml +++ b/locales/en.yml @@ -53,6 +53,7 @@ generate: locationFlagDescription: "location of home-manager configuration, relative to home" levelFlag: "level" levelFlagDescription: "bling level: `none`,`low`,`default`,`high`" + runFlake: "Run the following commands from the flake directory to apply your changes:" apply: use: "apply" long: | diff --git a/man/en/man1/fleek.1.gz b/man/en/man1/fleek.1.gz index 378cf6ce..b70fee8e 100644 Binary files a/man/en/man1/fleek.1.gz and b/man/en/man1/fleek.1.gz differ diff --git a/man/pt/man1/fleek.1.gz b/man/pt/man1/fleek.1.gz index 6ccb8b3f..5460368b 100644 Binary files a/man/pt/man1/fleek.1.gz and b/man/pt/man1/fleek.1.gz differ