summaryrefslogtreecommitdiff
path: root/Src/options.c
diff options
context:
space:
mode:
Diffstat (limited to 'Src/options.c')
-rw-r--r--Src/options.c35
1 files changed, 19 insertions, 16 deletions
diff --git a/Src/options.c b/Src/options.c
index a1fe918fc..8b13f0c5d 100644
--- a/Src/options.c
+++ b/Src/options.c
@@ -877,34 +877,37 @@ dosetopt(int optno, int value, int force, char *new_opts)
}
#endif /* HAVE_SETRESGID && HAVE_SETRESUID */
-#ifdef JOB_CONTROL
} else if (!force && optno == MONITOR && value) {
if (new_opts[optno] == value)
return 0;
- if (SHTTY != -1) {
+ if (SHTTY == -1)
+ return -1;
+ if (!origpgrp) {
origpgrp = GETPGRP();
acquire_pgrp();
- } else
- return -1;
-#else
- } else if(optno == MONITOR && value) {
- return -1;
-#endif /* not JOB_CONTROL */
-#ifdef GETPWNAM_FAKED
- } else if(optno == CDABLEVARS && value) {
- return -1;
-#endif /* GETPWNAM_FAKED */
+ }
} else if ((optno == EMACSMODE || optno == VIMODE) && value) {
+ /* What's going on here:
+ * 1) unsetopt of either emacs or vi is an effective no-op.
+ * 2) setopt of either emacs or vi toggles off the other.
+ * Hence we disallow changing these options in emulation mode,
+ * but only if the change is setopt rather than unsetopt.
+ */
if (sticky && sticky->emulation)
- return -1;
- zleentry(ZLE_CMD_SET_KEYMAP, optno);
- new_opts[(optno == EMACSMODE) ? VIMODE : EMACSMODE] = 0;
+ return opts[optno] ? 0 : -1;
+ if (zle_load_state == 1)
+ zleentry(ZLE_CMD_SET_KEYMAP, optno);
+ new_opts[optno ^ EMACSMODE ^ VIMODE] = 0;
} else if (optno == SUNKEYBOARDHACK) {
/* for backward compatibility */
keyboardhackchar = (value ? '`' : '\0');
}
new_opts[optno] = value;
- if (optno == BANGHIST || optno == SHINSTDIN)
+ if (
+#ifdef MULTIBYTE_SUPPORT
+ optno == MULTIBYTE ||
+#endif
+ optno == BANGHIST || optno == SHINSTDIN)
inittyptab();
return 0;
}