about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog20
-rw-r--r--Config/version.mk4
-rw-r--r--README2
-rw-r--r--Src/Zle/compcore.c66
-rw-r--r--Src/Zle/compctl.c62
-rw-r--r--Src/Zle/complist.c90
-rw-r--r--Src/Zle/compresult.c246
-rw-r--r--Src/Zle/deltochar.c16
-rw-r--r--Src/Zle/zle.h5
-rw-r--r--Src/Zle/zle_hist.c184
-rw-r--r--Src/Zle/zle_main.c47
-rw-r--r--Src/Zle/zle_misc.c208
-rw-r--r--Src/Zle/zle_move.c166
-rw-r--r--Src/Zle/zle_params.c46
-rw-r--r--Src/Zle/zle_refresh.c18
-rw-r--r--Src/Zle/zle_tricky.c309
-rw-r--r--Src/Zle/zle_utils.c127
-rw-r--r--Src/Zle/zle_vi.c262
-rw-r--r--Src/Zle/zle_word.c232
-rw-r--r--Src/builtin.c2
-rw-r--r--Src/exec.c2
-rw-r--r--Src/hist.c77
-rw-r--r--Src/init.c13
-rw-r--r--Src/input.c4
-rw-r--r--Src/jobs.c4
-rw-r--r--Src/lex.c26
-rw-r--r--Src/loop.c4
-rw-r--r--Src/params.c2
-rw-r--r--Src/signals.c2
-rw-r--r--Src/system.h49
-rw-r--r--Src/utils.c17
-rw-r--r--Src/zsh.h10
-rw-r--r--configure.ac2
33 files changed, 1211 insertions, 1113 deletions
diff --git a/ChangeLog b/ChangeLog
index 3d88749f0..4c3e287dd 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,23 @@
+2005-01-14  Peter Stephenson  <pws@csr.com>
+
+	* unposted: update version to 4.2.3-dev-1.
+
+	* c.f. 20675: configure.ac, Src/builtin.c, Src/exec.c, Src/hist.c,
+	Src/init.c, Src/input.c, Src/jobs.c, Src/lex.c, Src/loop.c,
+	Src/params.c, Src/signals.c, Src/system.h, Src/utils.c, Src/zsh.h,
+	Src/Zle/compcore.c, Src/Zle/compctl.c,
+	Src/Zle/complist.c, Src/Zle/compresult.c, rc/Zle/deltochar.c,
+	Src/Zle/zle.h, Src/Zle/zle_hist.c, Src/Zle/zle_main.c,
+	Src/Zle/zle_misc.c, Src/Zle/zle_move.c, Src/Zle/zle_params.c,
+	Src/Zle/zle_refresh.c, Src/Zle/zle_tricky.c, Src/Zle/zle_utils.c,
+	Src/Zle/zle_vi.c, Src/Zle/zle_word.c: Make it easier to add
+	support for Unicode etc. to Zle. line is called zleline and is not
+	directly visible in the main shell.  cs and ll are called zlecs
+	and zlell but are still visible in the main shell (this will
+	probably need changing).  Pointers to zle functions are addressed
+	by pointer not by confusing #define's.  Add beginnings of support
+	to configure.ac and system.h.  Very many pitfalls remain.
+
 2005-01-13  Peter Stephenson  <pws@csr.com>
 
 	* 20708: Doc/Zsh/contrib.yo, Functions/Zle/replace-string:
diff --git a/Config/version.mk b/Config/version.mk
index 7e558ff3c..b8196ec46 100644
--- a/Config/version.mk
+++ b/Config/version.mk
@@ -27,5 +27,5 @@
 # This must also serve as a shell script, so do not add spaces around the
 # `=' signs.
 
-VERSION=4.2.3
-VERSION_DATE='January 13, 2005'
+VERSION=4.2.3-dev-1
+VERSION_DATE='January 14, 2006'
diff --git a/README b/README
index 6069beadd..82f924cbd 100644
--- a/README
+++ b/README
@@ -5,7 +5,7 @@ THE Z SHELL (ZSH)
 Version
 -------
 
-This is zsh version 4.2.3.  This is a stable version.
+This is a version under development subsequent to zsh 4.2.3.
 
 Installing Zsh
 --------------
diff --git a/Src/Zle/compcore.c b/Src/Zle/compcore.c
index 8fd224bd9..59443a8fa 100644
--- a/Src/Zle/compcore.c
+++ b/Src/Zle/compcore.c
@@ -329,7 +329,7 @@ do_completion(UNUSED(Hookdef dummy), Compldat dat)
 		      (isset(LISTPACKED) ? "packed rows" : "rows") :
 		      (isset(LISTPACKED) ? "packed" : ""));
     startauto = isset(AUTOMENU);
-    movetoend = ((cs == we || isset(ALWAYSTOEND)) ? 2 : 1);
+    movetoend = ((zlecs == we || isset(ALWAYSTOEND)) ? 2 : 1);
     showinglist = 0;
     hasmatched = hasunmatched = 0;
     minmlen = 1000000;
