blob: 1d7aec94602474dd5b9dcde3bda40087287194df [file] [log] [blame]
Bram Moolenaard1caa942020-04-10 22:10:56 +02001*vim9.txt* For Vim version 8.2. Last change: 2020 Apr 09
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01002
3
4 VIM REFERENCE MANUAL by Bram Moolenaar
5
6
7THIS IS STILL UNDER DEVELOPMENT - ANYTHING CAN BREAK - ANYTHING CAN CHANGE
8
9Vim9 script commands and expressions.
10
11Most expression help is in |eval.txt|. This file is about the new syntax and
12features in Vim9 script.
13
14THIS IS STILL UNDER DEVELOPMENT - ANYTHING CAN BREAK - ANYTHING CAN CHANGE
15
16
171 What is Vim9 script? |vim9-script|
182. Differences |vim9-differences|
193. New style functions |fast-functions|
204. Types |vim9-types|
215. Namespace, Import and Export |vim9script|
22
239. Rationale |vim9-rationale|
24
25==============================================================================
26
271. What is Vim9 script? *vim9-script*
28
29THIS IS STILL UNDER DEVELOPMENT - ANYTHING CAN BREAK - ANYTHING CAN CHANGE
30
31Vim script has been growing over time, while keeping backwards compatibility.
32That means bad choices from the past often can't be changed. Execution is
33quite slow, every line is parsed every time it is executed.
34
35The main goal of Vim9 script is to drastically improve performance. An
36increase in execution speed of 10 to 100 times can be expected. A secondary
37goal is to avoid Vim-specific constructs and get closer to commonly used
38programming languages, such as JavaScript, TypeScript and Java.
39
40The performance improvements can only be achieved by not being 100% backwards
41compatible. For example, in a function the arguments are not available in the
42"a:" dictionary, as creating that dictionary adds quite a lot of overhead.
43Other differences are more subtle, such as how errors are handled.
44
45The Vim9 script syntax and semantics are used in:
46- a function defined with the `:def` command
47- a script file where the first command is `vim9script`
48
49When using `:function` in a Vim9 script file the legacy syntax is used.
50However, this is discouraged.
51
52Vim9 script and legacy Vim script can be mixed. There is no need to rewrite
53old scripts, they keep working as before.
54
55==============================================================================
56
572. Differences from legacy Vim script *vim9-differences*
58
59THIS IS STILL UNDER DEVELOPMENT - ANYTHING CAN BREAK - ANYTHING CAN CHANGE
60
61Vim9 functions ~
62
63`:def` has no extra arguments like `:function` does: "range", "abort", "dict"
64or "closure". A `:def` function always aborts on an error, does not get a
65range passed and cannot be a "dict" function.
66
67In the function body:
68- Arguments are accessed by name, without "a:".
69- There is no "a:" dictionary or "a:000" list. Variable arguments are defined
70 with a name and have a list type: >
71 def MyFunc(...itemlist: list<type>)
72 for item in itemlist
73 ...
74
75
76Variable declarations with :let and :const ~
77
78Local variables need to be declared with `:let`. Local constants need to be
79declared with `:const`. We refer to both as "variables".
80
81Variables can be local to a script, function or code block: >
82 vim9script
83 let script_var = 123
84 def SomeFunc()
85 let func_var = script_var
86 if cond
87 let block_var = func_var
88 ...
89
90The variables are only visible in the block where they are defined and nested
91blocks. Once the block ends the variable is no longer accessible: >
92 if cond
93 let inner = 5
94 else
95 let inner = 0
96 endif
97 echo inner " Error!
98
99The declaration must be done earlier: >
100 let inner: number
101 if cond
102 inner = 5
103 else
104 inner = 0
105 endif
106 echo inner
107
108To intentionally use a variable that won't be available later, a block can be
109used: >
110 {
111 let temp = 'temp'
112 ...
113 }
114 echo temp " Error!
115
Bram Moolenaar560979e2020-02-04 22:53:05 +0100116An existing variable cannot be assigned to with `:let`, since that implies a
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100117declaration. An exception is global variables: these can be both used with
118and without `:let`, because there is no rule about where they are declared.
119
120Variables cannot shadow previously defined variables.
121Variables may shadow Ex commands, rename the variable if needed.
122
Bram Moolenaard1caa942020-04-10 22:10:56 +0200123Global variables must be prefixed with "g:", also at the script level.
124However, global user defined functions are used without "g:". >
125 vim9script
126 let script_local = 'text'
127 let g:global = 'value'
128 let Funcref = ThatFunction
129
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100130Since "&opt = value" is now assigning a value to option "opt", ":&" cannot be
131used to repeat a `:substitute` command.
132
133
134Omitting :call and :eval ~
135
136Functions can be called without `:call`: >
137 writefile(lines, 'file')
Bram Moolenaar560979e2020-02-04 22:53:05 +0100138Using `:call` is still possible, but this is discouraged.
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100139
140A method call without `eval` is possible, so long as the start is an
Bram Moolenaar0c6ceaf2020-02-22 18:36:32 +0100141identifier or can't be an Ex command. It does NOT work for string constants: >
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100142 myList->add(123) " works
143 g:myList->add(123) " works
144 [1, 2, 3]->Process() " works
145 #{a: 1, b: 2}->Process() " works
146 {'a': 1, 'b': 2}->Process() " works
147 "foobar"->Process() " does NOT work
Bram Moolenaar0c6ceaf2020-02-22 18:36:32 +0100148 ("foobar")->Process() " works
149 'foobar'->Process() " does NOT work
150 ('foobar')->Process() " works
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100151
Bram Moolenaar5b1c8fe2020-02-21 18:42:43 +0100152In case there is ambiguity between a function name and an Ex command, use ":"
153to make clear you want to use the Ex command. For example, there is both the
154`:substitute` command and the `substitute()` function. When the line starts
155with `substitute(` this will use the function, prepend a colon to use the
156command instead: >
Bram Moolenaar0c6ceaf2020-02-22 18:36:32 +0100157 :substitute(pattern (replacement (
Bram Moolenaar5b1c8fe2020-02-21 18:42:43 +0100158
Bram Moolenaarcc390ff2020-02-29 22:06:30 +0100159Note that while variables need to be defined before they can be used,
160functions can be called before being defined. This is required to be able
161have cyclic dependencies between functions. It is slightly less efficient,
162since the function has to be looked up by name. And a typo in the function
163name will only be found when the call is executed.
164
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100165
Bram Moolenaard1caa942020-04-10 22:10:56 +0200166Omitting function() ~
167
168A user defined function can be used as a function reference in an expression
169without `function()`. The argument types and return type will then be checked.
170The function must already have been defined. >
171
172 let Funcref = MyFunction
173
174When using `function()` the resulting type is "func", a function with any
175number of arguments and any return type. The function can be defined later.
176
177
Bram Moolenaar4fdae992020-04-12 16:38:57 +0200178Automatic line continuation ~
179
180In many cases it is obvious that an expression continues on the next line. In
181those cases there is no need to prefix the line with a backslash. For
182example, when a list spans multiple lines: >
183 let mylist = [
184 'one',
185 'two',
186 ]
Bram Moolenaare6085c52020-04-12 20:19:16 +0200187And when a dict spans multiple lines: >
188 let mydict = #{
189 one: 1,
190 two: 2,
191 }
192Function call: >
193 let result = Func(
194 arg1,
195 arg2
196 )
197
Bram Moolenaar9c7e6dd2020-04-12 20:55:20 +0200198For binary operators iin expressions not in [], {} or () a line break is
199possible AFTER the operators. For example: >
200 let text = lead ..
201 middle ..
202 end
203 let total = start +
204 end -
205 correction
206 let result = positive ?
207 PosFunc(arg) :
208 NegFunc(arg)
209
Bram Moolenaare6085c52020-04-12 20:19:16 +0200210Note that "enddef" cannot be used at the start of a continuation line, it ends
211the current function.
Bram Moolenaar4fdae992020-04-12 16:38:57 +0200212
213
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100214No curly braces expansion ~
215
216|curly-braces-names| cannot be used.
217
218
Bram Moolenaar560979e2020-02-04 22:53:05 +0100219No :append, :change or :insert ~
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100220
Bram Moolenaar560979e2020-02-04 22:53:05 +0100221These commands are too quickly confused with local variable names.
222
223
224Comparators ~
225
226The 'ignorecase' option is not used for comparators that use strings.
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100227
228
229White space ~
230
231Vim9 script enforces proper use of white space. This is no longer allowed: >
232 let var=234 " Error!
233 let var= 234 " Error!
234 let var =234 " Error!
235There must be white space before and after the "=": >
236 let var = 234 " OK
237
238White space is required around most operators.
239
240White space is not allowed:
241- Between a function name and the "(": >
242 call Func (arg) " Error!
243 call Func
244 \ (arg) " Error!
245 call Func(arg) " OK
246 call Func(
247 \ arg) " OK
Bram Moolenaar5b1c8fe2020-02-21 18:42:43 +0100248 call Func(
249 \ arg " OK
250 \ )
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100251
252
253Conditions and expressions ~
254
255Conditions and expression are mostly working like they do in JavaScript. A
256difference is made where JavaScript does not work like most people expect.
257Specifically, an empty list is falsey.
258
259Any type of variable can be used as a condition, there is no error, not even
260for using a list or job. This is very much like JavaScript, but there are a
261few exceptions.
262
263 type TRUE when ~
264 bool v:true
265 number non-zero
266 float non-zero
267 string non-empty
268 blob non-empty
269 list non-empty (different from JavaScript)
270 dictionary non-empty (different from JavaScript)
Bram Moolenaard1caa942020-04-10 22:10:56 +0200271 func when there is a function name
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100272 special v:true
273 job when not NULL
274 channel when not NULL
275 class when not NULL
276 object when not NULL (TODO: when isTrue() returns v:true)
277
278The boolean operators "||" and "&&" do not change the value: >
279 8 || 2 == 8
280 0 || 2 == 2
281 0 || '' == ''
282 8 && 2 == 2
283 0 && 2 == 0
284 [] && 2 == []
285
286When using `..` for string concatenation the arguments are always converted to
287string. >
288 'hello ' .. 123 == 'hello 123'
289 'hello ' .. v:true == 'hello true'
290
291In Vim9 script one can use "true" for v:true and "false" for v:false.
292
293
294==============================================================================
295
2963. New style functions *fast-functions*
297
298THIS IS STILL UNDER DEVELOPMENT - ANYTHING CAN BREAK - ANYTHING CAN CHANGE
299
300 *:def*
301:def[!] {name}([arguments])[: {return-type}
302 Define a new function by the name {name}. The body of
303 the function follows in the next lines, until the
304 matching `:enddef`.
305
Bram Moolenaard77a8522020-04-03 21:59:57 +0200306 When {return-type} is omitted or is "void" the
307 function is not expected to return anything.
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100308
309 {arguments} is a sequence of zero or more argument
310 declarations. There are three forms:
311 {name}: {type}
312 {name} = {value}
313 {name}: {type} = {value}
314 The first form is a mandatory argument, the caller
315 must always provide them.
316 The second and third form are optional arguments.
317 When the caller omits an argument the {value} is used.
318
Bram Moolenaar560979e2020-02-04 22:53:05 +0100319 NOTE: It is possible to nest `:def` inside another
320 `:def`, but it is not possible to nest `:def` inside
321 `:function`, for backwards compatibility.
322
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100323 [!] is used as with `:function`.
324
325 *:enddef*
326:enddef End of a function defined with `:def`.
327
328
Bram Moolenaar5b1c8fe2020-02-21 18:42:43 +0100329If the script the function is defined in is Vim9 script, then script-local
330variables can be accessed without the "s:" prefix. They must be defined
331before the function. If the script the function is defined in is legacy
332script, then script-local variables must be accessed with the "s:" prefix.
333
334
Bram Moolenaarebdf3c92020-02-15 21:41:42 +0100335 *:disa* *:disassemble*
336:disa[ssemble] {func} Show the instructions generated for {func}.
337 This is for debugging and testing.
Bram Moolenaarcc390ff2020-02-29 22:06:30 +0100338 Note that for command line completion of {func} you
339 can prepend "s:" to find script-local functions.
Bram Moolenaarebdf3c92020-02-15 21:41:42 +0100340
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100341==============================================================================
342
3434. Types *vim9-types*
344
345THIS IS STILL UNDER DEVELOPMENT - ANYTHING CAN BREAK - ANYTHING CAN CHANGE
346
347The following builtin types are supported:
348 bool
349 number
350 float
351 string
352 blob
Bram Moolenaard77a8522020-04-03 21:59:57 +0200353 list<{type}>
354 dict<{type}>
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100355 job
356 channel
Bram Moolenaarb17893a2020-03-14 08:19:51 +0100357 func
Bram Moolenaard1caa942020-04-10 22:10:56 +0200358 func: {type}
Bram Moolenaard77a8522020-04-03 21:59:57 +0200359 func({type}, ...)
360 func({type}, ...): {type}
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100361
362Not supported yet:
Bram Moolenaard77a8522020-04-03 21:59:57 +0200363 tuple<a: {type}, b: {type}, ...>
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100364
Bram Moolenaard77a8522020-04-03 21:59:57 +0200365These types can be used in declarations, but no value will have this type:
366 {type}|{type}
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100367 void
368 any
369
Bram Moolenaard77a8522020-04-03 21:59:57 +0200370There is no array type, use list<{type}> instead. For a list constant an
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100371efficient implementation is used that avoids allocating lot of small pieces of
372memory.
373
Bram Moolenaard77a8522020-04-03 21:59:57 +0200374A partial and function can be declared in more or less specific ways:
375func any kind of function reference, no type
Bram Moolenaard1caa942020-04-10 22:10:56 +0200376 checking for arguments or return value
Bram Moolenaard77a8522020-04-03 21:59:57 +0200377func: {type} any number and type of arguments with specific
378 return type
Bram Moolenaard1caa942020-04-10 22:10:56 +0200379func({type}) function with argument type, does not return
Bram Moolenaard77a8522020-04-03 21:59:57 +0200380 a value
Bram Moolenaard1caa942020-04-10 22:10:56 +0200381func({type}): {type} function with argument type and return type
382func(?{type}) function with type of optional argument, does
383 not return a value
384func(...{type}) function with type of variable number of
385 arguments, does not return a value
386func({type}, ?{type}, ...{type}): {type}
387 function with:
388 - type of mandatory argument
389 - type of optional argument
390 - type of variable number of arguments
391 - return type
Bram Moolenaard77a8522020-04-03 21:59:57 +0200392
393If the return type is "void" the function does not return a value.
394
395The reference can also be a |Partial|, in which case it stores extra arguments
396and/or a dictionary, which are not visible to the caller. Since they are
397called in the same way the declaration is the same.
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100398
399Custom types can be defined with `:type`: >
400 :type MyList list<string>
401{not implemented yet}
402
403And classes and interfaces can be used as types: >
404 :class MyClass
405 :let mine: MyClass
406
407 :interface MyInterface
408 :let mine: MyInterface
409
410 :class MyTemplate<Targ>
411 :let mine: MyTemplate<number>
412 :let mine: MyTemplate<string>
413
414 :class MyInterface<Targ>
415 :let mine: MyInterface<number>
416 :let mine: MyInterface<string>
417{not implemented yet}
418
419
420Type inference *type-inference*
421
422In general: Whenever the type is clear it can be omitted. For example, when
423declaring a variable and giving it a value: >
424 let var = 0 " infers number type
425 let var = 'hello' " infers string type
426
427
428==============================================================================
429
4305. Namespace, Import and Export
431 *vim9script* *vim9-export* *vim9-import*
432
433THIS IS STILL UNDER DEVELOPMENT - ANYTHING CAN BREAK - ANYTHING CAN CHANGE
434
435A Vim9 script can be written to be imported. This means that everything in
436the script is local, unless exported. Those exported items, and only those
437items, can then be imported in another script.
438
439
440Namespace ~
441 *:vim9script* *:vim9*
Bram Moolenaar560979e2020-02-04 22:53:05 +0100442To recognize a file that can be imported the `vim9script` statement must
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100443appear as the first statement in the file. It tells Vim to interpret the
444script in its own namespace, instead of the global namespace. If a file
445starts with: >
446 vim9script
447 let myvar = 'yes'
448Then "myvar" will only exist in this file. While without `vim9script` it would
449be available as `g:myvar` from any other script and function.
450
451The variables at the file level are very much like the script-local "s:"
452variables in legacy Vim script, but the "s:" is omitted.
453
454In Vim9 script the global "g:" namespace can still be used as before.
455
456A side effect of `:vim9script` is that the 'cpoptions' option is set to the
457Vim default value, like with: >
458 :set cpo&vim
459One of the effects is that |line-continuation| is always enabled.
460The original value of 'cpoptions' is restored at the end of the script.
461
462
463Export ~
464 *:export* *:exp*
465Exporting one item can be written as: >
466 export const EXPORTED_CONST = 1234
467 export let someValue = ...
468 export def MyFunc() ...
469 export class MyClass ...
470
471As this suggests, only constants, variables, `:def` functions and classes can
472be exported.
473
474Alternatively, an export statement can be used to export several already
475defined (otherwise script-local) items: >
476 export {EXPORTED_CONST, someValue, MyFunc, MyClass}
477
478
479Import ~
480 *:import* *:imp*
481The exported items can be imported individually in another Vim9 script: >
482 import EXPORTED_CONST from "thatscript.vim"
483 import MyClass from "myclass.vim"
484
485To import multiple items at the same time: >
486 import {someValue, MyClass} from "thatscript.vim"
487
Bram Moolenaar560979e2020-02-04 22:53:05 +0100488In case the name is ambiguous, another name can be specified: >
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100489 import MyClass as ThatClass from "myclass.vim"
490 import {someValue, MyClass as ThatClass} from "myclass.vim"
491
492To import all exported items under a specific identifier: >
493 import * as That from 'thatscript.vim'
494
495Then you can use "That.EXPORTED_CONST", "That.someValue", etc. You are free
496to choose the name "That", but it is highly recommended to use the name of the
497script file to avoid confusion.
498
499The script name after `import` can be:
500- A relative path, starting "." or "..". This finds a file relative to the
501 location of the script file itself. This is useful to split up a large
502 plugin into several files.
503- An absolute path, starting with "/" on Unix or "D:/" on MS-Windows. This
504 will be rarely used.
505- A path not being relative or absolute. This will be found in the
506 "import" subdirectories of 'runtimepath' entries. The name will usually be
507 longer and unique, to avoid loading the wrong file.
508
509Once a vim9 script file has been imported, the result is cached and used the
510next time the same script is imported. It will not be read again.
511 *:import-cycle*
512The `import` commands are executed when encountered. If that script (directly
513or indirectly) imports the current script, then items defined after the
514`import` won't be processed yet. Therefore cyclic imports can exist, but may
515result in undefined items.
516
517
518Import in an autoload script ~
519
520For optimal startup speed, loading scripts should be postponed until they are
Bram Moolenaar560979e2020-02-04 22:53:05 +0100521actually needed. A recommended mechanism:
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100522
5231. In the plugin define user commands, functions and/or mappings that refer to
524 an autoload script. >
525 command -nargs=1 SearchForStuff call searchfor#Stuff(<f-args>)
526
527< This goes in .../plugin/anyname.vim. "anyname.vim" can be freely chosen.
528
5292. In the autocommand script do the actual work. You can import items from
530 other files to split up functionality in appropriate pieces. >
531 vim9script
532 import FilterFunc from "../import/someother.vim"
533 def searchfor#Stuff(arg: string)
534 let filtered = FilterFunc(arg)
535 ...
536< This goes in .../autoload/searchfor.vim. "searchfor" in the file name
537 must be exactly the same as the prefix for the function name, that is how
538 Vim finds the file.
539
5403. Other functionality, possibly shared between plugins, contains the exported
541 items and any private items. >
542 vim9script
543 let localVar = 'local'
544 export def FilterFunc(arg: string): string
545 ...
546< This goes in .../import/someother.vim.
547
548
549Import in legacy Vim script ~
550
551If an `import` statement is used in legacy Vim script, for identifier the
552script-local "s:" namespace will be used, even when "s:" is not specified.
553
554
555==============================================================================
556
5579. Rationale *vim9-rationale*
558
559The :def command ~
560
561Plugin writers have asked for a much faster Vim script. Investigation have
Bram Moolenaar560979e2020-02-04 22:53:05 +0100562shown that keeping the existing semantics of function calls make this close to
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100563impossible, because of the overhead involved with calling a function, setting
564up the local function scope and executing lines. There are many details that
565need to be handled, such as error messages and exceptions. The need to create
566a dictionary for a: and l: scopes, the a:000 list and several others add too
567much overhead that cannot be avoided.
568
569Therefore the `:def` method to define a new-style function had to be added,
570which allows for a function with different semantics. Most things still work
571as before, but some parts do not. A new way to define a function was
572considered the best way to separate the old-style code from Vim9 script code.
573
574Using "def" to define a function comes from Python. Other languages use
575"function" which clashes with legacy Vim script.
576
577
578Type checking ~
579
580When compiling lines of Vim commands into instructions as much as possible
581should be done at compile time. Postponing it to runtime makes the execution
582slower and means mistakes are found only later. For example, when
583encountering the "+" character and compiling this into a generic add
584instruction, at execution time the instruction would have to inspect the type
585of the arguments and decide what kind of addition to do. And when the
586type is dictionary throw an error. If the types are known to be numbers then
587an "add number" instruction can be used, which is faster. The error can be
588given at compile time, no error handling is needed at runtime.
589
590The syntax for types is similar to Java, since it is easy to understand and
591widely used. The type names are what was used in Vim before, with some
592additions such as "void" and "bool".
593
594
595JavaScript/TypeScript syntax and semantics ~
596
597Script writers have complained that the Vim script syntax is unexpectedly
598different from what they are used to. To reduce this complaint popular
599languages will be used as an example. At the same time, we do not want to
Bram Moolenaar560979e2020-02-04 22:53:05 +0100600abandon the well-known parts of legacy Vim script.
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100601
602Since Vim already uses `:let` and `:const` and optional type checking is
603desirable, the JavaScript/TypeScript syntax fits best for variable
604declarations. >
605 const greeting = 'hello' " string type is inferred
606 let name: string
607 ...
608 name = 'John'
609
610Expression evaluation was already close to what JavaScript and other languages
611are doing. Some details are unexpected and can be fixed. For example how the
612|| and && operators work. Legacy Vim script: >
613 let result = 44
614 ...
615 return result || 0 " returns 1
616
617Vim9 script works like JavaScript, keep the value: >
618 let result = 44
619 ...
620 return result || 0 " returns 44
621
622On the other hand, overloading "+" to use both for addition and string
623concatenation goes against legacy Vim script and often leads to mistakes.
624For that reason we will keep using ".." for string concatenation. Lua also
625uses ".." this way.
626
627
628Import and Export ~
629
630A problem of legacy Vim script is that by default all functions and variables
631are global. It is possible to make them script-local, but then they are not
632available in other scripts.
633
634In Vim9 script a mechanism very similar to the Javascript import and export
635mechanism is supported. It is a variant to the existing `:source` command
636that works like one would expect:
637- Instead of making everything global by default, everything is script-local,
638 unless exported.
639- When importing a script the symbols that are imported are listed, avoiding
640 name conflicts and failures if later functionality is added.
641- The mechanism allows for writing a big, long script with a very clear API:
642 the exported function(s) and class(es).
643- By using relative paths loading can be much faster for an import inside of a
644 package, no need to search many directories.
645- Once an import has been used, it can be cached and loading it again can be
646 avoided.
647- The Vim-specific use of "s:" to make things script-local can be dropped.
648
649
650Classes ~
651
652Vim supports interfaces to Perl, Python, Lua, Tcl and a few others. But
653these have never become widespread. When Vim 9 was designed a decision was
654made to phase out these interfaces and concentrate on Vim script, while
655encouraging plugin authors to write code in any language and run it as an
656external tool, using jobs and channels.
657
658Still, using an external tool has disadvantages. An alternative is to convert
659the tool into Vim script. For that to be possible without too much
660translation, and keeping the code fast at the same time, the constructs of the
661tool need to be supported. Since most languages support classes the lack of
662class support in Vim is then a problem.
663
664Previously Vim supported a kind-of object oriented programming by adding
665methods to a dictionary. With some care this could be made to work, but it
666does not look like real classes. On top of that, it's very slow, because of
667the use of dictionaries.
668
669The support of classes in Vim9 script is a "minimal common functionality" of
670class support in most languages. It works mostly like Java, which is the most
671popular programming language.
672
673
674
675 vim:tw=78:ts=8:noet:ft=help:norl: