@@ -60,7 +60,7 @@ Visit the [Wiki](https://github.com/jarun/nnn/wiki) for concepts, program usage, | |||||
- Notification on cp, mv, rm completion | - Notification on cp, mv, rm completion | ||||
- Copy file paths to system clipboard on select | - Copy file paths to system clipboard on select | ||||
- Create (with parents), rename, duplicate (anywhere) files and dirs | - Create (with parents), rename, duplicate (anywhere) files and dirs | ||||
- Launch GUI apps, run commands, spawn a shell | - Launch GUI apps, run commands, spawn a shell, toggle executable | ||||
- Hovered file set as `$nnn` at prompt and spawned shell | - Hovered file set as `$nnn` at prompt and spawned shell | ||||
- Lock terminal (needs a locker) | - Lock terminal (needs a locker) | ||||
- Privacy-aware (no unconfirmed user data collection) | - Privacy-aware (no unconfirmed user data collection) | ||||
@@ -18,7 +18,6 @@ Plugins extend the capabilities of `nnn`. They are _executable_ scripts (or bina | |||||
| boom | Play random music from dir | sh | [moc](http://moc.daper.net/) | | | boom | Play random music from dir | sh | [moc](http://moc.daper.net/) | | ||||
| dups | List non-empty duplicate files in current dir | sh | find, md5sum,<br>sort uniq xargs | | | dups | List non-empty duplicate files in current dir | sh | find, md5sum,<br>sort uniq xargs | | ||||
| chksum | Create and verify checksums | sh | md5sum,<br>sha256sum | | | chksum | Create and verify checksums | sh | md5sum,<br>sha256sum | | ||||
| chmodx | Toggle executable status of hovered file | sh | chmod | | |||||
| diffs | Diff for selection (limited to 2 for directories) | sh | vimdiff | | | diffs | Diff for selection (limited to 2 for directories) | sh | vimdiff | | ||||
| dragdrop | Drag/drop files from/into nnn | sh | [dragon](https://github.com/mwh/dragon) | | | dragdrop | Drag/drop files from/into nnn | sh | [dragon](https://github.com/mwh/dragon) | | ||||
| fzcd | Change to the directory of a fuzzy-selected file/dir | sh | fzf/fzy<br>fd/fdfind/find | | | fzcd | Change to the directory of a fuzzy-selected file/dir | sh | fzf/fzy<br>fd/fdfind/find | | ||||
@@ -15,5 +15,6 @@ if which autojump >/dev/null 2>&1; then | |||||
odir="$(autojump "$dir")" | odir="$(autojump "$dir")" | ||||
printf "%s" "0$odir" > "$NNN_PIPE" | printf "%s" "0$odir" > "$NNN_PIPE" | ||||
else | else | ||||
exit 1 | printf "autojump missing" | ||||
read -r _ | |||||
fi | fi |
@@ -1,14 +0,0 @@ | |||||
#!/usr/bin/env sh | |||||
# Description: Toggle executable status of hovered file | |||||
# | |||||
# Shell: POSIX compliant | |||||
# Author: Arun Prakash Jana | |||||
if ! [ -z "$1" ]; then | |||||
if [ -x "$1" ]; then | |||||
chmod -x "$1" | |||||
else | |||||
chmod +x "$1" | |||||
fi | |||||
fi |
@@ -3108,6 +3108,13 @@ static bool show_stats(const char *fpath, const struct stat *sb) | |||||
return TRUE; | 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) | static size_t get_fs_info(const char *path, bool type) | ||||
{ | { | ||||
struct statvfs svb; | 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" | "cV Move sel here%-10c^V Copy/move sel as\n" | ||||
"cX Delete sel%-13c^X Delete entry\n" | "cX Delete sel%-13c^X Delete entry\n" | ||||
"ce Edit in EDITOR%-10cp Open in PAGER\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" | "1ORDER TOGGLES\n" | ||||
"cS Disk usage%-14cA Apparent du\n" | "cS Disk usage%-14cA Apparent du\n" | ||||
"cz Size%-20ct Time\n" | "cz Size%-20ct Time\n" | ||||
@@ -4849,13 +4856,19 @@ nochange: | |||||
if (ndents) | if (ndents) | ||||
copycurname(); | copycurname(); | ||||
goto begin; | goto begin; | ||||
case SEL_STATS: | case SEL_STATS: // fallthrough | ||||
case SEL_CHMODX: | |||||
if (ndents) { | if (ndents) { | ||||
mkpath(path, dents[cur].name, newpath); | 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); | printwarn(&presel); | ||||
goto nochange; | goto nochange; | ||||
} | } | ||||
if (sel == SEL_CHMODX) | |||||
dents[cur].mode ^= S_IXUSR; | |||||
} | } | ||||
break; | break; | ||||
case SEL_REDRAW: // fallthrough | case SEL_REDRAW: // fallthrough | ||||
@@ -65,6 +65,7 @@ enum action { | |||||
SEL_TOGGLEDOT, | SEL_TOGGLEDOT, | ||||
SEL_DETAIL, | SEL_DETAIL, | ||||
SEL_STATS, | SEL_STATS, | ||||
SEL_CHMODX, | |||||
SEL_ARCHIVE, | SEL_ARCHIVE, | ||||
SEL_FSIZE, /* file size */ | SEL_FSIZE, /* file size */ | ||||
SEL_ASIZE, /* apparent size */ | SEL_ASIZE, /* apparent size */ | ||||
@@ -177,6 +178,8 @@ static struct key bindings[] = { | |||||
{ 'd', SEL_DETAIL }, | { 'd', SEL_DETAIL }, | ||||
/* File details */ | /* File details */ | ||||
{ 'D', SEL_STATS }, | { 'D', SEL_STATS }, | ||||
/* Toggle executable status */ | |||||
{ '*', SEL_CHMODX }, | |||||
/* Create archive */ | /* Create archive */ | ||||
{ 'i', SEL_ARCHIVE }, | { 'i', SEL_ARCHIVE }, | ||||
/* Toggle sort by size */ | /* Toggle sort by size */ | ||||