0
0
mirror of https://github.com/vim/vim.git synced 2025-09-25 03:54:15 -04:00

patch 8.2.2982: Vim9: future commands are not reserved yet

Problem:    Vim9: future commands are not reserved yet.
Solution:   Add commands to be implemented later.  Make "this" a reserved
            name.
This commit is contained in:
Bram Moolenaar
2021-06-12 14:53:05 +02:00
parent 6654ca702c
commit 7423577180
6 changed files with 111 additions and 42 deletions

View File

@@ -1,4 +1,4 @@
*vim9.txt* For Vim version 8.2. Last change: 2021 May 26 *vim9.txt* For Vim version 8.2. Last change: 2021 Jun 12
VIM REFERENCE MANUAL by Bram Moolenaar VIM REFERENCE MANUAL by Bram Moolenaar
@@ -169,6 +169,14 @@ created yet. In this case you can call `execute()` to invoke it at runtime. >
used for the command or inside a `:try` block), does not get a range passed used for the command or inside a `:try` block), does not get a range passed
cannot be a "dict" function, and can always be a closure. cannot be a "dict" function, and can always be a closure.
Later classes will be added, which replaces the "dict function" mechanism.
For now you will need to pass the dictionary explicitly: >
def DictFunc(d: dict<any>, arg: string)
echo d[arg]
enddef
var d = {item: 'value', func: DictFunc}
d.func(d, 'item')
The argument types and return type need to be specified. The "any" type can The argument types and return type need to be specified. The "any" type can
be used, type checking will then be done at runtime, like with legacy be used, type checking will then be done at runtime, like with legacy
functions. functions.
@@ -445,7 +453,7 @@ it is the start of a lambda or a dictionary, which is now more complicated
because of the use of argument types. because of the use of argument types.
To avoid these problems Vim9 script uses a different syntax for a lambda, To avoid these problems Vim9 script uses a different syntax for a lambda,
which is similar to Javascript: > which is similar to JavaScript: >
var Lambda = (arg) => expression var Lambda = (arg) => expression
No line break is allowed in the arguments of a lambda up to and including the No line break is allowed in the arguments of a lambda up to and including the
@@ -522,7 +530,7 @@ And when a dict spans multiple lines: >
one: 1, one: 1,
two: 2, two: 2,
} }
Function call: > With a function call: >
var result = Func( var result = Func(
arg1, arg1,
arg2 arg2
@@ -555,10 +563,31 @@ at the start of the line indicates line continuation: >
| echo 'match' | echo 'match'
| endif | endif
Note that this means that in heredoc the first line cannot be a bar: >
var lines =<< trim END
| this doesn't work
END
Either use an empty line at the start or do not use heredoc. Or temporarily
add the "C" flag to 'cpoptions': >
set cpo+=C
var lines =<< trim END
| this doesn't work
END
set cpo-=C
If the heredoc is inside a function 'cpoptions' must be set before :def and
restored after the :enddef.
In places where line continuation with a backslash is still needed, such as
splitting up a long Ex command, comments can start with #\ instead of "\: >
syn region Text
\ start='foo'
#\ comment
\ end='bar'
< *E1050* < *E1050*
To make it possible for the operator at the start of the line to be To make it possible for the operator at the start of the line to be
recognized, it is required to put a colon before a range. This will add recognized, it is required to put a colon before a range. This example will
"start" and print: > add "start" and print: >
var result = start var result = start
+ print + print
Like this: > Like this: >
@@ -610,6 +639,9 @@ Notes:
< This does not work: > < This does not work: >
echo [1, 2] echo [1, 2]
[3, 4] [3, 4]
- In some cases it is difficult for Vim to parse a command, especially when
commands are used as an argument to another command, such as `windo`. In
those cases the line continuation with a backslash has to be used.
White space ~ White space ~
@@ -1240,9 +1272,10 @@ Exporting an item can be written as: >
export const someValue = ... export const someValue = ...
export def MyFunc() ... export def MyFunc() ...
export class MyClass ... export class MyClass ...
export interface MyClass ...
As this suggests, only constants, variables, `:def` functions and classes can As this suggests, only constants, variables, `:def` functions and classes can
be exported. {not implemented yet: export class} be exported. {not implemented yet: class, interface}
*E1042* *E1042*
`:export` can only be used in Vim9 script, at the script level. `:export` can only be used in Vim9 script, at the script level.
@@ -1342,27 +1375,46 @@ implementing classes is going to be a lot of work, it is left for the future.
For now we'll just make sure classes can be added later. For now we'll just make sure classes can be added later.
Thoughts: Thoughts:
- `class` / `endclass`, everything in one file - `class` / `endclass`, the whole class must be in one file
- Class names are always CamelCase - Class names are always CamelCase (to avoid a name clash with builtin types)
- Single constructor - A single constructor called "constructor"
- Single inheritance with `class ThisClass extends BaseClass` - Single inheritance with `class ThisClass extends BaseClass`
- `abstract class` - `abstract class` (class with incomplete implementation)
- `interface` (Abstract class without any implementation) - `interface` / `endinterface` (abstract class without any implementation)
- `class SomeClass implements SomeInterface` - `class SomeClass implements SomeInterface`
- Generics for class: `class <Tkey, Tentry>` - Generics for class: `class <Tkey, Tentry>`
- Generics for function: `def <Tkey> GetLast(key: Tkey)` - Generics for function: `def <Tkey> GetLast(key: Tkey)`
Again, much of this is from TypeScript. Again, much of this is from TypeScript with a slightly different syntax.
Some things that look like good additions: Some things that look like good additions:
- Use a class as an interface (like Dart) - Use a class as an interface (like Dart)
- Extend a class with methods, using an import (like Dart) - Extend a class with methods, using an import (like Dart)
- Mixins
- For testing: Mock mechanism
An important class that will be provided is "Promise". Since Vim is single An important class that will be provided is "Promise". Since Vim is single
threaded, connecting asynchronous operations is a natural way of allowing threaded, connecting asynchronous operations is a natural way of allowing
plugins to do their work without blocking the user. It's a uniform way to plugins to do their work without blocking the user. It's a uniform way to
invoke callbacks and handle timeouts and errors. invoke callbacks and handle timeouts and errors.
Some examples: >
abstract class Person
static const prefix = 'xxx'
var name: string
def constructor(name: string)
this.name = name;
enddef
def display(): void
echo name
enddef
abstract def find(string): Person
endclass
============================================================================== ==============================================================================
9. Rationale *vim9-rationale* 9. Rationale *vim9-rationale*

View File

@@ -6,31 +6,31 @@
static const unsigned short cmdidxs1[26] = static const unsigned short cmdidxs1[26] =
{ {
/* a */ 0, /* a */ 0,
/* b */ 19, /* b */ 20,
/* c */ 43, /* c */ 44,
/* d */ 110, /* d */ 111,
/* e */ 135, /* e */ 136,
/* f */ 162, /* f */ 164,
/* g */ 179, /* g */ 181,
/* h */ 185, /* h */ 187,
/* i */ 194, /* i */ 196,
/* j */ 213, /* j */ 216,
/* k */ 215, /* k */ 218,
/* l */ 220, /* l */ 223,
/* m */ 283, /* m */ 286,
/* n */ 301, /* n */ 304,
/* o */ 321, /* o */ 324,
/* p */ 333, /* p */ 336,
/* q */ 372, /* q */ 375,
/* r */ 375, /* r */ 378,
/* s */ 395, /* s */ 398,
/* t */ 464, /* t */ 468,
/* u */ 510, /* u */ 514,
/* v */ 521, /* v */ 525,
/* w */ 542, /* w */ 546,
/* x */ 556, /* x */ 560,
/* y */ 566, /* y */ 570,
/* z */ 567 /* z */ 571
}; };
/* /*
@@ -41,15 +41,15 @@ static const unsigned short cmdidxs1[26] =
*/ */
static const unsigned char cmdidxs2[26][26] = static const unsigned char cmdidxs2[26][26] =
{ /* a b c d e f g h i j k l m n o p q r s t u v w x y z */ { /* a b c d e f g h i j k l m n o p q r s t u v w x y z */
/* a */ { 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 5, 6, 0, 0, 0, 7, 15, 0, 16, 0, 0, 0, 0, 0 }, /* a */ { 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 6, 7, 0, 0, 0, 8, 16, 0, 17, 0, 0, 0, 0, 0 },
/* b */ { 2, 0, 0, 5, 6, 8, 0, 0, 0, 0, 0, 9, 10, 11, 12, 13, 0, 14, 0, 0, 0, 0, 23, 0, 0, 0 }, /* b */ { 2, 0, 0, 5, 6, 8, 0, 0, 0, 0, 0, 9, 10, 11, 12, 13, 0, 14, 0, 0, 0, 0, 23, 0, 0, 0 },
/* c */ { 3, 12, 16, 18, 20, 22, 25, 0, 0, 0, 0, 33, 38, 41, 47, 57, 59, 60, 61, 0, 63, 0, 66, 0, 0, 0 }, /* c */ { 3, 12, 16, 18, 20, 22, 25, 0, 0, 0, 0, 33, 38, 41, 47, 57, 59, 60, 61, 0, 63, 0, 66, 0, 0, 0 },
/* d */ { 0, 0, 0, 0, 0, 0, 0, 0, 8, 18, 0, 19, 0, 0, 20, 0, 0, 22, 23, 0, 0, 0, 0, 0, 0, 0 }, /* d */ { 0, 0, 0, 0, 0, 0, 0, 0, 8, 18, 0, 19, 0, 0, 20, 0, 0, 22, 23, 0, 0, 0, 0, 0, 0, 0 },
/* e */ { 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 8, 10, 11, 0, 0, 0, 0, 0, 0, 0, 21, 0, 22, 0, 0 }, /* e */ { 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 8, 10, 11, 0, 0, 0, 0, 0, 0, 0, 22, 0, 23, 0, 0 },
/* f */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0 }, /* f */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0 },
/* g */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 2, 0, 0, 4, 5, 0, 0, 0, 0 }, /* g */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 2, 0, 0, 4, 5, 0, 0, 0, 0 },
/* h */ { 5, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, /* h */ { 5, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
/* i */ { 1, 0, 0, 0, 0, 3, 0, 0, 0, 4, 0, 5, 6, 0, 0, 0, 0, 0, 14, 0, 16, 0, 0, 0, 0, 0 }, /* i */ { 1, 0, 0, 0, 0, 3, 0, 0, 0, 4, 0, 5, 6, 0, 0, 0, 0, 0, 15, 0, 17, 0, 0, 0, 0, 0 },
/* j */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0 }, /* j */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0 },
/* k */ { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, /* k */ { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
/* l */ { 3, 11, 15, 19, 20, 25, 28, 33, 0, 0, 0, 35, 38, 41, 45, 51, 0, 53, 62, 54, 55, 59, 61, 0, 0, 0 }, /* l */ { 3, 11, 15, 19, 20, 25, 28, 33, 0, 0, 0, 35, 38, 41, 45, 51, 0, 53, 62, 54, 55, 59, 61, 0, 0, 0 },
@@ -59,7 +59,7 @@ static const unsigned char cmdidxs2[26][26] =
/* p */ { 1, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 9, 0, 0, 16, 17, 26, 0, 27, 0, 28, 0 }, /* p */ { 1, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 9, 0, 0, 16, 17, 26, 0, 27, 0, 28, 0 },
/* q */ { 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, /* q */ { 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
/* r */ { 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 19, 0, 0, 0, 0 }, /* r */ { 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 19, 0, 0, 0, 0 },
/* s */ { 2, 6, 15, 0, 19, 23, 0, 25, 26, 0, 0, 29, 31, 35, 39, 41, 0, 50, 0, 51, 0, 63, 64, 0, 65, 0 }, /* s */ { 2, 6, 15, 0, 19, 23, 0, 25, 26, 0, 0, 29, 31, 35, 39, 41, 0, 50, 0, 51, 0, 64, 65, 0, 66, 0 },
/* t */ { 2, 0, 19, 0, 24, 26, 0, 27, 0, 28, 0, 29, 33, 36, 38, 39, 0, 40, 42, 0, 43, 0, 0, 0, 45, 0 }, /* t */ { 2, 0, 19, 0, 24, 26, 0, 27, 0, 28, 0, 29, 33, 36, 38, 39, 0, 40, 42, 0, 43, 0, 0, 0, 45, 0 },
/* u */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, /* u */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
/* v */ { 1, 0, 0, 0, 2, 0, 0, 0, 5, 0, 0, 0, 12, 15, 0, 0, 0, 0, 18, 0, 19, 0, 0, 0, 0, 0 }, /* v */ { 1, 0, 0, 0, 2, 0, 0, 0, 5, 0, 0, 0, 12, 15, 0, 0, 0, 0, 18, 0, 19, 0, 0, 0, 0, 0 },
@@ -69,4 +69,4 @@ static const unsigned char cmdidxs2[26][26] =
/* z */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } /* z */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
}; };
static const int command_count = 584; static const int command_count = 588;

View File

@@ -122,6 +122,9 @@ EXCMD(CMD_abclear, "abclear", ex_abclear,
EXCMD(CMD_aboveleft, "aboveleft", ex_wrongmodifier, EXCMD(CMD_aboveleft, "aboveleft", ex_wrongmodifier,
EX_NEEDARG|EX_EXTRA|EX_NOTRLCOM, EX_NEEDARG|EX_EXTRA|EX_NOTRLCOM,
ADDR_NONE), ADDR_NONE),
EXCMD(CMD_abstract, "abstract", ex_ni,
EX_EXTRA|EX_TRLBAR|EX_CMDWIN|EX_LOCK_OK,
ADDR_NONE),
EXCMD(CMD_all, "all", ex_all, EXCMD(CMD_all, "all", ex_all,
EX_BANG|EX_RANGE|EX_COUNT|EX_TRLBAR, EX_BANG|EX_RANGE|EX_COUNT|EX_TRLBAR,
ADDR_OTHER), ADDR_OTHER),
@@ -551,6 +554,9 @@ EXCMD(CMD_emenu, "emenu", ex_emenu,
EXCMD(CMD_endif, "endif", ex_endif, EXCMD(CMD_endif, "endif", ex_endif,
EX_TRLBAR|EX_SBOXOK|EX_CMDWIN|EX_LOCK_OK, EX_TRLBAR|EX_SBOXOK|EX_CMDWIN|EX_LOCK_OK,
ADDR_NONE), ADDR_NONE),
EXCMD(CMD_endinterface, "endinterface", ex_ni,
EX_EXTRA|EX_TRLBAR|EX_CMDWIN|EX_LOCK_OK,
ADDR_NONE),
EXCMD(CMD_endclass, "endclass", ex_ni, EXCMD(CMD_endclass, "endclass", ex_ni,
EX_EXTRA|EX_TRLBAR|EX_CMDWIN|EX_LOCK_OK, EX_EXTRA|EX_TRLBAR|EX_CMDWIN|EX_LOCK_OK,
ADDR_NONE), ADDR_NONE),
@@ -734,6 +740,9 @@ EXCMD(CMD_inoremenu, "inoremenu", ex_menu,
EXCMD(CMD_intro, "intro", ex_intro, EXCMD(CMD_intro, "intro", ex_intro,
EX_TRLBAR|EX_CMDWIN|EX_LOCK_OK, EX_TRLBAR|EX_CMDWIN|EX_LOCK_OK,
ADDR_NONE), ADDR_NONE),
EXCMD(CMD_interface, "interface", ex_ni,
EX_EXTRA|EX_TRLBAR|EX_CMDWIN|EX_LOCK_OK,
ADDR_NONE),
EXCMD(CMD_isearch, "isearch", ex_findpat, EXCMD(CMD_isearch, "isearch", ex_findpat,
EX_BANG|EX_RANGE|EX_DFLALL|EX_WHOLEFOLD|EX_EXTRA|EX_CMDWIN|EX_LOCK_OK, EX_BANG|EX_RANGE|EX_DFLALL|EX_WHOLEFOLD|EX_EXTRA|EX_CMDWIN|EX_LOCK_OK,
ADDR_LINES), ADDR_LINES),
@@ -1463,6 +1472,9 @@ EXCMD(CMD_startgreplace, "startgreplace", ex_startinsert,
EXCMD(CMD_startreplace, "startreplace", ex_startinsert, EXCMD(CMD_startreplace, "startreplace", ex_startinsert,
EX_BANG|EX_TRLBAR|EX_CMDWIN|EX_LOCK_OK, EX_BANG|EX_TRLBAR|EX_CMDWIN|EX_LOCK_OK,
ADDR_NONE), ADDR_NONE),
EXCMD(CMD_static, "static", ex_ni,
EX_EXTRA|EX_TRLBAR|EX_CMDWIN|EX_LOCK_OK,
ADDR_NONE),
EXCMD(CMD_stopinsert, "stopinsert", ex_stopinsert, EXCMD(CMD_stopinsert, "stopinsert", ex_stopinsert,
EX_BANG|EX_TRLBAR|EX_CMDWIN|EX_LOCK_OK, EX_BANG|EX_TRLBAR|EX_CMDWIN|EX_LOCK_OK,
ADDR_NONE), ADDR_NONE),

View File

@@ -982,6 +982,8 @@ def Test_assignment_failure()
CheckDefFailure(['var true = 1'], 'E1034:') CheckDefFailure(['var true = 1'], 'E1034:')
CheckDefFailure(['var false = 1'], 'E1034:') CheckDefFailure(['var false = 1'], 'E1034:')
CheckDefFailure(['var null = 1'], 'E1034:')
CheckDefFailure(['var this = 1'], 'E1034:')
CheckDefFailure(['[a; b; c] = g:list'], 'E452:') CheckDefFailure(['[a; b; c] = g:list'], 'E452:')
CheckDefExecFailure(['var a: number', CheckDefExecFailure(['var a: number',

View File

@@ -750,6 +750,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
2982,
/**/ /**/
2981, 2981,
/**/ /**/

View File

@@ -979,6 +979,7 @@ static char *reserved[] = {
"true", "true",
"false", "false",
"null", "null",
"this",
NULL NULL
}; };