if (pos->lnum >= wp->w_topline && pos->lnum <= wp->w_botline)
{
- colnr_T off;
- colnr_T col;
- int width;
-
- row = plines_m_win(wp, wp->w_topline, pos->lnum - 1) + 1;
- getvcol(wp, pos, &scol, &ccol, &ecol);
-
- // similar to what is done in validate_cursor_col()
- col = scol;
- off = win_col_off(wp);
- col += off;
- width = wp->w_width - off + win_col_off2(wp);
+ colnr_T off;
+ colnr_T col;
+ int width;
+ linenr_T lnum = pos->lnum;
+#ifdef FEAT_FOLDING
+ int is_folded;
- // long line wrapping, adjust row
- if (wp->w_p_wrap
- && col >= (colnr_T)wp->w_width
- && width > 0)
- {
- // use same formula as what is used in curs_columns()
- rowoff = ((col - wp->w_width) / width + 1);
- col -= rowoff * width;
- }
- col -= wp->w_leftcol;
- if (col >= wp->w_width)
- col = -1;
- if (col >= 0 && row + rowoff <= wp->w_height)
+ is_folded = hasFoldingWin(wp, lnum, &lnum, NULL, TRUE, NULL);
+#endif
+ row = plines_m_win(wp, wp->w_topline, lnum - 1) + 1;
+#ifdef FEAT_FOLDING
+ if (is_folded)
{
- coloff = col - scol + wp->w_wincol + 1;
row += W_WINROW(wp);
+ coloff = wp->w_wincol + 1;
}
else
- // character is left, right or below of the window
- row = rowoff = scol = ccol = ecol = 0;
+#endif
+ {
+ getvcol(wp, pos, &scol, &ccol, &ecol);
+
+ // similar to what is done in validate_cursor_col()
+ col = scol;
+ off = win_col_off(wp);
+ col += off;
+ width = wp->w_width - off + win_col_off2(wp);
+
+ // long line wrapping, adjust row
+ if (wp->w_p_wrap
+ && col >= (colnr_T)wp->w_width
+ && width > 0)
+ {
+ // use same formula as what is used in curs_columns()
+ rowoff = ((col - wp->w_width) / width + 1);
+ col -= rowoff * width;
+ }
+ col -= wp->w_leftcol;
+ if (col >= wp->w_width)
+ col = -1;
+ if (col >= 0 && row + rowoff <= wp->w_height)
+ {
+ coloff = col - scol + wp->w_wincol + 1;
+ row += W_WINROW(wp);
+ }
+ else
+ // character is left, right or below of the window
+ row = rowoff = scol = ccol = ecol = 0;
+ }
}
*rowp = row + rowoff;
*scolp = scol + coloff;
" Tests for cursor() and other functions that get/set the cursor position
+source check.vim
+
func Test_wrong_arguments()
call assert_fails('call cursor(1. 3)', 'E474:')
call assert_fails('call cursor(test_null_list())', 'E474:')
bwipe!
set display&
- call assert_equal({'col': 1, 'row': 1, 'endcol': 1, 'curscol': 1}, screenpos(win_getid(), 1, 1))
+ call assert_equal(#{col: 1, row: 1, endcol: 1, curscol: 1}, screenpos(win_getid(), 1, 1))
nmenu WinBar.TEST :
- call assert_equal({'col': 1, 'row': 2, 'endcol': 1, 'curscol': 1}, screenpos(win_getid(), 1, 1))
+ call assert_equal(#{col: 1, row: 2, endcol: 1, curscol: 1}, screenpos(win_getid(), 1, 1))
nunmenu WinBar.TEST
endfunc
+func Test_screenpos_fold()
+ CheckFeature folding
+
+ enew!
+ call setline(1, range(10))
+ 3,5fold
+ redraw
+ call assert_equal(2, screenpos(1, 2, 1).row)
+ call assert_equal(#{col: 1, row: 3, endcol: 1, curscol: 1}, screenpos(1, 3, 1))
+ call assert_equal(3, screenpos(1, 4, 1).row)
+ call assert_equal(3, screenpos(1, 5, 1).row)
+ call assert_equal(4, screenpos(1, 6, 1).row)
+ bwipe!
+endfunc
+
func Test_screenpos_number()
rightbelow new
rightbelow 73vsplit