tvi: hll option to highlight current line - 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 4cb1cd3990fc9abf27d4c796825b7e080e1e8aea (DIR) parent a4917ea76e33803c53332bc622d870b36c7371c9 (HTM) Author: Ali Gholami Rudi <ali@rudi.ir> Date: Sun, 19 Jan 2020 20:15:34 +0330 vi: hll option to highlight current line Diffstat: M README | 2 ++ M conf.c | 6 ++++++ M conf.h | 5 ++++- M ex.c | 2 ++ M syn.c | 8 ++++++++ M vi.c | 18 +++++++++++++++--- M vi.h | 3 +++ 7 files changed, 40 insertions(+), 4 deletions(-) --- (DIR) diff --git a/README b/README t@@ -60,6 +60,8 @@ order hl, highlight If set (default), text will be highlighted based on syntax highlighting rules in conf.h. +hll, highlightline + If set, highlight current line. ai, autoindent As in vi(1). aw, autowrite (DIR) diff --git a/conf.c b/conf.c t@@ -75,6 +75,12 @@ int conf_highlight_revdir(int *att) return 0; } +int conf_highlight_line(int *att) +{ + *att = SYN_LINE; + return 0; +} + char **conf_kmap(int id) { return kmaps[id]; (DIR) diff --git a/conf.h b/conf.h t@@ -81,8 +81,11 @@ static struct highlight { {"---", {8 | SYN_BD}, "^.*$"}, }; +/* how to hightlight current line (hll option) */ +#define SYN_LINE (SYN_BGMK(11)) + /* how to hightlight text in the reverse direction */ -#define SYN_REVDIR (SYN_BGMK(255)) +#define SYN_REVDIR (SYN_BGMK(7)) /* right-to-left characters (used only in dircontexts[] and dirmarks[]) */ #define CR2L "ءآأؤإئابةتثجحخدذرزسشصضطظعغـفقكلمنهوىييپچژکگی؛،»«؟ًٌٍَُِّْ" (DIR) diff --git a/ex.c b/ex.c t@@ -15,6 +15,7 @@ int xai = 1; /* autoindent option */ int xic = 1; /* ignorecase option */ int xaw; /* autowrite option */ int xhl = 1; /* syntax highlight option */ +int xhll; /* highlight current line */ int xled = 1; /* use the line editor */ int xtd = +1; /* current text direction */ int xshape = 1; /* perform letter shaping */ t@@ -860,6 +861,7 @@ static struct option { {"shape", "shape", &xshape}, {"order", "xorder", &xorder}, {"hl", "highlight", &xhl}, + {"hll", "highlightline", &xhll}, }; static char *cutword(char *s, char *d) (DIR) diff --git a/syn.c b/syn.c t@@ -12,6 +12,7 @@ static struct ftmap { } ftmap[NFTS]; static struct rset *syn_ftrs; +static int syn_ctx; static struct rset *syn_find(char *ft) { t@@ -29,6 +30,11 @@ int syn_merge(int old, int new) return ((old | new) & SYN_FLG) | (bg << 8) | fg; } +void syn_context(int att) +{ + syn_ctx = att; +} + int *syn_highlight(char *ft, char *s) { int subs[16 * 2]; t@@ -41,6 +47,8 @@ int *syn_highlight(char *ft, char *s) memset(att, 0, n * sizeof(att[0])); if (!rs) return att; + for (i = 0; i < n; i++) + att[i] = syn_ctx; while ((hl = rset_find(rs, s + sidx, LEN(subs) / 2, subs, flg)) >= 0) { int grp = 0; int cend = 1; (DIR) diff --git a/vi.c b/vi.c t@@ -53,7 +53,13 @@ static void vi_drawmsg(void) static void vi_drawrow(int row) { char *s = lbuf_get(xb, row); + if (xhll && row == xrow) { + int hll; + conf_highlight_line(&hll); + syn_context(hll); + } led_print(s ? s : (row ? "~" : ""), row - xtop, ex_filetype()); + syn_context(0); } /* redraw the screen */ t@@ -1326,10 +1332,16 @@ static void vi(void) if (xcol < xleft) xleft = xcol < xcols ? 0 : xcol - xcols / 2; vi_wait(); - if (mod || xleft != oleft) + if (mod || xleft != oleft) { vi_drawagain(xcol, mod == 2 && xleft == oleft && xrow == orow); - else if (xtop != otop) - vi_drawupdate(xcol, otop); + } else { + if (xtop != otop) + vi_drawupdate(xcol, otop); + if (xhll && xrow != orow && orow >= xtop && orow < xtop + xcols) + vi_drawrow(orow); + if (xhll && xrow != orow) + vi_drawrow(xrow); + } if (vi_msg[0]) vi_drawmsg(); term_pos(xrow - xtop, led_pos(lbuf_get(xb, xrow), (DIR) diff --git a/vi.h b/vi.h t@@ -173,6 +173,7 @@ int cmd_exec(char *cmd); int *syn_highlight(char *ft, char *s); char *syn_filetype(char *path); +void syn_context(int att); int syn_merge(int old, int new); void syn_init(void); void syn_done(void); t@@ -184,6 +185,7 @@ int conf_placeholder(int idx, char **s, char **d, int *wid); int conf_highlight(int idx, char **ft, int **att, char **pat, int *end); int conf_filetype(int idx, char **ft, char **pat); int conf_highlight_revdir(int *att); +int conf_highlight_line(int *att); char **conf_kmap(int id); int conf_kmapfind(char *name); char *conf_digraph(int c1, int c2); t@@ -202,5 +204,6 @@ extern int xtd; extern int xshape; extern int xorder; extern int xhl; +extern int xhll; extern int xkmap; extern int xkmap_alt;