tvi: hll option to highlight current line - neatvi - [fork] simple vi-type editor with UTF-8 support
git clone git://src.adamsgaard.dk/neatvi
Log
Files
Refs
README
---
commit 4cb1cd3990fc9abf27d4c796825b7e080e1e8aea
parent a4917ea76e33803c53332bc622d870b36c7371c9
Author: Ali Gholami Rudi 
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(-)
---
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
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];
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                "ءآأؤإئابةتثجحخدذرزسشصضطظعغـفقكلمنهوىييپچژکگی‌‍؛،»«؟ًٌٍَُِّْ"
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)
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;
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),
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;