Download raw body.
mg: move up directory in dired
On 2024-06-03 19:05 +02, Omar Polo <op@omarpolo.com> wrote:
> 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.
OK florian
>
>> [...]
>> +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!
>
--
In my defence, I have been left unsupervised.
mg: move up directory in dired