To: vim_dev@googlegroups.com Subject: Patch 9.0.0151 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 9.0.0151 Problem: A "below" aligned text property does not work with 'nowrap'. Solution: Start a new screen line to display the virtual text. (closes #10851) Files: src/drawline.c, src/textprop.c, src/proto/textprop.pro, src/misc1.c, src/testdir/test_textprop.vim, src/testdir/dumps/Test_prop_with_text_after_nowrap_1.dump *** ../vim-9.0.0150/src/drawline.c 2022-08-05 21:39:26.956564292 +0100 --- src/drawline.c 2022-08-06 13:08:05.957342921 +0100 *************** *** 249,254 **** --- 249,392 ---- } #endif + // structure with variables passed between win_line() and other functions + typedef struct { + linenr_T lnum; // line number to be drawn + + int startrow; // first row in the window to be drawn + int row; // row in the window, excl w_winrow + int screen_row; // row on the screen, incl w_winrow + + long vcol; // virtual column, before wrapping + int col; // visual column on screen, after wrapping + #ifdef FEAT_CONCEAL + int boguscols; // nonexistent columns added to "col" to force + // wrapping + int vcol_off; // offset for concealed characters + #endif + #ifdef FEAT_SYN_HL + int draw_color_col; // highlight colorcolumn + int *color_cols; // pointer to according columns array + #endif + int eol_hl_off; // 1 if highlighted char after EOL + + unsigned off; // offset in ScreenLines/ScreenAttrs + + int win_attr; // background for the whole window, except + // margins and "~" lines. + int screen_line_flags; + } winlinevars_T; + + /* + * Called when finished with the line: draw the screen line and handle any + * highlighting until the right of the window. + */ + static void + draw_screen_line(win_T *wp, winlinevars_T *wlv) + { + #ifdef FEAT_SYN_HL + long v; + + // Highlight 'cursorcolumn' & 'colorcolumn' past end of the line. + if (wp->w_p_wrap) + v = wp->w_skipcol; + else + v = wp->w_leftcol; + + // check if line ends before left margin + if (wlv->vcol < v + wlv->col - win_col_off(wp)) + wlv->vcol = v + wlv->col - win_col_off(wp); + # ifdef FEAT_CONCEAL + // Get rid of the boguscols now, we want to draw until the right + // edge for 'cursorcolumn'. + wlv->col -= wlv->boguscols; + wlv->boguscols = 0; + # define VCOL_HLC (wlv->vcol - wlv->vcol_off) + # else + # define VCOL_HLC (wlv->vcol) + # endif + + if (wlv->draw_color_col) + wlv->draw_color_col = advance_color_col(VCOL_HLC, &wlv->color_cols); + + if (((wp->w_p_cuc + && (int)wp->w_virtcol >= VCOL_HLC - wlv->eol_hl_off + && (int)wp->w_virtcol < + (long)wp->w_width * (wlv->row - wlv->startrow + 1) + v + && wlv->lnum != wp->w_cursor.lnum) + || wlv->draw_color_col + || wlv->win_attr != 0) + # ifdef FEAT_RIGHTLEFT + && !wp->w_p_rl + # endif + ) + { + int rightmost_vcol = 0; + int i; + + if (wp->w_p_cuc) + rightmost_vcol = wp->w_virtcol; + if (wlv->draw_color_col) + // determine rightmost colorcolumn to possibly draw + for (i = 0; wlv->color_cols[i] >= 0; ++i) + if (rightmost_vcol < wlv->color_cols[i]) + rightmost_vcol = wlv->color_cols[i]; + + while (wlv->col < wp->w_width) + { + ScreenLines[wlv->off] = ' '; + if (enc_utf8) + ScreenLinesUC[wlv->off] = 0; + ScreenCols[wlv->off] = MAXCOL; + ++wlv->col; + if (wlv->draw_color_col) + wlv->draw_color_col = advance_color_col( + VCOL_HLC, &wlv->color_cols); + + if (wp->w_p_cuc && VCOL_HLC == (long)wp->w_virtcol) + ScreenAttrs[wlv->off++] = HL_ATTR(HLF_CUC); + else if (wlv->draw_color_col && VCOL_HLC == *wlv->color_cols) + ScreenAttrs[wlv->off++] = HL_ATTR(HLF_MC); + else + ScreenAttrs[wlv->off++] = wlv->win_attr; + + if (VCOL_HLC >= rightmost_vcol && wlv->win_attr == 0) + break; + + ++wlv->vcol; + } + } + #endif + + screen_line(wp, wlv->screen_row, wp->w_wincol, wlv->col, + wp->w_width, wlv->screen_line_flags); + ++wlv->row; + ++wlv->screen_row; + } + #undef VCOL_HLC + + /* + * Start a screen line at column zero. + */ + static void + win_line_start(win_T *wp, winlinevars_T *wlv) + { + wlv->col = 0; + wlv->off = (unsigned)(current_ScreenLine - ScreenLines); + + #ifdef FEAT_RIGHTLEFT + if (wp->w_p_rl) + { + // Rightleft window: process the text in the normal direction, but put + // it in current_ScreenLine[] from right to left. Start at the + // rightmost column of the window. + wlv->col = wp->w_width - 1; + wlv->off += wlv->col; + wlv->screen_line_flags |= SLF_RIGHTLEFT; + } + #endif + } + /* * Display line "lnum" of window 'wp' on the screen. * Start at row "startrow", stop when "endrow" is reached. *************** *** 265,282 **** int nochange UNUSED, // not updating for changed text int number_only) // only update the number column { ! int col = 0; // visual column on screen ! unsigned off; // offset in ScreenLines/ScreenAttrs int c = 0; // init for GCC - long vcol = 0; // virtual column (for tabs) #ifdef FEAT_LINEBREAK long vcol_sbr = -1; // virtual column after showbreak #endif ! long vcol_prev = -1; // "vcol" of previous character char_u *line; // current line char_u *ptr; // current position in "line" - int row; // row in the window, excl w_winrow - int screen_row; // row on the screen, incl w_winrow char_u extra[21]; // "%ld " and 'fdc' must fit in here int n_extra = 0; // number of extra bytes --- 403,417 ---- int nochange UNUSED, // not updating for changed text int number_only) // only update the number column { ! winlinevars_T wlv; // variables passed between functions ! int c = 0; // init for GCC #ifdef FEAT_LINEBREAK long vcol_sbr = -1; // virtual column after showbreak #endif ! long vcol_prev = -1; // "wlv.vcol" of previous character char_u *line; // current line char_u *ptr; // current position in "line" char_u extra[21]; // "%ld " and 'fdc' must fit in here int n_extra = 0; // number of extra bytes *************** *** 324,331 **** int vi_attr = 0; // attributes for Visual and incsearch // highlighting int wcr_attr = 0; // attributes from 'wincolor' - int win_attr = 0; // background for whole window, except - // margins and "~" lines. int area_attr = 0; // attributes desired by highlighting int search_attr = 0; // attributes desired by 'hlsearch' #ifdef FEAT_SYN_HL --- 459,464 ---- *************** *** 335,344 **** int prev_syntax_attr = 0; // syntax_attr at prev_syntax_col int has_syntax = FALSE; // this buffer has syntax highl. int save_did_emsg; - int draw_color_col = FALSE; // highlight colorcolumn - int *color_cols = NULL; // pointer to according columns array #endif - int eol_hl_off = 0; // 1 if highlighted char after EOL #ifdef FEAT_PROP_POPUP int text_prop_count; int text_prop_next = 0; // next text property to use --- 468,474 ---- *************** *** 461,467 **** int feedback_col = 0; int feedback_old_attr = -1; #endif - int screen_line_flags = 0; #if defined(FEAT_CONCEAL) || defined(FEAT_SEARCH_EXTRA) int match_conc = 0; // cchar for match functions --- 591,596 ---- *************** *** 473,502 **** int prev_syntax_id = 0; int conceal_attr = HL_ATTR(HLF_CONCEAL); int is_concealing = FALSE; - int boguscols = 0; // nonexistent columns added to force - // wrapping - int vcol_off = 0; // offset for concealed characters int did_wcol = FALSE; int old_boguscols = 0; ! # define VCOL_HLC (vcol - vcol_off) # define FIX_FOR_BOGUSCOLS \ { \ ! n_extra += vcol_off; \ ! vcol -= vcol_off; \ ! vcol_off = 0; \ ! col -= boguscols; \ ! old_boguscols = boguscols; \ ! boguscols = 0; \ } #else ! # define VCOL_HLC (vcol) #endif if (startrow > endrow) // past the end already! return startrow; ! row = startrow; ! screen_row = row + W_WINROW(wp); if (!number_only) { --- 602,632 ---- int prev_syntax_id = 0; int conceal_attr = HL_ATTR(HLF_CONCEAL); int is_concealing = FALSE; int did_wcol = FALSE; int old_boguscols = 0; ! # define VCOL_HLC (wlv.vcol - wlv.vcol_off) # define FIX_FOR_BOGUSCOLS \ { \ ! n_extra += wlv.vcol_off; \ ! wlv.vcol -= wlv.vcol_off; \ ! wlv.vcol_off = 0; \ ! wlv.col -= wlv.boguscols; \ ! old_boguscols = wlv.boguscols; \ ! wlv.boguscols = 0; \ } #else ! # define VCOL_HLC (wlv.vcol) #endif if (startrow > endrow) // past the end already! return startrow; ! CLEAR_FIELD(wlv); ! ! wlv.lnum = lnum; ! wlv.startrow = startrow; ! wlv.row = startrow; ! wlv.screen_row = wlv.row + W_WINROW(wp); if (!number_only) { *************** *** 533,541 **** } // Check for columns to display for 'colorcolumn'. ! color_cols = wp->w_p_cc_cols; ! if (color_cols != NULL) ! draw_color_col = advance_color_col(VCOL_HLC, &color_cols); #endif #ifdef FEAT_TERMINAL --- 663,671 ---- } // Check for columns to display for 'colorcolumn'. ! wlv.color_cols = wp->w_p_cc_cols; ! if (wlv.color_cols != NULL) ! wlv.draw_color_col = advance_color_col(VCOL_HLC, &wlv.color_cols); #endif #ifdef FEAT_TERMINAL *************** *** 543,549 **** { extra_check = TRUE; get_term_attr = TRUE; ! win_attr = term_get_attr(wp, lnum, -1); } #endif --- 673,679 ---- { extra_check = TRUE; get_term_attr = TRUE; ! wlv.win_attr = term_get_attr(wp, lnum, -1); } #endif *************** *** 823,835 **** wcr_attr = get_wcr_attr(wp); if (wcr_attr != 0) { ! win_attr = wcr_attr; area_highlighting = TRUE; } #ifdef FEAT_PROP_POPUP if (WIN_IS_POPUP(wp)) ! screen_line_flags |= SLF_POPUP; #endif // 'nowrap' or 'wrap' and a single line that doesn't fit: Advance to the --- 953,965 ---- wcr_attr = get_wcr_attr(wp); if (wcr_attr != 0) { ! wlv.win_attr = wcr_attr; area_highlighting = TRUE; } #ifdef FEAT_PROP_POPUP if (WIN_IS_POPUP(wp)) ! wlv.screen_line_flags |= SLF_POPUP; #endif // 'nowrap' or 'wrap' and a single line that doesn't fit: Advance to the *************** *** 844,850 **** chartabsize_T cts; int charsize = 0; ! init_chartabsize_arg(&cts, wp, lnum, vcol, line, ptr); while (cts.cts_vcol < v && *cts.cts_ptr != NUL) { charsize = win_lbr_chartabsize(&cts, NULL); --- 974,980 ---- chartabsize_T cts; int charsize = 0; ! init_chartabsize_arg(&cts, wp, lnum, wlv.vcol, line, ptr); while (cts.cts_vcol < v && *cts.cts_ptr != NUL) { charsize = win_lbr_chartabsize(&cts, NULL); *************** *** 852,858 **** prev_ptr = cts.cts_ptr; MB_PTR_ADV(cts.cts_ptr); } ! vcol = cts.cts_vcol; ptr = cts.cts_ptr; clear_chartabsize_arg(&cts); --- 982,988 ---- prev_ptr = cts.cts_ptr; MB_PTR_ADV(cts.cts_ptr); } ! wlv.vcol = cts.cts_vcol; ptr = cts.cts_ptr; clear_chartabsize_arg(&cts); *************** *** 862,893 **** // - 'virtualedit' is set, or // - the visual mode is active, // the end of the line may be before the start of the displayed part. ! if (vcol < v && ( #ifdef FEAT_SYN_HL ! wp->w_p_cuc || draw_color_col || #endif virtual_active() || (VIsual_active && wp->w_buffer == curwin->w_buffer))) ! vcol = v; // Handle a character that's not completely on the screen: Put ptr at // that character but skip the first few screen characters. ! if (vcol > v) { ! vcol -= charsize; ptr = prev_ptr; // If the character fits on the screen, don't need to skip it. // Except for a TAB. ! if (( (*mb_ptr2cells)(ptr) >= charsize || *ptr == TAB) && col == 0) ! n_skip = v - vcol; } // Adjust for when the inverted text is before the screen, // and when the start of the inverted text is before the screen. ! if (tocol <= vcol) fromcol = 0; ! else if (fromcol >= 0 && fromcol < vcol) ! fromcol = vcol; #ifdef FEAT_LINEBREAK // When w_skipcol is non-zero, first line needs 'showbreak' --- 992,1024 ---- // - 'virtualedit' is set, or // - the visual mode is active, // the end of the line may be before the start of the displayed part. ! if (wlv.vcol < v && ( #ifdef FEAT_SYN_HL ! wp->w_p_cuc || wlv.draw_color_col || #endif virtual_active() || (VIsual_active && wp->w_buffer == curwin->w_buffer))) ! wlv.vcol = v; // Handle a character that's not completely on the screen: Put ptr at // that character but skip the first few screen characters. ! if (wlv.vcol > v) { ! wlv.vcol -= charsize; ptr = prev_ptr; // If the character fits on the screen, don't need to skip it. // Except for a TAB. ! if (((*mb_ptr2cells)(ptr) >= charsize || *ptr == TAB) ! && wlv.col == 0) ! n_skip = v - wlv.vcol; } // Adjust for when the inverted text is before the screen, // and when the start of the inverted text is before the screen. ! if (tocol <= wlv.vcol) fromcol = 0; ! else if (fromcol >= 0 && fromcol < wlv.vcol) ! fromcol = wlv.vcol; #ifdef FEAT_LINEBREAK // When w_skipcol is non-zero, first line needs 'showbreak' *************** *** 1039,1058 **** } #endif ! off = (unsigned)(current_ScreenLine - ScreenLines); ! col = 0; ! ! #ifdef FEAT_RIGHTLEFT ! if (wp->w_p_rl) ! { ! // Rightleft window: process the text in the normal direction, but put ! // it in current_ScreenLine[] from right to left. Start at the ! // rightmost column of the window. ! col = wp->w_width - 1; ! off += col; ! screen_line_flags |= SLF_RIGHTLEFT; ! } ! #endif // Repeat for the whole displayed line. for (;;) --- 1170,1176 ---- } #endif ! win_line_start(wp, &wlv); // Repeat for the whole displayed line. for (;;) *************** *** 1130,1137 **** // buffer or when using Netbeans. if (signcolumn_on(wp)) get_sign_display_info(FALSE, wp, lnum, &sattr, wcr_attr, ! row, startrow, filler_lines, filler_todo, &c_extra, ! &c_final, extra, &p_extra, &n_extra, &char_attr); } #endif --- 1248,1256 ---- // buffer or when using Netbeans. if (signcolumn_on(wp)) get_sign_display_info(FALSE, wp, lnum, &sattr, wcr_attr, ! wlv.row, startrow, filler_lines, filler_todo, ! &c_extra, &c_final, extra, &p_extra, &n_extra, ! &char_attr); } #endif *************** *** 1141,1148 **** // Display the absolute or relative line number. After the // first fill with blanks when the 'n' flag isn't in 'cpo' if ((wp->w_p_nu || wp->w_p_rnu) ! && (row == startrow + filler_lines ! || vim_strchr(p_cpo, CPO_NUMCOL) == NULL)) { #ifdef FEAT_SIGNS // If 'signcolumn' is set to 'number' and a sign is present --- 1260,1267 ---- // Display the absolute or relative line number. After the // first fill with blanks when the 'n' flag isn't in 'cpo' if ((wp->w_p_nu || wp->w_p_rnu) ! && (wlv.row == startrow + filler_lines ! || vim_strchr(p_cpo, CPO_NUMCOL) == NULL)) { #ifdef FEAT_SIGNS // If 'signcolumn' is set to 'number' and a sign is present *************** *** 1151,1164 **** if ((*wp->w_p_scl == 'n' && *(wp->w_p_scl + 1) == 'u') && sign_present) get_sign_display_info(TRUE, wp, lnum, &sattr, wcr_attr, ! row, startrow, filler_lines, filler_todo, &c_extra, &c_final, extra, &p_extra, &n_extra, &char_attr); else #endif { // Draw the line number (empty space after wrapping). ! if (row == startrow + filler_lines) { long num; char *fmt = "%*ld "; --- 1270,1283 ---- if ((*wp->w_p_scl == 'n' && *(wp->w_p_scl + 1) == 'u') && sign_present) get_sign_display_info(TRUE, wp, lnum, &sattr, wcr_attr, ! wlv.row, startrow, filler_lines, filler_todo, &c_extra, &c_final, extra, &p_extra, &n_extra, &char_attr); else #endif { // Draw the line number (empty space after wrapping). ! if (wlv.row == startrow + filler_lines) { long num; char *fmt = "%*ld "; *************** *** 1221,1228 **** if (wp->w_p_cul && lnum == wp->w_cursor.lnum && (wp->w_p_culopt_flags & CULOPT_NBR) ! && (row == startrow + filler_lines ! || (row > startrow + filler_lines && (wp->w_p_culopt_flags & CULOPT_LINE)))) char_attr = hl_combine_attr(wcr_attr, HL_ATTR(HLF_CLN)); #endif --- 1340,1347 ---- if (wp->w_p_cul && lnum == wp->w_cursor.lnum && (wp->w_p_culopt_flags & CULOPT_NBR) ! && (wlv.row == startrow + filler_lines ! || (wlv.row > startrow + filler_lines && (wp->w_p_culopt_flags & CULOPT_LINE)))) char_attr = hl_combine_attr(wcr_attr, HL_ATTR(HLF_CLN)); #endif *************** *** 1258,1264 **** { draw_state = WL_BRI; // if need_showbreak is set, breakindent also applies ! if (wp->w_p_bri && (row != startrow || need_showbreak) # ifdef FEAT_DIFF && filler_lines == 0 # endif --- 1377,1383 ---- { draw_state = WL_BRI; // if need_showbreak is set, breakindent also applies ! if (wp->w_p_bri && (wlv.row != startrow || need_showbreak) # ifdef FEAT_DIFF && filler_lines == 0 # endif *************** *** 1274,1280 **** c_final = NUL; n_extra = get_breakindent_win(wp, ml_get_buf(wp->w_buffer, lnum, FALSE)); ! if (row == startrow) { n_extra -= win_col_off2(wp); if (n_extra < 0) --- 1393,1399 ---- c_final = NUL; n_extra = get_breakindent_win(wp, ml_get_buf(wp->w_buffer, lnum, FALSE)); ! if (wlv.row == startrow) { n_extra -= win_col_off2(wp); if (n_extra < 0) *************** *** 1284,1290 **** need_showbreak = FALSE; // Correct end of highlighted area for 'breakindent', // required when 'linebreak' is also set. ! if (tocol == vcol) tocol += n_extra; } } --- 1403,1409 ---- need_showbreak = FALSE; // Correct end of highlighted area for 'breakindent', // required when 'linebreak' is also set. ! if (tocol == wlv.vcol) tocol += n_extra; } } *************** *** 1312,1321 **** } # ifdef FEAT_RIGHTLEFT if (wp->w_p_rl) ! n_extra = col + 1; else # endif ! n_extra = wp->w_width - col; char_attr = HL_ATTR(HLF_DED); } # endif --- 1431,1440 ---- } # ifdef FEAT_RIGHTLEFT if (wp->w_p_rl) ! n_extra = wlv.col + 1; else # endif ! n_extra = wp->w_width - wlv.col; char_attr = HL_ATTR(HLF_DED); } # endif *************** *** 1330,1342 **** n_extra = (int)STRLEN(sbr); if (wp->w_skipcol == 0 || !wp->w_p_wrap) need_showbreak = FALSE; ! vcol_sbr = vcol + MB_CHARLEN(sbr); // Correct end of highlighted area for 'showbreak', // required when 'linebreak' is also set. ! if (tocol == vcol) tocol += n_extra; // combine 'showbreak' with 'wincolor' ! char_attr = hl_combine_attr(win_attr, HL_ATTR(HLF_AT)); # ifdef FEAT_SYN_HL // combine 'showbreak' with 'cursorline' if (cul_attr != 0) --- 1449,1461 ---- n_extra = (int)STRLEN(sbr); if (wp->w_skipcol == 0 || !wp->w_p_wrap) need_showbreak = FALSE; ! vcol_sbr = wlv.vcol + MB_CHARLEN(sbr); // Correct end of highlighted area for 'showbreak', // required when 'linebreak' is also set. ! if (tocol == wlv.vcol) tocol += n_extra; // combine 'showbreak' with 'wincolor' ! char_attr = hl_combine_attr(wlv.win_attr, HL_ATTR(HLF_AT)); # ifdef FEAT_SYN_HL // combine 'showbreak' with 'cursorline' if (cul_attr != 0) *************** *** 1360,1372 **** char_attr = saved_char_attr; } else ! char_attr = win_attr; } } #ifdef FEAT_SYN_HL if (cul_screenline && draw_state == WL_LINE ! && vcol >= left_curline_col ! && vcol < right_curline_col) { cul_attr = HL_ATTR(HLF_CUL); line_attr = cul_attr; --- 1479,1491 ---- char_attr = saved_char_attr; } else ! char_attr = wlv.win_attr; } } #ifdef FEAT_SYN_HL if (cul_screenline && draw_state == WL_LINE ! && wlv.vcol >= left_curline_col ! && wlv.vcol < right_curline_col) { cul_attr = HL_ATTR(HLF_CUL); line_attr = cul_attr; *************** *** 1377,1415 **** // When only displaying the (relative) line number and that's done, // stop here. if (((dollar_vcol >= 0 && wp == curwin ! && lnum == wp->w_cursor.lnum && vcol >= (long)wp->w_virtcol) || (number_only && draw_state > WL_NR)) #ifdef FEAT_DIFF && filler_todo <= 0 #endif ) { ! screen_line(wp, screen_row, wp->w_wincol, col, -wp->w_width, ! screen_line_flags); // Pretend we have finished updating the window. Except when // 'cursorcolumn' is set. #ifdef FEAT_SYN_HL if (wp->w_p_cuc) ! row = wp->w_cline_row + wp->w_cline_height; else #endif ! row = wp->w_height; break; } if (draw_state == WL_LINE && (area_highlighting || extra_check)) { // handle Visual or match highlighting in this line ! if (vcol == fromcol ! || (has_mbyte && vcol + 1 == fromcol && n_extra == 0 && (*mb_ptr2cells)(ptr) > 1) || ((int)vcol_prev == fromcol_prev ! && vcol_prev < vcol // not at margin ! && vcol < tocol)) area_attr = vi_attr; // start highlighting else if (area_attr != 0 ! && (vcol == tocol ! || (noinvcur && (colnr_T)vcol == wp->w_virtcol))) area_attr = 0; // stop highlighting #ifdef FEAT_SEARCH_EXTRA --- 1496,1534 ---- // When only displaying the (relative) line number and that's done, // stop here. if (((dollar_vcol >= 0 && wp == curwin ! && lnum == wp->w_cursor.lnum && wlv.vcol >= (long)wp->w_virtcol) || (number_only && draw_state > WL_NR)) #ifdef FEAT_DIFF && filler_todo <= 0 #endif ) { ! screen_line(wp, wlv.screen_row, wp->w_wincol, wlv.col, -wp->w_width, ! wlv.screen_line_flags); // Pretend we have finished updating the window. Except when // 'cursorcolumn' is set. #ifdef FEAT_SYN_HL if (wp->w_p_cuc) ! wlv.row = wp->w_cline_row + wp->w_cline_height; else #endif ! wlv.row = wp->w_height; break; } if (draw_state == WL_LINE && (area_highlighting || extra_check)) { // handle Visual or match highlighting in this line ! if (wlv.vcol == fromcol ! || (has_mbyte && wlv.vcol + 1 == fromcol && n_extra == 0 && (*mb_ptr2cells)(ptr) > 1) || ((int)vcol_prev == fromcol_prev ! && vcol_prev < wlv.vcol // not at margin ! && wlv.vcol < tocol)) area_attr = vi_attr; // start highlighting else if (area_attr != 0 ! && (wlv.vcol == tocol ! || (noinvcur && (colnr_T)wlv.vcol == wp->w_virtcol))) area_attr = 0; // stop highlighting #ifdef FEAT_SEARCH_EXTRA *************** *** 1445,1452 **** line_attr = HL_ATTR(diff_hlf); if (wp->w_p_cul && lnum == wp->w_cursor.lnum && wp->w_p_culopt_flags != CULOPT_NBR ! && (!cul_screenline || (vcol >= left_curline_col ! && vcol <= right_curline_col))) line_attr = hl_combine_attr( line_attr, HL_ATTR(HLF_CUL)); } --- 1564,1571 ---- line_attr = HL_ATTR(diff_hlf); if (wp->w_p_cul && lnum == wp->w_cursor.lnum && wp->w_p_culopt_flags != CULOPT_NBR ! && (!cul_screenline || (wlv.vcol >= left_curline_col ! && wlv.vcol <= right_curline_col))) line_attr = hl_combine_attr( line_attr, HL_ATTR(HLF_CUL)); } *************** *** 1582,1588 **** // win_lbr_chartabsize(). if ((right || below || !wrap) && wp->w_width > 2) { ! int added = wp->w_width - col; int n_used = n_extra; char_u *l; int strsize = wrap --- 1701,1707 ---- // win_lbr_chartabsize(). if ((right || below || !wrap) && wp->w_width > 2) { ! int added = wp->w_width - wlv.col; int n_used = n_extra; char_u *l; int strsize = wrap *************** *** 1595,1602 **** // Right-align: fill with spaces if (right) added -= strsize; ! if (added < 0 || (below && col == 0) ! || (!below && n_used < n_extra)) added = 0; // add 1 for NUL, 2 for when '…' is used l = alloc(n_used + added + 3); --- 1714,1723 ---- // Right-align: fill with spaces if (right) added -= strsize; ! if (added < 0 ! || (below ! ? wlv.col == 0 || !wp->w_p_wrap ! : n_used < n_extra)) added = 0; // add 1 for NUL, 2 for when '…' is used l = alloc(n_used + added + 3); *************** *** 1625,1630 **** --- 1746,1767 ---- n_attr_skip = added; } } + + // When 'wrap' is off then for "below" we need + // to start a new line explictly. + if (!wp->w_p_wrap) + { + draw_screen_line(wp, &wlv); + + // When line got too long for screen break + // here. + if (wlv.row == endrow) + { + ++wlv.row; + break; + } + win_line_start(wp, &wlv); + } } } // reset the ID in the copy to avoid it being used *************** *** 1653,1659 **** syntax_attr = 0; # ifdef FEAT_TERMINAL if (get_term_attr) ! syntax_attr = term_get_attr(wp, lnum, vcol); # endif // Get syntax attribute. if (has_syntax) --- 1790,1796 ---- syntax_attr = 0; # ifdef FEAT_TERMINAL if (get_term_attr) ! syntax_attr = term_get_attr(wp, lnum, wlv.vcol); # endif // Get syntax attribute. if (has_syntax) *************** *** 1742,1749 **** # endif } else if (line_attr != 0 && ((fromcol == -10 && tocol == MAXCOL) ! || vcol < fromcol || vcol_prev < fromcol_prev ! || vcol >= tocol)) { // Use line_attr when not in the Visual or 'incsearch' area // (area_attr may be 0 when "noinvcur" is set). --- 1879,1886 ---- # endif } else if (line_attr != 0 && ((fromcol == -10 && tocol == MAXCOL) ! || wlv.vcol < fromcol || vcol_prev < fromcol_prev ! || wlv.vcol >= tocol)) { // Use line_attr when not in the Visual or 'incsearch' area // (area_attr may be 0 when "noinvcur" is set). *************** *** 1777,1788 **** } // combine attribute with 'wincolor' ! if (win_attr != 0) { if (char_attr == 0) ! char_attr = win_attr; else ! char_attr = hl_combine_attr(win_attr, char_attr); } // Get the next character to put on the screen. --- 1914,1925 ---- } // combine attribute with 'wincolor' ! if (wlv.win_attr != 0) { if (char_attr == 0) ! char_attr = wlv.win_attr; else ! char_attr = hl_combine_attr(wlv.win_attr, char_attr); } // Get the next character to put on the screen. *************** *** 1846,1854 **** // last column. if (( # ifdef FEAT_RIGHTLEFT ! wp->w_p_rl ? (col <= 0) : # endif ! (col >= wp->w_width - 1)) && (*mb_char2cells)(mb_c) == 2) { c = '>'; --- 1983,1991 ---- // last column. if (( # ifdef FEAT_RIGHTLEFT ! wp->w_p_rl ? (wlv.col <= 0) : # endif ! (wlv.col >= wp->w_width - 1)) && (*mb_char2cells)(mb_c) == 2) { c = '>'; *************** *** 1860,1866 **** if (cul_attr) multi_attr = hl_combine_attr(multi_attr, cul_attr); #endif ! multi_attr = hl_combine_attr(win_attr, multi_attr); // put the pointer back to output the double-width // character at the start of the next line. --- 1997,2003 ---- if (cul_attr) multi_attr = hl_combine_attr(multi_attr, cul_attr); #endif ! multi_attr = hl_combine_attr(wlv.win_attr, multi_attr); // put the pointer back to output the double-width // character at the start of the next line. *************** *** 1952,1958 **** { n_attr = n_extra + 1; extra_attr = hl_combine_attr( ! win_attr, HL_ATTR(HLF_8)); saved_attr2 = char_attr; // save current attr } } --- 2089,2095 ---- { n_attr = n_extra + 1; extra_attr = hl_combine_attr( ! wlv.win_attr, HL_ATTR(HLF_8)); saved_attr2 = char_attr; // save current attr } } *************** *** 2022,2028 **** { n_attr = n_extra + 1; extra_attr = hl_combine_attr( ! win_attr, HL_ATTR(HLF_8)); saved_attr2 = char_attr; // save current attr } mb_c = c; --- 2159,2165 ---- { n_attr = n_extra + 1; extra_attr = hl_combine_attr( ! wlv.win_attr, HL_ATTR(HLF_8)); saved_attr2 = char_attr; // save current attr } mb_c = c; *************** *** 2034,2049 **** // next line. if (( # ifdef FEAT_RIGHTLEFT ! wp->w_p_rl ? (col <= 0) : # endif ! (col >= wp->w_width - 1)) && (*mb_char2cells)(mb_c) == 2) { c = '>'; mb_c = c; mb_utf8 = FALSE; mb_l = 1; ! multi_attr = hl_combine_attr(win_attr, HL_ATTR(HLF_AT)); // Put pointer back so that the character will be // displayed at the start of the next line. --ptr; --- 2171,2186 ---- // next line. if (( # ifdef FEAT_RIGHTLEFT ! wp->w_p_rl ? (wlv.col <= 0) : # endif ! (wlv.col >= wp->w_width - 1)) && (*mb_char2cells)(mb_c) == 2) { c = '>'; mb_c = c; mb_utf8 = FALSE; mb_l = 1; ! multi_attr = hl_combine_attr(wlv.win_attr, HL_ATTR(HLF_AT)); // Put pointer back so that the character will be // displayed at the start of the next line. --ptr; *************** *** 2066,2072 **** if (area_attr == 0 && search_attr == 0) { n_attr = n_extra + 1; ! extra_attr = hl_combine_attr(win_attr, HL_ATTR(HLF_AT)); saved_attr2 = char_attr; // save current attr } mb_c = c; --- 2203,2210 ---- if (area_attr == 0 && search_attr == 0) { n_attr = n_extra + 1; ! extra_attr = hl_combine_attr( ! wlv.win_attr, HL_ATTR(HLF_AT)); saved_attr2 = char_attr; // save current attr } mb_c = c; *************** *** 2174,2185 **** char_u *p = ptr - (mb_off + 1); chartabsize_T cts; ! init_chartabsize_arg(&cts, wp, lnum, vcol, line, p); n_extra = win_lbr_chartabsize(&cts, NULL) - 1; // We have just drawn the showbreak value, no need to add // space for it again. ! if (vcol == vcol_sbr) { n_extra -= MB_CHARLEN(get_showbreak_value(wp)); if (n_extra < 0) --- 2312,2323 ---- char_u *p = ptr - (mb_off + 1); chartabsize_T cts; ! init_chartabsize_arg(&cts, wp, lnum, wlv.vcol, line, p); n_extra = win_lbr_chartabsize(&cts, NULL) - 1; // We have just drawn the showbreak value, no need to add // space for it again. ! if (wlv.vcol == vcol_sbr) { n_extra -= MB_CHARLEN(get_showbreak_value(wp)); if (n_extra < 0) *************** *** 2191,2203 **** // include the complete width of the character search_attr = 0; ! if (c == TAB && n_extra + col > wp->w_width) # ifdef FEAT_VARTABS ! n_extra = tabstop_padding(vcol, wp->w_buffer->b_p_ts, wp->w_buffer->b_p_vts_array) - 1; # else n_extra = (int)wp->w_buffer->b_p_ts ! - vcol % (int)wp->w_buffer->b_p_ts - 1; # endif c_extra = mb_off > 0 ? MB_FILLER_CHAR : ' '; --- 2329,2342 ---- // include the complete width of the character search_attr = 0; ! if (c == TAB && n_extra + wlv.col > wp->w_width) # ifdef FEAT_VARTABS ! n_extra = tabstop_padding(wlv.vcol, ! wp->w_buffer->b_p_ts, wp->w_buffer->b_p_vts_array) - 1; # else n_extra = (int)wp->w_buffer->b_p_ts ! - wlv.vcol % (int)wp->w_buffer->b_p_ts - 1; # endif c_extra = mb_off > 0 ? MB_FILLER_CHAR : ' '; *************** *** 2254,2260 **** if (area_attr == 0 && search_attr == 0) { n_attr = 1; ! extra_attr = hl_combine_attr(win_attr, HL_ATTR(HLF_8)); saved_attr2 = char_attr; // save current attr } mb_c = c; --- 2393,2400 ---- if (area_attr == 0 && search_attr == 0) { n_attr = 1; ! extra_attr = hl_combine_attr(wlv.win_attr, ! HL_ATTR(HLF_8)); saved_attr2 = char_attr; // save current attr } mb_c = c; *************** *** 2293,2299 **** if (!attr_pri) { n_attr = 1; ! extra_attr = hl_combine_attr(win_attr, HL_ATTR(HLF_8)); saved_attr2 = char_attr; // save current attr } mb_c = c; --- 2433,2440 ---- if (!attr_pri) { n_attr = 1; ! extra_attr = hl_combine_attr(wlv.win_attr, ! HL_ATTR(HLF_8)); saved_attr2 = char_attr; // save current attr } mb_c = c; *************** *** 2317,2330 **** if (c == TAB && (!wp->w_p_list || wp->w_lcs_chars.tab1)) { int tab_len = 0; ! long vcol_adjusted = vcol; // removed showbreak length #ifdef FEAT_LINEBREAK char_u *sbr = get_showbreak_value(wp); // only adjust the tab_len, when at the first column // after the showbreak value was drawn ! if (*sbr != NUL && vcol == vcol_sbr && wp->w_p_wrap) ! vcol_adjusted = vcol - MB_CHARLEN(sbr); #endif // tab amount depends on current column #ifdef FEAT_VARTABS --- 2458,2471 ---- if (c == TAB && (!wp->w_p_list || wp->w_lcs_chars.tab1)) { int tab_len = 0; ! long vcol_adjusted = wlv.vcol; // removed showbreak length #ifdef FEAT_LINEBREAK char_u *sbr = get_showbreak_value(wp); // only adjust the tab_len, when at the first column // after the showbreak value was drawn ! if (*sbr != NUL && wlv.vcol == vcol_sbr && wp->w_p_wrap) ! vcol_adjusted = wlv.vcol - MB_CHARLEN(sbr); #endif // tab amount depends on current column #ifdef FEAT_VARTABS *************** *** 2350,2358 **** int saved_nextra = n_extra; # ifdef FEAT_CONCEAL ! if (vcol_off > 0) // there are characters to conceal ! tab_len += vcol_off; // boguscols before FIX_FOR_BOGUSCOLS macro from above if (wp->w_p_list && wp->w_lcs_chars.tab1 --- 2491,2499 ---- int saved_nextra = n_extra; # ifdef FEAT_CONCEAL ! if (wlv.vcol_off > 0) // there are characters to conceal ! tab_len += wlv.vcol_off; // boguscols before FIX_FOR_BOGUSCOLS macro from above if (wp->w_p_list && wp->w_lcs_chars.tab1 *************** *** 2399,2413 **** # ifdef FEAT_CONCEAL // n_extra will be increased by FIX_FOX_BOGUSCOLS // macro below, so need to adjust for that here ! if (vcol_off > 0) ! n_extra -= vcol_off; # endif } } #endif #ifdef FEAT_CONCEAL { ! int vc_saved = vcol_off; // Tab alignment should be identical regardless of // 'conceallevel' value. So tab compensates of all --- 2540,2554 ---- # ifdef FEAT_CONCEAL // n_extra will be increased by FIX_FOX_BOGUSCOLS // macro below, so need to adjust for that here ! if (wlv.vcol_off > 0) ! n_extra -= wlv.vcol_off; # endif } } #endif #ifdef FEAT_CONCEAL { ! int vc_saved = wlv.vcol_off; // Tab alignment should be identical regardless of // 'conceallevel' value. So tab compensates of all *************** *** 2439,2445 **** c_extra = wp->w_lcs_chars.tab2; c_final = wp->w_lcs_chars.tab3; n_attr = tab_len + 1; ! extra_attr = hl_combine_attr(win_attr, HL_ATTR(HLF_8)); saved_attr2 = char_attr; // save current attr mb_c = c; if (enc_utf8 && utf_char2len(c) > 1) --- 2580,2587 ---- c_extra = wp->w_lcs_chars.tab2; c_final = wp->w_lcs_chars.tab3; n_attr = tab_len + 1; ! extra_attr = hl_combine_attr(wlv.win_attr, ! HL_ATTR(HLF_8)); saved_attr2 = char_attr; // save current attr mb_c = c; if (enc_utf8 && utf_char2len(c) > 1) *************** *** 2459,2474 **** else if (c == NUL && (wp->w_p_list || ((fromcol >= 0 || fromcol_prev >= 0) ! && tocol > vcol && VIsual_mode != Ctrl_V && ( # ifdef FEAT_RIGHTLEFT ! wp->w_p_rl ? (col >= 0) : # endif ! (col < wp->w_width)) && !(noinvcur && lnum == wp->w_cursor.lnum ! && (colnr_T)vcol == wp->w_virtcol))) && lcs_eol_one > 0) { // Display a '$' after the line or highlight an extra --- 2601,2616 ---- else if (c == NUL && (wp->w_p_list || ((fromcol >= 0 || fromcol_prev >= 0) ! && tocol > wlv.vcol && VIsual_mode != Ctrl_V && ( # ifdef FEAT_RIGHTLEFT ! wp->w_p_rl ? (wlv.col >= 0) : # endif ! (wlv.col < wp->w_width)) && !(noinvcur && lnum == wp->w_cursor.lnum ! && (colnr_T)wlv.vcol == wp->w_virtcol))) && lcs_eol_one > 0) { // Display a '$' after the line or highlight an extra *************** *** 2492,2498 **** // In virtualedit, visual selections may extend // beyond end of line. if (area_highlighting && virtual_active() ! && tocol != MAXCOL && vcol < tocol) n_extra = 0; else { --- 2634,2640 ---- // In virtualedit, visual selections may extend // beyond end of line. if (area_highlighting && virtual_active() ! && tocol != MAXCOL && wlv.vcol < tocol) n_extra = 0; else { *************** *** 2510,2516 **** --ptr; // put it back at the NUL if (!attr_pri) { ! extra_attr = hl_combine_attr(win_attr, HL_ATTR(HLF_AT)); n_attr = 1; } mb_c = c; --- 2652,2659 ---- --ptr; // put it back at the NUL if (!attr_pri) { ! extra_attr = hl_combine_attr(wlv.win_attr, ! HL_ATTR(HLF_AT)); n_attr = 1; } mb_c = c; *************** *** 2556,2562 **** if (!attr_pri) { n_attr = n_extra + 1; ! extra_attr = hl_combine_attr(win_attr, HL_ATTR(HLF_8)); saved_attr2 = char_attr; // save current attr } mb_utf8 = FALSE; // don't draw as UTF-8 --- 2699,2706 ---- if (!attr_pri) { n_attr = n_extra + 1; ! extra_attr = hl_combine_attr(wlv.win_attr, ! HL_ATTR(HLF_8)); saved_attr2 = char_attr; // save current attr } mb_utf8 = FALSE; // don't draw as UTF-8 *************** *** 2566,2577 **** || VIsual_mode == 'v') && virtual_active() && tocol != MAXCOL ! && vcol < tocol && ( #ifdef FEAT_RIGHTLEFT ! wp->w_p_rl ? (col >= 0) : #endif ! (col < wp->w_width))) { c = ' '; --ptr; // put it back at the NUL --- 2710,2721 ---- || VIsual_mode == 'v') && virtual_active() && tocol != MAXCOL ! && wlv.vcol < tocol && ( #ifdef FEAT_RIGHTLEFT ! wp->w_p_rl ? (wlv.col >= 0) : #endif ! (wlv.col < wp->w_width))) { c = ' '; --ptr; // put it back at the NUL *************** *** 2582,2597 **** diff_hlf != (hlf_T)0 || # endif # ifdef FEAT_TERMINAL ! win_attr != 0 || # endif line_attr != 0 ) && ( # ifdef FEAT_RIGHTLEFT ! wp->w_p_rl ? (col >= 0) : # endif ! (col # ifdef FEAT_CONCEAL ! - boguscols # endif < wp->w_width))) { --- 2726,2741 ---- diff_hlf != (hlf_T)0 || # endif # ifdef FEAT_TERMINAL ! wlv.win_attr != 0 || # endif line_attr != 0 ) && ( # ifdef FEAT_RIGHTLEFT ! wp->w_p_rl ? (wlv.col >= 0) : # endif ! (wlv.col # ifdef FEAT_CONCEAL ! - wlv.boguscols # endif < wp->w_width))) { *************** *** 2618,2639 **** if (wp->w_p_cul && lnum == wp->w_cursor.lnum && wp->w_p_culopt_flags != CULOPT_NBR && (!cul_screenline ! || (vcol >= left_curline_col ! && vcol <= right_curline_col))) char_attr = hl_combine_attr( char_attr, HL_ATTR(HLF_CUL)); } } # endif # ifdef FEAT_TERMINAL ! if (win_attr != 0) { ! char_attr = win_attr; if (wp->w_p_cul && lnum == wp->w_cursor.lnum && wp->w_p_culopt_flags != CULOPT_NBR) { ! if (!cul_screenline || (vcol >= left_curline_col ! && vcol <= right_curline_col)) char_attr = hl_combine_attr( char_attr, HL_ATTR(HLF_CUL)); } --- 2762,2783 ---- if (wp->w_p_cul && lnum == wp->w_cursor.lnum && wp->w_p_culopt_flags != CULOPT_NBR && (!cul_screenline ! || (wlv.vcol >= left_curline_col ! && wlv.vcol <= right_curline_col))) char_attr = hl_combine_attr( char_attr, HL_ATTR(HLF_CUL)); } } # endif # ifdef FEAT_TERMINAL ! if (wlv.win_attr != 0) { ! char_attr = wlv.win_attr; if (wp->w_p_cul && lnum == wp->w_cursor.lnum && wp->w_p_culopt_flags != CULOPT_NBR) { ! if (!cul_screenline || (wlv.vcol >= left_curline_col ! && wlv.vcol <= right_curline_col)) char_attr = hl_combine_attr( char_attr, HL_ATTR(HLF_CUL)); } *************** *** 2676,2696 **** prev_syntax_id = syntax_seqnr; if (n_extra > 0) ! vcol_off += n_extra; ! vcol += n_extra; if (wp->w_p_wrap && n_extra > 0) { # ifdef FEAT_RIGHTLEFT if (wp->w_p_rl) { ! col -= n_extra; ! boguscols -= n_extra; } else # endif { ! boguscols += n_extra; ! col += n_extra; } } n_extra = 0; --- 2820,2840 ---- prev_syntax_id = syntax_seqnr; if (n_extra > 0) ! wlv.vcol_off += n_extra; ! wlv.vcol += n_extra; if (wp->w_p_wrap && n_extra > 0) { # ifdef FEAT_RIGHTLEFT if (wp->w_p_rl) { ! wlv.col -= n_extra; ! wlv.boguscols -= n_extra; } else # endif { ! wlv.boguscols += n_extra; ! wlv.col += n_extra; } } n_extra = 0; *************** *** 2730,2744 **** if (!did_wcol && draw_state == WL_LINE && wp == curwin && lnum == wp->w_cursor.lnum && conceal_cursor_line(wp) ! && (int)wp->w_virtcol <= vcol + n_skip) { # ifdef FEAT_RIGHTLEFT if (wp->w_p_rl) ! wp->w_wcol = wp->w_width - col + boguscols - 1; else # endif ! wp->w_wcol = col - boguscols; ! wp->w_wrow = row; did_wcol = TRUE; curwin->w_valid |= VALID_WCOL|VALID_WROW|VALID_VIRTCOL; # ifdef FEAT_PROP_POPUP --- 2874,2888 ---- if (!did_wcol && draw_state == WL_LINE && wp == curwin && lnum == wp->w_cursor.lnum && conceal_cursor_line(wp) ! && (int)wp->w_virtcol <= wlv.vcol + n_skip) { # ifdef FEAT_RIGHTLEFT if (wp->w_p_rl) ! wp->w_wcol = wp->w_width - wlv.col + wlv.boguscols - 1; else # endif ! wp->w_wcol = wlv.col - wlv.boguscols; ! wp->w_wrow = wlv.row; did_wcol = TRUE; curwin->w_valid |= VALID_WCOL|VALID_WROW|VALID_VIRTCOL; # ifdef FEAT_PROP_POPUP *************** *** 2779,2785 **** getvcol(curwin, &(wp->w_cursor), &tcol, NULL, NULL); else tcol = preedit_end_col; ! if ((long)preedit_start_col <= vcol && vcol < (long)tcol) { if (feedback_old_attr < 0) { --- 2923,2929 ---- getvcol(curwin, &(wp->w_cursor), &tcol, NULL, NULL); else tcol = preedit_end_col; ! if ((long)preedit_start_col <= wlv.vcol && wlv.vcol < (long)tcol) { if (feedback_old_attr < 0) { *************** *** 2805,2811 **** if (lcs_prec_todo != NUL && wp->w_p_list && (wp->w_p_wrap ? ! (wp->w_skipcol > 0 && row == 0) : wp->w_leftcol > 0) #ifdef FEAT_DIFF && filler_todo <= 0 --- 2949,2955 ---- if (lcs_prec_todo != NUL && wp->w_p_list && (wp->w_p_wrap ? ! (wp->w_skipcol > 0 && wlv.row == 0) : wp->w_leftcol > 0) #ifdef FEAT_DIFF && filler_todo <= 0 *************** *** 2823,2829 **** c_final = NUL; n_extra = 1; n_attr = 2; ! extra_attr = hl_combine_attr(win_attr, HL_ATTR(HLF_AT)); } mb_c = c; if (enc_utf8 && utf_char2len(c) > 1) --- 2967,2973 ---- c_final = NUL; n_extra = 1; n_attr = 2; ! extra_attr = hl_combine_attr(wlv.win_attr, HL_ATTR(HLF_AT)); } mb_c = c; if (enc_utf8 && utf_char2len(c) > 1) *************** *** 2837,2843 **** if (!attr_pri) { saved_attr3 = char_attr; // save current attr ! char_attr = hl_combine_attr(win_attr, HL_ATTR(HLF_AT)); n_attr3 = 1; } } --- 2981,2987 ---- if (!attr_pri) { saved_attr3 = char_attr; // save current attr ! char_attr = hl_combine_attr(wlv.win_attr, HL_ATTR(HLF_AT)); n_attr3 = 1; } } *************** *** 2847,2853 **** #if defined(LINE_ATTR) || did_line_attr == 1 #endif ! ) && eol_hl_off == 0) { #ifdef FEAT_SEARCH_EXTRA // flag to indicate whether prevcol equals startcol of search_hl or --- 2991,2997 ---- #if defined(LINE_ATTR) || did_line_attr == 1 #endif ! ) && wlv.eol_hl_off == 0) { #ifdef FEAT_SEARCH_EXTRA // flag to indicate whether prevcol equals startcol of search_hl or *************** *** 2860,2866 **** // char on the screen, just overwrite that one (tricky!) Not // needed when a '$' was displayed for 'list'. if (wp->w_lcs_chars.eol == lcs_eol_one ! && ((area_attr != 0 && vcol == fromcol && (VIsual_mode != Ctrl_V || lnum == VIsual.lnum || lnum == curwin->w_cursor.lnum) --- 3004,3010 ---- // char on the screen, just overwrite that one (tricky!) Not // needed when a '$' was displayed for 'list'. if (wp->w_lcs_chars.eol == lcs_eol_one ! && ((area_attr != 0 && wlv.vcol == fromcol && (VIsual_mode != Ctrl_V || lnum == VIsual.lnum || lnum == curwin->w_cursor.lnum) *************** *** 2887,2914 **** #ifdef FEAT_RIGHTLEFT if (wp->w_p_rl) { ! if (col < 0) n = 1; } else #endif { ! if (col >= wp->w_width) n = -1; } if (n != 0) { // At the window boundary, highlight the last character // instead (better than nothing). ! off += n; ! col += n; } else { // Add a blank character to highlight. ! ScreenLines[off] = ' '; if (enc_utf8) ! ScreenLinesUC[off] = 0; } #ifdef FEAT_SEARCH_EXTRA if (area_attr == 0) --- 3031,3058 ---- #ifdef FEAT_RIGHTLEFT if (wp->w_p_rl) { ! if (wlv.col < 0) n = 1; } else #endif { ! if (wlv.col >= wp->w_width) n = -1; } if (n != 0) { // At the window boundary, highlight the last character // instead (better than nothing). ! wlv.off += n; ! wlv.col += n; } else { // Add a blank character to highlight. ! ScreenLines[wlv.off] = ' '; if (enc_utf8) ! ScreenLinesUC[wlv.off] = 0; } #ifdef FEAT_SEARCH_EXTRA if (area_attr == 0) *************** *** 2919,3031 **** (long)(ptr - line), &char_attr); } #endif ! ScreenAttrs[off] = char_attr; ! ScreenCols[off] = MAXCOL; #ifdef FEAT_RIGHTLEFT if (wp->w_p_rl) { ! --col; ! --off; } else #endif { ! ++col; ! ++off; } ! ++vcol; ! eol_hl_off = 1; } } // At end of the text line. if (c == NUL) { ! #ifdef FEAT_SYN_HL ! // Highlight 'cursorcolumn' & 'colorcolumn' past end of the line. ! if (wp->w_p_wrap) ! v = wp->w_skipcol; ! else ! v = wp->w_leftcol; ! ! // check if line ends before left margin ! if (vcol < v + col - win_col_off(wp)) ! vcol = v + col - win_col_off(wp); ! #ifdef FEAT_CONCEAL ! // Get rid of the boguscols now, we want to draw until the right ! // edge for 'cursorcolumn'. ! col -= boguscols; ! boguscols = 0; ! #endif ! ! if (draw_color_col) ! draw_color_col = advance_color_col(VCOL_HLC, &color_cols); ! ! if (((wp->w_p_cuc ! && (int)wp->w_virtcol >= VCOL_HLC - eol_hl_off ! && (int)wp->w_virtcol < ! (long)wp->w_width * (row - startrow + 1) + v ! && lnum != wp->w_cursor.lnum) ! || draw_color_col ! || win_attr != 0) ! # ifdef FEAT_RIGHTLEFT ! && !wp->w_p_rl ! # endif ! ) ! { ! int rightmost_vcol = 0; ! int i; ! ! if (wp->w_p_cuc) ! rightmost_vcol = wp->w_virtcol; ! if (draw_color_col) ! // determine rightmost colorcolumn to possibly draw ! for (i = 0; color_cols[i] >= 0; ++i) ! if (rightmost_vcol < color_cols[i]) ! rightmost_vcol = color_cols[i]; ! ! while (col < wp->w_width) ! { ! ScreenLines[off] = ' '; ! if (enc_utf8) ! ScreenLinesUC[off] = 0; ! ScreenCols[off] = MAXCOL; ! ++col; ! if (draw_color_col) ! draw_color_col = advance_color_col(VCOL_HLC, ! &color_cols); ! ! if (wp->w_p_cuc && VCOL_HLC == (long)wp->w_virtcol) ! ScreenAttrs[off++] = HL_ATTR(HLF_CUC); ! else if (draw_color_col && VCOL_HLC == *color_cols) ! ScreenAttrs[off++] = HL_ATTR(HLF_MC); ! else ! ScreenAttrs[off++] = win_attr; ! ! if (VCOL_HLC >= rightmost_vcol && win_attr == 0) ! break; ! ! ++vcol; ! } ! } ! #endif ! ! screen_line(wp, screen_row, wp->w_wincol, col, ! wp->w_width, screen_line_flags); ! row++; // Update w_cline_height and w_cline_folded if the cursor line was // updated (saves a call to plines() later). if (wp == curwin && lnum == curwin->w_cursor.lnum) { curwin->w_cline_row = startrow; ! curwin->w_cline_height = row - startrow; #ifdef FEAT_FOLDING curwin->w_cline_folded = FALSE; #endif curwin->w_valid |= (VALID_CHEIGHT|VALID_CROW); } - break; } --- 3063,3103 ---- (long)(ptr - line), &char_attr); } #endif ! ScreenAttrs[wlv.off] = char_attr; ! ScreenCols[wlv.off] = MAXCOL; #ifdef FEAT_RIGHTLEFT if (wp->w_p_rl) { ! --wlv.col; ! --wlv.off; } else #endif { ! ++wlv.col; ! ++wlv.off; } ! ++wlv.vcol; ! wlv.eol_hl_off = 1; } } // At end of the text line. if (c == NUL) { ! draw_screen_line(wp, &wlv); // Update w_cline_height and w_cline_folded if the cursor line was // updated (saves a call to plines() later). if (wp == curwin && lnum == curwin->w_cursor.lnum) { curwin->w_cline_row = startrow; ! curwin->w_cline_height = wlv.row - startrow; #ifdef FEAT_FOLDING curwin->w_cline_folded = FALSE; #endif curwin->w_valid |= (VALID_CHEIGHT|VALID_CROW); } break; } *************** *** 3040,3054 **** #endif && ( #ifdef FEAT_RIGHTLEFT ! wp->w_p_rl ? col == 0 : #endif ! col == wp->w_width - 1) && (*ptr != NUL || (wp->w_p_list && lcs_eol_one > 0) || (n_extra && (c_extra != NUL || *p_extra != NUL)))) { c = wp->w_lcs_chars.ext; ! char_attr = hl_combine_attr(win_attr, HL_ATTR(HLF_AT)); mb_c = c; if (enc_utf8 && utf_char2len(c) > 1) { --- 3112,3126 ---- #endif && ( #ifdef FEAT_RIGHTLEFT ! wp->w_p_rl ? wlv.col == 0 : #endif ! wlv.col == wp->w_width - 1) && (*ptr != NUL || (wp->w_p_list && lcs_eol_one > 0) || (n_extra && (c_extra != NUL || *p_extra != NUL)))) { c = wp->w_lcs_chars.ext; ! char_attr = hl_combine_attr(wlv.win_attr, HL_ATTR(HLF_AT)); mb_c = c; if (enc_utf8 && utf_char2len(c) > 1) { *************** *** 3062,3069 **** #ifdef FEAT_SYN_HL // advance to the next 'colorcolumn' ! if (draw_color_col) ! draw_color_col = advance_color_col(VCOL_HLC, &color_cols); // Highlight the cursor column if 'cursorcolumn' is set. But don't // highlight the cursor position itself. --- 3134,3141 ---- #ifdef FEAT_SYN_HL // advance to the next 'colorcolumn' ! if (wlv.draw_color_col) ! wlv.draw_color_col = advance_color_col(VCOL_HLC, &wlv.color_cols); // Highlight the cursor column if 'cursorcolumn' is set. But don't // highlight the cursor position itself. *************** *** 3087,3093 **** vcol_save_attr = char_attr; char_attr = hl_combine_attr(char_attr, HL_ATTR(HLF_CUC)); } ! else if (draw_color_col && VCOL_HLC == *color_cols) { vcol_save_attr = char_attr; char_attr = hl_combine_attr(char_attr, HL_ATTR(HLF_MC)); --- 3159,3165 ---- vcol_save_attr = char_attr; char_attr = hl_combine_attr(char_attr, HL_ATTR(HLF_CUC)); } ! else if (wlv.draw_color_col && VCOL_HLC == *wlv.color_cols) { vcol_save_attr = char_attr; char_attr = hl_combine_attr(char_attr, HL_ATTR(HLF_MC)); *************** *** 3097,3103 **** // Store character to be displayed. // Skip characters that are left of the screen for 'nowrap'. ! vcol_prev = vcol; if (draw_state < WL_LINE || n_skip <= 0) { // Store the character. --- 3169,3175 ---- // Store character to be displayed. // Skip characters that are left of the screen for 'nowrap'. ! vcol_prev = wlv.vcol; if (draw_state < WL_LINE || n_skip <= 0) { // Store the character. *************** *** 3105,3120 **** if (has_mbyte && wp->w_p_rl && (*mb_char2cells)(mb_c) > 1) { // A double-wide character is: put first half in left cell. ! --off; ! --col; } #endif ! ScreenLines[off] = c; if (enc_dbcs == DBCS_JPNU) { if ((mb_c & 0xff00) == 0x8e00) ! ScreenLines[off] = 0x8e; ! ScreenLines2[off] = mb_c & 0xff; } else if (enc_utf8) { --- 3177,3192 ---- if (has_mbyte && wp->w_p_rl && (*mb_char2cells)(mb_c) > 1) { // A double-wide character is: put first half in left cell. ! --wlv.off; ! --wlv.col; } #endif ! ScreenLines[wlv.off] = c; if (enc_dbcs == DBCS_JPNU) { if ((mb_c & 0xff00) == 0x8e00) ! ScreenLines[wlv.off] = 0x8e; ! ScreenLines2[wlv.off] = mb_c & 0xff; } else if (enc_utf8) { *************** *** 3122,3203 **** { int i; ! ScreenLinesUC[off] = mb_c; if ((c & 0xff) == 0) ! ScreenLines[off] = 0x80; // avoid storing zero for (i = 0; i < Screen_mco; ++i) { ! ScreenLinesC[i][off] = u8cc[i]; if (u8cc[i] == 0) break; } } else ! ScreenLinesUC[off] = 0; } if (multi_attr) { ! ScreenAttrs[off] = multi_attr; multi_attr = 0; } else ! ScreenAttrs[off] = char_attr; ! ScreenCols[off] = (colnr_T)(prev_ptr - line); if (has_mbyte && (*mb_char2cells)(mb_c) > 1) { // Need to fill two screen columns. ! ++off; ! ++col; if (enc_utf8) // UTF-8: Put a 0 in the second screen char. ! ScreenLines[off] = 0; else // DBCS: Put second byte in the second screen char. ! ScreenLines[off] = mb_c & 0xff; if (draw_state > WL_NR #ifdef FEAT_DIFF && filler_todo <= 0 #endif ) ! ++vcol; // When "tocol" is halfway a character, set it to the end of // the character, otherwise highlighting won't stop. ! if (tocol == vcol) ++tocol; ! ScreenCols[off] = (colnr_T)(prev_ptr - line); #ifdef FEAT_RIGHTLEFT if (wp->w_p_rl) { // now it's time to backup one cell ! --off; ! --col; } #endif } #ifdef FEAT_RIGHTLEFT if (wp->w_p_rl) { ! --off; ! --col; } else #endif { ! ++off; ! ++col; } } #ifdef FEAT_CONCEAL else if (wp->w_p_cole > 0 && is_concealing) { --n_skip; ! ++vcol_off; if (n_extra > 0) ! vcol_off += n_extra; if (wp->w_p_wrap) { // Special voodoo required if 'wrap' is on. --- 3194,3275 ---- { int i; ! ScreenLinesUC[wlv.off] = mb_c; if ((c & 0xff) == 0) ! ScreenLines[wlv.off] = 0x80; // avoid storing zero for (i = 0; i < Screen_mco; ++i) { ! ScreenLinesC[i][wlv.off] = u8cc[i]; if (u8cc[i] == 0) break; } } else ! ScreenLinesUC[wlv.off] = 0; } if (multi_attr) { ! ScreenAttrs[wlv.off] = multi_attr; multi_attr = 0; } else ! ScreenAttrs[wlv.off] = char_attr; ! ScreenCols[wlv.off] = (colnr_T)(prev_ptr - line); if (has_mbyte && (*mb_char2cells)(mb_c) > 1) { // Need to fill two screen columns. ! ++wlv.off; ! ++wlv.col; if (enc_utf8) // UTF-8: Put a 0 in the second screen char. ! ScreenLines[wlv.off] = 0; else // DBCS: Put second byte in the second screen char. ! ScreenLines[wlv.off] = mb_c & 0xff; if (draw_state > WL_NR #ifdef FEAT_DIFF && filler_todo <= 0 #endif ) ! ++wlv.vcol; // When "tocol" is halfway a character, set it to the end of // the character, otherwise highlighting won't stop. ! if (tocol == wlv.vcol) ++tocol; ! ScreenCols[wlv.off] = (colnr_T)(prev_ptr - line); #ifdef FEAT_RIGHTLEFT if (wp->w_p_rl) { // now it's time to backup one cell ! --wlv.off; ! --wlv.col; } #endif } #ifdef FEAT_RIGHTLEFT if (wp->w_p_rl) { ! --wlv.off; ! --wlv.col; } else #endif { ! ++wlv.off; ! ++wlv.col; } } #ifdef FEAT_CONCEAL else if (wp->w_p_cole > 0 && is_concealing) { --n_skip; ! ++wlv.vcol_off; if (n_extra > 0) ! wlv.vcol_off += n_extra; if (wp->w_p_wrap) { // Special voodoo required if 'wrap' is on. *************** *** 3207,3230 **** // take up the same screen space when parts are concealed, // so that cursor line computations aren't messed up. // ! // To avoid the fictitious advance of 'col' causing // trailing junk to be written out of the screen line // we are building, 'boguscols' keeps track of the number // of bad columns we have advanced. if (n_extra > 0) { ! vcol += n_extra; # ifdef FEAT_RIGHTLEFT if (wp->w_p_rl) { ! col -= n_extra; ! boguscols -= n_extra; } else # endif { ! col += n_extra; ! boguscols += n_extra; } n_extra = 0; n_attr = 0; --- 3279,3302 ---- // take up the same screen space when parts are concealed, // so that cursor line computations aren't messed up. // ! // To avoid the fictitious advance of 'wlv.col' causing // trailing junk to be written out of the screen line // we are building, 'boguscols' keeps track of the number // of bad columns we have advanced. if (n_extra > 0) { ! wlv.vcol += n_extra; # ifdef FEAT_RIGHTLEFT if (wp->w_p_rl) { ! wlv.col -= n_extra; ! wlv.boguscols -= n_extra; } else # endif { ! wlv.col += n_extra; ! wlv.boguscols += n_extra; } n_extra = 0; n_attr = 0; *************** *** 3237,3271 **** # ifdef FEAT_RIGHTLEFT if (wp->w_p_rl) { ! --boguscols; ! --col; } else # endif { ! ++boguscols; ! ++col; } } # ifdef FEAT_RIGHTLEFT if (wp->w_p_rl) { ! --boguscols; ! --col; } else # endif { ! ++boguscols; ! ++col; } } else { if (n_extra > 0) { ! vcol += n_extra; n_extra = 0; n_attr = 0; } --- 3309,3343 ---- # ifdef FEAT_RIGHTLEFT if (wp->w_p_rl) { ! --wlv.boguscols; ! --wlv.col; } else # endif { ! ++wlv.boguscols; ! ++wlv.col; } } # ifdef FEAT_RIGHTLEFT if (wp->w_p_rl) { ! --wlv.boguscols; ! --wlv.col; } else # endif { ! ++wlv.boguscols; ! ++wlv.col; } } else { if (n_extra > 0) { ! wlv.vcol += n_extra; n_extra = 0; n_attr = 0; } *************** *** 3276,3289 **** else --n_skip; ! // Only advance the "vcol" when after the 'number' or 'relativenumber' ! // column. if (draw_state > WL_NR #ifdef FEAT_DIFF && filler_todo <= 0 #endif ) ! ++vcol; #ifdef FEAT_SYN_HL if (vcol_save_attr >= 0) --- 3348,3361 ---- else --n_skip; ! // Only advance the "wlv.vcol" when after the 'number' or ! // 'relativenumber' column. if (draw_state > WL_NR #ifdef FEAT_DIFF && filler_todo <= 0 #endif ) ! ++wlv.vcol; #ifdef FEAT_SYN_HL if (vcol_save_attr >= 0) *************** *** 3305,3313 **** // so far. If there is no more to display it is caught above. if (( #ifdef FEAT_RIGHTLEFT ! wp->w_p_rl ? (col < 0) : #endif ! (col >= wp->w_width)) && (draw_state != WL_LINE || *ptr != NUL #ifdef FEAT_DIFF --- 3377,3385 ---- // so far. If there is no more to display it is caught above. if (( #ifdef FEAT_RIGHTLEFT ! wp->w_p_rl ? (wlv.col < 0) : #endif ! (wlv.col >= wp->w_width)) && (draw_state != WL_LINE || *ptr != NUL #ifdef FEAT_DIFF *************** *** 3322,3336 **** ) { #ifdef FEAT_CONCEAL ! screen_line(wp, screen_row, wp->w_wincol, col - boguscols, ! wp->w_width, screen_line_flags); ! boguscols = 0; #else ! screen_line(wp, screen_row, wp->w_wincol, col, ! wp->w_width, screen_line_flags); #endif ! ++row; ! ++screen_row; // When not wrapping and finished diff lines, or when displayed // '$' and highlighting until last column, break here. --- 3394,3409 ---- ) { #ifdef FEAT_CONCEAL ! screen_line(wp, wlv.screen_row, wp->w_wincol, ! wlv.col - wlv.boguscols, ! wp->w_width, wlv.screen_line_flags); ! wlv.boguscols = 0; #else ! screen_line(wp, wlv.screen_row, wp->w_wincol, wlv.col, ! wp->w_width, wlv.screen_line_flags); #endif ! ++wlv.row; ! ++wlv.screen_row; // When not wrapping and finished diff lines, or when displayed // '$' and highlighting until last column, break here. *************** *** 3351,3369 **** #endif ) { ! win_draw_end(wp, '@', ' ', TRUE, row, wp->w_height, HLF_AT); ! draw_vsep_win(wp, row); ! row = endrow; } // When line got too long for screen break here. ! if (row == endrow) { ! ++row; break; } ! if (screen_cur_row == screen_row - 1 #ifdef FEAT_DIFF && filler_todo <= 0 #endif --- 3424,3442 ---- #endif ) { ! win_draw_end(wp, '@', ' ', TRUE, wlv.row, wp->w_height, HLF_AT); ! draw_vsep_win(wp, wlv.row); ! wlv.row = endrow; } // When line got too long for screen break here. ! if (wlv.row == endrow) { ! ++wlv.row; break; } ! if (screen_cur_row == wlv.screen_row - 1 #ifdef FEAT_DIFF && filler_todo <= 0 #endif *************** *** 3373,3379 **** && wp->w_width == Columns) { // Remember that the line wraps, used for modeless copy. ! LineWraps[screen_row - 1] = TRUE; // Special trick to make copy/paste of wrapped lines work with // xterm/screen: write an extra character beyond the end of --- 3446,3452 ---- && wp->w_width == Columns) { // Remember that the line wraps, used for modeless copy. ! LineWraps[wlv.screen_row - 1] = TRUE; // Special trick to make copy/paste of wrapped lines work with // xterm/screen: write an extra character beyond the end of *************** *** 3390,3435 **** && !gui.in_use #endif && !(has_mbyte ! && ((*mb_off2cells)(LineOffset[screen_row], ! LineOffset[screen_row] + screen_Columns) == 2 ! || (*mb_off2cells)(LineOffset[screen_row - 1] ! + (int)Columns - 2, ! LineOffset[screen_row] + screen_Columns) ! == 2))) { // First make sure we are at the end of the screen line, // then output the same character again to let the // terminal know about the wrap. If the terminal doesn't // auto-wrap, we overwrite the character. if (screen_cur_col != wp->w_width) ! screen_char(LineOffset[screen_row - 1] ! + (unsigned)Columns - 1, ! screen_row - 1, (int)(Columns - 1)); // When there is a multi-byte character, just output a // space to keep it simple. if (has_mbyte && MB_BYTE2LEN(ScreenLines[LineOffset[ ! screen_row - 1] + (Columns - 1)]) > 1) out_char(' '); else ! out_char(ScreenLines[LineOffset[screen_row - 1] + (Columns - 1)]); // force a redraw of the first char on the next line ! ScreenAttrs[LineOffset[screen_row]] = (sattr_T)-1; screen_start(); // don't know where cursor is now } } ! col = 0; ! off = (unsigned)(current_ScreenLine - ScreenLines); ! #ifdef FEAT_RIGHTLEFT ! if (wp->w_p_rl) ! { ! col = wp->w_width - 1; // col is not used if breaking! ! off += col; ! } ! #endif // reset the drawing state for the start of a wrapped line draw_state = WL_START; --- 3463,3501 ---- && !gui.in_use #endif && !(has_mbyte ! && ((*mb_off2cells)(LineOffset[wlv.screen_row], ! LineOffset[wlv.screen_row] + screen_Columns) == 2 ! || (*mb_off2cells)( ! LineOffset[wlv.screen_row - 1] ! + (int)Columns - 2, ! LineOffset[wlv.screen_row] ! + screen_Columns) == 2))) { // First make sure we are at the end of the screen line, // then output the same character again to let the // terminal know about the wrap. If the terminal doesn't // auto-wrap, we overwrite the character. if (screen_cur_col != wp->w_width) ! screen_char(LineOffset[wlv.screen_row - 1] ! + (unsigned)Columns - 1, ! wlv.screen_row - 1, (int)(Columns - 1)); // When there is a multi-byte character, just output a // space to keep it simple. if (has_mbyte && MB_BYTE2LEN(ScreenLines[LineOffset[ ! wlv.screen_row - 1] + (Columns - 1)]) > 1) out_char(' '); else ! out_char(ScreenLines[LineOffset[wlv.screen_row - 1] + (Columns - 1)]); // force a redraw of the first char on the next line ! ScreenAttrs[LineOffset[wlv.screen_row]] = (sattr_T)-1; screen_start(); // don't know where cursor is now } } ! win_line_start(wp, &wlv); // reset the drawing state for the start of a wrapped line draw_state = WL_START; *************** *** 3482,3486 **** #endif vim_free(p_extra_free); ! return row; } --- 3548,3552 ---- #endif vim_free(p_extra_free); ! return wlv.row; } *** ../vim-9.0.0150/src/textprop.c 2022-08-05 19:46:44.550471107 +0100 --- src/textprop.c 2022-08-06 13:35:57.990095387 +0100 *************** *** 594,599 **** --- 594,622 ---- return (int)(proplen / sizeof(textprop_T)); } + /* + * Return the number of text properties with "below" alignment in line "lnum". + */ + int + prop_count_below(buf_T *buf, linenr_T lnum) + { + char_u *props; + int count = get_text_props(buf, lnum, &props, FALSE); + int result = 0; + textprop_T prop; + int i; + + if (count == 0) + return 0; + for (i = 0; i < count; ++i) + { + mch_memmove(&prop, props + i * sizeof(prop), sizeof(prop)); + if (prop.tp_col == MAXCOL && (prop.tp_flags & TP_FLAG_ALIGN_BELOW)) + ++result; + } + return result; + } + /** * Return the number of text properties on line "lnum" in the current buffer. * When "only_starting" is true only text properties starting in this line will *** ../vim-9.0.0150/src/proto/textprop.pro 2022-08-05 19:46:44.550471107 +0100 --- src/proto/textprop.pro 2022-08-06 13:35:45.078103582 +0100 *************** *** 4,9 **** --- 4,10 ---- void f_prop_add_list(typval_T *argvars, typval_T *rettv); int prop_add_common(linenr_T start_lnum, colnr_T start_col, dict_T *dict, buf_T *default_buf, typval_T *dict_arg); int get_text_props(buf_T *buf, linenr_T lnum, char_u **props, int will_change); + int prop_count_below(buf_T *buf, linenr_T lnum); int count_props(linenr_T lnum, int only_starting, int last_line); int find_visible_prop(win_T *wp, int type_id, int id, textprop_T *prop, linenr_T *found_lnum); void add_text_props(linenr_T lnum, textprop_T *text_props, int text_prop_count); *** ../vim-9.0.0150/src/misc1.c 2022-07-25 18:13:33.050580738 +0100 --- src/misc1.c 2022-08-06 13:31:56.874231594 +0100 *************** *** 364,372 **** #endif int lines; - if (!wp->w_p_wrap) - return 1; - if (wp->w_width == 0) return 1; --- 364,369 ---- *************** *** 377,383 **** return 1; #endif ! lines = plines_win_nofold(wp, lnum); if (winheight > 0 && lines > wp->w_height) return wp->w_height; return lines; --- 374,389 ---- return 1; #endif ! if (!wp->w_p_wrap) ! lines = 1 ! #ifdef FEAT_PROP_POPUP ! // add a line for each "below" aligned text property ! + prop_count_below(wp->w_buffer, lnum) ! #endif ! ; ! else ! lines = plines_win_nofold(wp, lnum); ! if (winheight > 0 && lines > wp->w_height) return wp->w_height; return lines; *** ../vim-9.0.0150/src/testdir/test_textprop.vim 2022-08-05 21:39:26.956564292 +0100 --- src/testdir/test_textprop.vim 2022-08-06 13:43:08.809783689 +0100 *************** *** 2426,2431 **** --- 2426,2452 ---- call delete('XscriptPropsWithTextAfterWraps') endfunc + func Test_props_with_text_after_nowrap() + CheckRunVimInTerminal + + let lines =<< trim END + set nowrap + call setline(1, ['one', 'two', 'three']) + call prop_type_add('belowprop', #{highlight: 'ErrorMsg'}) + call prop_type_add('anotherprop', #{highlight: 'Search'}) + call prop_add(1, 0, #{type: 'belowprop', text: ' Below the line ', text_align: 'below'}) + call prop_add(2, 0, #{type: 'anotherprop', text: 'another', text_align: 'below'}) + call prop_add(2, 0, #{type: 'belowprop', text: 'One More Here', text_align: 'below'}) + normal G$ + END + call writefile(lines, 'XscriptPropsAfterNowrap') + let buf = RunVimInTerminal('-S XscriptPropsAfterNowrap', #{rows: 8, cols: 60}) + call VerifyScreenDump(buf, 'Test_prop_with_text_after_nowrap_1', {}) + + call StopVimInTerminal(buf) + call delete('XscriptPropsAfterNowrap') + endfunc + func Test_removed_prop_with_text_cleans_up_array() new call setline(1, 'some text here') *** ../vim-9.0.0150/src/testdir/dumps/Test_prop_with_text_after_nowrap_1.dump 2022-08-06 13:46:32.833195928 +0100 --- src/testdir/dumps/Test_prop_with_text_after_nowrap_1.dump 2022-08-06 13:43:12.369780882 +0100 *************** *** 0 **** --- 1,8 ---- + |o+0&#ffffff0|n|e| @56 + | +0#ffffff16#e000002|B|e|l|o|w| |t|h|e| |l|i|n|e| | +0#0000000#ffffff0@43 + |t|w|o| @56 + |a+0&#ffff4012|n|o|t|h|e|r| +0&#ffffff0@52 + |O+0#ffffff16#e000002|n|e| |M|o|r|e| |H|e|r|e| +0#0000000#ffffff0@46 + |t|h|r|e>e| @54 + |~+0#4040ff13&| @58 + | +0#0000000&@41|3|,|5| @10|A|l@1| *** ../vim-9.0.0150/src/version.c 2022-08-06 11:35:24.892762681 +0100 --- src/version.c 2022-08-06 13:45:07.377656910 +0100 *************** *** 737,738 **** --- 737,740 ---- { /* Add new patch number below this line */ + /**/ + 151, /**/ -- hundred-and-one symptoms of being an internet addict: 254. You wake up daily with your keyboard printed on your forehead. /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ /// \\\ \\\ sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ /// \\\ help me help AIDS victims -- http://ICCF-Holland.org ///