tex: store search keywords and ex commands in ex buffers - 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 d2e85a01607d64b873e6db1e667f8583c0b5aced
(DIR) parent 8d920bf3b193961749c1490708fd135167f74a59
(HTM) Author: Ali Gholami Rudi <ali@rudi.ir>
Date: Thu, 25 Feb 2016 09:07:10 +0330
ex: store search keywords and ex commands in ex buffers
Diffstat:
M ex.c | 44 ++++++++++++++++++++++---------
M vi.c | 16 +++++++---------
M vi.h | 8 +++-----
3 files changed, 41 insertions(+), 27 deletions(-)
---
(DIR) diff --git a/ex.c b/ex.c
t@@ -19,9 +19,9 @@ int xled = 1; /* use the line editor */
int xdir = +1; /* current direction context */
int xshape = 1; /* perform letter shaping */
int xorder = 1; /* change the order of characters */
-char xfindkwd[EXLEN]; /* the last searched keyword */
-char xfindrep[EXLEN]; /* the last replacement */
-int xfinddir = +1; /* the last search direction */
+static char xfindkwd[EXLEN]; /* the last searched keyword */
+static char xfindrep[EXLEN]; /* the last replacement */
+static int xfinddir; /* the last search direction */
static char *xkmap = "en"; /* the current keymap */
static char xkmap2[8] = "fa"; /* the alternate keymap */
t@@ -191,15 +191,32 @@ static char *ex_line(char *s, char *ln)
return *s ? s + 1 : s;
}
+/* the previous search keyword */
+int ex_kwd(char **kwd, int *dir)
+{
+ if (kwd)
+ *kwd = xfindkwd;
+ if (dir)
+ *dir = xfinddir;
+ return xfinddir == 0;
+}
+
+/* set the previous search keyword */
+void ex_kwdset(char *kwd, int dir)
+{
+ snprintf(xfindkwd, sizeof(xfindkwd), "%s", kwd);
+ reg_put('/', kwd, 0);
+ xfinddir = dir;
+}
+
static int ex_search(char *pat)
{
struct sbuf *kw;
- int dir = *pat == '/' ? 1 : -1;
char *b = pat;
char *e = b;
char *pats[1];
struct rset *re;
- int row;
+ int dir, row;
kw = sbuf_make();
while (*++e) {
if (*e == *pat)
t@@ -209,12 +226,10 @@ static int ex_search(char *pat)
e++;
}
if (sbuf_len(kw))
- snprintf(xfindkwd, sizeof(xfindkwd), "%s", sbuf_buf(kw));
+ ex_kwdset(sbuf_buf(kw), *pat == '/' ? 1 : -1);
sbuf_free(kw);
- if (!xfindkwd[0])
+ if (!ex_kwd(&pats[0], &dir))
return xrow;
- xfinddir = dir;
- pats[0] = xfindkwd;
re = rset_make(1, pats, xic ? RE_ICASE : 0);
if (!re)
return 1;
t@@ -644,7 +659,7 @@ static int ec_substitute(char *ec)
s = ex_argeol(ec);
pat = re_read(&s);
if (pat && pat[0])
- snprintf(xfindkwd, sizeof(xfindkwd), "%s", pat);
+ ex_kwdset(pat, +1);
if (pat && *s) {
s--;
rep = re_read(&s);
t@@ -653,7 +668,8 @@ static int ec_substitute(char *ec)
rep = uc_dup(pat ? "" : xfindrep);
snprintf(xfindrep, sizeof(xfindrep), "%s", rep);
free(pat);
- pats[0] = xfindkwd;
+ if (ex_kwd(&pats[0], NULL))
+ return 1;
re = rset_make(1, pats, xic ? RE_ICASE : 0);
if (!re) {
free(rep);
t@@ -749,9 +765,10 @@ static int ec_glob(char *ec)
s = ex_argeol(ec);
pat = re_read(&s);
if (pat && pat[0])
- snprintf(xfindkwd, sizeof(xfindkwd), "%s", pat);
+ ex_kwdset(pat, +1);
free(pat);
- pats[0] = xfindkwd;
+ if (ex_kwd(&pats[0], NULL))
+ return 1;
if (!(re = rset_make(1, pats, xic ? RE_ICASE : 0)))
return 1;
i = beg;
t@@ -902,6 +919,7 @@ void ex_command(char *ln)
{
ex_exec(ln);
lbuf_modified(xb);
+ reg_put(':', ln, 0);
}
/* ex main loop */
(DIR) diff --git a/vi.c b/vi.c
t@@ -238,6 +238,7 @@ static int vi_findchar(struct lbuf *lb, char *cs, int cmd, int n, int *row, int
static int vi_search(int cmd, int cnt, int *row, int *off)
{
+ char *kwd;
int r = *row;
int o = *off;
int failed = 0;
t@@ -256,9 +257,7 @@ static int vi_search(int cmd, int cnt, int *row, int *off)
free(kw);
kw = sbuf_buf(sb);
if ((re = re_read(&kw))) {
- xfinddir = cmd == '/' ? +1 : -1;
- if (re[0])
- snprintf(xfindkwd, sizeof(xfindkwd), "%s", re);
+ ex_kwdset(re[0] ? re : NULL, cmd == '/' ? +1 : -1);
while (isspace(*kw))
kw++;
vi_soset = !!kw[0];
t@@ -267,12 +266,12 @@ static int vi_search(int cmd, int cnt, int *row, int *off)
}
sbuf_free(sb);
}
- dir = cmd == 'N' ? -xfinddir : xfinddir;
- if (!xfindkwd[0] || !lbuf_len(xb))
+ if (!lbuf_len(xb) || ex_kwd(&kwd, &dir))
return 1;
+ dir = cmd == 'N' ? -dir : dir;
o = *off;
for (i = 0; i < cnt; i++) {
- if (lbuf_search(xb, xfindkwd, dir, &r, &o, &len)) {
+ if (lbuf_search(xb, kwd, dir, &r, &o, &len)) {
failed = 1;
break;
}
t@@ -291,7 +290,7 @@ static int vi_search(int cmd, int cnt, int *row, int *off)
}
}
if (failed)
- snprintf(vi_msg, sizeof(vi_msg), "\"%s\" not found\n", xfindkwd);
+ snprintf(vi_msg, sizeof(vi_msg), "\"%s\" not found\n", kwd);
return failed;
}
t@@ -533,9 +532,8 @@ static int vi_motion(int *row, int *off)
case TK_CTL('a'):
if (!(cs = vi_curword(xb, *row, *off)))
return -1;
- strcpy(xfindkwd, cs);
+ ex_kwdset(cs, +1);
free(cs);
- xfinddir = +1;
if (vi_search('n', cnt, row, off))
return -1;
break;
(DIR) diff --git a/vi.h b/vi.h
t@@ -145,7 +145,10 @@ char *ex_filetype(void);
char **ex_kmap(void);
char *ex_kmapalt(void);
struct lbuf *ex_lbuf(void);
+int ex_kwd(char **kwd, int *dir);
+void ex_kwdset(char *kwd, int dir);
+#define EXLEN 512 /* ex line length */
#define xb ex_lbuf()
/* process management */
t@@ -195,8 +198,3 @@ extern int xdir;
extern int xshape;
extern int xorder;
extern int xhl;
-
-#define EXLEN 512 /* ex line length */
-
-extern char xfindkwd[EXLEN];
-extern int xfinddir;