Re: mg: minibuffer anomaly

2021-02-26 Thread Emil Engler
I consider the name "null" for a goto section as too misleading.
I would prefer something like "nokey" or "skipkey".

Cheers,
Emil Engler

On Thu, Feb 25, 2021 at 07:40:01PM +, Mark Lumsden wrote:
> I was testing mg's goto-line function via the minibuffer (M-x goto-line) and
> I just kept my finger on the '0' key. After a brief time '0's started
> appearing in the main buffer, where the cursor had been. For a second I
> thought there had been an issue with memory allocation but after looking at
> the code I see what happens is when the memory allocated to the minibuffer
> fills up, a message "Line too long." should show in the minibuffer. It
> probably did, but since I was pressing the '0' key it disappeared instantly
> and I didn't realise that mg had tried to inform me of my error. mg then
> continued to accept my '0's as normal input.
> 
> This diff soaks up the user input while the the maximum character length
> boundary is crossed in the minbuffer and allows the user to see the error
> message and respond accordingly.
> 
> There may be other ways to handle this situation (like not pressing the '0'
> key so many times) but I think having mg do something is better than
> it *seemingly* not do anything. Any suggestions/preferences/better
> solutions?
> 
> Mark
> 
> Index: echo.c
> ===
> RCS file: /cvs/src/usr.bin/mg/echo.c,v
> retrieving revision 1.66
> diff -u -p -u -p -r1.66 echo.c
> --- echo.c24 Oct 2016 17:18:42 -  1.66
> +++ echo.c25 Feb 2021 19:06:21 -
> @@ -336,8 +336,8 @@ veread(const char *fp, char *buf, size_t
>   }
>   if (!dynbuf && epos + 1 >= nbuf) {
>   dobeep();
> - ewprintf("Line too long");
> - return (emptyval);
> + ewprintf("Line too long. Press Enter.");
> + goto null;
>   }
>   for (t = epos; t > cpos; t--)
>   buf[t] = buf[t - 1];
> @@ -492,8 +492,8 @@ veread(const char *fp, char *buf, size_t
>   }
>   if (!dynbuf && epos + 1 >= nbuf) {
>   dobeep();
> - ewprintf("Line too long");
> - return (emptyval);
> + ewprintf("Line too long. Press Enter.");
> + goto null;
>   }
>   for (i = epos; i > cpos; i--)
>   buf[i] = buf[i - 1];
> @@ -507,6 +507,9 @@ veread(const char *fp, char *buf, size_t
>   ttmove(rr, cc);
>   ttflush();
>   }
> +
> +null:/* soak up any continuing key strokes */
> +;
>   }
>  done:
>   if (cwin == TRUE) {
> 



mg: minibuffer anomaly

2021-02-25 Thread Mark Lumsden
I was testing mg's goto-line function via the minibuffer (M-x goto-line) 
and I just kept my finger on the '0' key. After a brief time '0's 
started appearing in the main buffer, where the cursor had been. For a 
second I thought there had been an issue with memory allocation but after 
looking at the code I see what happens is when the memory allocated to the 
minibuffer fills up, a message "Line too long." should show in the 
minibuffer. It probably did, but since I was pressing the '0' key it 
disappeared instantly and I didn't realise that mg had tried to inform me 
of my error. mg then continued to accept my '0's as normal input.


This diff soaks up the user input while the the maximum character length 
boundary is crossed in the minbuffer and allows the user to see the error 
message and respond accordingly.


There may be other ways to handle this situation (like not pressing the 
'0' key so many times) but I think having mg do something is better than
it *seemingly* not do anything. Any suggestions/preferences/better 
solutions?


Mark

Index: echo.c
===
RCS file: /cvs/src/usr.bin/mg/echo.c,v
retrieving revision 1.66
diff -u -p -u -p -r1.66 echo.c
--- echo.c  24 Oct 2016 17:18:42 -  1.66
+++ echo.c  25 Feb 2021 19:06:21 -
@@ -336,8 +336,8 @@ veread(const char *fp, char *buf, size_t
}
if (!dynbuf && epos + 1 >= nbuf) {
dobeep();
-   ewprintf("Line too long");
-   return (emptyval);
+   ewprintf("Line too long. Press Enter.");
+   goto null;
}
for (t = epos; t > cpos; t--)
buf[t] = buf[t - 1];
@@ -492,8 +492,8 @@ veread(const char *fp, char *buf, size_t
}
if (!dynbuf && epos + 1 >= nbuf) {
dobeep();
-   ewprintf("Line too long");
-   return (emptyval);
+   ewprintf("Line too long. Press Enter.");
+   goto null;
}
for (i = epos; i > cpos; i--)
buf[i] = buf[i - 1];
@@ -507,6 +507,9 @@ veread(const char *fp, char *buf, size_t
ttmove(rr, cc);
ttflush();
}
+
+null:  /* soak up any continuing key strokes */
+;
}
 done:
if (cwin == TRUE) {