Introduction
Introduction Statistics Contact Development Disclaimer Help
tled: highlight the text in the reverse direction - neatvi - [fork] simple vi-t…
git clone git://src.adamsgaard.dk/neatvi
Log
Files
Refs
README
---
commit 88ed01cab8edeb1c8eb4ea39bba066dac00f161c
parent bdbc8d37c53bd7702979786c58354bbf2ef6990e
Author: Ali Gholami Rudi <[email protected]>
Date: Thu, 28 May 2015 23:25:00 +0430
led: highlight the text in the reverse direction
Diffstat:
M conf.c | 6 ++++++
M conf.h | 5 ++++-
M led.c | 35 +++++++++++++++++++++++++++++…
M vi.h | 1 +
4 files changed, 46 insertions(+), 1 deletion(-)
---
diff --git a/conf.c b/conf.c
t@@ -71,3 +71,9 @@ int conf_filetype(int idx, char **ft, char **pat)
*pat = filetypes[idx].pat;
return 0;
}
+
+int conf_highlight_revdir(int *att)
+{
+ *att = SYN_REVDIR;
+ return 0;
+}
diff --git a/conf.h b/conf.h
t@@ -27,7 +27,7 @@ static struct dirmark {
{+0, +1, 1, "\\\\\\*\\[([^]]+)\\]"},
{+1, -1, 0, "[" CR2L "][" CNEUT CR2L "]*[" CR2L "]"},
{-1, +1, 0, "[a-zA-Z0-9_][^" CR2L "\\\\`$']*[a-zA-Z0-9_]"},
- {+0, +1, 0, "$([^$]+)\\$"},
+ {+0, +1, 0, "\\$([^$]+)\\$"},
{+0, +1, 1, "\\\\[a-zA-Z0-9_]+\\{([^}]+)\\}"},
{-1, +1, 0, "\\\\[^ \t" CR2L "]+"},
};
t@@ -79,3 +79,6 @@ static struct highlight {
{"tr", SYN_BD, 0, "^\\.SH.*$"},
{"tr", 4, 0, "^\\.[a-zA-Z0-9]{2}.*$"},
};
+
+/* how to hightlight text in the reverse direction */
+#define SYN_REVDIR (SYN_BGMK(7))
diff --git a/led.c b/led.c
t@@ -36,6 +36,40 @@ static int led_posctx(int dir, int pos)
return dir >= 0 ? pos : xcols - pos - 1;
}
+static int led_offdir(char **chrs, int *pos, int i)
+{
+ if (pos[i] + ren_cwid(chrs[i], pos[i]) == pos[i + 1])
+ return +1;
+ if (pos[i + 1] + ren_cwid(chrs[i + 1], pos[i + 1]) == pos[i])
+ return -1;
+ return 0;
+}
+
+static int syn_merge(int old, int new)
+{
+ int fg = SYN_FG(new) ? SYN_FG(new) : SYN_FG(old);
+ int bg = SYN_BG(new) ? SYN_BG(new) : SYN_BG(old);
+ return fg | SYN_BGMK(bg);
+}
+
+static void led_markrev(int n, char **chrs, int *pos, int *att)
+{
+ int i = 0, j;
+ int hl = 0;
+ conf_highlight_revdir(&hl);
+ while (i + 1 < n) {
+ int dir = led_offdir(chrs, pos, i);
+ int beg = i;
+ while (i + 1 < n && led_offdir(chrs, pos, i) == dir)
+ i++;
+ if (dir < 0)
+ for (j = beg; j <= i; j++)
+ att[j] = syn_merge(att[j], hl);
+ if (i == beg)
+ i++;
+ }
+}
+
static char *led_render(char *s0)
{
int n, maxcol = 0;
t@@ -63,6 +97,7 @@ static char *led_render(char *s0)
}
}
att = syn_highlight(xft, s0);
+ led_markrev(n, chrs, pos, att);
out = sbuf_make();
i = 0;
while (i <= maxcol) {
diff --git a/vi.h b/vi.h
t@@ -156,6 +156,7 @@ int conf_dircontext(int idx, char **pat, int *ctx);
int conf_placeholder(int idx, char **s, char **d, int *wid);
int conf_highlight(int idx, char **ft, int *att, int *grp, char **pat);
int conf_filetype(int idx, char **ft, char **pat);
+int conf_highlight_revdir(int *att);
/* global variables */
#define PATHLEN 512
You are viewing proxied material from mx1.adamsgaard.dk. The copyright of proxied material belongs to its original authors. Any comments or complaints in relation to proxied material should be directed to the original authors of the content concerned. Please see the disclaimer for more details.