changeset 31760:f348559ce426 v9.0.1212

patch 9.0.1212: cannot read back what setcellwidths() has done Commit: https://github.com/vim/vim/commit/66bb9ae70f7371456ed76518076d2a344f8ab417 Author: Kota Kato <github@kat0h.com> Date: Tue Jan 17 18:31:56 2023 +0000 patch 9.0.1212: cannot read back what setcellwidths() has done Problem: Cannot read back what setcellwidths() has done. Solution: Add getcellwidths(). (Kota Kato, closes https://github.com/vim/vim/issues/11837)
author Bram Moolenaar <Bram@vim.org>
date Tue, 17 Jan 2023 19:45:05 +0100
parents e68d2e63c218
children a89d17654b30
files runtime/doc/builtin.txt runtime/doc/usr_41.txt src/evalfunc.c src/mbyte.c src/proto/mbyte.pro src/testdir/test_utf8.vim src/version.c
diffstat 7 files changed, 54 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/runtime/doc/builtin.txt
+++ b/runtime/doc/builtin.txt
@@ -211,6 +211,7 @@ getbufline({buf}, {lnum} [, {end}])
 getbufoneline({buf}, {lnum})	String	line {lnum} of buffer {buf}
 getbufvar({buf}, {varname} [, {def}])
 				any	variable {varname} in buffer {buf}
+getcellwidths()			List	get character cell width overrides
 getchangelist([{buf}])		List	list of change list items
 getchar([expr])			Number or String
 					get one character from the user
@@ -3262,6 +3263,13 @@ getbufvar({buf}, {varname} [, {def}])			
 <		Can also be used as a |method|: >
 			GetBufnr()->getbufvar(varname)
 <
+getcellwidths()						*getcellwidths()*
+		Returns a |List| of cell widths of character ranges overridden
+		by |setcellwidths()|.  The format is equal to the argument of
+		|setcellwidths()|.  If no character ranges have their cell
+		widths overridden, an empty List is returned.
+
+
 getchangelist([{buf}])					*getchangelist()*
 		Returns the |changelist| for the buffer {buf}. For the use
 		of {buf}, see |bufname()| above. If buffer {buf} doesn't
@@ -9969,7 +9977,7 @@ typename({expr})					*typename()*
 		Return a string representation of the type of {expr}.
 		Example: >
 			echo typename([1, 2, 3])
-			list<number>
+<			list<number> ~
 
 
 undofile({name})					*undofile()*
--- a/runtime/doc/usr_41.txt
+++ b/runtime/doc/usr_41.txt
@@ -757,6 +757,7 @@ String manipulation:					*string-functio
 	strwidth()		size of string when displayed
 	strdisplaywidth()	size of string when displayed, deals with tabs
 	setcellwidths()		set character cell width overrides
+	getcellwidths()		get character cell width overrides
 	substitute()		substitute a pattern match with a string
 	submatch()		get a specific match in ":s" and substitute()
 	strpart()		get part of a string using byte index
--- a/src/evalfunc.c
+++ b/src/evalfunc.c
@@ -1953,6 +1953,8 @@ static funcentry_T global_functions[] =
 			ret_string,	    f_getbufoneline},
     {"getbufvar",	2, 3, FEARG_1,	    arg3_buffer_string_any,
 			ret_any,	    f_getbufvar},
+    {"getcellwidths",	0, 0, 0,	    NULL,
+			ret_list_any,	    f_getcellwidths},
     {"getchangelist",	0, 1, FEARG_1,	    arg1_buffer,
 			ret_list_any,	    f_getchangelist},
     {"getchar",		0, 1, 0,	    arg1_bool,
--- a/src/mbyte.c
+++ b/src/mbyte.c
@@ -5746,6 +5746,25 @@ f_setcellwidths(typval_T *argvars, typva
 }
 
     void
+f_getcellwidths(typval_T *argvars UNUSED, typval_T *rettv)
+{
+    if (rettv_list_alloc(rettv) == FAIL)
+	return;
+
+    for (size_t i = 0; i < cw_table_size; i++)
+    {
+	list_T *entry = list_alloc();
+	if (entry == NULL)
+	    break;
+	list_append_number(entry, (varnumber_T)cw_table[i].first);
+	list_append_number(entry, (varnumber_T)cw_table[i].last);
+	list_append_number(entry, (varnumber_T)cw_table[i].width);
+
+	list_append_list(rettv->vval.v_list, entry);
+    }
+}
+
+    void
 f_charclass(typval_T *argvars, typval_T *rettv UNUSED)
 {
     if (check_for_string_arg(argvars, 0) == FAIL
--- a/src/proto/mbyte.pro
+++ b/src/proto/mbyte.pro
@@ -86,5 +86,6 @@ int convert_input_safe(char_u *ptr, int 
 char_u *string_convert(vimconv_T *vcp, char_u *ptr, int *lenp);
 char_u *string_convert_ext(vimconv_T *vcp, char_u *ptr, int *lenp, int *unconvlenp);
 void f_setcellwidths(typval_T *argvars, typval_T *rettv);
+void f_getcellwidths(typval_T *argvars, typval_T *rettv);
 void f_charclass(typval_T *argvars, typval_T *rettv);
 /* vim: set ft=c : */
--- a/src/testdir/test_utf8.vim
+++ b/src/testdir/test_utf8.vim
@@ -199,6 +199,26 @@ func Test_setcellwidths()
   call setcellwidths([])
 endfunc
 
+func Test_getcellwidths()
+  call setcellwidths([])
+  call assert_equal([], getcellwidths())
+
+  let widthlist = [
+        \ [0x1330, 0x1330, 2],
+        \ [9999, 10000, 1],
+        \ [0x1337, 0x1339, 2],
+        \]
+  let widthlistsorted = [
+        \ [0x1330, 0x1330, 2],
+        \ [0x1337, 0x1339, 2],
+        \ [9999, 10000, 1],
+        \]
+  call setcellwidths(widthlist)
+  call assert_equal(widthlistsorted, getcellwidths())
+
+  call setcellwidths([])
+endfunc
+
 func Test_setcellwidths_dump()
   CheckRunVimInTerminal
 
--- a/src/version.c
+++ b/src/version.c
@@ -696,6 +696,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    1212,
+/**/
     1211,
 /**/
     1210,