From ff190946690b5e770721462b706029559c0f9587 Mon Sep 17 00:00:00 2001 From: Peter Stephenson Date: Mon, 18 May 2015 16:56:36 +0100 Subject: 35193: Add "unalias -a". --- ChangeLog | 3 +++ Doc/Zsh/builtins.yo | 9 ++++++++- Src/builtin.c | 42 +++++++++++++++++++++++++++++++++++------- Src/hashtable.h | 3 +++ Test/A02alias.ztst | 10 ++++++++++ 5 files changed, 59 insertions(+), 8 deletions(-) diff --git a/ChangeLog b/ChangeLog index 3f0b24bbc..568a3b7c1 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,8 @@ 2015-05-18 Peter Stephenson + * 35193: Doc/Zsh/builtins.yo, Src/builtin.c, Src/hashtable.h, + Test/A02alias.ztst: add "unalias -a". + * 35187: Completion/Unix/Command/_vim: fix unbalanced parentheses. * 35184: Src/parse.c, Test/A01grammar.ztst: fix pattern parsing diff --git a/Doc/Zsh/builtins.yo b/Doc/Zsh/builtins.yo index 5327789cd..1b8729d7a 100644 --- a/Doc/Zsh/builtins.yo +++ b/Doc/Zsh/builtins.yo @@ -2056,7 +2056,14 @@ the symbolic form the permissions you specify are those which are to be allowed (not denied) to the users specified. ) cindex(aliases, removing) -alias(unalias)(unhash -a) +item(tt(unalias) [ tt(-ams) ] var(name) ...)( +Removes aliases. This command works the same as tt(unhash -a), except that +the tt(-a) option removes all regular or global aliases, or with tt(-s) +all suffix aliases: in this case no var(name) arguments may appear. The +options tt(-m) (remove by pattern) and tt(-s) without tt(-a) (remove +listed suffix aliases) behave as for tt(unhash -a). Note that +the meaning of tt(-a) is different between tt(unalias) and tt(unhash). +) cindex(functions, removing) alias(unfunction)(unhash -f) findex(unhash) diff --git a/Src/builtin.c b/Src/builtin.c index dbcd02206..a9afb4540 100644 --- a/Src/builtin.c +++ b/Src/builtin.c @@ -122,9 +122,9 @@ static struct builtin builtins[] = BUILTIN("type", 0, bin_whence, 0, -1, 0, "ampfsSw", "v"), BUILTIN("typeset", BINF_PLUSOPTS | BINF_MAGICEQUALS | BINF_PSPECIAL, bin_typeset, 0, -1, 0, "AE:%F:%HL:%R:%TUZ:%afghi:%klprtuxmz", NULL), BUILTIN("umask", 0, bin_umask, 0, 1, 0, "S", NULL), - BUILTIN("unalias", 0, bin_unhash, 1, -1, 0, "ms", "a"), - BUILTIN("unfunction", 0, bin_unhash, 1, -1, 0, "m", "f"), - BUILTIN("unhash", 0, bin_unhash, 1, -1, 0, "adfms", NULL), + BUILTIN("unalias", 0, bin_unhash, 0, -1, BIN_UNALIAS, "ams", NULL), + BUILTIN("unfunction", 0, bin_unhash, 1, -1, BIN_UNFUNCTION, "m", "f"), + BUILTIN("unhash", 0, bin_unhash, 1, -1, BIN_UNHASH, "adfms", NULL), BUILTIN("unset", BINF_PSPECIAL, bin_unset, 1, -1, 0, "fmv", NULL), BUILTIN("unsetopt", 0, bin_setopt, 0, -1, BIN_UNSETOPT, NULL, NULL), BUILTIN("wait", 0, bin_fg, 0, -1, BIN_WAIT, NULL, NULL), @@ -3557,26 +3557,54 @@ bin_hash(char *name, char **argv, Options ops, UNUSED(int func)) /**/ int -bin_unhash(char *name, char **argv, Options ops, UNUSED(int func)) +bin_unhash(char *name, char **argv, Options ops, int func) { HashTable ht; HashNode hn, nhn; Patprog pprog; - int match = 0, returnval = 0; + int match = 0, returnval = 0, all = 0; int i; /* Check which hash table we are working with. */ - if (OPT_ISSET(ops,'d')) + if (func == BIN_UNALIAS) { + if (OPT_ISSET(ops,'s')) + ht = sufaliastab; /* suffix aliases */ + else + ht = aliastab; /* aliases */ + if (OPT_ISSET(ops, 'a')) { + if (*argv) { + zwarnnam(name, "-a: too many arguments"); + return 1; + } + all = 1; + } else if (!*argv) { + zwarnnam(name, "not enough arguments"); + return 1; + } + } else if (OPT_ISSET(ops,'d')) ht = nameddirtab; /* named directories */ else if (OPT_ISSET(ops,'f')) ht = shfunctab; /* shell functions */ else if (OPT_ISSET(ops,'s')) ht = sufaliastab; /* suffix aliases, must precede aliases */ - else if (OPT_ISSET(ops,'a')) + else if (func == BIN_UNHASH && (OPT_ISSET(ops,'a'))) ht = aliastab; /* aliases */ else ht = cmdnamtab; /* external commands */ + if (all) { + queue_signals(); + for (i = 0; i < ht->hsize; i++) { + for (hn = ht->nodes[i]; hn; hn = nhn) { + /* record pointer to next, since we may free this one */ + nhn = hn->next; + ht->freenode(ht->removenode(ht, hn->nam)); + } + } + unqueue_signals(); + return 0; + } + /* With -m option, treat arguments as glob patterns. * * "unhash -m '*'" is legal, but not recommended. */ if (OPT_ISSET(ops,'m')) { diff --git a/Src/hashtable.h b/Src/hashtable.h index 131c15c7b..b6346bb9a 100644 --- a/Src/hashtable.h +++ b/Src/hashtable.h @@ -59,6 +59,9 @@ #define BIN_ENABLE 25 #define BIN_PRINTF 26 #define BIN_COMMAND 27 +#define BIN_UNHASH 28 +#define BIN_UNALIAS 29 +#define BIN_UNFUNCTION 30 /* These currently depend on being 0 and 1. */ #define BIN_SETOPT 0 diff --git a/Test/A02alias.ztst b/Test/A02alias.ztst index cace2a40a..b294e65ca 100644 --- a/Test/A02alias.ztst +++ b/Test/A02alias.ztst @@ -83,3 +83,13 @@ > a string S *>*5*echo S a string S " # Note there is a trailing space on the "> a string S " line + + ( + unalias -a + alias + ) +0:unalias -a + + alias -s foo=print + unalias -as +0:unalias -as -- cgit 1.4.1