Blog: Better line wrapping in Vim, 7th iteration: vim-7.3.944-fc17-breakindent.patch
File vim-7.3.944-fc17-breakindent.patch, 31.8 KB (added by retracile, 12 years ago) |
---|
-
runtime/doc/eval.txt
diff -urN '--exclude=*.orig' vim73.orig/runtime/doc/eval.txt vim73/runtime/doc/eval.txt
old new 6342 6342 keymap Compiled with 'keymap' support. 6343 6343 langmap Compiled with 'langmap' support. 6344 6344 libcall Compiled with |libcall()| support. 6345 linebreak Compiled with 'linebreak', 'breakat' and 'showbreak'6346 support.6345 linebreak Compiled with 'linebreak', 'breakat', 'showbreak' and 6346 'breakindent' support. 6347 6347 lispindent Compiled with support for lisp indenting. 6348 6348 listcmds Compiled with commands for the buffer list |:files| 6349 6349 and the argument list |arglist|. -
runtime/doc/options.txt
diff -urN '--exclude=*.orig' 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 … … 4472 4505 {not in Vi} 4473 4506 {not available when compiled without the |+linebreak| 4474 4507 feature} 4475 If on Vim will wrap long lines at a character in 'breakat' rather4508 If on, Vim will wrap long lines at a character in 'breakat' rather 4476 4509 than at the last character that fits on the screen. Unlike 4477 4510 'wrapmargin' and 'textwidth', this does not insert <EOL>s in the file, 4478 it only affects the way the file is displayed, not its contents. The 4479 value of 'showbreak' is used to put in front of wrapped lines. 4480 This option is not used when the 'wrap' option is off or 'list' is on. 4511 it only affects the way the file is displayed, not its contents. 4512 If 'breakindent' is set, line is visually indented. Then, the value 4513 of 'showbreak' is used to put in front of wrapped lines. This option 4514 is not used when the 'wrap' option is off or 'list' is on. 4481 4515 Note that <Tab> characters after an <EOL> are mostly not displayed 4482 4516 with the right amount of white space. 4483 4517 -
runtime/doc/tags
diff -urN '--exclude=*.orig' 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 -urN '--exclude=*.orig' 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 -urN '--exclude=*.orig' vim73.orig/src/charset.c vim73/src/charset.c
old new 852 852 * taking into account the size of a tab. 853 853 */ 854 854 int 855 linetabsize(s )855 linetabsize(s, lnum) 856 856 char_u *s; 857 linenr_T lnum; 857 858 { 858 return linetabsize_col(0, s );859 return linetabsize_col(0, s, lnum); 859 860 } 860 861 861 862 /* 862 863 * Like linetabsize(), but starting at column "startcol". 863 864 */ 864 865 int 865 linetabsize_col(startcol, s )866 linetabsize_col(startcol, s, lnum) 866 867 int startcol; 867 868 char_u *s; 869 linenr_T lnum; 868 870 { 869 871 colnr_T col = startcol; 870 872 871 873 while (*s != NUL) 872 col += lbr_chartabsize_adv(&s, col );874 col += lbr_chartabsize_adv(&s, col, lnum); 873 875 return (int)col; 874 876 } 875 877 … … 877 879 * Like linetabsize(), but for a given window instead of the current one. 878 880 */ 879 881 int 880 win_linetabsize(wp, p, len )882 win_linetabsize(wp, p, len, lnum) 881 883 win_T *wp; 882 884 char_u *p; 883 885 colnr_T len; 886 linenr_T lnum; 884 887 { 885 888 colnr_T col = 0; 886 889 char_u *s; 887 890 888 891 for (s = p; *s != NUL && (len == MAXCOL || s < p + len); mb_ptr_adv(s)) 889 col += win_lbr_chartabsize(wp, s, col, NULL );892 col += win_lbr_chartabsize(wp, s, col, NULL, lnum); 890 893 return (int)col; 891 894 } 892 895 … … 1021 1024 * like chartabsize(), but also check for line breaks on the screen 1022 1025 */ 1023 1026 int 1024 lbr_chartabsize(s, col )1027 lbr_chartabsize(s, col, lnum) 1025 1028 unsigned char *s; 1026 1029 colnr_T col; 1030 linenr_T lnum; 1027 1031 { 1028 1032 #ifdef FEAT_LINEBREAK 1029 if (!curwin->w_p_lbr && *p_sbr == NUL )1033 if (!curwin->w_p_lbr && *p_sbr == NUL && !curwin->w_p_bri) 1030 1034 { 1031 1035 #endif 1032 1036 #ifdef FEAT_MBYTE … … 1036 1040 RET_WIN_BUF_CHARTABSIZE(curwin, curbuf, s, col) 1037 1041 #ifdef FEAT_LINEBREAK 1038 1042 } 1039 return win_lbr_chartabsize(curwin, s, col, NULL );1043 return win_lbr_chartabsize(curwin, s, col, NULL, lnum); 1040 1044 #endif 1041 1045 } 1042 1046 … … 1044 1048 * Call lbr_chartabsize() and advance the pointer. 1045 1049 */ 1046 1050 int 1047 lbr_chartabsize_adv(s, col )1051 lbr_chartabsize_adv(s, col, lnum) 1048 1052 char_u **s; 1049 1053 colnr_T col; 1054 linenr_T lnum; 1050 1055 { 1051 1056 int retval; 1052 1057 1053 retval = lbr_chartabsize(*s, col );1058 retval = lbr_chartabsize(*s, col, lnum); 1054 1059 mb_ptr_adv(*s); 1055 1060 return retval; 1056 1061 } … … 1061 1066 * If "headp" not NULL, set *headp to the size of what we for 'showbreak' 1062 1067 * string at start of line. Warning: *headp is only set if it's a non-zero 1063 1068 * value, init to 0 before calling. 1069 * 1070 * linenr argument needed if in visual highlighting and breakindent=on, then 1071 * the line calculated is not current; if 0, normal functionality is preserved. 1064 1072 */ 1065 1073 int 1066 win_lbr_chartabsize(wp, s, col, headp )1074 win_lbr_chartabsize(wp, s, col, headp, lnum) 1067 1075 win_T *wp; 1068 1076 char_u *s; 1069 1077 colnr_T col; 1070 1078 int *headp UNUSED; 1079 linenr_T lnum; 1071 1080 { 1072 1081 #ifdef FEAT_LINEBREAK 1073 1082 int c; … … 1086 1095 int n; 1087 1096 1088 1097 /* 1089 * No 'linebreak' and 'showbreak' : return quickly.1098 * No 'linebreak' and 'showbreak' and 'breakindent': return quickly. 1090 1099 */ 1091 if (!wp->w_p_lbr && *p_sbr == NUL)1100 if (!wp->w_p_lbr && !wp->w_p_bri && *p_sbr == NUL) 1092 1101 #endif 1093 1102 { 1094 1103 #ifdef FEAT_MBYTE … … 1163 1172 # endif 1164 1173 1165 1174 /* 1166 * May have to add something for 'showbreak' string at start of line 1175 * May have to add something for 'breakindent' and/or 'showbreak' 1176 * string at start of line. 1167 1177 * Set *headp to the size of what we add. 1168 1178 */ 1169 1179 added = 0; 1170 if ( *p_sbr != NUL&& wp->w_p_wrap && col != 0)1180 if ((*p_sbr != NUL || wp->w_p_bri) && wp->w_p_wrap && col != 0) 1171 1181 { 1172 1182 numberextra = win_col_off(wp); 1173 1183 col += numberextra + mb_added; … … 1180 1190 } 1181 1191 if (col == 0 || col + size > (colnr_T)W_WIDTH(wp)) 1182 1192 { 1183 added = vim_strsize(p_sbr); 1193 added = 0; 1194 if (*p_sbr != NUL) 1195 added += vim_strsize(p_sbr); 1196 if (wp->w_p_bri) 1197 added += get_breakindent_win(wp,lnum); 1198 1184 1199 if (tab_corr) 1185 1200 size += (added / wp->w_buffer->b_p_ts) * wp->w_buffer->b_p_ts; 1186 1201 else … … 1288 1303 1289 1304 /* 1290 1305 * This function is used very often, do some speed optimizations. 1291 * When 'list', 'linebreak' and 'showbreak' are not set use a simple loop. 1306 * When 'list', 'linebreak', 'showbreak' and 'breakindent' are not set 1307 * use a simple loop. 1292 1308 * Also use this when 'list' is set but tabs take their normal size. 1293 1309 */ 1294 1310 if ((!wp->w_p_list || lcs_tab1 != NUL) 1295 1311 #ifdef FEAT_LINEBREAK 1296 && !wp->w_p_lbr && *p_sbr == NUL 1312 && !wp->w_p_lbr && *p_sbr == NUL && !wp->w_p_bri 1297 1313 #endif 1298 1314 ) 1299 1315 { … … 1355 1371 { 1356 1372 /* A tab gets expanded, depending on the current column */ 1357 1373 head = 0; 1358 incr = win_lbr_chartabsize(wp, ptr, vcol, &head );1374 incr = win_lbr_chartabsize(wp, ptr, vcol, &head, pos->lnum); 1359 1375 /* make sure we don't go past the end of the line */ 1360 1376 if (*ptr == NUL) 1361 1377 { -
src/edit.c
diff -urN '--exclude=*.orig' vim73.orig/src/edit.c vim73/src/edit.c
old new 420 420 if (startln) 421 421 Insstart.col = 0; 422 422 } 423 Insstart_textlen = (colnr_T)linetabsize(ml_get_curline() );423 Insstart_textlen = (colnr_T)linetabsize(ml_get_curline(), Insstart.lnum); 424 424 Insstart_blank_vcol = MAXCOL; 425 425 if (!did_ai) 426 426 ai_col = 0; … … 1943 1943 else 1944 1944 #endif 1945 1945 ++new_cursor_col; 1946 vcol += lbr_chartabsize(ptr + new_cursor_col, (colnr_T)vcol );1946 vcol += lbr_chartabsize(ptr + new_cursor_col, (colnr_T)vcol, curwin->w_cursor.lnum); 1947 1947 } 1948 1948 vcol = last_vcol; 1949 1949 … … 6734 6734 ins_need_undo = FALSE; 6735 6735 } 6736 6736 Insstart = curwin->w_cursor; /* new insertion starts here */ 6737 Insstart_textlen = (colnr_T)linetabsize(ml_get_curline() );6737 Insstart_textlen = (colnr_T)linetabsize(ml_get_curline(), curwin->w_cursor.lnum); 6738 6738 ai_col = 0; 6739 6739 #ifdef FEAT_VREPLACE 6740 6740 if (State & VREPLACE_FLAG) … … 7089 7089 for (;;) 7090 7090 { 7091 7091 coladvance(v - width); 7092 /* getviscol() is slow, skip it when 'showbreak' is empty and 7093 * there are no multi-byte characters */ 7094 if ((*p_sbr == NUL 7092 /* getviscol() is slow, skip it when 'showbreak' is empty, 7093 * 'breakindent' is not set and there are no multi-byte 7094 * characters */ 7095 if ((*p_sbr == NUL && !curwin->w_p_bri 7095 7096 # ifdef FEAT_MBYTE 7096 7097 && !has_mbyte 7097 7098 # endif … … 9726 9727 getvcol(curwin, &fpos, &vcol, NULL, NULL); 9727 9728 getvcol(curwin, cursor, &want_vcol, NULL, NULL); 9728 9729 9729 /* Use as many TABs as possible. Beware of ' showbreak' and9730 /* Use as many TABs as possible. Beware of 'breakindent', 'showbreak' and 9730 9731 * 'linebreak' adding extra virtual columns. */ 9731 9732 while (vim_iswhite(*ptr)) 9732 9733 { 9733 i = lbr_chartabsize((char_u *)"\t", vcol );9734 i = lbr_chartabsize((char_u *)"\t", vcol, cursor->lnum); 9734 9735 if (vcol + i > want_vcol) 9735 9736 break; 9736 9737 if (*ptr != TAB) … … 9756 9757 /* Skip over the spaces we need. */ 9757 9758 while (vcol < want_vcol && *ptr == ' ') 9758 9759 { 9759 vcol += lbr_chartabsize(ptr, vcol );9760 vcol += lbr_chartabsize(ptr, vcol, cursor->lnum); 9760 9761 ++ptr; 9761 9762 ++repl_off; 9762 9763 } … … 10012 10013 while ((colnr_T)temp < curwin->w_virtcol && *ptr != NUL) 10013 10014 { 10014 10015 prev_ptr = ptr; 10015 temp += lbr_chartabsize_adv(&ptr, (colnr_T)temp );10016 temp += lbr_chartabsize_adv(&ptr, (colnr_T)temp, lnum); 10016 10017 } 10017 10018 if ((colnr_T)temp > curwin->w_virtcol) 10018 10019 ptr = prev_ptr; -
src/eval.c
diff -urN '--exclude=*.orig' vim73.orig/src/eval.c vim73/src/eval.c
old new 17474 17474 17475 17475 if (argvars[1].v_type != VAR_UNKNOWN) 17476 17476 col = get_tv_number(&argvars[1]); 17477 17478 rettv->vval.v_number = (varnumber_T)(linetabsize_col(col, s) - col); 17477 /* 17478 * FIXME: passing 0 as 3rd argument to linetabsize_col, instead of real line number; 17479 * (can we get it from here somehow?); might give incorrect result with breakindent! 17480 */ 17481 rettv->vval.v_number = (varnumber_T)(linetabsize_col(col, s, 0) - col); 17479 17482 } 17480 17483 17481 17484 /* -
src/ex_cmds.c
diff -urN '--exclude=*.orig' 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 -urN '--exclude=*.orig' vim73.orig/src/getchar.c vim73/src/getchar.c
old new 2631 2631 if (!vim_iswhite(ptr[col])) 2632 2632 curwin->w_wcol = vcol; 2633 2633 vcol += lbr_chartabsize(ptr + col, 2634 (colnr_T)vcol );2634 (colnr_T)vcol, curwin->w_cursor.lnum); 2635 2635 #ifdef FEAT_MBYTE 2636 2636 if (has_mbyte) 2637 2637 col += (*mb_ptr2len)(ptr + col); -
src/gui_beval.c
diff -urN '--exclude=*.orig' 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 -urN '--exclude=*.orig' 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. … … 9045 9083 amount = 0; 9046 9084 while (*that && col) 9047 9085 { 9048 amount += lbr_chartabsize_adv(&that, (colnr_T)amount );9086 amount += lbr_chartabsize_adv(&that, (colnr_T)amount, pos->lnum); 9049 9087 col--; 9050 9088 } 9051 9089 … … 9068 9106 9069 9107 while (vim_iswhite(*that)) 9070 9108 { 9071 amount += lbr_chartabsize(that, (colnr_T)amount );9109 amount += lbr_chartabsize(that, (colnr_T)amount, pos->lnum); 9072 9110 ++that; 9073 9111 } 9074 9112 … … 9107 9145 --parencount; 9108 9146 if (*that == '\\' && *(that+1) != NUL) 9109 9147 amount += lbr_chartabsize_adv(&that, 9110 (colnr_T)amount );9148 (colnr_T)amount, pos->lnum); 9111 9149 amount += lbr_chartabsize_adv(&that, 9112 (colnr_T)amount );9150 (colnr_T)amount, pos->lnum); 9113 9151 } 9114 9152 } 9115 9153 while (vim_iswhite(*that)) 9116 9154 { 9117 amount += lbr_chartabsize(that, (colnr_T)amount );9155 amount += lbr_chartabsize(that, (colnr_T)amount, pos->lnum); 9118 9156 that++; 9119 9157 } 9120 9158 if (!*that || *that == ';') -
src/misc2.c
diff -urN '--exclude=*.orig' 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 -urN '--exclude=*.orig' vim73.orig/src/normal.c vim73/src/normal.c
old new 4534 4534 int dir; 4535 4535 long dist; 4536 4536 { 4537 int linelen = linetabsize(ml_get_curline() );4537 int linelen = linetabsize(ml_get_curline(), curwin->w_cursor.lnum); 4538 4538 int retval = OK; 4539 4539 int atend = FALSE; 4540 4540 int n; … … 4607 4607 (void)hasFolding(curwin->w_cursor.lnum, 4608 4608 &curwin->w_cursor.lnum, NULL); 4609 4609 #endif 4610 linelen = linetabsize(ml_get_curline() );4610 linelen = linetabsize(ml_get_curline(), curwin->w_cursor.lnum); 4611 4611 if (linelen > width1) 4612 4612 curwin->w_curswant += (((linelen - width1 - 1) / width2) 4613 4613 + 1) * width2; … … 4637 4637 } 4638 4638 curwin->w_cursor.lnum++; 4639 4639 curwin->w_curswant %= width2; 4640 linelen = linetabsize(ml_get_curline() );4640 linelen = linetabsize(ml_get_curline(), curwin->w_cursor.lnum); 4641 4641 } 4642 4642 } 4643 4643 } -
src/ops.c
diff -urN '--exclude=*.orig' 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; … … 3612 3612 for (ptr = oldp; vcol < col && *ptr; ) 3613 3613 { 3614 3614 /* Count a tab for what it's worth (if list mode not on) */ 3615 incr = lbr_chartabsize_adv(&ptr, (colnr_T)vcol );3615 incr = lbr_chartabsize_adv(&ptr, (colnr_T)vcol, lnum); 3616 3616 vcol += incr; 3617 3617 } 3618 3618 bd.textcol = (colnr_T)(ptr - oldp); … … 3646 3646 /* calculate number of spaces required to fill right side of block*/ 3647 3647 spaces = y_width + 1; 3648 3648 for (j = 0; j < yanklen; j++) 3649 spaces -= lbr_chartabsize(&y_array[i][j], 0 );3649 spaces -= lbr_chartabsize(&y_array[i][j], 0, lnum); 3650 3650 if (spaces < 0) 3651 3651 spaces = 0; 3652 3652 … … 5163 5163 while (bdp->start_vcol < oap->start_vcol && *pstart) 5164 5164 { 5165 5165 /* Count a tab for what it's worth (if list mode not on) */ 5166 incr = lbr_chartabsize(pstart, (colnr_T)bdp->start_vcol );5166 incr = lbr_chartabsize(pstart, (colnr_T)bdp->start_vcol, lnum); 5167 5167 bdp->start_vcol += incr; 5168 5168 #ifdef FEAT_VISUALEXTRA 5169 5169 if (vim_iswhite(*pstart)) … … 5232 5232 { 5233 5233 /* Count a tab for what it's worth (if list mode not on) */ 5234 5234 prev_pend = pend; 5235 incr = lbr_chartabsize_adv(&pend, (colnr_T)bdp->end_vcol );5235 incr = lbr_chartabsize_adv(&pend, (colnr_T)bdp->end_vcol, lnum); 5236 5236 bdp->end_vcol += incr; 5237 5237 } 5238 5238 if (bdp->end_vcol <= oap->end_vcol … … 6745 6745 validate_virtcol(); 6746 6746 col_print(buf1, sizeof(buf1), (int)curwin->w_cursor.col + 1, 6747 6747 (int)curwin->w_virtcol + 1); 6748 col_print(buf2, sizeof(buf2), (int)STRLEN(p), linetabsize(p ));6748 col_print(buf2, sizeof(buf2), (int)STRLEN(p), linetabsize(p, curwin->w_cursor.lnum)); 6749 6749 6750 6750 if (char_count_cursor == byte_count_cursor 6751 6751 && char_count == byte_count) -
src/option.c
diff -urN '--exclude=*.orig' 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, … … 8485 8517 } 8486 8518 curwin->w_nrwidth_line_count = 0; 8487 8519 } 8520 8521 /* 'breakindentmin' must be positive */ 8522 else if (pp == &curwin->w_p_brimin) 8523 { 8524 if (curwin->w_p_brimin < 1) 8525 { 8526 errmsg = e_positive; 8527 curwin->w_p_brimin = 1; 8528 } 8529 } 8488 8530 #endif 8489 8531 8490 8532 else if (pp == &curbuf->b_p_tw) … … 9934 9976 case PV_WRAP: return (char_u *)&(curwin->w_p_wrap); 9935 9977 #ifdef FEAT_LINEBREAK 9936 9978 case PV_LBR: return (char_u *)&(curwin->w_p_lbr); 9979 case PV_BRI: return (char_u *)&(curwin->w_p_bri); 9980 case PV_BRIMIN: return (char_u *)&(curwin->w_p_brimin); 9981 case PV_BRISHIFT: return (char_u *)&(curwin->w_p_brishift); 9937 9982 #endif 9938 9983 #ifdef FEAT_SCROLLBIND 9939 9984 case PV_SCBIND: return (char_u *)&(curwin->w_p_scb); … … 10120 10165 to->wo_wrap = from->wo_wrap; 10121 10166 #ifdef FEAT_LINEBREAK 10122 10167 to->wo_lbr = from->wo_lbr; 10168 to->wo_bri = from->wo_bri; 10169 to->wo_brimin = from->wo_brimin; 10123 10170 #endif 10124 10171 #ifdef FEAT_SCROLLBIND 10125 10172 to->wo_scb = from->wo_scb; -
src/option.h
diff -urN '--exclude=*.orig' vim73.orig/src/option.h vim73/src/option.h
old new 1050 1050 #ifdef FEAT_CURSORBIND 1051 1051 , WV_CRBIND 1052 1052 #endif 1053 #ifdef FEAT_LINEBREAK 1054 , WV_BRI 1055 , WV_BRIMIN 1056 , WV_BRISHIFT 1057 #endif 1053 1058 #ifdef FEAT_DIFF 1054 1059 , WV_DIFF 1055 1060 #endif -
src/proto/charset.pro
diff -urN '--exclude=*.orig' 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_iswordc_buf __ARGS((int c, buf_T *buf)); … … 26 26 int vim_isfilec_or_wc __ARGS((int c)); 27 27 int vim_isprintc __ARGS((int c)); 28 28 int vim_isprintc_strict __ARGS((int c)); 29 int lbr_chartabsize __ARGS((unsigned char *s, colnr_T col ));30 int lbr_chartabsize_adv __ARGS((char_u **s, colnr_T col ));31 int win_lbr_chartabsize __ARGS((win_T *wp, char_u *s, colnr_T col, int *headp ));29 int lbr_chartabsize __ARGS((unsigned char *s, colnr_T col, linenr_T lnum)); 30 int lbr_chartabsize_adv __ARGS((char_u **s, colnr_T col, linenr_T lnum)); 31 int win_lbr_chartabsize __ARGS((win_T *wp, char_u *s, colnr_T col, int *headp, linenr_T lnum)); 32 32 int in_win_border __ARGS((win_T *wp, colnr_T vcol)); 33 33 void getvcol __ARGS((win_T *wp, pos_T *pos, colnr_T *start, colnr_T *cursor, colnr_T *end)); 34 34 colnr_T getvcol_nolist __ARGS((pos_T *posp)); -
src/proto/misc1.pro
diff -urN '--exclude=*.orig' 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 second_line_indent)); 9 10 int get_leader_len __ARGS((char_u *line, char_u **flags, int backward, int include_space)); 10 11 int get_last_leader_offset __ARGS((char_u *line, char_u **flags)); -
src/regexp.c
diff -urN '--exclude=*.orig' 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 -urN '--exclude=*.orig' vim73.orig/src/screen.c vim73/src/screen.c
old new 2828 2828 # define WL_SIGN WL_FOLD /* column for signs */ 2829 2829 #endif 2830 2830 #define WL_NR WL_SIGN + 1 /* line number */ 2831 #ifdef FEAT_LINEBREAK 2832 # define WL_BRI WL_NR + 1 /* 'breakindent' */ 2833 #else 2834 # define WL_BRI WL_NR 2835 #endif 2831 2836 #if defined(FEAT_LINEBREAK) || defined(FEAT_DIFF) 2832 # define WL_SBR WL_ NR+ 1 /* 'showbreak' or 'diff' */2837 # define WL_SBR WL_BRI + 1 /* 'showbreak' or 'diff' */ 2833 2838 #else 2834 # define WL_SBR WL_ NR2839 # define WL_SBR WL_BRI 2835 2840 #endif 2836 2841 #define WL_LINE WL_SBR + 1 /* text in the line */ 2837 2842 int draw_state = WL_START; /* what to draw next */ … … 3162 3167 #endif 3163 3168 while (vcol < v && *ptr != NUL) 3164 3169 { 3165 c = win_lbr_chartabsize(wp, ptr, (colnr_T)vcol, NULL );3170 c = win_lbr_chartabsize(wp, ptr, (colnr_T)vcol, NULL, lnum); 3166 3171 vcol += c; 3167 3172 #ifdef FEAT_MBYTE 3168 3173 prev_ptr = ptr; … … 3541 3546 } 3542 3547 } 3543 3548 3549 #ifdef FEAT_LINEBREAK 3550 /* draw 'breakindent': indent wrapped text accordingly */ 3551 if (draw_state == WL_BRI -1 && n_extra == 0){ 3552 draw_state = WL_BRI; 3553 # ifdef FEAT_DIFF 3554 /* FIXME: handle (filler_todo > 0): or modify showbreak so that ---- lines are shorter by the amount needed? */ 3555 # endif 3556 if (wp->w_p_bri && row != startrow){ /* FIXME: what is startrow? Don't we need it as well?? */ 3557 p_extra = NUL; 3558 c_extra = ' '; 3559 n_extra = get_breakindent_win(wp,lnum); 3560 char_attr = 0; /* was: hl_attr(HLF_AT); */ 3561 /* FIXME: why do we need to adjust vcol if showbreak does not?? */ 3562 // vcol += n_extra; 3563 /* FIXME: is this relevant here? copied shamelessly from showbreak */ 3564 /* Correct end of highlighted area for 'breakindent', 3565 * required when 'linebreak' is also set. */ 3566 if (tocol == vcol) 3567 tocol += n_extra; 3568 } 3569 } 3570 #endif 3571 3572 3544 3573 #if defined(FEAT_LINEBREAK) || defined(FEAT_DIFF) 3545 3574 if (draw_state == WL_SBR - 1 && n_extra == 0) 3546 3575 { … … 4247 4276 # ifdef FEAT_MBYTE 4248 4277 has_mbyte ? mb_l : 4249 4278 # endif 4250 1), (colnr_T)vcol, NULL ) - 1;4279 1), (colnr_T)vcol, NULL, lnum) - 1; 4251 4280 c_extra = ' '; 4252 4281 if (vim_iswhite(c)) 4253 4282 c = ' '; -
src/structs.h
diff -urN '--exclude=*.orig' 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 -urN '--exclude=*.orig' vim73.orig/src/ui.c vim73/src/ui.c
old new 3168 3168 start = ptr = ml_get_buf(wp->w_buffer, lnum, FALSE); 3169 3169 while (count < vcol && *ptr != NUL) 3170 3170 { 3171 count += win_lbr_chartabsize(wp, ptr, count, NULL );3171 count += win_lbr_chartabsize(wp, ptr, count, NULL, lnum); 3172 3172 mb_ptr_adv(ptr); 3173 3173 } 3174 3174 return (int)(ptr - start);