aboutsummaryrefslogtreecommitdiff
path: root/src/nvim/eval/funcs.c
diff options
context:
space:
mode:
authorzeertzjq <zeertzjq@outlook.com>2023-08-18 08:42:45 +0800
committerGitHub <noreply@github.com>2023-08-18 08:42:45 +0800
commitf8afa8023ee032dfb2aa9a6489f51484fb276732 (patch)
treef1520e2fc6d990bd9cf9876bdf1bf126f5881431 /src/nvim/eval/funcs.c
parent46163ddf5d718c4e749df78ef8e54d0715de6cb9 (diff)
downloadrneovim-f8afa8023ee032dfb2aa9a6489f51484fb276732.tar.gz
rneovim-f8afa8023ee032dfb2aa9a6489f51484fb276732.tar.bz2
rneovim-f8afa8023ee032dfb2aa9a6489f51484fb276732.zip
vim-patch:9.0.1728: missing winid argument for virtcol() (#24770)
Problem: missing winid argument for virtcol() Solution: Add a {winid} argument to virtcol() Other functions col(), charcol() and virtcol2col() support a {winid} argument, so it makes sense for virtcol() to also support than. Also add test for virtcol2col() with 'showbreak' and {winid}. closes: vim/vim#12633 https://github.com/vim/vim/commit/825cf813fa0fddf085fcbd3194781e875320ff63
Diffstat (limited to 'src/nvim/eval/funcs.c')
-rw-r--r--src/nvim/eval/funcs.c27
1 files changed, 25 insertions, 2 deletions
diff --git a/src/nvim/eval/funcs.c b/src/nvim/eval/funcs.c
index e8224671dc..9926530d58 100644
--- a/src/nvim/eval/funcs.c
+++ b/src/nvim/eval/funcs.c
@@ -8748,13 +8748,31 @@ static void f_type(typval_T *argvars, typval_T *rettv, EvalFuncData fptr)
rettv->vval.v_number = n;
}
-/// "virtcol(string, bool)" function
+/// "virtcol({expr}, [, {list} [, {winid}]])" function
static void f_virtcol(typval_T *argvars, typval_T *rettv, EvalFuncData fptr)
{
colnr_T vcol_start = 0;
colnr_T vcol_end = 0;
- int fnum = curbuf->b_fnum;
+ switchwin_T switchwin;
+ bool winchanged = false;
+
+ if (argvars[1].v_type != VAR_UNKNOWN && argvars[2].v_type != VAR_UNKNOWN) {
+ // use the window specified in the third argument
+ tabpage_T *tp;
+ win_T *wp = win_id2wp_tp((int)tv_get_number(&argvars[2]), &tp);
+ if (wp == NULL || tp == NULL) {
+ goto theend;
+ }
+ if (switch_win_noblock(&switchwin, wp, tp, true) != OK) {
+ goto theend;
+ }
+
+ check_cursor();
+ winchanged = true;
+ }
+
+ int fnum = curbuf->b_fnum;
pos_T *fp = var2fpos(&argvars[0], false, &fnum, false);
if (fp != NULL && fp->lnum <= curbuf->b_ml.ml_line_count
&& fnum == curbuf->b_fnum) {
@@ -8772,6 +8790,7 @@ static void f_virtcol(typval_T *argvars, typval_T *rettv, EvalFuncData fptr)
vcol_end++;
}
+theend:
if (argvars[1].v_type != VAR_UNKNOWN && tv_get_bool(&argvars[1])) {
tv_list_alloc_ret(rettv, 2);
tv_list_append_number(rettv->vval.v_list, vcol_start);
@@ -8779,6 +8798,10 @@ static void f_virtcol(typval_T *argvars, typval_T *rettv, EvalFuncData fptr)
} else {
rettv->vval.v_number = vcol_end;
}
+
+ if (winchanged) {
+ restore_win_noblock(&switchwin, true);
+ }
}
/// "visualmode()" function