vim-patch:7.4.2213: runtime parts with EndOfBuffer port #10635

Problem:    Cannot highlight the "~" lines at the end of a window differently.
Solution:   Add the EndOfBuffer highlighting. (Marco Hinz, James McCoy)
58b853460a

Includes minor doc parts from 7.4.1304 for runtime/doc/eval.txt.
This commit is contained in:
Daniel Hahler 2019-07-28 13:27:03 +02:00 committed by Justin M. Keyes
parent 48884ac3b3
commit 10fd5ae277

View File

@ -95,7 +95,7 @@ A List, Dictionary or Float is not a Number or String, thus evaluate to FALSE.
List, Dictionary and Funcref types are not automatically converted. List, Dictionary and Funcref types are not automatically converted.
*E805* *E806* *E808* *E805* *E806* *E808*
When mixing Number and Float the Number is converted to Float. Otherwise When mixing Number and Float the Number is converted to Float. Otherwise
there is no automatic conversion of Float. You can use str2float() for String there is no automatic conversion of Float. You can use str2float() for String
to Float, printf() for Float to String and float2nr() for Float to Number. to Float, printf() for Float to String and float2nr() for Float to Number.
@ -104,13 +104,14 @@ When expecting a Float a Number can also be used, but nothing else.
*no-type-checking* *no-type-checking*
You will not get an error if you try to change the type of a variable. You will not get an error if you try to change the type of a variable.
1.2 Function references ~ 1.2 Function references ~
*Funcref* *E695* *E718* *Funcref* *E695* *E718*
A Funcref variable is obtained with the |function()| function or created with A Funcref variable is obtained with the |function()| function, the |funcref()|
the lambda expression |expr-lambda|. It can be used in an expression in the function or created with the lambda expression |expr-lambda|. It can be used
place of a function name, before the parenthesis around the arguments, to in an expression in the place of a function name, before the parenthesis
invoke the function it refers to. Example: > around the arguments, to invoke the function it refers to. Example: >
:let Fn = function("MyFunc") :let Fn = function("MyFunc")
:echo Fn() :echo Fn()
@ -142,8 +143,8 @@ arguments: >
*Partial* *Partial*
A Funcref optionally binds a Dictionary and/or arguments. This is also called A Funcref optionally binds a Dictionary and/or arguments. This is also called
a Partial. This is created by passing the Dictionary and/or arguments to a Partial. This is created by passing the Dictionary and/or arguments to
function(). When calling the function the Dictionary and/or arguments will be function() or funcref(). When calling the function the Dictionary and/or
passed to the function. Example: > arguments will be passed to the function. Example: >
let Cb = function('Callback', ['foo'], myDict) let Cb = function('Callback', ['foo'], myDict)
call Cb() call Cb()
@ -177,7 +178,7 @@ Here "self" will be "myDict", because it was bound explicitly.
1.3 Lists ~ 1.3 Lists ~
*list* *List* *Lists* *E686* *list* *List* *Lists* *E686*
A List is an ordered sequence of items. An item can be of any type. Items A List is an ordered sequence of items. An item can be of any type. Items
can be accessed by their index number. Items can be added and removed at any can be accessed by their index number. Items can be added and removed at any
position in the sequence. position in the sequence.
@ -188,7 +189,7 @@ Examples: >
:let mylist = [1, two, 3, "four"] :let mylist = [1, two, 3, "four"]
:let emptylist = [] :let emptylist = []
An item can be any expression. Using a List for an item creates a An item can be any expression. Using a List for an item creates a
List of Lists: > List of Lists: >
:let nestlist = [[11, 12], [21, 22], [31, 32]] :let nestlist = [[11, 12], [21, 22], [31, 32]]
@ -247,7 +248,7 @@ length minus one is used: >
:echo mylist[2:8] " result: [2, 3] :echo mylist[2:8] " result: [2, 3]
NOTE: mylist[s:e] means using the variable "s:e" as index. Watch out for NOTE: mylist[s:e] means using the variable "s:e" as index. Watch out for
using a single letter variable before the ":". Insert a space when needed: using a single letter variable before the ":". Insert a space when needed:
mylist[s : e]. mylist[s : e].
@ -376,7 +377,7 @@ This works like: >
If all you want to do is modify each item in the list then the |map()| If all you want to do is modify each item in the list then the |map()|
function will be a simpler method than a for loop. function will be a simpler method than a for loop.
Just like the |:let| command, |:for| also accepts a list of variables. This Just like the |:let| command, |:for| also accepts a list of variables. This
requires the argument to be a list of lists. > requires the argument to be a list of lists. >
:for [lnum, col] in [[1, 3], [2, 8], [3, 0]] :for [lnum, col] in [[1, 3], [2, 8], [3, 0]]
: call Doit(lnum, col) : call Doit(lnum, col)
@ -433,11 +434,11 @@ only appear once. Examples: >
< *E713* *E716* *E717* < *E713* *E716* *E717*
A key is always a String. You can use a Number, it will be converted to a A key is always a String. You can use a Number, it will be converted to a
String automatically. Thus the String '4' and the number 4 will find the same String automatically. Thus the String '4' and the number 4 will find the same
entry. Note that the String '04' and the Number 04 are different, since the entry. Note that the String '04' and the Number 04 are different, since the
Number will be converted to the String '4'. The empty string can be used as a Number will be converted to the String '4'. The empty string can be used as a
key. key.
A value can be any expression. Using a Dictionary for a value creates a A value can be any expression. Using a Dictionary for a value creates a
nested Dictionary: > nested Dictionary: >
:let nestdict = {1: {11: 'a', 12: 'b'}, 2: {21: 'c'}} :let nestdict = {1: {11: 'a', 12: 'b'}, 2: {21: 'c'}}
@ -464,7 +465,7 @@ key lookup can be repeated: >
Dictionary to List conversion ~ Dictionary to List conversion ~
You may want to loop over the entries in a dictionary. For this you need to You may want to loop over the entries in a dictionary. For this you need to
turn the Dictionary into a List and pass it to |:for|. turn the Dictionary into a List and pass it to |:for|.
Most often you want to loop over the keys, using the |keys()| function: > Most often you want to loop over the keys, using the |keys()| function: >
@ -531,7 +532,7 @@ This removes all entries from "dict" with a value not matching 'x'.
Dictionary function ~ Dictionary function ~
*Dictionary-function* *self* *E725* *E862* *Dictionary-function* *self* *E725* *E862*
When a function is defined with the "dict" attribute it can be used in a When a function is defined with the "dict" attribute it can be used in a
special way with a dictionary. Example: > special way with a dictionary. Example: >
:function Mylen() dict :function Mylen() dict
: return len(self.data) : return len(self.data)
:endfunction :endfunction
@ -555,7 +556,7 @@ assigned to a Dictionary in this way: >
:echo mydict.len() :echo mydict.len()
The function will then get a number and the value of dict.len is a |Funcref| The function will then get a number and the value of dict.len is a |Funcref|
that references this function. The function can only be used through a that references this function. The function can only be used through a
|Funcref|. It will automatically be deleted when there is no |Funcref| |Funcref|. It will automatically be deleted when there is no |Funcref|
remaining that refers to it. remaining that refers to it.
@ -815,10 +816,10 @@ values are different: >
"is#"/"isnot#" and "is?"/"isnot?" can be used to match and ignore case. "is#"/"isnot#" and "is?"/"isnot?" can be used to match and ignore case.
When comparing a String with a Number, the String is converted to a Number, When comparing a String with a Number, the String is converted to a Number,
and the comparison is done on Numbers. This means that: > and the comparison is done on Numbers. This means that: >
echo 0 == 'x' echo 0 == 'x'
1 1
because 'x' converted to a Number is zero. However: > because 'x' converted to a Number is zero. However: >
echo [0] == ['x'] echo [0] == ['x']
0 0
Inside a List or Dictionary this conversion is not used. Inside a List or Dictionary this conversion is not used.
@ -914,7 +915,7 @@ For '+' the number is unchanged.
A String will be converted to a Number first. A String will be converted to a Number first.
These three can be repeated and mixed. Examples: These three can be repeated and mixed. Examples:
!-1 == 0 !-1 == 0
!!8 == 1 !!8 == 1
--9 == 9 --9 == 9
@ -948,7 +949,7 @@ compatibility). Use [-1:] to get the last byte.
If expr8 is a |List| then it results the item at index expr1. See |list-index| If expr8 is a |List| then it results the item at index expr1. See |list-index|
for possible index values. If the index is out of range this results in an for possible index values. If the index is out of range this results in an
error. Example: > error. Example: >
:let item = mylist[-1] " get last item :let item = mylist[-1] " get last item
Generally, if a |List| index is equal to or higher than the length of the Generally, if a |List| index is equal to or higher than the length of the
@ -980,7 +981,7 @@ Examples: >
< <
*slice* *slice*
If expr8 is a |List| this results in a new |List| with the items indicated by If expr8 is a |List| this results in a new |List| with the items indicated by
the indexes expr1a and expr1b. This works like with a String, as explained the indexes expr1a and expr1b. This works like with a String, as explained
just above. Also see |sublist| below. Examples: > just above. Also see |sublist| below. Examples: >
:let l = mylist[:3] " first four items :let l = mylist[:3] " first four items
:let l = mylist[4:4] " List with one item :let l = mylist[4:4] " List with one item
@ -1040,7 +1041,7 @@ Floating point numbers can be written in two forms:
contain digits. contain digits.
[-+] means there is an optional plus or minus sign. [-+] means there is an optional plus or minus sign.
{exp} is the exponent, power of 10. {exp} is the exponent, power of 10.
Only a decimal point is accepted, not a comma. No matter what the current Only a decimal point is accepted, not a comma. No matter what the current
locale is. locale is.
Examples: Examples:
@ -1129,11 +1130,11 @@ literal-string *literal-string* *E115*
Note that single quotes are used. Note that single quotes are used.
This string is taken as it is. No backslashes are removed or have a special This string is taken as it is. No backslashes are removed or have a special
meaning. The only exception is that two quotes stand for one quote. meaning. The only exception is that two quotes stand for one quote.
Single quoted strings are useful for patterns, so that backslashes do not need Single quoted strings are useful for patterns, so that backslashes do not need
to be doubled. These two commands are equivalent: > to be doubled. These two commands are equivalent: >
if a =~ "\\s*" if a =~ "\\s*"
if a =~ '\s*' if a =~ '\s*'
@ -1159,7 +1160,7 @@ register *expr-register* *@r*
The result is the contents of the named register, as a single string. The result is the contents of the named register, as a single string.
Newlines are inserted where required. To get the contents of the unnamed Newlines are inserted where required. To get the contents of the unnamed
register use @" or @@. See |registers| for an explanation of the available register use @" or @@. See |registers| for an explanation of the available
registers. registers.
When using the '=' register you get the expression itself, not what it When using the '=' register you get the expression itself, not what it
@ -1321,7 +1322,7 @@ It is deleted when the tab page is closed.
*global-variable* *g:var* *g:* *global-variable* *g:var* *g:*
Inside functions global variables are accessed with "g:". Omitting this will Inside functions global variables are accessed with "g:". Omitting this will
access a variable local to a function. But "g:" can also be used in any other access a variable local to a function. But "g:" can also be used in any other
place if you like. place if you like.
*local-variable* *l:var* *l:* *local-variable* *l:var* *l:*
@ -1463,7 +1464,7 @@ v:cmdarg This variable is used for two purposes:
set before an autocommand event for a file read/write set before an autocommand event for a file read/write
command is triggered. There is a leading space to make it command is triggered. There is a leading space to make it
possible to append this variable directly after the possible to append this variable directly after the
read/write command. Note: The "+cmd" argument isn't read/write command. Note: The "+cmd" argument isn't
included here, because it will be executed anyway. included here, because it will be executed anyway.
2. When printing a PostScript file with ":hardcopy" this is 2. When printing a PostScript file with ":hardcopy" this is
the argument for the ":hardcopy" command. This can be used the argument for the ":hardcopy" command. This can be used
@ -1483,7 +1484,7 @@ v:completed_item
*v:count* *count-variable* *v:count* *count-variable*
v:count The count given for the last Normal mode command. Can be used v:count The count given for the last Normal mode command. Can be used
to get the count before a mapping. Read-only. Example: > to get the count before a mapping. Read-only. Example: >
:map _x :<C-U>echo "the count is " . v:count<CR> :map _x :<C-U>echo "the count is " . v:count<CR>
< Note: The <C-U> is required to remove the line range that you < Note: The <C-U> is required to remove the line range that you
get when typing ':' after a count. get when typing ':' after a count.
@ -1505,7 +1506,7 @@ v:ctype The current locale setting for characters of the runtime
See |multi-lang|. See |multi-lang|.
*v:dying* *dying-variable* *v:dying* *dying-variable*
v:dying Normally zero. When a deadly signal is caught it's set to v:dying Normally zero. When a deadly signal is caught it's set to
one. When multiple signals are caught the number increases. one. When multiple signals are caught the number increases.
Can be used in an autocommand to check if Vim didn't Can be used in an autocommand to check if Vim didn't
terminate normally. {only works on Unix} terminate normally. {only works on Unix}
@ -1638,7 +1639,7 @@ v:fname_out The name of the output file. Only valid while
'diffexpr' output of diff 'diffexpr' output of diff
'patchexpr' resulting patched file 'patchexpr' resulting patched file
(*) When doing conversion for a write command (e.g., ":w (*) When doing conversion for a write command (e.g., ":w
file") it will be equal to v:fname_in. When doing conversion file") it will be equal to v:fname_in. When doing conversion
for a read command (e.g., ":e file") it will be a temporary for a read command (e.g., ":e file") it will be a temporary
file and different from v:fname_in. file and different from v:fname_in.
@ -1787,7 +1788,7 @@ v:prevcount The count given for the last but one Normal mode command.
< Read-only. < Read-only.
*v:profiling* *profiling-variable* *v:profiling* *profiling-variable*
v:profiling Normally zero. Set to one after using ":profile start". v:profiling Normally zero. Set to one after using ":profile start".
See |profiling|. See |profiling|.
*v:progname* *progname-variable* *v:progname* *progname-variable*
@ -1867,14 +1868,14 @@ v:swapchoice |SwapExists| autocommands can set this to the selected choice
'd' Delete swapfile 'd' Delete swapfile
'q' Quit 'q' Quit
'a' Abort 'a' Abort
The value should be a single-character string. An empty value The value should be a single-character string. An empty value
results in the user being asked, as would happen when there is results in the user being asked, as would happen when there is
no SwapExists autocommand. The default is empty. no SwapExists autocommand. The default is empty.
*v:swapcommand* *swapcommand-variable* *v:swapcommand* *swapcommand-variable*
v:swapcommand Normal mode command to be executed after a file has been v:swapcommand Normal mode command to be executed after a file has been
opened. Can be used for a |SwapExists| autocommand to have opened. Can be used for a |SwapExists| autocommand to have
another Vim open the file and jump to the right place. For another Vim open the file and jump to the right place. For
example, when jumping to a tag the value is ":tag tagname\r". example, when jumping to a tag the value is ":tag tagname\r".
For ":edit +cmd file" the value is ":cmd\r". For ":edit +cmd file" the value is ":cmd\r".
@ -1917,7 +1918,7 @@ v:this_session Full filename of the last loaded or saved session file.
*v:throwpoint* *throwpoint-variable* *v:throwpoint* *throwpoint-variable*
v:throwpoint The point where the exception most recently caught and not v:throwpoint The point where the exception most recently caught and not
finished was thrown. Not set when commands are typed. See finished was thrown. Not set when commands are typed. See
also |v:exception| and |throw-variables|. also |v:exception| and |throw-variables|.
Example: > Example: >
:try :try
@ -1935,7 +1936,7 @@ v:true Special value used to put "true" in JSON and msgpack. See
|expr7| when used with numeric operators). Read-only. |expr7| when used with numeric operators). Read-only.
*v:val* *val-variable* *v:val* *val-variable*
v:val Value of the current item of a |List| or |Dictionary|. Only v:val Value of the current item of a |List| or |Dictionary|. Only
valid while evaluating the expression used with |map()| and valid while evaluating the expression used with |map()| and
|filter()|. Read-only. |filter()|. Read-only.
@ -2476,7 +2477,7 @@ append({lnum}, {text}) *append()*
the current buffer. the current buffer.
{lnum} can be zero to insert a line before the first one. {lnum} can be zero to insert a line before the first one.
Returns 1 for failure ({lnum} out of range or out of memory), Returns 1 for failure ({lnum} out of range or out of memory),
0 for success. Example: > 0 for success. Example: >
:let failed = append(line('$'), "# THE END") :let failed = append(line('$'), "# THE END")
:let failed = append(0, ["Chapter 1", "the beginning"]) :let failed = append(0, ["Chapter 1", "the beginning"])
< <
@ -2734,7 +2735,7 @@ bufname({expr}) *bufname()*
If {expr} is a Number, that buffer number's name is given. If {expr} is a Number, that buffer number's name is given.
Number zero is the alternate buffer for the current window. Number zero is the alternate buffer for the current window.
If {expr} is a String, it is used as a |file-pattern| to match If {expr} is a String, it is used as a |file-pattern| to match
with the buffer names. This is always done like 'magic' is with the buffer names. This is always done like 'magic' is
set and 'cpoptions' is empty. When there is more than one set and 'cpoptions' is empty. When there is more than one
match an empty string is returned. match an empty string is returned.
"" or "%" can be used for the current buffer, "#" for the "" or "%" can be used for the current buffer, "#" for the
@ -2784,7 +2785,7 @@ bufwinid({expr}) *bufwinid()*
bufwinnr({expr}) *bufwinnr()* bufwinnr({expr}) *bufwinnr()*
The result is a Number, which is the number of the first The result is a Number, which is the number of the first
window associated with buffer {expr}. For the use of {expr}, window associated with buffer {expr}. For the use of {expr},
see |bufname()| above. If buffer {expr} doesn't exist or see |bufname()| above. If buffer {expr} doesn't exist or
there is no such window, -1 is returned. Example: > there is no such window, -1 is returned. Example: >
echo "A window containing buffer 1 is " . (bufwinnr(1)) echo "A window containing buffer 1 is " . (bufwinnr(1))
@ -2941,7 +2942,7 @@ col({expr}) The result is a Number, which is the byte index of the column
col("$") length of cursor line plus one col("$") length of cursor line plus one
col("'t") column of mark t col("'t") column of mark t
col("'" . markname) column of mark markname col("'" . markname) column of mark markname
< The first column is 1. 0 is returned for an error. < The first column is 1. 0 is returned for an error.
For an uppercase mark the column may actually be in another For an uppercase mark the column may actually be in another
buffer. buffer.
For the cursor position, when 'virtualedit' is active, the For the cursor position, when 'virtualedit' is active, the
@ -2988,7 +2989,7 @@ complete_add({expr}) *complete_add()*
Returns 0 for failure (empty string or out of memory), Returns 0 for failure (empty string or out of memory),
1 when the match was added, 2 when the match was already in 1 when the match was added, 2 when the match was already in
the list. the list.
See |complete-functions| for an explanation of {expr}. It is See |complete-functions| for an explanation of {expr}. It is
the same as one item in the list that 'omnifunc' would return. the same as one item in the list that 'omnifunc' would return.
complete_check() *complete_check()* complete_check() *complete_check()*
@ -3095,19 +3096,20 @@ confirm({msg} [, {choices} [, {default} [, {type}]]])
:endif :endif
< In a GUI dialog, buttons are used. The layout of the buttons < In a GUI dialog, buttons are used. The layout of the buttons
depends on the 'v' flag in 'guioptions'. If it is included, depends on the 'v' flag in 'guioptions'. If it is included,
the buttons are always put vertically. Otherwise, confirm() the buttons are always put vertically. Otherwise, confirm()
tries to put the buttons in one horizontal line. If they tries to put the buttons in one horizontal line. If they
don't fit, a vertical layout is used anyway. For some systems don't fit, a vertical layout is used anyway. For some systems
the horizontal layout is always used. the horizontal layout is always used.
*copy()* *copy()*
copy({expr}) Make a copy of {expr}. For Numbers and Strings this isn't copy({expr}) Make a copy of {expr}. For Numbers and Strings this isn't
different from using {expr} directly. different from using {expr} directly.
When {expr} is a |List| a shallow copy is created. This means When {expr} is a |List| a shallow copy is created. This means
that the original |List| can be changed without changing the that the original |List| can be changed without changing the
copy, and vice versa. But the items are identical, thus copy, and vice versa. But the items are identical, thus
changing an item changes the contents of both |Lists|. Also changing an item changes the contents of both |Lists|.
see |deepcopy()|. A |Dictionary| is copied in a similar way as a |List|.
Also see |deepcopy()|.
cos({expr}) *cos()* cos({expr}) *cos()*
Return the cosine of {expr}, measured in radians, as a |Float|. Return the cosine of {expr}, measured in radians, as a |Float|.
@ -3215,7 +3217,7 @@ cursor({list})
deepcopy({expr}[, {noref}]) *deepcopy()* *E698* deepcopy({expr}[, {noref}]) *deepcopy()* *E698*
Make a copy of {expr}. For Numbers and Strings this isn't Make a copy of {expr}. For Numbers and Strings this isn't
different from using {expr} directly. different from using {expr} directly.
When {expr} is a |List| a full copy is created. This means When {expr} is a |List| a full copy is created. This means
that the original |List| can be changed without changing the that the original |List| can be changed without changing the
@ -3372,10 +3374,10 @@ executable({expr}) *executable()*
searchpath for programs. *PATHEXT* searchpath for programs. *PATHEXT*
On Windows the ".exe", ".bat", etc. can On Windows the ".exe", ".bat", etc. can
optionally be included. Then the extensions in $PATHEXT are optionally be included. Then the extensions in $PATHEXT are
tried. Thus if "foo.exe" does not exist, "foo.exe.bat" can be tried. Thus if "foo.exe" does not exist, "foo.exe.bat" can be
found. If $PATHEXT is not set then ".exe;.com;.bat;.cmd" is found. If $PATHEXT is not set then ".exe;.com;.bat;.cmd" is
used. A dot by itself can be used in $PATHEXT to try using used. A dot by itself can be used in $PATHEXT to try using
the name without an extension. When 'shell' looks like a the name without an extension. When 'shell' looks like a
Unix shell, then the name is also tried without adding an Unix shell, then the name is also tried without adding an
extension. extension.
On Windows it only checks if the file exists and On Windows it only checks if the file exists and
@ -3438,7 +3440,7 @@ exists({expr}) The result is a Number, which is |TRUE| if {expr} is
|user-functions|). Also works for a |user-functions|). Also works for a
variable that is a Funcref. variable that is a Funcref.
varname internal variable (see varname internal variable (see
|internal-variables|). Also works |internal-variables|). Also works
for |curly-braces-names|, |Dictionary| for |curly-braces-names|, |Dictionary|
entries, |List| items, etc. Beware entries, |List| items, etc. Beware
that evaluating an index may cause an that evaluating an index may cause an
@ -3523,7 +3525,7 @@ expand({expr} [, {nosuf} [, {list}]]) *expand()*
Otherwise the result is a String and when there are several Otherwise the result is a String and when there are several
matches, they are separated by <NL> characters. matches, they are separated by <NL> characters.
If the expansion fails, the result is an empty string. A name If the expansion fails, the result is an empty string. A name
for a non-existing file is not included, unless {expr} does for a non-existing file is not included, unless {expr} does
not start with '%', '#' or '<', see below. not start with '%', '#' or '<', see below.
@ -3587,7 +3589,7 @@ expand({expr} [, {nosuf} [, {list}]]) *expand()*
slow, because a shell may be used to do the expansion. See slow, because a shell may be used to do the expansion. See
|expr-env-expand|. |expr-env-expand|.
The expanded variable is still handled like a list of file The expanded variable is still handled like a list of file
names. When an environment variable cannot be expanded, it is names. When an environment variable cannot be expanded, it is
left unchanged. Thus ":echo expand('$FOOBAR')" results in left unchanged. Thus ":echo expand('$FOOBAR')" results in
"$FOOBAR". "$FOOBAR".
@ -3610,7 +3612,7 @@ extend({expr1}, {expr2} [, {expr3}]) *extend()*
items copied is equal to the original length of the List. items copied is equal to the original length of the List.
E.g., when {expr3} is 1 you get N new copies of the first item E.g., when {expr3} is 1 you get N new copies of the first item
(where N is the original length of the List). (where N is the original length of the List).
Use |add()| to concatenate one item to a list. To concatenate Use |add()| to concatenate one item to a list. To concatenate
two lists into a new list use the + operator: > two lists into a new list use the + operator: >
:let newlist = [1, 2, 3] + [4, 5] :let newlist = [1, 2, 3] + [4, 5]
< <
@ -3810,7 +3812,7 @@ fmod({expr1}, {expr2}) *fmod()*
fnameescape({string}) *fnameescape()* fnameescape({string}) *fnameescape()*
Escape {string} for use as file name command argument. All Escape {string} for use as file name command argument. All
characters that have a special meaning, such as '%' and '|' characters that have a special meaning, such as '%' and '|'
are escaped with a backslash. are escaped with a backslash.
For most systems the characters escaped are For most systems the characters escaped are
@ -3847,7 +3849,7 @@ foldclosedend({lnum}) *foldclosedend()*
foldlevel({lnum}) *foldlevel()* foldlevel({lnum}) *foldlevel()*
The result is a Number, which is the foldlevel of line {lnum} The result is a Number, which is the foldlevel of line {lnum}
in the current buffer. For nested folds the deepest level is in the current buffer. For nested folds the deepest level is
returned. If there is no fold at line {lnum}, zero is returned. If there is no fold at line {lnum}, zero is
returned. It doesn't matter if the folds are open or closed. returned. It doesn't matter if the folds are open or closed.
When used while updating folds (from 'foldexpr') -1 is When used while updating folds (from 'foldexpr') -1 is
@ -3862,7 +3864,7 @@ foldtext() Returns a String, to be displayed for a closed fold. This is
|v:foldstart|, |v:foldend| and |v:folddashes| variables. |v:foldstart|, |v:foldend| and |v:folddashes| variables.
The returned string looks like this: > The returned string looks like this: >
+-- 45 lines: abcdef +-- 45 lines: abcdef
< The number of leading dashes depends on the foldlevel. The < The number of leading dashes depends on the foldlevel. The
"45" is the number of lines in the fold. "abcdef" is the text "45" is the number of lines in the fold. "abcdef" is the text
in the first non-blank line of the fold. Leading white space, in the first non-blank line of the fold. Leading white space,
"//" or "/*" and the text from the 'foldmarker' and "//" or "/*" and the text from the 'foldmarker' and
@ -3881,7 +3883,7 @@ foldtextresult({lnum}) *foldtextresult()*
Useful when exporting folded text, e.g., to HTML. Useful when exporting folded text, e.g., to HTML.
*foreground()* *foreground()*
foreground() Move the Vim window to the foreground. Useful when sent from foreground() Move the Vim window to the foreground. Useful when sent from
a client to a Vim server. |remote_send()| a client to a Vim server. |remote_send()|
On Win32 systems this might not work, the OS does not always On Win32 systems this might not work, the OS does not always
allow a window to bring itself to the foreground. Use allow a window to bring itself to the foreground. Use
@ -4183,7 +4185,7 @@ getcharmod() *getcharmod()*
96 mouse quadruple click (== 32 + 64) 96 mouse quadruple click (== 32 + 64)
128 command (Macintosh only) 128 command (Macintosh only)
Only the modifiers that have not been included in the Only the modifiers that have not been included in the
character itself are obtained. Thus Shift-a results in "A" character itself are obtained. Thus Shift-a results in "A"
without a modifier. without a modifier.
getcharsearch() *getcharsearch()* getcharsearch() *getcharsearch()*
@ -4707,7 +4709,7 @@ getwinposx() The result is a Number, which is the X coordinate in pixels of
*getwinposy()* *getwinposy()*
getwinposy() The result is a Number, which is the Y coordinate in pixels of getwinposy() The result is a Number, which is the Y coordinate in pixels of
the top of the GUI Vim window. The result will be -1 if the the top of the GUI Vim window. The result will be -1 if the
information is not available. information is not available.
The value can be used with `:winpos`. The value can be used with `:winpos`.
@ -4774,7 +4776,7 @@ glob({expr} [, {nosuf} [, {list} [, {alllinks}]]]) *glob()*
:let tagfiles = glob("`find . -name tags -print`") :let tagfiles = glob("`find . -name tags -print`")
:let &tags = substitute(tagfiles, "\n", ",", "g") :let &tags = substitute(tagfiles, "\n", ",", "g")
< The result of the program inside the backticks should be one < The result of the program inside the backticks should be one
item per line. Spaces inside an item are allowed. item per line. Spaces inside an item are allowed.
See |expand()| for expanding special Vim variables. See See |expand()| for expanding special Vim variables. See
|system()| for getting the raw output of an external command. |system()| for getting the raw output of an external command.
@ -4789,7 +4791,7 @@ glob2regpat({expr}) *glob2regpat()*
< When {expr} is an empty string the result is "^$", match an < When {expr} is an empty string the result is "^$", match an
empty string. empty string.
Note that the result depends on the system. On MS-Windows Note that the result depends on the system. On MS-Windows
a backslash usually means a patch separator. a backslash usually means a path separator.
*globpath()* *globpath()*
globpath({path}, {expr} [, {nosuf} [, {list} [, {allinks}]]]) globpath({path}, {expr} [, {nosuf} [, {list} [, {allinks}]]])
@ -4911,7 +4913,7 @@ hasmapto({what} [, {mode} [, {abbr}]]) *hasmapto()*
When {mode} is omitted, "nvo" is used. When {mode} is omitted, "nvo" is used.
This function is useful to check if a mapping already exists This function is useful to check if a mapping already exists
to a function in a Vim script. Example: > to a function in a Vim script. Example: >
:if !hasmapto('\ABCdoit') :if !hasmapto('\ABCdoit')
: map <Leader>d \ABCdoit : map <Leader>d \ABCdoit
:endif :endif
@ -5006,7 +5008,7 @@ hlID({name}) The result is a Number, which is the ID of the highlight group
with name {name}. When the highlight group doesn't exist, with name {name}. When the highlight group doesn't exist,
zero is returned. zero is returned.
This can be used to retrieve information about the highlight This can be used to retrieve information about the highlight
group. For example, to get the background color of the group. For example, to get the background color of the
"Comment" group: > "Comment" group: >
:echo synIDattr(synIDtrans(hlID("Comment")), "bg") :echo synIDattr(synIDtrans(hlID("Comment")), "bg")
@ -5076,7 +5078,7 @@ input({opts})
The highlighting set with |:echohl| is used for the prompt. The highlighting set with |:echohl| is used for the prompt.
The input is entered just like a command-line, with the same The input is entered just like a command-line, with the same
editing commands and mappings. There is a separate history editing commands and mappings. There is a separate history
for lines typed for input(). for lines typed for input().
Example: > Example: >
:if input("Coffee or beer? ") == "beer" :if input("Coffee or beer? ") == "beer"
@ -5090,9 +5092,9 @@ input({opts})
< The optional {completion} argument specifies the type of < The optional {completion} argument specifies the type of
completion supported for the input. Without it completion is completion supported for the input. Without it completion is
not performed. The supported completion types are the same as not performed. The supported completion types are the same as
that can be supplied to a user-defined command using the that can be supplied to a user-defined command using the
"-complete=" argument. Refer to |:command-completion| for "-complete=" argument. Refer to |:command-completion| for
more information. Example: > more information. Example: >
let fname = input("File: ", "", "file") let fname = input("File: ", "", "file")
@ -5172,12 +5174,12 @@ inputlist({textlist}) *inputlist()*
displayed, one string per line. The user will be prompted to displayed, one string per line. The user will be prompted to
enter a number, which is returned. enter a number, which is returned.
The user can also select an item by clicking on it with the The user can also select an item by clicking on it with the
mouse. For the first string 0 is returned. When clicking mouse. For the first string 0 is returned. When clicking
above the first item a negative number is returned. When above the first item a negative number is returned. When
clicking on the prompt one more than the length of {textlist} clicking on the prompt one more than the length of {textlist}
is returned. is returned.
Make sure {textlist} has less than 'lines' entries, otherwise Make sure {textlist} has less than 'lines' entries, otherwise
it won't work. It's a good idea to put the entry number at it won't work. It's a good idea to put the entry number at
the start of the string. And put a prompt in the first item. the start of the string. And put a prompt in the first item.
Example: > Example: >
let color = inputlist(['Select color:', '1. red', let color = inputlist(['Select color:', '1. red',
@ -5211,7 +5213,7 @@ inputsecret({prompt} [, {text}]) *inputsecret()*
insert({list}, {item} [, {idx}]) *insert()* insert({list}, {item} [, {idx}]) *insert()*
Insert {item} at the start of |List| {list}. Insert {item} at the start of |List| {list}.
If {idx} is specified insert {item} before the item with index If {idx} is specified insert {item} before the item with index
{idx}. If {idx} is zero it goes before the first item, just {idx}. If {idx} is zero it goes before the first item, just
like omitting {idx}. A negative {idx} is also possible, see like omitting {idx}. A negative {idx} is also possible, see
|list-index|. -1 inserts just before the last item. |list-index|. -1 inserts just before the last item.
Returns the resulting |List|. Examples: > Returns the resulting |List|. Examples: >
@ -5694,7 +5696,7 @@ match({expr}, {pat} [, {start} [, {count}]]) *match()*
first item where {pat} matches. Each item is used as a first item where {pat} matches. Each item is used as a
String, |Lists| and |Dictionaries| are used as echoed. String, |Lists| and |Dictionaries| are used as echoed.
Otherwise, {expr} is used as a String. The result is a Otherwise, {expr} is used as a String. The result is a
Number, which gives the index (byte offset) in {expr} where Number, which gives the index (byte offset) in {expr} where
{pat} matches. {pat} matches.
@ -5707,7 +5709,7 @@ match({expr}, {pat} [, {start} [, {count}]]) *match()*
:echo match([1, 'x'], '\a') " results in 1 :echo match([1, 'x'], '\a') " results in 1
< See |string-match| for how {pat} is used. < See |string-match| for how {pat} is used.
*strpbrk()* *strpbrk()*
Vim doesn't have a strpbrk() function. But you can do: > Vim doesn't have a strpbrk() function. But you can do: >
:let sepidx = match(line, '[.,;: \t]') :let sepidx = match(line, '[.,;: \t]')
< *strcasestr()* < *strcasestr()*
Vim doesn't have a strcasestr() function. But you can add Vim doesn't have a strcasestr() function. But you can add
@ -5744,7 +5746,7 @@ match({expr}, {pat} [, {start} [, {count}]]) *match()*
See |pattern| for the patterns that are accepted. See |pattern| for the patterns that are accepted.
The 'ignorecase' option is used to set the ignore-caseness of The 'ignorecase' option is used to set the ignore-caseness of
the pattern. 'smartcase' is NOT used. The matching is always the pattern. 'smartcase' is NOT used. The matching is always
done like 'magic' is set and 'cpoptions' is empty. done like 'magic' is set and 'cpoptions' is empty.
*matchadd()* *E798* *E799* *E801* *E957* *matchadd()* *E798* *E799* *E801* *E957*
@ -5760,7 +5762,7 @@ matchadd({group}, {pattern}[, {priority}[, {id} [, {dict}]]])
concealed. concealed.
The optional {priority} argument assigns a priority to the The optional {priority} argument assigns a priority to the
match. A match with a high priority will have its match. A match with a high priority will have its
highlighting overrule that of a match with a lower priority. highlighting overrule that of a match with a lower priority.
A priority is specified as an integer (negative numbers are no A priority is specified as an integer (negative numbers are no
exception). If the {priority} argument is not specified, the exception). If the {priority} argument is not specified, the
@ -5799,7 +5801,7 @@ matchadd({group}, {pattern}[, {priority}[, {id} [, {dict}]]])
:call matchdelete(m) :call matchdelete(m)
< A list of matches defined by |matchadd()| and |:match| are < A list of matches defined by |matchadd()| and |:match| are
available from |getmatches()|. All matches can be deleted in available from |getmatches()|. All matches can be deleted in
one operation by |clearmatches()|. one operation by |clearmatches()|.
*matchaddpos()* *matchaddpos()*
@ -5987,7 +5989,7 @@ mkdir({name} [, {path} [, {prot}]])
necessary. Otherwise it must be "". necessary. Otherwise it must be "".
If {prot} is given it is used to set the protection bits of If {prot} is given it is used to set the protection bits of
the new directory. The default is 0755 (rwxr-xr-x: r/w for the new directory. The default is 0755 (rwxr-xr-x: r/w for
the user readable for others). Use 0700 to make it unreadable the user readable for others). Use 0700 to make it unreadable
for others. for others.
{prot} is applied for all parts of {name}. Thus if you create {prot} is applied for all parts of {name}. Thus if you create
@ -6268,7 +6270,7 @@ printf({fmt}, {expr1} ...) *printf()*
number produced by a signed conversion (d). number produced by a signed conversion (d).
+ A sign must always be placed before a number + A sign must always be placed before a number
produced by a signed conversion. A + overrides produced by a signed conversion. A + overrides
a space if both are used. a space if both are used.
field-width field-width
@ -6294,7 +6296,7 @@ printf({fmt}, {expr1} ...) *printf()*
A field width or precision, or both, may be indicated by an A field width or precision, or both, may be indicated by an
asterisk '*' instead of a digit string. In this case, a asterisk '*' instead of a digit string. In this case, a
Number argument supplies the field width or precision. A Number argument supplies the field width or precision. A
negative field width is treated as a left adjustment flag negative field width is treated as a left adjustment flag
followed by a positive field width; a negative precision is followed by a positive field width; a negative precision is
treated as though it were missing. Example: > treated as though it were missing. Example: >
@ -6528,7 +6530,7 @@ reltimestr({time}) *reltimestr()*
*remote_expr()* *E449* *remote_expr()* *E449*
remote_expr({server}, {string} [, {idvar} [, {timeout}]]) remote_expr({server}, {string} [, {idvar} [, {timeout}]])
Send the {string} to {server}. The string is sent as an Send the {string} to {server}. The string is sent as an
expression and the result is returned after evaluation. expression and the result is returned after evaluation.
The result must be a String or a |List|. A |List| is turned The result must be a String or a |List|. A |List| is turned
into a String by joining the items with a line break in into a String by joining the items with a line break in
@ -6570,7 +6572,7 @@ remote_foreground({server}) *remote_foreground()*
remote_peek({serverid} [, {retvar}]) *remote_peek()* remote_peek({serverid} [, {retvar}]) *remote_peek()*
Returns a positive number if there are available strings Returns a positive number if there are available strings
from {serverid}. Copies any reply string into the variable from {serverid}. Copies any reply string into the variable
{retvar} if specified. {retvar} must be a string with the {retvar} if specified. {retvar} must be a string with the
name of a variable. name of a variable.
Returns zero if none are available. Returns zero if none are available.
Returns -1 if something is wrong. Returns -1 if something is wrong.
@ -6593,7 +6595,7 @@ remote_read({serverid}, [{timeout}]) *remote_read()*
< <
*remote_send()* *E241* *remote_send()* *E241*
remote_send({server}, {string} [, {idvar}]) remote_send({server}, {string} [, {idvar}])
Send the {string} to {server}. The string is sent as input Send the {string} to {server}. The string is sent as input
keys and the function returns immediately. At the Vim server keys and the function returns immediately. At the Vim server
the keys are not mapped |:map|. the keys are not mapped |:map|.
If {idvar} is present, it is taken as the name of a variable If {idvar} is present, it is taken as the name of a variable
@ -6652,7 +6654,7 @@ repeat({expr}, {count}) *repeat()*
:let separator = repeat('-', 80) :let separator = repeat('-', 80)
< When {count} is zero or negative the result is empty. < When {count} is zero or negative the result is empty.
When {expr} is a |List| the result is {expr} concatenated When {expr} is a |List| the result is {expr} concatenated
{count} times. Example: > {count} times. Example: >
:let longlist = repeat(['a', 'b'], 3) :let longlist = repeat(['a', 'b'], 3)
< Results in ['a', 'b', 'a', 'b', 'a', 'b']. < Results in ['a', 'b', 'a', 'b', 'a', 'b'].
@ -6671,7 +6673,7 @@ resolve({filename}) *resolve()* *E655*
path name) and also keeps a trailing path separator. path name) and also keeps a trailing path separator.
*reverse()* *reverse()*
reverse({list}) Reverse the order of items in {list} in-place. Returns reverse({list}) Reverse the order of items in {list} in-place. Returns
{list}. {list}.
If you want a list to remain unmodified make a copy first: > If you want a list to remain unmodified make a copy first: >
:let revlist = reverse(copy(mylist)) :let revlist = reverse(copy(mylist))
@ -6785,7 +6787,7 @@ search({pattern} [, {flags} [, {stopline} [, {timeout}]]]) *search()*
A zero value is equal to not giving the argument. A zero value is equal to not giving the argument.
When the {timeout} argument is given the search stops when When the {timeout} argument is given the search stops when
more than this many milliseconds have passed. Thus when more than this many milliseconds have passed. Thus when
{timeout} is 500 the search stops after half a second. {timeout} is 500 the search stops after half a second.
The value must not be negative. A zero value is like not The value must not be negative. A zero value is like not
giving the argument. giving the argument.
@ -6904,7 +6906,7 @@ searchpair({start}, {middle}, {end} [, {flags} [, {skip}
< When starting at the "if 2", with the cursor on the "i", and < When starting at the "if 2", with the cursor on the "i", and
searching forwards, the "endif 2" is found. When starting on searching forwards, the "endif 2" is found. When starting on
the character just before the "if 2", the "endif 1" will be the character just before the "if 2", the "endif 1" will be
found. That's because the "if 2" will be found first, and found. That's because the "if 2" will be found first, and
then this is considered to be a nested if/endif from "if 2" to then this is considered to be a nested if/endif from "if 2" to
"endif 2". "endif 2".
When searching backwards and {end} is more than one character, When searching backwards and {end} is more than one character,
@ -7062,7 +7064,7 @@ setcharsearch({dict}) *setcharsearch()*
setcmdpos({pos}) *setcmdpos()* setcmdpos({pos}) *setcmdpos()*
Set the cursor position in the command line to byte position Set the cursor position in the command line to byte position
{pos}. The first position is 1. {pos}. The first position is 1.
Use |getcmdpos()| to obtain the current position. Use |getcmdpos()| to obtain the current position.
Only works while editing the command line, thus you must use Only works while editing the command line, thus you must use
|c_CTRL-\_e|, |c_CTRL-R_=| or |c_CTRL-R_CTRL-R| with '='. For |c_CTRL-\_e|, |c_CTRL-R_=| or |c_CTRL-R_CTRL-R| with '='. For
@ -7117,7 +7119,7 @@ setline({lnum}, {text}) *setline()*
< Note: The '[ and '] marks are not set. < Note: The '[ and '] marks are not set.
setloclist({nr}, {list} [, {action}[, {what}]]) *setloclist()* setloclist({nr}, {list}[, {action}[, {what}]]) *setloclist()*
Create or replace or add to the location list for window {nr}. Create or replace or add to the location list for window {nr}.
{nr} can be the window number or the |window-ID|. {nr} can be the window number or the |window-ID|.
When {nr} is zero the current window is used. When {nr} is zero the current window is used.
@ -8171,7 +8173,7 @@ substitute({expr}, {pat}, {sub}, {flags}) *substitute()*
A "~" in {sub} is not replaced with the previous {sub}. A "~" in {sub} is not replaced with the previous {sub}.
Note that some codes in {sub} have a special meaning Note that some codes in {sub} have a special meaning
|sub-replace-special|. For example, to replace something with |sub-replace-special|. For example, to replace something with
"\n" (two characters), use "\\\\n" or '\\n'. "\n" (two characters), use "\\\\n" or '\\n'.
When {pat} does not match in {expr}, {expr} is returned When {pat} does not match in {expr}, {expr} is returned
@ -8192,9 +8194,9 @@ substitute({expr}, {pat}, {sub}, {flags}) *substitute()*
optional argument. Example: > optional argument. Example: >
:echo substitute(s, '%\(\x\x\)', SubNr, 'g') :echo substitute(s, '%\(\x\x\)', SubNr, 'g')
< The optional argument is a list which contains the whole < The optional argument is a list which contains the whole
matched string and up to nine submatches,like what matched string and up to nine submatches, like what
|submatch()| returns. Example: > |submatch()| returns. Example: >
:echo substitute(s, '\(\x\x\)', {m -> '0x' . m[1]}, 'g') :echo substitute(s, '%\(\x\x\)', {m -> '0x' . m[1]}, 'g')
swapinfo({fname}) *swapinfo()* swapinfo({fname}) *swapinfo()*
The result is a dictionary, which holds information about the The result is a dictionary, which holds information about the
@ -8234,7 +8236,7 @@ synID({lnum}, {col}, {trans}) *synID()*
zero. zero.
When {trans} is |TRUE|, transparent items are reduced to the When {trans} is |TRUE|, transparent items are reduced to the
item that they reveal. This is useful when wanting to know item that they reveal. This is useful when wanting to know
the effective color. When {trans} is |FALSE|, the transparent the effective color. When {trans} is |FALSE|, the transparent
item is returned. This is useful when wanting to know which item is returned. This is useful when wanting to know which
syntax item is effective (e.g. inside parens). syntax item is effective (e.g. inside parens).
@ -8250,7 +8252,7 @@ synIDattr({synID}, {what} [, {mode}]) *synIDattr()*
syntax ID {synID}. This can be used to obtain information syntax ID {synID}. This can be used to obtain information
about a syntax item. about a syntax item.
{mode} can be "gui", "cterm" or "term", to get the attributes {mode} can be "gui", "cterm" or "term", to get the attributes
for that mode. When {mode} is omitted, or an invalid value is for that mode. When {mode} is omitted, or an invalid value is
used, the attributes for the currently active highlighting are used, the attributes for the currently active highlighting are
used (GUI, cterm or term). used (GUI, cterm or term).
Use synIDtrans() to follow linked highlight groups. Use synIDtrans() to follow linked highlight groups.
@ -8479,7 +8481,7 @@ taglist({expr} [, {filename}]) *taglist()*
tempname() *tempname()* *temp-file-name* tempname() *tempname()* *temp-file-name*
The result is a String, which is the name of a file that The result is a String, which is the name of a file that
doesn't exist. It can be used for a temporary file. Example: > doesn't exist. It can be used for a temporary file. Example: >
:let tmpfile = tempname() :let tmpfile = tempname()
:exe "redir > " . tmpfile :exe "redir > " . tmpfile
< For Unix, the file will be in a private directory |tempfile|. < For Unix, the file will be in a private directory |tempfile|.
@ -8737,7 +8739,7 @@ uniq({list} [, {func} [, {dict}]]) *uniq()* *E882*
each item. For the use of {func} and {dict} see |sort()|. each item. For the use of {func} and {dict} see |sort()|.
values({dict}) *values()* values({dict}) *values()*
Return a |List| with all the values of {dict}. The |List| is Return a |List| with all the values of {dict}. The |List| is
in arbitrary order. in arbitrary order.
@ -8773,7 +8775,7 @@ virtcol({expr}) *virtcol()*
virtcol(".") with text "foo^Lbar", with cursor on the "^L", returns 5 virtcol(".") with text "foo^Lbar", with cursor on the "^L", returns 5
virtcol("$") with text "foo^Lbar", returns 9 virtcol("$") with text "foo^Lbar", returns 9
virtcol("'t") with text " there", with 't at 'h', returns 6 virtcol("'t") with text " there", with 't at 'h', returns 6
< The first column is 1. 0 is returned for an error. < The first column is 1. 0 is returned for an error.
A more advanced example that echoes the maximum length of A more advanced example that echoes the maximum length of
all lines: > all lines: >
echo max(map(range(1, line('$')), "virtcol([v:val, '$'])")) echo max(map(range(1, line('$')), "virtcol([v:val, '$'])"))
@ -8900,7 +8902,7 @@ winlayout([{tabnr}]) *winlayout()*
< <
*winline()* *winline()*
winline() The result is a Number, which is the screen line of the cursor winline() The result is a Number, which is the screen line of the cursor
in the window. This is counting screen lines from the top of in the window. This is counting screen lines from the top of
the window. The first line is one. the window. The first line is one.
If the cursor was moved the view on the file will be updated If the cursor was moved the view on the file will be updated
first, this may cause a scroll. first, this may cause a scroll.
@ -9143,9 +9145,9 @@ See |:verbose-cmd| for more information.
{name} can also be a |Dictionary| entry that is a {name} can also be a |Dictionary| entry that is a
|Funcref|: > |Funcref|: >
:function dict.init(arg) :function dict.init(arg)
< "dict" must be an existing dictionary. The entry < "dict" must be an existing dictionary. The entry
"init" is added if it didn't exist yet. Otherwise [!] "init" is added if it didn't exist yet. Otherwise [!]
is required to overwrite an existing function. The is required to overwrite an existing function. The
result is a |Funcref| to a numbered function. The result is a |Funcref| to a numbered function. The
function can only be used with a |Funcref| and will be function can only be used with a |Funcref| and will be
deleted if there are no more references to it. deleted if there are no more references to it.
@ -9174,7 +9176,7 @@ See |:verbose-cmd| for more information.
abort as soon as an error is detected. abort as soon as an error is detected.
*:func-dict* *:func-dict*
When the [dict] argument is added, the function must When the [dict] argument is added, the function must
be invoked through an entry in a |Dictionary|. The be invoked through an entry in a |Dictionary|. The
local variable "self" will then be set to the local variable "self" will then be set to the
dictionary. See |Dictionary-function|. dictionary. See |Dictionary-function|.
*:func-closure* *E932* *:func-closure* *E932*
@ -9253,7 +9255,7 @@ See |:verbose-cmd| for more information.
returns at the outermost ":endtry". returns at the outermost ":endtry".
*function-argument* *a:var* *function-argument* *a:var*
An argument can be defined by giving its name. In the function this can then An argument can be defined by giving its name. In the function this can then
be used as "a:name" ("a:" for argument). be used as "a:name" ("a:" for argument).
*a:0* *a:1* *a:000* *E740* *...* *a:0* *a:1* *a:000* *E740* *...*
Up to 20 arguments can be given, separated by commas. After the named Up to 20 arguments can be given, separated by commas. After the named
@ -9324,7 +9326,7 @@ This function can then be called with: >
itself, the function is executed for each line in the range, itself, the function is executed for each line in the range,
with the cursor in the first column of that line. The cursor with the cursor in the first column of that line. The cursor
is left at the last line (possibly moved by the last function is left at the last line (possibly moved by the last function
call). The arguments are re-evaluated for each line. Thus call). The arguments are re-evaluated for each line. Thus
this works: this works:
*function-range-example* > *function-range-example* >
:function Mynumber(arg) :function Mynumber(arg)
@ -9369,7 +9371,7 @@ This is introduced in the user manual, section |41.14|.
The autocommand is useful if you have a plugin that is a long Vim script file. The autocommand is useful if you have a plugin that is a long Vim script file.
You can define the autocommand and quickly quit the script with |:finish|. You can define the autocommand and quickly quit the script with |:finish|.
That makes Vim startup faster. The autocommand should then load the same file That makes Vim startup faster. The autocommand should then load the same file
again, setting a variable to skip the |:finish| command. again, setting a variable to skip the |:finish| command.
Use the FuncUndefined autocommand event with a pattern that matches the Use the FuncUndefined autocommand event with a pattern that matches the
@ -9448,7 +9450,7 @@ name. So in the above example, if the variable "adjective" was set to
"adjective" was set to "quiet", then it would be to "my_quiet_variable". "adjective" was set to "quiet", then it would be to "my_quiet_variable".
One application for this is to create a set of variables governed by an option One application for this is to create a set of variables governed by an option
value. For example, the statement > value. For example, the statement >
echo my_{&background}_message echo my_{&background}_message
would output the contents of "my_dark_message" or "my_light_message" depending would output the contents of "my_dark_message" or "my_light_message" depending
@ -9494,7 +9496,7 @@ This does NOT work: >
must be a valid index in that list. For nested list must be a valid index in that list. For nested list
the index can be repeated. the index can be repeated.
This cannot be used to add an item to a |List|. This cannot be used to add an item to a |List|.
This cannot be used to set a byte in a String. You This cannot be used to set a byte in a String. You
can do that like this: > can do that like this: >
:let var = var[0:2] . 'X' . var[4:] :let var = var[0:2] . 'X' . var[4:]
< <
@ -9543,7 +9545,7 @@ This does NOT work: >
that would match everywhere. that would match everywhere.
:let @{reg-name} .= {expr1} :let @{reg-name} .= {expr1}
Append {expr1} to register {reg-name}. If the Append {expr1} to register {reg-name}. If the
register was empty it's like setting it to {expr1}. register was empty it's like setting it to {expr1}.
:let &{option-name} = {expr1} *:let-option* *:let-&* :let &{option-name} = {expr1} *:let-option* *:let-&*
@ -9619,7 +9621,7 @@ This does NOT work: >
|List| item. |List| item.
*E121* *E121*
:let {var-name} .. List the value of variable {var-name}. Multiple :let {var-name} .. List the value of variable {var-name}. Multiple
variable names may be given. Special names recognized variable names may be given. Special names recognized
here: *E738* here: *E738*
g: global variables g: global variables
@ -9801,7 +9803,7 @@ This does NOT work: >
:for item in copy(mylist) :for item in copy(mylist)
< When not making a copy, Vim stores a reference to the < When not making a copy, Vim stores a reference to the
next item in the list, before executing the commands next item in the list, before executing the commands
with the current item. Thus the current item can be with the current item. Thus the current item can be
removed without effect. Removing any later item means removed without effect. Removing any later item means
it will not be found. Thus the following example it will not be found. Thus the following example
works (an inefficient way to make a list empty): > works (an inefficient way to make a list empty): >
@ -10020,7 +10022,7 @@ This does NOT work: >
message in the |message-history|. When used in a message in the |message-history|. When used in a
script or function the line number will be added. script or function the line number will be added.
Spaces are placed between the arguments as with the Spaces are placed between the arguments as with the
:echo command. When used inside a try conditional, :echo command. When used inside a try conditional,
the message is raised as an error exception instead the message is raised as an error exception instead
(see |try-echoerr|). (see |try-echoerr|).
Example: > Example: >
@ -10149,14 +10151,14 @@ the finally clause. It is resumed at the ":endtry", so that commands after
the ":endtry" are not executed and the exception might be caught elsewhere, the ":endtry" are not executed and the exception might be caught elsewhere,
see |try-nesting|. see |try-nesting|.
When during execution of a catch clause another exception is thrown, the When during execution of a catch clause another exception is thrown, the
remaining lines in that catch clause are not executed. The new exception is remaining lines in that catch clause are not executed. The new exception is
not matched against the patterns in any of the ":catch" commands of the same not matched against the patterns in any of the ":catch" commands of the same
try conditional and none of its catch clauses is taken. If there is, however, try conditional and none of its catch clauses is taken. If there is, however,
a finally clause, it is executed, and the exception pends during its a finally clause, it is executed, and the exception pends during its
execution. The commands following the ":endtry" are not executed. The new execution. The commands following the ":endtry" are not executed. The new
exception might, however, be caught elsewhere, see |try-nesting|. exception might, however, be caught elsewhere, see |try-nesting|.
When during execution of the finally clause (if present) an exception is When during execution of the finally clause (if present) an exception is
thrown, the remaining lines in the finally clause are skipped. If the finally thrown, the remaining lines in the finally clause are skipped. If the finally
clause has been taken because of an exception from the try block or one of the clause has been taken because of an exception from the try block or one of the
catch clauses, the original (pending) exception is discarded. The commands catch clauses, the original (pending) exception is discarded. The commands
following the ":endtry" are not executed, and the exception from the finally following the ":endtry" are not executed, and the exception from the finally
@ -10190,7 +10192,7 @@ catch an exception thrown in its try block or throws a new exception from one
of its catch clauses or its finally clause, the outer try conditional is of its catch clauses or its finally clause, the outer try conditional is
checked according to the rules above. If the inner try conditional is in the checked according to the rules above. If the inner try conditional is in the
try block of the outer try conditional, its catch clauses are checked, but try block of the outer try conditional, its catch clauses are checked, but
otherwise only the finally clause is executed. It does not matter for otherwise only the finally clause is executed. It does not matter for
nesting, whether the inner try conditional is directly contained in the outer nesting, whether the inner try conditional is directly contained in the outer
one, or whether the outer one sources a script or calls a function containing one, or whether the outer one sources a script or calls a function containing
the inner try conditional. the inner try conditional.
@ -10253,7 +10255,7 @@ executed. >
however displays "in Bar" and throws 4711. however displays "in Bar" and throws 4711.
Any other command that takes an expression as argument might also be Any other command that takes an expression as argument might also be
abandoned by an (uncaught) exception during the expression evaluation. The abandoned by an (uncaught) exception during the expression evaluation. The
exception is then propagated to the caller of the command. exception is then propagated to the caller of the command.
Example: > Example: >
@ -10437,13 +10439,13 @@ CLEANUP CODE *try-finally*
Scripts often change global settings and restore them at their end. If the Scripts often change global settings and restore them at their end. If the
user however interrupts the script by pressing CTRL-C, the settings remain in user however interrupts the script by pressing CTRL-C, the settings remain in
an inconsistent state. The same may happen to you in the development phase of an inconsistent state. The same may happen to you in the development phase of
a script when an error occurs or you explicitly throw an exception without a script when an error occurs or you explicitly throw an exception without
catching it. You can solve these problems by using a try conditional with catching it. You can solve these problems by using a try conditional with
a finally clause for restoring the settings. Its execution is guaranteed on a finally clause for restoring the settings. Its execution is guaranteed on
normal control flow, on error, on an explicit ":throw", and on interrupt. normal control flow, on error, on an explicit ":throw", and on interrupt.
(Note that errors and interrupts from inside the try conditional are converted (Note that errors and interrupts from inside the try conditional are converted
to exceptions. When not caught, they terminate the script after the finally to exceptions. When not caught, they terminate the script after the finally
clause has been executed.) clause has been executed.)
Example: > Example: >
@ -10501,7 +10503,7 @@ This displays "first", "cleanup", "second", "cleanup", and "end". >
:echo Foo() "returned by Foo" :echo Foo() "returned by Foo"
This displays "cleanup" and "4711 returned by Foo". You don't need to add an This displays "cleanup" and "4711 returned by Foo". You don't need to add an
extra ":return" in the finally clause. (Above all, this would override the extra ":return" in the finally clause. (Above all, this would override the
return value.) return value.)
*except-from-finally* *except-from-finally*
@ -10545,7 +10547,7 @@ or >
Vim:{errmsg} Vim:{errmsg}
{cmdname} is the name of the command that failed; the second form is used when {cmdname} is the name of the command that failed; the second form is used when
the command name is not known. {errmsg} is the error message usually produced the command name is not known. {errmsg} is the error message usually produced
when the error occurs outside try conditionals. It always begins with when the error occurs outside try conditionals. It always begins with
a capital "E", followed by a two or three-digit error number, a colon, and a capital "E", followed by a two or three-digit error number, a colon, and
a space. a space.
@ -10650,7 +10652,7 @@ This works also when a try conditional is active.
CATCHING INTERRUPTS *catch-interrupt* CATCHING INTERRUPTS *catch-interrupt*
When there are active try conditionals, an interrupt (CTRL-C) is converted to When there are active try conditionals, an interrupt (CTRL-C) is converted to
the exception "Vim:Interrupt". You can catch it like every exception. The the exception "Vim:Interrupt". You can catch it like every exception. The
script is not terminated, then. script is not terminated, then.
Example: > Example: >
@ -10684,7 +10686,7 @@ script is not terminated, then.
:endwhile :endwhile
You can interrupt a task here by pressing CTRL-C; the script then asks for You can interrupt a task here by pressing CTRL-C; the script then asks for
a new command. If you press CTRL-C at the prompt, the script is terminated. a new command. If you press CTRL-C at the prompt, the script is terminated.
For testing what happens when CTRL-C would be pressed on a specific line in For testing what happens when CTRL-C would be pressed on a specific line in
your script, use the debug mode and execute the |>quit| or |>interrupt| your script, use the debug mode and execute the |>quit| or |>interrupt|
@ -10841,7 +10843,7 @@ For some commands, the normal action can be replaced by a sequence of
autocommands. Exceptions from that sequence will be catchable by the caller autocommands. Exceptions from that sequence will be catchable by the caller
of the command. of the command.
Example: For the ":write" command, the caller cannot know whether the file Example: For the ":write" command, the caller cannot know whether the file
had actually been written when the exception occurred. You need to tell it in had actually been written when the exception occurred. You need to tell it in
some way. > some way. >
:if !exists("cnt") :if !exists("cnt")
@ -10989,8 +10991,8 @@ or ":endif". On the other hand, errors should be catchable as exceptions
This problem has been solved by converting errors to exceptions and using This problem has been solved by converting errors to exceptions and using
immediate abortion (if not suppressed by ":silent!") only when a try immediate abortion (if not suppressed by ":silent!") only when a try
conditional is active. This is no restriction since an (error) exception can conditional is active. This is no restriction since an (error) exception can
be caught only from an active try conditional. If you want an immediate be caught only from an active try conditional. If you want an immediate
termination without catching the error, just use a try conditional without termination without catching the error, just use a try conditional without
catch clause. (You can cause cleanup code being executed before termination catch clause. (You can cause cleanup code being executed before termination
by specifying a finally clause.) by specifying a finally clause.)
@ -11005,8 +11007,8 @@ conditional of a new script, you might change the control flow of the existing
script on error. You get the immediate abortion on error and can catch the script on error. You get the immediate abortion on error and can catch the
error in the new script. If however the sourced script suppresses error error in the new script. If however the sourced script suppresses error
messages by using the ":silent!" command (checking for errors by testing messages by using the ":silent!" command (checking for errors by testing
|v:errmsg| if appropriate), its execution path is not changed. The error is |v:errmsg| if appropriate), its execution path is not changed. The error is
not converted to an exception. (See |:silent|.) So the only remaining cause not converted to an exception. (See |:silent|.) So the only remaining cause
where this happens is for scripts that don't care about errors and produce where this happens is for scripts that don't care about errors and produce
error messages. You probably won't want to use such code from your new error messages. You probably won't want to use such code from your new
scripts. scripts.