vim-patch: 7.4.353

Make 'breakindent' work with the 'list' option.

Originally patched in vim patch 7.4.353, by chrisbra
(https://code.google.com/p/vim/source/detail?r=d42a1d3b74d40f580359dbd139d2d0dfa7235252)

Updated version.c.
This commit is contained in:
Felipe Morales
2014-08-16 12:58:11 -04:00
parent 22c782bcb2
commit dfdfee0260
6 changed files with 164 additions and 15 deletions

View File

@@ -2197,6 +2197,7 @@ win_line (
char_u extra[18]; /* line number and 'fdc' must fit in here */
int n_extra = 0; /* number of extra chars */
char_u *p_extra = NULL; /* string of extra chars, plus NUL */
char_u *p_extra_free = NULL; /* p_extra needs to be freed */
int c_extra = NUL; /* extra chars, all the same */
int extra_attr = 0; /* attributes when n_extra != 0 */
static char_u *at_end_str = (char_u *)""; /* used for p_extra when
@@ -3108,6 +3109,10 @@ win_line (
}
--n_extra;
} else {
if (p_extra_free != NULL) {
free(p_extra_free);
p_extra_free = NULL;
}
/*
* Get a character from the line itself.
*/
@@ -3408,19 +3413,20 @@ win_line (
/*
* Found last space before word: check for line break.
*/
if (wp->w_p_lbr && vim_isbreak(c) && !vim_isbreak(*ptr)
&& !wp->w_p_list) {
if (wp->w_p_lbr && vim_isbreak(c) && !vim_isbreak(*ptr)) {
char_u *p = ptr - (
has_mbyte ? mb_l :
1);
// TODO: is passing p for start of the line OK?
n_extra = win_lbr_chartabsize(wp, p, p, (colnr_T)vcol, NULL) - 1;
n_extra = win_lbr_chartabsize(wp, line, p, (colnr_T)vcol, NULL) - 1;
c_extra = ' ';
if (vim_iswhite(c)) {
if (c == TAB)
/* See "Tab alignment" below. */
FIX_FOR_BOGUSCOLS;
c = ' ';
if (!wp->w_p_list) {
c = ' ';
}
}
}
@@ -3451,9 +3457,36 @@ win_line (
* into "ScreenLines".
*/
if (c == TAB && (!wp->w_p_list || lcs_tab1)) {
int tab_len = 0;
/* tab amount depends on current column */
n_extra = (int)wp->w_buffer->b_p_ts
tab_len = (int)wp->w_buffer->b_p_ts
- vcol % (int)wp->w_buffer->b_p_ts - 1;
if (!wp->w_p_lbr) {
n_extra = tab_len;
} else {
char_u *p;
int len = n_extra;
int i;
int saved_nextra = n_extra;
/* if n_extra > 0, it gives the number of chars to use for
* a tab, else we need to calculate the width for a tab */
len = (tab_len * mb_char2len(lcs_tab2));
if (n_extra > 0) {
len += n_extra - tab_len;
}
c = lcs_tab1;
p = xmalloc(len + 1);
memset(p, ' ', len);
p[len] = NUL;
p_extra_free = p;
for (i = 0; i < tab_len; i++) {
mb_char2bytes(lcs_tab2, p);
p += mb_char2len(lcs_tab2);
n_extra += mb_char2len(lcs_tab2) - (saved_nextra > 0 ? 1: 0);
}
p_extra = p_extra_free;
}
/* Tab alignment should be identical regardless of
* 'conceallevel' value. So tab compensates of all
* previous concealed characters, and thus resets vcol_off
@@ -3464,8 +3497,12 @@ win_line (
mb_utf8 = FALSE; /* don't draw as UTF-8 */
if (wp->w_p_list) {
c = lcs_tab1;
c_extra = lcs_tab2;
n_attr = n_extra + 1;
if (wp->w_p_lbr) {
c_extra = NUL; /* using p_extra from above */
} else {
c_extra = lcs_tab2;
}
n_attr = tab_len + 1;
extra_attr = hl_attr(HLF_8);
saved_attr2 = char_attr; /* save current attr */
mb_c = c;
@@ -3527,9 +3564,20 @@ win_line (
p_extra = transchar(c);
if ((dy_flags & DY_UHEX) && wp->w_p_rl)
rl_mirror(p_extra); /* reverse "<12>" */
n_extra = byte2cells(c) - 1;
c_extra = NUL;
c = *p_extra++;
if (wp->w_p_lbr) {
char_u *p;
c = *p_extra;
p = xmalloc(n_extra + 1);
memset(p, ' ', n_extra);
STRNCPY(p, p_extra + 1, STRLEN(p_extra) - 1);
p[n_extra] = NUL;
p_extra_free = p_extra = p;
} else {
n_extra = byte2cells(c) - 1;
c = *p_extra++;
}
if (!attr_pri) {
n_attr = n_extra + 1;
extra_attr = hl_attr(HLF_8);