diff options
-rw-r--r-- | ChangeLog | 2 | ||||
-rw-r--r-- | Src/Zle/zle_vi.c | 15 |
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. */ |