*eval.txt*	For Vim version 8.2.  Last change: 2021 Jan 13


		  VIM REFERENCE MANUAL	  by Bram Moolenaar


Expression evaluation			*expression* *expr* *E15* *eval*

Using expressions is introduced in chapter 41 of the user manual |usr_41.txt|.

Note: Expression evaluation can be disabled at compile time.  If this has been
done, the features in this document are not available.  See |+eval| and
|no-eval-feature|.

This file is about the backwards compatible Vim script.  For Vim9 script,
which executes much faster, supports type checking and much more, see
|vim9.txt|.

1.  Variables			|variables|
    1.1 Variable types
    1.2 Function references		|Funcref|
    1.3 Lists				|Lists|
    1.4 Dictionaries			|Dictionaries|
    1.5 Blobs				|Blobs|
    1.6 More about variables		|more-variables|
2.  Expression syntax		|expression-syntax|
3.  Internal variable		|internal-variables|
4.  Builtin Functions		|functions|
5.  Defining functions		|user-functions|
6.  Curly braces names		|curly-braces-names|
7.  Commands			|expression-commands|
8.  Exception handling		|exception-handling|
9.  Examples			|eval-examples|
10. Vim script version		|vimscript-version|
11. No +eval feature		|no-eval-feature|
12. The sandbox			|eval-sandbox|
13. Textlock			|textlock|

Testing support is documented in |testing.txt|.
Profiling is documented at |profiling|.

==============================================================================
1. Variables						*variables*

1.1 Variable types ~
						*E712* *E896* *E897* *E899*
There are ten types of variables:

							*Number* *Integer*
Number		A 32 or 64 bit signed number.  |expr-number|
		The number of bits is available in |v:numbersize|.
		Examples:  -123  0x10  0177  0o177 0b1011

Float		A floating point number. |floating-point-format| *Float*
		{only when compiled with the |+float| feature}
		Examples: 123.456  1.15e-6  -1.1e3

							*E928*
String		A NUL terminated string of 8-bit unsigned characters (bytes).
		|expr-string| Examples: "ab\txx\"--"  'x-z''a,c'

List		An ordered sequence of items, see |List| for details.
		Example: [1, 2, ['a', 'b']]

Dictionary	An associative, unordered array: Each entry has a key and a
		value. |Dictionary|
		Examples:
			{'blue': "#0000ff", 'red': "#ff0000"}
			#{blue: "#0000ff", red: "#ff0000"}

Funcref		A reference to a function |Funcref|.
		Example: function("strlen")
		It can be bound to a dictionary and arguments, it then works
		like a Partial.
		Example: function("Callback", [arg], myDict)

Special		|v:false|, |v:true|, |v:none| and |v:null|.  *Special*

Job		Used for a job, see |job_start()|. *Job* *Jobs*

Channel		Used for a channel, see |ch_open()|. *Channel* *Channels*

Blob		Binary Large Object. Stores any sequence of bytes.  See |Blob|
		for details
		Example: 0zFF00ED015DAF
		0z is an empty Blob.

The Number and String types are converted automatically, depending on how they
are used.

Conversion from a Number to a String is by making the ASCII representation of
the Number.  Examples:
	Number 123	-->	String "123" ~
	Number 0	-->	String "0" ~
	Number -1	-->	String "-1" ~
							*octal*
Conversion from a String to a Number only happens in legacy Vim script, not in
Vim9 script.  It is done by converting the first digits to a number.
Hexadecimal "0xf9", Octal "017" or "0o17", and Binary "0b10"
numbers are recognized
NOTE: when using |scriptversion-4| octal with a leading "0" is not recognized.
The 0o notation requires patch 8.2.0886.
If the String doesn't start with digits, the result is zero.
Examples:
	String "456"	-->	Number 456 ~
	String "6bar"	-->	Number 6 ~
	String "foo"	-->	Number 0 ~
	String "0xf1"	-->	Number 241 ~
	String "0100"	-->	Number 64 ~
	String "0o100"	-->	Number 64 ~
	String "0b101"	-->	Number 5 ~
	String "-8"	-->	Number -8 ~
	String "+8"	-->	Number 0 ~

To force conversion from String to Number, add zero to it: >
	:echo "0100" + 0
<	64 ~

To avoid a leading zero to cause octal conversion, or for using a different
base, use |str2nr()|.

						*TRUE* *FALSE* *Boolean*
For boolean operators Numbers are used.  Zero is FALSE, non-zero is TRUE.
You can also use |v:false| and |v:true|.  In Vim9 script |false| and |true|.
When TRUE is returned from a function it is the Number one, FALSE is the
number zero.

Note that in the command: >
	:if "foo"
	:" NOT executed
"foo" is converted to 0, which means FALSE.  If the string starts with a
non-zero number it means TRUE: >
	:if "8foo"
	:" executed
To test for a non-empty string, use empty(): >
	:if !empty("foo")

<						*falsy* *truthy*
An expression can be used as a condition, ignoring the type and only using
whether the value is "sort of true" or "sort of false".  Falsy is:
	the number zero
	empty string, blob, list or dictionary
Other values are truthy.  Examples:
	0	falsy
	1	truthy
	-1	truthy
	0.0	falsy
	0.1	truthy
	''	falsy
	'x'	truthy
	[]	falsy
	[0]	truthy
	{}	falsy
	#{x: 1} truthy
	0z	falsy
	0z00	truthy

							*non-zero-arg*
Function arguments often behave slightly different from |TRUE|: If the
argument is present and it evaluates to a non-zero Number, |v:true| or a
non-empty String, then the value is considered to be TRUE.
Note that " " and "0" are also non-empty strings, thus considered to be TRUE.
A List, Dictionary or Float is not a Number or String, thus evaluate to FALSE.

		*E745* *E728* *E703* *E729* *E730* *E731* *E908* *E910* *E913*
		*E974* *E975* *E976*
|List|, |Dictionary|, |Funcref|, |Job|, |Channel| and |Blob| types are not
automatically converted.

							*E805* *E806* *E808*
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
to Float, printf() for Float to String and float2nr() for Float to Number.

			*E891* *E892* *E893* *E894* *E907* *E911* *E914*
When expecting a Float a Number can also be used, but nothing else.

						*no-type-checking*
You will not get an error if you try to change the type of a variable.


1.2 Function references ~
						*Funcref* *E695* *E718*
A Funcref variable is obtained with the |function()| function, the |funcref()|
function or created with the lambda expression |expr-lambda|.  It can be used
in an expression in the place of a function name, before the parenthesis
around the arguments, to invoke the function it refers to.  Example: >

	:let Fn = function("MyFunc")
	:echo Fn()
<							*E704* *E705* *E707*
A Funcref variable must start with a capital, "s:", "w:", "t:" or "b:".  You
can use "g:" but the following name must still start with a capital.  You
cannot have both a Funcref variable and a function with the same name.

A special case is defining a function and directly assigning its Funcref to a
Dictionary entry.  Example: >
	:function dict.init() dict
	:   let self.val = 0
	:endfunction

The key of the Dictionary can start with a lower case letter.  The actual
function name is not used here.  Also see |numbered-function|.

A Funcref can also be used with the |:call| command: >
	:call Fn()
	:call dict.init()

The name of the referenced function can be obtained with |string()|. >
	:let func = string(Fn)

You can use |call()| to invoke a Funcref and use a list variable for the
arguments: >
	:let r = call(Fn, mylist)
<
								*Partial*
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
function() or funcref().  When calling the function the Dictionary and/or
arguments will be passed to the function.  Example: >

	let Cb = function('Callback', ['foo'], myDict)
	call Cb('bar')

This will invoke the function as if using: >
	call myDict.Callback('foo', 'bar')

This is very useful when passing a function around, e.g. in the arguments of
|ch_open()|.

Note that binding a function to a Dictionary also happens when the function is
a member of the Dictionary: >

	let myDict.myFunction = MyFunction
	call myDict.myFunction()

Here MyFunction() will get myDict passed as "self".  This happens when the
"myFunction" member is accessed.  When making assigning "myFunction" to
otherDict and calling it, it will be bound to otherDict: >

	let otherDict.myFunction = myDict.myFunction
	call otherDict.myFunction()

Now "self" will be "otherDict".  But when the dictionary was bound explicitly
this won't happen: >

	let myDict.myFunction = function(MyFunction, myDict)
	let otherDict.myFunction = myDict.myFunction
	call otherDict.myFunction()

Here "self" will be "myDict", because it was bound explicitly.


1.3 Lists ~
						*list* *List* *Lists* *E686*
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
position in the sequence.


List creation ~
							*E696* *E697*
A List is created with a comma separated list of items in square brackets.
Examples: >
	:let mylist = [1, two, 3, "four"]
	:let emptylist = []

An item can be any expression.  Using a List for an item creates a
List of Lists: >
	:let nestlist = [[11, 12], [21, 22], [31, 32]]

An extra comma after the last item is ignored.


List index ~
							*list-index* *E684*
An item in the List can be accessed by putting the index in square brackets
after the List.  Indexes are zero-based, thus the first item has index zero. >
	:let item = mylist[0]		" get the first item: 1
	:let item = mylist[2]		" get the third item: 3

When the resulting item is a list this can be repeated: >
	:let item = nestlist[0][1]	" get the first list, second item: 12
<
A negative index is counted from the end.  Index -1 refers to the last item in
the List, -2 to the last but one item, etc. >
	:let last = mylist[-1]		" get the last item: "four"

To avoid an error for an invalid index use the |get()| function.  When an item
is not available it returns zero or the default value you specify: >
	:echo get(mylist, idx)
	:echo get(mylist, idx, "NONE")


List concatenation ~

Two lists can be concatenated with the "+" operator: >
	:let longlist = mylist + [5, 6]
	:let mylist += [7, 8]

To prepend or append an item turn the item into a list by putting [] around
it.  To change a list in-place see |list-modification| below.


Sublist ~
							*sublist*
A part of the List can be obtained by specifying the first and last index,
separated by a colon in square brackets: >
	:let shortlist = mylist[2:-1]	" get List [3, "four"]

Omitting the first index is similar to zero.  Omitting the last index is
similar to -1. >
	:let endlist = mylist[2:]	" from item 2 to the end: [3, "four"]
	:let shortlist = mylist[2:2]	" List with one item: [3]
	:let otherlist = mylist[:]	" make a copy of the List

Notice that the last index is inclusive.  If you prefer using an exclusive
index use the |slice()| method.

If the first index is beyond the last item of the List or the second item is
before the first item, the result is an empty list.  There is no error
message.

If the second index is equal to or greater than the length of the list the
length minus one is used: >
	:let mylist = [0, 1, 2, 3]
	:echo mylist[2:8]		" result: [2, 3]

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:
mylist[s : e].


List identity ~
							*list-identity*
When variable "aa" is a list and you assign it to another variable "bb", both
variables refer to the same list.  Thus changing the list "aa" will also
change "bb": >
	:let aa = [1, 2, 3]
	:let bb = aa
	:call add(aa, 4)
	:echo bb
<	[1, 2, 3, 4]

Making a copy of a list is done with the |copy()| function.  Using [:] also
works, as explained above.  This creates a shallow copy of the list: Changing
a list item in the list will also change the item in the copied list: >
	:let aa = [[1, 'a'], 2, 3]
	:let bb = copy(aa)
	:call add(aa, 4)
	:let aa[0][1] = 'aaa'
	:echo aa
<	[[1, aaa], 2, 3, 4] >
	:echo bb
<	[[1, aaa], 2, 3]

To make a completely independent list use |deepcopy()|.  This also makes a
copy of the values in the list, recursively.  Up to a hundred levels deep.

The operator "is" can be used to check if two variables refer to the same
List.  "isnot" does the opposite.  In contrast "==" compares if two lists have
the same value. >
	:let alist = [1, 2, 3]
	:let blist = [1, 2, 3]
	:echo alist is blist
<	0 >
	:echo alist == blist
<	1

Note about comparing lists: Two lists are considered equal if they have the
same length and all items compare equal, as with using "==".  There is one
exception: When comparing a number with a string they are considered
different.  There is no automatic type conversion, as with using "==" on
variables.  Example: >
	echo 4 == "4"
<	1 >
	echo [4] == ["4"]
<	0

Thus comparing Lists is more strict than comparing numbers and strings.  You
can compare simple values this way too by putting them in a list: >

	:let a = 5
	:let b = "5"
	:echo a == b
<	1 >
	:echo [a] == [b]
<	0


List unpack ~

To unpack the items in a list to individual variables, put the variables in
square brackets, like list items: >
	:let [var1, var2] = mylist

When the number of variables does not match the number of items in the list
this produces an error.  To handle any extra items from the list append ";"
and a variable name: >
	:let [var1, var2; rest] = mylist

This works like: >
	:let var1 = mylist[0]
	:let var2 = mylist[1]
	:let rest = mylist[2:]

Except that there is no error if there are only two items.  "rest" will be an
empty list then.


List modification ~
							*list-modification*
To change a specific item of a list use |:let| this way: >
	:let list[4] = "four"
	:let listlist[0][3] = item

To change part of a list you can specify the first and last item to be
modified.  The value must at least have the number of items in the range: >
	:let list[3:5] = [3, 4, 5]

Adding and removing items from a list is done with functions.  Here are a few
examples: >
	:call insert(list, 'a')		" prepend item 'a'
	:call insert(list, 'a', 3)	" insert item 'a' before list[3]
	:call add(list, "new")		" append String item
	:call add(list, [1, 2])		" append a List as one new item
	:call extend(list, [1, 2])	" extend the list with two more items
	:let i = remove(list, 3)	" remove item 3
	:unlet list[3]			" idem
	:let l = remove(list, 3, -1)	" remove items 3 to last item
	:unlet list[3 : ]		" idem
	:call filter(list, 'v:val !~ "x"')  " remove items with an 'x'

Changing the order of items in a list: >
	:call sort(list)		" sort a list alphabetically
	:call reverse(list)		" reverse the order of items
	:call uniq(sort(list))		" sort and remove duplicates


For loop ~

The |:for| loop executes commands for each item in a list.  A variable is set
to each item in the list in sequence.  Example: >
	:for item in mylist
	:   call Doit(item)
	:endfor

This works like: >
	:let index = 0
	:while index < len(mylist)
	:   let item = mylist[index]
	:   :call Doit(item)
	:   let index = index + 1
	:endwhile

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.

Just like the |:let| command, |:for| also accepts a list of variables.  This
requires the argument to be a list of lists. >
	:for [lnum, col] in [[1, 3], [2, 8], [3, 0]]
	:   call Doit(lnum, col)
	:endfor

This works like a |:let| command is done for each list item.  Again, the types
must remain the same to avoid an error.

It is also possible to put remaining items in a List variable: >
	:for [i, j; rest] in listlist
	:   call Doit(i, j)
	:   if !empty(rest)
	:      echo "remainder: " . string(rest)
	:   endif
	:endfor


List functions ~
						*E714*
Functions that are useful with a List: >
	:let r = call(funcname, list)	" call a function with an argument list
	:if empty(list)			" check if list is empty
	:let l = len(list)		" number of items in list
	:let big = max(list)		" maximum value in list
	:let small = min(list)		" minimum value in list
	:let xs = count(list, 'x')	" count nr of times 'x' appears in list
	:let i = index(list, 'x')	" index of first 'x' in list
	:let lines = getline(1, 10)	" get ten text lines from buffer
	:call append('$', lines)	" append text lines in buffer
	:let list = split("a b c")	" create list from items in a string
	:let string = join(list, ', ')	" create string from list items
	:let s = string(list)		" String representation of list
	:call map(list, '">> " . v:val')  " prepend ">> " to each item

Don't forget that a combination of features can make things simple.  For
example, to add up all the numbers in a list: >
	:exe 'let sum = ' . join(nrlist, '+')


1.4 Dictionaries ~
				*dict* *Dict* *Dictionaries* *Dictionary*
A Dictionary is an associative array: Each entry has a key and a value.  The
entry can be located with the key.  The entries are stored without a specific
ordering.


Dictionary creation ~
						*E720* *E721* *E722* *E723*
A Dictionary is created with a comma separated list of entries in curly
braces.  Each entry has a key and a value, separated by a colon.  Each key can
only appear once.  Examples: >
	:let mydict = {1: 'one', 2: 'two', 3: 'three'}
	:let emptydict = {}
<							*E713* *E716* *E717*
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
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 also be used
as a key.
						*literal-Dict* *#{}*
To avoid having to put quotes around every key the #{} form can be used.  This
does require the key to consist only of ASCII letters, digits, '-' and '_'.
Example: >
	:let mydict = #{zero: 0, one_key: 1, two-key: 2, 333: 3}
Note that 333 here is the string "333".  Empty keys are not possible with #{}.

A value can be any expression.  Using a Dictionary for a value creates a
nested Dictionary: >
	:let nestdict = {1: {11: 'a', 12: 'b'}, 2: {21: 'c'}}

An extra comma after the last entry is ignored.


Accessing entries ~

The normal way to access an entry is by putting the key in square brackets: >
	:let val = mydict["one"]
	:let mydict["four"] = 4

You can add new entries to an existing Dictionary this way, unlike Lists.

For keys that consist entirely of letters, digits and underscore the following
form can be used |expr-entry|: >
	:let val = mydict.one
	:let mydict.four = 4

Since an entry can be any type, also a List and a Dictionary, the indexing and
key lookup can be repeated: >
	:echo dict.key[idx].key


Dictionary to List conversion ~

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|.

Most often you want to loop over the keys, using the |keys()| function: >
	:for key in keys(mydict)
	:   echo key . ': ' . mydict[key]
	:endfor

The List of keys is unsorted.  You may want to sort them first: >
	:for key in sort(keys(mydict))

To loop over the values use the |values()| function:  >
	:for v in values(mydict)
	:   echo "value: " . v
	:endfor

If you want both the key and the value use the |items()| function.  It returns
a List in which each item is a List with two items, the key and the value: >
	:for [key, value] in items(mydict)
	:   echo key . ': ' . value
	:endfor


Dictionary identity ~
							*dict-identity*
Just like Lists you need to use |copy()| and |deepcopy()| to make a copy of a
Dictionary.  Otherwise, assignment results in referring to the same
Dictionary: >
	:let onedict = {'a': 1, 'b': 2}
	:let adict = onedict
	:let adict['a'] = 11
	:echo onedict['a']
	11

Two Dictionaries compare equal if all the key-value pairs compare equal.  For
more info see |list-identity|.


Dictionary modification ~
							*dict-modification*
To change an already existing entry of a Dictionary, or to add a new entry,
use |:let| this way: >
	:let dict[4] = "four"
	:let dict['one'] = item

Removing an entry from a Dictionary is done with |remove()| or |:unlet|.
Three ways to remove the entry with key "aaa" from dict: >
	:let i = remove(dict, 'aaa')
	:unlet dict.aaa
	:unlet dict['aaa']

Merging a Dictionary with another is done with |extend()|: >
	:call extend(adict, bdict)
This extends adict with all entries from bdict.  Duplicate keys cause entries
in adict to be overwritten.  An optional third argument can change this.
Note that the order of entries in a Dictionary is irrelevant, thus don't
expect ":echo adict" to show the items from bdict after the older entries in
adict.

Weeding out entries from a Dictionary can be done with |filter()|: >
	:call filter(dict, 'v:val =~ "x"')
This removes all entries from "dict" with a value not matching 'x'.
This can also be used to remove all entries: >
	call filter(dict, 0)


Dictionary function ~
				*Dictionary-function* *self* *E725* *E862*
When a function is defined with the "dict" attribute it can be used in a
special way with a dictionary.  Example: >
	:function Mylen() dict
	:   return len(self.data)
	:endfunction
	:let mydict = {'data': [0, 1, 2, 3], 'len': function("Mylen")}
	:echo mydict.len()

This is like a method in object oriented programming.  The entry in the
Dictionary is a |Funcref|.  The local variable "self" refers to the dictionary
the function was invoked from.

It is also possible to add a function without the "dict" attribute as a
Funcref to a Dictionary, but the "self" variable is not available then.

				*numbered-function* *anonymous-function*
To avoid the extra name for the function it can be defined and directly
assigned to a Dictionary in this way: >
	:let mydict = {'data': [0, 1, 2, 3]}
	:function mydict.len()
	:   return len(self.data)
	:endfunction
	:echo mydict.len()

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
|Funcref|.  It will automatically be deleted when there is no |Funcref|
remaining that refers to it.

It is not necessary to use the "dict" attribute for a numbered function.

If you get an error for a numbered function, you can find out what it is with
a trick.  Assuming the function is 42, the command is: >
	:function {42}


Functions for Dictionaries ~
							*E715*
Functions that can be used with a Dictionary: >
	:if has_key(dict, 'foo')	" TRUE if dict has entry with key "foo"
	:if empty(dict)			" TRUE if dict is empty
	:let l = len(dict)		" number of items in dict
	:let big = max(dict)		" maximum value in dict
	:let small = min(dict)		" minimum value in dict
	:let xs = count(dict, 'x')	" count nr of times 'x' appears in dict
	:let s = string(dict)		" String representation of dict
	:call map(dict, '">> " . v:val')  " prepend ">> " to each item


1.5 Blobs ~
						*blob* *Blob* *Blobs* *E978*
A Blob is a binary object.  It can be used to read an image from a file and
send it over a channel, for example.

A Blob mostly behaves like a |List| of numbers, where each number has the
value of an 8-bit byte, from 0 to 255.


Blob creation ~

A Blob can be created with a |blob-literal|: >
	:let b = 0zFF00ED015DAF
Dots can be inserted between bytes (pair of hex characters) for readability,
they don't change the value: >
	:let b = 0zFF00.ED01.5DAF

A blob can be read from a file with |readfile()| passing the {type} argument
set to "B", for example: >
	:let b = readfile('image.png', 'B')

A blob can be read from a channel with the |ch_readblob()| function.


Blob index ~
							*blob-index* *E979*
A byte in the Blob can be accessed by putting the index in square brackets
after the Blob.  Indexes are zero-based, thus the first byte has index zero. >
	:let myblob = 0z00112233
	:let byte = myblob[0]		" get the first byte: 0x00
	:let byte = myblob[2]		" get the third byte: 0x22

A negative index is counted from the end.  Index -1 refers to the last byte in
the Blob, -2 to the last but one byte, etc. >
	:let last = myblob[-1]		" get the last byte: 0x33

To avoid an error for an invalid index use the |get()| function.  When an item
is not available it returns -1 or the default value you specify: >
	:echo get(myblob, idx)
	:echo get(myblob, idx, 999)


Blob iteration ~

The |:for| loop executes commands for each byte of a Blob.  The loop variable is
set to each byte in the Blob.  Example: >
	:for byte in 0z112233
	:   call Doit(byte)
	:endfor
This calls Doit() with 0x11, 0x22 and 0x33.


Blob concatenation ~

Two blobs can be concatenated with the "+" operator: >
	:let longblob = myblob + 0z4455
	:let myblob += 0z6677

To change a blob in-place see |blob-modification| below.


Part of a blob ~

A part of the Blob can be obtained by specifying the first and last index,
separated by a colon in square brackets: >
	:let myblob = 0z00112233
	:let shortblob = myblob[1:2]	" get 0z1122
	:let shortblob = myblob[2:-1]	" get 0z2233

Omitting the first index is similar to zero.  Omitting the last index is
similar to -1. >
	:let endblob = myblob[2:]	" from item 2 to the end: 0z2233
	:let shortblob = myblob[2:2]	" Blob with one byte: 0z22
	:let otherblob = myblob[:]	" make a copy of the Blob

If the first index is beyond the last byte of the Blob or the second index is
before the first index, the result is an empty Blob.  There is no error
message.

If the second index is equal to or greater than the length of the list the
length minus one is used: >
	:echo myblob[2:8]		" result: 0z2233


Blob modification ~
							*blob-modification*
To change a specific byte of a blob use |:let| this way: >
	:let blob[4] = 0x44

When the index is just one beyond the end of the Blob, it is appended. Any
higher index is an error.

To change a sequence of bytes the [:] notation can be used: >
	let blob[1:3] = 0z445566
The length of the replaced bytes must be exactly the same as the value
provided. *E972*

To change part of a blob you can specify the first and last byte to be
modified.  The value must have the same number of bytes in the range: >
	:let blob[3:5] = 0z334455

You can also use the functions |add()|, |remove()| and |insert()|.


Blob identity ~

Blobs can be compared for equality: >
	if blob == 0z001122
And for equal identity: >
	if blob is otherblob
<							*blob-identity* *E977*
When variable "aa" is a Blob and you assign it to another variable "bb", both
variables refer to the same Blob.  Then the "is" operator returns true.

When making a copy using [:] or |copy()| the values are the same, but the
identity is different: >
	:let blob = 0z112233
	:let blob2 = blob
	:echo blob == blob2
<	1 >
	:echo blob is blob2
<	1 >
	:let blob3 = blob[:]
	:echo blob == blob3
<	1 >
	:echo blob is blob3
<	0

Making a copy of a Blob is done with the |copy()| function.  Using [:] also
works, as explained above.


1.6 More about variables ~
							*more-variables*
If you need to know the type of a variable or expression, use the |type()|
function.

When the '!' flag is included in the 'viminfo' option, global variables that
start with an uppercase letter, and don't contain a lowercase letter, are
stored in the viminfo file |viminfo-file|.

When the 'sessionoptions' option contains "global", global variables that
start with an uppercase letter and contain at least one lowercase letter are
stored in the session file |session-file|.

variable name		can be stored where ~
my_var_6		not
My_Var_6		session file
MY_VAR_6		viminfo file


It's possible to form a variable name with curly braces, see
|curly-braces-names|.

==============================================================================
2. Expression syntax					*expression-syntax*

Expression syntax summary, from least to most significant:

|expr1|	expr2
	expr2 ? expr1 : expr1	if-then-else

|expr2|	expr3
	expr3 || expr3 ...	logical OR

|expr3|	expr4
	expr4 && expr4 ...	logical AND

|expr4|	expr5
	expr5 == expr5		equal
	expr5 != expr5		not equal
	expr5 >	 expr5		greater than
	expr5 >= expr5		greater than or equal
	expr5 <	 expr5		smaller than
	expr5 <= expr5		smaller than or equal
	expr5 =~ expr5		regexp matches
	expr5 !~ expr5		regexp doesn't match

	expr5 ==? expr5		equal, ignoring case
	expr5 ==# expr5		equal, match case
	etc.			As above, append ? for ignoring case, # for
				matching case

	expr5 is expr5		same |List|, |Dictionary| or |Blob| instance
	expr5 isnot expr5	different |List|, |Dictionary| or |Blob|
				instance

|expr5|	expr6
	expr6 +	 expr6 ...	number addition, list or blob concatenation
	expr6 -	 expr6 ...	number subtraction
	expr6 .	 expr6 ...	string concatenation
	expr6 .. expr6 ...	string concatenation

|expr6|	expr7
	expr7 *	 expr7 ...	number multiplication
	expr7 /	 expr7 ...	number division
	expr7 %	 expr7 ...	number modulo

|expr7|	expr8
	! expr7			logical NOT
	- expr7			unary minus
	+ expr7			unary plus

|expr8|	expr9
	expr8[expr1]		byte of a String or item of a |List|
	expr8[expr1 : expr1]	substring of a String or sublist of a |List|
	expr8.name		entry in a |Dictionary|
	expr8(expr1, ...)	function call with |Funcref| variable
	expr8->name(expr1, ...)	|method| call

|expr9|	number			number constant
	"string"		string constant, backslash is special
	'string'		string constant, ' is doubled
	[expr1, ...]		|List|
	{expr1: expr1, ...}	|Dictionary|
	#{key: expr1, ...}	|Dictionary|
	&option			option value
	(expr1)			nested expression
	variable		internal variable
	va{ria}ble		internal variable with curly braces
	$VAR			environment variable
	@r			contents of register 'r'
	function(expr1, ...)	function call
	func{ti}on(expr1, ...)	function call with curly braces
	{args -> expr1}		lambda expression


"..." indicates that the operations in this level can be concatenated.
Example: >
	&nu || &list && &shell == "csh"

All expressions within one level are parsed from left to right.


expr1				*expr1* *trinary* *falsy-operator* *??* *E109*
-----

The trinary operator: expr2 ? expr1 : expr1
The falsy operator:   expr2 ?? expr1

Trinary operator ~

The expression before the '?' is evaluated to a number.  If it evaluates to
|TRUE|, the result is the value of the expression between the '?' and ':',
otherwise the result is the value of the expression after the ':'.
Example: >
	:echo lnum == 1 ? "top" : lnum

Since the first expression is an "expr2", it cannot contain another ?:.  The
other two expressions can, thus allow for recursive use of ?:.
Example: >
	:echo lnum == 1 ? "top" : lnum == 1000 ? "last" : lnum

To keep this readable, using |line-continuation| is suggested: >
	:echo lnum == 1
	:\	? "top"
	:\	: lnum == 1000
	:\		? "last"
	:\		: lnum

You should always put a space before the ':', otherwise it can be mistaken for
use in a variable such as "a:1".

Falsy operator ~

This is also known as the "null coalescing operator", but that's too
complicated, thus we just call it the falsy operator.

The expression before the '??' is evaluated.  If it evaluates to
|truthy|, this is used as the result.  Otherwise the expression after the '??'
is evaluated and used as the result.  This is most useful to have a default
value for an expression that may result in zero or empty: >
	echo theList ?? 'list is empty'
	echo GetName() ?? 'unknown'

These are similar, but not equal: >
	expr2 ?? expr1
	expr2 ? expr2 : expr1
In the second line "expr2" is evaluated twice.


expr2 and expr3						*expr2* *expr3*
---------------

expr3 || expr3 ..	logical OR		*expr-barbar*
expr4 && expr4 ..	logical AND		*expr-&&*

The "||" and "&&" operators take one argument on each side.  The arguments
are (converted to) Numbers.  The result is:

    input			 output ~
n1	n2		n1 || n2	n1 && n2 ~
|FALSE|	|FALSE|		|FALSE|		|FALSE|
|FALSE|	|TRUE|		|TRUE|		|FALSE|
|TRUE|	|FALSE|		|TRUE|		|FALSE|
|TRUE|	|TRUE|		|TRUE|		|TRUE|

The operators can be concatenated, for example: >

	&nu || &list && &shell == "csh"

Note that "&&" takes precedence over "||", so this has the meaning of: >

	&nu || (&list && &shell == "csh")

Once the result is known, the expression "short-circuits", that is, further
arguments are not evaluated.  This is like what happens in C.  For example: >

	let a = 1
	echo a || b

This is valid even if there is no variable called "b" because "a" is |TRUE|,
so the result must be |TRUE|.  Similarly below: >

	echo exists("b") && b == "yes"

This is valid whether "b" has been defined or not.  The second clause will
only be evaluated if "b" has been defined.


expr4							*expr4*
-----

expr5 {cmp} expr5

Compare two expr5 expressions, resulting in a 0 if it evaluates to false, or 1
if it evaluates to true.

			*expr-==*  *expr-!=*  *expr->*	 *expr->=*
			*expr-<*   *expr-<=*  *expr-=~*  *expr-!~*
			*expr-==#* *expr-!=#* *expr->#*  *expr->=#*
			*expr-<#*  *expr-<=#* *expr-=~#* *expr-!~#*
			*expr-==?* *expr-!=?* *expr->?*  *expr->=?*
			*expr-<?*  *expr-<=?* *expr-=~?* *expr-!~?*
			*expr-is* *expr-isnot* *expr-is#* *expr-isnot#*
			*expr-is?* *expr-isnot?*
		use 'ignorecase'    match case	   ignore case ~
equal			==		==#		==?
not equal		!=		!=#		!=?
greater than		>		>#		>?
greater than or equal	>=		>=#		>=?
smaller than		<		<#		<?
smaller than or equal	<=		<=#		<=?
regexp matches		=~		=~#		=~?
regexp doesn't match	!~		!~#		!~?
same instance		is		is#		is?
different instance	isnot		isnot#		isnot?

Examples:
"abc" ==# "Abc"	  evaluates to 0
"abc" ==? "Abc"	  evaluates to 1
"abc" == "Abc"	  evaluates to 1 if 'ignorecase' is set, 0 otherwise

							*E691* *E692*
A |List| can only be compared with a |List| and only "equal", "not equal",
"is" and "isnot" can be used.  This compares the values of the list,
recursively.  Ignoring case means case is ignored when comparing item values.

							*E735* *E736*
A |Dictionary| can only be compared with a |Dictionary| and only "equal", "not
equal", "is" and "isnot" can be used.  This compares the key/values of the
|Dictionary| recursively.  Ignoring case means case is ignored when comparing
item values.

							*E694*
A |Funcref| can only be compared with a |Funcref| and only "equal", "not
equal", "is" and "isnot" can be used.  Case is never ignored.  Whether
arguments or a Dictionary are bound (with a partial) matters.  The
Dictionaries must also be equal (or the same, in case of "is") and the
arguments must be equal (or the same).

To compare Funcrefs to see if they refer to the same function, ignoring bound
Dictionary and arguments, use |get()| to get the function name: >
	if get(Part1, 'name') == get(Part2, 'name')
	   " Part1 and Part2 refer to the same function

Using "is" or "isnot" with a |List|, |Dictionary| or |Blob| checks whether
the expressions are referring to the same |List|, |Dictionary| or |Blob|
instance.  A copy of a |List| is different from the original |List|.  When
using "is" without a |List|, |Dictionary| or |Blob|, it is equivalent to
using "equal", using "isnot" equivalent to using "not equal".  Except that
a different type means the values are different: >
	echo 4 == '4'
	1
	echo 4 is '4'
	0
	echo 0 is []
	0
"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,
and the comparison is done on Numbers.  This means that: >
	echo 0 == 'x'
	1
because 'x' converted to a Number is zero.  However: >
	echo [0] == ['x']
	0
Inside a List or Dictionary this conversion is not used.

When comparing two Strings, this is done with strcmp() or stricmp().  This
results in the mathematical difference (comparing byte values), not
necessarily the alphabetical difference in the local language.

When using the operators with a trailing '#', or the short version and
'ignorecase' is off, the comparing is done with strcmp(): case matters.

When using the operators with a trailing '?', or the short version and
'ignorecase' is set, the comparing is done with stricmp(): case is ignored.

'smartcase' is not used.

The "=~" and "!~" operators match the lefthand argument with the righthand
argument, which is used as a pattern.  See |pattern| for what a pattern is.
This matching is always done like 'magic' was set and 'cpoptions' is empty, no
matter what the actual value of 'magic' or 'cpoptions' is.  This makes scripts
portable.  To avoid backslashes in the regexp pattern to be doubled, use a
single-quote string, see |literal-string|.
Since a string is considered to be a single line, a multi-line pattern
(containing \n, backslash-n) will not match.  However, a literal NL character
can be matched like an ordinary character.  Examples:
	"foo\nbar" =~ "\n"	evaluates to 1
	"foo\nbar" =~ "\\n"	evaluates to 0


expr5 and expr6						*expr5* *expr6*
---------------
expr6 + expr6   Number addition, |List| or |Blob| concatenation	*expr-+*
expr6 - expr6   Number subtraction				*expr--*
expr6 . expr6   String concatenation				*expr-.*
expr6 .. expr6  String concatenation				*expr-..*

For |Lists| only "+" is possible and then both expr6 must be a list.  The
result is a new list with the two lists Concatenated.

For String concatenation ".." is preferred, since "." is ambiguous, it is also
used for |Dict| member access and floating point numbers.
When |vimscript-version| is 2 or higher, using "." is not allowed.

expr7 * expr7  Number multiplication				*expr-star*
expr7 / expr7  Number division					*expr-/*
expr7 % expr7  Number modulo					*expr-%*

For all, except "." and "..", Strings are converted to Numbers.
For bitwise operators see |and()|, |or()| and |xor()|.

Note the difference between "+" and ".":
	"123" + "456" = 579
	"123" . "456" = "123456"

Since '.' has the same precedence as '+' and '-', you need to read: >
	1 . 90 + 90.0
As: >
	(1 . 90) + 90.0
That works, since the String "190" is automatically converted to the Number
190, which can be added to the Float 90.0.  However: >
	1 . 90 * 90.0
Should be read as: >
	1 . (90 * 90.0)
Since '.' has lower precedence than '*'.  This does NOT work, since this
attempts to concatenate a Float and a String.

When dividing a Number by zero the result depends on the value:
	  0 / 0  = -0x80000000	(like NaN for Float)
	 >0 / 0  =  0x7fffffff	(like positive infinity)
	 <0 / 0  = -0x7fffffff	(like negative infinity)
	(before Vim 7.2 it was always 0x7fffffff)

When 64-bit Number support is enabled:
	  0 / 0  = -0x8000000000000000	(like NaN for Float)
	 >0 / 0  =  0x7fffffffffffffff	(like positive infinity)
	 <0 / 0  = -0x7fffffffffffffff	(like negative infinity)

When the righthand side of '%' is zero, the result is 0.

None of these work for |Funcref|s.

. and % do not work for Float. *E804*


expr7							*expr7*
-----
! expr7			logical NOT		*expr-!*
- expr7			unary minus		*expr-unary--*
+ expr7			unary plus		*expr-unary-+*

For '!' |TRUE| becomes |FALSE|, |FALSE| becomes |TRUE| (one).
For '-' the sign of the number is changed.
For '+' the number is unchanged.  Note: "++" has no effect.

A String will be converted to a Number first.

These three can be repeated and mixed.  Examples:
	!-1	    == 0
	!!8	    == 1
	--9	    == 9


expr8							*expr8*
-----
This expression is either |expr9| or a sequence of the alternatives below,
in any order.  E.g., these are all possible:
	expr8[expr1].name
	expr8.name[expr1]
	expr8(expr1, ...)[expr1].name
	expr8->(expr1, ...)[expr1]
Evaluation is always from left to right.

expr8[expr1]		item of String or |List|	*expr-[]* *E111*
							*E909* *subscript*
In legacy Vim script:
If expr8 is a Number or String this results in a String that contains the
expr1'th single byte from expr8.  expr8 is used as a String (a number is
automatically converted to a String), expr1 as a Number.  This doesn't
recognize multibyte encodings, see `byteidx()` for an alternative, or use
`split()` to turn the string into a list of characters.  Example, to get the
byte under the cursor: >
	:let c = getline(".")[col(".") - 1]

In Vim9 script:
If expr8 is a String this results in a String that contains the expr1'th
single character from expr8.  To use byte indexes use |strpart()|.

Index zero gives the first byte or character.  Careful: text column numbers
start with one!

If the length of the String is less than the index, the result is an empty
String.  A negative index always results in an empty string (reason: backward
compatibility).  Use [-1:] to get the last byte or character.
In Vim9 script a negative index is used like with a list: count from the end.

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
error.  Example: >
	:let item = mylist[-1]		" get last item

Generally, if a |List| index is equal to or higher than the length of the
|List|, or more negative than the length of the |List|, this results in an
error.


expr8[expr1a : expr1b]	substring or sublist		*expr-[:]*

If expr8 is a String this results in the substring with the bytes or
characters from expr1a to and including expr1b.  expr8 is used as a String,
expr1a and expr1b are used as a Number.

In legacy Vim script the indexes are byte indexes.  This doesn't recognize
multibyte encodings, see |byteidx()| for computing the indexes.  If expr8 is
a Number it is first converted to a String.

In Vim9 script the indexes are character indexes.  To use byte indexes use
|strpart()|.

The item at index expr1b is included, it is inclusive.  For an exclusive index
use the |slice()| function.

If expr1a is omitted zero is used.  If expr1b is omitted the length of the
string minus one is used.

A negative number can be used to measure from the end of the string.  -1 is
the last character, -2 the last but one, etc.

If an index goes out of range for the string characters are omitted.  If
expr1b is smaller than expr1a the result is an empty string.

Examples: >
	:let c = name[-1:]		" last byte of a string
	:let c = name[0:-1]		" the whole string
	:let c = name[-2:-2]		" last but one byte of a string
	:let s = line(".")[4:]		" from the fifth byte to the end
	:let s = s[:-3]			" remove last two bytes
<
							*slice*
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
just above. Also see |sublist| below.  Examples: >
	:let l = mylist[:3]		" first four items
	:let l = mylist[4:4]		" List with one item
	:let l = mylist[:]		" shallow copy of a List

If expr8 is a |Blob| this results in a new |Blob| with the bytes in the
indexes expr1a and expr1b, inclusive.  Examples: >
	:let b = 0zDEADBEEF
	:let bs = b[1:2]		" 0zADBE
	:let bs = b[:]			" copy of 0zDEADBEEF

Using expr8[expr1] or expr8[expr1a : expr1b] on a |Funcref| results in an
error.

Watch out for confusion between a namespace and a variable followed by a colon
for a sublist: >
	mylist[n:]     " uses variable n
	mylist[s:]     " uses namespace s:, error!


expr8.name		entry in a |Dictionary|		*expr-entry*

If expr8 is a |Dictionary| and it is followed by a dot, then the following
name will be used as a key in the |Dictionary|.  This is just like:
expr8[name].

The name must consist of alphanumeric characters, just like a variable name,
but it may start with a number.  Curly braces cannot be used.

There must not be white space before or after the dot.

Examples: >
	:let dict = {"one": 1, 2: "two"}
	:echo dict.one		" shows "1"
	:echo dict.2		" shows "two"
	:echo dict .2		" error because of space before the dot

Note that the dot is also used for String concatenation.  To avoid confusion
always put spaces around the dot for String concatenation.


expr8(expr1, ...)	|Funcref| function call

When expr8 is a |Funcref| type variable, invoke the function it refers to.


expr8->name([args])	method call			*method* *->*
expr8->{lambda}([args])
							*E276*
For methods that are also available as global functions this is the same as: >
	name(expr8 [, args])
There can also be methods specifically for the type of "expr8".

This allows for chaining, passing the value that one method returns to the
next method: >
	mylist->filter(filterexpr)->map(mapexpr)->sort()->join()
<
Example of using a lambda: >
	GetPercentage()->{x -> x * 100}()->printf('%d%%')
<
When using -> the |expr7| operators will be applied first, thus: >
	-1.234->string()
Is equivalent to: >
	(-1.234)->string()
And NOT: >
	-(1.234->string())
<
							*E274*
"->name(" must not contain white space.  There can be white space before the
"->" and after the "(", thus you can split the lines like this: >
	mylist
	\ ->filter(filterexpr)
	\ ->map(mapexpr)
	\ ->sort()
	\ ->join()

When using the lambda form there must be no white space between the } and the
(.


							*expr9*
number
------
number			number constant			*expr-number*

			*0x* *hex-number* *0o* *octal-number* *binary-number*
Decimal, Hexadecimal (starting with 0x or 0X), Binary (starting with 0b or 0B)
and Octal (starting with 0, 0o or 0O).

						*floating-point-format*
Floating point numbers can be written in two forms:

	[-+]{N}.{M}
	[-+]{N}.{M}[eE][-+]{exp}

{N} and {M} are numbers.  Both {N} and {M} must be present and can only
contain digits.
[-+] means there is an optional plus or minus sign.
{exp} is the exponent, power of 10.
Only a decimal point is accepted, not a comma.  No matter what the current
locale is.
{only when compiled with the |+float| feature}

Examples:
	123.456
	+0.0001
	55.0
	-0.123
	1.234e03
	1.0E-6
	-3.1416e+88

These are INVALID:
	3.		empty {M}
	1e40		missing .{M}

Rationale:
Before floating point was introduced, the text "123.456" was interpreted as
the two numbers "123" and "456", both converted to a string and concatenated,
resulting in the string "123456".  Since this was considered pointless, and we
could not find it intentionally being used in Vim scripts, this backwards
incompatibility was accepted in favor of being able to use the normal notation
for floating point numbers.

							*float-pi* *float-e*
A few useful values to copy&paste: >
	:let pi = 3.14159265359
	:let e  = 2.71828182846
Or, if you don't want to write them in as floating-point literals, you can
also use functions, like the following: >
	:let pi = acos(-1.0)
	:let e  = exp(1.0)
<
						*floating-point-precision*
The precision and range of floating points numbers depends on what "double"
means in the library Vim was compiled with.  There is no way to change this at
runtime.

The default for displaying a |Float| is to use 6 decimal places, like using
printf("%g", f).  You can select something else when using the |printf()|
function.  Example: >
	:echo printf('%.15e', atan(1))
<	7.853981633974483e-01



string					*string* *String* *expr-string* *E114*
------
"string"		string constant		*expr-quote*

Note that double quotes are used.

A string constant accepts these special characters:
\...	three-digit octal number (e.g., "\316")
\..	two-digit octal number (must be followed by non-digit)
\.	one-digit octal number (must be followed by non-digit)
\x..	byte specified with two hex numbers (e.g., "\x1f")
\x.	byte specified with one hex number (must be followed by non-hex char)
\X..	same as \x..
\X.	same as \x.
\u....	character specified with up to 4 hex numbers, stored according to the
	current value of 'encoding' (e.g., "\u02a4")
\U....	same as \u but allows up to 8 hex numbers.
\b	backspace <BS>
\e	escape <Esc>
\f	formfeed <FF>
\n	newline <NL>
\r	return <CR>
\t	tab <Tab>
\\	backslash
\"	double quote
\<xxx>	Special key named "xxx".  e.g. "\<C-W>" for CTRL-W.  This is for use
	in mappings, the 0x80 byte is escaped.
	To use the double quote character it must be escaped: "<M-\">".
	Don't use <Char-xxxx> to get a utf-8 character, use \uxxxx as
	mentioned above.
\<*xxx>	Like \<xxx> but prepends a modifier instead of including it in the
	character.  E.g. "\<C-w>" is one character 0x17 while "\<*C-w>" is four
	bytes: 3 for the CTRL modifier and then character "W".

Note that "\xff" is stored as the byte 255, which may be invalid in some
encodings.  Use "\u00ff" to store character 255 according to the current value
of 'encoding'.

Note that "\000" and "\x00" force the end of the string.


blob-literal				*blob-literal* *E973*
------------

Hexadecimal starting with 0z or 0Z, with an arbitrary number of bytes.
The sequence must be an even number of hex characters.  Example: >
	:let b = 0zFF00ED015DAF


literal-string						*literal-string* *E115*
---------------
'string'		string constant			*expr-'*

Note that single quotes are used.

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.

Single quoted strings are useful for patterns, so that backslashes do not need
to be doubled.  These two commands are equivalent: >
	if a =~ "\\s*"
	if a =~ '\s*'


option						*expr-option* *E112* *E113*
------
&option			option value, local value if possible
&g:option		global option value
&l:option		local option value

Examples: >
	echo "tabstop is " . &tabstop
	if &insertmode

Any option name can be used here.  See |options|.  When using the local value
and there is no buffer-local or window-local value, the global value is used
anyway.


register						*expr-register* *@r*
--------
@r			contents of register 'r'

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
register use @" or @@.  See |registers| for an explanation of the available
registers.

When using the '=' register you get the expression itself, not what it
evaluates to.  Use |eval()| to evaluate it.


nesting							*expr-nesting* *E110*
-------
(expr1)			nested expression


environment variable					*expr-env*
--------------------
$VAR			environment variable

The String value of any environment variable.  When it is not defined, the
result is an empty string.

The functions `getenv()` and `setenv()` can also be used and work for
environment variables with non-alphanumeric names.
The function `environ()` can be used to get a Dict with all environment
variables.


						*expr-env-expand*
Note that there is a difference between using $VAR directly and using
expand("$VAR").  Using it directly will only expand environment variables that
are known inside the current Vim session.  Using expand() will first try using
the environment variables known inside the current Vim session.  If that
fails, a shell will be used to expand the variable.  This can be slow, but it
does expand all variables that the shell knows about.  Example: >
	:echo $shell
	:echo expand("$shell")
The first one probably doesn't echo anything, the second echoes the $shell
variable (if your shell supports it).


internal variable					*expr-variable*
-----------------
variable		internal variable
See below |internal-variables|.


function call		*expr-function* *E116* *E118* *E119* *E120*
-------------
function(expr1, ...)	function call
See below |functions|.


lambda expression				*expr-lambda* *lambda*
-----------------
{args -> expr1}		lambda expression

A lambda expression creates a new unnamed function which returns the result of
evaluating |expr1|.  Lambda expressions differ from |user-functions| in
the following ways:

1. The body of the lambda expression is an |expr1| and not a sequence of |Ex|
   commands.
2. The prefix "a:" should not be used for arguments.  E.g.: >
	:let F = {arg1, arg2 -> arg1 - arg2}
	:echo F(5, 2)
<	3

The arguments are optional.  Example: >
	:let F = {-> 'error function'}
	:echo F()
<	error function
							*closure*
Lambda expressions can access outer scope variables and arguments.  This is
often called a closure.  Example where "i" and "a:arg" are used in a lambda
while they already exist in the function scope.  They remain valid even after
the function returns: >
	:function Foo(arg)
	:  let i = 3
	:  return {x -> x + i - a:arg}
	:endfunction
	:let Bar = Foo(4)
	:echo Bar(6)
<	5

Note that the variables must exist in the outer scope before the lambda is
defined for this to work.  See also |:func-closure|.

Lambda and closure support can be checked with: >
	if has('lambda')

Examples for using a lambda expression with |sort()|, |map()| and |filter()|: >
	:echo map([1, 2, 3], {idx, val -> val + 1})
<	[2, 3, 4] >
	:echo sort([3,7,2,1,4], {a, b -> a - b})
<	[1, 2, 3, 4, 7]

The lambda expression is also useful for Channel, Job and timer: >
	:let timer = timer_start(500,
			\ {-> execute("echo 'Handler called'", "")},
			\ {'repeat': 3})
<	Handler called
	Handler called
	Handler called

Note how execute() is used to execute an Ex command.  That's ugly though.


Lambda expressions have internal names like '<lambda>42'.  If you get an error
for a lambda expression, you can find what it is with the following command: >
	:function <lambda>42
See also: |numbered-function|

==============================================================================
3. Internal variable				*internal-variables* *E461*

An internal variable name can be made up of letters, digits and '_'.  But it
cannot start with a digit.  It's also possible to use curly braces, see
|curly-braces-names|.

An internal variable is created with the ":let" command |:let|.
An internal variable is explicitly destroyed with the ":unlet" command
|:unlet|.
Using a name that is not an internal variable or refers to a variable that has
been destroyed results in an error.

						*variable-scope*
There are several name spaces for variables.  Which one is to be used is
specified by what is prepended:

		(nothing) In a function: local to a function; otherwise: global
|buffer-variable|    b:	  Local to the current buffer.
|window-variable|    w:	  Local to the current window.
|tabpage-variable|   t:	  Local to the current tab page.
|global-variable|    g:	  Global.
|local-variable|     l:	  Local to a function.
|script-variable|    s:	  Local to a |:source|'ed Vim script.
|function-argument|  a:	  Function argument (only inside a function).
|vim-variable|       v:	  Global, predefined by Vim.

The scope name by itself can be used as a |Dictionary|.  For example, to
delete all script-local variables: >
	:for k in keys(s:)
	:    unlet s:[k]
	:endfor

Note: in Vim9 script this is different, see |vim9-scopes|.

						*buffer-variable* *b:var* *b:*
A variable name that is preceded with "b:" is local to the current buffer.
Thus you can have several "b:foo" variables, one for each buffer.
This kind of variable is deleted when the buffer is wiped out or deleted with
|:bdelete|.

One local buffer variable is predefined:
					*b:changedtick* *changetick*
b:changedtick	The total number of changes to the current buffer.  It is
		incremented for each change.  An undo command is also a change
		in this case.  Resetting 'modified' when writing the buffer is
		also counted.
		This can be used to perform an action only when the buffer has
		changed.  Example: >
		    :if my_changedtick != b:changedtick
		    :	let my_changedtick = b:changedtick
		    :	call My_Update()
		    :endif
<		You cannot change or delete the b:changedtick variable.

						*window-variable* *w:var* *w:*
A variable name that is preceded with "w:" is local to the current window.  It
is deleted when the window is closed.

						*tabpage-variable* *t:var* *t:*
A variable name that is preceded with "t:" is local to the current tab page,
It is deleted when the tab page is closed. {not available when compiled
without the |+windows| feature}

						*global-variable* *g:var* *g:*
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
place if you like.

						*local-variable* *l:var* *l:*
Inside functions local variables are accessed without prepending anything.
But you can also prepend "l:" if you like.  However, without prepending "l:"
you may run into reserved variable names.  For example "count".  By itself it
refers to "v:count".  Using "l:count" you can have a local variable with the
same name.

						*script-variable* *s:var*
In a Vim script variables starting with "s:" can be used.  They cannot be
accessed from outside of the scripts, thus are local to the script.

They can be used in:
- commands executed while the script is sourced
- functions defined in the script
- autocommands defined in the script
- functions and autocommands defined in functions and autocommands which were
  defined in the script (recursively)
- user defined commands defined in the script
Thus not in:
- other scripts sourced from this one
- mappings
- menus
- etc.

Script variables can be used to avoid conflicts with global variable names.
Take this example: >

	let s:counter = 0
	function MyCounter()
	  let s:counter = s:counter + 1
	  echo s:counter
	endfunction
	command Tick call MyCounter()

You can now invoke "Tick" from any script, and the "s:counter" variable in
that script will not be changed, only the "s:counter" in the script where
"Tick" was defined is used.

Another example that does the same: >

	let s:counter = 0
	command Tick let s:counter = s:counter + 1 | echo s:counter

When calling a function and invoking a user-defined command, the context for
script variables is set to the script where the function or command was
defined.

The script variables are also available when a function is defined inside a
function that is defined in a script.  Example: >

	let s:counter = 0
	function StartCounting(incr)
	  if a:incr
	    function MyCounter()
	      let s:counter = s:counter + 1
	    endfunction
	  else
	    function MyCounter()
	      let s:counter = s:counter - 1
	    endfunction
	  endif
	endfunction

This defines the MyCounter() function either for counting up or counting down
when calling StartCounting().  It doesn't matter from where StartCounting() is
called, the s:counter variable will be accessible in MyCounter().

When the same script is sourced again it will use the same script variables.
They will remain valid as long as Vim is running.  This can be used to
maintain a counter: >

	if !exists("s:counter")
	  let s:counter = 1
	  echo "script executed for the first time"
	else
	  let s:counter = s:counter + 1
	  echo "script executed " . s:counter . " times now"
	endif

Note that this means that filetype plugins don't get a different set of script
variables for each buffer.  Use local buffer variables instead |b:var|.


PREDEFINED VIM VARIABLES			*vim-variable* *v:var* *v:*
								*E963*
Some variables can be set by the user, but the type cannot be changed.

					*v:argv* *argv-variable*
v:argv		The command line arguments Vim was invoked with.  This is a
		list of strings.  The first item is the Vim command.

					*v:beval_col* *beval_col-variable*
v:beval_col	The number of the column, over which the mouse pointer is.
		This is the byte index in the |v:beval_lnum| line.
		Only valid while evaluating the 'balloonexpr' option.

					*v:beval_bufnr* *beval_bufnr-variable*
v:beval_bufnr	The number of the buffer, over which the mouse pointer is. Only
		valid while evaluating the 'balloonexpr' option.

					*v:beval_lnum* *beval_lnum-variable*
v:beval_lnum	The number of the line, over which the mouse pointer is. Only
		valid while evaluating the 'balloonexpr' option.

					*v:beval_text* *beval_text-variable*
v:beval_text	The text under or after the mouse pointer.  Usually a word as
		it is useful for debugging a C program.  'iskeyword' applies,
		but a dot and "->" before the position is included.  When on a
		']' the text before it is used, including the matching '[' and
		word before it.  When on a Visual area within one line the
		highlighted text is used.  Also see |<cexpr>|.
		Only valid while evaluating the 'balloonexpr' option.

					*v:beval_winnr* *beval_winnr-variable*
v:beval_winnr	The number of the window, over which the mouse pointer is. Only
		valid while evaluating the 'balloonexpr' option.  The first
		window has number zero (unlike most other places where a
		window gets a number).

					*v:beval_winid* *beval_winid-variable*
v:beval_winid	The |window-ID| of the window, over which the mouse pointer
		is.  Otherwise like v:beval_winnr.

					*v:char* *char-variable*
v:char		Argument for evaluating 'formatexpr' and used for the typed
		character when using <expr> in an abbreviation |:map-<expr>|.
		It is also used by the |InsertCharPre| and |InsertEnter| events.

			*v:charconvert_from* *charconvert_from-variable*
v:charconvert_from
		The name of the character encoding of a file to be converted.
		Only valid while evaluating the 'charconvert' option.

			*v:charconvert_to* *charconvert_to-variable*
v:charconvert_to
		The name of the character encoding of a file after conversion.
		Only valid while evaluating the 'charconvert' option.

					*v:cmdarg* *cmdarg-variable*
v:cmdarg	This variable is used for two purposes:
		1. The extra arguments given to a file read/write command.
		   Currently these are "++enc=" and "++ff=".  This variable is
		   set before an autocommand event for a file read/write
		   command is triggered.  There is a leading space to make it
		   possible to append this variable directly after the
		   read/write command.  Note: The "+cmd" argument isn't
		   included here, because it will be executed anyway.
		2. When printing a PostScript file with ":hardcopy" this is
		   the argument for the ":hardcopy" command.  This can be used
		   in 'printexpr'.

					*v:cmdbang* *cmdbang-variable*
v:cmdbang	Set like v:cmdarg for a file read/write command.  When a "!"
		was used the value is 1, otherwise it is 0.  Note that this
		can only be used in autocommands.  For user commands |<bang>|
		can be used.
						*v:collate* *collate-variable*
v:collate	The current locale setting for collation order of the runtime
		environment.  This allows Vim scripts to be aware of the
		current locale encoding.  Technical: it's the value of
		LC_COLLATE.  When not using a locale the value is "C".
		This variable can not be set directly, use the |:language|
		command.
		See |multi-lang|.

				*v:completed_item* *completed_item-variable*
v:completed_item
		|Dictionary| containing the |complete-items| for the most
		recently completed word after |CompleteDone|.  The
		|Dictionary| is empty if the completion failed.

					*v:count* *count-variable*
v:count		The count given for the last Normal mode command.  Can be used
		to get the count before a mapping.  Read-only.  Example: >
	:map _x :<C-U>echo "the count is " . v:count<CR>
<		Note: The <C-U> is required to remove the line range that you
		get when typing ':' after a count.
		When there are two counts, as in "3d2w", they are multiplied,
		just like what happens in the command, "d6w" for the example.
		Also used for evaluating the 'formatexpr' option.
		"count" also works, for backwards compatibility, unless
		|scriptversion| is 3 or higher.

					*v:count1* *count1-variable*
v:count1	Just like "v:count", but defaults to one when no count is
		used.

						*v:ctype* *ctype-variable*
v:ctype		The current locale setting for characters of the runtime
		environment.  This allows Vim scripts to be aware of the
		current locale encoding.  Technical: it's the value of
		LC_CTYPE.  When not using a locale the value is "C".
		This variable can not be set directly, use the |:language|
		command.
		See |multi-lang|.

					*v:dying* *dying-variable*
v:dying		Normally zero.  When a deadly signal is caught it's set to
		one.  When multiple signals are caught the number increases.
		Can be used in an autocommand to check if Vim didn't
		terminate normally. {only works on Unix}
		Example: >
	:au VimLeave * if v:dying | echo "\nAAAAaaaarrrggghhhh!!!\n" | endif
<		Note: if another deadly signal is caught when v:dying is one,
		VimLeave autocommands will not be executed.

					*v:exiting* *exiting-variable*
v:exiting	Vim exit code.  Normally zero, non-zero when something went
		wrong.  The value is v:null before invoking the |VimLeavePre|
		and |VimLeave| autocmds.  See |:q|, |:x| and |:cquit|.
		Example: >
			:au VimLeave * echo "Exit value is " .. v:exiting
<
					*v:echospace* *echospace-variable*
v:echospace	Number of screen cells that can be used for an `:echo` message
		in the last screen line before causing the |hit-enter-prompt|.
		Depends on 'showcmd', 'ruler' and 'columns'.  You need to
		check 'cmdheight' for whether there are full-width lines
		available above the last line.

					*v:errmsg* *errmsg-variable*
v:errmsg	Last given error message.  It's allowed to set this variable.
		Example: >
	:let v:errmsg = ""
	:silent! next
	:if v:errmsg != ""
	:  ... handle error
<		"errmsg" also works, for backwards compatibility, unless
		|scriptversion| is 3 or higher.

				*v:errors* *errors-variable* *assert-return*
v:errors	Errors found by assert functions, such as |assert_true()|.
		This is a list of strings.
		The assert functions append an item when an assert fails.
		The return value indicates this: a one is returned if an item
		was added to v:errors, otherwise zero is returned.
		To remove old results make it empty: >
	:let v:errors = []
<		If v:errors is set to anything but a list it is made an empty
		list by the assert function.

					*v:event* *event-variable*
v:event		Dictionary containing information about the current
		|autocommand|.  See the specific event for what it puts in
		this dictionary.
		The dictionary is emptied when the |autocommand| finishes,
		please refer to |dict-identity| for how to get an independent
		copy of it.  Use |deepcopy()| if you want to keep the
		information after the event triggers.  Example: >
			au TextYankPost * let g:foo = deepcopy(v:event)
<
					*v:exception* *exception-variable*
v:exception	The value of the exception most recently caught and not
		finished.  See also |v:throwpoint| and |throw-variables|.
		Example: >
	:try
	:  throw "oops"
	:catch /.*/
	:  echo "caught " .. v:exception
	:endtry
<		Output: "caught oops".

					*v:false* *false-variable*
v:false		A Number with value zero. Used to put "false" in JSON.  See
		|json_encode()|.
		When used as a string this evaluates to "v:false". >
			echo v:false
<			v:false ~
		That is so that eval() can parse the string back to the same
		value.  Read-only.

					*v:fcs_reason* *fcs_reason-variable*
v:fcs_reason	The reason why the |FileChangedShell| event was triggered.
		Can be used in an autocommand to decide what to do and/or what
		to set v:fcs_choice to.  Possible values:
			deleted		file no longer exists
			conflict	file contents, mode or timestamp was
					changed and buffer is modified
			changed		file contents has changed
			mode		mode of file changed
			time		only file timestamp changed

					*v:fcs_choice* *fcs_choice-variable*
v:fcs_choice	What should happen after a |FileChangedShell| event was
		triggered.  Can be used in an autocommand to tell Vim what to
		do with the affected buffer:
			reload		Reload the buffer (does not work if
					the file was deleted).
			ask		Ask the user what to do, as if there
					was no autocommand.  Except that when
					only the timestamp changed nothing
					will happen.
			<empty>		Nothing, the autocommand should do
					everything that needs to be done.
		The default is empty.  If another (invalid) value is used then
		Vim behaves like it is empty, there is no warning message.

					*v:fname_in* *fname_in-variable*
v:fname_in	The name of the input file.  Valid while evaluating:
			option		used for ~
			'charconvert'	file to be converted
			'diffexpr'	original file
			'patchexpr'	original file
			'printexpr'	file to be printed
		And set to the swap file name for |SwapExists|.

					*v:fname_out* *fname_out-variable*
v:fname_out	The name of the output file.  Only valid while
		evaluating:
			option		used for ~
			'charconvert'	resulting converted file (*)
			'diffexpr'	output of diff
			'patchexpr'	resulting patched file
		(*) When doing conversion for a write command (e.g., ":w
		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
		file and different from v:fname_in.

					*v:fname_new* *fname_new-variable*
v:fname_new	The name of the new version of the file.  Only valid while
		evaluating 'diffexpr'.

					*v:fname_diff* *fname_diff-variable*
v:fname_diff	The name of the diff (patch) file.  Only valid while
		evaluating 'patchexpr'.

					*v:folddashes* *folddashes-variable*
v:folddashes	Used for 'foldtext': dashes representing foldlevel of a closed
		fold.
		Read-only in the |sandbox|. |fold-foldtext|

					*v:foldlevel* *foldlevel-variable*
v:foldlevel	Used for 'foldtext': foldlevel of closed fold.
		Read-only in the |sandbox|. |fold-foldtext|

					*v:foldend* *foldend-variable*
v:foldend	Used for 'foldtext': last line of closed fold.
		Read-only in the |sandbox|. |fold-foldtext|

					*v:foldstart* *foldstart-variable*
v:foldstart	Used for 'foldtext': first line of closed fold.
		Read-only in the |sandbox|. |fold-foldtext|

					*v:hlsearch* *hlsearch-variable*
v:hlsearch	Variable that indicates whether search highlighting is on.
		Setting it makes sense only if 'hlsearch' is enabled which
		requires |+extra_search|. Setting this variable to zero acts
		like the |:nohlsearch| command, setting it to one acts like >
			let &hlsearch = &hlsearch
<		Note that the value is restored when returning from a
		function. |function-search-undo|.

					*v:insertmode* *insertmode-variable*
v:insertmode	Used for the |InsertEnter| and |InsertChange| autocommand
		events.  Values:
			i	Insert mode
			r	Replace mode
			v	Virtual Replace mode

						*v:key* *key-variable*
v:key		Key of the current item of a |Dictionary|.  Only valid while
		evaluating the expression used with |map()| and |filter()|.
		Read-only.

						*v:lang* *lang-variable*
v:lang		The current locale setting for messages of the runtime
		environment.  This allows Vim scripts to be aware of the
		current language.  Technical: it's the value of LC_MESSAGES.
		The value is system dependent.
		This variable can not be set directly, use the |:language|
		command.
		It can be different from |v:ctype| when messages are desired
		in a different language than what is used for character
		encoding.  See |multi-lang|.

						*v:lc_time* *lc_time-variable*
v:lc_time	The current locale setting for time messages of the runtime
		environment.  This allows Vim scripts to be aware of the
		current language.  Technical: it's the value of LC_TIME.
		This variable can not be set directly, use the |:language|
		command.  See |multi-lang|.

						*v:lnum* *lnum-variable*
v:lnum		Line number for the 'foldexpr' |fold-expr|, 'formatexpr' and
		'indentexpr' expressions, tab page number for 'guitablabel'
		and 'guitabtooltip'.  Only valid while one of these
		expressions is being evaluated.  Read-only when in the
		|sandbox|.

					*v:mouse_win* *mouse_win-variable*
v:mouse_win	Window number for a mouse click obtained with |getchar()|.
		First window has number 1, like with |winnr()|.  The value is
		zero when there was no mouse button click.

					*v:mouse_winid* *mouse_winid-variable*
v:mouse_winid	Window ID for a mouse click obtained with |getchar()|.
		The value is zero when there was no mouse button click.

					*v:mouse_lnum* *mouse_lnum-variable*
v:mouse_lnum	Line number for a mouse click obtained with |getchar()|.
		This is the text line number, not the screen line number.  The
		value is zero when there was no mouse button click.

					*v:mouse_col* *mouse_col-variable*
v:mouse_col	Column number for a mouse click obtained with |getchar()|.
		This is the screen column number, like with |virtcol()|.  The
		value is zero when there was no mouse button click.

					*v:none* *none-variable* *None*
v:none		An empty String. Used to put an empty item in JSON.  See
		|json_encode()|.
		This can also be used as a function argument to use the
		default value, see |none-function_argument|.
		When used as a number this evaluates to zero.
		When used as a string this evaluates to "v:none". >
			echo v:none
<			v:none ~
		That is so that eval() can parse the string back to the same
		value.  Read-only.

					*v:null* *null-variable*
v:null		An empty String. Used to put "null" in JSON.  See
		|json_encode()|.
		When used as a number this evaluates to zero.
		When used as a string this evaluates to "v:null". >
			echo v:null
<			v:null ~
		That is so that eval() can parse the string back to the same
		value.  Read-only.

					*v:numbersize* *numbersize-variable*
v:numbersize	Number of bits in a Number.  This is normally 64, but on some
		systems it may be 32.

					*v:oldfiles* *oldfiles-variable*
v:oldfiles	List of file names that is loaded from the |viminfo| file on
		startup.  These are the files that Vim remembers marks for.
		The length of the List is limited by the ' argument of the
		'viminfo' option (default is 100).
		When the |viminfo| file is not used the List is empty.
		Also see |:oldfiles| and |c_#<|.
		The List can be modified, but this has no effect on what is
		stored in the |viminfo| file later.  If you use values other
		than String this will cause trouble.
		{only when compiled with the |+viminfo| feature}

						    *v:option_new*
v:option_new    New value of the option. Valid while executing an |OptionSet|
		autocommand.
						    *v:option_old*
v:option_old    Old value of the option. Valid while executing an |OptionSet|
		autocommand. Depending on the command used for setting and the
		kind of option this is either the local old value or the
		global old value.
						    *v:option_oldlocal*
v:option_oldlocal
		Old local value of the option. Valid while executing an
		|OptionSet| autocommand.
						    *v:option_oldglobal*
v:option_oldglobal
		Old global value of the option. Valid while executing an
		|OptionSet| autocommand.
						    *v:option_type*
v:option_type   Scope of the set command. Valid while executing an
		|OptionSet| autocommand. Can be either "global" or "local"
						    *v:option_command*
v:option_command
		Command used to set the option. Valid while executing an
		|OptionSet| autocommand.
			value		option was set via   ~
			"setlocal"	|:setlocal| or ":let l:xxx"
			"setglobal"	|:setglobal| or ":let g:xxx"
			"set"		|:set| or |:let|
			"modeline"	|modeline|
					*v:operator* *operator-variable*
v:operator	The last operator given in Normal mode.  This is a single
		character except for commands starting with <g> or <z>,
		in which case it is two characters.  Best used alongside
		|v:prevcount| and |v:register|.  Useful if you want to cancel
		Operator-pending mode and then use the operator, e.g.: >
			:omap O <Esc>:call MyMotion(v:operator)<CR>
<		The value remains set until another operator is entered, thus
		don't expect it to be empty.
		v:operator is not set for |:delete|, |:yank| or other Ex
		commands.
		Read-only.

					*v:prevcount* *prevcount-variable*
v:prevcount	The count given for the last but one Normal mode command.
		This is the v:count value of the previous command.  Useful if
		you want to cancel Visual or Operator-pending mode and then
		use the count, e.g.: >
			:vmap % <Esc>:call MyFilter(v:prevcount)<CR>
<		Read-only.

					*v:profiling* *profiling-variable*
v:profiling	Normally zero.  Set to one after using ":profile start".
		See |profiling|.

					*v:progname* *progname-variable*
v:progname	Contains the name (with path removed) with which Vim was
		invoked.  Allows you to do special initialisations for |view|,
		|evim| etc., or any other name you might symlink to Vim.
		Read-only.

					*v:progpath* *progpath-variable*
v:progpath	Contains the command with which Vim was invoked, in a form
		that when passed to the shell will run the same Vim executable
		as the current one (if $PATH remains unchanged).
		Useful if you want to message a Vim server using a
		|--remote-expr|.
		To get the full path use: >
			echo exepath(v:progpath)
<		If the command has a relative path it will be expanded to the
		full path, so that it still works after `:cd`. Thus starting
		"./vim" results in "/home/user/path/to/vim/src/vim".
		On Linux and other systems it will always be the full path.
		On Mac it may just be "vim" and using exepath() as mentioned
		above should be used to get the full path.
		On MS-Windows the executable may be called "vim.exe", but the
		".exe" is not added to v:progpath.
		Read-only.

					*v:register* *register-variable*
v:register	The name of the register in effect for the current normal mode
		command (regardless of whether that command actually used a
		register).  Or for the currently executing normal mode mapping
		(use this in custom commands that take a register).
		If none is supplied it is the default register '"', unless
		'clipboard' contains "unnamed" or "unnamedplus", then it is
		'*' or '+'.
		Also see |getreg()| and |setreg()|

					*v:scrollstart* *scrollstart-variable*
v:scrollstart	String describing the script or function that caused the
		screen to scroll up.  It's only set when it is empty, thus the
		first reason is remembered.  It is set to "Unknown" for a
		typed command.
		This can be used to find out why your script causes the
		hit-enter prompt.

					*v:servername* *servername-variable*
v:servername	The resulting registered |client-server-name| if any.
		Read-only.


v:searchforward			*v:searchforward* *searchforward-variable*
		Search direction:  1 after a forward search, 0 after a
		backward search.  It is reset to forward when directly setting
		the last search pattern, see |quote/|.
		Note that the value is restored when returning from a
		function. |function-search-undo|.
		Read-write.

					*v:shell_error* *shell_error-variable*
v:shell_error	Result of the last shell command.  When non-zero, the last
		shell command had an error.  When zero, there was no problem.
		This only works when the shell returns the error code to Vim.
		The value -1 is often used when the command could not be
		executed.  Read-only.
		Example: >
	:!mv foo bar
	:if v:shell_error
	:  echo 'could not rename "foo" to "bar"!'
	:endif
<		"shell_error" also works, for backwards compatibility, unless
		|scriptversion| is 3 or higher.

					*v:statusmsg* *statusmsg-variable*
v:statusmsg	Last given status message.  It's allowed to set this variable.

					*v:swapname* *swapname-variable*
v:swapname	Only valid when executing |SwapExists| autocommands: Name of
		the swap file found.  Read-only.

					*v:swapchoice* *swapchoice-variable*
v:swapchoice	|SwapExists| autocommands can set this to the selected choice
		for handling an existing swap file:
			'o'	Open read-only
			'e'	Edit anyway
			'r'	Recover
			'd'	Delete swapfile
			'q'	Quit
			'a'	Abort
		The value should be a single-character string.  An empty value
		results in the user being asked, as would happen when there is
		no SwapExists autocommand.  The default is empty.

					*v:swapcommand* *swapcommand-variable*
v:swapcommand	Normal mode command to be executed after a file has been
		opened.  Can be used for a |SwapExists| autocommand to have
		another Vim open the file and jump to the right place.  For
		example, when jumping to a tag the value is ":tag tagname\r".
		For ":edit +cmd file" the value is ":cmd\r".

				*v:t_TYPE* *v:t_bool* *t_bool-variable*
v:t_bool	Value of |Boolean| type.  Read-only.  See: |type()|
					*v:t_channel* *t_channel-variable*
v:t_channel	Value of |Channel| type.  Read-only.  See: |type()|
					*v:t_dict* *t_dict-variable*
v:t_dict	Value of |Dictionary| type.  Read-only.  See: |type()|
					*v:t_float* *t_float-variable*
v:t_float	Value of |Float| type.  Read-only.  See: |type()|
					*v:t_func* *t_func-variable*
v:t_func	Value of |Funcref| type.  Read-only.  See: |type()|
					*v:t_job* *t_job-variable*
v:t_job		Value of |Job| type.  Read-only.  See: |type()|
					*v:t_list* *t_list-variable*
v:t_list	Value of |List| type.  Read-only.  See: |type()|
					*v:t_none* *t_none-variable*
v:t_none	Value of |None| type.  Read-only.  See: |type()|
					*v:t_number* *t_number-variable*
v:t_number	Value of |Number| type.  Read-only.  See: |type()|
					*v:t_string* *t_string-variable*
v:t_string	Value of |String| type.  Read-only.  See: |type()|
					*v:t_blob* *t_blob-variable*
v:t_blob	Value of |Blob| type.  Read-only.  See: |type()|

				*v:termresponse* *termresponse-variable*
v:termresponse	The escape sequence returned by the terminal for the |t_RV|
		termcap entry.  It is set when Vim receives an escape sequence
		that starts with ESC [ or CSI, then '>' or '?' and ends in a
		'c', with only digits and ';' in between.
		When this option is set, the TermResponse autocommand event is
		fired, so that you can react to the response from the
		terminal.  You can use |terminalprops()| to see what Vim
		figured out about the terminal.
		The response from a new xterm is: "<Esc>[> Pp ; Pv ; Pc c".  Pp
		is the terminal type: 0 for vt100 and 1 for vt220.  Pv is the
		patch level (since this was introduced in patch 95, it's
		always 95 or bigger).  Pc is always zero.
		{only when compiled with |+termresponse| feature}

						*v:termblinkresp*
v:termblinkresp	The escape sequence returned by the terminal for the |t_RC|
		termcap entry.  This is used to find out whether the terminal
		cursor is blinking. This is used by |term_getcursor()|.

						*v:termstyleresp*
v:termstyleresp	The escape sequence returned by the terminal for the |t_RS|
		termcap entry.  This is used to find out what the shape of the
		cursor is.  This is used by |term_getcursor()|.

						*v:termrbgresp*
v:termrbgresp	The escape sequence returned by the terminal for the |t_RB|
		termcap entry.  This is used to find out what the terminal
		background color is, see 'background'.

						*v:termrfgresp*
v:termrfgresp	The escape sequence returned by the terminal for the |t_RF|
		termcap entry.  This is used to find out what the terminal
		foreground color is.

						*v:termu7resp*
v:termu7resp	The escape sequence returned by the terminal for the |t_u7|
		termcap entry.  This is used to find out what the terminal
		does with ambiguous width characters, see 'ambiwidth'.

					*v:testing* *testing-variable*
v:testing	Must be set before using `test_garbagecollect_now()`.
		Also, when set certain error messages won't be shown for 2
		seconds. (e.g. "'dictionary' option is empty")

				*v:this_session* *this_session-variable*
v:this_session	Full filename of the last loaded or saved session file.  See
		|:mksession|.  It is allowed to set this variable.  When no
		session file has been saved, this variable is empty.
		"this_session" also works, for backwards compatibility, unless
		|scriptversion| is 3 or higher

					*v:throwpoint* *throwpoint-variable*
v:throwpoint	The point where the exception most recently caught and not
		finished was thrown.  Not set when commands are typed.  See
		also |v:exception| and |throw-variables|.
		Example: >
	:try
	:  throw "oops"
	:catch /.*/
	:  echo "Exception from" v:throwpoint
	:endtry
<		Output: "Exception from test.vim, line 2"

						*v:true* *true-variable*
v:true		A Number with value one. Used to put "true" in JSON.  See
		|json_encode()|.
		When used as a string this evaluates to "v:true". >
			echo v:true
<			v:true ~
		That is so that eval() can parse the string back to the same
		value.  Read-only.
						*v:val* *val-variable*
v:val		Value of the current item of a |List| or |Dictionary|.  Only
		valid while evaluating the expression used with |map()| and
		|filter()|.  Read-only.

					*v:version* *version-variable*
v:version	Version number of Vim: Major version number times 100 plus
		minor version number.  Version 5.0 is 500.  Version 5.1
		is 501.  Read-only.  "version" also works, for backwards
		compatibility, unless |scriptversion| is 3 or higher.
		Use |has()| to check if a certain patch was included, e.g.: >
			if has("patch-7.4.123")
<		Note that patch numbers are specific to the version, thus both
		version 5.0 and 5.1 may have a patch 123, but these are
		completely different.

					*v:versionlong* *versionlong-variable*
v:versionlong	Like v:version, but also including the patchlevel in the last
		four digits.  Version 8.1 with patch 123 has value 8010123.
		This can be used like this: >
			if v:versionlong >= 8010123
<		However, if there are gaps in the list of patches included
		this will not work well.  This can happen if a recent patch
		was included into an older version, e.g. for a security fix.
		Use the has() function to make sure the patch is actually
		included.

				*v:vim_did_enter* *vim_did_enter-variable*
v:vim_did_enter	Zero until most of startup is done.  It is set to one just
		before |VimEnter| autocommands are triggered.

					*v:warningmsg* *warningmsg-variable*
v:warningmsg	Last given warning message.  It's allowed to set this variable.

					*v:windowid* *windowid-variable*
v:windowid	When any X11 based GUI is running or when running in a
		terminal and Vim connects to the X server (|-X|) this will be
		set to the window ID.
		When an MS-Windows GUI is running this will be set to the
		window handle.
		Otherwise the value is zero.
		Note: for windows inside Vim use |winnr()| or |win_getid()|,
		see |window-ID|.

==============================================================================
4. Builtin Functions					*functions*

See |function-list| for a list grouped by what the function is used for.

(Use CTRL-] on the function name to jump to the full explanation.)

USAGE				RESULT	DESCRIPTION	~

abs({expr})			Float or Number  absolute value of {expr}
acos({expr})			Float	arc cosine of {expr}
add({object}, {item})		List/Blob   append {item} to {object}
and({expr}, {expr})		Number	bitwise AND
append({lnum}, {text})		Number	append {text} below line {lnum}
appendbufline({expr}, {lnum}, {text})
				Number	append {text} below line {lnum}
					in buffer {expr}
argc([{winid}])			Number	number of files in the argument list
argidx()			Number	current index in the argument list
arglistid([{winnr} [, {tabnr}]]) Number	argument list id
argv({nr} [, {winid}])		String	{nr} entry of the argument list
argv([-1, {winid}])		List	the argument list
asin({expr})			Float	arc sine of {expr}
assert_beeps({cmd})		Number	assert {cmd} causes a beep
assert_equal({exp}, {act} [, {msg}])
				Number	assert {exp} is equal to {act}
assert_equalfile({fname-one}, {fname-two} [, {msg}])
				Number	assert file contents are equal
assert_exception({error} [, {msg}])
				Number	assert {error} is in v:exception
assert_fails({cmd} [, {error} [, {msg} [, {lnum} [, {context}]]]])
				Number	assert {cmd} fails
assert_false({actual} [, {msg}])
				Number	assert {actual} is false
assert_inrange({lower}, {upper}, {actual} [, {msg}])
				Number	assert {actual} is inside the range
assert_match({pat}, {text} [, {msg}])
				Number	assert {pat} matches {text}
assert_notequal({exp}, {act} [, {msg}])
				Number	assert {exp} is not equal {act}
assert_notmatch({pat}, {text} [, {msg}])
				Number	assert {pat} not matches {text}
assert_report({msg})		Number	report a test failure
assert_true({actual} [, {msg}])	Number	assert {actual} is true
atan({expr})			Float	arc tangent of {expr}
atan2({expr1}, {expr2})		Float	arc tangent of {expr1} / {expr2}
balloon_gettext()		String	current text in the balloon
balloon_show({expr})		none	show {expr} inside the balloon
balloon_split({msg})		List	split {msg} as used for a balloon
browse({save}, {title}, {initdir}, {default})
				String	put up a file requester
browsedir({title}, {initdir})	String	put up a directory requester
bufadd({name})			Number	add a buffer to the buffer list
bufexists({expr})		Number	|TRUE| if buffer {expr} exists
buflisted({expr})		Number	|TRUE| if buffer {expr} is listed
bufload({expr})			Number	load buffer {expr} if not loaded yet
bufloaded({expr})		Number	|TRUE| if buffer {expr} is loaded
bufname([{expr}])		String	Name of the buffer {expr}
bufnr([{expr} [, {create}]])	Number	Number of the buffer {expr}
bufwinid({expr})		Number	window ID of buffer {expr}
bufwinnr({expr})		Number	window number of buffer {expr}
byte2line({byte})		Number	line number at byte count {byte}
byteidx({expr}, {nr})		Number	byte index of {nr}'th char in {expr}
byteidxcomp({expr}, {nr})	Number	byte index of {nr}'th char in {expr}
call({func}, {arglist} [, {dict}])
				any	call {func} with arguments {arglist}
ceil({expr})			Float	round {expr} up
ch_canread({handle})		Number	check if there is something to read
ch_close({handle})		none	close {handle}
ch_close_in({handle})		none	close in part of {handle}
ch_evalexpr({handle}, {expr} [, {options}])
				any	evaluate {expr} on JSON {handle}
ch_evalraw({handle}, {string} [, {options}])
				any	evaluate {string} on raw {handle}
ch_getbufnr({handle}, {what})	Number	get buffer number for {handle}/{what}
ch_getjob({channel})		Job	get the Job of {channel}
ch_info({handle})		String	info about channel {handle}
ch_log({msg} [, {handle}])	none	write {msg} in the channel log file
ch_logfile({fname} [, {mode}])	none	start logging channel activity
ch_open({address} [, {options}])
				Channel	open a channel to {address}
ch_read({handle} [, {options}]) String	read from {handle}
ch_readblob({handle} [, {options}])
				Blob	read Blob from {handle}
ch_readraw({handle} [, {options}])
				String	read raw from {handle}
ch_sendexpr({handle}, {expr} [, {options}])
				any	send {expr} over JSON {handle}
ch_sendraw({handle}, {expr} [, {options}])
				any	send {expr} over raw {handle}
ch_setoptions({handle}, {options})
				none	set options for {handle}
ch_status({handle} [, {options}])
				String	status of channel {handle}
changenr()			Number	current change number
char2nr({expr} [, {utf8}])	Number	ASCII/UTF8 value of first char in {expr}
charclass({string})		Number	character class of {string}
charcol({expr})			Number	column number of cursor or mark
charidx({string}, {idx} [, {countcc}])
				Number  char index of byte {idx} in {string}
chdir({dir})			String	change current working directory
cindent({lnum})			Number	C indent for line {lnum}
clearmatches([{win}])		none	clear all matches
col({expr})			Number	column byte index of cursor or mark
complete({startcol}, {matches}) none	set Insert mode completion
complete_add({expr})		Number	add completion match
complete_check()		Number	check for key typed during completion
complete_info([{what}])		Dict	get current completion information
confirm({msg} [, {choices} [, {default} [, {type}]]])
				Number	number of choice picked by user
copy({expr})			any	make a shallow copy of {expr}
cos({expr})			Float	cosine of {expr}
cosh({expr})			Float	hyperbolic cosine of {expr}
count({comp}, {expr} [, {ic} [, {start}]])
				Number	count how many {expr} are in {comp}
cscope_connection([{num}, {dbpath} [, {prepend}]])
				Number	checks existence of cscope connection
cursor({lnum}, {col} [, {off}])
				Number	move cursor to {lnum}, {col}, {off}
cursor({list})			Number	move cursor to position in {list}
debugbreak({pid})		Number  interrupt process being debugged
deepcopy({expr} [, {noref}])	any	make a full copy of {expr}
delete({fname} [, {flags}])	Number	delete the file or directory {fname}
deletebufline({expr}, {first} [, {last}])
				Number	delete lines from buffer {expr}
did_filetype()			Number	|TRUE| if FileType autocmd event used
diff_filler({lnum})		Number	diff filler lines about {lnum}
diff_hlID({lnum}, {col})	Number	diff highlighting at {lnum}/{col}
echoraw({expr})			none	output {expr} as-is
empty({expr})			Number	|TRUE| if {expr} is empty
environ()			Dict	return environment variables
escape({string}, {chars})	String	escape {chars} in {string} with '\'
eval({string})			any	evaluate {string} into its value
eventhandler()			Number	|TRUE| if inside an event handler
executable({expr})		Number	1 if executable {expr} exists
execute({command})		String	execute {command} and get the output
exepath({expr})			String	full path of the command {expr}
exists({expr})			Number	|TRUE| if {expr} exists
exp({expr})			Float	exponential of {expr}
expand({expr} [, {nosuf} [, {list}]])
				any	expand special keywords in {expr}
expandcmd({expr})		String	expand {expr} like with `:edit`
extend({expr1}, {expr2} [, {expr3}])
				List/Dict insert items of {expr2} into {expr1}
extendnew({expr1}, {expr2} [, {expr3}])
				List/Dict like |extend()| but creates a new
					List or Dictionary
feedkeys({string} [, {mode}])	Number	add key sequence to typeahead buffer
filereadable({file})		Number	|TRUE| if {file} is a readable file
filewritable({file})		Number	|TRUE| if {file} is a writable file
filter({expr1}, {expr2})	List/Dict  remove items from {expr1} where
					{expr2} is 0
finddir({name} [, {path} [, {count}]])
				String	find directory {name} in {path}
findfile({name} [, {path} [, {count}]])
				String	find file {name} in {path}
flatten({list} [, {maxdepth}])	List	flatten {list} up to {maxdepth} levels
float2nr({expr})		Number	convert Float {expr} to a Number
floor({expr})			Float	round {expr} down
fmod({expr1}, {expr2})		Float	remainder of {expr1} / {expr2}
fnameescape({fname})		String	escape special characters in {fname}
fnamemodify({fname}, {mods})	String	modify file name
foldclosed({lnum})		Number	first line of fold at {lnum} if closed
foldclosedend({lnum})		Number	last line of fold at {lnum} if closed
foldlevel({lnum})		Number	fold level at {lnum}
foldtext()			String	line displayed for closed fold
foldtextresult({lnum})		String	text for closed fold at {lnum}
foreground()			Number	bring the Vim window to the foreground
funcref({name} [, {arglist}] [, {dict}])
				Funcref	reference to function {name}
function({name} [, {arglist}] [, {dict}])
				Funcref	named reference to function {name}
garbagecollect([{atexit}])	none	free memory, breaking cyclic references
get({list}, {idx} [, {def}])	any	get item {idx} from {list} or {def}
get({dict}, {key} [, {def}])	any	get item {key} from {dict} or {def}
get({func}, {what})		any	get property of funcref/partial {func}
getbufinfo([{expr}])		List	information about buffers
getbufline({expr}, {lnum} [, {end}])
				List	lines {lnum} to {end} of buffer {expr}
getbufvar({expr}, {varname} [, {def}])
				any	variable {varname} in buffer {expr}
getchangelist([{expr}])		List	list of change list items
getchar([expr])			Number	get one character from the user
getcharmod()			Number	modifiers for the last typed character
getcharpos({expr})		List	position of cursor, mark, etc.
getcharsearch()			Dict	last character search
getcmdline()			String	return the current command-line
getcmdpos()			Number	return cursor position in command-line
getcmdtype()			String	return current command-line type
getcmdwintype()			String	return current command-line window type
getcompletion({pat}, {type} [, {filtered}])
				List	list of cmdline completion matches
getcurpos([{winnr}])		List	position of the cursor
getcursorcharpos([{winnr}])	List	character position of the cursor
getcwd([{winnr} [, {tabnr}]])	String	get the current working directory
getenv({name})			String	return environment variable
getfontname([{name}])		String	name of font being used
getfperm({fname})		String	file permissions of file {fname}
getfsize({fname})		Number	size in bytes of file {fname}
getftime({fname})		Number	last modification time of file
getftype({fname})		String	description of type of file {fname}
getimstatus()			Number	|TRUE| if the IME status is active
getjumplist([{winnr} [, {tabnr}]])
				List	list of jump list items
getline({lnum})			String	line {lnum} of current buffer
getline({lnum}, {end})		List	lines {lnum} to {end} of current buffer
getloclist({nr})		List	list of location list items
getloclist({nr}, {what})	Dict	get specific location list properties
getmarklist([{expr}])		List	list of global/local marks
getmatches([{win}])		List	list of current matches
getmousepos()			Dict	last known mouse position
getpid()			Number	process ID of Vim
getpos({expr})			List	position of cursor, mark, etc.
getqflist()			List	list of quickfix items
getqflist({what})		Dict	get specific quickfix list properties
getreg([{regname} [, 1 [, {list}]]])
				String or List   contents of a register
getreginfo([{regname}])		Dict	information about a register
getregtype([{regname}])		String	type of a register
gettabinfo([{expr}])		List	list of tab pages
gettabvar({nr}, {varname} [, {def}])
				any	variable {varname} in tab {nr} or {def}
gettabwinvar({tabnr}, {winnr}, {name} [, {def}])
				any	{name} in {winnr} in tab page {tabnr}
gettagstack([{nr}])		Dict	get the tag stack of window {nr}
gettext({text})			String	lookup translation of {text}
getwininfo([{winid}])		List	list of info about each window
getwinpos([{timeout}])		List	X and Y coord in pixels of the Vim window
getwinposx()			Number	X coord in pixels of the Vim window
getwinposy()			Number	Y coord in pixels of the Vim window
getwinvar({nr}, {varname} [, {def}])
				any	variable {varname} in window {nr}
glob({expr} [, {nosuf} [, {list} [, {alllinks}]]])
				any	expand file wildcards in {expr}
glob2regpat({expr})		String	convert a glob pat into a search pat
globpath({path}, {expr} [, {nosuf} [, {list} [, {alllinks}]]])
				String	do glob({expr}) for all dirs in {path}
has({feature} [, {check}])	Number	|TRUE| if feature {feature} supported
has_key({dict}, {key})		Number	|TRUE| if {dict} has entry {key}
haslocaldir([{winnr} [, {tabnr}]])
				Number	|TRUE| if the window executed |:lcd|
					or |:tcd|
hasmapto({what} [, {mode} [, {abbr}]])
				Number	|TRUE| if mapping to {what} exists
histadd({history}, {item})	Number	add an item to a history
histdel({history} [, {item}])	Number	remove an item from a history
histget({history} [, {index}])	String	get the item {index} from a history
histnr({history})		Number	highest index of a history
hlID({name})			Number	syntax ID of highlight group {name}
hlexists({name})		Number	|TRUE| if highlight group {name} exists
hostname()			String	name of the machine Vim is running on
iconv({expr}, {from}, {to})	String	convert encoding of {expr}
indent({lnum})			Number	indent of line {lnum}
index({object}, {expr} [, {start} [, {ic}]])
				Number	index in {object} where {expr} appears
input({prompt} [, {text} [, {completion}]])
				String	get input from the user
inputdialog({prompt} [, {text} [, {completion}]])
				String	like input() but in a GUI dialog
inputlist({textlist})		Number	let the user pick from a choice list
inputrestore()			Number	restore typeahead
inputsave()			Number	save and clear typeahead
inputsecret({prompt} [, {text}]) String	like input() but hiding the text
insert({object}, {item} [, {idx}]) List	insert {item} in {object} [before {idx}]
interrupt()			none	interrupt script execution
invert({expr})			Number	bitwise invert
isdirectory({directory})	Number	|TRUE| if {directory} is a directory
isinf({expr})			Number	determine if {expr} is infinity value
					(positive or negative)
islocked({expr})		Number	|TRUE| if {expr} is locked
isnan({expr})			Number	|TRUE| if {expr} is NaN
items({dict})			List	key-value pairs in {dict}
job_getchannel({job})		Channel	get the channel handle for {job}
job_info([{job}])		Dict	get information about {job}
job_setoptions({job}, {options}) none	set options for {job}
job_start({command} [, {options}])
				Job	start a job
job_status({job})		String	get the status of {job}
job_stop({job} [, {how}])	Number	stop {job}
join({list} [, {sep}])		String	join {list} items into one String
js_decode({string})		any	decode JS style JSON
js_encode({expr})		String	encode JS style JSON
json_decode({string})		any	decode JSON
json_encode({expr})		String	encode JSON
keys({dict})			List	keys in {dict}
len({expr})			Number	the length of {expr}
libcall({lib}, {func}, {arg})	String	call {func} in library {lib} with {arg}
libcallnr({lib}, {func}, {arg})	Number	idem, but return a Number
line({expr} [, {winid}])	Number	line nr of cursor, last line or mark
line2byte({lnum})		Number	byte count of line {lnum}
lispindent({lnum})		Number	Lisp indent for line {lnum}
list2str({list} [, {utf8}])	String	turn numbers in {list} into a String
listener_add({callback} [, {buf}])
				Number	add a callback to listen to changes
listener_flush([{buf}])		none	invoke listener callbacks
listener_remove({id})		none	remove a listener callback
localtime()			Number	current time
log({expr})			Float	natural logarithm (base e) of {expr}
log10({expr})			Float	logarithm of Float {expr} to base 10
luaeval({expr} [, {expr}])	any	evaluate |Lua| expression
map({expr1}, {expr2})		List/Dict  change each item in {expr1} to {expr}
maparg({name} [, {mode} [, {abbr} [, {dict}]]])
				String or Dict
					rhs of mapping {name} in mode {mode}
mapcheck({name} [, {mode} [, {abbr}]])
				String	check for mappings matching {name}
mapnew({expr1}, {expr2})	List/Dict  like |map()| but creates a new List
					   or Dictionary
mapset({mode}, {abbr}, {dict})	none	restore mapping from |maparg()| result
match({expr}, {pat} [, {start} [, {count}]])
				Number	position where {pat} matches in {expr}
matchadd({group}, {pattern} [, {priority} [, {id} [, {dict}]]])
				Number	highlight {pattern} with {group}
matchaddpos({group}, {pos} [, {priority} [, {id} [, {dict}]]])
				Number	highlight positions with {group}
matcharg({nr})			List	arguments of |:match|
matchdelete({id} [, {win}])	Number	delete match identified by {id}
matchend({expr}, {pat} [, {start} [, {count}]])
				Number	position where {pat} ends in {expr}
matchfuzzy({list}, {str} [, {dict}])
				List	fuzzy match {str} in {list}
matchfuzzypos({list}, {str} [, {dict}])
				List	fuzzy match {str} in {list}
matchlist({expr}, {pat} [, {start} [, {count}]])
				List	match and submatches of {pat} in {expr}
matchstr({expr}, {pat} [, {start} [, {count}]])
				String	{count}'th match of {pat} in {expr}
matchstrpos({expr}, {pat} [, {start} [, {count}]])
				List	{count}'th match of {pat} in {expr}
max({expr})			Number	maximum value of items in {expr}
menu_info({name} [, {mode}])	Dict	get menu item information
min({expr})			Number	minimum value of items in {expr}
mkdir({name} [, {path} [, {prot}]])
				Number	create directory {name}
mode([expr])			String	current editing mode
mzeval({expr})			any	evaluate |MzScheme| expression
nextnonblank({lnum})		Number	line nr of non-blank line >= {lnum}
nr2char({expr} [, {utf8}])	String	single char with ASCII/UTF8 value {expr}
or({expr}, {expr})		Number	bitwise OR
pathshorten({expr} [, {len}])	String	shorten directory names in a path
perleval({expr})		any	evaluate |Perl| expression
popup_atcursor({what}, {options}) Number create popup window near the cursor
popup_beval({what}, {options})	Number	create popup window for 'ballooneval'
popup_clear()			none	close all popup windows
popup_close({id} [, {result}])	none	close popup window {id}
popup_create({what}, {options}) Number	create a popup window
popup_dialog({what}, {options}) Number	create a popup window used as a dialog
popup_filter_menu({id}, {key})  Number	filter for a menu popup window
popup_filter_yesno({id}, {key}) Number	filter for a dialog popup window
popup_findinfo()		Number	get window ID of info popup window
popup_findpreview()		Number	get window ID of preview popup window
popup_getoptions({id})		Dict	get options of popup window {id}
popup_getpos({id})		Dict	get position of popup window {id}
popup_hide({id})		none	hide popup menu {id}
popup_list()			List	get a list of window IDs of all popups
popup_locate({row}, {col})	Number 	get window ID of popup at position
popup_menu({what}, {options})	Number	create a popup window used as a menu
popup_move({id}, {options})	none	set position of popup window {id}
popup_notification({what}, {options})
				Number	create a notification popup window
popup_setoptions({id}, {options})
				none	set options for popup window {id}
popup_settext({id}, {text})	none	set the text of popup window {id}
popup_show({id})		none	unhide popup window {id}
pow({x}, {y})			Float	{x} to the power of {y}
prevnonblank({lnum})		Number	line nr of non-blank line <= {lnum}
printf({fmt}, {expr1}...)	String	format text
prompt_getprompt({buf})		String	get prompt text
prompt_setcallback({buf}, {expr}) none	set prompt callback function
prompt_setinterrupt({buf}, {text}) none	set prompt interrupt function
prompt_setprompt({buf}, {text}) none	set prompt text
prop_add({lnum}, {col}, {props})  none	add a text property
prop_clear({lnum} [, {lnum-end} [, {props}]])
				none	remove all text properties
prop_find({props} [, {direction}])
				Dict	search for a text property
prop_list({lnum} [, {props}])	List	text properties in {lnum}
prop_remove({props} [, {lnum} [, {lnum-end}]])
				Number	remove a text property
prop_type_add({name}, {props})	none	define a new property type
prop_type_change({name}, {props})
				none	change an existing property type
prop_type_delete({name} [, {props}])
				none	delete a property type
prop_type_get({name} [, {props}])
				Dict	get property type values
prop_type_list([{props}])	List	get list of property types
pum_getpos()			Dict	position and size of pum if visible
pumvisible()			Number	whether popup menu is visible
py3eval({expr})			any	evaluate |python3| expression
pyeval({expr})			any	evaluate |Python| expression
pyxeval({expr})			any	evaluate |python_x| expression
rand([{expr}])			Number	get pseudo-random number
range({expr} [, {max} [, {stride}]])
				List	items from {expr} to {max}
readblob({fname})		Blob	read a |Blob| from {fname}
readdir({dir} [, {expr} [, {dict}]])
				List	file names in {dir} selected by {expr}
readdirex({dir} [, {expr} [, {dict}]])
				List	file info in {dir} selected by {expr}
readfile({fname} [, {type} [, {max}]])
				List	get list of lines from file {fname}
reduce({object}, {func} [, {initial}])
				any	reduce {object} using {func}
reg_executing()			String	get the executing register name
reg_recording()			String	get the recording register name
reltime([{start} [, {end}]])	List	get time value
reltimefloat({time})		Float	turn the time value into a Float
reltimestr({time})		String	turn time value into a String
remote_expr({server}, {string} [, {idvar} [, {timeout}]])
				String	send expression
remote_foreground({server})	Number	bring Vim server to the foreground
remote_peek({serverid} [, {retvar}])
				Number	check for reply string
remote_read({serverid} [, {timeout}])
				String	read reply string
remote_send({server}, {string} [, {idvar}])
				String	send key sequence
remote_startserver({name})	none	become server {name}
remove({list}, {idx} [, {end}])	any/List
					remove items {idx}-{end} from {list}
remove({blob}, {idx} [, {end}])	Number/Blob
					remove bytes {idx}-{end} from {blob}
remove({dict}, {key})		any	remove entry {key} from {dict}
rename({from}, {to})		Number	rename (move) file from {from} to {to}
repeat({expr}, {count})		String	repeat {expr} {count} times
resolve({filename})		String	get filename a shortcut points to
reverse({list})			List	reverse {list} in-place
round({expr})			Float	round off {expr}
rubyeval({expr})		any	evaluate |Ruby| expression
screenattr({row}, {col})	Number	attribute at screen position
screenchar({row}, {col})	Number	character at screen position
screenchars({row}, {col})	List	List of characters at screen position
screencol()			Number	current cursor column
screenpos({winid}, {lnum}, {col}) Dict	screen row and col of a text character
screenrow()			Number	current cursor row
screenstring({row}, {col})	String	characters at screen position
search({pattern} [, {flags} [, {stopline} [, {timeout} [, {skip}]]]])
				Number	search for {pattern}
searchcount([{options}])	Dict	get or update search stats
searchdecl({name} [, {global} [, {thisblock}]])
				Number	search for variable declaration
searchpair({start}, {middle}, {end} [, {flags} [, {skip} [...]]])
				Number	search for other end of start/end pair
searchpairpos({start}, {middle}, {end} [, {flags} [, {skip} [...]]])
				List	search for other end of start/end pair
searchpos({pattern} [, {flags} [, {stopline} [, {timeout} [, {skip}]]]])
				List	search for {pattern}
server2client({clientid}, {string})
				Number	send reply string
serverlist()			String	get a list of available servers
setbufline({expr}, {lnum}, {text})
				Number	set line {lnum} to {text} in buffer
					{expr}
setbufvar({expr}, {varname}, {val})
				none	set {varname} in buffer {expr} to {val}
setcellwidths({list})		none	set character cell width overrides
setcharpos({expr}, {list})	Number	set the {expr} position to {list}
setcharsearch({dict})		Dict	set character search from {dict}
setcmdpos({pos})		Number	set cursor position in command-line
setcursorcharpos({list})	Number	move cursor to position in {list}
setenv({name}, {val})		none	set environment variable
setfperm({fname}, {mode})	Number	set {fname} file permissions to {mode}
setline({lnum}, {line})		Number	set line {lnum} to {line}
setloclist({nr}, {list} [, {action}])
 				Number	modify location list using {list}
setloclist({nr}, {list}, {action}, {what})
				Number	modify specific location list props
setmatches({list} [, {win}])	Number	restore a list of matches
setpos({expr}, {list})		Number	set the {expr} position to {list}
setqflist({list} [, {action}])	Number	modify quickfix list using {list}
setqflist({list}, {action}, {what})
				Number	modify specific quickfix list props
setreg({n}, {v} [, {opt}])	Number	set register to value and type
settabvar({nr}, {varname}, {val}) none	set {varname} in tab page {nr} to {val}
settabwinvar({tabnr}, {winnr}, {varname}, {val})
				none	set {varname} in window {winnr} in tab
					page {tabnr} to {val}
settagstack({nr}, {dict} [, {action}])
				Number	modify tag stack using {dict}
setwinvar({nr}, {varname}, {val}) none	set {varname} in window {nr} to {val}
sha256({string})		String	SHA256 checksum of {string}
shellescape({string} [, {special}])
				String	escape {string} for use as shell
					command argument
shiftwidth([{col}])		Number	effective value of 'shiftwidth'
sign_define({name} [, {dict}])	Number	define or update a sign
sign_define({list})		List	define or update a list of signs
sign_getdefined([{name}])	List	get a list of defined signs
sign_getplaced([{expr} [, {dict}]])
				List	get a list of placed signs
sign_jump({id}, {group}, {expr})
				Number	jump to a sign
sign_place({id}, {group}, {name}, {expr} [, {dict}])
				Number	place a sign
sign_placelist({list})		List	place a list of signs
sign_undefine([{name}])		Number	undefine a sign
sign_undefine({list})		List	undefine a list of signs
sign_unplace({group} [, {dict}])
				Number	unplace a sign
sign_unplacelist({list})	List	unplace a list of signs
simplify({filename})		String	simplify filename as much as possible
sin({expr})			Float	sine of {expr}
sinh({expr})			Float	hyperbolic sine of {expr}
slice({expr}, {start} [, {end}])  String, List or Blob
					slice of a String, List or Blob
sort({list} [, {func} [, {dict}]])
				List	sort {list}, using {func} to compare
sound_clear()			none	stop playing all sounds
sound_playevent({name} [, {callback}])
				Number	play an event sound
sound_playfile({path} [, {callback}])
				Number	play sound file {path}
sound_stop({id})		none	stop playing sound {id}
soundfold({word})		String	sound-fold {word}
spellbadword()			String	badly spelled word at cursor
spellsuggest({word} [, {max} [, {capital}]])
				List	spelling suggestions
split({expr} [, {pat} [, {keepempty}]])
				List	make |List| from {pat} separated {expr}
sqrt({expr})			Float	square root of {expr}
srand([{expr}])			List	get seed for |rand()|
state([{what}])			String	current state of Vim
str2float({expr})		Float	convert String to Float
str2list({expr} [, {utf8}])	List	convert each character of {expr} to
					ASCII/UTF8 value
str2nr({expr} [, {base} [, {quoted}]])
				Number	convert String to Number
strcharpart({str}, {start} [, {len}])
				String	{len} characters of {str} at
					character {start}
strchars({expr} [, {skipcc}])	Number	character length of the String {expr}
strdisplaywidth({expr} [, {col}]) Number display length of the String {expr}
strftime({format} [, {time}])	String	format time with a specified format
strgetchar({str}, {index})	Number	get char {index} from {str}
stridx({haystack}, {needle} [, {start}])
				Number	index of {needle} in {haystack}
string({expr})			String	String representation of {expr} value
strlen({expr})			Number	length of the String {expr}
strpart({str}, {start} [, {len} [, {chars}]])
				String	{len} bytes/chars of {str} at
					byte {start}
strptime({format}, {timestring})
				Number	Convert {timestring} to unix timestamp
strridx({haystack}, {needle} [, {start}])
				Number	last index of {needle} in {haystack}
strtrans({expr})		String	translate string to make it printable
strwidth({expr})		Number	display cell length of the String {expr}
submatch({nr} [, {list}])	String or List
					specific match in ":s" or substitute()
substitute({expr}, {pat}, {sub}, {flags})
				String	all {pat} in {expr} replaced with {sub}
swapinfo({fname})		Dict	information about swap file {fname}
swapname({expr})		String	swap file of buffer {expr}
synID({lnum}, {col}, {trans})	Number	syntax ID at {lnum} and {col}
synIDattr({synID}, {what} [, {mode}])
				String	attribute {what} of syntax ID {synID}
synIDtrans({synID})		Number	translated syntax ID of {synID}
synconcealed({lnum}, {col})	List	info about concealing
synstack({lnum}, {col})		List	stack of syntax IDs at {lnum} and {col}
system({expr} [, {input}])	String	output of shell command/filter {expr}
systemlist({expr} [, {input}])	List	output of shell command/filter {expr}
tabpagebuflist([{arg}])		List	list of buffer numbers in tab page
tabpagenr([{arg}])		Number	number of current or last tab page
tabpagewinnr({tabarg} [, {arg}]) Number	number of current window in tab page
tagfiles()			List	tags files used
taglist({expr} [, {filename}])	List	list of tags matching {expr}
tan({expr})			Float	tangent of {expr}
tanh({expr})			Float	hyperbolic tangent of {expr}
tempname()			String	name for a temporary file
term_dumpdiff({filename}, {filename} [, {options}])
				Number  display difference between two dumps
term_dumpload({filename} [, {options}])
				Number	displaying a screen dump
term_dumpwrite({buf}, {filename} [, {options}])
				none	dump terminal window contents
term_getaltscreen({buf})	Number	get the alternate screen flag
term_getansicolors({buf})	List	get ANSI palette in GUI color mode
term_getattr({attr}, {what})	Number	get the value of attribute {what}
term_getcursor({buf})		List	get the cursor position of a terminal
term_getjob({buf})		Job	get the job associated with a terminal
term_getline({buf}, {row})	String	get a line of text from a terminal
term_getscrolled({buf})		Number	get the scroll count of a terminal
term_getsize({buf})		List	get the size of a terminal
term_getstatus({buf})		String	get the status of a terminal
term_gettitle({buf})		String	get the title of a terminal
term_gettty({buf}, [{input}])	String	get the tty name of a terminal
term_list()			List	get the list of terminal buffers
term_scrape({buf}, {row})	List	get row of a terminal screen
term_sendkeys({buf}, {keys})	none	send keystrokes to a terminal
term_setansicolors({buf}, {colors})
				none	set ANSI palette in GUI color mode
term_setapi({buf}, {expr})	none	set |terminal-api| function name prefix
term_setkill({buf}, {how})	none	set signal to stop job in terminal
term_setrestore({buf}, {command}) none	set command to restore terminal
term_setsize({buf}, {rows}, {cols})
				none	set the size of a terminal
term_start({cmd} [, {options}])	Number	open a terminal window and run a job
term_wait({buf} [, {time}])	Number  wait for screen to be updated
terminalprops()			Dict	properties of the terminal
test_alloc_fail({id}, {countdown}, {repeat})
				none	make memory allocation fail
test_autochdir()		none	enable 'autochdir' during startup
test_feedinput({string})	none	add key sequence to input buffer
test_garbagecollect_now()	none	free memory right now for testing
test_garbagecollect_soon()	none	free memory soon for testing
test_getvalue({string})		any	get value of an internal variable
test_ignore_error({expr})	none	ignore a specific error
test_null_blob()		Blob	null value for testing
test_null_channel()		Channel	null value for testing
test_null_dict()		Dict	null value for testing
test_null_function()		Funcref	null value for testing
test_null_job()			Job	null value for testing
test_null_list()		List	null value for testing
test_null_partial()		Funcref	null value for testing
test_null_string()		String	null value for testing
test_option_not_set({name})	none	reset flag indicating option was set
test_override({expr}, {val})	none	test with Vim internal overrides
test_refcount({expr})		Number	get the reference count of {expr}
test_scrollbar({which}, {value}, {dragging})
				none	scroll in the GUI for testing
test_setmouse({row}, {col})	none	set the mouse position for testing
test_settime({expr})		none	set current time for testing
test_srand_seed([seed])		none	set seed for testing srand()
test_unknown()			any	unknown value for testing
test_void()			any	void value for testing
timer_info([{id}])		List	information about timers
timer_pause({id}, {pause})	none	pause or unpause a timer
timer_start({time}, {callback} [, {options}])
				Number	create a timer
timer_stop({timer})		none	stop a timer
timer_stopall()			none	stop all timers
tolower({expr})			String	the String {expr} switched to lowercase
toupper({expr})			String	the String {expr} switched to uppercase
tr({src}, {fromstr}, {tostr})	String	translate chars of {src} in {fromstr}
					to chars in {tostr}
trim({text} [, {mask} [, {dir}]])
				String	trim characters in {mask} from {text}
trunc({expr})			Float	truncate Float {expr}
type({expr})			Number	type of value {expr}
typename({expr})		String	representation of the type of {expr}
undofile({name})		String	undo file name for {name}
undotree()			List	undo file tree
uniq({list} [, {func} [, {dict}]])
				List	remove adjacent duplicates from a list
values({dict})			List	values in {dict}
virtcol({expr})			Number	screen column of cursor or mark
visualmode([expr])		String	last visual mode used
wildmenumode()			Number	whether 'wildmenu' mode is active
win_execute({id}, {command} [, {silent}])
				String	execute {command} in window {id}
win_findbuf({bufnr})		List	find windows containing {bufnr}
win_getid([{win} [, {tab}]])	Number	get window ID for {win} in {tab}
win_gettype([{nr}])		String	type of window {nr}
win_gotoid({expr})		Number	go to window with ID {expr}
win_id2tabwin({expr})		List	get tab and window nr from window ID
win_id2win({expr})		Number	get window nr from window ID
win_screenpos({nr})		List	get screen position of window {nr}
win_splitmove({nr}, {target} [, {options}])
				Number	move window {nr} to split of {target}
winbufnr({nr})			Number	buffer number of window {nr}
wincol()			Number	window column of the cursor
windowsversion()		String	MS-Windows OS version
winheight({nr})			Number	height of window {nr}
winlayout([{tabnr}])		List	layout of windows in tab {tabnr}
winline()			Number	window line of the cursor
winnr([{expr}])			Number	number of current window
winrestcmd()			String	returns command to restore window sizes
winrestview({dict})		none	restore view of current window
winsaveview()			Dict	save view of current window
winwidth({nr})			Number	width of window {nr}
wordcount()			Dict	get byte/char/word statistics
writefile({object}, {fname} [, {flags}])
				Number	write |Blob| or |List| of lines to file
xor({expr}, {expr})		Number	bitwise XOR


abs({expr})							*abs()*
		Return the absolute value of {expr}.  When {expr} evaluates to
		a |Float| abs() returns a |Float|.  When {expr} can be
		converted to a |Number| abs() returns a |Number|.  Otherwise
		abs() gives an error message and returns -1.
		Examples: >
			echo abs(1.456)
<			1.456  >
			echo abs(-5.456)
<			5.456  >
			echo abs(-4)
<			4

		Can also be used as a |method|: >
			Compute()->abs()

<		{only available when compiled with the |+float| feature}


acos({expr})							*acos()*
		Return the arc cosine of {expr} measured in radians, as a
		|Float| in the range of [0, pi].
		{expr} must evaluate to a |Float| or a |Number| in the range
		[-1, 1].
		Examples: >
			:echo acos(0)
<			1.570796 >
			:echo acos(-0.5)
<			2.094395

		Can also be used as a |method|: >
			Compute()->acos()

<		{only available when compiled with the |+float| feature}


add({object}, {expr})					*add()*
		Append the item {expr} to |List| or |Blob| {object}.  Returns
		the resulting |List| or |Blob|.  Examples: >
			:let alist = add([1, 2, 3], item)
			:call add(mylist, "woodstock")
<		Note that when {expr} is a |List| it is appended as a single
		item.  Use |extend()| to concatenate |Lists|.
		When {object} is a |Blob| then  {expr} must be a number.
		Use |insert()| to add an item at another position.

		Can also be used as a |method|: >
			mylist->add(val1)->add(val2)


and({expr}, {expr})					*and()*
		Bitwise AND on the two arguments.  The arguments are converted
		to a number.  A List, Dict or Float argument causes an error.
		Example: >
			:let flag = and(bits, 0x80)
<		Can also be used as a |method|: >
			:let flag = bits->and(0x80)


append({lnum}, {text})					*append()*
		When {text} is a |List|: Append each item of the |List| as a
		text line below line {lnum} in the current buffer.
		Otherwise append {text} as one text line below line {lnum} in
		the current buffer.
		{lnum} can be zero to insert a line before the first one.
		Returns 1 for failure ({lnum} out of range or out of memory),
		0 for success.  Example: >
			:let failed = append(line('$'), "# THE END")
			:let failed = append(0, ["Chapter 1", "the beginning"])

<		Can also be used as a |method| after a List, the base is
		passed as the second argument: >
			mylist->append(lnum)


appendbufline({expr}, {lnum}, {text})			*appendbufline()*
		Like |append()| but append the text in buffer {expr}.

		This function works only for loaded buffers. First call
		|bufload()| if needed.

		For the use of {expr}, see |bufname()|.

		{lnum} is used like with |append()|.  Note that using |line()|
		would use the current buffer, not the one appending to.
		Use "$" to append at the end of the buffer.

		On success 0 is returned, on failure 1 is returned.

		If {expr} is not a valid buffer or {lnum} is not valid, an
		error message is given. Example: >
			:let failed = appendbufline(13, 0, "# THE START")
<
		Can also be used as a |method| after a List, the base is
		passed as the second argument: >
			mylist->appendbufline(buf, lnum)


argc([{winid}])					*argc()*
		The result is the number of files in the argument list.  See
		|arglist|.
		If {winid} is not supplied, the argument list of the current
		window is used.
		If {winid} is -1, the global argument list is used.
		Otherwise {winid} specifies the window of which the argument
		list is used: either the window number or the window ID.
		Returns -1 if the {winid} argument is invalid.

							*argidx()*
argidx()	The result is the current index in the argument list.  0 is
		the first file.  argc() - 1 is the last one.  See |arglist|.

							*arglistid()*
arglistid([{winnr} [, {tabnr}]])
		Return the argument list ID.  This is a number which
		identifies the argument list being used.  Zero is used for the
		global argument list.  See |arglist|.
		Returns -1 if the arguments are invalid.

		Without arguments use the current window.
		With {winnr} only use this window in the current tab page.
		With {winnr} and {tabnr} use the window in the specified tab
		page.
		{winnr} can be the window number or the |window-ID|.

							*argv()*
argv([{nr} [, {winid}]])
		The result is the {nr}th file in the argument list.  See
		|arglist|.  "argv(0)" is the first one.  Example: >
	:let i = 0
	:while i < argc()
	:  let f = escape(fnameescape(argv(i)), '.')
	:  exe 'amenu Arg.' . f . ' :e ' . f . '<CR>'
	:  let i = i + 1
	:endwhile
<		Without the {nr} argument, or when {nr} is -1, a |List| with
		the whole |arglist| is returned.

		The {winid} argument specifies the window ID, see |argc()|.
		For the Vim command line arguments see |v:argv|.

asin({expr})						*asin()*
		Return the arc sine of {expr} measured in radians, as a |Float|
		in the range of [-pi/2, pi/2].
		{expr} must evaluate to a |Float| or a |Number| in the range
		[-1, 1].
		Examples: >
			:echo asin(0.8)
<			0.927295 >
			:echo asin(-0.5)
<			-0.523599

		Can also be used as a |method|: >
			Compute()->asin()
<
		{only available when compiled with the |+float| feature}


assert_ functions are documented here: |assert-functions-details|



atan({expr})						*atan()*
		Return the principal value of the arc tangent of {expr}, in
		the range [-pi/2, +pi/2] radians, as a |Float|.
		{expr} must evaluate to a |Float| or a |Number|.
		Examples: >
			:echo atan(100)
<			1.560797 >
			:echo atan(-4.01)
<			-1.326405

		Can also be used as a |method|: >
			Compute()->atan()
<
		{only available when compiled with the |+float| feature}


atan2({expr1}, {expr2})					*atan2()*
		Return the arc tangent of {expr1} / {expr2}, measured in
		radians, as a |Float| in the range [-pi, pi].
		{expr1} and {expr2} must evaluate to a |Float| or a |Number|.
		Examples: >
			:echo atan2(-1, 1)
<			-0.785398 >
			:echo atan2(1, -1)
<			2.356194

		Can also be used as a |method|: >
			Compute()->atan(1)
<
		{only available when compiled with the |+float| feature}

balloon_gettext()					*balloon_gettext()*
		Return the current text in the balloon.  Only for the string,
		not used for the List.

balloon_show({expr})					*balloon_show()*
		Show {expr} inside the balloon.  For the GUI {expr} is used as
		a string.  For a terminal {expr} can be a list, which contains
		the lines of the balloon.  If {expr} is not a list it will be
		split with |balloon_split()|.
		If {expr} is an empty string any existing balloon is removed.

		Example: >
			func GetBalloonContent()
			   " ... initiate getting the content
			   return ''
			endfunc
			set balloonexpr=GetBalloonContent()

			func BalloonCallback(result)
			  call balloon_show(a:result)
			endfunc
<		Can also be used as a |method|: >
			GetText()->balloon_show()
<
		The intended use is that fetching the content of the balloon
		is initiated from 'balloonexpr'.  It will invoke an
		asynchronous method, in which a callback invokes
		balloon_show().  The 'balloonexpr' itself can return an
		empty string or a placeholder.

		When showing a balloon is not possible nothing happens, no
		error message.
		{only available when compiled with the |+balloon_eval| or
		|+balloon_eval_term| feature}

balloon_split({msg})					*balloon_split()*
		Split {msg} into lines to be displayed in a balloon.  The
		splits are made for the current window size and optimize to
		show debugger output.
		Returns a |List| with the split lines.
		Can also be used as a |method|: >
			GetText()->balloon_split()->balloon_show()

<		{only available when compiled with the |+balloon_eval_term|
		feature}

							*browse()*
browse({save}, {title}, {initdir}, {default})
		Put up a file requester.  This only works when "has("browse")"
		returns |TRUE| (only in some GUI versions).
		The input fields are:
		    {save}	when |TRUE|, select file to write
		    {title}	title for the requester
		    {initdir}	directory to start browsing in
		    {default}	default file name
		An empty string is returned when the "Cancel" button is hit,
		something went wrong, or browsing is not possible.

							*browsedir()*
browsedir({title}, {initdir})
		Put up a directory requester.  This only works when
		"has("browse")" returns |TRUE| (only in some GUI versions).
		On systems where a directory browser is not supported a file
		browser is used.  In that case: select a file in the directory
		to be used.
		The input fields are:
		    {title}	title for the requester
		    {initdir}	directory to start browsing in
		When the "Cancel" button is hit, something went wrong, or
		browsing is not possible, an empty string is returned.

bufadd({name})						*bufadd()*
		Add a buffer to the buffer list with {name}.
		If a buffer for file {name} already exists, return that buffer
		number.  Otherwise return the buffer number of the newly
		created buffer.  When {name} is an empty string then a new
		buffer is always created.
		The buffer will not have 'buflisted' set and not be loaded
		yet.  To add some text to the buffer use this: >
			let bufnr = bufadd('someName')
			call bufload(bufnr)
			call setbufline(bufnr, 1, ['some', 'text'])
<		Can also be used as a |method|: >
			let bufnr = 'somename'->bufadd()

bufexists({expr})					*bufexists()*
		The result is a Number, which is |TRUE| if a buffer called
		{expr} exists.
		If the {expr} argument is a number, buffer numbers are used.
		Number zero is the alternate buffer for the current window.

		If the {expr} argument is a string it must match a buffer name
		exactly.  The name can be:
		- Relative to the current directory.
		- A full path.
		- The name of a buffer with 'buftype' set to "nofile".
		- A URL name.
		Unlisted buffers will be found.
		Note that help files are listed by their short name in the
		output of |:buffers|, but bufexists() requires using their
		long name to be able to find them.
		bufexists() may report a buffer exists, but to use the name
		with a |:buffer| command you may need to use |expand()|.  Esp
		for MS-Windows 8.3 names in the form "c:\DOCUME~1"
		Use "bufexists(0)" to test for the existence of an alternate
		file name.

		Can also be used as a |method|: >
			let exists = 'somename'->bufexists()
<
		Obsolete name: buffer_exists().		*buffer_exists()*

buflisted({expr})					*buflisted()*
		The result is a Number, which is |TRUE| if a buffer called
		{expr} exists and is listed (has the 'buflisted' option set).
		The {expr} argument is used like with |bufexists()|.

		Can also be used as a |method|: >
			let listed = 'somename'->buflisted()

bufload({expr})						*bufload()*
		Ensure the buffer {expr} is loaded.  When the buffer name
		refers to an existing file then the file is read.  Otherwise
		the buffer will be empty.  If the buffer was already loaded
		then there is no change.
		If there is an existing swap file for the file of the buffer,
		there will be no dialog, the buffer will be loaded anyway.
		The {expr} argument is used like with |bufexists()|.

		Can also be used as a |method|: >
			eval 'somename'->bufload()

bufloaded({expr})					*bufloaded()*
		The result is a Number, which is |TRUE| if a buffer called
		{expr} exists and is loaded (shown in a window or hidden).
		The {expr} argument is used like with |bufexists()|.

		Can also be used as a |method|: >
			let loaded = 'somename'->bufloaded()

bufname([{expr}])					*bufname()*
		The result is the name of a buffer, as it is displayed by the
		":ls" command.
		If {expr} is omitted the current buffer is used.
		If {expr} is a Number, that buffer number's name is given.
		Number zero is the alternate buffer for the current window.
		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
		set and 'cpoptions' is empty.  When there is more than one
		match an empty string is returned.
		"" or "%" can be used for the current buffer, "#" for the
		alternate buffer.
		A full match is preferred, otherwise a match at the start, end
		or middle of the buffer name is accepted.  If you only want a
		full match then put "^" at the start and "$" at the end of the
		pattern.
		Listed buffers are found first.  If there is a single match
		with a listed buffer, that one is returned.  Next unlisted
		buffers are searched for.
		If the {expr} is a String, but you want to use it as a buffer
		number, force it to be a Number by adding zero to it: >
			:echo bufname("3" + 0)
<		Can also be used as a |method|: >
			echo bufnr->bufname()

<		If the buffer doesn't exist, or doesn't have a name, an empty
		string is returned. >
	bufname("#")		alternate buffer name
	bufname(3)		name of buffer 3
	bufname("%")		name of current buffer
	bufname("file2")	name of buffer where "file2" matches.
<							*buffer_name()*
		Obsolete name: buffer_name().

							*bufnr()*
bufnr([{expr} [, {create}]])
		The result is the number of a buffer, as it is displayed by
		the ":ls" command.  For the use of {expr}, see |bufname()|
		above.

		If the buffer doesn't exist, -1 is returned.  Or, if the
		{create} argument is present and TRUE, a new, unlisted,
		buffer is created and its number is returned.  Example: >
			let newbuf = bufnr('Scratch001', 1)
<		Using an empty name uses the current buffer. To create a new
		buffer with an empty name use |bufadd()|.

		bufnr("$") is the last buffer: >
			:let last_buffer = bufnr("$")
<		The result is a Number, which is the highest buffer number
		of existing buffers.  Note that not all buffers with a smaller
		number necessarily exist, because ":bwipeout" may have removed
		them.  Use bufexists() to test for the existence of a buffer.

		Can also be used as a |method|: >
			echo bufref->bufnr()
<
		Obsolete name: buffer_number().		*buffer_number()*
							*last_buffer_nr()*
		Obsolete name for bufnr("$"): last_buffer_nr().

bufwinid({expr})					*bufwinid()*
		The result is a Number, which is the |window-ID| of the first
		window associated with buffer {expr}.  For the use of {expr},
		see |bufname()| above.  If buffer {expr} doesn't exist or
		there is no such window, -1 is returned.  Example: >

	echo "A window containing buffer 1 is " . (bufwinid(1))
<
		Only deals with the current tab page.

		Can also be used as a |method|: >
			FindBuffer()->bufwinid()

bufwinnr({expr})					*bufwinnr()*
		Like |bufwinid()| but return the window number instead of the
		|window-ID|.
		If buffer {expr} doesn't exist or there is no such window, -1
		is returned.  Example: >

	echo "A window containing buffer 1 is " . (bufwinnr(1))

<		The number can be used with |CTRL-W_w| and ":wincmd w"
		|:wincmd|.

		Can also be used as a |method|: >
			FindBuffer()->bufwinnr()

byte2line({byte})					*byte2line()*
		Return the line number that contains the character at byte
		count {byte} in the current buffer.  This includes the
		end-of-line character, depending on the 'fileformat' option
		for the current buffer.  The first character has byte count
		one.
		Also see |line2byte()|, |go| and |:goto|.

		Can also be used as a |method|: >
			GetOffset()->byte2line()

<		{not available when compiled without the |+byte_offset|
		feature}

byteidx({expr}, {nr})					*byteidx()*
		Return byte index of the {nr}'th character in the string
		{expr}.  Use zero for the first character, it then returns
		zero.
		If there are no multibyte characters the returned value is
		equal to {nr}.
		Composing characters are not counted separately, their byte
		length is added to the preceding base character.  See
		|byteidxcomp()| below for counting composing characters
		separately.
		Example : >
			echo matchstr(str, ".", byteidx(str, 3))
<		will display the fourth character.  Another way to do the
		same: >
			let s = strpart(str, byteidx(str, 3))
			echo strpart(s, 0, byteidx(s, 1))
<		Also see |strgetchar()| and |strcharpart()|.

		If there are less than {nr} characters -1 is returned.
		If there are exactly {nr} characters the length of the string
		in bytes is returned.

		Can also be used as a |method|: >
			GetName()->byteidx(idx)

byteidxcomp({expr}, {nr})					*byteidxcomp()*
		Like byteidx(), except that a composing character is counted
		as a separate character.  Example: >
			let s = 'e' . nr2char(0x301)
			echo byteidx(s, 1)
			echo byteidxcomp(s, 1)
			echo byteidxcomp(s, 2)
<		The first and third echo result in 3 ('e' plus composing
		character is 3 bytes), the second echo results in 1 ('e' is
		one byte).
		Only works differently from byteidx() when 'encoding' is set
		to a Unicode encoding.

		Can also be used as a |method|: >
			GetName()->byteidxcomp(idx)

call({func}, {arglist} [, {dict}])			*call()* *E699*
		Call function {func} with the items in |List| {arglist} as
		arguments.
		{func} can either be a |Funcref| or the name of a function.
		a:firstline and a:lastline are set to the cursor line.
		Returns the return value of the called function.
		{dict} is for functions with the "dict" attribute.  It will be
		used to set the local variable "self". |Dictionary-function|

		Can also be used as a |method|: >
			GetFunc()->call([arg, arg], dict)

ceil({expr})							*ceil()*
		Return the smallest integral value greater than or equal to
		{expr} as a |Float| (round up).
		{expr} must evaluate to a |Float| or a |Number|.
		Examples: >
			echo ceil(1.456)
<			2.0  >
			echo ceil(-5.456)
<			-5.0  >
			echo ceil(4.0)
<			4.0

		Can also be used as a |method|: >
			Compute()->ceil()
<
		{only available when compiled with the |+float| feature}


ch_ functions are documented here: |channel-functions-details|


changenr()						*changenr()*
		Return the number of the most recent change.  This is the same
		number as what is displayed with |:undolist| and can be used
		with the |:undo| command.
		When a change was made it is the number of that change.  After
		redo it is the number of the redone change.  After undo it is
		one less than the number of the undone change.

char2nr({expr} [, {utf8}])					*char2nr()*
		Return number value of the first char in {expr}.  Examples: >
			char2nr(" ")		returns 32
			char2nr("ABC")		returns 65
<		When {utf8} is omitted or zero, the current 'encoding' is used.
		Example for "utf-8": >
			char2nr("á")		returns 225
			char2nr("á"[0])		returns 195
<		With {utf8} set to TRUE, always treat as utf-8 characters.
		A combining character is a separate character.
		|nr2char()| does the opposite.
		To turn a string into a list of character numbers: >
		    let str = "ABC"
		    let list = map(split(str, '\zs'), {_, val -> char2nr(val)})
<		Result: [65, 66, 67]

		Can also be used as a |method|: >
			GetChar()->char2nr()


charclass({string})					*charclass()*
		Return the character class of the first character in {string}.
		The character class is one of:
			0	blank
			1	punctuation
			2	word character
			3	emoji
			other	specific Unicode class
		The class is used in patterns and word motions.

							*charcol()*
charcol({expr})	Same as |col()| but returns the character index of the column
		position given with {expr} instead of the byte position.

		Example:
		With the cursor on '세' in line 5 with text "여보세요": >
			charcol('.')		returns 3
			col('.')		returns 7

<		Can also be used as a |method|: >
			GetPos()->col()
<
							*charidx()*
charidx({string}, {idx} [, {countcc}])
		Return the character index of the byte at {idx} in {string}.
		The index of the first character is zero.
		If there are no multibyte characters the returned value is
		equal to {idx}.
		When {countcc} is omitted or zero, then composing characters
		are not counted separately, their byte length is added to the
		preceding base character.
		When {countcc} is set to 1, then composing characters are
		counted as separate characters.
		Returns -1 if the arguments are invalid or if {idx} is greater
		than the index of the last byte in {string}.  An error is
		given if the first argument is not a string, the second
		argument is not a number or when the third argument is present
		and is not zero or one.
		See |byteidx()| and |byteidxcomp()| for getting the byte index
		from the character index.
		Examples: >
			echo charidx('áb́ć', 3)		returns 1
			echo charidx('áb́ć', 6, 1)	returns 4
			echo charidx('áb́ć', 16)		returns -1
<
		Can also be used as a |method|: >
			GetName()->charidx(idx)

chdir({dir})						*chdir()*
		Change the current working directory to {dir}.  The scope of
		the directory change depends on the directory of the current
		window:
			- If the current window has a window-local directory
			  (|:lcd|), then changes the window local directory.
			- Otherwise, if the current tabpage has a local
			  directory (|:tcd|) then changes the tabpage local
			  directory.
			- Otherwise, changes the global directory.
		{dir} must be a String.
		If successful, returns the previous working directory.  Pass
		this to another chdir() to restore the directory.
		On failure, returns an empty string.

		Example: >
			let save_dir = chdir(newdir)
			if save_dir != ""
			   " ... do some work
			   call chdir(save_dir)
			endif

<		Can also be used as a |method|: >
			GetDir()->chdir()
<
cindent({lnum})						*cindent()*
		Get the amount of indent for line {lnum} according the C
		indenting rules, as with 'cindent'.
		The indent is counted in spaces, the value of 'tabstop' is
		relevant.  {lnum} is used just like in |getline()|.
		When {lnum} is invalid or Vim was not compiled the |+cindent|
		feature, -1 is returned.
		See |C-indenting|.

		Can also be used as a |method|: >
			GetLnum()->cindent()

clearmatches([{win}])					*clearmatches()*
		Clears all matches previously defined for the current window
		by |matchadd()| and the |:match| commands.
		If {win} is specified, use the window with this number or
		window ID instead of the current window.

		Can also be used as a |method|: >
			GetWin()->clearmatches()
<
							*col()*
col({expr})	The result is a Number, which is the byte index of the column
		position given with {expr}.  The accepted positions are:
		    .	    the cursor position
		    $	    the end of the cursor line (the result is the
			    number of bytes in the cursor line plus one)
		    'x	    position of mark x (if the mark is not set, 0 is
			    returned)
		    v       In Visual mode: the start of the Visual area (the
			    cursor is the end).  When not in Visual mode
			    returns the cursor position.  Differs from |'<| in
			    that it's updated right away.
		Additionally {expr} can be [lnum, col]: a |List| with the line
		and column number. Most useful when the column is "$", to get
		the last column of a specific line.  When "lnum" or "col" is
		out of range then col() returns zero.
		To get the line number use |line()|.  To get both use
		|getpos()|.
		For the screen column position use |virtcol()|.  For the
		character position use |charcol()|.
		Note that only marks in the current file can be used.
		Examples: >
			col(".")		column of cursor
			col("$")		length of cursor line plus one
			col("'t")		column of mark t
			col("'" . markname)	column of mark markname
<		The first column is 1.  0 is returned for an error.
		For an uppercase mark the column may actually be in another
		buffer.
		For the cursor position, when 'virtualedit' is active, the
		column is one higher if the cursor is after the end of the
		line.  This can be used to obtain the column in Insert mode: >
			:imap <F2> <C-O>:let save_ve = &ve<CR>
				\<C-O>:set ve=all<CR>
				\<C-O>:echo col(".") . "\n" <Bar>
				\let &ve = save_ve<CR>

<		Can also be used as a |method|: >
			GetPos()->col()
<

complete({startcol}, {matches})			*complete()* *E785*
		Set the matches for Insert mode completion.
		Can only be used in Insert mode.  You need to use a mapping
		with CTRL-R = (see |i_CTRL-R|).  It does not work after CTRL-O
		or with an expression mapping.
		{startcol} is the byte offset in the line where the completed
		text start.  The text up to the cursor is the original text
		that will be replaced by the matches.  Use col('.') for an
		empty string.  "col('.') - 1" will replace one character by a
		match.
		{matches} must be a |List|.  Each |List| item is one match.
		See |complete-items| for the kind of items that are possible.
		Note that the after calling this function you need to avoid
		inserting anything that would cause completion to stop.
		The match can be selected with CTRL-N and CTRL-P as usual with
		Insert mode completion.  The popup menu will appear if
		specified, see |ins-completion-menu|.
		Example: >
	inoremap <F5> <C-R>=ListMonths()<CR>

	func! ListMonths()
	  call complete(col('.'), ['January', 'February', 'March',
		\ 'April', 'May', 'June', 'July', 'August', 'September',
		\ 'October', 'November', 'December'])
	  return ''
	endfunc
<		This isn't very useful, but it shows how it works.  Note that
		an empty string is returned to avoid a zero being inserted.

		Can also be used as a |method|, the base is passed as the
		second argument: >
			GetMatches()->complete(col('.'))

complete_add({expr})				*complete_add()*
		Add {expr} to the list of matches.  Only to be used by the
		function specified with the 'completefunc' option.
		Returns 0 for failure (empty string or out of memory),
		1 when the match was added, 2 when the match was already in
		the list.
		See |complete-functions| for an explanation of {expr}.  It is
		the same as one item in the list that 'omnifunc' would return.

		Can also be used as a |method|: >
			GetMoreMatches()->complete_add()

complete_check()				*complete_check()*
		Check for a key typed while looking for completion matches.
		This is to be used when looking for matches takes some time.
		Returns |TRUE| when searching for matches is to be aborted,
		zero otherwise.
		Only to be used by the function specified with the
		'completefunc' option.

							*complete_info()*
complete_info([{what}])
		Returns a |Dictionary| with information about Insert mode
		completion.  See |ins-completion|.
		The items are:
		   mode		Current completion mode name string.
				See |complete_info_mode| for the values.
		   pum_visible	|TRUE| if popup menu is visible.
				See |pumvisible()|.
		   items	List of completion matches.  Each item is a
				dictionary containing the entries "word",
				"abbr", "menu", "kind", "info" and "user_data".
				See |complete-items|.
		   selected	Selected item index.  First index is zero.
				Index is -1 if no item is selected (showing
				typed text only)
		   inserted	Inserted string. [NOT IMPLEMENT YET]

							*complete_info_mode*
		mode values are:
		   ""		     Not in completion mode
		   "keyword"	     Keyword completion |i_CTRL-X_CTRL-N|
		   "ctrl_x"	     Just pressed CTRL-X |i_CTRL-X|
		   "whole_line"	     Whole lines |i_CTRL-X_CTRL-L|
		   "files"	     File names |i_CTRL-X_CTRL-F|
		   "tags"	     Tags |i_CTRL-X_CTRL-]|
		   "path_defines"    Definition completion |i_CTRL-X_CTRL-D|
		   "path_patterns"   Include completion |i_CTRL-X_CTRL-I|
		   "dictionary"	     Dictionary |i_CTRL-X_CTRL-K|
		   "thesaurus"	     Thesaurus |i_CTRL-X_CTRL-T|
		   "cmdline"	     Vim Command line |i_CTRL-X_CTRL-V|
		   "function"	     User defined completion |i_CTRL-X_CTRL-U|
		   "omni"	     Omni completion |i_CTRL-X_CTRL-O|
		   "spell"	     Spelling suggestions |i_CTRL-X_s|
		   "eval"	     |complete()| completion
		   "unknown"	     Other internal modes

		If the optional {what} list argument is supplied, then only
		the items listed in {what} are returned.  Unsupported items in
		{what} are silently ignored.

		To get the position and size of the popup menu, see
		|pum_getpos()|. It's also available in |v:event| during the
		|CompleteChanged| event.

		Examples: >
			" Get all items
			call complete_info()
			" Get only 'mode'
			call complete_info(['mode'])
			" Get only 'mode' and 'pum_visible'
			call complete_info(['mode', 'pum_visible'])

<		Can also be used as a |method|: >
			GetItems()->complete_info()
<
						*confirm()*
confirm({msg} [, {choices} [, {default} [, {type}]]])
		confirm() offers the user a dialog, from which a choice can be
		made.  It returns the number of the choice.  For the first
		choice this is 1.
		Note: confirm() is only supported when compiled with dialog
		support, see |+dialog_con| and |+dialog_gui|.

		{msg} is displayed in a |dialog| with {choices} as the
		alternatives.  When {choices} is missing or empty, "&OK" is
		used (and translated).
		{msg} is a String, use '\n' to include a newline.  Only on
		some systems the string is wrapped when it doesn't fit.

		{choices} is a String, with the individual choices separated
		by '\n', e.g. >
			confirm("Save changes?", "&Yes\n&No\n&Cancel")
<		The letter after the '&' is the shortcut key for that choice.
		Thus you can type 'c' to select "Cancel".  The shortcut does
		not need to be the first letter: >
			confirm("file has been modified", "&Save\nSave &All")
<		For the console, the first letter of each choice is used as
		the default shortcut key.  Case is ignored.

		The optional {default} argument is the number of the choice
		that is made if the user hits <CR>.  Use 1 to make the first
		choice the default one.  Use 0 to not set a default.  If
		{default} is omitted, 1 is used.

		The optional {type} argument gives the type of dialog.  This
		is only used for the icon of the GTK, Mac, Motif and Win32
		GUI.  It can be one of these values: "Error", "Question",
		"Info", "Warning" or "Generic".  Only the first character is
		relevant.  When {type} is omitted, "Generic" is used.

		If the user aborts the dialog by pressing <Esc>, CTRL-C,
		or another valid interrupt key, confirm() returns 0.

		An example: >
   :let choice = confirm("What do you want?", "&Apples\n&Oranges\n&Bananas", 2)
   :if choice == 0
   :	echo "make up your mind!"
   :elseif choice == 3
   :	echo "tasteful"
   :else
   :	echo "I prefer bananas myself."
   :endif
<		In a GUI dialog, buttons are used.  The layout of the buttons
		depends on the 'v' flag in 'guioptions'.  If it is included,
		the buttons are always put vertically.  Otherwise,  confirm()
		tries to put the buttons in one horizontal line.  If they
		don't fit, a vertical layout is used anyway.  For some systems
		the horizontal layout is always used.

		Can also be used as a |method|in: >
			BuildMessage()->confirm("&Yes\n&No")
<
							*copy()*
copy({expr})	Make a copy of {expr}.  For Numbers and Strings this isn't
		different from using {expr} directly.
		When {expr} is a |List| a shallow copy is created.  This means
		that the original |List| can be changed without changing the
		copy, and vice versa.  But the items are identical, thus
		changing an item changes the contents of both |Lists|.
		A |Dictionary| is copied in a similar way as a |List|.
		Also see |deepcopy()|.
		Can also be used as a |method|: >
			mylist->copy()

cos({expr})						*cos()*
		Return the cosine of {expr}, measured in radians, as a |Float|.
		{expr} must evaluate to a |Float| or a |Number|.
		Examples: >
			:echo cos(100)
<			0.862319 >
			:echo cos(-4.01)
<			-0.646043

		Can also be used as a |method|: >
			Compute()->cos()
<
		{only available when compiled with the |+float| feature}


cosh({expr})						*cosh()*
		Return the hyperbolic cosine of {expr} as a |Float| in the range
		[1, inf].
		{expr} must evaluate to a |Float| or a |Number|.
		Examples: >
			:echo cosh(0.5)
<			1.127626 >
			:echo cosh(-0.5)
<			-1.127626

		Can also be used as a |method|: >
			Compute()->cosh()
<
		{only available when compiled with the |+float| feature}


count({comp}, {expr} [, {ic} [, {start}]])			*count()*
		Return the number of times an item with value {expr} appears
		in |String|, |List| or |Dictionary| {comp}.

		If {start} is given then start with the item with this index.
		{start} can only be used with a |List|.

		When {ic} is given and it's |TRUE| then case is ignored.

		When {comp} is a string then the number of not overlapping
		occurrences of {expr} is returned. Zero is returned when
		{expr} is an empty string.

		Can also be used as a |method|: >
			mylist->count(val)
<
							*cscope_connection()*
cscope_connection([{num} , {dbpath} [, {prepend}]])
		Checks for the existence of a |cscope| connection.  If no
		parameters are specified, then the function returns:
			0, if cscope was not available (not compiled in), or
			   if there are no cscope connections;
			1, if there is at least one cscope connection.

		If parameters are specified, then the value of {num}
		determines how existence of a cscope connection is checked:

		{num}	Description of existence check
		-----	------------------------------
		0	Same as no parameters (e.g., "cscope_connection()").
		1	Ignore {prepend}, and use partial string matches for
			{dbpath}.
		2	Ignore {prepend}, and use exact string matches for
			{dbpath}.
		3	Use {prepend}, use partial string matches for both
			{dbpath} and {prepend}.
		4	Use {prepend}, use exact string matches for both
			{dbpath} and {prepend}.

		Note: All string comparisons are case sensitive!

		Examples.  Suppose we had the following (from ":cs show"): >

  # pid    database name			prepend path
  0 27664  cscope.out				/usr/local
<
		Invocation					Return Val ~
		----------					---------- >
		cscope_connection()					1
		cscope_connection(1, "out")				1
		cscope_connection(2, "out")				0
		cscope_connection(3, "out")				0
		cscope_connection(3, "out", "local")			1
		cscope_connection(4, "out")				0
		cscope_connection(4, "out", "local")			0
		cscope_connection(4, "cscope.out", "/usr/local")	1
<
cursor({lnum}, {col} [, {off}])				*cursor()*
cursor({list})
		Positions the cursor at the column (byte count) {col} in the
		line {lnum}.  The first column is one.

		When there is one argument {list} this is used as a |List|
		with two, three or four item:
			[{lnum}, {col}]
			[{lnum}, {col}, {off}]
			[{lnum}, {col}, {off}, {curswant}]
		This is like the return value of |getpos()| or |getcurpos()|,
		but without the first item.

		To position the cursor using the character count, use
		|setcursorcharpos()|.

		Does not change the jumplist.
		If {lnum} is greater than the number of lines in the buffer,
		the cursor will be positioned at the last line in the buffer.
		If {lnum} is zero, the cursor will stay in the current line.
		If {col} is greater than the number of bytes in the line,
		the cursor will be positioned at the last character in the
		line.
		If {col} is zero, the cursor will stay in the current column.
		If {curswant} is given it is used to set the preferred column
		for vertical movement.  Otherwise {col} is used.

		When 'virtualedit' is used {off} specifies the offset in
		screen columns from the start of the character.  E.g., a
		position within a <Tab> or after the last character.
		Returns 0 when the position could be set, -1 otherwise.

		Can also be used as a |method|: >
			GetCursorPos()->cursor()

debugbreak({pid})					*debugbreak()*
		Specifically used to interrupt a program being debugged.  It
		will cause process {pid} to get a SIGTRAP.  Behavior for other
		processes is undefined. See |terminal-debugger|.
		{only available on MS-Windows}

		Can also be used as a |method|: >
			GetPid()->debugbreak()

deepcopy({expr} [, {noref}])				*deepcopy()* *E698*
		Make a copy of {expr}.  For Numbers and Strings this isn't
		different from using {expr} directly.
		When {expr} is a |List| a full copy is created.  This means
		that the original |List| can be changed without changing the
		copy, and vice versa.  When an item is a |List| or
		|Dictionary|, a copy for it is made, recursively.  Thus
		changing an item in the copy does not change the contents of
		the original |List|.
		A |Dictionary| is copied in a similar way as a |List|.

		When {noref} is omitted or zero a contained |List| or
		|Dictionary| is only copied once.  All references point to
		this single copy.  With {noref} set to 1 every occurrence of a
		|List| or |Dictionary| results in a new copy.  This also means
		that a cyclic reference causes deepcopy() to fail.
								*E724*
		Nesting is possible up to 100 levels.  When there is an item
		that refers back to a higher level making a deep copy with
		{noref} set to 1 will fail.
		Also see |copy()|.

		Can also be used as a |method|: >
			GetObject()->deepcopy()

delete({fname} [, {flags}])					*delete()*
		Without {flags} or with {flags} empty: Deletes the file by the
		name {fname}.  This also works when {fname} is a symbolic link.

		When {flags} is "d": Deletes the directory by the name
		{fname}.  This fails when directory {fname} is not empty.

		When {flags} is "rf": Deletes the directory by the name
		{fname} and everything in it, recursively.  BE CAREFUL!
		Note: on MS-Windows it is not possible to delete a directory
		that is being used.

		A symbolic link itself is deleted, not what it points to.

		The result is a Number, which is 0 if the delete operation was
		successful and -1 when the deletion failed or partly failed.

		Use |remove()| to delete an item from a |List|.
		To delete a line from the buffer use |:delete| or
		|deletebufline()|.

		Can also be used as a |method|: >
			GetName()->delete()

deletebufline({expr}, {first} [, {last}])		*deletebufline()*
		Delete lines {first} to {last} (inclusive) from buffer {expr}.
		If {last} is omitted then delete line {first} only.
		On success 0 is returned, on failure 1 is returned.

		This function works only for loaded buffers. First call
		|bufload()| if needed.

		For the use of {expr}, see |bufname()| above.

		{first} and {last} are used like with |getline()|. Note that
		when using |line()| this refers to the current buffer. Use "$"
		to refer to the last line in buffer {expr}.

		Can also be used as a |method|: >
			GetBuffer()->deletebufline(1)
<
							*did_filetype()*
did_filetype()	Returns |TRUE| when autocommands are being executed and the
		FileType event has been triggered at least once.  Can be used
		to avoid triggering the FileType event again in the scripts
		that detect the file type. |FileType|
		Returns |FALSE| when `:setf FALLBACK` was used.
		When editing another file, the counter is reset, thus this
		really checks if the FileType event has been triggered for the
		current buffer.  This allows an autocommand that starts
		editing another buffer to set 'filetype' and load a syntax
		file.

diff_filler({lnum})					*diff_filler()*
		Returns the number of filler lines above line {lnum}.
		These are the lines that were inserted at this point in
		another diff'ed window.  These filler lines are shown in the
		display but don't exist in the buffer.
		{lnum} is used like with |getline()|.  Thus "." is the current
		line, "'m" mark m, etc.
		Returns 0 if the current window is not in diff mode.

		Can also be used as a |method|: >
			GetLnum()->diff_filler()

diff_hlID({lnum}, {col})				*diff_hlID()*
		Returns the highlight ID for diff mode at line {lnum} column
		{col} (byte index).  When the current line does not have a
		diff change zero is returned.
		{lnum} is used like with |getline()|.  Thus "." is the current
		line, "'m" mark m, etc.
		{col} is 1 for the leftmost column, {lnum} is 1 for the first
		line.
		The highlight ID can be used with |synIDattr()| to obtain
		syntax information about the highlighting.

		Can also be used as a |method|: >
			GetLnum()->diff_hlID(col)


echoraw({expr})						*echoraw()*
		Output {expr} as-is, including unprintable characters.  This
		can be used to output a terminal code. For example, to disable
		modifyOtherKeys: >
			call echoraw(&t_TE)
<		and to enable it again: >
			call echoraw(&t_TI)
<		Use with care, you can mess up the terminal this way.


empty({expr})						*empty()*
		Return the Number 1 if {expr} is empty, zero otherwise.
		- A |List| or |Dictionary| is empty when it does not have any
		  items.
		- A |String| is empty when its length is zero.
		- A |Number| and |Float| are empty when their value is zero.
		- |v:false|, |v:none| and |v:null| are empty, |v:true| is not.
		- A |Job| is empty when it failed to start.
		- A |Channel| is empty when it is closed.
		- A |Blob| is empty when its length is zero.

		For a long |List| this is much faster than comparing the
		length with zero.

		Can also be used as a |method|: >
			mylist->empty()

environ()						*environ()*
		Return all of environment variables as dictionary. You can
		check if an environment variable exists like this: >
			:echo has_key(environ(), 'HOME')
<		Note that the variable name may be CamelCase; to ignore case
		use this: >
			:echo index(keys(environ()), 'HOME', 0, 1) != -1

escape({string}, {chars})				*escape()*
		Escape the characters in {chars} that occur in {string} with a
		backslash.  Example: >
			:echo escape('c:\program files\vim', ' \')
<		results in: >
			c:\\program\ files\\vim
<		Also see |shellescape()| and |fnameescape()|.

		Can also be used as a |method|: >
			GetText()->escape(' \')
<
							*eval()*
eval({string})	Evaluate {string} and return the result.  Especially useful to
		turn the result of |string()| back into the original value.
		This works for Numbers, Floats, Strings, Blobs and composites
		of them.  Also works for |Funcref|s that refer to existing
		functions.

		Can also be used as a |method|: >
			argv->join()->eval()

eventhandler()						*eventhandler()*
		Returns 1 when inside an event handler.  That is that Vim got
		interrupted while waiting for the user to type a character,
		e.g., when dropping a file on Vim.  This means interactive
		commands cannot be used.  Otherwise zero is returned.

executable({expr})					*executable()*
		This function checks if an executable with the name {expr}
		exists.  {expr} must be the name of the program without any
		arguments.
		executable() uses the value of $PATH and/or the normal
		searchpath for programs.		*PATHEXT*
		On MS-Windows the ".exe", ".bat", etc. can optionally be
		included.  Then the extensions in $PATHEXT are tried.  Thus if
		"foo.exe" does not exist, "foo.exe.bat" can be found.  If
		$PATHEXT is not set then ".com;.exe;.bat;.cmd" is used.  A dot
		by itself can be used in $PATHEXT to try using the name
		without an extension.  When 'shell' looks like a Unix shell,
		then the name is also tried without adding an extension.
		On MS-Windows it only checks if the file exists and is not a
		directory, not if it's really executable.
		On MS-Windows an executable in the same directory as Vim is
		always found.  Since this directory is added to $PATH it
		should also work to execute it |win32-PATH|.
		The result is a Number:
			1	exists
			0	does not exist
			-1	not implemented on this system
		|exepath()| can be used to get the full path of an executable.

		Can also be used as a |method|: >
			GetCommand()->executable()

execute({command} [, {silent}])					*execute()*
		Execute an Ex command or commands and return the output as a
		string.
		{command} can be a string or a List.  In case of a List the
		lines are executed one by one.
		This is equivalent to: >
			redir => var
			{command}
			redir END
<
		The optional {silent} argument can have these values:
			""		no `:silent` used
			"silent"	`:silent` used
			"silent!"	`:silent!` used
		The default is "silent".  Note that with "silent!", unlike
		`:redir`, error messages are dropped.  When using an external
		command the screen may be messed up, use `system()` instead.
							*E930*
		It is not possible to use `:redir` anywhere in {command}.

		To get a list of lines use |split()| on the result: >
			split(execute('args'), "\n")

<		To execute a command in another window than the current one
		use `win_execute()`.

		When used recursively the output of the recursive call is not
		included in the output of the higher level call.

		Can also be used as a |method|: >
			GetCommand()->execute()

exepath({expr})						*exepath()*
		If {expr} is an executable and is either an absolute path, a
		relative path or found in $PATH, return the full path.
		Note that the current directory is used when {expr} starts
		with "./", which may be a problem for Vim: >
			echo exepath(v:progpath)
<		If {expr} cannot be found in $PATH or is not executable then
		an empty string is returned.

		Can also be used as a |method|: >
			GetCommand()->exepath()
<
							*exists()*
exists({expr})	The result is a Number, which is |TRUE| if {expr} is defined,
		zero otherwise.

		For checking for a supported feature use |has()|.
		For checking if a file exists use |filereadable()|.

		The {expr} argument is a string, which contains one of these:
			&option-name	Vim option (only checks if it exists,
					not if it really works)
			+option-name	Vim option that works.
			$ENVNAME	environment variable (could also be
					done by comparing with an empty
					string)
			*funcname	built-in function (see |functions|)
					or user defined function (see
					|user-functions|) that is implemented.
					Also works for a variable that is a
					Funcref.
			?funcname	built-in function that could be
					implemented; to be used to check if
					"funcname" is valid
			varname		internal variable (see
					|internal-variables|).  Also works
					for |curly-braces-names|, |Dictionary|
					entries, |List| items, etc.  Beware
					that evaluating an index may cause an
					error message for an invalid
					expression.  E.g.: >
					   :let l = [1, 2, 3]
					   :echo exists("l[5]")
<					   0 >
					   :echo exists("l[xx]")
<					   E121: Undefined variable: xx
					   0
			:cmdname	Ex command: built-in command, user
					command or command modifier |:command|.
					Returns:
					1  for match with start of a command
					2  full match with a command
					3  matches several user commands
					To check for a supported command
					always check the return value to be 2.
			:2match		The |:2match| command.
			:3match		The |:3match| command.
			#event		autocommand defined for this event
			#event#pattern	autocommand defined for this event and
					pattern (the pattern is taken
					literally and compared to the
					autocommand patterns character by
					character)
			#group		autocommand group exists
			#group#event	autocommand defined for this group and
					event.
			#group#event#pattern
					autocommand defined for this group,
					event and pattern.
			##event		autocommand for this event is
					supported.

		Examples: >
			exists("&shortname")
			exists("$HOSTNAME")
			exists("*strftime")
			exists("*s:MyFunc")
			exists("bufcount")
			exists(":Make")
			exists("#CursorHold")
			exists("#BufReadPre#*.gz")
			exists("#filetypeindent")
			exists("#filetypeindent#FileType")
			exists("#filetypeindent#FileType#*")
			exists("##ColorScheme")
<		There must be no space between the symbol (&/$/*/#) and the
		name.
		There must be no extra characters after the name, although in
		a few cases this is ignored.  That may become more strict in
		the future, thus don't count on it!
		Working example: >
			exists(":make")
<		NOT working example: >
			exists(":make install")

<		Note that the argument must be a string, not the name of the
		variable itself.  For example: >
			exists(bufcount)
<		This doesn't check for existence of the "bufcount" variable,
		but gets the value of "bufcount", and checks if that exists.

		Can also be used as a |method|: >
			Varname()->exists()

exp({expr})						*exp()*
		Return the exponential of {expr} as a |Float| in the range
		[0, inf].
		{expr} must evaluate to a |Float| or a |Number|.
		Examples: >
			:echo exp(2)
<			7.389056 >
			:echo exp(-1)
<			0.367879

		Can also be used as a |method|: >
			Compute()->exp()
<
		{only available when compiled with the |+float| feature}


expand({expr} [, {nosuf} [, {list}]])				*expand()*
		Expand wildcards and the following special keywords in {expr}.
		'wildignorecase' applies.

		If {list} is given and it is |TRUE|, a List will be returned.
		Otherwise the result is a String and when there are several
		matches, they are separated by <NL> characters.  [Note: in
		version 5.0 a space was used, which caused problems when a
		file name contains a space]

		If the expansion fails, the result is an empty string.  A name
		for a non-existing file is not included, unless {expr} does
		not start with '%', '#' or '<', see below.

		When {expr} starts with '%', '#' or '<', the expansion is done
		like for the |cmdline-special| variables with their associated
		modifiers.  Here is a short overview:

			%		current file name
			#		alternate file name
			#n		alternate file name n
			<cfile>		file name under the cursor
			<afile>		autocmd file name
			<abuf>		autocmd buffer number (as a String!)
			<amatch>	autocmd matched name
			<cexpr>		C expression under the cursor
			<sfile>		sourced script file or function name
			<slnum>		sourced script line number or function
					line number
			<sflnum>	script file line number, also when in
					a function
			<SID>		"<SNR>123_"  where "123" is the
					current script ID  |<SID>|
			<stack>		call stack
			<cword>		word under the cursor
			<cWORD>		WORD under the cursor
			<client>	the {clientid} of the last received
					message |server2client()|
		Modifiers:
			:p		expand to full path
			:h		head (last path component removed)
			:t		tail (last path component only)
			:r		root (one extension removed)
			:e		extension only

		Example: >
			:let &tags = expand("%:p:h") . "/tags"
<		Note that when expanding a string that starts with '%', '#' or
		'<', any following text is ignored.  This does NOT work: >
			:let doesntwork = expand("%:h.bak")
<		Use this: >
			:let doeswork = expand("%:h") . ".bak"
<		Also note that expanding "<cfile>" and others only returns the
		referenced file name without further expansion.  If "<cfile>"
		is "~/.cshrc", you need to do another expand() to have the
		"~/" expanded into the path of the home directory: >
			:echo expand(expand("<cfile>"))
<
		There cannot be white space between the variables and the
		following modifier.  The |fnamemodify()| function can be used
		to modify normal file names.

		When using '%' or '#', and the current or alternate file name
		is not defined, an empty string is used.  Using "%:p" in a
		buffer with no name, results in the current directory, with a
		'/' added.

		When {expr} does not start with '%', '#' or '<', it is
		expanded like a file name is expanded on the command line.
		'suffixes' and 'wildignore' are used, unless the optional
		{nosuf} argument is given and it is |TRUE|.
		Names for non-existing files are included.  The "**" item can
		be used to search in a directory tree.  For example, to find
		all "README" files in the current directory and below: >
			:echo expand("**/README")
<
		expand() can also be used to expand variables and environment
		variables that are only known in a shell.  But this can be
		slow, because a shell may be used to do the expansion.  See
		|expr-env-expand|.
		The expanded variable is still handled like a list of file
		names.  When an environment variable cannot be expanded, it is
		left unchanged.  Thus ":echo expand('$FOOBAR')" results in
		"$FOOBAR".

		See |glob()| for finding existing files.  See |system()| for
		getting the raw output of an external command.

		Can also be used as a |method|: >
			Getpattern()->expand()

expandcmd({expr})					*expandcmd()*
		Expand special items in {expr} like what is done for an Ex
		command such as `:edit`.  This expands special keywords, like
		with |expand()|, and environment variables, anywhere in
		{expr}.  "~user" and "~/path" are only expanded at the start.
		Returns the expanded string.  Example: >
			:echo expandcmd('make %<.o')

<		Can also be used as a |method|: >
			GetCommand()->expandcmd()
<
extend({expr1}, {expr2} [, {expr3}])			*extend()*
		{expr1} and {expr2} must be both |Lists| or both
		|Dictionaries|.

		If they are |Lists|: Append {expr2} to {expr1}.
		If {expr3} is given insert the items of {expr2} before the
		item with index {expr3} in {expr1}.  When {expr3} is zero
		insert before the first item.  When {expr3} is equal to
		len({expr1}) then {expr2} is appended.
		Examples: >
			:echo sort(extend(mylist, [7, 5]))
			:call extend(mylist, [2, 3], 1)
<		When {expr1} is the same List as {expr2} then the number of
		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
		(where N is the original length of the List).
		Use |add()| to concatenate one item to a list.  To concatenate
		two lists into a new list use the + operator: >
			:let newlist = [1, 2, 3] + [4, 5]
<
		If they are |Dictionaries|:
		Add all entries from {expr2} to {expr1}.
		If a key exists in both {expr1} and {expr2} then {expr3} is
		used to decide what to do:
		{expr3} = "keep": keep the value of {expr1}
		{expr3} = "force": use the value of {expr2}
		{expr3} = "error": give an error message		*E737*
		When {expr3} is omitted then "force" is assumed.

		{expr1} is changed when {expr2} is not empty.  If necessary
		make a copy of {expr1} first.
		{expr2} remains unchanged.
		When {expr1} is locked and {expr2} is not empty the operation
		fails.
		Returns {expr1}.

		Can also be used as a |method|: >
			mylist->extend(otherlist)


extendnew({expr1}, {expr2} [, {expr3}])			*extendnew()*
		Like |extend()| but instead of adding items to {expr1} a new
		List or Dictionary is created and returned.  {expr1} remains
		unchanged.  Items can still be changed by {expr2}, if you
		don't want that use |deepcopy()| first.


feedkeys({string} [, {mode}])				*feedkeys()*
		Characters in {string} are queued for processing as if they
		come from a mapping or were typed by the user.

		By default the string is added to the end of the typeahead
		buffer, thus if a mapping is still being executed the
		characters come after them.  Use the 'i' flag to insert before
		other characters, they will be executed next, before any
		characters from a mapping.

		The function does not wait for processing of keys contained in
		{string}.

		To include special keys into {string}, use double-quotes
		and "\..." notation |expr-quote|. For example,
		feedkeys("\<CR>") simulates pressing of the <Enter> key. But
		feedkeys('\<CR>') pushes 5 characters.
		A special code that might be useful is <Ignore>, it exits the
		wait for a character without doing anything.  *<Ignore>*

		{mode} is a String, which can contain these character flags:
		'm'	Remap keys. This is default.  If {mode} is absent,
			keys are remapped.
		'n'	Do not remap keys.
		't'	Handle keys as if typed; otherwise they are handled as
			if coming from a mapping.  This matters for undo,
			opening folds, etc.
		'L'	Lowlevel input.  Only works for Unix or when using the
			GUI. Keys are used as if they were coming from the
			terminal.  Other flags are not used.  *E980*
			When a CTRL-C interrupts and 't' is included it sets
			the internal "got_int" flag.
		'i'	Insert the string instead of appending (see above).
		'x'	Execute commands until typeahead is empty.  This is
			similar to using ":normal!".  You can call feedkeys()
			several times without 'x' and then one time with 'x'
			(possibly with an empty {string}) to execute all the
			typeahead.  Note that when Vim ends in Insert mode it
			will behave as if <Esc> is typed, to avoid getting
			stuck, waiting for a character to be typed before the
			script continues.
			Note that if you manage to call feedkeys() while
			executing commands, thus calling it recursively, then
			all typeahead will be consumed by the last call.
		'!'	When used with 'x' will not end Insert mode. Can be
			used in a test when a timer is set to exit Insert mode
			a little later.  Useful for testing CursorHoldI.

		Return value is always 0.

		Can also be used as a |method|: >
			GetInput()->feedkeys()

filereadable({file})					*filereadable()*
		The result is a Number, which is |TRUE| when a file with the
		name {file} exists, and can be read.  If {file} doesn't exist,
		or is a directory, the result is |FALSE|.  {file} is any
		expression, which is used as a String.
		If you don't care about the file being readable you can use
		|glob()|.
		{file} is used as-is, you may want to expand wildcards first: >
			echo filereadable('~/.vimrc')
			0
			echo filereadable(expand('~/.vimrc'))
			1

<		Can also be used as a |method|: >
			GetName()->filereadable()
<							*file_readable()*
		Obsolete name: file_readable().


filewritable({file})					*filewritable()*
		The result is a Number, which is 1 when a file with the
		name {file} exists, and can be written.  If {file} doesn't
		exist, or is not writable, the result is 0.  If {file} is a
		directory, and we can write to it, the result is 2.

		Can also be used as a |method|: >
			GetName()->filewritable()


filter({expr1}, {expr2})				*filter()*
		{expr1} must be a |List| or a |Dictionary|.
		For each item in {expr1} evaluate {expr2} and when the result
		is zero remove the item from the |List| or |Dictionary|.
		{expr2} must be a |string| or |Funcref|.

		If {expr2} is a |string|, inside {expr2} |v:val| has the value
		of the current item.  For a |Dictionary| |v:key| has the key
		of the current item and for a |List| |v:key| has the index of
		the current item.
		Examples: >
			call filter(mylist, 'v:val !~ "OLD"')
<		Removes the items where "OLD" appears. >
			call filter(mydict, 'v:key >= 8')
<		Removes the items with a key below 8. >
			call filter(var, 0)
<		Removes all the items, thus clears the |List| or |Dictionary|.

		Note that {expr2} is the result of expression and is then
		used as an expression again.  Often it is good to use a
		|literal-string| to avoid having to double backslashes.

		If {expr2} is a |Funcref| it must take two arguments:
			1. the key or the index of the current item.
			2. the value of the current item.
		The function must return |TRUE| if the item should be kept.
		Example that keeps the odd items of a list: >
			func Odd(idx, val)
			  return a:idx % 2 == 1
			endfunc
			call filter(mylist, function('Odd'))
<		It is shorter when using a |lambda|: >
			call filter(myList, {idx, val -> idx * val <= 42})
<		If you do not use "val" you can leave it out: >
			call filter(myList, {idx -> idx % 2 == 1})
<
		The operation is done in-place.  If you want a |List| or
		|Dictionary| to remain unmodified make a copy first: >
			:let l = filter(copy(mylist), 'v:val =~ "KEEP"')

<		Returns {expr1}, the |List| or |Dictionary| that was filtered.
		When an error is encountered while evaluating {expr2} no
		further items in {expr1} are processed.  When {expr2} is a
		Funcref errors inside a function are ignored, unless it was
		defined with the "abort" flag.

		Can also be used as a |method|: >
			mylist->filter(expr2)

finddir({name} [, {path} [, {count}]])				*finddir()*
		Find directory {name} in {path}.  Supports both downwards and
		upwards recursive directory searches.  See |file-searching|
		for the syntax of {path}.
		Returns the path of the first found match.  When the found
		directory is below the current directory a relative path is
		returned.  Otherwise a full path is returned.
		If {path} is omitted or empty then 'path' is used.
		If the optional {count} is given, find {count}'s occurrence of
		{name} in {path} instead of the first one.
		When {count} is negative return all the matches in a |List|.
		This is quite similar to the ex-command |:find|.
		{only available when compiled with the |+file_in_path|
		feature}

		Can also be used as a |method|: >
			GetName()->finddir()

findfile({name} [, {path} [, {count}]])				*findfile()*
		Just like |finddir()|, but find a file instead of a directory.
		Uses 'suffixesadd'.
		Example: >
			:echo findfile("tags.vim", ".;")
<		Searches from the directory of the current file upwards until
		it finds the file "tags.vim".

		Can also be used as a |method|: >
			GetName()->findfile()

flatten({list} [, {maxdepth}])					*flatten()*
		Flatten {list} up to {maxdepth} levels.  Without {maxdepth}
		the result is a |List| without nesting, as if {maxdepth} is
		a very large number.
		The {list} is changed in place, make a copy first if you do
		not want that.
								*E900*
		{maxdepth} means how deep in nested lists changes are made.
		{list} is not modified when {maxdepth} is 0.
		{maxdepth} must be positive number.

		If there is an error the number zero is returned.

		Example: >
			:echo flatten([1, [2, [3, 4]], 5])
<			[1, 2, 3, 4, 5] >
			:echo flatten([1, [2, [3, 4]], 5], 1)
<			[1, 2, [3, 4], 5]

float2nr({expr})					*float2nr()*
		Convert {expr} to a Number by omitting the part after the
		decimal point.
		{expr} must evaluate to a |Float| or a Number.
		When the value of {expr} is out of range for a |Number| the
		result is truncated to 0x7fffffff or -0x7fffffff (or when
		64-bit Number support is enabled, 0x7fffffffffffffff or
		-0x7fffffffffffffff).  NaN results in -0x80000000 (or when
		64-bit Number support is enabled, -0x8000000000000000).
		Examples: >
			echo float2nr(3.95)
<			3  >
			echo float2nr(-23.45)
<			-23  >
			echo float2nr(1.0e100)
<			2147483647  (or 9223372036854775807) >
			echo float2nr(-1.0e150)
<			-2147483647 (or -9223372036854775807) >
			echo float2nr(1.0e-100)
<			0

		Can also be used as a |method|: >
			Compute()->float2nr()
<
		{only available when compiled with the |+float| feature}


floor({expr})							*floor()*
		Return the largest integral value less than or equal to
		{expr} as a |Float| (round down).
		{expr} must evaluate to a |Float| or a |Number|.
		Examples: >
			echo floor(1.856)
<			1.0  >
			echo floor(-5.456)
<			-6.0  >
			echo floor(4.0)
<			4.0

		Can also be used as a |method|: >
			Compute()->floor()
<
		{only available when compiled with the |+float| feature}


fmod({expr1}, {expr2})					*fmod()*
		Return the remainder of {expr1} / {expr2}, even if the
		division is not representable.  Returns {expr1} - i * {expr2}
		for some integer i such that if {expr2} is non-zero, the
		result has the same sign as {expr1} and magnitude less than
		the magnitude of {expr2}.  If {expr2} is zero, the value
		returned is zero.  The value returned is a |Float|.
		{expr1} and {expr2} must evaluate to a |Float| or a |Number|.
		Examples: >
			:echo fmod(12.33, 1.22)
<			0.13 >
			:echo fmod(-12.33, 1.22)
<			-0.13

		Can also be used as a |method|: >
			Compute()->fmod(1.22)
<
		{only available when compiled with |+float| feature}


fnameescape({string})					*fnameescape()*
		Escape {string} for use as file name command argument.  All
		characters that have a special meaning, such as '%' and '|'
		are escaped with a backslash.
		For most systems the characters escaped are
		" \t\n*?[{`$\\%#'\"|!<".  For systems where a backslash
		appears in a filename, it depends on the value of 'isfname'.
		A leading '+' and '>' is also escaped (special after |:edit|
		and |:write|).  And a "-" by itself (special after |:cd|).
		Example: >
			:let fname = '+some str%nge|name'
			:exe "edit " . fnameescape(fname)
<		results in executing: >
			edit \+some\ str\%nge\|name
<
		Can also be used as a |method|: >
			GetName()->fnameescape()

fnamemodify({fname}, {mods})				*fnamemodify()*
		Modify file name {fname} according to {mods}.  {mods} is a
		string of characters like it is used for file names on the
		command line.  See |filename-modifiers|.
		Example: >
			:echo fnamemodify("main.c", ":p:h")
<		results in: >
			/home/mool/vim/vim/src
<		If {mods} is empty then {fname} is returned.
		Note: Environment variables don't work in {fname}, use
		|expand()| first then.

		Can also be used as a |method|: >
			GetName()->fnamemodify(':p:h')

foldclosed({lnum})					*foldclosed()*
		The result is a Number.  If the line {lnum} is in a closed
		fold, the result is the number of the first line in that fold.
		If the line {lnum} is not in a closed fold, -1 is returned.

		Can also be used as a |method|: >
			GetLnum()->foldclosed()

foldclosedend({lnum})					*foldclosedend()*
		The result is a Number.  If the line {lnum} is in a closed
		fold, the result is the number of the last line in that fold.
		If the line {lnum} is not in a closed fold, -1 is returned.

		Can also be used as a |method|: >
			GetLnum()->foldclosedend()

foldlevel({lnum})					*foldlevel()*
		The result is a Number, which is the foldlevel of line {lnum}
		in the current buffer.  For nested folds the deepest level is
		returned.  If there is no fold at line {lnum}, zero is
		returned.  It doesn't matter if the folds are open or closed.
		When used while updating folds (from 'foldexpr') -1 is
		returned for lines where folds are still to be updated and the
		foldlevel is unknown.  As a special case the level of the
		previous line is usually available.

		Can also be used as a |method|: >
			GetLnum()->foldlevel()
<
							*foldtext()*
foldtext()	Returns a String, to be displayed for a closed fold.  This is
		the default function used for the 'foldtext' option and should
		only be called from evaluating 'foldtext'.  It uses the
		|v:foldstart|, |v:foldend| and |v:folddashes| variables.
		The returned string looks like this: >
			+-- 45 lines: abcdef
<		The number of leading dashes depends on the foldlevel.  The
		"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,
		"//" or "/*" and the text from the 'foldmarker' and
		'commentstring' options is removed.
		When used to draw the actual foldtext, the rest of the line
		will be filled with the fold char from the 'fillchars'
		setting.
		{not available when compiled without the |+folding| feature}

foldtextresult({lnum})					*foldtextresult()*
		Returns the text that is displayed for the closed fold at line
		{lnum}.  Evaluates 'foldtext' in the appropriate context.
		When there is no closed fold at {lnum} an empty string is
		returned.
		{lnum} is used like with |getline()|.  Thus "." is the current
		line, "'m" mark m, etc.
		Useful when exporting folded text, e.g., to HTML.
		{not available when compiled without the |+folding| feature}


		Can also be used as a |method|: >
			GetLnum()->foldtextresult()
<
							*foreground()*
foreground()	Move the Vim window to the foreground.  Useful when sent from
		a client to a Vim server. |remote_send()|
		On Win32 systems this might not work, the OS does not always
		allow a window to bring itself to the foreground.  Use
		|remote_foreground()| instead.
		{only in the Win32, Athena, Motif and GTK GUI versions and the
		Win32 console version}

						*funcref()*
funcref({name} [, {arglist}] [, {dict}])
		Just like |function()|, but the returned Funcref will lookup
		the function by reference, not by name.  This matters when the
		function {name} is redefined later.

		Unlike |function()|, {name} must be an existing user function.
		Also for autoloaded functions. {name} cannot be a builtin
		function.

		Can also be used as a |method|: >
			GetFuncname()->funcref([arg])
<
					*function()* *E700* *E922* *E923*
function({name} [, {arglist}] [, {dict}])
		Return a |Funcref| variable that refers to function {name}.
		{name} can be the name of a user defined function or an
		internal function.

		{name} can also be a Funcref or a partial.  When it is a
		partial the dict stored in it will be used and the {dict}
		argument is not allowed. E.g.: >
			let FuncWithArg = function(dict.Func, [arg])
			let Broken = function(dict.Func, [arg], dict)
<
		When using the Funcref the function will be found by {name},
		also when it was redefined later.  Use |funcref()| to keep the
		same function.

		When {arglist} or {dict} is present this creates a partial.
		That means the argument list and/or the dictionary is stored in
		the Funcref and will be used when the Funcref is called.

		The arguments are passed to the function in front of other
		arguments, but after any argument from |method|.  Example: >
			func Callback(arg1, arg2, name)
			...
			let Partial = function('Callback', ['one', 'two'])
			...
			call Partial('name')
<		Invokes the function as with: >
			call Callback('one', 'two', 'name')

<		With a |method|: >
			func Callback(one, two, three)
			...
			let Partial = function('Callback', ['two'])
			...
			eval 'one'->Partial('three')
<		Invokes the function as with: >
			call Callback('one', 'two', 'three')

<		The function() call can be nested to add more arguments to the
		Funcref.  The extra arguments are appended to the list of
		arguments.  Example: >
			func Callback(arg1, arg2, name)
			...
			let Func = function('Callback', ['one'])
			let Func2 = function(Func, ['two'])
			...
			call Func2('name')
<		Invokes the function as with: >
			call Callback('one', 'two', 'name')

<		The Dictionary is only useful when calling a "dict" function.
		In that case the {dict} is passed in as "self". Example: >
			function Callback() dict
			   echo "called for " . self.name
			endfunction
			...
			let context = {"name": "example"}
			let Func = function('Callback', context)
			...
			call Func()	" will echo: called for example
<		The use of function() is not needed when there are no extra
		arguments, these two are equivalent: >
			let Func = function('Callback', context)
			let Func = context.Callback

<		The argument list and the Dictionary can be combined: >
			function Callback(arg1, count) dict
			...
			let context = {"name": "example"}
			let Func = function('Callback', ['one'], context)
			...
			call Func(500)
<		Invokes the function as with: >
			call context.Callback('one', 500)
<
		Can also be used as a |method|: >
			GetFuncname()->function([arg])


garbagecollect([{atexit}])				*garbagecollect()*
		Cleanup unused |Lists|, |Dictionaries|, |Channels| and |Jobs|
		that have circular references.

		There is hardly ever a need to invoke this function, as it is
		automatically done when Vim runs out of memory or is waiting
		for the user to press a key after 'updatetime'.  Items without
		circular references are always freed when they become unused.
		This is useful if you have deleted a very big |List| and/or
		|Dictionary| with circular references in a script that runs
		for a long time.

		When the optional {atexit} argument is one, garbage
		collection will also be done when exiting Vim, if it wasn't
		done before.  This is useful when checking for memory leaks.

		The garbage collection is not done immediately but only when
		it's safe to perform.  This is when waiting for the user to
		type a character.  To force garbage collection immediately use
		|test_garbagecollect_now()|.

get({list}, {idx} [, {default}])			*get()*
		Get item {idx} from |List| {list}.  When this item is not
		available return {default}.  Return zero when {default} is
		omitted.
		Preferably used as a |method|: >
			mylist->get(idx)
get({blob}, {idx} [, {default}])
		Get byte {idx} from |Blob| {blob}.  When this byte is not
		available return {default}.  Return -1 when {default} is
		omitted.
		Preferably used as a |method|: >
			myblob->get(idx)
get({dict}, {key} [, {default}])
		Get item with key {key} from |Dictionary| {dict}.  When this
		item is not available return {default}.  Return zero when
		{default} is omitted.  Useful example: >
			let val = get(g:, 'var_name', 'default')
<		This gets the value of g:var_name if it exists, and uses
		'default' when it does not exist.
		Preferably used as a |method|: >
			mydict->get(key)
get({func}, {what})
		Get an item with from Funcref {func}.  Possible values for
		{what} are:
			"name"	The function name
			"func"	The function
			"dict"	The dictionary
			"args"	The list with arguments
		Preferably used as a |method|: >
			myfunc->get(what)
<
							*getbufinfo()*
getbufinfo([{expr}])
getbufinfo([{dict}])
		Get information about buffers as a List of Dictionaries.

		Without an argument information about all the buffers is
		returned.

		When the argument is a |Dictionary| only the buffers matching
		the specified criteria are returned.  The following keys can
		be specified in {dict}:
			buflisted	include only listed buffers.
			bufloaded	include only loaded buffers.
			bufmodified	include only modified buffers.

		Otherwise, {expr} specifies a particular buffer to return
		information for.  For the use of {expr}, see |bufname()|
		above.  If the buffer is found the returned List has one item.
		Otherwise the result is an empty list.

		Each returned List item is a dictionary with the following
		entries:
			bufnr		Buffer number.
			changed		TRUE if the buffer is modified.
			changedtick	Number of changes made to the buffer.
			hidden		TRUE if the buffer is hidden.
			lastused	Timestamp in seconds, like
					|localtime()|, when the buffer was
					last used.
					{only with the |+viminfo| feature}
			listed		TRUE if the buffer is listed.
			lnum		Line number used for the buffer when
					opened in the current window.
			linecount	Number of lines in the buffer (only
					valid when loaded)
			loaded		TRUE if the buffer is loaded.
			name		Full path to the file in the buffer.
			signs		List of signs placed in the buffer.
					Each list item is a dictionary with
					the following fields:
					    id	  sign identifier
					    lnum  line number
					    name  sign name
			variables	A reference to the dictionary with
					buffer-local variables.
			windows		List of |window-ID|s that display this
					buffer
			popups		List of popup |window-ID|s that
					display this buffer

		Examples: >
			for buf in getbufinfo()
			    echo buf.name
			endfor
			for buf in getbufinfo({'buflisted':1})
			    if buf.changed
				....
			    endif
			endfor
<
		To get buffer-local options use: >
			getbufvar({bufnr}, '&option_name')
<
		Can also be used as a |method|: >
			GetBufnr()->getbufinfo()
<

							*getbufline()*
getbufline({expr}, {lnum} [, {end}])
		Return a |List| with the lines starting from {lnum} to {end}
		(inclusive) in the buffer {expr}.  If {end} is omitted, a
		|List| with only the line {lnum} is returned.

		For the use of {expr}, see |bufname()| above.

		For {lnum} and {end} "$" can be used for the last line of the
		buffer.  Otherwise a number must be used.

		When {lnum} is smaller than 1 or bigger than the number of
		lines in the buffer, an empty |List| is returned.

		When {end} is greater than the number of lines in the buffer,
		it is treated as {end} is set to the number of lines in the
		buffer.  When {end} is before {lnum} an empty |List| is
		returned.

		This function works only for loaded buffers.  For unloaded and
		non-existing buffers, an empty |List| is returned.

		Example: >
			:let lines = getbufline(bufnr("myfile"), 1, "$")

<		Can also be used as a |method|: >
			GetBufnr()->getbufline(lnum)

getbufvar({expr}, {varname} [, {def}])				*getbufvar()*
		The result is the value of option or local buffer variable
		{varname} in buffer {expr}.  Note that the name without "b:"
		must be used.
		When {varname} is empty returns a |Dictionary| with all the
		buffer-local variables.
		When {varname} is equal to "&" returns a |Dictionary| with all
		the buffer-local options.
		Otherwise, when {varname} starts with "&" returns the value of
		a buffer-local option.
		This also works for a global or buffer-local option, but it
		doesn't work for a global variable, window-local variable or
		window-local option.
		For the use of {expr}, see |bufname()| above.
		When the buffer or variable doesn't exist {def} or an empty
		string is returned, there is no error message.
		Examples: >
			:let bufmodified = getbufvar(1, "&mod")
			:echo "todo myvar = " . getbufvar("todo", "myvar")

<		Can also be used as a |method|: >
			GetBufnr()->getbufvar(varname)
<
getchangelist([{expr}])					*getchangelist()*
		Returns the |changelist| for the buffer {expr}. For the use
		of {expr}, see |bufname()| above. If buffer {expr} doesn't
		exist, an empty list is returned.

		The returned list contains two entries: a list with the change
		locations and the current position in the list.  Each
		entry in the change list is a dictionary with the following
		entries:
			col		column number
			coladd		column offset for 'virtualedit'
			lnum		line number
		If buffer {expr} is the current buffer, then the current
		position refers to the position in the list. For other
		buffers, it is set to the length of the list.

		Can also be used as a |method|: >
			GetBufnr()->getchangelist()

getchar([expr])						*getchar()*
		Get a single character from the user or input stream.
		If [expr] is omitted, wait until a character is available.
		If [expr] is 0, only get a character when one is available.
			Return zero otherwise.
		If [expr] is 1, only check if a character is available, it is
			not consumed.  Return zero if no character available.

		Without [expr] and when [expr] is 0 a whole character or
		special key is returned.  If it is a single character, the
		result is a number.  Use nr2char() to convert it to a String.
		Otherwise a String is returned with the encoded character.
		For a special key it's a String with a sequence of bytes
		starting with 0x80 (decimal: 128).  This is the same value as
		the String "\<Key>", e.g., "\<Left>".  The returned value is
		also a String when a modifier (shift, control, alt) was used
		that is not included in the character.

		When [expr] is 0 and Esc is typed, there will be a short delay
		while Vim waits to see if this is the start of an escape
		sequence.

		When [expr] is 1 only the first byte is returned.  For a
		one-byte character it is the character itself as a number.
		Use nr2char() to convert it to a String.

		Use getcharmod() to obtain any additional modifiers.

		When the user clicks a mouse button, the mouse event will be
		returned.  The position can then be found in |v:mouse_col|,
		|v:mouse_lnum|, |v:mouse_winid| and |v:mouse_win|.
		|getmousepos()| can also be used.  Mouse move events will be
		ignored.
		This example positions the mouse as it would normally happen: >
			let c = getchar()
			if c == "\<LeftMouse>" && v:mouse_win > 0
			  exe v:mouse_win . "wincmd w"
			  exe v:mouse_lnum
			  exe "normal " . v:mouse_col . "|"
			endif
<
		When using bracketed paste only the first character is
		returned, the rest of the pasted text is dropped.
		|xterm-bracketed-paste|.

		There is no prompt, you will somehow have to make clear to the
		user that a character has to be typed.  The screen is not
		redrawn, e.g. when resizing the window.  When using a popup
		window it should work better with a |popup-filter|.

		There is no mapping for the character.
		Key codes are replaced, thus when the user presses the <Del>
		key you get the code for the <Del> key, not the raw character
		sequence.  Examples: >
			getchar() == "\<Del>"
			getchar() == "\<S-Left>"
<		This example redefines "f" to ignore case: >
			:nmap f :call FindChar()<CR>
			:function FindChar()
			:  let c = nr2char(getchar())
			:  while col('.') < col('$') - 1
			:    normal l
			:    if getline('.')[col('.') - 1] ==? c
			:      break
			:    endif
			:  endwhile
			:endfunction
<
		You may also receive synthetic characters, such as
		|<CursorHold>|. Often you will want to ignore this and get
		another character: >
			:function GetKey()
			:  let c = getchar()
			:  while c == "\<CursorHold>"
			:    let c = getchar()
			:  endwhile
			:  return c
			:endfunction

getcharmod()						*getcharmod()*
		The result is a Number which is the state of the modifiers for
		the last obtained character with getchar() or in another way.
		These values are added together:
			2	shift
			4	control
			8	alt (meta)
			16	meta (when it's different from ALT)
			32	mouse double click
			64	mouse triple click
			96	mouse quadruple click (== 32 + 64)
			128	command (Macintosh only)
		Only the modifiers that have not been included in the
		character itself are obtained.  Thus Shift-a results in "A"
		without a modifier.

							*getcharpos()*
getcharpos({expr})
		Get the position for {expr}. Same as |getpos()| but the column
		number in the returned List is a character index instead of
		a byte index.

		Example:
		With the cursor on '세' in line 5 with text "여보세요": >
			getcharpos('.')		returns [0, 5, 3, 0]
			getpos('.')		returns [0, 5, 7, 0]
<
		Can also be used as a |method|: >
			GetMark()->getcharpos()

getcharsearch()						*getcharsearch()*
		Return the current character search information as a {dict}
		with the following entries:

		    char	character previously used for a character
				search (|t|, |f|, |T|, or |F|); empty string
				if no character search has been performed
		    forward	direction of character search; 1 for forward,
				0 for backward
		    until	type of character search; 1 for a |t| or |T|
				character search, 0 for an |f| or |F|
				character search

		This can be useful to always have |;| and |,| search
		forward/backward regardless of the direction of the previous
		character search: >
			:nnoremap <expr> ; getcharsearch().forward ? ';' : ','
			:nnoremap <expr> , getcharsearch().forward ? ',' : ';'
<		Also see |setcharsearch()|.

getcmdline()						*getcmdline()*
		Return the current command-line.  Only works when the command
		line is being edited, thus requires use of |c_CTRL-\_e| or
		|c_CTRL-R_=|.
		Example: >
			:cmap <F7> <C-\>eescape(getcmdline(), ' \')<CR>
<		Also see |getcmdtype()|, |getcmdpos()| and |setcmdpos()|.
		Returns an empty string when entering a password or using
		|inputsecret()|.

getcmdpos()						*getcmdpos()*
		Return the position of the cursor in the command line as a
		byte count.  The first column is 1.
		Only works when editing the command line, thus requires use of
		|c_CTRL-\_e| or |c_CTRL-R_=| or an expression mapping.
		Returns 0 otherwise.
		Also see |getcmdtype()|, |setcmdpos()| and |getcmdline()|.

getcmdtype()						*getcmdtype()*
		Return the current command-line type. Possible return values
		are:
		    :	normal Ex command
		    >	debug mode command |debug-mode|
		    /	forward search command
		    ?	backward search command
		    @	|input()| command
		    -	|:insert| or |:append| command
		    =	|i_CTRL-R_=|
		Only works when editing the command line, thus requires use of
		|c_CTRL-\_e| or |c_CTRL-R_=| or an expression mapping.
		Returns an empty string otherwise.
		Also see |getcmdpos()|, |setcmdpos()| and |getcmdline()|.

getcmdwintype()						*getcmdwintype()*
		Return the current |command-line-window| type. Possible return
		values are the same as |getcmdtype()|. Returns an empty string
		when not in the command-line window.

getcompletion({pat}, {type} [, {filtered}])		*getcompletion()*
		Return a list of command-line completion matches. {type}
		specifies what for.  The following completion types are
		supported:

		arglist		file names in argument list
		augroup		autocmd groups
		buffer		buffer names
		behave		:behave suboptions
		color		color schemes
		command		Ex command (and arguments)
		cmdline		|cmdline-completion| result
		compiler	compilers
		cscope		|:cscope| suboptions
		diff_buffer     |:diffget| and |:diffput| completion
		dir		directory names
		environment	environment variable names
		event		autocommand events
		expression	Vim expression
		file		file and directory names
		file_in_path	file and directory names in |'path'|
		filetype	filetype names |'filetype'|
		function	function name
		help		help subjects
		highlight	highlight groups
		history		:history suboptions
		locale		locale names (as output of locale -a)
		mapclear	buffer argument
		mapping		mapping name
		menu		menus
		messages	|:messages| suboptions
		option		options
		packadd		optional package |pack-add| names
		shellcmd	Shell command
		sign		|:sign| suboptions
		syntax		syntax file names |'syntax'|
		syntime		|:syntime| suboptions
		tag		tags
		tag_listfiles	tags, file names
		user		user names
		var		user variables

		If {pat} is an empty string, then all the matches are
		returned.  Otherwise only items matching {pat} are returned.
		See |wildcards| for the use of special characters in {pat}.

		If the optional {filtered} flag is set to 1, then 'wildignore'
		is applied to filter the results.  Otherwise all the matches
		are returned. The 'wildignorecase' option always applies.

		If {type} is "cmdline", then the |cmdline-completion| result is
		returned.  For example, to complete the possible values after
		a ":call" command: >
			echo getcompletion('call ', 'cmdline')
<
		If there are no matches, an empty list is returned.  An
		invalid value for {type} produces an error.

		Can also be used as a |method|: >
			GetPattern()->getcompletion('color')
<
							*getcurpos()*
getcurpos([{winid}])
		Get the position of the cursor.  This is like getpos('.'), but
		includes an extra "curswant" item in the list:
		    [0, lnum, col, off, curswant] ~
		The "curswant" number is the preferred column when moving the
		cursor vertically.  Also see |getcursorcharpos()| and
		|getpos()|.
		The first "bufnum" item is always zero. The byte position of
		the cursor is returned in 'col'. To get the character
		position, use |getcursorcharpos()|.

		The optional {winid} argument can specify the window.  It can
		be the window number or the |window-ID|.  The last known
		cursor position is returned, this may be invalid for the
		current value of the buffer if it is not the current window.
		If {winid} is invalid a list with zeroes is returned.

		This can be used to save and restore the cursor position: >
			let save_cursor = getcurpos()
			MoveTheCursorAround
			call setpos('.', save_cursor)
<		Note that this only works within the window.  See
		|winrestview()| for restoring more state.

		Can also be used as a |method|: >
			GetWinid()->getcurpos()

<							*getcursorcharpos()*
getcursorcharpos([{winid}])
		Same as |getcurpos()| but the column number in the returned
		List is a character index instead of a byte index.

		Example:
		With the cursor on '보' in line 3 with text "여보세요": >
			getcursorcharpos()	returns [0, 3, 2, 0, 3]
			getcurpos()		returns [0, 3, 4, 0, 3]

<		Can also be used as a |method|: >
			GetWinid()->getcursorcharpos()

<							*getcwd()*
getcwd([{winnr} [, {tabnr}]])
		The result is a String, which is the name of the current
		working directory.

		With {winnr} return the local current directory of this window
		in the current tab page.  {winnr} can be the window number or
		the |window-ID|.
		If {winnr} is -1 return the name of the global working
		directory.  See also |haslocaldir()|.

		With {winnr} and {tabnr} return the local current directory of
		the window in the specified tab page. If {winnr} is -1 return
		the working directory of the tabpage.
		If {winnr} is zero use the current window, if {tabnr} is zero
		use the current tabpage.
		Without any arguments, return the working directory of the
		current window.
		Return an empty string if the arguments are invalid.

		Examples: >
			" Get the working directory of the current window
			:echo getcwd()
			:echo getcwd(0)
			:echo getcwd(0, 0)
			" Get the working directory of window 3 in tabpage 2
			:echo getcwd(3, 2)
			" Get the global working directory
			:echo getcwd(-1)
			" Get the working directory of tabpage 3
			:echo getcwd(-1, 3)
			" Get the working directory of current tabpage
			:echo getcwd(-1, 0)

<		Can also be used as a |method|: >
			GetWinnr()->getcwd()
<
getenv({name})						*getenv()*
		Return the value of environment variable {name}.
		When the variable does not exist |v:null| is returned.  That
		is different from a variable set to an empty string, although
		some systems interpret the empty value as the variable being
		deleted.  See also |expr-env|.

		Can also be used as a |method|: >
			GetVarname()->getenv()

getfontname([{name}])					*getfontname()*
		Without an argument returns the name of the normal font being
		used.  Like what is used for the Normal highlight group
		|hl-Normal|.
		With an argument a check is done whether {name} is a valid
		font name.  If not then an empty string is returned.
		Otherwise the actual font name is returned, or {name} if the
		GUI does not support obtaining the real name.
		Only works when the GUI is running, thus not in your vimrc or
		gvimrc file.  Use the |GUIEnter| autocommand to use this
		function just after the GUI has started.
		Note that the GTK GUI accepts any font name, thus checking for
		a valid name does not work.

getfperm({fname})					*getfperm()*
		The result is a String, which is the read, write, and execute
		permissions of the given file {fname}.
		If {fname} does not exist or its directory cannot be read, an
		empty string is returned.
		The result is of the form "rwxrwxrwx", where each group of
		"rwx" flags represent, in turn, the permissions of the owner
		of the file, the group the file belongs to, and other users.
		If a user does not have a given permission the flag for this
		is replaced with the string "-".  Examples: >
			:echo getfperm("/etc/passwd")
			:echo getfperm(expand("~/.vimrc"))
<		This will hopefully (from a security point of view) display
		the string "rw-r--r--" or even "rw-------".

		Can also be used as a |method|: >
			GetFilename()->getfperm()
<
		For setting permissions use |setfperm()|.

getfsize({fname})					*getfsize()*
		The result is a Number, which is the size in bytes of the
		given file {fname}.
		If {fname} is a directory, 0 is returned.
		If the file {fname} can't be found, -1 is returned.
		If the size of {fname} is too big to fit in a Number then -2
		is returned.

		Can also be used as a |method|: >
			GetFilename()->getfsize()

getftime({fname})					*getftime()*
		The result is a Number, which is the last modification time of
		the given file {fname}.  The value is measured as seconds
		since 1st Jan 1970, and may be passed to strftime().  See also
		|localtime()| and |strftime()|.
		If the file {fname} can't be found -1 is returned.

		Can also be used as a |method|: >
			GetFilename()->getftime()

getftype({fname})					*getftype()*
		The result is a String, which is a description of the kind of
		file of the given file {fname}.
		If {fname} does not exist an empty string is returned.
		Here is a table over different kinds of files and their
		results:
			Normal file		"file"
			Directory		"dir"
			Symbolic link		"link"
			Block device		"bdev"
			Character device	"cdev"
			Socket			"socket"
			FIFO			"fifo"
			All other		"other"
		Example: >
			getftype("/home")
<		Note that a type such as "link" will only be returned on
		systems that support it.  On some systems only "dir" and
		"file" are returned.  On MS-Windows a symbolic link to a
		directory returns "dir" instead of "link".

		Can also be used as a |method|: >
			GetFilename()->getftype()

getimstatus()						*getimstatus()*
		The result is a Number, which is |TRUE| when the IME status is
		active.
		See 'imstatusfunc'.

getjumplist([{winnr} [, {tabnr}]])			*getjumplist()*
		Returns the |jumplist| for the specified window.

		Without arguments use the current window.
		With {winnr} only use this window in the current tab page.
		{winnr} can also be a |window-ID|.
		With {winnr} and {tabnr} use the window in the specified tab
		page.

		The returned list contains two entries: a list with the jump
		locations and the last used jump position number in the list.
		Each entry in the jump location list is a dictionary with
		the following entries:
			bufnr		buffer number
			col		column number
			coladd		column offset for 'virtualedit'
			filename	filename if available
			lnum		line number

		Can also be used as a |method|: >
			GetWinnr()->getjumplist()

<							*getline()*
getline({lnum} [, {end}])
		Without {end} the result is a String, which is line {lnum}
		from the current buffer.  Example: >
			getline(1)
<		When {lnum} is a String that doesn't start with a
		digit, |line()| is called to translate the String into a Number.
		To get the line under the cursor: >
			getline(".")
<		When {lnum} is smaller than 1 or bigger than the number of
		lines in the buffer, an empty string is returned.

		When {end} is given the result is a |List| where each item is
		a line from the current buffer in the range {lnum} to {end},
		including line {end}.
		{end} is used in the same way as {lnum}.
		Non-existing lines are silently omitted.
		When {end} is before {lnum} an empty |List| is returned.
		Example: >
			:let start = line('.')
			:let end = search("^$") - 1
			:let lines = getline(start, end)

<		Can also be used as a |method|: >
			ComputeLnum()->getline()

<		To get lines from another buffer see |getbufline()|

getloclist({nr} [, {what}])				*getloclist()*
		Returns a |List| with all the entries in the location list for
		window {nr}.  {nr} can be the window number or the |window-ID|.
		When {nr} is zero the current window is used.

		For a location list window, the displayed location list is
		returned.  For an invalid window number {nr}, an empty list is
		returned. Otherwise, same as |getqflist()|.

		If the optional {what} dictionary argument is supplied, then
		returns the items listed in {what} as a dictionary. Refer to
		|getqflist()| for the supported items in {what}.

		In addition to the items supported by |getqflist()| in {what},
		the following item is supported by |getloclist()|:

			filewinid	id of the window used to display files
					from the location list. This field is
					applicable only when called from a
					location list window. See
					|location-list-file-window| for more
					details.

		Returns a |Dictionary| with default values if there is no
		location list for the window {nr}.
		Returns an empty Dictionary if window {nr} does not exist.

		Examples (See also |getqflist-examples|): >
			:echo getloclist(3, {'all': 0})
			:echo getloclist(5, {'filewinid': 0})


getmarklist([{expr}])					*getmarklist()*
		Without the {expr} argument returns a |List| with information
		about all the global marks. |mark|

		If the optional {expr} argument is specified, returns the
		local marks defined in buffer {expr}.  For the use of {expr},
		see |bufname()|.

		Each item in the returned List is a |Dict| with the following:
		    name - name of the mark prefixed by "'"
		    pos - a |List| with the position of the mark:
				[bufnum, lnum, col, off]
			  Refer to |getpos()| for more information.
		    file - file name

		Refer to |getpos()| for getting information about a specific
		mark.

		Can also be used as a |method|: >
			GetBufnr()->getmarklist()

getmatches([{win}])					*getmatches()*
		Returns a |List| with all matches previously defined for the
		current window by |matchadd()| and the |:match| commands.
		|getmatches()| is useful in combination with |setmatches()|,
		as |setmatches()| can restore a list of matches saved by
		|getmatches()|.
		Example: >
			:echo getmatches()
<			[{'group': 'MyGroup1', 'pattern': 'TODO',
			'priority': 10, 'id': 1}, {'group': 'MyGroup2',
			'pattern': 'FIXME', 'priority': 10, 'id': 2}] >
			:let m = getmatches()
			:call clearmatches()
			:echo getmatches()
<			[] >
			:call setmatches(m)
			:echo getmatches()
<			[{'group': 'MyGroup1', 'pattern': 'TODO',
			'priority': 10, 'id': 1}, {'group': 'MyGroup2',
			'pattern': 'FIXME', 'priority': 10, 'id': 2}] >
			:unlet m
<
getmousepos()						*getmousepos()*
		Returns a |Dictionary| with the last known position of the
		mouse.  This can be used in a mapping for a mouse click or in
		a filter of a popup window.  The items are:
			screenrow	screen row
			screencol	screen column
			winid		Window ID of the click
			winrow		row inside "winid"
			wincol		column inside "winid"
			line		text line inside "winid"
			column		text column inside "winid"
		All numbers are 1-based.

		If not over a window, e.g. when in the command line, then only
		"screenrow" and "screencol" are valid, the others are zero.

		When on the status line below a window or the vertical
		separator right of a window, the "line" and "column" values
		are zero.

		When the position is after the text then "column" is the
		length of the text in bytes.

		If the mouse is over a popup window then that window is used.


		When using |getchar()| the Vim variables |v:mouse_lnum|,
		|v:mouse_col| and |v:mouse_winid| also provide these values.

							*getpid()*
getpid()	Return a Number which is the process ID of the Vim process.
		On Unix and MS-Windows this is a unique number, until Vim
		exits.

							*getpos()*
getpos({expr})	Get the position for {expr}.  For possible values of {expr}
		see |line()|.  For getting the cursor position see
		|getcurpos()|.
		The result is a |List| with four numbers:
		    [bufnum, lnum, col, off]
		"bufnum" is zero, unless a mark like '0 or 'A is used, then it
		is the buffer number of the mark.
		"lnum" and "col" are the position in the buffer.  The first
		column is 1.
		The "off" number is zero, unless 'virtualedit' is used.  Then
		it is the offset in screen columns from the start of the
		character.  E.g., a position within a <Tab> or after the last
		character.
		Note that for '< and '> Visual mode matters: when it is "V"
		(visual line mode) the column of '< is zero and the column of
		'> is a large number.
		The column number in the returned List is the byte position
		within the line. To get the character position in the line,
		use |getcharpos()|
		This can be used to save and restore the position of a mark: >
			let save_a_mark = getpos("'a")
			...
			call setpos("'a", save_a_mark)
<		Also see |getcharpos()|, |getcurpos()| and |setpos()|.

		Can also be used as a |method|: >
			GetMark()->getpos()

getqflist([{what}])					*getqflist()*
		Returns a |List| with all the current quickfix errors.  Each
		list item is a dictionary with these entries:
			bufnr	number of buffer that has the file name, use
				bufname() to get the name
			module	module name
			lnum	line number in the buffer (first line is 1)
			col	column number (first column is 1)
			vcol	|TRUE|: "col" is visual column
				|FALSE|: "col" is byte index
			nr	error number
			pattern	search pattern used to locate the error
			text	description of the error
			type	type of the error, 'E', '1', etc.
			valid	|TRUE|: recognized error message

		When there is no error list or it's empty, an empty list is
		returned. Quickfix list entries with non-existing buffer
		number are returned with "bufnr" set to zero.

		Useful application: Find pattern matches in multiple files and
		do something with them: >
			:vimgrep /theword/jg *.c
			:for d in getqflist()
			:   echo bufname(d.bufnr) ':' d.lnum '=' d.text
			:endfor
<
		If the optional {what} dictionary argument is supplied, then
		returns only the items listed in {what} as a dictionary. The
		following string items are supported in {what}:
			changedtick	get the total number of changes made
					to the list |quickfix-changedtick|
			context	get the |quickfix-context|
			efm	errorformat to use when parsing "lines". If
				not present, then the 'errorformat' option
				value is used.
			id	get information for the quickfix list with
				|quickfix-ID|; zero means the id for the
				current list or the list specified by "nr"
			idx	get information for the quickfix entry at this
				index in the list specified by 'id' or 'nr'.
				If set to zero, then uses the current entry.
				See |quickfix-index|
			items	quickfix list entries
			lines	parse a list of lines using 'efm' and return
				the resulting entries.  Only a |List| type is
				accepted.  The current quickfix list is not
				modified. See |quickfix-parse|.
			nr	get information for this quickfix list; zero
				means the current quickfix list and "$" means
				the last quickfix list
			qfbufnr number of the buffer displayed in the quickfix
				window. Returns 0 if the quickfix buffer is
				not present. See |quickfix-buffer|.
			size	number of entries in the quickfix list
			title	get the list title |quickfix-title|
			winid	get the quickfix |window-ID|
			all	all of the above quickfix properties
		Non-string items in {what} are ignored. To get the value of a
		particular item, set it to zero.
		If "nr" is not present then the current quickfix list is used.
		If both "nr" and a non-zero "id" are specified, then the list
		specified by "id" is used.
		To get the number of lists in the quickfix stack, set "nr" to
		"$" in {what}. The "nr" value in the returned dictionary
		contains the quickfix stack size.
		When "lines" is specified, all the other items except "efm"
		are ignored.  The returned dictionary contains the entry
		"items" with the list of entries.

		The returned dictionary contains the following entries:
			changedtick	total number of changes made to the
					list |quickfix-changedtick|
			context	quickfix list context. See |quickfix-context|
				If not present, set to "".
			id	quickfix list ID |quickfix-ID|. If not
				present, set to 0.
			idx	index of the quickfix entry in the list. If not
				present, set to 0.
			items	quickfix list entries. If not present, set to
				an empty list.
			nr	quickfix list number. If not present, set to 0
			qfbufnr	number of the buffer displayed in the quickfix
				window. If not present, set to 0.
			size	number of entries in the quickfix list. If not
				present, set to 0.
			title	quickfix list title text. If not present, set
				to "".
			winid	quickfix |window-ID|. If not present, set to 0

		Examples (See also |getqflist-examples|): >
			:echo getqflist({'all': 1})
			:echo getqflist({'nr': 2, 'title': 1})
			:echo getqflist({'lines' : ["F1:10:L10"]})
<
getreg([{regname} [, 1 [, {list}]]])			*getreg()*
		The result is a String, which is the contents of register
		{regname}.  Example: >
			:let cliptext = getreg('*')
<		When {regname} was not set the result is an empty string.

		getreg('=') returns the last evaluated value of the expression
		register.  (For use in maps.)
		getreg('=', 1) returns the expression itself, so that it can
		be restored with |setreg()|.  For other registers the extra
		argument is ignored, thus you can always give it.

		If {list} is present and |TRUE|, the result type is changed
		to |List|. Each list item is one text line. Use it if you care
		about zero bytes possibly present inside register: without
		third argument both NLs and zero bytes are represented as NLs
		(see |NL-used-for-Nul|).
		When the register was not set an empty list is returned.

		If {regname} is not specified, |v:register| is used.

		Can also be used as a |method|: >
			GetRegname()->getreg()

getreginfo([{regname}])					*getreginfo()*
		Returns detailed information about register {regname} as a
		Dictionary with the following entries:
			regcontents	List of lines contained in register
					{regname}, like
					|getreg|({regname}, 1, 1).
			regtype		the type of register {regname}, as in
					|getregtype()|.
			isunnamed	Boolean flag, v:true if this register
					is currently pointed to by the unnamed
					register.
			points_to	for the unnamed register, gives the
					single letter name of the register
					currently pointed to (see |quotequote|).
					For example, after deleting a line
					with `dd`, this field will be "1",
					which is the register that got the
					deleted text.

		If {regname} is invalid or not set, an empty Dictionary
		will be returned.
		If {regname} is not specified, |v:register| is used.
		The returned Dictionary can be passed to |setreg()|.

		Can also be used as a |method|: >
			GetRegname()->getreginfo()

getregtype([{regname}])					*getregtype()*
		The result is a String, which is type of register {regname}.
		The value will be one of:
		    "v"			for |characterwise| text
		    "V"			for |linewise| text
		    "<CTRL-V>{width}"	for |blockwise-visual| text
		    ""			for an empty or unknown register
		<CTRL-V> is one character with value 0x16.
		If {regname} is not specified, |v:register| is used.

		Can also be used as a |method|: >
			GetRegname()->getregtype()

gettabinfo([{arg}])					*gettabinfo()*
		If {arg} is not specified, then information about all the tab
		pages is returned as a |List|. Each List item is a |Dictionary|.
		Otherwise, {arg} specifies the tab page number and information
		about that one is returned.  If the tab page does not exist an
		empty List is returned.

		Each List item is a |Dictionary| with the following entries:
			tabnr		tab page number.
			variables	a reference to the dictionary with
					tabpage-local variables
			windows		List of |window-ID|s in the tab page.

		Can also be used as a |method|: >
			GetTabnr()->gettabinfo()

gettabvar({tabnr}, {varname} [, {def}])				*gettabvar()*
		Get the value of a tab-local variable {varname} in tab page
		{tabnr}. |t:var|
		Tabs are numbered starting with one.
		When {varname} is empty a dictionary with all tab-local
		variables is returned.
		Note that the name without "t:" must be used.
		When the tab or variable doesn't exist {def} or an empty
		string is returned, there is no error message.

		Can also be used as a |method|: >
			GetTabnr()->gettabvar(varname)

gettabwinvar({tabnr}, {winnr}, {varname} [, {def}])		*gettabwinvar()*
		Get the value of window-local variable {varname} in window
		{winnr} in tab page {tabnr}.
		When {varname} is empty a dictionary with all window-local
		variables is returned.
		When {varname} is equal to "&" get the values of all
		window-local options in a |Dictionary|.
		Otherwise, when {varname} starts with "&" get the value of a
		window-local option.
		Note that {varname} must be the name without "w:".
		Tabs are numbered starting with one.  For the current tabpage
		use |getwinvar()|.
		{winnr} can be the window number or the |window-ID|.
		When {winnr} is zero the current window is used.
		This also works for a global option, buffer-local option and
		window-local option, but it doesn't work for a global variable
		or buffer-local variable.
		When the tab, window or variable doesn't exist {def} or an
		empty string is returned, there is no error message.
		Examples: >
			:let list_is_on = gettabwinvar(1, 2, '&list')
			:echo "myvar = " . gettabwinvar(3, 1, 'myvar')
<
		To obtain all window-local variables use: >
			gettabwinvar({tabnr}, {winnr}, '&')

<		Can also be used as a |method|: >
			GetTabnr()->gettabwinvar(winnr, varname)

gettagstack([{nr}])					*gettagstack()*
		The result is a Dict, which is the tag stack of window {nr}.
		{nr} can be the window number or the |window-ID|.
		When {nr} is not specified, the current window is used.
		When window {nr} doesn't exist, an empty Dict is returned.

		The returned dictionary contains the following entries:
			curidx		Current index in the stack. When at
					top of the stack, set to (length + 1).
					Index of bottom of the stack is 1.
			items		List of items in the stack. Each item
					is a dictionary containing the
					entries described below.
			length		Number of entries in the stack.

		Each item in the stack is a dictionary with the following
		entries:
			bufnr		buffer number of the current jump
			from		cursor position before the tag jump.
					See |getpos()| for the format of the
					returned list.
			matchnr		current matching tag number. Used when
					multiple matching tags are found for a
					name.
			tagname		name of the tag

		See |tagstack| for more information about the tag stack.

		Can also be used as a |method|: >
			GetWinnr()->gettagstack()


gettext({text})						*gettext()*
		Translate {text} if possible.
		This is mainly for use in the distributed Vim scripts.  When
		generating message translations the {text} is extracted by
		xgettext, the translator can add the translated message in the
		.po file and Vim will lookup the translation when gettext() is
		called.
		For {text} double quoted strings are preferred, because
		xgettext does not understand escaping in single quoted
		strings.


getwininfo([{winid}])					*getwininfo()*
		Returns information about windows as a |List| with Dictionaries.

		If {winid} is given Information about the window with that ID
		is returned, as a |List| with one item.  If the window does not
		exist the result is an empty list.

		Without {winid} information about all the windows in all the
		tab pages is returned.

		Each List item is a |Dictionary| with the following entries:
			botline		last displayed buffer line
			bufnr		number of buffer in the window
			height		window height (excluding winbar)
			loclist		1 if showing a location list
					{only with the +quickfix feature}
			quickfix	1 if quickfix or location list window
					{only with the +quickfix feature}
			terminal	1 if a terminal window
					{only with the +terminal feature}
			tabnr		tab page number
			topline		first displayed buffer line
			variables	a reference to the dictionary with
					window-local variables
			width		window width
			winbar		1 if the window has a toolbar, 0
					otherwise
			wincol		leftmost screen column of the window,
					col from |win_screenpos()|
			winid		|window-ID|
			winnr		window number
			winrow		topmost screen column of the window,
					row from |win_screenpos()|

		Can also be used as a |method|: >
			GetWinnr()->getwininfo()

getwinpos([{timeout}])					*getwinpos()*
		The result is a |List| with two numbers, the result of
		|getwinposx()| and |getwinposy()| combined:
			[x-pos, y-pos]
		{timeout} can be used to specify how long to wait in msec for
		a response from the terminal.  When omitted 100 msec is used.
		Use a longer time for a remote terminal.
		When using a value less than 10 and no response is received
		within that time, a previously reported position is returned,
		if available.  This can be used to poll for the position and
		do some work in the meantime: >
			while 1
			  let res = getwinpos(1)
			  if res[0] >= 0
			    break
			  endif
			  " Do some work here
			endwhile
<

		Can also be used as a |method|: >
			GetTimeout()->getwinpos()
<
							*getwinposx()*
getwinposx()	The result is a Number, which is the X coordinate in pixels of
		the left hand side of the GUI Vim window. Also works for an
		xterm (uses a timeout of 100 msec).
		The result will be -1 if the information is not available.
		The value can be used with `:winpos`.

							*getwinposy()*
getwinposy()	The result is a Number, which is the Y coordinate in pixels of
		the top of the GUI Vim window.  Also works for an xterm (uses
		a timeout of 100 msec).
		The result will be -1 if the information is not available.
		The value can be used with `:winpos`.

getwinvar({winnr}, {varname} [, {def}])				*getwinvar()*
		Like |gettabwinvar()| for the current tabpage.
		Examples: >
			:let list_is_on = getwinvar(2, '&list')
			:echo "myvar = " . getwinvar(1, 'myvar')

<		Can also be used as a |method|: >
			GetWinnr()->getwinvar(varname)
<
glob({expr} [, {nosuf} [, {list} [, {alllinks}]]])		*glob()*
		Expand the file wildcards in {expr}.  See |wildcards| for the
		use of special characters.

		Unless the optional {nosuf} argument is given and is |TRUE|,
		the 'suffixes' and 'wildignore' options apply: Names matching
		one of the patterns in 'wildignore' will be skipped and
		'suffixes' affect the ordering of matches.
		'wildignorecase' always applies.

		When {list} is present and it is |TRUE| the result is a |List|
		with all matching files. The advantage of using a List is,
		you also get filenames containing newlines correctly.
		Otherwise the result is a String and when there are several
		matches, they are separated by <NL> characters.

		If the expansion fails, the result is an empty String or List.

		You can also use |readdir()| if you need to do complicated
		things, such as limiting the number of matches.

		A name for a non-existing file is not included.  A symbolic
		link is only included if it points to an existing file.
		However, when the {alllinks} argument is present and it is
		|TRUE| then all symbolic links are included.

		For most systems backticks can be used to get files names from
		any external command.  Example: >
			:let tagfiles = glob("`find . -name tags -print`")
			:let &tags = substitute(tagfiles, "\n", ",", "g")
<		The result of the program inside the backticks should be one
		item per line.  Spaces inside an item are allowed.

		See |expand()| for expanding special Vim variables.  See
		|system()| for getting the raw output of an external command.

		Can also be used as a |method|: >
			GetExpr()->glob()

glob2regpat({expr})					 *glob2regpat()*
		Convert a file pattern, as used by glob(), into a search
		pattern.  The result can be used to match with a string that
		is a file name.  E.g. >
			if filename =~ glob2regpat('Make*.mak')
<		This is equivalent to: >
			if filename =~ '^Make.*\.mak$'
<		When {expr} is an empty string the result is "^$", match an
		empty string.
		Note that the result depends on the system.  On MS-Windows
		a backslash usually means a path separator.

		Can also be used as a |method|: >
			GetExpr()->glob2regpat()
<								*globpath()*
globpath({path}, {expr} [, {nosuf} [, {list} [, {alllinks}]]])
		Perform glob() for {expr} on all directories in {path} and
		concatenate the results.  Example: >
			:echo globpath(&rtp, "syntax/c.vim")
<
		{path} is a comma-separated list of directory names.  Each
		directory name is prepended to {expr} and expanded like with
		|glob()|.  A path separator is inserted when needed.
		To add a comma inside a directory name escape it with a
		backslash.  Note that on MS-Windows a directory may have a
		trailing backslash, remove it if you put a comma after it.
		If the expansion fails for one of the directories, there is no
		error message.

		Unless the optional {nosuf} argument is given and is |TRUE|,
		the 'suffixes' and 'wildignore' options apply: Names matching
		one of the patterns in 'wildignore' will be skipped and
		'suffixes' affect the ordering of matches.

		When {list} is present and it is |TRUE| the result is a |List|
		with all matching files. The advantage of using a List is, you
		also get filenames containing newlines correctly. Otherwise
		the result is a String and when there are several matches,
		they are separated by <NL> characters.  Example: >
			:echo globpath(&rtp, "syntax/c.vim", 0, 1)
<
		{alllinks} is used as with |glob()|.

		The "**" item can be used to search in a directory tree.
		For example, to find all "README.txt" files in the directories
		in 'runtimepath' and below: >
			:echo globpath(&rtp, "**/README.txt")
<		Upwards search and limiting the depth of "**" is not
		supported, thus using 'path' will not always work properly.

		Can also be used as a |method|, the base is passed as the
		second argument: >
			GetExpr()->globpath(&rtp)
<
							*has()*
has({feature} [, {check}])
		When {check} is omitted or is zero: The result is a Number,
		which is 1 if the feature {feature} is supported, zero
		otherwise.  The {feature} argument is a string, case is
		ignored.  See |feature-list| below.

		When {check} is present and not zero: The result is a Number,
		which is 1 if the feature {feature} could ever be supported,
		zero otherwise.  This is useful to check for a typo in
		{feature} and to detect dead code.  Keep in mind that an older
		Vim version will not know about a feature added later and
		features that have been abandoned will not be known by the
		current Vim version.

		Also see |exists()|.

		Note that to skip code that has a syntax error when the
		feature is not available, Vim may skip the rest of the line
		and miss a following `endif`.  Therefore put the `endif` on a
		separate line: >
			if has('feature')
			  let x = this->breaks->without->the->feature
			endif
<		If the `endif` would be moved to the second line as "| endif" it
		would not be found.


has_key({dict}, {key})					*has_key()*
		The result is a Number, which is 1 if |Dictionary| {dict} has
		an entry with key {key}.  Zero otherwise.

		Can also be used as a |method|: >
			mydict->has_key(key)

haslocaldir([{winnr} [, {tabnr}]])			*haslocaldir()*
		The result is a Number:
		    1   when the window has set a local directory via |:lcd|
		    2   when the tab-page has set a local directory via |:tcd|
		    0   otherwise.

		Without arguments use the current window.
		With {winnr} use this window in the current tab page.
		With {winnr} and {tabnr} use the window in the specified tab
		page.
		{winnr} can be the window number or the |window-ID|.
		If {winnr} is -1 it is ignored and only the tabpage is used.
		Return 0 if the arguments are invalid.
		Examples: >
			if haslocaldir() == 1
			  " window local directory case
			elseif haslocaldir() == 2
			  " tab-local directory case
			else
			  " global directory case
			endif

			" current window
			:echo haslocaldir()
			:echo haslocaldir(0)
			:echo haslocaldir(0, 0)
			" window n in current tab page
			:echo haslocaldir(n)
			:echo haslocaldir(n, 0)
			" window n in tab page m
			:echo haslocaldir(n, m)
			" tab page m
			:echo haslocaldir(-1, m)
<
		Can also be used as a |method|: >
			GetWinnr()->haslocaldir()

hasmapto({what} [, {mode} [, {abbr}]])			*hasmapto()*
		The result is a Number, which is 1 if there is a mapping that
		contains {what} in somewhere in the rhs (what it is mapped to)
		and this mapping exists in one of the modes indicated by
		{mode}.
		When {abbr} is there and it is |TRUE| use abbreviations
		instead of mappings.  Don't forget to specify Insert and/or
		Command-line mode.
		Both the global mappings and the mappings local to the current
		buffer are checked for a match.
		If no matching mapping is found 0 is returned.
		The following characters are recognized in {mode}:
			n	Normal mode
			v	Visual and Select mode
			x	Visual mode
			s	Select mode
			o	Operator-pending mode
			i	Insert mode
			l	Language-Argument ("r", "f", "t", etc.)
			c	Command-line mode
		When {mode} is omitted, "nvo" is used.

		This function is useful to check if a mapping already exists
		to a function in a Vim script.  Example: >
			:if !hasmapto('\ABCdoit')
			:   map <Leader>d \ABCdoit
			:endif
<		This installs the mapping to "\ABCdoit" only if there isn't
		already a mapping to "\ABCdoit".

		Can also be used as a |method|: >
			GetRHS()->hasmapto()

histadd({history}, {item})				*histadd()*
		Add the String {item} to the history {history} which can be
		one of:					*hist-names*
			"cmd"	 or ":"	  command line history
			"search" or "/"   search pattern history
			"expr"	 or "="   typed expression history
			"input"  or "@"	  input line history
			"debug"  or ">"   debug command history
			empty		  the current or last used history
		The {history} string does not need to be the whole name, one
		character is sufficient.
		If {item} does already exist in the history, it will be
		shifted to become the newest entry.
		The result is a Number: 1 if the operation was successful,
		otherwise 0 is returned.

		Example: >
			:call histadd("input", strftime("%Y %b %d"))
			:let date=input("Enter date: ")
<		This function is not available in the |sandbox|.

		Can also be used as a |method|, the base is passed as the
		second argument: >
			GetHistory()->histadd('search')

histdel({history} [, {item}])				*histdel()*
		Clear {history}, i.e. delete all its entries.  See |hist-names|
		for the possible values of {history}.

		If the parameter {item} evaluates to a String, it is used as a
		regular expression.  All entries matching that expression will
		be removed from the history (if there are any).
		Upper/lowercase must match, unless "\c" is used |/\c|.
		If {item} evaluates to a Number, it will be interpreted as
		an index, see |:history-indexing|.  The respective entry will
		be removed if it exists.

		The result is a Number: 1 for a successful operation,
		otherwise 0 is returned.

		Examples:
		Clear expression register history: >
			:call histdel("expr")
<
		Remove all entries starting with "*" from the search history: >
			:call histdel("/", '^\*')
<
		The following three are equivalent: >
			:call histdel("search", histnr("search"))
			:call histdel("search", -1)
			:call histdel("search", '^'.histget("search", -1).'$')
<
		To delete the last search pattern and use the last-but-one for
		the "n" command and 'hlsearch': >
			:call histdel("search", -1)
			:let @/ = histget("search", -1)
<
		Can also be used as a |method|: >
			GetHistory()->histdel()

histget({history} [, {index}])				*histget()*
		The result is a String, the entry with Number {index} from
		{history}.  See |hist-names| for the possible values of
		{history}, and |:history-indexing| for {index}.  If there is
		no such entry, an empty String is returned.  When {index} is
		omitted, the most recent item from the history is used.

		Examples:
		Redo the second last search from history. >
			:execute '/' . histget("search", -2)

<		Define an Ex command ":H {num}" that supports re-execution of
		the {num}th entry from the output of |:history|. >
			:command -nargs=1 H execute histget("cmd", 0+<args>)
<
		Can also be used as a |method|: >
			GetHistory()->histget()

histnr({history})					*histnr()*
		The result is the Number of the current entry in {history}.
		See |hist-names| for the possible values of {history}.
		If an error occurred, -1 is returned.

		Example: >
			:let inp_index = histnr("expr")

<		Can also be used as a |method|: >
			GetHistory()->histnr()
<
hlexists({name})					*hlexists()*
		The result is a Number, which is non-zero if a highlight group
		called {name} exists.  This is when the group has been
		defined in some way.  Not necessarily when highlighting has
		been defined for it, it may also have been used for a syntax
		item.
							*highlight_exists()*
		Obsolete name: highlight_exists().

		Can also be used as a |method|: >
			GetName()->hlexists()
<
							*hlID()*
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,
		zero is returned.
		This can be used to retrieve information about the highlight
		group.  For example, to get the background color of the
		"Comment" group: >
	:echo synIDattr(synIDtrans(hlID("Comment")), "bg")
<							*highlightID()*
		Obsolete name: highlightID().

		Can also be used as a |method|: >
			GetName()->hlID()

hostname()						*hostname()*
		The result is a String, which is the name of the machine on
		which Vim is currently running.  Machine names greater than
		256 characters long are truncated.

iconv({expr}, {from}, {to})				*iconv()*
		The result is a String, which is the text {expr} converted
		from encoding {from} to encoding {to}.
		When the conversion completely fails an empty string is
		returned.  When some characters could not be converted they
		are replaced with "?".
		The encoding names are whatever the iconv() library function
		can accept, see ":!man 3 iconv".
		Most conversions require Vim to be compiled with the |+iconv|
		feature.  Otherwise only UTF-8 to latin1 conversion and back
		can be done.
		This can be used to display messages with special characters,
		no matter what 'encoding' is set to.  Write the message in
		UTF-8 and use: >
			echo iconv(utf8_str, "utf-8", &enc)
<		Note that Vim uses UTF-8 for all Unicode encodings, conversion
		from/to UCS-2 is automatically changed to use UTF-8.  You
		cannot use UCS-2 in a string anyway, because of the NUL bytes.

		Can also be used as a |method|: >
			GetText()->iconv('latin1', 'utf-8')
<
							*indent()*
indent({lnum})	The result is a Number, which is indent of line {lnum} in the
		current buffer.  The indent is counted in spaces, the value
		of 'tabstop' is relevant.  {lnum} is used just like in
		|getline()|.
		When {lnum} is invalid -1 is returned.

		Can also be used as a |method|: >
			GetLnum()->indent()

index({object}, {expr} [, {start} [, {ic}]])			*index()*
		If {object} is a |List| return the lowest index where the item
		has a value equal to {expr}.  There is no automatic
		conversion, so the String "4" is different from the Number 4.
		And the number 4 is different from the Float 4.0.  The value
		of 'ignorecase' is not used here, case always matters.

		If {object} is |Blob| return the lowest index where the byte
		value is equal to {expr}.

		If {start} is given then start looking at the item with index
		{start} (may be negative for an item relative to the end).
		When {ic} is given and it is |TRUE|, ignore case.  Otherwise
		case must match.
		-1 is returned when {expr} is not found in {object}.
		Example: >
			:let idx = index(words, "the")
			:if index(numbers, 123) >= 0

<		Can also be used as a |method|: >
			GetObject()->index(what)

input({prompt} [, {text} [, {completion}]])		*input()*
		The result is a String, which is whatever the user typed on
		the command-line.  The {prompt} argument is either a prompt
		string, or a blank string (for no prompt).  A '\n' can be used
		in the prompt to start a new line.
		The highlighting set with |:echohl| is used for the prompt.
		The input is entered just like a command-line, with the same
		editing commands and mappings.  There is a separate history
		for lines typed for input().
		Example: >
			:if input("Coffee or beer? ") == "beer"
			:  echo "Cheers!"
			:endif
<
		If the optional {text} argument is present and not empty, this
		is used for the default reply, as if the user typed this.
		Example: >
			:let color = input("Color? ", "white")

<		The optional {completion} argument specifies the type of
		completion supported for the input.  Without it completion is
		not performed.  The supported completion types are the same as
		that can be supplied to a user-defined command using the
		"-complete=" argument.  Refer to |:command-completion| for
		more information.  Example: >
			let fname = input("File: ", "", "file")
<
		NOTE: This function must not be used in a startup file, for
		the versions that only run in GUI mode (e.g., the Win32 GUI).
		Note: When input() is called from within a mapping it will
		consume remaining characters from that mapping, because a
		mapping is handled like the characters were typed.
		Use |inputsave()| before input() and |inputrestore()|
		after input() to avoid that.  Another solution is to avoid
		that further characters follow in the mapping, e.g., by using
		|:execute| or |:normal|.

		Example with a mapping: >
			:nmap \x :call GetFoo()<CR>:exe "/" . Foo<CR>
			:function GetFoo()
			:  call inputsave()
			:  let g:Foo = input("enter search pattern: ")
			:  call inputrestore()
			:endfunction

<		Can also be used as a |method|: >
			GetPrompt()->input()

inputdialog({prompt} [, {text} [, {cancelreturn}]])		*inputdialog()*
		Like |input()|, but when the GUI is running and text dialogs
		are supported, a dialog window pops up to input the text.
		Example: >
		   :let n = inputdialog("value for shiftwidth", shiftwidth())
		   :if n != ""
		   :  let &sw = n
		   :endif
<		When the dialog is cancelled {cancelreturn} is returned.  When
		omitted an empty string is returned.
		Hitting <Enter> works like pressing the OK button.  Hitting
		<Esc> works like pressing the Cancel button.
		NOTE: Command-line completion is not supported.

		Can also be used as a |method|: >
			GetPrompt()->inputdialog()

inputlist({textlist})					*inputlist()*
		{textlist} must be a |List| of strings.  This |List| is
		displayed, one string per line.  The user will be prompted to
		enter a number, which is returned.
		The user can also select an item by clicking on it with the
		mouse, if the mouse is enabled in the command line ('mouse' is
		"a" or includes "c").  For the first string 0 is returned.
		When clicking above the first item a negative number is
		returned.  When clicking on the prompt one more than the
		length of {textlist} is returned.
		Make sure {textlist} has less than 'lines' entries, otherwise
		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.
		Example: >
			let color = inputlist(['Select color:', '1. red',
				\ '2. green', '3. blue'])

<		Can also be used as a |method|: >
			GetChoices()->inputlist()

inputrestore()						*inputrestore()*
		Restore typeahead that was saved with a previous |inputsave()|.
		Should be called the same number of times inputsave() is
		called.  Calling it more often is harmless though.
		Returns 1 when there is nothing to restore, 0 otherwise.

inputsave()						*inputsave()*
		Preserve typeahead (also from mappings) and clear it, so that
		a following prompt gets input from the user.  Should be
		followed by a matching inputrestore() after the prompt.  Can
		be used several times, in which case there must be just as
		many inputrestore() calls.
		Returns 1 when out of memory, 0 otherwise.

inputsecret({prompt} [, {text}])			*inputsecret()*
		This function acts much like the |input()| function with but
		two exceptions:
		a) the user's response will be displayed as a sequence of
		asterisks ("*") thereby keeping the entry secret, and
		b) the user's response will not be recorded on the input
		|history| stack.
		The result is a String, which is whatever the user actually
		typed on the command-line in response to the issued prompt.
		NOTE: Command-line completion is not supported.

		Can also be used as a |method|: >
			GetPrompt()->inputsecret()

insert({object}, {item} [, {idx}])			*insert()*
		When {object} is a |List| or a |Blob| insert {item} at the start
		of it.

		If {idx} is specified insert {item} before the item with index
		{idx}.  If {idx} is zero it goes before the first item, just
		like omitting {idx}.  A negative {idx} is also possible, see
		|list-index|.  -1 inserts just before the last item.

		Returns the resulting |List| or |Blob|.  Examples: >
			:let mylist = insert([2, 3, 5], 1)
			:call insert(mylist, 4, -1)
			:call insert(mylist, 6, len(mylist))
<		The last example can be done simpler with |add()|.
		Note that when {item} is a |List| it is inserted as a single
		item.  Use |extend()| to concatenate |Lists|.

		Can also be used as a |method|: >
			mylist->insert(item)

interrupt()						*interrupt()*
		Interrupt script execution.  It works more or less like the
		user typing CTRL-C, most commands won't execute and control
		returns to the user.  This is useful to abort execution
		from lower down, e.g. in an autocommand.  Example: >
		:function s:check_typoname(file)
		:   if fnamemodify(a:file, ':t') == '['
		:       echomsg 'Maybe typo'
		:       call interrupt()
		:   endif
		:endfunction
		:au BufWritePre * call s:check_typoname(expand('<amatch>'))

invert({expr})						*invert()*
		Bitwise invert.  The argument is converted to a number.  A
		List, Dict or Float argument causes an error.  Example: >
			:let bits = invert(bits)
<		Can also be used as a |method|: >
			:let bits = bits->invert()

isdirectory({directory})				*isdirectory()*
		The result is a Number, which is |TRUE| when a directory
		with the name {directory} exists.  If {directory} doesn't
		exist, or isn't a directory, the result is |FALSE|.  {directory}
		is any expression, which is used as a String.

		Can also be used as a |method|: >
			GetName()->isdirectory()

isinf({expr})						*isinf()*
		Return 1 if {expr} is a positive infinity, or -1 a negative
		infinity, otherwise 0. >
			:echo isinf(1.0 / 0.0)
<			1 >
			:echo isinf(-1.0 / 0.0)
<			-1

		Can also be used as a |method|: >
			Compute()->isinf()
<
		{only available when compiled with the |+float| feature}

islocked({expr})					*islocked()* *E786*
		The result is a Number, which is |TRUE| when {expr} is the
		name of a locked variable.
		{expr} must be the name of a variable, |List| item or
		|Dictionary| entry, not the variable itself!  Example: >
			:let alist = [0, ['a', 'b'], 2, 3]
			:lockvar 1 alist
			:echo islocked('alist')		" 1
			:echo islocked('alist[1]')	" 0

<		When {expr} is a variable that does not exist you get an error
		message.  Use |exists()| to check for existence.

		Can also be used as a |method|: >
			GetName()->islocked()

isnan({expr})						*isnan()*
		Return |TRUE| if {expr} is a float with value NaN. >
			echo isnan(0.0 / 0.0)
<			1

		Can also be used as a |method|: >
			Compute()->isnan()
<
		{only available when compiled with the |+float| feature}

items({dict})						*items()*
		Return a |List| with all the key-value pairs of {dict}.  Each
		|List| item is a list with two items: the key of a {dict}
		entry and the value of this entry.  The |List| is in arbitrary
		order.  Also see |keys()| and |values()|.
		Example: >
			for [key, value] in items(mydict)
			   echo key . ': ' . value
			endfor

<		Can also be used as a |method|: >
			mydict->items()

job_ functions are documented here: |job-functions-details|


join({list} [, {sep}])					*join()*
		Join the items in {list} together into one String.
		When {sep} is specified it is put in between the items.  If
		{sep} is omitted a single space is used.
		Note that {sep} is not added at the end.  You might want to
		add it there too: >
			let lines = join(mylist, "\n") . "\n"
<		String items are used as-is.  |Lists| and |Dictionaries| are
		converted into a string like with |string()|.
		The opposite function is |split()|.

		Can also be used as a |method|: >
			mylist->join()

js_decode({string})					*js_decode()*
		This is similar to |json_decode()| with these differences:
		- Object key names do not have to be in quotes.
		- Strings can be in single quotes.
		- Empty items in an array (between two commas) are allowed and
		  result in v:none items.

		Can also be used as a |method|: >
			ReadObject()->js_decode()

js_encode({expr})					*js_encode()*
		This is similar to |json_encode()| with these differences:
		- Object key names are not in quotes.
		- v:none items in an array result in an empty item between
		  commas.
		For example, the Vim object:
			[1,v:none,{"one":1},v:none] ~
		Will be encoded as:
			[1,,{one:1},,] ~
		While json_encode() would produce:
			[1,null,{"one":1},null] ~
		This encoding is valid for JavaScript. It is more efficient
		than JSON, especially when using an array with optional items.

		Can also be used as a |method|: >
			GetObject()->js_encode()

json_decode({string})					*json_decode()*
		This parses a JSON formatted string and returns the equivalent
		in Vim values.  See |json_encode()| for the relation between
		JSON and Vim values.
		The decoding is permissive:
		- A trailing comma in an array and object is ignored, e.g.
		  "[1, 2, ]" is the same as "[1, 2]".
		- Integer keys are accepted in objects, e.g. {1:2} is the
		  same as {"1":2}.
		- More floating point numbers are recognized, e.g. "1." for
		  "1.0", or "001.2" for "1.2". Special floating point values
		  "Infinity", "-Infinity" and "NaN" (capitalization ignored)
		  are accepted.
		- Leading zeroes in integer numbers are ignored, e.g. "012"
		  for "12" or "-012" for "-12".
		- Capitalization is ignored in literal names null, true or
		  false, e.g. "NULL" for "null", "True" for "true".
		- Control characters U+0000 through U+001F which are not
		  escaped in strings are accepted, e.g. "	" (tab
		  character in string) for "\t".
		- An empty JSON expression or made of only spaces is accepted
		  and results in v:none.
		- Backslash in an invalid 2-character sequence escape is
		  ignored, e.g. "\a" is decoded as "a".
		- A correct surrogate pair in JSON strings should normally be
		  a 12 character sequence such as "\uD834\uDD1E", but
		  json_decode() silently accepts truncated surrogate pairs
		  such as "\uD834" or "\uD834\u"
								*E938*
		A duplicate key in an object, valid in rfc7159, is not
		accepted by json_decode() as the result must be a valid Vim
		type, e.g. this fails: {"a":"b", "a":"c"}

		Can also be used as a |method|: >
			ReadObject()->json_decode()

json_encode({expr})					*json_encode()*
		Encode {expr} as JSON and return this as a string.
		The encoding is specified in:
		https://tools.ietf.org/html/rfc7159.html
		Vim values are converted as follows:
		   |Number|		decimal number
		   |Float|		floating point number
		   Float nan		"NaN"
		   Float inf		"Infinity"
		   Float -inf		"-Infinity"
		   |String|		in double quotes (possibly null)
		   |Funcref|		not possible, error
		   |List|		as an array (possibly null); when
					used recursively: []
		   |Dict|		as an object (possibly null); when
					used recursively: {}
		   |Blob|		as an array of the individual bytes
		   v:false		"false"
		   v:true		"true"
		   v:none		"null"
		   v:null		"null"
		Note that NaN and Infinity are passed on as values.  This is
		missing in the JSON standard, but several implementations do
		allow it.  If not then you will get an error.

		Can also be used as a |method|: >
			GetObject()->json_encode()

keys({dict})						*keys()*
		Return a |List| with all the keys of {dict}.  The |List| is in
		arbitrary order.  Also see |items()| and |values()|.

		Can also be used as a |method|: >
			mydict->keys()

<							*len()* *E701*
len({expr})	The result is a Number, which is the length of the argument.
		When {expr} is a String or a Number the length in bytes is
		used, as with |strlen()|.
		When {expr} is a |List| the number of items in the |List| is
		returned.
		When {expr} is a |Blob| the number of bytes is returned.
		When {expr} is a |Dictionary| the number of entries in the
		|Dictionary| is returned.
		Otherwise an error is given.

		Can also be used as a |method|: >
			mylist->len()

<						*libcall()* *E364* *E368*
libcall({libname}, {funcname}, {argument})
		Call function {funcname} in the run-time library {libname}
		with single argument {argument}.
		This is useful to call functions in a library that you
		especially made to be used with Vim.  Since only one argument
		is possible, calling standard library functions is rather
		limited.
		The result is the String returned by the function.  If the
		function returns NULL, this will appear as an empty string ""
		to Vim.
		If the function returns a number, use libcallnr()!
		If {argument} is a number, it is passed to the function as an
		int; if {argument} is a string, it is passed as a
		null-terminated string.
		This function will fail in |restricted-mode|.

		libcall() allows you to write your own 'plug-in' extensions to
		Vim without having to recompile the program.  It is NOT a
		means to call system functions!  If you try to do so Vim will
		very probably crash.

		For Win32, the functions you write must be placed in a DLL
		and use the normal C calling convention (NOT Pascal which is
		used in Windows System DLLs).  The function must take exactly
		one parameter, either a character pointer or a long integer,
		and must return a character pointer or NULL.  The character
		pointer returned must point to memory that will remain valid
		after the function has returned (e.g. in static data in the
		DLL).  If it points to allocated memory, that memory will
		leak away.  Using a static buffer in the function should work,
		it's then freed when the DLL is unloaded.

		WARNING: If the function returns a non-valid pointer, Vim may
		crash!	This also happens if the function returns a number,
		because Vim thinks it's a pointer.
		For Win32 systems, {libname} should be the filename of the DLL
		without the ".DLL" suffix.  A full path is only required if
		the DLL is not in the usual places.
		For Unix: When compiling your own plugins, remember that the
		object code must be compiled as position-independent ('PIC').
		{only in Win32 and some Unix versions, when the |+libcall|
		feature is present}
		Examples: >
			:echo libcall("libc.so", "getenv", "HOME")

<		Can also be used as a |method|, the base is passed as the
		third argument: >
			GetValue()->libcall("libc.so", "getenv")
<
							*libcallnr()*
libcallnr({libname}, {funcname}, {argument})
		Just like |libcall()|, but used for a function that returns an
		int instead of a string.
		{only in Win32 on some Unix versions, when the |+libcall|
		feature is present}
		Examples: >
			:echo libcallnr("/usr/lib/libc.so", "getpid", "")
			:call libcallnr("libc.so", "printf", "Hello World!\n")
			:call libcallnr("libc.so", "sleep", 10)
<
		Can also be used as a |method|, the base is passed as the
		third argument: >
			GetValue()->libcallnr("libc.so", "printf")
<

line({expr} [, {winid}])				*line()*
		The result is a Number, which is the line number of the file
		position given with {expr}.  The accepted positions are:
		    .	    the cursor position
		    $	    the last line in the current buffer
		    'x	    position of mark x (if the mark is not set, 0 is
			    returned)
		    w0	    first line visible in current window (one if the
			    display isn't updated, e.g. in silent Ex mode)
		    w$	    last line visible in current window (this is one
			    less than "w0" if no lines are visible)
		    v	    In Visual mode: the start of the Visual area (the
			    cursor is the end).  When not in Visual mode
			    returns the cursor position.  Differs from |'<| in
			    that it's updated right away.
		Note that a mark in another file can be used.  The line number
		then applies to another buffer.
		To get the column number use |col()|.  To get both use
		|getpos()|.
		With the optional {winid} argument the values are obtained for
		that window instead of the current window.
		Examples: >
			line(".")		line number of the cursor
			line(".", winid)	idem, in window "winid"
			line("'t")		line number of mark t
			line("'" . marker)	line number of mark marker
<
		To jump to the last known position when opening a file see
		|last-position-jump|.

		Can also be used as a |method|: >
			GetValue()->line()

line2byte({lnum})					*line2byte()*
		Return the byte count from the start of the buffer for line
		{lnum}.  This includes the end-of-line character, depending on
		the 'fileformat' option for the current buffer.  The first
		line returns 1. 'encoding' matters, 'fileencoding' is ignored.
		This can also be used to get the byte count for the line just
		below the last line: >
			line2byte(line("$") + 1)
<		This is the buffer size plus one.  If 'fileencoding' is empty
		it is the file size plus one.
		When {lnum} is invalid, or the |+byte_offset| feature has been
		disabled at compile time, -1 is returned.
		Also see |byte2line()|, |go| and |:goto|.

		Can also be used as a |method|: >
			GetLnum()->line2byte()

lispindent({lnum})					*lispindent()*
		Get the amount of indent for line {lnum} according the lisp
		indenting rules, as with 'lisp'.
		The indent is counted in spaces, the value of 'tabstop' is
		relevant.  {lnum} is used just like in |getline()|.
		When {lnum} is invalid or Vim was not compiled the
		|+lispindent| feature, -1 is returned.

		Can also be used as a |method|: >
			GetLnum()->lispindent()

list2str({list} [, {utf8}])				*list2str()*
		Convert each number in {list} to a character string can
		concatenate them all.  Examples: >
			list2str([32])		returns " "
			list2str([65, 66, 67])	returns "ABC"
<		The same can be done (slowly) with: >
			join(map(list, {nr, val -> nr2char(val)}), '')
<		|str2list()| does the opposite.

		When {utf8} is omitted or zero, the current 'encoding' is used.
		With {utf8} is 1, always return utf-8 characters.
		With utf-8 composing characters work as expected: >
			list2str([97, 769])	returns "á"
<
		Can also be used as a |method|: >
			GetList()->list2str()

listener_add({callback} [, {buf}])			*listener_add()*
		Add a callback function that will be invoked when changes have
		been made to buffer {buf}.
		{buf} refers to a buffer name or number. For the accepted
		values, see |bufname()|.  When {buf} is omitted the current
		buffer is used.
		Returns a unique ID that can be passed to |listener_remove()|.

		The {callback} is invoked with five arguments:
		    a:bufnr	the buffer that was changed
		    a:start	first changed line number
		    a:end	first line number below the change
		    a:added	number of lines added, negative if lines were
				deleted
		    a:changes	a List of items with details about the changes

		Example: >
	    func Listener(bufnr, start, end, added, changes)
	      echo 'lines ' .. a:start .. ' until ' .. a:end .. ' changed'
	    endfunc
	    call listener_add('Listener', bufnr)

<		The List cannot be changed.  Each item in a:changes is a
		dictionary with these entries:
		    lnum	the first line number of the change
		    end		the first line below the change
		    added	number of lines added; negative if lines were
				deleted
		    col		first column in "lnum" that was affected by
				the change; one if unknown or the whole line
				was affected; this is a byte index, first
				character has a value of one.
		When lines are inserted the values are:
		    lnum	line above which the new line is added
		    end		equal to "lnum"
		    added	number of lines inserted
		    col		1
		When lines are deleted the values are:
		    lnum	the first deleted line
		    end		the line below the first deleted line, before
				the deletion was done
		    added	negative, number of lines deleted
		    col		1
		When lines are changed:
		    lnum	the first changed line
		    end		the line below the last changed line
		    added	0
		    col		first column with a change or 1

		The entries are in the order the changes were made, thus the
		most recent change is at the end.  The line numbers are valid
		when the callback is invoked, but later changes may make them
		invalid, thus keeping a copy for later might not work.

		The {callback} is invoked just before the screen is updated,
		when |listener_flush()| is called or when a change is being
		made that changes the line count in a way it causes a line
		number in the list of changes to become invalid.

		The {callback} is invoked with the text locked, see
		|textlock|.  If you do need to make changes to the buffer, use
		a timer to do this later |timer_start()|.

		The {callback} is not invoked when the buffer is first loaded.
		Use the |BufReadPost| autocmd event to handle the initial text
		of a buffer.
		The {callback} is also not invoked when the buffer is
		unloaded, use the |BufUnload| autocmd event for that.

		Can also be used as a |method|, the base is passed as the
		second argument: >
			GetBuffer()->listener_add(callback)

listener_flush([{buf}])					*listener_flush()*
		Invoke listener callbacks for buffer {buf}.  If there are no
		pending changes then no callbacks are invoked.

		{buf} refers to a buffer name or number. For the accepted
		values, see |bufname()|.  When {buf} is omitted the current
		buffer is used.

		Can also be used as a |method|: >
			GetBuffer()->listener_flush()

listener_remove({id})					*listener_remove()*
		Remove a listener previously added with listener_add().
		Returns zero when {id} could not be found, one when {id} was
		removed.

		Can also be used as a |method|: >
			GetListenerId()->listener_remove()

localtime()						*localtime()*
		Return the current time, measured as seconds since 1st Jan
		1970.  See also |strftime()|, |strptime()| and |getftime()|.


log({expr})						*log()*
		Return the natural logarithm (base e) of {expr} as a |Float|.
		{expr} must evaluate to a |Float| or a |Number| in the range
		(0, inf].
		Examples: >
			:echo log(10)
<			2.302585 >
			:echo log(exp(5))
<			5.0

		Can also be used as a |method|: >
			Compute()->log()
<
		{only available when compiled with the |+float| feature}


log10({expr})						*log10()*
		Return the logarithm of Float {expr} to base 10 as a |Float|.
		{expr} must evaluate to a |Float| or a |Number|.
		Examples: >
			:echo log10(1000)
<			3.0 >
			:echo log10(0.01)
<			-2.0

		Can also be used as a |method|: >
			Compute()->log10()
<
		{only available when compiled with the |+float| feature}

luaeval({expr} [, {expr}])					*luaeval()*
		Evaluate Lua expression {expr} and return its result converted
		to Vim data structures. Second {expr} may hold additional
		argument accessible as _A inside first {expr}.
		Strings are returned as they are.
		Boolean objects are converted to numbers.
		Numbers are converted to |Float| values if vim was compiled
		with |+float| and to numbers otherwise.
		Dictionaries and lists obtained by vim.eval() are returned
		as-is.
		Other objects are returned as zero without any errors.
		See |lua-luaeval| for more details.

		Can also be used as a |method|: >
			GetExpr()->luaeval()

<		{only available when compiled with the |+lua| feature}

map({expr1}, {expr2})					*map()*
		{expr1} must be a |List|, |Blob| or |Dictionary|.
		Replace each item in {expr1} with the result of evaluating
		{expr2}.  For a |Blob| each byte is replaced.
		If the item type changes you may want to use |mapnew()| to
		create a new List or Dictionary.  This is required when using
		Vim9 script.

		{expr2} must be a |string| or |Funcref|.

		If {expr2} is a |string|, inside {expr2} |v:val| has the value
		of the current item.  For a |Dictionary| |v:key| has the key
		of the current item and for a |List| |v:key| has the index of
		the current item.
		Example: >
			:call map(mylist, '"> " . v:val . " <"')
<		This puts "> " before and " <" after each item in "mylist".

		Note that {expr2} is the result of an expression and is then
		used as an expression again.  Often it is good to use a
		|literal-string| to avoid having to double backslashes.  You
		still have to double ' quotes

		If {expr2} is a |Funcref| it is called with two arguments:
			1. The key or the index of the current item.
			2. the value of the current item.
		The function must return the new value of the item. Example
		that changes each value by "key-value": >
			func KeyValue(key, val)
			  return a:key . '-' . a:val
			endfunc
			call map(myDict, function('KeyValue'))
<		It is shorter when using a |lambda|: >
			call map(myDict, {key, val -> key . '-' . val})
<		If you do not use "val" you can leave it out: >
			call map(myDict, {key -> 'item: ' . key})
<		If you do not use "key" you can use a short name: >
			call map(myDict, {_, val -> 'item: ' . val})
<
		The operation is done in-place.  If you want a |List| or
		|Dictionary| to remain unmodified make a copy first: >
			:let tlist = map(copy(mylist), ' v:val . "\t"')

<		Returns {expr1}, the |List|, |Blob| or |Dictionary| that was
		filtered.  When an error is encountered while evaluating
		{expr2} no further items in {expr1} are processed.  When
		{expr2} is a Funcref errors inside a function are ignored,
		unless it was defined with the "abort" flag.

		Can also be used as a |method|: >
			mylist->map(expr2)


maparg({name} [, {mode} [, {abbr} [, {dict}]]])			*maparg()*
		When {dict} is omitted or zero: Return the rhs of mapping
		{name} in mode {mode}.  The returned String has special
		characters translated like in the output of the ":map" command
		listing.

		When there is no mapping for {name}, an empty String is
		returned.  When the mapping for {name} is empty, then "<Nop>"
		is returned.

		The {name} can have special key names, like in the ":map"
		command.

		{mode} can be one of these strings:
			"n"	Normal
			"v"	Visual (including Select)
			"o"	Operator-pending
			"i"	Insert
			"c"	Cmd-line
			"s"	Select
			"x"	Visual
			"l"	langmap |language-mapping|
			"t"	Terminal-Job
			""	Normal, Visual and Operator-pending
		When {mode} is omitted, the modes for "" are used.

		When {abbr} is there and it is |TRUE| use abbreviations
		instead of mappings.

		When {dict} is there and it is |TRUE| return a dictionary
		containing all the information of the mapping with the
		following items:
		  "lhs"	     The {lhs} of the mapping as it would be typed
		  "lhsraw"   The {lhs} of the mapping as raw bytes
		  "lhsrawalt" The {lhs} of the mapping as raw bytes, alternate
		  	      form, only present when it differs from "lhsraw"
		  "rhs"	     The {rhs} of the mapping as typed.
		  "silent"   1 for a |:map-silent| mapping, else 0.
		  "noremap"  1 if the {rhs} of the mapping is not remappable.
		  "script"   1 if mapping was defined with <script>.
		  "expr"     1 for an expression mapping (|:map-<expr>|).
		  "buffer"   1 for a buffer local mapping (|:map-local|).
		  "mode"     Modes for which the mapping is defined. In
			     addition to the modes mentioned above, these
			     characters will be used:
			     " "     Normal, Visual and Operator-pending
			     "!"     Insert and Commandline mode
				     (|mapmode-ic|)
		  "sid"	     The script local ID, used for <sid> mappings
			     (|<SID>|).
		  "lnum"     The line number in "sid", zero if unknown.
		  "nowait"   Do not wait for other, longer mappings.
			     (|:map-<nowait>|).

		The dictionary can be used to restore a mapping with
		|mapset()|.

		The mappings local to the current buffer are checked first,
		then the global mappings.
		This function can be used to map a key even when it's already
		mapped, and have it do the original mapping too.  Sketch: >
			exe 'nnoremap <Tab> ==' . maparg('<Tab>', 'n')

<		Can also be used as a |method|: >
			GetKey()->maparg('n')

mapcheck({name} [, {mode} [, {abbr}]])			*mapcheck()*
		Check if there is a mapping that matches with {name} in mode
		{mode}.  See |maparg()| for {mode} and special names in
		{name}.
		When {abbr} is there and it is |TRUE| use abbreviations
		instead of mappings.
		A match happens with a mapping that starts with {name} and
		with a mapping which is equal to the start of {name}.

			matches mapping "a"	"ab"	"abc" ~
		   mapcheck("a")	yes	yes	 yes
		   mapcheck("abc")	yes	yes	 yes
		   mapcheck("ax")	yes	no	 no
		   mapcheck("b")	no	no	 no

		The difference with maparg() is that mapcheck() finds a
		mapping that matches with {name}, while maparg() only finds a
		mapping for {name} exactly.
		When there is no mapping that starts with {name}, an empty
		String is returned.  If there is one, the RHS of that mapping
		is returned.  If there are several mappings that start with
		{name}, the RHS of one of them is returned.  This will be
		"<Nop>" if the RHS is empty.
		The mappings local to the current buffer are checked first,
		then the global mappings.
		This function can be used to check if a mapping can be added
		without being ambiguous.  Example: >
	:if mapcheck("_vv") == ""
	:   map _vv :set guifont=7x13<CR>
	:endif
<		This avoids adding the "_vv" mapping when there already is a
		mapping for "_v" or for "_vvv".

		Can also be used as a |method|: >
			GetKey()->mapcheck('n')


mapnew({expr1}, {expr2})					*mapnew()*
		Like |map()| but instead of replacing items in {expr1} a new
		List or Dictionary is created and returned.  {expr1} remains
		unchanged.  Items can still be changed by {expr2}, if you
		don't want that use |deepcopy()| first.


mapset({mode}, {abbr}, {dict})					*mapset()*
		Restore a mapping from a dictionary returned by |maparg()|.
		{mode} and {abbr} should be the same as for the call to
		|maparg()|. *E460*
		{mode} is used to define the mode in which the mapping is set,
		not the "mode" entry in {dict}.
		Example for saving and restoring a mapping: >
			let save_map = maparg('K', 'n', 0, 1)
			nnoremap K somethingelse
			...
			call mapset('n', 0, save_map)
<		Note that if you are going to replace a map in several modes,
		e.g. with `:map!`, you need to save the mapping for all of
		them, since they can differ.


match({expr}, {pat} [, {start} [, {count}]])			*match()*
		When {expr} is a |List| then this returns the index of the
		first item where {pat} matches.  Each item is used as a
		String, |Lists| and |Dictionaries| are used as echoed.

		Otherwise, {expr} is used as a String.  The result is a
		Number, which gives the index (byte offset) in {expr} where
		{pat} matches.

		A match at the first character or |List| item returns zero.
		If there is no match -1 is returned.

		For getting submatches see |matchlist()|.
		Example: >
			:echo match("testing", "ing")	" results in 4
			:echo match([1, 'x'], '\a')	" results in 1
<		See |string-match| for how {pat} is used.
								*strpbrk()*
		Vim doesn't have a strpbrk() function.  But you can do: >
			:let sepidx = match(line, '[.,;: \t]')
<								*strcasestr()*
		Vim doesn't have a strcasestr() function.  But you can add
		"\c" to the pattern to ignore case: >
			:let idx = match(haystack, '\cneedle')
<
		If {start} is given, the search starts from byte index
		{start} in a String or item {start} in a |List|.
		The result, however, is still the index counted from the
		first character/item.  Example: >
			:echo match("testing", "ing", 2)
<		result is again "4". >
			:echo match("testing", "ing", 4)
<		result is again "4". >
			:echo match("testing", "t", 2)
<		result is "3".
		For a String, if {start} > 0 then it is like the string starts
		{start} bytes later, thus "^" will match at {start}.  Except
		when {count} is given, then it's like matches before the
		{start} byte are ignored (this is a bit complicated to keep it
		backwards compatible).
		For a String, if {start} < 0, it will be set to 0.  For a list
		the index is counted from the end.
		If {start} is out of range ({start} > strlen({expr}) for a
		String or {start} > len({expr}) for a |List|) -1 is returned.

		When {count} is given use the {count}'th match.  When a match
		is found in a String the search for the next one starts one
		character further.  Thus this example results in 1: >
			echo match("testing", "..", 0, 2)
<		In a |List| the search continues in the next item.
		Note that when {count} is added the way {start} works changes,
		see above.

		See |pattern| for the patterns that are accepted.
		The 'ignorecase' option is used to set the ignore-caseness of
		the pattern.  'smartcase' is NOT used.  The matching is always
		done like 'magic' is set and 'cpoptions' is empty.
		Note that a match at the start is preferred, thus when the
		pattern is using "*" (any number of matches) it tends to find
		zero matches at the start instead of a number of matches
		further down in the text.

		Can also be used as a |method|: >
			GetList()->match('word')
<
				*matchadd()* *E798* *E799* *E801* *E957*
matchadd({group}, {pattern} [, {priority} [, {id} [, {dict}]]])
		Defines a pattern to be highlighted in the current window (a
		"match").  It will be highlighted with {group}.  Returns an
		identification number (ID), which can be used to delete the
		match using |matchdelete()|.  The ID is bound to the window.
		Matching is case sensitive and magic, unless case sensitivity
		or magicness are explicitly overridden in {pattern}.  The
		'magic', 'smartcase' and 'ignorecase' options are not used.
		The "Conceal" value is special, it causes the match to be
		concealed.

		The optional {priority} argument assigns a priority to the
		match.  A match with a high priority will have its
		highlighting overrule that of a match with a lower priority.
		A priority is specified as an integer (negative numbers are no
		exception).  If the {priority} argument is not specified, the
		default priority is 10.  The priority of 'hlsearch' is zero,
		hence all matches with a priority greater than zero will
		overrule it.  Syntax highlighting (see 'syntax') is a separate
		mechanism, and regardless of the chosen priority a match will
		always overrule syntax highlighting.

		The optional {id} argument allows the request for a specific
		match ID.  If a specified ID is already taken, an error
		message will appear and the match will not be added.  An ID
		is specified as a positive integer (zero excluded).  IDs 1, 2
		and 3 are reserved for |:match|, |:2match| and |:3match|,
		respectively.  If the {id} argument is not specified or -1,
		|matchadd()| automatically chooses a free ID.

		The optional {dict} argument allows for further custom
		values. Currently this is used to specify a match specific
		conceal character that will be shown for |hl-Conceal|
		highlighted matches. The dict can have the following members:

			conceal	    Special character to show instead of the
				    match (only for |hl-Conceal| highlighted
				    matches, see |:syn-cchar|)
			window	    Instead of the current window use the
				    window with this number or window ID.

		The number of matches is not limited, as it is the case with
		the |:match| commands.

		Example: >
			:highlight MyGroup ctermbg=green guibg=green
			:let m = matchadd("MyGroup", "TODO")
<		Deletion of the pattern: >
			:call matchdelete(m)

<		A list of matches defined by |matchadd()| and |:match| are
		available from |getmatches()|.  All matches can be deleted in
		one operation by |clearmatches()|.

		Can also be used as a |method|: >
			GetGroup()->matchadd('TODO')
<
							*matchaddpos()*
matchaddpos({group}, {pos} [, {priority} [, {id} [, {dict}]]])
		Same as |matchadd()|, but requires a list of positions {pos}
		instead of a pattern. This command is faster than |matchadd()|
		because it does not require to handle regular expressions and
		sets buffer line boundaries to redraw screen. It is supposed
		to be used when fast match additions and deletions are
		required, for example to highlight matching parentheses.

		The list {pos} can contain one of these items:
		- A number.  This whole line will be highlighted.  The first
		  line has number 1.
		- A list with one number, e.g., [23]. The whole line with this
		  number will be highlighted.
		- A list with two numbers, e.g., [23, 11]. The first number is
		  the line number, the second one is the column number (first
		  column is 1, the value must correspond to the byte index as
		  |col()| would return).  The character at this position will
		  be highlighted.
		- A list with three numbers, e.g., [23, 11, 3]. As above, but
		  the third number gives the length of the highlight in bytes.

		The maximum number of positions is 8.

		Example: >
			:highlight MyGroup ctermbg=green guibg=green
			:let m = matchaddpos("MyGroup", [[23, 24], 34])
<		Deletion of the pattern: >
			:call matchdelete(m)

<		Matches added by |matchaddpos()| are returned by
		|getmatches()| with an entry "pos1", "pos2", etc., with the
		value a list like the {pos} item.

		Can also be used as a |method|: >
			GetGroup()->matchaddpos([23, 11])

matcharg({nr})							*matcharg()*
		Selects the {nr} match item, as set with a |:match|,
		|:2match| or |:3match| command.
		Return a |List| with two elements:
			The name of the highlight group used
			The pattern used.
		When {nr} is not 1, 2 or 3 returns an empty |List|.
		When there is no match item set returns ['', ''].
		This is useful to save and restore a |:match|.
		Highlighting matches using the |:match| commands are limited
		to three matches. |matchadd()| does not have this limitation.

		Can also be used as a |method|: >
			GetMatch()->matcharg()

matchdelete({id} [, {win})		       *matchdelete()* *E802* *E803*
		Deletes a match with ID {id} previously defined by |matchadd()|
		or one of the |:match| commands.  Returns 0 if successful,
		otherwise -1.  See example for |matchadd()|.  All matches can
		be deleted in one operation by |clearmatches()|.
		If {win} is specified, use the window with this number or
		window ID instead of the current window.

		Can also be used as a |method|: >
			GetMatch()->matchdelete()

matchend({expr}, {pat} [, {start} [, {count}]])			*matchend()*
		Same as |match()|, but return the index of first character
		after the match.  Example: >
			:echo matchend("testing", "ing")
<		results in "7".
							*strspn()* *strcspn()*
		Vim doesn't have a strspn() or strcspn() function, but you can
		do it with matchend(): >
			:let span = matchend(line, '[a-zA-Z]')
			:let span = matchend(line, '[^a-zA-Z]')
<		Except that -1 is returned when there are no matches.

		The {start}, if given, has the same meaning as for |match()|. >
			:echo matchend("testing", "ing", 2)
<		results in "7". >
			:echo matchend("testing", "ing", 5)
<		result is "-1".
		When {expr} is a |List| the result is equal to |match()|.

		Can also be used as a |method|: >
			GetText()->matchend('word')


matchfuzzy({list}, {str} [, {dict}])			*matchfuzzy()*
		If {list} is a list of strings, then returns a |List| with all
		the strings in {list} that fuzzy match {str}. The strings in
		the returned list are sorted based on the matching score.

		The optional {dict} argument always supports the following
		items:
		    matchseq	When this item is present and {str} contains
				multiple words separated by white space, then
				returns only matches that contain the words in
				the given sequence.

		If {list} is a list of dictionaries, then the optional {dict}
		argument supports the following additional items:
		    key		key of the item which is fuzzy matched against
				{str}. The value of this item should be a
				string.
		    text_cb	|Funcref| that will be called for every item
				in {list} to get the text for fuzzy matching.
				This should accept a dictionary item as the
				argument and return the text for that item to
				use for fuzzy matching.

		{str} is treated as a literal string and regular expression
		matching is NOT supported.  The maximum supported {str} length
		is 256.

		When {str} has multiple words each separated by white space,
		then the list of strings that have all the words is returned.

		If there are no matching strings or there is an error, then an
		empty list is returned. If length of {str} is greater than
		256, then returns an empty list.

		Example: >
		   :echo matchfuzzy(["clay", "crow"], "cay")
<		results in ["clay"]. >
		   :echo getbufinfo()->map({_, v -> v.name})->matchfuzzy("ndl")
<		results in a list of buffer names fuzzy matching "ndl". >
		   :echo getbufinfo()->matchfuzzy("ndl", {'key' : 'name'})
<		results in a list of buffer information dicts with buffer
		names fuzzy matching "ndl". >
		   :echo getbufinfo()->matchfuzzy("spl",
						\ {'text_cb' : {v -> v.name}})
<		results in a list of buffer information dicts with buffer
		names fuzzy matching "spl". >
		   :echo v:oldfiles->matchfuzzy("test")
<		results in a list of file names fuzzy matching "test". >
		   :let l = readfile("buffer.c")->matchfuzzy("str")
<		results in a list of lines in "buffer.c" fuzzy matching "str". >
		   :echo ['one two', 'two one']->matchfuzzy('two one')
<		results in ['two one', 'one two']. >
		   :echo ['one two', 'two one']->matchfuzzy('two one',
						\ {'matchseq': 1})
<		results in ['two one'].

matchfuzzypos({list}, {str} [, {dict}])			*matchfuzzypos()*
		Same as |matchfuzzy()|, but returns the list of matched
		strings, the list of character positions where characters
		in {str} matches and a list of matching scores.  You can
		use |byteidx()|to convert a character position to a byte
		position.

		If {str} matches multiple times in a string, then only the
		positions for the best match is returned.

		If there are no matching strings or there is an error, then a
		list with three empty list items is returned.

		Example: >
			:echo matchfuzzypos(['testing'], 'tsg')
<		results in [['testing'], [[0, 2, 6]], [99]] >
			:echo matchfuzzypos(['clay', 'lacy'], 'la')
<		results in [['lacy', 'clay'], [[0, 1], [1, 2]], [153, 133]] >
			:echo [{'text': 'hello', 'id' : 10}]->matchfuzzypos('ll', {'key' : 'text'})
<		results in [[{'id': 10, 'text': 'hello'}], [[2, 3]], [127]]

matchlist({expr}, {pat} [, {start} [, {count}]])		*matchlist()*
		Same as |match()|, but return a |List|.  The first item in the
		list is the matched string, same as what matchstr() would
		return.  Following items are submatches, like "\1", "\2", etc.
		in |:substitute|.  When an optional submatch didn't match an
		empty string is used.  Example: >
			echo matchlist('acd', '\(a\)\?\(b\)\?\(c\)\?\(.*\)')
<		Results in: ['acd', 'a', '', 'c', 'd', '', '', '', '', '']
		When there is no match an empty list is returned.

		Can also be used as a |method|: >
			GetList()->matchlist('word')

matchstr({expr}, {pat} [, {start} [, {count}]])			*matchstr()*
		Same as |match()|, but return the matched string.  Example: >
			:echo matchstr("testing", "ing")
<		results in "ing".
		When there is no match "" is returned.
		The {start}, if given, has the same meaning as for |match()|. >
			:echo matchstr("testing", "ing", 2)
<		results in "ing". >
			:echo matchstr("testing", "ing", 5)
<		result is "".
		When {expr} is a |List| then the matching item is returned.
		The type isn't changed, it's not necessarily a String.

		Can also be used as a |method|: >
			GetText()->matchstr('word')

matchstrpos({expr}, {pat} [, {start} [, {count}]])		*matchstrpos()*
		Same as |matchstr()|, but return the matched string, the start
		position and the end position of the match.  Example: >
			:echo matchstrpos("testing", "ing")
<		results in ["ing", 4, 7].
		When there is no match ["", -1, -1] is returned.
		The {start}, if given, has the same meaning as for |match()|. >
			:echo matchstrpos("testing", "ing", 2)
<		results in ["ing", 4, 7]. >
			:echo matchstrpos("testing", "ing", 5)
<		result is ["", -1, -1].
		When {expr} is a |List| then the matching item, the index
		of first item where {pat} matches, the start position and the
		end position of the match are returned. >
			:echo matchstrpos([1, '__x'], '\a')
<		result is ["x", 1, 2, 3].
		The type isn't changed, it's not necessarily a String.

		Can also be used as a |method|: >
			GetText()->matchstrpos('word')
<

							*max()*
max({expr})	Return the maximum value of all items in {expr}. Example: >
			echo max([apples, pears, oranges])

<		{expr} can be a |List| or a |Dictionary|.  For a Dictionary,
		it returns the maximum of all values in the Dictionary.
		If {expr} is neither a List nor a Dictionary, or one of the
		items in {expr} cannot be used as a Number this results in
		an error.  An empty |List| or |Dictionary| results in zero.

		Can also be used as a |method|: >
			mylist->max()


menu_info({name} [, {mode}])				*menu_info()*
		Return information about the specified menu {name} in
		mode {mode}. The menu name should be specified without the
		shortcut character ('&').

		{mode} can be one of these strings:
			"n"	Normal
			"v"	Visual (including Select)
			"o"	Operator-pending
			"i"	Insert
			"c"	Cmd-line
			"s"	Select
			"x"	Visual
			"t"	Terminal-Job
			""	Normal, Visual and Operator-pending
			"!"	Insert and Cmd-line
		When {mode} is omitted, the modes for "" are used.

		Returns a |Dictionary| containing the following items:
		  accel		menu item accelerator text |menu-text|
		  display	display name (name without '&')
		  enabled	v:true if this menu item is enabled
				Refer to |:menu-enable|
		  icon		name of the icon file (for toolbar)
				|toolbar-icon|
		  iconidx	index of a built-in icon
		  modes		modes for which the menu is defined. In
				addition to the modes mentioned above, these
				characters will be used:
				" "	Normal, Visual and Operator-pending
		  name		menu item name.
		  noremenu	v:true if the {rhs} of the menu item is not
				remappable else v:false.
		  priority	menu order priority |menu-priority|
		  rhs		right-hand-side of the menu item. The returned
				string has special characters translated like
				in the output of the ":menu" command listing.
				When the {rhs} of a menu item is empty, then
				"<Nop>" is returned.
		  script	v:true if script-local remapping of {rhs} is
				allowed else v:false.  See |:menu-script|.
		  shortcut	shortcut key (character after '&' in
				the menu name) |menu-shortcut|
		  silent	v:true if the menu item is created
				with <silent> argument |:menu-silent|
		  submenus	|List| containing the names of
				all the submenus.  Present only if the menu
				item has submenus.

		Returns an empty dictionary if the menu item is not found.

		Examples: >
			:echo menu_info('Edit.Cut')
			:echo menu_info('File.Save', 'n')
<
		Can also be used as a |method|: >
			GetMenuName()->menu_info('v')


<							*min()*
min({expr})	Return the minimum value of all items in {expr}. Example:  >
			echo min([apples, pears, oranges])

<		{expr} can be a |List| or a |Dictionary|.  For a Dictionary,
		it returns the minimum of all values in the Dictionary.
		If {expr} is neither a List nor a Dictionary, or one of the
		items in {expr} cannot be used as a Number this results in
		an error.  An empty |List| or |Dictionary| results in zero.

		Can also be used as a |method|: >
			mylist->min()

<							*mkdir()* *E739*
mkdir({name} [, {path} [, {prot}]])
		Create directory {name}.

		If {path} is "p" then intermediate directories are created as
		necessary.  Otherwise it must be "".

		If {prot} is given it is used to set the protection bits of
		the new directory.  The default is 0o755 (rwxr-xr-x: r/w for
		the user, readable for others).  Use 0o700 to make it
		unreadable for others.  This is only used for the last part of
		{name}.  Thus if you create /tmp/foo/bar then /tmp/foo will be
		created with 0o755.
		Example: >
			:call mkdir($HOME . "/tmp/foo/bar", "p", 0o700)

<		This function is not available in the |sandbox|.

		There is no error if the directory already exists and the "p"
		flag is passed (since patch 8.0.1708).  However, without the
		"p" option the call will fail.

		The function result is a Number, which is 1 if the call was
		successful or 0 if the directory creation failed or partly
		failed.

		Not available on all systems.  To check use: >
			:if exists("*mkdir")

<		Can also be used as a |method|: >
			GetName()->mkdir()
<
							*mode()*
mode([expr])	Return a string that indicates the current mode.
		If [expr] is supplied and it evaluates to a non-zero Number or
		a non-empty String (|non-zero-arg|), then the full mode is
		returned, otherwise only the first letter is returned.
		Also see |state()|.

		   n	    Normal, Terminal-Normal
		   no	    Operator-pending
		   nov	    Operator-pending (forced characterwise |o_v|)
		   noV	    Operator-pending (forced linewise |o_V|)
		   noCTRL-V Operator-pending (forced blockwise |o_CTRL-V|);
				CTRL-V is one character
		   niI	    Normal using |i_CTRL-O| in |Insert-mode|
		   niR	    Normal using |i_CTRL-O| in |Replace-mode|
		   niV	    Normal using |i_CTRL-O| in |Virtual-Replace-mode|
		   v	    Visual by character
		   V	    Visual by line
		   CTRL-V   Visual blockwise
		   s	    Select by character
		   S	    Select by line
		   CTRL-S   Select blockwise
		   i	    Insert
		   ic	    Insert mode completion |compl-generic|
		   ix	    Insert mode |i_CTRL-X| completion
		   R	    Replace |R|
		   Rc	    Replace mode completion |compl-generic|
		   Rv	    Virtual Replace |gR|
		   Rx	    Replace mode |i_CTRL-X| completion
		   c	    Command-line editing
		   cv	    Vim Ex mode |gQ|
		   ce	    Normal Ex mode |Q|
		   r	    Hit-enter prompt
		   rm	    The -- more -- prompt
		   r?	    A |:confirm| query of some sort
		   !	    Shell or external command is executing
		   t	    Terminal-Job mode: keys go to the job
		This is useful in the 'statusline' option or when used
		with |remote_expr()| In most other places it always returns
		"c" or "n".
		Note that in the future more modes and more specific modes may
		be added. It's better not to compare the whole string but only
		the leading character(s).
		Also see |visualmode()|.

		Can also be used as a |method|: >
			DoFull()->mode()

mzeval({expr})							*mzeval()*
		Evaluate MzScheme expression {expr} and return its result
		converted to Vim data structures.
		Numbers and strings are returned as they are.
		Pairs (including lists and improper lists) and vectors are
		returned as Vim |Lists|.
		Hash tables are represented as Vim |Dictionary| type with keys
		converted to strings.
		All other types are converted to string with display function.
		Examples: >
		    :mz (define l (list 1 2 3))
		    :mz (define h (make-hash)) (hash-set! h "list" l)
		    :echo mzeval("l")
		    :echo mzeval("h")
<
		Can also be used as a |method|: >
			GetExpr()->mzeval()
<
		{only available when compiled with the |+mzscheme| feature}

nextnonblank({lnum})					*nextnonblank()*
		Return the line number of the first line at or below {lnum}
		that is not blank.  Example: >
			if getline(nextnonblank(1)) =~ "Java"
<		When {lnum} is invalid or there is no non-blank line at or
		below it, zero is returned.
		See also |prevnonblank()|.

		Can also be used as a |method|: >
			GetLnum()->nextnonblank()

nr2char({expr} [, {utf8}])				*nr2char()*
		Return a string with a single character, which has the number
		value {expr}.  Examples: >
			nr2char(64)		returns "@"
			nr2char(32)		returns " "
<		When {utf8} is omitted or zero, the current 'encoding' is used.
		Example for "utf-8": >
			nr2char(300)		returns I with bow character
<		With {utf8} set to 1, always return utf-8 characters.
		Note that a NUL character in the file is specified with
		nr2char(10), because NULs are represented with newline
		characters.  nr2char(0) is a real NUL and terminates the
		string, thus results in an empty string.
		To turn a list of character numbers into a string: >
		    let list = [65, 66, 67]
		    let str = join(map(list, {_, val -> nr2char(val)}), '')
<		Result: "ABC"

		Can also be used as a |method|: >
			GetNumber()->nr2char()

or({expr}, {expr})					*or()*
		Bitwise OR on the two arguments.  The arguments are converted
		to a number.  A List, Dict or Float argument causes an error.
		Example: >
			:let bits = or(bits, 0x80)
<		Can also be used as a |method|: >
			:let bits = bits->or(0x80)


pathshorten({expr} [, {len}])				*pathshorten()*
		Shorten directory names in the path {expr} and return the
		result.  The tail, the file name, is kept as-is.  The other
		components in the path are reduced to {len} letters in length.
		If {len} is omitted or smaller than 1 then 1 is used (single
		letters).  Leading '~' and '.' characters are kept.  Examples: >
			:echo pathshorten('~/.vim/autoload/myfile.vim')
<			~/.v/a/myfile.vim ~
>
			:echo pathshorten('~/.vim/autoload/myfile.vim', 2)
<			~/.vi/au/myfile.vim ~
		It doesn't matter if the path exists or not.

		Can also be used as a |method|: >
			GetDirectories()->pathshorten()

perleval({expr})					*perleval()*
		Evaluate Perl expression {expr} in scalar context and return
		its result converted to Vim data structures. If value can't be
		converted, it is returned as a string Perl representation.
		Note: If you want an array or hash, {expr} must return a
		reference to it.
		Example: >
			:echo perleval('[1 .. 4]')
<			[1, 2, 3, 4]

		Can also be used as a |method|: >
			GetExpr()->perleval()

<		{only available when compiled with the |+perl| feature}


popup_ functions are documented here: |popup-functions|


pow({x}, {y})						*pow()*
		Return the power of {x} to the exponent {y} as a |Float|.
		{x} and {y} must evaluate to a |Float| or a |Number|.
		Examples: >
			:echo pow(3, 3)
<			27.0 >
			:echo pow(2, 16)
<			65536.0 >
			:echo pow(32, 0.20)
<			2.0

		Can also be used as a |method|: >
			Compute()->pow(3)
<
		{only available when compiled with the |+float| feature}

prevnonblank({lnum})					*prevnonblank()*
		Return the line number of the first line at or above {lnum}
		that is not blank.  Example: >
			let ind = indent(prevnonblank(v:lnum - 1))
<		When {lnum} is invalid or there is no non-blank line at or
		above it, zero is returned.
		Also see |nextnonblank()|.

		Can also be used as a |method|: >
			GetLnum()->prevnonblank()

printf({fmt}, {expr1} ...)				*printf()*
		Return a String with {fmt}, where "%" items are replaced by
		the formatted form of their respective arguments.  Example: >
			printf("%4d: E%d %.30s", lnum, errno, msg)
<		May result in:
			"  99: E42 asdfasdfasdfasdfasdfasdfasdfas" ~

		When used as a |method| the base is passed as the second
		argument: >
			Compute()->printf("result: %d")

<		Often used items are:
		  %s	string
		  %6S	string right-aligned in 6 display cells
		  %6s	string right-aligned in 6 bytes
		  %.9s	string truncated to 9 bytes
		  %c	single byte
		  %d	decimal number
		  %5d	decimal number padded with spaces to 5 characters
		  %x	hex number
		  %04x	hex number padded with zeros to at least 4 characters
		  %X	hex number using upper case letters
		  %o	octal number
		  %08b	binary number padded with zeros to at least 8 chars
		  %f	floating point number as 12.23, inf, -inf or nan
		  %F	floating point number as 12.23, INF, -INF or NAN
		  %e	floating point number as 1.23e3, inf, -inf or nan
		  %E	floating point number as 1.23E3, INF, -INF or NAN
		  %g	floating point number, as %f or %e depending on value
		  %G	floating point number, as %F or %E depending on value
		  %%	the % character itself

		Conversion specifications start with '%' and end with the
		conversion type.  All other characters are copied unchanged to
		the result.

		The "%" starts a conversion specification.  The following
		arguments appear in sequence:

			%  [flags]  [field-width]  [.precision]  type

		flags
			Zero or more of the following flags:

		    #	      The value should be converted to an "alternate
			      form".  For c, d, and s conversions, this option
			      has no effect.  For o conversions, the precision
			      of the number is increased to force the first
			      character of the output string to a zero (except
			      if a zero value is printed with an explicit
			      precision of zero).
			      For b and B conversions, a non-zero result has
			      the string "0b" (or "0B" for B conversions)
			      prepended to it.
			      For x and X conversions, a non-zero result has
			      the string "0x" (or "0X" for X conversions)
			      prepended to it.

		    0 (zero)  Zero padding.  For all conversions the converted
			      value is padded on the left with zeros rather
			      than blanks.  If a precision is given with a
			      numeric conversion (d, b, B, o, x, and X), the 0
			      flag is ignored.

		    -	      A negative field width flag; the converted value
			      is to be left adjusted on the field boundary.
			      The converted value is padded on the right with
			      blanks, rather than on the left with blanks or
			      zeros.  A - overrides a 0 if both are given.

		    ' ' (space)  A blank should be left before a positive
			      number produced by a signed conversion (d).

		    +	      A sign must always be placed before a number
			      produced by a signed conversion.  A + overrides
			      a space if both are used.

		field-width
			An optional decimal digit string specifying a minimum
			field width.  If the converted value has fewer bytes
			than the field width, it will be padded with spaces on
			the left (or right, if the left-adjustment flag has
			been given) to fill out the field width.

		.precision
			An optional precision, in the form of a period '.'
			followed by an optional digit string.  If the digit
			string is omitted, the precision is taken as zero.
			This gives the minimum number of digits to appear for
			d, o, x, and X conversions, or the maximum number of
			bytes to be printed from a string for s conversions.
			For floating point it is the number of digits after
			the decimal point.

		type
			A character that specifies the type of conversion to
			be applied, see below.

		A field width or precision, or both, may be indicated by an
		asterisk '*' instead of a digit string.  In this case, a
		Number argument supplies the field width or precision.  A
		negative field width is treated as a left adjustment flag
		followed by a positive field width; a negative precision is
		treated as though it were missing.  Example: >
			:echo printf("%d: %.*s", nr, width, line)
<		This limits the length of the text used from "line" to
		"width" bytes.

		The conversion specifiers and their meanings are:

				*printf-d* *printf-b* *printf-B* *printf-o*
				*printf-x* *printf-X*
		dbBoxX	The Number argument is converted to signed decimal
			(d), unsigned binary (b and B), unsigned octal (o), or
			unsigned hexadecimal (x and X) notation.  The letters
			"abcdef" are used for x conversions; the letters
			"ABCDEF" are used for X conversions.
			The precision, if any, gives the minimum number of
			digits that must appear; if the converted value
			requires fewer digits, it is padded on the left with
			zeros.
			In no case does a non-existent or small field width
			cause truncation of a numeric field; if the result of
			a conversion is wider than the field width, the field
			is expanded to contain the conversion result.
			The 'h' modifier indicates the argument is 16 bits.
			The 'l' modifier indicates the argument is 32 bits.
			The 'L' modifier indicates the argument is 64 bits.
			Generally, these modifiers are not useful. They are
			ignored when type is known from the argument.

		i	alias for d
		D	alias for ld
		U	alias for lu
		O	alias for lo

							*printf-c*
		c	The Number argument is converted to a byte, and the
			resulting character is written.

							*printf-s*
		s	The text of the String argument is used.  If a
			precision is specified, no more bytes than the number
			specified are used.
			If the argument is not a String type, it is
			automatically converted to text with the same format
			as ":echo".
							*printf-S*
		S	The text of the String argument is used.  If a
			precision is specified, no more display cells than the
			number specified are used.

							*printf-f* *E807*
		f F	The Float argument is converted into a string of the
			form 123.456.  The precision specifies the number of
			digits after the decimal point.  When the precision is
			zero the decimal point is omitted.  When the precision
			is not specified 6 is used.  A really big number
			(out of range or dividing by zero) results in "inf"
			or "-inf" with %f (INF or -INF with %F).
			"0.0 / 0.0" results in "nan" with %f (NAN with %F).
			Example: >
				echo printf("%.2f", 12.115)
<				12.12
			Note that roundoff depends on the system libraries.
			Use |round()| when in doubt.

							*printf-e* *printf-E*
		e E	The Float argument is converted into a string of the
			form 1.234e+03 or 1.234E+03 when using 'E'.  The
			precision specifies the number of digits after the
			decimal point, like with 'f'.

							*printf-g* *printf-G*
		g G	The Float argument is converted like with 'f' if the
			value is between 0.001 (inclusive) and 10000000.0
			(exclusive).  Otherwise 'e' is used for 'g' and 'E'
			for 'G'.  When no precision is specified superfluous
			zeroes and '+' signs are removed, except for the zero
			immediately after the decimal point.  Thus 10000000.0
			results in 1.0e7.

							*printf-%*
		%	A '%' is written.  No argument is converted.  The
			complete conversion specification is "%%".

		When a Number argument is expected a String argument is also
		accepted and automatically converted.
		When a Float or String argument is expected a Number argument
		is also accepted and automatically converted.
		Any other argument type results in an error message.

							*E766* *E767*
		The number of {exprN} arguments must exactly match the number
		of "%" items.  If there are not sufficient or too many
		arguments an error is given.  Up to 18 arguments can be used.


prompt_getprompt({buf})					*prompt_getprompt()*
		Returns the effective prompt text for buffer {buf}.  {buf} can
		be a buffer name or number.  See |prompt-buffer|.

		If the buffer doesn't exist or isn't a prompt buffer, an empty
		string is returned.

		Can also be used as a |method|: >
			GetBuffer()->prompt_getprompt()


prompt_setcallback({buf}, {expr})			*prompt_setcallback()*
		Set prompt callback for buffer {buf} to {expr}.  When {expr}
		is an empty string the callback is removed.  This has only
		effect if {buf} has 'buftype' set to "prompt".

		The callback is invoked when pressing Enter.  The current
		buffer will always be the prompt buffer.  A new line for a
		prompt is added before invoking the callback, thus the prompt
		for which the callback was invoked will be in the last but one
		line.
		If the callback wants to add text to the buffer, it must
		insert it above the last line, since that is where the current
		prompt is.  This can also be done asynchronously.
		The callback is invoked with one argument, which is the text
		that was entered at the prompt.  This can be an empty string
		if the user only typed Enter.
		Example: >
		   call prompt_setcallback(bufnr(), function('s:TextEntered'))
		   func s:TextEntered(text)
		     if a:text == 'exit' || a:text == 'quit'
		       stopinsert
		       close
		     else
		       call append(line('$') - 1, 'Entered: "' . a:text . '"')
		       " Reset 'modified' to allow the buffer to be closed.
		       set nomodified
		     endif
		   endfunc

<		Can also be used as a |method|: >
			GetBuffer()->prompt_setcallback(callback)


prompt_setinterrupt({buf}, {expr})			*prompt_setinterrupt()*
		Set a callback for buffer {buf} to {expr}.  When {expr} is an
		empty string the callback is removed.  This has only effect if
		{buf} has 'buftype' set to "prompt".

		This callback will be invoked when pressing CTRL-C in Insert
		mode.  Without setting a callback Vim will exit Insert mode,
		as in any buffer.

		Can also be used as a |method|: >
			GetBuffer()->prompt_setinterrupt(callback)

prompt_setprompt({buf}, {text})				*prompt_setprompt()*
		Set prompt for buffer {buf} to {text}.  You most likely want
		{text} to end in a space.
		The result is only visible if {buf} has 'buftype' set to
		"prompt".  Example: >
			call prompt_setprompt(bufnr(), 'command: ')
<
		Can also be used as a |method|: >
			GetBuffer()->prompt_setprompt('command: ')

prop_ functions are documented here: |text-prop-functions|

pum_getpos()						*pum_getpos()*
		If the popup menu (see |ins-completion-menu|) is not visible,
		returns an empty |Dictionary|, otherwise, returns a
		|Dictionary| with the following keys:
			height		nr of items visible
			width		screen cells
			row		top screen row (0 first row)
			col		leftmost screen column (0 first col)
			size		total nr of items
			scrollbar	|TRUE| if scrollbar is visible

		The values are the same as in |v:event| during
		|CompleteChanged|.

pumvisible()						*pumvisible()*
		Returns non-zero when the popup menu is visible, zero
		otherwise.  See |ins-completion-menu|.
		This can be used to avoid some things that would remove the
		popup menu.

py3eval({expr})						*py3eval()*
		Evaluate Python expression {expr} and return its result
		converted to Vim data structures.
		Numbers and strings are returned as they are (strings are
		copied though, Unicode strings are additionally converted to
		'encoding').
		Lists are represented as Vim |List| type.
		Dictionaries are represented as Vim |Dictionary| type with
		keys converted to strings.

		Can also be used as a |method|: >
			GetExpr()->py3eval()

<		{only available when compiled with the |+python3| feature}

							*E858* *E859*
pyeval({expr})						*pyeval()*
		Evaluate Python expression {expr} and return its result
		converted to Vim data structures.
		Numbers and strings are returned as they are (strings are
		copied though).
		Lists are represented as Vim |List| type.
		Dictionaries are represented as Vim |Dictionary| type,
		non-string keys result in error.

		Can also be used as a |method|: >
			GetExpr()->pyeval()

<		{only available when compiled with the |+python| feature}

pyxeval({expr})						*pyxeval()*
		Evaluate Python expression {expr} and return its result
		converted to Vim data structures.
		Uses Python 2 or 3, see |python_x| and 'pyxversion'.
		See also: |pyeval()|, |py3eval()|

		Can also be used as a |method|: >
			GetExpr()->pyxeval()

<		{only available when compiled with the |+python| or the
		|+python3| feature}

							*E726* *E727*
range({expr} [, {max} [, {stride}]])				*range()*
		Returns a |List| with Numbers:
		- If only {expr} is specified: [0, 1, ..., {expr} - 1]
		- If {max} is specified: [{expr}, {expr} + 1, ..., {max}]
		- If {stride} is specified: [{expr}, {expr} + {stride}, ...,
		  {max}] (increasing {expr} with {stride} each time, not
		  producing a value past {max}).
		When the maximum is one before the start the result is an
		empty list.  When the maximum is more than one before the
		start this is an error.
		Examples: >
			range(4)		" [0, 1, 2, 3]
			range(2, 4)		" [2, 3, 4]
			range(2, 9, 3)		" [2, 5, 8]
			range(2, -2, -1)	" [2, 1, 0, -1, -2]
			range(0)		" []
			range(2, 0)		" error!
<
		Can also be used as a |method|: >
			GetExpr()->range()
<

rand([{expr}])						*rand()* *random*
		Return a pseudo-random Number generated with an xoshiro128**
		algorithm using seed {expr}.  The returned number is 32 bits,
		also on 64 bits systems, for consistency.
		{expr} can be initialized by |srand()| and will be updated by
		rand().  If {expr} is omitted, an internal seed value is used
		and updated.

		Examples: >
			:echo rand()
			:let seed = srand()
			:echo rand(seed)
			:echo rand(seed) % 16  " random number 0 - 15
<

readblob({fname})					*readblob()*
		Read file {fname} in binary mode and return a |Blob|.
		When the file can't be opened an error message is given and
		the result is an empty |Blob|.
		Also see |readfile()| and |writefile()|.


readdir({directory} [, {expr} [, {dict}]])			*readdir()*
		Return a list with file and directory names in {directory}.
		You can also use |glob()| if you don't need to do complicated
		things, such as limiting the number of matches.
		The list will be sorted (case sensitive), see the {dict}
		argument below for changing the sort order.

		When {expr} is omitted all entries are included.
		When {expr} is given, it is evaluated to check what to do:
			If {expr} results in -1 then no further entries will
			be handled.
			If {expr} results in 0 then this entry will not be
			added to the list.
			If {expr} results in 1 then this entry will be added
			to the list.
		The entries "." and ".." are always excluded.
		Each time {expr} is evaluated |v:val| is set to the entry name.
		When {expr} is a function the name is passed as the argument.
		For example, to get a list of files ending in ".txt": >
		  readdir(dirname, {n -> n =~ '.txt$'})
<		To skip hidden and backup files: >
		  readdir(dirname, {n -> n !~ '^\.\|\~$'})

<		The optional {dict} argument allows for further custom
		values. Currently this is used to specify if and how sorting
		should be performed. The dict can have the following members:

		    sort    How to sort the result returned from the system.
			    Valid values are:
				"none"	    do not sort (fastest method)
				"case"	    sort case sensitive (byte value of
					    each character, technically, using
					    strcmp()) (default)
				"icase"	    sort case insensitive (technically
					    using strcasecmp())
				"collate"   sort using the collation order
					    of the "POSIX" or "C" |locale|
					    (technically using strcoll())
			    Other values are silently ignored.

		For example, to get a list of all files in the current
		directory without sorting the individual entries: >
		  readdir('.', '1', #{sort: 'none'})
<		If you want to get a directory tree: >
		  function! s:tree(dir)
		      return {a:dir : map(readdir(a:dir),
		      \ {_, x -> isdirectory(x) ?
		      \		 {x : s:tree(a:dir . '/' . x)} : x})}
		  endfunction
		  echo s:tree(".")
<
		Can also be used as a |method|: >
			GetDirName()->readdir()
<
readdirex({directory} [, {expr} [, {dict}]])			*readdirex()*
		Extended version of |readdir()|.
		Return a list of Dictionaries with file and directory
		information in {directory}.
		This is useful if you want to get the attributes of file and
		directory at the same time as getting a list of a directory.
		This is much faster than calling |readdir()| then calling
		|getfperm()|, |getfsize()|, |getftime()| and |getftype()| for
		each file and directory especially on MS-Windows.
		The list will by default be sorted by name (case sensitive),
		the sorting can be changed by using the optional {dict}
		argument, see |readdir()|.

		The Dictionary for file and directory information has the
		following items:
			group	Group name of the entry. (Only on Unix)
			name	Name of the entry.
			perm	Permissions of the entry. See |getfperm()|.
			size	Size of the entry. See |getfsize()|.
			time	Timestamp of the entry. See |getftime()|.
			type	Type of the entry.
				On Unix, almost same as |getftype()| except:
				    Symlink to a dir	"linkd"
				    Other symlink	"link"
				On MS-Windows:
				    Normal file		"file"
				    Directory		"dir"
				    Junction		"junction"
				    Symlink to a dir	"linkd"
				    Other symlink	"link"
				    Other reparse point	"reparse"
			user	User name of the entry's owner. (Only on Unix)
		On Unix, if the entry is a symlink, the Dictionary includes
		the information of the target (except the "type" item).
		On MS-Windows, it includes the information of the symlink
		itself because of performance reasons.

		When {expr} is omitted all entries are included.
		When {expr} is given, it is evaluated to check what to do:
			If {expr} results in -1 then no further entries will
			be handled.
			If {expr} results in 0 then this entry will not be
			added to the list.
			If {expr} results in 1 then this entry will be added
			to the list.
		The entries "." and ".." are always excluded.
		Each time {expr} is evaluated |v:val| is set to a |Dictionary|
		of the entry.
		When {expr} is a function the entry is passed as the argument.
		For example, to get a list of files ending in ".txt": >
		  readdirex(dirname, {e -> e.name =~ '.txt$'})
<
		For example, to get a list of all files in the current
		directory without sorting the individual entries: >
		  readdirex(dirname, '1', #{sort: 'none'})

<
		Can also be used as a |method|: >
			GetDirName()->readdirex()
<

							*readfile()*
readfile({fname} [, {type} [, {max}]])
		Read file {fname} and return a |List|, each line of the file
		as an item.  Lines are broken at NL characters.  Macintosh
		files separated with CR will result in a single long line
		(unless a NL appears somewhere).
		All NUL characters are replaced with a NL character.
		When {type} contains "b" binary mode is used:
		- When the last line ends in a NL an extra empty list item is
		  added.
		- No CR characters are removed.
		Otherwise:
		- CR characters that appear before a NL are removed.
		- Whether the last line ends in a NL or not does not matter.
		- When 'encoding' is Unicode any UTF-8 byte order mark is
		  removed from the text.
		When {max} is given this specifies the maximum number of lines
		to be read.  Useful if you only want to check the first ten
		lines of a file: >
			:for line in readfile(fname, '', 10)
			:  if line =~ 'Date' | echo line | endif
			:endfor
<		When {max} is negative -{max} lines from the end of the file
		are returned, or as many as there are.
		When {max} is zero the result is an empty list.
		Note that without {max} the whole file is read into memory.
		Also note that there is no recognition of encoding.  Read a
		file into a buffer if you need to.
		Deprecated (use |readblob()| instead): When {type} contains
		"B" a |Blob| is returned with the binary data of the file
		unmodified.
		When the file can't be opened an error message is given and
		the result is an empty list.
		Also see |writefile()|.

		Can also be used as a |method|: >
			GetFileName()->readfile()

reduce({object}, {func} [, {initial}])			*reduce()* *E998*
		{func} is called for every item in {object}, which can be a
		|List| or a |Blob|.  {func} is called with two arguments: the
		result so far and current item.  After processing all items
		the result is returned.

		{initial} is the initial result.  When omitted, the first item
		in {object} is used and {func} is first called for the second
		item.  If {initial} is not given and {object} is empty no
		result can be computed, an E998 error is given.

		Examples: >
			echo reduce([1, 3, 5], { acc, val -> acc + val })
			echo reduce(['x', 'y'], { acc, val -> acc .. val }, 'a')
			echo reduce(0z1122, { acc, val -> 2 * acc + val })
<
		Can also be used as a |method|: >
			echo mylist->reduce({ acc, val -> acc + val }, 0)


reg_executing()						*reg_executing()*
		Returns the single letter name of the register being executed.
		Returns an empty string when no register is being executed.
		See |@|.

reg_recording()						*reg_recording()*
		Returns the single letter name of the register being recorded.
		Returns an empty string when not recording.  See |q|.

reltime([{start} [, {end}]])				*reltime()*
		Return an item that represents a time value.  The item is a
		list with items that depend on the system.  In Vim 9 script
		list<any> can be used.
		The item can be passed to |reltimestr()| to convert it to a
		string or |reltimefloat()| to convert to a Float.

		Without an argument reltime() returns the current time.
		With one argument is returns the time passed since the time
		specified in the argument.
		With two arguments it returns the time passed between {start}
		and {end}.

		The {start} and {end} arguments must be values returned by
		reltime().

		Can also be used as a |method|: >
			GetStart()->reltime()
<
		{only available when compiled with the |+reltime| feature}

reltimefloat({time})				*reltimefloat()*
		Return a Float that represents the time value of {time}.
		Example: >
			let start = reltime()
			call MyFunction()
			let seconds = reltimefloat(reltime(start))
<		See the note of reltimestr() about overhead.
		Also see |profiling|.

		Can also be used as a |method|: >
			reltime(start)->reltimefloat()

<		{only available when compiled with the |+reltime| feature}

reltimestr({time})				*reltimestr()*
		Return a String that represents the time value of {time}.
		This is the number of seconds, a dot and the number of
		microseconds.  Example: >
			let start = reltime()
			call MyFunction()
			echo reltimestr(reltime(start))
<		Note that overhead for the commands will be added to the time.
		The accuracy depends on the system.
		Leading spaces are used to make the string align nicely.  You
		can use split() to remove it. >
			echo split(reltimestr(reltime(start)))[0]
<		Also see |profiling|.

		Can also be used as a |method|: >
			reltime(start)->reltimestr()

<		{only available when compiled with the |+reltime| feature}

							*remote_expr()* *E449*
remote_expr({server}, {string} [, {idvar} [, {timeout}]])
		Send the {string} to {server}.  The string is sent as an
		expression and the result is returned after evaluation.
		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
		between (not at the end), like with join(expr, "\n").
		If {idvar} is present and not empty, it is taken as the name
		of a variable and a {serverid} for later use with
		|remote_read()| is stored there.
		If {timeout} is given the read times out after this many
		seconds.  Otherwise a timeout of 600 seconds is used.
		See also |clientserver| |RemoteReply|.
		This function is not available in the |sandbox|.
		{only available when compiled with the |+clientserver| feature}
		Note: Any errors will cause a local error message to be issued
		and the result will be the empty string.

		Variables will be evaluated in the global namespace,
		independent of a function currently being active.  Except
		when in debug mode, then local function variables and
		arguments can be evaluated.

		Examples: >
			:echo remote_expr("gvim", "2+2")
			:echo remote_expr("gvim1", "b:current_syntax")
<
		Can also be used as a |method|: >
			ServerName()->remote_expr(expr)

remote_foreground({server})				*remote_foreground()*
		Move the Vim server with the name {server} to the foreground.
		This works like: >
			remote_expr({server}, "foreground()")
<		Except that on Win32 systems the client does the work, to work
		around the problem that the OS doesn't always allow the server
		to bring itself to the foreground.
		Note: This does not restore the window if it was minimized,
		like foreground() does.
		This function is not available in the |sandbox|.

		Can also be used as a |method|: >
			ServerName()->remote_foreground()

<		{only in the Win32, Athena, Motif and GTK GUI versions and the
		Win32 console version}


remote_peek({serverid} [, {retvar}])		*remote_peek()*
		Returns a positive number if there are available strings
		from {serverid}.  Copies any reply string into the variable
		{retvar} if specified.  {retvar} must be a string with the
		name of a variable.
		Returns zero if none are available.
		Returns -1 if something is wrong.
		See also |clientserver|.
		This function is not available in the |sandbox|.
		{only available when compiled with the |+clientserver| feature}
		Examples: >
			:let repl = ""
			:echo "PEEK: ".remote_peek(id, "repl").": ".repl

<		Can also be used as a |method|: >
			ServerId()->remote_peek()

remote_read({serverid}, [{timeout}])			*remote_read()*
		Return the oldest available reply from {serverid} and consume
		it.  Unless a {timeout} in seconds is given, it blocks until a
		reply is available.
		See also |clientserver|.
		This function is not available in the |sandbox|.
		{only available when compiled with the |+clientserver| feature}
		Example: >
			:echo remote_read(id)

<		Can also be used as a |method|: >
			ServerId()->remote_read()
<
							*remote_send()* *E241*
remote_send({server}, {string} [, {idvar}])
		Send the {string} to {server}.  The string is sent as input
		keys and the function returns immediately.  At the Vim server
		the keys are not mapped |:map|.
		If {idvar} is present, it is taken as the name of a variable
		and a {serverid} for later use with remote_read() is stored
		there.
		See also |clientserver| |RemoteReply|.
		This function is not available in the |sandbox|.
		{only available when compiled with the |+clientserver| feature}

		Note: Any errors will be reported in the server and may mess
		up the display.
		Examples: >
		:echo remote_send("gvim", ":DropAndReply ".file, "serverid").
		 \ remote_read(serverid)

		:autocmd NONE RemoteReply *
		 \ echo remote_read(expand("<amatch>"))
		:echo remote_send("gvim", ":sleep 10 | echo ".
		 \ 'server2client(expand("<client>"), "HELLO")<CR>')
<
		Can also be used as a |method|: >
			ServerName()->remote_send(keys)
<
					*remote_startserver()* *E941* *E942*
remote_startserver({name})
		Become the server {name}.  This fails if already running as a
		server, when |v:servername| is not empty.

		Can also be used as a |method|: >
			ServerName()->remote_startserver()

<		{only available when compiled with the |+clientserver| feature}

remove({list}, {idx} [, {end}])				*remove()*
		Without {end}: Remove the item at {idx} from |List| {list} and
		return the item.
		With {end}: Remove items from {idx} to {end} (inclusive) and
		return a |List| with these items.  When {idx} points to the same
		item as {end} a list with one item is returned.  When {end}
		points to an item before {idx} this is an error.
		See |list-index| for possible values of {idx} and {end}.
		Example: >
			:echo "last item: " . remove(mylist, -1)
			:call remove(mylist, 0, 9)
<
		Use |delete()| to remove a file.

		Can also be used as a |method|: >
			mylist->remove(idx)

remove({blob}, {idx} [, {end}])
		Without {end}: Remove the byte at {idx} from |Blob| {blob} and
		return the byte.
		With {end}: Remove bytes from {idx} to {end} (inclusive) and
		return a |Blob| with these bytes.  When {idx} points to the same
		byte as {end} a |Blob| with one byte is returned.  When {end}
		points to a byte before {idx} this is an error.
		Example: >
			:echo "last byte: " . remove(myblob, -1)
			:call remove(mylist, 0, 9)

remove({dict}, {key})
		Remove the entry from {dict} with key {key} and return it.
		Example: >
			:echo "removed " . remove(dict, "one")
<		If there is no {key} in {dict} this is an error.

rename({from}, {to})					*rename()*
		Rename the file by the name {from} to the name {to}.  This
		should also work to move files across file systems.  The
		result is a Number, which is 0 if the file was renamed
		successfully, and non-zero when the renaming failed.
		NOTE: If {to} exists it is overwritten without warning.
		This function is not available in the |sandbox|.

		Can also be used as a |method|: >
			GetOldName()->rename(newname)

repeat({expr}, {count})					*repeat()*
		Repeat {expr} {count} times and return the concatenated
		result.  Example: >
			:let separator = repeat('-', 80)
<		When {count} is zero or negative the result is empty.
		When {expr} is a |List| the result is {expr} concatenated
		{count} times.  Example: >
			:let longlist = repeat(['a', 'b'], 3)
<		Results in ['a', 'b', 'a', 'b', 'a', 'b'].

		Can also be used as a |method|: >
			mylist->repeat(count)

resolve({filename})					*resolve()* *E655*
		On MS-Windows, when {filename} is a shortcut (a .lnk file),
		returns the path the shortcut points to in a simplified form.
		When {filename} is a symbolic link or junction point, return
		the full path to the target. If the target of junction is
		removed, return {filename}.
		On Unix, repeat resolving symbolic links in all path
		components of {filename} and return the simplified result.
		To cope with link cycles, resolving of symbolic links is
		stopped after 100 iterations.
		On other systems, return the simplified {filename}.
		The simplification step is done as by |simplify()|.
		resolve() keeps a leading path component specifying the
		current directory (provided the result is still a relative
		path name) and also keeps a trailing path separator.

		Can also be used as a |method|: >
			GetName()->resolve()

reverse({object})					*reverse()*
		Reverse the order of items in {object} in-place.
		{object} can be a |List| or a |Blob|.
		Returns {object}.
		If you want an object to remain unmodified make a copy first: >
			:let revlist = reverse(copy(mylist))
<		Can also be used as a |method|: >
			mylist->reverse()

round({expr})							*round()*
		Round off {expr} to the nearest integral value and return it
		as a |Float|.  If {expr} lies halfway between two integral
		values, then use the larger one (away from zero).
		{expr} must evaluate to a |Float| or a |Number|.
		Examples: >
			echo round(0.456)
<			0.0  >
			echo round(4.5)
<			5.0 >
			echo round(-4.5)
<			-5.0

		Can also be used as a |method|: >
			Compute()->round()
<
		{only available when compiled with the |+float| feature}

rubyeval({expr})					*rubyeval()*
		Evaluate Ruby expression {expr} and return its result
		converted to Vim data structures.
		Numbers, floats and strings are returned as they are (strings
		are copied though).
		Arrays are represented as Vim |List| type.
		Hashes are represented as Vim |Dictionary| type.
		Other objects are represented as strings resulted from their
		"Object#to_s" method.

		Can also be used as a |method|: >
			GetRubyExpr()->rubyeval()

<		{only available when compiled with the |+ruby| feature}

screenattr({row}, {col})					*screenattr()*
		Like |screenchar()|, but return the attribute.  This is a rather
		arbitrary number that can only be used to compare to the
		attribute at other positions.

		Can also be used as a |method|: >
			GetRow()->screenattr(col)

screenchar({row}, {col})					*screenchar()*
		The result is a Number, which is the character at position
		[row, col] on the screen.  This works for every possible
		screen position, also status lines, window separators and the
		command line.  The top left position is row one, column one
		The character excludes composing characters.  For double-byte
		encodings it may only be the first byte.
		This is mainly to be used for testing.
		Returns -1 when row or col is out of range.

		Can also be used as a |method|: >
			GetRow()->screenchar(col)

screenchars({row}, {col})					*screenchars()*
		The result is a |List| of Numbers.  The first number is the same
		as what |screenchar()| returns.  Further numbers are
		composing characters on top of the base character.
		This is mainly to be used for testing.
		Returns an empty List when row or col is out of range.

		Can also be used as a |method|: >
			GetRow()->screenchars(col)

screencol()							*screencol()*
		The result is a Number, which is the current screen column of
		the cursor. The leftmost column has number 1.
		This function is mainly used for testing.

		Note: Always returns the current screen column, thus if used
		in a command (e.g. ":echo screencol()") it will return the
		column inside the command line, which is 1 when the command is
		executed. To get the cursor position in the file use one of
		the following mappings: >
			nnoremap <expr> GG ":echom ".screencol()."\n"
			nnoremap <silent> GG :echom screencol()<CR>
			nnoremap GG <Cmd>echom screencol()<CR>
<
screenpos({winid}, {lnum}, {col})				*screenpos()*
		The result is a Dict with the screen position of the text
		character in window {winid} at buffer line {lnum} and column
		{col}.  {col} is a one-based byte index.
		The Dict has these members:
			row	screen row
			col	first screen column
			endcol	last screen column
			curscol	cursor screen column
		If the specified position is not visible, all values are zero.
		The "endcol" value differs from "col" when the character
		occupies more than one screen cell.  E.g. for a Tab "col" can
		be 1 and "endcol" can be 8.
		The "curscol" value is where the cursor would be placed.  For
		a Tab it would be the same as "endcol", while for a double
		width character it would be the same as "col".

		Can also be used as a |method|: >
			GetWinid()->screenpos(lnum, col)

screenrow()							*screenrow()*
		The result is a Number, which is the current screen row of the
		cursor.  The top line has number one.
		This function is mainly used for testing.
		Alternatively you can use |winline()|.

		Note: Same restrictions as with |screencol()|.

screenstring({row}, {col})					*screenstring()*
		The result is a String that contains the base character and
		any composing characters at position [row, col] on the screen.
		This is like |screenchars()| but returning a String with the
		characters.
		This is mainly to be used for testing.
		Returns an empty String when row or col is out of range.

		Can also be used as a |method|: >
			GetRow()->screenstring(col)
<
								*search()*
search({pattern} [, {flags} [, {stopline} [, {timeout} [, {skip}]]]])
		Search for regexp pattern {pattern}.  The search starts at the
		cursor position (you can use |cursor()| to set it).

		When a match has been found its line number is returned.
		If there is no match a 0 is returned and the cursor doesn't
		move.  No error message is given.

		{flags} is a String, which can contain these character flags:
		'b'	search Backward instead of forward
		'c'	accept a match at the Cursor position
		'e'	move to the End of the match
		'n'	do Not move the cursor
		'p'	return number of matching sub-Pattern (see below)
		's'	Set the ' mark at the previous location of the cursor
		'w'	Wrap around the end of the file
		'W'	don't Wrap around the end of the file
		'z'	start searching at the cursor column instead of zero
		If neither 'w' or 'W' is given, the 'wrapscan' option applies.

		If the 's' flag is supplied, the ' mark is set, only if the
		cursor is moved. The 's' flag cannot be combined with the 'n'
		flag.

		'ignorecase', 'smartcase' and 'magic' are used.

		When the 'z' flag is not given, forward searching always
		starts in column zero and then matches before the cursor are
		skipped.  When the 'c' flag is present in 'cpo' the next
		search starts after the match.  Without the 'c' flag the next
		search starts one column further.  This matters for
		overlapping matches.
		When searching backwards and the 'z' flag is given then the
		search starts in column zero, thus no match in the current
		line will be found (unless wrapping around the end of the
		file).

		When the {stopline} argument is given then the search stops
		after searching this line.  This is useful to restrict the
		search to a range of lines.  Examples: >
			let match = search('(', 'b', line("w0"))
			let end = search('END', '', line("w$"))
<		When {stopline} is used and it is not zero this also implies
		that the search does not wrap around the end of the file.
		A zero value is equal to not giving the argument.

		When the {timeout} argument is given the search stops when
		more than this many milliseconds have passed.  Thus when
		{timeout} is 500 the search stops after half a second.
		The value must not be negative.  A zero value is like not
		giving the argument.
		{only available when compiled with the |+reltime| feature}

		If the {skip} expression is given it is evaluated with the
		cursor positioned on the start of a match.  If it evaluates to
		non-zero this match is skipped.  This can be used, for
		example, to skip a match in a comment or a string.
		{skip} can be a string, which is evaluated as an expression, a
		function reference or a lambda.
		When {skip} is omitted or empty, every match is accepted.
		When evaluating {skip} causes an error the search is aborted
		and -1 returned.
							*search()-sub-match*
		With the 'p' flag the returned value is one more than the
		first sub-match in \(\).  One if none of them matched but the
		whole pattern did match.
		To get the column number too use |searchpos()|.

		The cursor will be positioned at the match, unless the 'n'
		flag is used.

		Example (goes over all files in the argument list): >
		    :let n = 1
		    :while n <= argc()	    " loop over all files in arglist
		    :  exe "argument " . n
		    :  " start at the last char in the file and wrap for the
		    :  " first search to find match at start of file
		    :  normal G$
		    :  let flags = "w"
		    :  while search("foo", flags) > 0
		    :	 s/foo/bar/g
		    :	 let flags = "W"
		    :  endwhile
		    :  update		    " write the file if modified
		    :  let n = n + 1
		    :endwhile
<
		Example for using some flags: >
		    :echo search('\<if\|\(else\)\|\(endif\)', 'ncpe')
<		This will search for the keywords "if", "else", and "endif"
		under or after the cursor.  Because of the 'p' flag, it
		returns 1, 2, or 3 depending on which keyword is found, or 0
		if the search fails.  With the cursor on the first word of the
		line:
		    if (foo == 0) | let foo = foo + 1 | endif ~
		the function returns 1.  Without the 'c' flag, the function
		finds the "endif" and returns 3.  The same thing happens
		without the 'e' flag if the cursor is on the "f" of "if".
		The 'n' flag tells the function not to move the cursor.

		Can also be used as a |method|: >
			GetPattern()->search()

searchcount([{options}])					*searchcount()*
		Get or update the last search count, like what is displayed
		without the "S" flag in 'shortmess'.  This works even if
		'shortmess' does contain the "S" flag.

		This returns a |Dictionary|. The dictionary is empty if the
		previous pattern was not set and "pattern" was not specified.

		  key		type		meaning ~
		  current	|Number|	current position of match;
						0 if the cursor position is
						before the first match
		  exact_match	|Boolean|	1 if "current" is matched on
						"pos", otherwise 0
		  total		|Number|	total count of matches found
		  incomplete	|Number|	0: search was fully completed
						1: recomputing was timed out
						2: max count exceeded

		For {options} see further down.

		To get the last search count when |n| or |N| was pressed, call
		this function with `recompute: 0` . This sometimes returns
		wrong information because |n| and |N|'s maximum count is 99.
		If it exceeded 99 the result must be max count + 1 (100). If
		you want to get correct information, specify `recompute: 1`: >

			" result == maxcount + 1 (100) when many matches
			let result = searchcount(#{recompute: 0})

			" Below returns correct result (recompute defaults
			" to 1)
			let result = searchcount()
<
		The function is useful to add the count to |statusline|: >
			function! LastSearchCount() abort
			  let result = searchcount(#{recompute: 0})
			  if empty(result)
			    return ''
			  endif
			  if result.incomplete ==# 1     " timed out
			    return printf(' /%s [?/??]', @/)
			  elseif result.incomplete ==# 2 " max count exceeded
			    if result.total > result.maxcount &&
			    \  result.current > result.maxcount
			      return printf(' /%s [>%d/>%d]', @/,
			      \		    result.current, result.total)
			    elseif result.total > result.maxcount
			      return printf(' /%s [%d/>%d]', @/,
			      \		    result.current, result.total)
			    endif
			  endif
			  return printf(' /%s [%d/%d]', @/,
			  \		result.current, result.total)
			endfunction
			let &statusline .= '%{LastSearchCount()}'

			" Or if you want to show the count only when
			" 'hlsearch' was on
			" let &statusline .=
			" \   '%{v:hlsearch ? LastSearchCount() : ""}'
<
		You can also update the search count, which can be useful in a
		|CursorMoved| or |CursorMovedI| autocommand: >

			autocmd CursorMoved,CursorMovedI *
			  \ let s:searchcount_timer = timer_start(
			  \   200, function('s:update_searchcount'))
			function! s:update_searchcount(timer) abort
			  if a:timer ==# s:searchcount_timer
			    call searchcount(#{
			    \ recompute: 1, maxcount: 0, timeout: 100})
			    redrawstatus
			  endif
			endfunction
<
		This can also be used to count matched texts with specified
		pattern in the current buffer using "pattern":  >

			" Count '\<foo\>' in this buffer
			" (Note that it also updates search count)
			let result = searchcount(#{pattern: '\<foo\>'})

			" To restore old search count by old pattern,
			" search again
			call searchcount()
<
		{options} must be a |Dictionary|. It can contain:
		  key		type		meaning ~
		  recompute	|Boolean|	if |TRUE|, recompute the count
						like |n| or |N| was executed.
						otherwise returns the last
						computed result (when |n| or
						|N| was used when "S" is not
						in 'shortmess', or this
						function was called).
						(default: |TRUE|)
		  pattern	|String|	recompute if this was given
						and different with |@/|.
						this works as same as the
						below command is executed
						before calling this function >
						  let @/ = pattern
<						(default: |@/|)
		  timeout	|Number|	0 or negative number is no
						timeout. timeout milliseconds
						for recomputing the result
						(default: 0)
		  maxcount	|Number|	0 or negative number is no
						limit. max count of matched
						text while recomputing the
						result.  if search exceeded
						total count, "total" value
						becomes `maxcount + 1`
						(default: 99)
		  pos		|List|		`[lnum, col, off]` value
						when recomputing the result.
						this changes "current" result
						value. see |cursor()|,
						|getpos()|
						(default: cursor's position)


searchdecl({name} [, {global} [, {thisblock}]])			*searchdecl()*
		Search for the declaration of {name}.

		With a non-zero {global} argument it works like |gD|, find
		first match in the file.  Otherwise it works like |gd|, find
		first match in the function.

		With a non-zero {thisblock} argument matches in a {} block
		that ends before the cursor position are ignored.  Avoids
		finding variable declarations only valid in another scope.

		Moves the cursor to the found match.
		Returns zero for success, non-zero for failure.
		Example: >
			if searchdecl('myvar') == 0
			   echo getline('.')
			endif
<
		Can also be used as a |method|: >
			GetName()->searchdecl()
<
							*searchpair()*
searchpair({start}, {middle}, {end} [, {flags} [, {skip}
				[, {stopline} [, {timeout}]]]])
		Search for the match of a nested start-end pair.  This can be
		used to find the "endif" that matches an "if", while other
		if/endif pairs in between are ignored.
		The search starts at the cursor.  The default is to search
		forward, include 'b' in {flags} to search backward.
		If a match is found, the cursor is positioned at it and the
		line number is returned.  If no match is found 0 or -1 is
		returned and the cursor doesn't move.  No error message is
		given.

		{start}, {middle} and {end} are patterns, see |pattern|.  They
		must not contain \( \) pairs.  Use of \%( \) is allowed.  When
		{middle} is not empty, it is found when searching from either
		direction, but only when not in a nested start-end pair.  A
		typical use is: >
			searchpair('\<if\>', '\<else\>', '\<endif\>')
<		By leaving {middle} empty the "else" is skipped.

		{flags} 'b', 'c', 'n', 's', 'w' and 'W' are used like with
		|search()|.  Additionally:
		'r'	Repeat until no more matches found; will find the
			outer pair.  Implies the 'W' flag.
		'm'	Return number of matches instead of line number with
			the match; will be > 1 when 'r' is used.
		Note: it's nearly always a good idea to use the 'W' flag, to
		avoid wrapping around the end of the file.

		When a match for {start}, {middle} or {end} is found, the
		{skip} expression is evaluated with the cursor positioned on
		the start of the match.  It should return non-zero if this
		match is to be skipped.  E.g., because it is inside a comment
		or a string.
		When {skip} is omitted or empty, every match is accepted.
		When evaluating {skip} causes an error the search is aborted
		and -1 returned.
		{skip} can be a string, a lambda, a funcref or a partial.
		Anything else makes the function fail.

		For {stopline} and {timeout} see |search()|.

		The value of 'ignorecase' is used.  'magic' is ignored, the
		patterns are used like it's on.

		The search starts exactly at the cursor.  A match with
		{start}, {middle} or {end} at the next character, in the
		direction of searching, is the first one found.  Example: >
			if 1
			  if 2
			  endif 2
			endif 1
<		When starting at the "if 2", with the cursor on the "i", and
		searching forwards, the "endif 2" is found.  When starting on
		the character just before the "if 2", the "endif 1" will be
		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
		"endif 2".
		When searching backwards and {end} is more than one character,
		it may be useful to put "\zs" at the end of the pattern, so
		that when the cursor is inside a match with the end it finds
		the matching start.

		Example, to find the "endif" command in a Vim script: >

	:echo searchpair('\<if\>', '\<el\%[seif]\>', '\<en\%[dif]\>', 'W',
			\ 'getline(".") =~ "^\\s*\""')

<		The cursor must be at or after the "if" for which a match is
		to be found.  Note that single-quote strings are used to avoid
		having to double the backslashes.  The skip expression only
		catches comments at the start of a line, not after a command.
		Also, a word "en" or "if" halfway a line is considered a
		match.
		Another example, to search for the matching "{" of a "}": >

	:echo searchpair('{', '', '}', 'bW')

<		This works when the cursor is at or before the "}" for which a
		match is to be found.  To reject matches that syntax
		highlighting recognized as strings: >

	:echo searchpair('{', '', '}', 'bW',
	     \ 'synIDattr(synID(line("."), col("."), 0), "name") =~? "string"')
<
							*searchpairpos()*
searchpairpos({start}, {middle}, {end} [, {flags} [, {skip}
				[, {stopline} [, {timeout}]]]])
		Same as |searchpair()|, but returns a |List| with the line and
		column position of the match. The first element of the |List|
		is the line number and the second element is the byte index of
		the column position of the match.  If no match is found,
		returns [0, 0]. >

			:let [lnum,col] = searchpairpos('{', '', '}', 'n')
<
		See |match-parens| for a bigger and more useful example.

							*searchpos()*
searchpos({pattern} [, {flags} [, {stopline} [, {timeout} [, {skip}]]]])
		Same as |search()|, but returns a |List| with the line and
		column position of the match. The first element of the |List|
		is the line number and the second element is the byte index of
		the column position of the match. If no match is found,
		returns [0, 0].
		Example: >
	:let [lnum, col] = searchpos('mypattern', 'n')

<		When the 'p' flag is given then there is an extra item with
		the sub-pattern match number |search()-sub-match|.  Example: >
	:let [lnum, col, submatch] = searchpos('\(\l\)\|\(\u\)', 'np')
<		In this example "submatch" is 2 when a lowercase letter is
		found |/\l|, 3 when an uppercase letter is found |/\u|.

		Can also be used as a |method|: >
			GetPattern()->searchpos()

server2client({clientid}, {string})			*server2client()*
		Send a reply string to {clientid}.  The most recent {clientid}
		that sent a string can be retrieved with expand("<client>").
		{only available when compiled with the |+clientserver| feature}
		Note:
		This id has to be stored before the next command can be
		received.  I.e. before returning from the received command and
		before calling any commands that waits for input.
		See also |clientserver|.
		Example: >
			:echo server2client(expand("<client>"), "HELLO")

<		Can also be used as a |method|: >
			GetClientId()->server2client(string)
<
serverlist()					*serverlist()*
		Return a list of available server names, one per line.
		When there are no servers or the information is not available
		an empty string is returned.  See also |clientserver|.
		{only available when compiled with the |+clientserver| feature}
		Example: >
			:echo serverlist()
<
setbufline({expr}, {lnum}, {text})			*setbufline()*
		Set line {lnum} to {text} in buffer {expr}.  This works like
		|setline()| for the specified buffer.

		This function works only for loaded buffers. First call
		|bufload()| if needed.

		To insert lines use |appendbufline()|.
		Any text properties in {lnum} are cleared.

		{text} can be a string to set one line, or a list of strings
		to set multiple lines.  If the list extends below the last
		line then those lines are added.

		For the use of {expr}, see |bufname()| above.

		{lnum} is used like with |setline()|.
		When {lnum} is just below the last line the {text} will be
		added below the last line.

		When {expr} is not a valid buffer, the buffer is not loaded or
		{lnum} is not valid then 1 is returned.  On success 0 is
		returned.

		Can also be used as a |method|, the base is passed as the
		third argument: >
			GetText()->setbufline(buf, lnum)

setbufvar({expr}, {varname}, {val})			*setbufvar()*
		Set option or local variable {varname} in buffer {expr} to
		{val}.
		This also works for a global or local window option, but it
		doesn't work for a global or local window variable.
		For a local window option the global value is unchanged.
		For the use of {expr}, see |bufname()| above.
		Note that the variable name without "b:" must be used.
		Examples: >
			:call setbufvar(1, "&mod", 1)
			:call setbufvar("todo", "myvar", "foobar")
<		This function is not available in the |sandbox|.

		Can also be used as a |method|, the base is passed as the
		third argument: >
			GetValue()->setbufvar(buf, varname)


setcellwidths({list})					*setcellwidths()*
		Specify overrides for cell widths of character ranges.  This
		tells Vim how wide characters are, counted in screen cells.
		This overrides 'ambiwidth'.  Example: >
		   setcellwidths([[0xad, 0xad, 1],
		   		\ [0x2194, 0x2199, 2]])

<					*E1109* *E1110* *E1111* *E1112* *E1113*
		The {list} argument is a list of lists with each three
		numbers. These three numbers are [low, high, width].  "low"
		and "high" can be the same, in which case this refers to one
		character. Otherwise it is the range of characters from "low"
		to "high" (inclusive).  "width" is either 1 or 2, indicating
		the character width in screen cells.
		An error is given if the argument is invalid, also when a
		range overlaps with another.
		Only characters with value 0x100 and higher can be used.

		To clear the overrides pass an empty list: >
		   setcellwidths([]);
<		You can use the script $VIMRUNTIME/tools/emoji_list.vim to see
		the effect for known emoji characters.

setcharpos({expr}, {list})				*setcharpos()*
		Same as |setpos()| but uses the specified column number as the
		character index instead of the byte index in the line.

		Example:
		With the text "여보세요" in line 8: >
			call setcharpos('.', [0, 8, 4, 0])
<		positions the cursor on the fourth character '요'. >
			call setpos('.', [0, 8, 4, 0])
<		positions the cursor on the second character '보'.

		Can also be used as a |method|: >
			GetPosition()->setcharpos('.')

setcharsearch({dict})					*setcharsearch()*
		Set the current character search information to {dict},
		which contains one or more of the following entries:

		    char	character which will be used for a subsequent
				|,| or |;| command; an empty string clears the
				character search
		    forward	direction of character search; 1 for forward,
				0 for backward
		    until	type of character search; 1 for a |t| or |T|
				character search, 0 for an |f| or |F|
				character search

		This can be useful to save/restore a user's character search
		from a script: >
			:let prevsearch = getcharsearch()
			:" Perform a command which clobbers user's search
			:call setcharsearch(prevsearch)
<		Also see |getcharsearch()|.

		Can also be used as a |method|: >
			SavedSearch()->setcharsearch()

setcmdpos({pos})					*setcmdpos()*
		Set the cursor position in the command line to byte position
		{pos}.  The first position is 1.
		Use |getcmdpos()| to obtain the current position.
		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| and |c_CTRL-R_CTRL-R| with '=' the position is
		set after the command line is set to the expression.  For
		|c_CTRL-R_=| it is set after evaluating the expression but
		before inserting the resulting text.
		When the number is too big the cursor is put at the end of the
		line.  A number smaller than one has undefined results.
		Returns 0 when successful, 1 when not editing the command
		line.

		Can also be used as a |method|: >
			GetPos()->setcmdpos()

setcursorcharpos({lnum}, {col} [, {off}])		*setcursorcharpos()*
setcursorcharpos({list})
		Same as |cursor()| but uses the specified column number as the
		character index instead of the byte index in the line.

		Example:
		With the text "여보세요" in line 4: >
			call setcursorcharpos(4, 3)
<		positions the cursor on the third character '세'. >
			call cursor(4, 3)
<		positions the cursor on the first character '여'.

		Can also be used as a |method|: >
			GetCursorPos()->setcursorcharpos()

setenv({name}, {val})						*setenv()*
		Set environment variable {name} to {val}.
		When {val} is |v:null| the environment variable is deleted.
		See also |expr-env|.

		Can also be used as a |method|, the base is passed as the
		second argument: >
			GetPath()->setenv('PATH')

setfperm({fname}, {mode})				*setfperm()* *chmod*
		Set the file permissions for {fname} to {mode}.
		{mode} must be a string with 9 characters.  It is of the form
		"rwxrwxrwx", where each group of "rwx" flags represent, in
		turn, the permissions of the owner of the file, the group the
		file belongs to, and other users.  A '-' character means the
		permission is off, any other character means on.  Multi-byte
		characters are not supported.

		For example "rw-r-----" means read-write for the user,
		readable by the group, not accessible by others.  "xx-x-----"
		would do the same thing.

		Returns non-zero for success, zero for failure.

		Can also be used as a |method|: >
			GetFilename()->setfperm(mode)
<
		To read permissions see |getfperm()|.


setline({lnum}, {text})					*setline()*
		Set line {lnum} of the current buffer to {text}.  To insert
		lines use |append()|. To set lines in another buffer use
		|setbufline()|.  Any text properties in {lnum} are cleared.

		{lnum} is used like with |getline()|.
		When {lnum} is just below the last line the {text} will be
		added below the last line.

		If this succeeds, 0 is returned.  If this fails (most likely
		because {lnum} is invalid) 1 is returned.

		Example: >
			:call setline(5, strftime("%c"))

<		When {text} is a |List| then line {lnum} and following lines
		will be set to the items in the list.  Example: >
			:call setline(5, ['aaa', 'bbb', 'ccc'])
<		This is equivalent to: >
			:for [n, l] in [[5, 'aaa'], [6, 'bbb'], [7, 'ccc']]
			:  call setline(n, l)
			:endfor

<		Note: The '[ and '] marks are not set.

		Can also be used as a |method|, the base is passed as the
		second argument: >
			GetText()->setline(lnum)

setloclist({nr}, {list} [, {action} [, {what}]])		*setloclist()*
		Create or replace or add to the location list for window {nr}.
		{nr} can be the window number or the |window-ID|.
		When {nr} is zero the current window is used.

		For a location list window, the displayed location list is
		modified.  For an invalid window number {nr}, -1 is returned.
		Otherwise, same as |setqflist()|.
		Also see |location-list|.

		For {action} see |setqflist-action|.

		If the optional {what} dictionary argument is supplied, then
		only the items listed in {what} are set. Refer to |setqflist()|
		for the list of supported keys in {what}.

		Can also be used as a |method|, the base is passed as the
		second argument: >
			GetLoclist()->setloclist(winnr)

setmatches({list} [, {win}])				*setmatches()*
		Restores a list of matches saved by |getmatches()| for the
		current window.  Returns 0 if successful, otherwise -1.  All
		current matches are cleared before the list is restored.  See
		example for |getmatches()|.
		If {win} is specified, use the window with this number or
		window ID instead of the current window.

		Can also be used as a |method|: >
			GetMatches()->setmatches()
<
							*setpos()*
setpos({expr}, {list})
		Set the position for {expr}.  Possible values:
			.	the cursor
			'x	mark x

		{list} must be a |List| with four or five numbers:
		    [bufnum, lnum, col, off]
		    [bufnum, lnum, col, off, curswant]

		"bufnum" is the buffer number.  Zero can be used for the
		current buffer.  When setting an uppercase mark "bufnum" is
		used for the mark position.  For other marks it specifies the
		buffer to set the mark in.  You can use the |bufnr()| function
		to turn a file name into a buffer number.
		For setting the cursor and the ' mark "bufnum" is ignored,
		since these are associated with a window, not a buffer.
		Does not change the jumplist.

		"lnum" and "col" are the position in the buffer.  The first
		column is 1.  Use a zero "lnum" to delete a mark.  If "col" is
		smaller than 1 then 1 is used. To use the character count
		instead of the byte count, use |setcharpos()|.

		The "off" number is only used when 'virtualedit' is set. Then
		it is the offset in screen columns from the start of the
		character.  E.g., a position within a <Tab> or after the last
		character.

		The "curswant" number is only used when setting the cursor
		position.  It sets the preferred column for when moving the
		cursor vertically.  When the "curswant" number is missing the
		preferred column is not set.  When it is present and setting a
		mark position it is not used.

		Note that for '< and '> changing the line number may result in
		the marks to be effectively be swapped, so that '< is always
		before '>.

		Returns 0 when the position could be set, -1 otherwise.
		An error message is given if {expr} is invalid.

		Also see |setcharpos()|, |getpos()| and |getcurpos()|.

		This does not restore the preferred column for moving
		vertically; if you set the cursor position with this, |j| and
		|k| motions will jump to previous columns!  Use |cursor()| to
		also set the preferred column.  Also see the "curswant" key in
		|winrestview()|.

		Can also be used as a |method|: >
			GetPosition()->setpos('.')

setqflist({list} [, {action} [, {what}]])		*setqflist()*
		Create or replace or add to the quickfix list.

		If the optional {what} dictionary argument is supplied, then
		only the items listed in {what} are set. The first {list}
		argument is ignored.  See below for the supported items in
		{what}.
							*setqflist-what*
		When {what} is not present, the items in {list} are used.  Each
		item must be a dictionary.  Non-dictionary items in {list} are
		ignored.  Each dictionary item can contain the following
		entries:

		    bufnr	buffer number; must be the number of a valid
				buffer
		    filename	name of a file; only used when "bufnr" is not
				present or it is invalid.
		    module	name of a module; if given it will be used in
				quickfix error window instead of the filename.
		    lnum	line number in the file
		    pattern	search pattern used to locate the error
		    col		column number
		    vcol	when non-zero: "col" is visual column
				when zero: "col" is byte index
		    nr		error number
		    text	description of the error
		    type	single-character error type, 'E', 'W', etc.
		    valid	recognized error message

		The "col", "vcol", "nr", "type" and "text" entries are
		optional.  Either "lnum" or "pattern" entry can be used to
		locate a matching error line.
		If the "filename" and "bufnr" entries are not present or
		neither the "lnum" or "pattern" entries are present, then the
		item will not be handled as an error line.
		If both "pattern" and "lnum" are present then "pattern" will
		be used.
		If the "valid" entry is not supplied, then the valid flag is
		set when "bufnr" is a valid buffer or "filename" exists.
		If you supply an empty {list}, the quickfix list will be
		cleared.
		Note that the list is not exactly the same as what
		|getqflist()| returns.

		{action} values:		*setqflist-action* *E927*
		'a'	The items from {list} are added to the existing
			quickfix list. If there is no existing list, then a
			new list is created.

		'r'	The items from the current quickfix list are replaced
			with the items from {list}.  This can also be used to
			clear the list: >
				:call setqflist([], 'r')
<
		'f'	All the quickfix lists in the quickfix stack are
			freed.

		If {action} is not present or is set to ' ', then a new list
		is created. The new quickfix list is added after the current
		quickfix list in the stack and all the following lists are
		freed. To add a new quickfix list at the end of the stack,
		set "nr" in {what} to "$".

		The following items can be specified in dictionary {what}:
		    context	quickfix list context. See |quickfix-context|
		    efm		errorformat to use when parsing text from
				"lines". If this is not present, then the
				'errorformat' option value is used.
				See |quickfix-parse|
		    id		quickfix list identifier |quickfix-ID|
		    idx		index of the current entry in the quickfix
				list specified by 'id' or 'nr'. If set to '$',
				then the last entry in the list is set as the
				current entry.  See |quickfix-index|
		    items	list of quickfix entries. Same as the {list}
				argument.
		    lines	use 'errorformat' to parse a list of lines and
				add the resulting entries to the quickfix list
				{nr} or {id}.  Only a |List| value is supported.
				See |quickfix-parse|
		    nr		list number in the quickfix stack; zero
				means the current quickfix list and "$" means
				the last quickfix list.
		    quickfixtextfunc
				function to get the text to display in the
				quickfix window.  The value can be the name of
				a function or a funcref or a lambda.  Refer to
				|quickfix-window-function| for an explanation
				of how to write the function and an example.
		    title	quickfix list title text. See |quickfix-title|
		Unsupported keys in {what} are ignored.
		If the "nr" item is not present, then the current quickfix list
		is modified. When creating a new quickfix list, "nr" can be
		set to a value one greater than the quickfix stack size.
		When modifying a quickfix list, to guarantee that the correct
		list is modified, "id" should be used instead of "nr" to
		specify the list.

		Examples (See also |setqflist-examples|): >
		   :call setqflist([], 'r', {'title': 'My search'})
		   :call setqflist([], 'r', {'nr': 2, 'title': 'Errors'})
		   :call setqflist([], 'a', {'id':qfid, 'lines':["F1:10:L10"]})
<
		Returns zero for success, -1 for failure.

		This function can be used to create a quickfix list
		independent of the 'errorformat' setting.  Use a command like
		`:cc 1` to jump to the first position.

		Can also be used as a |method|, the base is passed as the
		second argument: >
			GetErrorlist()->setqflist()
<
							*setreg()*
setreg({regname}, {value} [, {options}])
		Set the register {regname} to {value}.
		If {regname} is "" or "@", the unnamed register '"' is used.

		{value} may be any value returned by |getreg()| or
		|getreginfo()|, including a |List| or |Dict|.
		If {options} contains "a" or {regname} is upper case,
		then the value is appended.

		{options} can also contain a register type specification:
		    "c" or "v"	      |characterwise| mode
		    "l" or "V"	      |linewise| mode
		    "b" or "<CTRL-V>" |blockwise-visual| mode
		If a number immediately follows "b" or "<CTRL-V>" then this is
		used as the width of the selection - if it is not specified
		then the width of the block is set to the number of characters
		in the longest line (counting a <Tab> as 1 character).

		If {options} contains no register settings, then the default
		is to use character mode unless {value} ends in a <NL> for
		string {value} and linewise mode for list {value}. Blockwise
		mode is never selected automatically.
		Returns zero for success, non-zero for failure.

							*E883*
		Note: you may not use |List| containing more than one item to
		      set search and expression registers. Lists containing no
		      items act like empty strings.

		Examples: >
			:call setreg(v:register, @*)
			:call setreg('*', @%, 'ac')
			:call setreg('a', "1\n2\n3", 'b5')
			:call setreg('"', { 'points_to': 'a'})

<		This example shows using the functions to save and restore a
		register: >
			:let var_a = getreginfo()
			:call setreg('a', var_a)
<		or: >
			:let var_a = getreg('a', 1, 1)
			:let var_amode = getregtype('a')
			    ....
			:call setreg('a', var_a, var_amode)
<		Note: you may not reliably restore register value
		without using the third argument to |getreg()| as without it
		newlines are represented as newlines AND Nul bytes are
		represented as newlines as well, see |NL-used-for-Nul|.

		You can also change the type of a register by appending
		nothing: >
			:call setreg('a', '', 'al')

<		Can also be used as a |method|, the base is passed as the
		second argument: >
			GetText()->setreg('a')

settabvar({tabnr}, {varname}, {val})			*settabvar()*
		Set tab-local variable {varname} to {val} in tab page {tabnr}.
		|t:var|
		Note that autocommands are blocked, side effects may not be
		triggered, e.g. when setting 'filetype'.
		Note that the variable name without "t:" must be used.
		Tabs are numbered starting with one.
		This function is not available in the |sandbox|.

		Can also be used as a |method|, the base is passed as the
		third argument: >
			GetValue()->settabvar(tab, name)

settabwinvar({tabnr}, {winnr}, {varname}, {val})	*settabwinvar()*
		Set option or local variable {varname} in window {winnr} to
		{val}.
		Tabs are numbered starting with one.  For the current tabpage
		use |setwinvar()|.
		{winnr} can be the window number or the |window-ID|.
		When {winnr} is zero the current window is used.
		Note that autocommands are blocked, side effects may not be
		triggered, e.g. when setting 'filetype' or 'syntax'.
		This also works for a global or local buffer option, but it
		doesn't work for a global or local buffer variable.
		For a local buffer option the global value is unchanged.
		Note that the variable name without "w:" must be used.
		Examples: >
			:call settabwinvar(1, 1, "&list", 0)
			:call settabwinvar(3, 2, "myvar", "foobar")
<		This function is not available in the |sandbox|.

		Can also be used as a |method|, the base is passed as the
		fourth argument: >
			GetValue()->settabvar(tab, winnr, name)

settagstack({nr}, {dict} [, {action}])			*settagstack()*
		Modify the tag stack of the window {nr} using {dict}.
		{nr} can be the window number or the |window-ID|.

		For a list of supported items in {dict}, refer to
		|gettagstack()|. "curidx" takes effect before changing the tag
		stack.
							*E962*
		How the tag stack is modified depends on the {action}
		argument:
		- If {action} is not present or is set to 'r', then the tag
		  stack is replaced.
		- If {action} is set to 'a', then new entries from {dict} are
		  pushed (added) onto the tag stack.
		- If {action} is set to 't', then all the entries from the
		  current entry in the tag stack or "curidx" in {dict} are
		  removed and then new entries are pushed to the stack.

		The current index is set to one after the length of the tag
		stack after the modification.

		Returns zero for success, -1 for failure.

		Examples (for more examples see |tagstack-examples|):
		    Empty the tag stack of window 3: >
			call settagstack(3, {'items' : []})

<		    Save and restore the tag stack: >
			let stack = gettagstack(1003)
			" do something else
			call settagstack(1003, stack)
			unlet stack
<
		Can also be used as a |method|, the base is passed as the
		second argument: >
			GetStack()->settagstack(winnr)

setwinvar({winnr}, {varname}, {val})			*setwinvar()*
		Like |settabwinvar()| for the current tab page.
		Examples: >
			:call setwinvar(1, "&list", 0)
			:call setwinvar(2, "myvar", "foobar")

<		Can also be used as a |method|, the base is passed as the
		third argument: >
			GetValue()->setwinvar(winnr, name)

sha256({string})						*sha256()*
		Returns a String with 64 hex characters, which is the SHA256
		checksum of {string}.

		Can also be used as a |method|: >
			GetText()->sha256()

<		{only available when compiled with the |+cryptv| feature}

shellescape({string} [, {special}])			*shellescape()*
		Escape {string} for use as a shell command argument.
		On MS-Windows, when 'shellslash' is not set, it will enclose
		{string} in double quotes and double all double quotes within
		{string}.
		Otherwise it will enclose {string} in single quotes and
		replace all "'" with "'\''".

		When the {special} argument is present and it's a non-zero
		Number or a non-empty String (|non-zero-arg|), then special
		items such as "!", "%", "#" and "<cword>" will be preceded by
		a backslash.  This backslash will be removed again by the |:!|
		command.

		The "!" character will be escaped (again with a |non-zero-arg|
		{special}) when 'shell' contains "csh" in the tail.  That is
		because for csh and tcsh "!" is used for history replacement
		even when inside single quotes.

		With a |non-zero-arg| {special} the <NL> character is also
		escaped.  When 'shell' containing "csh" in the tail it's
		escaped a second time.

		Example of use with a |:!| command: >
		    :exe '!dir ' . shellescape(expand('<cfile>'), 1)
<		This results in a directory listing for the file under the
		cursor.  Example of use with |system()|: >
		    :call system("chmod +w -- " . shellescape(expand("%")))
<		See also |::S|.

		Can also be used as a |method|: >
			GetCommand()->shellescape()

shiftwidth([{col}])						*shiftwidth()*
		Returns the effective value of 'shiftwidth'. This is the
		'shiftwidth' value unless it is zero, in which case it is the
		'tabstop' value.  This function was introduced with patch
		7.3.694 in 2012, everybody should have it by now (however it
		did not allow for the optional {col} argument until 8.1.542).

		When there is one argument {col} this is used as column number
		for which to return the 'shiftwidth' value. This matters for the
		'vartabstop' feature. If the 'vartabstop' setting is enabled and
		no {col} argument is given, column 1 will be assumed.

		Can also be used as a |method|: >
			GetColumn()->shiftwidth()

sign_ functions are documented here: |sign-functions-details|


simplify({filename})					*simplify()*
		Simplify the file name as much as possible without changing
		the meaning.  Shortcuts (on MS-Windows) or symbolic links (on
		Unix) are not resolved.  If the first path component in
		{filename} designates the current directory, this will be
		valid for the result as well.  A trailing path separator is
		not removed either. On Unix "//path" is unchanged, but
		"///path" is simplified to "/path" (this follows the Posix
		standard).
		Example: >
			simplify("./dir/.././/file/") == "./file/"
<		Note: The combination "dir/.." is only removed if "dir" is
		a searchable directory or does not exist.  On Unix, it is also
		removed when "dir" is a symbolic link within the same
		directory.  In order to resolve all the involved symbolic
		links before simplifying the path name, use |resolve()|.

		Can also be used as a |method|: >
			GetName()->simplify()

sin({expr})						*sin()*
		Return the sine of {expr}, measured in radians, as a |Float|.
		{expr} must evaluate to a |Float| or a |Number|.
		Examples: >
			:echo sin(100)
<			-0.506366 >
			:echo sin(-4.01)
<			0.763301

		Can also be used as a |method|: >
			Compute()->sin()
<
		{only available when compiled with the |+float| feature}


sinh({expr})						*sinh()*
		Return the hyperbolic sine of {expr} as a |Float| in the range
		[-inf, inf].
		{expr} must evaluate to a |Float| or a |Number|.
		Examples: >
			:echo sinh(0.5)
<			0.521095 >
			:echo sinh(-0.9)
<			-1.026517

		Can also be used as a |method|: >
			Compute()->sinh()
<
		{only available when compiled with the |+float| feature}


slice({expr}, {start} [, {end}])			*slice()* 
		Similar to using a |slice| "expr[start : end]", but "end" is
		used exclusive.  And for a string the indexes are used as
		character indexes instead of byte indexes, like in
		|vim9script|.
		When {end} is omitted the slice continues to the last item.
		When {end} is -1 the last item is omitted.

		Can also be used as a |method|: >
			GetList()->slice(offset)


sort({list} [, {func} [, {dict}]])			*sort()* *E702*
		Sort the items in {list} in-place.  Returns {list}.

		If you want a list to remain unmodified make a copy first: >
			:let sortedlist = sort(copy(mylist))

<		When {func} is omitted, is empty or zero, then sort() uses the
		string representation of each item to sort on.  Numbers sort
		after Strings, |Lists| after Numbers.  For sorting text in the
		current buffer use |:sort|.

		When {func} is given and it is '1' or 'i' then case is
		ignored.

		When {func} is given and it is 'l' then the current collation
		locale is used for ordering. Implementation details: strcoll()
		is used to compare strings. See |:language| check or set the
		collation locale. |v:collate| can also be used to check the
		current locale. Sorting using the locale typically ignores
		case. Example: >
			" ö is sorted similarly to o with English locale.
			:language collate en_US.UTF8
			:echo sort(['n', 'o', 'O', 'ö', 'p', 'z'], 'l')
<			['n', 'o', 'O', 'ö', 'p', 'z'] ~
>
			" ö is sorted after z with Swedish locale.
			:language collate sv_SE.UTF8
			:echo sort(['n', 'o', 'O', 'ö', 'p', 'z'], 'l')
<			['n', 'o', 'O', 'p', 'z', 'ö'] ~
		This does not work properly on Mac.

		When {func} is given and it is 'n' then all items will be
		sorted numerical (Implementation detail: this uses the
		strtod() function to parse numbers, Strings, Lists, Dicts and
		Funcrefs will be considered as being 0).

		When {func} is given and it is 'N' then all items will be
		sorted numerical. This is like 'n' but a string containing
		digits will be used as the number they represent.

		When {func} is given and it is 'f' then all items will be
		sorted numerical. All values must be a Number or a Float.

		When {func} is a |Funcref| or a function name, this function
		is called to compare items.  The function is invoked with two
		items as argument and must return zero if they are equal, 1 or
		bigger if the first one sorts after the second one, -1 or
		smaller if the first one sorts before the second one.

		{dict} is for functions with the "dict" attribute.  It will be
		used to set the local variable "self". |Dictionary-function|

		The sort is stable, items which compare equal (as number or as
		string) will keep their relative position. E.g., when sorting
		on numbers, text strings will sort next to each other, in the
		same order as they were originally.

		Can also be used as a |method|: >
			mylist->sort()

<		Also see |uniq()|.

		Example: >
			func MyCompare(i1, i2)
			   return a:i1 == a:i2 ? 0 : a:i1 > a:i2 ? 1 : -1
			endfunc
			let sortedlist = sort(mylist, "MyCompare")
<		A shorter compare version for this specific simple case, which
		ignores overflow: >
			func MyCompare(i1, i2)
			   return a:i1 - a:i2
			endfunc
<
sound_clear()						*sound_clear()*
		Stop playing all sounds.
		{only available when compiled with the |+sound| feature}

							*sound_playevent()*
sound_playevent({name} [, {callback}])
		Play a sound identified by {name}.  Which event names are
		supported depends on the system.  Often the XDG sound names
		are used.  On Ubuntu they may be found in
		/usr/share/sounds/freedesktop/stereo.  Example: >
			call sound_playevent('bell')
<		On MS-Windows, {name} can be SystemAsterisk, SystemDefault,
		SystemExclamation, SystemExit, SystemHand, SystemQuestion,
		SystemStart, SystemWelcome, etc.

		When {callback} is specified it is invoked when the sound is
		finished.  The first argument is the sound ID, the second
		argument is the status:
			0	sound was played to the end
			1	sound was interrupted
			2	error occurred after sound started
		Example: >
		   func Callback(id, status)
		     echomsg "sound " .. a:id .. " finished with " .. a:status
		   endfunc
		   call sound_playevent('bell', 'Callback')

<		MS-Windows: {callback} doesn't work for this function.

		Returns the sound ID, which can be passed to `sound_stop()`.
		Returns zero if the sound could not be played.

		Can also be used as a |method|: >
			GetSoundName()->sound_playevent()

<		{only available when compiled with the |+sound| feature}

							*sound_playfile()*
sound_playfile({path} [, {callback}])
		Like `sound_playevent()` but play sound file {path}.  {path}
		must be a full path.  On Ubuntu you may find files to play
		with this command: >
		    :!find /usr/share/sounds -type f | grep -v index.theme

<		Can also be used as a |method|: >
			GetSoundPath()->sound_playfile()

<		{only available when compiled with the |+sound| feature}


sound_stop({id})					*sound_stop()*
		Stop playing sound {id}.  {id} must be previously returned by
		`sound_playevent()` or `sound_playfile()`.

		On MS-Windows, this does not work for event sound started by
		`sound_playevent()`. To stop event sounds, use `sound_clear()`.

		Can also be used as a |method|: >
			soundid->sound_stop()

<		{only available when compiled with the |+sound| feature}

							*soundfold()*
soundfold({word})
		Return the sound-folded equivalent of {word}.  Uses the first
		language in 'spelllang' for the current window that supports
		soundfolding.  'spell' must be set.  When no sound folding is
		possible the {word} is returned unmodified.
		This can be used for making spelling suggestions.  Note that
		the method can be quite slow.

		Can also be used as a |method|: >
			GetWord()->soundfold()
<
							*spellbadword()*
spellbadword([{sentence}])
		Without argument: The result is the badly spelled word under
		or after the cursor.  The cursor is moved to the start of the
		bad word.  When no bad word is found in the cursor line the
		result is an empty string and the cursor doesn't move.

		With argument: The result is the first word in {sentence} that
		is badly spelled.  If there are no spelling mistakes the
		result is an empty string.

		The return value is a list with two items:
		- The badly spelled word or an empty string.
		- The type of the spelling error:
			"bad"		spelling mistake
			"rare"		rare word
			"local"		word only valid in another region
			"caps"		word should start with Capital
		Example: >
			echo spellbadword("the quik brown fox")
<			['quik', 'bad'] ~

		The spelling information for the current window and the value
		of 'spelllang' are used.

		Can also be used as a |method|: >
			GetText()->spellbadword()
<
							*spellsuggest()*
spellsuggest({word} [, {max} [, {capital}]])
		Return a |List| with spelling suggestions to replace {word}.
		When {max} is given up to this number of suggestions are
		returned.  Otherwise up to 25 suggestions are returned.

		When the {capital} argument is given and it's non-zero only
		suggestions with a leading capital will be given.  Use this
		after a match with 'spellcapcheck'.

		{word} can be a badly spelled word followed by other text.
		This allows for joining two words that were split.  The
		suggestions also include the following text, thus you can
		replace a line.

		{word} may also be a good word.  Similar words will then be
		returned.  {word} itself is not included in the suggestions,
		although it may appear capitalized.

		The spelling information for the current window is used.  The
		values of 'spelllang' and 'spellsuggest' are used.

		Can also be used as a |method|: >
			GetWord()->spellsuggest()

split({expr} [, {pattern} [, {keepempty}]])			*split()*
		Make a |List| out of {expr}.  When {pattern} is omitted or
		empty each white-separated sequence of characters becomes an
		item.
		Otherwise the string is split where {pattern} matches,
		removing the matched characters. 'ignorecase' is not used
		here, add \c to ignore case. |/\c|
		When the first or last item is empty it is omitted, unless the
		{keepempty} argument is given and it's non-zero.
		Other empty items are kept when {pattern} matches at least one
		character or when {keepempty} is non-zero.
		Example: >
			:let words = split(getline('.'), '\W\+')
<		To split a string in individual characters: >
			:for c in split(mystring, '\zs')
<		If you want to keep the separator you can also use '\zs' at
		the end of the pattern: >
			:echo split('abc:def:ghi', ':\zs')
<			['abc:', 'def:', 'ghi'] ~
		Splitting a table where the first element can be empty: >
			:let items = split(line, ':', 1)
<		The opposite function is |join()|.

		Can also be used as a |method|: >
			GetString()->split()

sqrt({expr})						*sqrt()*
		Return the non-negative square root of Float {expr} as a
		|Float|.
		{expr} must evaluate to a |Float| or a |Number|.  When {expr}
		is negative the result is NaN (Not a Number).
		Examples: >
			:echo sqrt(100)
<			10.0 >
			:echo sqrt(-4.01)
<			nan
		"nan" may be different, it depends on system libraries.

		Can also be used as a |method|: >
			Compute()->sqrt()
<
		{only available when compiled with the |+float| feature}


srand([{expr}])						*srand()*
		Initialize seed used by |rand()|:
		- If {expr} is not given, seed values are initialized by
		  reading from /dev/urandom, if possible, or using time(NULL)
		  a.k.a. epoch time otherwise; this only has second accuracy.
		- If {expr} is given it must be a Number.  It is used to
		  initialize the seed values.  This is useful for testing or
		  when a predictable sequence is intended.

		Examples: >
			:let seed = srand()
			:let seed = srand(userinput)
			:echo rand(seed)

state([{what}])						*state()*
		Return a string which contains characters indicating the
		current state.  Mostly useful in callbacks that want to do
		work that may not always be safe.  Roughly this works like:
		- callback uses state() to check if work is safe to do.
		  Yes: then do it right away.
		  No:  add to work queue and add a |SafeState| and/or
		       |SafeStateAgain| autocommand (|SafeState| triggers at
		       toplevel, |SafeStateAgain| triggers after handling
		       messages and callbacks).
		- When SafeState or SafeStateAgain is triggered and executes
		  your autocommand, check with `state()` if the work can be
		  done now, and if yes remove it from the queue and execute.
		  Remove the autocommand if the queue is now empty.
		Also see |mode()|.

		When {what} is given only characters in this string will be
		added.  E.g, this checks if the screen has scrolled: >
			if state('s') == ''
			   " screen has not scrolled
<
		These characters indicate the state, generally indicating that
		something is busy:
		    m	halfway a mapping, :normal command, feedkeys() or
			stuffed command
		    o	operator pending, e.g. after |d|
		    a	Insert mode autocomplete active
		    x	executing an autocommand
		    w	blocked on waiting, e.g. ch_evalexpr(), ch_read() and
			ch_readraw() when reading json
		    S	not triggering SafeState or SafeStateAgain, e.g. after
		    	|f| or a count
		    c	callback invoked, including timer (repeats for
			recursiveness up to "ccc")
		    s	screen has scrolled for messages

str2float({expr})					*str2float()*
		Convert String {expr} to a Float.  This mostly works the same
		as when using a floating point number in an expression, see
		|floating-point-format|.  But it's a bit more permissive.
		E.g., "1e40" is accepted, while in an expression you need to
		write "1.0e40".  The hexadecimal form "0x123" is also
		accepted, but not others, like binary or octal.
		Text after the number is silently ignored.
		The decimal point is always '.', no matter what the locale is
		set to.  A comma ends the number: "12,345.67" is converted to
		12.0.  You can strip out thousands separators with
		|substitute()|: >
			let f = str2float(substitute(text, ',', '', 'g'))
<
		Can also be used as a |method|: >
			let f = text->substitute(',', '', 'g')->str2float()
<
		{only available when compiled with the |+float| feature}

str2list({expr} [, {utf8}])				*str2list()*
		Return a list containing the number values which represent
		each character in String {expr}.  Examples: >
			str2list(" ")		returns [32]
			str2list("ABC")		returns [65, 66, 67]
<		|list2str()| does the opposite.

		When {utf8} is omitted or zero, the current 'encoding' is used.
		With {utf8} set to 1, always treat the String as utf-8
		characters.  With utf-8 composing characters are handled
		properly: >
			str2list("á")		returns [97, 769]

<		Can also be used as a |method|: >
			GetString()->str2list()


str2nr({expr} [, {base} [, {quoted}]])				*str2nr()*
		Convert string {expr} to a number.
		{base} is the conversion base, it can be 2, 8, 10 or 16.
		When {quoted} is present and non-zero then embedded single
		quotes are ignored, thus "1'000'000" is a million.

		When {base} is omitted base 10 is used.  This also means that
		a leading zero doesn't cause octal conversion to be used, as
		with the default String to Number conversion.  Example: >
			let nr = str2nr('0123')
<
		When {base} is 16 a leading "0x" or "0X" is ignored.  With a
		different base the result will be zero.  Similarly, when
		{base} is 8 a leading "0", "0o" or "0O" is ignored, and when
		{base} is 2 a leading "0b" or "0B" is ignored.
		Text after the number is silently ignored.

		Can also be used as a |method|: >
			GetText()->str2nr()

strcharpart({src}, {start} [, {len}])			*strcharpart()*
		Like |strpart()| but using character index and length instead
		of byte index and length.
		When a character index is used where a character does not
		exist it is assumed to be one character.  For example: >
			strcharpart('abc', -1, 2)
<		results in 'a'.

		Can also be used as a |method|: >
			GetText()->strcharpart(5)

strchars({expr} [, {skipcc}])					*strchars()*
		The result is a Number, which is the number of characters
		in String {expr}.
		When {skipcc} is omitted or zero, composing characters are
		counted separately.
		When {skipcc} set to 1, Composing characters are ignored.
		Also see |strlen()|, |strdisplaywidth()| and |strwidth()|.

		{skipcc} is only available after 7.4.755.  For backward
		compatibility, you can define a wrapper function: >
		    if has("patch-7.4.755")
		      function s:strchars(str, skipcc)
			return strchars(a:str, a:skipcc)
		      endfunction
		    else
		      function s:strchars(str, skipcc)
			if a:skipcc
			  return strlen(substitute(a:str, ".", "x", "g"))
			else
			  return strchars(a:str)
			endif
		      endfunction
		    endif
<
		Can also be used as a |method|: >
			GetText()->strchars()

strdisplaywidth({expr} [, {col}])			*strdisplaywidth()*
		The result is a Number, which is the number of display cells
		String {expr} occupies on the screen when it starts at {col}
		(first column is zero).  When {col} is omitted zero is used.
		Otherwise it is the screen column where to start.  This
		matters for Tab characters.
		The option settings of the current window are used.  This
		matters for anything that's displayed differently, such as
		'tabstop' and 'display'.
		When {expr} contains characters with East Asian Width Class
		Ambiguous, this function's return value depends on 'ambiwidth'.
		Also see |strlen()|, |strwidth()| and |strchars()|.

		Can also be used as a |method|: >
			GetText()->strdisplaywidth()

strftime({format} [, {time}])				*strftime()*
		The result is a String, which is a formatted date and time, as
		specified by the {format} string.  The given {time} is used,
		or the current time if no time is given.  The accepted
		{format} depends on your system, thus this is not portable!
		See the manual page of the C function strftime() for the
		format.  The maximum length of the result is 80 characters.
		See also |localtime()|, |getftime()| and |strptime()|.
		The language can be changed with the |:language| command.
		Examples: >
		  :echo strftime("%c")		   Sun Apr 27 11:49:23 1997
		  :echo strftime("%Y %b %d %X")	   1997 Apr 27 11:53:25
		  :echo strftime("%y%m%d %T")	   970427 11:53:55
		  :echo strftime("%H:%M")	   11:55
		  :echo strftime("%c", getftime("file.c"))
						   Show mod time of file.c.
<		Not available on all systems.  To check use: >
			:if exists("*strftime")

<		Can also be used as a |method|: >
			GetFormat()->strftime()

strgetchar({str}, {index})				*strgetchar()*
		Get character {index} from {str}.  This uses a character
		index, not a byte index.  Composing characters are considered
		separate characters here.
		Also see |strcharpart()| and |strchars()|.

		Can also be used as a |method|: >
			GetText()->strgetchar(5)

stridx({haystack}, {needle} [, {start}])		*stridx()*
		The result is a Number, which gives the byte index in
		{haystack} of the first occurrence of the String {needle}.
		If {start} is specified, the search starts at index {start}.
		This can be used to find a second match: >
			:let colon1 = stridx(line, ":")
			:let colon2 = stridx(line, ":", colon1 + 1)
<		The search is done case-sensitive.
		For pattern searches use |match()|.
		-1 is returned if the {needle} does not occur in {haystack}.
		See also |strridx()|.
		Examples: >
		  :echo stridx("An Example", "Example")	     3
		  :echo stridx("Starting point", "Start")    0
		  :echo stridx("Starting point", "start")   -1
<						*strstr()* *strchr()*
		stridx() works similar to the C function strstr().  When used
		with a single character it works similar to strchr().

		Can also be used as a |method|: >
			GetHaystack()->stridx(needle)
<
							*string()*
string({expr})	Return {expr} converted to a String.  If {expr} is a Number,
		Float, String, Blob or a composition of them, then the result
		can be parsed back with |eval()|.
			{expr} type	result ~
			String		'string' (single quotes are doubled)
			Number		123
			Float		123.123456 or 1.123456e8
			Funcref		function('name')
			Blob		0z00112233.44556677.8899
			List		[item, item]
			Dictionary	{key: value, key: value}

		When a |List| or |Dictionary| has a recursive reference it is
		replaced by "[...]" or "{...}".  Using eval() on the result
		will then fail.

		Can also be used as a |method|: >
			mylist->string()

<		Also see |strtrans()|.

							*strlen()*
strlen({expr})	The result is a Number, which is the length of the String
		{expr} in bytes.
		If the argument is a Number it is first converted to a String.
		For other types an error is given.
		If you want to count the number of multibyte characters use
		|strchars()|.
		Also see |len()|, |strdisplaywidth()| and |strwidth()|.

		Can also be used as a |method|: >
			GetString()->strlen()

strpart({src}, {start} [, {len} [, {chars}]])			*strpart()*
		The result is a String, which is part of {src}, starting from
		byte {start}, with the byte length {len}.
		When {chars} is present and TRUE then {len} is the number of
		characters positions (composing characters are not counted
		separately, thus "1" means one base character and any
		following composing characters).
		To count {start} as characters instead of bytes use
		|strcharpart()|.

		When bytes are selected which do not exist, this doesn't
		result in an error, the bytes are simply omitted.
		If {len} is missing, the copy continues from {start} till the
		end of the {src}. >
			strpart("abcdefg", 3, 2)    == "de"
			strpart("abcdefg", -2, 4)   == "ab"
			strpart("abcdefg", 5, 4)    == "fg"
			strpart("abcdefg", 3)	    == "defg"

<		Note: To get the first character, {start} must be 0.  For
		example, to get the character under the cursor: >
			strpart(getline("."), col(".") - 1, 1, v:true)
<
		Can also be used as a |method|: >
			GetText()->strpart(5)

strptime({format}, {timestring})				*strptime()*
		The result is a Number, which is a unix timestamp representing
		the date and time in {timestring}, which is expected to match
		the format specified in {format}.

		The accepted {format} depends on your system, thus this is not
		portable!  See the manual page of the C function strptime()
		for the format.  Especially avoid "%c".  The value of $TZ also
		matters.

		If the {timestring} cannot be parsed with {format} zero is
		returned.  If you do not know the format of {timestring} you
		can try different {format} values until you get a non-zero
		result.

		See also |strftime()|.
		Examples: >
		  :echo strptime("%Y %b %d %X", "1997 Apr 27 11:49:23")
<		  862156163 >
		  :echo strftime("%c", strptime("%y%m%d %T", "970427 11:53:55"))
<		  Sun Apr 27 11:53:55 1997 >
		  :echo strftime("%c", strptime("%Y%m%d%H%M%S", "19970427115355") + 3600)
<		  Sun Apr 27 12:53:55 1997

		Not available on all systems.  To check use: >
			:if exists("*strptime")


strridx({haystack}, {needle} [, {start}])			*strridx()*
		The result is a Number, which gives the byte index in
		{haystack} of the last occurrence of the String {needle}.
		When {start} is specified, matches beyond this index are
		ignored.  This can be used to find a match before a previous
		match: >
			:let lastcomma = strridx(line, ",")
			:let comma2 = strridx(line, ",", lastcomma - 1)
<		The search is done case-sensitive.
		For pattern searches use |match()|.
		-1 is returned if the {needle} does not occur in {haystack}.
		If the {needle} is empty the length of {haystack} is returned.
		See also |stridx()|.  Examples: >
		  :echo strridx("an angry armadillo", "an")	     3
<							*strrchr()*
		When used with a single character it works similar to the C
		function strrchr().

		Can also be used as a |method|: >
			GetHaystack()->strridx(needle)

strtrans({expr})					*strtrans()*
		The result is a String, which is {expr} with all unprintable
		characters translated into printable characters |'isprint'|.
		Like they are shown in a window.  Example: >
			echo strtrans(@a)
<		This displays a newline in register a as "^@" instead of
		starting a new line.

		Can also be used as a |method|: >
			GetString()->strtrans()

strwidth({expr})					*strwidth()*
		The result is a Number, which is the number of display cells
		String {expr} occupies.  A Tab character is counted as one
		cell, alternatively use |strdisplaywidth()|.
		When {expr} contains characters with East Asian Width Class
		Ambiguous, this function's return value depends on 'ambiwidth'.
		Also see |strlen()|, |strdisplaywidth()| and |strchars()|.

		Can also be used as a |method|: >
			GetString()->strwidth()

submatch({nr} [, {list}])			*submatch()* *E935*
		Only for an expression in a |:substitute| command or
		substitute() function.
		Returns the {nr}'th submatch of the matched text.  When {nr}
		is 0 the whole matched text is returned.
		Note that a NL in the string can stand for a line break of a
		multi-line match or a NUL character in the text.
		Also see |sub-replace-expression|.

		If {list} is present and non-zero then submatch() returns
		a list of strings, similar to |getline()| with two arguments.
		NL characters in the text represent NUL characters in the
		text.
		Only returns more than one item for |:substitute|, inside
		|substitute()| this list will always contain one or zero
		items, since there are no real line breaks.

		When substitute() is used recursively only the submatches in
		the current (deepest) call can be obtained.

		Examples: >
			:s/\d\+/\=submatch(0) + 1/
			:echo substitute(text, '\d\+', '\=submatch(0) + 1', '')
<		This finds the first number in the line and adds one to it.
		A line break is included as a newline character.

		Can also be used as a |method|: >
			GetNr()->submatch()

substitute({expr}, {pat}, {sub}, {flags})		*substitute()*
		The result is a String, which is a copy of {expr}, in which
		the first match of {pat} is replaced with {sub}.
		When {flags} is "g", all matches of {pat} in {expr} are
		replaced.  Otherwise {flags} should be "".

		This works like the ":substitute" command (without any flags).
		But the matching with {pat} is always done like the 'magic'
		option is set and 'cpoptions' is empty (to make scripts
		portable).  'ignorecase' is still relevant, use |/\c| or |/\C|
		if you want to ignore or match case and ignore 'ignorecase'.
		'smartcase' is not used.  See |string-match| for how {pat} is
		used.

		A "~" in {sub} is not replaced with the previous {sub}.
		Note that some codes in {sub} have a special meaning
		|sub-replace-special|.  For example, to replace something with
		"\n" (two characters), use "\\\\n" or '\\n'.

		When {pat} does not match in {expr}, {expr} is returned
		unmodified.

		Example: >
		   :let &path = substitute(&path, ",\\=[^,]*$", "", "")
<		This removes the last component of the 'path' option. >
		   :echo substitute("testing", ".*", "\\U\\0", "")
<		results in "TESTING".

		When {sub} starts with "\=", the remainder is interpreted as
		an expression. See |sub-replace-expression|.  Example: >
		   :echo substitute(s, '%\(\x\x\)',
			   \ '\=nr2char("0x" . submatch(1))', 'g')

<		When {sub} is a Funcref that function is called, with one
		optional argument.  Example: >
		   :echo substitute(s, '%\(\x\x\)', SubNr, 'g')
<		The optional argument is a list which contains the whole
		matched string and up to nine submatches, like what
		|submatch()| returns.  Example: >
		   :echo substitute(s, '%\(\x\x\)', {m -> '0x' . m[1]}, 'g')

<		Can also be used as a |method|: >
			GetString()->substitute(pat, sub, flags)

swapinfo({fname})					*swapinfo()*
		The result is a dictionary, which holds information about the
		swapfile {fname}. The available fields are:
			version Vim version
			user	user name
			host	host name
			fname	original file name
			pid	PID of the Vim process that created the swap
				file
			mtime	last modification time in seconds
			inode	Optional: INODE number of the file
			dirty	1 if file was modified, 0 if not
		Note that "user" and "host" are truncated to at most 39 bytes.
		In case of failure an "error" item is added with the reason:
			Cannot open file: file not found or in accessible
			Cannot read file: cannot read first block
			Not a swap file: does not contain correct block ID
			Magic number mismatch: Info in first block is invalid

		Can also be used as a |method|: >
			GetFilename()->swapinfo()

swapname({expr})					*swapname()*
		The result is the swap file path of the buffer {expr}.
		For the use of {expr}, see |bufname()| above.
		If buffer {expr} is the current buffer, the result is equal to
		|:swapname| (unless there is no swap file).
		If buffer {expr} has no swap file, returns an empty string.

		Can also be used as a |method|: >
			GetBufname()->swapname()

synID({lnum}, {col}, {trans})				*synID()*
		The result is a Number, which is the syntax ID at the position
		{lnum} and {col} in the current window.
		The syntax ID can be used with |synIDattr()| and
		|synIDtrans()| to obtain syntax information about text.

		{col} is 1 for the leftmost column, {lnum} is 1 for the first
		line.  'synmaxcol' applies, in a longer line zero is returned.
		Note that when the position is after the last character,
		that's where the cursor can be in Insert mode, synID() returns
		zero.

		When {trans} is |TRUE|, transparent items are reduced to the
		item that they reveal.  This is useful when wanting to know
		the effective color.  When {trans} is |FALSE|, the transparent
		item is returned.  This is useful when wanting to know which
		syntax item is effective (e.g. inside parens).
		Warning: This function can be very slow.  Best speed is
		obtained by going through the file in forward direction.

		Example (echoes the name of the syntax item under the cursor): >
			:echo synIDattr(synID(line("."), col("."), 1), "name")
<

synIDattr({synID}, {what} [, {mode}])			*synIDattr()*
		The result is a String, which is the {what} attribute of
		syntax ID {synID}.  This can be used to obtain information
		about a syntax item.
		{mode} can be "gui", "cterm" or "term", to get the attributes
		for that mode.  When {mode} is omitted, or an invalid value is
		used, the attributes for the currently active highlighting are
		used (GUI, cterm or term).
		Use synIDtrans() to follow linked highlight groups.
		{what}		result
		"name"		the name of the syntax item
		"fg"		foreground color (GUI: color name used to set
				the color, cterm: color number as a string,
				term: empty string)
		"bg"		background color (as with "fg")
		"font"		font name (only available in the GUI)
				|highlight-font|
		"sp"		special color for the GUI (as with "fg")
				|highlight-guisp|
		"ul"		underline color for cterm: number as a string
		"fg#"		like "fg", but for the GUI and the GUI is
				running the name in "#RRGGBB" form
		"bg#"		like "fg#" for "bg"
		"sp#"		like "fg#" for "sp"
		"bold"		"1" if bold
		"italic"	"1" if italic
		"reverse"	"1" if reverse
		"inverse"	"1" if inverse (= reverse)
		"standout"	"1" if standout
		"underline"	"1" if underlined
		"undercurl"	"1" if undercurled
		"strike"	"1" if strikethrough

		Example (echoes the color of the syntax item under the
		cursor): >
	:echo synIDattr(synIDtrans(synID(line("."), col("."), 1)), "fg")
<
		Can also be used as a |method|: >
	:echo synID(line("."), col("."), 1)->synIDtrans()->synIDattr("fg")


synIDtrans({synID})					*synIDtrans()*
		The result is a Number, which is the translated syntax ID of
		{synID}.  This is the syntax group ID of what is being used to
		highlight the character.  Highlight links given with
		":highlight link" are followed.

		Can also be used as a |method|: >
	:echo synID(line("."), col("."), 1)->synIDtrans()->synIDattr("fg")

synconcealed({lnum}, {col})				*synconcealed()*
		The result is a |List| with currently three items:
		1. The first item in the list is 0 if the character at the
		   position {lnum} and {col} is not part of a concealable
		   region, 1 if it is.
		2. The second item in the list is a string. If the first item
		   is 1, the second item contains the text which will be
		   displayed in place of the concealed text, depending on the
		   current setting of 'conceallevel' and 'listchars'.
		3. The third and final item in the list is a number
		   representing the specific syntax region matched in the
		   line. When the character is not concealed the value is
		   zero. This allows detection of the beginning of a new
		   concealable region if there are two consecutive regions
		   with the same replacement character.  For an example, if
		   the text is "123456" and both "23" and "45" are concealed
		   and replaced by the character "X", then:
			call			returns ~
			synconcealed(lnum, 1)   [0, '', 0]
			synconcealed(lnum, 2)   [1, 'X', 1]
			synconcealed(lnum, 3)   [1, 'X', 1]
			synconcealed(lnum, 4)   [1, 'X', 2]
			synconcealed(lnum, 5)   [1, 'X', 2]
			synconcealed(lnum, 6)   [0, '', 0]


synstack({lnum}, {col})					*synstack()*
		Return a |List|, which is the stack of syntax items at the
		position {lnum} and {col} in the current window.  Each item in
		the List is an ID like what |synID()| returns.
		The first item in the List is the outer region, following are
		items contained in that one.  The last one is what |synID()|
		returns, unless not the whole item is highlighted or it is a
		transparent item.
		This function is useful for debugging a syntax file.
		Example that shows the syntax stack under the cursor: >
			for id in synstack(line("."), col("."))
			   echo synIDattr(id, "name")
			endfor
<		When the position specified with {lnum} and {col} is invalid
		nothing is returned.  The position just after the last
		character in a line and the first column in an empty line are
		valid positions.

system({expr} [, {input}])				*system()* *E677*
		Get the output of the shell command {expr} as a string.  See
		|systemlist()| to get the output as a |List|.

		When {input} is given and is a string this string is written
		to a file and passed as stdin to the command.  The string is
		written as-is, you need to take care of using the correct line
		separators yourself.
		If {input} is given and is a |List| it is written to the file
		in a way |writefile()| does with {binary} set to "b" (i.e.
		with a newline between each list item with newlines inside
		list items converted to NULs).
		When {input} is given and is a number that is a valid id for
		an existing buffer then the content of the buffer is written
		to the file line by line, each line terminated by a NL and
		NULs characters where the text has a NL.

		Pipes are not used, the 'shelltemp' option is not used.

		When prepended by |:silent| the terminal will not be set to
		cooked mode.  This is meant to be used for commands that do
		not need the user to type.  It avoids stray characters showing
		up on the screen which require |CTRL-L| to remove. >
			:silent let f = system('ls *.vim')
<
		Note: Use |shellescape()| or |::S| with |expand()| or
		|fnamemodify()| to escape special characters in a command
		argument.  Newlines in {expr} may cause the command to fail.
		The characters in 'shellquote' and 'shellxquote' may also
		cause trouble.
		This is not to be used for interactive commands.

		The result is a String.  Example: >
		    :let files = system("ls " .  shellescape(expand('%:h')))
		    :let files = system('ls ' . expand('%:h:S'))

<		To make the result more system-independent, the shell output
		is filtered to replace <CR> with <NL> for Macintosh, and
		<CR><NL> with <NL> for DOS-like systems.
		To avoid the string being truncated at a NUL, all NUL
		characters are replaced with SOH (0x01).

		The command executed is constructed using several options:
	'shell' 'shellcmdflag' 'shellxquote' {expr} 'shellredir' {tmp} 'shellxquote'
		({tmp} is an automatically generated file name).
		For Unix, braces are put around {expr} to allow for
		concatenated commands.

		The command will be executed in "cooked" mode, so that a
		CTRL-C will interrupt the command (on Unix at least).

		The resulting error code can be found in |v:shell_error|.
		This function will fail in |restricted-mode|.

		Note that any wrong value in the options mentioned above may
		make the function fail.  It has also been reported to fail
		when using a security agent application.
		Unlike ":!cmd" there is no automatic check for changed files.
		Use |:checktime| to force a check.

		Can also be used as a |method|: >
			:echo GetCmd()->system()


systemlist({expr} [, {input}])				*systemlist()*
		Same as |system()|, but returns a |List| with lines (parts of
		output separated by NL) with NULs transformed into NLs. Output
		is the same as |readfile()| will output with {binary} argument
		set to "b", except that there is no extra empty item when the
		result ends in a NL.
		Note that on MS-Windows you may get trailing CR characters.

		To see the difference between "echo hello" and "echo -n hello"
		use |system()| and |split()|: >
			echo system('echo hello')->split('\n', 1)
<
		Returns an empty string on error.

		Can also be used as a |method|: >
			:echo GetCmd()->systemlist()


tabpagebuflist([{arg}])					*tabpagebuflist()*
		The result is a |List|, where each item is the number of the
		buffer associated with each window in the current tab page.
		{arg} specifies the number of the tab page to be used. When
		omitted the current tab page is used.
		When {arg} is invalid the number zero is returned.
		To get a list of all buffers in all tabs use this: >
			let buflist = []
			for i in range(tabpagenr('$'))
			   call extend(buflist, tabpagebuflist(i + 1))
			endfor
<		Note that a buffer may appear in more than one window.

		Can also be used as a |method|: >
			GetTabpage()->tabpagebuflist()

tabpagenr([{arg}])					*tabpagenr()*
		The result is a Number, which is the number of the current
		tab page.  The first tab page has number 1.

		The optional argument {arg} supports the following values:
			$	the number of the last tab page (the tab page
				count).
			#	the number of the last accessed tab page
				(where |g<Tab>| goes to). if there is no
				previous tab page 0 is returned.
		The number can be used with the |:tab| command.


tabpagewinnr({tabarg} [, {arg}])			*tabpagewinnr()*
		Like |winnr()| but for tab page {tabarg}.
		{tabarg} specifies the number of tab page to be used.
		{arg} is used like with |winnr()|:
		- When omitted the current window number is returned.  This is
		  the window which will be used when going to this tab page.
		- When "$" the number of windows is returned.
		- When "#" the previous window nr is returned.
		Useful examples: >
		    tabpagewinnr(1)	    " current window of tab page 1
		    tabpagewinnr(4, '$')    " number of windows in tab page 4
<		When {tabarg} is invalid zero is returned.

		Can also be used as a |method|: >
			GetTabpage()->tabpagewinnr()
<
							*tagfiles()*
tagfiles()	Returns a |List| with the file names used to search for tags
		for the current buffer.  This is the 'tags' option expanded.


taglist({expr} [, {filename}])				*taglist()*
		Returns a |List| of tags matching the regular expression {expr}.

		If {filename} is passed it is used to prioritize the results
		in the same way that |:tselect| does. See |tag-priority|.
		{filename} should be the full path of the file.

		Each list item is a dictionary with at least the following
		entries:
			name		Name of the tag.
			filename	Name of the file where the tag is
					defined.  It is either relative to the
					current directory or a full path.
			cmd		Ex command used to locate the tag in
					the file.
			kind		Type of the tag.  The value for this
					entry depends on the language specific
					kind values.  Only available when
					using a tags file generated by
					Exuberant ctags or hdrtag.
			static		A file specific tag.  Refer to
					|static-tag| for more information.
		More entries may be present, depending on the content of the
		tags file: access, implementation, inherits and signature.
		Refer to the ctags documentation for information about these
		fields.  For C code the fields "struct", "class" and "enum"
		may appear, they give the name of the entity the tag is
		contained in.

		The ex-command "cmd" can be either an ex search pattern, a
		line number or a line number followed by a byte number.

		If there are no matching tags, then an empty list is returned.

		To get an exact tag match, the anchors '^' and '$' should be
		used in {expr}.  This also make the function work faster.
		Refer to |tag-regexp| for more information about the tag
		search regular expression pattern.

		Refer to |'tags'| for information about how the tags file is
		located by Vim. Refer to |tags-file-format| for the format of
		the tags file generated by the different ctags tools.

		Can also be used as a |method|: >
			GetTagpattern()->taglist()

tan({expr})						*tan()*
		Return the tangent of {expr}, measured in radians, as a |Float|
		in the range [-inf, inf].
		{expr} must evaluate to a |Float| or a |Number|.
		Examples: >
			:echo tan(10)
<			0.648361 >
			:echo tan(-4.01)
<			-1.181502

		Can also be used as a |method|: >
			Compute()->tan()
<
		{only available when compiled with the |+float| feature}


tanh({expr})						*tanh()*
		Return the hyperbolic tangent of {expr} as a |Float| in the
		range [-1, 1].
		{expr} must evaluate to a |Float| or a |Number|.
		Examples: >
			:echo tanh(0.5)
<			0.462117 >
			:echo tanh(-1)
<			-0.761594

		Can also be used as a |method|: >
			Compute()->tanh()
<
		{only available when compiled with the |+float| feature}


tempname()					*tempname()* *temp-file-name*
		The result is a String, which is the name of a file that
		doesn't exist.  It can be used for a temporary file.  The name
		is different for at least 26 consecutive calls.  Example: >
			:let tmpfile = tempname()
			:exe "redir > " . tmpfile
<		For Unix, the file will be in a private directory |tempfile|.
		For MS-Windows forward slashes are used when the 'shellslash'
		option is set or when 'shellcmdflag' starts with '-'.


term_ functions are documented here: |terminal-function-details|


terminalprops()						*terminalprops()*
		Returns a |Dictionary| with properties of the terminal that Vim
		detected from the response to |t_RV| request.  See
		|v:termresponse| for the response itself.  If |v:termresponse|
		is empty most values here will be 'u' for unknown.
		   cursor_style		whether sending |t_RS| works  **
		   cursor_blink_mode	whether sending |t_RC| works  **
		   underline_rgb	whether |t_8u| works **
		   mouse		mouse type supported

		** value 'u' for unknown, 'y' for yes, 'n' for no

		If the |+termresponse| feature is missing then the result is
		an empty dictionary.

		If "cursor_style" is 'y' then |t_RS| will be sent to request the
		current cursor style.
		If "cursor_blink_mode" is 'y' then |t_RC| will be sent to
		request the cursor blink status.
		"cursor_style" and "cursor_blink_mode" are also set if |t_u7|
		is not empty, Vim will detect the working of sending |t_RS|
		and |t_RC| on startup.

		When "underline_rgb" is not 'y', then |t_8u| will be made empty.
		This avoids sending it to xterm, which would clear the colors.

		For "mouse" the value 'u' is unknown

		Also see:
		- 'ambiwidth' - detected by using |t_u7|.
		- |v:termstyleresp| and |v:termblinkresp| for the response to
		  |t_RS| and |t_RC|.


test_ functions are documented here: |test-functions-details|


							*timer_info()*
timer_info([{id}])
		Return a list with information about timers.
		When {id} is given only information about this timer is
		returned.  When timer {id} does not exist an empty list is
		returned.
		When {id} is omitted information about all timers is returned.

		For each timer the information is stored in a |Dictionary| with
		these items:
		    "id"	    the timer ID
		    "time"	    time the timer was started with
		    "remaining"	    time until the timer fires
		    "repeat"	    number of times the timer will still fire;
				    -1 means forever
		    "callback"	    the callback
		    "paused"	    1 if the timer is paused, 0 otherwise

		Can also be used as a |method|: >
			GetTimer()->timer_info()

<		{only available when compiled with the |+timers| feature}

timer_pause({timer}, {paused})				*timer_pause()*
		Pause or unpause a timer.  A paused timer does not invoke its
		callback when its time expires.  Unpausing a timer may cause
		the callback to be invoked almost immediately if enough time
		has passed.

		Pausing a timer is useful to avoid the callback to be called
		for a short time.

		If {paused} evaluates to a non-zero Number or a non-empty
		String, then the timer is paused, otherwise it is unpaused.
		See |non-zero-arg|.

		Can also be used as a |method|: >
			GetTimer()->timer_pause(1)

<		{only available when compiled with the |+timers| feature}

						*timer_start()* *timer* *timers*
timer_start({time}, {callback} [, {options}])
		Create a timer and return the timer ID.

		{time} is the waiting time in milliseconds. This is the
		minimum time before invoking the callback.  When the system is
		busy or Vim is not waiting for input the time will be longer.

		{callback} is the function to call.  It can be the name of a
		function or a |Funcref|.  It is called with one argument, which
		is the timer ID.  The callback is only invoked when Vim is
		waiting for input.
		If you want to show a message look at |popup_notification()|
		to avoid interfering with what the user is doing.

		{options} is a dictionary.  Supported entries:
		   "repeat"	Number of times to repeat calling the
				callback.  -1 means forever.  When not present
				the callback will be called once.
				If the timer causes an error three times in a
				row the repeat is cancelled.  This avoids that
				Vim becomes unusable because of all the error
				messages.

		Example: >
			func MyHandler(timer)
			  echo 'Handler called'
			endfunc
			let timer = timer_start(500, 'MyHandler',
				\ {'repeat': 3})
<		This will invoke MyHandler() three times at 500 msec
		intervals.

		Can also be used as a |method|: >
			GetMsec()->timer_start(callback)

<		Not available in the |sandbox|.
		{only available when compiled with the |+timers| feature}

timer_stop({timer})					*timer_stop()*
		Stop a timer.  The timer callback will no longer be invoked.
		{timer} is an ID returned by timer_start(), thus it must be a
		Number.  If {timer} does not exist there is no error.

		Can also be used as a |method|: >
			GetTimer()->timer_stop()

<		{only available when compiled with the |+timers| feature}

timer_stopall()						*timer_stopall()*
		Stop all timers.  The timer callbacks will no longer be
		invoked.  Useful if a timer is misbehaving.  If there are no
		timers there is no error.

		{only available when compiled with the |+timers| feature}

tolower({expr})						*tolower()*
		The result is a copy of the String given, with all uppercase
		characters turned into lowercase (just like applying |gu| to
		the string).

		Can also be used as a |method|: >
			GetText()->tolower()

toupper({expr})						*toupper()*
		The result is a copy of the String given, with all lowercase
		characters turned into uppercase (just like applying |gU| to
		the string).

		Can also be used as a |method|: >
			GetText()->toupper()

tr({src}, {fromstr}, {tostr})				*tr()*
		The result is a copy of the {src} string with all characters
		which appear in {fromstr} replaced by the character in that
		position in the {tostr} string.  Thus the first character in
		{fromstr} is translated into the first character in {tostr}
		and so on.  Exactly like the unix "tr" command.
		This code also deals with multibyte characters properly.

		Examples: >
			echo tr("hello there", "ht", "HT")
<		returns "Hello THere" >
			echo tr("<blob>", "<>", "{}")
<		returns "{blob}"

		Can also be used as a |method|: >
			GetText()->tr(from, to)

trim({text} [, {mask} [, {dir}]])				*trim()*
		Return {text} as a String where any character in {mask} is
		removed from the beginning and/or end of {text}.

		If {mask} is not given, {mask} is all characters up to 0x20,
		which includes Tab, space, NL and CR, plus the non-breaking
		space character 0xa0.

		The optional {dir} argument specifies where to remove the
		characters:
			0	remove from the beginning and end of {text}
			1	remove only at the beginning of {text}
			2	remove only at the end of {text}
		When omitted both ends are trimmed.

		This function deals with multibyte characters properly.

		Examples: >
			echo trim("   some text ")
<		returns "some text" >
			echo trim("  \r\t\t\r RESERVE \t\n\x0B\xA0") . "_TAIL"
<		returns "RESERVE_TAIL" >
			echo trim("rm<Xrm<>X>rrm", "rm<>")
<		returns "Xrm<>X" (characters in the middle are not removed) >
			echo trim("  vim  ", " ", 2)
<		returns "  vim"

		Can also be used as a |method|: >
			GetText()->trim()

trunc({expr})							*trunc()*
		Return the largest integral value with magnitude less than or
		equal to {expr} as a |Float| (truncate towards zero).
		{expr} must evaluate to a |Float| or a |Number|.
		Examples: >
			echo trunc(1.456)
<			1.0  >
			echo trunc(-5.456)
<			-5.0  >
			echo trunc(4.0)
<			4.0

		Can also be used as a |method|: >
			Compute()->trunc()
<
		{only available when compiled with the |+float| feature}

							*type()*
type({expr})	The result is a Number representing the type of {expr}.
		Instead of using the number directly, it is better to use the
		v:t_ variable that has the value:
			Number:	    0  |v:t_number|
			String:	    1  |v:t_string|
			Funcref:    2  |v:t_func|
			List:	    3  |v:t_list|
			Dictionary: 4  |v:t_dict|
			Float:	    5  |v:t_float|
			Boolean:    6  |v:t_bool| (v:false and v:true)
			None:	    7  |v:t_none| (v:null and v:none)
			Job:	    8  |v:t_job|
			Channel:    9  |v:t_channel|
			Blob:	   10  |v:t_blob|
		For backward compatibility, this method can be used: >
			:if type(myvar) == type(0)
			:if type(myvar) == type("")
			:if type(myvar) == type(function("tr"))
			:if type(myvar) == type([])
			:if type(myvar) == type({})
			:if type(myvar) == type(0.0)
			:if type(myvar) == type(v:false)
			:if type(myvar) == type(v:none)
<		To check if the v:t_ variables exist use this: >
			:if exists('v:t_number')

<		Can also be used as a |method|: >
			mylist->type()


typename({expr})					*typename()*
		Return a string representation of the type of {expr}.
		Example: >
			echo typename([1, 2, 3])
			list<number>


undofile({name})					*undofile()*
		Return the name of the undo file that would be used for a file
		with name {name} when writing.  This uses the 'undodir'
		option, finding directories that exist.  It does not check if
		the undo file exists.
		{name} is always expanded to the full path, since that is what
		is used internally.
		If {name} is empty undofile() returns an empty string, since a
		buffer without a file name will not write an undo file.
		Useful in combination with |:wundo| and |:rundo|.
		When compiled without the |+persistent_undo| option this always
		returns an empty string.

		Can also be used as a |method|: >
			GetFilename()->undofile()

undotree()						*undotree()*
		Return the current state of the undo tree in a dictionary with
		the following items:
		  "seq_last"	The highest undo sequence number used.
		  "seq_cur"	The sequence number of the current position in
				the undo tree.  This differs from "seq_last"
				when some changes were undone.
		  "time_cur"	Time last used for |:earlier| and related
				commands.  Use |strftime()| to convert to
				something readable.
		  "save_last"	Number of the last file write.  Zero when no
				write yet.
		  "save_cur"	Number of the current position in the undo
				tree.
		  "synced"	Non-zero when the last undo block was synced.
				This happens when waiting from input from the
				user.  See |undo-blocks|.
		  "entries"	A list of dictionaries with information about
				undo blocks.

		The first item in the "entries" list is the oldest undo item.
		Each List item is a |Dictionary| with these items:
		  "seq"		Undo sequence number.  Same as what appears in
				|:undolist|.
		  "time"	Timestamp when the change happened.  Use
				|strftime()| to convert to something readable.
		  "newhead"	Only appears in the item that is the last one
				that was added.  This marks the last change
				and where further changes will be added.
		  "curhead"	Only appears in the item that is the last one
				that was undone.  This marks the current
				position in the undo tree, the block that will
				be used by a redo command.  When nothing was
				undone after the last change this item will
				not appear anywhere.
		  "save"	Only appears on the last block before a file
				write.  The number is the write count.  The
				first write has number 1, the last one the
				"save_last" mentioned above.
		  "alt"		Alternate entry.  This is again a List of undo
				blocks.  Each item may again have an "alt"
				item.

uniq({list} [, {func} [, {dict}]])			*uniq()* *E882*
		Remove second and succeeding copies of repeated adjacent
		{list} items in-place.  Returns {list}.  If you want a list
		to remain unmodified make a copy first: >
			:let newlist = uniq(copy(mylist))
<		The default compare function uses the string representation of
		each item.  For the use of {func} and {dict} see |sort()|.

		Can also be used as a |method|: >
			mylist->uniq()

values({dict})						*values()*
		Return a |List| with all the values of {dict}.  The |List| is
		in arbitrary order.  Also see |items()| and |keys()|.

		Can also be used as a |method|: >
			mydict->values()

virtcol({expr})						*virtcol()*
		The result is a Number, which is the screen column of the file
		position given with {expr}.  That is, the last screen position
		occupied by the character at that position, when the screen
		would be of unlimited width.  When there is a <Tab> at the
		position, the returned Number will be the column at the end of
		the <Tab>.  For example, for a <Tab> in column 1, with 'ts'
		set to 8, it returns 8. |conceal| is ignored.
		For the byte position use |col()|.
		For the use of {expr} see |col()|.
		When 'virtualedit' is used {expr} can be [lnum, col, off], where
		"off" is the offset in screen columns from the start of the
		character.  E.g., a position within a <Tab> or after the last
		character.  When "off" is omitted zero is used.
		When Virtual editing is active in the current mode, a position
		beyond the end of the line can be returned. |'virtualedit'|
		The accepted positions are:
		    .	    the cursor position
		    $	    the end of the cursor line (the result is the
			    number of displayed characters in the cursor line
			    plus one)
		    'x	    position of mark x (if the mark is not set, 0 is
			    returned)
		    v       In Visual mode: the start of the Visual area (the
			    cursor is the end).  When not in Visual mode
			    returns the cursor position.  Differs from |'<| in
			    that it's updated right away.
		Note that only marks in the current file can be used.
		Examples: >
  virtcol(".")	   with text "foo^Lbar", with cursor on the "^L", returns 5
  virtcol("$")	   with text "foo^Lbar", returns 9
  virtcol("'t")    with text "	  there", with 't at 'h', returns 6
<		The first column is 1.  0 is returned for an error.
		A more advanced example that echoes the maximum length of
		all lines: >
		    echo max(map(range(1, line('$')), "virtcol([v:val, '$'])"))

<		Can also be used as a |method|: >
			GetPos()->virtcol()


visualmode([{expr}])						*visualmode()*
		The result is a String, which describes the last Visual mode
		used in the current buffer.  Initially it returns an empty
		string, but once Visual mode has been used, it returns "v",
		"V", or "<CTRL-V>" (a single CTRL-V character) for
		character-wise, line-wise, or block-wise Visual mode
		respectively.
		Example: >
			:exe "normal " . visualmode()
<		This enters the same Visual mode as before.  It is also useful
		in scripts if you wish to act differently depending on the
		Visual mode that was used.
		If Visual mode is active, use |mode()| to get the Visual mode
		(e.g., in a |:vmap|).
		If {expr} is supplied and it evaluates to a non-zero Number or
		a non-empty String, then the Visual mode will be cleared and
		the old value is returned.  See |non-zero-arg|.

wildmenumode()					*wildmenumode()*
		Returns |TRUE| when the wildmenu is active and |FALSE|
		otherwise.  See 'wildmenu' and 'wildmode'.
		This can be used in mappings to handle the 'wildcharm' option
		gracefully. (Makes only sense with |mapmode-c| mappings).

		For example to make <c-j> work like <down> in wildmode, use: >
    :cnoremap <expr> <C-j> wildmenumode() ? "\<Down>\<Tab>" : "\<c-j>"
<
		(Note, this needs the 'wildcharm' option set appropriately).

win_execute({id}, {command} [, {silent}])		*win_execute()*
		Like `execute()` but in the context of window {id}.
		The window will temporarily be made the current window,
		without triggering autocommands.  When executing {command}
		autocommands will be triggered, this may have unexpected side
		effects.  Use |:noautocmd| if needed.
		Example: >
			call win_execute(winid, 'set syntax=python')
<		Doing the same with `setwinvar()` would not trigger
		autocommands and not actually show syntax highlighting.

							*E994*
		Not all commands are allowed in popup windows.
		When window {id} does not exist then no error is given and
		an empty string is returned.

		Can also be used as a |method|, the base is passed as the
		second argument: >
			GetCommand()->win_execute(winid)

win_findbuf({bufnr})					*win_findbuf()*
		Returns a |List| with |window-ID|s for windows that contain
		buffer {bufnr}.  When there is none the list is empty.

		Can also be used as a |method|: >
			GetBufnr()->win_findbuf()

win_getid([{win} [, {tab}]])				*win_getid()*
		Get the |window-ID| for the specified window.
		When {win} is missing use the current window.
		With {win} this is the window number.  The top window has
		number 1.
		Without {tab} use the current tab, otherwise the tab with
		number {tab}.  The first tab has number one.
		Return zero if the window cannot be found.

		Can also be used as a |method|: >
			GetWinnr()->win_getid()


win_gettype([{nr}])					*win_gettype()*
		Return the type of the window:
			"autocmd"	autocommand window. Temporary window
					used to execute autocommands.
			"popup"		popup window |popup|
			"preview"	preview window |preview-window|
			"command"	command-line window |cmdwin|
			(empty)		normal window
			"unknown"	window {nr} not found

		When {nr} is omitted return the type of the current window.
		When {nr} is given return the type of this window by number or
		|window-ID|.

		Also see the 'buftype' option.  When running a terminal in a
		popup window then 'buftype' is "terminal" and win_gettype()
		returns "popup".


win_gotoid({expr})					*win_gotoid()*
		Go to window with ID {expr}.  This may also change the current
		tabpage.
		Return 1 if successful, 0 if the window cannot be found.

		Can also be used as a |method|: >
			GetWinid()->win_gotoid()

win_id2tabwin({expr})					*win_id2tabwin()*
		Return a list with the tab number and window number of window
		with ID {expr}: [tabnr, winnr].
		Return [0, 0] if the window cannot be found.

		Can also be used as a |method|: >
			GetWinid()->win_id2tabwin()

win_id2win({expr})					*win_id2win()*
		Return the window number of window with ID {expr}.
		Return 0 if the window cannot be found in the current tabpage.

		Can also be used as a |method|: >
			GetWinid()->win_id2win()

win_screenpos({nr})					*win_screenpos()*
		Return the screen position of window {nr} as a list with two
		numbers: [row, col].  The first window always has position
		[1, 1], unless there is a tabline, then it is [2, 1].
		{nr} can be the window number or the |window-ID|.  Use zero
		for the current window.
		Return [0, 0] if the window cannot be found in the current
		tabpage.

		Can also be used as a |method|: >
			GetWinid()->win_screenpos()
<
win_splitmove({nr}, {target} [, {options}])		*win_splitmove()*
		Move the window {nr} to a new split of the window {target}.
		This is similar to moving to {target}, creating a new window
		using |:split| but having the same contents as window {nr}, and
		then closing {nr}.

		Both {nr} and {target} can be window numbers or |window-ID|s.
		Both must be in the current tab page.

		Returns zero for success, non-zero for failure.

		{options} is a |Dictionary| with the following optional entries:
		  "vertical"	When TRUE, the split is created vertically,
				like with |:vsplit|.
		  "rightbelow"	When TRUE, the split is made below or to the
				right (if vertical).  When FALSE, it is done
				above or to the left (if vertical).  When not
				present, the values of 'splitbelow' and
				'splitright' are used.

		Can also be used as a |method|: >
			GetWinid()->win_splitmove(target)
<

							*winbufnr()*
winbufnr({nr})	The result is a Number, which is the number of the buffer
		associated with window {nr}.  {nr} can be the window number or
		the |window-ID|.
		When {nr} is zero, the number of the buffer in the current
		window is returned.
		When window {nr} doesn't exist, -1 is returned.
		Example: >
  :echo "The file in the current window is " . bufname(winbufnr(0))
<
		Can also be used as a |method|: >
			FindWindow()->winbufnr()->bufname()
<
							*wincol()*
wincol()	The result is a Number, which is the virtual column of the
		cursor in the window.  This is counting screen cells from the
		left side of the window.  The leftmost column is one.

							*windowsversion()*
windowsversion()
		The result is a String.  For MS-Windows it indicates the OS
		version.  E.g, Windows 10 is "10.0", Windows 8 is "6.2",
		Windows XP is "5.1".  For non-MS-Windows systems the result is
		an empty string.

winheight({nr})						*winheight()*
		The result is a Number, which is the height of window {nr}.
		{nr} can be the window number or the |window-ID|.
		When {nr} is zero, the height of the current window is
		returned.  When window {nr} doesn't exist, -1 is returned.
		An existing window always has a height of zero or more.
		This excludes any window toolbar line.
		Examples: >
  :echo "The current window has " . winheight(0) . " lines."

<		Can also be used as a |method|: >
			GetWinid()->winheight()
<
winlayout([{tabnr}])					*winlayout()*
		The result is a nested List containing the layout of windows
		in a tabpage.

		Without {tabnr} use the current tabpage, otherwise the tabpage
		with number {tabnr}. If the tabpage {tabnr} is not found,
		returns an empty list.

		For a leaf window, it returns:
			['leaf', {winid}]
		For horizontally split windows, which form a column, it
		returns:
			['col', [{nested list of windows}]]
		For vertically split windows, which form a row, it returns:
			['row', [{nested list of windows}]]

		Example: >
			" Only one window in the tab page
			:echo winlayout()
			['leaf', 1000]
			" Two horizontally split windows
			:echo winlayout()
			['col', [['leaf', 1000], ['leaf', 1001]]]
			" The second tab page, with three horizontally split
			" windows, with two vertically split windows in the
			" middle window
			:echo winlayout(2)
			['col', [['leaf', 1002], ['row', [['leaf', 1003],
					    ['leaf', 1001]]], ['leaf', 1000]]]
<
		Can also be used as a |method|: >
			GetTabnr()->winlayout()
<
							*winline()*
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
		the window.  The first line is one.
		If the cursor was moved the view on the file will be updated
		first, this may cause a scroll.

							*winnr()*
winnr([{arg}])	The result is a Number, which is the number of the current
		window.  The top window has number 1.
		Returns zero for a popup window.

		The optional argument {arg} supports the following values:
			$	the number of the last window (the window
				count).
			#	the number of the last accessed window (where
				|CTRL-W_p| goes to).  If there is no previous
				window or it is in another tab page 0 is
				returned.
			{N}j	the number of the Nth window below the
				current window (where |CTRL-W_j| goes to).
			{N}k	the number of the Nth window above the current
				window (where |CTRL-W_k| goes to).
			{N}h	the number of the Nth window left of the
				current window (where |CTRL-W_h| goes to).
			{N}l	the number of the Nth window right of the
				current window (where |CTRL-W_l| goes to).
		The number can be used with |CTRL-W_w| and ":wincmd w"
		|:wincmd|.
		Also see |tabpagewinnr()| and |win_getid()|.
		Examples: >
			let window_count = winnr('$')
			let prev_window = winnr('#')
			let wnum = winnr('3k')

<		Can also be used as a |method|: >
			GetWinval()->winnr()
<
							*winrestcmd()*
winrestcmd()	Returns a sequence of |:resize| commands that should restore
		the current window sizes.  Only works properly when no windows
		are opened or closed and the current window and tab page is
		unchanged.
		Example: >
			:let cmd = winrestcmd()
			:call MessWithWindowSizes()
			:exe cmd
<
							*winrestview()*
winrestview({dict})
		Uses the |Dictionary| returned by |winsaveview()| to restore
		the view of the current window.
		Note: The {dict} does not have to contain all values, that are
		returned by |winsaveview()|. If values are missing, those
		settings won't be restored. So you can use: >
		    :call winrestview({'curswant': 4})
<
		This will only set the curswant value (the column the cursor
		wants to move on vertical movements) of the cursor to column 5
		(yes, that is 5), while all other settings will remain the
		same. This is useful, if you set the cursor position manually.

		If you have changed the values the result is unpredictable.
		If the window size changed the result won't be the same.

		Can also be used as a |method|: >
			GetView()->winrestview()
<
							*winsaveview()*
winsaveview()	Returns a |Dictionary| that contains information to restore
		the view of the current window.  Use |winrestview()| to
		restore the view.
		This is useful if you have a mapping that jumps around in the
		buffer and you want to go back to the original view.
		This does not save fold information.  Use the 'foldenable'
		option to temporarily switch off folding, so that folds are
		not opened when moving around. This may have side effects.
		The return value includes:
			lnum		cursor line number
			col		cursor column (Note: the first column
					zero, as opposed to what getpos()
					returns)
			coladd		cursor column offset for 'virtualedit'
			curswant	column for vertical movement
			topline		first line in the window
			topfill		filler lines, only in diff mode
			leftcol		first column displayed; only used when
					'wrap' is off
			skipcol		columns skipped
		Note that no option values are saved.


winwidth({nr})						*winwidth()*
		The result is a Number, which is the width of window {nr}.
		{nr} can be the window number or the |window-ID|.
		When {nr} is zero, the width of the current window is
		returned.  When window {nr} doesn't exist, -1 is returned.
		An existing window always has a width of zero or more.
		Examples: >
  :echo "The current window has " . winwidth(0) . " columns."
  :if winwidth(0) <= 50
  :  50 wincmd |
  :endif
<		For getting the terminal or screen size, see the 'columns'
		option.

		Can also be used as a |method|: >
			GetWinid()->winwidth()


wordcount()						*wordcount()*
		The result is a dictionary of byte/chars/word statistics for
		the current buffer.  This is the same info as provided by
		|g_CTRL-G|
		The return value includes:
			bytes		Number of bytes in the buffer
			chars		Number of chars in the buffer
			words		Number of words in the buffer
			cursor_bytes    Number of bytes before cursor position
					(not in Visual mode)
			cursor_chars    Number of chars before cursor position
					(not in Visual mode)
			cursor_words    Number of words before cursor position
					(not in Visual mode)
			visual_bytes    Number of bytes visually selected
					(only in Visual mode)
			visual_chars    Number of chars visually selected
					(only in Visual mode)
			visual_words    Number of words visually selected
					(only in Visual mode)


							*writefile()*
writefile({object}, {fname} [, {flags}])
		When {object} is a |List| write it to file {fname}.  Each list
		item is separated with a NL.  Each list item must be a String
		or Number.
		When {flags} contains "b" then binary mode is used: There will
		not be a NL after the last list item.  An empty item at the
		end does cause the last line in the file to end in a NL.

		When {object} is a |Blob| write the bytes to file {fname}
		unmodified.

		When {flags} contains "a" then append mode is used, lines are
		appended to the file: >
			:call writefile(["foo"], "event.log", "a")
			:call writefile(["bar"], "event.log", "a")
<
		When {flags} contains "s" then fsync() is called after writing
		the file.  This flushes the file to disk, if possible.  This
		takes more time but avoids losing the file if the system
		crashes.
		When {flags} does not contain "S" or "s" then fsync() is
		called if the 'fsync' option is set.
		When {flags} contains "S" then fsync() is not called, even
		when 'fsync' is set.

		All NL characters are replaced with a NUL character.
		Inserting CR characters needs to be done before passing {list}
		to writefile().
		An existing file is overwritten, if possible.
		When the write fails -1 is returned, otherwise 0.  There is an
		error message if the file can't be created or when writing
		fails.
		Also see |readfile()|.
		To copy a file byte for byte: >
			:let fl = readfile("foo", "b")
			:call writefile(fl, "foocopy", "b")

<		Can also be used as a |method|: >
			GetText()->writefile("thefile")


xor({expr}, {expr})					*xor()*
		Bitwise XOR on the two arguments.  The arguments are converted
		to a number.  A List, Dict or Float argument causes an error.
		Example: >
			:let bits = xor(bits, 0x80)
<
		Can also be used as a |method|: >
			:let bits = bits->xor(0x80)
<

							*feature-list*
There are three types of features:
1.  Features that are only supported when they have been enabled when Vim
    was compiled |+feature-list|.  Example: >
	:if has("cindent")
2.  Features that are only supported when certain conditions have been met.
    Example: >
	:if has("gui_running")
<							*has-patch*
3.  Beyond a certain version or at a certain version and including a specific
    patch.  The "patch-7.4.248" feature means that the Vim version is 7.5 or
    later, or it is version 7.4 and patch 248 was included.  Example: >
	:if has("patch-7.4.248")
<    Note that it's possible for patch 248 to be omitted even though 249 is
    included.  Only happens when cherry-picking patches.
    Note that this form only works for patch 7.4.237 and later, before that
    you need to check for the patch and the  v:version.  Example (checking
    version 6.2.148 or later): >
	:if v:version > 602 || (v:version == 602 && has("patch148"))

Hint: To find out if Vim supports backslashes in a file name (MS-Windows),
use: `if exists('+shellslash')`


acl			Compiled with |ACL| support.
all_builtin_terms	Compiled with all builtin terminals enabled.
amiga			Amiga version of Vim.
arabic			Compiled with Arabic support |Arabic|.
arp			Compiled with ARP support (Amiga).
autocmd			Compiled with autocommand support. (always true)
autochdir		Compiled with support for 'autochdir'
autoservername		Automatically enable |clientserver|
balloon_eval		Compiled with |balloon-eval| support.
balloon_multiline	GUI supports multiline balloons.
beos			BeOS version of Vim.
browse			Compiled with |:browse| support, and browse() will
			work.
browsefilter		Compiled with support for |browsefilter|.
bsd			Compiled on an OS in the BSD family (excluding macOS).
builtin_terms		Compiled with some builtin terminals.
byte_offset		Compiled with support for 'o' in 'statusline'
channel			Compiled with support for |channel| and |job|
cindent			Compiled with 'cindent' support.
clientserver		Compiled with remote invocation support |clientserver|.
clipboard		Compiled with 'clipboard' support.
clipboard_working	Compiled with 'clipboard' support and it can be used.
cmdline_compl		Compiled with |cmdline-completion| support.
cmdline_hist		Compiled with |cmdline-history| support.
cmdline_info		Compiled with 'showcmd' and 'ruler' support.
comments		Compiled with |'comments'| support.
compatible		Compiled to be very Vi compatible.
conpty			Platform where |ConPTY| can be used.
cryptv			Compiled with encryption support |encryption|.
cscope			Compiled with |cscope| support.
cursorbind		Compiled with |'cursorbind'| (always true)
debug			Compiled with "DEBUG" defined.
dialog_con		Compiled with console dialog support.
dialog_gui		Compiled with GUI dialog support.
diff			Compiled with |vimdiff| and 'diff' support.
digraphs		Compiled with support for digraphs.
directx			Compiled with support for DirectX and 'renderoptions'.
dnd			Compiled with support for the "~ register |quote_~|.
ebcdic			Compiled on a machine with ebcdic character set.
emacs_tags		Compiled with support for Emacs tags.
eval			Compiled with expression evaluation support.  Always
			true, of course!
ex_extra		|+ex_extra| (always true)
extra_search		Compiled with support for |'incsearch'| and
			|'hlsearch'|
farsi			Support for Farsi was removed |farsi|.
file_in_path		Compiled with support for |gf| and |<cfile>|
filterpipe		When 'shelltemp' is off pipes are used for shell
			read/write/filter commands
find_in_path		Compiled with support for include file searches
			|+find_in_path|.
float			Compiled with support for |Float|.
fname_case		Case in file names matters (for Amiga and MS-Windows
			this is not present).
folding			Compiled with |folding| support.
footer			Compiled with GUI footer support. |gui-footer|
fork			Compiled to use fork()/exec() instead of system().
gettext			Compiled with message translation |multi-lang|
gui			Compiled with GUI enabled.
gui_athena		Compiled with Athena GUI.
gui_gnome		Compiled with Gnome support (gui_gtk is also defined).
gui_gtk			Compiled with GTK+ GUI (any version).
gui_gtk2		Compiled with GTK+ 2 GUI (gui_gtk is also defined).
gui_gtk3		Compiled with GTK+ 3 GUI (gui_gtk is also defined).
gui_haiku		Compiled with Haiku GUI.
gui_mac			Compiled with Macintosh GUI.
gui_motif		Compiled with Motif GUI.
gui_photon		Compiled with Photon GUI.
gui_running		Vim is running in the GUI, or it will start soon.
gui_win32		Compiled with MS Windows Win32 GUI.
gui_win32s		idem, and Win32s system being used (Windows 3.1)
haiku			Haiku version of Vim.
hangul_input		Compiled with Hangul input support. |hangul|
hpux			HP-UX version of Vim.
iconv			Can use iconv() for conversion.
insert_expand		Compiled with support for CTRL-X expansion commands in
			Insert mode. (always true)
job			Compiled with support for |channel| and |job|
ipv6			Compiled with support for IPv6 networking in |channel|.
jumplist		Compiled with |jumplist| support.
keymap			Compiled with 'keymap' support.
lambda			Compiled with |lambda| support.
langmap			Compiled with 'langmap' support.
libcall			Compiled with |libcall()| support.
linebreak		Compiled with 'linebreak', 'breakat', 'showbreak' and
			'breakindent' support.
linux			Linux version of Vim.
lispindent		Compiled with support for lisp indenting.
listcmds		Compiled with commands for the buffer list |:files|
			and the argument list |arglist|.
localmap		Compiled with local mappings and abbr. |:map-local|
lua			Compiled with Lua interface |Lua|.
mac			Any Macintosh version of Vim  cf. osx
macunix			Synonym for osxdarwin
menu			Compiled with support for |:menu|.
mksession		Compiled with support for |:mksession|.
modify_fname		Compiled with file name modifiers. |filename-modifiers|
			(always true)
mouse			Compiled with support for mouse.
mouse_dec		Compiled with support for Dec terminal mouse.
mouse_gpm		Compiled with support for gpm (Linux console mouse)
mouse_gpm_enabled	GPM mouse is working
mouse_netterm		Compiled with support for netterm mouse.
mouse_pterm		Compiled with support for qnx pterm mouse.
mouse_sysmouse		Compiled with support for sysmouse (*BSD console mouse)
mouse_sgr		Compiled with support for sgr mouse.
mouse_urxvt		Compiled with support for urxvt mouse.
mouse_xterm		Compiled with support for xterm mouse.
mouseshape		Compiled with support for 'mouseshape'.
multi_byte		Compiled with support for 'encoding' (always true)
multi_byte_encoding	'encoding' is set to a multibyte encoding.
multi_byte_ime		Compiled with support for IME input method.
multi_lang		Compiled with support for multiple languages.
mzscheme		Compiled with MzScheme interface |mzscheme|.
netbeans_enabled	Compiled with support for |netbeans| and connected.
netbeans_intg		Compiled with support for |netbeans|.
num64			Compiled with 64-bit |Number| support.
ole			Compiled with OLE automation support for Win32.
osx			Compiled for macOS  cf. mac
osxdarwin		Compiled for macOS, with |mac-darwin-feature|
packages		Compiled with |packages| support.
path_extra		Compiled with up/downwards search in 'path' and 'tags'
perl			Compiled with Perl interface.
persistent_undo		Compiled with support for persistent undo history.
postscript		Compiled with PostScript file printing.
printer			Compiled with |:hardcopy| support.
profile			Compiled with |:profile| support.
python			Python 2.x interface available. |has-python|
python_compiled		Compiled with Python 2.x interface. |has-python|
python_dynamic		Python 2.x interface is dynamically loaded. |has-python|
python3			Python 3.x interface available. |has-python|
python3_compiled	Compiled with Python 3.x interface. |has-python|
python3_dynamic		Python 3.x interface is dynamically loaded. |has-python|
pythonx			Python 2.x and/or 3.x interface available. |python_x|
qnx			QNX version of Vim.
quickfix		Compiled with |quickfix| support.
reltime			Compiled with |reltime()| support.
rightleft		Compiled with 'rightleft' support.
ruby			Compiled with Ruby interface |ruby|.
scrollbind		Compiled with 'scrollbind' support. (always true)
showcmd			Compiled with 'showcmd' support.
signs			Compiled with |:sign| support.
smartindent		Compiled with 'smartindent' support.
sound			Compiled with sound support, e.g. `sound_playevent()`
spell			Compiled with spell checking support |spell|.
startuptime		Compiled with |--startuptime| support.
statusline		Compiled with support for 'statusline', 'rulerformat'
			and special formats of 'titlestring' and 'iconstring'.
sun			SunOS version of Vim.
sun_workshop		Support for Sun |workshop| has been removed.
syntax			Compiled with syntax highlighting support |syntax|.
syntax_items		There are active syntax highlighting items for the
			current buffer.
system			Compiled to use system() instead of fork()/exec().
tag_binary		Compiled with binary searching in tags files
			|tag-binary-search|.
tag_old_static		Support for old static tags was removed, see
			|tag-old-static|.
tcl			Compiled with Tcl interface.
termguicolors		Compiled with true color in terminal support.
terminal		Compiled with |terminal| support.
terminfo		Compiled with terminfo instead of termcap.
termresponse		Compiled with support for |t_RV| and |v:termresponse|.
textobjects		Compiled with support for |text-objects|.
textprop		Compiled with support for |text-properties|.
tgetent			Compiled with tgetent support, able to use a termcap
			or terminfo file.
timers			Compiled with |timer_start()| support.
title			Compiled with window title support |'title'|.
toolbar			Compiled with support for |gui-toolbar|.
ttyin			input is a terminal (tty)
ttyout			output is a terminal (tty)
unix			Unix version of Vim. *+unix*
unnamedplus		Compiled with support for "unnamedplus" in 'clipboard'
user_commands		User-defined commands. (always true)
vartabs			Compiled with variable tabstop support |'vartabstop'|.
vcon			Win32: Virtual console support is working, can use
			'termguicolors'. Also see |+vtp|.
vertsplit		Compiled with vertically split windows |:vsplit|.
			(always true)
vim_starting		True while initial source'ing takes place. |startup|
			*vim_starting*
viminfo			Compiled with viminfo support.
vimscript-1		Compiled Vim script version 1 support
vimscript-2		Compiled Vim script version 2 support
vimscript-3		Compiled Vim script version 3 support
virtualedit		Compiled with 'virtualedit' option. (always true)
visual			Compiled with Visual mode. (always true)
visualextra		Compiled with extra Visual mode commands. (always
			true) |blockwise-operators|.
vms			VMS version of Vim.
vreplace		Compiled with |gR| and |gr| commands. (always true)
vtp			Compiled for vcon support |+vtp| (check vcon to find
			out if it works in the current console).
wildignore		Compiled with 'wildignore' option.
wildmenu		Compiled with 'wildmenu' option.
win16			old version for MS-Windows 3.1 (always false)
win32			Win32 version of Vim (MS-Windows 95 and later, 32 or
			64 bits)
win32unix		Win32 version of Vim, using Unix files (Cygwin)
win64			Win64 version of Vim (MS-Windows 64 bit).
win95			Win32 version for MS-Windows 95/98/ME (always false)
winaltkeys		Compiled with 'winaltkeys' option.
windows			Compiled with support for more than one window.
			(always true)
writebackup		Compiled with 'writebackup' default on.
xfontset		Compiled with X fontset support |xfontset|.
xim			Compiled with X input method support |xim|.
xpm			Compiled with pixmap support.
xpm_w32			Compiled with pixmap support for Win32. (Only for
			backward compatibility. Use "xpm" instead.)
xsmp			Compiled with X session management support.
xsmp_interact		Compiled with interactive X session management support.
xterm_clipboard		Compiled with support for xterm clipboard.
xterm_save		Compiled with support for saving and restoring the
			xterm screen.
x11			Compiled with X11 support.

							*string-match*
Matching a pattern in a String

A regexp pattern as explained at |pattern| is normally used to find a match in
the buffer lines.  When a pattern is used to find a match in a String, almost
everything works in the same way.  The difference is that a String is handled
like it is one line.  When it contains a "\n" character, this is not seen as a
line break for the pattern.  It can be matched with a "\n" in the pattern, or
with ".".  Example: >
	:let a = "aaaa\nxxxx"
	:echo matchstr(a, "..\n..")
	aa
	xx
	:echo matchstr(a, "a.x")
	a
	x

Don't forget that "^" will only match at the first character of the String and
"$" at the last character of the string.  They don't match after or before a
"\n".

==============================================================================
5. Defining functions					*user-functions*

New functions can be defined.  These can be called just like builtin
functions.  The function executes a sequence of Ex commands.  Normal mode
commands can be executed with the |:normal| command.

This section is about the legacy functions. For the Vim9 functions, which
execute much faster, support type checking and more, see |vim9.txt|.

The function name must start with an uppercase letter, to avoid confusion with
builtin functions.  To prevent from using the same name in different scripts
avoid obvious, short names.  A good habit is to start the function name with
the name of the script, e.g., "HTMLcolor()".

It's also possible to use curly braces, see |curly-braces-names|.  And the
|autoload| facility is useful to define a function only when it's called.

							*local-function*
A function local to a script must start with "s:".  A local script function
can only be called from within the script and from functions, user commands
and autocommands defined in the script.  It is also possible to call the
function from a mapping defined in the script, but then |<SID>| must be used
instead of "s:" when the mapping is expanded outside of the script.
There are only script-local functions, no buffer-local or window-local
functions.

					*:fu* *:function* *E128* *E129* *E123*
:fu[nction]		List all functions and their arguments.

:fu[nction] {name}	List function {name}.
			{name} can also be a |Dictionary| entry that is a
			|Funcref|: >
				:function dict.init

:fu[nction] /{pattern}	List functions with a name matching {pattern}.
			Example that lists all functions ending with "File": >
				:function /File$
<
							*:function-verbose*
When 'verbose' is non-zero, listing a function will also display where it was
last defined. Example: >

    :verbose function SetFileTypeSH
	function SetFileTypeSH(name)
	    Last set from /usr/share/vim/vim-7.0/filetype.vim
<
See |:verbose-cmd| for more information.

						*E124* *E125* *E853* *E884*
:fu[nction][!] {name}([arguments]) [range] [abort] [dict] [closure]
			Define a new function by the name {name}.  The body of
			the function follows in the next lines, until the
			matching |:endfunction|.

			The name must be made of alphanumeric characters and
			'_', and must start with a capital or "s:" (see
			above).  Note that using "b:" or "g:" is not allowed.
			(since patch 7.4.260 E884 is given if the function
			name has a colon in the name, e.g. for "foo:bar()".
			Before that patch no error was given).

			{name} can also be a |Dictionary| entry that is a
			|Funcref|: >
				:function dict.init(arg)
<			"dict" must be an existing dictionary.  The entry
			"init" is added if it didn't exist yet.  Otherwise [!]
			is required to overwrite an existing function.  The
			result is a |Funcref| to a numbered function.  The
			function can only be used with a |Funcref| and will be
			deleted if there are no more references to it.
								*E127* *E122*
			When a function by this name already exists and [!] is
			not used an error message is given.  There is one
			exception: When sourcing a script again, a function
			that was previously defined in that script will be
			silently replaced.
			When [!] is used, an existing function is silently
			replaced.  Unless it is currently being executed, that
			is an error.
			NOTE: Use ! wisely.  If used without care it can cause
			an existing function to be replaced unexpectedly,
			which is hard to debug.
			NOTE: In Vim9 script script-local functions cannot be
			deleted or redefined.

			For the {arguments} see |function-argument|.

					*:func-range* *a:firstline* *a:lastline*
			When the [range] argument is added, the function is
			expected to take care of a range itself.  The range is
			passed as "a:firstline" and "a:lastline".  If [range]
			is excluded, ":{range}call" will call the function for
			each line in the range, with the cursor on the start
			of each line.  See |function-range-example|.
			The cursor is still moved to the first line of the
			range, as is the case with all Ex commands.
								*:func-abort*
			When the [abort] argument is added, the function will
			abort as soon as an error is detected.
								*:func-dict*
			When the [dict] argument is added, the function must
			be invoked through an entry in a |Dictionary|.  The
			local variable "self" will then be set to the
			dictionary.  See |Dictionary-function|.
						*:func-closure* *E932*
			When the [closure] argument is added, the function
			can access variables and arguments from the outer
			scope.  This is usually called a closure.  In this
			example Bar() uses "x" from the scope of Foo().  It
			remains referenced even after Foo() returns: >
				:function! Foo()
				:  let x = 0
				:  function! Bar() closure
				:    let x += 1
				:    return x
				:  endfunction
				:  return funcref('Bar')
				:endfunction

				:let F = Foo()
				:echo F()
<				1 >
				:echo F()
<				2 >
				:echo F()
<				3

						*function-search-undo*
			The last used search pattern and the redo command "."
			will not be changed by the function.  This also
			implies that the effect of |:nohlsearch| is undone
			when the function returns.

				*:endf* *:endfunction* *E126* *E193* *W22*
:endf[unction] [argument]
			The end of a function definition.  Best is to put it
			on a line by its own, without [argument].

			[argument] can be:
				| command	command to execute next
				\n command	command to execute next
				" comment	always ignored
				anything else	ignored, warning given when
						'verbose' is non-zero
			The support for a following command was added in Vim
			8.0.0654, before that any argument was silently
			ignored.

			To be able to define a function inside an `:execute`
			command, use line breaks instead of |:bar|: >
				:exe "func Foo()\necho 'foo'\nendfunc"
<
				*:delf* *:delfunction* *E130* *E131* *E933*
:delf[unction][!] {name}
			Delete function {name}.
			{name} can also be a |Dictionary| entry that is a
			|Funcref|: >
				:delfunc dict.init
<			This will remove the "init" entry from "dict".  The
			function is deleted if there are no more references to
			it.
			With the ! there is no error if the function does not
			exist.
							*:retu* *:return* *E133*
:retu[rn] [expr]	Return from a function.  When "[expr]" is given, it is
			evaluated and returned as the result of the function.
			If "[expr]" is not given, the number 0 is returned.
			When a function ends without an explicit ":return",
			the number 0 is returned.
			Note that there is no check for unreachable lines,
			thus there is no warning if commands follow ":return".

			If the ":return" is used after a |:try| but before the
			matching |:finally| (if present), the commands
			following the ":finally" up to the matching |:endtry|
			are executed first.  This process applies to all
			nested ":try"s inside the function.  The function
			returns at the outermost ":endtry".

						*function-argument* *a:var*
An argument can be defined by giving its name.  In the function this can then
be used as "a:name" ("a:" for argument).
					*a:0* *a:1* *a:000* *E740* *...*
Up to 20 arguments can be given, separated by commas.  After the named
arguments an argument "..." can be specified, which means that more arguments
may optionally be following.  In the function the extra arguments can be used
as "a:1", "a:2", etc.  "a:0" is set to the number of extra arguments (which
can be 0).  "a:000" is set to a |List| that contains these arguments.  Note
that "a:1" is the same as "a:000[0]".
								*E742*
The a: scope and the variables in it cannot be changed, they are fixed.
However, if a composite type is used, such as |List| or |Dictionary| , you can
change their contents.  Thus you can pass a |List| to a function and have the
function add an item to it.  If you want to make sure the function cannot
change a |List| or |Dictionary| use |:lockvar|.

It is also possible to define a function without any arguments.  You must
still supply the () then.

It is allowed to define another function inside a function body.

						*optional-function-argument*
You can provide default values for positional named arguments.  This makes
them optional for function calls.  When a positional argument is not
specified at a call, the default expression is used to initialize it.
This only works for functions declared with `:function` or `:def`, not for
lambda expressions |expr-lambda|.

Example: >
  function Something(key, value = 10)
     echo a:key .. ": " .. a:value
  endfunction
  call Something('empty')	"empty: 10"
  call Something('key', 20)	"key: 20"

The argument default expressions are evaluated at the time of the function
call, not definition.  Thus it is possible to use an expression which is
invalid the moment the function is defined.  The expressions are also only
evaluated when arguments are not specified during a call.
						*none-function_argument*
You can pass |v:none| to use the default expression.  Note that this means you
cannot pass v:none as an ordinary value when an argument has a default
expression.

Example: >
  function Something(a = 10, b = 20, c = 30)
  endfunction
  call Something(1, v:none, 3)	    " b = 20
<
								*E989*
Optional arguments with default expressions must occur after any mandatory
arguments.  You can use "..." after all optional named arguments.

It is possible for later argument defaults to refer to prior arguments,
but not the other way around.  They must be prefixed with "a:", as with all
arguments.

Example that works: >
  :function Okay(mandatory, optional = a:mandatory)
  :endfunction
Example that does NOT work: >
  :function NoGood(first = a:second, second = 10)
  :endfunction
<
When not using "...", the number of arguments in a function call must be at
least equal to the number of mandatory named arguments.  When using "...", the
number of arguments may be larger than the total of mandatory and optional
arguments.

							*local-variables*
Inside a function local variables can be used.  These will disappear when the
function returns.  Global variables need to be accessed with "g:".

Example: >
  :function Table(title, ...)
  :  echohl Title
  :  echo a:title
  :  echohl None
  :  echo a:0 . " items:"
  :  for s in a:000
  :    echon ' ' . s
  :  endfor
  :endfunction

This function can then be called with: >
  call Table("Table", "line1", "line2")
  call Table("Empty Table")

To return more than one value, return a |List|: >
  :function Compute(n1, n2)
  :  if a:n2 == 0
  :    return ["fail", 0]
  :  endif
  :  return ["ok", a:n1 / a:n2]
  :endfunction

This function can then be called with: >
  :let [success, div] = Compute(102, 6)
  :if success == "ok"
  :  echo div
  :endif
<
						*:cal* *:call* *E107* *E117*
:[range]cal[l] {name}([arguments])
		Call a function.  The name of the function and its arguments
		are as specified with `:function`.  Up to 20 arguments can be
		used.  The returned value is discarded.
		Without a range and for functions that accept a range, the
		function is called once.  When a range is given the cursor is
		positioned at the start of the first line before executing the
		function.
		When a range is given and the function doesn't handle it
		itself, the function is executed for each line in the range,
		with the cursor in the first column of that line.  The cursor
		is left at the last line (possibly moved by the last function
		call).  The arguments are re-evaluated for each line.  Thus
		this works:
						*function-range-example*  >
	:function Mynumber(arg)
	:  echo line(".") . " " . a:arg
	:endfunction
	:1,5call Mynumber(getline("."))
<
		The "a:firstline" and "a:lastline" are defined anyway, they
		can be used to do something different at the start or end of
		the range.

		Example of a function that handles the range itself: >

	:function Cont() range
	:  execute (a:firstline + 1) . "," . a:lastline . 's/^/\t\\ '
	:endfunction
	:4,8call Cont()
<
		This function inserts the continuation character "\" in front
		of all the lines in the range, except the first one.

		When the function returns a composite value it can be further
		dereferenced, but the range will not be used then.  Example: >
	:4,8call GetDict().method()
<		Here GetDict() gets the range but method() does not.

								*E132*
The recursiveness of user functions is restricted with the |'maxfuncdepth'|
option.

It is also possible to use `:eval`.  It does not support a range, but does
allow for method chaining, e.g.: >
	eval GetList()->Filter()->append('$')

A function can also be called as part of evaluating an expression or when it
is used as a method: >
	let x = GetList()
	let y = GetList()->Filter()


AUTOMATICALLY LOADING FUNCTIONS ~
							*autoload-functions*
When using many or large functions, it's possible to automatically define them
only when they are used.  There are two methods: with an autocommand and with
the "autoload" directory in 'runtimepath'.


Using an autocommand ~

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.
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
again, setting a variable to skip the `:finish` command.

Use the FuncUndefined autocommand event with a pattern that matches the
function(s) to be defined.  Example: >

	:au FuncUndefined BufNet* source ~/vim/bufnetfuncs.vim

The file "~/vim/bufnetfuncs.vim" should then define functions that start with
"BufNet".  Also see |FuncUndefined|.


Using an autoload script ~
							*autoload* *E746*
This is introduced in the user manual, section |41.15|.

Using a script in the "autoload" directory is simpler, but requires using
exactly the right file name.  A function that can be autoloaded has a name
like this: >

	:call filename#funcname()

These functions are always global, in Vim9 script "g:" needs to be used: >
	:call g:filename#funcname()

When such a function is called, and it is not defined yet, Vim will search the
"autoload" directories in 'runtimepath' for a script file called
"filename.vim".  For example "~/.vim/autoload/filename.vim".  That file should
then define the function like this: >

	function filename#funcname()
	   echo "Done!"
	endfunction

The file name and the name used before the # in the function must match
exactly, and the defined function must have the name exactly as it will be
called.  In Vim9 script the "g:" prefix must be used: >
	function g:filename#funcname()

or for a compiled function: >
	def g:filename#funcname()

It is possible to use subdirectories.  Every # in the function name works like
a path separator.  Thus when calling a function: >

	:call foo#bar#func()

Vim will look for the file "autoload/foo/bar.vim" in 'runtimepath'.

This also works when reading a variable that has not been set yet: >

	:let l = foo#bar#lvar

However, when the autoload script was already loaded it won't be loaded again
for an unknown variable.

When assigning a value to such a variable nothing special happens.  This can
be used to pass settings to the autoload script before it's loaded: >

	:let foo#bar#toggle = 1
	:call foo#bar#func()

Note that when you make a mistake and call a function that is supposed to be
defined in an autoload script, but the script doesn't actually define the
function, you will get an error message for the missing function.  If you fix
the autoload script it won't be automatically loaded again.  Either restart
Vim or manually source the script.

Also note that if you have two script files, and one calls a function in the
other and vice versa, before the used function is defined, it won't work.
Avoid using the autoload functionality at the toplevel.

Hint: If you distribute a bunch of scripts you can pack them together with the
|vimball| utility.  Also read the user manual |distribute-script|.

==============================================================================
6. Curly braces names					*curly-braces-names*

In most places where you can use a variable, you can use a "curly braces name"
variable.  This is a regular variable name with one or more expressions
wrapped in braces {} like this: >
	my_{adjective}_variable

When Vim encounters this, it evaluates the expression inside the braces, puts
that in place of the expression, and re-interprets the whole as a variable
name.  So in the above example, if the variable "adjective" was set to
"noisy", then the reference would be to "my_noisy_variable", whereas if
"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
value.  For example, the statement >
	echo my_{&background}_message

would output the contents of "my_dark_message" or "my_light_message" depending
on the current value of 'background'.

You can use multiple brace pairs: >
	echo my_{adverb}_{adjective}_message
..or even nest them: >
	echo my_{ad{end_of_word}}_message
where "end_of_word" is either "verb" or "jective".

However, the expression inside the braces must evaluate to a valid single
variable name, e.g. this is invalid: >
	:let foo='a + b'
	:echo c{foo}d
.. since the result of expansion is "ca + bd", which is not a variable name.

						*curly-braces-function-names*
You can call and define functions by an evaluated name in a similar way.
Example: >
	:let func_end='whizz'
	:call my_func_{func_end}(parameter)

This would call the function "my_func_whizz(parameter)".

This does NOT work: >
  :let i = 3
  :let @{i} = ''  " error
  :echo @{i}      " error

==============================================================================
7. Commands						*expression-commands*

Note: in Vim9 script `:let` is used for variable declaration, not assignment.
An assignment leaves out the `:let` command.  |vim9-declaration|

:let {var-name} = {expr1}				*:let* *E18*
			Set internal variable {var-name} to the result of the
			expression {expr1}.  The variable will get the type
			from the {expr}.  If {var-name} didn't exist yet, it
			is created.

:let {var-name}[{idx}] = {expr1}			*E689*
			Set a list item to the result of the expression
			{expr1}.  {var-name} must refer to a list and {idx}
			must be a valid index in that list.  For nested list
			the index can be repeated.
			This cannot be used to add an item to a |List|.
			This cannot be used to set a byte in a String.  You
			can do that like this: >
				:let var = var[0:2] . 'X' . var[4:]
<			When {var-name} is a |Blob| then {idx} can be the
			length of the blob, in which case one byte is
			appended.

							*E711* *E719*
:let {var-name}[{idx1}:{idx2}] = {expr1}		*E708* *E709* *E710*
			Set a sequence of items in a |List| to the result of
			the expression {expr1}, which must be a list with the
			correct number of items.
			{idx1} can be omitted, zero is used instead.
			{idx2} can be omitted, meaning the end of the list.
			When the selected range of items is partly past the
			end of the list, items will be added.

			*:let+=* *:let-=* *:letstar=*
			*:let/=* *:let%=* *:let.=* *:let..=* *E734* *E985*
:let {var} += {expr1}	Like ":let {var} = {var} + {expr1}".
:let {var} -= {expr1}	Like ":let {var} = {var} - {expr1}".
:let {var} *= {expr1}	Like ":let {var} = {var} * {expr1}".
:let {var} /= {expr1}	Like ":let {var} = {var} / {expr1}".
:let {var} %= {expr1}	Like ":let {var} = {var} % {expr1}".
:let {var} .= {expr1}	Like ":let {var} = {var} . {expr1}".
:let {var} ..= {expr1}	Like ":let {var} = {var} .. {expr1}".
			These fail if {var} was not set yet and when the type
			of {var} and {expr1} don't fit the operator.
			`.=` is not supported with Vim script version 2 and
			later, see |vimscript-version|.


:let ${env-name} = {expr1}			*:let-environment* *:let-$*
			Set environment variable {env-name} to the result of
			the expression {expr1}.  The type is always String.

			On some systems making an environment variable empty
			causes it to be deleted.  Many systems do not make a
			difference between an environment variable that is not
			set and an environment variable that is empty.

:let ${env-name} .= {expr1}
			Append {expr1} to the environment variable {env-name}.
			If the environment variable didn't exist yet this
			works like "=".

:let @{reg-name} = {expr1}			*:let-register* *:let-@*
			Write the result of the expression {expr1} in register
			{reg-name}.  {reg-name} must be a single letter, and
			must be the name of a writable register (see
			|registers|).  "@@" can be used for the unnamed
			register, "@/" for the search pattern.
			If the result of {expr1} ends in a <CR> or <NL>, the
			register will be linewise, otherwise it will be set to
			characterwise.
			This can be used to clear the last search pattern: >
				:let @/ = ""
<			This is different from searching for an empty string,
			that would match everywhere.

:let @{reg-name} .= {expr1}
			Append {expr1} to register {reg-name}.  If the
			register was empty it's like setting it to {expr1}.

:let &{option-name} = {expr1}			*:let-option* *:let-&*
			Set option {option-name} to the result of the
			expression {expr1}.  A String or Number value is
			always converted to the type of the option.
			For an option local to a window or buffer the effect
			is just like using the |:set| command: both the local
			value and the global value are changed.
			Example: >
				:let &path = &path . ',/usr/local/include'
<			This also works for terminal codes in the form t_xx.
			But only for alphanumerical names.  Example: >
				:let &t_k1 = "\<Esc>[234;"
<			When the code does not exist yet it will be created as
			a terminal key code, there is no error.

:let &{option-name} .= {expr1}
			For a string option: Append {expr1} to the value.
			Does not insert a comma like |:set+=|.

:let &{option-name} += {expr1}
:let &{option-name} -= {expr1}
			For a number or boolean option: Add or subtract
			{expr1}.

:let &l:{option-name} = {expr1}
:let &l:{option-name} .= {expr1}
:let &l:{option-name} += {expr1}
:let &l:{option-name} -= {expr1}
			Like above, but only set the local value of an option
			(if there is one).  Works like |:setlocal|.

:let &g:{option-name} = {expr1}
:let &g:{option-name} .= {expr1}
:let &g:{option-name} += {expr1}
:let &g:{option-name} -= {expr1}
			Like above, but only set the global value of an option
			(if there is one).  Works like |:setglobal|.

:let [{name1}, {name2}, ...] = {expr1}		*:let-unpack* *E687* *E688*
			{expr1} must evaluate to a |List|.  The first item in
			the list is assigned to {name1}, the second item to
			{name2}, etc.
			The number of names must match the number of items in
			the |List|.
			Each name can be one of the items of the ":let"
			command as mentioned above.
			Example: >
				:let [s, item] = GetItem(s)
<			Detail: {expr1} is evaluated first, then the
			assignments are done in sequence.  This matters if
			{name2} depends on {name1}.  Example: >
				:let x = [0, 1]
				:let i = 0
				:let [i, x[i]] = [1, 2]
				:echo x
<			The result is [0, 2].

:let [{name1}, {name2}, ...] .= {expr1}
:let [{name1}, {name2}, ...] += {expr1}
:let [{name1}, {name2}, ...] -= {expr1}
			Like above, but append/add/subtract the value for each
			|List| item.

:let [{name}, ..., ; {lastname}] = {expr1}				*E452*
			Like |:let-unpack| above, but the |List| may have more
			items than there are names.  A list of the remaining
			items is assigned to {lastname}.  If there are no
			remaining items {lastname} is set to an empty list.
			Example: >
				:let [a, b; rest] = ["aval", "bval", 3, 4]
<
:let [{name}, ..., ; {lastname}] .= {expr1}
:let [{name}, ..., ; {lastname}] += {expr1}
:let [{name}, ..., ; {lastname}] -= {expr1}
			Like above, but append/add/subtract the value for each
			|List| item.

						*:let=<<* *:let-heredoc*
						*E990* *E991* *E172* *E221*
:let {var-name} =<< [trim] {endmarker}
text...
text...
{endmarker}
			Set internal variable {var-name} to a |List|
			containing the lines of text bounded by the string
			{endmarker}. The lines of text is used as a
			|literal-string|.
			{endmarker} must not contain white space.
			{endmarker} cannot start with a lower case character.
			The last line should end only with the {endmarker}
			string without any other character.  Watch out for
			white space after {endmarker}!

			Without "trim" any white space characters in the lines
			of text are preserved.  If "trim" is specified before
			{endmarker}, then indentation is stripped so you can
			do: >
				let text =<< trim END
				   if ok
				     echo 'done'
				   endif
				END
<			Results in: ["if ok", "  echo 'done'", "endif"]
			The marker must line up with "let" and the indentation
			of the first line is removed from all the text lines.
			Specifically: all the leading indentation exactly
			matching the leading indentation of the first
			non-empty text line is stripped from the input lines.
			All leading indentation exactly matching the leading
			indentation before `let` is stripped from the line
			containing {endmarker}.  Note that the difference
			between space and tab matters here.

			If {var-name} didn't exist yet, it is created.
			Cannot be followed by another command, but can be
			followed by a comment.

			To avoid line continuation to be applied, consider
			adding 'C' to 'cpoptions': >
				set cpo+=C
				let var =<< END
				   \ leading backslash
				END
				set cpo-=C
<
			Examples: >
				let var1 =<< END
				Sample text 1
				    Sample text 2
				Sample text 3
				END

				let data =<< trim DATA
					1 2 3 4
					5 6 7 8
				DATA
<
								*E121*
:let {var-name}	..	List the value of variable {var-name}.  Multiple
			variable names may be given.  Special names recognized
			here:				*E738*
			  g:	global variables
			  b:	local buffer variables
			  w:	local window variables
			  t:	local tab page variables
			  s:	script-local variables
			  l:	local function variables
			  v:	Vim variables.
			This does not work in Vim9 script. |vim9-declaration|

:let			List the values of all variables.  The type of the
			variable is indicated before the value:
			    <nothing>	String
				#	Number
				*	Funcref
			This does not work in Vim9 script. |vim9-declaration|

:unl[et][!] {name} ...				*:unlet* *:unl* *E108* *E795*
			Remove the internal variable {name}.  Several variable
			names can be given, they are all removed.  The name
			may also be a |List| or |Dictionary| item.
			With [!] no error message is given for non-existing
			variables.
			One or more items from a |List| can be removed: >
				:unlet list[3]	  " remove fourth item
				:unlet list[3:]   " remove fourth item to last
<			One item from a |Dictionary| can be removed at a time: >
				:unlet dict['two']
				:unlet dict.two
<			This is especially useful to clean up used global
			variables and script-local variables (these are not
			deleted when the script ends).  Function-local
			variables are automatically deleted when the function
			ends.

:unl[et] ${env-name} ...			*:unlet-environment* *:unlet-$*
			Remove environment variable {env-name}.
			Can mix {name} and ${env-name} in one :unlet command.
			No error message is given for a non-existing
			variable, also without !.
			If the system does not support deleting an environment
			variable, it is made empty.

						*:cons* *:const*
:cons[t] {var-name} = {expr1}
:cons[t] [{name1}, {name2}, ...] = {expr1}
:cons[t] [{name}, ..., ; {lastname}] = {expr1}
:cons[t] {var-name} =<< [trim] {marker}
text...
text...
{marker}
			Similar to |:let|, but additionally lock the variable
			after setting the value.  This is the same as locking
			the variable with |:lockvar| just after |:let|, thus: >
				:const x = 1
<			is equivalent to: >
				:let x = 1
				:lockvar! x
<			NOTE: in Vim9 script `:const` works differently, see
			|vim9-const|
			This is useful if you want to make sure the variable
			is not modified.  If the value is a List or Dictionary
			literal then the items also cannot be changed: >
				const ll = [1, 2, 3]
				let ll[1] = 5  " Error!
< 			Nested references are not locked: >
				let lvar = ['a']
				const lconst = [0, lvar]
				let lconst[0] = 2  " Error!
				let lconst[1][0] = 'b'  " OK
<							*E995*
			|:const| does not allow to for changing a variable: >
				:let x = 1
				:const x = 2  " Error!
<							*E996*
			Note that environment variables, option values and
			register values cannot be used here, since they cannot
			be locked.

:cons[t]
:cons[t] {var-name}
			If no argument is given or only {var-name} is given,
			the behavior is the same as |:let|.

:lockv[ar][!] [depth] {name} ...			*:lockvar* *:lockv*
			Lock the internal variable {name}.  Locking means that
			it can no longer be changed (until it is unlocked).
			A locked variable can be deleted: >
				:lockvar v
				:let v = 'asdf'		" fails!
				:unlet v
<							*E741* *E940*
			If you try to change a locked variable you get an
			error message: "E741: Value is locked: {name}".
			If you try to lock or unlock a built-in variable you
			get an error message: "E940: Cannot lock or unlock
			variable {name}".

			[depth] is relevant when locking a |List| or
			|Dictionary|.  It specifies how deep the locking goes:
				0	Lock the variable {name} but not its
					value.
				1	Lock the |List| or |Dictionary| itself,
					cannot add or remove items, but can
					still change their values.
				2	Also lock the values, cannot change
					the items.  If an item is a |List| or
					|Dictionary|, cannot add or remove
					items, but can still change the
					values.
				3	Like 2 but for the |List| /
					|Dictionary| in the |List| /
					|Dictionary|, one level deeper.
			The default [depth] is 2, thus when {name} is a |List|
			or |Dictionary| the values cannot be changed.

			Example with [depth] 0: >
				let mylist = [1, 2, 3]
				lockvar 0 mylist
				let mylist[0] = 77   	" OK
				call add(mylist, 4]  	" OK
				let mylist = [7, 8, 9]  " Error!
<								*E743*
			For unlimited depth use [!] and omit [depth].
			However, there is a maximum depth of 100 to catch
			loops.

			Note that when two variables refer to the same |List|
			and you lock one of them, the |List| will also be
			locked when used through the other variable.
			Example: >
				:let l = [0, 1, 2, 3]
				:let cl = l
				:lockvar l
				:let cl[1] = 99		" won't work!
<			You may want to make a copy of a list to avoid this.
			See |deepcopy()|.


:unlo[ckvar][!] [depth] {name} ...			*:unlockvar* *:unlo*
			Unlock the internal variable {name}.  Does the
			opposite of |:lockvar|.

:if {expr1}			*:if* *:end* *:endif* *:en* *E171* *E579* *E580*
:en[dif]		Execute the commands until the next matching ":else"
			or ":endif" if {expr1} evaluates to non-zero.

			From Vim version 4.5 until 5.0, every Ex command in
			between the ":if" and ":endif" is ignored.  These two
			commands were just to allow for future expansions in a
			backward compatible way.  Nesting was allowed.  Note
			that any ":else" or ":elseif" was ignored, the "else"
			part was not executed either.

			You can use this to remain compatible with older
			versions: >
				:if version >= 500
				:  version-5-specific-commands
				:endif
<			The commands still need to be parsed to find the
			"endif".  Sometimes an older Vim has a problem with a
			new command.  For example, ":silent" is recognized as
			a ":substitute" command.  In that case ":execute" can
			avoid problems: >
				:if version >= 600
				:  execute "silent 1,$delete"
				:endif
<
			NOTE: The ":append" and ":insert" commands don't work
			properly in between ":if" and ":endif".

						*:else* *:el* *E581* *E583*
:el[se]			Execute the commands until the next matching ":else"
			or ":endif" if they previously were not being
			executed.

					*:elseif* *:elsei* *E582* *E584*
:elsei[f] {expr1}	Short for ":else" ":if", with the addition that there
			is no extra ":endif".

:wh[ile] {expr1}			*:while* *:endwhile* *:wh* *:endw*
						*E170* *E585* *E588* *E733*
:endw[hile]		Repeat the commands between ":while" and ":endwhile",
			as long as {expr1} evaluates to non-zero.
			When an error is detected from a command inside the
			loop, execution continues after the "endwhile".
			Example: >
				:let lnum = 1
				:while lnum <= line("$")
				   :call FixLine(lnum)
				   :let lnum = lnum + 1
				:endwhile
<
			NOTE: The ":append" and ":insert" commands don't work
			properly inside a ":while" and ":for" loop.

:for {var} in {object}					*:for* *E690* *E732*
:endfo[r]						*:endfo* *:endfor*
			Repeat the commands between ":for" and ":endfor" for
			each item in {object}.  {object} can be a |List| or
			a |Blob|.  Variable {var} is set to the value of each
			item.  When an error is detected for a command inside
			the loop, execution continues after the "endfor".
			Changing {object} inside the loop affects what items
			are used.  Make a copy if this is unwanted: >
				:for item in copy(mylist)
<
			When {object} is a |List| and not making a copy, Vim
			stores a reference to the next item in the |List|
			before executing the commands with the current item.
			Thus the current item can be removed without effect.
			Removing any later item means it will not be found.
			Thus the following example works (an inefficient way
			to make a |List| empty): >
				for item in mylist
				   call remove(mylist, 0)
				endfor
<			Note that reordering the |List| (e.g., with sort() or
			reverse()) may have unexpected effects.

			When {object} is a |Blob|, Vim always makes a copy to
			iterate over.  Unlike with |List|, modifying the
			|Blob| does not affect the iteration.

:for [{var1}, {var2}, ...] in {listlist}
:endfo[r]
			Like ":for" above, but each item in {listlist} must be
			a list, of which each item is assigned to {var1},
			{var2}, etc.  Example: >
				:for [lnum, col] in [[1, 3], [2, 5], [3, 8]]
				   :echo getline(lnum)[col]
				:endfor
<
						*:continue* *:con* *E586*
:con[tinue]		When used inside a ":while" or ":for" loop, jumps back
			to the start of the loop.
			If it is used after a |:try| inside the loop but
			before the matching |:finally| (if present), the
			commands following the ":finally" up to the matching
			|:endtry| are executed first.  This process applies to
			all nested ":try"s inside the loop.  The outermost
			":endtry" then jumps back to the start of the loop.

						*:break* *:brea* *E587*
:brea[k]		When used inside a ":while" or ":for" loop, skips to
			the command after the matching ":endwhile" or
			":endfor".
			If it is used after a |:try| inside the loop but
			before the matching |:finally| (if present), the
			commands following the ":finally" up to the matching
			|:endtry| are executed first.  This process applies to
			all nested ":try"s inside the loop.  The outermost
			":endtry" then jumps to the command after the loop.

:try				*:try* *:endt* *:endtry* *E600* *E601* *E602*
:endt[ry]		Change the error handling for the commands between
			":try" and ":endtry" including everything being
			executed across ":source" commands, function calls,
			or autocommand invocations.

			When an error or interrupt is detected and there is
			a |:finally| command following, execution continues
			after the ":finally".  Otherwise, or when the
			":endtry" is reached thereafter, the next
			(dynamically) surrounding ":try" is checked for
			a corresponding ":finally" etc.  Then the script
			processing is terminated.  Whether a function
			definition has an "abort" argument does not matter.
			Example: >
		try | call Unknown() | finally | echomsg "cleanup" | endtry
		echomsg "not reached"
<
			Moreover, an error or interrupt (dynamically) inside
			":try" and ":endtry" is converted to an exception.  It
			can be caught as if it were thrown by a |:throw|
			command (see |:catch|).  In this case, the script
			processing is not terminated.

			The value "Vim:Interrupt" is used for an interrupt
			exception.  An error in a Vim command is converted
			to a value of the form "Vim({command}):{errmsg}",
			other errors are converted to a value of the form
			"Vim:{errmsg}".  {command} is the full command name,
			and {errmsg} is the message that is displayed if the
			error exception is not caught, always beginning with
			the error number.
			Examples: >
		try | sleep 100 | catch /^Vim:Interrupt$/ | endtry
		try | edit | catch /^Vim(edit):E\d\+/ | echo "error" | endtry
<
					*:cat* *:catch* *E603* *E604* *E605*
:cat[ch] /{pattern}/	The following commands until the next |:catch|,
			|:finally|, or |:endtry| that belongs to the same
			|:try| as the ":catch" are executed when an exception
			matching {pattern} is being thrown and has not yet
			been caught by a previous ":catch".  Otherwise, these
			commands are skipped.
			When {pattern} is omitted all errors are caught.
			Examples: >
		:catch /^Vim:Interrupt$/	 " catch interrupts (CTRL-C)
		:catch /^Vim\%((\a\+)\)\=:E/	 " catch all Vim errors
		:catch /^Vim\%((\a\+)\)\=:/	 " catch errors and interrupts
		:catch /^Vim(write):/		 " catch all errors in :write
		:catch /^Vim\%((\a\+)\)\=:E123:/ " catch error E123
		:catch /my-exception/		 " catch user exception
		:catch /.*/			 " catch everything
		:catch				 " same as /.*/
<
			Another character can be used instead of / around the
			{pattern}, so long as it does not have a special
			meaning (e.g., '|' or '"') and doesn't occur inside
			{pattern}.
			Information about the exception is available in
			|v:exception|.  Also see |throw-variables|.
			NOTE: It is not reliable to ":catch" the TEXT of
			an error message because it may vary in different
			locales.

					*:fina* *:finally* *E606* *E607*
:fina[lly]		The following commands until the matching |:endtry|
			are executed whenever the part between the matching
			|:try| and the ":finally" is left:  either by falling
			through to the ":finally" or by a |:continue|,
			|:break|, |:finish|, or |:return|, or by an error or
			interrupt or exception (see |:throw|).

							*:th* *:throw* *E608*
:th[row] {expr1}	The {expr1} is evaluated and thrown as an exception.
			If the ":throw" is used after a |:try| but before the
			first corresponding |:catch|, commands are skipped
			until the first ":catch" matching {expr1} is reached.
			If there is no such ":catch" or if the ":throw" is
			used after a ":catch" but before the |:finally|, the
			commands following the ":finally" (if present) up to
			the matching |:endtry| are executed.  If the ":throw"
			is after the ":finally", commands up to the ":endtry"
			are skipped.  At the ":endtry", this process applies
			again for the next dynamically surrounding ":try"
			(which may be found in a calling function or sourcing
			script), until a matching ":catch" has been found.
			If the exception is not caught, the command processing
			is terminated.
			Example: >
		:try | throw "oops" | catch /^oo/ | echo "caught" | endtry
<			Note that "catch" may need to be on a separate line
			for when an error causes the parsing to skip the whole
			line and not see the "|" that separates the commands.

							*:ec* *:echo*
:ec[ho] {expr1} ..	Echoes each {expr1}, with a space in between.  The
			first {expr1} starts on a new line.
			Also see |:comment|.
			Use "\n" to start a new line.  Use "\r" to move the
			cursor to the first column.
			Uses the highlighting set by the |:echohl| command.
			Cannot be followed by a comment.
			Example: >
		:echo "the value of 'shell' is" &shell
<							*:echo-redraw*
			A later redraw may make the message disappear again.
			And since Vim mostly postpones redrawing until it's
			finished with a sequence of commands this happens
			quite often.  To avoid that a command from before the
			":echo" causes a redraw afterwards (redraws are often
			postponed until you type something), force a redraw
			with the |:redraw| command.  Example: >
		:new | redraw | echo "there is a new window"
<
							*:echon*
:echon {expr1} ..	Echoes each {expr1}, without anything added.  Also see
			|:comment|.
			Uses the highlighting set by the |:echohl| command.
			Cannot be followed by a comment.
			Example: >
				:echon "the value of 'shell' is " &shell
<
			Note the difference between using ":echo", which is a
			Vim command, and ":!echo", which is an external shell
			command: >
		:!echo %		--> filename
<			The arguments of ":!" are expanded, see |:_%|. >
		:!echo "%"		--> filename or "filename"
<			Like the previous example.  Whether you see the double
			quotes or not depends on your 'shell'. >
		:echo %			--> nothing
<			The '%' is an illegal character in an expression. >
		:echo "%"		--> %
<			This just echoes the '%' character. >
		:echo expand("%")	--> filename
<			This calls the expand() function to expand the '%'.

							*:echoh* *:echohl*
:echoh[l] {name}	Use the highlight group {name} for the following
			|:echo|, |:echon| and |:echomsg| commands.  Also used
			for the |input()| prompt.  Example: >
		:echohl WarningMsg | echo "Don't panic!" | echohl None
<			Don't forget to set the group back to "None",
			otherwise all following echo's will be highlighted.

							*:echom* *:echomsg*
:echom[sg] {expr1} ..	Echo the expression(s) as a true message, saving the
			message in the |message-history|.
			Spaces are placed between the arguments as with the
			|:echo| command.  But unprintable characters are
			displayed, not interpreted.
			The parsing works slightly different from |:echo|,
			more like |:execute|.  All the expressions are first
			evaluated and concatenated before echoing anything.
			If expressions does not evaluate to a Number or
			String, string() is used to turn it into a string.
			Uses the highlighting set by the |:echohl| command.
			Example: >
		:echomsg "It's a Zizzer Zazzer Zuzz, as you can plainly see."
<			See |:echo-redraw| to avoid the message disappearing
			when the screen is redrawn.
							*:echoe* *:echoerr*
:echoe[rr] {expr1} ..	Echo the expression(s) as an error message, saving the
			message in the |message-history|.  When used in a
			script or function the line number will be added.
			Spaces are placed between the arguments as with the
			|:echomsg| command.  When used inside a try conditional,
			the message is raised as an error exception instead
			(see |try-echoerr|).
			Example: >
		:echoerr "This script just failed!"
<			If you just want a highlighted message use |:echohl|.
			And to get a beep: >
		:exe "normal \<Esc>"
<
							*:eval*
:eval {expr}		Evaluate {expr} and discard the result.  Example: >
				:eval Getlist()->Filter()->append('$')

<			The expression is supposed to have a side effect,
			since the resulting value is not used.  In the example
			the `append()` call appends the List with text to the
			buffer.  This is similar to `:call` but works with any
			expression.

			The command can be shortened to `:ev` or `:eva`, but
			these are hard to recognize and therefore not to be
			used.

			The command cannot be followed by "|" and another
			command, since "|" is seen as part of the expression.


							*:exe* *:execute*
:exe[cute] {expr1} ..	Executes the string that results from the evaluation
			of {expr1} as an Ex command.
			Multiple arguments are concatenated, with a space in
			between.  To avoid the extra space use the ".."
			operator to concatenate strings into one argument.
			{expr1} is used as the processed command, command line
			editing keys are not recognized.
			Cannot be followed by a comment.
			Examples: >
		:execute "buffer" nextbuf
		:execute "normal" count . "w"
<
			":execute" can be used to append a command to commands
			that don't accept a '|'.  Example: >
		:execute '!ls' | echo "theend"

<			":execute" is also a nice way to avoid having to type
			control characters in a Vim script for a ":normal"
			command: >
		:execute "normal ixxx\<Esc>"
<			This has an <Esc> character, see |expr-string|.

			Be careful to correctly escape special characters in
			file names.  The |fnameescape()| function can be used
			for Vim commands, |shellescape()| for |:!| commands.
			Examples: >
		:execute "e " . fnameescape(filename)
		:execute "!ls " . shellescape(filename, 1)
<
			Note: The executed string may be any command-line, but
			starting or ending "if", "while" and "for" does not
			always work, because when commands are skipped the
			":execute" is not evaluated and Vim loses track of
			where blocks start and end.  Also "break" and
			"continue" should not be inside ":execute".
			This example does not work, because the ":execute" is
			not evaluated and Vim does not see the "while", and
			gives an error for finding an ":endwhile": >
		:if 0
		: execute 'while i > 5'
		:  echo "test"
		: endwhile
		:endif
<
			It is allowed to have a "while" or "if" command
			completely in the executed string: >
		:execute 'while i < 5 | echo i | let i = i + 1 | endwhile'
<

							*:exe-comment*
			":execute", ":echo" and ":echon" cannot be followed by
			a comment directly, because they see the '"' as the
			start of a string.  But, you can use '|' followed by a
			comment.  Example: >
		:echo "foo" | "this is a comment

==============================================================================
8. Exception handling					*exception-handling*

The Vim script language comprises an exception handling feature.  This section
explains how it can be used in a Vim script.

Exceptions may be raised by Vim on an error or on interrupt, see
|catch-errors| and |catch-interrupt|.  You can also explicitly throw an
exception by using the ":throw" command, see |throw-catch|.


TRY CONDITIONALS					*try-conditionals*

Exceptions can be caught or can cause cleanup code to be executed.  You can
use a try conditional to specify catch clauses (that catch exceptions) and/or
a finally clause (to be executed for cleanup).
   A try conditional begins with a |:try| command and ends at the matching
|:endtry| command.  In between, you can use a |:catch| command to start
a catch clause, or a |:finally| command to start a finally clause.  There may
be none or multiple catch clauses, but there is at most one finally clause,
which must not be followed by any catch clauses.  The lines before the catch
clauses and the finally clause is called a try block. >

     :try
     :	...
     :	...				TRY BLOCK
     :	...
     :catch /{pattern}/
     :	...
     :	...				CATCH CLAUSE
     :	...
     :catch /{pattern}/
     :	...
     :	...				CATCH CLAUSE
     :	...
     :finally
     :	...
     :	...				FINALLY CLAUSE
     :	...
     :endtry

The try conditional allows to watch code for exceptions and to take the
appropriate actions.  Exceptions from the try block may be caught.  Exceptions
from the try block and also the catch clauses may cause cleanup actions.
   When no exception is thrown during execution of the try block, the control
is transferred to the finally clause, if present.  After its execution, the
script continues with the line following the ":endtry".
   When an exception occurs during execution of the try block, the remaining
lines in the try block are skipped.  The exception is matched against the
patterns specified as arguments to the ":catch" commands.  The catch clause
after the first matching ":catch" is taken, other catch clauses are not
executed.  The catch clause ends when the next ":catch", ":finally", or
":endtry" command is reached - whatever is first.  Then, the finally clause
(if present) is executed.  When the ":endtry" is reached, the script execution
continues in the following line as usual.
   When an exception that does not match any of the patterns specified by the
":catch" commands is thrown in the try block, the exception is not caught by
that try conditional and none of the catch clauses is executed.  Only the
finally clause, if present, is taken.  The exception pends during execution of
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,
see |try-nesting|.
   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
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,
a finally clause, it is executed, and the exception pends during its
execution.  The commands following the ":endtry" are not executed.  The new
exception might, however, be caught elsewhere, see |try-nesting|.
   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
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
following the ":endtry" are not executed, and the exception from the finally
clause is propagated and can be caught elsewhere, see |try-nesting|.

The finally clause is also executed, when a ":break" or ":continue" for
a ":while" loop enclosing the complete try conditional is executed from the
try block or a catch clause.  Or when a ":return" or ":finish" is executed
from the try block or a catch clause of a try conditional in a function or
sourced script, respectively.  The ":break", ":continue", ":return", or
":finish" pends during execution of the finally clause and is resumed when the
":endtry" is reached.  It is, however, discarded when an exception is thrown
from the finally clause.
   When a ":break" or ":continue" for a ":while" loop enclosing the complete
try conditional or when a ":return" or ":finish" is encountered in the finally
clause, the rest of the finally clause is skipped, and the ":break",
":continue", ":return" or ":finish" is executed as usual.  If the finally
clause has been taken because of an exception or an earlier ":break",
":continue", ":return", or ":finish" from the try block or a catch clause,
this pending exception or command is discarded.

For examples see |throw-catch| and |try-finally|.


NESTING	OF TRY CONDITIONALS				*try-nesting*

Try conditionals can be nested arbitrarily.  That is, a complete try
conditional can be put into the try block, a catch clause, or the finally
clause of another try conditional.  If the inner try conditional does not
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
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
otherwise only the finally clause is executed.  It does not matter for
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
the inner try conditional.

When none of the active try conditionals catches an exception, just their
finally clauses are executed.  Thereafter, the script processing terminates.
An error message is displayed in case of an uncaught exception explicitly
thrown by a ":throw" command.  For uncaught error and interrupt exceptions
implicitly raised by Vim, the error message(s) or interrupt message are shown
as usual.

For examples see |throw-catch|.


EXAMINING EXCEPTION HANDLING CODE			*except-examine*

Exception handling code can get tricky.  If you are in doubt what happens, set
'verbose' to 13 or use the ":13verbose" command modifier when sourcing your
script file.  Then you see when an exception is thrown, discarded, caught, or
finished.  When using a verbosity level of at least 14, things pending in
a finally clause are also shown.  This information is also given in debug mode
(see |debug-scripts|).


THROWING AND CATCHING EXCEPTIONS			*throw-catch*

You can throw any number or string as an exception.  Use the |:throw| command
and pass the value to be thrown as argument: >
	:throw 4711
	:throw "string"
<							*throw-expression*
You can also specify an expression argument.  The expression is then evaluated
first, and the result is thrown: >
	:throw 4705 + strlen("string")
	:throw strpart("strings", 0, 6)

An exception might be thrown during evaluation of the argument of the ":throw"
command.  Unless it is caught there, the expression evaluation is abandoned.
The ":throw" command then does not throw a new exception.
   Example: >

	:function! Foo(arg)
	:  try
	:    throw a:arg
	:  catch /foo/
	:  endtry
	:  return 1
	:endfunction
	:
	:function! Bar()
	:  echo "in Bar"
	:  return 4710
	:endfunction
	:
	:throw Foo("arrgh") + Bar()

This throws "arrgh", and "in Bar" is not displayed since Bar() is not
executed. >
	:throw Foo("foo") + Bar()
however displays "in Bar" and throws 4711.

Any other command that takes an expression as argument might also be
abandoned by an (uncaught) exception during the expression evaluation.  The
exception is then propagated to the caller of the command.
   Example: >

	:if Foo("arrgh")
	:  echo "then"
	:else
	:  echo "else"
	:endif

Here neither of "then" or "else" is displayed.

							*catch-order*
Exceptions can be caught by a try conditional with one or more |:catch|
commands, see |try-conditionals|.   The values to be caught by each ":catch"
command can be specified as a pattern argument.  The subsequent catch clause
gets executed when a matching exception is caught.
   Example: >

	:function! Foo(value)
	:  try
	:    throw a:value
	:  catch /^\d\+$/
	:    echo "Number thrown"
	:  catch /.*/
	:    echo "String thrown"
	:  endtry
	:endfunction
	:
	:call Foo(0x1267)
	:call Foo('string')

The first call to Foo() displays "Number thrown", the second "String thrown".
An exception is matched against the ":catch" commands in the order they are
specified.  Only the first match counts.  So you should place the more
specific ":catch" first.  The following order does not make sense: >

	:  catch /.*/
	:    echo "String thrown"
	:  catch /^\d\+$/
	:    echo "Number thrown"

The first ":catch" here matches always, so that the second catch clause is
never taken.

							*throw-variables*
If you catch an exception by a general pattern, you may access the exact value
in the variable |v:exception|: >

	:  catch /^\d\+$/
	:    echo "Number thrown.  Value is" v:exception

You may also be interested where an exception was thrown.  This is stored in
|v:throwpoint|.  Note that "v:exception" and "v:throwpoint" are valid for the
exception most recently caught as long it is not finished.
   Example: >

	:function! Caught()
	:  if v:exception != ""
	:    echo 'Caught "' . v:exception . '" in ' . v:throwpoint
	:  else
	:    echo 'Nothing caught'
	:  endif
	:endfunction
	:
	:function! Foo()
	:  try
	:    try
	:      try
	:	 throw 4711
	:      finally
	:	 call Caught()
	:      endtry
	:    catch /.*/
	:      call Caught()
	:      throw "oops"
	:    endtry
	:  catch /.*/
	:    call Caught()
	:  finally
	:    call Caught()
	:  endtry
	:endfunction
	:
	:call Foo()

This displays >

	Nothing caught
	Caught "4711" in function Foo, line 4
	Caught "oops" in function Foo, line 10
	Nothing caught

A practical example:  The following command ":LineNumber" displays the line
number in the script or function where it has been used: >

	:function! LineNumber()
	:    return substitute(v:throwpoint, '.*\D\(\d\+\).*', '\1', "")
	:endfunction
	:command! LineNumber try | throw "" | catch | echo LineNumber() | endtry
<
							*try-nested*
An exception that is not caught by a try conditional can be caught by
a surrounding try conditional: >

	:try
	:  try
	:    throw "foo"
	:  catch /foobar/
	:    echo "foobar"
	:  finally
	:    echo "inner finally"
	:  endtry
	:catch /foo/
	:  echo "foo"
	:endtry

The inner try conditional does not catch the exception, just its finally
clause is executed.  The exception is then caught by the outer try
conditional.  The example displays "inner finally" and then "foo".

							*throw-from-catch*
You can catch an exception and throw a new one to be caught elsewhere from the
catch clause: >

	:function! Foo()
	:  throw "foo"
	:endfunction
	:
	:function! Bar()
	:  try
	:    call Foo()
	:  catch /foo/
	:    echo "Caught foo, throw bar"
	:    throw "bar"
	:  endtry
	:endfunction
	:
	:try
	:  call Bar()
	:catch /.*/
	:  echo "Caught" v:exception
	:endtry

This displays "Caught foo, throw bar" and then "Caught bar".

							*rethrow*
There is no real rethrow in the Vim script language, but you may throw
"v:exception" instead: >

	:function! Bar()
	:  try
	:    call Foo()
	:  catch /.*/
	:    echo "Rethrow" v:exception
	:    throw v:exception
	:  endtry
	:endfunction
<							*try-echoerr*
Note that this method cannot be used to "rethrow" Vim error or interrupt
exceptions, because it is not possible to fake Vim internal exceptions.
Trying so causes an error exception.  You should throw your own exception
denoting the situation.  If you want to cause a Vim error exception containing
the original error exception value, you can use the |:echoerr| command: >

	:try
	:  try
	:    asdf
	:  catch /.*/
	:    echoerr v:exception
	:  endtry
	:catch /.*/
	:  echo v:exception
	:endtry

This code displays

	Vim(echoerr):Vim:E492: Not an editor command:	asdf ~


CLEANUP CODE						*try-finally*

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
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
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
normal control flow, on error, on an explicit ":throw", and on interrupt.
(Note that errors and interrupts from inside the try conditional are converted
to exceptions.  When not caught, they terminate the script after the finally
clause has been executed.)
Example: >

	:try
	:  let s:saved_ts = &ts
	:  set ts=17
	:
	:  " Do the hard work here.
	:
	:finally
	:  let &ts = s:saved_ts
	:  unlet s:saved_ts
	:endtry

This method should be used locally whenever a function or part of a script
changes global settings which need to be restored on failure or normal exit of
that function or script part.

							*break-finally*
Cleanup code works also when the try block or a catch clause is left by
a ":continue", ":break", ":return", or ":finish".
   Example: >

	:let first = 1
	:while 1
	:  try
	:    if first
	:      echo "first"
	:      let first = 0
	:      continue
	:    else
	:      throw "second"
	:    endif
	:  catch /.*/
	:    echo v:exception
	:    break
	:  finally
	:    echo "cleanup"
	:  endtry
	:  echo "still in while"
	:endwhile
	:echo "end"

This displays "first", "cleanup", "second", "cleanup", and "end". >

	:function! Foo()
	:  try
	:    return 4711
	:  finally
	:    echo "cleanup\n"
	:  endtry
	:  echo "Foo still active"
	:endfunction
	:
	:echo Foo() "returned by Foo"

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
return value.)

							*except-from-finally*
Using either of ":continue", ":break", ":return", ":finish", or ":throw" in
a finally clause is possible, but not recommended since it abandons the
cleanup actions for the try conditional.  But, of course, interrupt and error
exceptions might get raised from a finally clause.
   Example where an error in the finally clause stops an interrupt from
working correctly: >

	:try
	:  try
	:    echo "Press CTRL-C for interrupt"
	:    while 1
	:    endwhile
	:  finally
	:    unlet novar
	:  endtry
	:catch /novar/
	:endtry
	:echo "Script still running"
	:sleep 1

If you need to put commands that could fail into a finally clause, you should
think about catching or ignoring the errors in these commands, see
|catch-errors| and |ignore-errors|.


CATCHING ERRORS						*catch-errors*

If you want to catch specific errors, you just have to put the code to be
watched in a try block and add a catch clause for the error message.  The
presence of the try conditional causes all errors to be converted to an
exception.  No message is displayed and |v:errmsg| is not set then.  To find
the right pattern for the ":catch" command, you have to know how the format of
the error exception is.
   Error exceptions have the following format: >

	Vim({cmdname}):{errmsg}
or >
	Vim:{errmsg}

{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
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 space.

Examples:

The command >
	:unlet novar
normally produces the error message >
	E108: No such variable: "novar"
which is converted inside try conditionals to an exception >
	Vim(unlet):E108: No such variable: "novar"

The command >
	:dwim
normally produces the error message >
	E492: Not an editor command: dwim
which is converted inside try conditionals to an exception >
	Vim:E492: Not an editor command: dwim

You can catch all ":unlet" errors by a >
	:catch /^Vim(unlet):/
or all errors for misspelled command names by a >
	:catch /^Vim:E492:/

Some error messages may be produced by different commands: >
	:function nofunc
and >
	:delfunction nofunc
both produce the error message >
	E128: Function name must start with a capital: nofunc
which is converted inside try conditionals to an exception >
	Vim(function):E128: Function name must start with a capital: nofunc
or >
	Vim(delfunction):E128: Function name must start with a capital: nofunc
respectively.  You can catch the error by its number independently on the
command that caused it if you use the following pattern: >
	:catch /^Vim(\a\+):E128:/

Some commands like >
	:let x = novar
produce multiple error messages, here: >
	E121: Undefined variable: novar
	E15: Invalid expression:  novar
Only the first is used for the exception value, since it is the most specific
one (see |except-several-errors|).  So you can catch it by >
	:catch /^Vim(\a\+):E121:/

You can catch all errors related to the name "nofunc" by >
	:catch /\<nofunc\>/

You can catch all Vim errors in the ":write" and ":read" commands by >
	:catch /^Vim(\(write\|read\)):E\d\+:/

You can catch all Vim errors by the pattern >
	:catch /^Vim\((\a\+)\)\=:E\d\+:/
<
							*catch-text*
NOTE: You should never catch the error message text itself: >
	:catch /No such variable/
only works in the English locale, but not when the user has selected
a different language by the |:language| command.  It is however helpful to
cite the message text in a comment: >
	:catch /^Vim(\a\+):E108:/   " No such variable


IGNORING ERRORS						*ignore-errors*

You can ignore errors in a specific Vim command by catching them locally: >

	:try
	:  write
	:catch
	:endtry

But you are strongly recommended NOT to use this simple form, since it could
catch more than you want.  With the ":write" command, some autocommands could
be executed and cause errors not related to writing, for instance: >

	:au BufWritePre * unlet novar

There could even be such errors you are not responsible for as a script
writer: a user of your script might have defined such autocommands.  You would
then hide the error from the user.
   It is much better to use >

	:try
	:  write
	:catch /^Vim(write):/
	:endtry

which only catches real write errors.  So catch only what you'd like to ignore
intentionally.

For a single command that does not cause execution of autocommands, you could
even suppress the conversion of errors to exceptions by the ":silent!"
command: >
	:silent! nunmap k
This works also when a try conditional is active.


CATCHING INTERRUPTS					*catch-interrupt*

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
script is not terminated, then.
   Example: >

	:function! TASK1()
	:  sleep 10
	:endfunction

	:function! TASK2()
	:  sleep 20
	:endfunction

	:while 1
	:  let command = input("Type a command: ")
	:  try
	:    if command == ""
	:      continue
	:    elseif command == "END"
	:      break
	:    elseif command == "TASK1"
	:      call TASK1()
	:    elseif command == "TASK2"
	:      call TASK2()
	:    else
	:      echo "\nIllegal command:" command
	:      continue
	:    endif
	:  catch /^Vim:Interrupt$/
	:    echo "\nCommand interrupted"
	:    " Caught the interrupt.  Continue with next prompt.
	:  endtry
	:endwhile

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.

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|
command on that line.  See |debug-scripts|.


CATCHING ALL						*catch-all*

The commands >

	:catch /.*/
	:catch //
	:catch

catch everything, error exceptions, interrupt exceptions and exceptions
explicitly thrown by the |:throw| command.  This is useful at the top level of
a script in order to catch unexpected things.
   Example: >

	:try
	:
	:  " do the hard work here
	:
	:catch /MyException/
	:
	:  " handle known problem
	:
	:catch /^Vim:Interrupt$/
	:    echo "Script interrupted"
	:catch /.*/
	:  echo "Internal error (" . v:exception . ")"
	:  echo " - occurred at " . v:throwpoint
	:endtry
	:" end of script

Note: Catching all might catch more things than you want.  Thus, you are
strongly encouraged to catch only for problems that you can really handle by
specifying a pattern argument to the ":catch".
   Example: Catching all could make it nearly impossible to interrupt a script
by pressing CTRL-C: >

	:while 1
	:  try
	:    sleep 1
	:  catch
	:  endtry
	:endwhile


EXCEPTIONS AND AUTOCOMMANDS				*except-autocmd*

Exceptions may be used during execution of autocommands.  Example: >

	:autocmd User x try
	:autocmd User x   throw "Oops!"
	:autocmd User x catch
	:autocmd User x   echo v:exception
	:autocmd User x endtry
	:autocmd User x throw "Arrgh!"
	:autocmd User x echo "Should not be displayed"
	:
	:try
	:  doautocmd User x
	:catch
	:  echo v:exception
	:endtry

This displays "Oops!" and "Arrgh!".

							*except-autocmd-Pre*
For some commands, autocommands get executed before the main action of the
command takes place.  If an exception is thrown and not caught in the sequence
of autocommands, the sequence and the command that caused its execution are
abandoned and the exception is propagated to the caller of the command.
   Example: >

	:autocmd BufWritePre * throw "FAIL"
	:autocmd BufWritePre * echo "Should not be displayed"
	:
	:try
	:  write
	:catch
	:  echo "Caught:" v:exception "from" v:throwpoint
	:endtry

Here, the ":write" command does not write the file currently being edited (as
you can see by checking 'modified'), since the exception from the BufWritePre
autocommand abandons the ":write".  The exception is then caught and the
script displays: >

	Caught: FAIL from BufWrite Auto commands for "*"
<
							*except-autocmd-Post*
For some commands, autocommands get executed after the main action of the
command has taken place.  If this main action fails and the command is inside
an active try conditional, the autocommands are skipped and an error exception
is thrown that can be caught by the caller of the command.
   Example: >

	:autocmd BufWritePost * echo "File successfully written!"
	:
	:try
	:  write /i/m/p/o/s/s/i/b/l/e
	:catch
	:  echo v:exception
	:endtry

This just displays: >

	Vim(write):E212: Can't open file for writing (/i/m/p/o/s/s/i/b/l/e)

If you really need to execute the autocommands even when the main action
fails, trigger the event from the catch clause.
   Example: >

	:autocmd BufWritePre  * set noreadonly
	:autocmd BufWritePost * set readonly
	:
	:try
	:  write /i/m/p/o/s/s/i/b/l/e
	:catch
	:  doautocmd BufWritePost /i/m/p/o/s/s/i/b/l/e
	:endtry
<
You can also use ":silent!": >

	:let x = "ok"
	:let v:errmsg = ""
	:autocmd BufWritePost * if v:errmsg != ""
	:autocmd BufWritePost *   let x = "after fail"
	:autocmd BufWritePost * endif
	:try
	:  silent! write /i/m/p/o/s/s/i/b/l/e
	:catch
	:endtry
	:echo x

This displays "after fail".

If the main action of the command does not fail, exceptions from the
autocommands will be catchable by the caller of the command:  >

	:autocmd BufWritePost * throw ":-("
	:autocmd BufWritePost * echo "Should not be displayed"
	:
	:try
	:  write
	:catch
	:  echo v:exception
	:endtry
<
							*except-autocmd-Cmd*
For some commands, the normal action can be replaced by a sequence of
autocommands.  Exceptions from that sequence will be catchable by the caller
of the command.
   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
some way. >

	:if !exists("cnt")
	:  let cnt = 0
	:
	:  autocmd BufWriteCmd * if &modified
	:  autocmd BufWriteCmd *   let cnt = cnt + 1
	:  autocmd BufWriteCmd *   if cnt % 3 == 2
	:  autocmd BufWriteCmd *     throw "BufWriteCmdError"
	:  autocmd BufWriteCmd *   endif
	:  autocmd BufWriteCmd *   write | set nomodified
	:  autocmd BufWriteCmd *   if cnt % 3 == 0
	:  autocmd BufWriteCmd *     throw "BufWriteCmdError"
	:  autocmd BufWriteCmd *   endif
	:  autocmd BufWriteCmd *   echo "File successfully written!"
	:  autocmd BufWriteCmd * endif
	:endif
	:
	:try
	:	write
	:catch /^BufWriteCmdError$/
	:  if &modified
	:    echo "Error on writing (file contents not changed)"
	:  else
	:    echo "Error after writing"
	:  endif
	:catch /^Vim(write):/
	:    echo "Error on writing"
	:endtry

When this script is sourced several times after making changes, it displays
first >
	File successfully written!
then >
	Error on writing (file contents not changed)
then >
	Error after writing
etc.

							*except-autocmd-ill*
You cannot spread a try conditional over autocommands for different events.
The following code is ill-formed: >

	:autocmd BufWritePre  * try
	:
	:autocmd BufWritePost * catch
	:autocmd BufWritePost *   echo v:exception
	:autocmd BufWritePost * endtry
	:
	:write


EXCEPTION HIERARCHIES AND PARAMETERIZED EXCEPTIONS	*except-hier-param*

Some programming languages allow to use hierarchies of exception classes or to
pass additional information with the object of an exception class.  You can do
similar things in Vim.
   In order to throw an exception from a hierarchy, just throw the complete
class name with the components separated by a colon, for instance throw the
string "EXCEPT:MATHERR:OVERFLOW" for an overflow in a mathematical library.
   When you want to pass additional information with your exception class, add
it in parentheses, for instance throw the string "EXCEPT:IO:WRITEERR(myfile)"
for an error when writing "myfile".
   With the appropriate patterns in the ":catch" command, you can catch for
base classes or derived classes of your hierarchy.  Additional information in
parentheses can be cut out from |v:exception| with the ":substitute" command.
   Example: >

	:function! CheckRange(a, func)
	:  if a:a < 0
	:    throw "EXCEPT:MATHERR:RANGE(" . a:func . ")"
	:  endif
	:endfunction
	:
	:function! Add(a, b)
	:  call CheckRange(a:a, "Add")
	:  call CheckRange(a:b, "Add")
	:  let c = a:a + a:b
	:  if c < 0
	:    throw "EXCEPT:MATHERR:OVERFLOW"
	:  endif
	:  return c
	:endfunction
	:
	:function! Div(a, b)
	:  call CheckRange(a:a, "Div")
	:  call CheckRange(a:b, "Div")
	:  if (a:b == 0)
	:    throw "EXCEPT:MATHERR:ZERODIV"
	:  endif
	:  return a:a / a:b
	:endfunction
	:
	:function! Write(file)
	:  try
	:    execute "write" fnameescape(a:file)
	:  catch /^Vim(write):/
	:    throw "EXCEPT:IO(" . getcwd() . ", " . a:file . "):WRITEERR"
	:  endtry
	:endfunction
	:
	:try
	:
	:  " something with arithmetics and I/O
	:
	:catch /^EXCEPT:MATHERR:RANGE/
	:  let function = substitute(v:exception, '.*(\(\a\+\)).*', '\1', "")
	:  echo "Range error in" function
	:
	:catch /^EXCEPT:MATHERR/	" catches OVERFLOW and ZERODIV
	:  echo "Math error"
	:
	:catch /^EXCEPT:IO/
	:  let dir = substitute(v:exception, '.*(\(.\+\),\s*.\+).*', '\1', "")
	:  let file = substitute(v:exception, '.*(.\+,\s*\(.\+\)).*', '\1', "")
	:  if file !~ '^/'
	:    let file = dir . "/" . file
	:  endif
	:  echo 'I/O error for "' . file . '"'
	:
	:catch /^EXCEPT/
	:  echo "Unspecified error"
	:
	:endtry

The exceptions raised by Vim itself (on error or when pressing CTRL-C) use
a flat hierarchy:  they are all in the "Vim" class.  You cannot throw yourself
exceptions with the "Vim" prefix; they are reserved for Vim.
   Vim error exceptions are parameterized with the name of the command that
failed, if known.  See |catch-errors|.


PECULIARITIES
							*except-compat*
The exception handling concept requires that the command sequence causing the
exception is aborted immediately and control is transferred to finally clauses
and/or a catch clause.

In the Vim script language there are cases where scripts and functions
continue after an error: in functions without the "abort" flag or in a command
after ":silent!", control flow goes to the following line, and outside
functions, control flow goes to the line following the outermost ":endwhile"
or ":endif".  On the other hand, errors should be catchable as exceptions
(thus, requiring the immediate abortion).

This problem has been solved by converting errors to exceptions and using
immediate abortion (if not suppressed by ":silent!") only when a try
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
termination without catching the error, just use a try conditional without
catch clause.  (You can cause cleanup code being executed before termination
by specifying a finally clause.)

When no try conditional is active, the usual abortion and continuation
behavior is used instead of immediate abortion.  This ensures compatibility of
scripts written for Vim 6.1 and earlier.

However, when sourcing an existing script that does not use exception handling
commands (or when calling one of its functions) from inside an active try
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
error in the new script.  If however the sourced script suppresses error
messages by using the ":silent!" command (checking for errors by testing
|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
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
scripts.

							*except-syntax-err*
Syntax errors in the exception handling commands are never caught by any of
the ":catch" commands of the try conditional they belong to.  Its finally
clauses, however, is executed.
   Example: >

	:try
	:  try
	:    throw 4711
	:  catch /\(/
	:    echo "in catch with syntax error"
	:  catch
	:    echo "inner catch-all"
	:  finally
	:    echo "inner finally"
	:  endtry
	:catch
	:  echo 'outer catch-all caught "' . v:exception . '"'
	:  finally
	:    echo "outer finally"
	:endtry

This displays: >
    inner finally
    outer catch-all caught "Vim(catch):E54: Unmatched \("
    outer finally
The original exception is discarded and an error exception is raised, instead.

							*except-single-line*
The ":try", ":catch", ":finally", and ":endtry" commands can be put on
a single line, but then syntax errors may make it difficult to recognize the
"catch" line, thus you better avoid this.
   Example: >
	:try | unlet! foo # | catch | endtry
raises an error exception for the trailing characters after the ":unlet!"
argument, but does not see the ":catch" and ":endtry" commands, so that the
error exception is discarded and the "E488: Trailing characters" message gets
displayed.

							*except-several-errors*
When several errors appear in a single command, the first error message is
usually the most specific one and therefor converted to the error exception.
   Example: >
	echo novar
causes >
	E121: Undefined variable: novar
	E15: Invalid expression: novar
The value of the error exception inside try conditionals is: >
	Vim(echo):E121: Undefined variable: novar
<							*except-syntax-error*
But when a syntax error is detected after a normal error in the same command,
the syntax error is used for the exception being thrown.
   Example: >
	unlet novar #
causes >
	E108: No such variable: "novar"
	E488: Trailing characters
The value of the error exception inside try conditionals is: >
	Vim(unlet):E488: Trailing characters
This is done because the syntax error might change the execution path in a way
not intended by the user.  Example: >
	try
	    try | unlet novar # | catch | echo v:exception | endtry
	catch /.*/
	    echo "outer catch:" v:exception
	endtry
This displays "outer catch: Vim(unlet):E488: Trailing characters", and then
a "E600: Missing :endtry" error message is given, see |except-single-line|.

==============================================================================
9. Examples						*eval-examples*

Printing in Binary ~
>
  :" The function Nr2Bin() returns the binary string representation of a number.
  :func Nr2Bin(nr)
  :  let n = a:nr
  :  let r = ""
  :  while n
  :    let r = '01'[n % 2] . r
  :    let n = n / 2
  :  endwhile
  :  return r
  :endfunc

  :" The function String2Bin() converts each character in a string to a
  :" binary string, separated with dashes.
  :func String2Bin(str)
  :  let out = ''
  :  for ix in range(strlen(a:str))
  :    let out = out . '-' . Nr2Bin(char2nr(a:str[ix]))
  :  endfor
  :  return out[1:]
  :endfunc

Example of its use: >
  :echo Nr2Bin(32)
result: "100000" >
  :echo String2Bin("32")
result: "110011-110010"


Sorting lines ~

This example sorts lines with a specific compare function. >

  :func SortBuffer()
  :  let lines = getline(1, '$')
  :  call sort(lines, function("Strcmp"))
  :  call setline(1, lines)
  :endfunction

As a one-liner: >
  :call setline(1, sort(getline(1, '$'), function("Strcmp")))


scanf() replacement ~
							*sscanf*
There is no sscanf() function in Vim.  If you need to extract parts from a
line, you can use matchstr() and substitute() to do it.  This example shows
how to get the file name, line number and column number out of a line like
"foobar.txt, 123, 45". >
   :" Set up the match bit
   :let mx='\(\f\+\),\s*\(\d\+\),\s*\(\d\+\)'
   :"get the part matching the whole expression
   :let l = matchstr(line, mx)
   :"get each item out of the match
   :let file = substitute(l, mx, '\1', '')
   :let lnum = substitute(l, mx, '\2', '')
   :let col = substitute(l, mx, '\3', '')

The input is in the variable "line", the results in the variables "file",
"lnum" and "col". (idea from Michael Geddes)


getting the scriptnames in a Dictionary ~
						*scriptnames-dictionary*
The |:scriptnames| command can be used to get a list of all script files that
have been sourced.  There is no equivalent function or variable for this
(because it's rarely needed).  In case you need to manipulate the list this
code can be used: >
    " Get the output of ":scriptnames" in the scriptnames_output variable.
    let scriptnames_output = ''
    redir => scriptnames_output
    silent scriptnames
    redir END

    " Split the output into lines and parse each line.	Add an entry to the
    " "scripts" dictionary.
    let scripts = {}
    for line in split(scriptnames_output, "\n")
      " Only do non-blank lines.
      if line =~ '\S'
	" Get the first number in the line.
	let nr = matchstr(line, '\d\+')
	" Get the file name, remove the script number " 123: ".
	let name = substitute(line, '.\+:\s*', '', '')
	" Add an item to the Dictionary
	let scripts[nr] = name
      endif
    endfor
    unlet scriptnames_output

==============================================================================
10. Vim script versions		*vimscript-version* *vimscript-versions*
							*scriptversion*
Over time many features have been added to Vim script.  This includes Ex
commands, functions, variable types, etc.  Each individual feature can be
checked with the |has()| and |exists()| functions.

Sometimes old syntax of functionality gets in the way of making Vim better.
When support is taken away this will break older Vim scripts.  To make this
explicit the |:scriptversion| command can be used.  When a Vim script is not
compatible with older versions of Vim this will give an explicit error,
instead of failing in mysterious ways.

							*scriptversion-1*  >
 :scriptversion 1
<	This is the original Vim script, same as not using a |:scriptversion|
	command.  Can be used to go back to old syntax for a range of lines.
	Test for support with: >
		has('vimscript-1')

<							*scriptversion-2*  >
 :scriptversion 2
<	String concatenation with "." is not supported, use ".." instead.
	This avoids the ambiguity using "." for Dict member access and
	floating point numbers.  Now ".5" means the number 0.5.

							*scriptversion-3*  >
 :scriptversion 3
<	All |vim-variable|s must be prefixed by "v:".  E.g. "version" doesn't
	work as |v:version| anymore, it can be used as a normal variable.
	Same for some obvious names as "count" and others.

	Test for support with: >
		has('vimscript-3')
<
							*scriptversion-4*  >
 :scriptversion 4
<	Numbers with a leading zero are not recognized as octal.  "0o" or "0O"
	is still recognized as octal.  With the
	previous version you get: >
		echo 017   " displays 15 (octal)
		echo 0o17  " displays 15 (octal)
		echo 018   " displays 18 (decimal)
<	with script version 4: >
		echo 017   " displays 17 (decimal)
		echo 0o17  " displays 15 (octal)
		echo 018   " displays 18 (decimal)
<	Also, it is possible to use single quotes inside numbers to make them
	easier to read: >
		echo 1'000'000
<	The quotes must be surrounded by digits.

	Test for support with: >
		has('vimscript-4')

==============================================================================
11. No +eval feature				*no-eval-feature*

When the |+eval| feature was disabled at compile time, none of the expression
evaluation commands are available.  To prevent this from causing Vim scripts
to generate all kinds of errors, the ":if" and ":endif" commands are still
recognized, though the argument of the ":if" and everything between the ":if"
and the matching ":endif" is ignored.  Nesting of ":if" blocks is allowed, but
only if the commands are at the start of the line.  The ":else" command is not
recognized.

Example of how to avoid executing commands when the |+eval| feature is
missing: >

	:if 1
	:  echo "Expression evaluation is compiled in"
	:else
	:  echo "You will _never_ see this message"
	:endif

To execute a command only when the |+eval| feature is disabled can be done in
two ways.  The simplest is to exit the script (or Vim) prematurely: >
	if 1
	   echo "commands executed with +eval"
	   finish
	endif
	args  " command executed without +eval

If you do not want to abort loading the script you can use a trick, as this
example shows: >

	silent! while 0
	  set history=111
	silent! endwhile

When the |+eval| feature is available the command is skipped because of the
"while 0".  Without the |+eval| feature the "while 0" is an error, which is
silently ignored, and the command is executed.

==============================================================================
12. The sandbox					*eval-sandbox* *sandbox* *E48*

The 'foldexpr', 'formatexpr', 'includeexpr', 'indentexpr', 'statusline' and
'foldtext' options may be evaluated in a sandbox.  This means that you are
protected from these expressions having nasty side effects.  This gives some
safety for when these options are set from a modeline.  It is also used when
the command from a tags file is executed and for CTRL-R = in the command line.
The sandbox is also used for the |:sandbox| command.

These items are not allowed in the sandbox:
	- changing the buffer text
	- defining or changing mapping, autocommands, user commands
	- setting certain options (see |option-summary|)
	- setting certain v: variables (see |v:var|)  *E794*
	- executing a shell command
	- reading or writing a file
	- jumping to another buffer or editing a file
	- executing Python, Perl, etc. commands
This is not guaranteed 100% secure, but it should block most attacks.

							*:san* *:sandbox*
:san[dbox] {cmd}	Execute {cmd} in the sandbox.  Useful to evaluate an
			option that may have been set from a modeline, e.g.
			'foldexpr'.

							*sandbox-option*
A few options contain an expression.  When this expression is evaluated it may
have to be done in the sandbox to avoid a security risk.  But the sandbox is
restrictive, thus this only happens when the option was set from an insecure
location.  Insecure in this context are:
- sourcing a .vimrc or .exrc in the current directory
- while executing in the sandbox
- value coming from a modeline
- executing a function that was defined in the sandbox

Note that when in the sandbox and saving an option value and restoring it, the
option will still be marked as it was set in the sandbox.

==============================================================================
13. Textlock							*textlock*

In a few situations it is not allowed to change the text in the buffer, jump
to another window and some other things that might confuse or break what Vim
is currently doing.  This mostly applies to things that happen when Vim is
actually doing something else.  For example, evaluating the 'balloonexpr' may
happen any moment the mouse cursor is resting at some position.

This is not allowed when the textlock is active:
	- changing the buffer text
	- jumping to another buffer or window
	- editing another file
	- closing a window or quitting Vim
	- etc.


 vim:tw=78:ts=8:noet:ft=help:norl:
