diff --git a/README.md b/README.md index 83482b6a..d8831b3e 100644 --- a/README.md +++ b/README.md @@ -121,6 +121,7 @@ nnn needs libreadline, libncursesw (on Linux or ncurses on OS X) and standard li optional arguments: -d start in detail view mode + -p path to custom nlay -S start in disk usage analyzer mode -v show program version and exit -h show this help and exit diff --git a/nlay b/nlay index 0106125d..20d6e8ed 100755 --- a/nlay +++ b/nlay @@ -25,8 +25,10 @@ # 3. Assuming you don't to play multiple audio/video files simultaneously, # nlay kills any running instances of the audio/video player in bg mode. # -# 4. Keep a personal backup (on GitHub Gist maybe?) of this file if you modify -# it. nlay is OVERWRITTEN during nnn upgrade. +# 4. nlay is OVERWRITTEN during nnn upgrade. You can store your custom nlay in a +# location other than the default and have an alias with nnn option '-p' to +# invoke it. Remember it might break or lack new capabilities added to nlay +# in future releases. Check the file diff once in a while. # # Author: Arun Prakash Jana # Email: engineerarun@gmail.com diff --git a/nnn.c b/nnn.c index 512f20fe..0fb3d4b7 100644 --- a/nnn.c +++ b/nnn.c @@ -144,6 +144,7 @@ static int ndents, cur, total_dents; static int idle; static char *opener; static char *fb_opener; +static char *player; static char *copier; static char *desktop_manager; static off_t blk_size; @@ -1570,7 +1571,7 @@ nochange: /* If NNN_OPENER is set, use it */ if (opener) { sprintf(cmd, "%s \'", opener); - xstrlcpy(cmd + strlen(cmd), newpath, sizeof(cmd) - strlen(cmd)); + xstrlcpy(cmd + strlen(cmd), newpath, MAX_CMD_LEN - strlen(cmd)); strcat(cmd, "\' > /dev/null 2>&1"); r = system(cmd); continue; @@ -1579,8 +1580,13 @@ nochange: /* Play with nlay if identified */ mime = getmime(dents[cur].name); if (mime) { - strcpy(cmd, "nlay \'"); - xstrlcpy(cmd + strlen(cmd), newpath, sizeof(cmd) - strlen(cmd)); + if (player) { + cmd[0] = '\''; + xstrlcpy(cmd + 1, player, MAX_CMD_LEN); + strcat(cmd, "\' \'"); + } else + strcpy(cmd, "nlay \'"); + xstrlcpy(cmd + strlen(cmd), newpath, MAX_CMD_LEN - strlen(cmd)); sprintf(cmd + strlen(cmd), "\' %s", mime); exitcurses(); r = system(cmd); @@ -1591,7 +1597,7 @@ nochange: /* If nlay doesn't handle it, open plain text files with vi, then try NNN_FALLBACK_OPENER */ strcpy(cmd, "file -bi \'"); - xstrlcpy(cmd + strlen(cmd), newpath, sizeof(cmd) - strlen(cmd)); + xstrlcpy(cmd + strlen(cmd), newpath, MAX_CMD_LEN - strlen(cmd)); strcat(cmd, "\'"); if (get_output(cmd, MAX_CMD_LEN) == NULL) continue; @@ -1604,7 +1610,7 @@ nochange: continue; } else if (fb_opener) { sprintf(cmd, "%s \'", fb_opener); - xstrlcpy(cmd + strlen(cmd), newpath, sizeof(cmd) - strlen(cmd)); + xstrlcpy(cmd + strlen(cmd), newpath, MAX_CMD_LEN - strlen(cmd)); strcat(cmd, "\' > /dev/null 2>&1"); r = system(cmd); continue; @@ -2001,6 +2007,7 @@ positional arguments:\n\ PATH directory to open [default: current dir]\n\n\ optional arguments:\n\ -d start in detail view mode\n\ + -p path to custom nlay\n\ -S start in disk usage analyzer mode\n\ -v show program version and exit\n\ -h show this help and exit\n\n\ @@ -2027,7 +2034,7 @@ main(int argc, char *argv[]) if (argc > 3) usage(); - while ((opt = getopt(argc, argv, "dSvh")) != -1) { + while ((opt = getopt(argc, argv, "dSp:vh")) != -1) { switch (opt) { case 'S': bsizeorder = 1; @@ -2036,6 +2043,13 @@ main(int argc, char *argv[]) showdetail = 1; printptr = &printent_long; break; + case 'p': + player = optarg; + if (strlen(player) > 512) { + fprintf(stderr, "path to player must be <= 512 characters\n"); + exit(1); + } + break; case 'v': fprintf(stdout, "%s\n", VERSION); return 0;