Mercurial > vim
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 */ |