github.com/AbhinandanKurakure/podman/v3@v3.4.10/completions/zsh/_podman (about) 1 #compdef _podman podman 2 3 # zsh completion for podman -*- shell-script -*- 4 5 __podman_debug() 6 { 7 local file="$BASH_COMP_DEBUG_FILE" 8 if [[ -n ${file} ]]; then 9 echo "$*" >> "${file}" 10 fi 11 } 12 13 _podman() 14 { 15 local shellCompDirectiveError=1 16 local shellCompDirectiveNoSpace=2 17 local shellCompDirectiveNoFileComp=4 18 local shellCompDirectiveFilterFileExt=8 19 local shellCompDirectiveFilterDirs=16 20 21 local lastParam lastChar flagPrefix requestComp out directive comp lastComp noSpace 22 local -a completions 23 24 __podman_debug "\n========= starting completion logic ==========" 25 __podman_debug "CURRENT: ${CURRENT}, words[*]: ${words[*]}" 26 27 # The user could have moved the cursor backwards on the command-line. 28 # We need to trigger completion from the $CURRENT location, so we need 29 # to truncate the command-line ($words) up to the $CURRENT location. 30 # (We cannot use $CURSOR as its value does not work when a command is an alias.) 31 words=("${=words[1,CURRENT]}") 32 __podman_debug "Truncated words[*]: ${words[*]}," 33 34 lastParam=${words[-1]} 35 lastChar=${lastParam[-1]} 36 __podman_debug "lastParam: ${lastParam}, lastChar: ${lastChar}" 37 38 # For zsh, when completing a flag with an = (e.g., podman -n=<TAB>) 39 # completions must be prefixed with the flag 40 setopt local_options BASH_REMATCH 41 if [[ "${lastParam}" =~ '-.*=' ]]; then 42 # We are dealing with a flag with an = 43 flagPrefix="-P ${BASH_REMATCH}" 44 fi 45 46 # Prepare the command to obtain completions 47 requestComp="${words[1]} __complete ${words[2,-1]}" 48 if [ "${lastChar}" = "" ]; then 49 # If the last parameter is complete (there is a space following it) 50 # We add an extra empty parameter so we can indicate this to the go completion code. 51 __podman_debug "Adding extra empty parameter" 52 requestComp="${requestComp} \"\"" 53 fi 54 55 __podman_debug "About to call: eval ${requestComp}" 56 57 # Use eval to handle any environment variables and such 58 out=$(eval ${requestComp} 2>/dev/null) 59 __podman_debug "completion output: ${out}" 60 61 # Extract the directive integer following a : from the last line 62 local lastLine 63 while IFS='\n' read -r line; do 64 lastLine=${line} 65 done < <(printf "%s\n" "${out[@]}") 66 __podman_debug "last line: ${lastLine}" 67 68 if [ "${lastLine[1]}" = : ]; then 69 directive=${lastLine[2,-1]} 70 # Remove the directive including the : and the newline 71 local suffix 72 (( suffix=${#lastLine}+2)) 73 out=${out[1,-$suffix]} 74 else 75 # There is no directive specified. Leave $out as is. 76 __podman_debug "No directive found. Setting do default" 77 directive=0 78 fi 79 80 __podman_debug "directive: ${directive}" 81 __podman_debug "completions: ${out}" 82 __podman_debug "flagPrefix: ${flagPrefix}" 83 84 if [ $((directive & shellCompDirectiveError)) -ne 0 ]; then 85 __podman_debug "Completion received error. Ignoring completions." 86 return 87 fi 88 89 while IFS='\n' read -r comp; do 90 if [ -n "$comp" ]; then 91 # If requested, completions are returned with a description. 92 # The description is preceded by a TAB character. 93 # For zsh's _describe, we need to use a : instead of a TAB. 94 # We first need to escape any : as part of the completion itself. 95 comp=${comp//:/\\:} 96 97 local tab=$(printf '\t') 98 comp=${comp//$tab/:} 99 100 __podman_debug "Adding completion: ${comp}" 101 completions+=${comp} 102 lastComp=$comp 103 fi 104 done < <(printf "%s\n" "${out[@]}") 105 106 if [ $((directive & shellCompDirectiveNoSpace)) -ne 0 ]; then 107 __podman_debug "Activating nospace." 108 noSpace="-S ''" 109 fi 110 111 if [ $((directive & shellCompDirectiveFilterFileExt)) -ne 0 ]; then 112 # File extension filtering 113 local filteringCmd 114 filteringCmd='_files' 115 for filter in ${completions[@]}; do 116 if [ ${filter[1]} != '*' ]; then 117 # zsh requires a glob pattern to do file filtering 118 filter="\*.$filter" 119 fi 120 filteringCmd+=" -g $filter" 121 done 122 filteringCmd+=" ${flagPrefix}" 123 124 __podman_debug "File filtering command: $filteringCmd" 125 _arguments '*:filename:'"$filteringCmd" 126 elif [ $((directive & shellCompDirectiveFilterDirs)) -ne 0 ]; then 127 # File completion for directories only 128 local subDir 129 subdir="${completions[1]}" 130 if [ -n "$subdir" ]; then 131 __podman_debug "Listing directories in $subdir" 132 pushd "${subdir}" >/dev/null 2>&1 133 else 134 __podman_debug "Listing directories in ." 135 fi 136 137 local result 138 _arguments '*:dirname:_files -/'" ${flagPrefix}" 139 result=$? 140 if [ -n "$subdir" ]; then 141 popd >/dev/null 2>&1 142 fi 143 return $result 144 else 145 __podman_debug "Calling _describe" 146 if eval _describe "completions" completions $flagPrefix $noSpace; then 147 __podman_debug "_describe found some completions" 148 149 # Return the success of having called _describe 150 return 0 151 else 152 __podman_debug "_describe did not find completions." 153 __podman_debug "Checking if we should do file completion." 154 if [ $((directive & shellCompDirectiveNoFileComp)) -ne 0 ]; then 155 __podman_debug "deactivating file completion" 156 157 # We must return an error code here to let zsh know that there were no 158 # completions found by _describe; this is what will trigger other 159 # matching algorithms to attempt to find completions. 160 # For example zsh can match letters in the middle of words. 161 return 1 162 else 163 # Perform file completion 164 __podman_debug "Activating file completion" 165 166 # We must return the result of this command, so it must be the 167 # last command, or else we must store its result to return it. 168 _arguments '*:filename:_files'" ${flagPrefix}" 169 fi 170 fi 171 fi 172 } 173 174 # don't run the completion function when being source-ed or eval-ed 175 if [ "$funcstack[1]" = "_podman" ]; then 176 _podman 177 fi 178 179 # This file is generated with "podman completion"; see: podman-completion(1)