Module Name:    src
Committed By:   christos
Date:           Wed Sep 14 16:15:52 UTC 2022

Modified Files:
        src/bin/csh: csh.c extern.h set.c

Log Message:
defer editing setup/cleanup to when we are interactive.


To generate a diff of this commit:
cvs rdiff -u -r1.53 -r1.54 src/bin/csh/csh.c
cvs rdiff -u -r1.32 -r1.33 src/bin/csh/extern.h
cvs rdiff -u -r1.38 -r1.39 src/bin/csh/set.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/bin/csh/csh.c
diff -u src/bin/csh/csh.c:1.53 src/bin/csh/csh.c:1.54
--- src/bin/csh/csh.c:1.53	Sat Aug  8 20:53:38 2020
+++ src/bin/csh/csh.c	Wed Sep 14 12:15:51 2022
@@ -1,4 +1,4 @@
-/* $NetBSD: csh.c,v 1.53 2020/08/09 00:53:38 dholland Exp $ */
+/* $NetBSD: csh.c,v 1.54 2022/09/14 16:15:51 christos Exp $ */
 
 /*-
  * Copyright (c) 1980, 1991, 1993
@@ -39,7 +39,7 @@ __COPYRIGHT("@(#) Copyright (c) 1980, 19
 #if 0
 static char sccsid[] = "@(#)csh.c	8.2 (Berkeley) 10/12/93";
 #else
-__RCSID("$NetBSD: csh.c,v 1.53 2020/08/09 00:53:38 dholland Exp $");
+__RCSID("$NetBSD: csh.c,v 1.54 2022/09/14 16:15:51 christos Exp $");
 #endif
 #endif /* not lint */
 
@@ -1153,6 +1153,8 @@ process(int catch)
 	    seterr = NULL;
 	}
 
+	updateediting();
+
 	/*
 	 * Echo not only on VERBOSE, but also with history expansion. If there
 	 * is a lexical error then we forego history echo.

Index: src/bin/csh/extern.h
diff -u src/bin/csh/extern.h:1.32 src/bin/csh/extern.h:1.33
--- src/bin/csh/extern.h:1.32	Thu Apr 23 03:54:53 2020
+++ src/bin/csh/extern.h	Wed Sep 14 12:15:51 2022
@@ -1,4 +1,4 @@
-/* $NetBSD: extern.h,v 1.32 2020/04/23 07:54:53 simonb Exp $ */
+/* $NetBSD: extern.h,v 1.33 2022/09/14 16:15:51 christos Exp $ */
 
 /*-
  * Copyright (c) 1991, 1993
@@ -291,6 +291,7 @@ void unsetv(Char *);
 void setNS(Char *);
 void shift(Char **, struct command *);
 void plist(struct varent *);
+void updateediting(void);
 
 /*
  * time.c

Index: src/bin/csh/set.c
diff -u src/bin/csh/set.c:1.38 src/bin/csh/set.c:1.39
--- src/bin/csh/set.c:1.38	Sun Aug 15 08:16:02 2021
+++ src/bin/csh/set.c	Wed Sep 14 12:15:51 2022
@@ -1,4 +1,4 @@
-/* $NetBSD: set.c,v 1.38 2021/08/15 12:16:02 christos Exp $ */
+/* $NetBSD: set.c,v 1.39 2022/09/14 16:15:51 christos Exp $ */
 
 /*-
  * Copyright (c) 1980, 1991, 1993
@@ -34,7 +34,7 @@
 #if 0
 static char sccsid[] = "@(#)set.c	8.1 (Berkeley) 5/31/93";
 #else
-__RCSID("$NetBSD: set.c,v 1.38 2021/08/15 12:16:02 christos Exp $");
+__RCSID("$NetBSD: set.c,v 1.39 2022/09/14 16:15:51 christos Exp $");
 #endif
 #endif /* not lint */
 
@@ -59,6 +59,8 @@ static void unsetv1(struct varent *);
 static void exportpath(Char **);
 static void balance(struct varent *, int, int);
 
+static int wantediting;
+
 #ifdef EDIT
 static const char *
 alias_text(void *dummy __unused, const char *name)
@@ -148,26 +150,8 @@ update_vars(Char *vp)
 	filec = 1;
 #endif
 #ifdef EDIT
-    else if (eq(vp, STRedit)) {
-	HistEvent ev;
-	Char *vn = value(STRhistchars);
-
-	editing = 1;
-	el = el_init_fd(getprogname(), cshin, cshout, csherr,
-	    SHIN, SHOUT, SHERR);
-	el_set(el, EL_EDITOR, *vn ? short2str(vn) : "emacs");
-	el_set(el, EL_PROMPT, printpromptstr);
-	el_set(el, EL_ALIAS_TEXT, alias_text, NULL);
-	el_set(el, EL_SAFEREAD, 1);
-	el_set(el, EL_ADDFN, "rl-complete",
-	    "ReadLine compatible completion function", _el_fn_complete);
-	el_set(el, EL_BIND, "^I", adrof(STRfilec) ? "rl-complete" : "ed-insert",
-	    NULL);
-	hi = history_init();
-	history(hi, &ev, H_SETSIZE, getn(value(STRhistory)));
-	loadhist(Histlist.Hnext);
-	el_set(el, EL_HIST, history, hi);
-    }
+    else if (eq(vp, STRedit))
+	wantediting = 1;
 #endif
 }
 
@@ -566,16 +550,45 @@ unset(Char **v, struct command *t)
 	filec = 0;
 #endif
 #ifdef EDIT
-    if (adrof(STRedit) == 0) {
+    if (adrof(STRedit) == 0)
+	wantediting = 0;
+#endif
+}
+
+extern int insource;
+void
+updateediting(void)
+{
+    if (insource || wantediting == editing)
+	return;
+
+    if (wantediting) {
+	HistEvent ev;
+	Char *vn = value(STRhistchars);
+
+	el = el_init_fd(getprogname(), cshin, cshout, csherr,
+	    SHIN, SHOUT, SHERR);
+	el_set(el, EL_EDITOR, *vn ? short2str(vn) : "emacs");
+	el_set(el, EL_PROMPT, printpromptstr);
+	el_set(el, EL_ALIAS_TEXT, alias_text, NULL);
+	el_set(el, EL_SAFEREAD, 1);
+	el_set(el, EL_ADDFN, "rl-complete",
+	    "ReadLine compatible completion function", _el_fn_complete);
+	el_set(el, EL_BIND, "^I", adrof(STRfilec) ? "rl-complete" : "ed-insert",
+	    NULL);
+	hi = history_init();
+	history(hi, &ev, H_SETSIZE, getn(value(STRhistory)));
+	loadhist(Histlist.Hnext);
+	el_set(el, EL_HIST, history, hi);
+    } else {
 	if (el)
 	    el_end(el);
 	if (hi)
 	    history_end(hi);
 	el = NULL;
 	hi = NULL;
-	editing = 0;
     }
-#endif
+    editing = wantediting;
 }
 
 void

Reply via email to