diff options
author | Oliver Kiddle <opk@zsh.org> | 2014-11-17 00:44:26 +0100 |
---|---|---|
committer | Oliver Kiddle <opk@zsh.org> | 2014-11-17 00:49:32 +0100 |
commit | 25cc978a99aae07604f4c84dd2e82d3669c2c61c (patch) | |
tree | 492a6ae2a3921c67e1c0c3c107cb24c25b951f82 /Src/Zle | |
parent | 15fc2cd4f09a63ab9aa15f61e9724ffbd8ab8a89 (diff) | |
download | zsh-25cc978a99aae07604f4c84dd2e82d3669c2c61c.tar.gz zsh-25cc978a99aae07604f4c84dd2e82d3669c2c61c.tar.xz zsh-25cc978a99aae07604f4c84dd2e82d3669c2c61c.zip |
33633: support vim style text objects
Diffstat (limited to 'Src/Zle')
-rw-r--r-- | Src/Zle/zle_vi.c | 15 |
1 files changed, 13 insertions, 2 deletions
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. */ |