about summary refs log tree commit diff
path: root/Src
diff options
context:
space:
mode:
Diffstat (limited to 'Src')
-rw-r--r--Src/Zle/compresult.c8
-rw-r--r--Src/Zle/zle.h4
-rw-r--r--Src/Zle/zle_misc.c65
3 files changed, 59 insertions, 18 deletions
diff --git a/Src/Zle/compresult.c b/Src/Zle/compresult.c
index e595802dd..43733b0c6 100644
--- a/Src/Zle/compresult.c
+++ b/Src/Zle/compresult.c
@@ -1011,7 +1011,7 @@ do_single(Cmatch m)
 		    stringaszleline(m->suf, 0, &len, NULL, NULL);
 		makesuffixstr(m->remf, m->rems, len);
 		if (len == 1)
-		    addsuffix(SUFTYP_POSSTR, wsuf, 1, 1);
+		    addsuffix(SUFTYP_POSSTR, 0, wsuf, 1, 1);
 		free(wsuf);
 	    }
 	}
@@ -1104,7 +1104,7 @@ do_single(Cmatch m)
 			makesuffixstr(m->remf, m->rems, 1);
 		    else if (isset(AUTOREMOVESLASH)) {
 			makesuffix(1);
-			addsuffix(SUFTYP_POSSTR, ZWS("/"), 1, 1);
+			addsuffix(SUFTYP_POSSTR, 0, ZWS("/"), 1, 1);
 		    }
 		}
 	    }
@@ -1119,7 +1119,7 @@ do_single(Cmatch m)
 	    /* If a suffix was added, and is removable, let *
 	     * `,' and `}' remove it.                       */
 	    if (isset(AUTOPARAMKEYS))
-		addsuffix(SUFTYP_POSSTR, ZWS(",}"), 2, suffixnoinslen);
+		addsuffix(SUFTYP_POSSTR, 0, ZWS(",}"), 2, suffixnoinslen);
 	} else if (!menucmp) {
 	    /*{{*/
 	    /* Otherwise, add a `,' suffix, and let `}' remove it. */
@@ -1129,7 +1129,7 @@ do_single(Cmatch m)
 	    minfo.insc++;
 	    makesuffix(1);
 	    if ((!menucmp || minfo.we) && isset(AUTOPARAMKEYS))
-		addsuffix(SUFTYP_POSSTR, ZWS(",}"), 2, 1);
+		addsuffix(SUFTYP_POSSTR, 0, ZWS(",}"), 2, 1);
 	}
     } else if (!havesuff && (!(m->flags & CMF_FILE) || !sr)) {
 	/* If we didn't add a suffix, add a space, unless we are *
diff --git a/Src/Zle/zle.h b/Src/Zle/zle.h
index 1fd6d87a2..577a4442f 100644
--- a/Src/Zle/zle.h
+++ b/Src/Zle/zle.h
@@ -380,6 +380,10 @@ enum suffixtype {
     SUFTYP_NEGRNG		/* Range of characters not to match */
 };
 
+/* Additional flags to suffixes */
+enum suffixflags {
+    SUFFLAGS_SPACE = 0x0001	/* Add a space when removing suffix */
+};
 
 #ifdef MULTIBYTE_SUPPORT
 /*
diff --git a/Src/Zle/zle_misc.c b/Src/Zle/zle_misc.c
index 961776f43..0beb43d6d 100644
--- a/Src/Zle/zle_misc.c
+++ b/Src/Zle/zle_misc.c
@@ -1232,6 +1232,7 @@ struct suffixset;
 struct suffixset {
     struct suffixset *next;	/* Next in the list */
     int tp;			/* The SUFTYP_* from enum suffixtype */
+    int flags;			/* Some of SUFFLAGS_* */
     ZLE_STRING_T chars;		/* Set of characters to match (or not) */
     int lenstr;			/* Length of chars */
     int lensuf;			/* Length of suffix */
@@ -1255,13 +1256,14 @@ suffixnoinslen;
 
 /**/
 mod_export void
