about summary refs log tree commit diff
diff options
context:
space:
mode:
authorOliver Kiddle <opk@users.sourceforge.net>2003-01-29 14:26:01 +0000
committerOliver Kiddle <opk@users.sourceforge.net>2003-01-29 14:26:01 +0000
commit456e958527cc432467a09aa08abe54ff6684f351 (patch)
treeefea7b6bfd525b298aa87a39768a55859e48767c
parent4db0b10fc2f5b5c1344004cdb28ef257d8e5de85 (diff)
downloadzsh-456e958527cc432467a09aa08abe54ff6684f351.tar.gz
zsh-456e958527cc432467a09aa08abe54ff6684f351.tar.xz
zsh-456e958527cc432467a09aa08abe54ff6684f351.zip
18149, 18153: new func for emulating bash's programmable completion system
-rw-r--r--Completion/bashcompinit172
1 files changed, 172 insertions, 0 deletions
diff --git a/Completion/bashcompinit b/Completion/bashcompinit
new file mode 100644
index 000000000..5166b0368
--- /dev/null
+++ b/Completion/bashcompinit
@@ -0,0 +1,172 @@
+#autoload
+
+_bash_complete() {
+  local ret=1
+  local -a suf matches
+  local COMP_POINT COMP_CWORD
+  local -a COMP_WORDS COMPREPLY BASH_VERSINFO
+  local COMP_LINE="$words"
+  local -A savejobstates savejobtexts
+
+  (( COMP_POINT = 1 + ${#${(j. .)words[1,CURRENT-1]}} + $#QIPREFIX + $#IPREFIX + $#PREFIX ))
+  (( COMP_CWORD = CURRENT - 1))
+  COMP_WORDS=( $words )
+  BASH_VERSINFO=( 2 05b 0 1 release )
+  
+  savejobstates=( ${(kv)jobstates} )
+  savejobtexts=( ${(kv)jobtexts} )
+  
+  [[ ${argv[${argv[(I)nospace]:-0}-1]} = -o ]] && suf=( -S '' )
+ 
+  matches=( ${(f)"$(compgen $@)"} )
+  
+  if [[ -n $matches ]]; then
+    if [[ ${argv[${argv[(I)filenames]:-0}-1]} = -o ]]; then
+      compset -P '*/' && matches=( ${matches##*/} )
+      compset -S '/*' && matches=( ${matches%%/*} )
+      compadd -f "${suf[@]}" -a matches && ret=0
+    else
+      compadd "${suf[@]}" -a matches && ret=0
+    fi
+  fi
+
+  if (( ret )); then
+    if [[ ${argv[${argv[(I)default]:-0}-1]} = -o ]]; then
+      _default "${suf[@]}" && ret=0
+    elif [[ ${argv[${argv[(I)dirnames]:-0}-1]} = -o ]]; then
+      _directories "${suf[@]}" && ret=0
+    fi
+  fi
+
+  return ret
+}
+
+compgen() {
+  local opts prefix suffix job OPTARG OPTIND ret=1 
+  local -a name res results jids
+  local -A shortopts
+  
+  emulate -L sh
+  setopt kshglob noshglob braceexpand nokshautoload
+
+  shortopts=(
+    a alias b builtin c command d directory e export f file
+    g group j job k keyword u user v variable
+  )
+
+  while getopts "o:A:G:C:F:P:S:W:X:abcdefgjkuv" name; do
+    case $name in
+      [abcdefgjkuv]) OPTARG="${shortopts[$name]}" ;&
+      A)
+        case $OPTARG in
+	  alias) results+=( "${(k)aliases[@]}" ) ;;
+	  arrayvar) results+=( "${(k@)parameters[(R)array*]}" ) ;;
+	  binding) results+=( "${(k)widgets[@]}" ) ;;
+	  builtin) results+=( "${(k)builtins[@]}" "${(k)dis_builtins[@]}" ) ;;
+	  command)
+	    results+=(
+	      "${(k)commands[@]}" "${(k)aliases[@]}" "${(k)builtins[@]}"
+	      "${(k)functions[@]}" "${(k)reswords[@]}"
+	    )
+	  ;;
+	  directory)
+	    setopt bareglobqual
+	    results+=( ${IPREFIX}${PREFIX}*${SUFFIX}${ISUFFIX}(N-/) )
+	    setopt nobareglobqual
+	  ;;
+	  disabled) results+=( "${(k)dis_builtins[@]}" ) ;;
+	  enabled) results+=( "${(k)builtins[@]}" ) ;;
+	  export) results+=( "${(k)parameters[(R)*export*]}" ) ;;
+	  file)
+	    setopt bareglobqual
+	    results+=( ${IPREFIX}${PREFIX}*${SUFFIX}${ISUFFIX}(N) )
+	    setopt nobareglobqual
+	  ;;
+	  function) results+=( "${(k)functions[@]}" ) ;;
+	  group)
+	    emulate zsh
+	    _groups -U -O res
+	    emulate sh
+	    setopt kshglob noshglob braceexpand
+	    results+=( "${res[@]}" )
+	  ;;
+	  hostname)
+	    emulate zsh
+	    _hosts -U -O res
+	    emulate sh
+	    setopt kshglob noshglob braceexpand
+	    results+=( "${res[@]}" )
+	  ;;
+	  job) results+=( "${savejobtexts[@]%% *}" );;
+	  keyword) results+=( "${(k)reswords[@]}" ) ;;
+	  running)
+	    jids=( "${(@k)savejobstates[(R)running*]}" )
+	    for job in "${jids[@]}"; do
+	      results+=( ${savejobtexts[$job]%% *} )
+	    done
+	  ;;
+	  stopped)
+	    jids=( "${(@k)savejobstates[(R)suspended*]}" )
+	    for job in "${jids[@]}"; do
+	      results+=( ${savejobtexts[$job]%% *} )
+	    done
+	  ;;
+	  setopt|shopt) results+=( "${(k)options[@]}" ) ;;
+	  signal) results+=( "SIG${^signals[@]}" ) ;;
+	  user) results+=( "${(k)userdirs[@]}" ) ;;
+      	  variable) results+=( "${(k)parameters[@]}" ) ;;
+	  helptopic) ;;
+	esac
+      ;;
+      F)
+        COMPREPLY=()
+	$OPTARG "${words[0]}" "${words[CURRENT-1]}" "${words[CURRENT-2]}"
+	results+=( "${COMPREPLY[@]}" )
+      ;;
+      G)
+        setopt nullglob
+        results+=( ${~OPTARG} )
+	unsetopt nullglob
+      ;;
+      W) eval "results+=( $OPTARG )" ;;
+      C) results+=( $(eval $OPTARG) ) ;;
+      P) prefix="$OPTARG" ;;
+      S) suffix="$OPTARG" ;;
+      X)
+        if [[ ${OPTARG[0]} = '!' ]]; then
+	  results=( "${(M)results[@]:#${OPTARG#?}}" )
+	else
+ 	  results=( "${results[@]:#$OPTARG}" )
+	fi
+      ;;
+    esac
+  done
+  
+  # support for the last, `word' option to compgen. Zsh's matching does a
+  # better job but if you need to, comment this in and use compadd -U
+  #shift $(( OPTIND - 1 ))
+  #(( $# )) && results=( "${(M)results[@]:#$1*}" )
+
+  print -l -- "$prefix${^results[@]}$suffix"
+}
+
+complete() {
+  emulate -L zsh
+  local args void cmd print remove
+  args=( "$@" )
+  zparseopts -D -a void o: A: G: W: C: F: P: S: X: a b c d e f g j k u v \
+      p=print r=remove
+  if [[ -n $print ]]; then
+    printf 'complete %2$s %1$s\n' "${(@kv)_comps[(R)_bash*]#* }"
+  elif [[ -n $remove ]]; then
+    for cmd; do
+      unset "_comps[$cmd]"
+    done
+  else
+    compdef _bash_complete\ ${(j. .)${(q)args[1,-1-$#]}} "$@"
+  fi
+}
+
+unfunction bashcompinit
+autoload -U bashcompinit
+return 0