From: Peter Stephenson <pws@ibmth.df.unipi.it>
To: zsh-workers@sunsite.auc.dk (Zsh hackers list)
Subject: PATCH: 3.1.5-pws-7++: #key-* style completions
Date: Sat, 13 Feb 1999 14:06:53 +0100 [thread overview]
Message-ID: <9902131306.AA34056@ibmth.df.unipi.it> (raw)
This alters the format of definitions for directly bindable completions via
#key-array or #key-function widgets (for intermittent readers, these
function like the old zle -C widgets I previously introduced) so that the
bindkey string comes last, and there can be zero or more of them.
I've just noticed a slight problem with rebinding all completion-type key
bindings to use the new functions, when combined with #key-* bindings: if
you do (say) ^D, it will always generate the context-dependent list,
replacing the list you just made with the #key-* function, whereas if ^D
was bound as originally, it will use an existing completion list. However,
that was imperfect because if there was no existing completion list it
would generate the one according to the old-style compctl's. So the
present arrangement is probably better, but not perfect. Is there some way
in shell code of making listing functions use an existing completion
list where there is one (maybe as an option)?
--- Misc/Completion/__most_recent_file.bk Sat Feb 13 13:48:43 1999
+++ Misc/Completion/__most_recent_file Sat Feb 13 13:49:08 1999
@@ -1,2 +1,2 @@
-#key-array \C-xm expand-or-complete
+#key-array expand-or-complete \C-xm
__most_recent_file=(-g '*(om[1])')
--- Misc/Completion/init.bk Sat Feb 13 13:48:48 1999
+++ Misc/Completion/init Sat Feb 13 13:55:12 1999
@@ -30,17 +30,18 @@
# `#pattern-array <pattern>'
# like `#pattern-function' but defining an array
#
-# `#key-function <key-sequence> <style>
-# this is used to bind special completions to a <key-sequence>;
-# the <style> is the name of one of the built-in completion widgets
-# (complete-word, delete-char-or-list, expand-or-complete,
-# expand-or-complete-prefix, list-choices, menu-complete,
-# menu-expand-or-complete, or reverse-menu-complete); this will create
-# a internal widget and bind the given key-sequence to this widget so
-# that typing this key-sequence will have the effect of completing
-# the word on the command line as defined in the file
+# `#key-function <style> [ <key-sequence> ... ]
+# this is used to bind special completions to all the given
+# <key-sequence>(s). The <style> is the name of one of the built-in
+# completion widgets (complete-word, delete-char-or-list,
+# expand-or-complete, expand-or-complete-prefix, list-choices,
+# menu-complete, menu-expand-or-complete, or reverse-menu-complete).
+# This creates a widget behaving like <style> so that the
+# completions are chosen as given in the the rest of the file,
+# rather than by the context. The widget has the same name as
+# the autoload file and can be bound using bindkey in the normal way.
#
-# `#key-array <key-sequence> <style>
+# `#key-array <style> [ <key-sequence> ... ]
# like `#key-function', but defining an array instead
#
# `#helper'
@@ -108,11 +109,12 @@
# This is used to define completion handlers directly bound to keys. The
-# first argument is as for `defcomp', giving the handler. The second argument
-# is a key-sequence usable fo `bindkey'. The third argument is the name of one
-# of the built-in completion widgets. Typing the given key sequence will
-# complete the word the cursor is on according to the completion definition
-# given and will behave as if the built-in completion widget was used.
+# first argument is as for `defcomp', giving the handler. The second
+# argument is the name of one of the built-in completion widgets. Any
+# remaining arguments are used as key sequences to bind the widget.
+# Typing that key sequence will complete the word the cursor is on
+# according to the completion definition given and will behave as if the
+# built-in completion widget was used.
defkeycomp() {
local name
@@ -126,9 +128,14 @@
else
name="$1"
fi
- zle -C "$name" "$3" __main_key_complete
- bindkey "$2" "$name"
keycomps[$name]="$1"
+ shift
+ zle -C "$name" "$1" __main_key_complete
+ shift
+ while (( $# )); do
+ bindkey "$1" "$name"
+ shift
+ done
}
# These can be used to easily save and restore the state of the special
@@ -202,25 +209,27 @@
# Now we make the files automatically autoloaded.
-local dir file line
+local dir file line func
for dir in $fpath; do
[[ $dir = . ]] && continue
for file in $dir/__*~*~(N); do
read -rA line < $file
- if [[ $line[1] = '#function' ]]; then
- defcomp -a ${file:t} "${(@)line[2,-1]}"
- elif [[ $line[1] = '#array' ]]; then
- defcomp " $file" "${(@)line[2,-1]}"
- elif [[ $line[1] = '#pattern-function' ]]; then
- defpatcomp -a ${file:t} "$line[2]"
- elif [[ $line[1] = '#pattern-array' ]]; then
- defcomp " $file" "$line[2]"
- elif [[ $line[1] = '#key-function' ]]; then
- defkeycomp -a "${file:t}" "$line[2]" "$line[3]"
- elif [[ $line[1] = '#key-array' ]]; then
- defkeycomp " $file" "$line[2]" "$line[3]"
- elif [[ $line[1] = '#helper' ]]; then
+ func=$line[1]
+ shift line
+ if [[ $func = '#function' ]]; then
+ defcomp -a ${file:t} "${line[@]}"
+ elif [[ $func = '#array' ]]; then
+ defcomp " $file" "${line[@]}"
+ elif [[ $func = '#pattern-function' ]]; then
+ defpatcomp -a ${file:t} "${line[@]}"
+ elif [[ $func = '#pattern-array' ]]; then
+ defcomp " $file" "${line[@]}"
+ elif [[ $func = '#key-function' ]]; then
+ defkeycomp -a "${file:t}" "${line[@]}"
+ elif [[ $func = '#key-array' ]]; then
+ defkeycomp " $file" "${line[@]}"
+ elif [[ $func = '#helper' ]]; then
autoload ${file:t}
fi
done
--
Peter Stephenson <pws@ibmth.df.unipi.it> Tel: +39 050 844536
WWW: http://www.ifh.de/~pws/
Dipartimento di Fisica, Via Buonarroti 2, 56127 Pisa, Italy
next reply other threads:[~1999-02-13 13:23 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
1999-02-13 13:06 Peter Stephenson [this message]
1999-02-15 9:25 Sven Wischnowsky
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=9902131306.AA34056@ibmth.df.unipi.it \
--to=pws@ibmth.df.unipi.it \
--cc=zsh-workers@sunsite.auc.dk \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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).