On 2022-10-13 12:16 +02, Omar Polo <o...@omarpolo.com> wrote:
> small quality-of-life addition.  GNU Emacs has zap-to-char bound by to
> M-z and zap-up-to-char unbound; i'm unsure how closely we want to
> follow emacs here, IMHO zap-up-to-char is way more useful than
> zap-to-char and so i opted to bound M-z to zap-up-to-char by default.

I always tried to stay as close to emacs as possible. I'd consider it a
bug otherwise. So I think you should bind zap-to-char per default and
override it in your startup file.

emacs also has this: "Goes backward if ARG is negative"

Could you implement that, or at least check that n is not negative?


>
> ok?
>
> diff 40c942665e2a6e73653062386b61f09373477e3d 
> b164b420ae16a7b218f9df51fb8c8a7ce8d5b054
> commit - 40c942665e2a6e73653062386b61f09373477e3d
> commit + b164b420ae16a7b218f9df51fb8c8a7ce8d5b054
> blob - d546dba15dd5b45503679454fbe55673640ea74e
> blob + 87704c129ee172c2f504741d534df826cf77131d
> --- usr.bin/mg/def.h
> +++ usr.bin/mg/def.h
> @@ -651,6 +651,9 @@ int                readpattern(char *);
>  int           forwsrch(void);
>  int           backsrch(void);
>  int           readpattern(char *);
> +int           zapuptochar(int, int);
> +int           zaptochar(int, int);
> +int           zap(int, int);
>  
>  /* spawn.c X */
>  int           spawncli(int, int);
> blob - 36a88e4573d47eae4d321ee899f71e52ef77a8c9
> blob + d9cb10a264955db8e6e77b8b8aa6352ed8db9bfd
> --- usr.bin/mg/funmap.c
> +++ usr.bin/mg/funmap.c
> @@ -138,6 +138,8 @@ static struct funmap functnames[] = {
>       {killbuffer_cmd, "kill-buffer", 1},
>       {killline, "kill-line", 1},
>       {killpara, "kill-paragraph", 1},
> +     {zaptochar, "zap-to-char", 1},
> +     {zapuptochar, "zap-up-to-char", 1},
>       {killregion, "kill-region", 0},
>       {delfword, "kill-word", 1},
>       {toggleleavetmp, "leave-tmpdir-backups", 0},
> blob - 32a9267d30fbbbc2f4fcc126133313cbc6799201
> blob + 6e6b649f756b879127e1f22b8178fe529b7ced03
> --- usr.bin/mg/keymap.c
> +++ usr.bin/mg/keymap.c
> @@ -290,7 +290,7 @@ static PF metal[] = {
>       copyregion,             /* w */
>       extend,                 /* x */
>       rescan,                 /* y */
> -     rescan,                 /* z */
> +     zapuptochar,            /* z */
>       gotobop,                /* { */
>       piperegion,             /* | */
>       gotoeop                 /* } */
> blob - a335c89e4d5329776a85c473c716b5e9e2597f19
> blob + fd5a2df0f48d7966ca1d4467ccf16bd68caf4c5b
> --- usr.bin/mg/mg.1
> +++ usr.bin/mg/mg.1
> @@ -331,6 +331,8 @@ execute-extended-command
>  copy-region-as-kill
>  .It M-x
>  execute-extended-command
> +.It M-z
> +zap-up-to-char
>  .It M-{
>  backward-paragraph
>  .It M-|
> @@ -986,6 +988,11 @@ It is not a ring.
>  kill buffer consists only
>  of the most recent kill.
>  It is not a ring.
> +.It zap-to-char
> +Ask for a character and delete text from the current cursor position
> +until the next instance of that character, including it.
> +.It zap-up-to-char
> +Like zap-to-char but doesn't delete the target character.
>  .El
>  .Sh MG DIRED KEY BINDINGS
>  Specific key bindings are available in dired mode.
> blob - fa12b4094aae01385711ca7b01c7eba964571e65
> blob + e9184de33a7cd149fd521ba7d1c57310f3b16953
> --- usr.bin/mg/search.c
> +++ usr.bin/mg/search.c
> @@ -853,3 +853,61 @@ readpattern(char *r_prompt)
>               retval = FALSE;
>       return (retval);
>  }
> +
> +/*
> + * Prompt for a character and kill until a it (including).  Mark is
> + * cleared afterwards.
> + */
> +int
> +zaptochar(int f, int n)
> +{
> +     return (zap(TRUE, n));
> +}
> +
> +/* Like zaptochar but stops before the character. */
> +int
> +zapuptochar(int f, int n)
> +{
> +     return (zap(FALSE, n));
> +}
> +
> +/*
> + * Prompt for a charcter and deletes from the point up to, optionally
> + * including, the first instance of that charcters.  Marks is cleared
> + * afterwards.
> + */
> +int
> +zap(int including, int n)
> +{
> +     int     s;
> +
> +     if (including)
> +             ewprintf("Zap to char: ");
> +     else
> +             ewprintf("Zap up to char: ");
> +
> +     s = getkey(FALSE);
> +     eerase();
> +     if (s == ABORT || s == CCHR('G'))
> +             return (FALSE);
> +
> +     pat[0] = (char)s;
> +     pat[1] = '\0';
> +
> +     isetmark();
> +     while (n--) {
> +             if (forwsrch() == FALSE) {
> +                     dobeep();
> +                     ewprintf("Search failed: \"%s\"", pat);
> +                     swapmark(FFARG, 0);
> +                     clearmark(FFARG, 0);
> +                     return (FALSE);
> +             }
> +     }
> +
> +     if (!including)
> +             (void) backchar(FFARG, 1);
> +     killregion(FFARG, 0);
> +     clearmark(FFARG, 0);
> +     return (TRUE);
> +}
>
>

-- 
I'm not entirely sure you are real.

Reply via email to