commit fd8d60f5fce66c8a9b8df6e7b0f61ad4cffa6e67
parent cbeca9e61ec6b4e39c9af261abb1b469e6e1437a
Author: Arun Prakash Jana <engineerarun@gmail.com>
Date: Tue, 31 Mar 2026 23:16:57 +0530
Support escaping name completions in prompt
Diffstat:
1 file changed, 13 insertions(+), 5 deletions(-)
diff --git a/src/nnn.c b/src/nnn.c
@@ -4184,11 +4184,17 @@ static char *xreadline(const char *prefill, const char *prompt)
}
continue;
case '\t':
- if ((len == pos) && ndents && (pos < (READLINE_MAX - xstrlen(pdents[cur].name)))) {
- buf[pos] = '\0';
- lpos = mbstowcs(NULL, pdents[cur].name, MB_CUR_MAX);
- pos += mbstowcs(buf + wcslen(buf), pdents[cur].name, lpos);
- len = pos;
+ if ((len == pos) && ndents) {
+ char *escptr = g_buf;
+ size_t esclen = CMD_LEN_MAX;
+ ssize_t elen = shell_escape(&escptr, &esclen, pdents[cur].name);
+
+ if (elen > 0 && (pos < (READLINE_MAX - (size_t)elen))) {
+ buf[pos] = '\0';
+ lpos = mbstowcs(NULL, g_buf, 0);
+ pos += mbstowcs(buf + wcslen(buf), g_buf, lpos + 1);
+ len = pos;
+ }
}
continue;
case CONTROL('F'):
@@ -6604,7 +6610,9 @@ static bool prompt_run(void)
int cnt_j, cnt_J, cmd_ret;
size_t len;
+ /* Run the command once per selected file */
const char *xargs_j = "xargs -0 -I{} %s < '%s'";
+ /* Append all selected files as arguments at once to the command */
const char *xargs_J = "xargs -0 %s < '%s'";
char cmd[CMD_LEN_MAX + 32]; // 32 for xargs format strings