summaryrefslogtreecommitdiff
path: root/Src/Zle/zle_vi.c
diff options
context:
space:
mode:
authorOliver Kiddle <opk@zsh.org>2014-11-21 11:38:40 +0100
committerOliver Kiddle <opk@zsh.org>2014-11-21 11:40:01 +0100
commit69594a6cf02d3584210d13ebd1389243fa765b4e (patch)
tree9b8e662a80e8a283f0c996a17852223676f3a7ab /Src/Zle/zle_vi.c
parent58da0f495cdf2bbef6a7043f5f06c77991c79a9e (diff)
downloadzsh-69594a6cf02d3584210d13ebd1389243fa765b4e.tar.gz
zsh-69594a6cf02d3584210d13ebd1389243fa765b4e.zip
33738: account for a selection in vi-replace-chars
Diffstat (limited to 'Src/Zle/zle_vi.c')
-rw-r--r--Src/Zle/zle_vi.c43
1 files changed, 35 insertions, 8 deletions
diff --git a/Src/Zle/zle_vi.c b/Src/Zle/zle_vi.c
index b0d69f112..e9a367668 100644
--- a/Src/Zle/zle_vi.c
+++ b/Src/Zle/zle_vi.c
@@ -257,6 +257,7 @@ getvirange(int wf)
pos = tmp;
}
+ /* visual selection mode needs to include additional position */
if (visual == 1 && invicmdmode())
INCPOS(pos);
@@ -576,16 +577,40 @@ vireplacechars(UNUSED(char **args))
int n = zmult, fail = 0, newchars = 0;
if (n > 0) {
- int pos = zlecs;
- while (n-- > 0) {
- if (pos == zlell || zleline[pos] == ZWC('\n')) {
- fail = 1;
- break;
+ if (region_active) {
+ int a, b;
+ if (region_active == 1) {
+ if (mark > zlecs) {
+ a = zlecs;
+ b = mark;
+ } else {
+ a = mark;
+ b = zlecs;
+ }
+ INCPOS(b);
+ } else
+ regionlines(&a, &b);
+ zlecs = a;
+ if (b > zlell)
+ b = zlell;
+ n = b - a;
+ while (a < b) {
+ newchars++;
+ INCPOS(a);
+ }
+ region_active = 0;
+ } else {
+ int pos = zlecs;
+ while (n-- > 0) {
+ if (pos == zlell || zleline[pos] == ZWC('\n')) {
+ fail = 1;
+ break;
+ }
+ newchars++;
+ INCPOS(pos);
}
- newchars++;
- INCPOS(pos);
+ n = pos - zlecs;
}
- n = pos - zlecs;
}
startvichange(1);
/* check argument range */
@@ -617,6 +642,8 @@ vireplacechars(UNUSED(char **args))
* buffer offset.
* Use shiftchars so as not to adjust the cursor position;
* we are overwriting anything that remains directly.
+ * With a selection this will replace newlines which vim
+ * doesn't do but this simplifies things a lot.
*/
if (n > newchars)
shiftchars(zlecs, n - newchars);