Download raw body.
mg: move up directory in dired
On 2024/06/02 02:12:57 -0400, Dante Catalfamo <dante@lambda.cx> wrote:
> I had forgotten to add the command to the function map
Looks great to me! I've missed something like this to jump to the
parent directory quickly than searching for the '..' entry.
I have a few nits, mostly on the style, but if noone complains I'll
commit in a few days.
> [...]
> +int
> +d_updirectory(int f, int n)
> +{
> +
> + struct buffer *bp;
> + int ret;
> + char fname[NFILEN];
nit: I'd keep these aligned as in the rest of the file.
> + ret = snprintf(fname, sizeof(fname), "%s..", curbp->b_fname);
> + if (ret < 0 || ret >= (int)sizeof(fname))
nit/cargo culting: to stay closer to the "proper secure idiom" outlined
in printf(3) CAVEATS section, I'd change the casting to
if (ret < 0 || (size_t)ret >= sizeof(buff))
even if in practice it's exactly the same stuff.
> + return (ABORT); /* Name is too long. */
> +
> + bp = dired_(fname);
> + if (bp == NULL)
> + return (FALSE);
> + curbp = bp;
> + if (showbuffer(bp, curwp, WFFULL) != TRUE)
> + return (FALSE);
> + if (bp->b_fname[0] != 0)
> + return (TRUE);
> + return (readin(fname));
> +}
Then I also think we should document this addition in mg.1. I'm
attaching an updated diff with the manpage addition, plus a proposed
follow-up
diff -s /usr/src
commit - 47c8d1014851805fa59b884ed3dceb148358575f
path + /usr/src (staged changes)
blob - 579ac9a124f4e66007c8dcdd88d2c8f10aad71d9
blob + 2fcb1c49f374b02c58136c3267d7171acfd2655e
--- usr.bin/mg/dired.c
+++ usr.bin/mg/dired.c
@@ -34,6 +34,7 @@ static int d_otherwindow(int, int);
static int d_undel(int, int);
static int d_undelbak(int, int);
static int d_findfile(int, int);
+static int d_updirectory(int, int);
static int d_ffotherwindow(int, int);
static int d_expunge(int, int);
static int d_copy(int, int);
@@ -122,6 +123,10 @@ static PF diredcz[] = {
d_create_directory /* + */
};
+static PF diredcaret[] = {
+ d_updirectory /* ^ */
+};
+
static PF direda[] = {
d_filevisitalt, /* a */
rescan, /* b */
@@ -172,9 +177,9 @@ static struct KEYMAPE (1) d_backpagemap = {
}
};
-static struct KEYMAPE (7) diredmap = {
- 7,
- 7,
+static struct KEYMAPE (8) diredmap = {
+ 8,
+ 8,
rescan,
{
{
@@ -191,6 +196,9 @@ static struct KEYMAPE (7) diredmap = {
CCHR('Z'), '+', diredcz, (KEYMAP *) & metamap
},
{
+ '^', '^', diredcaret, NULL
+ },
+ {
'a', 'j', direda, NULL
},
{
@@ -224,6 +232,7 @@ dired_init(void)
funmap_add(d_undel, "dired-unmark", 0);
funmap_add(d_undelbak, "dired-unmark-backward", 0);
funmap_add(d_killbuffer_cmd, "quit-window", 0);
+ funmap_add(d_updirectory, "dired-up-directory", 0);
maps_add((KEYMAP *)&diredmap, "dired");
dobindkey(fundamental_map, "dired", "^Xd");
}
@@ -364,6 +373,28 @@ d_findfile(int f, int n)
}
int
+d_updirectory(int f, int n)
+{
+ struct buffer *bp;
+ int ret;
+ char fname[NFILEN];
+
+ ret = snprintf(fname, sizeof(fname), "%s..", curbp->b_fname);
+ if (ret < 0 || (size_t)ret >= sizeof(fname))
+ return (ABORT); /* Name is too long. */
+
+ bp = dired_(fname);
+ if (bp == NULL)
+ return (FALSE);
+ curbp = bp;
+ if (showbuffer(bp, curwp, WFFULL) != TRUE)
+ return (FALSE);
+ if (bp->b_fname[0] != 0)
+ return (TRUE);
+ return (readin(fname));
+}
+
+int
d_ffotherwindow(int f, int n)
{
char fname[NFILEN];
blob - 4faeb8fb293954d061e883a8a53482743afcde3b
blob + 366d6087064a44bb3d28a750e3a7d4a8258adc5f
--- usr.bin/mg/mg.1
+++ usr.bin/mg/mg.1
@@ -1055,6 +1055,8 @@ dired-next-line
dired-shell-command
.It +
dired-create-directory
+.It ^
+dired-up-directory
.It a
dired-find-alternate-file
.It c
@@ -1130,6 +1132,8 @@ Remove the deletion flag for the file on the current l
.It Ic dired-unmark-backward
Remove the deletion flag from the file listed on the previous line
of the dired buffer, then move up to that line.
+.It Ic dired-up-directory
+Open a dired buffer in the parent directory.
.It Ic quit-window
Close the current dired buffer.
.El
Then, since we have dired-up-directory, I'd propose to use it in
dired-jump since it's handy to keep pressing C-x C-j to navigate
upwards. GNU Emacs does this by default too.
diff /usr/src
commit - 47c8d1014851805fa59b884ed3dceb148358575f
path + /usr/src
blob - 2fcb1c49f374b02c58136c3267d7171acfd2655e (staged)
file + usr.bin/mg/dired.c
--- usr.bin/mg/dired.c
+++ usr.bin/mg/dired.c
@@ -1125,7 +1125,7 @@ dired_jump(int f, int n)
for (i = 0; i <= curbp->b_nmodes; i++) {
modename = curbp->b_modes[i]->p_name;
if (strncmp(modename, "dired", 5) == 0)
- return (dobeep_msg("In dired mode already"));
+ return (d_updirectory(f, n));
}
if (getbufcwd(dname, sizeof(dname)) != TRUE)
Thanks!
mg: move up directory in dired