From c435a8cc618dba0d149405959d65da130e0982e0 Mon Sep 17 00:00:00 2001 From: Mikael Magnusson Date: Mon, 14 May 2012 15:32:26 +0000 Subject: 30466: Add prompt format and printf format completion. --- ChangeLog | 8 ++- Completion/Unix/Type/.distfiles | 1 + Completion/Unix/Type/_ps1234 | 109 +++++++++++++++++++++++++++++++++++++ Completion/Zsh/Command/_print | 116 +++++++++++++++++++++++++++++----------- 4 files changed, 201 insertions(+), 33 deletions(-) create mode 100644 Completion/Unix/Type/_ps1234 diff --git a/ChangeLog b/ChangeLog index 279daefcc..adb071f08 100644 --- a/ChangeLog +++ b/ChangeLog @@ -2,6 +2,12 @@ * 30468: Functions/Prompts/prompt_fade_setup: add missing $. + * 30466: Completion/Unix/Type/.distfiles, + Completion/Unix/Type/_ps1234, Completion/Zsh/Command/_print: + Add new completer for prompt format specifiers and hook it up + to print -P and assigning to the various prompt parameters. + Add completion for printf and print -f formats. + 2012-05-08 Barton E. Schaefer * unposted, see users/17062: Doc/Zsh/contrib.yo: Briefly describe @@ -16294,5 +16300,5 @@ ***************************************************** * This is used by the shell to define $ZSH_PATCHLEVEL -* $Revision: 1.5651 $ +* $Revision: 1.5652 $ ***************************************************** diff --git a/Completion/Unix/Type/.distfiles b/Completion/Unix/Type/.distfiles index 4c0d688ac..a9dc0d147 100644 --- a/Completion/Unix/Type/.distfiles +++ b/Completion/Unix/Type/.distfiles @@ -36,6 +36,7 @@ _pids _ports _printers _ps +_ps1234 _pspdf _services _signals diff --git a/Completion/Unix/Type/_ps1234 b/Completion/Unix/Type/_ps1234 new file mode 100644 index 000000000..13c90b50c --- /dev/null +++ b/Completion/Unix/Type/_ps1234 @@ -0,0 +1,109 @@ +#compdef -value-,PROMPT,-default- -value-,PROMPT2,-default- -value-,PROMPT3,-default- -value-,PROMPT4,-default- -value-,RPROMPT,-default- -value-,RPROMPT2,-default- -value-,PS1,-default- -value-,PS2,-default- -value-,PS3,-default- -value-,PS4,-default- -value-,RPS1,-default- -value-,RPS2,-default- -value-,SPROMPT,-default- + +local -a specs +local expl paren + +if [[ -n $compstate[quote] ]]; then + paren='(' +else + paren='\(' +fi + +if [[ $PREFIX == *%(-|)<-># ]]; then + specs=( + 'm:hostname up to first .' + '_:status of parser' + 'd:current working directory' + '/:current working directory' + '~:current working directory, with ~ replacement' + 'N:name of current script or shell function' + 'x:name of file containing code being executed' + 'c:deprecated' + '.:deprecated' + 'C:deprecated' + 'F:start using fg color' + 'K:start using bg color' + 'G:counts as extra character inside %{...%}' + ) + if [[ $PREFIX == *% ]]; then + if [[ $service == -value-,SPROMPT,* ]]; then + specs+=( + 'r:suggested correction' + 'R:corrected string' + ) + fi + specs+=( + '%:A %' + '):A )' + 'l:current line (tty) with /dev/tty stripped' + 'M:full hostname' + 'n:username' + 'y:current line (tty)' + '#:a # when root, % otherwise' + '?:return status of last command' + 'h:current history event number' + '!:current history event number' + 'i:current line number' + 'I:current source line number' + 'j:number of jobs' + 'L:$SHLVL' + 'D:date in yy-mm-dd format' + 'T:current time of day, 24-hour format' + 't:current time of day, 12-hour am/pm format' + '@:current time of day, 12-hour am/pm format' + '*:current time of day, 24-hour format with seconds' + 'w:the date in day-dd format' + 'W:the date in mm/dd/yy format' + 'D{}:format string like strftime' + 'B:start bold' + 'b:stop bold' + 'E:clear to end of line' + 'U:start underline' + 'u:stop underline' + 'S:start standout' + 's:stop standout' + 'f:reset fg color' + 'k:reset bg color' + '{:start literal escape sequence' + '}:stop literal escape sequence' + 'v:value from $psvar array' + '(:ternary expression %(x.true-string.false-string)' + '<<:truncation from left %len>:truncation from right %len>string>' + '[]:truncation from who knows where' + ) + fi + compset -P "*" + _describe -t prompt-format-specifier 'prompt format specifier' specs -S '' + _message -e prompt-format-specifier number +elif [[ $PREFIX == *%$paren(-|)<-># ]]; then + specs=( + '!:running with privileges' + '#:effective uid' + '?:exit status' + '_:at least n shell constructs started' + 'C:at least n path elements' + '/:at least n path elements' + '.:at least n path elements' + 'c:at least n path elements' + '~:at least n path elements' + 'D:month' + 'd:day of month' + 'g:effective gid' + 'j:number of jobs' + 'L:SHLVL' + 'l:number of characters already printed' + 'S:SECONDS parameter at least n' + 'T:current hour' + 't:current minute' + 'v:psvar has at least n elements' + 'V:element n of psvar is set and non-empty' + 'w:day of week (Sunday = 0)' + ) + compset -P "*" + _describe -t ternary-prompt-expression 'ternary prompt format test character' specs -S '' + _message -e ternary-prompt-expression number +else + _describe -t prompt-format-specifier 'prompt format specifier' '(%)' -S '' + _default "$@" +fi diff --git a/Completion/Zsh/Command/_print b/Completion/Zsh/Command/_print index af0501b7a..405393355 100644 --- a/Completion/Zsh/Command/_print +++ b/Completion/Zsh/Command/_print @@ -1,32 +1,84 @@ -#compdef print - -local state expl line eflag pflag - -# -e flag available only after -R -eflag="${words[1,CURRENT-1][(r)-*R*]:+-e[enable escapes]}" - -# -p flag only relevant if we have a coprocess -(:>&p) 2>/dev/null && - pflag='(-s -u -z)-p[print arguments to input of coprocess]' - -_arguments -C -s -A "-*" -S \ - '(-f)-r[ignore escape conventions of echo]' \ - '(-r -b -f -m -s -l -N -o -O -i -c -u -p -z -D -P)-R[emulate BSD echo (no escapes, -n & -e flags only)]' \ - '-b[recognise bindkey escape sequences]' \ - '-m[remove arguments matching specified pattern]' \ - '(-r -n -R -l -N -c)-f+[print arguments as for the printf builtin]:format' \ - '(-u -p -z)-s[place results in the history list]' \ - '(-c -f)-n[do not add a newline to the result]' \ - '(-N -c -f)-l[print arguments separated by newlines]' \ - '(-n -l -c -f)-N[print arguments separated and terminated by nulls]' \ - '(-O)-o[sort arguments in ascending order]' \ - '(-o)-O[sort arguments in descending order]' \ - '-i[case-insensitive sorting]' \ - '(-n -l -N -f -s -z)-a[with -c/-C, print arguments across before down]' \ - '(-n -l -N -f -C -s -z)-c[print arguments in columns]' \ - '(-n -l -N -f -c -s -z)-C+[print arguments in specified number of columns]:columns' \ - '(-s -p -z)-u+[specify file descriptor to print arguments to]:file descriptor:_file_descriptors' \ - '(-s -p -u)-z[push arguments onto editing buffer stack]' \ - '-D[substitute any arguments which are named directories using ~ notation]' \ - '-P[perform prompt expansion]' \ - $pflag $eflag '*:default:_default' +#compdef print printf + +local state expl line eflag pflag rest ret=1 + +if [[ $service = print ]]; then + # -e flag available only after -R + eflag="${words[1,CURRENT-1][(r)-*R*]:+-e[enable escapes]}" + + # -p flag only relevant if we have a coprocess + (:>&p) 2>/dev/null && + pflag='(-s -u -z)-p[print arguments to input of coprocess]' + + if [[ -n ${words[1,CURRENT][(r)-*P*]} ]]; then + rest='*: :_ps1234' + else + rest='*: :_default' + fi + + _arguments -C -s -A "-*" -S \ + '(-f)-r[ignore escape conventions of echo]' \ + '(-r -b -f -m -s -l -N -o -O -i -c -u -p -z -D -P)-R[emulate BSD echo (no escapes, -n & -e flags only)]' \ + '-b[recognise bindkey escape sequences]' \ + '-m[remove arguments matching specified pattern]' \ + '(-r -n -R -l -N -c)-f+[print arguments as for the printf builtin]:format:->printfformat' \ + '(-u -p -z)-s[place results in the history list]' \ + '(-c -f)-n[do not add a newline to the result]' \ + '(-N -c -f)-l[print arguments separated by newlines]' \ + '(-n -l -c -f)-N[print arguments separated and terminated by nulls]' \ + '(-O)-o[sort arguments in ascending order]' \ + '(-o)-O[sort arguments in descending order]' \ + '-i[case-insensitive sorting]' \ + '(-n -l -N -f -s -z)-a[with -c/-C, print arguments across before down]' \ + '(-n -l -N -f -C -s -z)-c[print arguments in columns]' \ + '(-n -l -N -f -c -s -z)-C+[print arguments in specified number of columns]:columns' \ + '(-s -p -z)-u+[specify file descriptor to print arguments to]:file descriptor:_file_descriptors' \ + '(-s -p -u)-z[push arguments onto editing buffer stack]' \ + '-D[substitute any arguments which are named directories using ~ notation]' \ + '-P[perform prompt expansion]' \ + $pflag $eflag $rest && ret=0 +elif [[ $service = printf ]]; then + state=printf +fi + +if [[ $state = printf ]]; then + _arguments -C -s -S \ + '1:format:->printfformat' \ + '*: :_default' && ret=0 +fi + +if [[ $state = printfformat ]]; then + if [[ ${(Q)PREFIX} = *%((-|)<->|[-#0 +*.])# ]]; then + local -a specs + specs=( + '#:alternate form' + '0:zeropad to length n' + '-:left adjust result' + ' :leave one space in front of positive number from signed conversion' + '+:always place sign before a number from signed conversion' + '*:field width in next argument' + '.:precision' + 'c:print the first character of the argument' + 's:print the argument as a string' + {d,i}':signed decimal number or with leading " numeric value of following character' + 'o:unsigned octal number' + 'u:unsigned decimal number' + {x,X}':unsigned hexadecimal number, letters capitalized as x' + {e,E}':double number in scientific notation' + 'f:double number' + {g,G}':double number as %f or %e depending on size' + '%:a percent sign' + 'n:store number of printed bytes in parameter specified by argument' + 'b:as %s but interpret escape sequences in argument' + 'q:as %s but shell quote result' + ) + compset -P "*" + _describe -t print-format-specifier 'print format specifier' specs -S '' + _message -e print-format-specifier 'number' + else + _describe -t print-format-specifier 'print format specifier' '(%)' -S '' + fi + ret=0 +fi + +return ret -- cgit 1.4.1