summary refs log tree commit diff
path: root/Src/Zle
diff options
context:
space:
mode:
authorOliver Kiddle <opk@zsh.org>2016-07-08 23:00:44 +0200
committerOliver Kiddle <opk@zsh.org>2016-07-08 23:00:44 +0200
commit13f4bb29363e2a4c6a6e2971a929bd677043d866 (patch)
treec3362a1e04593ccc1ababb6d0f639adf949b1fdb /Src/Zle
parente87aa8941fd7e13b039bf4d1664c6dc39a09313a (diff)
downloadzsh-13f4bb29363e2a4c6a6e2971a929bd677043d866.tar.gz
zsh-13f4bb29363e2a4c6a6e2971a929bd677043d866.tar.xz
zsh-13f4bb29363e2a4c6a6e2971a929bd677043d866.zip
38810: fix cursor positioning and repeated invocations when widgets used from emacs mode
Diffstat (limited to 'Src/Zle')
-rw-r--r--Src/Zle/textobjects.c18
1 files changed, 9 insertions, 9 deletions
diff --git a/Src/Zle/textobjects.c b/Src/Zle/textobjects.c
index 9b3277a97..3db0781ff 100644
--- a/Src/Zle/textobjects.c
+++ b/Src/Zle/textobjects.c
@@ -1,5 +1,5 @@
 /*
- * textobjects.c - ZLE module implementing Vim style text objects
+ * textobjects.c - ZLE widgets implementing Vim style text objects
  *
  * This file is part of zsh, the Z shell.
  *
@@ -54,11 +54,7 @@ selectword(UNUSED(char **args))
     int sclass = viclass(zleline[zlecs]);
     int doblanks = all && sclass;
 
-    if (!invicmdmode()) {
-	region_active = 1;
-	mark = zlecs;
-    }
-    if (!region_active || zlecs == mark) {
+    if (!region_active || zlecs == mark || mark == -1) {
 	/* search back to first character of same class as the start position
 	 * also stop at the beginning of the line */
 	mark = zlecs;
@@ -207,8 +203,12 @@ selectword(UNUSED(char **args))
     /* Adjustment: vi operators don't include the cursor position, in insert
      * or emacs mode the region also doesn't but for vi visual mode it is
      * included. */
-    if (zlecs && zlecs > mark && !virangeflag)
-	DECCS();
+    if (!virangeflag) {
+	if (!invicmdmode())
+	    region_active = 1;
+	else if (zlecs && zlecs > mark)
+	    DECCS();
+    }
 
     return 0;
 }
@@ -315,7 +315,7 @@ selectargument(UNUSED(char **args))
     }
 
     /* Adjustment: vi operators don't include the cursor position */
-    if (!virangeflag)
+    if (!virangeflag && invicmdmode())
        DECCS();
 
     return 0;