aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--editors/vi.c22
1 files changed, 13 insertions, 9 deletions
diff --git a/editors/vi.c b/editors/vi.c
index 65a82b138..f06cad227 100644
--- a/editors/vi.c
+++ b/editors/vi.c
@@ -2516,9 +2516,9 @@ static void place_cursor(int row, int col, int optimize)
}
skip: ;
}
+ last_row = row;
#endif /* FEATURE_VI_OPTIMIZE_CURSOR */
write1(cm);
- last_row = row;
}
//----- Erase from cursor to end of line -----------------------
@@ -2762,10 +2762,9 @@ static char* format_line(char *src, int li)
int ofs = offset;
char *dest = scr_out_buf; // [MAX_SCR_COLS + MAX_TABSTOP * 2]
- memset(dest, ' ', MAX_SCR_COLS + MAX_TABSTOP * 2);
-
c = '~'; // char in col 0 in non-existent lines is '~'
- for (co = 0; co < columns + MAX_TABSTOP; co++) {
+ co = 0;
+ while (co < columns + tabstop) {
// have we gone past the end?
if (src < end) {
c = *src++;
@@ -2790,11 +2789,11 @@ static char* format_line(char *src, int li)
}
}
}
- dest[co] = c;
+ dest[co++] = c;
// discard scrolled-off-to-the-left portion,
// in tabstop-sized pieces
if (ofs >= tabstop && co >= tabstop) {
- memmove(dest, dest + tabstop, co + 1);
+ memmove(dest, dest + tabstop, co);
co -= tabstop;
ofs -= tabstop;
}
@@ -2803,9 +2802,14 @@ static char* format_line(char *src, int li)
}
// check "short line, gigantic offset" case
if (co < ofs)
- ofs = co + 1;
- dest[ofs + MAX_SCR_COLS] = '\0';
- return &dest[ofs];
+ ofs = co;
+ // discard last scrolled off part
+ co -= ofs;
+ dest += ofs;
+ // fill the rest with spaces
+ if (co < columns)
+ memset(&dest[co], ' ', columns - co);
+ return dest;
}
//----- Refresh the changed screen lines -----------------------