-addsuffix(int tp, ZLE_STRING_T chars, int lenstr, int lensuf)
+addsuffix(int tp, int flags, ZLE_STRING_T chars, int lenstr, int lensuf)
 {
     struct suffixset *newsuf = zalloc(sizeof(struct suffixset));
     newsuf->next = suffixlist;
     suffixlist = newsuf;
 
     newsuf->tp = tp;
+    newsuf->flags = flags;
     if (lenstr) {
 	newsuf->chars = zalloc(lenstr*sizeof(ZLE_CHAR_T));
 	ZS_memcpy(newsuf->chars, chars, lenstr);
@@ -1271,6 +1273,24 @@ addsuffix(int tp, ZLE_STRING_T chars, int lenstr, int lensuf)
     newsuf->lensuf = lensuf;
 }
 
+
+/* Same as addsuffix, but from metafied string */
+
+/**/
+mod_export void
+addsuffixstring(int tp, int flags, char *chars, int lensuf)
+{
+    int slen, alloclen;
+    ZLE_STRING_T suffixstr;
+
+    /* string needs to be writable... I've been regretting this for years.. */
+    chars = ztrdup(chars);
+    suffixstr = stringaszleline(chars, 0, &slen, &alloclen, NULL);
+    addsuffix(tp, flags, suffixstr, slen, lensuf);
+    zfree(suffixstr, alloclen);
+    zsfree(chars);
+}
+
 /* Set up suffix: the last n characters are a suffix that should be *
  * removed in the usual word end conditions.                        */
 
@@ -1278,7 +1298,17 @@ addsuffix(int tp, ZLE_STRING_T chars, int lenstr, int lensuf)
 mod_export void
 makesuffix(int n)
 {
-    addsuffix(SUFTYP_POSSTR, ZWS(" \t\n;&|"), 6, n);
+    char *suffixchars;
+
+    if (!(suffixchars = getsparam("ZLE_REMOVE_SUFFIX_CHARS")))
+	suffixchars = " \t\n;&|";
+
+    addsuffixstring(SUFTYP_POSSTR, 0, suffixchars, n);
+
+    /* Do this second so it takes precedence */
+    if ((suffixchars = getsparam("ZLE_SPACE_SUFFIX_CHARS")) && *suffixchars)
+	addsuffixstring(SUFTYP_POSSTR, SUFFLAGS_SPACE, suffixchars, n);
+
     suffixnoinslen = n;
 }
 
@@ -1301,7 +1331,7 @@ makeparamsuffix(int br, int n)
 	    lenstr += 6;
     }
     if (lenstr)
-	addsuffix(SUFTYP_POSSTR, charstr, lenstr, n);
+	addsuffix(SUFTYP_POSSTR, 0, charstr, lenstr, n);
 }
 
 /* Set up suffix given a string containing the characters on which to   *
@@ -1344,11 +1374,11 @@ makesuffixstr(char *f, char *s, int n)
 		ZLE_CHAR_T str[2];
 
 		if (wptr > lasts)
-		    addsuffix(inv ? SUFTYP_NEGSTR : SUFTYP_POSSTR,
+		    addsuffix(inv ? SUFTYP_NEGSTR : SUFTYP_POSSTR, 0,
 			      lasts, wptr - lasts, n);
 		str[0] = *wptr;
 		str[1] = wptr[2];
-		addsuffix(inv ? SUFTYP_NEGRNG : SUFTYP_POSRNG,
+		addsuffix(inv ? SUFTYP_NEGRNG : SUFTYP_POSRNG, 0,
 			  str, 2, n);
 
 		wptr += 3;
@@ -1360,7 +1390,7 @@ makesuffixstr(char *f, char *s, int n)
 	    }
 	}
 	if (wptr > lasts)
-	    addsuffix(inv ? SUFTYP_NEGSTR : SUFTYP_POSSTR,
+	    addsuffix(inv ? SUFTYP_NEGSTR : SUFTYP_POSSTR, 0,
 		      lasts, wptr - lasts, n);
 	free(ws);
     } else
@@ -1410,7 +1440,7 @@ iremovesuffix(ZLE_INT_T c, int keep)
 	zsfree(suffixfunc);
 	suffixfunc = NULL;
     } else {
-	int sl = 0;
+	int sl = 0, flags = 0;
 	struct suffixset *ss;
 
 	if (c == NO_INSERT_CHAR) {
@@ -1463,8 +1493,10 @@ iremovesuffix(ZLE_INT_T c, int keep)
 		    }
 		    break;
 		}
-		if (found)
+		if (found) {
+		    flags = ss->flags;
 		    break;
+		}
 	    }
 
 	    if (!found)
@@ -1472,12 +1504,17 @@ iremovesuffix(ZLE_INT_T c, int keep)
 	}
 	if (sl) {
 	    /* must be shifting wide character lengths */
-	    if (zlemetaline != NULL) {
-		unmetafy_line();
-		backdel(sl, CUT_RAW);
-		metafy_line();
-	    } else
-		backdel(sl, CUT_RAW);
+	    backdel(sl, CUT_RAW);
+	    if (flags & SUFFLAGS_SPACE)
+	    {
+		/* Add a space and advance over it */
+		spaceinline(1);
+		if (zlemetaline) {
+		    zlemetaline[zlemetacs++] = ' ';
+		} else {
+		    zleline[zlecs++] = ZWC(' ');
+		}
+	    }
 	    if (!keep)
 		invalidatelist();
 	}