summaryrefslogtreecommitdiff
path: root/Completion/Unix/Command
diff options
context:
space:
mode:
authorJun-ichi Takimoto <takimoto-j@kba.biglobe.ne.jp>2016-11-01 19:18:33 +0900
committerJun-ichi Takimoto <takimoto-j@kba.biglobe.ne.jp>2016-11-01 19:21:05 +0900
commit4eed68e0bf1997f160d60c0892c0543a77ac497f (patch)
treeeb9901aa2aa9777d15d6e94745ed8a585286bce2 /Completion/Unix/Command
parent33ceb8b58fb11d47b25128e0b2d614b3cae819a1 (diff)
downloadzsh-4eed68e0bf1997f160d60c0892c0543a77ac497f.tar.gz
zsh-4eed68e0bf1997f160d60c0892c0543a77ac497f.zip
39731: _awk: add support for gawk ver.3 and 4
Diffstat (limited to 'Completion/Unix/Command')
-rw-r--r--Completion/Unix/Command/_awk138
1 files changed, 118 insertions, 20 deletions
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<TAB>' 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