tex: ic and ai options - 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 84c242d464735708949dc486a36af9ef16853a70
(DIR) parent 69f88a475e1d3633b0f944a1917ba7cc74da823a
(HTM) Author: Ali Gholami Rudi <ali@rudi.ir>
Date: Mon, 18 May 2015 23:04:59 +0430
ex: ic and ai options
Diffstat:
M ex.c | 71 ++++++++++++++++++++++++++++++-
M vi.c | 34 +++++++++++--------------------
M vi.h | 2 ++
3 files changed, 83 insertions(+), 24 deletions(-)
---
(DIR) diff --git a/ex.c b/ex.c
t@@ -9,6 +9,18 @@
#define EXLEN 512
+char xpath[PATHLEN]; /* current file */
+char xpath_alt[PATHLEN]; /* alternate file */
+int xquit; /* exit if set */
+int xvis; /* visual mode */
+int xai = 1; /* autoindent option */
+int xic = 1; /* ignorecase option */
+struct lbuf *xb; /* current buffer */
+int xrow, xcol, xtop; /* current row, column, and top row */
+int xrow_alt; /* alternate row, column, and top row */
+int xled = 1; /* use the line editor */
+int xdir = 'L'; /* current direction context */
+
/* read ex command location */
static char *ex_loc(char *s, char *loc)
{
t@@ -76,7 +88,7 @@ static int ex_search(char *pat)
e++;
}
re_kw[0] = sbuf_buf(kw);
- re = rset_make(1, re_kw, 0);
+ re = rset_make(1, re_kw, xic ? RE_ICASE : 0);
sbuf_free(kw);
if (!re)
return i;
t@@ -409,7 +421,7 @@ static void ec_substitute(char *ec)
delim = (unsigned char) *s++;
pat = readuntil(&s, delim);
rep = readuntil(&s, delim);
- re = rset_make(1, &pat, 0);
+ re = rset_make(1, &pat, xic ? RE_ICASE : 0);
for (i = beg; i < end; i++) {
char *ln = lbuf_get(xb, i);
if (rset_find(re, ln, LEN(offs) / 2, offs, 0)) {
t@@ -427,6 +439,60 @@ static void ec_substitute(char *ec)
free(rep);
}
+static struct option {
+ char *abbr;
+ char *name;
+ int *var;
+} options[] = {
+ {"ai", "autoindent", &xai},
+ {"ic", "ignorecase", &xic},
+};
+
+static char *cutword(char *s, char *d)
+{
+ while (isspace(*s))
+ s++;
+ while (*s && !isspace(*s))
+ *d++ = *s++;
+ while (isspace(*s))
+ s++;
+ *d = '\0';
+ return s;
+}
+
+static void ec_set(char *ec)
+{
+ char arg[EXLEN];
+ char tok[EXLEN];
+ char opt[EXLEN];
+ char *s = arg;
+ int val = 0;
+ int i;
+ ex_arg(ec, arg);
+ if (*s) {
+ s = cutword(s, tok);
+ if (tok[0] == 'n' && tok[1] == 'o') {
+ strcpy(opt, tok + 2);
+ val = 0;
+ } else {
+ char *r = strchr(tok, '=');
+ if (r) {
+ *r = '\0';
+ strcpy(opt, tok);
+ val = atoi(r + 1);
+ } else {
+ strcpy(opt, tok);
+ val = 1;
+ }
+ }
+ for (i = 0; i < LEN(options); i++) {
+ struct option *o = &options[i];
+ if (!strcmp(o->abbr, opt) || !strcmp(o->name, opt))
+ *o->var = val;
+ }
+ }
+}
+
static struct excmd {
char *abbr;
char *name;
t@@ -447,6 +513,7 @@ static struct excmd {
{"wq", "wq", ec_write},
{"u", "undo", ec_undo},
{"r", "redo", ec_redo},
+ {"se", "set", ec_set},
{"s", "substitute", ec_substitute},
{"ya", "yank", ec_yank},
{"", "", ec_print},
(DIR) diff --git a/vi.c b/vi.c
t@@ -12,17 +12,7 @@
#include <string.h>
#include "vi.h"
-char xpath[PATHLEN]; /* current file */
-char xpath_alt[PATHLEN]; /* alternate file */
-char xmsg[512]; /* current message */
-struct lbuf *xb; /* current buffer */
-int xrow, xcol, xtop; /* current row, column, and top row */
-int xrow_alt; /* alternate row, column, and top row */
-int xled = 1; /* use the line editor */
-int xdir = 'L'; /* current direction context */
-int xvis; /* visual mode */
-int xquit;
-int xautoindent = 1;
+char vi_msg[512]; /* current message */
static char vi_findlast[256]; /* the last searched keyword */
static int vi_finddir; /* the last search direction */
static char vi_charlast[8]; /* the last character searched via f, t, F, or T */
t@@ -32,8 +22,8 @@ static int vi_ybuf; /* current yank buffer */
static void vi_drawmsg(void)
{
- led_print(xmsg, xrows);
- xmsg[0] = '\0';
+ led_print(vi_msg, xrows);
+ vi_msg[0] = '\0';
}
static void vi_draw(void)
t@@ -99,7 +89,7 @@ char *ex_read(char *msg)
void ex_show(char *msg)
{
if (xvis) {
- snprintf(xmsg, sizeof(xmsg), "%s", msg);
+ snprintf(vi_msg, sizeof(vi_msg), "%s", msg);
} else if (xled) {
led_print(msg, -1);
term_chr('\n');
t@@ -202,7 +192,7 @@ static int lbuf_search(struct lbuf *lb, char *kw, int dir, int *r, int *c, int *
int found = 0;
int row = *r, col = *c;
int i;
- struct rset *re = rset_make(1, &kw, 0);
+ struct rset *re = rset_make(1, &kw, xic ? RE_ICASE : 0);
if (!re)
return 1;
for (i = row; !found && i >= 0 && i < lbuf_len(lb); i += dir) {
t@@ -273,7 +263,7 @@ static int vi_search(int cmd, int cnt, int *row, int *col)
}
}
if (failed)
- snprintf(xmsg, sizeof(xmsg), "\"%s\" not found\n", vi_findlast);
+ snprintf(vi_msg, sizeof(vi_msg), "\"%s\" not found\n", vi_findlast);
return failed;
}
t@@ -693,9 +683,9 @@ static char *vi_input(char *pref, char *post, int *row, int *col)
char *rep;
struct sbuf *sb;
int last, off;
- if (xautoindent)
+ if (xai)
pref += indentscopy(ai, pref, sizeof(ai));
- rep = led_input(pref, post, ai, xautoindent ? sizeof(ai) - 1 : 0);
+ rep = led_input(pref, post, ai, xai ? sizeof(ai) - 1 : 0);
if (!rep)
return NULL;
sb = sbuf_make();
t@@ -705,7 +695,7 @@ static char *vi_input(char *pref, char *post, int *row, int *col)
last = lastline(sbuf_buf(sb));
off = uc_slen(sbuf_buf(sb) + last);
if (last)
- while (xautoindent && (post[0] == ' ' || post[0] == '\t'))
+ while (xai && (post[0] == ' ' || post[0] == '\t'))
post++;
sbuf_str(sb, post);
*row = linecount(sbuf_buf(sb)) - 1;
t@@ -717,7 +707,7 @@ static char *vi_input(char *pref, char *post, int *row, int *col)
static char *vi_indents(char *ln)
{
struct sbuf *sb = sbuf_make();
- while (xautoindent && ln && (*ln == ' ' || *ln == '\t'))
+ while (xai && ln && (*ln == ' ' || *ln == '\t'))
sbuf_chr(sb, *ln++);
return sbuf_done(sb);
}
t@@ -972,7 +962,7 @@ static int vi_scrollbackward(int cnt)
static void vc_status(void)
{
int pos = ren_noeol(lbuf_get(xb, xrow), xcol);
- snprintf(xmsg, sizeof(xmsg), "\"%s\" line %d of %d, col %d\n",
+ snprintf(vi_msg, sizeof(vi_msg), "\"%s\" line %d of %d, col %d\n",
xpath[0] ? xpath : "unnamed", xrow + 1, lbuf_len(xb),
ren_cursor(lbuf_get(xb, xrow), pos) + 1);
}
t@@ -1206,7 +1196,7 @@ static void vi(void)
xrow - xrows / 2 : xrow - xrows + 1;
if (redraw || xtop != otop)
vi_draw();
- if (xmsg[0])
+ if (vi_msg[0])
vi_drawmsg();
term_pos(xrow - xtop, led_pos(lbuf_get(xb, xrow),
ren_cursor(lbuf_get(xb, xrow), xcol)));
(DIR) diff --git a/vi.h b/vi.h
t@@ -138,3 +138,5 @@ extern char xpath[];
extern char xpath_alt[];
extern int xquit;
extern int xdir;
+extern int xic;
+extern int xai;