From 4eed68e0bf1997f160d60c0892c0543a77ac497f Mon Sep 17 00:00:00 2001 From: Jun-ichi Takimoto Date: Tue, 1 Nov 2016 19:18:33 +0900 Subject: 39731: _awk: add support for gawk ver.3 and 4 --- ChangeLog | 5 ++ Completion/Unix/Command/_awk | 138 ++++++++++++++++++++++++++++++++++++------- 2 files changed, 123 insertions(+), 20 deletions(-) diff --git a/ChangeLog b/ChangeLog index 913d1d927..7e2a388be 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2016-11-01 Jun-ichi Takimoto + + * 39731: Completion/Unix/Command/_awk: add support for gawk + ver.3 and 4 + 2016-11-01 Daniel Shahaf * 39787: Test/Y01completion.ztst: Add a regression test for diff --git a/Completion/Unix/Command/_awk b/Completion/Unix/Command/_awk index c493c3b04..a3b242295 100644 --- a/Completion/Unix/Command/_awk +++ b/Completion/Unix/Command/_awk @@ -1,21 +1,119 @@ -#compdef awk - -# completions for awk -# This only aims to complete POSIX awk options, as described in -# awk(P). Most awk implementations, such as gawk and mawk, will have -# additional options that this does not complete. Also, currently -# this completion does not allow everything that POSIX allows. For -# example, awk(P) states that the user may specify assignments -# without using the -v option; this does not support that. +#compdef awk gawk + +# For gawk ver.3 and 4, in addition to POSIX. +# +# gawk's options '-W ...' (such as '-W help') are not supported. +# gawk3 has some synomyms for long options (e.g., --compat is a synomym +# for --traditional). These are not supported either. # -# In addition, the "program text" completion is not perfect. For -# instance, type "awk -" and then hit tab. You will be presented -# both with the dashed options and with the "program text" option. -# Fixing this is beyond my current _arguments expertise--help -# appreciated. - -_arguments -S -s '-F+[define input field separator to be an extended regular expression]:extended regular expression:' \ - '*-v+[assign values to variables]:assignment:' \ - '(1)-f+[program file]:program file:_files' \ - '1:program text:' \ - '*:input files:_files' +# 'gawk -f' will complete files in AWKPATH in addition to those in +# the current directory. If this is annoying, you may try +# zstyle ':completion:*:*:gawk:option-f-1:*' tag-order program-files + +local variant curcontext="$curcontext" state state_descr line ret=1 +local -A opt_args +local -a args + +_pick_variant -r variant gawk4='GNU Awk 4' gawk3='GNU Awk 3' posix --version + +args=( + {-F+,--field-separator}'[define input field separator by extended regex]:extended regular expression:' + '*'{-v+,--assign}'[assign values to variables]:assignment:' + '(1)*'{-f+,--file}'[read program file]:program file:->script' + '1: :_guard "^-*" "program text"' + '*:input files:_files' +) + +case $variant in + (gawk*) + args+=( + {-c,--traditional}'[run in compatibility mode]' + '(- : *)'{-C,--copyright}'[print copyright info and exit]' + {-d-,--dump-variables=-}'[print a sorted list of global variables]::output file:_files' + {-e,--source}'[pass program text in arg]:program text:' + '(1)'{-E+,--exec}'[like -f, but safer for CGI]:program file:->script' + '(- : *)'{-h,--help}'[print usage message and exit]' + {-L-,--lint=-}'[warn about dubious or non-portable constructs]::flag:((fatal\:"treat warnings as fatal error" invalid\:"warn only about thigs that are actually invalid"))' + {-n,--non-decimal-data}'[auto-detect octal/hexadecimal values in input]' + {-N,--use-lc-numeric}"[force use of locale's decimal point character]" + {-O,--optimize}'[enable optimization]' + {-p-,--profile=-}'[output profiling data to file]::output file:_files' + {-P,--posix}'[run in strict POSIX mode]' + {-r,--re-interval}'[enable interval expressions in regex matching]' + {-t,--lint-old}'[warn about non-portable constructs]' + '(- : *)'{-V,--version}'[print version info and exit]' + ) + ;| + (gawk4) + args+=( + {-b,--characters-as-bytes}'[treat all input data as single-byte characters]' + {-D-,--debug=-}'[enable debugging]::debugger command file:_files' + {-g,--gen-pot}'[scan awk program and generate .po file on stdout]' + '*'{-i+,--include}'[load source library]:library file:->script' + '*'{-l+,--load}'[load dynamic extension]:extension:->extension' + {-M,--bignum}'[select arbitrary-precision arithmetic on numbers]' + {-o-,--pretty-print=-}'[pretty-print awk program]::output file:_files' + {-S,--sandbox}'[disable system(), redirections and dynamic extensions]' + ) + ;; + (gawk3) + # one letter options are new in gawk4 + args=( ${args:#(|\*)(|\(*\))-[cCdEhLnNtOpPreV]*} ) + args+=( + '--gen-po[scan awk program and generate .po file on stdout]' + ) + ;; + (*) + # remove long options + args=( ${args:#*--*} ) +esac + +_arguments -S -s -C : $args && ret=0 + +# Complete files in . (current directory) and AWKPATH/AWKLIBPATH. +# Use different tag/description for files in . even if . is in AWKPATH. +_files_in_curdir_or_path() { + local expl pat1 pat2 + if [[ -n $6 ]]; then # $6 = 'so', 'dll' or '' + pat1="-g *.$6" + pat2="-g *.$6" + fi + if [[ $words[CURRENT] == */* || $variant != gawk* || \ + -n $opt_args[(I)(-c|--traditional|-P|--posix)] ]]; then + _wanted $2 expl $3 _files $pat1 && ret=0 + else + local prog='BEGIN {print ENVIRON["'$1'"]}' + local -aU paths + # split AWKPATH into paths, and replace null element by '.'. + paths=( "${(@)${(@s.:.)$(_call_program get-awk-env \ + $words[1] ${(q)prog})}:/#%/.}" ) + if (( $paths[(I).] )); then + # If '.' is in paths, remove it; we will handle it separately + paths=( ${(@)paths:#.} ) + else + # If '.' is not in paths, we should not complete files in '.' + pat1='-g *(-/)' + fi + if (( $#paths )); then + _alternative "${2}:${3}:_files ${(b)pat1}" \ + "${4}:${5}:_files -W paths ${(b)pat2}" && ret=0 + else + _wanted $2 expl $3 _files $pat1 && ret=0 + fi + fi +} + +case $state in + (script) + _files_in_curdir_or_path AWKPATH program-files 'program file' \ + library-files 'library in AWKPATH' + ;; + (extension) + local ext=so + [[ $OSTYPE == cygwin* ]] && ext=dll + _files_in_curdir_or_path AWKLIBPATH extensions 'extension' \ + library-files 'extension in AWKLIBPATH' $ext + ;; +esac + +return ret -- cgit 1.4.1