From c92c5c7b1576dd3ab13c055ed399ad0f09d74bbc Mon Sep 17 00:00:00 2001 From: Arun Prakash Jana Date: Thu, 2 Jan 2020 23:13:56 +0530 Subject: Support toggle exe --- src/nnn.c | 19 ++++++++++++++++--- src/nnn.h | 3 +++ 2 files changed, 19 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/nnn.c b/src/nnn.c index 85d52fe..afe7fae 100644 --- a/src/nnn.c +++ b/src/nnn.c @@ -3108,6 +3108,13 @@ static bool show_stats(const char *fpath, const struct stat *sb) return TRUE; } +static bool xchmod(const char *fpath, mode_t mode) +{ + (S_IXUSR & mode) ? (mode &= ~(S_IXUSR | S_IXGRP | S_IXOTH)) : (mode |= (S_IXUSR | S_IXGRP | S_IXOTH)); + + return (chmod(fpath, mode) == 0); +} + static size_t get_fs_info(const char *path, bool type) { struct statvfs svb; @@ -3491,7 +3498,7 @@ static void show_help(const char *path) "cV Move sel here%-10c^V Copy/move sel as\n" "cX Delete sel%-13c^X Delete entry\n" "ce Edit in EDITOR%-10cp Open in PAGER\n" - "ci Archive entry%-0c\n" + "ci Archive entry%-11c* Toggle exe\n" "1ORDER TOGGLES\n" "cS Disk usage%-14cA Apparent du\n" "cz Size%-20ct Time\n" @@ -4849,13 +4856,19 @@ nochange: if (ndents) copycurname(); goto begin; - case SEL_STATS: + case SEL_STATS: // fallthrough + case SEL_CHMODX: if (ndents) { mkpath(path, dents[cur].name, newpath); - if (lstat(newpath, &sb) == -1 || !show_stats(newpath, &sb)) { + if (lstat(newpath, &sb) == -1 + || (sel == SEL_STATS && !show_stats(newpath, &sb)) + || (sel == SEL_CHMODX && !xchmod(newpath, sb.st_mode))) { printwarn(&presel); goto nochange; } + + if (sel == SEL_CHMODX) + dents[cur].mode ^= S_IXUSR; } break; case SEL_REDRAW: // fallthrough diff --git a/src/nnn.h b/src/nnn.h index 4ef40bf..4e1311c 100644 --- a/src/nnn.h +++ b/src/nnn.h @@ -65,6 +65,7 @@ enum action { SEL_TOGGLEDOT, SEL_DETAIL, SEL_STATS, + SEL_CHMODX, SEL_ARCHIVE, SEL_FSIZE, /* file size */ SEL_ASIZE, /* apparent size */ @@ -177,6 +178,8 @@ static struct key bindings[] = { { 'd', SEL_DETAIL }, /* File details */ { 'D', SEL_STATS }, + /* Toggle executable status */ + { '*', SEL_CHMODX }, /* Create archive */ { 'i', SEL_ARCHIVE }, /* Toggle sort by size */ -- cgit v1.2.3-70-g09d2