Introduction
Introduction Statistics Contact Development Disclaimer Help
tvi: horizontal scrolling for long lines - neatvi - [fork] simple vi-type edito…
git clone git://src.adamsgaard.dk/neatvi
Log
Files
Refs
README
---
commit 2cf2cba137d3316342f56e7e035c74e214b1cbb2
parent e7975f55419e9eea1dc579bcf0aa7e53b0db479b
Author: Ali Gholami Rudi <[email protected]>
Date: Tue, 1 Sep 2015 11:47:22 +0430
vi: horizontal scrolling for long lines
Diffstat:
M ex.c | 1 +
M led.c | 52 ++++++++++++++++-------------…
M vi.c | 10 +++++++++-
M vi.h | 1 +
4 files changed, 38 insertions(+), 26 deletions(-)
---
diff --git a/ex.c b/ex.c
t@@ -8,6 +8,7 @@
#include "vi.h"
int xrow, xoff, xtop; /* current row, column, and top row */
+int xleft; /* the first visible column */
int xquit; /* exit if set */
int xvis; /* visual mode */
int xai = 1; /* autoindent option */
diff --git a/led.c b/led.c
t@@ -25,15 +25,15 @@ static char *kmap_map(char *kmap, int c)
return keymap[c] ? keymap[c] : cs;
}
-/* map cursor horizontal position to terminal column number */
-int led_pos(char *s, int pos)
+static int led_posctx(int dir, int pos)
{
- return dir_context(s) >= 0 ? pos : xcols - pos - 1;
+ return dir >= 0 ? pos - xleft : xcols - (pos - xleft) - 1;
}
-static int led_posctx(int dir, int pos)
+/* map cursor horizontal position to terminal column number */
+int led_pos(char *s, int pos)
{
- return dir >= 0 ? pos : xcols - pos - 1;
+ return led_posctx(dir_context(s), pos);
}
static int led_offdir(char **chrs, int *pos, int i)
t@@ -63,9 +63,9 @@ static void led_markrev(int n, char **chrs, int *pos, int *a…
}
}
-static char *led_render(char *s0)
+static char *led_render(char *s0, int cbeg, int cend)
{
- int n, maxcol = 0;
+ int n;
int *pos; /* pos[i]: the screen position of the i-th character …
int *off; /* off[i]: the character at screen position i */
int *att; /* att[i]: the attributes of i-th character */
t@@ -76,25 +76,23 @@ static char *led_render(char *s0)
int ctx = dir_context(s0);
chrs = uc_chop(s0, &n);
pos = ren_position(s0);
- off = malloc(xcols * sizeof(off[0]));
- memset(off, 0xff, xcols * sizeof(off[0]));
+ off = malloc((cend - cbeg) * sizeof(off[0]));
+ memset(off, 0xff, (cend - cbeg) * sizeof(off[0]));
for (i = 0; i < n; i++) {
- int curpos = pos[i];
- int curwid = ren_cwid(chrs[i], curpos);
- if (curpos >= 0 && curpos + curwid < xcols) {
- for (j = 0; j < curwid; j++) {
- off[led_posctx(ctx, curpos + j)] = i;
- if (led_posctx(ctx, curpos + j) > maxcol)
- maxcol = led_posctx(ctx, curpos + j);
- }
- }
+ int curwid = ren_cwid(chrs[i], pos[i]);
+ int curbeg = led_posctx(ctx, pos[i]);
+ int curend = led_posctx(ctx, pos[i] + curwid - 1);
+ if (curbeg >= 0 && curbeg < (cend - cbeg) &&
+ curend >= 0 && curend < (cend - cbeg))
+ for (j = 0; j < curwid; j++)
+ off[led_posctx(ctx, pos[i] + j)] = i;
}
att = syn_highlight(ex_filetype(), s0);
led_markrev(n, chrs, pos, att);
out = sbuf_make();
- i = 0;
- while (i <= maxcol) {
- int o = off[i];
+ i = cbeg;
+ while (i < cend) {
+ int o = off[i - cbeg];
int att_new = o >= 0 ? att[o] : 0;
sbuf_str(out, term_att(att_new, att_old));
att_old = att_new;
t@@ -104,9 +102,9 @@ static char *led_render(char *s0)
else if (uc_isprint(chrs[o]))
sbuf_mem(out, chrs[o], uc_len(chrs[o]));
else
- for (j = i; j <= maxcol && off[j] == o; j++)
+ for (j = i; j < cend && off[j - cbeg] == o; j+…
sbuf_chr(out, ' ');
- while (i <= maxcol && off[i] == o)
+ while (i < cend && off[i - cbeg] == o)
i++;
} else {
sbuf_chr(out, ' ');
t@@ -123,7 +121,7 @@ static char *led_render(char *s0)
void led_print(char *s, int row)
{
- char *r = led_render(s);
+ char *r = led_render(s, xleft, xleft + xcols);
term_pos(row, 0);
term_kill();
term_str(r);
t@@ -171,8 +169,12 @@ static void led_printparts(char *ai, char *pref, char *ma…
}
term_record();
sbuf_str(ln, post);
- led_print(sbuf_buf(ln), -1);
pos = ren_cursor(sbuf_buf(ln), ren_pos(sbuf_buf(ln), MAX(0, off - 1)));
+ if (pos >= xleft + xcols)
+ xleft = pos - xcols / 2;
+ if (pos < xleft)
+ xleft = pos < xcols ? 0 : pos - xcols / 2;
+ led_print(sbuf_buf(ln), -1);
term_pos(-1, led_pos(sbuf_buf(ln), pos + idir));
sbuf_free(ln);
term_commit();
diff --git a/vi.c b/vi.c
t@@ -33,8 +33,11 @@ static void vi_wait(void)
static void vi_drawmsg(void)
{
+ int oleft = xleft;
+ xleft = 0;
led_print(vi_msg, xrows);
vi_msg[0] = '\0';
+ xleft = oleft;
}
/* redraw the screen */
t@@ -1010,6 +1013,7 @@ static void vi(void)
int nrow = xrow;
int noff = ren_noeol(lbuf_get(xb, xrow), xoff);
int otop = xtop;
+ int oleft = xleft;
int mv, n;
term_cmd(&n);
vi_arg2 = 0;
t@@ -1265,8 +1269,12 @@ static void vi(void)
xoff = ren_noeol(lbuf_get(xb, xrow), xoff);
if (redraw)
xcol = vi_off2col(xb, xrow, xoff);
+ if (xcol >= xleft + xcols)
+ xleft = xcol - xcols / 2;
+ if (xcol < xleft)
+ xleft = xcol < xcols ? 0 : xcol - xcols / 2;
vi_wait();
- if (redraw || xtop != otop)
+ if (redraw || xtop != otop || xleft != oleft)
vi_draw(xcol);
if (vi_msg[0])
vi_drawmsg();
diff --git a/vi.h b/vi.h
t@@ -182,6 +182,7 @@ int conf_highlight_revdir(int *att);
extern int xrow;
extern int xoff;
extern int xtop;
+extern int xleft;
extern int xvis;
extern int xled;
extern int xquit;
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.