Implement dir auto-select in nav-as-you-type mode.

If only one entry matches regex filter and it it a directory, cd into it.
This commit is contained in:
Arun Prakash Jana 2018-08-08 04:57:49 +05:30
parent 38a4a2cf8b
commit bf36462a2b
No known key found for this signature in database
GPG key ID: A75979F35C080412
3 changed files with 19 additions and 0 deletions

View file

@ -276,6 +276,8 @@ If `nnn` is invoked as root or the environment variable `NNN_SHOW_HIDDEN` is set
In this mode directories are opened in filter mode, allowing continuous navigation. Works best with the **arrow keys**. In this mode directories are opened in filter mode, allowing continuous navigation. Works best with the **arrow keys**.
In case of only one match and it's a directory, `nnn` auto selects the directory and enters it in this mode.
#### File indicators #### File indicators
The following indicators are used in the detail view: The following indicators are used in the detail view:

2
nnn.1
View file

@ -206,6 +206,8 @@ is invoked as root or the environment variable \fBNNN_SHOW_HIDDEN\fR is set the
.Pp .Pp
In the \fInavigate-as-you-type\fR mode directories are opened in filter mode, In the \fInavigate-as-you-type\fR mode directories are opened in filter mode,
allowing continuous navigation. Works best with the \fBarrow keys\fR. allowing continuous navigation. Works best with the \fBarrow keys\fR.
.br
In case of only one match and it's a directory, `nnn` auto selects the directory and enters it in this mode.
.Sh MULTI-COPY MODE .Sh MULTI-COPY MODE
The absolute path of a single file can be copied to clipboard by pressing \fI^K\fR if The absolute path of a single file can be copied to clipboard by pressing \fI^K\fR if
NNN_COPIER is set (see ENVIRONMENT section below). NNN_COPIER is set (see ENVIRONMENT section below).

15
nnn.c
View file

@ -1161,6 +1161,21 @@ filterentries(char *path)
ndents = total; ndents = total;
if (matches(pln) == -1) if (matches(pln) == -1)
continue; continue;
/* If the only match is a dir, auto-select and cd into it */
if (cfg.filtermode && ndents == 1 && S_ISDIR(dents[0].mode)) {
*ch = KEY_ENTER;
cur = 0;
goto end;
}
/*
* redraw() should be above the auto-select optimization, for
* the case where there's an issue with dir auto-select, say,
* due to a permission problem. The transition is jumpy in
* case of such an error. However, we optimize for successful
* cases where the dir has permissions. This skips a redraw().
*/
redraw(path); redraw(path);
printprompt(ln); printprompt(ln);
} }