diff --git a/CHANGELOG b/CHANGELOG
index ae2c98cf..b12401da 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -5,6 +5,7 @@ What's in?
- Copy multiple file paths
- Copy file paths when X is unavailable
- Optionally quote individual file paths with single quotes on copy
+- Batch rename files in vidir from [moreutils](https://joeyh.name/code/moreutils/)
- Use ISO 8601 date format in file details
- New/changed/remapped shortcuts:
- ^B - show bookmark prompt (replaces b)
diff --git a/README.md b/README.md
index 5d06900c..6cebcf3f 100644
--- a/README.md
+++ b/README.md
@@ -109,6 +109,7 @@ Have fun with it! PRs are welcome. Check out [#1](https://github.com/jarun/nnn/i
- Sort by file name, modification time, size
- Convenience
- Create, rename files and directories
+ - Batch rename current directory entries in vidir (from moreutils)
- Spawn SHELL (fallback sh) in the current directory
- Copy absolute file paths with/without X (*easy* shell integration)
- Change directory at exit (*easy* shell integration)
@@ -238,6 +239,7 @@ optional arguments:
M | Full media info
n | Create new
^R | Rename entry
+ R | Rename dir entries
s | Toggle sort by size
S, ^J | Toggle du mode
t | Toggle sort by mtime
@@ -303,6 +305,7 @@ The following abbreviations are used in the detail view:
export NNN_DE_FILE_MANAGER=nautilus
- [mediainfo](https://mediaarea.net/en/MediaInfo) (or [exiftool](https://sno.phy.queensu.ca/~phil/exiftool/), if specified) is required to view media information
- [atool](http://www.nongnu.org/atool/) is required to list and extract archives
+- vidir from [moreutils](https://joeyh.name/code/moreutils/) is used to batch rename entries in current directory
#### Help
diff --git a/nnn.1 b/nnn.1
index d895828d..9308f770 100644
--- a/nnn.1
+++ b/nnn.1
@@ -82,6 +82,8 @@ Show full media info
Create a new file or directory
.It Ic ^R
Rename selected entry
+.It Ic R
+Rename directory entries
.It Ic s
Toggle sort by file size
.It Ic S, ^J
diff --git a/nnn.c b/nnn.c
index 1161de74..32a7d279 100644
--- a/nnn.c
+++ b/nnn.c
@@ -281,7 +281,8 @@ static char * const utils[] = {
"xdg-open",
#endif
"nlay",
- "atool"
+ "atool",
+ "vidir"
};
/* Common strings */
@@ -641,7 +642,7 @@ appendfilepath(const char *path, const size_t len)
copybuflen += PATH_MAX;
pcopybuf = xrealloc(pcopybuf, copybuflen);
if (!pcopybuf) {
- printmsg("no memory!\n");
+ printmsg("no memory!");
return FALSE;
}
}
@@ -1867,6 +1868,7 @@ show_help(char *path)
"eM | Full media info\n"
"en | Create new\n"
"d^R | Rename entry\n"
+ "eR | Rename dir entries\n"
"es | Toggle sort by size\n"
"aS, ^J | Toggle du mode\n"
"et | Toggle sort by mtime\n"
@@ -3070,6 +3072,35 @@ nochange:
close(fd);
xstrlcpy(oldname, tmp, NAME_MAX + 1);
goto begin;
+ case SEL_RENAMEALL:
+ if (!get_output(g_buf, MAX_CMD_LEN, "which", utils[5], NULL, 0)) {
+ printmsg("vidir missing");
+ goto nochange;
+ }
+
+ /* Save the program start dir */
+ tmp = getcwd(newpath, PATH_MAX);
+ if (tmp == NULL) {
+ printwarn();
+ goto nochange;
+ }
+
+ /* Switch to current path for readline(3) */
+ if (chdir(path) == -1) {
+ printwarn();
+ goto nochange;
+ }
+
+ spawn(utils[5], ".", NULL, NULL, F_NORMAL);
+
+ /* Change back to program start dir */
+ if (chdir(newpath) == -1)
+ printwarn();
+
+ /* Save current */
+ if (ndents > 0)
+ copycurname();
+ goto begin;
case SEL_HELP:
show_help(path);
break;
diff --git a/nnn.h b/nnn.h
index bb757f97..8ab86575 100644
--- a/nnn.h
+++ b/nnn.h
@@ -39,6 +39,7 @@ enum action {
SEL_OPEN,
SEL_NEW,
SEL_RENAME,
+ SEL_RENAMEALL,
SEL_HELP,
SEL_RUN,
SEL_RUNARG,
@@ -158,6 +159,8 @@ static struct key bindings[] = {
/* Show rename prompt */
{ CONTROL('R'), SEL_RENAME, "", "" },
{ KEY_F(2), SEL_RENAME, "", "" }, /* Undocumented */
+ /* Rename contents of current dir */
+ { 'R', SEL_RENAMEALL, "", "" },
/* Show help */
{ '?', SEL_HELP, "", "" },
/* Run command */