From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 29520 invoked from network); 28 Mar 2001 15:17:59 -0000 Received: from sunsite.dk (130.225.51.30) by ns1.primenet.com.au with SMTP; 28 Mar 2001 15:17:59 -0000 Received: (qmail 10975 invoked by alias); 28 Mar 2001 15:17:43 -0000 Mailing-List: contact zsh-workers-help@sunsite.dk; run by ezmlm Precedence: bulk X-No-Archive: yes X-Seq: 13818 Received: (qmail 10963 invoked from network); 28 Mar 2001 15:17:42 -0000 Message-ID: To: zsh-workers@sunsite.dk (Zsh hackers list) Subject: PATCH: list bindings with given prefix. Date: Wed, 28 Mar 2001 16:17:17 +0100 From: Peter Stephenson This allows `bindkey -p ' to list bindings which have as a prefix (not counting bindings for itself). The previous unposted zle change is necessary to apply the documentation hunk, unfortunately (or just apply it to mod_zle.yo). This is the simplest change rather than the most efficient, but I don't think that's a problem here. I can't absolutely guarantee this doesn't have some odd effect in combination with the code that handles ranges, but it doesn't look like it. I'm pretty confident it doesn't mess up any functionality there already. If it seems to work I'll attempt to write a routine to delete bindings using the same logic. Index: Src/Zle/zle_keymap.c =================================================================== RCS file: /cvsroot/zsh/zsh/Src/Zle/zle_keymap.c,v retrieving revision 1.5 diff -u -r1.5 zle_keymap.c --- Src/Zle/zle_keymap.c 2001/03/14 12:20:18 1.5 +++ Src/Zle/zle_keymap.c 2001/03/28 15:08:11 @@ -86,6 +86,8 @@ char *lastseq; Thingy bind; char *str; + char *prefix; + int prefixlen; }; #define BS_LIST (1<<0) @@ -890,7 +892,7 @@ 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 @@ 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; @@ -918,6 +934,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) { Index: Doc/Zsh/zle.yo =================================================================== RCS file: /cvsroot/zsh/zsh/Doc/Zsh/zle.yo,v retrieving revision 1.11 diff -u -r1.11 zle.yo --- Doc/Zsh/zle.yo 2001/03/28 14:39:58 1.11 +++ Doc/Zsh/zle.yo 2001/03/28 15:08:11 @@ -195,6 +195,10 @@ displayed - the implicit linking of keymaps is the only thing that happens.) +When the option tt(-p) is used, the var(in-string) must be present. +The listing shows all bindings which have the given key sequence as a +prefix, not including any bindings for the key sequence itself. + When the tt(-L) option is used, the list is in the form of tt(bindkey) commands to create the key bindings. ) -- Peter Stephenson Software Engineer CSR Ltd., Unit 300, Science Park, Milton Road, Cambridge, CB4 0XL, UK Tel: +44 (0)1223 392070