diff --git a/src/nnn.c b/src/nnn.c index 5f068437..6fa3d9c2 100644 --- a/src/nnn.c +++ b/src/nnn.c @@ -809,18 +809,19 @@ static size_t selectiontofd(int fd, uint *pcount) return pos; } -static void showcplist(void) +/* List selection from selection buffer */ +static bool showcplist(void) { int fd; size_t pos; if (!copybufpos) - return; + return FALSE; fd = create_tmp_file(); if (fd == -1) { DPRINTF_S("mkstemp failed!"); - return; + return FALSE; } pos = selectiontofd(fd, NULL); @@ -829,6 +830,26 @@ static void showcplist(void) if (pos && pos == copybufpos) spawn(pager, g_tmpfpath, NULL, NULL, F_CLI); unlink(g_tmpfpath); + + return TRUE; +} + +/* List selection from selection file (another instance) */ +static bool showcpfile(void) +{ + struct stat sb; + + if (stat(g_cppath, &sb) == -1) + return FALSE; + + /* Nothing selected if file size is 0 */ + if (!sb.st_size) + return FALSE; + + snprintf(g_buf, CMD_LEN_MAX, "cat %s | tr \'\\0\' \'\\n\'", g_cppath); + spawn("sh", "-c", g_buf, NULL, F_NORMAL | F_CMD); + + return TRUE; } static bool cpsafe(void) @@ -3923,8 +3944,7 @@ nochange: } continue; case SEL_COPYLIST: - if (copybufpos) { - showcplist(); + if (showcplist() || showcpfile()) { if (cfg.filtermode) presel = FILTER; break;