@@ -341,10 +341,10 @@ do_completion(UNUSED(Hookdef dummy), Compldat dat)
     /* Make sure we have the completion list and compctl. */
     if (makecomplist(s, incmd, lst)) {
 	/* Error condition: feeeeeeeeeeeeep(). */
-	cs = 0;
-	foredel(ll);
+	zlecs = 0;
+	foredel(zlell);
 	inststr(origline);
-	cs = origcs;
+	zlecs = origcs;
 	clearlist = 1;
 	ret = 1;
 	minfo.cur = NULL;
@@ -366,10 +366,10 @@ do_completion(UNUSED(Hookdef dummy), Compldat dat)
 	ret = selfinsert(zlenoargs);
     else if (!useline && uselist) {
 	/* All this and the guy only wants to see the list, sigh. */
-	cs = 0;
-	foredel(ll);
+	zlecs = 0;
+	foredel(zlell);
 	inststr(origline);
-	cs = origcs;
+	zlecs = origcs;
 	showinglist = -2;
     } else if (useline == 2 && nmatches > 1) {
 	do_allmatches(1);
@@ -414,10 +414,10 @@ do_completion(UNUSED(Hookdef dummy), Compldat dat)
 	invalidatelist();
 	if (forcelist)
 	    clearlist = 1;
-	cs = 0;
-	foredel(ll);
+	zlecs = 0;
+	foredel(zlell);
 	inststr(origline);
-	cs = origcs;
+	zlecs = origcs;
     }
     /* Print the explanation strings if needed. */
     if (!showinglist && validlist && usemenu != 2 && uselist &&
@@ -430,9 +430,9 @@ do_completion(UNUSED(Hookdef dummy), Compldat dat)
     for (n = firstnode(matchers); n; incnode(n))
 	freecmatcher((Cmatcher) getdata(n));
 
-    ll = strlen((char *)line);
-    if (cs > ll)
-	cs = ll;
+    zlell = strlen((char *)zleline);
+    if (zlecs > zlell)
+	zlecs = zlell;
     popheap();
 
     return ret;
@@ -469,8 +469,8 @@ before_complete(UNUSED(Hookdef dummy), int *lst)
     /* We may have to reset the cursor to its position after the   *
      * string inserted by the last completion. */
 
-    if ((fromcomp & FC_INWORD) && (cs = lastend) > ll)
-	cs = ll;
+    if ((fromcomp & FC_INWORD) && (zlecs = lastend) > zlell)
+	zlecs = zlell;
 
     /* Check if we have to start a menu-completion (via automenu). */
 
@@ -499,10 +499,10 @@ after_complete(UNUSED(Hookdef dummy), int *dat)
 	    minfo.cur = NULL;
 	    if (ret >= 2) {
 		fixsuffix();
-		cs = 0;
-		foredel(ll);
+		zlecs = 0;
+		foredel(zlell);
 		inststr(origline);
-		cs = origcs;
+		zlecs = origcs;
 		if (ret == 2) {
 		    clearlist = 1;
 		    invalidatelist();
@@ -683,10 +683,10 @@ callcompfunc(char *s, char *fn)
 	    int l;
 
 	    compiprefix = (char *) zalloc((l = wb - parwb) + 1);
-	    memcpy(compiprefix, line + parwb, l);
+	    memcpy(compiprefix, zleline + parwb, l);
 	    compiprefix[l] = '\0';
 	    compisuffix = (char *) zalloc((l = parwe - we) + 1);
-	    memcpy(compisuffix, line + we, l);
+	    memcpy(compisuffix, zleline + we, l);
 	    compisuffix[l] = '\0';
 
 	    wb = parwb;
@@ -1152,7 +1152,7 @@ check_param(char *s, int set, int test)
 	    }
 	    /* And adjust wb, we, and offs again. */
 	    offs -= b - s;
-	    wb = cs - offs;
+	    wb = zlecs - offs;
 	    we = wb + e - b;
 	    ispar = (br >= 2 ? 2 : 1);
 	    b[we-wb] = '\0';
@@ -1273,11 +1273,11 @@ set_comp_sep(void)
     char *s = comp_str(&lip, &lp, 1);
     LinkList foo = newlinklist();
     LinkNode n;
-    int owe = we, owb = wb, ocs = cs, swb, swe, scs, soffs, ne = noerrs;
-    int tl, got = 0, i = 0, j, cur = -1, oll = ll, sl, css = 0;
+    int owe = we, owb = wb, ocs = zlecs, swb, swe, scs, soffs, ne = noerrs;
+    int tl, got = 0, i = 0, j, cur = -1, oll = zlell, sl, css = 0;
     int remq = 0, dq = 0, odq, sq = 0, osq, issq = 0, sqq = 0, lsq = 0, qa = 0;
     int ois = instring, oib = inbackt, noffs = lp, ona = noaliases;
-    char *tmp, *p, *ns, *ol = (char *) line, sav, *qp, *qs, *ts, qc = '\0';
+    char *tmp, *p, *ns, *ol = (char *) zleline, sav, *qp, *qs, *ts, qc = '\0';
 
     s += lip;
     wb += lip;
@@ -1295,7 +1295,7 @@ set_comp_sep(void)
     tmp = (char *) zhalloc(tl = 3 + strlen(s));
     tmp[0] = ' ';
     memcpy(tmp + 1, s, noffs);
-    tmp[(scs = cs = 1 + noffs)] = 'x';
+    tmp[(scs = zlecs = 1 + noffs)] = 'x';
     strcpy(tmp + 2 + noffs, s + noffs);
 
     switch (*compqstack) {
@@ -1318,8 +1318,8 @@ set_comp_sep(void)
             if (*p == '\\' && p[1] == '\\') {
                 dq++;
                 chuck(p);
-                if (j > cs) {
-                    cs++;
+                if (j > zlecs) {
+                    zlecs++;
                     css++;
                 }
                 if (!*p)
@@ -1329,8 +1329,8 @@ set_comp_sep(void)
     odq = dq;
     osq = sq;
     inpush(dupstrspace(tmp), 0, NULL);
-    line = (unsigned char *) tmp;
-    ll = tl - 1;
+    zleline = (unsigned char *) tmp;
+    zlell = tl - 1;
     strinbeg(0);
     noaliases = 1;
     do {
@@ -1383,7 +1383,7 @@ set_comp_sep(void)
 	    swb = wb - 1 - dq - sq;
 	    swe = we - 1 - dq - sq;
             sqq = lsq;
-	    soffs = cs - swb - css;
+	    soffs = zlecs - swb - css;
 	    chuck(p + soffs);
 	    ns = dupstring(p);
 	}
@@ -1397,9 +1397,9 @@ set_comp_sep(void)
     lexrestore();
     wb = owb;
     we = owe;
-    cs = ocs;
-    line = (unsigned char *) ol;
-    ll = oll;
+    zlecs = ocs;
+    zleline = (unsigned char *) ol;
+    zlell = oll;
     if (cur < 0 || i < 1)
 	return 1;
     owb = offs;
diff --git a/Src/Zle/compctl.c b/Src/Zle/compctl.c
index a71921a04..4b33a2921 100644
--- a/Src/Zle/compctl.c
+++ b/Src/Zle/compctl.c
@@ -200,14 +200,14 @@ compctlread(char *name, char **args, Options ops, char *reply)
 
     if (OPT_ISSET(ops,'l')) {
 	/* -ln gives the index of the word the cursor is currently on, which is
-	available in cs (but remember that Zsh counts from one, not zero!) */
+	available in zlecs (but remember that Zsh counts from one, not zero!) */
 	if (OPT_ISSET(ops,'n')) {
 	    char nbuf[14];
 
 	    if (OPT_ISSET(ops,'e') || OPT_ISSET(ops,'E'))
-		printf("%d\n", cs + 1);
+		printf("%d\n", zlecs + 1);
 	    if (!OPT_ISSET(ops,'e')) {
-		sprintf(nbuf, "%d", cs + 1);
+		sprintf(nbuf, "%d", zlecs + 1);
 		setsparam(reply, ztrdup(nbuf));
 	    }
 	    return 0;
@@ -215,11 +215,11 @@ compctlread(char *name, char **args, Options ops, char *reply)
 	/* without -n, the current line is assigned to the given parameter as a
 	scalar */
 	if (OPT_ISSET(ops,'e') || OPT_ISSET(ops,'E')) {
-	    zputs((char *) line, stdout);
+	    zputs((char *) zleline, stdout);
 	    putchar('\n');
 	}
 	if (!OPT_ISSET(ops,'e'))
-	    setsparam(reply, ztrdup((char *) line));
+	    setsparam(reply, ztrdup((char *) zleline));
     } else {
 	int i;
 
@@ -2560,7 +2560,7 @@ makecomplistor(Compctl cc, char *s, int incmd, int compadd, int sub)
 static void
 makecomplistlist(Compctl cc, char *s, int incmd, int compadd)
 {
-    int oloffs = offs, owe = we, owb = wb, ocs = cs;
+    int oloffs = offs, owe = we, owb = wb, ocs = zlecs;
 
     if (cc->ext)
 	/* Handle extended completion. */
@@ -2574,7 +2574,7 @@ makecomplistlist(Compctl cc, char *s, int incmd, int compadd)
     offs = oloffs;
     wb = owb;
     we = owe;
-    cs = ocs;
+    zlecs = ocs;
 }
 
 /* This add matches for extended completion patterns */
@@ -2751,10 +2751,10 @@ sep_comp_string(char *ss, char *s, int noffs)
 {
     LinkList foo = newlinklist();
     LinkNode n;
-    int owe = we, owb = wb, ocs = cs, swb, swe, scs, soffs, ne = noerrs;
-    int sl = strlen(ss), tl, got = 0, i = 0, cur = -1, oll = ll, remq;
+    int owe = we, owb = wb, ocs = zlecs, swb, swe, scs, soffs, ne = noerrs;
+    int sl = strlen(ss), tl, got = 0, i = 0, cur = -1, oll = zlell, remq;
     int ois = instring, oib = inbackt, ona = noaliases;
-    char *tmp, *p, *ns, *ol = (char *) line, sav, *oaq = autoq, *qp, *qs;
+    char *tmp, *p, *ns, *ol = (char *) zleline, sav, *oaq = autoq, *qp, *qs;
     char *ts, qc = '\0';
 
     swb = swe = soffs = 0;
@@ -2770,13 +2770,13 @@ sep_comp_string(char *ss, char *s, int noffs)
     strcpy(tmp, ss);
     tmp[sl] = ' ';
     memcpy(tmp + sl + 1, s, noffs);
-    tmp[(scs = cs = sl + 1 + noffs)] = 'x';
+    tmp[(scs = zlecs = sl + 1 + noffs)] = 'x';
     strcpy(tmp + sl + 2 + noffs, s + noffs);
     if ((remq = (*compqstack == '\\')))
 	tmp = rembslash(tmp);
     inpush(dupstrspace(tmp), 0, NULL);
-    line = (unsigned char *) tmp;
-    ll = tl - 1;
+    zleline = (unsigned char *) tmp;
+    zlell = tl - 1;
     strinbeg(0);
     noaliases = 1;
     do {
@@ -2807,7 +2807,7 @@ sep_comp_string(char *ss, char *s, int noffs)
 	    cur = i;
 	    swb = wb - 1;
 	    swe = we - 1;
-	    soffs = cs - swb;
+	    soffs = zlecs - swb;
 	    chuck(p + soffs);
 	    ns = dupstring(p);
 	}
@@ -2821,9 +2821,9 @@ sep_comp_string(char *ss, char *s, int noffs)
     lexrestore();
     wb = owb;
     we = owe;
-    cs = ocs;
-    line = (unsigned char *) ol;
-    ll = oll;
+    zlecs = ocs;
+    zleline = (unsigned char *) ol;
+    zlell = oll;
     if (cur < 0 || i < 1)
 	return 1;
     owb = offs;
@@ -2979,8 +2979,8 @@ makecomplistflags(Compctl cc, char *s, int incmd, int compadd)
 	addlinknode(allccs, cc);
     }
     /* Go to the end of the word if complete_in_word is not set. */
-    if (unset(COMPLETEINWORD) && cs != we)
-	cs = we, offs = strlen(s);
+    if (unset(COMPLETEINWORD) && zlecs != we)
+	zlecs = we, offs = strlen(s);
 
     s = dupstring(s);
     delit = ispattern = 0;
@@ -3200,15 +3200,15 @@ makecomplistflags(Compctl cc, char *s, int incmd, int compadd)
 	    ppre = dupstrpfx(rpre, s1 - rpre + 1);
 	psuf = dupstring(s2);
 
-	if (cs != wb) {
-	    char save = line[cs];
+	if (zlecs != wb) {
+	    char save = zleline[zlecs];
 
-	    line[cs] = 0;
-	    lppre = dupstring((char *) line + wb +
+	    zleline[zlecs] = 0;
+	    lppre = dupstring((char *) zleline + wb +
 			      (qipre && *qipre ?
 			       (strlen(qipre) -
 				(*qipre == '\'' || *qipre == '\"')) : 0));
-	    line[cs] = save;
+	    zleline[zlecs] = save;
 	    if (brbeg) {
 		Brinfo bp;
 
@@ -3230,25 +3230,25 @@ makecomplistflags(Compctl cc, char *s, int incmd, int compadd)
 	    lppre = NULL;
 	    lppl = 0;
 	}
-	if (cs != we) {
+	if (zlecs != we) {
 	    int end = we;
-	    char save = line[end];
+	    char save = zleline[end];
 
 	    if (qisuf && *qisuf) {
 		int ql = strlen(qisuf);
 
 		end -= ql - (qisuf[ql-1] == '\'' || qisuf[ql-1] == '"');
 	    }
-	    line[end] = 0;
-	    lpsuf = dupstring((char *) (line + cs));
-	    line[end] = save;
+	    zleline[end] = 0;
+	    lpsuf = dupstring((char *) (zleline + zlecs));
+	    zleline[end] = save;
 	    if (brend) {
 		Brinfo bp;
 		char *p;
 		int bl;
 
 		for (bp = brend; bp; bp = bp->next) {
-		    p = lpsuf + (we - cs) - bp->qpos - (bl = strlen(bp->str));
+		    p = lpsuf + (we - zlecs) - bp->qpos - (bl = strlen(bp->str));
 		    strcpy(p, p + bl);
 		}
 	    }
@@ -3262,7 +3262,7 @@ makecomplistflags(Compctl cc, char *s, int incmd, int compadd)
 
 	/* And get the file prefix. */
 	fpre = dupstring(((s1 == s || s1 == rpre || ic) &&
-			  (*s != '/' || cs == wb)) ? s1 : s1 + 1);
+			  (*s != '/' || zlecs == wb)) ? s1 : s1 + 1);
 	qfpre = quotename(fpre, NULL);
 	/* And the suffix. */
 	fsuf = dupstrpfx(rsuf, s2 - rsuf);
diff --git a/Src/Zle/complist.c b/Src/Zle/complist.c
index 2b2378a43..1cc709817 100644
--- a/Src/Zle/complist.c
+++ b/Src/Zle/complist.c
@@ -1772,27 +1772,27 @@ setmstatus(char *status, char *sline, int sll, int scs,
     int pl, sl, max;
 
     if (csp) {
-        *csp = cs;
-        *llp = ll;
+        *csp = zlecs;
+        *llp = zlell;
         *lenp = lastend - wb;
 
-        ret = dupstring((char *) line);
+        ret = dupstring((char *) zleline);
 
-        p = (char *) zhalloc(cs - wb + 1);
-        strncpy(p, (char *) line + wb, cs - wb);
-        p[cs - wb] = '\0';
-        if (lastend < cs)
+        p = (char *) zhalloc(zlecs - wb + 1);
+        strncpy(p, (char *) zleline + wb, zlecs - wb);
+        p[zlecs - wb] = '\0';
+        if (lastend < zlecs)
             s = "";
         else {
-            s = (char *) zhalloc(lastend - cs + 1);
-            strncpy(s, (char *) line + cs, lastend - cs);
-            s[lastend - cs] = '\0';
+            s = (char *) zhalloc(lastend - zlecs + 1);
+            strncpy(s, (char *) zleline + zlecs, lastend - zlecs);
+            s[lastend - zlecs] = '\0';
         }
-        cs = 0;
-        foredel(ll);
+        zlecs = 0;
+        foredel(zlell);
         spaceinline(sll);
-        memcpy(line, sline, sll);
-        cs = scs;
+        memcpy(zleline, sline, sll);
+        zlecs = scs;
     } else {
         p = complastprefix;
         s = complastsuffix;
@@ -1994,11 +1994,11 @@ domenuselect(Hookdef dummy, Chdata dat)
 	     * was before completion started.
 	     */
             mode = MM_INTER;
-            cs = 0;
-            foredel(ll);
+            zlecs = 0;
+            foredel(zlell);
             spaceinline(l);
-            strncpy((char *) line, origline, l);
-            cs = origcs;
+            strncpy((char *) zleline, origline, l);
+            zlecs = origcs;
             setmstatus(status, NULL, 0 , 0, NULL, NULL, NULL);
         } else if (strpfx("search", s)) {
             mode = (strstr(s, "back") ? MM_BSEARCH : MM_FSEARCH);
@@ -2092,9 +2092,9 @@ domenuselect(Hookdef dummy, Chdata dat)
 	     * completion we don't want that, we always want to
 	     * be able to type the next character.
 	     */
-	    modeline = dupstring(line);
-            modecs = cs;
-            modell = ll;
+	    modeline = dupstring(zleline);
+            modecs = zlecs;
+            modell = zlell;
             modelen = minfo.len;
         }
         first = 0;
@@ -2188,11 +2188,11 @@ domenuselect(Hookdef dummy, Chdata dat)
 		 * start.
 		 */
                 mode = MM_INTER;
-                cs = 0;
-                foredel(ll);
+                zlecs = 0;
+                foredel(zlell);
                 spaceinline(l);
-                strncpy((char *) line, origline, l);
-                cs = origcs;
+                strncpy((char *) zleline, origline, l);
+                zlecs = origcs;
                 setmstatus(status, NULL, 0, 0, NULL, NULL, NULL);
 
                 continue;
@@ -2207,8 +2207,8 @@ domenuselect(Hookdef dummy, Chdata dat)
 
 	    s->prev = u;
 	    u = s;
-	    s->line = dupstring((char *) line);
-	    s->cs = cs;
+	    s->line = dupstring((char *) zleline);
+	    s->cs = zlecs;
 	    s->mline = mline;
 	    s->mlbeg = mlbeg;
 	    memcpy(&(s->info), &minfo, sizeof(struct menuinfo));
@@ -2247,21 +2247,21 @@ domenuselect(Hookdef dummy, Chdata dat)
 		 * the command line as it is with just the
 		 * characters typed by the user.
 		 */
-                cs = 0;
-                foredel(ll);
+                zlecs = 0;
+                foredel(zlell);
                 spaceinline(l);
-                strncpy((char *) line, origline, l);
-                cs = origcs;
+                strncpy((char *) zleline, origline, l);
+                zlecs = origcs;
 
                 if (cmd == Th(z_selfinsert))
                     selfinsert(zlenoargs);
                 else
                     selfinsertunmeta(zlenoargs);
 
-                saveline = (char *) zhalloc(ll);
-                memcpy(saveline, line, ll);
-                savell = ll;
-                savecs = cs;
+                saveline = (char *) zhalloc(zlell);
+                memcpy(saveline, zleline, zlell);
+                savell = zlell;
+                savecs = zlecs;
                 iforcemenu = -1;
             } else
                 mode = 0;
@@ -2313,8 +2313,8 @@ domenuselect(Hookdef dummy, Chdata dat)
             mode = 0;
 	    s->prev = u;
 	    u = s;
-	    s->line = dupstring((char *) line);
-	    s->cs = cs;
+	    s->line = dupstring((char *) zleline);
+	    s->cs = zlecs;
 	    s->mline = mline;
 	    s->mlbeg = mlbeg;
 	    memcpy(&(s->info), &minfo, sizeof(struct menuinfo));
@@ -2368,11 +2368,11 @@ domenuselect(Hookdef dummy, Chdata dat)
 		break;
 
 	    handleundo();
-	    cs = 0;
-	    foredel(ll);
+	    zlecs = 0;
+	    foredel(zlell);
 	    spaceinline(l = strlen(u->line));
-	    strncpy((char *) line, u->line, l);
-	    cs = u->cs;
+	    strncpy((char *) zleline, u->line, l);
+	    zlecs = u->cs;
 	    menuacc = u->acc;
 	    memcpy(&minfo, &(u->info), sizeof(struct menuinfo));
 	    p = &(minfo.cur);
@@ -2750,11 +2750,11 @@ domenuselect(Hookdef dummy, Chdata dat)
                 origline = modeline;
                 origcs = modecs;
                 origll = modell;
-                cs = 0;
-                foredel(ll);
+                zlecs = 0;
+                foredel(zlell);
                 spaceinline(origll);
-                strncpy((char *) line, origline, origll);
-                cs = origcs;
+                strncpy((char *) zleline, origline, origll);
+                zlecs = origcs;
                 minfo.len = modelen;
             } else {
                 mode = 0;
diff --git a/Src/Zle/compresult.c b/Src/Zle/compresult.c
index 05b5f1a10..c0a881b45 100644
--- a/Src/Zle/compresult.c
+++ b/Src/Zle/compresult.c
@@ -169,7 +169,7 @@ static char *
 cline_str(Cline l, int ins, int *csp, LinkList posl)
 {
     Cline s;
-    int ocs = cs, ncs, pcs, scs, opos = -1, npos;
+    int ocs = zlecs, ncs, pcs, scs, opos = -1, npos;
     int pm, pmax, pmm, pma, sm, smax, smm, sma, d, dm, mid;
     int i, j, li = 0, cbr, padd = (ins ? wb - ocs : -ocs);
     Brinfo brp, brs;
@@ -205,7 +205,7 @@ cline_str(Cline l, int ins, int *csp, LinkList posl)
 	}
 	while (brs && !brs->curpos) {
 	    if (cbr < 0)
-		cbr = cs;
+		cbr = zlecs;
 	    inststrlen(brs->str, 1, -1);
 	    brs = brs->prev;
 	}
@@ -214,21 +214,21 @@ cline_str(Cline l, int ins, int *csp, LinkList posl)
     while (l) {
 	/* Insert the original string if no prefix. */
 	if (l->olen && !(l->flags & CLF_SUF) && !l->prefix) {
-	    pcs = cs + l->olen;
+	    pcs = zlecs + l->olen;
 	    inststrlen(l->orig, 1, l->olen);
 	} else {
 	    /* Otherwise insert the prefix. */
 	    for (s = l->prefix; s; s = s->next) {
-		pcs = cs + s->llen;
+		pcs = zlecs + s->llen;
 		if (s->flags & CLF_LINE)
 		    inststrlen(s->line, 1, s->llen);
 		else
 		    inststrlen(s->word, 1, s->wlen);
-		scs = cs;
+		scs = zlecs;
 
 		if ((s->flags & CLF_DIFF) && (!dm || (s->flags & CLF_MATCHED))) {
-		    d = cs; dm = s->flags & CLF_MATCHED;
-		    if (posl && (npos = cs + padd) != opos) {
+		    d = zlecs; dm = s->flags & CLF_MATCHED;
+		    if (posl && (npos = zlecs + padd) != opos) {
 			opos = npos;
 			addlinknode(posl, (void *) ((long) npos));
 		    }
@@ -240,11 +240,11 @@ cline_str(Cline l, int ins, int *csp, LinkList posl)
 	    int ocs, bl;
 
 	    while (brp && li >= brp->curpos) {
-		ocs = cs;
+		ocs = zlecs;
 		bl = strlen(brp->str);
-		cs = pcs - (li - brp->curpos);
+		zlecs = pcs - (li - brp->curpos);
 		inststrlen(brp->str, 1, bl);
-		cs = ocs + bl;
+		zlecs = ocs + bl;
 		pcs += bl;
 		scs += bl;
 		brp = brp->next;
@@ -253,14 +253,14 @@ cline_str(Cline l, int ins, int *csp, LinkList posl)
 	/* Remember the position if this is the first prefix with
 	 * missing characters. */
 	if ((l->flags & CLF_MISS) && !(l->flags & CLF_SUF)) {
-	    if (posl && (npos = cs + padd) != opos) {
+	    if (posl && (npos = zlecs + padd) != opos) {
 		opos = npos;
 		addlinknode(posl, (void *) ((long) npos));
 	    }
 	    if (((pmax <= (l->max - l->min) || (pma && l->max != l->min)) &&
 		 (!pmm || (l->flags & CLF_MATCHED))) ||
 		((l->flags & CLF_MATCHED) && !pmm)) {
-		pm = cs; pmax = l->max - l->min; pmm = l->flags & CLF_MATCHED;
+		pm = zlecs; pmax = l->max - l->min; pmm = l->flags & CLF_MATCHED;
 		pma = ((l->prefix || l->suffix) && l->min == cline_sublen(l));
 	    }
 	}
@@ -268,35 +268,35 @@ cline_str(Cline l, int ins, int *csp, LinkList posl)
 	    int ocs, bl;
 
 	    while (brs && li >= brs->curpos) {
-		ocs = cs;
+		ocs = zlecs;
 		bl = strlen(brs->str);
-		cs = scs - (li - brs->curpos);
+		zlecs = scs - (li - brs->curpos);
 		if (cbr < 0)
-		    cbr = cs;
+		    cbr = zlecs;
 		inststrlen(brs->str, 1, bl);
-		cs = ocs + bl;
+		zlecs = ocs + bl;
 		pcs += bl;
 		brs = brs->prev;
 	    }
 	}
-	pcs = cs;
+	pcs = zlecs;
 	/* Insert the anchor. */
 	if (l->flags & CLF_LINE)
 	    inststrlen(l->line, 1, l->llen);
 	else
 	    inststrlen(l->word, 1, l->wlen);
-	scs = cs;
+	scs = zlecs;
 	if (ins) {
 	    int ocs, bl;
 
 	    li += l->llen;
 
 	    while (brp && li >= brp->curpos) {
-		ocs = cs;
+		ocs = zlecs;
 		bl = strlen(brp->str);
-		cs = pcs + l->llen - (li - brp->curpos);
+		zlecs = pcs + l->llen - (li - brp->curpos);
 		inststrlen(brp->str, 1, bl);
-		cs = ocs + bl;
+		zlecs = ocs + bl;
 		pcs += bl;
 		scs += bl;
 		brp = brp->next;
@@ -305,16 +305,16 @@ cline_str(Cline l, int ins, int *csp, LinkList posl)
 	/* Remember the cursor position for suffixes and mids. */
 	if (l->flags & CLF_MISS) {
 	    if (l->flags & CLF_MID)
-		mid = cs;
+		mid = zlecs;
 	    else if (l->flags & CLF_SUF) {
-		if (posl && (npos = cs + padd) != opos) {
+		if (posl && (npos = zlecs + padd) != opos) {
 		    opos = npos;
 		    addlinknode(posl, (void *) ((long) npos));
 		}
 		if (((smax <= (l->min - l->max) || (sma && l->max != l->min)) &&
 		     (!smm || (l->flags & CLF_MATCHED))) ||
 		    ((l->flags & CLF_MATCHED) && !smm)) {
-		    sm = cs; smax = l->min - l->max; smm = l->flags & CLF_MATCHED;
+		    sm = zlecs; smax = l->min - l->max; smm = l->flags & CLF_MATCHED;
 		    sma = ((l->prefix || l->suffix) && l->min == cline_sublen(l));
 		}
 	    }
@@ -323,20 +323,20 @@ cline_str(Cline l, int ins, int *csp, LinkList posl)
 	    int ocs, bl;
 
 	    while (brs && li >= brs->curpos) {
-		ocs = cs;
+		ocs = zlecs;
 		bl = strlen(brs->str);
-		cs = scs - (li - brs->curpos);
+		zlecs = scs - (li - brs->curpos);
 		if (cbr < 0)
-		    cbr = cs;
+		    cbr = zlecs;
 		inststrlen(brs->str, 1, bl);
-		cs = ocs + bl;
+		zlecs = ocs + bl;
 		pcs += bl;
 		brs = brs->prev;
 	    }
 	}
 	/* And now insert the suffix or the original string. */
 	if (l->olen && (l->flags & CLF_SUF) && !l->suffix) {
-	    pcs = cs;
+	    pcs = zlecs;
 	    inststrlen(l->orig, 1, l->olen);
 	    if (ins) {
 		int ocs, bl;
@@ -344,22 +344,22 @@ cline_str(Cline l, int ins, int *csp, LinkList posl)
 		li += l->olen;
 
 		while (brp && li >= brp->curpos) {
-		    ocs = cs;
+		    ocs = zlecs;
 		    bl = strlen(brp->str);
-		    cs = pcs + l->olen - (li - brp->curpos);
+		    zlecs = pcs + l->olen - (li - brp->curpos);
 		    inststrlen(brp->str, 1, bl);
-		    cs = ocs + bl;
+		    zlecs = ocs + bl;
 		    pcs += bl;
 		    brp = brp->next;
 		}
 		while (brs && li >= brs->curpos) {
-		    ocs = cs;
+		    ocs = zlecs;
 		    bl = strlen(brs->str);
-		    cs = pcs + l->olen - (li - brs->curpos);
+		    zlecs = pcs + l->olen - (li - brs->curpos);
 		    if (cbr < 0)
-			cbr = cs;
+			cbr = zlecs;
 		    inststrlen(brs->str, 1, bl);
-		    cs = ocs + bl;
+		    zlecs = ocs + bl;
 		    pcs += bl;
 		    brs = brs->prev;
 		}
@@ -370,13 +370,13 @@ cline_str(Cline l, int ins, int *csp, LinkList posl)
 	    for (j = -1, i = 0, s = l->suffix; s; s = s->next) {
 		if (j < 0 && (s->flags & CLF_DIFF))
 		    j = i, js = s;
-		pcs = cs;
+		pcs = zlecs;
 		if (s->flags & CLF_LINE) {
 		    inststrlen(s->line, 0, s->llen);
-		    i += s->llen; scs = cs + s->llen;
+		    i += s->llen; scs = zlecs + s->llen;
 		} else {
 		    inststrlen(s->word, 0, s->wlen);
-		    i += s->wlen; scs = cs + s->wlen;
+		    i += s->wlen; scs = zlecs + s->wlen;
 		}
 		if (ins) {
 		    int ocs, bl;
@@ -384,32 +384,32 @@ cline_str(Cline l, int ins, int *csp, LinkList posl)
 		    li += s->llen;
 
 		    while (brp && li >= brp->curpos) {
-			ocs = cs;
+			ocs = zlecs;
 			bl = strlen(brp->str);
-			cs = pcs + (li - brp->curpos);
+			zlecs = pcs + (li - brp->curpos);
 			inststrlen(brp->str, 1, bl);
-			cs = ocs + bl;
+			zlecs = ocs + bl;
 			pcs += bl;
 			scs += bl;
 			brp = brp->next;
 		    }
 		    while (brs && li >= brs->curpos) {
-			ocs = cs;
+			ocs = zlecs;
 			bl = strlen(brs->str);
-			cs = scs - (li - brs->curpos);
+			zlecs = scs - (li - brs->curpos);
 			if (cbr < 0)
-			    cbr = cs;
+			    cbr = zlecs;
 			inststrlen(brs->str, 1, bl);
-			cs = ocs + bl;
+			zlecs = ocs + bl;
 			pcs += bl;
 			brs = brs->prev;
 		    }
 		}
 	    }
-	    cs += i;
+	    zlecs += i;
 	    if (j >= 0 && (!dm || (js->flags & CLF_MATCHED))) {
-		d = cs - j; dm = js->flags & CLF_MATCHED;
-		if (posl && (npos = cs - j + padd) != opos) {
+		d = zlecs - j; dm = js->flags & CLF_MATCHED;
+		if (posl && (npos = zlecs - j + padd) != opos) {
 		    opos = npos;
 		    addlinknode(posl, (void *) ((long) npos));
 		}
@@ -417,7 +417,7 @@ cline_str(Cline l, int ins, int *csp, LinkList posl)
 	}
 	l = l->next;
     }
-    if (posl && (npos = cs + padd) != opos)
+    if (posl && (npos = zlecs + padd) != opos)
 #if 0
 	/* This could be used to put an extra colon before the end-of-word
 	 * position if there is nothing missing. */
@@ -426,23 +426,23 @@ cline_str(Cline l, int ins, int *csp, LinkList posl)
 	addlinknode(posl, (void *) ((long) npos));
 
     if (ins) {
-	int ocs = cs;
+	int ocs = zlecs;
 
 	for (; brp; brp = brp->next)
 	    inststrlen(brp->str, 1, -1);
 	for (; brs; brs = brs->prev) {
 	    if (cbr < 0)
-		cbr = cs;
+		cbr = zlecs;
 	    inststrlen(brs->str, 1, -1);
 	}
 	if (mid >= ocs)
-	    mid += cs - ocs;
+	    mid += zlecs - ocs;
 	if (pm >= ocs)
-	    pm += cs - ocs;
+	    pm += zlecs - ocs;
 	if (sm >= ocs)
-	    sm += cs - ocs;
+	    sm += zlecs - ocs;
 	if (d >= ocs)
-	    d += cs - ocs;
+	    d += zlecs - ocs;
 
 	if (posl) {
 	    LinkNode node;
@@ -451,7 +451,7 @@ cline_str(Cline l, int ins, int *csp, LinkList posl)
 	    for (node = firstnode(posl); node; incnode(node)) {
 		p = (long) getdata(node);
 		if (p >= ocs)
-		    setdata(node, (void *) (p + cs - ocs));
+		    setdata(node, (void *) (p + zlecs - ocs));
 	    }
 	}
     }
@@ -461,16 +461,16 @@ cline_str(Cline l, int ins, int *csp, LinkList posl)
      * suffix, and finally a place where the matches differ. */
     ncs = (mid >= 0 ? mid :
 	   (cbr >= 0 ? cbr :
-	    (pm >= 0 ? pm : (sm >= 0 ? sm : (d >= 0 ? d : cs)))));
+	    (pm >= 0 ? pm : (sm >= 0 ? sm : (d >= 0 ? d : zlecs)))));
 
     if (ins != 1) {
 	/* We always inserted the string in the line. If that was not
 	 * requested, we copy it and remove from the line. */
-	char *r = zalloc((i = cs - ocs) + 1);
+	char *r = zalloc((i = zlecs - ocs) + 1);
 
-	memcpy(r, (char *) (line + ocs), i);
+	memcpy(r, (char *) (zleline + ocs), i);
 	r[i] = '\0';
-	cs = ocs;
+	zlecs = ocs;
 	foredel(i);
 
 	if (csp)
@@ -478,8 +478,8 @@ cline_str(Cline l, int ins, int *csp, LinkList posl)
 
 	return r;
     }
-    lastend = cs;
-    cs = ncs;
+    lastend = zlecs;
+    zlecs = ncs;
 
     return NULL;
 }
@@ -579,7 +579,7 @@ unambig_data(int *cp, char **pp, char **ip)
 static int
 instmatch(Cmatch m, int *scs)
 {
-    int l, r = 0, ocs, a = cs, brb = 0, bradd, *brpos;
+    int l, r = 0, ocs, a = zlecs, brb = 0, bradd, *brpos;
     Brinfo bp;
 
     zsfree(lastprebr);
@@ -606,28 +606,28 @@ instmatch(Cmatch m, int *scs)
     /* The string itself. */
     inststrlen(m->str, 1, (l = strlen(m->str)));
     r += l;
-    ocs = cs;
+    ocs = zlecs;
     /* Re-insert the brace beginnings, if any. */
     if (brbeg) {
-	int pcs = cs;
+	int pcs = zlecs;
 
 	l = 0;
 	for (bp = brbeg, brpos = m->brpl,
 		 bradd = (m->pre ? strlen(m->pre) : 0);
 	     bp; bp = bp->next, brpos++) {
-	    cs = a + *brpos + bradd;
-	    pcs = cs;
+	    zlecs = a + *brpos + bradd;
+	    pcs = zlecs;
 	    l = strlen(bp->str);
 	    bradd += l;
-	    brpcs = cs;
+	    brpcs = zlecs;
 	    inststrlen(bp->str, 1, l);
 	    r += l;
 	    ocs += l;
 	}
 	lastprebr = (char *) zalloc(pcs - a + 1);
-	memcpy(lastprebr, (char *) line + a, pcs - a);
+	memcpy(lastprebr, (char *) zleline + a, pcs - a);
 	lastprebr[pcs - a] = '\0';
-	cs = ocs;
+	zlecs = ocs;
     }
     /* Path suffix. */
     if (m->psuf) {
@@ -636,24 +636,24 @@ instmatch(Cmatch m, int *scs)
     }
     /* Re-insert the brace end. */
     if (brend) {
-	a = cs;
+	a = zlecs;
 	for (bp = brend, brpos = m->brsl, bradd = 0; bp; bp = bp->next, brpos++) {
-	    cs = a - *brpos;
-	    ocs = brscs = cs;
+	    zlecs = a - *brpos;
+	    ocs = brscs = zlecs;
 	    l = strlen(bp->str);
 	    bradd += l;
 	    inststrlen(bp->str, 1, l);
-	    brb = cs;
+	    brb = zlecs;
 	    r += l;
 	}
-	cs = a + bradd;
+	zlecs = a + bradd;
 	if (scs)
 	    *scs = ocs;
     } else {
 	brscs = -1;
 
 	if (scs)
-	    *scs = cs;
+	    *scs = zlecs;
     }
     /* -S suffix */
     if (m->suf) {
@@ -666,12 +666,12 @@ instmatch(Cmatch m, int *scs)
 	r += l;
     }
     if (brend) {
-	lastpostbr = (char *) zalloc(cs - brb + 1);
-	memcpy(lastpostbr, (char *) line + brb, cs - brb);
-	lastpostbr[cs - brb] = '\0';
+	lastpostbr = (char *) zalloc(zlecs - brb + 1);
+	memcpy(lastpostbr, (char *) zleline + brb, zlecs - brb);
+	lastpostbr[zlecs - brb] = '\0';
     }
-    lastend = cs;
-    cs = ocs;
+    lastend = zlecs;
+    zlecs = ocs;
 
     return r;
 }
@@ -687,20 +687,20 @@ hasbrpsfx(Cmatch m, char *pre, char *suf)
 	return 1;
     else {
 	char *op = lastprebr, *os = lastpostbr;
-	VARARR(char, oline, ll);
-	int oll = ll, ocs = cs, ole = lastend, opcs = brpcs, oscs = brscs, ret;
+	VARARR(char, oline, zlell);
+	int oll = zlell, ocs = zlecs, ole = lastend, opcs = brpcs, oscs = brscs, ret;
 
-	memcpy(oline, line, ll);
+	memcpy(oline, zleline, zlell);
 
 	lastprebr = lastpostbr = NULL;
 
 	instmatch(m, NULL);
 
-	cs = 0;
-	foredel(ll);
+	zlecs = 0;
+	foredel(zlell);
 	spaceinline(oll);
-	memcpy(line, oline, oll);
-	cs = ocs;
+	memcpy(zleline, oline, oll);
+	zlecs = ocs;
 	lastend = ole;
 	brpcs = opcs;
 	brscs = oscs;
@@ -754,7 +754,7 @@ do_ambiguous(void)
 	 * completion options.                                             */
 	do_ambig_menu();
     } else if (ainfo) {
-	int atend = (cs == we), la, eq, tcs;
+	int atend = (zlecs == we), la, eq, tcs;
 	VARARR(char, old, we - wb);
 
 	minfo.cur = NULL;
@@ -763,9 +763,9 @@ do_ambiguous(void)
 	fixsuffix();
 
 	/* First remove the old string from the line. */
-	tcs = cs;
-	cs = wb;
-	memcpy(old, (char *) line + wb, we - wb);
+	tcs = zlecs;
+	zlecs = wb;
+	memcpy(old, (char *) zleline + wb, we - wb);
 	foredel(we - wb);
 
 	/* Now get the unambiguous string and insert it into the line. */
@@ -776,23 +776,23 @@ do_ambiguous(void)
          * old string. Unless there were matches added with -U, that is. */
 
 	if (lastend < we && !lenchanged && !hasunmatched) {
-	    cs = wb;
+	    zlecs = wb;
 	    foredel(lastend - wb);
 	    inststrlen(old, 0, we - wb);
 	    lastend = we;
-	    cs = tcs;
+	    zlecs = tcs;
 	}
 	if (eparq) {
-	    tcs = cs;
-	    cs = lastend;
+	    tcs = zlecs;
+	    zlecs = lastend;
 	    for (eq = eparq; eq; eq--)
 		inststrlen("\"", 0, 1);
-	    cs = tcs;
+	    zlecs = tcs;
 	}
 	/* la is non-zero if listambiguous may be used. Copying and
 	 * comparing the line looks like BFI but it is the easiest
 	 * solution. Really. */
-	la = (ll != origll || strncmp(origline, (char *) line, ll));
+	la = (zlell != origll || strncmp(origline, (char *) zleline, zlell));
 
 	/* If REC_EXACT and AUTO_MENU are set and what we inserted is an  *
 	 * exact match, we want menu completion the next time round       *
@@ -800,11 +800,11 @@ do_ambiguous(void)
 	 * taken as an exact match. Also we remember if we just moved the *
 	 * cursor into the word.                                          */
 	fromcomp = ((isset(AUTOMENU) ? FC_LINE : 0) |
-		    ((atend && cs != lastend) ? FC_INWORD : 0));
+		    ((atend && zlecs != lastend) ? FC_INWORD : 0));
 
 	/* Probably move the cursor to the end. */
 	if (movetoend == 3)
-	    cs = lastend;
+	    zlecs = lastend;
 
 	/* If the LIST_AMBIGUOUS option (meaning roughly `show a list only *
 	 * if the completion is completely ambiguous') is set, and some    *
@@ -947,7 +947,7 @@ do_single(Cmatch m)
 	 * so set the position variables.             */
 	minfo.pos = wb;
 	minfo.we = (movetoend >= 2 || (movetoend == 1 && !menucmp) ||
-		    (!movetoend && cs == we));
+		    (!movetoend && zlecs == we));
 	minfo.end = we;
     }
     /* If we are already in a menu-completion or if we have done a *
@@ -959,7 +959,7 @@ do_single(Cmatch m)
 	l = we - wb;
 
     minfo.insc = 0;
-    cs = minfo.pos;
+    zlecs = minfo.pos;
     foredel(l);
 
     if (m->flags & CMF_ALL) {
@@ -969,8 +969,8 @@ do_single(Cmatch m)
 
     /* And then we insert the new string. */
     minfo.len = instmatch(m, &scs);
-    minfo.end = cs;
-    cs = minfo.pos + minfo.len;
+    minfo.end = zlecs;
+    zlecs = minfo.pos + minfo.len;
 
     if (m->suf) {
 	havesuff = 1;
@@ -987,13 +987,13 @@ do_single(Cmatch m)
     } else {
 	/* There is no user-specified suffix, *
 	 * so generate one automagically.     */
-	cs = scs;
+	zlecs = scs;
 	if (partest && (m->flags & CMF_PARBR)) {
 	    int pq;
 
 	    /*{{*/
 	    /* Completing a parameter in braces.  Add a removable `}' suffix. */
-	    cs += eparq;
+	    zlecs += eparq;
 	    for (pq = parq; pq; pq--)
 		inststrlen("\"", 1, 1);
 	    minfo.insc += parq;
@@ -1005,7 +1005,7 @@ do_single(Cmatch m)
 		havesuff = 1;
 	}
 	if (((m->flags & CMF_FILE) || (partest && isset(AUTOPARAMSLASH))) &&
-	    cs > 0 && line[cs - 1] != '/') {
+	    zlecs > 0 && zleline[zlecs - 1] != '/') {
 	    /* If we have a filename or we completed a parameter name      *
 	     * and AUTO_PARAM_SLASH is set, lets see if it is a directory. *
 	     * If it is, we append a slash.                                */
@@ -1079,7 +1079,7 @@ do_single(Cmatch m)
 	    }
 	}
 	if (!minfo.insc)
-	    cs = minfo.pos + minfo.len - m->qisl;
+	    zlecs = minfo.pos + minfo.len - m->qisl;
     }
     /* If completing in a brace expansion... */
     if (brbeg) {
@@ -1092,7 +1092,7 @@ do_single(Cmatch m)
 	} else if (!menucmp) {
 	    /*{{*/
 	    /* Otherwise, add a `,' suffix, and let `}' remove it. */
-	    cs = scs;
+	    zlecs = scs;
 	    havesuff = 1;
 	    inststrlen(",", 1, 1);
 	    minfo.insc++;
@@ -1121,9 +1121,9 @@ do_single(Cmatch m)
 	makeparamsuffix(((m->flags & CMF_PARBR) ? 1 : 0), minfo.insc - parq);
 
     if ((menucmp && !minfo.we) || !movetoend) {
-	cs = minfo.end;
-	if (cs + m->qisl == lastend)
-	    cs += minfo.insc;
+	zlecs = minfo.end;
+	if (zlecs + m->qisl == lastend)
+	    zlecs += minfo.insc;
     }
     {
 	Cmatch *om = minfo.cur;
@@ -1232,27 +1232,27 @@ accept_last(void)
 
 	iremovesuffix(',', 1);
 
-	l = (brscs >= 0 ? brscs : cs) - brpcs;
+	l = (brscs >= 0 ? brscs : zlecs) - brpcs;
 
 	zsfree(lastbrbeg->str);
 	lastbrbeg->str = (char *) zalloc(l + 2);
-	memcpy(lastbrbeg->str, line + brpcs, l);
+	memcpy(lastbrbeg->str, zleline + brpcs, l);
 	lastbrbeg->str[l] = ',';
 	lastbrbeg->str[l + 1] = '\0';
     } else {
 	int l;
 
-	cs = minfo.pos + minfo.len + minfo.insc;
+	zlecs = minfo.pos + minfo.len + minfo.insc;
 	iremovesuffix(' ', 1);
-	l = cs;
-	cs = minfo.pos + minfo.len + minfo.insc - (*(minfo.cur))->qisl;
-	if (cs < l)
-	    foredel(l - cs);
-	else if (cs > ll)
-	    cs = ll;
+	l = zlecs;
+	zlecs = minfo.pos + minfo.len + minfo.insc - (*(minfo.cur))->qisl;
+	if (zlecs < l)
+	    foredel(l - zlecs);
+	else if (zlecs > zlell)
+	    zlecs = zlell;
 	inststrlen(" ", 1, 1);
 	minfo.insc = minfo.len = 0;
-	minfo.pos = cs;
+	minfo.pos = zlecs;
 	minfo.we = 1;
     }
     return 0;
diff --git a/Src/Zle/deltochar.c b/Src/Zle/deltochar.c
index 054e7fe23..545c34c9f 100644
--- a/Src/Zle/deltochar.c
+++ b/Src/Zle/deltochar.c
@@ -37,18 +37,18 @@ static Widget w_zaptochar;
 static int
 deltochar(UNUSED(char **args))
 {
-    int c = getkey(0), dest = cs, ok = 0, n = zmult;
+    int c = getkey(0), dest = zlecs, ok = 0, n = zmult;
     int zap = (bindk->widget == w_zaptochar);
 
     if (n > 0) {
-	while (n-- && dest != ll) {
-	    while (dest != ll && line[dest] != c)
+	while (n-- && dest != zlell) {
+	    while (dest != zlell && zleline[dest] != c)
 		dest++;
-	    if (dest != ll) {
+	    if (dest != zlell) {
 		if (!zap || n > 0)
 		    dest++;
 		if (!n) {
-		    forekill(dest - cs, 0);
+		    forekill(dest - zlecs, 0);
 		    ok++;
 		}
 	    }
@@ -58,11 +58,11 @@ deltochar(UNUSED(char **args))
 	if (dest)
 	    dest--;
 	while (n++ && dest != 0) {
-	    while (dest != 0 && line[dest] != c)
+	    while (dest != 0 && zleline[dest] != c)
 		dest--;
-	    if (line[dest] == c) {
+	    if (zleline[dest] == c) {
 		if (!n) {
-		    backkill(cs - dest - zap, 1);
+		    backkill(zlecs - dest - zap, 1);
 		    ok++;
 		}
 		if (dest)
diff --git a/Src/Zle/zle.h b/Src/Zle/zle.h
index e636073c8..be6e2c80b 100644
--- a/Src/Zle/zle.h
+++ b/Src/Zle/zle.h
@@ -27,11 +27,6 @@
  *
  */
 
-#undef trashzle
-#undef zleread
-#undef spaceinline
-#undef zrefresh
-
 typedef struct widget *Widget;
 typedef struct thingy *Thingy;
 
diff --git a/Src/Zle/zle_hist.c b/Src/Zle/zle_hist.c
index 97635b142..4733d5843 100644
--- a/Src/Zle/zle_hist.c
+++ b/Src/Zle/zle_hist.c
@@ -56,9 +56,9 @@ void
 remember_edits(void)
 {
     Histent ent = quietgethist(histline);
-    if (ent && metadiffer(ZLETEXT(ent), (char *) line, ll)) {
+    if (ent && metadiffer(ZLETEXT(ent), (char *) zleline, zlell)) {
 	zsfree(ent->zle_text);
-	ent->zle_text = metafy((char *) line, ll, META_DUP);
+	ent->zle_text = metafy((char *) zleline, zlell, META_DUP);
     }
 }
 
@@ -97,22 +97,22 @@ upline(void)
 	return n;
     }
     if (lastcol == -1)
-	lastcol = cs - findbol();
-    cs = findbol();
+	lastcol = zlecs - findbol();
+    zlecs = findbol();
     while (n) {
-	if (!cs)
+	if (!zlecs)
 	    break;
-	cs--;
-	cs = findbol();
+	zlecs--;
+	zlecs = findbol();
 	n--;
     }
     if (!n) {
 	int x = findeol();
 
-	if ((cs += lastcol) >= x) {
-	    cs = x;
-	    if (cs > findbol() && invicmdmode())
-		cs--;
+	if ((zlecs += lastcol) >= x) {
+	    zlecs = x;
+	    if (zlecs > findbol() && invicmdmode())
+		zlecs--;
 	}
     }
     return n;
@@ -122,12 +122,12 @@ upline(void)
 int
 uplineorhistory(char **args)
 {
-    int ocs = cs;
+    int ocs = zlecs;
     int n = upline();
     if (n) {
 	int m = zmult, ret;
 
-	cs = ocs;
+	zlecs = ocs;
 	if (virangeflag || !(zlereadflags & ZLRF_HISTORY))
 	    return 1;
 	zmult = n;
@@ -152,12 +152,12 @@ viuplineorhistory(char **args)
 int
 uplineorsearch(char **args)
 {
-    int ocs = cs;
+    int ocs = zlecs;
     int n = upline();
     if (n) {
 	int m = zmult, ret;
 
-	cs = ocs;
+	zlecs = ocs;
 	if (virangeflag || !(zlereadflags & ZLRF_HISTORY))
 	    return 1;
 	zmult = n;
@@ -181,22 +181,22 @@ downline(void)
 	return n;
     }
     if (lastcol == -1)
-	lastcol = cs - findbol();
+	lastcol = zlecs - findbol();
     while (n) {
 	int x = findeol();
 
-	if (x == ll)
+	if (x == zlell)
 	    break;
-	cs = x + 1;
+	zlecs = x + 1;
 	n--;
     }
     if (!n) {
 	int x = findeol();
 
-	if ((cs += lastcol) >= x) {
-	    cs = x;
-	    if (cs > findbol() && invicmdmode())
-		cs--;
+	if ((zlecs += lastcol) >= x) {
+	    zlecs = x;
+	    if (zlecs > findbol() && invicmdmode())
+		zlecs--;
 	}
     }
     return n;
@@ -206,12 +206,12 @@ downline(void)
 int
 downlineorhistory(char **args)
 {
-    int ocs = cs;
+    int ocs = zlecs;
     int n = downline();
     if (n) {
 	int m = zmult, ret;
 
-	cs = ocs;
+	zlecs = ocs;
 	if (virangeflag || !(zlereadflags & ZLRF_HISTORY))
 	    return 1;
 	zmult = n;
@@ -236,12 +236,12 @@ vidownlineorhistory(char **args)
 int
 downlineorsearch(char **args)
 {
-    int ocs = cs;
+    int ocs = zlecs;
     int n = downline();
     if (n) {
 	int m = zmult, ret;
 
-	cs = ocs;
+	zlecs = ocs;
 	if (virangeflag || !(zlereadflags & ZLRF_HISTORY))
 	    return 1;
 	zmult = n;
@@ -297,14 +297,14 @@ historysearchbackward(char **args)
     if ((str = *args))
 	hp = strlen(str);
     else {
-	if (histline == curhist || histline != srch_hl || cs != srch_cs ||
-	    mark != 0 || memcmp(srch_str, line, histpos) != 0) {
+	if (histline == curhist || histline != srch_hl || zlecs != srch_cs ||
+	    mark != 0 || memcmp(srch_str, zleline, histpos) != 0) {
 	    zfree(srch_str, histpos);
-	    for (histpos = 0; histpos < ll && !iblank(line[histpos]); histpos++) ;
-	    if (histpos < ll)
+	    for (histpos = 0; histpos < zlell && !iblank(zleline[histpos]); histpos++) ;
+	    if (histpos < zlell)
 		histpos++;
 	    srch_str = zalloc(histpos);
-	    memcpy(srch_str, line, histpos);
+	    memcpy(srch_str, zleline, histpos);
 	}
 	str = srch_str;
 	hp = histpos;
@@ -316,11 +316,11 @@ historysearchbackward(char **args)
 	    continue;
 	s = ZLETEXT(he);
 	if (metadiffer(s, str, hp) < 0 &&
-	    (*args || metadiffer(s, str, ll))) {
+	    (*args || metadiffer(s, str, zlell))) {
 	    if (--n <= 0) {
 		zle_setline(he);
 		srch_hl = histline;
-		srch_cs = cs;
+		srch_cs = zlecs;
 		return 0;
 	    }
 	}
@@ -346,14 +346,14 @@ historysearchforward(char **args)
     if ((str = *args))
 	hp = strlen(str);
     else {
-	if (histline == curhist || histline != srch_hl || cs != srch_cs ||
-	    mark != 0 || memcmp(srch_str, line, histpos) != 0) {
+	if (histline == curhist || histline != srch_hl || zlecs != srch_cs ||
+	    mark != 0 || memcmp(srch_str, zleline, histpos) != 0) {
 	    zfree(srch_str, histpos);
-	    for (histpos = 0; histpos < ll && !iblank(line[histpos]); histpos++) ;
-	    if (histpos < ll)
+	    for (histpos = 0; histpos < zlell && !iblank(zleline[histpos]); histpos++) ;
+	    if (histpos < zlell)
 		histpos++;
 	    srch_str = zalloc(histpos);
-	    memcpy(srch_str, line, histpos);
+	    memcpy(srch_str, zleline, histpos);
 	}
 	str = srch_str;
 	hp = histpos;
@@ -365,11 +365,11 @@ historysearchforward(char **args)
 	    continue;
 	s = ZLETEXT(he);
 	if (metadiffer(s, str, hp) < (he->histnum == curhist) &&
-	    (*args || metadiffer(s, str, ll))) {
+	    (*args || metadiffer(s, str, zlell))) {
 	    if (--n <= 0) {
 		zle_setline(he);
 		srch_hl = histline;
-		srch_cs = cs;
+		srch_cs = zlecs;
 		return 0;
 	    }
 	}
@@ -382,7 +382,7 @@ int
 beginningofbufferorhistory(char **args)
 {
     if (findbol())
-	cs = 0;
+	zlecs = 0;
     else
 	return beginningofhistory(args);
     return 0;
@@ -401,8 +401,8 @@ beginningofhistory(UNUSED(char **args))
 int
 endofbufferorhistory(char **args)
 {
-    if (findeol() != ll)
-	cs = ll;
+    if (findeol() != zlell)
+	zlecs = zlell;
     else
 	return endofhistory(args);
     return 0;
@@ -455,9 +455,9 @@ insertlastword(char **args)
     }
 
     if (lastinsert && lastlen &&
-	lastpos <= cs &&
-	lastlen == cs - lastpos &&
-	memcmp(lastinsert, (char *)&line[lastpos], lastlen) == 0)
+	lastpos <= zlecs &&
+	lastlen == zlecs - lastpos &&
+	memcmp(lastinsert, (char *)&zleline[lastpos], lastlen) == 0)
 	deleteword = 1;
     else
 	lasthist = curhist;
@@ -471,9 +471,9 @@ insertlastword(char **args)
 	 * confusion.
 	 */
 	if (deleteword) {
-	    int pos = cs;
-	    cs = lastpos;
-	    foredel(pos - cs);
+	    int pos = zlecs;
+	    zlecs = lastpos;
+	    foredel(pos - zlecs);
 	    /*
 	     * Mark that this has been deleted.
 	     * For consistency with history lines, we really ought to
@@ -527,9 +527,9 @@ insertlastword(char **args)
      * successfully found a new one to insert.
      */
     if (deleteword > 0) {
-	int pos = cs;
-	cs = lastpos;
-	foredel(pos - cs);
+	int pos = zlecs;
+	zlecs = lastpos;
+	foredel(pos - zlecs);
     }
     if (lastinsert) {
 	zfree(lastinsert, lastlen);
@@ -548,7 +548,7 @@ insertlastword(char **args)
     save = *t;
     *t = '\0';			/* ignore trailing whitespace */
     lasthist = evhist;
-    lastpos = cs;
+    lastpos = zlecs;
     lastlen = t - s;
     lastinsert = zalloc(t - s);
     memcpy(lastinsert, s, lastlen);
@@ -593,7 +593,7 @@ zle_goto_hist(int ev, int n, int skipdups)
 	return 1;
     if (skipdups && n) {
 	n = n < 0? -1 : 1;
-	while (he && !metadiffer(ZLETEXT(he), (char *) line, ll))
+	while (he && !metadiffer(ZLETEXT(he), (char *) zleline, zlell))
 	    he = movehistent(he, n, hist_skip_flags);
     }
     if (!he)
@@ -610,12 +610,12 @@ pushline(UNUSED(char **args))
 
     if (n < 0)
 	return 1;
-    zpushnode(bufstack, metafy((char *) line, ll, META_DUP));
+    zpushnode(bufstack, metafy((char *) zleline, zlell, META_DUP));
     while (--n)
 	zpushnode(bufstack, ztrdup(""));
-    stackcs = cs;
-    *line = '\0';
-    ll = cs = 0;
+    stackcs = zlecs;
+    *zleline = '\0';
+    zlell = zlecs = 0;
     clearlist = 1;
     return 0;
 }
@@ -632,12 +632,12 @@ pushlineoredit(char **args)
 	return 1;
     if (hline && *hline) {
 	ics = ztrlen(hline);
-	sizeline(ics + ll + 1);
-	for (s = line + ll; --s >= line; *(s + ics) = *s);
-	for (s = line; *hline; hline++)
+	sizeline(ics + zlell + 1);
+	for (s = zleline + zlell; --s >= zleline; *(s + ics) = *s);
+	for (s = zleline; *hline; hline++)
 	    *s++ = *hline == Meta ? *++hline ^ 32 : *hline;
-	ll += ics;
-	cs += ics;
+	zlell += ics;
+	zlecs += ics;
     }
     ret = pushline(args);
     if (!isfirstln)
@@ -674,8 +674,8 @@ zgetline(UNUSED(char **args))
 
 	unmetafy(s, &cc);
 	spaceinline(cc);
-	memcpy((char *)line + cs, s, cc);
-	cs += cc;
+	memcpy((char *)zleline + zlecs, s, cc);
+	zlecs += cc;
 	free(s);
 	clearlist = 1;
     }
@@ -789,12 +789,12 @@ doisearch(char **args, int dir)
     okeymap = ztrdup(curkeymapname);
     s = ZLETEXT(he);
     selectkeymap("main", 1);
-    pos = metalen(s, cs);
+    pos = metalen(s, zlecs);
     for (;;) {
 	/* Remember the current values in case search fails (doesn't push). */
-	set_isrch_spot(top_spot, hl, pos, cs, sbptr, dir, nomatch);
+	set_isrch_spot(top_spot, hl, pos, zlecs, sbptr, dir, nomatch);
 	if (sbptr == 1 && sbuf[0] == '^') {
-	    cs = 0;
+	    zlecs = 0;
     	    nomatch = 0;
 	    statusline = ibuf + NORM_PROMPT_POS;
 	} else if (sbptr > 0) {
@@ -823,7 +823,7 @@ doisearch(char **args, int dir)
 		    (t = hstrnstr(s, pos, sbuf, sbptr, dir, sens)))) {
 		    zle_setline(he);
 		    pos = t - s;
-		    cs = ztrsub(t, s) + (dir == 1? sbptr - (sbuf[0]=='^') : 0);
+		    zlecs = ztrsub(t, s) + (dir == 1? sbptr - (sbuf[0]=='^') : 0);
 	    	    nomatch = 0;
 		    statusline = ibuf + NORM_PROMPT_POS;
 		    break;
@@ -833,7 +833,7 @@ doisearch(char **args, int dir)
 		    if (sbptr == (int)isrch_spots[top_spot-1].len
 		     && (isrch_spots[top_spot-1].flags & ISS_FAILING))
 			top_spot--;
-		    get_isrch_spot(top_spot, &hl, &pos, &cs, &sbptr,
+		    get_isrch_spot(top_spot, &hl, &pos, &zlecs, &sbptr,
 				   &dir, &nomatch);
 		    if (!nomatch) {
 			feep = 1;
@@ -866,7 +866,7 @@ doisearch(char **args, int dir)
 	    he = quietgethist(hl);
 	    zle_setline(he);
 	    s = ZLETEXT(he);
-	    cs = i;
+	    zlecs = i;
 	    break;
 	}
 	if(cmd == Th(z_clearscreen)) {
@@ -882,7 +882,7 @@ doisearch(char **args, int dir)
 	} else if(cmd == Th(z_vibackwarddeletechar) ||
 	    	cmd == Th(z_backwarddeletechar)) {
 	    if (top_spot)
-		get_isrch_spot(--top_spot, &hl, &pos, &cs, &sbptr,
+		get_isrch_spot(--top_spot, &hl, &pos, &zlecs, &sbptr,
 			       &dir, &nomatch);
 	    else
 		feep = 1;
@@ -893,9 +893,9 @@ doisearch(char **args, int dir)
 	    he = quietgethist(hl);
 	    s = ZLETEXT(he);
 	    if (nomatch || !sbptr || (sbptr == 1 && sbuf[0] == '^')) {
-		int i = cs;
+		int i = zlecs;
 		zle_setline(he);
-		cs = i;
+		zlecs = i;
 	    }
 	    memcpy(ibuf + NORM_PROMPT_POS, (dir == 1) ? "fwd" : "bck", 3);
 	    continue;
@@ -912,26 +912,26 @@ doisearch(char **args, int dir)
 	    acceptline(zlenoargs);
 	    break;
 	} else if(cmd == Th(z_historyincrementalsearchbackward)) {
-	    set_isrch_spot(top_spot++, hl, pos, cs, sbptr, dir, nomatch);
+	    set_isrch_spot(top_spot++, hl, pos, zlecs, sbptr, dir, nomatch);
 	    if (dir != -1)
 		dir = -1;
 	    else
 		skip_pos = 1;
 	    goto rpt;
 	} else if(cmd == Th(z_historyincrementalsearchforward)) {
-	    set_isrch_spot(top_spot++, hl, pos, cs, sbptr, dir, nomatch);
+	    set_isrch_spot(top_spot++, hl, pos, zlecs, sbptr, dir, nomatch);
 	    if (dir != 1)
 		dir = 1;
 	    else
 		skip_pos = 1;
 	    goto rpt;
 	} else if(cmd == Th(z_virevrepeatsearch)) {
-	    set_isrch_spot(top_spot++, hl, pos, cs, sbptr, dir, nomatch);
+	    set_isrch_spot(top_spot++, hl, pos, zlecs, sbptr, dir, nomatch);
 	    dir = -odir;
 	    skip_pos = 1;
 	    goto rpt;
 	} else if(cmd == Th(z_virepeatsearch)) {
-	    set_isrch_spot(top_spot++, hl, pos, cs, sbptr, dir, nomatch);
+	    set_isrch_spot(top_spot++, hl, pos, zlecs, sbptr, dir, nomatch);
 	    dir = odir;
 	    skip_pos = 1;
 	rpt:
@@ -973,7 +973,7 @@ doisearch(char **args, int dir)
 		feep = 1;
 		continue;
 	    }
-	    set_isrch_spot(top_spot++, hl, pos, cs, sbptr, dir, nomatch);
+	    set_isrch_spot(top_spot++, hl, pos, zlecs, sbptr, dir, nomatch);
 	    if (sbptr == sibuf - FIRST_SEARCH_CHAR - 2) {
 		ibuf = hrealloc(ibuf, sibuf, sibuf * 2);
 		sbuf = ibuf + FIRST_SEARCH_CHAR;
@@ -1006,7 +1006,7 @@ infernexthist(Histent he, UNUSED(char **args))
 {
     for (he = movehistent(he, -2, HIST_FOREIGN);
 	 he; he = movehistent(he, -1, HIST_FOREIGN)) {
-	if (!metadiffer(he->text, (char *) line, ll))
+	if (!metadiffer(he->text, (char *) zleline, zlell))
 	    return movehistent(he, 1, HIST_FOREIGN);
     }
     return NULL;
@@ -1046,8 +1046,8 @@ vifetchhistory(UNUSED(char **args))
 	return 1;
     if (histline == curhist) {
 	if (!(zmod.flags & MOD_MULT)) {
-	    cs = ll;
-	    cs = findbol();
+	    zlecs = zlell;
+	    zlecs = findbol();
 	    return 0;
 	}
     }
@@ -1222,7 +1222,7 @@ virepeatsearch(UNUSED(char **args))
 	if (isset(HISTFINDNODUPS) && he->flags & HIST_DUP)
 	    continue;
 	s = ZLETEXT(he);
-	if (metadiffer(s, (char *) line, ll)
+	if (metadiffer(s, (char *) zleline, zlell)
 	 && (*visrchstr == '^'? strncmp(s, visrchstr + 1, t0 - 1) == 0
 			      : hstrnstr(s, 0, visrchstr, t0, 1, 1) != 0)) {
 	    if (--n <= 0) {
@@ -1246,7 +1246,7 @@ virevrepeatsearch(char **args)
 }
 
 /* Extra function added by A.R. Iano-Fletcher.	*/
-/*The extern variable "cs" is the position of the cursor. */
+/*The extern variable "zlecs" is the position of the cursor. */
 /* history-beginning-search-backward */
 
 /**/
@@ -1254,7 +1254,7 @@ int
 historybeginningsearchbackward(char **args)
 {
     Histent he;
-    int cpos = cs;		/* save cursor position */
+    int cpos = zlecs;		/* save cursor position */
     int n = zmult;
     char *s;
 
@@ -1271,11 +1271,11 @@ historybeginningsearchbackward(char **args)
 	if (isset(HISTFINDNODUPS) && he->flags & HIST_DUP)
 	    continue;
 	s = ZLETEXT(he);
-	if (metadiffer(s, (char *)line, cs) < 0 &&
-	    metadiffer(s, (char *)line, ll)) {
+	if (metadiffer(s, (char *)zleline, zlecs) < 0 &&
+	    metadiffer(s, (char *)zleline, zlell)) {
 	    if (--n <= 0) {
 		zle_setline(he);
-		cs = cpos;
+		zlecs = cpos;
 		return 0;
 	    }
 	}
@@ -1291,7 +1291,7 @@ int
 historybeginningsearchforward(char **args)
 {
     Histent he;
-    int cpos = cs;		/* save cursor position */
+    int cpos = zlecs;		/* save cursor position */
     int n = zmult;
     char *s;
 
@@ -1308,11 +1308,11 @@ historybeginningsearchforward(char **args)
 	if (isset(HISTFINDNODUPS) && he->flags & HIST_DUP)
 	    continue;
 	s = ZLETEXT(he);
-	if (metadiffer(s, (char *)line, cs) < (he->histnum == curhist) &&
-	    metadiffer(s, (char *)line, ll)) {
+	if (metadiffer(s, (char *)zleline, zlecs) < (he->histnum == curhist) &&
+	    metadiffer(s, (char *)zleline, zlell)) {
 	    if (--n <= 0) {
 		zle_setline(he);
-		cs = cpos;
+		zlecs = cpos;
 		return 0;
 	    }
 	}
diff --git a/Src/Zle/zle_main.c b/Src/Zle/zle_main.c
index 549ee21af..028718761 100644
--- a/Src/Zle/zle_main.c
+++ b/Src/Zle/zle_main.c
@@ -37,6 +37,11 @@
 # undef HAVE_POLL
 #endif
 
+/* The input line assembled so far */
+
+/**/
+mod_export ZLE_STRING_T zleline;
+
 /* != 0 if in a shell function called from completion, such that read -[cl]  *
  * will work (i.e., the line is metafied, and the above word arrays are OK). */
 
@@ -694,7 +699,7 @@ zlecore(void)
 	selectlocalmap(NULL);
 	bindk = getkeycmd();
 	if (bindk) {
-	    if (!ll && isfirstln && !(zlereadflags & ZLRF_IGNOREEOF) &&
+	    if (!zlell && isfirstln && !(zlereadflags & ZLRF_IGNOREEOF) &&
 		lastchar == eofchar) {
 		/*
 		 * Slight hack: this relies on getkeycmd returning
@@ -713,9 +718,9 @@ zlecore(void)
 	    }
 	    handleprefixes();
 	    /* for vi mode, make sure the cursor isn't somewhere illegal */
-	    if (invicmdmode() && cs > findbol() &&
-		(cs == ll || line[cs] == '\n'))
-		cs--;
+	    if (invicmdmode() && zlecs > findbol() &&
+		(zlecs == zlell || zleline[zlecs] == '\n'))
+		zlecs--;
 	    if (undoing)
 		handleundo();
 	} else {
@@ -814,9 +819,9 @@ zleread(char **lp, char **rp, int flags, int context)
     zlecontext = context;
     histline = curhist;
     undoing = 1;
-    line = (unsigned char *)zalloc((linesz = 256) + 2);
-    *line = '\0';
-    virangeflag = lastcmd = done = cs = ll = mark = 0;
+    zleline = (unsigned char *)zalloc((linesz = 256) + 2);
+    *zleline = '\0';
+    virangeflag = lastcmd = done = zlecs = zlell = mark = 0;
     vichgflag = 0;
     viinsbegin = 0;
     statusline = NULL;
@@ -827,10 +832,10 @@ zleread(char **lp, char **rp, int flags, int context)
 	setline((char *)s);
 	zsfree((char *)s);
 	if (stackcs != -1) {
-	    cs = stackcs;
+	    zlecs = stackcs;
 	    stackcs = -1;
-	    if (cs > ll)
-		cs = ll;
+	    if (zlecs > zlell)
+		zlecs = zlell;
 	}
 	if (stackhist != -1) {
 	    histline = stackhist;
@@ -872,15 +877,15 @@ zleread(char **lp, char **rp, int flags, int context)
 
     freeundo();
     if (eofsent) {
-	free(line);
-	line = NULL;
+	free(zleline);
+	zleline = NULL;
     } else {
-	line[ll++] = '\n';
-	line = (unsigned char *) metafy((char *) line, ll, META_REALLOC);
+	zleline[zlell++] = '\n';
+	zleline = (unsigned char *) metafy((char *) zleline, zlell, META_REALLOC);
     }
     forget_edits();
     errno = old_errno;
-    return line;
+    return zleline;
 }
 
 /* execute a widget */
@@ -911,7 +916,7 @@ execzlefunc(Thingy func, char **args)
 	 * zlenoargs placeholder.
 	 */
 	if (keybuf[0] == eofchar && !keybuf[1] && args == zlenoargs &&
-	    !ll && isfirstln && (zlereadflags & ZLRF_IGNOREEOF)) {
+	    !zlell && isfirstln && (zlereadflags & ZLRF_IGNOREEOF)) {
 	    showmsg((!islogin) ? "zsh: use 'exit' to exit." :
 		    "zsh: use 'logout' to logout.");
 	    eofsent = 1;
@@ -1433,8 +1438,9 @@ setup_(UNUSED(Module m))
 {
     /* Set up editor entry points */
     trashzleptr = trashzle;
-    refreshptr = zrefresh;
-    spaceinlineptr = spaceinline;
+    zrefreshptr = zrefresh;
+    zleaddtolineptr = zleaddtoline;
+    zlegetlineptr = zlegetline;
     zlereadptr = zleread;
     zlesetkeymapptr = zlesetkeymap;
 
@@ -1517,8 +1523,9 @@ finish_(UNUSED(Module m))
 
     /* editor entry points */
     trashzleptr = noop_function;
-    refreshptr = noop_function;
-    spaceinlineptr = noop_function_int;
+    zrefreshptr = noop_function;
+    zleaddtolineptr = noop_function_int;
+    zlegetlineptr = NULL;
     zlereadptr = fallback_zleread;
     zlesetkeymapptr= noop_function_int;
 
diff --git a/Src/Zle/zle_misc.c b/Src/Zle/zle_misc.c
index 935de58af..5667ba853 100644
--- a/Src/Zle/zle_misc.c
+++ b/Src/Zle/zle_misc.c
@@ -47,13 +47,13 @@ doinsert(char *str)
 
     if(insmode)
 	spaceinline(m * len);
-    else if(cs + m * len > ll)
-	spaceinline(cs + m * len - ll);
+    else if(zlecs + m * len > zlell)
+	spaceinline(zlecs + m * len - zlell);
     while(m--)
 	for(s = str; *s; s++)
-	    line[cs++] = *s == Meta ? *++s ^ 32 : *s;
+	    zleline[zlecs++] = *s == Meta ? *++s ^ 32 : *s;
     if(neg)
-	cs += zmult * len;
+	zlecs += zmult * len;
 }
 
 /**/
@@ -93,8 +93,8 @@ deletechar(char **args)
 	zmult = -zmult;
 	return ret;
     }
-    if (cs + zmult <= ll) {
-	cs += zmult;
+    if (zlecs + zmult <= zlell) {
+	zlecs += zmult;
 	backdel(zmult);
 	return 0;
     }
@@ -112,7 +112,7 @@ backwarddeletechar(char **args)
 	zmult = -zmult;
 	return ret;
     }
-    backdel(zmult > cs ? cs : zmult);
+    backdel(zmult > zlecs ? zlecs : zmult);
     return 0;
 }
 
@@ -125,12 +125,12 @@ killwholeline(UNUSED(char **args))
     if (n < 0)
 	return 1;
     while (n--) {
-	if ((fg = (cs && cs == ll)))
-	    cs--;
-	while (cs && line[cs - 1] != '\n')
-	    cs--;
-	for (i = cs; i != ll && line[i] != '\n'; i++);
-	forekill(i - cs + (i != ll), fg);
+	if ((fg = (zlecs && zlecs == zlell)))
+	    zlecs--;
+	while (zlecs && zleline[zlecs - 1] != '\n')
+	    zlecs--;
+	for (i = zlecs; i != zlell && zleline[i] != '\n'; i++);
+	forekill(i - zlecs + (i != zlell), fg);
     }
     clearlist = 1;
     return 0;
@@ -140,8 +140,8 @@ killwholeline(UNUSED(char **args))
 int
 killbuffer(UNUSED(char **args))
 {
-    cs = 0;
-    forekill(ll, 0);
+    zlecs = 0;
+    forekill(zlell, 0);
     clearlist = 1;
     return 0;
 }
@@ -160,11 +160,11 @@ backwardkillline(char **args)
 	return ret;
     }
     while (n--) {
-	if (cs && line[cs - 1] == '\n')
-	    cs--, i++;
+	if (zlecs && zleline[zlecs - 1] == '\n')
+	    zlecs--, i++;
 	else
-	    while (cs && line[cs - 1] != '\n')
-		cs--, i++;
+	    while (zlecs && zleline[zlecs - 1] != '\n')
+		zlecs--, i++;
     }
     forekill(i, 1);
     clearlist = 1;
@@ -177,17 +177,17 @@ gosmacstransposechars(UNUSED(char **args))
 {
     int cc;
 
-    if (cs < 2 || line[cs - 1] == '\n' || line[cs - 2] == '\n') {
-	if (cs == ll || line[cs] == '\n' ||
-	    ((cs + 1 == ll || line[cs + 1] == '\n') &&
-	     (!cs || line[cs - 1] == '\n'))) {
+    if (zlecs < 2 || zleline[zlecs - 1] == '\n' || zleline[zlecs - 2] == '\n') {
+	if (zlecs == zlell || zleline[zlecs] == '\n' ||
+	    ((zlecs + 1 == zlell || zleline[zlecs + 1] == '\n') &&
+	     (!zlecs || zleline[zlecs - 1] == '\n'))) {
 	    return 1;
 	}
-	cs += (cs == 0 || line[cs - 1] == '\n') ? 2 : 1;
+	zlecs += (zlecs == 0 || zleline[zlecs - 1] == '\n') ? 2 : 1;
     }
-    cc = line[cs - 2];
-    line[cs - 2] = line[cs - 1];
-    line[cs - 1] = cc;
+    cc = zleline[zlecs - 2];
+    zleline[zlecs - 2] = zleline[zlecs - 1];
+    zleline[zlecs - 1] = cc;
     return 0;
 }
 
@@ -202,30 +202,30 @@ transposechars(UNUSED(char **args))
     if (neg)
 	n = -n;
     while (n--) {
-	if (!(ct = cs) || line[cs - 1] == '\n') {
-	    if (ll == cs || line[cs] == '\n')
+	if (!(ct = zlecs) || zleline[zlecs - 1] == '\n') {
+	    if (zlell == zlecs || zleline[zlecs] == '\n')
 		return 1;
 	    if (!neg)
-		cs++;
+		zlecs++;
 	    ct++;
 	}
 	if (neg) {
-	    if (cs && line[cs - 1] != '\n') {
-		cs--;
-		if (ct > 1 && line[ct - 2] != '\n')
+	    if (zlecs && zleline[zlecs - 1] != '\n') {
+		zlecs--;
+		if (ct > 1 && zleline[ct - 2] != '\n')
 		    ct--;
 	    }
 	} else {
-	    if (cs != ll && line[cs] != '\n')
-		cs++;
+	    if (zlecs != zlell && zleline[zlecs] != '\n')
+		zlecs++;
 	}
-	if (ct == ll || line[ct] == '\n')
+	if (ct == zlell || zleline[ct] == '\n')
 	    ct--;
-	if (ct < 1 || line[ct - 1] == '\n')
+	if (ct < 1 || zleline[ct - 1] == '\n')
 	    return 1;
-	cc = line[ct - 1];
-	line[ct - 1] = line[ct];
-	line[ct] = cc;
+	cc = zleline[ct - 1];
+	zleline[ct - 1] = zleline[ct];
+	zleline[ct] = cc;
     }
     return 0;
 }
@@ -234,28 +234,28 @@ transposechars(UNUSED(char **args))
 int
 poundinsert(UNUSED(char **args))
 {
-    cs = 0;
+    zlecs = 0;
     vifirstnonblank(zlenoargs);
-    if (line[cs] != '#') {
+    if (zleline[zlecs] != '#') {
 	spaceinline(1);
-	line[cs] = '#';
-	cs = findeol();
-	while(cs != ll) {
-	    cs++;
+	zleline[zlecs] = '#';
+	zlecs = findeol();
+	while(zlecs != zlell) {
+	    zlecs++;
 	    vifirstnonblank(zlenoargs);
 	    spaceinline(1);
-	    line[cs] = '#';
-	    cs = findeol();
+	    zleline[zlecs] = '#';
+	    zlecs = findeol();
 	}
     } else {
 	foredel(1);
-	cs = findeol();
-	while(cs != ll) {
-	    cs++;
+	zlecs = findeol();
+	while(zlecs != zlell) {
+	    zlecs++;
 	    vifirstnonblank(zlenoargs);
-	    if(line[cs] == '#')
+	    if(zleline[zlecs] == '#')
 		foredel(1);
-	    cs = findeol();
+	    zlecs = findeol();
 	}
     }
     done = 1;
@@ -274,8 +274,8 @@ acceptline(UNUSED(char **args))
 int
 acceptandhold(UNUSED(char **args))
 {
-    zpushnode(bufstack, metafy((char *)line, ll, META_DUP));
-    stackcs = cs;
+    zpushnode(bufstack, metafy((char *)zleline, zlell, META_DUP));
+    stackcs = zlecs;
     done = 1;
     return 0;
 }
@@ -294,11 +294,11 @@ killline(char **args)
 	return ret;
     }
     while (n--) {
-	if (line[cs] == '\n')
-	    cs++, i++;
+	if (zleline[zlecs] == '\n')
+	    zlecs++, i++;
 	else
-	    while (cs != ll && line[cs] != '\n')
-		cs++, i++;
+	    while (zlecs != zlell && zleline[zlecs] != '\n')
+		zlecs++, i++;
     }
     backkill(i, 0);
     clearlist = 1;
@@ -309,12 +309,12 @@ killline(char **args)
 int
 killregion(UNUSED(char **args))
 {
-    if (mark > ll)
-	mark = ll;
-    if (mark > cs)
-	forekill(mark - cs, 0);
+    if (mark > zlell)
+	mark = zlell;
+    if (mark > zlecs)
+	forekill(mark - zlecs, 0);
     else
-	backkill(cs - mark, 1);
+	backkill(zlecs - mark, 1);
     return 0;
 }
 
@@ -322,12 +322,12 @@ killregion(UNUSED(char **args))
 int
 copyregionaskill(UNUSED(char **args))
 {
-    if (mark > ll)
-	mark = ll;
-    if (mark > cs)
-	cut(cs, mark - cs, 0);
+    if (mark > zlell)
+	mark = zlell;
+    if (mark > zlecs)
+	cut(zlecs, mark - zlecs, 0);
     else
-	cut(mark, cs - mark, 1);
+	cut(mark, zlecs - mark, 1);
     return 0;
 }
 
@@ -353,14 +353,14 @@ yank(UNUSED(char **args))
 	kctbuf = &cutbuf;
     if (!kctbuf->buf)
 	return 1;
-    mark = cs;
-    yankb = cs;
+    mark = zlecs;
+    yankb = zlecs;
     while (n--) {
 	kct = -1;
 	spaceinline(kctbuf->len);
-	memcpy((char *)line + cs, kctbuf->buf, kctbuf->len);
-	cs += kctbuf->len;
-	yanke = cs;
+	memcpy((char *)zleline + zlecs, kctbuf->buf, kctbuf->len);
+	zlecs += kctbuf->len;
+	yanke = zlecs;
     }
     return 0;
 }
@@ -414,13 +414,13 @@ yankpop(UNUSED(char **args))
 	 */
     } while (!buf->buf || !*buf->buf);
 
-    cs = yankb;
+    zlecs = yankb;
     foredel(yanke - yankb);
     cc = buf->len;
     spaceinline(cc);
-    memcpy((char *)line + cs, buf->buf, cc);
-    cs += cc;
-    yanke = cs;
+    memcpy((char *)zleline + zlecs, buf->buf, cc);
+    zlecs += cc;
+    yanke = zlecs;
     return 0;
 }
 
@@ -439,9 +439,9 @@ whatcursorposition(UNUSED(char **args))
     char msg[100];
     char *s = msg;
     int bol = findbol();
-    int c = STOUC(line[cs]);
+    int c = STOUC(zleline[zlecs]);
 
-    if (cs == ll)
+    if (zlecs == zlell)
 	strucpy(&s, "EOF");
     else {
 	strucpy(&s, "Char: ");
@@ -465,8 +465,8 @@ whatcursorposition(UNUSED(char **args))
 	sprintf(s, " (0%o, %d, 0x%x)", c, c, c);
 	s += strlen(s);
     }
-    sprintf(s, "  point %d of %d(%d%%)  column %d", cs+1, ll+1,
-	    ll ? 100 * cs / ll : 0, cs - bol);
+    sprintf(s, "  point %d of %d(%d%%)  column %d", zlecs+1, zlell+1,
+	    zlell ? 100 * zlecs / zlell : 0, zlecs - bol);
     showmsg(msg);
     return 0;
 }
@@ -572,18 +572,18 @@ copyprevword(UNUSED(char **args))
 {
     int len, t0;
 
-    for (t0 = cs - 1; t0 >= 0; t0--)
-	if (iword(line[t0]))
+    for (t0 = zlecs - 1; t0 >= 0; t0--)
+	if (iword(zleline[t0]))
 	    break;
     for (; t0 >= 0; t0--)
-	if (!iword(line[t0]))
+	if (!iword(zleline[t0]))
 	    break;
     if (t0)
 	t0++;
-    len = cs - t0;
+    len = zlecs - t0;
     spaceinline(len);
-    memcpy((char *)&line[cs], (char *)&line[t0], len);
-    cs += len;
+    memcpy((char *)&zleline[zlecs], (char *)&zleline[t0], len);
+    zlecs += len;
     return 0;
 }
 
@@ -607,8 +607,8 @@ copyprevshellword(UNUSED(char **args))
 	int len = strlen(p);
 
 	spaceinline(len);
-	memcpy(line + cs, p, len);
-	cs += len;
+	memcpy(zleline + zlecs, p, len);
+	zlecs += len;
     }
     return 0;
 }
@@ -628,21 +628,21 @@ quoteregion(UNUSED(char **args))
     char *str;
     size_t len;
 
-    if (mark > ll)
-	mark = ll;
-    if (mark < cs) {
+    if (mark > zlell)
+	mark = zlell;
+    if (mark < zlecs) {
 	int tmp = mark;
-	mark = cs;
-	cs = tmp;
+	mark = zlecs;
+	zlecs = tmp;
     }
-    str = (char *)hcalloc(len = mark - cs);
-    memcpy(str, (char *)&line[cs], len);
+    str = (char *)hcalloc(len = mark - zlecs);
+    memcpy(str, (char *)&zleline[zlecs], len);
     foredel(len);
     str = makequote(str, &len);
     spaceinline(len);
-    memcpy((char *)&line[cs], str, len);
-    mark = cs;
-    cs += len;
+    memcpy((char *)&zleline[zlecs], str, len);
+    mark = zlecs;
+    zlecs += len;
     return 0;
 }
 
@@ -651,12 +651,12 @@ int
 quoteline(UNUSED(char **args))
 {
     char *str;
-    size_t len = ll;
+    size_t len = zlell;
 
-    str = makequote((char *)line, &len);
+    str = makequote((char *)zleline, &len);
     sizeline(len);
-    memcpy(line, str, len);
-    cs = ll = len;
+    memcpy(zleline, str, len);
+    zlecs = zlell = len;
     return 0;
 }
 
diff --git a/Src/Zle/zle_move.c b/Src/Zle/zle_move.c
index 23db9dc4e..48e9dd64f 100644
--- a/Src/Zle/zle_move.c
+++ b/Src/Zle/zle_move.c
@@ -46,13 +46,13 @@ beginningofline(char **args)
 	return ret;
     }
     while (n--) {
-	if (cs == 0)
+	if (zlecs == 0)
 	    return 0;
-	if (line[cs - 1] == '\n')
-	    if (!--cs)
+	if (zleline[zlecs - 1] == '\n')
+	    if (!--zlecs)
 		return 0;
-	while (cs && line[cs - 1] != '\n')
-	    cs--;
+	while (zlecs && zleline[zlecs - 1] != '\n')
+	    zlecs--;
     }
     return 0;
 }
@@ -71,15 +71,15 @@ endofline(char **args)
 	return ret;
     }
     while (n--) {
-	if (cs >= ll) {
-	    cs = ll;
+	if (zlecs >= zlell) {
+	    zlecs = zlell;
 	    return 0;
 	}
-	if (line[cs] == '\n')
-	    if (++cs == ll)
+	if (zleline[zlecs] == '\n')
+	    if (++zlecs == zlell)
 		return 0;
-	while (cs != ll && line[cs] != '\n')
-	    cs++;
+	while (zlecs != zlell && zleline[zlecs] != '\n')
+	    zlecs++;
     }
     return 0;
 }
@@ -98,13 +98,13 @@ beginningoflinehist(char **args)
 	return ret;
     }
     while (n) {
-	if (cs == 0)
+	if (zlecs == 0)
 	    break;
-	if (line[cs - 1] == '\n')
-	    if (!--cs)
+	if (zleline[zlecs - 1] == '\n')
+	    if (!--zlecs)
 		break;
-	while (cs && line[cs - 1] != '\n')
-	    cs--;
+	while (zlecs && zleline[zlecs - 1] != '\n')
+	    zlecs--;
 	n--;
     }
     if (n) {
@@ -113,7 +113,7 @@ beginningoflinehist(char **args)
 	zmult = n;
 	ret = uphistory(args);
 	zmult = m;
-	cs = 0;
+	zlecs = 0;
 	return ret;
     }
     return 0;
@@ -133,15 +133,15 @@ endoflinehist(char **args)
 	return ret;
     }
     while (n) {
-	if (cs >= ll) {
-	    cs = ll;
+	if (zlecs >= zlell) {
+	    zlecs = zlell;
 	    break;
 	}
-	if (line[cs] == '\n')
-	    if (++cs == ll)
+	if (zleline[zlecs] == '\n')
+	    if (++zlecs == zlell)
 		break;
-	while (cs != ll && line[cs] != '\n')
-	    cs++;
+	while (zlecs != zlell && zleline[zlecs] != '\n')
+	    zlecs++;
 	n--;
     }
     if (n) {
@@ -159,11 +159,11 @@ endoflinehist(char **args)
 int
 forwardchar(UNUSED(char **args))
 {
-    cs += zmult;
-    if (cs > ll)
-	cs = ll;
-    if (cs < 0)
-	cs = 0;
+    zlecs += zmult;
+    if (zlecs > zlell)
+	zlecs = zlell;
+    if (zlecs < 0)
+	zlecs = 0;
     return 0;
 }
 
@@ -171,11 +171,11 @@ forwardchar(UNUSED(char **args))
 int
 backwardchar(UNUSED(char **args))
 {
-    cs -= zmult;
-    if (cs > ll)
-	cs = ll;
-    if (cs < 0)
-	cs = 0;
+    zlecs -= zmult;
+    if (zlecs > zlell)
+	zlecs = zlell;
+    if (zlecs < 0)
+	zlecs = 0;
     return 0;
 }
 
@@ -183,7 +183,7 @@ backwardchar(UNUSED(char **args))
 int
 setmarkcommand(UNUSED(char **args))
 {
-    mark = cs;
+    mark = zlecs;
     return 0;
 }
 
@@ -194,10 +194,10 @@ exchangepointandmark(UNUSED(char **args))
     int x;
 
     x = mark;
-    mark = cs;
-    cs = x;
-    if (cs > ll)
-	cs = ll;
+    mark = zlecs;
+    zlecs = x;
+    if (zlecs > zlell)
+	zlecs = zlell;
     return 0;
 }
 
@@ -209,13 +209,13 @@ vigotocolumn(UNUSED(char **args))
 
     findline(&x, &y);
     if (zmult >= 0)
-	cs = x + zmult - (zmult > 0);
+	zlecs = x + zmult - (zmult > 0);
     else
-	cs = y + zmult;
-    if (cs > y)
-	cs = y;
-    if (cs < x)
-	cs = x;
+	zlecs = y + zmult;
+    if (zlecs > y)
+	zlecs = y;
+    if (zlecs < x)
+	zlecs = x;
     return 0;
 }
 
@@ -223,15 +223,15 @@ vigotocolumn(UNUSED(char **args))
 int
 vimatchbracket(UNUSED(char **args))
 {
-    int ocs = cs, dir, ct;
+    int ocs = zlecs, dir, ct;
     unsigned char oth, me;
 
   otog:
-    if (cs == ll || line[cs] == '\n') {
-	cs = ocs;
+    if (zlecs == zlell || zleline[zlecs] == '\n') {
+	zlecs = ocs;
 	return 1;
     }
-    switch (me = line[cs]) {
+    switch (me = zleline[zlecs]) {
     case '{':
 	dir = 1;
 	oth = '}';
@@ -260,22 +260,22 @@ vimatchbracket(UNUSED(char **args))
 	oth = '[';
 	break;
     default:
-	cs++;
+	zlecs++;
 	goto otog;
     }
     ct = 1;
-    while (cs >= 0 && cs < ll && ct) {
-	cs += dir;
-	if (line[cs] == oth)
+    while (zlecs >= 0 && zlecs < zlell && ct) {
+	zlecs += dir;
+	if (zleline[zlecs] == oth)
 	    ct--;
-	else if (line[cs] == me)
+	else if (zleline[zlecs] == me)
 	    ct++;
     }
-    if (cs < 0 || cs >= ll) {
-	cs = ocs;
+    if (zlecs < 0 || zlecs >= zlell) {
+	zlecs = ocs;
 	return 1;
     } else if(dir > 0 && virangeflag)
-	cs++;
+	zlecs++;
     return 0;
 }
 
@@ -293,10 +293,10 @@ viforwardchar(char **args)
 	zmult = n;
 	return ret;
     }
-    if (cs >= lim)
+    if (zlecs >= lim)
 	return 1;
-    while (n-- && cs < lim)
-	cs++;
+    while (n-- && zlecs < lim)
+	zlecs++;
     return 0;
 }
 
@@ -313,12 +313,12 @@ vibackwardchar(char **args)
 	zmult = n;
 	return ret;
     }
-    if (cs == findbol())
+    if (zlecs == findbol())
 	return 1;
     while (n--) {
-	cs--;
-	if (cs < 0 || line[cs] == '\n') {
-	    cs++;
+	zlecs--;
+	if (zlecs < 0 || zleline[zlecs] == '\n') {
+	    zlecs++;
 	    break;
 	}
     }
@@ -329,18 +329,18 @@ vibackwardchar(char **args)
 int
 viendofline(UNUSED(char **args))
 {
-    int oldcs = cs, n = zmult;
+    int oldcs = zlecs, n = zmult;
 
     if (n < 1)
 	return 1;
     while(n--) {
-	if (cs > ll) {
-	    cs = oldcs;
+	if (zlecs > zlell) {
+	    zlecs = oldcs;
 	    return 1;
 	}
-	cs = findeol() + 1;
+	zlecs = findeol() + 1;
     }
-    cs--;
+    zlecs--;
     lastcol = 1<<30;
     return 0;
 }
@@ -349,7 +349,7 @@ viendofline(UNUSED(char **args))
 int
 vibeginningofline(UNUSED(char **args))
 {
-    cs = findbol();
+    zlecs = findbol();
     return 0;
 }
 
@@ -407,7 +407,7 @@ vifindprevcharskip(char **args)
 int
 virepeatfind(char **args)
 {
-    int ocs = cs, n = zmult;
+    int ocs = zlecs, n = zmult;
 
     if (!vfinddir)
 	return 1;
@@ -420,16 +420,16 @@ virepeatfind(char **args)
     }
     while (n--) {
 	do
-	    cs += vfinddir;
-	while (cs >= 0 && cs < ll && line[cs] != vfindchar && line[cs] != '\n');
-	if (cs < 0 || cs >= ll || line[cs] == '\n') {
-	    cs = ocs;
+	    zlecs += vfinddir;
+	while (zlecs >= 0 && zlecs < zlell && zleline[zlecs] != vfindchar && zleline[zlecs] != '\n');
+	if (zlecs < 0 || zlecs >= zlell || zleline[zlecs] == '\n') {
+	    zlecs = ocs;
 	    return 1;
 	}
     }
-    cs += tailadd;
+    zlecs += tailadd;
     if (vfinddir == 1 && virangeflag)
-	cs++;
+	zlecs++;
     return 0;
 }
 
@@ -455,9 +455,9 @@ virevrepeatfind(char **args)
 int
 vifirstnonblank(UNUSED(char **args))
 {
-    cs = findbol();
-    while (cs != ll && iblank(line[cs]))
-	cs++;
+    zlecs = findbol();
+    while (zlecs != zlell && iblank(zleline[zlecs]))
+	zlecs++;
     return 0;
 }
 
@@ -471,7 +471,7 @@ visetmark(UNUSED(char **args))
     if (ch < 'a' || ch > 'z')
 	return 1;
     ch -= 'a';
-    vimarkcs[ch] = cs;
+    vimarkcs[ch] = zlecs;
     vimarkline[ch] = histline;
     return 0;
 }
@@ -496,9 +496,9 @@ vigotomark(UNUSED(char **args))
 	vimarkline[ch] = 0;
 	return 1;
     }
-    cs = vimarkcs[ch];
-    if (cs > ll)
-	cs = ll;
+    zlecs = vimarkcs[ch];
+    if (zlecs > zlell)
+	zlecs = zlell;
     return 0;
 }
 
diff --git a/Src/Zle/zle_params.c b/Src/Zle/zle_params.c
index 4a12dc2e7..afad1355b 100644
--- a/Src/Zle/zle_params.c
+++ b/Src/Zle/zle_params.c
@@ -175,14 +175,14 @@ static void
 set_buffer(UNUSED(Param pm), char *x)
 {
     if(x) {
-	unmetafy(x, &ll);
-	sizeline(ll);
-	strcpy((char *)line, x);
+	unmetafy(x, &zlell);
+	sizeline(zlell);
+	strcpy((char *)zleline, x);
 	zsfree(x);
-	if(cs > ll)
-	    cs = ll;
+	if(zlecs > zlell)
+	    zlecs = zlell;
     } else
-	cs = ll = 0;
+	zlecs = zlell = 0;
     fixsuffix();
     menucmp = 0;
 }
@@ -191,7 +191,7 @@ set_buffer(UNUSED(Param pm), char *x)
 static char *
 get_buffer(UNUSED(Param pm))
 {
-    return metafy((char *)line, ll, META_HEAPDUP);
+    return metafy((char *)zleline, zlell, META_HEAPDUP);
 }
 
 /**/
@@ -199,11 +199,11 @@ static void
 set_cursor(UNUSED(Param pm), zlong x)
 {
     if(x < 0)
-	cs = 0;
-    else if(x > ll)
-	cs = ll;
+	zlecs = 0;
+    else if(x > zlell)
+	zlecs = zlell;
     else
-	cs = x;
+	zlecs = x;
     fixsuffix();
     menucmp = 0;
 }
@@ -212,7 +212,7 @@ set_cursor(UNUSED(Param pm), zlong x)
 static zlong
 get_cursor(UNUSED(Param pm))
 {
-    return cs;
+    return zlecs;
 }
 
 /**/
@@ -221,8 +221,8 @@ set_mark(UNUSED(Param pm), zlong x)
 {
     if (x < 0)
 	mark = 0;
-    else if (x > ll)
-	mark = ll;
+    else if (x > zlell)
+	mark = zlell;
     else
 	mark = x;
 }
@@ -245,11 +245,11 @@ set_lbuffer(UNUSED(Param pm), char *x)
 	unmetafy(y = x, &len);
     else
 	y = "", len = 0;
-    sizeline(ll - cs + len);
-    memmove(line + len, line + cs, ll - cs);
-    memcpy(line, y, len);
-    ll = ll - cs + len;
-    cs = len;
+    sizeline(zlell - zlecs + len);
+    memmove(zleline + len, zleline + zlecs, zlell - zlecs);
+    memcpy(zleline, y, len);
+    zlell = zlell - zlecs + len;
+    zlecs = len;
     zsfree(x);
     fixsuffix();
     menucmp = 0;
@@ -259,7 +259,7 @@ set_lbuffer(UNUSED(Param pm), char *x)
 static char *
 get_lbuffer(UNUSED(Param pm))
 {
-    return metafy((char *)line, cs, META_HEAPDUP);
+    return metafy((char *)zleline, zlecs, META_HEAPDUP);
 }
 
 /**/
@@ -273,8 +273,8 @@ set_rbuffer(UNUSED(Param pm), char *x)
 	unmetafy(y = x, &len);
     else
 	y = "", len = 0;
-    sizeline(ll = cs + len);
-    memcpy(line + cs, y, len);
+    sizeline(zlell = zlecs + len);
+    memcpy(zleline + zlecs, y, len);
     zsfree(x);
     fixsuffix();
     menucmp = 0;
@@ -284,7 +284,7 @@ set_rbuffer(UNUSED(Param pm), char *x)
 static char *
 get_rbuffer(UNUSED(Param pm))
 {
-    return metafy((char *)line + cs, ll - cs, META_HEAPDUP);
+    return metafy((char *)zleline + zlecs, zlell - zlecs, META_HEAPDUP);
 }
 
 /**/
diff --git a/Src/Zle/zle_refresh.c b/Src/Zle/zle_refresh.c
index c0da11c89..2a72e6e8e 100644
--- a/Src/Zle/zle_refresh.c
+++ b/Src/Zle/zle_refresh.c
@@ -304,20 +304,20 @@ zrefresh(void)
 
     if (predisplaylen || postdisplaylen) {
 	/* There is extra text to display at the start or end of the line */
-	tmpline = zalloc(ll + predisplaylen + postdisplaylen);
+	tmpline = zalloc(zlell + predisplaylen + postdisplaylen);
 	if (predisplaylen)
 	    memcpy(tmpline, predisplay, predisplaylen);
-	if (ll)
-	    memcpy(tmpline+predisplaylen, line, ll);
+	if (zlell)
+	    memcpy(tmpline+predisplaylen, zleline, zlell);
 	if (postdisplaylen)
-	    memcpy(tmpline+predisplaylen+ll, postdisplay, postdisplaylen);
-	tmpcs = cs + predisplaylen;
-	tmpll = predisplaylen + ll + postdisplaylen;
+	    memcpy(tmpline+predisplaylen+zlell, postdisplay, postdisplaylen);
+	tmpcs = zlecs + predisplaylen;
+	tmpll = predisplaylen + zlell + postdisplaylen;
 	tmpalloced = 1;
     } else {
-	tmpline = line;
-	tmpcs = cs;
-	tmpll = ll;
+	tmpline = zleline;
+	tmpcs = zlecs;
+	tmpll = zlell;
 	tmpalloced = 0;
     }
 
diff --git a/Src/Zle/zle_tricky.c b/Src/Zle/zle_tricky.c
index 6d5723c39..a4d87dfea 100644
--- a/Src/Zle/zle_tricky.c
+++ b/Src/Zle/zle_tricky.c
@@ -30,17 +30,19 @@
 #include "zle.mdh"
 #include "zle_tricky.pro"
 
-/* The main part of ZLE maintains the line being edited as binary data, *
- * but here, where we interface with the lexer and other bits of zsh,   *
- * we need the line metafied.  The technique used is quite simple: on   *
- * entry to the expansion/completion system, we metafy the line in      *
- * place, adjusting ll and cs to match.  All completion and expansion   *
- * is done on the metafied line.  Immediately before returning, the     *
- * line is unmetafied again, changing ll and cs back.  (ll and cs might *
- * have changed during completion, so they can't be merely saved and    *
- * restored.)  The various indexes into the line that are used in this  *
- * file only are not translated: they remain indexes into the metafied  *
- * line.                                                                */
+/*
+ * The main part of ZLE maintains the line being edited as binary data,
+ * but here, where we interface with the lexer and other bits of zsh, we
+ * need the line metafied.  The technique used is quite simple: on entry
+ * to the expansion/completion system, we metafy the line in place,
+ * adjusting zlell and zlecs to match.  All completion and expansion is
+ * done on the metafied line.  Immediately before returning, the line is
+ * unmetafied again, changing zlell and zlecs back.  (zlell and zlecs
+ * might have changed during completion, so they can't be merely saved
+ * and restored.)  The various indexes into the line that are used in
+ * this file only are not translated: they remain indexes into the
+ * metafied line.
+ */
 
 #define inststr(X) inststrlen((X),1,-1)
 
@@ -157,11 +159,11 @@ int hascompwidgets;
 static int
 usetab(void)
 {
-    unsigned char *s = line + cs - 1;
+    unsigned char *s = zleline + zlecs - 1;
 
     if (keybuf[0] != '\t' || keybuf[1])
 	return 0;
-    for (; s >= line && *s != '\n'; s--)
+    for (; s >= zleline && *s != '\n'; s--)
 	if (*s != '\t' && *s != ' ')
 	    return 0;
     if (compfunc) {
@@ -248,7 +250,7 @@ deletecharorlist(char **args)
     useglob = isset(GLOBCOMPLETE);
     wouldinstab = 0;
 
-    if (cs != ll) {
+    if (zlecs != zlell) {
 	fixsuffix();
 	invalidatelist();
 	return deletechar(args);
@@ -582,22 +584,22 @@ docomplete(int lst)
     }
     metafy_line();
 
-    ocs = cs;
-    origline = dupstring((char *) line);
-    origcs = cs;
-    origll = ll;
+    ocs = zlecs;
+    origline = dupstring((char *) zleline);
+    origcs = zlecs;
+    origll = zlell;
     if (!isfirstln && chline != NULL) {
 	/* If we are completing in a multi-line buffer (which was not  *
 	 * taken from the history), we have to prepend the stuff saved *
 	 * in chline to the contents of line.                          */
 
-	ol = dupstring((char *)line);
+	ol = dupstring((char *)zleline);
 	/* Make sure that chline is zero-terminated. */
 	*hptr = '\0';
-	cs = 0;
+	zlecs = 0;
 	inststr(chline);
-	chl = cs;
-	cs += ocs;
+	chl = zlecs;
+	zlecs += ocs;
     } else
 	ol = NULL;
     inwhat = IN_NOTHING;
@@ -611,35 +613,35 @@ docomplete(int lst)
      * NOTE: get_comp_string() calls pushheap(), but not popheap(). */
     noerrs = 1;
     s = get_comp_string();
-    DPUTS(wb < 0 || cs < wb || cs > we,
-	  "BUG: 0 <= wb <= cs <= we is not true!");
+    DPUTS(wb < 0 || zlecs < wb || zlecs > we,
+	  "BUG: 0 <= wb <= zlecs <= we is not true!");
     noerrs = ne;
     /* For vi mode, reset the start-of-insertion pointer to the beginning *
      * of the word being completed, if it is currently later.  Vi itself  *
      * would never change the pointer in the middle of an insertion, but  *
      * then vi doesn't have completion.  More to the point, this is only  *
      * an emulation.                                                      */
-    if (viinsbegin > ztrsub((char *) line + wb, (char *) line))
-	viinsbegin = ztrsub((char *) line + wb, (char *) line);
+    if (viinsbegin > ztrsub((char *) zleline + wb, (char *) zleline))
+	viinsbegin = ztrsub((char *) zleline + wb, (char *) zleline);
     /* If we added chline to the line buffer, reset the original contents. */
     if (ol) {
-	cs -= chl;
+	zlecs -= chl;
 	wb -= chl;
 	we -= chl;
 	if (wb < 0) {
-	    strcpy((char *) line, ol);
-	    ll = strlen((char *) line);
-	    cs = ocs;
+	    strcpy((char *) zleline, ol);
+	    zlell = strlen((char *) zleline);
+	    zlecs = ocs;
 	    popheap();
 	    unmetafy_line();
 	    zsfree(s);
 	    active = 0;
 	    return 1;
 	}
-	ocs = cs;
-	cs = 0;
+	ocs = zlecs;
+	zlecs = 0;
 	foredel(chl);
-	cs = ocs;
+	zlecs = ocs;
     }
     freeheap();
     /* Save the lexer state, in case the completion code uses the lexer *
@@ -683,7 +685,7 @@ docomplete(int lst)
 		    if (*q == String && q[1] != Inpar && q[1] != Inbrack) {
 			if (*++q == Inbrace) {
 			    if (! skipparens(Inbrace, Outbrace, &q) &&
-				q == s + cs - wb)
+				q == s + zlecs - wb)
 				lst = COMP_EXPAND;
 			} else {
 			    char *t, sav, sav2;
@@ -714,7 +716,7 @@ docomplete(int lst)
 				    q++;
 			    sav = *q;
 			    *q = '\0';
-			    if (cs - wb == q - s &&
+			    if (zlecs - wb == q - s &&
 				(idigit(sav2) || checkparams(t)))
 				lst = COMP_EXPAND;
 			    *q = sav;
@@ -724,7 +726,7 @@ docomplete(int lst)
 			    lst = COMP_COMPLETE;
 		    } else
 			break;
-		} while (q < s + cs - wb);
+		} while (q < s + zlecs - wb);
 	    if (lst == COMP_EXPAND_COMPLETE) {
 		/* If it is still not clear if we should use expansion or   *
 		 * completion and there is a `$' or a backtick in the word, *
@@ -749,7 +751,7 @@ docomplete(int lst)
 	    for (q = w; *q; q++)
 		if (INULL(*q))
 		    *q = Nularg;
-	    cs = wb;
+	    zlecs = wb;
 	    foredel(we - wb);
 
 	    untokenize(x = ox = dupstring(w));
@@ -764,8 +766,8 @@ docomplete(int lst)
 	    /* Do expansion. */
 	    char *ol = (olst == COMP_EXPAND ||
                         olst == COMP_EXPAND_COMPLETE) ?
-		dupstring((char *)line) : (char *)line;
-	    int ocs = cs, ne = noerrs;
+		dupstring((char *)zleline) : (char *)zleline;
+	    int ocs = zlecs, ne = noerrs;
 
 	    noerrs = 1;
 	    ret = doexpansion(origword, lst, olst, lincmd);
@@ -775,8 +777,8 @@ docomplete(int lst)
 	    /* If expandorcomplete was invoked and the expansion didn't *
 	     * change the command line, do completion.                  */
 	    if (olst == COMP_EXPAND_COMPLETE &&
-		!strcmp(ol, (char *)line)) {
-		cs = ocs;
+		!strcmp(ol, (char *)zleline)) {
+		zlecs = ocs;
 		errflag = 0;
 
 		if (!compfunc) {
@@ -797,15 +799,15 @@ docomplete(int lst)
             } else {
                 if (ret)
                     clearlist = 1;
-                if (!strcmp(ol, (char *)line)) {
+                if (!strcmp(ol, (char *)zleline)) {
                     /* We may have removed some quotes. For completion, other
                      * parts of the code re-install them, but for expansion
                      * we have to do it here. */
-                    cs = 0;
-                    foredel(ll);
+                    zlecs = 0;
+                    foredel(zlell);
                     spaceinline(origll);
-                    memcpy(line, origline, origll);
-                    cs = origcs;
+                    memcpy(zleline, origline, origll);
+                    zlecs = origcs;
                 }
             }
 	} else
@@ -854,20 +856,23 @@ addx(char **ptmp)
 {
     int addspace = 0;
 
-    if (!line[cs] || line[cs] == '\n' ||
-	(iblank(line[cs]) && (!cs || line[cs-1] != '\\')) ||
-	line[cs] == ')' || line[cs] == '`' || line[cs] == '}' ||
-	line[cs] == ';' || line[cs] == '|' || line[cs] == '&' ||
-	line[cs] == '>' || line[cs] == '<' ||
-	(instring && (line[cs] == '"' || line[cs] == '\'')) ||
-	(addspace = (comppref && !iblank(line[cs])))) {
-	*ptmp = (char *)line;
-	line = (unsigned char *)zhalloc(strlen((char *)line) + 3 + addspace);
-	memcpy(line, *ptmp, cs);
-	line[cs] = 'x';
+    if (!zleline[zlecs] || zleline[zlecs] == '\n' ||
+	(iblank(zleline[zlecs]) && (!zlecs || zleline[zlecs-1] != '\\')) ||
+	zleline[zlecs] == ')' || zleline[zlecs] == '`' ||
+	zleline[zlecs] == '}' ||
+	zleline[zlecs] == ';' || zleline[zlecs] == '|' ||
+	zleline[zlecs] == '&' ||
+	zleline[zlecs] == '>' || zleline[zlecs] == '<' ||
+	(instring && (zleline[zlecs] == '"' || zleline[zlecs] == '\'')) ||
+	(addspace = (comppref && !iblank(zleline[zlecs])))) {
+	*ptmp = (char *)zleline;
+	zleline = (unsigned char *)zhalloc(strlen((char *)zleline) + 3 +
+					   addspace);
+	memcpy(zleline, *ptmp, zlecs);
+	zleline[zlecs] = 'x';
 	if (addspace)
-	    line[cs+1] = ' ';
-	strcpy((char *)line + cs + 1 + addspace, (*ptmp) + cs);
+	    zleline[zlecs+1] = ' ';
+	strcpy((char *)zleline + zlecs + 1 + addspace, (*ptmp) + zlecs);
 	addedx = 1 + addspace;
     } else {
 	addedx = 0;
@@ -889,7 +894,7 @@ dupstrspace(const char *str)
 }
 
 /* These functions metafy and unmetafy the ZLE buffer, as described at the *
- * top of this file.  Note that ll and cs are translated.  They *must* be  *
+ * top of this file.  Note that zlell and zlecs are translated.  They *must* be  *
  * called in matching pairs, around all the expansion/completion code.     *
  * Currently, there are four pairs: in history expansion, in the main      *
  * completion function, and one in each of the middle-of-menu-completion   *
@@ -899,24 +904,24 @@ dupstrspace(const char *str)
 mod_export void
 metafy_line(void)
 {
-    int len = ll;
+    int len = zlell;
     char *s;
 
-    for (s = (char *) line; s < (char *) line + ll;)
+    for (s = (char *) zleline; s < (char *) zleline + zlell;)
 	if (imeta(*s++))
 	    len++;
     sizeline(len);
-    (void) metafy((char *) line, ll, META_NOALLOC);
-    ll = len;
-    cs = metalen((char *) line, cs);
+    (void) metafy((char *) zleline, zlell, META_NOALLOC);
+    zlell = len;
+    zlecs = metalen((char *) zleline, zlecs);
 }
 
 /**/
 mod_export void
 unmetafy_line(void)
 {
-    cs = ztrsub((char *) line + cs, (char *) line);
-    (void) unmetafy((char *) line, &ll);
+    zlecs = ztrsub((char *) zleline + zlecs, (char *) zleline);
+    (void) unmetafy((char *) zleline, &zlell);
 }
 
 /* Free a brinfo list. */
@@ -1011,7 +1016,7 @@ get_comp_string(void)
      * "...", `...`, or ((...)). Nowadays this is only used to find   *
      * out if we are inside `...`.                                    */
 
-    for (i = j = k = 0, p = (char *)line; p < (char *)line + cs; p++)
+    for (i = j = k = 0, p = (char *)zleline; p < (char *)zleline + zlecs; p++)
 	if (*p == '`' && !(k & 1))
 	    i++;
 	else if (*p == '\"' && !(k & 1) && !(i & 1))
@@ -1023,7 +1028,7 @@ get_comp_string(void)
     inbackt = (i & 1);
     instring = 0;
     addx(&tmp);
-    linptr = (char *)line;
+    linptr = (char *)zleline;
     pushheap();
 
  start:
@@ -1132,14 +1137,14 @@ get_comp_string(void)
 	    tt = tokstr ? dupstring(tokstr) : NULL;
 
             if (isset(RCQUOTES) && *tt == Snull) {
-                char *p, *e = tt + cs - wb;
+                char *p, *e = tt + zlecs - wb;
                 for (p = tt; *p && p < e; p++)
                     if (*p == '\'')
                         qsub++;
             }
 	    /* If we added a `x', remove it. */
 	    if (addedx && tt)
-		chuck(tt + cs - wb - qsub);
+		chuck(tt + zlecs - wb - qsub);
 	    tt0 = tok;
 	    /* Store the number of this word. */
 	    clwpos = i;
@@ -1187,8 +1192,8 @@ get_comp_string(void)
 	/* If this is the word the cursor is in and we added a `x', *
 	 * remove it.                                               */
 	if (clwpos == i++ && addedx)
-	    chuck(&clwords[i - 1][((cs - wb - qsub) >= sl) ?
-				 (sl - 1) : (cs - wb - qsub)]);
+	    chuck(&clwords[i - 1][((zlecs - wb - qsub) >= sl) ?
+				 (sl - 1) : (zlecs - wb - qsub)]);
     } while (tok != LEXERR && tok != ENDINPUT &&
 	     (tok != SEPER || (zleparse && !tt0)));
     /* Calculate the number of words stored in the clwords array. */
@@ -1210,13 +1215,13 @@ get_comp_string(void)
 	/* We are in command or process substitution if we are not in
 	 * a $((...)). */
 	if (parend >= 0 && !tmp)
-	    line = (unsigned char *) dupstring(tmp = (char *)line);
-	linptr = (char *) line + ll + addedx - parbegin + 1;
-	if ((linptr - (char *) line) < 3 || *linptr != '(' ||
+	    zleline = (unsigned char *) dupstring(tmp = (char *)zleline);
+	linptr = (char *) zleline + zlell + addedx - parbegin + 1;
+	if ((linptr - (char *) zleline) < 3 || *linptr != '(' ||
 	    linptr[-1] != '(' || linptr[-2] != '$') {
 	    if (parend >= 0) {
-		ll -= parend;
-		line[ll + addedx] = '\0';
+		zlell -= parend;
+		zleline[zlell + addedx] = '\0';
 	    }
 	    lexrestore();
 	    tt = NULL;
@@ -1229,7 +1234,7 @@ get_comp_string(void)
     else if (!t0 || t0 == ENDINPUT) {
 	/* There was no word (empty line). */
 	s = ztrdup("");
-	we = wb = cs;
+	we = wb = zlecs;
 	clwpos = clwnum;
 	t0 = STRING;
     } else if (t0 == STRING) {
@@ -1250,7 +1255,7 @@ get_comp_string(void)
 	*s = sav;
         if (*s == '+')
             s++;
-	if (skipparens(Inbrack, Outbrack, &s) > 0 || s > tt + cs - wb) {
+	if (skipparens(Inbrack, Outbrack, &s) > 0 || s > tt + zlecs - wb) {
 	    s = NULL;
 	    inwhat = IN_MATH;
 	    if ((keypm = (Param) paramtab->getnode(paramtab, varname)) &&
@@ -1259,7 +1264,7 @@ get_comp_string(void)
 	    else
 		insubscr = 1;
 	} else if (*s == '=') {
-            if (cs > wb + (s - tt)) {
+            if (zlecs > wb + (s - tt)) {
                 s++;
                 wb += s - tt;
                 s = ztrdup(s);
@@ -1280,17 +1285,17 @@ get_comp_string(void)
 	}
 	lincmd = 1;
     }
-    if (we > ll)
-	we = ll;
-    tt = (char *)line;
+    if (we > zlell)
+	we = zlell;
+    tt = (char *)zleline;
     if (tmp) {
-	line = (unsigned char *)tmp;
-	ll = strlen((char *)line);
+	zleline = (unsigned char *)tmp;
+	zlell = strlen((char *)zleline);
     }
     if (t0 != STRING && inwhat != IN_MATH) {
 	if (tmp) {
 	    tmp = NULL;
-	    linptr = (char *)line;
+	    linptr = (char *)zleline;
 	    lexrestore();
 	    addedx = 0;
 	    goto start;
@@ -1311,7 +1316,7 @@ get_comp_string(void)
 	int i = 0;
 	char *nnb = (iident(*s) ? s : s + 1), *nb = NULL, *ne = NULL;
 	
-	for (tt = s; ++tt < s + cs - wb;)
+	for (tt = s; ++tt < s + zlecs - wb;)
 	    if (*tt == Inbrack) {
 		i++;
 		nb = nnb;
@@ -1340,23 +1345,23 @@ get_comp_string(void)
 	    int lev;
 	    char *p;
 
-	    for (wb = cs - 1, lev = 0; wb > 0; wb--)
-		if (line[wb] == ']' || line[wb] == ')')
+	    for (wb = zlecs - 1, lev = 0; wb > 0; wb--)
+		if (zleline[wb] == ']' || zleline[wb] == ')')
 		    lev++;
-		else if (line[wb] == '[') {
+		else if (zleline[wb] == '[') {
 		    if (!lev--)
 			break;
-		} else if (line[wb] == '(') {
-		    if (!lev && line[wb - 1] == '(')
+		} else if (zleline[wb] == '(') {
+		    if (!lev && zleline[wb - 1] == '(')
 			break;
 		    if (lev)
 			lev--;
 		}
-	    p = (char *) line + wb;
+	    p = (char *) zleline + wb;
 	    wb++;
 	    if (wb && (*p == '[' || *p == '(') &&
 		!skipparens(*p, (*p == '[' ? ']' : ')'), &p)) {
-		we = (p - (char *) line) - 1;
+		we = (p - (char *) zleline) - 1;
 		if (insubscr == 2)
 		    insubscr = 3;
 	    }
@@ -1364,25 +1369,25 @@ get_comp_string(void)
 	    /* In mathematical expression, we complete parameter names  *
 	     * (even if they don't have a `$' in front of them).  So we *
 	     * have to find that name.                                  */
-	    for (we = cs; iident(line[we]); we++);
-	    for (wb = cs; --wb >= 0 && iident(line[wb]););
+	    for (we = zlecs; iident(zleline[we]); we++);
+	    for (wb = zlecs; --wb >= 0 && iident(zleline[wb]););
 	    wb++;
 	}
 	zsfree(s);
 	s = zalloc(we - wb + 1);
-	strncpy(s, (char *) line + wb, we - wb);
+	strncpy(s, (char *) zleline + wb, we - wb);
 	s[we - wb] = '\0';
-	if (wb > 2 && line[wb - 1] == '[' && iident(line[wb - 2])) {
+	if (wb > 2 && zleline[wb - 1] == '[' && iident(zleline[wb - 2])) {
 	    int i = wb - 3;
-	    unsigned char sav = line[wb - 1];
+	    unsigned char sav = zleline[wb - 1];
 
-	    while (i >= 0 && iident(line[i]))
+	    while (i >= 0 && iident(zleline[i]))
 		i--;
 
-	    line[wb - 1] = '\0';
+	    zleline[wb - 1] = '\0';
 	    zsfree(varname);
-	    varname = ztrdup((char *) line + i + 1);
-	    line[wb - 1] = sav;
+	    varname = ztrdup((char *) zleline + i + 1);
+	    zleline[wb - 1] = sav;
 	    if ((keypm = (Param) paramtab->getnode(paramtab, varname)) &&
 		(keypm->flags & PM_HASHED)) {
 		if (insubscr != 3)
@@ -1393,7 +1398,7 @@ get_comp_string(void)
 	parse_subst_string(s);
     }
     /* This variable will hold the current word in quoted form. */
-    offs = cs - wb;
+    offs = zlecs - wb;
     if ((p = parambeg(s))) {
 	for (p = s; *p; p++)
 	    if (*p == Dnull)
@@ -1437,34 +1442,34 @@ get_comp_string(void)
     /* While building the quoted form, we also clean up the command line. */
     for (p = s, i = wb, j = 0; *p; p++, i++)
 	if (INULL(*p)) {
-	    if (i < cs)
+	    if (i < zlecs)
 		offs--;
 	    if (*p == Snull && isset(RCQUOTES))
 		j = 1-j;
 	    if (p[1] || *p != Bnull) {
 		if (*p == Bnull) {
-		    if (cs == i + 1)
-			cs++, offs++;
+		    if (zlecs == i + 1)
+			zlecs++, offs++;
 		} else {
-		    ocs = cs;
-		    cs = i;
+		    ocs = zlecs;
+		    zlecs = i;
 		    foredel(1);
-		    if ((cs = ocs) > i--)
-			cs--;
+		    if ((zlecs = ocs) > i--)
+			zlecs--;
 		    we--;
 		}
 	    } else {
-		ocs = cs;
-		cs = we;
+		ocs = zlecs;
+		zlecs = we;
 		backdel(1);
 		if (ocs == we)
-		    cs = we - 1;
+		    zlecs = we - 1;
 		else
-		    cs = ocs;
+		    zlecs = ocs;
 		we--;
 	    }
 	    chuck(p--);
-	} else if (j && *p == '\'' && i < cs)
+	} else if (j && *p == '\'' && i < zlecs)
 	    offs--;
 
     zsfree(origword);
@@ -1732,9 +1737,9 @@ inststrlen(char *str, int move, int len)
     if (len == -1)
 	len = strlen(str);
     spaceinline(len);
-    strncpy((char *)(line + cs), str, len);
+    strncpy((char *)(zleline + zlecs), str, len);
     if (move)
-	cs += len;
+	zlecs += len;
     return len;
 }
 
@@ -1787,17 +1792,17 @@ doexpansion(char *s, int lst, int olst, int explincmd)
     if (lst == COMP_LIST_EXPAND) {
 	/* Only the list of expansions was requested. Restore the 
          * command line. */
-        cs = 0;
-        foredel(ll);
+        zlecs = 0;
+        foredel(zlell);
         spaceinline(origll);
-        memcpy(line, origline, origll);
-        cs = origcs;
+        memcpy(zleline, origline, origll);
+        zlecs = origcs;
         ret = listlist(vl);
         showinglist = 0;
 	goto end;
     }
     /* Remove the current word and put the expansions there. */
-    cs = wb;
+    zlecs = wb;
     foredel(we - wb);
     while ((ss = (char *)ugetnode(vl))) {
 	ret = 0;
@@ -1806,11 +1811,11 @@ doexpansion(char *s, int lst, int olst, int explincmd)
 	inststr(ss);
 #if 0
 	if (olst != COMP_EXPAND_COMPLETE || nonempty(vl) ||
-	    (cs && line[cs-1] != '/')) {
+	    (zlecs && zleline[zlecs-1] != '/')) {
 #endif
 	if (nonempty(vl) || !first) {
 	    spaceinline(1);
-	    line[cs++] = ' ';
+	    zleline[zlecs++] = ' ';
 	}
 	first = 0;
     }
@@ -2238,12 +2243,12 @@ doexpandhist(void)
 
     pushheap();
     metafy_line();
-    oll = ll;
-    ocs = cs;
-    ol = (unsigned char *)dupstring((char *)line);
+    oll = zlell;
+    ocs = zlecs;
+    ol = (unsigned char *)dupstring((char *)zleline);
     expanding = 1;
-    excs = cs;
-    ll = cs = 0;
+    excs = zlecs;
+    zlell = zlecs = 0;
     lexsave();
     /* We push ol as it will remain unchanged */
     inpush((char *) ol, 0, NULL);
@@ -2269,8 +2274,8 @@ doexpandhist(void)
     expanding = 0;
 
     if (!err) {
-	cs = excs;
-	if (strcmp((char *)line, (char *)ol)) {
+	zlecs = excs;
+	if (strcmp((char *)zleline, (char *)ol)) {
 	    unmetafy_line();
 	    /* For vi mode -- reset the beginning-of-insertion pointer   *
 	     * to the beginning of the line.  This seems a little silly, *
@@ -2282,9 +2287,9 @@ doexpandhist(void)
 	}
     }
 
-    strcpy((char *)line, (char *)ol);
-    ll = oll;
-    cs = ocs;
+    strcpy((char *)zleline, (char *)ol);
+    zlell = oll;
+    zlecs = ocs;
     unmetafy_line();
 
     popheap();
@@ -2299,10 +2304,12 @@ magicspace(char **args)
     char *bangq;
     int ret;
     lastchar = ' ';
-    for (bangq = (char *)line; (bangq = strchr(bangq, bangchar)); bangq += 2)
-	if (bangq[1] == '"' && (bangq == (char *)line || bangq[-1] != '\\'))
+    for (bangq = (char *)zleline; (bangq = strchr(bangq, bangchar));
+	 bangq += 2)
+	if (bangq[1] == '"' && (bangq == (char *)zleline || bangq[-1] != '\\'))
 	    break;
-    if (!(ret = selfinsert(args)) && (!bangq || bangq + 2 > (char *)line + cs))
+    if (!(ret = selfinsert(args)) &&
+	(!bangq || bangq + 2 > (char *)zleline + zlecs))
 	doexpandhist();
     return ret;
 }
@@ -2328,7 +2335,7 @@ getcurcmd(void)
     zleparse = 2;
     lexsave();
     metafy_line();
-    inpush(dupstrspace((char *) line), 0, NULL);
+    inpush(dupstrspace((char *) zleline), 0, NULL);
     unmetafy_line();
     strinbeg(1);
     pushheap();
@@ -2340,8 +2347,8 @@ getcurcmd(void)
 	if (tok == STRING && curlincmd) {
 	    zsfree(s);
 	    s = ztrdup(tokstr);
-	    cmdwb = ll - wordbeg;
-	    cmdwe = ll + 1 - inbufct;
+	    cmdwb = zlell - wordbeg;
+	    cmdwe = zlell + 1 - inbufct;
 	}
     }
     while (tok != ENDINPUT && tok != LEXERR && zleparse);
@@ -2382,7 +2389,7 @@ processcmd(UNUSED(char **args))
 int
 expandcmdpath(UNUSED(char **args))
 {
-    int oldcs = cs, na = noaliases;
+    int oldcs = zlecs, na = noaliases;
     char *s, *str;
 
     noaliases = 1;
@@ -2394,15 +2401,15 @@ expandcmdpath(UNUSED(char **args))
     zsfree(s);
     if (!str)
 	return 1;
-    cs = cmdwb;
+    zlecs = cmdwb;
     foredel(cmdwe - cmdwb);
     spaceinline(strlen(str));
-    strncpy((char *)line + cs, str, strlen(str));
-    cs = oldcs;
-    if (cs >= cmdwe - 1)
-	cs += cmdwe - cmdwb + strlen(str);
-    if (cs > ll)
-	cs = ll;
+    strncpy((char *)zleline + zlecs, str, strlen(str));
+    zlecs = oldcs;
+    if (zlecs >= cmdwe - 1)
+	zlecs += cmdwe - cmdwb + strlen(str);
+    if (zlecs > zlell)
+	zlecs = zlell;
     return 0;
 }
 
@@ -2417,7 +2424,7 @@ expandorcompleteprefix(char **args)
 
     comppref = 1;
     ret = expandorcomplete(args);
-    if (cs && line[cs - 1] == ' ')
+    if (zlecs && zleline[zlecs - 1] == ' ')
         makesuffixstr(NULL, "\\-", 0);
     comppref = 0;
     return ret;
diff --git a/Src/Zle/zle_utils.c b/Src/Zle/zle_utils.c
index 8783e83f9..d1b10c4b0 100644
--- a/Src/Zle/zle_utils.c
+++ b/Src/Zle/zle_utils.c
@@ -67,9 +67,40 @@ void
 sizeline(int sz)
 {
     while (sz > linesz)
-	line = (unsigned char *)realloc(line, (linesz *= 4) + 2);
+	zleline = (unsigned char *)realloc(zleline, (linesz *= 4) + 2);
 }
 
+/*
+ * Insert a character, called from main shell.
+ *
+ * WCHAR: type is wrong, should be a genuine wide character,
+ * when available in the caller.
+ */
+
+/**/
+mod_export void
+zleaddtoline(int chr)
+{
+    spaceinline(1);
+    zleline[zlecs++] = chr;
+}
+
+/*
+    return zleline;
+    return zleline;
+ */
+
+/**/
+mod_export unsigned char *
+zlegetline(int *ll, int *cs)
+{
+    *ll = zlell;
+    *cs = zlecs;
+
+    return zleline;
+}
+
+
 /* insert space for ct chars at cursor position */
 
 /**/
@@ -78,13 +109,13 @@ spaceinline(int ct)
 {
     int i;
 
-    sizeline(ct + ll);
-    for (i = ll; --i >= cs;)
-	line[i + ct] = line[i];
-    ll += ct;
-    line[ll] = '\0';
+    sizeline(ct + zlell);
+    for (i = zlell; --i >= zlecs;)
+	zleline[i + ct] = zleline[i];
+    zlell += ct;
+    zleline[zlell] = '\0';
 
-    if (mark > cs)
+    if (mark > zlecs)
 	mark += ct;
 }
 
@@ -97,18 +128,18 @@ shiftchars(int to, int cnt)
     else if (mark > to)
 	mark = to;
 
-    while (to + cnt < ll) {
-	line[to] = line[to + cnt];
+    while (to + cnt < zlell) {
+	zleline[to] = zleline[to + cnt];
 	to++;
     }
-    line[ll = to] = '\0';
+    zleline[zlell = to] = '\0';
 }
 
 /**/
 mod_export void
 backkill(int ct, int dir)
 {
-    int i = (cs -= ct);
+    int i = (zlecs -= ct);
 
     cut(i, ct, dir);
     shiftchars(i, ct);
@@ -118,7 +149,7 @@ backkill(int ct, int dir)
 mod_export void
 forekill(int ct, int dir)
 {
-    int i = cs;
+    int i = zlecs;
 
     cut(i, ct, dir);
     shiftchars(i, ct);
@@ -137,7 +168,7 @@ cut(int i, int ct, int dir)
 	if (!(zmod.flags & MOD_VIAPP) || !b->buf) {
 	    zfree(b->buf, b->len);
 	    b->buf = (char *)zalloc(ct);
-	    memcpy(b->buf, (char *) line + i, ct);
+	    memcpy(b->buf, (char *) zleline + i, ct);
 	    b->len = ct;
 	    b->flags = vilinerange ? CUTBUFFER_LINE : 0;
 	} else {
@@ -148,7 +179,7 @@ cut(int i, int ct, int dir)
 	    b->buf = realloc(b->buf, ct + len + !!(b->flags & CUTBUFFER_LINE));
 	    if (b->flags & CUTBUFFER_LINE)
 		b->buf[len++] = '\n';
-	    memcpy(b->buf + len, (char *) line + i, ct);
+	    memcpy(b->buf + len, (char *) zleline + i, ct);
 	    b->len = len + ct;
 	}
 	return;
@@ -159,7 +190,7 @@ cut(int i, int ct, int dir)
 	for(n=34; n>26; n--)
 	    vibuf[n] = vibuf[n-1];
 	vibuf[26].buf = (char *)zalloc(ct);
-	memcpy(vibuf[26].buf, (char *) line + i, ct);
+	memcpy(vibuf[26].buf, (char *) zleline + i, ct);
 	vibuf[26].len = ct;
 	vibuf[26].flags = vilinerange ? CUTBUFFER_LINE : 0;
     }
@@ -183,14 +214,14 @@ cut(int i, int ct, int dir)
     if (dir) {
 	char *s = (char *)zalloc(cutbuf.len + ct);
 
-	memcpy(s, (char *) line + i, ct);
+	memcpy(s, (char *) zleline + i, ct);
 	memcpy(s + ct, cutbuf.buf, cutbuf.len);
 	free(cutbuf.buf);
 	cutbuf.buf = s;
 	cutbuf.len += ct;
     } else {
 	cutbuf.buf = realloc(cutbuf.buf, cutbuf.len + ct);
-	memcpy(cutbuf.buf + cutbuf.len, (char *) line + i, ct);
+	memcpy(cutbuf.buf + cutbuf.len, (char *) zleline + i, ct);
 	cutbuf.len += ct;
     }
     if(vilinerange)
@@ -203,14 +234,14 @@ cut(int i, int ct, int dir)
 mod_export void
 backdel(int ct)
 {
-    shiftchars(cs -= ct, ct);
+    shiftchars(zlecs -= ct, ct);
 }
 
 /**/
 mod_export void
 foredel(int ct)
 {
-    shiftchars(cs, ct);
+    shiftchars(zlecs, ct);
 }
 
 /**/
@@ -218,19 +249,19 @@ void
 setline(char const *s)
 {
     sizeline(strlen(s));
-    strcpy((char *) line, s);
-    unmetafy((char *) line, &ll);
-    if ((cs = ll) && invicmdmode())
-	cs--;
+    strcpy((char *) zleline, s);
+    unmetafy((char *) zleline, &zlell);
+    if ((zlecs = zlell) && invicmdmode())
+	zlecs--;
 }
 
 /**/
 int
 findbol(void)
 {
-    int x = cs;
+    int x = zlecs;
 
-    while (x > 0 && line[x - 1] != '\n')
+    while (x > 0 && zleline[x - 1] != '\n')
 	x--;
     return x;
 }
@@ -239,9 +270,9 @@ findbol(void)
 int
 findeol(void)
 {
-    int x = cs;
+    int x = zlecs;
 
-    while (x != ll && line[x] != '\n')
+    while (x != zlell && zleline[x] != '\n')
 	x++;
     return x;
 }
@@ -451,8 +482,8 @@ initundo(void)
     curchange->prev = curchange->next = NULL;
     curchange->del = curchange->ins = NULL;
     lastline = zalloc(lastlinesz = linesz);
-    memcpy(lastline, line, lastll = ll);
-    lastcs = cs;
+    memcpy(lastline, zleline, lastll = zlell);
+    lastcs = zlecs;
 }
 
 /**/
@@ -512,30 +543,30 @@ void
 mkundoent(void)
 {
     int pre, suf;
-    int sh = ll < lastll ? ll : lastll;
+    int sh = zlell < lastll ? zlell : lastll;
     struct change *ch;
 
-    if(lastll == ll && !memcmp(lastline, line, ll))
+    if(lastll == zlell && !memcmp(lastline, zleline, zlell))
 	return;
-    for(pre = 0; pre < sh && line[pre] == lastline[pre]; )
+    for(pre = 0; pre < sh && zleline[pre] == lastline[pre]; )
 	pre++;
     for(suf = 0; suf < sh - pre &&
-	line[ll - 1 - suf] == lastline[lastll - 1 - suf]; )
+	zleline[zlell - 1 - suf] == lastline[lastll - 1 - suf]; )
 	suf++;
     ch = zalloc(sizeof(*ch));
     ch->next = NULL;
     ch->hist = histline;
     ch->off = pre;
     ch->old_cs = lastcs;
-    ch->new_cs = cs;
+    ch->new_cs = zlecs;
     if(suf + pre == lastll)
 	ch->del = NULL;
     else
 	ch->del = metafy(lastline + pre, lastll - pre - suf, META_DUP);
-    if(suf + pre == ll)
+    if(suf + pre == zlell)
 	ch->ins = NULL;
     else
-	ch->ins = metafy((char *)line + pre, ll - pre - suf, META_DUP);
+	ch->ins = metafy((char *)zleline + pre, zlell - pre - suf, META_DUP);
     if(nextchanges) {
 	ch->flags = CH_PREV;
 	ch->prev = endnextchanges;
@@ -557,8 +588,8 @@ setlastline(void)
 {
     if(lastlinesz != linesz)
 	lastline = realloc(lastline, lastlinesz = linesz);
-    memcpy(lastline, line, lastll = ll);
-    lastcs = cs;
+    memcpy(lastline, zleline, lastll = zlell);
+    lastcs = zlecs;
 }
 
 /* move backwards through the change list */
@@ -586,10 +617,10 @@ unapplychange(struct change *ch)
 {
     if(ch->hist != histline) {
 	zle_setline(quietgethist(ch->hist));
-	cs = ch->new_cs;
+	zlecs = ch->new_cs;
 	return 0;
     }
-    cs = ch->off;
+    zlecs = ch->off;
     if(ch->ins)
 	foredel(ztrlen(ch->ins));
     if(ch->del) {
@@ -598,11 +629,11 @@ unapplychange(struct change *ch)
 	spaceinline(ztrlen(c));
 	for(; *c; c++)
 	    if(*c == Meta)
-		line[cs++] = STOUC(*++c) ^ 32;
+		zleline[zlecs++] = STOUC(*++c) ^ 32;
 	    else
-		line[cs++] = STOUC(*c);
+		zleline[zlecs++] = STOUC(*c);
     }
-    cs = ch->old_cs;
+    zlecs = ch->old_cs;
     return 1;
 }
 
@@ -631,10 +662,10 @@ applychange(struct change *ch)
 {
     if(ch->hist != histline) {
 	zle_setline(quietgethist(ch->hist));
-	cs = ch->old_cs;
+	zlecs = ch->old_cs;
 	return 0;
     }
-    cs = ch->off;
+    zlecs = ch->off;
     if(ch->del)
 	foredel(ztrlen(ch->del));
     if(ch->ins) {
@@ -643,11 +674,11 @@ applychange(struct change *ch)
 	spaceinline(ztrlen(c));
 	for(; *c; c++)
 	    if(*c == Meta)
-		line[cs++] = STOUC(*++c) ^ 32;
+		zleline[zlecs++] = STOUC(*++c) ^ 32;
 	    else
-		line[cs++] = STOUC(*c);
+		zleline[zlecs++] = STOUC(*c);
     }
-    cs = ch->new_cs;
+    zlecs = ch->new_cs;
     return 1;
 }
 
diff --git a/Src/Zle/zle_vi.c b/Src/Zle/zle_vi.c
index 81a095c71..15a2deb49 100644
--- a/Src/Zle/zle_vi.c
+++ b/Src/Zle/zle_vi.c
@@ -91,7 +91,7 @@ startvitext(int im)
     startvichange(im);
     selectkeymap("main", 1);
     undoing = 0;
-    viinsbegin = cs;
+    viinsbegin = zlecs;
 }
 
 /**/
@@ -118,12 +118,12 @@ vigetkey(void)
 	if ((lastchar = getkey(0)) == EOF)
 	    return -1;
     } else if(cmd == Th(z_viquotedinsert)) {
-	char sav = line[cs];
+	char sav = zleline[zlecs];
 
-	line[cs] = '^';
+	zleline[zlecs] = '^';
 	zrefresh();
 	lastchar = getkey(0);
-	line[cs] = sav;
+	zleline[zlecs] = sav;
 	if(lastchar == EOF)
 	    return -1;
     } else if (cmd == Th(z_vicmdmode))
@@ -135,7 +135,7 @@ vigetkey(void)
 static int
 getvirange(int wf)
 {
-    int pos = cs, ret = 0;
+    int pos = zlecs, ret = 0;
     int mult1 = zmult, hist1 = histline;
     Thingy k2;
 
@@ -181,16 +181,16 @@ getvirange(int wf)
     /* It is an error to use a non-movement command to delimit the *
      * range.  We here reject the case where the command modified  *
      * the line, or selected a different history line.             */
-    if (histline != hist1 || ll != lastll || memcmp(line, lastline, ll)) {
+    if (histline != hist1 || zlell != lastll || memcmp(zleline, lastline, zlell)) {
 	histline = hist1;
-	memcpy(line, lastline, ll = lastll);
-	cs = pos;
+	memcpy(zleline, lastline, zlell = lastll);
+	zlecs = pos;
 	return -1;
     }
 
     /* Can't handle an empty file.  Also, if the movement command *
      * failed, or didn't move, it is an error.                    */
-    if (!ll || (cs == pos && virangeflag != 2) || ret == -1)
+    if (!zlell || (zlecs == pos && virangeflag != 2) || ret == -1)
 	return -1;
 
     /* vi-match-bracket changes the value of virangeflag when *
@@ -199,26 +199,26 @@ getvirange(int wf)
     if(virangeflag == -1)
 	pos++;
 
-    /* Get the range the right way round.  cs is placed at the *
+    /* Get the range the right way round.  zlecs is placed at the *
      * start of the range, and pos (the return value of this   *
      * function) is the end.                                   */
-    if (cs > pos) {
-	int tmp = cs;
-	cs = pos;
+    if (zlecs > pos) {
+	int tmp = zlecs;
+	zlecs = pos;
 	pos = tmp;
     }
 
     /* Was it a line-oriented move?  If so, the command will have set *
      * the vilinerange flag.  In this case, entire lines are taken,   *
      * rather than just the sequence of characters delimited by pos   *
-     * and cs.  The terminating newline is left out of the range,     *
+     * and zlecs.  The terminating newline is left out of the range,     *
      * which the real command must deal with appropriately.  At this  *
      * point we just need to make the range encompass entire lines.   */
     if(vilinerange) {
 	int newcs = findbol();
-	cs = pos;
+	zlecs = pos;
 	pos = findeol();
-	cs = newcs;
+	zlecs = newcs;
     }
     return pos;
 }
@@ -227,7 +227,7 @@ getvirange(int wf)
 static int
 dovilinerange(void)
 {
-    int pos = cs, n = zmult;
+    int pos = zlecs, n = zmult;
 
     /* A number of lines is taken as the range.  The current line *
      * is included.  If the repeat count is positive the lines go *
@@ -237,21 +237,21 @@ dovilinerange(void)
     if (!n)
 	return 1;
     if (n > 0) {
-	while(n-- && cs <= ll)
-	    cs = findeol() + 1;
+	while(n-- && zlecs <= zlell)
+	    zlecs = findeol() + 1;
 	if (n != -1) {
-	    cs = pos;
+	    zlecs = pos;
 	    return 1;
 	}
-	cs--;
+	zlecs--;
     } else {
-	while(n++ && cs >= 0)
-	    cs = findbol() - 1;
+	while(n++ && zlecs >= 0)
+	    zlecs = findbol() - 1;
 	if (n != 1) {
-	    cs = pos;
+	    zlecs = pos;
 	    return 1;
 	}
-	cs++;
+	zlecs++;
     }
     virangeflag = 2;
     return 0;
@@ -261,8 +261,8 @@ dovilinerange(void)
 int
 viaddnext(UNUSED(char **args))
 {
-    if (cs != findeol())
-	cs++;
+    if (zlecs != findeol())
+	zlecs++;
     startvitext(1);
     return 0;
 }
@@ -271,7 +271,7 @@ viaddnext(UNUSED(char **args))
 int
 viaddeol(UNUSED(char **args))
 {
-    cs = findeol();
+    zlecs = findeol();
     startvitext(1);
     return 0;
 }
@@ -301,11 +301,11 @@ videlete(UNUSED(char **args))
 
     startvichange(1);
     if ((c2 = getvirange(0)) != -1) {
-	forekill(c2 - cs, 0);
+	forekill(c2 - zlecs, 0);
 	ret = 0;
-	if (vilinerange && ll) {
-	    if (cs == ll)
-		cs--;
+	if (vilinerange && zlell) {
+	    if (zlecs == zlell)
+		zlecs--;
 	    foredel(1);
 	    vifirstnonblank(zlenoargs);
 	}
@@ -330,12 +330,12 @@ videletechar(char **args)
 	return ret;
     }
     /* it is an error to be on the end of line */
-    if (cs == ll || line[cs] == '\n')
+    if (zlecs == zlell || zleline[zlecs] == '\n')
 	return 1;
     /* Put argument into the acceptable range -- it is not an error to  *
      * specify a greater count than the number of available characters. */
-    if (n > findeol() - cs)
-	n = findeol() - cs;
+    if (n > findeol() - zlecs)
+	n = findeol() - zlecs;
     /* do the deletion */
     forekill(n, 0);
     return 0;
@@ -350,9 +350,9 @@ vichange(UNUSED(char **args))
     startvichange(1);
     if ((c2 = getvirange(1)) != -1) {
 	ret = 0;
-	forekill(c2 - cs, 0);
+	forekill(c2 - zlecs, 0);
 	selectkeymap("main", 1);
-	viinsbegin = cs;
+	viinsbegin = zlecs;
 	undoing = 0;
     }
     return ret;
@@ -368,12 +368,12 @@ visubstitute(UNUSED(char **args))
     if (n < 0)
 	return 1;
     /* it is an error to be on the end of line */
-    if (cs == ll || line[cs] == '\n')
+    if (zlecs == zlell || zleline[zlecs] == '\n')
 	return 1;
     /* Put argument into the acceptable range -- it is not an error to  *
      * specify a greater count than the number of available characters. */
-    if (n > findeol() - cs)
-	n = findeol() - cs;
+    if (n > findeol() - zlecs)
+	n = findeol() - zlecs;
     /* do the substitution */
     forekill(n, 0);
     startvitext(1);
@@ -384,7 +384,7 @@ visubstitute(UNUSED(char **args))
 int
 vichangeeol(UNUSED(char **args))
 {
-    forekill(findeol() - cs, 0);
+    forekill(findeol() - zlecs, 0);
     startvitext(1);
     return 0;
 }
@@ -401,15 +401,15 @@ vichangewholeline(char **args)
 int
 viyank(UNUSED(char **args))
 {
-    int oldcs = cs, c2, ret = 1;
+    int oldcs = zlecs, c2, ret = 1;
 
     startvichange(1);
     if ((c2 = getvirange(0)) != -1) {
-	cut(cs, c2 - cs, 0);
+	cut(zlecs, c2 - zlecs, 0);
 	ret = 0;
     }
     vichgflag = 0;
-    cs = oldcs;
+    zlecs = oldcs;
     return ret;
 }
 
@@ -420,9 +420,9 @@ viyankeol(UNUSED(char **args))
     int x = findeol();
 
     startvichange(-1);
-    if (x == cs)
+    if (x == zlecs)
 	return 1;
-    cut(cs, x - cs, 0);
+    cut(zlecs, x - zlecs, 0);
     return 0;
 }
 
@@ -430,22 +430,22 @@ viyankeol(UNUSED(char **args))
 int
 viyankwholeline(UNUSED(char **args))
 {
-    int bol = findbol(), oldcs = cs;
+    int bol = findbol(), oldcs = zlecs;
     int n = zmult;
 
     startvichange(-1);
     if (n < 1)
 	return 1;
     while(n--) {
-     if (cs > ll) {
-	cs = oldcs;
+     if (zlecs > zlell) {
+	zlecs = oldcs;
 	return 1;
      }
-     cs = findeol() + 1;
+     zlecs = findeol() + 1;
     }
     vilinerange = 1;
-    cut(bol, cs - bol - 1, 0);
-    cs = oldcs;
+    cut(bol, zlecs - bol - 1, 0);
+    zlecs = oldcs;
     return 0;
 }
 
@@ -478,7 +478,7 @@ vireplacechars(UNUSED(char **args))
 
     startvichange(1);
     /* check argument range */
-    if (n < 1 || n + cs > findeol()) {
+    if (n < 1 || n + zlecs > findeol()) {
 	if(vichgrepeat)
 	    vigetkey();
 	if(vichgflag) {
@@ -496,13 +496,13 @@ vireplacechars(UNUSED(char **args))
     /* do change */
     if (ch == '\r' || ch == '\n') {
 	/* <return> handled specially */
-	cs += n - 1;
+	zlecs += n - 1;
 	backkill(n - 1, 0);
-	line[cs++] = '\n';
+	zleline[zlecs++] = '\n';
     } else {
 	while (n--)
-	    line[cs++] = ch;
-	cs--;
+	    zleline[zlecs++] = ch;
+	zlecs--;
     }
     vichgflag = 0;
     return 0;
@@ -516,8 +516,8 @@ vicmdmode(UNUSED(char **args))
 	return 1;
     undoing = 1;
     vichgflag = 0;
-    if (cs != findbol())
-	cs--;
+    if (zlecs != findbol())
+	zlecs--;
     return 0;
 }
 
@@ -525,9 +525,9 @@ vicmdmode(UNUSED(char **args))
 int
 viopenlinebelow(UNUSED(char **args))
 {
-    cs = findeol();
+    zlecs = findeol();
     spaceinline(1);
-    line[cs++] = '\n';
+    zleline[zlecs++] = '\n';
     startvitext(1);
     clearlist = 1;
     return 0;
@@ -537,9 +537,9 @@ viopenlinebelow(UNUSED(char **args))
 int
 viopenlineabove(UNUSED(char **args))
 {
-    cs = findbol();
+    zlecs = findbol();
     spaceinline(1);
-    line[cs] = '\n';
+    zleline[zlecs] = '\n';
     startvitext(1);
     clearlist = 1;
     return 0;
@@ -554,17 +554,17 @@ vioperswapcase(UNUSED(char **args))
     /* get the range */
     startvichange(1);
     if ((c2 = getvirange(0)) != -1) {
-	oldcs = cs;
+	oldcs = zlecs;
 	/* swap the case of all letters within range */
-	while (cs < c2) {
-	    if (islower(line[cs]))
-		line[cs] = tuupper(line[cs]);
-	    else if (isupper(line[cs]))
-		line[cs] = tulower(line[cs]);
-	    cs++;
+	while (zlecs < c2) {
+	    if (islower(zleline[zlecs]))
+		zleline[zlecs] = tuupper(zleline[zlecs]);
+	    else if (isupper(zleline[zlecs]))
+		zleline[zlecs] = tulower(zleline[zlecs]);
+	    zlecs++;
 	}
 	/* go back to the first line of the range */
-	cs = oldcs;
+	zlecs = oldcs;
 	ret = 0;
 #if 0
 	vifirstnonblank();
@@ -601,7 +601,7 @@ virepeatchange(UNUSED(char **args))
 int
 viindent(UNUSED(char **args))
 {
-    int oldcs = cs, c2;
+    int oldcs = zlecs, c2;
 
     /* get the range */
     startvichange(1);
@@ -612,18 +612,18 @@ viindent(UNUSED(char **args))
     vichgflag = 0;
     /* must be a line range */
     if (!vilinerange) {
-	cs = oldcs;
+	zlecs = oldcs;
 	return 1;
     }
-    oldcs = cs;
+    oldcs = zlecs;
     /* add a tab to the beginning of each line within range */
-    while (cs < c2) {
+    while (zlecs < c2) {
 	spaceinline(1);
-	line[cs] = '\t';
-	cs = findeol() + 1;
+	zleline[zlecs] = '\t';
+	zlecs = findeol() + 1;
     }
     /* go back to the first line of the range */
-    cs = oldcs;
+    zlecs = oldcs;
     vifirstnonblank(zlenoargs);
     return 0;
 }
@@ -632,7 +632,7 @@ viindent(UNUSED(char **args))
 int
 viunindent(UNUSED(char **args))
 {
-    int oldcs = cs, c2;
+    int oldcs = zlecs, c2;
 
     /* get the range */
     startvichange(1);
@@ -643,18 +643,18 @@ viunindent(UNUSED(char **args))
     vichgflag = 0;
     /* must be a line range */
     if (!vilinerange) {
-	cs = oldcs;
+	zlecs = oldcs;
 	return 1;
     }
-    oldcs = cs;
+    oldcs = zlecs;
     /* remove a tab from the beginning of each line within range */
-    while (cs < c2) {
-	if (line[cs] == '\t')
+    while (zlecs < c2) {
+	if (zleline[zlecs] == '\t')
 	    foredel(1);
-	cs = findeol() + 1;
+	zlecs = findeol() + 1;
     }
     /* go back to the first line of the range */
-    cs = oldcs;
+    zlecs = oldcs;
     vifirstnonblank(zlenoargs);
     return 0;
 }
@@ -677,13 +677,13 @@ vibackwarddeletechar(char **args)
     }
     /* It is an error to be at the beginning of the line, or (in *
      * insert mode) to delete past the beginning of insertion.   */
-    if ((!invicmdmode() && cs - n < viinsbegin) || cs == findbol()) {
+    if ((!invicmdmode() && zlecs - n < viinsbegin) || zlecs == findbol()) {
 	return 1;
     }
     /* Put argument into the acceptable range -- it is not an error to  *
      * specify a greater count than the number of available characters. */
-    if (n > cs - findbol())
-	n = cs - findbol();
+    if (n > zlecs - findbol())
+	n = zlecs - findbol();
     /* do the deletion */
     backkill(n, 1);
     return 0;
@@ -693,9 +693,9 @@ vibackwarddeletechar(char **args)
 int
 vikillline(UNUSED(char **args))
 {
-    if (viinsbegin > cs)
+    if (viinsbegin > zlecs)
 	return 1;
-    backdel(cs - viinsbegin);
+    backdel(zlecs - viinsbegin);
     return 0;
 }
 
@@ -714,19 +714,19 @@ viputbefore(UNUSED(char **args))
     if (!buf->buf)
 	return 1;
     if(buf->flags & CUTBUFFER_LINE) {
-	cs = findbol();
+	zlecs = findbol();
 	spaceinline(buf->len + 1);
-	memcpy((char *)line + cs, buf->buf, buf->len);
-	line[cs + buf->len] = '\n';
+	memcpy((char *)zleline + zlecs, buf->buf, buf->len);
+	zleline[zlecs + buf->len] = '\n';
 	vifirstnonblank(zlenoargs);
     } else {
 	while (n--) {
 	    spaceinline(buf->len);
-	    memcpy((char *)line + cs, buf->buf, buf->len);
-	    cs += buf->len;
+	    memcpy((char *)zleline + zlecs, buf->buf, buf->len);
+	    zlecs += buf->len;
 	}
-	if (cs)
-	    cs--;
+	if (zlecs)
+	    zlecs--;
     }
     return 0;
 }
@@ -746,21 +746,21 @@ viputafter(UNUSED(char **args))
     if (!buf->buf)
 	return 1;
     if(buf->flags & CUTBUFFER_LINE) {
-	cs = findeol();
+	zlecs = findeol();
 	spaceinline(buf->len + 1);
-	line[cs++] = '\n';
-	memcpy((char *)line + cs, buf->buf, buf->len);
+	zleline[zlecs++] = '\n';
+	memcpy((char *)zleline + zlecs, buf->buf, buf->len);
 	vifirstnonblank(zlenoargs);
     } else {
-	if (cs != findeol())
-	    cs++;
+	if (zlecs != findeol())
+	    zlecs++;
 	while (n--) {
 	    spaceinline(buf->len);
-	    memcpy((char *)line + cs, buf->buf, buf->len);
-	    cs += buf->len;
+	    memcpy((char *)zleline + zlecs, buf->buf, buf->len);
+	    zlecs += buf->len;
 	}
-	if (cs)
-	    cs--;
+	if (zlecs)
+	    zlecs--;
     }
     return 0;
 }
@@ -772,16 +772,16 @@ vijoin(UNUSED(char **args))
     int x;
 
     startvichange(-1);
-    if ((x = findeol()) == ll)
+    if ((x = findeol()) == zlell)
 	return 1;
-    cs = x + 1;
-    for (x = 1; cs != ll && iblank(line[cs]); cs++, x++);
+    zlecs = x + 1;
+    for (x = 1; zlecs != zlell && iblank(zleline[zlecs]); zlecs++, x++);
     backdel(x);
-    if (cs && iblank(line[cs-1]))
-	cs--;
+    if (zlecs && iblank(zleline[zlecs-1]))
+	zlecs--;
     else {
 	spaceinline(1);
-	line[cs] = ' ';
+	zleline[zlecs] = ' ';
     }
     return 0;
 }
@@ -796,15 +796,15 @@ viswapcase(UNUSED(char **args))
     if (n < 1)
 	return 1;
     eol = findeol();
-    while (cs < eol && n--) {
-	if (islower(line[cs]))
-	    line[cs] = tuupper(line[cs]);
-	else if (isupper(line[cs]))
-	    line[cs] = tulower(line[cs]);
-	cs++;
-    }
-    if (cs && cs == eol)
-	cs--;
+    while (zlecs < eol && n--) {
+	if (islower(zleline[zlecs]))
+	    zleline[zlecs] = tuupper(zleline[zlecs]);
+	else if (isupper(zleline[zlecs]))
+	    zleline[zlecs] = tulower(zleline[zlecs]);
+	zlecs++;
+    }
+    if (zlecs && zlecs == eol)
+	zlecs--;
     return 0;
 }
 
@@ -846,7 +846,7 @@ visetbuffer(UNUSED(char **args))
 int
 vikilleol(UNUSED(char **args))
 {
-    int n = findeol() - cs;
+    int n = findeol() - zlecs;
 
     startvichange(-1);
     if (!n) {
@@ -854,7 +854,7 @@ vikilleol(UNUSED(char **args))
 	return 1;
     }
     /* delete to end of line */
-    forekill(findeol() - cs, 0);
+    forekill(findeol() - zlecs, 0);
     return 0;
 }
 
@@ -862,21 +862,21 @@ vikilleol(UNUSED(char **args))
 int
 vipoundinsert(UNUSED(char **args))
 {
-    int oldcs = cs;
+    int oldcs = zlecs;
 
     startvichange(-1);
     vifirstnonblank(zlenoargs);
-    if(line[cs] != '#') {
+    if(zleline[zlecs] != '#') {
 	spaceinline(1);
-	line[cs] = '#';
-	if(cs <= viinsbegin)
+	zleline[zlecs] = '#';
+	if(zlecs <= viinsbegin)
 	    viinsbegin++;
-	cs = oldcs + (cs <= oldcs);
+	zlecs = oldcs + (zlecs <= oldcs);
     } else {
 	foredel(1);
-	if (cs < viinsbegin)
+	if (zlecs < viinsbegin)
 	    viinsbegin--;
-	cs = oldcs - (cs < oldcs);
+	zlecs = oldcs - (zlecs < oldcs);
     }
     return 0;
 }
@@ -890,7 +890,7 @@ viquotedinsert(char **args)
 #endif
 
     spaceinline(1);
-    line[cs] = '^';
+    zleline[zlecs] = '^';
     zrefresh();
 #ifndef HAS_TIO
     sob = shttyinfo.sgttyb;
diff --git a/Src/Zle/zle_word.c b/Src/Zle/zle_word.c
index 5c096e5d3..ea8d31bc5 100644
--- a/Src/Zle/zle_word.c
+++ b/Src/Zle/zle_word.c
@@ -44,12 +44,12 @@ forwardword(char **args)
 	return ret;
     }
     while (n--) {
-	while (cs != ll && iword(line[cs]))
-	    cs++;
+	while (zlecs != zlell && iword(zleline[zlecs]))
+	    zlecs++;
 	if (wordflag && !n)
 	    return 0;
-	while (cs != ll && !iword(line[cs]))
-	    cs++;
+	while (zlecs != zlell && !iword(zleline[zlecs]))
+	    zlecs++;
     }
     return 0;
 }
@@ -68,16 +68,16 @@ viforwardword(char **args)
 	return ret;
     }
     while (n--) {
-	if (iident(line[cs]))
-	    while (cs != ll && iident(line[cs]))
-		cs++;
+	if (iident(zleline[zlecs]))
+	    while (zlecs != zlell && iident(zleline[zlecs]))
+		zlecs++;
 	else
-	    while (cs != ll && !iident(line[cs]) && !iblank(line[cs]))
-		cs++;
+	    while (zlecs != zlell && !iident(zleline[zlecs]) && !iblank(zleline[zlecs]))
+		zlecs++;
 	if (wordflag && !n)
 	    return 0;
-	while (cs != ll && (iblank(line[cs]) || line[cs] == '\n'))
-	    cs++;
+	while (zlecs != zlell && (iblank(zleline[zlecs]) || zleline[zlecs] == '\n'))
+	    zlecs++;
     }
     return 0;
 }
@@ -96,12 +96,12 @@ viforwardblankword(char **args)
 	return ret;
     }
     while (n--) {
-	while (cs != ll && !iblank(line[cs]))
-	    cs++;
+	while (zlecs != zlell && !iblank(zleline[zlecs]))
+	    zlecs++;
 	if (wordflag && !n)
 	    return 0;
-	while (cs != ll && iblank(line[cs]))
-	    cs++;
+	while (zlecs != zlell && iblank(zleline[zlecs]))
+	    zlecs++;
     }
     return 0;
 }
@@ -120,12 +120,12 @@ emacsforwardword(char **args)
 	return ret;
     }
     while (n--) {
-	while (cs != ll && !iword(line[cs]))
-	    cs++;
+	while (zlecs != zlell && !iword(zleline[zlecs]))
+	    zlecs++;
 	if (wordflag && !n)
 	    return 0;
-	while (cs != ll && iword(line[cs]))
-	    cs++;
+	while (zlecs != zlell && iword(zleline[zlecs]))
+	    zlecs++;
     }
     return 0;
 }
@@ -139,13 +139,13 @@ viforwardblankwordend(UNUSED(char **args))
     if (n < 0)
 	return 1;
     while (n--) {
-	while (cs != ll && iblank(line[cs + 1]))
-	    cs++;
-	while (cs != ll && !iblank(line[cs + 1]))
-	    cs++;
+	while (zlecs != zlell && iblank(zleline[zlecs + 1]))
+	    zlecs++;
+	while (zlecs != zlell && !iblank(zleline[zlecs + 1]))
+	    zlecs++;
     }
-    if (cs != ll && virangeflag)
-	cs++;
+    if (zlecs != zlell && virangeflag)
+	zlecs++;
     return 0;
 }
 
@@ -163,18 +163,18 @@ viforwardwordend(char **args)
 	return ret;
     }
     while (n--) {
-	if (iblank(line[cs + 1]))
-	    while (cs != ll && iblank(line[cs + 1]))
-		cs++;
-	if (iident(line[cs + 1]))
-	    while (cs != ll && iident(line[cs + 1]))
-		cs++;
+	if (iblank(zleline[zlecs + 1]))
+	    while (zlecs != zlell && iblank(zleline[zlecs + 1]))
+		zlecs++;
+	if (iident(zleline[zlecs + 1]))
+	    while (zlecs != zlell && iident(zleline[zlecs + 1]))
+		zlecs++;
 	else
-	    while (cs != ll && !iident(line[cs + 1]) && !iblank(line[cs + 1]))
-		cs++;
+	    while (zlecs != zlell && !iident(zleline[zlecs + 1]) && !iblank(zleline[zlecs + 1]))
+		zlecs++;
     }
-    if (cs != ll && virangeflag)
-	cs++;
+    if (zlecs != zlell && virangeflag)
+	zlecs++;
     return 0;
 }
 
@@ -192,10 +192,10 @@ backwardword(char **args)
 	return ret;
     }
     while (n--) {
-	while (cs && !iword(line[cs - 1]))
-	    cs--;
-	while (cs && iword(line[cs - 1]))
-	    cs--;
+	while (zlecs && !iword(zleline[zlecs - 1]))
+	    zlecs--;
+	while (zlecs && iword(zleline[zlecs - 1]))
+	    zlecs--;
     }
     return 0;
 }
@@ -214,14 +214,14 @@ vibackwardword(char **args)
 	return ret;
     }
     while (n--) {
-	while (cs && iblank(line[cs - 1]))
-	    cs--;
-	if (iident(line[cs - 1]))
-	    while (cs && iident(line[cs - 1]))
-		cs--;
+	while (zlecs && iblank(zleline[zlecs - 1]))
+	    zlecs--;
+	if (iident(zleline[zlecs - 1]))
+	    while (zlecs && iident(zleline[zlecs - 1]))
+		zlecs--;
 	else
-	    while (cs && !iident(line[cs - 1]) && !iblank(line[cs - 1]))
-		cs--;
+	    while (zlecs && !iident(zleline[zlecs - 1]) && !iblank(zleline[zlecs - 1]))
+		zlecs--;
     }
     return 0;
 }
@@ -240,10 +240,10 @@ vibackwardblankword(char **args)
 	return ret;
     }
     while (n--) {
-	while (cs && iblank(line[cs - 1]))
-	    cs--;
-	while (cs && !iblank(line[cs - 1]))
-	    cs--;
+	while (zlecs && iblank(zleline[zlecs - 1]))
+	    zlecs--;
+	while (zlecs && !iblank(zleline[zlecs - 1]))
+	    zlecs--;
     }
     return 0;
 }
@@ -262,10 +262,10 @@ emacsbackwardword(char **args)
 	return ret;
     }
     while (n--) {
-	while (cs && !iword(line[cs - 1]))
-	    cs--;
-	while (cs && iword(line[cs - 1]))
-	    cs--;
+	while (zlecs && !iword(zleline[zlecs - 1]))
+	    zlecs--;
+	while (zlecs && iword(zleline[zlecs - 1]))
+	    zlecs--;
     }
     return 0;
 }
@@ -274,7 +274,7 @@ emacsbackwardword(char **args)
 int
 backwarddeleteword(char **args)
 {
-    int x = cs, n = zmult;
+    int x = zlecs, n = zmult;
 
     if (n < 0) {
 	int ret;
@@ -284,12 +284,12 @@ backwarddeleteword(char **args)
 	return ret;
     }
     while (n--) {
-	while (x && !iword(line[x - 1]))
+	while (x && !iword(zleline[x - 1]))
 	    x--;
-	while (x && iword(line[x - 1]))
+	while (x && iword(zleline[x - 1]))
 	    x--;
     }
-    backdel(cs - x);
+    backdel(zlecs - x);
     return 0;
 }
 
@@ -297,23 +297,23 @@ backwarddeleteword(char **args)
 int
 vibackwardkillword(UNUSED(char **args))
 {
-    int x = cs, lim = (viinsbegin > findbol()) ? viinsbegin : findbol();
+    int x = zlecs, lim = (viinsbegin > findbol()) ? viinsbegin : findbol();
     int n = zmult;
 
     if (n < 0)
 	return 1;
 /* this taken from "vibackwardword" */
     while (n--) {
-	while ((x > lim) && iblank(line[x - 1]))
+	while ((x > lim) && iblank(zleline[x - 1]))
 	    x--;
-	if (iident(line[x - 1]))
-	    while ((x > lim) && iident(line[x - 1]))
+	if (iident(zleline[x - 1]))
+	    while ((x > lim) && iident(zleline[x - 1]))
 		x--;
 	else
-	    while ((x > lim) && !iident(line[x - 1]) && !iblank(line[x - 1]))
+	    while ((x > lim) && !iident(zleline[x - 1]) && !iblank(zleline[x - 1]))
 		x--;
     }
-    backkill(cs - x, 1);
+    backkill(zlecs - x, 1);
     return 0;
 }
 
@@ -321,7 +321,7 @@ vibackwardkillword(UNUSED(char **args))
 int
 backwardkillword(char **args)
 {
-    int x = cs;
+    int x = zlecs;
     int n = zmult;
 
     if (n < 0) {
@@ -332,12 +332,12 @@ backwardkillword(char **args)
 	return ret;
     }
     while (n--) {
-	while (x && !iword(line[x - 1]))
+	while (x && !iword(zleline[x - 1]))
 	    x--;
-	while (x && iword(line[x - 1]))
+	while (x && iword(zleline[x - 1]))
 	    x--;
     }
-    backkill(cs - x, 1);
+    backkill(zlecs - x, 1);
     return 0;
 }
 
@@ -346,20 +346,20 @@ int
 upcaseword(UNUSED(char **args))
 {
     int n = zmult;
-    int neg = n < 0, ocs = cs;
+    int neg = n < 0, ocs = zlecs;
 
     if (neg)
 	n = -n;
     while (n--) {
-	while (cs != ll && !iword(line[cs]))
-	    cs++;
-	while (cs != ll && iword(line[cs])) {
-	    line[cs] = tuupper(line[cs]);
-	    cs++;
+	while (zlecs != zlell && !iword(zleline[zlecs]))
+	    zlecs++;
+	while (zlecs != zlell && iword(zleline[zlecs])) {
+	    zleline[zlecs] = tuupper(zleline[zlecs]);
+	    zlecs++;
 	}
     }
     if (neg)
-	cs = ocs;
+	zlecs = ocs;
     return 0;
 }
 
@@ -368,20 +368,20 @@ int
 downcaseword(UNUSED(char **args))
 {
     int n = zmult;
-    int neg = n < 0, ocs = cs;
+    int neg = n < 0, ocs = zlecs;
 
     if (neg)
 	n = -n;
     while (n--) {
-	while (cs != ll && !iword(line[cs]))
-	    cs++;
-	while (cs != ll && iword(line[cs])) {
-	    line[cs] = tulower(line[cs]);
-	    cs++;
+	while (zlecs != zlell && !iword(zleline[zlecs]))
+	    zlecs++;
+	while (zlecs != zlell && iword(zleline[zlecs])) {
+	    zleline[zlecs] = tulower(zleline[zlecs]);
+	    zlecs++;
 	}
     }
     if (neg)
-	cs = ocs;
+	zlecs = ocs;
     return 0;
 }
 
@@ -390,24 +390,24 @@ int
 capitalizeword(UNUSED(char **args))
 {
     int first, n = zmult;
-    int neg = n < 0, ocs = cs;
+    int neg = n < 0, ocs = zlecs;
 
     if (neg)
 	n = -n;
     while (n--) {
 	first = 1;
-	while (cs != ll && !iword(line[cs]))
-	    cs++;
-	while (cs != ll && iword(line[cs]) && !isalpha(line[cs]))
-	    cs++;
-	while (cs != ll && iword(line[cs])) {
-	    line[cs] = (first) ? tuupper(line[cs]) : tulower(line[cs]);
+	while (zlecs != zlell && !iword(zleline[zlecs]))
+	    zlecs++;
+	while (zlecs != zlell && iword(zleline[zlecs]) && !isalpha(zleline[zlecs]))
+	    zlecs++;
+	while (zlecs != zlell && iword(zleline[zlecs])) {
+	    zleline[zlecs] = (first) ? tuupper(zleline[zlecs]) : tulower(zleline[zlecs]);
 	    first = 0;
-	    cs++;
+	    zlecs++;
 	}
     }
     if (neg)
-	cs = ocs;
+	zlecs = ocs;
     return 0;
 }
 
@@ -415,7 +415,7 @@ capitalizeword(UNUSED(char **args))
 int
 deleteword(char **args)
 {
-    int x = cs;
+    int x = zlecs;
     int n = zmult;
 
     if (n < 0) {
@@ -426,12 +426,12 @@ deleteword(char **args)
 	return ret;
     }
     while (n--) {
-	while (x != ll && !iword(line[x]))
+	while (x != zlell && !iword(zleline[x]))
 	    x++;
-	while (x != ll && iword(line[x]))
+	while (x != zlell && iword(zleline[x]))
 	    x++;
     }
-    foredel(x - cs);
+    foredel(x - zlecs);
     return 0;
 }
 
@@ -439,7 +439,7 @@ deleteword(char **args)
 int
 killword(char **args)
 {
-    int x = cs;
+    int x = zlecs;
     int n = zmult;
 
     if (n < 0) {
@@ -450,12 +450,12 @@ killword(char **args)
 	return ret;
     }
     while (n--) {
-	while (x != ll && !iword(line[x]))
+	while (x != zlell && !iword(zleline[x]))
 	    x++;
-	while (x != ll && iword(line[x]))
+	while (x != zlell && iword(zleline[x]))
 	    x++;
     }
-    forekill(x - cs, 0);
+    forekill(x - zlecs, 0);
     return 0;
 }
 
@@ -463,39 +463,39 @@ killword(char **args)
 int
 transposewords(UNUSED(char **args))
 {
-    int p1, p2, p3, p4, x = cs;
+    int p1, p2, p3, p4, x = zlecs;
     char *temp, *pp;
     int n = zmult;
-    int neg = n < 0, ocs = cs;
+    int neg = n < 0, ocs = zlecs;
 
     if (neg)
 	n = -n;
     while (n--) {
-	while (x != ll && line[x] != '\n' && !iword(line[x]))
+	while (x != zlell && zleline[x] != '\n' && !iword(zleline[x]))
 	    x++;
-	if (x == ll || line[x] == '\n') {
-	    x = cs;
-	    while (x && line[x - 1] != '\n' && !iword(line[x]))
+	if (x == zlell || zleline[x] == '\n') {
+	    x = zlecs;
+	    while (x && zleline[x - 1] != '\n' && !iword(zleline[x]))
 		x--;
-	    if (!x || line[x - 1] == '\n')
+	    if (!x || zleline[x - 1] == '\n')
 		return 1;
 	}
-	for (p4 = x; p4 != ll && iword(line[p4]); p4++);
-	for (p3 = p4; p3 && iword(line[p3 - 1]); p3--);
+	for (p4 = x; p4 != zlell && iword(zleline[p4]); p4++);
+	for (p3 = p4; p3 && iword(zleline[p3 - 1]); p3--);
 	if (!p3)
 	    return 1;
-	for (p2 = p3; p2 && !iword(line[p2 - 1]); p2--);
+	for (p2 = p3; p2 && !iword(zleline[p2 - 1]); p2--);
 	if (!p2)
 	    return 1;
-	for (p1 = p2; p1 && iword(line[p1 - 1]); p1--);
+	for (p1 = p2; p1 && iword(zleline[p1 - 1]); p1--);
 	pp = temp = (char *)zhalloc(p4 - p1 + 1);
-	struncpy(&pp, (char *) line + p3, p4 - p3);
-	struncpy(&pp, (char *) line + p2, p3 - p2);
-	struncpy(&pp, (char *) line + p1, p2 - p1);
-	strncpy((char *)line + p1, temp, p4 - p1);
-	cs = p4;
+	struncpy(&pp, (char *) zleline + p3, p4 - p3);
+	struncpy(&pp, (char *) zleline + p2, p3 - p2);
+	struncpy(&pp, (char *) zleline + p1, p2 - p1);
+	strncpy((char *)zleline + p1, temp, p4 - p1);
+	zlecs = p4;
     }
     if (neg)
-	cs = ocs;
+	zlecs = ocs;
     return 0;
 }
diff --git a/Src/builtin.c b/Src/builtin.c
index a3e7149d9..1ccbd6fb8 100644
--- a/Src/builtin.c
+++ b/Src/builtin.c
@@ -4379,7 +4379,7 @@ bin_read(char *name, char **args, Options ops, UNUSED(int func))
 
     /* handle compctl case */
     if(OPT_ISSET(ops,'l') || OPT_ISSET(ops,'c'))
-	return compctlread(name, args, ops, reply);
+	return compctlreadptr(name, args, ops, reply);
 
     if ((OPT_ISSET(ops,'k') && !OPT_ISSET(ops,'u') && 
 	 !OPT_ISSET(ops,'p')) || OPT_ISSET(ops,'q')) {
diff --git a/Src/exec.c b/Src/exec.c
index b5332d81a..b718903ab 100644
--- a/Src/exec.c
+++ b/Src/exec.c
@@ -1167,7 +1167,7 @@ execpline(Estate state, wordcode slcode, int how, int last1)
 		    pipe(synch);
 
 		    if ((pid = zfork(&bgtime)) == -1) {
-			trashzle();
+			trashzleptr();
 			close(synch[0]);
 			close(synch[1]);
 			fprintf(stderr, "zsh: job can't be suspended\n");
diff --git a/Src/hist.c b/Src/hist.c
index 4e1a23c2a..33c5ccfd9 100644
--- a/Src/hist.c
+++ b/Src/hist.c
@@ -220,21 +220,20 @@ iaddtoline(int c)
 	return;
     if (qbang && c == bangchar && stophist < 2) {
 	exlast--;
-	spaceinline(1);
-	line[cs++] = '\\';
+	zleaddtolineptr('\\');
     }
-    if (excs > cs) {
+    if (excs > zlecs) {
 	excs += 1 + inbufct - exlast;
-	if (excs < cs)
+	if (excs < zlecs)
 	    /* this case could be handled better but it is    *
 	     * so rare that it does not worth it              */
-	    excs = cs;
+	    excs = zlecs;
     }
     exlast = inbufct;
-    spaceinline(1);
-    line[cs++] = itok(c) ? ztokens[c - Pound] : c;
+    zleaddtolineptr(itok(c) ? ztokens[c - Pound] : c);
 }
 
+
 static int
 ihgetc(void)
 {
@@ -663,8 +662,8 @@ ihungetc(int c)
 	    hungetc('\n'), hungetc('\\');
 
 	if (expanding) {
-	    cs--;
-	    ll--;
+	    zlecs--;
+	    zlell--;
 	    exlast++;
 	}
 	DPUTS(hptr <= chline, "BUG: hungetc attempted at buffer start");
@@ -2231,7 +2230,7 @@ histfileIsLocked(void)
 mod_export LinkList
 bufferwords(LinkList list, char *buf, int *index)
 {
-    int num = 0, cur = -1, got = 0, ne = noerrs, ocs = cs, oll = ll;
+    int num = 0, cur = -1, got = 0, ne = noerrs, ocs = zlecs, oll = zlell;
     int owb = wb, owe = we, oadx = addedx, ozp = zleparse, onc = nocomments;
     int ona = noaliases;
     char *p;
@@ -2251,26 +2250,46 @@ bufferwords(LinkList list, char *buf, int *index)
 	p[l] = ' ';
 	p[l + 1] = '\0';
 	inpush(p, 0, NULL);
-	cs = strlen(p) + 1;
+	zlell = strlen(p) ;
+	zlecs = zlell + 1;
 	nocomments = 1;
-    } else if (!isfirstln && chline) {
-	p = (char *) zhalloc(hptr - chline + ll + 2);
-	memcpy(p, chline, hptr - chline);
-	memcpy(p + (hptr - chline), line, ll);
-	p[(hptr - chline) + ll] = ' ';
-	p[(hptr - chline) + ll + 1] = '\0';
-	inpush(p, 0, NULL);
-	cs += hptr - chline;
     } else {
-	p = (char *) zhalloc(ll + 2);
-	memcpy(p, line, ll);
-	p[ll] = ' ';
-	p[ll + 1] = '\0';
-	inpush(p, 0, NULL);
+	int ll, cs;
+	char *linein;
+
+	if (zlegetlineptr) {
+	    linein = zlegetlineptr(&ll, &cs);
+	} else {
+	    linein = "";
+	    ll = cs = 0;
+	}
+	zlell = ll + 1; /* length of line plus space added below */
+	zlecs = cs;
+
+	if (!isfirstln && chline) {
+	    p = (char *) zhalloc(hptr - chline + ll + 2);
+	    memcpy(p, chline, hptr - chline);
+	    memcpy(p + (hptr - chline), linein, ll);
+	    p[(hptr - chline) + ll] = ' ';
+	    p[(hptr - chline) + zlell] = '\0';
+	    inpush(p, 0, NULL);
+
+	    /*
+	     * advance line length and character position over
+	     * prepended string.
+	     */
+	    zlell += hptr - chline;
+	    zlecs += hptr - chline;
+	} else {
+	    p = (char *) zhalloc(ll + 2);
+	    memcpy(p, linein, ll);
+	    p[ll] = ' ';
+	    p[zlell] = '\0';
+	    inpush(p, 0, NULL);
+	}
     }
-    ll = strlen(p);
-    if (cs)
-	cs--;
+    if (zlecs)
+	zlecs--;
     strinbeg(0);
     noaliases = 1;
     do {
@@ -2326,8 +2345,8 @@ bufferwords(LinkList list, char *buf, int *index)
     nocomments = onc;
     noerrs = ne;
     lexrestore();
-    cs = ocs;
-    ll = oll;
+    zlecs = ocs;
+    zlell = oll;
     wb = owb;
     we = owe;
     addedx = oadx;
diff --git a/Src/init.c b/Src/init.c
index 370f93782..b7b7cfc3c 100644
--- a/Src/init.c
+++ b/Src/init.c
@@ -1123,9 +1123,11 @@ noop_function_int(UNUSED(int nothing))
 /**/
 mod_export ZleVoidFn trashzleptr = noop_function;
 /**/
-mod_export ZleVoidFn refreshptr = noop_function;
+mod_export ZleVoidFn zrefreshptr = noop_function;
 /**/
-mod_export ZleVoidIntFn spaceinlineptr = noop_function_int;
+mod_export ZleVoidIntFn zleaddtolineptr = noop_function_int;
+/**/
+mod_export ZleGetLineFn zlegetlineptr = NULL;
 /**/
 mod_export ZleReadFn zlereadptr = autoload_zleread;
 /**/
@@ -1134,8 +1136,9 @@ mod_export ZleVoidIntFn zlesetkeymapptr = noop_function_int;
 #else /* !LINKED_XMOD_zshQszle */
 
 mod_export ZleVoidFn trashzleptr = noop_function;
-mod_export ZleVoidFn refreshptr = noop_function;
-mod_export ZleVoidIntFn spaceinlineptr = noop_function_int;
+mod_export ZleVoidFn zrefreshptr = noop_function;
+mod_export ZleVoidIntFn zleaddtolineptr = noop_function_int;
+mod_export ZleGetLineFn zlegetlineptr = NULL;
 # ifdef UNLINKED_XMOD_zshQszle
 mod_export ZleReadFn zlereadptr = autoload_zleread;
 mod_export ZleVoidIntFn zlesetkeymapptr = autoload_zlesetkeymap;
@@ -1153,7 +1156,7 @@ autoload_zleread(char **lp, char **rp, int ha, int con)
     zlereadptr = fallback_zleread;
     if (load_module("zsh/zle"))
 	load_module("zsh/compctl");
-    return zleread(lp, rp, ha, con);
+    return zlereadptr(lp, rp, ha, con);
 }
 
 /**/
diff --git a/Src/input.c b/Src/input.c
index 739c7cf42..ef3472259 100644
--- a/Src/input.c
+++ b/Src/input.c
@@ -275,8 +275,8 @@ inputline(void)
 	int flags = ZLRF_HISTORY|ZLRF_NOSETTY;
 	if (isset(IGNOREEOF))
 	    flags |= ZLRF_IGNOREEOF;
-	ingetcline = (char *)zleread(ingetcpmptl, ingetcpmptr, flags,
-				     context);
+	ingetcline = (char *)zlereadptr(ingetcpmptl, ingetcpmptr, flags,
+					context);
 	histdone |= HISTFLAG_SETTY;
     }
     if (!ingetcline) {
diff --git a/Src/jobs.c b/Src/jobs.c
index cb9e5422c..429485b9e 100644
--- a/Src/jobs.c
+++ b/Src/jobs.c
@@ -439,7 +439,7 @@ update_job(Job jn)
     if ((isset(NOTIFY) || job == thisjob) && (jn->stat & STAT_LOCKED)) {
 	printjob(jn, !!isset(LONGLISTJOBS), 0);
 	if (zleactive)
-	    zrefresh();
+	    zrefreshptr();
     }
     if (sigtrapped[SIGCHLD] && job != thisjob)
 	dotrap(SIGCHLD);
@@ -854,7 +854,7 @@ printjob(Job jn, int lng, int synch)
 	Process qn;
 
 	if (!synch)
-	    trashzle();
+	    trashzleptr();
 	if (doputnl && !synch)
 	    putc('\n', fout);
 	for (pn = jn->procs; pn;) {
diff --git a/Src/lex.c b/Src/lex.c
index 952daf14d..482090ad1 100644
--- a/Src/lex.c
+++ b/Src/lex.c
@@ -71,16 +71,12 @@ int inalmore;
 /**/
 int nocorrect;
 
-/* the line buffer */
-
-/**/
-mod_export unsigned char *line;
-
-/* cursor position and line length */
-/* N.B.: must use the real names here, for the .export file */
+/*
+ * Cursor position and line length in zle
+ */
 
 /**/
-mod_export int zshcs, zshll;
+mod_export int zlecs, zlell;
 
 /* inwhat says what exactly we are in     *
  * (its value is one of the IN_* things). */
@@ -525,10 +521,10 @@ add(int c)
     }
 }
 
-#define SETPARBEGIN {if (zleparse && !(inbufflags & INP_ALIAS) && cs >= ll+1-inbufct) parbegin = inbufct;}
+#define SETPARBEGIN {if (zleparse && !(inbufflags & INP_ALIAS) && zlecs >= zlell+1-inbufct) parbegin = inbufct;}
 #define SETPAREND {\
 	    if (zleparse && !(inbufflags & INP_ALIAS) && parbegin != -1 && parend == -1) {\
-		if (cs >= ll + 1 - inbufct)\
+		if (zlecs >= zlell + 1 - inbufct)\
 		    parbegin = -1;\
 		else\
 		    parend = inbufct;} }
@@ -1297,7 +1293,7 @@ dquote_parse(char endchar, int sub)
     int pct = 0, brct = 0, bct = 0, intick = 0, err = 0;
     int c;
     int math = endchar == ')' || endchar == ']';
-    int zlemath = math && cs > ll + addedx - inbufct;
+    int zlemath = math && zlecs > zlell + addedx - inbufct;
 
     while (((c = hgetc()) != endchar || bct ||
 	    (math && ((pct > 0) || (brct > 0))) ||
@@ -1424,7 +1420,7 @@ dquote_parse(char endchar, int sub)
 	err = intick || endchar || err;
     else if (err == 1)
 	err = c;
-    if (zlemath && cs <= ll + 1 - inbufct)
+    if (zlemath && zlecs <= zlell + 1 - inbufct)
 	inwhat = IN_MATH;
     return err;
 }
@@ -1553,9 +1549,9 @@ parse_subst_string(char *s)
 mod_export void
 gotword(void)
 {
-    we = ll + 1 - inbufct + (addedx == 2 ? 1 : 0);
-    if (cs <= we) {
-	wb = ll - wordbeg + addedx;
+    we = zlell + 1 - inbufct + (addedx == 2 ? 1 : 0);
+    if (zlecs <= we) {
+	wb = zlell - wordbeg + addedx;
 	zleparse = 0;
     }
 }
diff --git a/Src/loop.c b/Src/loop.c
index 7e74f1783..bb45690a7 100644
--- a/Src/loop.c
+++ b/Src/loop.c
@@ -245,7 +245,7 @@ execselect(Estate state, UNUSED(int do_exec))
 		    int oef = errflag;
 
 		    isfirstln = 1;
-		    str = (char *)zleread(&prompt3, NULL, 0, ZLCON_SELECT);
+		    str = (char *)zlereadptr(&prompt3, NULL, 0, ZLCON_SELECT);
 		    if (errflag)
 			str = NULL;
 		    errflag = oef;
@@ -314,7 +314,7 @@ selectlist(LinkList l, size_t start)
     LinkNode n;
     char **arr, **ap;
 
-    trashzle();
+    trashzleptr();
     ct = countlinknodes(l);
     ap = arr = (char **) zhalloc((countlinknodes(l) + 1) * sizeof(char **));
 
diff --git a/Src/params.c b/Src/params.c
index 6ebbf58bd..7fdc66f91 100644
--- a/Src/params.c
+++ b/Src/params.c
@@ -729,7 +729,7 @@ createparamtable(void)
 /* assign various functions used for non-special parameters */
 
 /**/
-static void
+mod_export void
 assigngetset(Param pm)
 {
     switch (PM_TYPE(pm->flags)) {
diff --git a/Src/signals.c b/Src/signals.c
index 785ff159e..53520aa4a 100644
--- a/Src/signals.c
+++ b/Src/signals.c
@@ -1084,7 +1084,7 @@ dotrapargs(int sig, int *sigtr, void *sigfn)
      * need to restore the display.
      */
     if (zleactive && resetneeded)
-	zrefresh();
+	zrefreshptr();
 
     if (*sigtr != ZSIG_IGNORED)
 	*sigtr &= ~ZSIG_IGNORED;
diff --git a/Src/system.h b/Src/system.h
index ccb125088..0fec678d3 100644
--- a/Src/system.h
+++ b/Src/system.h
@@ -635,12 +635,6 @@ extern char PC, *BC, *UP;
 extern short ospeed;
 #endif
 
-/* Rename some global zsh variables to avoid *
- * possible name clashes with libc           */
-
-#define cs zshcs
-#define ll zshll
-
 #ifndef O_NOCTTY
 # define O_NOCTTY 0
 #endif
@@ -687,3 +681,46 @@ extern short ospeed;
 #else
 #define UNUSED(x) x
 #endif
+
+/*
+ * This is a subset of ZLE_UNICODE_SUPPORT.  It is not all that likely
+ * that only the subset is supported, however it's easy to make the
+ * \u and \U escape sequences work with just the following.
+ */
+#if defined(HAVE_WCHAR_H) && defined(HAVE_WCTOMB) && defined (__STDC_ISO_10646__)
+# include <wchar.h>
+
+/*
+ * More stringent requirements to enable complete Unicode conversion
+ * between wide characters and multibyte strings.
+ */
+#if defined(HAVE_MBRTOWC) && defined(HAVE_WCRTOMB)
+/*#define ZLE_UNICODE_SUPPORT	1*/
+#endif
+#else
+# ifdef HAVE_LANGINFO_H
+#   include <langinfo.h>
+#   if defined(HAVE_ICONV) || defined(HAVE_LIBICONV)
+#     include <iconv.h>
+#   endif
+# endif
+#endif
+
+#ifdef ZLE_UNICODE_SUPPORT
+typedef wchar_t ZLE_CHAR_T;
+typedef wchar_t *ZLE_STRING_T;
+
+/*
+ * MB_CUR_MAX is the maximum number of bytes that a single wide
+ * character will convert into.  We use it to keep strings
+ * sufficiently long.  It should always be defined, but if it isn't
+ * just assume we are using Unicode which requires 6 characters.
+ * (Note that it's not necessarily defined to a constant.)
+ */
+#ifndef MB_CUR_MAX
+#define MB_CUR_MAX 6
+#endif
+#else
+typedef int ZLE_CHAR_T;
+typedef unsigned char *ZLE_STRING_T;
+#endif
diff --git a/Src/utils.c b/Src/utils.c
index 20eef2ac6..21416a535 100644
--- a/Src/utils.c
+++ b/Src/utils.c
@@ -30,17 +30,6 @@
 #include "zsh.mdh"
 #include "utils.pro"
 
-#if defined(HAVE_WCHAR_H) && defined(HAVE_WCTOMB) && defined (__STDC_ISO_10646__)
-# include <wchar.h>
-#else
-# ifdef HAVE_LANGINFO_H 			       
-#   include <langinfo.h>			       
-#   if defined(HAVE_ICONV) || defined(HAVE_LIBICONV)   
-#     include <iconv.h> 			       
-#   endif					       
-# endif 					       
-#endif
-
 /* name of script being sourced */
 
 /**/
@@ -79,7 +68,7 @@ zwarn(const char *fmt, const char *str, int num)
     if (errflag || noerrs)
 	return;
     if (isatty(2))
-	trashzle();
+	trashzleptr();
     /*
      * scriptname is set when sourcing scripts, so that we get the
      * correct name instead of the generic name of whatever
@@ -102,7 +91,7 @@ zwarnnam(const char *cmd, const char *fmt, const char *str, int num)
     }
     if (errflag || noerrs)
 	return;
-    trashzle();
+    trashzleptr();
     if (unset(SHINSTDIN) || locallevel) {
 	nicezputs(scriptname ? scriptname : argzero, stderr);
 	fputc((unsigned char)':', stderr);
@@ -1054,7 +1043,7 @@ adjustwinsize(int from)
 	winchanged =
 #endif /* TIOCGWINSZ */
 	    resetneeded = 1;
-	zrefresh();
+	zrefreshptr();
     }
 }
 
diff --git a/Src/zsh.h b/Src/zsh.h
index 5e0fee09b..5d2f401f5 100644
--- a/Src/zsh.h
+++ b/Src/zsh.h
@@ -27,13 +27,6 @@
  *
  */
 
-#define trashzle()      trashzleptr()
-#define zleread(X,Y,H,C)  zlereadptr(X,Y,H,C)
-#define spaceinline(X)  spaceinlineptr(X)
-#define zrefresh()      refreshptr()
-
-#define compctlread(N,A,O,R) compctlreadptr(N,A,O,R)
-
 /* A few typical macros */
 #define minimum(a,b)  ((a) < (b) ? (a) : (b))
 
@@ -1849,7 +1842,8 @@ typedef int (*CompctlReadFn) _((char *, char **, Options, char *));
 
 typedef void (*ZleVoidFn) _((void));
 typedef void (*ZleVoidIntFn) _((int));
-typedef unsigned char * (*ZleReadFn) _((char **, char **, int, int));
+typedef unsigned char *(*ZleReadFn) _((char **, char **, int, int));
+typedef unsigned char *(*ZleGetLineFn) _((int *, int *));
 
 /***************************************/
 /* Hooks in core.                      */
diff --git a/configure.ac b/configure.ac
index 3bb6e3b35..8f857e1a8 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1054,7 +1054,7 @@ AC_CHECK_FUNCS(strftime difftime gettimeofday \
 	       pcre_compile pcre_study pcre_exec \
 	       nl_langinfo \
 	       erand48 open_memstream \
-	       wctomb iconv \
+	       wctomb mbrtowc wcrtomb iconv \
 	       grantpt unlockpt ptsname \
 	       htons ntohs)
 AC_FUNC_STRCOLL