Blog: Better line wrapping in Vim, 6th iteration: vim-7.3.682-breakindent.patch
File vim-7.3.682-breakindent.patch, 31.8 KB (added by retracile, 12 years ago) |
---|
-
runtime/doc/eval.txt
diff '--exclude=*.orig' -urN vim73.orig/runtime/doc/eval.txt vim73/runtime/doc/eval.txt
old new 6272 6272 keymap Compiled with 'keymap' support. 6273 6273 langmap Compiled with 'langmap' support. 6274 6274 libcall Compiled with |libcall()| support. 6275 linebreak Compiled with 'linebreak', 'breakat' and 'showbreak'6276 support.6275 linebreak Compiled with 'linebreak', 'breakat', 'showbreak' and 6276 'breakindent' support. 6277 6277 lispindent Compiled with support for lisp indenting. 6278 6278 listcmds Compiled with commands for the buffer list |:files| 6279 6279 and the argument list |arglist|. -
runtime/doc/options.txt
diff '--exclude=*.orig' -urN vim73.orig/runtime/doc/options.txt vim73/runtime/doc/options.txt
old new 1177 1177 break if 'linebreak' is on. Only works for ASCII and also for 8-bit 1178 1178 characters when 'encoding' is an 8-bit encoding. 1179 1179 1180 1181 *'breakindent'* *'bri'* 1182 'breakindent' 'bri' boolean (default off) 1183 local to window 1184 {not in Vi} 1185 {not available when compiled without the |+linebreak| 1186 feature} 1187 Every wrapped line will continue visually indented (same amount of 1188 space as the beginning of that line), thus preserving horizontal blocks 1189 of text. 1190 1191 *'breakindentmin'* *'brimin'* 1192 'breakindentmin' 'brimin' number (default 20) 1193 local to window 1194 {not in Vi} 1195 {not available when compiled without the |+linebreak| 1196 feature} 1197 Minimum text width that will be kept after applying 'breakindent', 1198 even if the resulting text should normally be narrower. This prevents 1199 text indented almost to the right window border oocupying lot of 1200 vertical space when broken. 1201 1202 *'breakindentshift'* *'brishift'* 1203 'breakindentshift' 'brishift' number (default 20) 1204 local to window 1205 {not in Vi} 1206 {not available when compiled without the |+linebreak| 1207 feature} 1208 After applying 'breakindent', wrapped line beginning will be shift by 1209 given number of characters. It permits dynamic French paragraph 1210 indentation (negative) or emphasizing the line continuation 1211 (positive). 1212 1180 1213 *'browsedir'* *'bsdir'* 1181 1214 'browsedir' 'bsdir' string (default: "last") 1182 1215 global … … 4460 4493 {not in Vi} 4461 4494 {not available when compiled without the |+linebreak| 4462 4495 feature} 4463 If on Vim will wrap long lines at a character in 'breakat' rather4496 If on, Vim will wrap long lines at a character in 'breakat' rather 4464 4497 than at the last character that fits on the screen. Unlike 4465 4498 'wrapmargin' and 'textwidth', this does not insert <EOL>s in the file, 4466 it only affects the way the file is displayed, not its contents. The 4467 value of 'showbreak' is used to put in front of wrapped lines. 4468 This option is not used when the 'wrap' option is off or 'list' is on. 4499 it only affects the way the file is displayed, not its contents. 4500 If 'breakindent' is set, line is visually indented. Then, the value 4501 of 'showbreak' is used to put in front of wrapped lines. This option 4502 is not used when the 'wrap' option is off or 'list' is on. 4469 4503 Note that <Tab> characters after an <EOL> are mostly not displayed 4470 4504 with the right amount of white space. 4471 4505 -
runtime/doc/tags
diff '--exclude=*.orig' -urN vim73.orig/runtime/doc/tags vim73/runtime/doc/tags
old new 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 '--exclude=*.orig' -urN vim73.orig/runtime/optwin.vim vim73/runtime/optwin.vim
old new 329 329 call append("$", "linebreak\twrap long lines at a character in 'breakat'") 330 330 call append("$", "\t(local to window)") 331 331 call <SID>BinOptionL("lbr") 332 call append("$", "breakindent\tpreserve indentation in wrapped text") 333 call append("$", "\t(local to window)") 334 call <SID>BinOptionL("bri") 335 call append("$", "breakindentmin\tminimum text width after indent in 'breakindent'") 336 call append("$", "\t(local to window)") 337 call <SID>OptionL("brimin") 338 call append("$", "breakindentshift\tshift beginning of 'breakindent'ed line by this number of characters (negative left)") 339 call append("$", "\t(local to window)") 340 call <SID>OptionL("brishift") 332 341 call append("$", "breakat\twhich characters might cause a line break") 333 342 call <SID>OptionG("brk", &brk) 334 343 call append("$", "showbreak\tstring to put before wrapped screen lines") -
src/charset.c
diff '--exclude=*.orig' -urN vim73.orig/src/charset.c vim73/src/charset.c
old new 847 847 * taking into account the size of a tab. 848 848 */ 849 849 int 850 linetabsize(s )850 linetabsize(s, lnum) 851 851 char_u *s; 852 linenr_T lnum; 852 853 { 853 return linetabsize_col(0, s );854 return linetabsize_col(0, s, lnum); 854 855 } 855 856 856 857 /* 857 858 * Like linetabsize(), but starting at column "startcol". 858 859 */ 859 860 int 860 linetabsize_col(startcol, s )861 linetabsize_col(startcol, s, lnum) 861 862 int startcol; 862 863 char_u *s; 864 linenr_T lnum; 863 865 { 864 866 colnr_T col = startcol; 865 867 866 868 while (*s != NUL) 867 col += lbr_chartabsize_adv(&s, col );869 col += lbr_chartabsize_adv(&s, col, lnum); 868 870 return (int)col; 869 871 } 870 872 … … 872 874 * Like linetabsize(), but for a given window instead of the current one. 873 875 */ 874 876 int 875 win_linetabsize(wp, p, len )877 win_linetabsize(wp, p, len, lnum) 876 878 win_T *wp; 877 879 char_u *p; 878 880 colnr_T len; 881 linenr_T lnum; 879 882 { 880 883 colnr_T col = 0; 881 884 char_u *s; 882 885 883 886 for (s = p; *s != NUL && (len == MAXCOL || s < p + len); mb_ptr_adv(s)) 884 col += win_lbr_chartabsize(wp, s, col, NULL );887 col += win_lbr_chartabsize(wp, s, col, NULL, lnum); 885 888 return (int)col; 886 889 } 887 890 … … 1010 1013 * like chartabsize(), but also check for line breaks on the screen 1011 1014 */ 1012 1015 int 1013 lbr_chartabsize(s, col )1016 lbr_chartabsize(s, col, lnum) 1014 1017 unsigned char *s; 1015 1018 colnr_T col; 1019 linenr_T lnum; 1016 1020 { 1017 1021 #ifdef FEAT_LINEBREAK 1018 if (!curwin->w_p_lbr && *p_sbr == NUL )1022 if (!curwin->w_p_lbr && *p_sbr == NUL && !curwin->w_p_bri) 1019 1023 { 1020 1024 #endif 1021 1025 #ifdef FEAT_MBYTE … … 1025 1029 RET_WIN_BUF_CHARTABSIZE(curwin, curbuf, s, col) 1026 1030 #ifdef FEAT_LINEBREAK 1027 1031 } 1028 return win_lbr_chartabsize(curwin, s, col, NULL );1032 return win_lbr_chartabsize(curwin, s, col, NULL, lnum); 1029 1033 #endif 1030 1034 } 1031 1035 … … 1033 1037 * Call lbr_chartabsize() and advance the pointer. 1034 1038 */ 1035 1039 int 1036 lbr_chartabsize_adv(s, col )1040 lbr_chartabsize_adv(s, col, lnum) 1037 1041 char_u **s; 1038 1042 colnr_T col; 1043 linenr_T lnum; 1039 1044 { 1040 1045 int retval; 1041 1046 1042 retval = lbr_chartabsize(*s, col );1047 retval = lbr_chartabsize(*s, col, lnum); 1043 1048 mb_ptr_adv(*s); 1044 1049 return retval; 1045 1050 } … … 1050 1055 * If "headp" not NULL, set *headp to the size of what we for 'showbreak' 1051 1056 * string at start of line. Warning: *headp is only set if it's a non-zero 1052 1057 * value, init to 0 before calling. 1058 * 1059 * linenr argument needed if in visual highlighting and breakindent=on, then 1060 * the line calculated is not current; if 0, normal functionality is preserved. 1053 1061 */ 1054 1062 int 1055 win_lbr_chartabsize(wp, s, col, headp )1063 win_lbr_chartabsize(wp, s, col, headp, lnum) 1056 1064 win_T *wp; 1057 1065 char_u *s; 1058 1066 colnr_T col; 1059 1067 int *headp UNUSED; 1068 linenr_T lnum; 1060 1069 { 1061 1070 #ifdef FEAT_LINEBREAK 1062 1071 int c; … … 1075 1084 int n; 1076 1085 1077 1086 /* 1078 * No 'linebreak' and 'showbreak' : return quickly.1087 * No 'linebreak' and 'showbreak' and 'breakindent': return quickly. 1079 1088 */ 1080 if (!wp->w_p_lbr && *p_sbr == NUL)1089 if (!wp->w_p_lbr && !wp->w_p_bri && *p_sbr == NUL) 1081 1090 #endif 1082 1091 { 1083 1092 #ifdef FEAT_MBYTE … … 1152 1161 # endif 1153 1162 1154 1163 /* 1155 * May have to add something for 'showbreak' string at start of line 1164 * May have to add something for 'breakindent' and/or 'showbreak' 1165 * string at start of line. 1156 1166 * Set *headp to the size of what we add. 1157 1167 */ 1158 1168 added = 0; 1159 if ( *p_sbr != NUL&& wp->w_p_wrap && col != 0)1169 if ((*p_sbr != NUL || wp->w_p_bri) && wp->w_p_wrap && col != 0) 1160 1170 { 1161 1171 numberextra = win_col_off(wp); 1162 1172 col += numberextra + mb_added; … … 1169 1179 } 1170 1180 if (col == 0 || col + size > (colnr_T)W_WIDTH(wp)) 1171 1181 { 1172 added = vim_strsize(p_sbr); 1182 added = 0; 1183 if (*p_sbr != NUL) 1184 added += vim_strsize(p_sbr); 1185 if (wp->w_p_bri) 1186 added += get_breakindent_win(wp,lnum); 1187 1173 1188 if (tab_corr) 1174 1189 size += (added / wp->w_buffer->b_p_ts) * wp->w_buffer->b_p_ts; 1175 1190 else … … 1277 1292 1278 1293 /* 1279 1294 * This function is used very often, do some speed optimizations. 1280 * When 'list', 'linebreak' and 'showbreak' are not set use a simple loop. 1295 * When 'list', 'linebreak', 'showbreak' and 'breakindent' are not set 1296 * use a simple loop. 1281 1297 * Also use this when 'list' is set but tabs take their normal size. 1282 1298 */ 1283 1299 if ((!wp->w_p_list || lcs_tab1 != NUL) 1284 1300 #ifdef FEAT_LINEBREAK 1285 && !wp->w_p_lbr && *p_sbr == NUL 1301 && !wp->w_p_lbr && *p_sbr == NUL && !wp->w_p_bri 1286 1302 #endif 1287 1303 ) 1288 1304 { … … 1344 1360 { 1345 1361 /* A tab gets expanded, depending on the current column */ 1346 1362 head = 0; 1347 incr = win_lbr_chartabsize(wp, ptr, vcol, &head );1363 incr = win_lbr_chartabsize(wp, ptr, vcol, &head, pos->lnum); 1348 1364 /* make sure we don't go past the end of the line */ 1349 1365 if (*ptr == NUL) 1350 1366 { -
src/edit.c
diff '--exclude=*.orig' -urN vim73.orig/src/edit.c vim73/src/edit.c
old new 405 405 if (startln) 406 406 Insstart.col = 0; 407 407 } 408 Insstart_textlen = (colnr_T)linetabsize(ml_get_curline() );408 Insstart_textlen = (colnr_T)linetabsize(ml_get_curline(), Insstart.lnum); 409 409 Insstart_blank_vcol = MAXCOL; 410 410 if (!did_ai) 411 411 ai_col = 0; … … 1913 1913 else 1914 1914 #endif 1915 1915 ++new_cursor_col; 1916 vcol += lbr_chartabsize(ptr + new_cursor_col, (colnr_T)vcol );1916 vcol += lbr_chartabsize(ptr + new_cursor_col, (colnr_T)vcol, curwin->w_cursor.lnum); 1917 1917 } 1918 1918 vcol = last_vcol; 1919 1919 … … 6701 6701 ins_need_undo = FALSE; 6702 6702 } 6703 6703 Insstart = curwin->w_cursor; /* new insertion starts here */ 6704 Insstart_textlen = (colnr_T)linetabsize(ml_get_curline() );6704 Insstart_textlen = (colnr_T)linetabsize(ml_get_curline(), curwin->w_cursor.lnum); 6705 6705 ai_col = 0; 6706 6706 #ifdef FEAT_VREPLACE 6707 6707 if (State & VREPLACE_FLAG) … … 7056 7056 for (;;) 7057 7057 { 7058 7058 coladvance(v - width); 7059 /* getviscol() is slow, skip it when 'showbreak' is empty and 7060 * there are no multi-byte characters */ 7061 if ((*p_sbr == NUL 7059 /* getviscol() is slow, skip it when 'showbreak' is empty, 7060 * 'breakindent' is not set and there are no multi-byte 7061 * characters */ 7062 if ((*p_sbr == NUL && !curwin->w_p_bri 7062 7063 # ifdef FEAT_MBYTE 7063 7064 && !has_mbyte 7064 7065 # endif … … 9694 9695 getvcol(curwin, &fpos, &vcol, NULL, NULL); 9695 9696 getvcol(curwin, cursor, &want_vcol, NULL, NULL); 9696 9697 9697 /* Use as many TABs as possible. Beware of ' showbreak' and9698 /* Use as many TABs as possible. Beware of 'breakindent', 'showbreak' and 9698 9699 * 'linebreak' adding extra virtual columns. */ 9699 9700 while (vim_iswhite(*ptr)) 9700 9701 { 9701 i = lbr_chartabsize((char_u *)"\t", vcol );9702 i = lbr_chartabsize((char_u *)"\t", vcol, cursor->lnum); 9702 9703 if (vcol + i > want_vcol) 9703 9704 break; 9704 9705 if (*ptr != TAB) … … 9724 9725 /* Skip over the spaces we need. */ 9725 9726 while (vcol < want_vcol && *ptr == ' ') 9726 9727 { 9727 vcol += lbr_chartabsize(ptr, vcol );9728 vcol += lbr_chartabsize(ptr, vcol, cursor->lnum); 9728 9729 ++ptr; 9729 9730 ++repl_off; 9730 9731 } … … 9980 9981 while ((colnr_T)temp < curwin->w_virtcol && *ptr != NUL) 9981 9982 { 9982 9983 prev_ptr = ptr; 9983 temp += lbr_chartabsize_adv(&ptr, (colnr_T)temp );9984 temp += lbr_chartabsize_adv(&ptr, (colnr_T)temp, lnum); 9984 9985 } 9985 9986 if ((colnr_T)temp > curwin->w_virtcol) 9986 9987 ptr = prev_ptr; -
src/eval.c
diff '--exclude=*.orig' -urN vim73.orig/src/eval.c vim73/src/eval.c
old new 17332 17332 17333 17333 if (argvars[1].v_type != VAR_UNKNOWN) 17334 17334 col = get_tv_number(&argvars[1]); 17335 17336 rettv->vval.v_number = (varnumber_T)(linetabsize_col(col, s) - col); 17335 /* 17336 * FIXME: passing 0 as 3rd argument to linetabsize_col, instead of real line number; 17337 * (can we get it from here somehow?); might give incorrect result with breakindent! 17338 */ 17339 rettv->vval.v_number = (varnumber_T)(linetabsize_col(col, s, 0) - col); 17337 17340 } 17338 17341 17339 17342 /* -
src/ex_cmds.c
diff '--exclude=*.orig' -urN vim73.orig/src/ex_cmds.c vim73/src/ex_cmds.c
old new 261 261 ; 262 262 save = *last; 263 263 *last = NUL; 264 len = linetabsize(line );/* get line length */264 len = linetabsize(line, curwin->w_cursor.lnum); /* get line length */ 265 265 if (has_tab != NULL) /* check for embedded TAB */ 266 266 *has_tab = (vim_strrchr(first, TAB) != NULL); 267 267 *last = save; -
src/getchar.c
diff '--exclude=*.orig' -urN vim73.orig/src/getchar.c vim73/src/getchar.c
old new 2619 2619 if (!vim_iswhite(ptr[col])) 2620 2620 curwin->w_wcol = vcol; 2621 2621 vcol += lbr_chartabsize(ptr + col, 2622 (colnr_T)vcol );2622 (colnr_T)vcol, curwin->w_cursor.lnum); 2623 2623 #ifdef FEAT_MBYTE 2624 2624 if (has_mbyte) 2625 2625 col += (*mb_ptr2len)(ptr + col); -
src/gui_beval.c
diff '--exclude=*.orig' -urN vim73.orig/src/gui_beval.c vim73/src/gui_beval.c
old new 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 '--exclude=*.orig' -urN vim73.orig/src/misc1.c vim73/src/misc1.c
old new 465 465 return (int)col; 466 466 } 467 467 468 #ifdef FEAT_LINEBREAK 469 /* 470 * Return appropriate space number for breakindent, taking influencing 471 * parameters into account. Window must be specified, since it is not 472 * necessarily always the current one. If lnum==0, current line is calculated, 473 * specified line otherwise. 474 */ 475 int 476 get_breakindent_win (wp,lnum) 477 win_T* wp; 478 linenr_T lnum; 479 { 480 int bri; 481 /* window width minus barren space, i.e. what rests for text */ 482 const int eff_wwidth = W_WIDTH(wp) 483 - (wp->w_p_nu && !vim_strchr(p_cpo,CPO_NUMCOL)?number_width(wp):0); 484 /* - (*p_sbr == NUL ? 0 : vim_strsize(p_sbr)); */ 485 486 bri = get_indent_buf(wp->w_buffer,lnum?lnum:wp->w_cursor.lnum) + wp->w_p_brishift; 487 488 /* if numbering and 'c' in 'cpoptions', cancel it out effectively */ 489 /* (this could be replaced by an equivalent call to win_col_off2()) */ 490 if (curwin->w_p_nu && vim_strchr(p_cpo, CPO_NUMCOL)) 491 bri += number_width(wp); 492 493 /* never indent past left window margin */ 494 if (bri < 0) 495 bri = 0; 496 /* always leave at least bri_min characters on the left, 497 * if text width is sufficient */ 498 else if (bri > eff_wwidth - wp->w_p_brimin) 499 bri = eff_wwidth - wp->w_p_brimin < 0 ? 0 : eff_wwidth - wp->w_p_brimin; 500 501 return bri; 502 } 503 #endif 504 505 468 506 #if defined(FEAT_CINDENT) || defined(FEAT_SMARTINDENT) 469 507 470 508 static int cin_is_cinword __ARGS((char_u *line)); … … 1947 1985 s = ml_get_buf(wp->w_buffer, lnum, FALSE); 1948 1986 if (*s == NUL) /* empty line */ 1949 1987 return 1; 1950 col = win_linetabsize(wp, s, (colnr_T)MAXCOL );1988 col = win_linetabsize(wp, s, (colnr_T)MAXCOL, lnum); 1951 1989 1952 1990 /* 1953 1991 * If list mode is on, then the '$' at the end of the line may take up one … … 2003 2041 col = 0; 2004 2042 while (*s != NUL && --column >= 0) 2005 2043 { 2006 col += win_lbr_chartabsize(wp, s, (colnr_T)col, NULL );2044 col += win_lbr_chartabsize(wp, s, (colnr_T)col, NULL, lnum); 2007 2045 mb_ptr_adv(s); 2008 2046 } 2009 2047 … … 2015 2053 * 'ts') -- webb. 2016 2054 */ 2017 2055 if (*s == TAB && (State & NORMAL) && (!wp->w_p_list || lcs_tab1)) 2018 col += win_lbr_chartabsize(wp, s, (colnr_T)col, NULL ) - 1;2056 col += win_lbr_chartabsize(wp, s, (colnr_T)col, NULL, lnum) - 1; 2019 2057 2020 2058 /* 2021 2059 * Add column offset for 'number', 'relativenumber', 'foldcolumn', etc. … … 8972 9010 amount = 0; 8973 9011 while (*that && col) 8974 9012 { 8975 amount += lbr_chartabsize_adv(&that, (colnr_T)amount );9013 amount += lbr_chartabsize_adv(&that, (colnr_T)amount, pos->lnum); 8976 9014 col--; 8977 9015 } 8978 9016 … … 8995 9033 8996 9034 while (vim_iswhite(*that)) 8997 9035 { 8998 amount += lbr_chartabsize(that, (colnr_T)amount );9036 amount += lbr_chartabsize(that, (colnr_T)amount, pos->lnum); 8999 9037 ++that; 9000 9038 } 9001 9039 … … 9034 9072 --parencount; 9035 9073 if (*that == '\\' && *(that+1) != NUL) 9036 9074 amount += lbr_chartabsize_adv(&that, 9037 (colnr_T)amount );9075 (colnr_T)amount, pos->lnum); 9038 9076 amount += lbr_chartabsize_adv(&that, 9039 (colnr_T)amount );9077 (colnr_T)amount, pos->lnum); 9040 9078 } 9041 9079 } 9042 9080 while (vim_iswhite(*that)) 9043 9081 { 9044 amount += lbr_chartabsize(that, (colnr_T)amount );9082 amount += lbr_chartabsize(that, (colnr_T)amount, pos->lnum); 9045 9083 that++; 9046 9084 } 9047 9085 if (!*that || *that == ';') -
src/misc2.c
diff '--exclude=*.orig' -urN vim73.orig/src/misc2.c vim73/src/misc2.c
old new 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 '--exclude=*.orig' -urN vim73.orig/src/normal.c vim73/src/normal.c
old new 4490 4490 int dir; 4491 4491 long dist; 4492 4492 { 4493 int linelen = linetabsize(ml_get_curline() );4493 int linelen = linetabsize(ml_get_curline(), curwin->w_cursor.lnum); 4494 4494 int retval = OK; 4495 4495 int atend = FALSE; 4496 4496 int n; … … 4563 4563 (void)hasFolding(curwin->w_cursor.lnum, 4564 4564 &curwin->w_cursor.lnum, NULL); 4565 4565 #endif 4566 linelen = linetabsize(ml_get_curline() );4566 linelen = linetabsize(ml_get_curline(), curwin->w_cursor.lnum); 4567 4567 if (linelen > width1) 4568 4568 curwin->w_curswant += (((linelen - width1 - 1) / width2) 4569 4569 + 1) * width2; … … 4593 4593 } 4594 4594 curwin->w_cursor.lnum++; 4595 4595 curwin->w_curswant %= width2; 4596 linelen = linetabsize(ml_get_curline() );4596 linelen = linetabsize(ml_get_curline(), curwin->w_cursor.lnum); 4597 4597 } 4598 4598 } 4599 4599 } -
src/ops.c
diff '--exclude=*.orig' -urN vim73.orig/src/ops.c vim73/src/ops.c
old new 431 431 } 432 432 for ( ; vim_iswhite(*bd.textstart); ) 433 433 { 434 incr = lbr_chartabsize_adv(&bd.textstart, (colnr_T)(bd.start_vcol) );434 incr = lbr_chartabsize_adv(&bd.textstart, (colnr_T)(bd.start_vcol), curwin->w_cursor.lnum); 435 435 total += incr; 436 436 bd.start_vcol += incr; 437 437 } … … 491 491 492 492 while (vim_iswhite(*non_white)) 493 493 { 494 incr = lbr_chartabsize_adv(&non_white, non_white_col );494 incr = lbr_chartabsize_adv(&non_white, non_white_col, curwin->w_cursor.lnum); 495 495 non_white_col += incr; 496 496 } 497 497 … … 516 516 verbatim_copy_width -= bd.start_char_vcols; 517 517 while (verbatim_copy_width < destination_col) 518 518 { 519 incr = lbr_chartabsize(verbatim_copy_end, verbatim_copy_width );519 incr = lbr_chartabsize(verbatim_copy_end, verbatim_copy_width, curwin->w_cursor.lnum); 520 520 if (verbatim_copy_width + incr > destination_col) 521 521 break; 522 522 verbatim_copy_width += incr; … … 3592 3592 for (ptr = oldp; vcol < col && *ptr; ) 3593 3593 { 3594 3594 /* Count a tab for what it's worth (if list mode not on) */ 3595 incr = lbr_chartabsize_adv(&ptr, (colnr_T)vcol );3595 incr = lbr_chartabsize_adv(&ptr, (colnr_T)vcol, lnum); 3596 3596 vcol += incr; 3597 3597 } 3598 3598 bd.textcol = (colnr_T)(ptr - oldp); … … 3626 3626 /* calculate number of spaces required to fill right side of block*/ 3627 3627 spaces = y_width + 1; 3628 3628 for (j = 0; j < yanklen; j++) 3629 spaces -= lbr_chartabsize(&y_array[i][j], 0 );3629 spaces -= lbr_chartabsize(&y_array[i][j], 0, lnum); 3630 3630 if (spaces < 0) 3631 3631 spaces = 0; 3632 3632 … … 5143 5143 while (bdp->start_vcol < oap->start_vcol && *pstart) 5144 5144 { 5145 5145 /* Count a tab for what it's worth (if list mode not on) */ 5146 incr = lbr_chartabsize(pstart, (colnr_T)bdp->start_vcol );5146 incr = lbr_chartabsize(pstart, (colnr_T)bdp->start_vcol, lnum); 5147 5147 bdp->start_vcol += incr; 5148 5148 #ifdef FEAT_VISUALEXTRA 5149 5149 if (vim_iswhite(*pstart)) … … 5212 5212 { 5213 5213 /* Count a tab for what it's worth (if list mode not on) */ 5214 5214 prev_pend = pend; 5215 incr = lbr_chartabsize_adv(&pend, (colnr_T)bdp->end_vcol );5215 incr = lbr_chartabsize_adv(&pend, (colnr_T)bdp->end_vcol, lnum); 5216 5216 bdp->end_vcol += incr; 5217 5217 } 5218 5218 if (bdp->end_vcol <= oap->end_vcol … … 6708 6708 validate_virtcol(); 6709 6709 col_print(buf1, sizeof(buf1), (int)curwin->w_cursor.col + 1, 6710 6710 (int)curwin->w_virtcol + 1); 6711 col_print(buf2, sizeof(buf2), (int)STRLEN(p), linetabsize(p ));6711 col_print(buf2, sizeof(buf2), (int)STRLEN(p), linetabsize(p, curwin->w_cursor.lnum)); 6712 6712 6713 6713 if (char_count_cursor == byte_count_cursor 6714 6714 && char_count == byte_count) -
src/option.c
diff '--exclude=*.orig' -urN vim73.orig/src/option.c vim73/src/option.c
old new 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 … … 646 651 {(char_u *)0L, (char_u *)0L} 647 652 #endif 648 653 SCRIPTID_INIT}, 654 {"breakindent", "bri", P_BOOL|P_VI_DEF|P_VIM|P_RWIN, 655 #ifdef FEAT_LINEBREAK 656 (char_u *)VAR_WIN, PV_BRI, 657 {(char_u *)FALSE, (char_u *)0L} 658 #else 659 (char_u *)NULL, PV_NONE, 660 {(char_u *)0L, (char_u *)0L} 661 #endif 662 SCRIPTID_INIT}, 663 {"breakindentmin", "brimin", P_NUM|P_VI_DEF|P_VIM|P_RWIN, 664 #ifdef FEAT_LINEBREAK 665 (char_u *)VAR_WIN, PV_BRIMIN, 666 {(char_u *)20L, (char_u *)20L} 667 #else 668 (char_u *)NULL, PV_NONE, 669 {(char_u *)0L, (char_u *)0L} 670 #endif 671 SCRIPTID_INIT}, 672 {"breakindentshift", "brishift", P_NUM|P_VI_DEF|P_VIM|P_RWIN, 673 #ifdef FEAT_LINEBREAK 674 (char_u *)VAR_WIN, PV_BRISHIFT, 675 {(char_u *)0L, (char_u *)0L} 676 #else 677 (char_u *)NULL, PV_NONE, 678 {(char_u *)0L, (char_u *)0L} 679 #endif 680 SCRIPTID_INIT}, 649 681 {"browsedir", "bsdir",P_STRING|P_VI_DEF, 650 682 #ifdef FEAT_BROWSE 651 683 (char_u *)&p_bsdir, PV_NONE, … … 8423 8455 } 8424 8456 curwin->w_nrwidth_line_count = 0; 8425 8457 } 8458 8459 /* 'breakindentmin' must be positive */ 8460 else if (pp == &curwin->w_p_brimin) 8461 { 8462 if (curwin->w_p_brimin < 1) 8463 { 8464 errmsg = e_positive; 8465 curwin->w_p_brimin = 1; 8466 } 8467 } 8426 8468 #endif 8427 8469 8428 8470 else if (pp == &curbuf->b_p_tw) … … 9660 9702 case PV_WRAP: return (char_u *)&(curwin->w_p_wrap); 9661 9703 #ifdef FEAT_LINEBREAK 9662 9704 case PV_LBR: return (char_u *)&(curwin->w_p_lbr); 9705 case PV_BRI: return (char_u *)&(curwin->w_p_bri); 9706 case PV_BRIMIN: return (char_u *)&(curwin->w_p_brimin); 9707 case PV_BRISHIFT: return (char_u *)&(curwin->w_p_brishift); 9663 9708 #endif 9664 9709 #ifdef FEAT_SCROLLBIND 9665 9710 case PV_SCBIND: return (char_u *)&(curwin->w_p_scb); … … 9846 9891 to->wo_wrap = from->wo_wrap; 9847 9892 #ifdef FEAT_LINEBREAK 9848 9893 to->wo_lbr = from->wo_lbr; 9894 to->wo_bri = from->wo_bri; 9895 to->wo_brimin = from->wo_brimin; 9849 9896 #endif 9850 9897 #ifdef FEAT_SCROLLBIND 9851 9898 to->wo_scb = from->wo_scb; -
src/option.h
diff '--exclude=*.orig' -urN vim73.orig/src/option.h vim73/src/option.h
old new 1049 1049 #ifdef FEAT_CURSORBIND 1050 1050 , WV_CRBIND 1051 1051 #endif 1052 #ifdef FEAT_LINEBREAK 1053 , WV_BRI 1054 , WV_BRIMIN 1055 , WV_BRISHIFT 1056 #endif 1052 1057 #ifdef FEAT_DIFF 1053 1058 , WV_DIFF 1054 1059 #endif -
src/proto/charset.pro
diff '--exclude=*.orig' -urN vim73.orig/src/proto/charset.pro vim73/src/proto/charset.pro
old new 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 '--exclude=*.orig' -urN vim73.orig/src/proto/misc1.pro vim73/src/proto/misc1.pro
old new 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, int do_skip_space)); 10 11 int get_last_leader_offset __ARGS((char_u *line, char_u **flags)); -
src/regexp.c
diff '--exclude=*.orig' -urN vim73.orig/src/regexp.c vim73/src/regexp.c
old new 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 '--exclude=*.orig' -urN vim73.orig/src/screen.c vim73/src/screen.c
old new 2815 2815 # define WL_SIGN WL_FOLD /* column for signs */ 2816 2816 #endif 2817 2817 #define WL_NR WL_SIGN + 1 /* line number */ 2818 #ifdef FEAT_LINEBREAK 2819 # define WL_BRI WL_NR + 1 /* 'breakindent' */ 2820 #else 2821 # define WL_BRI WL_NR 2822 #endif 2818 2823 #if defined(FEAT_LINEBREAK) || defined(FEAT_DIFF) 2819 # define WL_SBR WL_ NR+ 1 /* 'showbreak' or 'diff' */2824 # define WL_SBR WL_BRI + 1 /* 'showbreak' or 'diff' */ 2820 2825 #else 2821 # define WL_SBR WL_ NR2826 # define WL_SBR WL_BRI 2822 2827 #endif 2823 2828 #define WL_LINE WL_SBR + 1 /* text in the line */ 2824 2829 int draw_state = WL_START; /* what to draw next */ … … 3149 3154 #endif 3150 3155 while (vcol < v && *ptr != NUL) 3151 3156 { 3152 c = win_lbr_chartabsize(wp, ptr, (colnr_T)vcol, NULL );3157 c = win_lbr_chartabsize(wp, ptr, (colnr_T)vcol, NULL, lnum); 3153 3158 vcol += c; 3154 3159 #ifdef FEAT_MBYTE 3155 3160 prev_ptr = ptr; … … 3519 3524 } 3520 3525 } 3521 3526 3527 #ifdef FEAT_LINEBREAK 3528 /* draw 'breakindent': indent wrapped text accordingly */ 3529 if (draw_state == WL_BRI -1 && n_extra == 0){ 3530 draw_state = WL_BRI; 3531 # ifdef FEAT_DIFF 3532 /* FIXME: handle (filler_todo > 0): or modify showbreak so that ---- lines are shorter by the amount needed? */ 3533 # endif 3534 if (wp->w_p_bri && row != startrow){ /* FIXME: what is startrow? Don't we need it as well?? */ 3535 p_extra = NUL; 3536 c_extra = ' '; 3537 n_extra = get_breakindent_win(wp,lnum); 3538 char_attr = 0; /* was: hl_attr(HLF_AT); */ 3539 /* FIXME: why do we need to adjust vcol if showbreak does not?? */ 3540 // vcol += n_extra; 3541 /* FIXME: is this relevant here? copied shamelessly from showbreak */ 3542 /* Correct end of highlighted area for 'breakindent', 3543 * required when 'linebreak' is also set. */ 3544 if (tocol == vcol) 3545 tocol += n_extra; 3546 } 3547 } 3548 #endif 3549 3550 3522 3551 #if defined(FEAT_LINEBREAK) || defined(FEAT_DIFF) 3523 3552 if (draw_state == WL_SBR - 1 && n_extra == 0) 3524 3553 { … … 4225 4254 # ifdef FEAT_MBYTE 4226 4255 has_mbyte ? mb_l : 4227 4256 # endif 4228 1), (colnr_T)vcol, NULL ) - 1;4257 1), (colnr_T)vcol, NULL, lnum) - 1; 4229 4258 c_extra = ' '; 4230 4259 if (vim_iswhite(c)) 4231 4260 c = ' '; -
src/structs.h
diff '--exclude=*.orig' -urN vim73.orig/src/structs.h vim73/src/structs.h
old new 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 '--exclude=*.orig' -urN vim73.orig/src/ui.c vim73/src/ui.c
old new 3134 3134 start = ptr = ml_get_buf(wp->w_buffer, lnum, FALSE); 3135 3135 while (count <= vcol && *ptr != NUL) 3136 3136 { 3137 count += win_lbr_chartabsize(wp, ptr, count, NULL );3137 count += win_lbr_chartabsize(wp, ptr, count, NULL, lnum); 3138 3138 mb_ptr_adv(ptr); 3139 3139 } 3140 3140 return (int)(ptr - start);