From 434ff125f05657a8f198c316c18f8626c262e7e9 Mon Sep 17 00:00:00 2001 From: Bart Schaefer Date: Mon, 16 Jan 2006 16:32:43 +0000 Subject: 22110: more intelligent su completion --- ChangeLog | 6 ++++ Completion/Unix/Command/_su | 73 +++++++++++++++++++++++++++++++++++++-------- 2 files changed, 67 insertions(+), 12 deletions(-) diff --git a/ChangeLog b/ChangeLog index 3627033c2..2e1f975d8 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2006-01-16 Bart Schaefer + + * 22110 (slightly tweaked): Completion/Unix/Command/_su: complete + options, be more clever about determining the shell being used, + and treat the argument of the -c option as a command (cf. _sh). + 2006-01-13 Wayne Davison * 22162: Src/prompt.c, Src/Modules/datetime.c, Src/Modules/stat.c: diff --git a/Completion/Unix/Command/_su b/Completion/Unix/Command/_su index 24fb5932e..6d0f2cd9f 100644 --- a/Completion/Unix/Command/_su +++ b/Completion/Unix/Command/_su @@ -1,20 +1,69 @@ #compdef su -local shell comp name usr base +local -A opt_args +local -a args state context +local shell=${words[(i)(-s|--shell=*)]} first='1:user name:_users' +local usr=root line -[[ $words[2] != - ]] -(( base=$?+2 )) +if _pick_variant gnu="Free Software Foundation" unix --version; then + args=( + '(--command)-c[pass command to shell]:command string:->command' + '(-c)--command=-[pass command to shell]:command string:->command' + '-f[pass -f to shell (csh)]' + '(--login)-l[use a login shell]' + '(-l)--login[use a login shell]' + '(-p --preserve-environment)-m[do not reset environment]' + '(-m --preserve-environment)-p[do not reset environment]' + '(-m -p)--preserve-environment[do not reset environment]' + '(--shell)-s[run the specified shell]:shell:->shell' + '(-s)--shell=-[run the specified shell]:shell:->shell' + ) +else + args=( + '-c[pass command to shell]:command string:->command' + '-l[use a login shell]' + '-s[run the specified shell]:shell:->shell' + ) +fi + +if [[ $#words -ge 2 && $words[2] != -* && CURRENT -ne 2 ]]; then + usr=$words[2] + first= +fi -if [[ CURRENT -eq base ]]; then - _users && return - usr=root -elif [[ CURRENT -ge base+1 ]]; then - usr=$words[base] +[[ $words[shell] == -s ]] && ((shell++)) + +if [[ CURRENT -ne shell && -n ${words[shell]} ]]; then + shell=${words[shell]#*=} else - return + shell="${${(M@)${(@f)$(rest" && return + +case $state in + (command) + compset -q + _normal + return + ;; + (shell) + compadd ${(f)^"$(