Blog: Better line wrapping in Vim, 5th iteration: vim-7.3.285-breakindent.patch
File vim-7.3.285-breakindent.patch, 31.0 KB (added by retracile, 13 years ago) |
---|
-
runtime/doc/eval.txt
# HG changeset patch # User Eli Carter <elicarter@retracile.net> # Date 1314148805 18000 # Node ID fd4d58423e6bc958dde29184da411d8b6bf6facf # Parent 7b50afd3103733ad0f70acc655cb9295fd67ceaf breakindent patch updated for 7.3.285 by Taylor Hedberg diff -r 7b50afd31037 -r fd4d58423e6b runtime/doc/eval.txt
a b 6208 6208 keymap Compiled with 'keymap' support. 6209 6209 langmap Compiled with 'langmap' support. 6210 6210 libcall Compiled with |libcall()| support. 6211 linebreak Compiled with 'linebreak', 'breakat' and 'showbreak'6212 support.6211 linebreak Compiled with 'linebreak', 'breakat', 'showbreak' and 6212 'breakindent' support. 6213 6213 lispindent Compiled with support for lisp indenting. 6214 6214 listcmds Compiled with commands for the buffer list |:files| 6215 6215 and the argument list |arglist|. -
runtime/doc/options.txt
diff -r 7b50afd31037 -r fd4d58423e6b runtime/doc/options.txt
a b 1184 1184 break if 'linebreak' is on. Only works for ASCII and also for 8-bit 1185 1185 characters when 'encoding' is an 8-bit encoding. 1186 1186 1187 1188 *'breakindent'* *'bri'* 1189 'breakindent' 'bri' boolean (default off) 1190 local to window 1191 {not in Vi} 1192 {not available when compiled without the |+linebreak| 1193 feature} 1194 Every wrapped line will continue visually indented (same amount of 1195 space as the beginning of that line), thus preserving horizontal blocks 1196 of text. 1197 1198 *'breakindentmin'* *'brimin'* 1199 'breakindentmin' 'brimin' number (default 20) 1200 local to window 1201 {not in Vi} 1202 {not available when compiled without the |+linebreak| 1203 feature} 1204 Minimum text width that will be kept after applying 'breakindent', 1205 even if the resulting text should normally be narrower. This prevents 1206 text indented almost to the right window border oocupying lot of 1207 vertical space when broken. 1208 1209 *'breakindentshift'* *'brishift'* 1210 'breakindentshift' 'brishift' number (default 20) 1211 local to window 1212 {not in Vi} 1213 {not available when compiled without the |+linebreak| 1214 feature} 1215 After applying 'breakindent', wrapped line beginning will be shift by 1216 given number of characters. It permits dynamic French paragraph 1217 indentation (negative) or emphasizing the line continuation 1218 (positive). 1219 1187 1220 *'browsedir'* *'bsdir'* 1188 1221 'browsedir' 'bsdir' string (default: "last") 1189 1222 global … … 4483 4516 {not in Vi} 4484 4517 {not available when compiled without the |+linebreak| 4485 4518 feature} 4486 If on Vim will wrap long lines at a character in 'breakat' rather4519 If on, Vim will wrap long lines at a character in 'breakat' rather 4487 4520 than at the last character that fits on the screen. Unlike 4488 4521 'wrapmargin' and 'textwidth', this does not insert <EOL>s in the file, 4489 it only affects the way the file is displayed, not its contents. The 4490 value of 'showbreak' is used to put in front of wrapped lines. 4491 This option is not used when the 'wrap' option is off or 'list' is on. 4522 it only affects the way the file is displayed, not its contents. 4523 If 'breakindent' is set, line is visually indented. Then, the value 4524 of 'showbreak' is used to put in front of wrapped lines. This option 4525 is not used when the 'wrap' option is off or 'list' is on. 4492 4526 Note that <Tab> characters after an <EOL> are mostly not displayed 4493 4527 with the right amount of white space. 4494 4528 -
runtime/doc/tags
diff -r 7b50afd31037 -r fd4d58423e6b runtime/doc/tags
a b 90 90 'bl' options.txt /*'bl'* 91 91 'bomb' options.txt /*'bomb'* 92 92 'breakat' options.txt /*'breakat'* 93 'breakindent' options.txt /*'breakindent'* 94 'breakindentmin' options.txt /*'breakindentmin'* 95 'breakindentshift' options.txt /*'breakindentshift'* 96 'bri' options.txt /*'bri'* 97 'brimin' options.txt /*'brimin'* 98 'brishift' options.txt /*'brishift'* 93 99 'brk' options.txt /*'brk'* 94 100 'browsedir' options.txt /*'browsedir'* 95 101 'bs' options.txt /*'bs'* -
runtime/optwin.vim
diff -r 7b50afd31037 -r fd4d58423e6b runtime/optwin.vim
a b 322 322 call append("$", "linebreak\twrap long lines at a character in 'breakat'") 323 323 call append("$", "\t(local to window)") 324 324 call <SID>BinOptionL("lbr") 325 call append("$", "breakindent\tpreserve indentation in wrapped text") 326 call append("$", "\t(local to window)") 327 call <SID>BinOptionL("bri") 328 call append("$", "breakindentmin\tminimum text width after indent in 'breakindent'") 329 call append("$", "\t(local to window)") 330 call <SID>OptionL("brimin") 331 call append("$", "breakindentshift\tshift beginning of 'breakindent'ed line by this number of characters (negative left)") 332 call append("$", "\t(local to window)") 333 call <SID>OptionL("brishift") 325 334 call append("$", "breakat\twhich characters might cause a line break") 326 335 call <SID>OptionG("brk", &brk) 327 336 call append("$", "showbreak\tstring to put before wrapped screen lines") -
src/charset.c
diff -r 7b50afd31037 -r fd4d58423e6b src/charset.c
a b 846 846 * taking into account the size of a tab. 847 847 */ 848 848 int 849 linetabsize(s )849 linetabsize(s, lnum) 850 850 char_u *s; 851 linenr_T lnum; 851 852 { 852 return linetabsize_col(0, s );853 return linetabsize_col(0, s, lnum); 853 854 } 854 855 855 856 /* 856 857 * Like linetabsize(), but starting at column "startcol". 857 858 */ 858 859 int 859 linetabsize_col(startcol, s )860 linetabsize_col(startcol, s, lnum) 860 861 int startcol; 861 862 char_u *s; 863 linenr_T lnum; 862 864 { 863 865 colnr_T col = startcol; 864 866 865 867 while (*s != NUL) 866 col += lbr_chartabsize_adv(&s, col );868 col += lbr_chartabsize_adv(&s, col, lnum); 867 869 return (int)col; 868 870 } 869 871 … … 871 873 * Like linetabsize(), but for a given window instead of the current one. 872 874 */ 873 875 int 874 win_linetabsize(wp, p, len )876 win_linetabsize(wp, p, len, lnum) 875 877 win_T *wp; 876 878 char_u *p; 877 879 colnr_T len; 880 linenr_T lnum; 878 881 { 879 882 colnr_T col = 0; 880 883 char_u *s; 881 884 882 885 for (s = p; *s != NUL && (len == MAXCOL || s < p + len); mb_ptr_adv(s)) 883 col += win_lbr_chartabsize(wp, s, col, NULL );886 col += win_lbr_chartabsize(wp, s, col, NULL, lnum); 884 887 return (int)col; 885 888 } 886 889 … … 1009 1012 * like chartabsize(), but also check for line breaks on the screen 1010 1013 */ 1011 1014 int 1012 lbr_chartabsize(s, col )1015 lbr_chartabsize(s, col, lnum) 1013 1016 unsigned char *s; 1014 1017 colnr_T col; 1018 linenr_T lnum; 1015 1019 { 1016 1020 #ifdef FEAT_LINEBREAK 1017 if (!curwin->w_p_lbr && *p_sbr == NUL )1021 if (!curwin->w_p_lbr && *p_sbr == NUL && !curwin->w_p_bri) 1018 1022 { 1019 1023 #endif 1020 1024 #ifdef FEAT_MBYTE … … 1024 1028 RET_WIN_BUF_CHARTABSIZE(curwin, curbuf, s, col) 1025 1029 #ifdef FEAT_LINEBREAK 1026 1030 } 1027 return win_lbr_chartabsize(curwin, s, col, NULL );1031 return win_lbr_chartabsize(curwin, s, col, NULL, lnum); 1028 1032 #endif 1029 1033 } 1030 1034 … … 1032 1036 * Call lbr_chartabsize() and advance the pointer. 1033 1037 */ 1034 1038 int 1035 lbr_chartabsize_adv(s, col )1039 lbr_chartabsize_adv(s, col, lnum) 1036 1040 char_u **s; 1037 1041 colnr_T col; 1042 linenr_T lnum; 1038 1043 { 1039 1044 int retval; 1040 1045 1041 retval = lbr_chartabsize(*s, col );1046 retval = lbr_chartabsize(*s, col, lnum); 1042 1047 mb_ptr_adv(*s); 1043 1048 return retval; 1044 1049 } … … 1049 1054 * If "headp" not NULL, set *headp to the size of what we for 'showbreak' 1050 1055 * string at start of line. Warning: *headp is only set if it's a non-zero 1051 1056 * value, init to 0 before calling. 1057 * 1058 * linenr argument needed if in visual highlighting and breakindent=on, then 1059 * the line calculated is not current; if 0, normal functionality is preserved. 1052 1060 */ 1053 1061 int 1054 win_lbr_chartabsize(wp, s, col, headp )1062 win_lbr_chartabsize(wp, s, col, headp, lnum) 1055 1063 win_T *wp; 1056 1064 char_u *s; 1057 1065 colnr_T col; 1058 1066 int *headp UNUSED; 1067 linenr_T lnum; 1059 1068 { 1060 1069 #ifdef FEAT_LINEBREAK 1061 1070 int c; … … 1074 1083 int n; 1075 1084 1076 1085 /* 1077 * No 'linebreak' and 'showbreak' : return quickly.1086 * No 'linebreak' and 'showbreak' and 'breakindent': return quickly. 1078 1087 */ 1079 if (!wp->w_p_lbr && *p_sbr == NUL)1088 if (!wp->w_p_lbr && !wp->w_p_bri && *p_sbr == NUL) 1080 1089 #endif 1081 1090 { 1082 1091 #ifdef FEAT_MBYTE … … 1151 1160 # endif 1152 1161 1153 1162 /* 1154 * May have to add something for 'showbreak' string at start of line 1163 * May have to add something for 'breakindent' and/or 'showbreak' 1164 * string at start of line. 1155 1165 * Set *headp to the size of what we add. 1156 1166 */ 1157 1167 added = 0; 1158 if ( *p_sbr != NUL&& wp->w_p_wrap && col != 0)1168 if ((*p_sbr != NUL || wp->w_p_bri) && wp->w_p_wrap && col != 0) 1159 1169 { 1160 1170 numberextra = win_col_off(wp); 1161 1171 col += numberextra + mb_added; … … 1168 1178 } 1169 1179 if (col == 0 || col + size > (colnr_T)W_WIDTH(wp)) 1170 1180 { 1171 added = vim_strsize(p_sbr); 1181 added = 0; 1182 if (*p_sbr != NUL) 1183 added += vim_strsize(p_sbr); 1184 if (wp->w_p_bri) 1185 added += get_breakindent_win(wp,lnum); 1186 1172 1187 if (tab_corr) 1173 1188 size += (added / wp->w_buffer->b_p_ts) * wp->w_buffer->b_p_ts; 1174 1189 else … … 1276 1291 1277 1292 /* 1278 1293 * This function is used very often, do some speed optimizations. 1279 * When 'list', 'linebreak' and 'showbreak' are not set use a simple loop. 1294 * When 'list', 'linebreak', 'showbreak' and 'breakindent' are not set 1295 * use a simple loop. 1280 1296 * Also use this when 'list' is set but tabs take their normal size. 1281 1297 */ 1282 1298 if ((!wp->w_p_list || lcs_tab1 != NUL) 1283 1299 #ifdef FEAT_LINEBREAK 1284 && !wp->w_p_lbr && *p_sbr == NUL 1300 && !wp->w_p_lbr && *p_sbr == NUL && !wp->w_p_bri 1285 1301 #endif 1286 1302 ) 1287 1303 { … … 1343 1359 { 1344 1360 /* A tab gets expanded, depending on the current column */ 1345 1361 head = 0; 1346 incr = win_lbr_chartabsize(wp, ptr, vcol, &head );1362 incr = win_lbr_chartabsize(wp, ptr, vcol, &head, pos->lnum); 1347 1363 /* make sure we don't go past the end of the line */ 1348 1364 if (*ptr == NUL) 1349 1365 { -
src/edit.c
diff -r 7b50afd31037 -r fd4d58423e6b src/edit.c
a b 398 398 if (startln) 399 399 Insstart.col = 0; 400 400 } 401 Insstart_textlen = (colnr_T)linetabsize(ml_get_curline() );401 Insstart_textlen = (colnr_T)linetabsize(ml_get_curline(), Insstart.lnum); 402 402 Insstart_blank_vcol = MAXCOL; 403 403 if (!did_ai) 404 404 ai_col = 0; … … 1897 1897 else 1898 1898 #endif 1899 1899 ++new_cursor_col; 1900 vcol += lbr_chartabsize(ptr + new_cursor_col, (colnr_T)vcol );1900 vcol += lbr_chartabsize(ptr + new_cursor_col, (colnr_T)vcol, curwin->w_cursor.lnum); 1901 1901 } 1902 1902 vcol = last_vcol; 1903 1903 … … 6500 6500 ins_need_undo = FALSE; 6501 6501 } 6502 6502 Insstart = curwin->w_cursor; /* new insertion starts here */ 6503 Insstart_textlen = (colnr_T)linetabsize(ml_get_curline() );6503 Insstart_textlen = (colnr_T)linetabsize(ml_get_curline(), curwin->w_cursor.lnum); 6504 6504 ai_col = 0; 6505 6505 #ifdef FEAT_VREPLACE 6506 6506 if (State & VREPLACE_FLAG) … … 6859 6859 for (;;) 6860 6860 { 6861 6861 coladvance(v - width); 6862 /* getviscol() is slow, skip it when 'showbreak' is empty and 6863 * there are no multi-byte characters */ 6864 if ((*p_sbr == NUL 6862 /* getviscol() is slow, skip it when 'showbreak' is empty, 6863 * 'breakindent' is not set and there are no multi-byte 6864 * characters */ 6865 if ((*p_sbr == NUL && !curwin->w_p_bri 6865 6866 # ifdef FEAT_MBYTE 6866 6867 && !has_mbyte 6867 6868 # endif … … 9497 9498 getvcol(curwin, &fpos, &vcol, NULL, NULL); 9498 9499 getvcol(curwin, cursor, &want_vcol, NULL, NULL); 9499 9500 9500 /* Use as many TABs as possible. Beware of ' showbreak' and9501 /* Use as many TABs as possible. Beware of 'breakindent', 'showbreak' and 9501 9502 * 'linebreak' adding extra virtual columns. */ 9502 9503 while (vim_iswhite(*ptr)) 9503 9504 { 9504 i = lbr_chartabsize((char_u *)"\t", vcol );9505 i = lbr_chartabsize((char_u *)"\t", vcol, cursor->lnum); 9505 9506 if (vcol + i > want_vcol) 9506 9507 break; 9507 9508 if (*ptr != TAB) … … 9527 9528 /* Skip over the spaces we need. */ 9528 9529 while (vcol < want_vcol && *ptr == ' ') 9529 9530 { 9530 vcol += lbr_chartabsize(ptr, vcol );9531 vcol += lbr_chartabsize(ptr, vcol, cursor->lnum); 9531 9532 ++ptr; 9532 9533 ++repl_off; 9533 9534 } … … 9783 9784 while ((colnr_T)temp < curwin->w_virtcol && *ptr != NUL) 9784 9785 { 9785 9786 prev_ptr = ptr; 9786 temp += lbr_chartabsize_adv(&ptr, (colnr_T)temp );9787 temp += lbr_chartabsize_adv(&ptr, (colnr_T)temp, lnum); 9787 9788 } 9788 9789 if ((colnr_T)temp > curwin->w_virtcol) 9789 9790 ptr = prev_ptr; -
src/eval.c
diff -r 7b50afd31037 -r fd4d58423e6b src/eval.c
a b 16990 16990 16991 16991 if (argvars[1].v_type != VAR_UNKNOWN) 16992 16992 col = get_tv_number(&argvars[1]); 16993 16994 rettv->vval.v_number = (varnumber_T)(linetabsize_col(col, s) - col); 16993 /* 16994 * FIXME: passing 0 as 3rd argument to linetabsize_col, instead of real line number; 16995 * (can we get it from here somehow?); might give incorrect result with breakindent! 16996 */ 16997 rettv->vval.v_number = (varnumber_T)(linetabsize_col(col, s, 0) - col); 16995 16998 } 16996 16999 16997 17000 /* -
src/ex_cmds.c
diff -r 7b50afd31037 -r fd4d58423e6b src/ex_cmds.c
a b 262 262 ; 263 263 save = *last; 264 264 *last = NUL; 265 len = linetabsize(line );/* get line length */265 len = linetabsize(line, curwin->w_cursor.lnum); /* get line length */ 266 266 if (has_tab != NULL) /* check for embedded TAB */ 267 267 *has_tab = (vim_strrchr(first, TAB) != NULL); 268 268 *last = save; -
src/getchar.c
diff -r 7b50afd31037 -r fd4d58423e6b src/getchar.c
a b 2609 2609 if (!vim_iswhite(ptr[col])) 2610 2610 curwin->w_wcol = vcol; 2611 2611 vcol += lbr_chartabsize(ptr + col, 2612 (colnr_T)vcol );2612 (colnr_T)vcol, curwin->w_cursor.lnum); 2613 2613 #ifdef FEAT_MBYTE 2614 2614 if (has_mbyte) 2615 2615 col += (*mb_ptr2len)(ptr + col); -
src/gui_beval.c
diff -r 7b50afd31037 -r fd4d58423e6b src/gui_beval.c
a b 335 335 { 336 336 /* Not past end of the file. */ 337 337 lbuf = ml_get_buf(wp->w_buffer, lnum, FALSE); 338 if (col <= win_linetabsize(wp, lbuf, (colnr_T)MAXCOL ))338 if (col <= win_linetabsize(wp, lbuf, (colnr_T)MAXCOL, lnum)) 339 339 { 340 340 /* Not past end of line. */ 341 341 if (getword) -
src/misc1.c
diff -r 7b50afd31037 -r fd4d58423e6b src/misc1.c
a b 451 451 return (int)col; 452 452 } 453 453 454 #ifdef FEAT_LINEBREAK 455 /* 456 * Return appropriate space number for breakindent, taking influencing 457 * parameters into account. Window must be specified, since it is not 458 * necessarily always the current one. If lnum==0, current line is calculated, 459 * specified line otherwise. 460 */ 461 int 462 get_breakindent_win (wp,lnum) 463 win_T* wp; 464 linenr_T lnum; 465 { 466 int bri; 467 /* window width minus barren space, i.e. what rests for text */ 468 const int eff_wwidth = W_WIDTH(wp) 469 - (wp->w_p_nu && !vim_strchr(p_cpo,CPO_NUMCOL)?number_width(wp):0); 470 /* - (*p_sbr == NUL ? 0 : vim_strsize(p_sbr)); */ 471 472 bri = get_indent_buf(wp->w_buffer,lnum?lnum:wp->w_cursor.lnum) + wp->w_p_brishift; 473 474 /* if numbering and 'c' in 'cpoptions', cancel it out effectively */ 475 /* (this could be replaced by an equivalent call to win_col_off2()) */ 476 if (curwin->w_p_nu && vim_strchr(p_cpo, CPO_NUMCOL)) 477 bri += number_width(wp); 478 479 /* never indent past left window margin */ 480 if (bri < 0) 481 bri = 0; 482 /* always leave at least bri_min characters on the left, 483 * if text width is sufficient */ 484 else if (bri > eff_wwidth - wp->w_p_brimin) 485 bri = eff_wwidth - wp->w_p_brimin < 0 ? 0 : eff_wwidth - wp->w_p_brimin; 486 487 return bri; 488 } 489 #endif 490 491 454 492 #if defined(FEAT_CINDENT) || defined(FEAT_SMARTINDENT) 455 493 456 494 static int cin_is_cinword __ARGS((char_u *line)); … … 1757 1795 s = ml_get_buf(wp->w_buffer, lnum, FALSE); 1758 1796 if (*s == NUL) /* empty line */ 1759 1797 return 1; 1760 col = win_linetabsize(wp, s, (colnr_T)MAXCOL );1798 col = win_linetabsize(wp, s, (colnr_T)MAXCOL, lnum); 1761 1799 1762 1800 /* 1763 1801 * If list mode is on, then the '$' at the end of the line may take up one … … 1813 1851 col = 0; 1814 1852 while (*s != NUL && --column >= 0) 1815 1853 { 1816 col += win_lbr_chartabsize(wp, s, (colnr_T)col, NULL );1854 col += win_lbr_chartabsize(wp, s, (colnr_T)col, NULL, lnum); 1817 1855 mb_ptr_adv(s); 1818 1856 } 1819 1857 … … 1825 1863 * 'ts') -- webb. 1826 1864 */ 1827 1865 if (*s == TAB && (State & NORMAL) && (!wp->w_p_list || lcs_tab1)) 1828 col += win_lbr_chartabsize(wp, s, (colnr_T)col, NULL ) - 1;1866 col += win_lbr_chartabsize(wp, s, (colnr_T)col, NULL, lnum) - 1; 1829 1867 1830 1868 /* 1831 1869 * Add column offset for 'number', 'relativenumber', 'foldcolumn', etc. … … 8503 8541 amount = 0; 8504 8542 while (*that && col) 8505 8543 { 8506 amount += lbr_chartabsize_adv(&that, (colnr_T)amount );8544 amount += lbr_chartabsize_adv(&that, (colnr_T)amount, pos->lnum); 8507 8545 col--; 8508 8546 } 8509 8547 … … 8526 8564 8527 8565 while (vim_iswhite(*that)) 8528 8566 { 8529 amount += lbr_chartabsize(that, (colnr_T)amount );8567 amount += lbr_chartabsize(that, (colnr_T)amount, pos->lnum); 8530 8568 ++that; 8531 8569 } 8532 8570 … … 8565 8603 --parencount; 8566 8604 if (*that == '\\' && *(that+1) != NUL) 8567 8605 amount += lbr_chartabsize_adv(&that, 8568 (colnr_T)amount );8606 (colnr_T)amount, pos->lnum); 8569 8607 amount += lbr_chartabsize_adv(&that, 8570 (colnr_T)amount );8608 (colnr_T)amount, pos->lnum); 8571 8609 } 8572 8610 } 8573 8611 while (vim_iswhite(*that)) 8574 8612 { 8575 amount += lbr_chartabsize(that, (colnr_T)amount );8613 amount += lbr_chartabsize(that, (colnr_T)amount, pos->lnum); 8576 8614 that++; 8577 8615 } 8578 8616 if (!*that || *that == ';') -
src/misc2.c
diff -r 7b50afd31037 -r fd4d58423e6b src/misc2.c
a b 166 166 #ifdef FEAT_VIRTUALEDIT 167 167 if ((addspaces || finetune) && !VIsual_active) 168 168 { 169 curwin->w_curswant = linetabsize(line ) + one_more;169 curwin->w_curswant = linetabsize(line, pos->lnum) + one_more; 170 170 if (curwin->w_curswant > 0) 171 171 --curwin->w_curswant; 172 172 } … … 184 184 # endif 185 185 && wcol >= (colnr_T)width) 186 186 { 187 csize = linetabsize(line );187 csize = linetabsize(line, pos->lnum); 188 188 if (csize > 0) 189 189 csize--; 190 190 … … 205 205 { 206 206 /* Count a tab for what it's worth (if list mode not on) */ 207 207 #ifdef FEAT_LINEBREAK 208 csize = win_lbr_chartabsize(curwin, ptr, col, &head );208 csize = win_lbr_chartabsize(curwin, ptr, col, &head, pos->lnum); 209 209 mb_ptr_adv(ptr); 210 210 #else 211 csize = lbr_chartabsize_adv(&ptr, col );211 csize = lbr_chartabsize_adv(&ptr, col, pos->lnum); 212 212 #endif 213 213 col += csize; 214 214 } -
src/normal.c
diff -r 7b50afd31037 -r fd4d58423e6b src/normal.c
a b 4438 4438 int dir; 4439 4439 long dist; 4440 4440 { 4441 int linelen = linetabsize(ml_get_curline() );4441 int linelen = linetabsize(ml_get_curline(), curwin->w_cursor.lnum); 4442 4442 int retval = OK; 4443 4443 int atend = FALSE; 4444 4444 int n; … … 4511 4511 (void)hasFolding(curwin->w_cursor.lnum, 4512 4512 &curwin->w_cursor.lnum, NULL); 4513 4513 #endif 4514 linelen = linetabsize(ml_get_curline() );4514 linelen = linetabsize(ml_get_curline(), curwin->w_cursor.lnum); 4515 4515 if (linelen > width1) 4516 4516 curwin->w_curswant += (((linelen - width1 - 1) / width2) 4517 4517 + 1) * width2; … … 4541 4541 } 4542 4542 curwin->w_cursor.lnum++; 4543 4543 curwin->w_curswant %= width2; 4544 linelen = linetabsize(ml_get_curline() );4544 linelen = linetabsize(ml_get_curline(), curwin->w_cursor.lnum); 4545 4545 } 4546 4546 } 4547 4547 } -
src/ops.c
diff -r 7b50afd31037 -r fd4d58423e6b src/ops.c
a b 428 428 } 429 429 for ( ; vim_iswhite(*bd.textstart); ) 430 430 { 431 incr = lbr_chartabsize_adv(&bd.textstart, (colnr_T)(bd.start_vcol) );431 incr = lbr_chartabsize_adv(&bd.textstart, (colnr_T)(bd.start_vcol), curwin->w_cursor.lnum); 432 432 total += incr; 433 433 bd.start_vcol += incr; 434 434 } … … 488 488 489 489 while (vim_iswhite(*non_white)) 490 490 { 491 incr = lbr_chartabsize_adv(&non_white, non_white_col );491 incr = lbr_chartabsize_adv(&non_white, non_white_col, curwin->w_cursor.lnum); 492 492 non_white_col += incr; 493 493 } 494 494 … … 513 513 verbatim_copy_width -= bd.start_char_vcols; 514 514 while (verbatim_copy_width < destination_col) 515 515 { 516 incr = lbr_chartabsize(verbatim_copy_end, verbatim_copy_width );516 incr = lbr_chartabsize(verbatim_copy_end, verbatim_copy_width, curwin->w_cursor.lnum); 517 517 if (verbatim_copy_width + incr > destination_col) 518 518 break; 519 519 verbatim_copy_width += incr; … … 3565 3565 for (ptr = oldp; vcol < col && *ptr; ) 3566 3566 { 3567 3567 /* Count a tab for what it's worth (if list mode not on) */ 3568 incr = lbr_chartabsize_adv(&ptr, (colnr_T)vcol );3568 incr = lbr_chartabsize_adv(&ptr, (colnr_T)vcol, lnum); 3569 3569 vcol += incr; 3570 3570 } 3571 3571 bd.textcol = (colnr_T)(ptr - oldp); … … 3599 3599 /* calculate number of spaces required to fill right side of block*/ 3600 3600 spaces = y_width + 1; 3601 3601 for (j = 0; j < yanklen; j++) 3602 spaces -= lbr_chartabsize(&y_array[i][j], 0 );3602 spaces -= lbr_chartabsize(&y_array[i][j], 0, lnum); 3603 3603 if (spaces < 0) 3604 3604 spaces = 0; 3605 3605 … … 4961 4961 while (bdp->start_vcol < oap->start_vcol && *pstart) 4962 4962 { 4963 4963 /* Count a tab for what it's worth (if list mode not on) */ 4964 incr = lbr_chartabsize(pstart, (colnr_T)bdp->start_vcol );4964 incr = lbr_chartabsize(pstart, (colnr_T)bdp->start_vcol, lnum); 4965 4965 bdp->start_vcol += incr; 4966 4966 #ifdef FEAT_VISUALEXTRA 4967 4967 if (vim_iswhite(*pstart)) … … 5030 5030 { 5031 5031 /* Count a tab for what it's worth (if list mode not on) */ 5032 5032 prev_pend = pend; 5033 incr = lbr_chartabsize_adv(&pend, (colnr_T)bdp->end_vcol );5033 incr = lbr_chartabsize_adv(&pend, (colnr_T)bdp->end_vcol, lnum); 5034 5034 bdp->end_vcol += incr; 5035 5035 } 5036 5036 if (bdp->end_vcol <= oap->end_vcol … … 6526 6526 validate_virtcol(); 6527 6527 col_print(buf1, sizeof(buf1), (int)curwin->w_cursor.col + 1, 6528 6528 (int)curwin->w_virtcol + 1); 6529 col_print(buf2, sizeof(buf2), (int)STRLEN(p), linetabsize(p ));6529 col_print(buf2, sizeof(buf2), (int)STRLEN(p), linetabsize(p, curwin->w_cursor.lnum)); 6530 6530 6531 6531 if (char_count_cursor == byte_count_cursor 6532 6532 && char_count == byte_count) -
src/option.c
diff -r 7b50afd31037 -r fd4d58423e6b src/option.c
a b 187 187 #ifdef FEAT_ARABIC 188 188 # define PV_ARAB OPT_WIN(WV_ARAB) 189 189 #endif 190 #ifdef FEAT_LINEBREAK 191 # define PV_BRI OPT_WIN(WV_BRI) 192 # define PV_BRIMIN OPT_WIN(WV_BRIMIN) 193 # define PV_BRISHIFT OPT_WIN(WV_BRISHIFT) 194 #endif 190 195 #ifdef FEAT_DIFF 191 196 # define PV_DIFF OPT_WIN(WV_DIFF) 192 197 #endif … … 644 649 {(char_u *)0L, (char_u *)0L} 645 650 #endif 646 651 SCRIPTID_INIT}, 652 {"breakindent", "bri", P_BOOL|P_VI_DEF|P_VIM|P_RWIN, 653 #ifdef FEAT_LINEBREAK 654 (char_u *)VAR_WIN, PV_BRI, 655 {(char_u *)FALSE, (char_u *)0L} 656 #else 657 (char_u *)NULL, PV_NONE, 658 {(char_u *)0L, (char_u *)0L} 659 #endif 660 SCRIPTID_INIT}, 661 {"breakindentmin", "brimin", P_NUM|P_VI_DEF|P_VIM|P_RWIN, 662 #ifdef FEAT_LINEBREAK 663 (char_u *)VAR_WIN, PV_BRIMIN, 664 {(char_u *)20L, (char_u *)20L} 665 #else 666 (char_u *)NULL, PV_NONE, 667 {(char_u *)0L, (char_u *)0L} 668 #endif 669 SCRIPTID_INIT}, 670 {"breakindentshift", "brishift", P_NUM|P_VI_DEF|P_VIM|P_RWIN, 671 #ifdef FEAT_LINEBREAK 672 (char_u *)VAR_WIN, PV_BRISHIFT, 673 {(char_u *)0L, (char_u *)0L} 674 #else 675 (char_u *)NULL, PV_NONE, 676 {(char_u *)0L, (char_u *)0L} 677 #endif 678 SCRIPTID_INIT}, 647 679 {"browsedir", "bsdir",P_STRING|P_VI_DEF, 648 680 #ifdef FEAT_BROWSE 649 681 (char_u *)&p_bsdir, PV_NONE, … … 8339 8371 } 8340 8372 curwin->w_nrwidth_line_count = 0; 8341 8373 } 8374 8375 /* 'breakindentmin' must be positive */ 8376 else if (pp == &curwin->w_p_brimin) 8377 { 8378 if (curwin->w_p_brimin < 1) 8379 { 8380 errmsg = e_positive; 8381 curwin->w_p_brimin = 1; 8382 } 8383 } 8342 8384 #endif 8343 8385 8344 8386 else if (pp == &curbuf->b_p_tw) … … 9575 9617 case PV_WRAP: return (char_u *)&(curwin->w_p_wrap); 9576 9618 #ifdef FEAT_LINEBREAK 9577 9619 case PV_LBR: return (char_u *)&(curwin->w_p_lbr); 9620 case PV_BRI: return (char_u *)&(curwin->w_p_bri); 9621 case PV_BRIMIN: return (char_u *)&(curwin->w_p_brimin); 9622 case PV_BRISHIFT: return (char_u *)&(curwin->w_p_brishift); 9578 9623 #endif 9579 9624 #ifdef FEAT_SCROLLBIND 9580 9625 case PV_SCBIND: return (char_u *)&(curwin->w_p_scb); … … 9761 9806 to->wo_wrap = from->wo_wrap; 9762 9807 #ifdef FEAT_LINEBREAK 9763 9808 to->wo_lbr = from->wo_lbr; 9809 to->wo_bri = from->wo_bri; 9810 to->wo_brimin = from->wo_brimin; 9764 9811 #endif 9765 9812 #ifdef FEAT_SCROLLBIND 9766 9813 to->wo_scb = from->wo_scb; -
src/option.h
diff -r 7b50afd31037 -r fd4d58423e6b src/option.h
a b 1044 1044 #ifdef FEAT_CURSORBIND 1045 1045 , WV_CRBIND 1046 1046 #endif 1047 #ifdef FEAT_LINEBREAK 1048 , WV_BRI 1049 , WV_BRIMIN 1050 , WV_BRISHIFT 1051 #endif 1047 1052 #ifdef FEAT_DIFF 1048 1053 , WV_DIFF 1049 1054 #endif -
src/proto/charset.pro
diff -r 7b50afd31037 -r fd4d58423e6b src/proto/charset.pro
a b 14 14 int vim_strsize __ARGS((char_u *s)); 15 15 int vim_strnsize __ARGS((char_u *s, int len)); 16 16 int chartabsize __ARGS((char_u *p, colnr_T col)); 17 int linetabsize __ARGS((char_u *s ));18 int linetabsize_col __ARGS((int startcol, char_u *s ));19 int win_linetabsize __ARGS((win_T *wp, char_u *p, colnr_T len ));17 int linetabsize __ARGS((char_u *s, linenr_T lnum)); 18 int linetabsize_col __ARGS((int startcol, char_u *s, linenr_T lnum)); 19 int win_linetabsize __ARGS((win_T *wp, char_u *p, colnr_T len, linenr_T lnum)); 20 20 int vim_isIDc __ARGS((int c)); 21 21 int vim_iswordc __ARGS((int c)); 22 22 int vim_iswordp __ARGS((char_u *p)); … … 25 25 int vim_isfilec_or_wc __ARGS((int c)); 26 26 int vim_isprintc __ARGS((int c)); 27 27 int vim_isprintc_strict __ARGS((int c)); 28 int lbr_chartabsize __ARGS((unsigned char *s, colnr_T col ));29 int lbr_chartabsize_adv __ARGS((char_u **s, colnr_T col ));30 int win_lbr_chartabsize __ARGS((win_T *wp, char_u *s, colnr_T col, int *headp ));28 int lbr_chartabsize __ARGS((unsigned char *s, colnr_T col, linenr_T lnum)); 29 int lbr_chartabsize_adv __ARGS((char_u **s, colnr_T col, linenr_T lnum)); 30 int win_lbr_chartabsize __ARGS((win_T *wp, char_u *s, colnr_T col, int *headp, linenr_T lnum)); 31 31 int in_win_border __ARGS((win_T *wp, colnr_T vcol)); 32 32 void getvcol __ARGS((win_T *wp, pos_T *pos, colnr_T *start, colnr_T *cursor, colnr_T *end)); 33 33 colnr_T getvcol_nolist __ARGS((pos_T *posp)); -
src/proto/misc1.pro
diff -r 7b50afd31037 -r fd4d58423e6b src/proto/misc1.pro
a b 5 5 int get_indent_str __ARGS((char_u *ptr, int ts)); 6 6 int set_indent __ARGS((int size, int flags)); 7 7 int get_number_indent __ARGS((linenr_T lnum)); 8 int get_breakindent_win __ARGS((win_T *wp, linenr_T lnum)); 8 9 int open_line __ARGS((int dir, int flags, int old_indent)); 9 10 int get_leader_len __ARGS((char_u *line, char_u **flags, int backward)); 10 11 int plines __ARGS((linenr_T lnum)); -
src/regexp.c
diff -r 7b50afd31037 -r fd4d58423e6b src/regexp.c
a b 4269 4269 if (top.col == MAXCOL || bot.col == MAXCOL) 4270 4270 end = MAXCOL; 4271 4271 cols = win_linetabsize(wp, 4272 regline, (colnr_T)(reginput - regline) );4272 regline, (colnr_T)(reginput - regline), reglnum + reg_firstlnum); 4273 4273 if (cols < start || cols > end - (*p_sel == 'e')) 4274 4274 status = RA_NOMATCH; 4275 4275 } … … 4293 4293 case RE_VCOL: 4294 4294 if (!re_num_cmp((long_u)win_linetabsize( 4295 4295 reg_win == NULL ? curwin : reg_win, 4296 regline, (colnr_T)(reginput - regline) ) + 1, scan))4296 regline, (colnr_T)(reginput - regline), reglnum + reg_firstlnum ) + 1, scan)) 4297 4297 status = RA_NOMATCH; 4298 4298 break; 4299 4299 -
src/screen.c
diff -r 7b50afd31037 -r fd4d58423e6b src/screen.c
a b 2802 2802 # define WL_SIGN WL_FOLD /* column for signs */ 2803 2803 #endif 2804 2804 #define WL_NR WL_SIGN + 1 /* line number */ 2805 #ifdef FEAT_LINEBREAK 2806 # define WL_BRI WL_NR + 1 /* 'breakindent' */ 2807 #else 2808 # define WL_BRI WL_NR 2809 #endif 2805 2810 #if defined(FEAT_LINEBREAK) || defined(FEAT_DIFF) 2806 # define WL_SBR WL_ NR+ 1 /* 'showbreak' or 'diff' */2811 # define WL_SBR WL_BRI + 1 /* 'showbreak' or 'diff' */ 2807 2812 #else 2808 # define WL_SBR WL_ NR2813 # define WL_SBR WL_BRI 2809 2814 #endif 2810 2815 #define WL_LINE WL_SBR + 1 /* text in the line */ 2811 2816 int draw_state = WL_START; /* what to draw next */ … … 3133 3138 #endif 3134 3139 while (vcol < v && *ptr != NUL) 3135 3140 { 3136 c = win_lbr_chartabsize(wp, ptr, (colnr_T)vcol, NULL );3141 c = win_lbr_chartabsize(wp, ptr, (colnr_T)vcol, NULL, lnum); 3137 3142 vcol += c; 3138 3143 #ifdef FEAT_MBYTE 3139 3144 prev_ptr = ptr; … … 3502 3507 } 3503 3508 } 3504 3509 3510 #ifdef FEAT_LINEBREAK 3511 /* draw 'breakindent': indent wrapped text accordingly */ 3512 if (draw_state == WL_BRI -1 && n_extra == 0){ 3513 draw_state = WL_BRI; 3514 # ifdef FEAT_DIFF 3515 /* FIXME: handle (filler_todo > 0): or modify showbreak so that ---- lines are shorter by the amount needed? */ 3516 # endif 3517 if (wp->w_p_bri && row != startrow){ /* FIXME: what is startrow? Don't we need it as well?? */ 3518 p_extra = NUL; 3519 c_extra = ' '; 3520 n_extra = get_breakindent_win(wp,lnum); 3521 char_attr = 0; /* was: hl_attr(HLF_AT); */ 3522 /* FIXME: why do we need to adjust vcol if showbreak does not?? */ 3523 // vcol += n_extra; 3524 /* FIXME: is this relevant here? copied shamelessly from showbreak */ 3525 /* Correct end of highlighted area for 'breakindent', 3526 * required when 'linebreak' is also set. */ 3527 if (tocol == vcol) 3528 tocol += n_extra; 3529 } 3530 } 3531 #endif 3532 3533 3505 3534 #if defined(FEAT_LINEBREAK) || defined(FEAT_DIFF) 3506 3535 if (draw_state == WL_SBR - 1 && n_extra == 0) 3507 3536 { … … 4208 4237 # ifdef FEAT_MBYTE 4209 4238 has_mbyte ? mb_l : 4210 4239 # endif 4211 1), (colnr_T)vcol, NULL ) - 1;4240 1), (colnr_T)vcol, NULL, lnum) - 1; 4212 4241 c_extra = ' '; 4213 4242 if (vim_iswhite(c)) 4214 4243 c = ' '; -
src/structs.h
diff -r 7b50afd31037 -r fd4d58423e6b src/structs.h
a b 133 133 int wo_arab; 134 134 # define w_p_arab w_onebuf_opt.wo_arab /* 'arabic' */ 135 135 #endif 136 #ifdef FEAT_LINEBREAK 137 int wo_bri; 138 # define w_p_bri w_onebuf_opt.wo_bri /* 'breakindent' */ 139 long wo_brimin; 140 # define w_p_brimin w_onebuf_opt.wo_brimin /* 'breakindentmin' */ 141 long wo_brishift; 142 # define w_p_brishift w_onebuf_opt.wo_brishift /* 'breakindentshift' */ 143 #endif 136 144 #ifdef FEAT_DIFF 137 145 int wo_diff; 138 146 # define w_p_diff w_onebuf_opt.wo_diff /* 'diff' */ -
src/ui.c
diff -r 7b50afd31037 -r fd4d58423e6b src/ui.c
a b 3086 3086 start = ptr = ml_get_buf(wp->w_buffer, lnum, FALSE); 3087 3087 while (count <= vcol && *ptr != NUL) 3088 3088 { 3089 count += win_lbr_chartabsize(wp, ptr, count, NULL );3089 count += win_lbr_chartabsize(wp, ptr, count, NULL, lnum); 3090 3090 mb_ptr_adv(ptr); 3091 3091 } 3092 3092 return (int)(ptr - start);