Patch 8.2.0815

22 views
Skip to first unread message

Bram Moolenaar

unread,
May 24, 2020, 7:11:52 AM5/24/20
to vim...@googlegroups.com

Patch 8.2.0815
Problem: maparg() does not provide enough information for mapset().
Solution: Add "lhsraw" and "lhsrawalt" items. Drop "simplified"
Files: src/map.c, runtime/doc/eval.txt, src/testdir/test_maparg.vim


*** ../vim-8.2.0814/src/map.c 2020-05-22 20:01:02.424452078 +0200
--- src/map.c 2020-05-23 23:08:02.733121015 +0200
***************
*** 2176,2190 ****
--- 2176,2195 ----
get_maparg(typval_T *argvars, typval_T *rettv, int exact)
{
char_u *keys;
+ char_u *keys_simplified;
char_u *which;
char_u buf[NUMBUFLEN];
char_u *keys_buf = NULL;
+ char_u *alt_keys_buf = NULL;
+ int did_simplify = FALSE;
char_u *rhs;
int mode;
int abbr = FALSE;
int get_dict = FALSE;
mapblock_T *mp;
+ mapblock_T *mp_simplified;
int buffer_local;
+ int flags = REPTERM_FROM_PART | REPTERM_DO_LT;

// return empty string for failure
rettv->v_type = VAR_STRING;
***************
*** 2211,2220 ****

mode = get_map_mode(&which, 0);

! keys = replace_termcodes(keys, &keys_buf,
! REPTERM_FROM_PART | REPTERM_DO_LT, NULL);
! rhs = check_map(keys, mode, exact, FALSE, abbr, &mp, &buffer_local);
! vim_free(keys_buf);

if (!get_dict)
{
--- 2216,2235 ----

mode = get_map_mode(&which, 0);

! keys_simplified = replace_termcodes(keys, &keys_buf, flags, &did_simplify);
! rhs = check_map(keys_simplified, mode, exact, FALSE, abbr,
! &mp, &buffer_local);
! if (did_simplify)
! {
! // When the lhs is being simplified the not-simplified keys are
! // preferred for priting, like in do_map().
! // The "rhs" and "buffer_local" values are not expected to change.
! mp_simplified = mp;
! (void)replace_termcodes(keys, &alt_keys_buf,
! flags | REPTERM_NO_SIMPLIFY, NULL);
! rhs = check_map(alt_keys_buf, mode, exact, FALSE, abbr, &mp,
! &buffer_local);
! }

if (!get_dict)
{
***************
*** 2236,2241 ****
--- 2251,2261 ----
dict_T *dict = rettv->vval.v_dict;

dict_add_string(dict, "lhs", lhs);
+ vim_free(lhs);
+ dict_add_string(dict, "lhsraw", mp->m_keys);
+ if (did_simplify)
+ // Also add the value for the simplified entry.
+ dict_add_string(dict, "lhsrawalt", mp_simplified->m_keys);
dict_add_string(dict, "rhs", mp->m_orig_str);
dict_add_number(dict, "noremap", mp->m_noremap ? 1L : 0L);
dict_add_number(dict, "script", mp->m_noremap == REMAP_SCRIPT
***************
*** 2247,2257 ****
dict_add_number(dict, "buffer", (long)buffer_local);
dict_add_number(dict, "nowait", mp->m_nowait ? 1L : 0L);
dict_add_string(dict, "mode", mapmode);
- dict_add_number(dict, "simplified", mp->m_simplified);

- vim_free(lhs);
vim_free(mapmode);
}
}

/*
--- 2267,2278 ----
dict_add_number(dict, "buffer", (long)buffer_local);
dict_add_number(dict, "nowait", mp->m_nowait ? 1L : 0L);
dict_add_string(dict, "mode", mapmode);

vim_free(mapmode);
}
+
+ vim_free(keys_buf);
+ vim_free(alt_keys_buf);
}

/*
***************
*** 2260,2266 ****
void
f_mapset(typval_T *argvars, typval_T *rettv UNUSED)
{
- char_u *keys;
char_u *keys_buf = NULL;
char_u *which;
int mode;
--- 2281,2286 ----
***************
*** 2268,2273 ****
--- 2288,2295 ----
int is_abbr;
dict_T *d;
char_u *lhs;
+ char_u *lhsraw;
+ char_u *lhsrawalt;
char_u *rhs;
char_u *orig_rhs;
char_u *arg_buf = NULL;
***************
*** 2279,2285 ****
mapblock_T **map_table = maphash;
mapblock_T **abbr_table = &first_abbr;
int nowait;
- int simplified;
char_u *arg;

which = tv_get_string_buf_chk(&argvars[0], buf);
--- 2301,2306 ----
***************
*** 2295,2309 ****

// Get the values in the same order as above in get_maparg().
lhs = dict_get_string(d, (char_u *)"lhs", FALSE);
! if (lhs == NULL)
! {
! emsg(_("E99: lhs entry missing in mapset() dict argument"));
! return;
! }
rhs = dict_get_string(d, (char_u *)"rhs", FALSE);
! if (rhs == NULL)
{
! emsg(_("E99: rhs entry missing in mapset() dict argument"));
return;
}
orig_rhs = rhs;
--- 2316,2327 ----

// Get the values in the same order as above in get_maparg().
lhs = dict_get_string(d, (char_u *)"lhs", FALSE);
! lhsraw = dict_get_string(d, (char_u *)"lhsraw", FALSE);
! lhsrawalt = dict_get_string(d, (char_u *)"lhsrawalt", FALSE);
rhs = dict_get_string(d, (char_u *)"rhs", FALSE);
! if (lhs == NULL || lhsraw == NULL || rhs == NULL)
{
! emsg(_("E460: entries missing in mapset() dict argument"));
return;
}
orig_rhs = rhs;
***************
*** 2324,2330 ****
}
nowait = dict_get_number(d, (char_u *)"nowait") != 0;
// mode from the dict is not used
- simplified = dict_get_number(d, (char_u *)"simplified") != 0;

// Delete any existing mapping for this lhs and mode.
arg = vim_strsave(lhs);
--- 2342,2347 ----
***************
*** 2333,2342 ****
do_map(1, arg, mode, is_abbr);
vim_free(arg);

! keys = replace_termcodes(lhs, &keys_buf,
! REPTERM_FROM_PART | REPTERM_DO_LT, NULL);
! (void)map_add(map_table, abbr_table, keys, rhs, orig_rhs, noremap,
! nowait, silent, mode, is_abbr, expr, sid, lnum, simplified);
vim_free(keys_buf);
vim_free(arg_buf);
}
--- 2350,2360 ----
do_map(1, arg, mode, is_abbr);
vim_free(arg);

! (void)map_add(map_table, abbr_table, lhsraw, rhs, orig_rhs, noremap,
! nowait, silent, mode, is_abbr, expr, sid, lnum, 0);
! if (lhsrawalt != NULL)
! (void)map_add(map_table, abbr_table, lhsrawalt, rhs, orig_rhs, noremap,
! nowait, silent, mode, is_abbr, expr, sid, lnum, 1);
vim_free(keys_buf);
vim_free(arg_buf);
}
*** ../vim-8.2.0814/runtime/doc/eval.txt 2020-05-22 13:09:55.316226075 +0200
--- runtime/doc/eval.txt 2020-05-23 22:16:19.292833238 +0200
***************
*** 2582,2588 ****
rhs of mapping {name} in mode {mode}
mapcheck({name} [, {mode} [, {abbr}]])
String check for mappings matching {name}
! mapset({name}, {mode}, {abbr}, {dict}
none restore mapping from |maparg()| result
match({expr}, {pat} [, {start} [, {count}]])
Number position where {pat} matches in {expr}
--- 2586,2592 ----
rhs of mapping {name} in mode {mode}
mapcheck({name} [, {mode} [, {abbr}]])
String check for mappings matching {name}
! mapset({mode}, {abbr}, {dict})
none restore mapping from |maparg()| result
match({expr}, {pat} [, {start} [, {count}]])
Number position where {pat} matches in {expr}
***************
*** 6820,6826 ****
When {dict} is there and it is |TRUE| return a dictionary
containing all the information of the mapping with the
following items:
! "lhs" The {lhs} of the mapping.
"rhs" The {rhs} of the mapping as typed.
"silent" 1 for a |:map-silent| mapping, else 0.
"noremap" 1 if the {rhs} of the mapping is not remappable.
--- 6830,6839 ----
When {dict} is there and it is |TRUE| return a dictionary
containing all the information of the mapping with the
following items:
! "lhs" The {lhs} of the mapping as it would be typed
! "lhsraw" The {lhs} of the mapping as raw bytes
! "lhsrawalt" The {lhs} of the mapping as raw bytes, alternate
! form, only present when it differs from "lhsraw"
"rhs" The {rhs} of the mapping as typed.
"silent" 1 for a |:map-silent| mapping, else 0.
"noremap" 1 if the {rhs} of the mapping is not remappable.
***************
*** 6838,6844 ****
"lnum" The line number in "sid", zero if unknown.
"nowait" Do not wait for other, longer mappings.
(|:map-<nowait>|).
- "simplified"

The dictionary can be used to restore a mapping with
|mapset()|.
--- 6851,6856 ----
***************
*** 6888,6897 ****
Can also be used as a |method|: >
GetKey()->mapcheck('n')

mapset({mode}, {abbr}, {dict}) *mapset()*
Restore a mapping from a dictionary returned by |maparg()|.
! {name}, {mode} and {abbr} should be the same as for the call
! to |maparg()|.
{mode} is used to define the mode in which the mapping is set,
not the "mode" entry in {dict}.
Example for saving and restoring a mapping: >
--- 6900,6910 ----
Can also be used as a |method|: >
GetKey()->mapcheck('n')

+
mapset({mode}, {abbr}, {dict}) *mapset()*
Restore a mapping from a dictionary returned by |maparg()|.
! {mode} and {abbr} should be the same as for the call to
! |maparg()|. *E460*
{mode} is used to define the mode in which the mapping is set,
not the "mode" entry in {dict}.
Example for saving and restoring a mapping: >
***************
*** 6899,6905 ****
nnoremap K somethingelse
...
call mapset('n', 0, save_map)
! <
match({expr}, {pat} [, {start} [, {count}]]) *match()*
When {expr} is a |List| then this returns the index of the
first item where {pat} matches. Each item is used as a
--- 6912,6922 ----
nnoremap K somethingelse
...
call mapset('n', 0, save_map)
! < Note that if you are going to replace a map in several modes,
! e.g. with `:map!`, you need to save the mapping for all of
! them, since they can differe.
!
!
match({expr}, {pat} [, {start} [, {count}]]) *match()*
When {expr} is a |List| then this returns the index of the
first item where {pat} matches. Each item is used as a
*** ../vim-8.2.0814/src/testdir/test_maparg.vim 2020-05-22 20:01:02.424452078 +0200
--- src/testdir/test_maparg.vim 2020-05-23 23:31:09.022180976 +0200
***************
*** 17,40 ****
vnoremap <script> <buffer> <expr> <silent> bar isbar
call assert_equal("is<F4>foo", maparg('foo<C-V>'))
call assert_equal({'silent': 0, 'noremap': 0, 'script': 0, 'lhs': 'foo<C-V>',
\ 'mode': ' ', 'nowait': 0, 'expr': 0, 'sid': sid, 'lnum': lnum + 1,
! \ 'simplified': 1, 'rhs': 'is<F4>foo', 'buffer': 0},
\ maparg('foo<C-V>', '', 0, 1))
! call assert_equal({'silent': 1, 'noremap': 1, 'script': 1, 'lhs': 'bar', 'mode': 'v',
\ 'nowait': 0, 'expr': 1, 'sid': sid, 'lnum': lnum + 2,
! \ 'simplified': 0, 'rhs': 'isbar', 'buffer': 1},
\ 'bar'->maparg('', 0, 1))
let lnum = expand('<sflnum>')
map <buffer> <nowait> foo bar
! call assert_equal({'silent': 0, 'noremap': 0, 'script': 0, 'lhs': 'foo', 'mode': ' ',
\ 'nowait': 1, 'expr': 0, 'sid': sid, 'lnum': lnum + 1, 'rhs': 'bar',
! \ 'simplified': 0, 'buffer': 1},
\ maparg('foo', '', 0, 1))
let lnum = expand('<sflnum>')
tmap baz foo
! call assert_equal({'silent': 0, 'noremap': 0, 'script': 0, 'lhs': 'baz', 'mode': 't',
\ 'nowait': 0, 'expr': 0, 'sid': sid, 'lnum': lnum + 1, 'rhs': 'foo',
! \ 'simplified': 0, 'buffer': 0},
\ maparg('baz', 't', 0, 1))

map abc x<char-114>x
--- 17,44 ----
vnoremap <script> <buffer> <expr> <silent> bar isbar
call assert_equal("is<F4>foo", maparg('foo<C-V>'))
call assert_equal({'silent': 0, 'noremap': 0, 'script': 0, 'lhs': 'foo<C-V>',
+ \ 'lhsraw': "foo\x80\xfc\x04V", 'lhsrawalt': "foo\x16",
\ 'mode': ' ', 'nowait': 0, 'expr': 0, 'sid': sid, 'lnum': lnum + 1,
! \ 'rhs': 'is<F4>foo', 'buffer': 0},
\ maparg('foo<C-V>', '', 0, 1))
! call assert_equal({'silent': 1, 'noremap': 1, 'script': 1, 'lhs': 'bar',
! \ 'lhsraw': 'bar', 'mode': 'v',
\ 'nowait': 0, 'expr': 1, 'sid': sid, 'lnum': lnum + 2,
! \ 'rhs': 'isbar', 'buffer': 1},
\ 'bar'->maparg('', 0, 1))
let lnum = expand('<sflnum>')
map <buffer> <nowait> foo bar
! call assert_equal({'silent': 0, 'noremap': 0, 'script': 0, 'lhs': 'foo',
! \ 'lhsraw': 'foo', 'mode': ' ',
\ 'nowait': 1, 'expr': 0, 'sid': sid, 'lnum': lnum + 1, 'rhs': 'bar',
! \ 'buffer': 1},
\ maparg('foo', '', 0, 1))
let lnum = expand('<sflnum>')
tmap baz foo
! call assert_equal({'silent': 0, 'noremap': 0, 'script': 0, 'lhs': 'baz',
! \ 'lhsraw': 'baz', 'mode': 't',
\ 'nowait': 0, 'expr': 0, 'sid': sid, 'lnum': lnum + 1, 'rhs': 'foo',
! \ 'buffer': 0},
\ maparg('baz', 't', 0, 1))

map abc x<char-114>x
***************
*** 199,205 ****
call assert_equal('one<CR>two', getline(1))

iunmap K
- let &cpo = cpo_save

" Test literal <CR> using CTRL-V
inoremap K one <CR>two
--- 203,208 ----
***************
*** 221,228 ****

iunmap K
let &cpo = cpo_save
-
bwipe!
endfunc

" vim: shiftwidth=2 sts=2 expandtab
--- 224,258 ----

iunmap K
let &cpo = cpo_save
bwipe!
endfunc

+ func Check_ctrlb_map(d, check_alt)
+ call assert_equal('<C-B>', a:d.lhs)
+ if a:check_alt
+ call assert_equal("\x80\xfc\x04B", a:d.lhsraw)
+ call assert_equal("\x02", a:d.lhsrawalt)
+ else
+ call assert_equal("\x02", a:d.lhsraw)
+ endif
+ endfunc
+
+ func Test_map_restore()
+ " Test restoring map with alternate keycode
+ nmap <C-B> back
+ let d = maparg('<C-B>', 'n', 0, 1)
+ call Check_ctrlb_map(d, 1)
+ let dsimp = maparg("\x02", 'n', 0, 1)
+ call Check_ctrlb_map(dsimp, 0)
+ nunmap <C-B>
+ call mapset('n', 0, d)
+ let d = maparg('<C-B>', 'n', 0, 1)
+ call Check_ctrlb_map(d, 1)
+ let dsimp = maparg("\x02", 'n', 0, 1)
+ call Check_ctrlb_map(dsimp, 0)
+
+ nunmap <C-B>
+
+ endfunc
+
" vim: shiftwidth=2 sts=2 expandtab
*** ../vim-8.2.0814/src/version.c 2020-05-23 19:30:01.814746167 +0200
--- src/version.c 2020-05-23 22:06:57.443642816 +0200
***************
*** 748,749 ****
--- 748,751 ----
{ /* Add new patch number below this line */
+ /**/
+ 815,
/**/

--
An error has occurred. Hit any user to continue.

/// Bram Moolenaar -- Br...@Moolenaar.net -- http://www.Moolenaar.net \\\
/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\ an exciting new programming language -- http://www.Zimbu.org ///
\\\ help me help AIDS victims -- http://ICCF-Holland.org ///

Tony Mechelynck

unread,
May 24, 2020, 7:48:14 AM5/24/20
to Bram Moolenaar, vim_dev
On Sun, May 24, 2020 at 1:11 PM Bram Moolenaar <Br...@moolenaar.net> wrote:
>
>
> Patch 8.2.0815
> Problem: maparg() does not provide enough information for mapset().
> Solution: Add "lhsraw" and "lhsrawalt" items. Drop "simplified"
> Files: src/map.c, runtime/doc/eval.txt, src/testdir/test_maparg.vim

This gives me a warning in Big, Normal and Huge builds, as follows:

gcc -c -I. -Iproto -DHAVE_CONFIG_H -DFEAT_GUI_GTK -pthread
-I/usr/include/gtk-3.0 -I/usr/include/at-spi2-atk/2.0
-I/usr/include/at-spi-2.0 -I/usr/include/dbus-1.0
-I/usr/lib64/dbus-1.0/include -I/usr/include/gtk-3.0
-I/usr/include/gio-unix-2.0 -I/usr/include/libxkbcommon
-I/usr/include/wayland -I/usr/include/cairo -I/usr/include/pango-1.0
-I/usr/include/fribidi -I/usr/include/harfbuzz -I/usr/include/atk-1.0
-I/usr/include/cairo -I/usr/include/pixman-1 -I/usr/include/freetype2
-I/usr/include/libpng16 -I/usr/include/gdk-pixbuf-2.0
-I/usr/include/libmount -I/usr/include/blkid -I/usr/include/uuid
-I/usr/include/glib-2.0 -I/usr/lib64/glib-2.0/include -O2
-fno-strength-reduce -Wall -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=1
-o objects/map.o map.c
map.c: In function ‘get_maparg’:
map.c:2258:6: warning: ‘mp_simplified’ may be used uninitialized in
this function [-Wmaybe-uninitialized]
dict_add_string(dict, "lhsrawalt", mp_simplified->m_keys);
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


Berst regards,
Tony.

Tony Mechelynck

unread,
May 27, 2020, 12:31:19 PM5/27/20
to Bram Moolenaar, vim_dev
Bram, did the message below fall off your radar? AFAICT the warning
(in +eval builds) is still extant.

Best regards,
Tony.

Bram Moolenaar

unread,
May 27, 2020, 3:30:11 PM5/27/20
to vim...@googlegroups.com, Tony Mechelynck

Tony wrote:

> Bram, did the message below fall off your radar? AFAICT the warning
> (in +eval builds) is still extant.

I indeed didn't spot it. I only see it when compiling with -O2, and the
get tons of errors in library files, thus it's easy to miss.

Weird thing is that initializing it to NULL helps, even though it's
clear that using NULL is just as much a problem. Stupid compiler...


--
hundred-and-one symptoms of being an internet addict:
192. Your boss asks you to "go fer" coffee and you come up with 235 FTP sites.

Tony Mechelynck

unread,
May 27, 2020, 4:28:15 PM5/27/20
to Bram Moolenaar, vim_dev
On Wed, May 27, 2020 at 9:30 PM Bram Moolenaar <Br...@moolenaar.net> wrote:
>
>
> Tony wrote:
>
> > Bram, did the message below fall off your radar? AFAICT the warning
> > (in +eval builds) is still extant.
>
> I indeed didn't spot it. I only see it when compiling with -O2, and the
> get tons of errors in library files, thus it's easy to miss.

When I compile *Vim* with the default settings, including -O2, I
usually get no compiler messages.
>
> Weird thing is that initializing it to NULL helps, even though it's
> clear that using NULL is just as much a problem. Stupid compiler...

Stupid or not, thanks for patch 832!

Best regards,
Tony.
Reply all
Reply to author
Forward
0 new messages