summaryrefslogtreecommitdiff
path: root/Src/Zle/zle_keymap.c
diff options
context:
space:
mode:
authorPeter Stephenson <pws@users.sourceforge.net>2001-03-28 16:54:21 +0000
committerPeter Stephenson <pws@users.sourceforge.net>2001-03-28 16:54:21 +0000
commit19a8356ff15c071bbbdf7321efb873f0abcba37f (patch)
tree92eca1d7bb26fd9e3e60226e88b35714ea470f46 /Src/Zle/zle_keymap.c
parent3052985d1fe4939ba571e942b9ff76ea9f59593a (diff)
downloadzsh-19a8356ff15c071bbbdf7321efb873f0abcba37f.tar.gz
zsh-19a8356ff15c071bbbdf7321efb873f0abcba37f.zip
Add `bindkey -p'
Diffstat (limited to 'Src/Zle/zle_keymap.c')
-rw-r--r--Src/Zle/zle_keymap.c22
1 files changed, 21 insertions, 1 deletions
diff --git a/Src/Zle/zle_keymap.c b/Src/Zle/zle_keymap.c
index c6646450d..9a485a506 100644
--- a/Src/Zle/zle_keymap.c
+++ b/Src/Zle/zle_keymap.c
@@ -86,6 +86,8 @@ struct bindstate {
char *lastseq;
Thingy bind;
char *str;
+ char *prefix;
+ int prefixlen;
};
#define BS_LIST (1<<0)
@@ -890,7 +892,7 @@ bin_bindkey_list(char *name, char *kmname, Keymap km, char **argv, char *ops, ch
bs.flags = ops['L'] ? BS_LIST : 0;
bs.kmname = kmname;
- if(argv[0]) {
+ if(argv[0] && !ops['p']) {
int len;
char *seq;
@@ -899,8 +901,22 @@ bin_bindkey_list(char *name, char *kmname, Keymap km, char **argv, char *ops, ch
bs.flags |= BS_ALL;
bs.firstseq = bs.lastseq = seq;
bs.bind = keybind(km, seq, &bs.str);
+ bs.prefix = NULL;
+ bs.prefixlen = 0;
bindlistout(&bs);
} else {
+ /* empty prefix is equivalent to no prefix */
+ if (ops['p'] && (!argv[0] || argv[0][0])) {
+ if (!argv[0]) {
+ zwarnnam(name, "option -p requires a prefix string", NULL, 0);
+ return 1;
+ }
+ bs.prefix = getkeystring(argv[0], &bs.prefixlen, 2, NULL);
+ bs.prefix = metafy(bs.prefix, bs.prefixlen, META_HREALLOC);
+ } else {
+ bs.prefix = NULL;
+ bs.prefixlen = 0;
+ }
bs.firstseq = ztrdup("");
bs.lastseq = ztrdup("");
bs.bind = t_undefinedkey;
@@ -919,6 +935,10 @@ scanbindlist(char *seq, Thingy bind, char *str, void *magic)
{
struct bindstate *bs = magic;
+ if (bs->prefixlen &&
+ (strncmp(seq, bs->prefix, bs->prefixlen) || !seq[bs->prefixlen]))
+ return;
+
if(bind == bs->bind && (bind || !strcmp(str, bs->str)) &&
ztrlen(seq) == 1 && ztrlen(bs->lastseq) == 1) {
int l = bs->lastseq[1] ?