annotate runtime/doc/vim9.txt @ 23318:c76240efdf02 v8.2.2204

patch 8.2.2204: Vim9: using -> both for method and lambda is confusing Commit: https://github.com/vim/vim/commit/65c4415276394c871c7a8711c7633c19ec9235b1 Author: Bram Moolenaar <Bram@vim.org> Date: Thu Dec 24 15:14:01 2020 +0100 patch 8.2.2204: Vim9: using -> both for method and lambda is confusing Problem: Vim9: using -> both for method and lambda is confusing. Solution: Use => for lambda in :def function.
author Bram Moolenaar <Bram@vim.org>
date Thu, 24 Dec 2020 15:15:05 +0100
parents fab58304f77d
children b3142fc0a414
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
23318
c76240efdf02 patch 8.2.2204: Vim9: using -> both for method and lambda is confusing
Bram Moolenaar <Bram@vim.org>
parents: 23305
diff changeset
1 *vim9.txt* For Vim version 8.2. Last change: 2020 Dec 24
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4 VIM REFERENCE MANUAL by Bram Moolenaar
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
6
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
7 THIS IS STILL UNDER DEVELOPMENT - ANYTHING CAN BREAK - ANYTHING CAN CHANGE
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
8
23305
fab58304f77d Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 23164
diff changeset
9 Vim9 script commands and expressions. *Vim9*
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
10
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
11 Most expression help is in |eval.txt|. This file is about the new syntax and
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
12 features in Vim9 script.
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
13
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
14 THIS IS STILL UNDER DEVELOPMENT - ANYTHING CAN BREAK - ANYTHING CAN CHANGE
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
15
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
16
21676
1b345fb68ae3 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 21584
diff changeset
17 1. What is Vim9 script? |vim9-script|
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
18 2. Differences |vim9-differences|
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
19 3. New style functions |fast-functions|
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
20 4. Types |vim9-types|
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
21 5. Namespace, Import and Export |vim9script|
22328
75ff30a78189 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22272
diff changeset
22 6. Future work: classes |vim9-classes|
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
23
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
24 9. Rationale |vim9-rationale|
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
25
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
26 ==============================================================================
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
27
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
28 1. What is Vim9 script? *vim9-script*
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
29
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
30 THIS IS STILL UNDER DEVELOPMENT - ANYTHING CAN BREAK - ANYTHING CAN CHANGE
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
31
20241
56265f711890 Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 20115
diff changeset
32 Vim script has been growing over time, while preserving backwards
56265f711890 Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 20115
diff changeset
33 compatibility. That means bad choices from the past often can't be changed
20965
59f93c2d2551 Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 20856
diff changeset
34 and compatibility with Vi restricts possible solutions. Execution is quite
20241
56265f711890 Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 20115
diff changeset
35 slow, each line is parsed every time it is executed.
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
36
20241
56265f711890 Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 20115
diff changeset
37 The main goal of Vim9 script is to drastically improve performance. This is
56265f711890 Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 20115
diff changeset
38 accomplished by compiling commands into instructions that can be efficiently
56265f711890 Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 20115
diff changeset
39 executed. An increase in execution speed of 10 to 100 times can be expected.
56265f711890 Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 20115
diff changeset
40
56265f711890 Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 20115
diff changeset
41 A secondary goal is to avoid Vim-specific constructs and get closer to
56265f711890 Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 20115
diff changeset
42 commonly used programming languages, such as JavaScript, TypeScript and Java.
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
43
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
44 The performance improvements can only be achieved by not being 100% backwards
20552
74e3316c1d5a Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 20379
diff changeset
45 compatible. For example, making function arguments available in the
74e3316c1d5a Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 20379
diff changeset
46 "a:" dictionary adds quite a lot of overhead. In a Vim9 function this
74e3316c1d5a Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 20379
diff changeset
47 dictionary is not available. Other differences are more subtle, such as how
74e3316c1d5a Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 20379
diff changeset
48 errors are handled.
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
49
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
50 The Vim9 script syntax and semantics are used in:
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
51 - a function defined with the `:def` command
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
52 - a script file where the first command is `vim9script`
22328
75ff30a78189 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22272
diff changeset
53 - an autocommand defined in the context of the above
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
54
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
55 When using `:function` in a Vim9 script file the legacy syntax is used.
20241
56265f711890 Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 20115
diff changeset
56 However, this can be confusing and is therefore discouraged.
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
57
20241
56265f711890 Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 20115
diff changeset
58 Vim9 script and legacy Vim script can be mixed. There is no requirement to
22328
75ff30a78189 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22272
diff changeset
59 rewrite old scripts, they keep working as before. You may want to use a few
75ff30a78189 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22272
diff changeset
60 `:def` functions for code that needs to be fast.
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
61
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
62 ==============================================================================
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
63
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
64 2. Differences from legacy Vim script *vim9-differences*
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
65
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
66 THIS IS STILL UNDER DEVELOPMENT - ANYTHING CAN BREAK - ANYTHING CAN CHANGE
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
67
22441
a3bb84cd0f59 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22391
diff changeset
68 Overview ~
a3bb84cd0f59 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22391
diff changeset
69
a3bb84cd0f59 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22391
diff changeset
70 Brief summary of the differences you will most often encounter when using Vim9
a3bb84cd0f59 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22391
diff changeset
71 script and `:def` functions; details are below:
a3bb84cd0f59 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22391
diff changeset
72 - Comments start with #, not ": >
a3bb84cd0f59 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22391
diff changeset
73 echo "hello" # comment
a3bb84cd0f59 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22391
diff changeset
74 - Using a backslash for line continuation is hardly ever needed: >
a3bb84cd0f59 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22391
diff changeset
75 echo "hello "
a3bb84cd0f59 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22391
diff changeset
76 .. yourName
a3bb84cd0f59 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22391
diff changeset
77 .. ", how are you?"
a3bb84cd0f59 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22391
diff changeset
78 - White space is required in many places.
a3bb84cd0f59 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22391
diff changeset
79 - Assign values without `:let`, declare variables with `:var`: >
a3bb84cd0f59 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22391
diff changeset
80 var count = 0
a3bb84cd0f59 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22391
diff changeset
81 count += 3
a3bb84cd0f59 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22391
diff changeset
82 - Constants can be declared with `:final` and `:const`: >
a3bb84cd0f59 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22391
diff changeset
83 final matches = [] # add matches
a3bb84cd0f59 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22391
diff changeset
84 const names = ['Betty', 'Peter'] # cannot be changed
a3bb84cd0f59 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22391
diff changeset
85 - `:final` cannot be used as an abbreviation of `:finally`.
a3bb84cd0f59 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22391
diff changeset
86 - Variables and functions are script-local by default.
a3bb84cd0f59 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22391
diff changeset
87 - Functions are declared with argument types and return type: >
a3bb84cd0f59 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22391
diff changeset
88 def CallMe(count: number, message: string): bool
a3bb84cd0f59 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22391
diff changeset
89 - Call functions without `:call`: >
a3bb84cd0f59 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22391
diff changeset
90 writefile(['done'], 'file.txt')
a3bb84cd0f59 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22391
diff changeset
91 - You cannot use `:xit`, `:t`, `:append`, `:change`, `:insert` or curly-braces
a3bb84cd0f59 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22391
diff changeset
92 names.
a3bb84cd0f59 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22391
diff changeset
93 - A range before a command must be prefixed with a colon: >
a3bb84cd0f59 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22391
diff changeset
94 :%s/this/that
a3bb84cd0f59 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22391
diff changeset
95
a3bb84cd0f59 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22391
diff changeset
96
20023
c85d4e173cc9 patch 8.2.0567: Vim9: cannot put comments halfway expressions
Bram Moolenaar <Bram@vim.org>
parents: 20015
diff changeset
97 Comments starting with # ~
c85d4e173cc9 patch 8.2.0567: Vim9: cannot put comments halfway expressions
Bram Moolenaar <Bram@vim.org>
parents: 20015
diff changeset
98
21353
fb8c8fcb7b60 patch 8.2.1227: Vim9: allowing both quoted and # comments is confusing
Bram Moolenaar <Bram@vim.org>
parents: 21250
diff changeset
99 In legacy Vim script comments start with double quote. In Vim9 script
fb8c8fcb7b60 patch 8.2.1227: Vim9: allowing both quoted and # comments is confusing
Bram Moolenaar <Bram@vim.org>
parents: 21250
diff changeset
100 comments start with #. >
fb8c8fcb7b60 patch 8.2.1227: Vim9: allowing both quoted and # comments is confusing
Bram Moolenaar <Bram@vim.org>
parents: 21250
diff changeset
101 # declarations
22391
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
102 var count = 0 # number of occurrences
20023
c85d4e173cc9 patch 8.2.0567: Vim9: cannot put comments halfway expressions
Bram Moolenaar <Bram@vim.org>
parents: 20015
diff changeset
103
21353
fb8c8fcb7b60 patch 8.2.1227: Vim9: allowing both quoted and # comments is confusing
Bram Moolenaar <Bram@vim.org>
parents: 21250
diff changeset
104 The reason is that a double quote can also be the start of a string. In many
21825
0db0640e16e0 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 21771
diff changeset
105 places, especially halfway through an expression with a line break, it's hard
0db0640e16e0 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 21771
diff changeset
106 to tell what the meaning is, since both a string and a comment can be followed
0db0640e16e0 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 21771
diff changeset
107 by arbitrary text. To avoid confusion only # comments are recognized. This
0db0640e16e0 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 21771
diff changeset
108 is the same as in shell scripts and Python programs.
21353
fb8c8fcb7b60 patch 8.2.1227: Vim9: allowing both quoted and # comments is confusing
Bram Moolenaar <Bram@vim.org>
parents: 21250
diff changeset
109
fb8c8fcb7b60 patch 8.2.1227: Vim9: allowing both quoted and # comments is confusing
Bram Moolenaar <Bram@vim.org>
parents: 21250
diff changeset
110 In Vi # is a command to list text with numbers. In Vim9 script you can use
fb8c8fcb7b60 patch 8.2.1227: Vim9: allowing both quoted and # comments is confusing
Bram Moolenaar <Bram@vim.org>
parents: 21250
diff changeset
111 `:number` for that. >
21516
c7b2ce90c2de patch 8.2.1308: Vim9: accidentally using "x" causes Vim to exit
Bram Moolenaar <Bram@vim.org>
parents: 21499
diff changeset
112 101 number
21353
fb8c8fcb7b60 patch 8.2.1227: Vim9: allowing both quoted and # comments is confusing
Bram Moolenaar <Bram@vim.org>
parents: 21250
diff changeset
113
fb8c8fcb7b60 patch 8.2.1227: Vim9: allowing both quoted and # comments is confusing
Bram Moolenaar <Bram@vim.org>
parents: 21250
diff changeset
114 To improve readability there must be a space between a command and the #
22936
00b0275ffe7f patch 8.2.2015: Vim9: literal dict #{} is not like any other language
Bram Moolenaar <Bram@vim.org>
parents: 22723
diff changeset
115 that starts a comment.
20115
bd021eb62e73 Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 20023
diff changeset
116
20023
c85d4e173cc9 patch 8.2.0567: Vim9: cannot put comments halfway expressions
Bram Moolenaar <Bram@vim.org>
parents: 20015
diff changeset
117
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
118 Vim9 functions ~
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
119
20241
56265f711890 Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 20115
diff changeset
120 A function defined with `:def` is compiled. Execution is many times faster,
56265f711890 Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 20115
diff changeset
121 often 10x to 100x times.
56265f711890 Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 20115
diff changeset
122
20552
74e3316c1d5a Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 20379
diff changeset
123 Many errors are already found when compiling, before the function is executed.
20241
56265f711890 Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 20115
diff changeset
124 The syntax is strict, to enforce code that is easy to read and understand.
56265f711890 Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 20115
diff changeset
125
23164
99ef85ff1af4 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 23088
diff changeset
126 Compilation is done when either of these is encountered:
99ef85ff1af4 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 23088
diff changeset
127 - the first time the function is called
21991
bbca88cd13d5 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 21825
diff changeset
128 - when the `:defcompile` command is encountered in the script where the
bbca88cd13d5 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 21825
diff changeset
129 function was defined
bbca88cd13d5 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 21825
diff changeset
130 - `:disassemble` is used for the function.
bbca88cd13d5 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 21825
diff changeset
131 - a function that is compiled calls the function or uses it as a function
bbca88cd13d5 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 21825
diff changeset
132 reference
20552
74e3316c1d5a Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 20379
diff changeset
133
74e3316c1d5a Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 20379
diff changeset
134 `:def` has no options like `:function` does: "range", "abort", "dict" or
23164
99ef85ff1af4 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 23088
diff changeset
135 "closure". A `:def` function always aborts on an error (unless `:silent!` was
99ef85ff1af4 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 23088
diff changeset
136 used for the command or inside a `:try` block), does not get a range passed
23305
fab58304f77d Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 23164
diff changeset
137 cannot be a "dict" function, and can always be a closure.
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
138
20241
56265f711890 Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 20115
diff changeset
139 The argument types and return type need to be specified. The "any" type can
56265f711890 Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 20115
diff changeset
140 be used, type checking will then be done at runtime, like with legacy
56265f711890 Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 20115
diff changeset
141 functions.
56265f711890 Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 20115
diff changeset
142
21825
0db0640e16e0 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 21771
diff changeset
143 Arguments are accessed by name, without "a:", just like any other language.
0db0640e16e0 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 21771
diff changeset
144 There is no "a:" dictionary or "a:000" list.
20241
56265f711890 Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 20115
diff changeset
145
56265f711890 Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 20115
diff changeset
146 Variable arguments are defined as the last argument, with a name and have a
21825
0db0640e16e0 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 21771
diff changeset
147 list type, similar to TypeScript. For example, a list of numbers: >
22171
d4c7b3e9cd17 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 21991
diff changeset
148 def MyFunc(...itemlist: list<number>)
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
149 for item in itemlist
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
150 ...
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
151
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
152
20241
56265f711890 Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 20115
diff changeset
153 Functions and variables are script-local by default ~
20856
83cfa1ef1bf2 Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 20552
diff changeset
154 *vim9-scopes*
20115
bd021eb62e73 Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 20023
diff changeset
155 When using `:function` or `:def` to specify a new function at the script level
bd021eb62e73 Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 20023
diff changeset
156 in a Vim9 script, the function is local to the script, as if "s:" was
22494
4c21f7f6f9e3 patch 8.2.1795: Vim9: operators && and || have a confusing result
Bram Moolenaar <Bram@vim.org>
parents: 22441
diff changeset
157 prefixed. Using the "s:" prefix is optional. To define a global function or
4c21f7f6f9e3 patch 8.2.1795: Vim9: operators && and || have a confusing result
Bram Moolenaar <Bram@vim.org>
parents: 22441
diff changeset
158 variable the "g:" prefix must be used. For functions in an autoload script
4c21f7f6f9e3 patch 8.2.1795: Vim9: operators && and || have a confusing result
Bram Moolenaar <Bram@vim.org>
parents: 22441
diff changeset
159 the "name#" prefix is sufficient. >
21550
b0b57d91671c patch 8.2.1325: Vim9: using Vim9 script for autaload not tested
Bram Moolenaar <Bram@vim.org>
parents: 21516
diff changeset
160 def ThisFunction() # script-local
b0b57d91671c patch 8.2.1325: Vim9: using Vim9 script for autaload not tested
Bram Moolenaar <Bram@vim.org>
parents: 21516
diff changeset
161 def s:ThisFunction() # script-local
22171
d4c7b3e9cd17 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 21991
diff changeset
162 def g:ThatFunction() # global
21550
b0b57d91671c patch 8.2.1325: Vim9: using Vim9 script for autaload not tested
Bram Moolenaar <Bram@vim.org>
parents: 21516
diff changeset
163 def scriptname#function() # autoload
20115
bd021eb62e73 Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 20023
diff changeset
164
22494
4c21f7f6f9e3 patch 8.2.1795: Vim9: operators && and || have a confusing result
Bram Moolenaar <Bram@vim.org>
parents: 22441
diff changeset
165 When using `:function` or `:def` to specify a nested function inside a `:def`
4c21f7f6f9e3 patch 8.2.1795: Vim9: operators && and || have a confusing result
Bram Moolenaar <Bram@vim.org>
parents: 22441
diff changeset
166 function, this nested function is local to the code block it is defined in.
22565
17c4178f26ea Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22500
diff changeset
167 In a `:def` function it is not possible to define a script-local function. It
22494
4c21f7f6f9e3 patch 8.2.1795: Vim9: operators && and || have a confusing result
Bram Moolenaar <Bram@vim.org>
parents: 22441
diff changeset
168 is possible to define a global function by using the "g:" prefix.
20115
bd021eb62e73 Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 20023
diff changeset
169
bd021eb62e73 Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 20023
diff changeset
170 When referring to a function and no "s:" or "g:" prefix is used, Vim will
22500
ef8a3177edc1 patch 8.2.1798: Vim9: trinary operator condition is too permissive
Bram Moolenaar <Bram@vim.org>
parents: 22494
diff changeset
171 search for the function:
22565
17c4178f26ea Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22500
diff changeset
172 - in the function scope, in block scopes
22500
ef8a3177edc1 patch 8.2.1798: Vim9: trinary operator condition is too permissive
Bram Moolenaar <Bram@vim.org>
parents: 22494
diff changeset
173 - in the script scope, possibly imported
ef8a3177edc1 patch 8.2.1798: Vim9: trinary operator condition is too permissive
Bram Moolenaar <Bram@vim.org>
parents: 22494
diff changeset
174 - in the list of global functions
ef8a3177edc1 patch 8.2.1798: Vim9: trinary operator condition is too permissive
Bram Moolenaar <Bram@vim.org>
parents: 22494
diff changeset
175 However, it is recommended to always use "g:" to refer to a global function
ef8a3177edc1 patch 8.2.1798: Vim9: trinary operator condition is too permissive
Bram Moolenaar <Bram@vim.org>
parents: 22494
diff changeset
176 for clarity.
ef8a3177edc1 patch 8.2.1798: Vim9: trinary operator condition is too permissive
Bram Moolenaar <Bram@vim.org>
parents: 22494
diff changeset
177
ef8a3177edc1 patch 8.2.1798: Vim9: trinary operator condition is too permissive
Bram Moolenaar <Bram@vim.org>
parents: 22494
diff changeset
178 In all cases the function must be defined before used. That is when it is
22723
5b7ea82bc18f Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22565
diff changeset
179 called, when `:defcompile` causes it to be compiled, or when code that calls
5b7ea82bc18f Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22565
diff changeset
180 it is being compiled (to figure out the return type).
20241
56265f711890 Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 20115
diff changeset
181
21676
1b345fb68ae3 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 21584
diff changeset
182 The result is that functions and variables without a namespace can usually be
20241
56265f711890 Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 20115
diff changeset
183 found in the script, either defined there or imported. Global functions and
21676
1b345fb68ae3 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 21584
diff changeset
184 variables could be defined anywhere (good luck finding out where!).
20115
bd021eb62e73 Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 20023
diff changeset
185
21825
0db0640e16e0 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 21771
diff changeset
186 Global functions can still be defined and deleted at nearly any time. In
20317
2334bf788e8a Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 20241
diff changeset
187 Vim9 script script-local functions are defined once when the script is sourced
20552
74e3316c1d5a Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 20379
diff changeset
188 and cannot be deleted or replaced.
20115
bd021eb62e73 Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 20023
diff changeset
189
23305
fab58304f77d Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 23164
diff changeset
190 When compiling a function and a function call is encountered for a function
fab58304f77d Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 23164
diff changeset
191 that is not (yet) defined, the |FuncUndefined| autocommand is not triggered.
fab58304f77d Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 23164
diff changeset
192 You can use an autoload function if needed, or call a legacy function and have
fab58304f77d Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 23164
diff changeset
193 |FuncUndefined| triggered there.
fab58304f77d Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 23164
diff changeset
194
20115
bd021eb62e73 Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 20023
diff changeset
195
22391
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
196 Variable declarations with :var, :final and :const ~
22494
4c21f7f6f9e3 patch 8.2.1795: Vim9: operators && and || have a confusing result
Bram Moolenaar <Bram@vim.org>
parents: 22441
diff changeset
197 *vim9-declaration* *:var*
22391
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
198 Local variables need to be declared with `:var`. Local constants need to be
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
199 declared with `:final` or `:const`. We refer to both as "variables" in this
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
200 section.
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
201
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
202 Variables can be local to a script, function or code block: >
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
203 vim9script
22391
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
204 var script_var = 123
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
205 def SomeFunc()
22391
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
206 var func_var = script_var
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
207 if cond
22391
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
208 var block_var = func_var
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
209 ...
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
210
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
211 The variables are only visible in the block where they are defined and nested
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
212 blocks. Once the block ends the variable is no longer accessible: >
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
213 if cond
22391
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
214 var inner = 5
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
215 else
22391
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
216 var inner = 0
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
217 endif
22171
d4c7b3e9cd17 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 21991
diff changeset
218 echo inner # Error!
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
219
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
220 The declaration must be done earlier: >
22391
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
221 var inner: number
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
222 if cond
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
223 inner = 5
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
224 else
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
225 inner = 0
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
226 endif
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
227 echo inner
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
228
22391
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
229 To intentionally hide a variable from code that follows, a block can be
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
230 used: >
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
231 {
22391
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
232 var temp = 'temp'
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
233 ...
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
234 }
22171
d4c7b3e9cd17 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 21991
diff changeset
235 echo temp # Error!
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
236
22272
eb1f5f618c75 patch 8.2.1685: Vim9: cannot declare a constant value
Bram Moolenaar <Bram@vim.org>
parents: 22171
diff changeset
237 Declaring a variable with a type but without an initializer will initialize to
eb1f5f618c75 patch 8.2.1685: Vim9: cannot declare a constant value
Bram Moolenaar <Bram@vim.org>
parents: 22171
diff changeset
238 zero, false or empty.
eb1f5f618c75 patch 8.2.1685: Vim9: cannot declare a constant value
Bram Moolenaar <Bram@vim.org>
parents: 22171
diff changeset
239
22391
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
240 In Vim9 script `:let` cannot be used. An existing variable is assigned to
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
241 without any command. The same for global, window, tab, buffer and Vim
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
242 variables, because they are not really declared. They can also be deleted
21584
d0c76ce48326 patch 8.2.1342: Vim9: accidentally using "t" gives a confusing error
Bram Moolenaar <Bram@vim.org>
parents: 21550
diff changeset
243 with `:unlet`.
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
244
21676
1b345fb68ae3 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 21584
diff changeset
245 Variables and functions cannot shadow previously defined or imported variables
1b345fb68ae3 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 21584
diff changeset
246 and functions.
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
247 Variables may shadow Ex commands, rename the variable if needed.
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
248
20241
56265f711890 Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 20115
diff changeset
249 Global variables and user defined functions must be prefixed with "g:", also
56265f711890 Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 20115
diff changeset
250 at the script level. >
19968
1908e92b02fd Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 19904
diff changeset
251 vim9script
22391
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
252 var script_local = 'text'
21499
3a1ed539ae2a Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 21353
diff changeset
253 g:global = 'value'
22391
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
254 var Funcref = g:ThatFunction
19968
1908e92b02fd Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 19904
diff changeset
255
22391
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
256 Since `&opt = value` is now assigning a value to option "opt", ":&" cannot be
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
257 used to repeat a `:substitute` command.
22391
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
258
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
259
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
260 Constants ~
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
261 *vim9-const* *vim9-final*
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
262 How constants work varies between languages. Some consider a variable that
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
263 can't be assigned another value a constant. JavaScript is an example. Others
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
264 also make the value immutable, thus when a constant uses a list, the list
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
265 cannot be changed. In Vim9 we can use both.
22272
eb1f5f618c75 patch 8.2.1685: Vim9: cannot declare a constant value
Bram Moolenaar <Bram@vim.org>
parents: 22171
diff changeset
266
22391
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
267 `:const` is used for making both the variable and the value a constant. Use
22272
eb1f5f618c75 patch 8.2.1685: Vim9: cannot declare a constant value
Bram Moolenaar <Bram@vim.org>
parents: 22171
diff changeset
268 this for composite structures that you want to make sure will not be modified.
22391
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
269 Example: >
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
270 const myList = [1, 2]
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
271 myList = [3, 4] # Error!
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
272 myList[0] = 9 # Error!
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
273 muList->add(3) # Error!
22494
4c21f7f6f9e3 patch 8.2.1795: Vim9: operators && and || have a confusing result
Bram Moolenaar <Bram@vim.org>
parents: 22441
diff changeset
274 < *:final*
22391
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
275 `:final` is used for making only the variable a constant, the value can be
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
276 changed. This is well known from Java. Example: >
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
277 final myList = [1, 2]
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
278 myList = [3, 4] # Error!
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
279 myList[0] = 9 # OK
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
280 muList->add(3) # OK
22272
eb1f5f618c75 patch 8.2.1685: Vim9: cannot declare a constant value
Bram Moolenaar <Bram@vim.org>
parents: 22171
diff changeset
281
eb1f5f618c75 patch 8.2.1685: Vim9: cannot declare a constant value
Bram Moolenaar <Bram@vim.org>
parents: 22171
diff changeset
282 It is common to write constants as ALL_CAPS, but you don't have to.
eb1f5f618c75 patch 8.2.1685: Vim9: cannot declare a constant value
Bram Moolenaar <Bram@vim.org>
parents: 22171
diff changeset
283
eb1f5f618c75 patch 8.2.1685: Vim9: cannot declare a constant value
Bram Moolenaar <Bram@vim.org>
parents: 22171
diff changeset
284 The constant only applies to the value itself, not what it refers to. >
22391
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
285 final females = ["Mary"]
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
286 const NAMES = [["John", "Peter"], females]
22272
eb1f5f618c75 patch 8.2.1685: Vim9: cannot declare a constant value
Bram Moolenaar <Bram@vim.org>
parents: 22171
diff changeset
287 NAMES[0] = ["Jack"] # Error!
22391
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
288 NAMES[0][0] = "Jack" # Error!
22272
eb1f5f618c75 patch 8.2.1685: Vim9: cannot declare a constant value
Bram Moolenaar <Bram@vim.org>
parents: 22171
diff changeset
289 NAMES[1] = ["Emma"] # Error!
eb1f5f618c75 patch 8.2.1685: Vim9: cannot declare a constant value
Bram Moolenaar <Bram@vim.org>
parents: 22171
diff changeset
290 Names[1][0] = "Emma" # OK, now females[0] == "Emma"
eb1f5f618c75 patch 8.2.1685: Vim9: cannot declare a constant value
Bram Moolenaar <Bram@vim.org>
parents: 22171
diff changeset
291
22391
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
292 < *E1092*
21499
3a1ed539ae2a Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 21353
diff changeset
293 Declaring more than one variable at a time, using the unpack notation, is
3a1ed539ae2a Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 21353
diff changeset
294 currently not supported: >
22391
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
295 var [v1, v2] = GetValues() # Error!
21499
3a1ed539ae2a Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 21353
diff changeset
296 That is because the type needs to be inferred from the list item type, which
3a1ed539ae2a Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 21353
diff changeset
297 isn't that easy.
3a1ed539ae2a Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 21353
diff changeset
298
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
299
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
300 Omitting :call and :eval ~
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
301
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
302 Functions can be called without `:call`: >
22171
d4c7b3e9cd17 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 21991
diff changeset
303 writefile(lines, 'file')
19303
51bc26d4a393 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 19181
diff changeset
304 Using `:call` is still possible, but this is discouraged.
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
305
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
306 A method call without `eval` is possible, so long as the start is an
21516
c7b2ce90c2de patch 8.2.1308: Vim9: accidentally using "x" causes Vim to exit
Bram Moolenaar <Bram@vim.org>
parents: 21499
diff changeset
307 identifier or can't be an Ex command. Examples: >
c7b2ce90c2de patch 8.2.1308: Vim9: accidentally using "x" causes Vim to exit
Bram Moolenaar <Bram@vim.org>
parents: 21499
diff changeset
308 myList->add(123)
c7b2ce90c2de patch 8.2.1308: Vim9: accidentally using "x" causes Vim to exit
Bram Moolenaar <Bram@vim.org>
parents: 21499
diff changeset
309 g:myList->add(123)
c7b2ce90c2de patch 8.2.1308: Vim9: accidentally using "x" causes Vim to exit
Bram Moolenaar <Bram@vim.org>
parents: 21499
diff changeset
310 [1, 2, 3]->Process()
22936
00b0275ffe7f patch 8.2.2015: Vim9: literal dict #{} is not like any other language
Bram Moolenaar <Bram@vim.org>
parents: 22723
diff changeset
311 {a: 1, b: 2}->Process()
21516
c7b2ce90c2de patch 8.2.1308: Vim9: accidentally using "x" causes Vim to exit
Bram Moolenaar <Bram@vim.org>
parents: 21499
diff changeset
312 "foobar"->Process()
c7b2ce90c2de patch 8.2.1308: Vim9: accidentally using "x" causes Vim to exit
Bram Moolenaar <Bram@vim.org>
parents: 21499
diff changeset
313 ("foobar")->Process()
c7b2ce90c2de patch 8.2.1308: Vim9: accidentally using "x" causes Vim to exit
Bram Moolenaar <Bram@vim.org>
parents: 21499
diff changeset
314 'foobar'->Process()
c7b2ce90c2de patch 8.2.1308: Vim9: accidentally using "x" causes Vim to exit
Bram Moolenaar <Bram@vim.org>
parents: 21499
diff changeset
315 ('foobar')->Process()
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
316
21825
0db0640e16e0 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 21771
diff changeset
317 In the rare case there is ambiguity between a function name and an Ex command,
21676
1b345fb68ae3 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 21584
diff changeset
318 prepend ":" to make clear you want to use the Ex command. For example, there
1b345fb68ae3 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 21584
diff changeset
319 is both the `:substitute` command and the `substitute()` function. When the
1b345fb68ae3 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 21584
diff changeset
320 line starts with `substitute(` this will use the function. Prepend a colon to
1b345fb68ae3 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 21584
diff changeset
321 use the command instead: >
19481
c27837cbe922 patch 8.2.0298: Vim9 script: cannot start command with a string constant
Bram Moolenaar <Bram@vim.org>
parents: 19473
diff changeset
322 :substitute(pattern (replacement (
19473
b09afbebffee patch 8.2.0294: cannot use Ex command that is also a function name
Bram Moolenaar <Bram@vim.org>
parents: 19404
diff changeset
323
19556
ff5048b0ccfe patch 8.2.0335: no completion for :disassemble
Bram Moolenaar <Bram@vim.org>
parents: 19523
diff changeset
324 Note that while variables need to be defined before they can be used,
21825
0db0640e16e0 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 21771
diff changeset
325 functions can be called before being defined. This is required to allow
0db0640e16e0 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 21771
diff changeset
326 for cyclic dependencies between functions. It is slightly less efficient,
19556
ff5048b0ccfe patch 8.2.0335: no completion for :disassemble
Bram Moolenaar <Bram@vim.org>
parents: 19523
diff changeset
327 since the function has to be looked up by name. And a typo in the function
21516
c7b2ce90c2de patch 8.2.1308: Vim9: accidentally using "x" causes Vim to exit
Bram Moolenaar <Bram@vim.org>
parents: 21499
diff changeset
328 name will only be found when the function is called.
19556
ff5048b0ccfe patch 8.2.0335: no completion for :disassemble
Bram Moolenaar <Bram@vim.org>
parents: 19523
diff changeset
329
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
330
19968
1908e92b02fd Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 19904
diff changeset
331 Omitting function() ~
1908e92b02fd Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 19904
diff changeset
332
1908e92b02fd Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 19904
diff changeset
333 A user defined function can be used as a function reference in an expression
1908e92b02fd Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 19904
diff changeset
334 without `function()`. The argument types and return type will then be checked.
1908e92b02fd Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 19904
diff changeset
335 The function must already have been defined. >
1908e92b02fd Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 19904
diff changeset
336
22391
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
337 var Funcref = MyFunction
19968
1908e92b02fd Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 19904
diff changeset
338
1908e92b02fd Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 19904
diff changeset
339 When using `function()` the resulting type is "func", a function with any
1908e92b02fd Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 19904
diff changeset
340 number of arguments and any return type. The function can be defined later.
1908e92b02fd Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 19904
diff changeset
341
1908e92b02fd Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 19904
diff changeset
342
23318
c76240efdf02 patch 8.2.2204: Vim9: using -> both for method and lambda is confusing
Bram Moolenaar <Bram@vim.org>
parents: 23305
diff changeset
343 Lamba using => instead of -> ~
c76240efdf02 patch 8.2.2204: Vim9: using -> both for method and lambda is confusing
Bram Moolenaar <Bram@vim.org>
parents: 23305
diff changeset
344
c76240efdf02 patch 8.2.2204: Vim9: using -> both for method and lambda is confusing
Bram Moolenaar <Bram@vim.org>
parents: 23305
diff changeset
345 In legacy script there can be confusion between using "->" for a method call
c76240efdf02 patch 8.2.2204: Vim9: using -> both for method and lambda is confusing
Bram Moolenaar <Bram@vim.org>
parents: 23305
diff changeset
346 and for a lambda. Also, when a "{" is found the parser needs to figure out if
c76240efdf02 patch 8.2.2204: Vim9: using -> both for method and lambda is confusing
Bram Moolenaar <Bram@vim.org>
parents: 23305
diff changeset
347 it is the start of a lambda or a dictionary, which is now more complicated
c76240efdf02 patch 8.2.2204: Vim9: using -> both for method and lambda is confusing
Bram Moolenaar <Bram@vim.org>
parents: 23305
diff changeset
348 because of the use of argument types.
c76240efdf02 patch 8.2.2204: Vim9: using -> both for method and lambda is confusing
Bram Moolenaar <Bram@vim.org>
parents: 23305
diff changeset
349
c76240efdf02 patch 8.2.2204: Vim9: using -> both for method and lambda is confusing
Bram Moolenaar <Bram@vim.org>
parents: 23305
diff changeset
350 To avoid these problems Vim9 script uses a different syntax for a lambda,
c76240efdf02 patch 8.2.2204: Vim9: using -> both for method and lambda is confusing
Bram Moolenaar <Bram@vim.org>
parents: 23305
diff changeset
351 which is similar to Javascript: >
c76240efdf02 patch 8.2.2204: Vim9: using -> both for method and lambda is confusing
Bram Moolenaar <Bram@vim.org>
parents: 23305
diff changeset
352 var Lambda = (arg) => expression
c76240efdf02 patch 8.2.2204: Vim9: using -> both for method and lambda is confusing
Bram Moolenaar <Bram@vim.org>
parents: 23305
diff changeset
353
c76240efdf02 patch 8.2.2204: Vim9: using -> both for method and lambda is confusing
Bram Moolenaar <Bram@vim.org>
parents: 23305
diff changeset
354 No line break is allowed in the arguments of a lambda up to and includeing the
c76240efdf02 patch 8.2.2204: Vim9: using -> both for method and lambda is confusing
Bram Moolenaar <Bram@vim.org>
parents: 23305
diff changeset
355 "=>". This is OK: >
c76240efdf02 patch 8.2.2204: Vim9: using -> both for method and lambda is confusing
Bram Moolenaar <Bram@vim.org>
parents: 23305
diff changeset
356 filter(list, (k, v) =>
c76240efdf02 patch 8.2.2204: Vim9: using -> both for method and lambda is confusing
Bram Moolenaar <Bram@vim.org>
parents: 23305
diff changeset
357 v > 0)
c76240efdf02 patch 8.2.2204: Vim9: using -> both for method and lambda is confusing
Bram Moolenaar <Bram@vim.org>
parents: 23305
diff changeset
358 This does not work: >
c76240efdf02 patch 8.2.2204: Vim9: using -> both for method and lambda is confusing
Bram Moolenaar <Bram@vim.org>
parents: 23305
diff changeset
359 filter(list, (k, v)
c76240efdf02 patch 8.2.2204: Vim9: using -> both for method and lambda is confusing
Bram Moolenaar <Bram@vim.org>
parents: 23305
diff changeset
360 => v > 0)
c76240efdf02 patch 8.2.2204: Vim9: using -> both for method and lambda is confusing
Bram Moolenaar <Bram@vim.org>
parents: 23305
diff changeset
361 This also does not work:
c76240efdf02 patch 8.2.2204: Vim9: using -> both for method and lambda is confusing
Bram Moolenaar <Bram@vim.org>
parents: 23305
diff changeset
362 filter(list, (k,
c76240efdf02 patch 8.2.2204: Vim9: using -> both for method and lambda is confusing
Bram Moolenaar <Bram@vim.org>
parents: 23305
diff changeset
363 v) => v > 0)
c76240efdf02 patch 8.2.2204: Vim9: using -> both for method and lambda is confusing
Bram Moolenaar <Bram@vim.org>
parents: 23305
diff changeset
364
c76240efdf02 patch 8.2.2204: Vim9: using -> both for method and lambda is confusing
Bram Moolenaar <Bram@vim.org>
parents: 23305
diff changeset
365 Additionally, a lambda can contain statements in {}: >
c76240efdf02 patch 8.2.2204: Vim9: using -> both for method and lambda is confusing
Bram Moolenaar <Bram@vim.org>
parents: 23305
diff changeset
366 var Lambda = (arg) => {
c76240efdf02 patch 8.2.2204: Vim9: using -> both for method and lambda is confusing
Bram Moolenaar <Bram@vim.org>
parents: 23305
diff changeset
367 g:was_called = 'yes'
c76240efdf02 patch 8.2.2204: Vim9: using -> both for method and lambda is confusing
Bram Moolenaar <Bram@vim.org>
parents: 23305
diff changeset
368 return expression
c76240efdf02 patch 8.2.2204: Vim9: using -> both for method and lambda is confusing
Bram Moolenaar <Bram@vim.org>
parents: 23305
diff changeset
369 }
c76240efdf02 patch 8.2.2204: Vim9: using -> both for method and lambda is confusing
Bram Moolenaar <Bram@vim.org>
parents: 23305
diff changeset
370 NOT IMPLEMENTED YET
c76240efdf02 patch 8.2.2204: Vim9: using -> both for method and lambda is confusing
Bram Moolenaar <Bram@vim.org>
parents: 23305
diff changeset
371
c76240efdf02 patch 8.2.2204: Vim9: using -> both for method and lambda is confusing
Bram Moolenaar <Bram@vim.org>
parents: 23305
diff changeset
372 Note that the "{" must be followed by white space, otherwise it is assumed to
c76240efdf02 patch 8.2.2204: Vim9: using -> both for method and lambda is confusing
Bram Moolenaar <Bram@vim.org>
parents: 23305
diff changeset
373 be the start of a dictionary: >
c76240efdf02 patch 8.2.2204: Vim9: using -> both for method and lambda is confusing
Bram Moolenaar <Bram@vim.org>
parents: 23305
diff changeset
374 var Lambda = (arg) => {key: 42}
c76240efdf02 patch 8.2.2204: Vim9: using -> both for method and lambda is confusing
Bram Moolenaar <Bram@vim.org>
parents: 23305
diff changeset
375
c76240efdf02 patch 8.2.2204: Vim9: using -> both for method and lambda is confusing
Bram Moolenaar <Bram@vim.org>
parents: 23305
diff changeset
376
19999
844c7646f61b patch 8.2.0555: Vim9: line continuation is not always needed
Bram Moolenaar <Bram@vim.org>
parents: 19968
diff changeset
377 Automatic line continuation ~
844c7646f61b patch 8.2.0555: Vim9: line continuation is not always needed
Bram Moolenaar <Bram@vim.org>
parents: 19968
diff changeset
378
844c7646f61b patch 8.2.0555: Vim9: line continuation is not always needed
Bram Moolenaar <Bram@vim.org>
parents: 19968
diff changeset
379 In many cases it is obvious that an expression continues on the next line. In
21676
1b345fb68ae3 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 21584
diff changeset
380 those cases there is no need to prefix the line with a backslash
1b345fb68ae3 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 21584
diff changeset
381 |line-continuation|. For example, when a list spans multiple lines: >
22391
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
382 var mylist = [
19999
844c7646f61b patch 8.2.0555: Vim9: line continuation is not always needed
Bram Moolenaar <Bram@vim.org>
parents: 19968
diff changeset
383 'one',
844c7646f61b patch 8.2.0555: Vim9: line continuation is not always needed
Bram Moolenaar <Bram@vim.org>
parents: 19968
diff changeset
384 'two',
844c7646f61b patch 8.2.0555: Vim9: line continuation is not always needed
Bram Moolenaar <Bram@vim.org>
parents: 19968
diff changeset
385 ]
20011
628011800942 patch 8.2.0561: Vim9: cannot split function call in multiple lines
Bram Moolenaar <Bram@vim.org>
parents: 19999
diff changeset
386 And when a dict spans multiple lines: >
22936
00b0275ffe7f patch 8.2.2015: Vim9: literal dict #{} is not like any other language
Bram Moolenaar <Bram@vim.org>
parents: 22723
diff changeset
387 var mydict = {
20011
628011800942 patch 8.2.0561: Vim9: cannot split function call in multiple lines
Bram Moolenaar <Bram@vim.org>
parents: 19999
diff changeset
388 one: 1,
628011800942 patch 8.2.0561: Vim9: cannot split function call in multiple lines
Bram Moolenaar <Bram@vim.org>
parents: 19999
diff changeset
389 two: 2,
628011800942 patch 8.2.0561: Vim9: cannot split function call in multiple lines
Bram Moolenaar <Bram@vim.org>
parents: 19999
diff changeset
390 }
628011800942 patch 8.2.0561: Vim9: cannot split function call in multiple lines
Bram Moolenaar <Bram@vim.org>
parents: 19999
diff changeset
391 Function call: >
22391
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
392 var result = Func(
20011
628011800942 patch 8.2.0561: Vim9: cannot split function call in multiple lines
Bram Moolenaar <Bram@vim.org>
parents: 19999
diff changeset
393 arg1,
628011800942 patch 8.2.0561: Vim9: cannot split function call in multiple lines
Bram Moolenaar <Bram@vim.org>
parents: 19999
diff changeset
394 arg2
628011800942 patch 8.2.0561: Vim9: cannot split function call in multiple lines
Bram Moolenaar <Bram@vim.org>
parents: 19999
diff changeset
395 )
628011800942 patch 8.2.0561: Vim9: cannot split function call in multiple lines
Bram Moolenaar <Bram@vim.org>
parents: 19999
diff changeset
396
20982
bb49b5090a9c patch 8.2.1042: Vim9: cannot put an operator on the next line
Bram Moolenaar <Bram@vim.org>
parents: 20965
diff changeset
397 For binary operators in expressions not in [], {} or () a line break is
bb49b5090a9c patch 8.2.1042: Vim9: cannot put an operator on the next line
Bram Moolenaar <Bram@vim.org>
parents: 20965
diff changeset
398 possible just before or after the operator. For example: >
22391
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
399 var text = lead
20982
bb49b5090a9c patch 8.2.1042: Vim9: cannot put an operator on the next line
Bram Moolenaar <Bram@vim.org>
parents: 20965
diff changeset
400 .. middle
bb49b5090a9c patch 8.2.1042: Vim9: cannot put an operator on the next line
Bram Moolenaar <Bram@vim.org>
parents: 20965
diff changeset
401 .. end
22391
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
402 var total = start +
20013
bf377a9ffccb patch 8.2.0562: Vim9: cannot split an expression into multiple lines
Bram Moolenaar <Bram@vim.org>
parents: 20011
diff changeset
403 end -
bf377a9ffccb patch 8.2.0562: Vim9: cannot split an expression into multiple lines
Bram Moolenaar <Bram@vim.org>
parents: 20011
diff changeset
404 correction
22391
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
405 var result = positive
20982
bb49b5090a9c patch 8.2.1042: Vim9: cannot put an operator on the next line
Bram Moolenaar <Bram@vim.org>
parents: 20965
diff changeset
406 ? PosFunc(arg)
bb49b5090a9c patch 8.2.1042: Vim9: cannot put an operator on the next line
Bram Moolenaar <Bram@vim.org>
parents: 20965
diff changeset
407 : NegFunc(arg)
20013
bf377a9ffccb patch 8.2.0562: Vim9: cannot split an expression into multiple lines
Bram Moolenaar <Bram@vim.org>
parents: 20011
diff changeset
408
21499
3a1ed539ae2a Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 21353
diff changeset
409 For a method call using "->" and a member using a dot, a line break is allowed
3a1ed539ae2a Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 21353
diff changeset
410 before it: >
22391
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
411 var result = GetBuilder()
20965
59f93c2d2551 Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 20856
diff changeset
412 ->BuilderSetWidth(333)
59f93c2d2551 Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 20856
diff changeset
413 ->BuilderSetHeight(777)
59f93c2d2551 Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 20856
diff changeset
414 ->BuilderBuild()
22391
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
415 var result = MyDict
21499
3a1ed539ae2a Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 21353
diff changeset
416 .member
20965
59f93c2d2551 Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 20856
diff changeset
417
20982
bb49b5090a9c patch 8.2.1042: Vim9: cannot put an operator on the next line
Bram Moolenaar <Bram@vim.org>
parents: 20965
diff changeset
418 < *E1050*
bb49b5090a9c patch 8.2.1042: Vim9: cannot put an operator on the next line
Bram Moolenaar <Bram@vim.org>
parents: 20965
diff changeset
419 To make it possible for the operator at the start of the line to be
21250
21fb2a3ad3ca Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 21093
diff changeset
420 recognized, it is required to put a colon before a range. This will add
20982
bb49b5090a9c patch 8.2.1042: Vim9: cannot put an operator on the next line
Bram Moolenaar <Bram@vim.org>
parents: 20965
diff changeset
421 "start" and print: >
22391
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
422 var result = start
20982
bb49b5090a9c patch 8.2.1042: Vim9: cannot put an operator on the next line
Bram Moolenaar <Bram@vim.org>
parents: 20965
diff changeset
423 + print
21250
21fb2a3ad3ca Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 21093
diff changeset
424 Like this: >
22391
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
425 var result = start + print
21250
21fb2a3ad3ca Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 21093
diff changeset
426
20982
bb49b5090a9c patch 8.2.1042: Vim9: cannot put an operator on the next line
Bram Moolenaar <Bram@vim.org>
parents: 20965
diff changeset
427 This will assign "start" and print a line: >
22391
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
428 var result = start
20982
bb49b5090a9c patch 8.2.1042: Vim9: cannot put an operator on the next line
Bram Moolenaar <Bram@vim.org>
parents: 20965
diff changeset
429 :+ print
19999
844c7646f61b patch 8.2.0555: Vim9: line continuation is not always needed
Bram Moolenaar <Bram@vim.org>
parents: 19968
diff changeset
430
23047
29c5f168c6fd Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 22958
diff changeset
431 Note that the colon is not required for the |+cmd| argument: >
29c5f168c6fd Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 22958
diff changeset
432 edit +6 fname
29c5f168c6fd Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 22958
diff changeset
433
20015
c001ee73519a patch 8.2.0563: Vim9: cannot split a function line
Bram Moolenaar <Bram@vim.org>
parents: 20013
diff changeset
434 It is also possible to split a function header over multiple lines, in between
c001ee73519a patch 8.2.0563: Vim9: cannot split a function line
Bram Moolenaar <Bram@vim.org>
parents: 20013
diff changeset
435 arguments: >
c001ee73519a patch 8.2.0563: Vim9: cannot split a function line
Bram Moolenaar <Bram@vim.org>
parents: 20013
diff changeset
436 def MyFunc(
c001ee73519a patch 8.2.0563: Vim9: cannot split a function line
Bram Moolenaar <Bram@vim.org>
parents: 20013
diff changeset
437 text: string,
c001ee73519a patch 8.2.0563: Vim9: cannot split a function line
Bram Moolenaar <Bram@vim.org>
parents: 20013
diff changeset
438 separator = '-'
c001ee73519a patch 8.2.0563: Vim9: cannot split a function line
Bram Moolenaar <Bram@vim.org>
parents: 20013
diff changeset
439 ): string
c001ee73519a patch 8.2.0563: Vim9: cannot split a function line
Bram Moolenaar <Bram@vim.org>
parents: 20013
diff changeset
440
23305
fab58304f77d Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 23164
diff changeset
441 Since a continuation line cannot be easily recognized the parsing of commands
23318
c76240efdf02 patch 8.2.2204: Vim9: using -> both for method and lambda is confusing
Bram Moolenaar <Bram@vim.org>
parents: 23305
diff changeset
442 has been made stricter. E.g., because of the error in the first line, the
23305
fab58304f77d Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 23164
diff changeset
443 second line is seen as a separate command: >
fab58304f77d Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 23164
diff changeset
444 popup_create(some invalid expression, {
fab58304f77d Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 23164
diff changeset
445 exit_cb: Func})
fab58304f77d Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 23164
diff changeset
446 Now "exit_cb: Func})" is actually a valid command: save any changes to the
fab58304f77d Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 23164
diff changeset
447 file "_cb: Func})" and exit. To avoid this kind of mistake in Vim9 script
fab58304f77d Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 23164
diff changeset
448 there must be white space between most command names and the argument.
fab58304f77d Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 23164
diff changeset
449
fab58304f77d Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 23164
diff changeset
450
21250
21fb2a3ad3ca Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 21093
diff changeset
451 Notes:
21fb2a3ad3ca Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 21093
diff changeset
452 - "enddef" cannot be used at the start of a continuation line, it ends the
21fb2a3ad3ca Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 21093
diff changeset
453 current function.
21fb2a3ad3ca Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 21093
diff changeset
454 - No line break is allowed in the LHS of an assignment. Specifically when
21fb2a3ad3ca Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 21093
diff changeset
455 unpacking a list |:let-unpack|. This is OK: >
22171
d4c7b3e9cd17 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 21991
diff changeset
456 [var1, var2] =
21250
21fb2a3ad3ca Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 21093
diff changeset
457 Func()
21fb2a3ad3ca Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 21093
diff changeset
458 < This does not work: >
22171
d4c7b3e9cd17 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 21991
diff changeset
459 [var1,
21250
21fb2a3ad3ca Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 21093
diff changeset
460 var2] =
21fb2a3ad3ca Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 21093
diff changeset
461 Func()
21fb2a3ad3ca Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 21093
diff changeset
462 - No line break is allowed in between arguments of an `:echo`, `:execute` and
21fb2a3ad3ca Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 21093
diff changeset
463 similar commands. This is OK: >
22171
d4c7b3e9cd17 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 21991
diff changeset
464 echo [1,
21250
21fb2a3ad3ca Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 21093
diff changeset
465 2] [3,
21fb2a3ad3ca Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 21093
diff changeset
466 4]
21fb2a3ad3ca Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 21093
diff changeset
467 < This does not work: >
22171
d4c7b3e9cd17 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 21991
diff changeset
468 echo [1, 2]
21250
21fb2a3ad3ca Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 21093
diff changeset
469 [3, 4]
19999
844c7646f61b patch 8.2.0555: Vim9: line continuation is not always needed
Bram Moolenaar <Bram@vim.org>
parents: 19968
diff changeset
470
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
471 No curly braces expansion ~
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
472
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
473 |curly-braces-names| cannot be used.
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
474
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
475
22936
00b0275ffe7f patch 8.2.2015: Vim9: literal dict #{} is not like any other language
Bram Moolenaar <Bram@vim.org>
parents: 22723
diff changeset
476 Dictionary literals ~
00b0275ffe7f patch 8.2.2015: Vim9: literal dict #{} is not like any other language
Bram Moolenaar <Bram@vim.org>
parents: 22723
diff changeset
477
00b0275ffe7f patch 8.2.2015: Vim9: literal dict #{} is not like any other language
Bram Moolenaar <Bram@vim.org>
parents: 22723
diff changeset
478 Traditionally Vim has supported dictionary literals with a {} syntax: >
00b0275ffe7f patch 8.2.2015: Vim9: literal dict #{} is not like any other language
Bram Moolenaar <Bram@vim.org>
parents: 22723
diff changeset
479 let dict = {'key': value}
00b0275ffe7f patch 8.2.2015: Vim9: literal dict #{} is not like any other language
Bram Moolenaar <Bram@vim.org>
parents: 22723
diff changeset
480
23088
285cde4b8d0e patch 8.2.2090: Vim9: dict does not accept a key in quotes
Bram Moolenaar <Bram@vim.org>
parents: 23047
diff changeset
481 Later it became clear that using a simple text key is very common, thus
285cde4b8d0e patch 8.2.2090: Vim9: dict does not accept a key in quotes
Bram Moolenaar <Bram@vim.org>
parents: 23047
diff changeset
482 literal dictionaries were introduced in a backwards compatible way: >
22936
00b0275ffe7f patch 8.2.2015: Vim9: literal dict #{} is not like any other language
Bram Moolenaar <Bram@vim.org>
parents: 22723
diff changeset
483 let dict = #{key: value}
00b0275ffe7f patch 8.2.2015: Vim9: literal dict #{} is not like any other language
Bram Moolenaar <Bram@vim.org>
parents: 22723
diff changeset
484
23088
285cde4b8d0e patch 8.2.2090: Vim9: dict does not accept a key in quotes
Bram Moolenaar <Bram@vim.org>
parents: 23047
diff changeset
485 However, this #{} syntax is unlike any existing language. As it turns out
285cde4b8d0e patch 8.2.2090: Vim9: dict does not accept a key in quotes
Bram Moolenaar <Bram@vim.org>
parents: 23047
diff changeset
486 that using a literal key is much more common than using an expression, and
22936
00b0275ffe7f patch 8.2.2015: Vim9: literal dict #{} is not like any other language
Bram Moolenaar <Bram@vim.org>
parents: 22723
diff changeset
487 considering that JavaScript uses this syntax, using the {} form for dictionary
23088
285cde4b8d0e patch 8.2.2090: Vim9: dict does not accept a key in quotes
Bram Moolenaar <Bram@vim.org>
parents: 23047
diff changeset
488 literals is considered a much more useful syntax. In Vim9 script the {} form
22936
00b0275ffe7f patch 8.2.2015: Vim9: literal dict #{} is not like any other language
Bram Moolenaar <Bram@vim.org>
parents: 22723
diff changeset
489 uses literal keys: >
00b0275ffe7f patch 8.2.2015: Vim9: literal dict #{} is not like any other language
Bram Moolenaar <Bram@vim.org>
parents: 22723
diff changeset
490 let dict = {key: value}
00b0275ffe7f patch 8.2.2015: Vim9: literal dict #{} is not like any other language
Bram Moolenaar <Bram@vim.org>
parents: 22723
diff changeset
491
23088
285cde4b8d0e patch 8.2.2090: Vim9: dict does not accept a key in quotes
Bram Moolenaar <Bram@vim.org>
parents: 23047
diff changeset
492 This works for alphanumeric characters, underscore and dash. If you want to
285cde4b8d0e patch 8.2.2090: Vim9: dict does not accept a key in quotes
Bram Moolenaar <Bram@vim.org>
parents: 23047
diff changeset
493 use another character, use a single or double quoted string: >
285cde4b8d0e patch 8.2.2090: Vim9: dict does not accept a key in quotes
Bram Moolenaar <Bram@vim.org>
parents: 23047
diff changeset
494 let dict = {'key with space': value}
285cde4b8d0e patch 8.2.2090: Vim9: dict does not accept a key in quotes
Bram Moolenaar <Bram@vim.org>
parents: 23047
diff changeset
495 let dict = {"key\twith\ttabs": value}
285cde4b8d0e patch 8.2.2090: Vim9: dict does not accept a key in quotes
Bram Moolenaar <Bram@vim.org>
parents: 23047
diff changeset
496 let dict = {'': value} # empty key
285cde4b8d0e patch 8.2.2090: Vim9: dict does not accept a key in quotes
Bram Moolenaar <Bram@vim.org>
parents: 23047
diff changeset
497
285cde4b8d0e patch 8.2.2090: Vim9: dict does not accept a key in quotes
Bram Moolenaar <Bram@vim.org>
parents: 23047
diff changeset
498 In case the key needs to be an expression, square brackets can be used, just
285cde4b8d0e patch 8.2.2090: Vim9: dict does not accept a key in quotes
Bram Moolenaar <Bram@vim.org>
parents: 23047
diff changeset
499 like in JavaScript: >
22936
00b0275ffe7f patch 8.2.2015: Vim9: literal dict #{} is not like any other language
Bram Moolenaar <Bram@vim.org>
parents: 22723
diff changeset
500 let dict = {["key" .. nr]: value}
00b0275ffe7f patch 8.2.2015: Vim9: literal dict #{} is not like any other language
Bram Moolenaar <Bram@vim.org>
parents: 22723
diff changeset
501
00b0275ffe7f patch 8.2.2015: Vim9: literal dict #{} is not like any other language
Bram Moolenaar <Bram@vim.org>
parents: 22723
diff changeset
502
21584
d0c76ce48326 patch 8.2.1342: Vim9: accidentally using "t" gives a confusing error
Bram Moolenaar <Bram@vim.org>
parents: 21550
diff changeset
503 No :xit, :t, :append, :change or :insert ~
19303
51bc26d4a393 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 19181
diff changeset
504
21584
d0c76ce48326 patch 8.2.1342: Vim9: accidentally using "t" gives a confusing error
Bram Moolenaar <Bram@vim.org>
parents: 21550
diff changeset
505 These commands are too easily confused with local variable names.
d0c76ce48326 patch 8.2.1342: Vim9: accidentally using "t" gives a confusing error
Bram Moolenaar <Bram@vim.org>
parents: 21550
diff changeset
506 Instead of `:x` or `:xit` you can use `:exit`.
d0c76ce48326 patch 8.2.1342: Vim9: accidentally using "t" gives a confusing error
Bram Moolenaar <Bram@vim.org>
parents: 21550
diff changeset
507 Instead of `:t` you can use `:copy`.
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
508
19303
51bc26d4a393 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 19181
diff changeset
509
51bc26d4a393 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 19181
diff changeset
510 Comparators ~
51bc26d4a393 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 19181
diff changeset
511
51bc26d4a393 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 19181
diff changeset
512 The 'ignorecase' option is not used for comparators that use strings.
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
513
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
514
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
515 White space ~
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
516
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
517 Vim9 script enforces proper use of white space. This is no longer allowed: >
22391
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
518 var name=234 # Error!
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
519 var name= 234 # Error!
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
520 var name =234 # Error!
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
521 There must be white space before and after the "=": >
22391
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
522 var name = 234 # OK
21250
21fb2a3ad3ca Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 21093
diff changeset
523 White space must also be put before the # that starts a comment after a
21fb2a3ad3ca Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 21093
diff changeset
524 command: >
22391
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
525 var name = 234# Error!
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
526 var name = 234 # OK
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
527
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
528 White space is required around most operators.
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
529
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
530 White space is not allowed:
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
531 - Between a function name and the "(": >
22171
d4c7b3e9cd17 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 21991
diff changeset
532 call Func (arg) # Error!
d4c7b3e9cd17 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 21991
diff changeset
533 call Func
d4c7b3e9cd17 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 21991
diff changeset
534 \ (arg) # Error!
d4c7b3e9cd17 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 21991
diff changeset
535 call Func(arg) # OK
d4c7b3e9cd17 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 21991
diff changeset
536 call Func(
d4c7b3e9cd17 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 21991
diff changeset
537 \ arg) # OK
d4c7b3e9cd17 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 21991
diff changeset
538 call Func(
d4c7b3e9cd17 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 21991
diff changeset
539 \ arg # OK
19473
b09afbebffee patch 8.2.0294: cannot use Ex command that is also a function name
Bram Moolenaar <Bram@vim.org>
parents: 19404
diff changeset
540 \ )
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
541
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
542
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
543 Conditions and expressions ~
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
544
22500
ef8a3177edc1 patch 8.2.1798: Vim9: trinary operator condition is too permissive
Bram Moolenaar <Bram@vim.org>
parents: 22494
diff changeset
545 Conditions and expressions are mostly working like they do in other languages.
ef8a3177edc1 patch 8.2.1798: Vim9: trinary operator condition is too permissive
Bram Moolenaar <Bram@vim.org>
parents: 22494
diff changeset
546 Some values are different from legacy Vim script:
ef8a3177edc1 patch 8.2.1798: Vim9: trinary operator condition is too permissive
Bram Moolenaar <Bram@vim.org>
parents: 22494
diff changeset
547 value legacy Vim script Vim9 script ~
ef8a3177edc1 patch 8.2.1798: Vim9: trinary operator condition is too permissive
Bram Moolenaar <Bram@vim.org>
parents: 22494
diff changeset
548 0 falsy falsy
ef8a3177edc1 patch 8.2.1798: Vim9: trinary operator condition is too permissive
Bram Moolenaar <Bram@vim.org>
parents: 22494
diff changeset
549 1 truthy truthy
ef8a3177edc1 patch 8.2.1798: Vim9: trinary operator condition is too permissive
Bram Moolenaar <Bram@vim.org>
parents: 22494
diff changeset
550 99 truthy Error!
ef8a3177edc1 patch 8.2.1798: Vim9: trinary operator condition is too permissive
Bram Moolenaar <Bram@vim.org>
parents: 22494
diff changeset
551 "0" falsy Error!
ef8a3177edc1 patch 8.2.1798: Vim9: trinary operator condition is too permissive
Bram Moolenaar <Bram@vim.org>
parents: 22494
diff changeset
552 "99" truthy Error!
ef8a3177edc1 patch 8.2.1798: Vim9: trinary operator condition is too permissive
Bram Moolenaar <Bram@vim.org>
parents: 22494
diff changeset
553 "text" falsy Error!
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
554
22500
ef8a3177edc1 patch 8.2.1798: Vim9: trinary operator condition is too permissive
Bram Moolenaar <Bram@vim.org>
parents: 22494
diff changeset
555 For the "??" operator and when using "!" then there is no error, every value
ef8a3177edc1 patch 8.2.1798: Vim9: trinary operator condition is too permissive
Bram Moolenaar <Bram@vim.org>
parents: 22494
diff changeset
556 is either falsy or truthy. This is mostly like JavaScript, except that an
ef8a3177edc1 patch 8.2.1798: Vim9: trinary operator condition is too permissive
Bram Moolenaar <Bram@vim.org>
parents: 22494
diff changeset
557 empty list and dict is falsy:
ef8a3177edc1 patch 8.2.1798: Vim9: trinary operator condition is too permissive
Bram Moolenaar <Bram@vim.org>
parents: 22494
diff changeset
558
ef8a3177edc1 patch 8.2.1798: Vim9: trinary operator condition is too permissive
Bram Moolenaar <Bram@vim.org>
parents: 22494
diff changeset
559 type truthy when ~
22272
eb1f5f618c75 patch 8.2.1685: Vim9: cannot declare a constant value
Bram Moolenaar <Bram@vim.org>
parents: 22171
diff changeset
560 bool v:true or 1
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
561 number non-zero
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
562 float non-zero
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
563 string non-empty
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
564 blob non-empty
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
565 list non-empty (different from JavaScript)
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
566 dictionary non-empty (different from JavaScript)
19968
1908e92b02fd Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 19904
diff changeset
567 func when there is a function name
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
568 special v:true
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
569 job when not NULL
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
570 channel when not NULL
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
571 class when not NULL
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
572 object when not NULL (TODO: when isTrue() returns v:true)
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
573
22494
4c21f7f6f9e3 patch 8.2.1795: Vim9: operators && and || have a confusing result
Bram Moolenaar <Bram@vim.org>
parents: 22441
diff changeset
574 The boolean operators "||" and "&&" expect the values to be boolean, zero or
4c21f7f6f9e3 patch 8.2.1795: Vim9: operators && and || have a confusing result
Bram Moolenaar <Bram@vim.org>
parents: 22441
diff changeset
575 one: >
4c21f7f6f9e3 patch 8.2.1795: Vim9: operators && and || have a confusing result
Bram Moolenaar <Bram@vim.org>
parents: 22441
diff changeset
576 1 || false == true
4c21f7f6f9e3 patch 8.2.1795: Vim9: operators && and || have a confusing result
Bram Moolenaar <Bram@vim.org>
parents: 22441
diff changeset
577 0 || 1 == true
4c21f7f6f9e3 patch 8.2.1795: Vim9: operators && and || have a confusing result
Bram Moolenaar <Bram@vim.org>
parents: 22441
diff changeset
578 0 || false == false
4c21f7f6f9e3 patch 8.2.1795: Vim9: operators && and || have a confusing result
Bram Moolenaar <Bram@vim.org>
parents: 22441
diff changeset
579 1 && true == true
4c21f7f6f9e3 patch 8.2.1795: Vim9: operators && and || have a confusing result
Bram Moolenaar <Bram@vim.org>
parents: 22441
diff changeset
580 0 && 1 == false
4c21f7f6f9e3 patch 8.2.1795: Vim9: operators && and || have a confusing result
Bram Moolenaar <Bram@vim.org>
parents: 22441
diff changeset
581 8 || 0 Error!
4c21f7f6f9e3 patch 8.2.1795: Vim9: operators && and || have a confusing result
Bram Moolenaar <Bram@vim.org>
parents: 22441
diff changeset
582 'yes' && 0 Error!
4c21f7f6f9e3 patch 8.2.1795: Vim9: operators && and || have a confusing result
Bram Moolenaar <Bram@vim.org>
parents: 22441
diff changeset
583 [] || 99 Error!
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
584
22494
4c21f7f6f9e3 patch 8.2.1795: Vim9: operators && and || have a confusing result
Bram Moolenaar <Bram@vim.org>
parents: 22441
diff changeset
585 When using "!" for inverting, there is no error for using any type and the
22500
ef8a3177edc1 patch 8.2.1798: Vim9: trinary operator condition is too permissive
Bram Moolenaar <Bram@vim.org>
parents: 22494
diff changeset
586 result is a boolean. "!!" can be used to turn any value into boolean: >
22494
4c21f7f6f9e3 patch 8.2.1795: Vim9: operators && and || have a confusing result
Bram Moolenaar <Bram@vim.org>
parents: 22441
diff changeset
587 !'yes' == false
22500
ef8a3177edc1 patch 8.2.1798: Vim9: trinary operator condition is too permissive
Bram Moolenaar <Bram@vim.org>
parents: 22494
diff changeset
588 !![] == false
ef8a3177edc1 patch 8.2.1798: Vim9: trinary operator condition is too permissive
Bram Moolenaar <Bram@vim.org>
parents: 22494
diff changeset
589 !![1, 2, 3] == true
22494
4c21f7f6f9e3 patch 8.2.1795: Vim9: operators && and || have a confusing result
Bram Moolenaar <Bram@vim.org>
parents: 22441
diff changeset
590
4c21f7f6f9e3 patch 8.2.1795: Vim9: operators && and || have a confusing result
Bram Moolenaar <Bram@vim.org>
parents: 22441
diff changeset
591 When using "`.."` for string concatenation arguments of simple types are
22500
ef8a3177edc1 patch 8.2.1798: Vim9: trinary operator condition is too permissive
Bram Moolenaar <Bram@vim.org>
parents: 22494
diff changeset
592 always converted to string: >
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
593 'hello ' .. 123 == 'hello 123'
21825
0db0640e16e0 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 21771
diff changeset
594 'hello ' .. v:true == 'hello v:true'
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
595
21771
fcf978444298 patch 8.2.1435: Vim9: always converting to string for ".." leads to mistakes
Bram Moolenaar <Bram@vim.org>
parents: 21717
diff changeset
596 Simple types are string, float, special and bool. For other types |string()|
fcf978444298 patch 8.2.1435: Vim9: always converting to string for ".." leads to mistakes
Bram Moolenaar <Bram@vim.org>
parents: 21717
diff changeset
597 can be used.
22171
d4c7b3e9cd17 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 21991
diff changeset
598 *false* *true*
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
599 In Vim9 script one can use "true" for v:true and "false" for v:false.
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
600
21825
0db0640e16e0 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 21771
diff changeset
601 Indexing a string with [idx] or [idx, idx] uses character indexes instead of
0db0640e16e0 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 21771
diff changeset
602 byte indexes. Example: >
0db0640e16e0 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 21771
diff changeset
603 echo 'bár'[1]
0db0640e16e0 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 21771
diff changeset
604 In legacy script this results in the character 0xc3 (an illegal byte), in Vim9
0db0640e16e0 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 21771
diff changeset
605 script this results in the string 'á'.
0db0640e16e0 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 21771
diff changeset
606
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
607
21093
99a602b27e0e Runtime file updates
Bram Moolenaar <Bram@vim.org>
parents: 20982
diff changeset
608 What to watch out for ~
99a602b27e0e Runtime file updates
Bram Moolenaar <Bram@vim.org>
parents: 20982
diff changeset
609 *vim9-gotchas*
99a602b27e0e Runtime file updates
Bram Moolenaar <Bram@vim.org>
parents: 20982
diff changeset
610 Vim9 was designed to be closer to often used programming languages, but at the
99a602b27e0e Runtime file updates
Bram Moolenaar <Bram@vim.org>
parents: 20982
diff changeset
611 same time tries to support the legacy Vim commands. Some compromises had to
99a602b27e0e Runtime file updates
Bram Moolenaar <Bram@vim.org>
parents: 20982
diff changeset
612 be made. Here is a summary of what might be unexpected.
99a602b27e0e Runtime file updates
Bram Moolenaar <Bram@vim.org>
parents: 20982
diff changeset
613
99a602b27e0e Runtime file updates
Bram Moolenaar <Bram@vim.org>
parents: 20982
diff changeset
614 Ex command ranges need to be prefixed with a colon. >
22171
d4c7b3e9cd17 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 21991
diff changeset
615 -> # legacy Vim: shifts the previous line to the right
d4c7b3e9cd17 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 21991
diff changeset
616 ->func() # Vim9: method call in continuation line
d4c7b3e9cd17 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 21991
diff changeset
617 :-> # Vim9: shifts the previous line to the right
21093
99a602b27e0e Runtime file updates
Bram Moolenaar <Bram@vim.org>
parents: 20982
diff changeset
618
22171
d4c7b3e9cd17 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 21991
diff changeset
619 %s/a/b # legacy Vim: substitute on all lines
21093
99a602b27e0e Runtime file updates
Bram Moolenaar <Bram@vim.org>
parents: 20982
diff changeset
620 x = alongname
22171
d4c7b3e9cd17 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 21991
diff changeset
621 % another # Vim9: line continuation without a backslash
d4c7b3e9cd17 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 21991
diff changeset
622 :%s/a/b # Vim9: substitute on all lines
d4c7b3e9cd17 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 21991
diff changeset
623 'text'->func() # Vim9: method call
d4c7b3e9cd17 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 21991
diff changeset
624 :'t # legacy Vim: jump to mark m
21093
99a602b27e0e Runtime file updates
Bram Moolenaar <Bram@vim.org>
parents: 20982
diff changeset
625
21676
1b345fb68ae3 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 21584
diff changeset
626 Some Ex commands can be confused with assignments in Vim9 script: >
1b345fb68ae3 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 21584
diff changeset
627 g:name = value # assignment
1b345fb68ae3 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 21584
diff changeset
628 g:pattern:cmd # invalid command - ERROR
1b345fb68ae3 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 21584
diff changeset
629 :g:pattern:cmd # :global command
1b345fb68ae3 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 21584
diff changeset
630
21093
99a602b27e0e Runtime file updates
Bram Moolenaar <Bram@vim.org>
parents: 20982
diff changeset
631 Functions defined with `:def` compile the whole function. Legacy functions
99a602b27e0e Runtime file updates
Bram Moolenaar <Bram@vim.org>
parents: 20982
diff changeset
632 can bail out, and the following lines are not parsed: >
99a602b27e0e Runtime file updates
Bram Moolenaar <Bram@vim.org>
parents: 20982
diff changeset
633 func Maybe()
99a602b27e0e Runtime file updates
Bram Moolenaar <Bram@vim.org>
parents: 20982
diff changeset
634 if !has('feature')
99a602b27e0e Runtime file updates
Bram Moolenaar <Bram@vim.org>
parents: 20982
diff changeset
635 return
99a602b27e0e Runtime file updates
Bram Moolenaar <Bram@vim.org>
parents: 20982
diff changeset
636 endif
99a602b27e0e Runtime file updates
Bram Moolenaar <Bram@vim.org>
parents: 20982
diff changeset
637 use-feature
99a602b27e0e Runtime file updates
Bram Moolenaar <Bram@vim.org>
parents: 20982
diff changeset
638 endfunc
99a602b27e0e Runtime file updates
Bram Moolenaar <Bram@vim.org>
parents: 20982
diff changeset
639 Vim9 functions are compiled as a whole: >
99a602b27e0e Runtime file updates
Bram Moolenaar <Bram@vim.org>
parents: 20982
diff changeset
640 def Maybe()
99a602b27e0e Runtime file updates
Bram Moolenaar <Bram@vim.org>
parents: 20982
diff changeset
641 if !has('feature')
99a602b27e0e Runtime file updates
Bram Moolenaar <Bram@vim.org>
parents: 20982
diff changeset
642 return
99a602b27e0e Runtime file updates
Bram Moolenaar <Bram@vim.org>
parents: 20982
diff changeset
643 endif
22171
d4c7b3e9cd17 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 21991
diff changeset
644 use-feature # May give compilation error
21093
99a602b27e0e Runtime file updates
Bram Moolenaar <Bram@vim.org>
parents: 20982
diff changeset
645 enddef
99a602b27e0e Runtime file updates
Bram Moolenaar <Bram@vim.org>
parents: 20982
diff changeset
646 For a workaround, split it in two functions: >
99a602b27e0e Runtime file updates
Bram Moolenaar <Bram@vim.org>
parents: 20982
diff changeset
647 func Maybe()
99a602b27e0e Runtime file updates
Bram Moolenaar <Bram@vim.org>
parents: 20982
diff changeset
648 if has('feature')
99a602b27e0e Runtime file updates
Bram Moolenaar <Bram@vim.org>
parents: 20982
diff changeset
649 call MaybyInner()
99a602b27e0e Runtime file updates
Bram Moolenaar <Bram@vim.org>
parents: 20982
diff changeset
650 endif
99a602b27e0e Runtime file updates
Bram Moolenaar <Bram@vim.org>
parents: 20982
diff changeset
651 endfunc
99a602b27e0e Runtime file updates
Bram Moolenaar <Bram@vim.org>
parents: 20982
diff changeset
652 if has('feature')
99a602b27e0e Runtime file updates
Bram Moolenaar <Bram@vim.org>
parents: 20982
diff changeset
653 def MaybeInner()
99a602b27e0e Runtime file updates
Bram Moolenaar <Bram@vim.org>
parents: 20982
diff changeset
654 use-feature
99a602b27e0e Runtime file updates
Bram Moolenaar <Bram@vim.org>
parents: 20982
diff changeset
655 enddef
99a602b27e0e Runtime file updates
Bram Moolenaar <Bram@vim.org>
parents: 20982
diff changeset
656 endif
22171
d4c7b3e9cd17 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 21991
diff changeset
657 Or put the unsupported code inside an `if` with a constant expression that
21991
bbca88cd13d5 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 21825
diff changeset
658 evaluates to false: >
bbca88cd13d5 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 21825
diff changeset
659 def Maybe()
bbca88cd13d5 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 21825
diff changeset
660 if has('feature')
bbca88cd13d5 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 21825
diff changeset
661 use-feature
bbca88cd13d5 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 21825
diff changeset
662 endif
bbca88cd13d5 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 21825
diff changeset
663 enddef
bbca88cd13d5 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 21825
diff changeset
664 Note that for unrecognized commands there is no check for "|" and a following
bbca88cd13d5 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 21825
diff changeset
665 command. This will give an error for missing `endif`: >
bbca88cd13d5 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 21825
diff changeset
666 def Maybe()
bbca88cd13d5 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 21825
diff changeset
667 if has('feature') | use-feature | endif
bbca88cd13d5 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 21825
diff changeset
668 enddef
21093
99a602b27e0e Runtime file updates
Bram Moolenaar <Bram@vim.org>
parents: 20982
diff changeset
669
23305
fab58304f77d Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 23164
diff changeset
670 Other differences ~
fab58304f77d Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 23164
diff changeset
671
fab58304f77d Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 23164
diff changeset
672 Patterns are used like 'magic' is set, unless explicitly overruled.
fab58304f77d Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 23164
diff changeset
673 The 'edcompatible' option value is not used.
fab58304f77d Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 23164
diff changeset
674 The 'gdefault' option value is not used.
fab58304f77d Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 23164
diff changeset
675
fab58304f77d Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 23164
diff changeset
676
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
677 ==============================================================================
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
678
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
679 3. New style functions *fast-functions*
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
680
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
681 THIS IS STILL UNDER DEVELOPMENT - ANYTHING CAN BREAK - ANYTHING CAN CHANGE
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
682
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
683 *:def*
21825
0db0640e16e0 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 21771
diff changeset
684 :def[!] {name}([arguments])[: {return-type}]
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
685 Define a new function by the name {name}. The body of
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
686 the function follows in the next lines, until the
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
687 matching `:enddef`.
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
688
19904
bd4f91762d0f patch 8.2.0508: Vim9: func and partial types not done yet
Bram Moolenaar <Bram@vim.org>
parents: 19646
diff changeset
689 When {return-type} is omitted or is "void" the
bd4f91762d0f patch 8.2.0508: Vim9: func and partial types not done yet
Bram Moolenaar <Bram@vim.org>
parents: 19646
diff changeset
690 function is not expected to return anything.
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
691
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
692 {arguments} is a sequence of zero or more argument
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
693 declarations. There are three forms:
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
694 {name}: {type}
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
695 {name} = {value}
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
696 {name}: {type} = {value}
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
697 The first form is a mandatory argument, the caller
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
698 must always provide them.
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
699 The second and third form are optional arguments.
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
700 When the caller omits an argument the {value} is used.
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
701
20856
83cfa1ef1bf2 Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 20552
diff changeset
702 The function will be compiled into instructions when
21499
3a1ed539ae2a Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 21353
diff changeset
703 called, or when `:disassemble` or `:defcompile` is
3a1ed539ae2a Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 21353
diff changeset
704 used. Syntax and type errors will be produced at that
3a1ed539ae2a Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 21353
diff changeset
705 time.
20856
83cfa1ef1bf2 Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 20552
diff changeset
706
21499
3a1ed539ae2a Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 21353
diff changeset
707 It is possible to nest `:def` inside another `:def` or
3a1ed539ae2a Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 21353
diff changeset
708 `:function` up to about 50 levels deep.
19303
51bc26d4a393 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 19181
diff changeset
709
22391
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
710 [!] is used as with `:function`. Note that
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
711 script-local functions cannot be deleted or redefined
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
712 later in Vim9 script. They can only be removed by
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
713 reloading the same script.
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
714
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
715 *:enddef*
21499
3a1ed539ae2a Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 21353
diff changeset
716 :enddef End of a function defined with `:def`. It should be on
3a1ed539ae2a Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 21353
diff changeset
717 a line by its own.
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
718
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
719
19473
b09afbebffee patch 8.2.0294: cannot use Ex command that is also a function name
Bram Moolenaar <Bram@vim.org>
parents: 19404
diff changeset
720 If the script the function is defined in is Vim9 script, then script-local
b09afbebffee patch 8.2.0294: cannot use Ex command that is also a function name
Bram Moolenaar <Bram@vim.org>
parents: 19404
diff changeset
721 variables can be accessed without the "s:" prefix. They must be defined
20856
83cfa1ef1bf2 Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 20552
diff changeset
722 before the function is compiled. If the script the function is defined in is
83cfa1ef1bf2 Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 20552
diff changeset
723 legacy script, then script-local variables must be accessed with the "s:"
21991
bbca88cd13d5 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 21825
diff changeset
724 prefix and they do not need to exist (they can be deleted any time).
19473
b09afbebffee patch 8.2.0294: cannot use Ex command that is also a function name
Bram Moolenaar <Bram@vim.org>
parents: 19404
diff changeset
725
20552
74e3316c1d5a Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 20379
diff changeset
726 *:defc* *:defcompile*
74e3316c1d5a Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 20379
diff changeset
727 :defc[ompile] Compile functions defined in the current script that
74e3316c1d5a Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 20379
diff changeset
728 were not compiled yet.
74e3316c1d5a Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 20379
diff changeset
729 This will report errors found during the compilation.
19473
b09afbebffee patch 8.2.0294: cannot use Ex command that is also a function name
Bram Moolenaar <Bram@vim.org>
parents: 19404
diff changeset
730
19404
7be3663e2f2b Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 19303
diff changeset
731 *:disa* *:disassemble*
7be3663e2f2b Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 19303
diff changeset
732 :disa[ssemble] {func} Show the instructions generated for {func}.
7be3663e2f2b Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 19303
diff changeset
733 This is for debugging and testing.
19556
ff5048b0ccfe patch 8.2.0335: no completion for :disassemble
Bram Moolenaar <Bram@vim.org>
parents: 19523
diff changeset
734 Note that for command line completion of {func} you
ff5048b0ccfe patch 8.2.0335: no completion for :disassemble
Bram Moolenaar <Bram@vim.org>
parents: 19523
diff changeset
735 can prepend "s:" to find script-local functions.
19404
7be3663e2f2b Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 19303
diff changeset
736
21250
21fb2a3ad3ca Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 21093
diff changeset
737 Limitations ~
21fb2a3ad3ca Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 21093
diff changeset
738
21fb2a3ad3ca Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 21093
diff changeset
739 Local variables will not be visible to string evaluation. For example: >
21fb2a3ad3ca Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 21093
diff changeset
740 def EvalString(): list<string>
22391
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
741 var list = ['aa', 'bb', 'cc', 'dd']
21250
21fb2a3ad3ca Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 21093
diff changeset
742 return range(1, 2)->map('list[v:val]')
21fb2a3ad3ca Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 21093
diff changeset
743 enddef
21fb2a3ad3ca Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 21093
diff changeset
744
21fb2a3ad3ca Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 21093
diff changeset
745 The map argument is a string expression, which is evaluated without the
21fb2a3ad3ca Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 21093
diff changeset
746 function scope. Instead, use a lambda: >
21fb2a3ad3ca Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 21093
diff changeset
747 def EvalString(): list<string>
22391
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
748 var list = ['aa', 'bb', 'cc', 'dd']
21250
21fb2a3ad3ca Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 21093
diff changeset
749 return range(1, 2)->map({ _, v -> list[v] })
21fb2a3ad3ca Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 21093
diff changeset
750 enddef
21fb2a3ad3ca Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 21093
diff changeset
751
21fb2a3ad3ca Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 21093
diff changeset
752
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
753 ==============================================================================
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
754
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
755 4. Types *vim9-types*
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
756
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
757 THIS IS STILL UNDER DEVELOPMENT - ANYTHING CAN BREAK - ANYTHING CAN CHANGE
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
758
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
759 The following builtin types are supported:
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
760 bool
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
761 number
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
762 float
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
763 string
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
764 blob
19904
bd4f91762d0f patch 8.2.0508: Vim9: func and partial types not done yet
Bram Moolenaar <Bram@vim.org>
parents: 19646
diff changeset
765 list<{type}>
bd4f91762d0f patch 8.2.0508: Vim9: func and partial types not done yet
Bram Moolenaar <Bram@vim.org>
parents: 19646
diff changeset
766 dict<{type}>
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
767 job
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
768 channel
19646
847a300aa244 Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 19574
diff changeset
769 func
19968
1908e92b02fd Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 19904
diff changeset
770 func: {type}
19904
bd4f91762d0f patch 8.2.0508: Vim9: func and partial types not done yet
Bram Moolenaar <Bram@vim.org>
parents: 19646
diff changeset
771 func({type}, ...)
bd4f91762d0f patch 8.2.0508: Vim9: func and partial types not done yet
Bram Moolenaar <Bram@vim.org>
parents: 19646
diff changeset
772 func({type}, ...): {type}
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
773
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
774 Not supported yet:
19904
bd4f91762d0f patch 8.2.0508: Vim9: func and partial types not done yet
Bram Moolenaar <Bram@vim.org>
parents: 19646
diff changeset
775 tuple<a: {type}, b: {type}, ...>
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
776
19904
bd4f91762d0f patch 8.2.0508: Vim9: func and partial types not done yet
Bram Moolenaar <Bram@vim.org>
parents: 19646
diff changeset
777 These types can be used in declarations, but no value will have this type:
21499
3a1ed539ae2a Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 21353
diff changeset
778 {type}|{type} {not implemented yet}
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
779 void
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
780 any
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
781
19904
bd4f91762d0f patch 8.2.0508: Vim9: func and partial types not done yet
Bram Moolenaar <Bram@vim.org>
parents: 19646
diff changeset
782 There is no array type, use list<{type}> instead. For a list constant an
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
783 efficient implementation is used that avoids allocating lot of small pieces of
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
784 memory.
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
785
19904
bd4f91762d0f patch 8.2.0508: Vim9: func and partial types not done yet
Bram Moolenaar <Bram@vim.org>
parents: 19646
diff changeset
786 A partial and function can be declared in more or less specific ways:
bd4f91762d0f patch 8.2.0508: Vim9: func and partial types not done yet
Bram Moolenaar <Bram@vim.org>
parents: 19646
diff changeset
787 func any kind of function reference, no type
19968
1908e92b02fd Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 19904
diff changeset
788 checking for arguments or return value
19904
bd4f91762d0f patch 8.2.0508: Vim9: func and partial types not done yet
Bram Moolenaar <Bram@vim.org>
parents: 19646
diff changeset
789 func: {type} any number and type of arguments with specific
bd4f91762d0f patch 8.2.0508: Vim9: func and partial types not done yet
Bram Moolenaar <Bram@vim.org>
parents: 19646
diff changeset
790 return type
19968
1908e92b02fd Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 19904
diff changeset
791 func({type}) function with argument type, does not return
19904
bd4f91762d0f patch 8.2.0508: Vim9: func and partial types not done yet
Bram Moolenaar <Bram@vim.org>
parents: 19646
diff changeset
792 a value
19968
1908e92b02fd Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 19904
diff changeset
793 func({type}): {type} function with argument type and return type
1908e92b02fd Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 19904
diff changeset
794 func(?{type}) function with type of optional argument, does
1908e92b02fd Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 19904
diff changeset
795 not return a value
1908e92b02fd Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 19904
diff changeset
796 func(...{type}) function with type of variable number of
1908e92b02fd Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 19904
diff changeset
797 arguments, does not return a value
1908e92b02fd Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 19904
diff changeset
798 func({type}, ?{type}, ...{type}): {type}
1908e92b02fd Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 19904
diff changeset
799 function with:
1908e92b02fd Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 19904
diff changeset
800 - type of mandatory argument
1908e92b02fd Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 19904
diff changeset
801 - type of optional argument
1908e92b02fd Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 19904
diff changeset
802 - type of variable number of arguments
1908e92b02fd Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 19904
diff changeset
803 - return type
19904
bd4f91762d0f patch 8.2.0508: Vim9: func and partial types not done yet
Bram Moolenaar <Bram@vim.org>
parents: 19646
diff changeset
804
bd4f91762d0f patch 8.2.0508: Vim9: func and partial types not done yet
Bram Moolenaar <Bram@vim.org>
parents: 19646
diff changeset
805 If the return type is "void" the function does not return a value.
bd4f91762d0f patch 8.2.0508: Vim9: func and partial types not done yet
Bram Moolenaar <Bram@vim.org>
parents: 19646
diff changeset
806
bd4f91762d0f patch 8.2.0508: Vim9: func and partial types not done yet
Bram Moolenaar <Bram@vim.org>
parents: 19646
diff changeset
807 The reference can also be a |Partial|, in which case it stores extra arguments
bd4f91762d0f patch 8.2.0508: Vim9: func and partial types not done yet
Bram Moolenaar <Bram@vim.org>
parents: 19646
diff changeset
808 and/or a dictionary, which are not visible to the caller. Since they are
bd4f91762d0f patch 8.2.0508: Vim9: func and partial types not done yet
Bram Moolenaar <Bram@vim.org>
parents: 19646
diff changeset
809 called in the same way the declaration is the same.
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
810
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
811 Custom types can be defined with `:type`: >
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
812 :type MyList list<string>
21715
571832713efa patch 8.2.1407: Vim9: type of list and dict only depends on first item
Bram Moolenaar <Bram@vim.org>
parents: 21676
diff changeset
813 Custom types must start with a capital letter, to avoid name clashes with
571832713efa patch 8.2.1407: Vim9: type of list and dict only depends on first item
Bram Moolenaar <Bram@vim.org>
parents: 21676
diff changeset
814 builtin types added later, similarly to user functions.
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
815 {not implemented yet}
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
816
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
817 And classes and interfaces can be used as types: >
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
818 :class MyClass
22391
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
819 :var mine: MyClass
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
820
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
821 :interface MyInterface
22391
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
822 :var mine: MyInterface
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
823
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
824 :class MyTemplate<Targ>
22391
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
825 :var mine: MyTemplate<number>
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
826 :var mine: MyTemplate<string>
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
827
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
828 :class MyInterface<Targ>
22391
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
829 :var mine: MyInterface<number>
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
830 :var mine: MyInterface<string>
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
831 {not implemented yet}
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
832
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
833
22391
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
834 Variable types and type casting ~
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
835 *variable-types*
21717
ef3b31d510d2 patch 8.2.1408: Vim9: type casting not supported
Bram Moolenaar <Bram@vim.org>
parents: 21715
diff changeset
836 Variables declared in Vim9 script or in a `:def` function have a type, either
ef3b31d510d2 patch 8.2.1408: Vim9: type casting not supported
Bram Moolenaar <Bram@vim.org>
parents: 21715
diff changeset
837 specified explicitly or inferred from the initialization.
ef3b31d510d2 patch 8.2.1408: Vim9: type casting not supported
Bram Moolenaar <Bram@vim.org>
parents: 21715
diff changeset
838
ef3b31d510d2 patch 8.2.1408: Vim9: type casting not supported
Bram Moolenaar <Bram@vim.org>
parents: 21715
diff changeset
839 Global, buffer, window and tab page variables do not have a specific type, the
ef3b31d510d2 patch 8.2.1408: Vim9: type casting not supported
Bram Moolenaar <Bram@vim.org>
parents: 21715
diff changeset
840 value can be changed at any time, possibly changing the type. Therefore, in
ef3b31d510d2 patch 8.2.1408: Vim9: type casting not supported
Bram Moolenaar <Bram@vim.org>
parents: 21715
diff changeset
841 compiled code the "any" type is assumed.
ef3b31d510d2 patch 8.2.1408: Vim9: type casting not supported
Bram Moolenaar <Bram@vim.org>
parents: 21715
diff changeset
842
ef3b31d510d2 patch 8.2.1408: Vim9: type casting not supported
Bram Moolenaar <Bram@vim.org>
parents: 21715
diff changeset
843 This can be a problem when the "any" type is undesired and the actual type is
ef3b31d510d2 patch 8.2.1408: Vim9: type casting not supported
Bram Moolenaar <Bram@vim.org>
parents: 21715
diff changeset
844 expected to always be the same. For example, when declaring a list: >
22391
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
845 var l: list<number> = [1, g:two]
23305
fab58304f77d Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 23164
diff changeset
846 At compile time Vim doesn't know the type of "g:two" and the expression type
fab58304f77d Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 23164
diff changeset
847 becomes list<any>. An instruction is generated to check the list type before
fab58304f77d Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 23164
diff changeset
848 doing the assignment, which is a bit inefficient.
fab58304f77d Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 23164
diff changeset
849 *type-casting*
fab58304f77d Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 23164
diff changeset
850 To avoid this, use a type cast: >
22391
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
851 var l: list<number> = [1, <number>g:two]
23305
fab58304f77d Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 23164
diff changeset
852 The compiled code will then only check that "g:two" is a number and give an
fab58304f77d Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 23164
diff changeset
853 error if it isn't. This is called type casting.
21717
ef3b31d510d2 patch 8.2.1408: Vim9: type casting not supported
Bram Moolenaar <Bram@vim.org>
parents: 21715
diff changeset
854
ef3b31d510d2 patch 8.2.1408: Vim9: type casting not supported
Bram Moolenaar <Bram@vim.org>
parents: 21715
diff changeset
855 The syntax of a type cast is: "<" {type} ">". There cannot be white space
ef3b31d510d2 patch 8.2.1408: Vim9: type casting not supported
Bram Moolenaar <Bram@vim.org>
parents: 21715
diff changeset
856 after the "<" or before the ">" (to avoid them being confused with
ef3b31d510d2 patch 8.2.1408: Vim9: type casting not supported
Bram Moolenaar <Bram@vim.org>
parents: 21715
diff changeset
857 smaller-than and bigger-than operators).
ef3b31d510d2 patch 8.2.1408: Vim9: type casting not supported
Bram Moolenaar <Bram@vim.org>
parents: 21715
diff changeset
858
ef3b31d510d2 patch 8.2.1408: Vim9: type casting not supported
Bram Moolenaar <Bram@vim.org>
parents: 21715
diff changeset
859 The semantics is that, if needed, a runtime type check is performed. The
ef3b31d510d2 patch 8.2.1408: Vim9: type casting not supported
Bram Moolenaar <Bram@vim.org>
parents: 21715
diff changeset
860 value is not actually changed. If you need to change the type, e.g. to change
ef3b31d510d2 patch 8.2.1408: Vim9: type casting not supported
Bram Moolenaar <Bram@vim.org>
parents: 21715
diff changeset
861 it to a string, use the |string()| function. Or use |str2nr()| to convert a
ef3b31d510d2 patch 8.2.1408: Vim9: type casting not supported
Bram Moolenaar <Bram@vim.org>
parents: 21715
diff changeset
862 string to a number.
ef3b31d510d2 patch 8.2.1408: Vim9: type casting not supported
Bram Moolenaar <Bram@vim.org>
parents: 21715
diff changeset
863
ef3b31d510d2 patch 8.2.1408: Vim9: type casting not supported
Bram Moolenaar <Bram@vim.org>
parents: 21715
diff changeset
864
22391
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
865 Type inference ~
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
866 *type-inference*
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
867 In general: Whenever the type is clear it can be omitted. For example, when
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
868 declaring a variable and giving it a value: >
22391
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
869 var name = 0 # infers number type
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
870 var name = 'hello' # infers string type
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
871
21715
571832713efa patch 8.2.1407: Vim9: type of list and dict only depends on first item
Bram Moolenaar <Bram@vim.org>
parents: 21676
diff changeset
872 The type of a list and dictionary comes from the common type of the values.
571832713efa patch 8.2.1407: Vim9: type of list and dict only depends on first item
Bram Moolenaar <Bram@vim.org>
parents: 21676
diff changeset
873 If the values all have the same type, that type is used for the list or
571832713efa patch 8.2.1407: Vim9: type of list and dict only depends on first item
Bram Moolenaar <Bram@vim.org>
parents: 21676
diff changeset
874 dictionary. If there is a mix of types, the "any" type is used. >
571832713efa patch 8.2.1407: Vim9: type of list and dict only depends on first item
Bram Moolenaar <Bram@vim.org>
parents: 21676
diff changeset
875 [1, 2, 3] list<number>
571832713efa patch 8.2.1407: Vim9: type of list and dict only depends on first item
Bram Moolenaar <Bram@vim.org>
parents: 21676
diff changeset
876 ['a', 'b', 'c'] list<string>
571832713efa patch 8.2.1407: Vim9: type of list and dict only depends on first item
Bram Moolenaar <Bram@vim.org>
parents: 21676
diff changeset
877 [1, 'x', 3] list<any>
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
878
21991
bbca88cd13d5 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 21825
diff changeset
879
22391
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
880 Stricter type checking ~
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
881 *type-checking*
21991
bbca88cd13d5 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 21825
diff changeset
882 In legacy Vim script, where a number was expected, a string would be
bbca88cd13d5 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 21825
diff changeset
883 automatically converted to a number. This was convenient for an actual number
bbca88cd13d5 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 21825
diff changeset
884 such as "123", but leads to unexpected problems (but no error message) if the
bbca88cd13d5 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 21825
diff changeset
885 string doesn't start with a number. Quite often this leads to hard-to-find
bbca88cd13d5 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 21825
diff changeset
886 bugs.
bbca88cd13d5 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 21825
diff changeset
887
bbca88cd13d5 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 21825
diff changeset
888 In Vim9 script this has been made stricter. In most places it works just as
22171
d4c7b3e9cd17 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 21991
diff changeset
889 before, if the value used matches the expected type. There will sometimes be
d4c7b3e9cd17 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 21991
diff changeset
890 an error, thus breaking backwards compatibility. For example:
21991
bbca88cd13d5 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 21825
diff changeset
891 - Using a number other than 0 or 1 where a boolean is expected. *E1023*
bbca88cd13d5 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 21825
diff changeset
892 - Using a string value when setting a number options.
bbca88cd13d5 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 21825
diff changeset
893 - Using a number where a string is expected. *E1024*
bbca88cd13d5 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 21825
diff changeset
894
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
895 ==============================================================================
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
896
22391
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
897 5. Namespace, Import and Export
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
898 *vim9script* *vim9-export* *vim9-import*
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
899
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
900 THIS IS STILL UNDER DEVELOPMENT - ANYTHING CAN BREAK - ANYTHING CAN CHANGE
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
901
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
902 A Vim9 script can be written to be imported. This means that everything in
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
903 the script is local, unless exported. Those exported items, and only those
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
904 items, can then be imported in another script.
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
905
21991
bbca88cd13d5 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 21825
diff changeset
906 You can cheat by using the global namespace explicitly. We will assume here
bbca88cd13d5 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 21825
diff changeset
907 that you don't do that.
bbca88cd13d5 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 21825
diff changeset
908
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
909
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
910 Namespace ~
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
911 *:vim9script* *:vim9*
19303
51bc26d4a393 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 19181
diff changeset
912 To recognize a file that can be imported the `vim9script` statement must
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
913 appear as the first statement in the file. It tells Vim to interpret the
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
914 script in its own namespace, instead of the global namespace. If a file
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
915 starts with: >
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
916 vim9script
22391
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
917 var myvar = 'yes'
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
918 Then "myvar" will only exist in this file. While without `vim9script` it would
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
919 be available as `g:myvar` from any other script and function.
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
920
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
921 The variables at the file level are very much like the script-local "s:"
20115
bd021eb62e73 Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 20023
diff changeset
922 variables in legacy Vim script, but the "s:" is omitted. And they cannot be
bd021eb62e73 Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 20023
diff changeset
923 deleted.
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
924
20115
bd021eb62e73 Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 20023
diff changeset
925 In Vim9 script the global "g:" namespace can still be used as before. And the
bd021eb62e73 Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 20023
diff changeset
926 "w:", "b:" and "t:" namespaces. These have in common that variables are not
bd021eb62e73 Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 20023
diff changeset
927 declared and they can be deleted.
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
928
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
929 A side effect of `:vim9script` is that the 'cpoptions' option is set to the
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
930 Vim default value, like with: >
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
931 :set cpo&vim
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
932 One of the effects is that |line-continuation| is always enabled.
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
933 The original value of 'cpoptions' is restored at the end of the script.
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
934
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
935
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
936 Export ~
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
937 *:export* *:exp*
21499
3a1ed539ae2a Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 21353
diff changeset
938 Exporting an item can be written as: >
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
939 export const EXPORTED_CONST = 1234
22391
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
940 export var someValue = ...
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
941 export final someValue = ...
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
942 export const someValue = ...
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
943 export def MyFunc() ...
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
944 export class MyClass ...
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
945
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
946 As this suggests, only constants, variables, `:def` functions and classes can
21499
3a1ed539ae2a Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 21353
diff changeset
947 be exported. {classes are not implemented yet}
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
948
20856
83cfa1ef1bf2 Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 20552
diff changeset
949 *E1042*
83cfa1ef1bf2 Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 20552
diff changeset
950 `:export` can only be used in Vim9 script, at the script level.
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
951
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
952
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
953 Import ~
20965
59f93c2d2551 Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 20856
diff changeset
954 *:import* *:imp* *E1094*
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
955 The exported items can be imported individually in another Vim9 script: >
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
956 import EXPORTED_CONST from "thatscript.vim"
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
957 import MyClass from "myclass.vim"
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
958
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
959 To import multiple items at the same time: >
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
960 import {someValue, MyClass} from "thatscript.vim"
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
961
19303
51bc26d4a393 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 19181
diff changeset
962 In case the name is ambiguous, another name can be specified: >
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
963 import MyClass as ThatClass from "myclass.vim"
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
964 import {someValue, MyClass as ThatClass} from "myclass.vim"
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
965
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
966 To import all exported items under a specific identifier: >
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
967 import * as That from 'thatscript.vim'
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
968
22328
75ff30a78189 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22272
diff changeset
969 {not implemented yet: using "This as That"}
75ff30a78189 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22272
diff changeset
970
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
971 Then you can use "That.EXPORTED_CONST", "That.someValue", etc. You are free
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
972 to choose the name "That", but it is highly recommended to use the name of the
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
973 script file to avoid confusion.
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
974
22171
d4c7b3e9cd17 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 21991
diff changeset
975 `:import` can also be used in legacy Vim script. The imported items still
d4c7b3e9cd17 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 21991
diff changeset
976 become script-local, even when the "s:" prefix is not given.
d4c7b3e9cd17 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 21991
diff changeset
977
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
978 The script name after `import` can be:
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
979 - A relative path, starting "." or "..". This finds a file relative to the
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
980 location of the script file itself. This is useful to split up a large
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
981 plugin into several files.
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
982 - An absolute path, starting with "/" on Unix or "D:/" on MS-Windows. This
22723
5b7ea82bc18f Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22565
diff changeset
983 will rarely be used.
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
984 - A path not being relative or absolute. This will be found in the
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
985 "import" subdirectories of 'runtimepath' entries. The name will usually be
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
986 longer and unique, to avoid loading the wrong file.
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
987
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
988 Once a vim9 script file has been imported, the result is cached and used the
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
989 next time the same script is imported. It will not be read again.
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
990 *:import-cycle*
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
991 The `import` commands are executed when encountered. If that script (directly
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
992 or indirectly) imports the current script, then items defined after the
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
993 `import` won't be processed yet. Therefore cyclic imports can exist, but may
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
994 result in undefined items.
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
995
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
996
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
997 Import in an autoload script ~
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
998
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
999 For optimal startup speed, loading scripts should be postponed until they are
19303
51bc26d4a393 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 19181
diff changeset
1000 actually needed. A recommended mechanism:
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1001
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1002 1. In the plugin define user commands, functions and/or mappings that refer to
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1003 an autoload script. >
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1004 command -nargs=1 SearchForStuff call searchfor#Stuff(<f-args>)
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1005
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1006 < This goes in .../plugin/anyname.vim. "anyname.vim" can be freely chosen.
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1007
21825
0db0640e16e0 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 21771
diff changeset
1008 2. In the autoload script do the actual work. You can import items from
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1009 other files to split up functionality in appropriate pieces. >
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1010 vim9script
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1011 import FilterFunc from "../import/someother.vim"
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1012 def searchfor#Stuff(arg: string)
22391
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
1013 var filtered = FilterFunc(arg)
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1014 ...
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1015 < This goes in .../autoload/searchfor.vim. "searchfor" in the file name
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1016 must be exactly the same as the prefix for the function name, that is how
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1017 Vim finds the file.
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1018
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1019 3. Other functionality, possibly shared between plugins, contains the exported
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1020 items and any private items. >
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1021 vim9script
22391
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
1022 var localVar = 'local'
22171
d4c7b3e9cd17 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 21991
diff changeset
1023 export def FilterFunc(arg: string): string
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1024 ...
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1025 < This goes in .../import/someother.vim.
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1026
21771
fcf978444298 patch 8.2.1435: Vim9: always converting to string for ".." leads to mistakes
Bram Moolenaar <Bram@vim.org>
parents: 21717
diff changeset
1027 When compiling a `:def` function and a function in an autoload script is
fcf978444298 patch 8.2.1435: Vim9: always converting to string for ".." leads to mistakes
Bram Moolenaar <Bram@vim.org>
parents: 21717
diff changeset
1028 encountered, the script is not loaded until the `:def` function is called.
fcf978444298 patch 8.2.1435: Vim9: always converting to string for ".." leads to mistakes
Bram Moolenaar <Bram@vim.org>
parents: 21717
diff changeset
1029
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1030
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1031 Import in legacy Vim script ~
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1032
20856
83cfa1ef1bf2 Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 20552
diff changeset
1033 If an `import` statement is used in legacy Vim script, the script-local "s:"
83cfa1ef1bf2 Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 20552
diff changeset
1034 namespace will be used for the imported item, even when "s:" is not specified.
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1035
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1036
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1037 ==============================================================================
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1038
22328
75ff30a78189 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22272
diff changeset
1039 6. Future work: classes *vim9-classes*
75ff30a78189 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22272
diff changeset
1040
75ff30a78189 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22272
diff changeset
1041 Above "class" was mentioned a few times, but it has not been implemented yet.
22391
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
1042 Most of Vim9 script can be created without this functionality, and since
22328
75ff30a78189 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22272
diff changeset
1043 implementing classes is going to be a lot of work, it is left for the future.
75ff30a78189 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22272
diff changeset
1044 For now we'll just make sure classes can be added later.
75ff30a78189 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22272
diff changeset
1045
75ff30a78189 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22272
diff changeset
1046 Thoughts:
75ff30a78189 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22272
diff changeset
1047 - `class` / `endclass`, everything in one file
75ff30a78189 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22272
diff changeset
1048 - Class names are always CamelCase
75ff30a78189 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22272
diff changeset
1049 - Single constructor
75ff30a78189 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22272
diff changeset
1050 - Single inheritance with `class ThisClass extends BaseClass`
75ff30a78189 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22272
diff changeset
1051 - `abstract class`
75ff30a78189 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22272
diff changeset
1052 - `interface` (Abstract class without any implementation)
75ff30a78189 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22272
diff changeset
1053 - `class SomeClass implements SomeInterface`
75ff30a78189 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22272
diff changeset
1054 - Generics for class: `class <Tkey, Tentry>`
75ff30a78189 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22272
diff changeset
1055 - Generics for function: `def <Tkey> GetLast(key: Tkey)`
75ff30a78189 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22272
diff changeset
1056
75ff30a78189 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22272
diff changeset
1057 Again, much of this is from TypeScript.
75ff30a78189 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22272
diff changeset
1058
75ff30a78189 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22272
diff changeset
1059 Some things that look like good additions:
75ff30a78189 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22272
diff changeset
1060 - Use a class as an interface (like Dart)
75ff30a78189 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22272
diff changeset
1061 - Extend a class with methods, using an import (like Dart)
75ff30a78189 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22272
diff changeset
1062
75ff30a78189 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22272
diff changeset
1063 An important class that will be provided is "Promise". Since Vim is single
75ff30a78189 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22272
diff changeset
1064 threaded, connecting asynchronous operations is a natural way of allowing
75ff30a78189 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22272
diff changeset
1065 plugins to do their work without blocking the user. It's a uniform way to
75ff30a78189 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22272
diff changeset
1066 invoke callbacks and handle timeouts and errors.
75ff30a78189 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22272
diff changeset
1067
75ff30a78189 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22272
diff changeset
1068 ==============================================================================
75ff30a78189 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22272
diff changeset
1069
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1070 9. Rationale *vim9-rationale*
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1071
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1072 The :def command ~
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1073
22391
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
1074 Plugin writers have asked for much faster Vim script. Investigations have
19303
51bc26d4a393 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 19181
diff changeset
1075 shown that keeping the existing semantics of function calls make this close to
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1076 impossible, because of the overhead involved with calling a function, setting
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1077 up the local function scope and executing lines. There are many details that
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1078 need to be handled, such as error messages and exceptions. The need to create
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1079 a dictionary for a: and l: scopes, the a:000 list and several others add too
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1080 much overhead that cannot be avoided.
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1081
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1082 Therefore the `:def` method to define a new-style function had to be added,
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1083 which allows for a function with different semantics. Most things still work
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1084 as before, but some parts do not. A new way to define a function was
22391
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
1085 considered the best way to separate the legacy style code from Vim9 style code.
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1086
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1087 Using "def" to define a function comes from Python. Other languages use
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1088 "function" which clashes with legacy Vim script.
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1089
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1090
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1091 Type checking ~
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1092
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1093 When compiling lines of Vim commands into instructions as much as possible
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1094 should be done at compile time. Postponing it to runtime makes the execution
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1095 slower and means mistakes are found only later. For example, when
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1096 encountering the "+" character and compiling this into a generic add
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1097 instruction, at execution time the instruction would have to inspect the type
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1098 of the arguments and decide what kind of addition to do. And when the
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1099 type is dictionary throw an error. If the types are known to be numbers then
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1100 an "add number" instruction can be used, which is faster. The error can be
22391
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
1101 given at compile time, no error handling is needed at runtime, since adding
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
1102 two numbers cannot fail.
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1103
22391
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
1104 The syntax for types, using <type> for compound types, is similar to Java. It
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
1105 is easy to understand and widely used. The type names are what were used in
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
1106 Vim before, with some additions such as "void" and "bool".
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1107
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1108
22328
75ff30a78189 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22272
diff changeset
1109 Removing clutter and weirdness ~
20856
83cfa1ef1bf2 Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 20552
diff changeset
1110
22328
75ff30a78189 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22272
diff changeset
1111 Once decided that `:def` functions have different syntax than legacy functions,
75ff30a78189 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22272
diff changeset
1112 we are free to add improvements to make the code more familiar for users who
75ff30a78189 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22272
diff changeset
1113 know popular programming languages. In other words: remove weird things that
22391
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
1114 only Vim does.
22328
75ff30a78189 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22272
diff changeset
1115
75ff30a78189 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22272
diff changeset
1116 We can also remove clutter, mainly things that were done to make Vim script
22391
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
1117 backwards compatible with the good old Vi commands.
20856
83cfa1ef1bf2 Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 20552
diff changeset
1118
22328
75ff30a78189 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22272
diff changeset
1119 Examples:
75ff30a78189 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22272
diff changeset
1120 - Drop `:call` for calling a function and `:eval` for manipulating data.
75ff30a78189 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22272
diff changeset
1121 - Drop using a leading backslash for line continuation, automatically figure
75ff30a78189 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22272
diff changeset
1122 out where an expression ends.
20856
83cfa1ef1bf2 Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 20552
diff changeset
1123
22328
75ff30a78189 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22272
diff changeset
1124 However, this does require that some things need to change:
75ff30a78189 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22272
diff changeset
1125 - Comments start with # instead of ", to avoid confusing them with strings.
22391
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
1126 This is good anyway, it is known from several popular languages.
22328
75ff30a78189 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22272
diff changeset
1127 - Ex command ranges need to be prefixed with a colon, to avoid confusion with
75ff30a78189 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22272
diff changeset
1128 expressions (single quote can be a string or a mark, "/" can be divide or a
75ff30a78189 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22272
diff changeset
1129 search command, etc.).
75ff30a78189 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22272
diff changeset
1130
75ff30a78189 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22272
diff changeset
1131 Goal is to limit the differences. A good criteria is that when the old syntax
22391
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
1132 is accidentally used you are very likely to get an error message.
20856
83cfa1ef1bf2 Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 20552
diff changeset
1133
83cfa1ef1bf2 Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 20552
diff changeset
1134
22391
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
1135 Syntax and semantics from popular languages ~
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1136
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1137 Script writers have complained that the Vim script syntax is unexpectedly
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1138 different from what they are used to. To reduce this complaint popular
20856
83cfa1ef1bf2 Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 20552
diff changeset
1139 languages are used as an example. At the same time, we do not want to abandon
83cfa1ef1bf2 Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 20552
diff changeset
1140 the well-known parts of legacy Vim script.
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1141
22391
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
1142 For many things TypeScript is followed. It's a recent language that is
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
1143 gaining popularity and has similarities with Vim script. It also has a
22328
75ff30a78189 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22272
diff changeset
1144 mix of static typing (a variable always has a known value type) and dynamic
22391
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
1145 typing (a variable can have different types, this changes at runtime). Since
22328
75ff30a78189 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22272
diff changeset
1146 legacy Vim script is dynamically typed and a lot of existing functionality
75ff30a78189 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22272
diff changeset
1147 (esp. builtin functions) depends on that, while static typing allows for much
75ff30a78189 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22272
diff changeset
1148 faster execution, we need to have this mix in Vim9 script.
75ff30a78189 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22272
diff changeset
1149
22171
d4c7b3e9cd17 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 21991
diff changeset
1150 There is no intention to completely match TypeScript syntax and semantics. We
d4c7b3e9cd17 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 21991
diff changeset
1151 just want to take those parts that we can use for Vim and we expect Vim users
22328
75ff30a78189 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22272
diff changeset
1152 will be happy with. TypeScript is a complex language with its own history,
75ff30a78189 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22272
diff changeset
1153 advantages and disadvantages. To get an idea of the disadvantages read the
75ff30a78189 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22272
diff changeset
1154 book: "JavaScript: The Good Parts". Or find the article "TypeScript: the good
22272
eb1f5f618c75 patch 8.2.1685: Vim9: cannot declare a constant value
Bram Moolenaar <Bram@vim.org>
parents: 22171
diff changeset
1155 parts" and read the "Things to avoid" section.
eb1f5f618c75 patch 8.2.1685: Vim9: cannot declare a constant value
Bram Moolenaar <Bram@vim.org>
parents: 22171
diff changeset
1156
22328
75ff30a78189 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22272
diff changeset
1157 People familiar with other languages (Java, Python, etc.) will also find
75ff30a78189 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22272
diff changeset
1158 things in TypeScript that they do not like or do not understand. We'll try to
75ff30a78189 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22272
diff changeset
1159 avoid those things.
22272
eb1f5f618c75 patch 8.2.1685: Vim9: cannot declare a constant value
Bram Moolenaar <Bram@vim.org>
parents: 22171
diff changeset
1160
eb1f5f618c75 patch 8.2.1685: Vim9: cannot declare a constant value
Bram Moolenaar <Bram@vim.org>
parents: 22171
diff changeset
1161 Specific items from TypeScript we avoid:
eb1f5f618c75 patch 8.2.1685: Vim9: cannot declare a constant value
Bram Moolenaar <Bram@vim.org>
parents: 22171
diff changeset
1162 - Overloading "+", using it both for addition and string concatenation. This
eb1f5f618c75 patch 8.2.1685: Vim9: cannot declare a constant value
Bram Moolenaar <Bram@vim.org>
parents: 22171
diff changeset
1163 goes against legacy Vim script and often leads to mistakes. For that reason
eb1f5f618c75 patch 8.2.1685: Vim9: cannot declare a constant value
Bram Moolenaar <Bram@vim.org>
parents: 22171
diff changeset
1164 we will keep using ".." for string concatenation. Lua also uses ".." this
eb1f5f618c75 patch 8.2.1685: Vim9: cannot declare a constant value
Bram Moolenaar <Bram@vim.org>
parents: 22171
diff changeset
1165 way. And it allows for conversion to string for more values.
eb1f5f618c75 patch 8.2.1685: Vim9: cannot declare a constant value
Bram Moolenaar <Bram@vim.org>
parents: 22171
diff changeset
1166 - TypeScript can use an expression like "99 || 'yes'" in a condition, but
eb1f5f618c75 patch 8.2.1685: Vim9: cannot declare a constant value
Bram Moolenaar <Bram@vim.org>
parents: 22171
diff changeset
1167 cannot assign the value to a boolean. That is inconsistent and can be
eb1f5f618c75 patch 8.2.1685: Vim9: cannot declare a constant value
Bram Moolenaar <Bram@vim.org>
parents: 22171
diff changeset
1168 annoying. Vim recognizes an expression with && or || and allows using the
22391
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
1169 result as a bool. TODO: to be reconsidered
22272
eb1f5f618c75 patch 8.2.1685: Vim9: cannot declare a constant value
Bram Moolenaar <Bram@vim.org>
parents: 22171
diff changeset
1170 - TypeScript considers an empty string as Falsy, but an empty list or dict as
eb1f5f618c75 patch 8.2.1685: Vim9: cannot declare a constant value
Bram Moolenaar <Bram@vim.org>
parents: 22171
diff changeset
1171 Truthy. That is inconsistent. In Vim an empty list and dict are also
eb1f5f618c75 patch 8.2.1685: Vim9: cannot declare a constant value
Bram Moolenaar <Bram@vim.org>
parents: 22171
diff changeset
1172 Falsy.
eb1f5f618c75 patch 8.2.1685: Vim9: cannot declare a constant value
Bram Moolenaar <Bram@vim.org>
parents: 22171
diff changeset
1173 - TypeScript has various "Readonly" types, which have limited usefulness,
eb1f5f618c75 patch 8.2.1685: Vim9: cannot declare a constant value
Bram Moolenaar <Bram@vim.org>
parents: 22171
diff changeset
1174 since a type cast can remove the immutable nature. Vim locks the value,
eb1f5f618c75 patch 8.2.1685: Vim9: cannot declare a constant value
Bram Moolenaar <Bram@vim.org>
parents: 22171
diff changeset
1175 which is more flexible, but is only checked at runtime.
22171
d4c7b3e9cd17 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 21991
diff changeset
1176
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1177
22391
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
1178 Declarations ~
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
1179
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
1180 Legacy Vim script uses `:let` for every assignment, while in Vim9 declarations
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
1181 are used. That is different, thus it's good to use a different command:
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
1182 `:var`. This is used in many languages. The semantics might be slightly
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
1183 different, but it's easily recognized as a declaration.
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
1184
23047
29c5f168c6fd Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 22958
diff changeset
1185 Using `:const` for constants is common, but the semantics varies. Some
22391
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
1186 languages only make the variable immutable, others also make the value
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
1187 immutable. Since "final" is well known from Java for only making the variable
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
1188 immutable we decided to use that. And then `:const` can be used for making
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
1189 both immutable. This was also used in legacy Vim script and the meaning is
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
1190 almost the same.
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
1191
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
1192 What we end up with is very similar to Dart: >
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
1193 :var name # mutable variable and value
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
1194 :final name # immutable variable, mutable value
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
1195 :const name # immutable variable and value
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
1196
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
1197 Since legacy and Vim9 script will be mixed and global variables will be
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
1198 shared, optional type checking is desirable. Also, type inference will avoid
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
1199 the need for specifying the type in many cases. The TypeScript syntax fits
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
1200 best for adding types to declarations: >
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
1201 var name: string # string type is specified
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
1202 ...
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
1203 name = 'John'
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
1204 const greeting = 'hello' # string type is inferred
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
1205
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
1206 This is how we put types in a declaration: >
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
1207 var mylist: list<string>
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
1208 final mylist: list<string> = ['foo']
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
1209 def Func(arg1: number, arg2: string): bool
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
1210
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
1211 Two alternatives were considered:
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
1212 1. Put the type before the name, like Dart: >
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
1213 var list<string> mylist
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
1214 final list<string> mylist = ['foo']
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
1215 def Func(number arg1, string arg2) bool
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
1216 2. Put the type after the variable name, but do not use a colon, like Go: >
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
1217 var mylist list<string>
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
1218 final mylist list<string> = ['foo']
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
1219 def Func(arg1 number, arg2 string) bool
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
1220
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
1221 The first is more familiar for anyone used to C or Java. The second one
22565
17c4178f26ea Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22500
diff changeset
1222 doesn't really have an advantage over the first, so let's discard the second.
22391
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
1223
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
1224 Since we use type inference the type can be left out when it can be inferred
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
1225 from the value. This means that after `var` we don't know if a type or a name
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
1226 follows. That makes parsing harder, not only for Vim but also for humans.
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
1227 Also, it will not be allowed to use a variable name that could be a type name,
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
1228 using `var string string` is too confusing.
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
1229
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
1230 The chosen syntax, using a colon to separate the name from the type, adds
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
1231 punctuation, but it actually makes it easier to recognize the parts of a
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
1232 declaration.
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
1233
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
1234
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
1235 Expressions ~
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
1236
22565
17c4178f26ea Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22500
diff changeset
1237 Expression evaluation was already close to what other languages are doing.
17c4178f26ea Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22500
diff changeset
1238 Some details are unexpected and can be improved. For example a boolean
17c4178f26ea Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22500
diff changeset
1239 condition would accept a string, convert it to a number and check if the
17c4178f26ea Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22500
diff changeset
1240 number is non-zero. This is unexpected and often leads to mistakes, since
17c4178f26ea Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22500
diff changeset
1241 text not starting with a number would be converted to zero, which is
22723
5b7ea82bc18f Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22565
diff changeset
1242 considered false. Thus using a string for a condition would often not give an
5b7ea82bc18f Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22565
diff changeset
1243 error and be considered false. That is confusing.
22391
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
1244
23047
29c5f168c6fd Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 22958
diff changeset
1245 In Vim9 type checking is stricter to avoid mistakes. Where a condition is
22565
17c4178f26ea Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22500
diff changeset
1246 used, e.g. with the `:if` command and the `||` operator, only boolean-like
17c4178f26ea Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22500
diff changeset
1247 values are accepted:
17c4178f26ea Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22500
diff changeset
1248 true: `true`, `v:true`, `1`, `0 < 9`
17c4178f26ea Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22500
diff changeset
1249 false: `false`, `v:false`, `0`, `0 > 9`
17c4178f26ea Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22500
diff changeset
1250 Note that the number zero is false and the number one is true. This is more
22723
5b7ea82bc18f Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22565
diff changeset
1251 permissive than most other languages. It was done because many builtin
22565
17c4178f26ea Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22500
diff changeset
1252 functions return these values.
22391
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
1253
22565
17c4178f26ea Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22500
diff changeset
1254 If you have any type of value and want to use it as a boolean, use the `!!`
17c4178f26ea Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22500
diff changeset
1255 operator:
17c4178f26ea Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22500
diff changeset
1256 true: !`!'text'`, `!![99]`, `!!{'x': 1}`, `!!99`
17c4178f26ea Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22500
diff changeset
1257 false: `!!''`, `!![]`, `!!{}`
17c4178f26ea Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22500
diff changeset
1258
17c4178f26ea Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22500
diff changeset
1259 From a language like JavaScript we have this handy construct: >
17c4178f26ea Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22500
diff changeset
1260 GetName() || 'unknown'
17c4178f26ea Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22500
diff changeset
1261 However, this conflicts with only allowing a boolean for a condition.
17c4178f26ea Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22500
diff changeset
1262 Therefore the "??" operator was added: >
17c4178f26ea Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22500
diff changeset
1263 GetName() ?? 'unknown'
17c4178f26ea Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22500
diff changeset
1264 Here you can explicitly express your intention to use the value as-is and not
17c4178f26ea Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22500
diff changeset
1265 result in a boolean. This is called the |falsy-operator|.
22391
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
1266
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
1267
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1268 Import and Export ~
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1269
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1270 A problem of legacy Vim script is that by default all functions and variables
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1271 are global. It is possible to make them script-local, but then they are not
22171
d4c7b3e9cd17 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 21991
diff changeset
1272 available in other scripts. This defies the concept of a package that only
d4c7b3e9cd17 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 21991
diff changeset
1273 exports selected items and keeps the rest local.
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1274
21825
0db0640e16e0 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 21771
diff changeset
1275 In Vim9 script a mechanism very similar to the JavaScript import and export
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1276 mechanism is supported. It is a variant to the existing `:source` command
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1277 that works like one would expect:
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1278 - Instead of making everything global by default, everything is script-local,
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1279 unless exported.
22171
d4c7b3e9cd17 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 21991
diff changeset
1280 - When importing a script the symbols that are imported are explicitly listed,
d4c7b3e9cd17 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 21991
diff changeset
1281 avoiding name conflicts and failures if functionality is added later.
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1282 - The mechanism allows for writing a big, long script with a very clear API:
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1283 the exported function(s) and class(es).
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1284 - By using relative paths loading can be much faster for an import inside of a
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1285 package, no need to search many directories.
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1286 - Once an import has been used, it can be cached and loading it again can be
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1287 avoided.
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1288 - The Vim-specific use of "s:" to make things script-local can be dropped.
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1289
20856
83cfa1ef1bf2 Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 20552
diff changeset
1290 When sourcing a Vim9 script from a legacy script, only the items defined
83cfa1ef1bf2 Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 20552
diff changeset
1291 globally can be used, not the exported items. Alternatives considered:
83cfa1ef1bf2 Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 20552
diff changeset
1292 - All the exported items become available as script-local items. This makes
22171
d4c7b3e9cd17 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 21991
diff changeset
1293 it uncontrollable what items get defined and likely soon leads to trouble.
20856
83cfa1ef1bf2 Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 20552
diff changeset
1294 - Use the exported items and make them global. Disadvantage is that it's then
83cfa1ef1bf2 Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 20552
diff changeset
1295 not possible to avoid name clashes in the global namespace.
83cfa1ef1bf2 Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 20552
diff changeset
1296 - Completely disallow sourcing a Vim9 script, require using `:import`. That
83cfa1ef1bf2 Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 20552
diff changeset
1297 makes it difficult to use scripts for testing, or sourcing them from the
83cfa1ef1bf2 Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 20552
diff changeset
1298 command line to try them out.
22171
d4c7b3e9cd17 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 21991
diff changeset
1299 Note that you can also use `:import` in legacy Vim script, see above.
20856
83cfa1ef1bf2 Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 20552
diff changeset
1300
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1301
22328
75ff30a78189 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22272
diff changeset
1302 Compiling functions early ~
75ff30a78189 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22272
diff changeset
1303
75ff30a78189 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22272
diff changeset
1304 Functions are compiled when called or when `:defcompile` is used. Why not
75ff30a78189 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22272
diff changeset
1305 compile them early, so that syntax and type errors are reported early?
75ff30a78189 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22272
diff changeset
1306
75ff30a78189 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22272
diff changeset
1307 The functions can't be compiled right away when encountered, because there may
75ff30a78189 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22272
diff changeset
1308 be forward references to functions defined later. Consider defining functions
75ff30a78189 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22272
diff changeset
1309 A, B and C, where A calls B, B calls C, and C calls A again. It's impossible
75ff30a78189 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22272
diff changeset
1310 to reorder the functions to avoid forward references.
75ff30a78189 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22272
diff changeset
1311
75ff30a78189 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22272
diff changeset
1312 An alternative would be to first scan through the file to locate items and
75ff30a78189 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22272
diff changeset
1313 figure out their type, so that forward references are found, and only then
75ff30a78189 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22272
diff changeset
1314 execute the script and compile the functions. This means the script has to be
75ff30a78189 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22272
diff changeset
1315 parsed twice, which is slower, and some conditions at the script level, such
75ff30a78189 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22272
diff changeset
1316 as checking if a feature is supported, are hard to use. An attempt was made
75ff30a78189 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22272
diff changeset
1317 to see if it works, but it turned out to be impossible to make work nicely.
75ff30a78189 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22272
diff changeset
1318
75ff30a78189 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22272
diff changeset
1319 It would be possible to compile all the functions at the end of the script.
75ff30a78189 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22272
diff changeset
1320 The drawback is that if a function never gets called, the overhead of
75ff30a78189 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22272
diff changeset
1321 compiling it counts anyway. Since startup speed is very important, in most
75ff30a78189 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22272
diff changeset
1322 cases it's better to do it later and accept that syntax and type errors are
75ff30a78189 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22272
diff changeset
1323 only reported then. In case these errors should be found early, e.g. when
75ff30a78189 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22272
diff changeset
1324 testing, the `:defcompile` command will help out.
75ff30a78189 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22272
diff changeset
1325
75ff30a78189 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22272
diff changeset
1326
22391
a9fb7efa31d6 patch 8.2.1744: Vim9: using ":const!" is weird
Bram Moolenaar <Bram@vim.org>
parents: 22328
diff changeset
1327 Why not use an embedded language? ~
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1328
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1329 Vim supports interfaces to Perl, Python, Lua, Tcl and a few others. But
22328
75ff30a78189 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22272
diff changeset
1330 these interfaces have never become widely used, for various reasons. When
75ff30a78189 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22272
diff changeset
1331 Vim9 was designed a decision was made to make these interfaces lower priority
75ff30a78189 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22272
diff changeset
1332 and concentrate on Vim script.
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1333
22328
75ff30a78189 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22272
diff changeset
1334 Still, plugin writers may find other languages more familiar, want to use
75ff30a78189 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22272
diff changeset
1335 existing libraries or see a performance benefit. We encourage plugin authors
75ff30a78189 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22272
diff changeset
1336 to write code in any language and run it as an external tool, using jobs and
75ff30a78189 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22272
diff changeset
1337 channels. We can try to make this easier somehow.
75ff30a78189 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22272
diff changeset
1338
75ff30a78189 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22272
diff changeset
1339 Using an external tool also has disadvantages. An alternative is to convert
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1340 the tool into Vim script. For that to be possible without too much
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1341 translation, and keeping the code fast at the same time, the constructs of the
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1342 tool need to be supported. Since most languages support classes the lack of
22171
d4c7b3e9cd17 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 21991
diff changeset
1343 support for classes in Vim is then a problem.
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1344
22328
75ff30a78189 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22272
diff changeset
1345
75ff30a78189 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22272
diff changeset
1346 Classes ~
75ff30a78189 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22272
diff changeset
1347
75ff30a78189 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22272
diff changeset
1348 Vim supports a kind-of object oriented programming by adding methods to a
75ff30a78189 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22272
diff changeset
1349 dictionary. With some care this can be made to work, but it does not look
75ff30a78189 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22272
diff changeset
1350 like real classes. On top of that, it's quite slow, because of the use of
75ff30a78189 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 22272
diff changeset
1351 dictionaries.
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1352
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1353 The support of classes in Vim9 script is a "minimal common functionality" of
22171
d4c7b3e9cd17 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 21991
diff changeset
1354 class support in most languages. It works much like Java, which is the most
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1355 popular programming language.
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1356
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1357
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1358
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1359 vim:tw=78:ts=8:noet:ft=help:norl: