summary refs log tree commit diff
path: root/Src/Zle/zle_vi.c
diff options
context:
space:
mode:
Diffstat (limited to 'Src/Zle/zle_vi.c')
-rw-r--r--Src/Zle/zle_vi.c56
1 files changed, 25 insertions, 31 deletions
diff --git a/Src/Zle/zle_vi.c b/Src/Zle/zle_vi.c
index e9a367668..249e38f15 100644
--- a/Src/Zle/zle_vi.c
+++ b/Src/Zle/zle_vi.c
@@ -167,6 +167,8 @@ getvirange(int wf)
     Thingy k2;
 
     if (visual) {
+	if (!zlell)
+	    return -1;
 	pos = mark;
 	vilinerange = (visual == 2);
 	region_active = 0;
@@ -179,17 +181,15 @@ getvirange(int wf)
 	if (km)
 	    selectlocalmap(km);
 	/* Now we need to execute the movement command, to see where it *
-	* actually goes.  virangeflag here indicates to the movement   *
-	* function that it should place the cursor at the end of the   *
-	* range, rather than where the cursor would actually go if it  *
-	* were executed normally.  This makes a difference to some     *
-	* commands, but not all.  For example, if searching forward    *
-	* for a character, under normal circumstances the cursor lands *
-	* on the character.  For a range, the range must include the   *
-	* character, so the cursor gets placed after the character if  *
-	* virangeflag is set.  vi-match-bracket needs to change the    *
-	* value of virangeflag under some circumstances, meaning that  *
-	* we need to change the *starting* position.                   */
+	 * actually goes.  virangeflag here indicates to the movement   *
+	 * function that it should place the cursor at the end of the   *
+	 * range, rather than where the cursor would actually go if it  *
+	 * were executed normally.  This makes a difference to some     *
+	 * commands, but not all.  For example, if searching forward    *
+	 * for a character, under normal circumstances the cursor lands *
+	 * on the character.  For a range, the range must include the   *
+	 * character, so the cursor gets placed after the character if  *
+	 * virangeflag is set.                                          */
 	zmod.flags &= ~MOD_TMULT;
 	do {
 	    vilinerange = 0;
@@ -202,10 +202,10 @@ getvirange(int wf)
 		return -1;
 	    }
 	    /*
-	    * With k2 == bindk, the command key is repeated:
-	    * a number of lines is used.  If the function used
-	    * returns 1, we fail.
-	    */
+	     * With k2 == bindk, the command key is repeated:
+	     * a number of lines is used.  If the function used
+	     * returns 1, we fail.
+	     */
 	    if ((k2 == bindk) ? dovilinerange() : execzlefunc(k2, zlenoargs, 1))
 		ret = -1;
 	    if(vichgrepeat)
@@ -217,8 +217,8 @@ getvirange(int wf)
 	selectlocalmap(NULL);
 
 	/* 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.             */
+	 * range.  We here reject the case where the command modified  *
+	 * the line, or selected a different history line.             */
 	if (histline != hist1 || zlell != lastll || memcmp(zleline, lastline, zlell)) {
 	    histline = hist1;
 	    ZS_memcpy(zleline, lastline, zlell = lastll);
@@ -228,21 +228,16 @@ getvirange(int wf)
 	}
 
 	/* Can't handle an empty file.  Also, if the movement command *
-	* failed, or didn't move, it is an error.                    */
-	if (!zlell || (zlecs == pos && mark == -1 && virangeflag != 2) || ret == -1) {
+	 * failed, or didn't move, it is an error.                    */
+	if (!zlell || (zlecs == pos && (mark == -1 || mark == zlecs) &&
+		    virangeflag != 2) || ret == -1) {
 	    mark = mpos;
 	    return -1;
 	}
-
-	/* vi-match-bracket changes the value of virangeflag when *
-	* moving to the opening bracket, meaning that we need to *
-	* change the *starting* position.                        */
-	if (virangeflag == -1)
-	    INCPOS(pos);
 	virangeflag = 0;
 
 	/* if the mark has moved, ignore the original cursor position *
-	* and use the mark. */
+	 * and use the mark.                                          */
 	if (mark != -1)
 	    pos = mark;
     }
@@ -883,7 +878,7 @@ vijoin(UNUSED(char **args))
     } else if ((x = findeol()) == zlell || (visual && x >= mark))
 	return 1;
 
-    while (n) {
+    do {
 	zlecs = x + 1;
 	pos = zlecs;
 	for (; zlecs != zlell && ZC_iblank(zleline[zlecs]); INCPOS(zlecs))
@@ -895,14 +890,13 @@ vijoin(UNUSED(char **args))
 	    DECPOS(pos);
 	    if (ZC_iblank(zleline[pos])) {
 		zlecs = pos;
-		return 0;
+		continue;
 	    }
 	}
 	spaceinline(1);
 	zleline[zlecs] = ZWC(' ');
-	if ((!visual && --n < 2) || (x = findeol()) == zlell || (visual && x >= mark))
-	    return 0;
-    }
+    } while (!((!visual && --n < 2) || (x = findeol()) == zlell || (visual && x >= mark)));
+
     return 0;
 }