Introduction
Introduction Statistics Contact Development Disclaimer Help
tvi: % motion - neatvi - [fork] simple vi-type editor with UTF-8 support
git clone git://src.adamsgaard.dk/neatvi
Log
Files
Refs
README
---
commit 5266f5c8be4e977eaac06ea4a978d13c9b378d28
parent 881d54517a9ce3a460cbfbf53c3efc323abd04d4
Author: Ali Gholami Rudi <[email protected]>
Date: Wed, 10 Jun 2015 14:47:38 +0430
vi: % motion
Diffstat:
M mot.c | 29 +++++++++++++++++++++++++++++
M vi.c | 19 ++++++++++++++++---
M vi.h | 1 +
3 files changed, 46 insertions(+), 3 deletions(-)
---
diff --git a/mot.c b/mot.c
t@@ -184,3 +184,32 @@ int lbuf_wordend(struct lbuf *lb, int big, int dir, int *…
return 1;
return 0;
}
+
+/* move to the matching character */
+int lbuf_pair(struct lbuf *lb, int *row, int *off)
+{
+ int r = *row, o = *off;
+ char *ln = lbuf_get(lb, *row);
+ char *pairs = "()[]{}";
+ int p; /* index for pairs[] */
+ int dep = 1; /* parenthesis depth */
+ if (!ln || !ln[o])
+ return 1;
+ while (!strchr(pairs, ln[o]))
+ if (!ln[++o])
+ return 1;
+ p = strchr(pairs, ln[o]) - pairs;
+ while (!lbuf_next(lb, (p & 1) ? -1 : +1, &r, &o)) {
+ int c = (unsigned char) lbuf_chr(lb, r, o)[0];
+ if (c == pairs[p ^ 1])
+ dep--;
+ if (c == pairs[p])
+ dep++;
+ if (!dep) {
+ *row = r;
+ *off = o;
+ return 0;
+ }
+ }
+ return 1;
+}
diff --git a/vi.c b/vi.c
t@@ -279,6 +279,12 @@ static int vi_motionln(int *row, int cmd)
*row = MAX(0, MIN(*row + cnt - 1, lbuf_len(xb) - 1));
break;
}
+ if (c == '%' && (vi_arg1 || vi_arg2)) {
+ if (cnt > 100)
+ return -1;
+ *row = MAX(0, lbuf_len(xb) - 1) * cnt / 100;
+ break;
+ }
vi_back(c);
return 0;
}
t@@ -480,6 +486,10 @@ static int vi_motion(int *row, int *off)
*row = mark_row;
*off = mark_off;
break;
+ case '%':
+ if (lbuf_pair(xb, row, off))
+ return -1;
+ break;
default:
vi_back(mv);
return 0;
t@@ -733,7 +743,7 @@ static int vc_motion(int cmd)
if (r1 == r2 && o1 > o2)
swap(&o1, &o2);
o1 = ren_noeol(lbuf_get(xb, r1), o1);
- if (!lnmode && strchr("fFtTeE", mv))
+ if (!lnmode && strchr("fFtTeE%", mv))
if (o2 < lbuf_eol(xb, r2))
o2 = ren_noeol(lbuf_get(xb, r2), o2) + 1;
if (cmd == 'y')
t@@ -793,8 +803,10 @@ static int vc_put(int cmd)
int lnmode;
char *buf = reg_get(vi_ybuf, &lnmode);
int i;
- if (!buf)
+ if (!buf) {
+ snprintf(vi_msg, sizeof(vi_msg), "yank buffer empty\n");
return 1;
+ }
if (lnmode) {
struct sbuf *sb = sbuf_make();
for (i = 0; i < cnt; i++)
t@@ -982,7 +994,8 @@ static void vi(void)
vi_ybuf = vi_yankbuf();
mv = vi_motion(&nrow, &noff);
if (mv > 0) {
- if (strchr("\'`GHML/?{}[]nN", mv)) {
+ if (strchr("\'`GHML/?{}[]nN", mv) ||
+ (mv == '%' && noff < 0)) {
lbuf_mark(xb, '\'', xrow, xoff);
lbuf_mark(xb, '`', xrow, xoff);
}
diff --git a/vi.h b/vi.h
t@@ -30,6 +30,7 @@ int lbuf_paragraphbeg(struct lbuf *lb, int dir, int *row, in…
int lbuf_sectionbeg(struct lbuf *lb, int dir, int *row, int *off);
int lbuf_wordbeg(struct lbuf *lb, int big, int dir, int *row, int *off);
int lbuf_wordend(struct lbuf *lb, int big, int dir, int *row, int *off);
+int lbuf_pair(struct lbuf *lb, int *row, int *off);
/* string buffer, variable-sized string */
struct sbuf *sbuf_make(void);
You are viewing proxied material from mx1.adamsgaard.dk. The copyright of proxied material belongs to its original authors. Any comments or complaints in relation to proxied material should be directed to the original authors of the content concerned. Please see the disclaimer for more details.