From 6c970c6fe581af02b32e5b83886917ca9f8e5876 Mon Sep 17 00:00:00 2001 From: Karsten Hopp Date: Jul 22 2014 13:41:42 +0000 Subject: - patchlevel 338 --- diff --git a/7.4.338 b/7.4.338 new file mode 100644 index 0000000..f533693 --- /dev/null +++ b/7.4.338 @@ -0,0 +1,1830 @@ +To: vim_dev@googlegroups.com +Subject: Patch 7.4.338 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.4.338 +Problem: Cannot wrap lines taking indent into account. +Solution: Add the 'breakindent' option. (many authors, final improvements by + Christian Brabandt) +Files: runtime/doc/eval.txt, runtime/doc/options.txt, runtime/optwin.vim, + src/buffer.c, src/charset.c, src/edit.c, src/ex_getln.c, + src/getchar.c, src/misc1.c, src/misc2.c, src/ops.c, src/option.c, + src/option.h, src/proto/charset.pro, src/proto/misc1.pro, + src/proto/option.pro, src/screen.c, src/structs.h, + src/testdir/Make_amiga.mak, src/testdir/Make_dos.mak, + src/testdir/Make_ming.mak, src/testdir/Make_os2.mak, + src/testdir/Make_vms.mms, src/testdir/Makefile, + src/testdir/test_breakindent.in, src/testdir/test_breakindent.ok, + src/ui.c + + +*** ../vim-7.4.337/runtime/doc/eval.txt 2014-06-17 17:48:21.768628007 +0200 +--- runtime/doc/eval.txt 2014-06-25 12:57:00.986115765 +0200 +*************** +*** 6639,6646 **** + keymap Compiled with 'keymap' support. + langmap Compiled with 'langmap' support. + libcall Compiled with |libcall()| support. +! linebreak Compiled with 'linebreak', 'breakat' and 'showbreak' +! support. + lispindent Compiled with support for lisp indenting. + listcmds Compiled with commands for the buffer list |:files| + and the argument list |arglist|. +--- 6651,6658 ---- + keymap Compiled with 'keymap' support. + langmap Compiled with 'langmap' support. + libcall Compiled with |libcall()| support. +! linebreak Compiled with 'linebreak', 'breakat', 'showbreak' and +! 'breakindent' support. + lispindent Compiled with support for lisp indenting. + listcmds Compiled with commands for the buffer list |:files| + and the argument list |arglist|. +*** ../vim-7.4.337/runtime/doc/options.txt 2014-06-17 17:48:21.768628007 +0200 +--- runtime/doc/options.txt 2014-06-25 12:57:00.986115765 +0200 +*************** +*** 1200,1205 **** +--- 1200,1237 ---- + break if 'linebreak' is on. Only works for ASCII and also for 8-bit + characters when 'encoding' is an 8-bit encoding. + ++ *'breakindent'* *'bri'* ++ 'breakindent' 'bri' boolean (default off) ++ local to window ++ {not in Vi} ++ {not available when compiled without the |+linebreak| ++ feature} ++ Every wrapped line will continue visually indented (same amount of ++ space as the beginning of that line), thus preserving horizontal blocks ++ of text. ++ ++ *'breakindentopt'* *'briopt'* ++ 'breakindentopt' 'briopt' string (default empty) ++ local to window ++ {not in Vi} ++ {not available when compiled without the |+linebreak| ++ feature} ++ Settings for 'breakindent'. It can consist of the following optional ++ items and must be seperated by a comma: ++ min:{n} Minimum text width that will be kept after ++ applying 'breakindent', even if the resulting ++ text should normally be narrower. This prevents ++ text indented almost to the right window border ++ occupying lot of vertical space when broken. ++ shift:{n} After applying 'breakindent', wrapped line ++ beginning will be shift by given number of ++ characters. It permits dynamic French paragraph ++ indentation (negative) or emphasizing the line ++ continuation (positive). ++ sbr Display the 'showbreak' value before applying the ++ additional indent. ++ The default value for min is 20 and shift is 0. ++ + *'browsedir'* *'bsdir'* + 'browsedir' 'bsdir' string (default: "last") + global +*** ../vim-7.4.337/runtime/optwin.vim 2014-04-01 12:26:40.241157964 +0200 +--- runtime/optwin.vim 2014-06-25 12:57:00.990115765 +0200 +*************** +*** 324,329 **** +--- 324,335 ---- + call append("$", "linebreak\twrap long lines at a character in 'breakat'") + call append("$", "\t(local to window)") + call BinOptionL("lbr") ++ call append("$", "breakindent\tpreserve indentation in wrapped text") ++ call append("$", "\t(local to window)") ++ call BinOptionL("bri") ++ call append("$", "breakindentopt\tadjust breakindent behaviour") ++ call append("$", "\t(local to window)") ++ call OptionL("briopt") + call append("$", "breakat\twhich characters might cause a line break") + call OptionG("brk", &brk) + call append("$", "showbreak\tstring to put before wrapped screen lines") +*** ../vim-7.4.337/src/charset.c 2014-03-23 15:12:29.911264336 +0100 +--- src/charset.c 2014-06-25 13:23:05.842174966 +0200 +*************** +*** 867,875 **** + char_u *s; + { + colnr_T col = startcol; + + while (*s != NUL) +! col += lbr_chartabsize_adv(&s, col); + return (int)col; + } + +--- 867,876 ---- + char_u *s; + { + colnr_T col = startcol; ++ char_u *line = s; /* pointer to start of line, for breakindent */ + + while (*s != NUL) +! col += lbr_chartabsize_adv(line, &s, col); + return (int)col; + } + +*************** +*** 877,892 **** + * Like linetabsize(), but for a given window instead of the current one. + */ + int +! win_linetabsize(wp, p, len) + win_T *wp; +! char_u *p; + colnr_T len; + { + colnr_T col = 0; + char_u *s; + +! for (s = p; *s != NUL && (len == MAXCOL || s < p + len); mb_ptr_adv(s)) +! col += win_lbr_chartabsize(wp, s, col, NULL); + return (int)col; + } + +--- 878,894 ---- + * Like linetabsize(), but for a given window instead of the current one. + */ + int +! win_linetabsize(wp, line, len) + win_T *wp; +! char_u *line; + colnr_T len; + { + colnr_T col = 0; + char_u *s; + +! for (s = line; *s != NUL && (len == MAXCOL || s < line + len); +! mb_ptr_adv(s)) +! col += win_lbr_chartabsize(wp, line, s, col, NULL); + return (int)col; + } + +*************** +*** 1021,1032 **** + * like chartabsize(), but also check for line breaks on the screen + */ + int +! lbr_chartabsize(s, col) + unsigned char *s; + colnr_T col; + { + #ifdef FEAT_LINEBREAK +! if (!curwin->w_p_lbr && *p_sbr == NUL) + { + #endif + #ifdef FEAT_MBYTE +--- 1023,1035 ---- + * like chartabsize(), but also check for line breaks on the screen + */ + int +! lbr_chartabsize(line, s, col) +! char_u *line; /* start of the line */ + unsigned char *s; + colnr_T col; + { + #ifdef FEAT_LINEBREAK +! if (!curwin->w_p_lbr && *p_sbr == NUL && !curwin->w_p_bri) + { + #endif + #ifdef FEAT_MBYTE +*************** +*** 1036,1042 **** + RET_WIN_BUF_CHARTABSIZE(curwin, curbuf, s, col) + #ifdef FEAT_LINEBREAK + } +! return win_lbr_chartabsize(curwin, s, col, NULL); + #endif + } + +--- 1039,1045 ---- + RET_WIN_BUF_CHARTABSIZE(curwin, curbuf, s, col) + #ifdef FEAT_LINEBREAK + } +! return win_lbr_chartabsize(curwin, line == NULL ? s : line, s, col, NULL); + #endif + } + +*************** +*** 1044,1056 **** + * Call lbr_chartabsize() and advance the pointer. + */ + int +! lbr_chartabsize_adv(s, col) + char_u **s; + colnr_T col; + { + int retval; + +! retval = lbr_chartabsize(*s, col); + mb_ptr_adv(*s); + return retval; + } +--- 1047,1060 ---- + * Call lbr_chartabsize() and advance the pointer. + */ + int +! lbr_chartabsize_adv(line, s, col) +! char_u *line; /* start of the line */ + char_u **s; + colnr_T col; + { + int retval; + +! retval = lbr_chartabsize(line, *s, col); + mb_ptr_adv(*s); + return retval; + } +*************** +*** 1063,1070 **** + * value, init to 0 before calling. + */ + int +! win_lbr_chartabsize(wp, s, col, headp) + win_T *wp; + char_u *s; + colnr_T col; + int *headp UNUSED; +--- 1067,1075 ---- + * value, init to 0 before calling. + */ + int +! win_lbr_chartabsize(wp, line, s, col, headp) + win_T *wp; ++ char_u *line; /* start of the line */ + char_u *s; + colnr_T col; + int *headp UNUSED; +*************** +*** 1086,1094 **** + int n; + + /* +! * No 'linebreak' and 'showbreak': return quickly. + */ +! if (!wp->w_p_lbr && *p_sbr == NUL) + #endif + { + #ifdef FEAT_MBYTE +--- 1091,1099 ---- + int n; + + /* +! * No 'linebreak', 'showbreak' and 'breakindent': return quickly. + */ +! if (!wp->w_p_lbr && !wp->w_p_bri && *p_sbr == NUL) + #endif + { + #ifdef FEAT_MBYTE +*************** +*** 1163,1173 **** + # endif + + /* +! * May have to add something for 'showbreak' string at start of line + * Set *headp to the size of what we add. + */ + added = 0; +! if (*p_sbr != NUL && wp->w_p_wrap && col != 0) + { + numberextra = win_col_off(wp); + col += numberextra + mb_added; +--- 1168,1179 ---- + # endif + + /* +! * May have to add something for 'breakindent' and/or 'showbreak' +! * string at start of line. + * Set *headp to the size of what we add. + */ + added = 0; +! if ((*p_sbr != NUL || wp->w_p_bri) && wp->w_p_wrap && col != 0) + { + numberextra = win_col_off(wp); + col += numberextra + mb_added; +*************** +*** 1180,1186 **** + } + if (col == 0 || col + size > (colnr_T)W_WIDTH(wp)) + { +! added = vim_strsize(p_sbr); + if (tab_corr) + size += (added / wp->w_buffer->b_p_ts) * wp->w_buffer->b_p_ts; + else +--- 1186,1197 ---- + } + if (col == 0 || col + size > (colnr_T)W_WIDTH(wp)) + { +! added = 0; +! if (*p_sbr != NUL) +! added += vim_strsize(p_sbr); +! if (wp->w_p_bri) +! added += get_breakindent_win(wp, line); +! + if (tab_corr) + size += (added / wp->w_buffer->b_p_ts) * wp->w_buffer->b_p_ts; + else +*************** +*** 1274,1286 **** + colnr_T vcol; + char_u *ptr; /* points to current char */ + char_u *posptr; /* points to char at pos->col */ + int incr; + int head; + int ts = wp->w_buffer->b_p_ts; + int c; + + vcol = 0; +! ptr = ml_get_buf(wp->w_buffer, pos->lnum, FALSE); + if (pos->col == MAXCOL) + posptr = NULL; /* continue until the NUL */ + else +--- 1285,1298 ---- + colnr_T vcol; + char_u *ptr; /* points to current char */ + char_u *posptr; /* points to char at pos->col */ ++ char_u *line; /* start of the line */ + int incr; + int head; + int ts = wp->w_buffer->b_p_ts; + int c; + + vcol = 0; +! line = ptr = ml_get_buf(wp->w_buffer, pos->lnum, FALSE); + if (pos->col == MAXCOL) + posptr = NULL; /* continue until the NUL */ + else +*************** +*** 1288,1299 **** + + /* + * This function is used very often, do some speed optimizations. +! * When 'list', 'linebreak' and 'showbreak' are not set use a simple loop. + * Also use this when 'list' is set but tabs take their normal size. + */ + if ((!wp->w_p_list || lcs_tab1 != NUL) + #ifdef FEAT_LINEBREAK +! && !wp->w_p_lbr && *p_sbr == NUL + #endif + ) + { +--- 1300,1312 ---- + + /* + * This function is used very often, do some speed optimizations. +! * When 'list', 'linebreak', 'showbreak' and 'breakindent' are not set +! * use a simple loop. + * Also use this when 'list' is set but tabs take their normal size. + */ + if ((!wp->w_p_list || lcs_tab1 != NUL) + #ifdef FEAT_LINEBREAK +! && !wp->w_p_lbr && *p_sbr == NUL && !wp->w_p_bri + #endif + ) + { +*************** +*** 1355,1361 **** + { + /* A tab gets expanded, depending on the current column */ + head = 0; +! incr = win_lbr_chartabsize(wp, ptr, vcol, &head); + /* make sure we don't go past the end of the line */ + if (*ptr == NUL) + { +--- 1368,1374 ---- + { + /* A tab gets expanded, depending on the current column */ + head = 0; +! incr = win_lbr_chartabsize(wp, line, ptr, vcol, &head); + /* make sure we don't go past the end of the line */ + if (*ptr == NUL) + { +*** ../vim-7.4.337/src/edit.c 2014-05-28 21:40:47.092329130 +0200 +--- src/edit.c 2014-06-25 13:16:43.278160493 +0200 +*************** +*** 1956,1962 **** + else + #endif + ++new_cursor_col; +! vcol += lbr_chartabsize(ptr + new_cursor_col, (colnr_T)vcol); + } + vcol = last_vcol; + +--- 1956,1962 ---- + else + #endif + ++new_cursor_col; +! vcol += lbr_chartabsize(ptr, ptr + new_cursor_col, (colnr_T)vcol); + } + vcol = last_vcol; + +*************** +*** 7126,7134 **** + for (;;) + { + coladvance(v - width); +! /* getviscol() is slow, skip it when 'showbreak' is empty and +! * there are no multi-byte characters */ +! if ((*p_sbr == NUL + # ifdef FEAT_MBYTE + && !has_mbyte + # endif +--- 7126,7135 ---- + for (;;) + { + coladvance(v - width); +! /* getviscol() is slow, skip it when 'showbreak' is empty, +! * 'breakindent' is not set and there are no multi-byte +! * characters */ +! if ((*p_sbr == NUL && !curwin->w_p_bri + # ifdef FEAT_MBYTE + && !has_mbyte + # endif +*************** +*** 9758,9768 **** + getvcol(curwin, &fpos, &vcol, NULL, NULL); + getvcol(curwin, cursor, &want_vcol, NULL, NULL); + +! /* Use as many TABs as possible. Beware of 'showbreak' and +! * 'linebreak' adding extra virtual columns. */ + while (vim_iswhite(*ptr)) + { +! i = lbr_chartabsize((char_u *)"\t", vcol); + if (vcol + i > want_vcol) + break; + if (*ptr != TAB) +--- 9759,9769 ---- + getvcol(curwin, &fpos, &vcol, NULL, NULL); + getvcol(curwin, cursor, &want_vcol, NULL, NULL); + +! /* Use as many TABs as possible. Beware of 'breakindent', 'showbreak' +! * and 'linebreak' adding extra virtual columns. */ + while (vim_iswhite(*ptr)) + { +! i = lbr_chartabsize(NULL, (char_u *)"\t", vcol); + if (vcol + i > want_vcol) + break; + if (*ptr != TAB) +*************** +*** 9784,9794 **** + if (change_col >= 0) + { + int repl_off = 0; + + /* Skip over the spaces we need. */ + while (vcol < want_vcol && *ptr == ' ') + { +! vcol += lbr_chartabsize(ptr, vcol); + ++ptr; + ++repl_off; + } +--- 9785,9796 ---- + if (change_col >= 0) + { + int repl_off = 0; ++ char_u *line = ptr; + + /* Skip over the spaces we need. */ + while (vcol < want_vcol && *ptr == ' ') + { +! vcol += lbr_chartabsize(line, ptr, vcol); + ++ptr; + ++repl_off; + } +*************** +*** 10029,10034 **** +--- 10031,10037 ---- + int c; + int temp; + char_u *ptr, *prev_ptr; ++ char_u *line; + + if (lnum < 1 || lnum > curbuf->b_ml.ml_line_count) + { +*************** +*** 10038,10050 **** + + /* try to advance to the cursor column */ + temp = 0; +! ptr = ml_get(lnum); + prev_ptr = ptr; + validate_virtcol(); + while ((colnr_T)temp < curwin->w_virtcol && *ptr != NUL) + { + prev_ptr = ptr; +! temp += lbr_chartabsize_adv(&ptr, (colnr_T)temp); + } + if ((colnr_T)temp > curwin->w_virtcol) + ptr = prev_ptr; +--- 10041,10053 ---- + + /* try to advance to the cursor column */ + temp = 0; +! line = ptr = ml_get(lnum); + prev_ptr = ptr; + validate_virtcol(); + while ((colnr_T)temp < curwin->w_virtcol && *ptr != NUL) + { + prev_ptr = ptr; +! temp += lbr_chartabsize_adv(line, &ptr, (colnr_T)temp); + } + if ((colnr_T)temp > curwin->w_virtcol) + ptr = prev_ptr; +*** ../vim-7.4.337/src/ex_getln.c 2014-06-25 12:26:42.230046959 +0200 +--- src/ex_getln.c 2014-06-25 12:57:00.998115765 +0200 +*************** +*** 2302,2311 **** + + p = (char_u *)line_ga.ga_data; + p[line_ga.ga_len] = NUL; +! indent = get_indent_str(p, 8); + indent += sw - indent % sw; + add_indent: +! while (get_indent_str(p, 8) < indent) + { + char_u *s = skipwhite(p); + +--- 2302,2311 ---- + + p = (char_u *)line_ga.ga_data; + p[line_ga.ga_len] = NUL; +! indent = get_indent_str(p, 8, FALSE); + indent += sw - indent % sw; + add_indent: +! while (get_indent_str(p, 8, FALSE) < indent) + { + char_u *s = skipwhite(p); + +*************** +*** 2357,2367 **** + else + { + p[line_ga.ga_len] = NUL; +! indent = get_indent_str(p, 8); + --indent; + indent -= indent % get_sw_value(curbuf); + } +! while (get_indent_str(p, 8) > indent) + { + char_u *s = skipwhite(p); + +--- 2357,2367 ---- + else + { + p[line_ga.ga_len] = NUL; +! indent = get_indent_str(p, 8, FALSE); + --indent; + indent -= indent % get_sw_value(curbuf); + } +! while (get_indent_str(p, 8, FALSE) > indent) + { + char_u *s = skipwhite(p); + +*** ../vim-7.4.337/src/getchar.c 2014-05-22 18:59:54.510169240 +0200 +--- src/getchar.c 2014-06-25 13:16:53.946160896 +0200 +*************** +*** 2675,2681 **** + { + if (!vim_iswhite(ptr[col])) + curwin->w_wcol = vcol; +! vcol += lbr_chartabsize(ptr + col, + (colnr_T)vcol); + #ifdef FEAT_MBYTE + if (has_mbyte) +--- 2675,2681 ---- + { + if (!vim_iswhite(ptr[col])) + curwin->w_wcol = vcol; +! vcol += lbr_chartabsize(ptr, ptr + col, + (colnr_T)vcol); + #ifdef FEAT_MBYTE + if (has_mbyte) +*** ../vim-7.4.337/src/misc1.c 2014-05-22 14:00:12.698534712 +0200 +--- src/misc1.c 2014-06-25 13:39:43.598212712 +0200 +*************** +*** 32,38 **** + int + get_indent() + { +! return get_indent_str(ml_get_curline(), (int)curbuf->b_p_ts); + } + + /* +--- 32,38 ---- + int + get_indent() + { +! return get_indent_str(ml_get_curline(), (int)curbuf->b_p_ts, FALSE); + } + + /* +*************** +*** 42,48 **** + get_indent_lnum(lnum) + linenr_T lnum; + { +! return get_indent_str(ml_get(lnum), (int)curbuf->b_p_ts); + } + + #if defined(FEAT_FOLDING) || defined(PROTO) +--- 42,48 ---- + get_indent_lnum(lnum) + linenr_T lnum; + { +! return get_indent_str(ml_get(lnum), (int)curbuf->b_p_ts, FALSE); + } + + #if defined(FEAT_FOLDING) || defined(PROTO) +*************** +*** 55,61 **** + buf_T *buf; + linenr_T lnum; + { +! return get_indent_str(ml_get_buf(buf, lnum, FALSE), (int)buf->b_p_ts); + } + #endif + +--- 55,61 ---- + buf_T *buf; + linenr_T lnum; + { +! return get_indent_str(ml_get_buf(buf, lnum, FALSE), (int)buf->b_p_ts, FALSE); + } + #endif + +*************** +*** 64,79 **** + * 'tabstop' at "ts" + */ + int +! get_indent_str(ptr, ts) + char_u *ptr; + int ts; + { + int count = 0; + + for ( ; *ptr; ++ptr) + { +! if (*ptr == TAB) /* count a tab for what it is worth */ +! count += ts - (count % ts); + else if (*ptr == ' ') + ++count; /* count a space for one */ + else +--- 64,86 ---- + * 'tabstop' at "ts" + */ + int +! 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) +! { +! 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,481 **** +--- 483,540 ---- + 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,684 **** + /* + * count white space on current line + */ +! newindent = get_indent_str(saved_line, (int)curbuf->b_p_ts); + if (newindent == 0 && !(flags & OPENLINE_COM_LIST)) + newindent = second_line_indent; /* for ^^D command in insert mode */ + +--- 737,743 ---- + /* + * count white space on current line + */ +! 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,1207 **** + || do_si + #endif + ) +! newindent = get_indent_str(leader, (int)curbuf->b_p_ts); + + /* Add the indent offset */ + if (newindent + off < 0) +--- 1260,1266 ---- + || do_si + #endif + ) +! newindent = get_indent_str(leader, (int)curbuf->b_p_ts, FALSE); + + /* Add the indent offset */ + if (newindent + off < 0) +*************** +*** 1994,1999 **** +--- 2053,2059 ---- + 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,2020 **** + return lines + 1; + #endif + +! 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); + mb_ptr_adv(s); + } + +--- 2069,2080 ---- + return lines + 1; + #endif + +! line = s = ml_get_buf(wp->w_buffer, lnum, FALSE); + + col = 0; + while (*s != NUL && --column >= 0) + { +! col += win_lbr_chartabsize(wp, line, s, (colnr_T)col, NULL); + mb_ptr_adv(s); + } + +*************** +*** 2026,2032 **** + * 'ts') -- webb. + */ + if (*s == TAB && (State & NORMAL) && (!wp->w_p_list || lcs_tab1)) +! col += win_lbr_chartabsize(wp, s, (colnr_T)col, NULL) - 1; + + /* + * Add column offset for 'number', 'relativenumber', 'foldcolumn', etc. +--- 2086,2092 ---- + * 'ts') -- webb. + */ + if (*s == TAB && (State & NORMAL) && (!wp->w_p_list || lcs_tab1)) +! col += win_lbr_chartabsize(wp, line, s, (colnr_T)col, NULL) - 1; + + /* + * Add column offset for 'number', 'relativenumber', 'foldcolumn', etc. +*************** +*** 9002,9011 **** + amount = 2; + else + { + amount = 0; + while (*that && col) + { +! amount += lbr_chartabsize_adv(&that, (colnr_T)amount); + col--; + } + +--- 9062,9073 ---- + amount = 2; + else + { ++ char_u *line = that; ++ + amount = 0; + while (*that && col) + { +! amount += lbr_chartabsize_adv(line, &that, (colnr_T)amount); + col--; + } + +*************** +*** 9028,9034 **** + + while (vim_iswhite(*that)) + { +! amount += lbr_chartabsize(that, (colnr_T)amount); + ++that; + } + +--- 9090,9096 ---- + + while (vim_iswhite(*that)) + { +! amount += lbr_chartabsize(line, that, (colnr_T)amount); + ++that; + } + +*************** +*** 9066,9080 **** + && !quotecount) + --parencount; + if (*that == '\\' && *(that+1) != NUL) +! amount += lbr_chartabsize_adv(&that, +! (colnr_T)amount); +! amount += lbr_chartabsize_adv(&that, +! (colnr_T)amount); + } + } + while (vim_iswhite(*that)) + { +! amount += lbr_chartabsize(that, (colnr_T)amount); + that++; + } + if (!*that || *that == ';') +--- 9128,9143 ---- + && !quotecount) + --parencount; + if (*that == '\\' && *(that+1) != NUL) +! 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( +! line, that, (colnr_T)amount); + that++; + } + if (!*that || *that == ';') +*** ../vim-7.4.337/src/misc2.c 2014-05-07 18:35:25.669216052 +0200 +--- src/misc2.c 2014-06-25 13:21:18.474170904 +0200 +*************** +*** 201,210 **** + { + /* Count a tab for what it's worth (if list mode not on) */ + #ifdef FEAT_LINEBREAK +! csize = win_lbr_chartabsize(curwin, ptr, col, &head); + mb_ptr_adv(ptr); + #else +! csize = lbr_chartabsize_adv(&ptr, col); + #endif + col += csize; + } +--- 201,210 ---- + { + /* Count a tab for what it's worth (if list mode not on) */ + #ifdef FEAT_LINEBREAK +! csize = win_lbr_chartabsize(curwin, line, ptr, col, &head); + mb_ptr_adv(ptr); + #else +! csize = lbr_chartabsize_adv(line, &ptr, col); + #endif + col += csize; + } +*************** +*** 2156,2162 **** + } + } + +! #if (defined(UNIX) && !defined(USE_SYSTEM)) || defined(WIN3264) + /* + * Append the text in "gap" below the cursor line and clear "gap". + */ +--- 2156,2163 ---- + } + } + +! #if (defined(UNIX) && !defined(USE_SYSTEM)) || defined(WIN3264) \ +! || defined(PROTO) + /* + * Append the text in "gap" below the cursor line and clear "gap". + */ +*** ../vim-7.4.337/src/ops.c 2014-06-17 18:16:08.420691059 +0200 +--- src/ops.c 2014-06-25 13:18:27.082164420 +0200 +*************** +*** 420,426 **** + } + for ( ; vim_iswhite(*bd.textstart); ) + { +! incr = lbr_chartabsize_adv(&bd.textstart, (colnr_T)(bd.start_vcol)); + total += incr; + bd.start_vcol += incr; + } +--- 420,428 ---- + } + for ( ; vim_iswhite(*bd.textstart); ) + { +! /* TODO: is passing bd.textstart for start of the line OK? */ +! incr = lbr_chartabsize_adv(bd.textstart, &bd.textstart, +! (colnr_T)(bd.start_vcol)); + total += incr; + bd.start_vcol += incr; + } +*************** +*** 480,486 **** + + while (vim_iswhite(*non_white)) + { +! incr = lbr_chartabsize_adv(&non_white, non_white_col); + non_white_col += incr; + } + +--- 482,488 ---- + + while (vim_iswhite(*non_white)) + { +! incr = lbr_chartabsize_adv(bd.textstart, &non_white, non_white_col); + non_white_col += incr; + } + +*************** +*** 505,511 **** + verbatim_copy_width -= bd.start_char_vcols; + while (verbatim_copy_width < destination_col) + { +! incr = lbr_chartabsize(verbatim_copy_end, verbatim_copy_width); + if (verbatim_copy_width + incr > destination_col) + break; + verbatim_copy_width += incr; +--- 507,517 ---- + verbatim_copy_width -= bd.start_char_vcols; + while (verbatim_copy_width < destination_col) + { +! char_u *line = verbatim_copy_end; +! +! /* TODO: is passing verbatim_copy_end for start of the line OK? */ +! incr = lbr_chartabsize(line, verbatim_copy_end, +! verbatim_copy_width); + if (verbatim_copy_width + incr > destination_col) + break; + verbatim_copy_width += incr; +*************** +*** 3617,3623 **** + for (ptr = oldp; vcol < col && *ptr; ) + { + /* Count a tab for what it's worth (if list mode not on) */ +! incr = lbr_chartabsize_adv(&ptr, (colnr_T)vcol); + vcol += incr; + } + bd.textcol = (colnr_T)(ptr - oldp); +--- 3623,3629 ---- + for (ptr = oldp; vcol < col && *ptr; ) + { + /* Count a tab for what it's worth (if list mode not on) */ +! incr = lbr_chartabsize_adv(oldp, &ptr, (colnr_T)vcol); + vcol += incr; + } + bd.textcol = (colnr_T)(ptr - oldp); +*************** +*** 3651,3657 **** + /* calculate number of spaces required to fill right side of block*/ + spaces = y_width + 1; + for (j = 0; j < yanklen; j++) +! spaces -= lbr_chartabsize(&y_array[i][j], 0); + if (spaces < 0) + spaces = 0; + +--- 3657,3663 ---- + /* calculate number of spaces required to fill right side of block*/ + spaces = y_width + 1; + for (j = 0; j < yanklen; j++) +! spaces -= lbr_chartabsize(NULL, &y_array[i][j], 0); + if (spaces < 0) + spaces = 0; + +*************** +*** 5203,5209 **** + while (bdp->start_vcol < oap->start_vcol && *pstart) + { + /* Count a tab for what it's worth (if list mode not on) */ +! incr = lbr_chartabsize(pstart, (colnr_T)bdp->start_vcol); + bdp->start_vcol += incr; + #ifdef FEAT_VISUALEXTRA + if (vim_iswhite(*pstart)) +--- 5209,5215 ---- + while (bdp->start_vcol < oap->start_vcol && *pstart) + { + /* Count a tab for what it's worth (if list mode not on) */ +! incr = lbr_chartabsize(line, pstart, (colnr_T)bdp->start_vcol); + bdp->start_vcol += incr; + #ifdef FEAT_VISUALEXTRA + if (vim_iswhite(*pstart)) +*************** +*** 5272,5278 **** + { + /* Count a tab for what it's worth (if list mode not on) */ + prev_pend = pend; +! incr = lbr_chartabsize_adv(&pend, (colnr_T)bdp->end_vcol); + bdp->end_vcol += incr; + } + if (bdp->end_vcol <= oap->end_vcol +--- 5278,5287 ---- + { + /* Count a tab for what it's worth (if list mode not on) */ + prev_pend = pend; +! /* TODO: is passing prev_pend for start of the line OK? +! * perhaps it should be "line". */ +! incr = lbr_chartabsize_adv(prev_pend, &pend, +! (colnr_T)bdp->end_vcol); + bdp->end_vcol += incr; + } + if (bdp->end_vcol <= oap->end_vcol +*************** +*** 6882,6888 **** + validate_virtcol(); + col_print(buf1, sizeof(buf1), (int)curwin->w_cursor.col + 1, + (int)curwin->w_virtcol + 1); +! col_print(buf2, sizeof(buf2), (int)STRLEN(p), linetabsize(p)); + + if (char_count_cursor == byte_count_cursor + && char_count == byte_count) +--- 6891,6898 ---- + validate_virtcol(); + col_print(buf1, sizeof(buf1), (int)curwin->w_cursor.col + 1, + (int)curwin->w_virtcol + 1); +! col_print(buf2, sizeof(buf2), (int)STRLEN(p), +! linetabsize(p)); + + if (char_count_cursor == byte_count_cursor + && char_count == byte_count) +*** ../vim-7.4.337/src/option.c 2014-06-25 11:48:40.733960646 +0200 +--- src/option.c 2014-06-25 14:31:41.630330672 +0200 +*************** +*** 188,193 **** +--- 188,197 ---- + #ifdef FEAT_ARABIC + # define PV_ARAB OPT_WIN(WV_ARAB) + #endif ++ #ifdef FEAT_LINEBREAK ++ # define PV_BRI OPT_WIN(WV_BRI) ++ # define PV_BRIOPT OPT_WIN(WV_BRIOPT) ++ #endif + #ifdef FEAT_DIFF + # define PV_DIFF OPT_WIN(WV_DIFF) + #endif +*************** +*** 648,653 **** +--- 652,675 ---- + {(char_u *)0L, (char_u *)0L} + #endif + SCRIPTID_INIT}, ++ {"breakindent", "bri", P_BOOL|P_VI_DEF|P_VIM|P_RWIN, ++ #ifdef FEAT_LINEBREAK ++ (char_u *)VAR_WIN, PV_BRI, ++ {(char_u *)FALSE, (char_u *)0L} ++ #else ++ (char_u *)NULL, PV_NONE, ++ {(char_u *)0L, (char_u *)0L} ++ #endif ++ SCRIPTID_INIT}, ++ {"breakindentopt", "briopt", P_STRING|P_ALLOCED|P_VI_DEF|P_RBUF|P_COMMA|P_NODUP, ++ #ifdef FEAT_LINEBREAK ++ (char_u *)VAR_WIN, PV_BRIOPT, ++ {(char_u *)"", (char_u *)NULL} ++ #else ++ (char_u *)NULL, PV_NONE, ++ {(char_u *)"", (char_u *)NULL} ++ #endif ++ SCRIPTID_INIT}, + {"browsedir", "bsdir",P_STRING|P_VI_DEF, + #ifdef FEAT_BROWSE + (char_u *)&p_bsdir, PV_NONE, +*************** +*** 5256,5261 **** +--- 5278,5286 ---- + /* set cedit_key */ + (void)check_cedit(); + #endif ++ #ifdef FEAT_LINEBREAK ++ briopt_check(); ++ #endif + } + + /* +*************** +*** 5709,5714 **** +--- 5734,5747 ---- + *p_pm == '.' ? p_pm + 1 : p_pm) == 0) + errmsg = (char_u *)N_("E589: 'backupext' and 'patchmode' are equal"); + } ++ #ifdef FEAT_LINEBREAK ++ /* 'breakindentopt' */ ++ else if (varp == &curwin->w_p_briopt) ++ { ++ if (briopt_check() == FAIL) ++ errmsg = e_invarg; ++ } ++ #endif + + /* + * 'isident', 'iskeyword', 'isprint or 'isfname' option: refill chartab[] +*************** +*** 10018,10023 **** +--- 10051,10058 ---- + case PV_WRAP: return (char_u *)&(curwin->w_p_wrap); + #ifdef FEAT_LINEBREAK + case PV_LBR: return (char_u *)&(curwin->w_p_lbr); ++ case PV_BRI: return (char_u *)&(curwin->w_p_bri); ++ case PV_BRIOPT: return (char_u *)&(curwin->w_p_briopt); + #endif + #ifdef FEAT_SCROLLBIND + case PV_SCBIND: return (char_u *)&(curwin->w_p_scb); +*************** +*** 10207,10212 **** +--- 10242,10249 ---- + #endif + #ifdef FEAT_LINEBREAK + to->wo_lbr = from->wo_lbr; ++ to->wo_bri = from->wo_bri; ++ to->wo_briopt = vim_strsave(from->wo_briopt); + #endif + #ifdef FEAT_SCROLLBIND + to->wo_scb = from->wo_scb; +*************** +*** 10294,10299 **** +--- 10331,10339 ---- + #ifdef FEAT_CONCEAL + check_string_option(&wop->wo_cocu); + #endif ++ #ifdef FEAT_LINEBREAK ++ check_string_option(&wop->wo_briopt); ++ #endif + } + + /* +*************** +*** 10313,10318 **** +--- 10353,10361 ---- + # endif + clear_string_option(&wop->wo_fmr); + #endif ++ #ifdef FEAT_LINEBREAK ++ clear_string_option(&wop->wo_briopt); ++ #endif + #ifdef FEAT_RIGHTLEFT + clear_string_option(&wop->wo_rlc); + #endif +*************** +*** 11927,11929 **** +--- 11970,12018 ---- + ++ptr; + } + } ++ ++ #if defined(FEAT_LINEBREAK) || defined(PROTO) ++ /* ++ * This is called when 'breakindentopt' is changed and when a window is ++ * initialized. ++ */ ++ int ++ briopt_check() ++ { ++ char_u *p; ++ int bri_shift = 0; ++ long bri_min = 20; ++ int bri_sbr = FALSE; ++ ++ p = curwin->w_p_briopt; ++ while (*p != NUL) ++ { ++ if (STRNCMP(p, "shift:", 6) == 0 ++ && ((p[6] == '-' && VIM_ISDIGIT(p[7])) || VIM_ISDIGIT(p[6]))) ++ { ++ p += 6; ++ bri_shift = getdigits(&p); ++ } ++ else if (STRNCMP(p, "min:", 4) == 0 && VIM_ISDIGIT(p[4])) ++ { ++ p += 4; ++ bri_min = getdigits(&p); ++ } ++ else if (STRNCMP(p, "sbr", 3) == 0) ++ { ++ p += 3; ++ bri_sbr = TRUE; ++ } ++ if (*p != ',' && *p != NUL) ++ return FAIL; ++ if (*p == ',') ++ ++p; ++ } ++ ++ curwin->w_p_brishift = bri_shift; ++ curwin->w_p_brimin = bri_min; ++ curwin->w_p_brisbr = bri_sbr; ++ ++ return OK; ++ } ++ #endif +*** ../vim-7.4.337/src/option.h 2014-05-28 21:40:47.092329130 +0200 +--- src/option.h 2014-06-25 12:57:01.002115765 +0200 +*************** +*** 1052,1057 **** +--- 1052,1061 ---- + #ifdef FEAT_CURSORBIND + , WV_CRBIND + #endif ++ #ifdef FEAT_LINEBREAK ++ , WV_BRI ++ , WV_BRIOPT ++ #endif + #ifdef FEAT_DIFF + , WV_DIFF + #endif +*** ../vim-7.4.337/src/proto/charset.pro 2013-08-10 13:37:07.000000000 +0200 +--- src/proto/charset.pro 2014-06-25 13:22:32.934173721 +0200 +*************** +*** 16,22 **** + int chartabsize __ARGS((char_u *p, colnr_T col)); + int linetabsize __ARGS((char_u *s)); + int linetabsize_col __ARGS((int startcol, char_u *s)); +! int win_linetabsize __ARGS((win_T *wp, char_u *p, colnr_T len)); + int vim_isIDc __ARGS((int c)); + int vim_iswordc __ARGS((int c)); + int vim_iswordc_buf __ARGS((int c, buf_T *buf)); +--- 16,22 ---- + int chartabsize __ARGS((char_u *p, colnr_T col)); + int linetabsize __ARGS((char_u *s)); + int linetabsize_col __ARGS((int startcol, char_u *s)); +! int win_linetabsize __ARGS((win_T *wp, char_u *line, colnr_T len)); + int vim_isIDc __ARGS((int c)); + int vim_iswordc __ARGS((int c)); + int vim_iswordc_buf __ARGS((int c, buf_T *buf)); +*************** +*** 26,34 **** + int vim_isfilec_or_wc __ARGS((int c)); + int vim_isprintc __ARGS((int c)); + int vim_isprintc_strict __ARGS((int c)); +! int lbr_chartabsize __ARGS((unsigned char *s, colnr_T col)); +! int lbr_chartabsize_adv __ARGS((char_u **s, colnr_T col)); +! int win_lbr_chartabsize __ARGS((win_T *wp, char_u *s, colnr_T col, int *headp)); + int in_win_border __ARGS((win_T *wp, colnr_T vcol)); + void getvcol __ARGS((win_T *wp, pos_T *pos, colnr_T *start, colnr_T *cursor, colnr_T *end)); + colnr_T getvcol_nolist __ARGS((pos_T *posp)); +--- 26,34 ---- + int vim_isfilec_or_wc __ARGS((int c)); + int vim_isprintc __ARGS((int c)); + int vim_isprintc_strict __ARGS((int c)); +! int lbr_chartabsize __ARGS((char_u *line, unsigned char *s, colnr_T col)); +! int lbr_chartabsize_adv __ARGS((char_u *line, char_u **s, colnr_T col)); +! int win_lbr_chartabsize __ARGS((win_T *wp, char_u *line, char_u *s, colnr_T col, int *headp)); + int in_win_border __ARGS((win_T *wp, colnr_T vcol)); + void getvcol __ARGS((win_T *wp, pos_T *pos, colnr_T *start, colnr_T *cursor, colnr_T *end)); + colnr_T getvcol_nolist __ARGS((pos_T *posp)); +*** ../vim-7.4.337/src/proto/misc1.pro 2014-05-07 15:10:17.661108310 +0200 +--- src/proto/misc1.pro 2014-06-25 12:57:01.002115765 +0200 +*************** +*** 2,10 **** + int get_indent __ARGS((void)); + int get_indent_lnum __ARGS((linenr_T lnum)); + int get_indent_buf __ARGS((buf_T *buf, linenr_T lnum)); +! int get_indent_str __ARGS((char_u *ptr, int ts)); + int set_indent __ARGS((int size, int flags)); + int get_number_indent __ARGS((linenr_T lnum)); + int open_line __ARGS((int dir, int flags, int second_line_indent)); + int get_leader_len __ARGS((char_u *line, char_u **flags, int backward, int include_space)); + int get_last_leader_offset __ARGS((char_u *line, char_u **flags)); +--- 2,11 ---- + int get_indent __ARGS((void)); + int get_indent_lnum __ARGS((linenr_T lnum)); + int get_indent_buf __ARGS((buf_T *buf, linenr_T lnum)); +! int get_indent_str __ARGS((char_u *ptr, int ts, int list)); + int set_indent __ARGS((int size, int flags)); + int get_number_indent __ARGS((linenr_T lnum)); ++ int get_breakindent_win __ARGS((win_T *wp, char_u *ptr)); + int open_line __ARGS((int dir, int flags, int second_line_indent)); + int get_leader_len __ARGS((char_u *line, char_u **flags, int backward, int include_space)); + int get_last_leader_offset __ARGS((char_u *line, char_u **flags)); +*** ../vim-7.4.337/src/proto/option.pro 2014-01-14 16:54:53.000000000 +0100 +--- src/proto/option.pro 2014-06-25 14:16:04.882295233 +0200 +*************** +*** 63,66 **** +--- 63,67 ---- + long get_sw_value __ARGS((buf_T *buf)); + long get_sts_value __ARGS((void)); + void find_mps_values __ARGS((int *initc, int *findc, int *backwards, int switchit)); ++ int briopt_check __ARGS((void)); + /* vim: set ft=c : */ +*** ../vim-7.4.337/src/screen.c 2014-06-18 21:20:07.232377308 +0200 +--- src/screen.c 2014-06-25 13:43:39.930221653 +0200 +*************** +*** 2962,2971 **** + # define WL_SIGN WL_FOLD /* column for signs */ + #endif + #define WL_NR WL_SIGN + 1 /* line number */ + #if defined(FEAT_LINEBREAK) || defined(FEAT_DIFF) +! # define WL_SBR WL_NR + 1 /* 'showbreak' or 'diff' */ + #else +! # define WL_SBR WL_NR + #endif + #define WL_LINE WL_SBR + 1 /* text in the line */ + int draw_state = WL_START; /* what to draw next */ +--- 2962,2976 ---- + # define WL_SIGN WL_FOLD /* column for signs */ + #endif + #define WL_NR WL_SIGN + 1 /* line number */ ++ #ifdef FEAT_LINEBREAK ++ # define WL_BRI WL_NR + 1 /* 'breakindent' */ ++ #else ++ # define WL_BRI WL_NR ++ #endif + #if defined(FEAT_LINEBREAK) || defined(FEAT_DIFF) +! # define WL_SBR WL_BRI + 1 /* 'showbreak' or 'diff' */ + #else +! # define WL_SBR WL_BRI + #endif + #define WL_LINE WL_SBR + 1 /* text in the line */ + int draw_state = WL_START; /* what to draw next */ +*************** +*** 3301,3307 **** + #endif + while (vcol < v && *ptr != NUL) + { +! c = win_lbr_chartabsize(wp, ptr, (colnr_T)vcol, NULL); + vcol += c; + #ifdef FEAT_MBYTE + prev_ptr = ptr; +--- 3306,3312 ---- + #endif + while (vcol < v && *ptr != NUL) + { +! c = win_lbr_chartabsize(wp, line, ptr, (colnr_T)vcol, NULL); + vcol += c; + #ifdef FEAT_MBYTE + prev_ptr = ptr; +*************** +*** 3670,3675 **** +--- 3675,3718 ---- + } + } + ++ #ifdef FEAT_LINEBREAK ++ if (wp->w_p_brisbr && draw_state == WL_BRI - 1 ++ && n_extra == 0 && *p_sbr != NUL) ++ /* draw indent after showbreak value */ ++ draw_state = WL_BRI; ++ else if (wp->w_p_brisbr && draw_state == WL_SBR && n_extra == 0) ++ /* After the showbreak, draw the breakindent */ ++ draw_state = WL_BRI - 1; ++ ++ /* draw 'breakindent': indent wrapped text accordingly */ ++ if (draw_state == WL_BRI - 1 && n_extra == 0) ++ { ++ draw_state = WL_BRI; ++ # ifdef FEAT_DIFF ++ # endif ++ if (wp->w_p_bri && n_extra == 0 && row != startrow ++ #ifdef FEAT_DIFF ++ && filler_lines == 0 ++ #endif ++ ) ++ { ++ char_attr = 0; /* was: hl_attr(HLF_AT); */ ++ #ifdef FEAT_DIFF ++ if (diff_hlf != (hlf_T)0) ++ char_attr = hl_attr(diff_hlf); ++ #endif ++ p_extra = NUL; ++ c_extra = ' '; ++ n_extra = get_breakindent_win(wp, ++ ml_get_buf(wp->w_buffer, lnum, FALSE)); ++ /* Correct end of highlighted area for 'breakindent', ++ * required when 'linebreak' is also set. */ ++ if (tocol == vcol) ++ tocol += n_extra; ++ } ++ } ++ #endif ++ + #if defined(FEAT_LINEBREAK) || defined(FEAT_DIFF) + if (draw_state == WL_SBR - 1 && n_extra == 0) + { +*************** +*** 4382,4392 **** + if (wp->w_p_lbr && vim_isbreak(c) && !vim_isbreak(*ptr) + && !wp->w_p_list) + { +! n_extra = win_lbr_chartabsize(wp, ptr - ( + # ifdef FEAT_MBYTE + has_mbyte ? mb_l : + # endif +! 1), (colnr_T)vcol, NULL) - 1; + c_extra = ' '; + if (vim_iswhite(c)) + { +--- 4425,4438 ---- + if (wp->w_p_lbr && vim_isbreak(c) && !vim_isbreak(*ptr) + && !wp->w_p_list) + { +! char_u *p = ptr - ( + # ifdef FEAT_MBYTE + has_mbyte ? mb_l : + # endif +! 1); +! /* TODO: is passing p for start of the line OK? */ +! n_extra = win_lbr_chartabsize(wp, p, p, (colnr_T)vcol, +! NULL) - 1; + c_extra = ' '; + if (vim_iswhite(c)) + { +*************** +*** 8916,8923 **** + { + if (noinvcurs) + screen_stop_highlight(); +! if (row == screen_cur_row && (col > screen_cur_col) && +! *T_CRI != NUL) + term_cursor_right(col - screen_cur_col); + else + term_windgoto(row, col); +--- 8962,8969 ---- + { + if (noinvcurs) + screen_stop_highlight(); +! if (row == screen_cur_row && (col > screen_cur_col) +! && *T_CRI != NUL) + term_cursor_right(col - screen_cur_col); + else + term_windgoto(row, col); +*** ../vim-7.4.337/src/structs.h 2014-06-17 17:48:21.784628008 +0200 +--- src/structs.h 2014-06-25 12:57:01.006115766 +0200 +*************** +*** 134,139 **** +--- 134,145 ---- + int wo_arab; + # define w_p_arab w_onebuf_opt.wo_arab /* 'arabic' */ + #endif ++ #ifdef FEAT_LINEBREAK ++ int wo_bri; ++ # define w_p_bri w_onebuf_opt.wo_bri /* 'breakindent' */ ++ char_u *wo_briopt; ++ # define w_p_briopt w_onebuf_opt.wo_briopt /* 'breakindentopt' */ ++ #endif + #ifdef FEAT_DIFF + int wo_diff; + # define w_p_diff w_onebuf_opt.wo_diff /* 'diff' */ +*************** +*** 2189,2194 **** +--- 2195,2205 ---- + #ifdef FEAT_SYN_HL + int *w_p_cc_cols; /* array of columns to highlight or NULL */ + #endif ++ #ifdef FEAT_LINEBREAK ++ int w_p_brimin; /* minimum width for breakindent */ ++ int w_p_brishift; /* additional shift for breakindent */ ++ int w_p_brisbr; /* sbr in 'briopt' */ ++ #endif + + /* transform a pointer to a "onebuf" option into a "allbuf" option */ + #define GLOBAL_WO(p) ((char *)p + sizeof(winopt_T)) +*** ../vim-7.4.337/src/testdir/Make_amiga.mak 2014-05-29 11:47:19.804773758 +0200 +--- src/testdir/Make_amiga.mak 2014-06-25 12:57:01.006115766 +0200 +*************** +*** 37,42 **** +--- 37,43 ---- + test99.out test100.out test101.out test102.out test103.out \ + test104.out test105.out test106.out test107.out \ + test_autoformat_join.out \ ++ test_breakindent.out \ + test_eval.out \ + test_options.out + +*************** +*** 163,167 **** +--- 164,169 ---- + test106.out: test106.in + test107.out: test107.in + test_autoformat_join.out: test_autoformat_join.in ++ test_breakindent.out: test_breakindent.in + test_eval.out: test_eval.in + test_options.out: test_options.in +*** ../vim-7.4.337/src/testdir/Make_dos.mak 2014-05-29 11:47:19.804773758 +0200 +--- src/testdir/Make_dos.mak 2014-06-25 12:57:01.006115766 +0200 +*************** +*** 36,41 **** +--- 36,42 ---- + test100.out test101.out test102.out test103.out test104.out \ + test105.out test106.out test107.out\ + test_autoformat_join.out \ ++ test_breakindent.out \ + test_eval.out \ + test_options.out + +*** ../vim-7.4.337/src/testdir/Make_ming.mak 2014-05-29 11:47:19.804773758 +0200 +--- src/testdir/Make_ming.mak 2014-06-25 12:57:01.006115766 +0200 +*************** +*** 56,61 **** +--- 56,62 ---- + test100.out test101.out test102.out test103.out test104.out \ + test105.out test106.out test107.out \ + test_autoformat_join.out \ ++ test_breakindent.out \ + test_eval.out \ + test_options.out + +*** ../vim-7.4.337/src/testdir/Make_os2.mak 2014-05-29 11:47:19.804773758 +0200 +--- src/testdir/Make_os2.mak 2014-06-25 12:59:45.774121999 +0200 +*************** +*** 39,44 **** +--- 39,45 ---- + test105.out test106.out test107.out \ + test_autoformat_join.out \ + test_eval.out \ ++ test_breakindent.out \ + test_options.out + + .SUFFIXES: .in .out +*** ../vim-7.4.337/src/testdir/Make_vms.mms 2014-05-29 11:47:19.804773758 +0200 +--- src/testdir/Make_vms.mms 2014-06-25 12:57:01.006115766 +0200 +*************** +*** 97,102 **** +--- 97,103 ---- + test100.out test101.out test103.out test104.out \ + test105.out test106.out test107.out \ + test_autoformat_join.out \ ++ test_breakindent.out \ + test_eval.out \ + test_options.out + +*** ../vim-7.4.337/src/testdir/Makefile 2014-05-29 11:47:19.804773758 +0200 +--- src/testdir/Makefile 2014-06-25 12:57:01.006115766 +0200 +*************** +*** 34,39 **** +--- 34,40 ---- + test99.out test100.out test101.out test102.out test103.out \ + test104.out test105.out test106.out test107.out \ + test_autoformat_join.out \ ++ test_breakindent.out \ + test_eval.out \ + test_options.out + +*** ../vim-7.4.337/src/testdir/test_breakindent.in 2014-06-25 14:36:28.690341532 +0200 +--- src/testdir/test_breakindent.in 2014-06-25 14:26:00.994317785 +0200 +*************** +*** 0 **** +--- 1,79 ---- ++ Test for breakindent ++ ++ STARTTEST ++ :so small.vim ++ :if !exists("+breakindent") | e! test.ok | w! test.out | qa! | endif ++ :10new|:vsp|:vert resize 20 ++ :put =\"\tabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOP\" ++ :set ts=4 sw=4 sts=4 breakindent ++ :fu! ScreenChar(width) ++ : let c='' ++ : for i in range(1,a:width) ++ : let c.=nr2char(screenchar(line('.'), i)) ++ : endfor ++ : let c.="\n" ++ : for i in range(1,a:width) ++ : let c.=nr2char(screenchar(line('.')+1, i)) ++ : endfor ++ : let c.="\n" ++ : for i in range(1,a:width) ++ : let c.=nr2char(screenchar(line('.')+2, i)) ++ : endfor ++ : return c ++ :endfu ++ :fu DoRecordScreen() ++ : wincmd l ++ : $put =printf(\"\n%s\", g:test) ++ : $put =g:line1 ++ : wincmd p ++ :endfu ++ :let g:test="Test 1: Simple breakindent" ++ :let line1=ScreenChar(8) ++ :call DoRecordScreen() ++ :let g:test="Test 2: Simple breakindent + sbr=>>" ++ :set sbr=>> ++ :let line1=ScreenChar(8) ++ :call DoRecordScreen() ++ :let g:test ="Test 3: Simple breakindent + briopt:sbr" ++ :set briopt=sbr,min:0 sbr=++ ++ :let line1=ScreenChar(8) ++ :call DoRecordScreen() ++ :let g:test ="Test 4: Simple breakindent + min width: 18" ++ :set sbr= briopt=min:18 ++ :let line1=ScreenChar(8) ++ :call DoRecordScreen() ++ :let g:test =" Test 5: Simple breakindent + shift by 2" ++ :set briopt=shift:2,min:0 ++ :let line1=ScreenChar(8) ++ :call DoRecordScreen() ++ :let g:test=" Test 6: Simple breakindent + shift by -1" ++ :set briopt=shift:-1,min:0 ++ :let line1=ScreenChar(8) ++ :call DoRecordScreen() ++ :let g:test=" Test 7: breakindent + shift by +1 + nu + sbr=? briopt:sbr" ++ :set briopt=shift:1,sbr,min:0 nu sbr=? nuw=4 ++ :let line1=ScreenChar(10) ++ :call DoRecordScreen() ++ :let g:test=" Test 8: breakindent + shift:1 + nu + sbr=# list briopt:sbr" ++ :set briopt=shift:1,sbr,min:0 nu sbr=# list ++ :let line1=ScreenChar(10) ++ :call DoRecordScreen() ++ :let g:test=" Test 9: breakindent + shift by +1 + 'nu' + sbr=# list" ++ :set briopt-=sbr ++ :let line1=ScreenChar(10) ++ :call DoRecordScreen() ++ :let g:test=" Test 10: breakindent + shift by +1 + 'nu' + sbr=~ cpo+=n" ++ :set cpo+=n sbr=~ nu nuw=4 nolist briopt=sbr,min:0 ++ :let line1=ScreenChar(10) ++ :call DoRecordScreen() ++ :wincmd p ++ :let g:test="\n Test 11: strdisplaywidth when breakindent is on" ++ :set cpo-=n sbr=>> nu nuw=4 nolist briopt= ts=4 ++ :let text=getline(2) "skip leading tab when calculating text width ++ :let width = strlen(text[1:])+indent(2)*4+strlen(&sbr)*3 " text wraps 3 times ++ :$put =g:test ++ :$put =printf(\"strdisplaywidth: %d == calculated: %d\", strdisplaywidth(text), width) ++ :%w! test.out ++ :qa! ++ ENDTEST ++ dummy text +*** ../vim-7.4.337/src/testdir/test_breakindent.ok 2014-06-25 14:36:28.698341532 +0200 +--- src/testdir/test_breakindent.ok 2014-06-25 12:57:01.006115766 +0200 +*************** +*** 0 **** +--- 1,55 ---- ++ ++ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOP ++ ++ Test 1: Simple breakindent ++ abcd ++ qrst ++ GHIJ ++ ++ Test 2: Simple breakindent + sbr=>> ++ abcd ++ >>qr ++ >>EF ++ ++ Test 3: Simple breakindent + briopt:sbr ++ abcd ++ ++ qrst ++ ++ GHIJ ++ ++ Test 4: Simple breakindent + min width: 18 ++ abcd ++ qrstuv ++ IJKLMN ++ ++ Test 5: Simple breakindent + shift by 2 ++ abcd ++ qr ++ EF ++ ++ Test 6: Simple breakindent + shift by -1 ++ abcd ++ qrstu ++ HIJKL ++ ++ Test 7: breakindent + shift by +1 + nu + sbr=? briopt:sbr ++ 2 ab ++ ? m ++ ? x ++ ++ Test 8: breakindent + shift:1 + nu + sbr=# list briopt:sbr ++ 2 ^Iabcd ++ # opq ++ # BCD ++ ++ Test 9: breakindent + shift by +1 + 'nu' + sbr=# list ++ 2 ^Iabcd ++ #op ++ #AB ++ ++ Test 10: breakindent + shift by +1 + 'nu' + sbr=~ cpo+=n ++ 2 ab ++ ~ mn ++ ~ yz ++ ++ Test 11: strdisplaywidth when breakindent is on ++ strdisplaywidth: 46 == calculated: 64 +*** ../vim-7.4.337/src/ui.c 2014-06-12 13:28:26.771694851 +0200 +--- src/ui.c 2014-06-25 13:22:20.218173240 +0200 +*************** +*** 3162,3176 **** + /* try to advance to the specified column */ + int count = 0; + char_u *ptr; +! char_u *start; + +! start = ptr = ml_get_buf(wp->w_buffer, lnum, FALSE); + while (count < vcol && *ptr != NUL) + { +! count += win_lbr_chartabsize(wp, ptr, count, NULL); + mb_ptr_adv(ptr); + } +! return (int)(ptr - start); + } + #endif + +--- 3162,3176 ---- + /* try to advance to the specified column */ + int count = 0; + char_u *ptr; +! char_u *line; + +! line = ptr = ml_get_buf(wp->w_buffer, lnum, FALSE); + while (count < vcol && *ptr != NUL) + { +! count += win_lbr_chartabsize(wp, line, ptr, count, NULL); + mb_ptr_adv(ptr); + } +! return (int)(ptr - line); + } + #endif + +*** ../vim-7.4.337/src/version.c 2014-06-25 12:26:42.230046959 +0200 +--- src/version.c 2014-06-25 13:00:26.990123558 +0200 +*************** +*** 736,737 **** +--- 736,739 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 338, + /**/ + +-- +MORTICIAN: Bring out your dead! + [clang] + Bring out your dead! + [clang] + Bring out your dead! +CUSTOMER: Here's one -- nine pence. +DEAD PERSON: I'm not dead! + The Quest for the Holy Grail (Monty Python) + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ an exciting new programming language -- http://www.Zimbu.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org ///