summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog2
-rw-r--r--Src/Zle/zle_vi.c15
2 files changed, 15 insertions, 2 deletions
diff --git a/ChangeLog b/ChangeLog
index 9d32e2e4a..279b45f86 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,7 @@
 2014-11-16  Oliver Kiddle  <opk@zsh.org>
 
+	* 33633: Src/Zle/zle_vi.c: support vim style text objects
+
 	* 33632: Src/Zle/zle_main.c, Src/Zle/zle_vi.c: use viopp and visual
 	local keymaps if they exist
 
diff --git a/Src/Zle/zle_vi.c b/Src/Zle/zle_vi.c
index a7e8a70cc..c3a9e75aa 100644
--- a/Src/Zle/zle_vi.c
+++ b/Src/Zle/zle_vi.c
@@ -161,12 +161,13 @@ vigetkey(void)
 static int
 getvirange(int wf)
 {
-    int pos = zlecs, ret = 0;
+    int pos = zlecs, mpos = mark, ret = 0;
     int mult1 = zmult, hist1 = histline;
     Thingy k2;
 
     virangeflag = 1;
     wordflag = wf;
+    mark = -1;
     /* use operator-pending keymap if one exists */
     Keymap km = openkeymap("viopp");
     if (km)
@@ -191,6 +192,7 @@ getvirange(int wf)
 		k2 == Th(z_sendbreak)) {
 	    wordflag = 0;
 	    virangeflag = 0;
+	    mark = mpos;
 	    return -1;
 	}
 	/*
@@ -214,13 +216,16 @@ getvirange(int wf)
 	histline = hist1;
 	ZS_memcpy(zleline, lastline, zlell = lastll);
 	zlecs = pos;
+        mark = mpos;
 	return -1;
     }
 
     /* Can't handle an empty file.  Also, if the movement command *
      * failed, or didn't move, it is an error.                    */
-    if (!zlell || (zlecs == pos && virangeflag != 2) || ret == -1)
+    if (!zlell || (zlecs == pos && mark == -1 && 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 *
@@ -230,6 +235,12 @@ getvirange(int wf)
     virangeflag = 0;
     selectlocalmap(NULL);
 
+    /* if the mark has moved, ignore the original cursor position *
+     * and use the mark. */
+    if (mark != -1)
+	pos = mark;
+    mark = mpos;
+
     /* 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.                                   */