On 2012-03-11, Tobias Ulmer <[email protected]> wrote:
> On Sun, Mar 11, 2012 at 02:43:42PM -0500, Chris Bennett wrote:
>> This started for me a while back.
>> Login as root, I can repeat older commands with up down arrows.
>> History command shows history.
>>
>> su -l otheruser
>>
>> Cannot use up down arrows to access history.
>> History command shows correct history.
>
> You most likely set EDITOR to something containing "vi". ksh parses that
> and switches to vi mode. IMO it's a disgusting "feature", but that
> appears to be just me.
>
> set -o emacs
> set +o vi
I've wasted countless time because of this "feature", it's probably
my no.1 annoyance with the OS. It used to be possible to set this
in a file sourced via ENV so it could be applied automatically,
but sudo now (rightly) prohibits passing this variable.
After using stupid things like EDITOR=/usr/bin/emacs-not-really
symlinked to vi for a while on some machines, I came up with this
approach instead. Does anyone else think this is worth the extra
bytes?
Index: bin/ksh/ksh.1
===================================================================
RCS file: /cvs/src/bin/ksh/ksh.1,v
retrieving revision 1.141
diff -u -p -r1.141 ksh.1
--- bin/ksh/ksh.1 3 Sep 2011 22:59:08 -0000 1.141
+++ bin/ksh/ksh.1 12 Mar 2012 09:37:28 -0000
@@ -1362,14 +1362,36 @@ This parameter is used by the interactiv
and
.Ic kill -l
commands to format information columns.
+.It Ev EDITMODE
+If set, this parameter controls the command-line editing mode for interactive
+shells.
+If the last component of the path specified in this parameter contains
+the string
+.Dq vi ,
+.Dq emacs ,
+or
+.Dq gmacs ,
+the
+.Xr vi ,
+.Xr emacs ,
+or
+.Xr gmacs
+(Gosling emacs) editing mode is enabled, respectively.
+Also see the
+.Ev EDITOR
+and
+.Ev VISUAL
+parameters below.
.It Ev EDITOR
If the
.Ev VISUAL
-parameter is not set, this parameter controls the command-line editing mode for
-interactive shells.
+and
+.Ev EDITMODE
+parameters are not set, this parameter controls the command-line editing mode
+for interactive shells.
See the
-.Ev VISUAL
-parameter below for how this works.
+.Ev EDITMODE
+parameter above for how this works.
.Pp
Note:
traditionally,
@@ -1381,8 +1403,9 @@ and
was used to specify a (new-style) screen editor, such as
.Xr vi 1 .
Hence if
-.Ev VISUAL
-is set, it overrides
+.Ev VISUAL or
+.Ev EDITMODE
+are set, they override
.Ev EDITOR .
.It Ev ENV
If this parameter is found to be set after any profile files are executed, the
@@ -1745,23 +1768,13 @@ set, or does not contain the absolute pa
files are created in
.Pa /tmp .
.It Ev VISUAL
-If set, this parameter controls the command-line editing mode for interactive
-shells.
-If the last component of the path specified in this parameter contains
-the string
-.Dq vi ,
-.Dq emacs ,
-or
-.Dq gmacs ,
-the
-.Xr vi ,
-.Xr emacs ,
-or
-.Xr gmacs
-(Gosling emacs) editing mode is enabled, respectively.
-See also the
-.Ev EDITOR
-parameter, above.
+If the
+.Ev EDITMODE
+parameter is not set, this parameter controls the command-line editing mode
+for interactive shells.
+See the
+.Ev EDITMODE
+parameter above for how this works.
.El
.Ss Tilde expansion
Tilde expansion, which is done in parallel with parameter substitution, is done
Index: bin/ksh/table.h
===================================================================
RCS file: /cvs/src/bin/ksh/table.h,v
retrieving revision 1.8
diff -u -p -r1.8 table.h
--- bin/ksh/table.h 19 Feb 2012 07:52:30 -0000 1.8
+++ bin/ksh/table.h 12 Mar 2012 09:37:28 -0000
@@ -170,6 +170,7 @@ extern const struct builtin shbuiltins [
#define V_TMOUT 15
#define V_TMPDIR 16
#define V_LINENO 17
+#define V_EDITMODE 18
/* values for set_prompt() */
#define PS1 0 /* command */
Index: bin/ksh/var.c
===================================================================
RCS file: /cvs/src/bin/ksh/var.c,v
retrieving revision 1.34
diff -u -p -r1.34 var.c
--- bin/ksh/var.c 15 Oct 2007 02:16:35 -0000 1.34
+++ bin/ksh/var.c 12 Mar 2012 09:37:28 -0000
@@ -96,6 +96,7 @@ initvar(void)
{ "HISTSIZE", V_HISTSIZE },
#endif /* HISTORY */
#ifdef EDIT
+ { "EDITMODE", V_EDITMODE },
{ "EDITOR", V_EDITOR },
{ "VISUAL", V_VISUAL },
#endif /* EDIT */
@@ -1004,11 +1005,16 @@ setspec(struct tbl *vp)
break;
#endif /* HISTORY */
#ifdef EDIT
- case V_VISUAL:
+ case V_EDITMODE:
set_editmode(str_val(vp));
break;
+ case V_VISUAL:
+ if (!(global("EDITMODE")->flag & ISSET))
+ set_editmode(str_val(vp));
+ break;
case V_EDITOR:
- if (!(global("VISUAL")->flag & ISSET))
+ if ((!(global("EDITMODE")->flag & ISSET)) &&
+ (!(global("VISUAL")->flag & ISSET)))
set_editmode(str_val(vp));
break;
case V_COLUMNS:
Index: usr.bin/sudo/sudoers
===================================================================
RCS file: /cvs/src/usr.bin/sudo/sudoers,v
retrieving revision 1.25
diff -u -p -r1.25 sudoers
--- usr.bin/sudo/sudoers 26 Oct 2009 19:28:26 -0000 1.25
+++ usr.bin/sudo/sudoers 12 Mar 2012 09:37:28 -0000
@@ -16,11 +16,11 @@
# Cmnd alias specification
# Defaults specification
-Defaults env_keep +="DESTDIR DISTDIR EDITOR FETCH_CMD FLAVOR FTPMODE GROUP
MAKE"
-Defaults env_keep +="MAKECONF MULTI_PACKAGES NOMAN OKAY_FILES OWNER PKG_CACHE"
-Defaults env_keep +="PKG_DBDIR PKG_DESTDIR PKG_PATH PKG_TMPDIR PORTSDIR"
-Defaults env_keep +="RELEASEDIR SHARED_ONLY SSH_AUTH_SOCK SUBPACKAGE VISUAL"
-Defaults env_keep +="WRKOBJDIR"
+Defaults env_keep +="DESTDIR DISTDIR EDITOR EDITMODE FETCH_CMD FLAVOR FTPMODE"
+Defaults env_keep +="GROUP MAKE MAKECONF MULTI_PACKAGES NOMAN OKAY_FILES OWNER"
+Defaults env_keep +="PKG_CACHE PKG_DBDIR PKG_DESTDIR PKG_PATH PKG_TMPDIR"
+Defaults env_keep +="PORTSDIR RELEASEDIR SHARED_ONLY SSH_AUTH_SOCK"
+Defaults env_keep +="SUBPACKAGE VISUAL WRKOBJDIR"
# Uncomment to disable the lecture the first time you run sudo
#Defaults !lecture