mirror of
git://git.code.sf.net/p/zsh/code
synced 2025-09-23 04:51:12 +02:00
users/13902: make isearch return status useful
add LASTABORTEDSEARCH variable
This commit is contained in:
parent
1f37225708
commit
ea29159571
4 changed files with 83 additions and 25 deletions
|
@ -1,5 +1,9 @@
|
|||
2009-03-13 Peter Stephenson <pws@csr.com>
|
||||
|
||||
* 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 $
|
||||
*****************************************************
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 "";
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue