From ea291595718e1e0a6954467545cbc778d15cf16c Mon Sep 17 00:00:00 2001 From: Peter Stephenson Date: Fri, 13 Mar 2009 10:04:21 +0000 Subject: users/13902: make isearch return status useful add LASTABORTEDSEARCH variable --- ChangeLog | 6 ++++- Doc/Zsh/zle.yo | 15 +++++++++--- Src/Zle/zle_hist.c | 68 +++++++++++++++++++++++++++++++++++++++------------- Src/Zle/zle_params.c | 19 +++++++++++---- 4 files changed, 83 insertions(+), 25 deletions(-) diff --git a/ChangeLog b/ChangeLog index aff3a7fe6..d6e9f2da6 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,9 @@ 2009-03-13 Peter Stephenson + * users/13902: Doc/Zsh/zle.yo, Src/Zle/zle_hist.yo, + Src/Zle/zle_params.yo: improve return value from isearch functions + and add LASTABORTEDSEARCH variable. + * 26723: Completion/Unix/Type/.distfiles, Completion/Unix/Type/_have_glob_qual, Completion/Unix/Type_path_files: centralise test for whether @@ -11384,5 +11388,5 @@ ***************************************************** * This is used by the shell to define $ZSH_PATCHLEVEL -* $Revision: 1.4611 $ +* $Revision: 1.4612 $ ***************************************************** diff --git a/Doc/Zsh/zle.yo b/Doc/Zsh/zle.yo index fbe3397d6..94484b9b5 100644 --- a/Doc/Zsh/zle.yo +++ b/Doc/Zsh/zle.yo @@ -721,10 +721,16 @@ effectively sets the maximum length of the kill ring, while the number of non-zero strings gives the current length, both as seen by the user at the command line. ) - +vindex(LASTABORTEDSEARCH) +item(tt(LASTABORTEDSEARCH) (scalar))( +The last search string used by an interactive search that was +aborted by the user (status 3 returned by the search widget). +) vindex(LASTSEARCH) item(tt(LASTSEARCH) (scalar))( -The last search string used by an interactive search ; read-only. +The last search string used by an interactive search; read-only. +This is set even if the search failed (status 0, 1 or 2 returned +by the search widget), but not if it was aborted by the user. ) vindex(LASTWIDGET) item(tt(LASTWIDGET) (scalar))( @@ -1116,7 +1122,10 @@ item(tt(history-incremental-search-backward) (^R ^Xr) (unbound) (unbound))( Search backward incrementally for a specified string. The search is case-insensitive if the search string does not have uppercase letters and no numeric argument was given. The string may begin with `tt(^)' to anchor the -search to the beginning of the line. +search to the beginning of the line. When called from a user-defined +function returns the following statuses: 0, if the search succeeded; +1, if the search failed; 2, if the search term was a bad pattern; +3, if the search was aborted by the tt(send-break) command. A restricted set of editing functions is available in the mini-buffer. Keys are looked up in the special diff --git a/Src/Zle/zle_hist.c b/Src/Zle/zle_hist.c index 532787bfa..c9ffda426 100644 --- a/Src/Zle/zle_hist.c +++ b/Src/Zle/zle_hist.c @@ -44,10 +44,15 @@ int histline; /* Previous search string use in an incremental search */ /**/ -ZLE_STRING_T previous_search = NULL; +char *previous_search = NULL; /**/ -int previous_search_len = 0; +int previous_search_len; + +/* Previous aborted search string use in an incremental search */ + +/**/ +char *previous_aborted_search = NULL; /* Local keymap in isearch mode */ @@ -891,32 +896,28 @@ zgetline(UNUSED(char **args)) int historyincrementalsearchbackward(char **args) { - doisearch(args, -1, 0); - return 0; + return doisearch(args, -1, 0); } /**/ int historyincrementalsearchforward(char **args) { - doisearch(args, 1, 0); - return 0; + return doisearch(args, 1, 0); } /**/ int historyincrementalpatternsearchbackward(char **args) { - doisearch(args, -1, 1); - return 0; + return doisearch(args, -1, 1); } /**/ int historyincrementalpatternsearchforward(char **args) { - doisearch(args, 1, 1); - return 0; + return doisearch(args, 1, 1); } static struct isrch_spot { @@ -1023,6 +1024,24 @@ isearch_newpos(LinkList matchlist, int curpos, int dir, return -1; } +/* + * Save an isearch buffer from sbuf to sbuf+sbptr + * into the string *search with length *searchlen. + * searchlen may be NULL; the string is a NULL-terminated metafied string. + */ +static void +save_isearch_buffer(char *sbuf, int sbptr, + char **search, int *searchlen) +{ + if (*search) + free(*search); + *search = zalloc(sbptr+1); + memcpy(*search, sbuf, sbptr); + if (searchlen) + *searchlen = sbptr; + (*search)[sbptr] = '\0'; +} + #define ISEARCH_PROMPT "XXXXXXX XXX-i-search: " #define FAILING_TEXT "failing" #define INVALID_TEXT "invalid" @@ -1034,12 +1053,15 @@ isearch_newpos(LinkList matchlist, int curpos, int dir, int isearch_active, isearch_startpos, isearch_endpos; /**/ -static void +static int doisearch(char **args, int dir, int pattern) { /* The full search buffer, including space for all prompts */ char *ibuf = zhalloc(80); - /* The part of the search buffer with the search string */ + /* + * The part of the search buffer with the search string. + * This is a normal metafied string. + */ char *sbuf = ibuf + FIRST_SEARCH_CHAR; /* The previous line shown to the user */ char *last_line = NULL; @@ -1141,9 +1163,13 @@ doisearch(char **args, int dir, int pattern) * command line. */ ZleIntFunc exitfn = (ZleIntFunc)0; + /* + * Flag that the search was aborted. + */ + int aborted = 0; if (!(he = quietgethist(hl))) - return; + return 1; selectlocalmap(isearch_keymap); @@ -1446,6 +1472,9 @@ doisearch(char **args, int dir, int pattern) zrefresh(); if (!(cmd = getkeycmd()) || cmd == Th(z_sendbreak)) { int i; + aborted = 1; + save_isearch_buffer(sbuf, sbptr, + &previous_aborted_search, NULL); get_isrch_spot(0, &hl, &pos, &pat_hl, &pat_pos, &end_pos, &i, &sbptr, &dir, &nomatch); he = quietgethist(hl); @@ -1597,8 +1626,12 @@ doisearch(char **args, int dir, int pattern) #endif } else { ungetkeycmd(); - if (cmd == Th(z_sendbreak)) + if (cmd == Th(z_sendbreak)) { + aborted = 1; + save_isearch_buffer(sbuf, sbptr, + &previous_aborted_search, NULL); sbptr = 0; + } break; } ins: @@ -1629,9 +1662,8 @@ doisearch(char **args, int dir, int pattern) feep = 0; } if (sbptr) { - zfree(previous_search, previous_search_len); - previous_search = zalloc(sbptr); - memcpy(previous_search, sbuf, previous_search_len = sbptr); + save_isearch_buffer(sbuf, sbptr, + &previous_search, &previous_search_len); } statusline = NULL; unmetafy_line(); @@ -1650,6 +1682,8 @@ doisearch(char **args, int dir, int pattern) kungetct = savekeys; selectlocalmap(NULL); + + return aborted ? 3 : nomatch; } static Histent diff --git a/Src/Zle/zle_params.c b/Src/Zle/zle_params.c index efa628693..f384753e2 100644 --- a/Src/Zle/zle_params.c +++ b/Src/Zle/zle_params.c @@ -54,6 +54,8 @@ static const struct gsu_scalar keymap_gsu = { get_keymap, nullstrsetfn, zleunsetfn }; static const struct gsu_scalar keys_gsu = { get_keys, nullstrsetfn, zleunsetfn }; +static const struct gsu_scalar lastabortedsearch_gsu = +{ get_lasearch, nullstrsetfn, zleunsetfn }; static const struct gsu_scalar lastsearch_gsu = { get_lsearch, nullstrsetfn, zleunsetfn }; static const struct gsu_scalar lastwidget_gsu = @@ -115,6 +117,8 @@ static struct zleparam { { "KEYMAP", PM_SCALAR | PM_READONLY, GSU(keymap_gsu), NULL }, { "KEYS", PM_SCALAR | PM_READONLY, GSU(keys_gsu), NULL }, { "killring", PM_ARRAY, GSU(killring_gsu), NULL }, + { "LASTABORTEDSEARCH", PM_SCALAR | PM_READONLY, GSU(lastabortedsearch_gsu), + NULL }, { "LASTSEARCH", PM_SCALAR | PM_READONLY, GSU(lastsearch_gsu), NULL }, { "LASTWIDGET", PM_SCALAR | PM_READONLY, GSU(lastwidget_gsu), NULL }, { "LBUFFER", PM_SCALAR, GSU(lbuffer_gsu), NULL }, @@ -639,14 +643,21 @@ free_prepostdisplay(void) set_prepost(&postdisplay, &postdisplaylen, NULL); } +/**/ +static char * +get_lasearch(UNUSED(Param pm)) +{ + if (previous_aborted_search) + return previous_aborted_search; + return ""; +} + /**/ static char * get_lsearch(UNUSED(Param pm)) { - if (previous_search_len) { - return zlelineasstring(previous_search, previous_search_len, 0, - NULL, NULL, 1); - } + if (previous_search) + return previous_search; return ""; } -- cgit 1.4.1