browser: allow backward/forward re-searches with Alt+Up/Alt+Down

Also bind 'N' to a backward re-search, while retaining 'n' for a
forward one,  This matches the functionality in the help viewer.
This commit is contained in:
David Lawrence Ramsey 2017-08-14 15:58:25 -05:00 committed by Benno Schulenberg
parent 5fcda555ea
commit 633343de24
3 changed files with 31 additions and 18 deletions

View File

@ -171,11 +171,15 @@ char *do_browser(char *path)
say_there_is_no_help();
#endif
} else if (func == do_search) {
/* Search for a filename. */
do_filesearch();
} else if (func == do_research) {
/* Search for another filename. */
do_fileresearch();
do_fileresearch(FALSE);
#ifndef NANO_TINY
} else if (func == do_findprevious) {
do_fileresearch(TRUE);
} else if (func == do_findnext) {
do_fileresearch(FALSE);
#endif
} else if (func == do_left) {
if (selected > 0)
selected--;
@ -488,6 +492,9 @@ functionptrtype parse_browser_input(int *kbinput)
case '/':
return do_search;
case 'N':
#ifndef NANO_TINY
return do_findprevious;
#endif
case 'n':
return do_research;
}
@ -697,8 +704,9 @@ int filesearch_init(void)
return input;
}
/* Look for the given needle in the list of files. */
void findnextfile(const char *needle)
/* Look for the given needle in the list of files. If forwards is TRUE,
* search forward in the list; otherwise, search backward. */
void findfile(const char *needle, bool forwards)
{
size_t looking_at = selected;
/* The location in the file list of the filename we're looking at. */
@ -718,12 +726,16 @@ void findnextfile(const char *needle)
/* Step through each filename in the list until a match is found or
* we've come back to the point where we started. */
while (TRUE) {
/* Move to the next filename in the list, or back to the first. */
if (looking_at < filelist_len - 1)
looking_at++;
else {
looking_at = 0;
statusbar(_("Search Wrapped"));
if (forwards) {
if (looking_at++ == filelist_len - 1) {
looking_at = 0;
statusbar(_("Search Wrapped"));
}
} else {
if (looking_at-- == 0) {
looking_at = filelist_len - 1;
statusbar(_("Search Wrapped"));
}
}
/* Get the bare filename, without the path. */
@ -770,16 +782,17 @@ void do_filesearch(void)
update_history(&search_history, answer);
#endif
findnextfile(answer);
findfile(answer, TRUE);
}
/* Search again for the last given filename, without prompting. */
void do_fileresearch(void)
/* Search again without prompting for the last given search string,
* either forwards or backwards. */
void do_fileresearch(bool forwards)
{
if (*last_search == '\0')
statusbar(_("No current search pattern"));
else
findnextfile(last_search);
findfile(last_search, forwards);
}
/* Select the first file in the list. */

View File

@ -1143,8 +1143,8 @@ void shortcut_init(void)
add_to_sclist(MMAIN, "M-\xE2\x86\x92", ALT_RIGHT, switch_to_next_buffer_void, 0);
#endif
#ifndef NANO_TINY
add_to_sclist(MMAIN|MHELP, "M-\xE2\x86\x91", ALT_UP, do_findprevious, 0);
add_to_sclist(MMAIN|MHELP, "M-\xE2\x86\x93", ALT_DOWN, do_findnext, 0);
add_to_sclist(MMAIN|MHELP|MBROWSER, "M-\xE2\x86\x91", ALT_UP, do_findprevious, 0);
add_to_sclist(MMAIN|MHELP|MBROWSER, "M-\xE2\x86\x93", ALT_DOWN, do_findnext, 0);
#endif
} else
#endif

View File

@ -186,7 +186,7 @@ functionptrtype parse_browser_input(int *kbinput);
void browser_refresh(void);
void browser_select_dirname(const char *needle);
void do_filesearch(void);
void do_fileresearch(void);
void do_fileresearch(bool forwards);
void do_first_file(void);
void do_last_file(void);
char *strip_last_component(const char *path);