0
0
mirror of https://github.com/vim/vim.git synced 2025-09-29 04:34:16 -04:00

updated for version 7.4.338

Problem:    Cannot wrap lines taking indent into account.
Solution:   Add the 'breakindent' option. (many authors, final improvements by
            Christian Brabandt)
This commit is contained in:
Bram Moolenaar
2014-06-25 14:39:50 +02:00
parent 15a35c4f4a
commit 597a422416
26 changed files with 474 additions and 83 deletions

View File

@@ -32,7 +32,7 @@ static garray_T ga_users;
int
get_indent()
{
return get_indent_str(ml_get_curline(), (int)curbuf->b_p_ts);
return get_indent_str(ml_get_curline(), (int)curbuf->b_p_ts, FALSE);
}
/*
@@ -42,7 +42,7 @@ get_indent()
get_indent_lnum(lnum)
linenr_T lnum;
{
return get_indent_str(ml_get(lnum), (int)curbuf->b_p_ts);
return get_indent_str(ml_get(lnum), (int)curbuf->b_p_ts, FALSE);
}
#if defined(FEAT_FOLDING) || defined(PROTO)
@@ -55,7 +55,7 @@ get_indent_buf(buf, lnum)
buf_T *buf;
linenr_T lnum;
{
return get_indent_str(ml_get_buf(buf, lnum, FALSE), (int)buf->b_p_ts);
return get_indent_str(ml_get_buf(buf, lnum, FALSE), (int)buf->b_p_ts, FALSE);
}
#endif
@@ -64,16 +64,23 @@ get_indent_buf(buf, lnum)
* 'tabstop' at "ts"
*/
int
get_indent_str(ptr, ts)
get_indent_str(ptr, ts, list)
char_u *ptr;
int ts;
int list; /* if TRUE, count only screen size for tabs */
{
int count = 0;
for ( ; *ptr; ++ptr)
{
if (*ptr == TAB) /* count a tab for what it is worth */
count += ts - (count % ts);
if (*ptr == TAB)
{
if (!list || lcs_tab1) /* count a tab for what it is worth */
count += ts - (count % ts);
else
/* in list mode, when tab is not set, count screen char width for Tab: ^I */
count += ptr2cells(ptr);
}
else if (*ptr == ' ')
++count; /* count a space for one */
else
@@ -476,6 +483,58 @@ get_number_indent(lnum)
return (int)col;
}
#if defined(FEAT_LINEBREAK) || defined(PROTO)
/*
* Return appropriate space number for breakindent, taking influencing
* parameters into account. Window must be specified, since it is not
* necessarily always the current one.
*/
int
get_breakindent_win(wp, line)
win_T *wp;
char_u *line; /* start of the line */
{
static int prev_indent = 0; /* cached indent value */
static long prev_ts = 0L; /* cached tabstop value */
static char_u *prev_line = NULL; /* cached pointer to line */
int bri = 0;
/* window width minus window margin space, i.e. what rests for text */
const int eff_wwidth = W_WIDTH(wp)
- ((wp->w_p_nu || wp->w_p_rnu)
&& (vim_strchr(p_cpo, CPO_NUMCOL) == NULL)
? number_width(wp) + 1 : 0);
/* used cached indent, unless pointer or 'tabstop' changed */
if (prev_line != line || prev_ts != wp->w_buffer->b_p_ts)
{
prev_line = line;
prev_ts = wp->w_buffer->b_p_ts;
prev_indent = get_indent_str(line,
(int)wp->w_buffer->b_p_ts, wp->w_p_list) + wp->w_p_brishift;
}
/* indent minus the length of the showbreak string */
bri = prev_indent;
if (wp->w_p_brisbr)
bri -= vim_strsize(p_sbr);
/* Add offset for number column, if 'n' is in 'cpoptions' */
bri += win_col_off2(wp);
/* never indent past left window margin */
if (bri < 0)
bri = 0;
/* always leave at least bri_min characters on the left,
* if text width is sufficient */
else if (bri > eff_wwidth - wp->w_p_brimin)
bri = (eff_wwidth - wp->w_p_brimin < 0)
? 0 : eff_wwidth - wp->w_p_brimin;
return bri;
}
#endif
#if defined(FEAT_CINDENT) || defined(FEAT_SMARTINDENT)
static int cin_is_cinword __ARGS((char_u *line));
@@ -678,7 +737,7 @@ open_line(dir, flags, second_line_indent)
/*
* count white space on current line
*/
newindent = get_indent_str(saved_line, (int)curbuf->b_p_ts);
newindent = get_indent_str(saved_line, (int)curbuf->b_p_ts, FALSE);
if (newindent == 0 && !(flags & OPENLINE_COM_LIST))
newindent = second_line_indent; /* for ^^D command in insert mode */
@@ -1201,7 +1260,7 @@ open_line(dir, flags, second_line_indent)
|| do_si
#endif
)
newindent = get_indent_str(leader, (int)curbuf->b_p_ts);
newindent = get_indent_str(leader, (int)curbuf->b_p_ts, FALSE);
/* Add the indent offset */
if (newindent + off < 0)
@@ -1994,6 +2053,7 @@ plines_win_col(wp, lnum, column)
char_u *s;
int lines = 0;
int width;
char_u *line;
#ifdef FEAT_DIFF
/* Check for filler lines above this buffer line. When folded the result
@@ -2009,12 +2069,12 @@ plines_win_col(wp, lnum, column)
return lines + 1;
#endif
s = ml_get_buf(wp->w_buffer, lnum, FALSE);
line = s = ml_get_buf(wp->w_buffer, lnum, FALSE);
col = 0;
while (*s != NUL && --column >= 0)
{
col += win_lbr_chartabsize(wp, s, (colnr_T)col, NULL);
col += win_lbr_chartabsize(wp, line, s, (colnr_T)col, NULL);
mb_ptr_adv(s);
}
@@ -2026,7 +2086,7 @@ plines_win_col(wp, lnum, column)
* 'ts') -- webb.
*/
if (*s == TAB && (State & NORMAL) && (!wp->w_p_list || lcs_tab1))
col += win_lbr_chartabsize(wp, s, (colnr_T)col, NULL) - 1;
col += win_lbr_chartabsize(wp, line, s, (colnr_T)col, NULL) - 1;
/*
* Add column offset for 'number', 'relativenumber', 'foldcolumn', etc.
@@ -9002,10 +9062,12 @@ get_lisp_indent()
amount = 2;
else
{
char_u *line = that;
amount = 0;
while (*that && col)
{
amount += lbr_chartabsize_adv(&that, (colnr_T)amount);
amount += lbr_chartabsize_adv(line, &that, (colnr_T)amount);
col--;
}
@@ -9028,7 +9090,7 @@ get_lisp_indent()
while (vim_iswhite(*that))
{
amount += lbr_chartabsize(that, (colnr_T)amount);
amount += lbr_chartabsize(line, that, (colnr_T)amount);
++that;
}
@@ -9066,15 +9128,16 @@ get_lisp_indent()
&& !quotecount)
--parencount;
if (*that == '\\' && *(that+1) != NUL)
amount += lbr_chartabsize_adv(&that,
(colnr_T)amount);
amount += lbr_chartabsize_adv(&that,
(colnr_T)amount);
amount += lbr_chartabsize_adv(
line, &that, (colnr_T)amount);
amount += lbr_chartabsize_adv(
line, &that, (colnr_T)amount);
}
}
while (vim_iswhite(*that))
{
amount += lbr_chartabsize(that, (colnr_T)amount);
amount += lbr_chartabsize(
line, that, (colnr_T)amount);
that++;
}
if (!*that || *that == ';')