tvi: decide the insertion position simply based on character position - neatvi … | |
git clone git://src.adamsgaard.dk/neatvi | |
Log | |
Files | |
Refs | |
README | |
--- | |
commit 02c3248a2537cdccb0ccf6f91ad6df16cf902c15 | |
parent 4f52394ea85044002b49f0286219a30524cea4ab | |
Author: Ali Gholami Rudi <[email protected]> | |
Date: Sat, 16 May 2015 09:56:10 +0430 | |
vi: decide the insertion position simply based on character position | |
This seems more predictable than the more complex method of using | |
tthe visual position of characters. | |
Diffstat: | |
M vi.c | 36 +++++++++--------------------… | |
1 file changed, 10 insertions(+), 26 deletions(-) | |
--- | |
diff --git a/vi.c b/vi.c | |
t@@ -552,27 +552,11 @@ static char *lbuf_region(struct lbuf *lb, int r1, int l1… | |
/* insertion offset before or after the given visual position */ | |
static int vi_insertionoffset(char *s, int c1, int before) | |
{ | |
- int l1, l2, c2; | |
- c2 = ren_next(s, c1, before ? -1 : +1); | |
- l2 = c2 >= 0 ? ren_off(s, c2) : 0; | |
- if (c1 == c2 || c2 < 0 || uc_chr(s, l2)[0] == '\n') { | |
- c2 = ren_next(s, c1, before ? +1 : -1); | |
- l1 = ren_off(s, c1); | |
- l2 = c2 >= 0 ? ren_off(s, c2) : 0; | |
- if (c1 == c2 || c2 < 0 || uc_chr(s, l2)[0] == '\n') | |
- return before ? l1 : l1 + 1; | |
- if (before) | |
- return l1 < l2 ? l1 : l1 + 1; | |
- else | |
- return l2 < l1 ? l1 + 1 : l1; | |
- } | |
- ren_region(s, c1, c2, &l1, &l2, 0); | |
- c1 = ren_pos(s, l1); | |
- c2 = ren_pos(s, l2); | |
- if (c1 < c2) | |
- return l1 < l2 ? l2 : l1; | |
- else | |
- return l1 < l2 ? l1 : l2; | |
+ int l; | |
+ if (!s || !*s) | |
+ return 0; | |
+ l = ren_off(s, c1); | |
+ return before || s[l] == '\n' ? l : l + 1; | |
} | |
static void vi_commandregion(int *r1, int *r2, int *c1, int *c2, int *l1, int … | |
t@@ -581,8 +565,8 @@ static void vi_commandregion(int *r1, int *r2, int *c1, in… | |
swap(r1, r2); | |
swap(c1, c2); | |
} | |
- *l1 = lbuf_get(xb, *r1) ? vi_insertionoffset(lbuf_get(xb, *r1), *c1, 1… | |
- *l2 = lbuf_get(xb, *r2) ? vi_insertionoffset(lbuf_get(xb, *r2), *c2, !… | |
+ *l1 = vi_insertionoffset(lbuf_get(xb, *r1), *c1, 1); | |
+ *l2 = vi_insertionoffset(lbuf_get(xb, *r2), *c2, !closed); | |
if (*r1 == *r2 && lbuf_get(xb, *r1)) | |
ren_region(lbuf_get(xb, *r1), *c1, *c2, l1, l2, closed); | |
if (*r1 == *r2 && *l2 < *l1) | |
t@@ -814,9 +798,9 @@ static int vc_insert(int cmd) | |
if (cmd == 'o') | |
xrow += 1; | |
if (cmd == 'i' || cmd == 'I') | |
- off = ln ? vi_insertionoffset(ln, xcol, 1) : 0; | |
+ off = vi_insertionoffset(ln, xcol, 1); | |
if (cmd == 'a' || cmd == 'A') | |
- off = ln ? vi_insertionoffset(ln, xcol, 0) : 0; | |
+ off = vi_insertionoffset(ln, xcol, 0); | |
pref = ln && cmd != 'o' && cmd != 'O' ? uc_sub(ln, 0, off) : vi_indent… | |
post = ln && cmd != 'o' && cmd != 'O' ? uc_sub(ln, off, -1) : uc_dup("… | |
rep = vi_input(pref, post, &row, &col); | |
t@@ -847,7 +831,7 @@ static int vc_put(int cmd) | |
if (!buf) | |
return 1; | |
ln = lnmode ? NULL : lbuf_get(xb, xrow); | |
- off = ln ? vi_insertionoffset(ln, xcol, cmd == 'P') : 0; | |
+ off = vi_insertionoffset(ln, xcol, cmd == 'P'); | |
if (cmd == 'p' && !ln) | |
xrow++; | |
sb = sbuf_make(); |