vim-patch:9.0.0863: col() and charcol() only work for the current window (#21038)

Problem:    col() and charcol() only work for the current window.
Solution:   Add an optional winid argument. (Yegappan Lakshmanan,
            closes vim/vim#11466, closes vim/vim#11461)

4c8d2f02b3

Cherry-pick test_functions.vim change from patch 8.2.0633.

Co-authored-by: Yegappan Lakshmanan <yegappan@yahoo.com>
This commit is contained in:
zeertzjq
2022-11-13 08:29:05 +08:00
committed by GitHub
parent ec449c27fd
commit 849394e4e2
6 changed files with 87 additions and 12 deletions

View File

@@ -846,9 +846,32 @@ static void f_char2nr(typval_T *argvars, typval_T *rettv, EvalFuncData fptr)
/// otherwise the byte index of the column.
static void get_col(typval_T *argvars, typval_T *rettv, bool charcol)
{
if (tv_check_for_string_or_list_arg(argvars, 0) == FAIL
|| tv_check_for_opt_number_arg(argvars, 1) == FAIL) {
return;
}
switchwin_T switchwin;
bool winchanged = false;
if (argvars[1].v_type != VAR_UNKNOWN) {
// use the window specified in the second argument
tabpage_T *tp;
win_T *wp = win_id2wp_tp((int)tv_get_number(&argvars[1]), &tp);
if (wp == NULL || tp == NULL) {
return;
}
if (switch_win_noblock(&switchwin, wp, tp, true) != OK) {
return;
}
check_cursor();
winchanged = true;
}
colnr_T col = 0;
int fnum = curbuf->b_fnum;
pos_T *fp = var2fpos(&argvars[0], false, &fnum, charcol);
if (fp != NULL && fnum == curbuf->b_fnum) {
if (fp->col == MAXCOL) {
@@ -876,6 +899,10 @@ static void get_col(typval_T *argvars, typval_T *rettv, bool charcol)
}
}
rettv->vval.v_number = col;
if (winchanged) {
restore_win_noblock(&switchwin, true);
}
}
/// "charcol()" function