Update runtime files.
diff --git a/runtime/doc/builtin.txt b/runtime/doc/builtin.txt
index 265111d..8b0da25 100644
--- a/runtime/doc/builtin.txt
+++ b/runtime/doc/builtin.txt
@@ -1,4 +1,4 @@
-*builtin.txt* For Vim version 9.0. Last change: 2022 Dec 23
+*builtin.txt* For Vim version 9.0. Last change: 2023 Jan 17
VIM REFERENCE MANUAL by Bram Moolenaar
diff --git a/runtime/doc/diff.txt b/runtime/doc/diff.txt
index 2c1233b..40167a1 100644
--- a/runtime/doc/diff.txt
+++ b/runtime/doc/diff.txt
@@ -1,4 +1,4 @@
-*diff.txt* For Vim version 9.0. Last change: 2022 Dec 24
+*diff.txt* For Vim version 9.0. Last change: 2023 Jan 21
VIM REFERENCE MANUAL by Bram Moolenaar
@@ -136,7 +136,7 @@
buffers.
The `:diffoff` command resets the relevant options to the values they had when
-using `:diffsplit`, `:diffpatch` , `:diffthis`. or starting Vim in diff mode.
+using `:diffsplit`, `:diffpatch`, `:diffthis`. or starting Vim in diff mode.
When using `:diffoff` twice the last saved values are restored.
Otherwise they are set to their default value:
diff --git a/runtime/doc/eval.txt b/runtime/doc/eval.txt
index 5fff3e8..b133c5a 100644
--- a/runtime/doc/eval.txt
+++ b/runtime/doc/eval.txt
@@ -1,4 +1,4 @@
-*eval.txt* For Vim version 9.0. Last change: 2023 Jan 03
+*eval.txt* For Vim version 9.0. Last change: 2023 Jan 12
VIM REFERENCE MANUAL by Bram Moolenaar
diff --git a/runtime/doc/fold.txt b/runtime/doc/fold.txt
index 6da244d..bb1dcb6 100644
--- a/runtime/doc/fold.txt
+++ b/runtime/doc/fold.txt
@@ -1,4 +1,4 @@
-*fold.txt* For Vim version 9.0. Last change: 2022 Nov 26
+*fold.txt* For Vim version 9.0. Last change: 2023 Jan 29
VIM REFERENCE MANUAL by Bram Moolenaar
@@ -202,7 +202,7 @@
/* funcB() {{{2 */
void funcB() {}
-
+< *{{{* *}}}*
A fold starts at a "{{{" marker. The following number specifies the fold
level. What happens depends on the difference between the current fold level
and the level given by the marker:
diff --git a/runtime/doc/ft_context.txt b/runtime/doc/ft_context.txt
index 9b08197..6303357 100644
--- a/runtime/doc/ft_context.txt
+++ b/runtime/doc/ft_context.txt
@@ -48,7 +48,7 @@
command as a List. For example:
>
def ConTeXtCustomCommand(path: string): list<string>
- return ['mtxrun', '--script', 'context', '--nonstopmode, path]
+ return ['mtxrun', '--script', 'context', '--nonstopmode', path]
enddef
context.ConTeXtTypeset("%", v:none, ConTeXtCustomCommand)
diff --git a/runtime/doc/ft_mp.txt b/runtime/doc/ft_mp.txt
index 0c6646f..595bc02 100644
--- a/runtime/doc/ft_mp.txt
+++ b/runtime/doc/ft_mp.txt
@@ -84,7 +84,7 @@
Define additional keywords that end indented blocks. For instance, if you
define:
>
- g:mp_end_tag = ['\<endfoo\>']
+ g:mp_close_tag = ['\<endfoo\>']
<
any line starting with `endfoo` will be de-indented compared to its previous
line.
diff --git a/runtime/doc/options.txt b/runtime/doc/options.txt
index 0fc00b4..eece600 100644
--- a/runtime/doc/options.txt
+++ b/runtime/doc/options.txt
@@ -1,4 +1,4 @@
-*options.txt* For Vim version 9.0. Last change: 2023 Jan 02
+*options.txt* For Vim version 9.0. Last change: 2023 Feb 01
VIM REFERENCE MANUAL by Bram Moolenaar
@@ -1899,7 +1899,7 @@
'allowrevins' + off no CTRL-_ command
'antialias' + off don't use antialiased fonts
- 'arabic' + off reset arabic-related options
+ 'arabic' + off reset arabic-related options
'arabicshape' + on correct character shapes
'backspace' + "" normal backspace
'backup' + off no backup file
@@ -4943,7 +4943,7 @@
empty. Then set the 'term' option to have it take effect: >
set keyprotocol=
let &term = &term
-
+<
*'keywordprg'* *'kp'*
'keywordprg' 'kp' string (default "man" or "man -s", DOS: ":help",
@@ -5201,8 +5201,8 @@
are left blank.
*lcs-multispace*
multispace:c...
- One or more characters to use cyclically to show for
- multiple consecutive spaces. Overrides the "space"
+ One or more characters to use cyclically to show for
+ multiple consecutive spaces. Overrides the "space"
setting, except for single spaces. When omitted, the
"space" setting is used. For example,
`:set listchars=multispace:---+` shows ten consecutive
@@ -7784,8 +7784,8 @@
windows.
* - Set highlight group to User{N}, where {N} is taken from the
minwid field, e.g. %1*. Restore normal highlight with %* or %0*.
- The difference between User{N} and StatusLine will be applied
- to StatusLineNC for the statusline of non-current windows.
+ The difference between User{N} and StatusLine will be applied to
+ StatusLineNC for the statusline of non-current windows.
The number N must be between 1 and 9. See |hl-User1..9|
When displaying a flag, Vim removes the leading comma, if any, when
diff --git a/runtime/doc/quickfix.txt b/runtime/doc/quickfix.txt
index 7dc4fa3..438cc6f 100644
--- a/runtime/doc/quickfix.txt
+++ b/runtime/doc/quickfix.txt
@@ -1,4 +1,4 @@
-*quickfix.txt* For Vim version 9.0. Last change: 2022 Sep 26
+*quickfix.txt* For Vim version 9.0. Last change: 2023 Jan 18
VIM REFERENCE MANUAL by Bram Moolenaar
@@ -365,8 +365,6 @@
If numbers [from] and/or [to] are given, the respective
range of errors is listed. A negative number counts
from the last error backwards, -1 being the last error.
- The 'switchbuf' settings are respected when jumping
- to a buffer.
The |:filter| command can be used to display only the
quickfix entries matching a supplied pattern. The
pattern is matched against the filename, module name,
diff --git a/runtime/doc/tags b/runtime/doc/tags
index 49cabaa..051c74b 100644
--- a/runtime/doc/tags
+++ b/runtime/doc/tags
@@ -438,8 +438,10 @@
'keymap' options.txt /*'keymap'*
'keymodel' options.txt /*'keymodel'*
'keyprotocol' options.txt /*'keyprotocol'*
+'keywordprg' options.txt /*'keywordprg'*
'km' options.txt /*'km'*
'kmp' options.txt /*'kmp'*
+'kp' options.txt /*'kp'*
'kpc' options.txt /*'kpc'*
'langmap' options.txt /*'langmap'*
'langmenu' options.txt /*'langmenu'*
@@ -4416,6 +4418,11 @@
E1352 vim9class.txt /*E1352*
E1353 vim9class.txt /*E1353*
E1354 vim9class.txt /*E1354*
+E1355 vim9class.txt /*E1355*
+E1356 vim9class.txt /*E1356*
+E1357 vim9class.txt /*E1357*
+E1358 vim9class.txt /*E1358*
+E1359 vim9class.txt /*E1359*
E136 starting.txt /*E136*
E137 starting.txt /*E137*
E138 starting.txt /*E138*
@@ -5633,6 +5640,7 @@
Vim9 vim9.txt /*Vim9*
Vim9-abstract-class vim9class.txt /*Vim9-abstract-class*
Vim9-class vim9class.txt /*Vim9-class*
+Vim9-class-member vim9class.txt /*Vim9-class-member*
Vim9-class-overview vim9class.txt /*Vim9-class-overview*
Vim9-enum vim9class.txt /*Vim9-enum*
Vim9-script vim9.txt /*Vim9-script*
@@ -6311,7 +6319,6 @@
cinoptions-values indent.txt /*cinoptions-values*
class vim9class.txt /*class*
class-function vim9class.txt /*class-function*
-class-member vim9class.txt /*class-member*
clear-undo undo.txt /*clear-undo*
clearmatches() builtin.txt /*clearmatches()*
client-server remote.txt /*client-server*
@@ -7558,6 +7565,7 @@
getbufline() builtin.txt /*getbufline()*
getbufoneline() builtin.txt /*getbufoneline()*
getbufvar() builtin.txt /*getbufvar()*
+getcellwidths() builtin.txt /*getcellwidths()*
getchangelist() builtin.txt /*getchangelist()*
getchar() builtin.txt /*getchar()*
getcharmod() builtin.txt /*getcharmod()*
@@ -10042,6 +10050,7 @@
t_ci version4.txt /*t_ci*
t_cil version4.txt /*t_cil*
t_cl term.txt /*t_cl*
+t_class-variable eval.txt /*t_class-variable*
t_cm term.txt /*t_cm*
t_cri version4.txt /*t_cri*
t_cs term.txt /*t_cs*
@@ -10106,6 +10115,7 @@
t_nd term.txt /*t_nd*
t_none-variable eval.txt /*t_none-variable*
t_number-variable eval.txt /*t_number-variable*
+t_object-variable eval.txt /*t_object-variable*
t_op term.txt /*t_op*
t_se term.txt /*t_se*
t_sf1 version4.txt /*t_sf1*
@@ -10614,6 +10624,7 @@
v:t_blob eval.txt /*v:t_blob*
v:t_bool eval.txt /*v:t_bool*
v:t_channel eval.txt /*v:t_channel*
+v:t_class eval.txt /*v:t_class*
v:t_dict eval.txt /*v:t_dict*
v:t_float eval.txt /*v:t_float*
v:t_func eval.txt /*v:t_func*
@@ -10621,6 +10632,7 @@
v:t_list eval.txt /*v:t_list*
v:t_none eval.txt /*v:t_none*
v:t_number eval.txt /*v:t_number*
+v:t_object eval.txt /*v:t_object*
v:t_string eval.txt /*v:t_string*
v:termblinkresp eval.txt /*v:termblinkresp*
v:termrbgresp eval.txt /*v:termrbgresp*
@@ -11208,6 +11220,8 @@
{rhs} map.txt /*{rhs}*
{server} remote.txt /*{server}*
{subject} helphelp.txt /*{subject}*
+{{{ fold.txt /*{{{*
{} intro.txt /*{}*
} motion.txt /*}*
+}}} fold.txt /*}}}*
~ change.txt /*~*
diff --git a/runtime/doc/term.txt b/runtime/doc/term.txt
index 3336889..cb4c676 100644
--- a/runtime/doc/term.txt
+++ b/runtime/doc/term.txt
@@ -1,4 +1,4 @@
-*term.txt* For Vim version 9.0. Last change: 2023 Jan 09
+*term.txt* For Vim version 9.0. Last change: 2023 Jan 15
VIM REFERENCE MANUAL by Bram Moolenaar
@@ -322,9 +322,14 @@
PS "\033[200~" pasted text start |t_PS|
PE "\033[201~" pasted text end |t_PE|
- XM "\033[?1006;1000%?%p1%{1}%=%th%el%;"
+ XM "\033[?1006;1004;1000%?%p1%{1}%=%th%el%;"
mouse enable / disable |t_XM|
+The "XM" entry includes "1006" to enable SGR style mouse reporting. This
+supports columns above 223. It also includes "1004" which enables focus
+reporting. The t_fe and t_fd entries can be left empty (they don't have
+entries in terminfo/termcap anyway).
+
*xterm-kitty* *kitty-terminal*
The Kitty terminal is a special case. Mainly because it works differently
from most other terminals, but also because, instead of trying the fit in and
diff --git a/runtime/doc/testing.txt b/runtime/doc/testing.txt
index beef79d..71e5f7c 100644
--- a/runtime/doc/testing.txt
+++ b/runtime/doc/testing.txt
@@ -223,12 +223,12 @@
Can also be used as a |method|: >
GetErrorText()->test_ignore_error()
-
+
test_mswin_event({event}, {args}) *test_mswin_event()*
Generate a low-level MS-Windows {event} with arguments {args}
- for testing Vim functionality. It works for MS-Windows GUI
+ for testing Vim functionality. It works for MS-Windows GUI
and for the console.
-
+
{event} is a String and the supported values are:
"mouse" mouse event.
"key" keyboard event.
diff --git a/runtime/doc/textprop.txt b/runtime/doc/textprop.txt
index c6178c3..3d0be6a 100644
--- a/runtime/doc/textprop.txt
+++ b/runtime/doc/textprop.txt
@@ -108,7 +108,7 @@
Manipulating text properties:
prop_add({lnum}, {col}, {props}) add a text property
-prop_add_list({props}, [[{lnum}, {col}, {end-lnum}, {end-col}], ...])
+prop_add_list({props}, [{item}, ...])
add a text property at multiple
positions.
prop_clear({lnum} [, {lnum-end} [, {bufnr}]])
@@ -263,12 +263,12 @@
It is not possible to add a text property with a "text" field
here.
- Example:
+ Example: >
call prop_add_list(#{type: 'MyProp', id: 2},
\ [[1, 4, 1, 7],
\ [1, 15, 1, 20],
\ [2, 30, 3, 30]]
-
+<
Can also be used as a |method|: >
GetProp()->prop_add_list([[1, 1, 1, 2], [1, 4, 1, 8]])
diff --git a/runtime/doc/todo.txt b/runtime/doc/todo.txt
index be14871..4e58fa5 100644
--- a/runtime/doc/todo.txt
+++ b/runtime/doc/todo.txt
@@ -1,4 +1,4 @@
-*todo.txt* For Vim version 9.0. Last change: 2023 Jan 09
+*todo.txt* For Vim version 9.0. Last change: 2023 Feb 02
VIM REFERENCE MANUAL by Bram Moolenaar
@@ -38,6 +38,13 @@
*known-bugs*
-------------------- Known bugs and current work -----------------------
+Errors when running tests with valgrind:
+- test_codestyle.vim: e.g.:
+ command line..script /home/mool/vim/vim90/src/testdir/runtest.vim[569]..function RunTheTest[52]..Test_test_files line 6: keycode_check.vim: space before tab: Expected 0 but got 7
+ command line..script /home/mool/vim/vim90/src/testdir/runtest.vim[569]..function RunTheTest[52]..Test_test_files line 10: setup.vim: trailing white space: Expected 0 but got 23
+- test_gui.vim:
+ Found errors in Test_gui_mouse_event():
+
Upcoming larger works:
- Make spell checking work with recent .dic/.aff files, e.g. French. #4916
Make Vim understand the format somehow? Search for "spell" below.
@@ -53,18 +60,29 @@
Further Vim9 improvements, possibly after launch:
-- implement :class and :interface: See |vim9-classes| #11544
- inheritance: how about super()?
- inheritance: new() method from parent used in child?
- import/export of a class
- type() should return different type for each class?
- give error for shadowing (variable and argument) when defining a class or
- interface, not later when compiling it.
- object empty(), len() - can class define a method to be used for them?
- how about lock/unlock?
- When checking "implements" also check types of members and function args.
+- implement :class and :interface: See |vim9-classes
+ - Change access: public by default, private by prefixing "_".
+ Check for error: can't have same name twice (ignoring "_" prefix).
+ - Private methods?
+ either: private def Func()
+ or: def _Func()
+ Perhaps use "private" keyword instead of "_" prefix?
+ - "final" object members - can only be set in the constructor.
+ - object empty(), len() - can class define a method to be used for them?
+ - how about lock/unlock?
+ - When checking "implements" also check types of members and function args.
+ - For chaining, allow using the class name as type for function return
+ value.
+ - Implement generics
+ - Add "instanceof"
+ - More efficient way for interface member index than iterating over list?
+ - a variant of type() that returns a different type for each class?
+ list<number> and list<string> should also differ.
+ - Issue #11822: any.Func() can be a dict or an object call, need to handle
+ this at runtime.
- implement :type
- implement :enum
+- class local to a function
- Use Vim9 for more runtime files.
- Inline call to map() and filter(), better type checking.
- When evaluating constants for script variables, some functions could work:
@@ -72,16 +90,19 @@
- Implement as part of an expression: ++expr, --expr, expr++, expr--.
Information missing in terminfo:
-Priority:
- t_RV request terminal version string; xterm: "\033[>c"
- change in terminfo for "RV" uses the wrong escape sequence... ?
-Mouse support:
- on/off: hard coded in mch_setmouse() - use "XM" terminfo/termcap entry;
- If it starts with "\E[?1006;1000%" then set 'ttymouse' to "sgr".
+ change in terminfo for "RV" uses the wrong escape sequence 7 - 14 Jan only
Codes used for focus gained and lost (currently using use_xterm_like_mouse())
termcodes are hard-coded in set_termname(), not named.
+ Use the XF flag? enables recognizing the focus in/out events.
+ Check if t_fe is not empty.
+ Check for "1004" in t_XM. (disadvantage: only focus events when mouse is
+ used)
- t_fe enable focus-event tracking
- t_fd disable focus-event tracking
+Modifiers for various keys
+- Decode kitty key protocol Meta and use MOD_MASK_META. Document <T-k>
+- flag to indicate "xterm compatible modifiers" ?
Underline and similar:
- t_AU - Set underline color: like "AF" and "AB" entries.
- t_Ce undercurl and underline end
@@ -124,6 +145,8 @@
- t_RK request terminal keyboard protocol state; sent after |t_TI|
Already working, not properly documented:
- t_u7 request cursor position
+Also, with Alt-b we get â, with Alt-Shift-b we should bet another character.
+That does not appear to work with Kitty. #11913
Popup windows:
- Add a function to redraw a specific popup window. Esp. to be used when
diff --git a/runtime/doc/usr_41.txt b/runtime/doc/usr_41.txt
index 7a706af..4e0cc48 100644
--- a/runtime/doc/usr_41.txt
+++ b/runtime/doc/usr_41.txt
@@ -1,4 +1,4 @@
-*usr_41.txt* For Vim version 9.0. Last change: 2022 Dec 20
+*usr_41.txt* For Vim version 9.0. Last change: 2023 Jan 17
VIM USER MANUAL - by Bram Moolenaar
diff --git a/runtime/doc/vim9.txt b/runtime/doc/vim9.txt
index e13feee..eb26982 100644
--- a/runtime/doc/vim9.txt
+++ b/runtime/doc/vim9.txt
@@ -105,7 +105,7 @@
`:open`
`:s` with only flags
`:t`
- `:xit`
+ `:xit`
- Some commands, especially those used for flow control, cannot be shortened.
E.g., `:throw` cannot be written as `:th`. *vim9-no-shorten*
- You cannot use curly-braces names.
@@ -265,7 +265,7 @@
function with a generated name.
It is not possible to define a script-local function in a function. You can
-define a local function and assign it to a script-local funcref (it must have
+define a local function and assign it to a script-local Funcref (it must have
been declared at the script level). It is possible to define a global
function by using the "g:" prefix.
@@ -388,7 +388,6 @@
echo temp # Error!
This is especially useful in a user command: >
-
command -range Rename {
var save = @a
@a = 'some expression'
@@ -397,7 +396,6 @@
}
And with autocommands: >
-
au BufWritePre *.go {
var save = winsaveview()
silent! exe ':%! some formatting command'
@@ -746,7 +744,7 @@
*E1050*
To make it possible for the operator at the start of the line to be
recognized, it is required to put a colon before a range. This example will
-add "start" and print: >
+add "start" and "print": >
var result = start
+ print
Like this: >
@@ -805,7 +803,7 @@
echo [1, 2]
[3, 4]
- In some cases it is difficult for Vim to parse a command, especially when
- commands are used as an argument to another command, such as `windo`. In
+ commands are used as an argument to another command, such as `:windo`. In
those cases the line continuation with a backslash has to be used.
@@ -1311,7 +1309,7 @@
< *E1271*
A closure must be compiled in the context that it is defined in, so that
variables in that context can be found. This mostly happens correctly, except
-when a function is marked for debugging with `breakadd` after it was compiled.
+when a function is marked for debugging with `:breakadd` after it was compiled.
Make sure to define the breakpoint before compiling the outer function.
The "inloop" variable will exist only once, all closures put in the list refer
@@ -1353,7 +1351,7 @@
}
endfor
-Using `echowindow` is useful in a timer, the messages go into a popup and will
+Using `:echowindow` is useful in a timer, the messages go into a popup and will
not interfere with what the user is doing when it triggers.
@@ -1594,7 +1592,7 @@
equivalent to: >
var ll: list<number> = [1, 2, 3]
If you do want a more permissive list you need to declare the type: >
- var ll: list<any = [1, 2, 3]
+ var ll: list<any> = [1, 2, 3]
ll->extend(['x']) # OK
diff --git a/runtime/doc/vim9class.txt b/runtime/doc/vim9class.txt
index 135b309..250e675 100644
--- a/runtime/doc/vim9class.txt
+++ b/runtime/doc/vim9class.txt
@@ -1,21 +1,22 @@
-*vim9class.txt* For Vim version 9.0. Last change: 2023 Jan 09
+*vim9class.txt* For Vim version 9.0. Last change: 2023 Jan 17
VIM REFERENCE MANUAL by Bram Moolenaar
-NOTE - This is under development, anything can still change! - NOTE
+NOTE - This is not finished yet, anything can still change! - NOTE
Vim9 classes, objects, interfaces, types and enums.
1. Overview |Vim9-class-overview|
2. A simple class |Vim9-simple-class|
-3. Using an abstract class |Vim9-abstract-class|
-4. Using an interface |Vim9-using-interface|
-5. More class details |Vim9-class|
-6. Type definition |Vim9-type|
-7. Enum |Vim9-enum|
+3. Class members and functions |Vim9-class-member|
+4. Using an abstract class |Vim9-abstract-class|
+5. Using an interface |Vim9-using-interface|
+6. More class details |Vim9-class|
+7. Type definition |Vim9-type|
+8. Enum |Vim9-enum|
9. Rationale
10. To be done later
@@ -25,25 +26,25 @@
1. Overview *Vim9-class-overview*
The fancy term is "object-oriented programming". You can find lots of study
-material about this subject. Here we document what |Vim9| script provides,
-assuming you know the basics already. Added are helpful hints about how
-to use this functionality effectively.
+material on this subject. Here we document what |Vim9| script provides,
+assuming you know the basics already. Added are helpful hints about how to
+use this functionality effectively.
The basic item is an object:
- An object stores state. It contains one or more variables that can each
have a value.
-- An object usually provides functions that manipulate its state. These
+- An object provides functions that use and manipulate its state. These
functions are invoked "on the object", which is what sets it apart from the
traditional separation of data and code that manipulates the data.
- An object has a well defined interface, with typed member variables and
member functions.
-- Objects are created by a class and all objects have the same interface.
- This never changes, it is not dynamic.
+- Objects are created from a class and all objects have the same interface.
+ This does not change at runtime, it is not dynamic.
An object can only be created by a class. A class provides:
- A new() method, the constructor, which returns an object for the class.
This method is invoked on the class name: MyClass.new().
-- State shared by all objects of the class: class variables and constants.
+- State shared by all objects of the class: class variables (class members).
- A hierarchy of classes, with super-classes and sub-classes, inheritance.
An interface is used to specify properties of an object:
@@ -62,17 +63,18 @@
your model should therefore reflect the real world. It doesn't! The model
should match your purpose.
-You will soon find that composition is often better than inheritance. Don't
-waste time trying to find the optimal class model. Or waste time discussing
-whether a square is a rectangle or that a rectangle is a square. It doesn't
-matter.
+Keep in mind that composition (an object contains other objects) is often
+better than inheritance (an object extends another object). Don't waste time
+trying to find the optimal class model. Or waste time discussing whether a
+square is a rectangle or that a rectangle is a square. It doesn't matter.
==============================================================================
2. A simple class *Vim9-simple-class*
-Let's start with a simple example: a class that stores a text position: >
+Let's start with a simple example: a class that stores a text position (see
+below for how to do this more efficiently): >
class TextPosition
this.lnum: number
@@ -107,7 +109,7 @@
< *E1317* *E1327*
If you have been using other object-oriented languages you will notice that
in Vim the object members are consistently referred to with the "this."
-prefix. This is different from languages like Java and TypeScript. This
+prefix. This is different from languages like Java and TypeScript. The
naming convention makes the object members easy to spot. Also, when a
variable does not have the "this." prefix you know it is not an object member.
@@ -117,9 +119,9 @@
Now try to change an object member directly: >
pos.lnum = 9
-< *E1335*
+< *E1335*
This will give you an error! That is because by default object members can be
-read but not set. That's why the class provides a method for it: >
+read but not set. That's why the TextPosition class provides a method for it: >
pos.SetLnum(9)
@@ -128,12 +130,12 @@
have side effects that need to be taken care of. In this case, the SetLnum()
method could check if the line number is valid and either give an error or use
the closest valid value.
- *:public* *E1331*
+ *:public* *E1331*
If you don't care about side effects and want to allow the object member to be
changed at any time, you can make it public: >
public this.lnum: number
- public this.col number
+ public this.col: number
Now you don't need the SetLnum(), SetCol() and SetPosition() methods, setting
"pos.lnum" directly above will no longer give an error.
@@ -153,7 +155,7 @@
this._col number
Now you need to provide methods to get the value of the private members.
-These are commonly call getters. We recommend using a name that starts with
+These are commonly called getters. We recommend using a name that starts with
"Get": >
def GetLnum(): number
@@ -181,6 +183,7 @@
Many constructors take values for the object members. Thus you very often see
this pattern: >
+ class SomeClass
this.lnum: number
this.col: number
@@ -188,6 +191,7 @@
this.lnum = lnum
this.col = col
enddef
+ endclass
Not only is this text you need to write, it also has the type of each member
twice. Since this is so common a shorter way to write new() is provided: >
@@ -197,8 +201,24 @@
The semantics are easy to understand: Providing the object member name,
including "this.", as the argument to new() means the value provided in the
-new() call is assigned to that object member. This mechanism is coming from
-the Dart language.
+new() call is assigned to that object member. This mechanism comes from the
+Dart language.
+
+Putting together this way of using new() and making the members public results
+in a much shorter class definition as what we started with: >
+
+ class TextPosition
+ public this.lnum: number
+ public this.col: number
+
+ def new(this.lnum, this.col)
+ enddef
+
+ def SetPosition(lnum: number, col: number)
+ this.lnum = lnum
+ this.col = col
+ enddef
+ endclass
The sequence of constructing a new object is:
1. Memory is allocated and cleared. All values are zero/false/empty.
@@ -208,22 +228,69 @@
3. Arguments in the new() method in the "this.name" form are assigned.
4. The body of the new() method is executed.
-TODO: for a sub-class the constructor of the parent class will be invoked
-somewhere.
-
+If the class extends a parent class, the same thing happens. In the second
+step the members of the parent class are done first. There is no need to call
+"super()" or "new()" on the parent.
==============================================================================
-3. Using an abstract class *Vim9-abstract-class*
+3. class members and functions *Vim9-class-member*
+
+ *:static* *E1337* *E1338*
+Class members are declared with "static". They are used by the name without a
+prefix: >
+
+ class OtherThing
+ this.size: number
+ static totalSize: number
+
+ def new(this.size)
+ totalSize += this.size
+ enddef
+ endclass
+< *E1340* *E1341*
+Since the name is used as-is, shadowing the name by a function argument name
+or local variable name is not allowed.
+
+Just like object members the access can be made private by using an underscore
+as the first character in the name, and it can be made public by prefixing
+"public": >
+
+ class OtherThing
+ static total: number # anybody can read, only class can write
+ static _sum: number # only class can read and write
+ public static result: number # anybody can read and write
+ endclass
+<
+ *class-function*
+Class functions are also declared with "static". They have no access to
+object members, they cannot use the "this" keyword. >
+
+ class OtherThing
+ this.size: number
+ static totalSize: number
+
+ # Clear the total size and return the value it had before.
+ static def ClearTotalSize(): number
+ var prev = totalSize
+ totalSize = 0
+ return prev
+ enddef
+ endclass
+
+Inside the class the function can be called by name directly, outside the
+class the class name must be prefixed: `OtherThing.ClearTotalSize()`.
+
+==============================================================================
+
+4. Using an abstract class *Vim9-abstract-class*
An abstract class forms the base for at least one sub-class. In the class
model one often finds that a few classes have the same properties that can be
-shared, but a class with those properties does not have enough state to create
+shared, but a class with these properties does not have enough state to create
an object from. A sub-class must extend the abstract class and add the
missing state and/or methods before it can be used to create objects for.
-An abstract class does not have a new() method.
-
For example, a Shape class could store a color and thickness. You cannot
create a Shape object, it is missing the information about what kind of shape
it is. The Shape class functions as the base for a Square and a Triangle
@@ -249,51 +316,13 @@
enddef
endclass
<
- *class-member* *:static* *E1337* *E1338*
-Class members are declared with "static". They are used by the name without a
-prefix: >
-
- class OtherThing
- this.size: number
- static totalSize: number
-
- def new(this.size)
- totalSize += this.size
- enddef
- endclass
-< *E1340* *E1341*
-Since the name is used as-is, shadowing the name by a function argument name
-or variable name is not allowed.
-
-Just like object members the access can be made private by using an underscore
-as the first character in the name, and it can be made public by prefixing
-"public": >
- class OtherThing
- static total: number # anybody can read, only class can write
- static _sum: number # only class can read and write
- public static result: number # anybody can read and write
- endclass
-<
- *class-function*
-Class functions are also declared with "static". They have no access to
-object members, they cannot use the "this" keyword. >
-
- class OtherThing
- this.size: number
- static totalSize: number
-
- " Clear the total size and return the value it had before.
- static def ClearTotalSize(): number
- var prev = totalSize
- totalSize = 0
- return prev
- enddef
- endclass
+An abstract class is defined the same way as a normal class, except that it
+does not have any new() method. *E1359*
==============================================================================
-4. Using an interface *Vim9-using-interface*
+5. Using an interface *Vim9-using-interface*
The example above with Shape, Square and Triangle can be made more useful if
we add a method to compute the surface of the object. For that we create the
@@ -348,7 +377,7 @@
==============================================================================
-5. More class details *Vim9-class* *Class* *class*
+6. More class details *Vim9-class* *Class* *class*
Defining a class ~
*:class* *:endclass* *:abstract*
@@ -386,12 +415,52 @@
extends ClassName
implements InterfaceName, OtherInterface
specifies SomeInterface
-< *extends*
+< *E1355*
+Each member and function name can be used only once. It is not possible to
+define a function with the same name and different type of arguments.
+
+
+Extending a class ~
+ *extends*
A class can extend one other class. *E1352* *E1353* *E1354*
+The basic idea is to build on top of an existing class, add properties to it.
+
+The extended class is called the "base class" or "super class". The new class
+is called the "child class".
+
+Object members from the base class are all taken over by the child class. It
+is not possible to override them (unlike some other languages).
+
+ *E1356* *E1357* *E1358*
+Object methods of the base class can be overruled. The signature (arguments,
+argument types and return type) must be exactly the same. The method of the
+base class can be called by prefixing "super.".
+
+Other object methods of the base class are taken over by the child class.
+
+Class functions, including functions starting with "new", can be overruled,
+like with object methods. The function on the base class can be called by
+prefixing the name of the class (for class functions) or "super.".
+
+Unlike other languages, the constructor of the base class does not need to be
+invoked. In fact, it cannot be invoked. If some initialization from the base
+class also needs to be done in a child class, put it in an object method and
+call that method from every constructor().
+
+If the base class did not specify a new() function then one was automatically
+created. This function will not be taken over by the child class. The child
+class can define its own new() function, or, if there isn't one, a new()
+function will be added automatically.
+
+
+A class implementing an interface ~
*implements* *E1346* *E1347*
A class can implement one or more interfaces. The "implements" keyword can
only appear once *E1350* . Multiple interfaces can be specified, separated by
commas. Each interface name can appear only once. *E1351*
+
+
+A class defining an interface ~
*specifies*
A class can declare its interface, the object members and methods, with a
named interface. This avoids the need for separately specifying the
@@ -528,7 +597,7 @@
==============================================================================
-6. Type definition *Vim9-type* *:type*
+7. Type definition *Vim9-type* *:type*
A type definition is giving a name to a type specification. For Example: >
@@ -539,7 +608,7 @@
==============================================================================
-7. Enum *Vim9-enum* *:enum* *:endenum*
+8. Enum *Vim9-enum* *:enum* *:endenum*
An enum is a type that can have one of a list of values. Example: >
@@ -639,7 +708,7 @@
some cases, it makes the rules of how a class works quite complicated.
Instead, using interfaces to declare what is supported is much simpler. The
very popular Java language does it this way, and it should be good enough for
-Vim. The "keep it simple" rule applies here.
+Vim. The "keep it simple" rule applies here.
Explicitly declaring that a class supports an interface makes it easy to see
what a class is intended for. It also makes it possible to do proper type