gnu/66279: less(1) -- add support for stty(1) erase2/VERASE2 control character

Jeremy Chadwick freebsd at jdc.freebsd.org
Wed May 5 02:50:26 PDT 2004


>Number:         66279
>Category:       gnu
>Synopsis:       less(1) -- add support for stty(1) erase2/VERASE2 control character
>Confidential:   no
>Severity:       non-critical
>Priority:       medium
>Responsible:    freebsd-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          change-request
>Submitter-Id:   current-users
>Arrival-Date:   Wed May 05 02:50:24 PDT 2004
>Closed-Date:
>Last-Modified:
>Originator:     Jeremy Chadwick
>Release:        FreeBSD 4.9-STABLE i386
>Organization:
Parodius Networking
>Environment:
System: FreeBSD pentarou.parodius.com 4.9-STABLE FreeBSD 4.9-STABLE #0: Wed Mar 17 23:46:30 PST 2004 root at pentarou.parodius.com:/usr/obj/usr/src/sys/PENTAROU i386
>Description:
	less(1) lacks support for FreeBSD's erase2/VERASE2 stty(1) control character.
	Attempting to input whatever is assigned to erase2 results in the character
	being echoed, rather than being handled.
>How-To-Repeat:
	Try inputting the character defined in stty(1) erase2/VERASE2 while inside
	less(1).  Example:
	
	# stty -a | grep erase2
		eol2 = <undef>; erase = ^?; erase2 = ^H; intr = ^C; kill = ^U;
	# less /etc/rc.conf
	{ hit '/' for search }
	{ type in 'test' }
	{ hit Control-H -- character is echoed on screen }
>Fix:
	See attached patch below.  Tested on 4.9-STABLE and 5.2-CURRENT.

diff -ruN contrib/less.orig/command.c contrib/less/command.c
--- contrib/less.orig/command.c	Wed Jul 19 02:24:25 2000
+++ contrib/less/command.c	Wed May  5 02:27:33 2004
@@ -19,7 +19,7 @@
 #include "option.h"
 #include "cmd.h"
 
-extern int erase_char, kill_char;
+extern int erase_char, erase2_char, kill_char;
 extern int sigs;
 extern int quit_at_eof;
 extern int quit_if_one_screen;
@@ -387,7 +387,7 @@
 					 * Already have a match for the name.
 					 * Don't accept anything but erase/kill.
 					 */
-					if (c == erase_char || c == kill_char)
+					if (c == erase_char || c == erase2_char || c == kill_char)
 						return (MCA_DONE);
 					return (MCA_MORE);
 				}
@@ -425,7 +425,7 @@
 			}
 		} else
 		{
-			if (c == erase_char || c == kill_char)
+			if (c == erase_char || c == erase2_char || c == kill_char)
 				break;
 			if (optchar != '\0')
 				/* We already have the option letter. */
@@ -1459,7 +1459,7 @@
 				break;
 			start_mca(A_SETMARK, "mark: ", (void*)NULL, 0);
 			c = getcc();
-			if (c == erase_char || c == kill_char ||
+			if (c == erase_char || c == erase2_char || c == kill_char ||
 			    c == '\n' || c == '\r')
 				break;
 			setmark(c);
@@ -1471,7 +1471,7 @@
 			 */
 			start_mca(A_GOMARK, "goto mark: ", (void*)NULL, 0);
 			c = getcc();
-			if (c == erase_char || c == kill_char || 
+			if (c == erase_char || c == erase2_char || c == kill_char || 
 			    c == '\n' || c == '\r')
 				break;
 			gomark(c);
@@ -1486,7 +1486,7 @@
 			}
 			start_mca(A_PIPE, "|mark: ", (void*)NULL, 0);
 			c = getcc();
-			if (c == erase_char || c == kill_char)
+			if (c == erase_char || c == erase2_char || c == kill_char)
 				break;
 			if (c == '\n' || c == '\r')
 				c = '.';
diff -ruN contrib/less.orig/decode.c contrib/less/decode.c
--- contrib/less.orig/decode.c	Wed Jul 19 02:24:25 2000
+++ contrib/less/decode.c	Wed May  5 02:27:56 2004
@@ -34,7 +34,7 @@
 #include "cmd.h"
 #include "lesskey.h"
 
-extern int erase_char, kill_char;
+extern int erase_char, erase2_char, kill_char;
 extern int secure;
 
 #define SK(k) \
@@ -745,7 +745,7 @@
 	 * but give it the edit-commands command table
 	 * This table is constructed to match the user's keyboard.
 	 */
-	if (c == erase_char)
+	if (c == erase_char || c == erase2_char)
 		return (EC_BACKSPACE);
 	if (c == kill_char)
 		return (EC_LINEKILL);
diff -ruN contrib/less.orig/screen.c contrib/less/screen.c
--- contrib/less.orig/screen.c	Wed Jul 19 02:24:26 2000
+++ contrib/less/screen.c	Wed May  5 02:28:42 2004
@@ -188,7 +188,7 @@
 
 public int auto_wrap;		/* Terminal does \r\n when write past margin */
 public int ignaw;		/* Terminal ignores \n immediately after wrap */
-public int erase_char, kill_char; /* The user's erase and line-kill chars */
+public int erase_char, erase2_char, kill_char; /* The user's erase and line-kill chars */
 public int werase_char;		/* The user's word-erase char */
 public int sc_width, sc_height;	/* Height & width of screen */
 public int bo_s_width, bo_e_width;	/* Printing width of boldface seq */
@@ -338,6 +338,7 @@
 		}
 #endif
 		erase_char = s.c_cc[VERASE];
+		erase2_char = s.c_cc[VERASE2];
 		kill_char = s.c_cc[VKILL];
 #ifdef VWERASE
 		werase_char = s.c_cc[VWERASE];
@@ -462,6 +463,7 @@
 		ospeed = s.c_cflag & CBAUD;
 #endif
 		erase_char = s.c_cc[VERASE];
+		erase_char = s.c_cc[VERASE2];
 		kill_char = s.c_cc[VKILL];
 #ifdef VWERASE
 		werase_char = s.c_cc[VWERASE];

>Release-Note:
>Audit-Trail:
>Unformatted:


More information about the freebsd-bugs mailing list