Zsh Mailing List Archive
Messages sorted by: Reverse Date, Date, Thread, Author

PATCH: don't load ZLE early to set keymap



On 26 Feb, I wrote:
> the zleentry() function. I can find one use of that that may precede
> run_init_scripts(): if you pass -o vi or -o emacs to zsh. If you think
> that corner case is worth being concerned with, it'd probably work to
> make ZLE check the option for the initial keymap choice when it loads
> and remove the zleentry() call.

I took a closer look at this. Both VIMODE and EMACSMODE options are
disabled by default. zleentry() is using a zle_load_state variable to
see if zle is loaded or not so the logic all works out if setting those
options only calls zleentry(ZLE_CMD_SET_KEYMAP, optno) when ZLE is
already loaded but records their state regardless. Then when ZLE does
finally load, the options determine the initial default keymap. Even
in the absence of wanting to ensure ZLE doesn't load before the init
scripts have started, I think this change is an improvement.

Is it intentional that setopt noemacs is not treated as equivalent to
setopt vi and vice-versa? I can't see the point in denying that myself
so this patch would change that.

Most of this patch is backing out 45660/66ee4918. That delayed loading
ZLE because with, e.g. zsh -o vi, the option is parsed before the
entire module system has loaded but it retained explicit code to load
the module. At that time, the default keymap was still based on
$VISUAL/$EDITOR so things were not so simple then.

Oliver

diff --git a/Src/Zle/zle_keymap.c b/Src/Zle/zle_keymap.c
index ce52abe66..7f31f837c 100644
--- a/Src/Zle/zle_keymap.c
+++ b/Src/Zle/zle_keymap.c
@@ -1452,7 +1452,10 @@ default_bindings(void)
     linkkeymap(oppmap, "viopp", 0);
     linkkeymap(vismap, "visual", 0);
     linkkeymap(smap, ".safe", 1);
-    linkkeymap(emap, "main", 0);
+    if (isset(VIMODE))
+	linkkeymap(vmap, "main", 0);
+    else
+	linkkeymap(emap, "main", 0);
 
     /* the .safe map cannot be modified or deleted */
     smap->flags |= KM_IMMUTABLE;
diff --git a/Src/builtin.c b/Src/builtin.c
index 6bdaddff0..5563bdba9 100644
--- a/Src/builtin.c
+++ b/Src/builtin.c
@@ -6333,7 +6333,7 @@ bin_emulate(char *nam, char **argv, Options ops, UNUSED(int func))
     savehackchar = keyboardhackchar;
     emulate(shname, opt_R, &new_emulation, new_opts);
     optlist = newlinklist();
-    if (parseopts(nam, &argv, new_opts, &cmd, optlist, 0, NULL)) {
+    if (parseopts(nam, &argv, new_opts, &cmd, optlist, 0)) {
 	ret = 1;
 	goto restore;
     }
diff --git a/Src/init.c b/Src/init.c
index 75d9dd136..76de0b449 100644
--- a/Src/init.c
+++ b/Src/init.c
@@ -255,8 +255,7 @@ static char *argv0;
 
 /**/
 static void
-parseargs(char *zsh_name, char **argv, char **runscript, char **cmdptr,
-	  int *needkeymap)
+parseargs(char *zsh_name, char **argv, char **runscript, char **cmdptr)
 {
     char **x;
     LinkList paramlist;
@@ -273,7 +272,7 @@ parseargs(char *zsh_name, char **argv, char **runscript, char **cmdptr,
      * matched by code at the end of the present function.
      */
 
-    if (parseopts(zsh_name, &argv, opts, cmdptr, NULL, flags, needkeymap))
+    if (parseopts(zsh_name, &argv, opts, cmdptr, NULL, flags))
 	exit(1);
 
     /*
@@ -384,7 +383,7 @@ static void parseopts_setemulate(char *nam, int flags)
 /**/
 mod_export int
 parseopts(char *nam, char ***argvp, char *new_opts, char **cmdp,
-	  LinkList optlist, int flags, int *needkeymap)
+	  LinkList optlist, int flags)
 {
     int optionbreak = 0;
     int action, optno;
@@ -490,14 +489,8 @@ parseopts(char *nam, char ***argvp, char *new_opts, char **cmdp,
 		    return 1;
 		} else if (optno == RESTRICTED && toplevel) {
 		    restricted = action;
-		} else if ((optno == EMACSMODE || optno == VIMODE)
-			   && (!toplevel || needkeymap)){
-		    if (!toplevel) {
-			WARN_OPTION("can't change option: %s", *argv);
-		    } else {
-			/* Need to wait for modules to be loadable */
-			*needkeymap = optno;
-		    }
+		} else if ((optno == EMACSMODE || optno == VIMODE) && !toplevel) {
+		    WARN_OPTION("can't change option: %s", *argv);
 		} else {
 		    if (dosetopt(optno, action, toplevel, new_opts) &&
 			!toplevel) {
@@ -1864,7 +1857,7 @@ zsh_main(UNUSED(int argc), char **argv)
 {
     char **t, *runscript = NULL, *zsh_name;
     char *cmd;			/* argument to -c */
-    int t0, needkeymap = 0;
+    int t0;
 #ifdef USE_LOCALE
     setlocale(LC_ALL, "");
 #endif
@@ -1910,7 +1903,7 @@ zsh_main(UNUSED(int argc), char **argv)
     createoptiontable();
     /* sets emulation, LOGINSHELL, PRIVILEGED, ZLE, INTERACTIVE,
      * SHINSTDIN and SINGLECOMMAND */ 
-    parseargs(zsh_name, argv, &runscript, &cmd, &needkeymap);
+    parseargs(zsh_name, argv, &runscript, &cmd);
 
     SHTTY = -1;
     init_io(cmd);
@@ -1919,15 +1912,6 @@ zsh_main(UNUSED(int argc), char **argv)
     init_signals();
     init_bltinmods();
     init_builtins();
-
-    if (needkeymap)
-    {
-	/* Saved for after module system initialisation */
-	zleentry(ZLE_CMD_SET_KEYMAP, needkeymap);
-	opts[needkeymap] = 1;
-	opts[needkeymap == EMACSMODE ? VIMODE : EMACSMODE] = 0;
-    }
-
     run_init_scripts();
     setupshin(runscript);
     init_misc(cmd, zsh_name);
diff --git a/Src/options.c b/Src/options.c
index 8b37ab5e8..1792816e1 100644
--- a/Src/options.c
+++ b/Src/options.c
@@ -886,11 +886,12 @@ dosetopt(int optno, int value, int force, char *new_opts)
 	    origpgrp = GETPGRP();
 	    acquire_pgrp();
 	}
-    } else if ((optno == EMACSMODE || optno == VIMODE) && value) {
+    } else if (optno == EMACSMODE || optno == VIMODE) {
 	if (sticky && sticky->emulation)
 	    return -1;
-	zleentry(ZLE_CMD_SET_KEYMAP, optno);
-	new_opts[(optno == EMACSMODE) ? VIMODE : EMACSMODE] = 0;
+	if (zle_load_state == 1)
+	    zleentry(ZLE_CMD_SET_KEYMAP, optno);
+	new_opts[optno ^ EMACSMODE ^ VIMODE] = !value;
     } else if (optno == SUNKEYBOARDHACK) {
 	/* for backward compatibility */
 	keyboardhackchar = (value ? '`' : '\0');




Messages sorted by: Reverse Date, Date, Thread, Author