From 25cc978a99aae07604f4c84dd2e82d3669c2c61c Mon Sep 17 00:00:00 2001 From: Oliver Kiddle Date: Mon, 17 Nov 2014 00:44:26 +0100 Subject: 33633: support vim style text objects --- Src/Zle/zle_vi.c | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) (limited to 'Src/Zle') 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. */ -- cgit 1.4.1