aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar Arun Prakash Jana <engineerarun@gmail.com>2018-12-08 23:03:58 +0530
committerGravatar Arun Prakash Jana <engineerarun@gmail.com>2018-12-08 23:03:58 +0530
commit4c7fc6be69c9ea713707b577c5bb30cdd4082349 (patch)
tree9ece631ec5e93d42de5239efb061ce2ccd3099ba
parenta6976550f1f418d340d949dfa61e85d505152dac (diff)
downloadnnn-4c7fc6be69c9ea713707b577c5bb30cdd4082349.tar.gz
Group more options
-rw-r--r--src/nnn.c138
1 files changed, 68 insertions, 70 deletions
diff --git a/src/nnn.c b/src/nnn.c
index c06ce17..c97758e 100644
--- a/src/nnn.c
+++ b/src/nnn.c
@@ -2540,7 +2540,7 @@ static void browse(char *ipath)
char *path, *lastdir, *lastname;
char *dir, *tmp;
struct stat sb;
- int r, fd, presel, ncp = 0, copystartid = 0, copyendid = 0;
+ int r = -1, fd, presel, ncp = 0, copystartid = 0, copyendid = 0;
enum action sel;
bool dir_changed = FALSE;
@@ -2937,7 +2937,7 @@ nochange:
{
mkpath(path, dents[cur].name, newpath, PATH_MAX);
- switch(sel) {
+ switch (sel) {
case SEL_MEDIA:
r = show_mediainfo(newpath, NULL);
break;
@@ -3206,8 +3206,9 @@ nochange:
presel = FILTER;
goto begin;
}
+ case SEL_ARCHIVE: // fallthrough
case SEL_OPEN: // fallthrough
- case SEL_ARCHIVE:
+ case SEL_RENAME:
if (!ndents)
break; // fallthrough
case SEL_LAUNCH: // fallthrough
@@ -3215,14 +3216,23 @@ nochange:
{
char *ptr = NULL, *ptr1 = NULL, *ptr2 = NULL;
- if (sel == SEL_OPEN)
+ switch (sel) {
+ case SEL_OPEN:
tmp = xreadline(NULL, "open with: ");
- else if (sel == SEL_LAUNCH)
+ break;
+ case SEL_RENAME:
+ tmp = xreadline(dents[cur].name, "");
+ break;
+ case SEL_LAUNCH:
tmp = xreadline(NULL, "launch: ");
- else if (sel == SEL_ARCHIVE)
+ break;
+ case SEL_ARCHIVE:
tmp = xreadline(dents[cur].name, "name: ");
- else
+ break;
+ default:
tmp = xreadline(NULL, "name: ");
+ break;
+ }
if (tmp == NULL || tmp[0] == '\0')
break;
@@ -3239,11 +3249,19 @@ nochange:
(r == 'c') ? (r = F_NORMAL) : (r = F_NOWAIT | F_NOTRACE);
}
- if (sel == SEL_OPEN) {
+ switch (sel) {
+ case SEL_OPEN:
getprogarg(tmp, &ptr);
mkpath(path, dents[cur].name, newpath, PATH_MAX);
spawn(tmp, ptr, newpath, path, r);
- } else if (sel == SEL_LAUNCH) {
+ break;
+ case SEL_RENAME:
+ /* Skip renaming to same name */
+ if (strcmp(tmp, dents[cur].name) == 0)
+ goto nochange;
+ break;
+ case SEL_LAUNCH:
+ {
uint args = 0;
ptr = tmp;
@@ -3264,7 +3282,9 @@ nochange:
}
spawn(tmp, ptr1, ptr2, path, r);
- } else if (sel == SEL_ARCHIVE) {
+ break;
+ }
+ case SEL_ARCHIVE:
/* newpath is used as temporary buffer */
if (!getutil(utils[APACK])) {
printmsg("utility missing");
@@ -3272,9 +3292,12 @@ nochange:
}
spawn(utils[APACK], tmp, dents[cur].name, path, F_NORMAL);
+ break;
+ default:
+ break;
}
- if (sel != SEL_NEW) {
+ if (sel != SEL_NEW && sel != SEL_RENAME) {
/* Continue in navigate-as-you-type mode, if enabled */
if (cfg.filtermode)
presel = FILTER;
@@ -3295,76 +3318,51 @@ nochange:
/* Check if another file with same name exists */
if (faccessat(fd, tmp, F_OK, AT_SYMLINK_NOFOLLOW) != -1) {
- printmsg("entry exists");
- goto nochange;
- }
-
- /* Check if it's a dir or file */
- r = get_input("press 'f'(ile) or 'd'(ir)");
- if (r == 'f') {
- r = openat(fd, tmp, O_CREAT, 0666);
- close(r);
- } else if (r == 'd')
- r = mkdirat(fd, tmp, 0777);
- else {
- close(fd);
- break;
- }
-
- if (r == -1) {
- printwarn();
- close(fd);
- goto nochange;
- }
-
- close(fd);
- xstrlcpy(lastname, tmp, NAME_MAX + 1);
- goto begin;
- }
- case SEL_RENAME:
- if (!ndents)
- break;
-
- tmp = xreadline(dents[cur].name, "");
- if (tmp == NULL || tmp[0] == '\0')
- break;
-
- /* Allow only relative, same dir paths */
- if (tmp[0] == '/' || strcmp(xbasename(tmp), tmp) != 0) {
- printmsg(messages[STR_INPUT_ID]);
- goto nochange;
- }
-
- /* Skip renaming to same name */
- if (strcmp(tmp, dents[cur].name) == 0)
- break;
-
- /* Open the descriptor to currently open directory */
- fd = open(path, O_RDONLY | O_DIRECTORY);
- if (fd == -1) {
- printwarn();
- goto nochange;
+ if (sel == SEL_RENAME) {
+ /* File with the same name exists */
+ if (get_input("press 'y' to overwrite") != 'y') {
+ close(fd);
+ break;
+ }
+ } else {
+ close(fd);
+ printmsg("entry exists");
+ goto nochange;
+ }
}
- /* Check if another file with same name exists */
- if (faccessat(fd, tmp, F_OK, AT_SYMLINK_NOFOLLOW) != -1) {
- /* File with the same name exists */
- if (get_input("press 'y' to overwrite") != 'y') {
+ if (sel == SEL_RENAME) {
+ /* Rename the file */
+ if (renameat(fd, dents[cur].name, fd, tmp) != 0) {
+ close(fd);
+ printwarn();
+ goto nochange;
+ }
+ } else {
+ /* Check if it's a dir or file */
+ r = get_input("press 'f'(ile) or 'd'(ir)");
+ if (r == 'f') {
+ r = openat(fd, tmp, O_CREAT, 0666);
+ close(r);
+ } else if (r == 'd') {
+ r = mkdirat(fd, tmp, 0777);
+ } else {
close(fd);
break;
}
- }
- /* Rename the file */
- if (renameat(fd, dents[cur].name, fd, tmp) != 0) {
- printwarn();
- close(fd);
- goto nochange;
+ /* Check if file creation failed */
+ if (r == -1) {
+ close(fd);
+ printwarn();
+ goto nochange;
+ }
}
close(fd);
xstrlcpy(lastname, tmp, NAME_MAX + 1);
goto begin;
+ }
case SEL_EXEC:
if (!ndents)
goto nochange; // fallthrough