commit 0ea63bf4f24b7ed021b35bce236b69778e574fe2
parent 256cbdbeb8582f19f4a854967464ee67eeb3c338
Author: afify <hassan@afify.dev>
Date: Sat, 22 May 2021 11:57:29 +0300
[fix #16] visual commands cp, mv, rm
- free files():
- init_files():
- selected_files (cp, mv, rm) use one spawn() call
- tmp ignore rm_cmd, cp_cmd, mv_cmd in visual mode
- empty dir don't add highlight if dirc < 1
Diffstat:
M | sfm.c | | | 89 | ++++++++++++++++++++++++++++++++++++++++++++++++++----------------------------- |
1 file changed, 57 insertions(+), 32 deletions(-)
diff --git a/sfm.c b/sfm.c
@@ -209,7 +209,7 @@ struct kevent evlist[2]; /* events we want to monitor */
struct kevent chlist[2]; /* events that were triggered */
static struct timespec gtimeout;
#endif
-#if defined(__linux__) || defined (__FreeBSD__)
+#if defined(__linux__) || defined(__FreeBSD__)
#define OFF_T "%ld"
#elif defined(__NetBSD__) || defined(__OpenBSD__) || defined(__APPLE__)
#define OFF_T "%lld"
@@ -1413,16 +1413,10 @@ selcalc(void)
static void
free_files(void)
{
- size_t i;
-
- if (selected_files != NULL) {
- for (i = 0; i < selection_size; i++) {
- free(selected_files[i]);
- selected_files[i] = NULL;
- }
- free(selected_files);
- selected_files = NULL;
- }
+ if (selected_files == NULL)
+ return;
+ free(selected_files);
+ selected_files = NULL;
}
static void
@@ -1435,10 +1429,7 @@ init_files(void)
selected_files = ecalloc(selection_size, sizeof(char *));
for (i = 0; i < selection_size; i++) {
- selected_files[i] = ecalloc(MAX_P, sizeof(char));
- strncpy(selected_files[i],
- cpane->direntr[selection[i] - 1].name,
- MAX_P); /* TODO use pointer */
+ selected_files[i] = cpane->direntr[selection[i] - 1].name;
}
}
@@ -1469,12 +1460,26 @@ seldel(void)
free(inp_conf);
init_files();
- for (i = 0; i < selection_size; i++) {
- spawn(rm_cmd, selected_files[i]);
+
+ /* selected_files */
+ char *seldel_cmd[selection_size + 3];
+ seldel_cmd[0] = "rm";
+ seldel_cmd[1] = "-rf";
+ seldel_cmd[selection_size + 2] = NULL;
+
+ /* add files to array */
+ for (i = 2; i < selection_size + 2; i++) {
+ seldel_cmd[i] = selected_files[i - 2];
}
- cpane->hdir = cpane->dirc - selection_size;
- print_status(cprompt, "%zu files are deleted", selection_size);
+ if (spawn(seldel_cmd, NULL) < 0)
+ print_error(strerror(errno));
+ else
+ print_status(cprompt, "%zu files are deleted", selection_size);
+
+ if (cpane->dirc > 0)
+ cpane->hdir = cpane->dirc - selection_size;
+
free_files();
cont_vmode = -1;
}
@@ -1486,7 +1491,7 @@ paste(void)
if (strnlen(yank_file, MAX_P) != 0) {
print_status(cprompt, "coping");
if (spawn(cp_cmd, cpane->dirn) != 0)
- print_error("coping failed");
+ print_error(strerror(errno));
else
print_status(cprompt, "file copied");
yank_file[0] = '\0'; /* set yank_file len 0 */
@@ -1498,12 +1503,22 @@ paste(void)
if (selected_files == NULL)
return;
- for (i = 0; i < selection_size; i++) {
- char *selcp_cmd[] = { "cp", "-r", selected_files[i],
- cpane->dirn, NULL };
- spawn(selcp_cmd, NULL);
+ /* selected_files */
+ char *selcp_cmd[selection_size + 3];
+ selcp_cmd[0] = "cp";
+ selcp_cmd[1] = "-r";
+ selcp_cmd[selection_size + 2] = NULL;
+
+ /* add files to array */
+ for (i = 2; i < selection_size + 2; i++) {
+ selcp_cmd[i] = selected_files[i - 2];
}
- print_status(cprompt, "%zu files are copied", selection_size);
+
+ if (spawn(selcp_cmd, cpane->dirn) < 0)
+ print_error(strerror(errno));
+ else
+ print_status(cprompt, "%zu files are copied", selection_size);
+
free_files();
}
@@ -1515,7 +1530,7 @@ selmv(void)
if (strnlen(yank_file, MAX_P) != 0) {
print_status(cprompt, "moving");
if (spawn(mv_cmd, cpane->dirn) != 0)
- print_error("moving failed");
+ print_error(strerror(errno));
else
print_status(cprompt, "file moved");
yank_file[0] = '\0'; /* set yank_file len 0 */
@@ -1527,12 +1542,22 @@ selmv(void)
if (selected_files == NULL)
return;
- for (i = 0; i < selection_size; i++) {
- char *selmv_cmd[] = { "mv", selected_files[i], cpane->dirn,
- NULL };
- spawn(selmv_cmd, NULL);
+ /* selected_files */
+ char *selmv_cmd[selection_size + 3];
+ selmv_cmd[0] = "mv";
+ selmv_cmd[1] = "-r";
+ selmv_cmd[selection_size + 2] = NULL;
+
+ /* add files to array */
+ for (i = 2; i < selection_size + 2; i++) {
+ selmv_cmd[i] = selected_files[i - 2];
}
- print_status(cprompt, "%zu files are moved", selection_size);
+
+ if (spawn(selmv_cmd, cpane->dirn) < 0)
+ print_error(strerror(errno));
+ else
+ print_status(cprompt, "%zu files are moved", selection_size);
+
free_files();
}
@@ -1821,7 +1846,7 @@ listdir(int hi)
qsort(cpane->direntr, cpane->dirc, sizeof(Entry), sort_name);
refresh_pane();
- if (hi == AddHi)
+ if (hi == AddHi && cpane->dirc > 0)
add_hi(cpane, cpane->hdir - 1);
if (closedir(dir) < 0)