tvi: mark columns - neatvi - [fork] simple vi-type editor with UTF-8 support
(HTM) git clone git://src.adamsgaard.dk/neatvi
(DIR) Log
(DIR) Files
(DIR) Refs
(DIR) README
---
(DIR) commit 680585a37f36abc36eb00a7bd1a98459c0628012
(DIR) parent 901e0cd396e087f435fa96b51196d01d0f94ca18
(HTM) Author: Ali Gholami Rudi <ali@rudi.ir>
Date: Tue, 2 Jun 2015 23:28:58 +0430
vi: mark columns
Diffstat:
M ex.c | 4 ++--
M lbuf.c | 15 +++++++++++----
M vi.c | 31 +++++++++++++++++++++++--------
M vi.h | 4 ++--
4 files changed, 38 insertions(+), 16 deletions(-)
---
(DIR) diff --git a/ex.c b/ex.c
t@@ -118,7 +118,7 @@ static int ex_lineno(char *num)
if (num[0] == '+')
n = xrow + (num[1] ? ex_lineno(num + 1) : 1);
if (num[0] == '\'')
- n = lbuf_markpos(xb, num[1]);
+ lbuf_markpos(xb, num[1], &n, NULL);
if (num[0] == '/' && num[1])
n = ex_search(num);
if (num[0] == '?' && num[1])
t@@ -393,7 +393,7 @@ static void ec_mark(char *ec)
ex_loc(ec, loc);
if (ex_region(loc, &beg, &end))
return;
- lbuf_mark(xb, arg[0], end - 1);
+ lbuf_mark(xb, arg[0], end - 1, 0);
}
static char *readuntil(char **src, int delim)
(DIR) diff --git a/lbuf.c b/lbuf.c
t@@ -16,7 +16,8 @@ struct lopt {
/* line buffers */
struct lbuf {
- int mark[32]; /* buffer marks */
+ int mark[32]; /* mark lines */
+ int mark_off[32]; /* mark line offsets */
struct lopt hist[128]; /* buffer history */
int undo; /* current index into hist[] */
int useq; /* current operation sequence */
t@@ -177,14 +178,20 @@ int lbuf_len(struct lbuf *lb)
return lb->ln_n;
}
-void lbuf_mark(struct lbuf *lbuf, int mark, int pos)
+void lbuf_mark(struct lbuf *lbuf, int mark, int pos, int off)
{
lbuf->mark[MARK(mark)] = pos;
+ lbuf->mark_off[MARK(mark)] = off;
}
-int lbuf_markpos(struct lbuf *lbuf, int mark)
+int lbuf_markpos(struct lbuf *lbuf, int mark, int *pos, int *off)
{
- return lbuf->mark[MARK(mark)];
+ if (lbuf->mark[MARK(mark)] < 0)
+ return 1;
+ *pos = lbuf->mark[MARK(mark)];
+ if (off)
+ *off = lbuf->mark_off[MARK(mark)];
+ return 0;
}
static struct lopt *lbuf_lopt(struct lbuf *lb, int i)
(DIR) diff --git a/vi.c b/vi.c
t@@ -218,7 +218,7 @@ static int vi_motionln(int *row, int cmd)
{
int cnt = (vi_arg1 ? vi_arg1 : 1) * (vi_arg2 ? vi_arg2 : 1);
int c = vi_read();
- int mark;
+ int mark, mark_row, mark_off;
switch (c) {
case '\n':
case '+':
t@@ -231,11 +231,13 @@ static int vi_motionln(int *row, int cmd)
*row = MIN(*row + cnt - 1, lbuf_len(xb) - 1);
break;
case '\'':
- if ((mark = vi_read()) <= 0 || (!isalpha(mark) && mark != '\''))
+ if ((mark = vi_read()) <= 0)
+ return -1;
+ if (!islower(mark) && !strchr("'`", mark))
return -1;
- if (lbuf_markpos(xb, mark) < 0)
+ if (lbuf_markpos(xb, mark, &mark_row, &mark_off))
return -1;
- *row = lbuf_markpos(xb, mark);
+ *row = mark_row;
break;
case 'j':
*row = MIN(*row + cnt, lbuf_len(xb) - 1);
t@@ -303,6 +305,7 @@ static int vi_motion(int *row, int *off)
int cnt = (vi_arg1 ? vi_arg1 : 1) * (vi_arg2 ? vi_arg2 : 1);
char *ln = lbuf_get(xb, *row);
int dir = dir_context(ln ? ln : "");
+ int mark, mark_row, mark_off;
char *cs;
int mv;
int i;
t@@ -461,6 +464,16 @@ static int vi_motion(int *row, int *off)
if (vi_nextoff(xb, -1, row, off))
break;
break;
+ case '`':
+ if ((mark = vi_read()) <= 0)
+ return -1;
+ if (!islower(mark) && !strchr("'`", mark))
+ return -1;
+ if (lbuf_markpos(xb, mark, &mark_row, &mark_off))
+ return -1;
+ *row = mark_row;
+ *off = mark_off;
+ break;
default:
vi_back(mv);
return 0;
t@@ -958,8 +971,10 @@ static void vi(void)
vi_ybuf = vi_yankbuf();
mv = vi_motion(&nrow, &noff);
if (mv > 0) {
- if (strchr("\'GHML/?{}[]nN", mv))
- lbuf_mark(xb, '\'', xrow);
+ if (strchr("\'`GHML/?{}[]nN", mv)) {
+ lbuf_mark(xb, '\'', xrow, xoff);
+ lbuf_mark(xb, '`', xrow, xoff);
+ }
xrow = nrow;
if (noff < 0 && !strchr("jk", mv))
noff = lbuf_indents(xb, xrow);
t@@ -1052,8 +1067,8 @@ static void vi(void)
redraw = 1;
break;
case 'm':
- if ((mark = vi_read()) > 0 && isalpha(mark))
- lbuf_mark(xb, mark, xrow);
+ if ((mark = vi_read()) > 0 && islower(mark))
+ lbuf_mark(xb, mark, xrow, xoff);
break;
case 'p':
case 'P':
(DIR) diff --git a/vi.h b/vi.h
t@@ -15,8 +15,8 @@ char *lbuf_cp(struct lbuf *lbuf, int beg, int end);
void lbuf_put(struct lbuf *lbuf, int pos, char *s);
char *lbuf_get(struct lbuf *lbuf, int pos);
int lbuf_len(struct lbuf *lbuf);
-void lbuf_mark(struct lbuf *lbuf, int mark, int pos);
-int lbuf_markpos(struct lbuf *lbuf, int mark);
+void lbuf_mark(struct lbuf *lbuf, int mark, int pos, int off);
+int lbuf_markpos(struct lbuf *lbuf, int mark, int *pos, int *off);
void lbuf_undo(struct lbuf *lbuf);
void lbuf_redo(struct lbuf *lbuf);
void lbuf_undomark(struct lbuf *lbuf);