comparison src/evalfunc.c @ 32830:6e53cf9745f4 v9.0.1728

patch 9.0.1728: missing winid argument for virtcol() Commit: https://github.com/vim/vim/commit/825cf813fa0fddf085fcbd3194781e875320ff63 Author: zeertzjq <zeertzjq@outlook.com> Date: Thu Aug 17 22:55:25 2023 +0200 patch 9.0.1728: missing winid argument for virtcol() 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: #12633 Signed-off-by: Christian Brabandt <cb@256bit.org> Co-authored-by: zeertzjq <zeertzjq@outlook.com>
author Christian Brabandt <cb@256bit.org>
date Thu, 17 Aug 2023 23:00:06 +0200
parents 656c54d276d5
children a39314fa9495
comparison
equal deleted inserted replaced
32829:80e4411ad2e0 32830:6e53cf9745f4
1068 static argcheck_T arg2_string_chan_or_job[] = {arg_string, arg_chan_or_job}; 1068 static argcheck_T arg2_string_chan_or_job[] = {arg_string, arg_chan_or_job};
1069 static argcheck_T arg2_string_dict[] = {arg_string, arg_dict_any}; 1069 static argcheck_T arg2_string_dict[] = {arg_string, arg_dict_any};
1070 static argcheck_T arg2_string_list_number[] = {arg_string, arg_list_number}; 1070 static argcheck_T arg2_string_list_number[] = {arg_string, arg_list_number};
1071 static argcheck_T arg2_string_number[] = {arg_string, arg_number}; 1071 static argcheck_T arg2_string_number[] = {arg_string, arg_number};
1072 static argcheck_T arg2_string_or_list_dict[] = {arg_string_or_list_any, arg_dict_any}; 1072 static argcheck_T arg2_string_or_list_dict[] = {arg_string_or_list_any, arg_dict_any};
1073 static argcheck_T arg2_string_or_list_bool[] = {arg_string_or_list_any, arg_bool};
1074 static argcheck_T arg2_string_or_list_number[] = {arg_string_or_list_any, arg_number}; 1073 static argcheck_T arg2_string_or_list_number[] = {arg_string_or_list_any, arg_number};
1075 static argcheck_T arg2_string_string_or_number[] = {arg_string, arg_string_or_nr}; 1074 static argcheck_T arg2_string_string_or_number[] = {arg_string, arg_string_or_nr};
1076 static argcheck_T arg3_any_list_dict[] = {NULL, arg_list_any, arg_dict_any}; 1075 static argcheck_T arg3_any_list_dict[] = {NULL, arg_list_any, arg_dict_any};
1077 static argcheck_T arg3_buffer_lnum_lnum[] = {arg_buffer, arg_lnum, arg_lnum}; 1076 static argcheck_T arg3_buffer_lnum_lnum[] = {arg_buffer, arg_lnum, arg_lnum};
1078 static argcheck_T arg3_buffer_number_number[] = {arg_buffer, arg_number, arg_number}; 1077 static argcheck_T arg3_buffer_number_number[] = {arg_buffer, arg_number, arg_number};
1092 static argcheck_T arg3_string_any_string[] = {arg_string, NULL, arg_string}; 1091 static argcheck_T arg3_string_any_string[] = {arg_string, NULL, arg_string};
1093 static argcheck_T arg3_string_bool_bool[] = {arg_string, arg_bool, arg_bool}; 1092 static argcheck_T arg3_string_bool_bool[] = {arg_string, arg_bool, arg_bool};
1094 static argcheck_T arg3_string_number_bool[] = {arg_string, arg_number, arg_bool}; 1093 static argcheck_T arg3_string_number_bool[] = {arg_string, arg_number, arg_bool};
1095 static argcheck_T arg3_string_number_number[] = {arg_string, arg_number, arg_number}; 1094 static argcheck_T arg3_string_number_number[] = {arg_string, arg_number, arg_number};
1096 static argcheck_T arg3_string_or_dict_bool_dict[] = {arg_string_or_dict_any, arg_bool, arg_dict_any}; 1095 static argcheck_T arg3_string_or_dict_bool_dict[] = {arg_string_or_dict_any, arg_bool, arg_dict_any};
1096 static argcheck_T arg3_string_or_list_bool_number[] = {arg_string_or_list_any, arg_bool, arg_number};
1097 static argcheck_T arg3_string_string_bool[] = {arg_string, arg_string, arg_bool}; 1097 static argcheck_T arg3_string_string_bool[] = {arg_string, arg_string, arg_bool};
1098 static argcheck_T arg3_string_string_dict[] = {arg_string, arg_string, arg_dict_any}; 1098 static argcheck_T arg3_string_string_dict[] = {arg_string, arg_string, arg_dict_any};
1099 static argcheck_T arg3_string_string_number[] = {arg_string, arg_string, arg_number}; 1099 static argcheck_T arg3_string_string_number[] = {arg_string, arg_string, arg_number};
1100 static argcheck_T arg4_number_number_string_any[] = {arg_number, arg_number, arg_string, NULL}; 1100 static argcheck_T arg4_number_number_string_any[] = {arg_number, arg_number, arg_string, NULL};
1101 static argcheck_T arg4_string_string_any_string[] = {arg_string, arg_string, NULL, arg_string}; 1101 static argcheck_T arg4_string_string_any_string[] = {arg_string, arg_string, NULL, arg_string};
1567 ret_virtcol(int argcount, 1567 ret_virtcol(int argcount,
1568 type2_T *argtypes UNUSED, 1568 type2_T *argtypes UNUSED,
1569 type_T **decl_type) 1569 type_T **decl_type)
1570 { 1570 {
1571 // Assume that if the second argument is passed it's non-zero 1571 // Assume that if the second argument is passed it's non-zero
1572 if (argcount == 2) 1572 if (argcount > 1)
1573 { 1573 {
1574 *decl_type = &t_list_any; 1574 *decl_type = &t_list_any;
1575 return &t_list_number; 1575 return &t_list_number;
1576 } 1576 }
1577 return &t_number; 1577 return &t_number;
2804 ret_first_arg, f_uniq}, 2804 ret_first_arg, f_uniq},
2805 {"utf16idx", 2, 4, FEARG_1, arg4_string_number_bool_bool, 2805 {"utf16idx", 2, 4, FEARG_1, arg4_string_number_bool_bool,
2806 ret_number, f_utf16idx}, 2806 ret_number, f_utf16idx},
2807 {"values", 1, 1, FEARG_1, arg1_dict_any, 2807 {"values", 1, 1, FEARG_1, arg1_dict_any,
2808 ret_list_member, f_values}, 2808 ret_list_member, f_values},
2809 {"virtcol", 1, 2, FEARG_1, arg2_string_or_list_bool, 2809 {"virtcol", 1, 3, FEARG_1, arg3_string_or_list_bool_number,
2810 ret_virtcol, f_virtcol}, 2810 ret_virtcol, f_virtcol},
2811 {"virtcol2col", 3, 3, FEARG_1, arg3_number, 2811 {"virtcol2col", 3, 3, FEARG_1, arg3_number,
2812 ret_number, f_virtcol2col}, 2812 ret_number, f_virtcol2col},
2813 {"visualmode", 0, 1, 0, arg1_bool, 2813 {"visualmode", 0, 1, 0, arg1_bool,
2814 ret_string, f_visualmode}, 2814 ret_string, f_visualmode},
10735 } 10735 }
10736 rettv->vval.v_number = n; 10736 rettv->vval.v_number = n;
10737 } 10737 }
10738 10738
10739 /* 10739 /*
10740 * "virtcol(string, bool)" function 10740 * "virtcol({expr}, [, {list} [, {winid}]])" function
10741 */ 10741 */
10742 static void 10742 static void
10743 f_virtcol(typval_T *argvars, typval_T *rettv) 10743 f_virtcol(typval_T *argvars, typval_T *rettv)
10744 { 10744 {
10745 colnr_T vcol_start = 0; 10745 colnr_T vcol_start = 0;
10746 colnr_T vcol_end = 0; 10746 colnr_T vcol_end = 0;
10747 pos_T *fp; 10747 pos_T *fp;
10748 int fnum = curbuf->b_fnum; 10748 switchwin_T switchwin;
10749 int winchanged = FALSE;
10749 int len; 10750 int len;
10750 10751
10751 if (in_vim9script() 10752 if (in_vim9script()
10752 && (check_for_string_or_list_arg(argvars, 0) == FAIL 10753 && (check_for_string_or_list_arg(argvars, 0) == FAIL
10753 || (argvars[1].v_type != VAR_UNKNOWN 10754 || (argvars[1].v_type != VAR_UNKNOWN
10754 && check_for_bool_arg(argvars, 1) == FAIL))) 10755 && (check_for_bool_arg(argvars, 1) == FAIL
10755 return; 10756 || check_for_opt_number_arg(argvars, 2) == FAIL))))
10756 10757 return;
10758
10759 if (argvars[1].v_type != VAR_UNKNOWN && argvars[2].v_type != VAR_UNKNOWN)
10760 {
10761 tabpage_T *tp;
10762 win_T *wp;
10763
10764 // use the window specified in the third argument
10765 wp = win_id2wp_tp((int)tv_get_number(&argvars[2]), &tp);
10766 if (wp == NULL || tp == NULL)
10767 goto theend;
10768
10769 if (switch_win_noblock(&switchwin, wp, tp, TRUE) != OK)
10770 goto theend;
10771
10772 check_cursor();
10773 winchanged = TRUE;
10774 }
10775
10776 int fnum = curbuf->b_fnum;
10757 fp = var2fpos(&argvars[0], FALSE, &fnum, FALSE); 10777 fp = var2fpos(&argvars[0], FALSE, &fnum, FALSE);
10758 if (fp != NULL && fp->lnum <= curbuf->b_ml.ml_line_count 10778 if (fp != NULL && fp->lnum <= curbuf->b_ml.ml_line_count
10759 && fnum == curbuf->b_fnum) 10779 && fnum == curbuf->b_fnum)
10760 { 10780 {
10761 // Limit the column to a valid value, getvvcol() doesn't check. 10781 // Limit the column to a valid value, getvvcol() doesn't check.
10770 getvvcol(curwin, fp, &vcol_start, NULL, &vcol_end); 10790 getvvcol(curwin, fp, &vcol_start, NULL, &vcol_end);
10771 ++vcol_start; 10791 ++vcol_start;
10772 ++vcol_end; 10792 ++vcol_end;
10773 } 10793 }
10774 10794
10795 theend:
10775 if (argvars[1].v_type != VAR_UNKNOWN && tv_get_bool(&argvars[1])) 10796 if (argvars[1].v_type != VAR_UNKNOWN && tv_get_bool(&argvars[1]))
10776 { 10797 {
10777 if (rettv_list_alloc(rettv) == OK) 10798 if (rettv_list_alloc(rettv) == OK)
10778 { 10799 {
10779 list_append_number(rettv->vval.v_list, vcol_start); 10800 list_append_number(rettv->vval.v_list, vcol_start);
10782 else 10803 else
10783 rettv->vval.v_number = 0; 10804 rettv->vval.v_number = 0;
10784 } 10805 }
10785 else 10806 else
10786 rettv->vval.v_number = vcol_end; 10807 rettv->vval.v_number = vcol_end;
10808
10809 if (winchanged)
10810 restore_win_noblock(&switchwin, TRUE);
10787 } 10811 }
10788 10812
10789 /* 10813 /*
10790 * "visualmode()" function 10814 * "visualmode()" function
10791 */ 10815 */