Skip to content
Permalink
Browse files

patch 8.1.1705: using ~{} for a literal dict is not nice

Problem:    Using ~{} for a literal dict is not nice.
Solution:   Use #{} instead.
  • Loading branch information...
brammool committed Jul 16, 2019
1 parent 69a5b86 commit 4c6d90458baae843463f930fdc3fe4a7a2191d27
Showing with 182 additions and 181 deletions.
  1. +4 −4 runtime/doc/eval.txt
  2. +10 −10 runtime/doc/popup.txt
  3. +4 −5 src/eval.c
  4. +1 −1 src/testdir/test_listdict.vim
  5. +161 −161 src/testdir/test_popupwin.vim
  6. +2 −0 src/version.c
@@ -60,7 +60,7 @@ Dictionary An associative, unordered array: Each entry has a key and a
value. |Dictionary|
Examples:
{'blue': "#0000ff", 'red': "#ff0000"}
~{blue: "#0000ff", red: "#ff0000"}
#{blue: "#0000ff", red: "#ff0000"}

Funcref A reference to a function |Funcref|.
Example: function("strlen")
@@ -482,11 +482,11 @@ entry. Note that the String '04' and the Number 04 are different, since the
Number will be converted to the String '4'. The empty string can also be used
as a key.
*literal-Dict*
To avoid having to put quotes around every key the ~{} form can be used. This
To avoid having to put quotes around every key the #{} form can be used. This
does require the key to consist only of ASCII letters, digits, '-' and '_'.
Example: >
let mydict = ~{zero: 0, one_key: 1, two-key: 2, 333: 3}
Note that 333 here is the string "333". Empty keys are not possible here.
let mydict = #{zero: 0, one_key: 1, two-key: 2, 333: 3}
Note that 333 here is the string "333". Empty keys are not possible with #{}.

A value can be any expression. Using a Dictionary for a value creates a
nested Dictionary: >
@@ -178,7 +178,7 @@ DETAILS *popup-function-details*
popup_atcursor({what}, {options}) *popup_atcursor()*
Show the {what} above the cursor, and close it when the cursor
moves. This works like: >
call popup_create({what}, ~{
call popup_create({what}, #{
\ pos: 'botleft',
\ line: 'cursor-1',
\ col: 'cursor',
@@ -191,7 +191,7 @@ popup_beval({what}, {options}) *popup_beval()*
Show the {what} above the position from 'ballooneval' and
close it when the mouse moves. This works like: >
let pos = screenpos(v:beval_winnr, v:beval_lnum, v:beval_col)
call popup_create({what}, ~{
call popup_create({what}, #{
\ pos: 'botleft',
\ line: pos.row - 1,
\ col: pos.col,
@@ -240,7 +240,7 @@ popup_create({what}, {options}) *popup_create()*

popup_dialog({what}, {options}) *popup_dialog()*
Just like |popup_create()| but with these default options: >
call popup_create({what}, ~{
call popup_create({what}, #{
\ pos: 'center',
\ zindex: 200,
\ drag: 1,
@@ -249,7 +249,7 @@ popup_dialog({what}, {options}) *popup_dialog()*
\})
< Use {options} to change the properties. E.g. add a 'filter'
option with value 'popup_filter_yesno'. Example: >
call popup_create('do you want to quit (Yes/no)?', ~{
call popup_create('do you want to quit (Yes/no)?', #{
\ filter: 'popup_filter_yesno',
\ callback: 'QuitCallback',
\ })
@@ -356,7 +356,7 @@ popup_menu({what}, {options}) *popup_menu()*
items with cursorkeys, and close it an item is selected with
Space or Enter. {what} should have multiple lines to make this
useful. This works like: >
call popup_create({what}, ~{
call popup_create({what}, #{
\ pos: 'center',
\ zindex: 200,
\ drag: 1,
@@ -391,7 +391,7 @@ popup_move({id}, {options}) *popup_move()*
popup_notification({what}, {options}) *popup_notification()*
Show the {what} for 3 seconds at the top of the Vim window.
This works like: >
call popup_create({what}, ~{
call popup_create({what}, #{
\ line: 1,
\ col: 10,
\ minwidth: 20,
@@ -732,15 +732,15 @@ Prompt the user to press y/Y or n/N: >
endif
endfunc

call popup_dialog('Continue? y/n', ~{
call popup_dialog('Continue? y/n', #{
\ filter: 'popup_filter_yesno',
\ callback: 'MyDialogHandler',
\ })
<
*popup_menu-shortcut-example*
Extend popup_filter_menu() with shortcut keys: >

call popup_menu(['Save', 'Cancel', 'Discard'], ~{
call popup_menu(['Save', 'Cancel', 'Discard'], #{
\ filter: 'MyMenuFilter',
\ callback: 'MyMenuHandler',
\ })
@@ -781,7 +781,7 @@ Example for using a popup window for 'ballooneval': >
endif
call popup_close(s:winid)
endif
let s:winid = popup_beval(v:beval_text, ~{mousemoved: 'word'})
let s:winid = popup_beval(v:beval_text, #{mousemoved: 'word'})
let s:last_text = v:beval_text
return ''
endfunc
@@ -812,7 +812,7 @@ this example simulated with a timer callback: >
endfunc

func ShowPopup(id)
let s:winid = popup_beval(s:balloonText, ~{mousemoved: 'word'})
let s:winid = popup_beval(s:balloonText, #{mousemoved: 'word'})
endfunc
<

@@ -4392,7 +4392,7 @@ eval6(
* (expression) nested expression
* [expr, expr] List
* {key: val, key: val} Dictionary
* ~{key: val, key: val} Dictionary with literal keys
* #{key: val, key: val} Dictionary with literal keys
*
* Also handle:
* ! in front logical NOT
@@ -4577,9 +4577,9 @@ eval7(
break;

/*
* Dictionary: ~{key: val, key: val}
* Dictionary: #{key: val, key: val}
*/
case '~': if ((*arg)[1] == '{')
case '#': if ((*arg)[1] == '{')
{
++*arg;
ret = dict_get_tv(arg, rettv, evaluate, TRUE);
@@ -7963,8 +7963,7 @@ find_var_ht(char_u *name, char_u **varname)
*varname = name + 2;
if (*name == 'g') /* global variable */
return &globvarht;
/* There must be no ':' or '#' in the rest of the name, unless g: is used
*/
// There must be no ':' or '#' in the rest of the name, unless g: is used
if (vim_strchr(name + 2, ':') != NULL
|| vim_strchr(name + 2, AUTOLOAD_CHAR) != NULL)
return NULL;
@@ -281,7 +281,7 @@ func Test_dict_func_remove_in_use()
endfunc

func Test_dict_literal_keys()
call assert_equal({'one': 1, 'two2': 2, '3three': 3, '44': 4}, ~{one: 1, two2: 2, 3three: 3, 44: 4},)
call assert_equal({'one': 1, 'two2': 2, '3three': 3, '44': 4}, #{one: 1, two2: 2, 3three: 3, 44: 4},)

" why *{} cannot be used
let blue = 'blue'

0 comments on commit 4c6d904

Please sign in to comment.
You can’t perform that action at this time.