From: Dante Catalfamo Subject: Re: mg: move up directory in dired To: tech@openbsd.org Date: Sun, 02 Jun 2024 02:12:57 -0400 I had forgotten to add the command to the function map diff --git dired.c dired.c index 5cb747c37..4d83d31e3 100644 --- dired.c +++ 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, { { @@ -190,6 +195,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"); } @@ -363,6 +372,29 @@ d_findfile(int f, int n) return (readin(fname)); } +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 || ret >= (int)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) { On Sat, 2024-06-01 at 15:41 -0400, Dante Catalfamo wrote: > Sorry the formatting is a little broken, I seem to have overestimated > my email client's ability to not mess with formatting when sending > plain text. > > On Sat, 2024-06-01 at 15:22 -0400, Dante wrote: > >  Hi, > >   > >  This is my first patch to OpenBSD, please let me know if I did > > anything wrong. > >   > >  This patch adds beheviour to mach Emacs dired mode. When you're in > > a > > dired buffer and press the caret key '^', it will open the parent > > directory. > > Thanks, > > Dante > > > > diff --git a/usr.bin/mg/dired.c b/usr.bin/mg/dired.c > > index 5cb747c37..de6a73833 100644 > > --- a/usr.bin/mg/dired.c > > +++ b/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, > >   { > >   { > > @@ -190,6 +195,9 @@ static struct KEYMAPE (7) diredmap = { > >   { > >   CCHR('Z'), '+', diredcz, (KEYMAP *) & > > metamap > >   }, > > + { > > + '^', '^', diredcaret, NULL > > + }, > >   { > >   'a', 'j', direda, NULL > >   }, > > @@ -363,6 +371,29 @@ d_findfile(int f, int n) > >   return (readin(fname)); > >  } > >   > > +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 || ret >= (int)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) > >  { > > >