Blog: Better line wrapping in Vim, 2nd iteration: vim-7.2-breakindent.patch
File vim-7.2-breakindent.patch, 29.4 KB (added by retracile, 15 years ago) |
---|
-
runtime/doc/eval.txt
diff -urN vim72.orig/runtime/doc/eval.txt vim72.work/runtime/doc/eval.txt
old new 5825 5825 keymap Compiled with 'keymap' support. 5826 5826 langmap Compiled with 'langmap' support. 5827 5827 libcall Compiled with |libcall()| support. 5828 linebreak Compiled with 'linebreak', 'breakat' and 'showbreak'5829 support.5828 linebreak Compiled with 'linebreak', 'breakat', 'showbreak' and 5829 'breakindent' support. 5830 5830 lispindent Compiled with support for lisp indenting. 5831 5831 listcmds Compiled with commands for the buffer list |:files| 5832 5832 and the argument list |arglist|. -
runtime/doc/options.txt
diff -urN vim72.orig/runtime/doc/options.txt vim72.work/runtime/doc/options.txt
old new 1160 1160 break if 'linebreak' is on. Only works for ASCII and also for 8-bit 1161 1161 characters when 'encoding' is an 8-bit encoding. 1162 1162 1163 1164 *'breakindent'* *'bri'* 1165 'breakindent' 'bri' boolean (default off) 1166 local to window 1167 {not in Vi} 1168 {not available when compiled without the |+linebreak| 1169 feature} 1170 Every wrapped line will continue visually indented (same amount of 1171 space as the beginning of that line), thus preserving horizontal blocks 1172 of text. 1173 1174 *'breakindentmin'* *'brimin'* 1175 'breakindentmin' 'brimin' number (default 20) 1176 local to window 1177 {not in Vi} 1178 {not available when compiled without the |+linebreak| 1179 feature} 1180 Minimum text width that will be kept after applying 'breakindent', 1181 even if the resulting text should normally be narrower. This prevents 1182 text indented almost to the right window border oocupying lot of 1183 vertical space when broken. 1184 1185 *'breakindentshift'* *'brishift'* 1186 'breakindentshift' 'brishift' number (default 20) 1187 local to window 1188 {not in Vi} 1189 {not available when compiled without the |+linebreak| 1190 feature} 1191 After applying 'breakindent', wrapped line beginning will be shift by 1192 given number of characters. It permits dynamic French paragraph 1193 indentation (negative) or emphasizing the line continuation 1194 (positive). 1195 1163 1196 *'browsedir'* *'bsdir'* 1164 1197 'browsedir' 'bsdir' string (default: "last") 1165 1198 global … … 4263 4296 {not in Vi} 4264 4297 {not available when compiled without the |+linebreak| 4265 4298 feature} 4266 If on Vim will wrap long lines at a character in 'breakat' rather4299 If on, Vim will wrap long lines at a character in 'breakat' rather 4267 4300 than at the last character that fits on the screen. Unlike 4268 4301 'wrapmargin' and 'textwidth', this does not insert <EOL>s in the file, 4269 it only affects the way the file is displayed, not its contents. The 4270 value of 'showbreak' is used to put in front of wrapped lines. 4271 This option is not used when the 'wrap' option is off or 'list' is on. 4302 it only affects the way the file is displayed, not its contents. 4303 If 'breakindent' is set, line is visually indented. Then, the value 4304 of 'showbreak' is used to put in front of wrapped lines. This option 4305 is not used when the 'wrap' option is off or 'list' is on. 4272 4306 Note that <Tab> characters after an <EOL> are mostly not displayed 4273 4307 with the right amount of white space. 4274 4308 -
runtime/optwin.vim
diff -urN vim72.orig/runtime/optwin.vim vim72.work/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 vim72.orig/src/charset.c vim72.work/src/charset.c
old new 843 843 * taking into account the size of a tab 844 844 */ 845 845 int 846 linetabsize(s )846 linetabsize(s, lnum) 847 847 char_u *s; 848 linenr_T lnum; 848 849 { 849 850 colnr_T col = 0; 850 851 851 852 while (*s != NUL) 852 col += lbr_chartabsize_adv(&s, col );853 col += lbr_chartabsize_adv(&s, col, lnum); 853 854 return (int)col; 854 855 } 855 856 … … 857 858 * Like linetabsize(), but for a given window instead of the current one. 858 859 */ 859 860 int 860 win_linetabsize(wp, p, len )861 win_linetabsize(wp, p, len, lnum) 861 862 win_T *wp; 862 863 char_u *p; 863 864 colnr_T len; 865 linenr_T lnum; 864 866 { 865 867 colnr_T col = 0; 866 868 char_u *s; 867 869 868 870 for (s = p; *s != NUL && (len == MAXCOL || s < p + len); mb_ptr_adv(s)) 869 col += win_lbr_chartabsize(wp, s, col, NULL );871 col += win_lbr_chartabsize(wp, s, col, NULL, lnum); 870 872 return (int)col; 871 873 } 872 874 … … 995 997 * like chartabsize(), but also check for line breaks on the screen 996 998 */ 997 999 int 998 lbr_chartabsize(s, col )1000 lbr_chartabsize(s, col, lnum) 999 1001 unsigned char *s; 1000 1002 colnr_T col; 1003 linenr_T lnum; 1001 1004 { 1002 1005 #ifdef FEAT_LINEBREAK 1003 if (!curwin->w_p_lbr && *p_sbr == NUL )1006 if (!curwin->w_p_lbr && *p_sbr == NUL && !curwin->w_p_bri) 1004 1007 { 1005 1008 #endif 1006 1009 #ifdef FEAT_MBYTE … … 1010 1013 RET_WIN_BUF_CHARTABSIZE(curwin, curbuf, s, col) 1011 1014 #ifdef FEAT_LINEBREAK 1012 1015 } 1013 return win_lbr_chartabsize(curwin, s, col, NULL );1016 return win_lbr_chartabsize(curwin, s, col, NULL, lnum); 1014 1017 #endif 1015 1018 } 1016 1019 … … 1018 1021 * Call lbr_chartabsize() and advance the pointer. 1019 1022 */ 1020 1023 int 1021 lbr_chartabsize_adv(s, col )1024 lbr_chartabsize_adv(s, col, lnum) 1022 1025 char_u **s; 1023 1026 colnr_T col; 1027 linenr_T lnum; 1024 1028 { 1025 1029 int retval; 1026 1030 1027 retval = lbr_chartabsize(*s, col );1031 retval = lbr_chartabsize(*s, col, lnum); 1028 1032 mb_ptr_adv(*s); 1029 1033 return retval; 1030 1034 } … … 1035 1039 * If "headp" not NULL, set *headp to the size of what we for 'showbreak' 1036 1040 * string at start of line. Warning: *headp is only set if it's a non-zero 1037 1041 * value, init to 0 before calling. 1042 * 1043 * linenr argument needed if in visual highlighting and breakindent=on, then 1044 * the line calculated is not current; if 0, normal functionality is preserved. 1038 1045 */ 1039 1046 int 1040 win_lbr_chartabsize(wp, s, col, headp )1047 win_lbr_chartabsize(wp, s, col, headp, lnum) 1041 1048 win_T *wp; 1042 1049 char_u *s; 1043 1050 colnr_T col; 1044 1051 int *headp UNUSED; 1052 linenr_T lnum; 1045 1053 { 1046 1054 #ifdef FEAT_LINEBREAK 1047 1055 int c; … … 1060 1068 int n; 1061 1069 1062 1070 /* 1063 * No 'linebreak' and 'showbreak' : return quickly.1071 * No 'linebreak' and 'showbreak' and 'breakindent': return quickly. 1064 1072 */ 1065 if (!wp->w_p_lbr && *p_sbr == NUL)1073 if (!wp->w_p_lbr && !wp->w_p_bri && *p_sbr == NUL) 1066 1074 #endif 1067 1075 { 1068 1076 #ifdef FEAT_MBYTE … … 1137 1145 # endif 1138 1146 1139 1147 /* 1140 * May have to add something for 'showbreak' string at start of line 1148 * May have to add something for 'breakindent' and/or 'showbreak' 1149 * string at start of line. 1141 1150 * Set *headp to the size of what we add. 1142 1151 */ 1143 1152 added = 0; 1144 if ( *p_sbr != NUL&& wp->w_p_wrap && col != 0)1153 if ((*p_sbr != NUL || wp->w_p_bri) && wp->w_p_wrap && col != 0) 1145 1154 { 1146 1155 numberextra = win_col_off(wp); 1147 1156 col += numberextra + mb_added; … … 1154 1163 } 1155 1164 if (col == 0 || col + size > (colnr_T)W_WIDTH(wp)) 1156 1165 { 1157 added = vim_strsize(p_sbr); 1166 added = 0; 1167 if (*p_sbr != NUL) 1168 added += vim_strsize(p_sbr); 1169 if (wp->w_p_bri) 1170 added += get_breakindent_win(wp,lnum); 1171 1158 1172 if (tab_corr) 1159 1173 size += (added / wp->w_buffer->b_p_ts) * wp->w_buffer->b_p_ts; 1160 1174 else … … 1259 1273 1260 1274 /* 1261 1275 * This function is used very often, do some speed optimizations. 1262 * When 'list', 'linebreak' and 'showbreak' are not set use a simple loop. 1276 * When 'list', 'linebreak', 'showbreak' and 'breakindent' are not set 1277 * use a simple loop. 1263 1278 * Also use this when 'list' is set but tabs take their normal size. 1264 1279 */ 1265 1280 if ((!wp->w_p_list || lcs_tab1 != NUL) 1266 1281 #ifdef FEAT_LINEBREAK 1267 && !wp->w_p_lbr && *p_sbr == NUL 1282 && !wp->w_p_lbr && *p_sbr == NUL && !wp->w_p_bri 1268 1283 #endif 1269 1284 ) 1270 1285 { … … 1326 1341 { 1327 1342 /* A tab gets expanded, depending on the current column */ 1328 1343 head = 0; 1329 incr = win_lbr_chartabsize(wp, ptr, vcol, &head );1344 incr = win_lbr_chartabsize(wp, ptr, vcol, &head, pos->lnum); 1330 1345 /* make sure we don't go past the end of the line */ 1331 1346 if (*ptr == NUL) 1332 1347 { -
src/edit.c
diff -urN vim72.orig/src/edit.c vim72.work/src/edit.c
old new 391 391 if (startln) 392 392 Insstart.col = 0; 393 393 } 394 Insstart_textlen = (colnr_T)linetabsize(ml_get_curline() );394 Insstart_textlen = (colnr_T)linetabsize(ml_get_curline(), Insstart.lnum); 395 395 Insstart_blank_vcol = MAXCOL; 396 396 if (!did_ai) 397 397 ai_col = 0; … … 1795 1795 else 1796 1796 #endif 1797 1797 ++new_cursor_col; 1798 vcol += lbr_chartabsize(ptr + new_cursor_col, (colnr_T)vcol );1798 vcol += lbr_chartabsize(ptr + new_cursor_col, (colnr_T)vcol, curwin->w_cursor.lnum); 1799 1799 } 1800 1800 vcol = last_vcol; 1801 1801 … … 6368 6368 ins_need_undo = FALSE; 6369 6369 } 6370 6370 Insstart = curwin->w_cursor; /* new insertion starts here */ 6371 Insstart_textlen = (colnr_T)linetabsize(ml_get_curline() );6371 Insstart_textlen = (colnr_T)linetabsize(ml_get_curline(),curwin->w_cursor.lnum); 6372 6372 ai_col = 0; 6373 6373 #ifdef FEAT_VREPLACE 6374 6374 if (State & VREPLACE_FLAG) … … 6727 6727 for (;;) 6728 6728 { 6729 6729 coladvance(v - width); 6730 /* getviscol() is slow, skip it when 'showbreak' is empty and 6731 * there are no multi-byte characters */ 6732 if ((*p_sbr == NUL 6730 /* getviscol() is slow, skip it when 'showbreak' is empty, 6731 * 'breakindent' is not set and there are no multi-byte 6732 * characters */ 6733 if ((*p_sbr == NUL && !curwin->w_p_bri 6733 6734 # ifdef FEAT_MBYTE 6734 6735 && !has_mbyte 6735 6736 # endif … … 9365 9366 getvcol(curwin, &fpos, &vcol, NULL, NULL); 9366 9367 getvcol(curwin, cursor, &want_vcol, NULL, NULL); 9367 9368 9368 /* Use as many TABs as possible. Beware of ' showbreak' and9369 /* Use as many TABs as possible. Beware of 'breakindent', 'showbreak' and 9369 9370 * 'linebreak' adding extra virtual columns. */ 9370 9371 while (vim_iswhite(*ptr)) 9371 9372 { 9372 i = lbr_chartabsize((char_u *)"\t", vcol );9373 i = lbr_chartabsize((char_u *)"\t", vcol, cursor->lnum); 9373 9374 if (vcol + i > want_vcol) 9374 9375 break; 9375 9376 if (*ptr != TAB) … … 9395 9396 /* Skip over the spaces we need. */ 9396 9397 while (vcol < want_vcol && *ptr == ' ') 9397 9398 { 9398 vcol += lbr_chartabsize(ptr, vcol );9399 vcol += lbr_chartabsize(ptr, vcol, cursor->lnum); 9399 9400 ++ptr; 9400 9401 ++repl_off; 9401 9402 } … … 9643 9644 while ((colnr_T)temp < curwin->w_virtcol && *ptr != NUL) 9644 9645 { 9645 9646 prev_ptr = ptr; 9646 temp += lbr_chartabsize_adv(&ptr, (colnr_T)temp );9647 temp += lbr_chartabsize_adv(&ptr, (colnr_T)temp, lnum); 9647 9648 } 9648 9649 if ((colnr_T)temp > curwin->w_virtcol) 9649 9650 ptr = prev_ptr; -
src/ex_cmds.c
diff -urN vim72.orig/src/ex_cmds.c vim72.work/src/ex_cmds.c
old new 266 266 ; 267 267 save = *last; 268 268 *last = NUL; 269 len = linetabsize(line );/* get line length */269 len = linetabsize(line, curwin->w_cursor.lnum); /* get line length */ 270 270 if (has_tab != NULL) /* check for embedded TAB */ 271 271 *has_tab = (vim_strrchr(first, TAB) != NULL); 272 272 *last = save; -
src/getchar.c
diff -urN vim72.orig/src/getchar.c vim72.work/src/getchar.c
old new 2564 2564 if (!vim_iswhite(ptr[col])) 2565 2565 curwin->w_wcol = vcol; 2566 2566 vcol += lbr_chartabsize(ptr + col, 2567 (colnr_T)vcol );2567 (colnr_T)vcol, curwin->w_cursor.lnum); 2568 2568 #ifdef FEAT_MBYTE 2569 2569 if (has_mbyte) 2570 2570 col += (*mb_ptr2len)(ptr + col); -
src/gui_beval.c
diff -urN vim72.orig/src/gui_beval.c vim72.work/src/gui_beval.c
old new 336 336 { 337 337 /* Not past end of the file. */ 338 338 lbuf = ml_get_buf(wp->w_buffer, lnum, FALSE); 339 if (col <= win_linetabsize(wp, lbuf, (colnr_T)MAXCOL ))339 if (col <= win_linetabsize(wp, lbuf, (colnr_T)MAXCOL, lnum)) 340 340 { 341 341 /* Not past end of line. */ 342 342 if (getword) -
src/misc1.c
diff -urN vim72.orig/src/misc1.c vim72.work/src/misc1.c
old new 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 490 491 492 #endif 493 454 494 #if defined(FEAT_CINDENT) || defined(FEAT_SMARTINDENT) 455 495 456 496 static int cin_is_cinword __ARGS((char_u *line)); … … 1732 1772 s = ml_get_buf(wp->w_buffer, lnum, FALSE); 1733 1773 if (*s == NUL) /* empty line */ 1734 1774 return 1; 1735 col = win_linetabsize(wp, s, (colnr_T)MAXCOL );1775 col = win_linetabsize(wp, s, (colnr_T)MAXCOL, lnum); 1736 1776 1737 1777 /* 1738 1778 * If list mode is on, then the '$' at the end of the line may take up one … … 1788 1828 col = 0; 1789 1829 while (*s != NUL && --column >= 0) 1790 1830 { 1791 col += win_lbr_chartabsize(wp, s, (colnr_T)col, NULL );1831 col += win_lbr_chartabsize(wp, s, (colnr_T)col, NULL, lnum); 1792 1832 mb_ptr_adv(s); 1793 1833 } 1794 1834 … … 1800 1840 * 'ts') -- webb. 1801 1841 */ 1802 1842 if (*s == TAB && (State & NORMAL) && (!wp->w_p_list || lcs_tab1)) 1803 col += win_lbr_chartabsize(wp, s, (colnr_T)col, NULL ) - 1;1843 col += win_lbr_chartabsize(wp, s, (colnr_T)col, NULL, lnum) - 1; 1804 1844 1805 1845 /* 1806 1846 * Add column offset for 'number', 'foldcolumn', etc. … … 8228 8268 amount = 0; 8229 8269 while (*that && col) 8230 8270 { 8231 amount += lbr_chartabsize_adv(&that, (colnr_T)amount );8271 amount += lbr_chartabsize_adv(&that, (colnr_T)amount, pos->lnum); 8232 8272 col--; 8233 8273 } 8234 8274 … … 8251 8291 8252 8292 while (vim_iswhite(*that)) 8253 8293 { 8254 amount += lbr_chartabsize(that, (colnr_T)amount );8294 amount += lbr_chartabsize(that, (colnr_T)amount, pos->lnum); 8255 8295 ++that; 8256 8296 } 8257 8297 … … 8290 8330 --parencount; 8291 8331 if (*that == '\\' && *(that+1) != NUL) 8292 8332 amount += lbr_chartabsize_adv(&that, 8293 (colnr_T)amount );8333 (colnr_T)amount, pos->lnum); 8294 8334 amount += lbr_chartabsize_adv(&that, 8295 (colnr_T)amount );8335 (colnr_T)amount, pos->lnum); 8296 8336 } 8297 8337 } 8298 8338 while (vim_iswhite(*that)) 8299 8339 { 8300 amount += lbr_chartabsize(that, (colnr_T)amount );8340 amount += lbr_chartabsize(that, (colnr_T)amount, pos->lnum); 8301 8341 that++; 8302 8342 } 8303 8343 if (!*that || *that == ';') -
src/misc2.c
diff -urN vim72.orig/src/misc2.c vim72.work/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 … … 206 206 { 207 207 /* Count a tab for what it's worth (if list mode not on) */ 208 208 #ifdef FEAT_LINEBREAK 209 csize = win_lbr_chartabsize(curwin, ptr, col, &head );209 csize = win_lbr_chartabsize(curwin, ptr, col, &head, pos->lnum); 210 210 mb_ptr_adv(ptr); 211 211 #else 212 csize = lbr_chartabsize_adv(&ptr, col );212 csize = lbr_chartabsize_adv(&ptr, col, pos->lnum); 213 213 #endif 214 214 col += csize; 215 215 } -
src/normal.c
diff -urN vim72.orig/src/normal.c vim72.work/src/normal.c
old new 4327 4327 int dir; 4328 4328 long dist; 4329 4329 { 4330 int linelen = linetabsize(ml_get_curline() );4330 int linelen = linetabsize(ml_get_curline(), curwin->w_cursor.lnum); 4331 4331 int retval = OK; 4332 4332 int atend = FALSE; 4333 4333 int n; … … 4400 4400 (void)hasFolding(curwin->w_cursor.lnum, 4401 4401 &curwin->w_cursor.lnum, NULL); 4402 4402 #endif 4403 linelen = linetabsize(ml_get_curline() );4403 linelen = linetabsize(ml_get_curline(), curwin->w_cursor.lnum); 4404 4404 if (linelen > width1) 4405 4405 curwin->w_curswant += (((linelen - width1 - 1) / width2) 4406 4406 + 1) * width2; -
src/ops.c
diff -urN vim72.orig/src/ops.c vim72.work/src/ops.c
old new 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; … … 3519 3519 for (ptr = oldp; vcol < col && *ptr; ) 3520 3520 { 3521 3521 /* Count a tab for what it's worth (if list mode not on) */ 3522 incr = lbr_chartabsize_adv(&ptr, (colnr_T)vcol );3522 incr = lbr_chartabsize_adv(&ptr, (colnr_T)vcol, lnum); 3523 3523 vcol += incr; 3524 3524 } 3525 3525 bd.textcol = (colnr_T)(ptr - oldp); … … 3553 3553 /* calculate number of spaces required to fill right side of block*/ 3554 3554 spaces = y_width + 1; 3555 3555 for (j = 0; j < yanklen; j++) 3556 spaces -= lbr_chartabsize(&y_array[i][j], 0 );3556 spaces -= lbr_chartabsize(&y_array[i][j], 0, lnum); 3557 3557 if (spaces < 0) 3558 3558 spaces = 0; 3559 3559 … … 4906 4906 while (bdp->start_vcol < oap->start_vcol && *pstart) 4907 4907 { 4908 4908 /* Count a tab for what it's worth (if list mode not on) */ 4909 incr = lbr_chartabsize(pstart, (colnr_T)bdp->start_vcol );4909 incr = lbr_chartabsize(pstart, (colnr_T)bdp->start_vcol, lnum); 4910 4910 bdp->start_vcol += incr; 4911 4911 #ifdef FEAT_VISUALEXTRA 4912 4912 if (vim_iswhite(*pstart)) … … 4975 4975 { 4976 4976 /* Count a tab for what it's worth (if list mode not on) */ 4977 4977 prev_pend = pend; 4978 incr = lbr_chartabsize_adv(&pend, (colnr_T)bdp->end_vcol );4978 incr = lbr_chartabsize_adv(&pend, (colnr_T)bdp->end_vcol, lnum); 4979 4979 bdp->end_vcol += incr; 4980 4980 } 4981 4981 if (bdp->end_vcol <= oap->end_vcol … … 6465 6465 validate_virtcol(); 6466 6466 col_print(buf1, sizeof(buf1), (int)curwin->w_cursor.col + 1, 6467 6467 (int)curwin->w_virtcol + 1); 6468 col_print(buf2, sizeof(buf2), (int)STRLEN(p), linetabsize(p ));6468 col_print(buf2, sizeof(buf2), (int)STRLEN(p), linetabsize(p, curwin->w_cursor.lnum)); 6469 6469 6470 6470 if (char_count_cursor == byte_count_cursor 6471 6471 && char_count == byte_count) -
src/option.c
diff -urN vim72.orig/src/option.c vim72.work/src/option.c
old new 186 186 #ifdef FEAT_ARABIC 187 187 # define PV_ARAB OPT_WIN(WV_ARAB) 188 188 #endif 189 #ifdef FEAT_LINEBREAK 190 # define PV_BRI OPT_WIN(WV_BRI) 191 # define PV_BRIMIN OPT_WIN(WV_BRIMIN) 192 # define PV_BRISHIFT OPT_WIN(WV_BRISHIFT) 193 #endif 189 194 #ifdef FEAT_DIFF 190 195 # define PV_DIFF OPT_WIN(WV_DIFF) 191 196 #endif … … 634 639 {(char_u *)0L, (char_u *)0L} 635 640 #endif 636 641 SCRIPTID_INIT}, 642 {"breakindent", "bri", P_BOOL|P_VI_DEF|P_VIM|P_RWIN, 643 #ifdef FEAT_LINEBREAK 644 (char_u *)VAR_WIN, PV_BRI, 645 #else 646 (char_u *)NULL, PV_NONE, 647 #endif 648 {(char_u *)FALSE, (char_u *)0L}}, 649 {"breakindentmin", "brimin", P_NUM|P_VI_DEF|P_VIM|P_RWIN, 650 #ifdef FEAT_LINEBREAK 651 (char_u *)VAR_WIN, PV_BRIMIN, 652 #else 653 (char_u *)NULL, PV_NONE, 654 #endif 655 {(char_u *)20L, (char_u *)20L}}, 656 {"breakindentshift", "brishift", P_NUM|P_VI_DEF|P_VIM|P_RWIN, 657 #ifdef FEAT_LINEBREAK 658 (char_u *)VAR_WIN, PV_BRISHIFT, 659 #else 660 (char_u *)NULL, PV_NONE, 661 #endif 662 {(char_u *)0L, (char_u *)0L}}, 637 663 {"browsedir", "bsdir",P_STRING|P_VI_DEF, 638 664 #ifdef FEAT_BROWSE 639 665 (char_u *)&p_bsdir, PV_NONE, … … 8015 8041 } 8016 8042 curwin->w_nrwidth_line_count = 0; 8017 8043 } 8044 8045 /* 'breakindentmin' must be positive */ 8046 else if (pp == &curwin->w_p_brimin) 8047 { 8048 if (curwin->w_p_brimin < 1) 8049 { 8050 errmsg = e_positive; 8051 curwin->w_p_brimin = 1; 8052 } 8053 } 8018 8054 #endif 8019 8055 8020 8056 /* … … 9218 9254 case PV_WRAP: return (char_u *)&(curwin->w_p_wrap); 9219 9255 #ifdef FEAT_LINEBREAK 9220 9256 case PV_LBR: return (char_u *)&(curwin->w_p_lbr); 9257 case PV_BRI: return (char_u *)&(curwin->w_p_bri); 9258 case PV_BRIMIN: return (char_u *)&(curwin->w_p_brimin); 9259 case PV_BRISHIFT: return (char_u *)&(curwin->w_p_brishift); 9221 9260 #endif 9222 9261 #ifdef FEAT_SCROLLBIND 9223 9262 case PV_SCBIND: return (char_u *)&(curwin->w_p_scb); … … 9396 9435 to->wo_wrap = from->wo_wrap; 9397 9436 #ifdef FEAT_LINEBREAK 9398 9437 to->wo_lbr = from->wo_lbr; 9438 to->wo_bri = from->wo_bri; 9439 to->wo_brimin = from->wo_brimin; 9399 9440 #endif 9400 9441 #ifdef FEAT_SCROLLBIND 9401 9442 to->wo_scb = from->wo_scb; -
src/option.h
diff -urN vim72.orig/src/option.h vim72.work/src/option.h
old new 1018 1018 #ifdef FEAT_ARABIC 1019 1019 , WV_ARAB 1020 1020 #endif 1021 #ifdef FEAT_LINEBREAK 1022 , WV_BRI 1023 , WV_BRIMIN 1024 , WV_BRISHIFT 1025 #endif 1021 1026 #ifdef FEAT_DIFF 1022 1027 , WV_DIFF 1023 1028 #endif -
src/proto/charset.pro
diff -urN vim72.orig/src/proto/charset.pro vim72.work/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 win_linetabsize __ARGS((win_T *wp, char_u *p, colnr_T len ));17 int linetabsize __ARGS((char_u *s, linenr_T lnum)); 18 int win_linetabsize __ARGS((win_T *wp, char_u *p, colnr_T len, linenr_T lnum)); 19 19 int vim_isIDc __ARGS((int c)); 20 20 int vim_iswordc __ARGS((int c)); 21 21 int vim_iswordp __ARGS((char_u *p)); … … 24 24 int vim_isfilec_or_wc __ARGS((int c)); 25 25 int vim_isprintc __ARGS((int c)); 26 26 int vim_isprintc_strict __ARGS((int c)); 27 int lbr_chartabsize __ARGS((unsigned char *s, colnr_T col ));28 int lbr_chartabsize_adv __ARGS((char_u **s, colnr_T col ));29 int win_lbr_chartabsize __ARGS((win_T *wp, char_u *s, colnr_T col, int *headp ));27 int lbr_chartabsize __ARGS((unsigned char *s, colnr_T col, linenr_T lnum)); 28 int lbr_chartabsize_adv __ARGS((char_u **s, colnr_T col, linenr_T lnum)); 29 int win_lbr_chartabsize __ARGS((win_T *wp, char_u *s, colnr_T col, int *headp, linenr_T lnum)); 30 30 int in_win_border __ARGS((win_T *wp, colnr_T vcol)); 31 31 void getvcol __ARGS((win_T *wp, pos_T *pos, colnr_T *start, colnr_T *cursor, colnr_T *end)); 32 32 colnr_T getvcol_nolist __ARGS((pos_T *posp)); -
src/proto/misc1.pro
diff -urN vim72.orig/src/proto/misc1.pro vim72.work/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)); 10 11 int plines __ARGS((linenr_T lnum)); -
src/regexp.c
diff -urN vim72.orig/src/regexp.c vim72.work/src/regexp.c
old new 3994 3994 if (top.col == MAXCOL || bot.col == MAXCOL) 3995 3995 end = MAXCOL; 3996 3996 cols = win_linetabsize(wp, 3997 regline, (colnr_T)(reginput - regline) );3997 regline, (colnr_T)(reginput - regline), reglnum + reg_firstlnum); 3998 3998 if (cols < start || cols > end - (*p_sel == 'e')) 3999 3999 status = RA_NOMATCH; 4000 4000 } … … 4018 4018 case RE_VCOL: 4019 4019 if (!re_num_cmp((long_u)win_linetabsize( 4020 4020 reg_win == NULL ? curwin : reg_win, 4021 regline, (colnr_T)(reginput - regline) ) + 1, scan))4021 regline, (colnr_T)(reginput - regline), reglnum + reg_firstlnum ) + 1, scan)) 4022 4022 status = RA_NOMATCH; 4023 4023 break; 4024 4024 -
src/screen.c
diff -urN vim72.orig/src/screen.c vim72.work/src/screen.c
old new 2698 2698 # define WL_SIGN WL_FOLD /* column for signs */ 2699 2699 #endif 2700 2700 #define WL_NR WL_SIGN + 1 /* line number */ 2701 #ifdef FEAT_LINEBREAK 2702 # define WL_BRI WL_NR + 1 /* 'breakindent' */ 2703 #else 2704 # define WL_BRI WL_NR 2705 #endif 2701 2706 #if defined(FEAT_LINEBREAK) || defined(FEAT_DIFF) 2702 # define WL_SBR WL_ NR+ 1 /* 'showbreak' or 'diff' */2707 # define WL_SBR WL_BRI + 1 /* 'showbreak' or 'diff' */ 2703 2708 #else 2704 # define WL_SBR WL_ NR2709 # define WL_SBR WL_BRI 2705 2710 #endif 2706 2711 #define WL_LINE WL_SBR + 1 /* text in the line */ 2707 2712 int draw_state = WL_START; /* what to draw next */ … … 3010 3015 #endif 3011 3016 while (vcol < v && *ptr != NUL) 3012 3017 { 3013 c = win_lbr_chartabsize(wp, ptr, (colnr_T)vcol, NULL );3018 c = win_lbr_chartabsize(wp, ptr, (colnr_T)vcol, NULL, lnum); 3014 3019 vcol += c; 3015 3020 #ifdef FEAT_MBYTE 3016 3021 prev_ptr = ptr; … … 3368 3373 } 3369 3374 } 3370 3375 3376 #ifdef FEAT_LINEBREAK 3377 /* draw 'breakindent': indent wrapped text accordingly */ 3378 if (draw_state == WL_BRI -1 && n_extra == 0){ 3379 draw_state = WL_BRI; 3380 # ifdef FEAT_DIFF 3381 /* FIXME: handle (filler_todo > 0): or modify showbreak so that ---- vim/lines are shorter by the amount needed? */ 3382 # endif 3383 if (wp->w_p_bri && row != startrow){ /* FIXME: what is startrow? Don't we need it as well?? */ 3384 p_extra = NUL; 3385 c_extra = ' '; 3386 n_extra = get_breakindent_win(wp,lnum); 3387 char_attr = 0; /* was: hl_attr(HLF_AT); */ 3388 /* FIXME: why do we need to adjust vcol if showbreak does not?? */ 3389 vcol += n_extra; 3390 /* FIXME: is this relevant here? copied shamelessly from showbreak */ 3391 /* Correct end of highlighted area for 'breakindent', 3392 * required when 'linebreak' is also set. */ 3393 if (tocol == vcol) 3394 tocol += n_extra; 3395 } 3396 } 3397 #endif 3398 3399 3371 3400 #if defined(FEAT_LINEBREAK) || defined(FEAT_DIFF) 3372 3401 if (draw_state == WL_SBR - 1 && n_extra == 0) 3373 3402 { … … 4065 4094 # ifdef FEAT_MBYTE 4066 4095 has_mbyte ? mb_l : 4067 4096 # endif 4068 1), (colnr_T)vcol, NULL ) - 1;4097 1), (colnr_T)vcol, NULL, lnum) - 1; 4069 4098 c_extra = ' '; 4070 4099 if (vim_iswhite(c)) 4071 4100 c = ' '; -
src/structs.h
diff -urN vim72.orig/src/structs.h vim72.work/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 vim72.orig/src/ui.c vim72.work/src/ui.c
old new 3062 3062 start = ptr = ml_get_buf(wp->w_buffer, lnum, FALSE); 3063 3063 while (count <= vcol && *ptr != NUL) 3064 3064 { 3065 count += win_lbr_chartabsize(wp, ptr, count, NULL );3065 count += win_lbr_chartabsize(wp, ptr, count, NULL, lnum); 3066 3066 mb_ptr_adv(ptr); 3067 3067 } 3068 3068 return (int)(ptr - start);