mirror of
git://git.code.sf.net/p/zsh/code
synced 2025-07-20 19:51:02 +02:00
41564: _tmux: Complete environment variables and their values for set-environment and show-environment.
Also, teach show-environment not to offer --options after positional arguments.
This commit is contained in:
parent
9a4fb22d89
commit
eb6c012f64
2 changed files with 98 additions and 5 deletions
|
@ -1,5 +1,9 @@
|
|||
2017-08-30 Daniel Shahaf <d.s@daniel.shahaf.name>
|
||||
|
||||
* 41564: Completion/Unix/Command/_tmux: Complete environment
|
||||
variables and their values for set-environment and
|
||||
show-environment.
|
||||
|
||||
* 41557: Completion/Unix/Command/_tmux: show-environment,
|
||||
set-environment: Make -g,-t mutually exclusive.
|
||||
|
||||
|
|
|
@ -732,12 +732,33 @@ _tmux-set-buffer() {
|
|||
|
||||
_tmux-set-environment() {
|
||||
[[ -n ${tmux_describe} ]] && print "(un)set an environment variable" && return
|
||||
_arguments -s -A "-*" -S \
|
||||
local mode=session action=add
|
||||
local curcontext="$curcontext" state line ret=1
|
||||
typeset -A opt_args
|
||||
_arguments -C -s -A "-*" -S : \
|
||||
'(-t)-g[modify global environment]' \
|
||||
'-r[remove variable before starting new processes]' \
|
||||
'-u[unset a variable]' \
|
||||
'(-u)-r[remove variable before starting new processes]' \
|
||||
'(-r)-u[unset a variable]' \
|
||||
'(-g)-t[specify target session]:target session:__tmux-sessions' \
|
||||
':name' ':value'
|
||||
': :->name' '(-u -r)2: :->value' && ret=0
|
||||
|
||||
if (( ${+opt_args[-g]} )); then
|
||||
mode=global
|
||||
fi
|
||||
if (( ${+opt_args[-u]} )); then
|
||||
action=unset
|
||||
fi
|
||||
if (( ${+opt_args[-r]} )); then
|
||||
action=remove
|
||||
fi
|
||||
|
||||
# TODO: the exclusion "(-g -r)2:" doesn't work, so simulate it here
|
||||
if [[ $action == (remove|unset) ]] && [[ $state == value ]]; then
|
||||
__tmux-nothing-else
|
||||
else
|
||||
__tmux-environment-variables $mode $state $action && ret=0
|
||||
fi
|
||||
return ret
|
||||
}
|
||||
|
||||
_tmux-set-option() {
|
||||
|
@ -804,10 +825,21 @@ _tmux-show-buffer() {
|
|||
|
||||
_tmux-show-environment() {
|
||||
[[ -n ${tmux_describe} ]] && print "display the environment" && return
|
||||
_arguments -s \
|
||||
local mode=session
|
||||
local curcontext="$curcontext" state line ret=1
|
||||
typeset -A opt_args
|
||||
_arguments -C -A "-*" -s : \
|
||||
'(-t)-g[show global environment]' \
|
||||
'-s[format output as Bourne shell commands]' \
|
||||
'(-g)-t+[specify target session]:target session:__tmux-sessions' \
|
||||
'1:: :->name' && ret=0
|
||||
|
||||
if (( ${+opt_args[-g]} )); then
|
||||
mode=global
|
||||
fi
|
||||
|
||||
__tmux-environment-variables $mode $state show && ret=0
|
||||
return ret
|
||||
}
|
||||
|
||||
_tmux-show-messages() {
|
||||
|
@ -997,6 +1029,63 @@ function __tmux-clients() {
|
|||
_describe -t clients 'clients' clients
|
||||
}
|
||||
|
||||
function __tmux-environment-variables() {
|
||||
local mode="$1" state="$2" action="$3"
|
||||
|
||||
local -a dash_g
|
||||
case $mode in
|
||||
(global) dash_g=(-g);;
|
||||
(session) dash_g=();;
|
||||
(*) return 1;; # bug in the caller
|
||||
esac
|
||||
|
||||
local hint
|
||||
case $action in
|
||||
(add|remove) hint=" (or specify a new one)";;
|
||||
(unset|show) hint="";;
|
||||
(*) return 1;; # bug in the caller
|
||||
esac
|
||||
|
||||
case ${state} in
|
||||
(name)
|
||||
local -a vars_and_vals=( ${(@f)"$(command tmux 2>/dev/null show-env $dash_g)"} )
|
||||
local -a descriptions
|
||||
local k_v k v
|
||||
for k_v in $vars_and_vals; do
|
||||
k=${k_v%%=*}
|
||||
if [[ $k == -* ]]; then
|
||||
k=${k#-}
|
||||
v='(remove)'
|
||||
else
|
||||
v=${k_v#*=}
|
||||
fi
|
||||
descriptions+=( "${k//:/\\:}:$v" )
|
||||
done
|
||||
# TODO: this if/else is because '_describe ${hint:+"-x"}' prints the "No matches" error in addition to the message.
|
||||
local msg="${dash_g[1]:+"global "}environment variables${hint}"
|
||||
if _describe -t parameters $msg descriptions; then
|
||||
:
|
||||
elif [[ -n $hint ]]; then
|
||||
_message $msg
|
||||
fi
|
||||
;;
|
||||
(value)
|
||||
local var_and_val=${(@f)"$(command tmux 2>/dev/null show-env $dash_g -- ${(Q)words[-2]})"}
|
||||
# TODO: this if/else is because '_description -x' prints the "No matches" error in addition to the message.
|
||||
if [[ -n $var_and_val ]]; then
|
||||
local -a expl
|
||||
_description -x parameter-values expl "Value for ${words[-2]}"
|
||||
compadd "$expl[@]" - ${var_and_val#*=}
|
||||
else
|
||||
_message "Value for ${words[-2]}"
|
||||
fi
|
||||
;;
|
||||
(*)
|
||||
return 1
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
function __tmux-format() {
|
||||
_message 'not implemented yet'
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue