zsh-workers
 help / color / mirror / code / Atom feed
* [PATCH] _awk: support gawk ver.3 and 4
@ 2016-10-26 14:07 Jun T.
  2016-11-03 12:53 ` Oliver Kiddle
  0 siblings, 1 reply; 2+ messages in thread
From: Jun T. @ 2016-10-26 14:07 UTC (permalink / raw)
  To: zsh-workers

[-- Attachment #1: Type: text/plain, Size: 6097 bytes --]

Add support for gawk ver.3 and 4 in _awk.
The new _awk is also attached just for convenience.
Any comments are welcome.

Jun


diff --git a/Completion/Unix/Command/_awk b/Completion/Unix/Command/_awk
index c493c3b..a3b2422 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






[-- Attachment #2: _awk --]
[-- Type: application/octet-stream, Size: 4505 bytes --]

#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.
#
# '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

^ permalink raw reply	[flat|nested] 2+ messages in thread

* Re: [PATCH] _awk: support gawk ver.3 and 4
  2016-10-26 14:07 [PATCH] _awk: support gawk ver.3 and 4 Jun T.
@ 2016-11-03 12:53 ` Oliver Kiddle
  0 siblings, 0 replies; 2+ messages in thread
From: Oliver Kiddle @ 2016-11-03 12:53 UTC (permalink / raw)
  To: zsh-workers

On 26 Oct, "Jun T." wrote:
> Add support for gawk ver.3 and 4 in _awk.
> Any comments are welcome.

All looks good.

Only thing that came to mind is that we should use the function for nawk
too.

Oliver

diff --git a/Completion/Unix/Command/_awk b/Completion/Unix/Command/_awk
index a3b2422..cdae8c7 100644
--- a/Completion/Unix/Command/_awk
+++ b/Completion/Unix/Command/_awk
@@ -1,4 +1,4 @@
-#compdef awk gawk
+#compdef awk gawk nawk
 
 # For gawk ver.3 and 4, in addition to POSIX.
 #


^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2016-11-03 12:53 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-10-26 14:07 [PATCH] _awk: support gawk ver.3 and 4 Jun T.
2016-11-03 12:53 ` Oliver Kiddle

Code repositories for project(s) associated with this public inbox

	https://git.vuxu.org/mirror/zsh/

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).