Vim documentation: eval

main help file

*eval.txt*      For Vim version 7.1.  Last change: 2007 May 11


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

1.  Variables			|variables|
    1.1 Variable types
    1.2 Function references		|Funcref|
    1.3 Lists				|Lists|
    1.4 Dictionaries			|Dictionaries|
    1.5 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. No +eval feature		|no-eval-feature|
11. The sandbox			|eval-sandbox|
12. Textlock			|textlock|

{Vi does not have any of these commands}

==============================================================================

1. Variables						*variables*

1.1 Variable types 

							*E712*
There are five types of variables:

Number		A 32 bit signed number.
		Examples:  -123  0x10  0177

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

Funcref		A reference to a function |Funcref|.
		Example: function("strlen")

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

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

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"

Conversion from a String to a Number is done by converting the first digits
to a number.  Hexadecimal "0xf9" and Octal "017" numbers are recognized.  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 "-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()|.

For boolean operators Numbers are used.  Zero is FALSE, non-zero is TRUE.

Note that in the command
	:if "foo"
"foo" is converted to 0, which means FALSE.  To test for a non-empty string,
use strlen():
	:if strlen("foo")

 				*E745* *E728* *E703* *E729* *E730* *E731*
List, Dictionary and Funcref types are not automatically converted.


								*E706*
You will get an error if you try to change the type of a variable.  You need
to |:unlet| it first to avoid this error.  String and Number are considered
equivalent though.  Consider this sequence of commands:
	:let l = "string"
	:let l = 44		" changes type from String to Number
	:let l = [1, 2, 3]	" error!


1.2 Function references 

					*Funcref* *E695* *E718*
A Funcref variable is obtained with the |function()| function.  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
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)


1.3 Lists 

							*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 

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

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 string:

	: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


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

Note that all items in the list should be of the same type, otherwise this
results in error |E706|.  To avoid this |:unlet| the variable at the end of
the loop.

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 

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

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 YXXYexpr-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 YXXYextend()|:
	: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 YXXYfilter()|:
	:call filter(dict, 'v:val =~ "x"')
This removes all entries from "dict" with a value not matching 'x'.


Dictionary function 

					*Dictionary-function* *self* *E725*
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() dict
	:   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.


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 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 ? expr1 : expr1	if-then-else

|expr2|	expr3 || expr3 ..	logical OR

|expr3|	expr4 && expr4 ..	logical AND

|expr4|	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| instance
	expr5 isnot expr5	different |List| instance

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

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

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


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

|expr9| number			number constant
	"string"		string constant, backslash is special
	'string'		string constant, '' is doubled
	[expr1, ...]		|List|
	{expr1: 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


".." 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* *E109*

expr2 ? expr1 : expr1

The expression before the '?' is evaluated to a number.  If it evaluates to
non-zero, 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".



expr2 and expr3						*expr2* *expr3*


					*expr-barbar* *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 
zero		zero		zero		zero
zero		non-zero	non-zero	zero
non-zero	zero		non-zero	zero
non-zero	non-zero	non-zero	non-zero

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 non-zero,
so the result must be non-zero.  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*
		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
different instance	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" and
"is" 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" and "is" can be used.  This compares the key/values of the |Dictionary|
recursively.  Ignoring case means case is ignored when comparing item values.


							*E693* *E694*
A |Funcref| can only be compared with a |Funcref| and only "equal" and "not
equal" can be used.  Case is never ignored.

When using "is" or "isnot" with a |List| this checks if the expressions are
referring to the same |List| instance.  A copy of a |List| is different from
the original |List|.  When using "is" without a |List| it is equivalent to
using "equal", using "isnot" equivalent to using "not equal".  Except that a
different type means the values are different.  "4 == '4'"' is true, "4 is '4'"'
is false.

When comparing a String with a Number, the String is converted to a Number,
and the comparison is done on Numbers.  This means that "0 == 'x'"' is TRUE,
because 'x' converted to a Number is zero.

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 or |List| concatenation	*expr-+*

expr6 -	 expr6 ..	Number subtraction			*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.


expr7 *	 expr7 ..	number multiplication			*expr-star*

expr7 /	 expr7 ..	number division				*expr-/*

expr7 %	 expr7 ..	number modulo				*expr-%*

For all, except ".", Strings are converted to Numbers.

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

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

None of these work for |Funcref|s.



expr7							*expr7*

! expr7			logical NOT		*expr-!*

- expr7			unary minus		*expr-unary--*

+ expr7			unary plus		*expr-unary-+*

For '!' non-zero becomes zero, zero becomes one.
For '-' the sign of the number is changed.
For '+' the number is unchanged.

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*

expr8[expr1]		item of String or |List|	*expr-[]* *E111*

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, expr1 as a
Number.  Note that this doesn't recognize multi-byte encodings.

Index zero gives the first character.  This is like it works in C.  Careful:
text column numbers start with one!  Example, to get the character under the
cursor:
	:let c = getline(".")[col(".") - 1]

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: backwards
compatibility).  Use [-1:] to get the last byte.

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 Number or String this results in the substring with the bytes
from expr1a to and including expr1b.  expr8 is used as a String, expr1a and
expr1b are used as a Number.  Note that this doesn't recognize multi-byte
encodings.

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

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, except that indexes out of range cause an error.  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

Using expr8[expr1] or expr8[expr1a : expr1b] on a |Funcref| results in an
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
	:echo dict .2

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.




							*expr9*
number

number			number constant		*expr-number*

Decimal, Hexadecimal (starting with 0x or 0X), or Octal (starting with 0).



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

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.



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.

						*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 $version
	:echo expand("$version")
The first one probably doesn't echo anything, the second echoes the $version
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|.


==============================================================================

3. Internal variable				*internal-variables* *E121*

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

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
 

						*buffer-variable* *b:var*
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-variable* *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.  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
 

						*window-variable* *w:var*
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*
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*
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*
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
- 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: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.
		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.


					*v:char* *char-variable*
v:char		Argument for evaluating 'formatexpr'.


			*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: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.
		Also used for evaluating the 'formatexpr' option.
		"count" also works, for backwards compatibility.


					*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
 

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


					*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: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: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| 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_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: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 mode and then use the count.
			: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:register* *register-variable*
v:register	The name of the register supplied to the last normal mode
		command.  Empty if none were supplied. |getreg()| |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 |x11-clientserver| name if any.
		Read-only.


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


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


					*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: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 (5.01)
		is 501.  Read-only.  "version" also works, for backwards
		compatibility.
		Use |has()| to check if a certain patch was included, e.g.:
			if has("patch123")
 		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:warningmsg* *warningmsg-variable*
v:warningmsg	Last given warning message.  It's allowed to set this variable.

==============================================================================

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	

add( {list}, {item})		List	append {item} to |List| {list}
append( {lnum}, {string})	Number	append {string} below line {lnum}
append( {lnum}, {list})		Number	append lines {list} below line {lnum}
argc()				Number	number of files in the argument list
argidx()			Number	current index in the argument list
argv( {nr})			String	{nr} entry of the argument list
argv( )				List	the argument list
browse( {save}, {title}, {initdir}, {default})
				String	put up a file requester
browsedir( {title}, {initdir})  String	put up a directory requester
bufexists( {expr})		Number	TRUE if buffer {expr} exists
buflisted( {expr})		Number	TRUE if buffer {expr} is listed
bufloaded( {expr})		Number	TRUE if buffer {expr} is loaded
bufname( {expr})		String	Name of the buffer {expr}
bufnr( {expr})			Number	Number of the 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}
call( {func}, {arglist} [, {dict}])
				any	call {func} with arguments {arglist}
changenr()			Number  current change number
char2nr( {expr})		Number	ASCII value of first char in {expr}
cindent( {lnum})		Number	C indent for line {lnum}
col( {expr})			Number	column nr of cursor or mark
complete({startcol}, {matches})	String  set Insert mode completion
complete_add( {expr})		Number	add completion match
complete_check()		Number  check for key typed during completion
confirm( {msg} [, {choices} [, {default} [, {type}]]])
				Number	number of choice picked by user
copy( {expr})			any	make a shallow copy of {expr}
count( {list}, {expr} [, {start} [, {ic}]])
				Number	 count how many {expr} are in {list}
cscope_connection( [{num} , {dbpath} [, {prepend}]])
				Number	checks existence of cscope connection
cursor( {lnum}, {col} [, {coladd}])
				Number	move cursor to {lnum}, {col}, {coladd}
cursor( {list})			Number	move cursor to position in {list}
deepcopy( {expr})		any	make a full copy of {expr}
delete( {fname})		Number	delete file {fname}
did_filetype()			Number	TRUE if FileType autocommand event used
diff_filler( {lnum})		Number	diff filler lines about {lnum}
diff_hlID( {lnum}, {col})	Number	diff highlighting at {lnum}/{col}
empty( {expr})			Number	TRUE if {expr} is empty
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
exists( {expr})			Number	TRUE if {expr} exists
extend({expr1}, {expr2} [, {expr3}])
				List/Dict insert items of {expr2} into {expr1}
expand( {expr})			String	expand special keywords in {expr}
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( {expr}, {string})	List/Dict  remove items from {expr} where
					{string} is 0
finddir( {name}[, {path}[, {count}]])
				String	find directory {name} in {path}
findfile( {name}[, {path}[, {count}]])
				String	find file {name} in {path}
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
function( {name})		Funcref reference to function {name}
garbagecollect()		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}
getbufline( {expr}, {lnum} [, {end}])
				List	lines {lnum} to {end} of buffer {expr}
getbufvar( {expr}, {varname})	any	variable {varname} in buffer {expr}
getchar( [expr])		Number	get one character from the user
getcharmod( )			Number	modifiers for the last typed character
getcmdline()			String	return the current command-line
getcmdpos()			Number	return cursor position in command-line
getcmdtype()			String	return the current command-line type
getcwd()			String	the current working directory
getfperm( {fname})		String	file permissions of file {fname}
getfsize( {fname})		Number	size in bytes of file {fname}
getfontname( [{name}])		String	name of font being used
getftime( {fname})		Number	last modification time of file
getftype( {fname})		String	description of type of file {fname}
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
getpos( {expr})			List	position of cursor, mark, etc.
getqflist()			List	list of quickfix items
getreg( [{regname} [, 1]])	String	contents of register
getregtype( [{regname}])	String	type of register
gettabwinvar( {tabnr}, {winnr}, {name})
				any	{name} in {winnr} in tab page {tabnr}
getwinposx()			Number	X coord in pixels of GUI Vim window
getwinposy()			Number	Y coord in pixels of GUI Vim window
getwinvar( {nr}, {varname})	any	variable {varname} in window {nr}
glob( {expr})			String	expand file wildcards in {expr}
globpath( {path}, {expr})	String	do glob({expr}) for all dirs in {path}
has( {feature})			Number	TRUE if feature {feature} supported
has_key( {dict}, {key})		Number	TRUE if {dict} has entry {key}
haslocaldir()			Number	TRUE if current window executed |:lcd|
hasmapto( {what} [, {mode} [, {abbr}]])
				Number	TRUE if mapping to {what} exists
histadd( {history},{item})	String	add an item to a history
histdel( {history} [, {item}])	String	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
hlexists( {name})		Number	TRUE if highlight group {name} exists
hlID( {name})			Number	syntax ID of highlight group {name}
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( {list}, {expr} [, {start} [, {ic}]])
				Number	index in {list} where {expr} appears
input( {prompt} [, {text} [, {completion}]])
				String	get input from the user
inputdialog( {p} [, {t} [, {c}]]) 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( {list}, {item} [, {idx}]) List	insert {item} in {list} [before {idx}]
isdirectory( {directory})	Number	TRUE if {directory} is a directory
islocked( {expr})		Number	TRUE if {expr} is locked
items( {dict})			List	key-value pairs in {dict}
join( {list} [, {sep}])		String	join {list} items into one String
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})			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}
localtime()			Number	current time
map( {expr}, {string})		List/Dict  change each item in {expr} to {expr}
maparg( {name}[, {mode} [, {abbr}]])
				String	rhs of mapping {name} in mode {mode}
mapcheck( {name}[, {mode} [, {abbr}]])
				String	check for mappings matching {name}
match( {expr}, {pat}[, {start}[, {count}]])
				Number	position where {pat} matches in {expr}
matcharg( {nr})			List	arguments of |:match|
matchend( {expr}, {pat}[, {start}[, {count}]])
				Number	position where {pat} ends in {expr}
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}
max({list})			Number	maximum value of items in {list}
min({list})			Number	minimum value of items in {list}
mkdir({name} [, {path} [, {prot}]])
				Number	create directory {name}
mode()				String	current editing mode
nextnonblank( {lnum})		Number	line nr of non-blank line >= {lnum}
nr2char( {expr})		String	single char with ASCII value {expr}
pathshorten( {expr})		String	shorten directory names in a path
prevnonblank( {lnum})		Number	line nr of non-blank line <= {lnum}
printf( {fmt}, {expr1}...)	String  format text
pumvisible()			Number  whether popup menu is visible
range( {expr} [, {max} [, {stride}]])
				List	items from {expr} to {max}
readfile({fname} [, {binary} [, {max}]])
				List	get list of lines from file {fname}
reltime( [{start} [, {end}]])	List	get time value
reltimestr( {time})		String	turn time value into a String
remote_expr( {server}, {string} [, {idvar}])
				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})	String	read reply string
remote_send( {server}, {string} [, {idvar}])
				String	send key sequence
remove( {list}, {idx} [, {end}])  any	remove items {idx}-{end} from {list}
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
search( {pattern} [, {flags}])	Number	search for {pattern}
searchdecl({name} [, {global} [, {thisblock}]])
				Number  search for variable declaration
searchpair( {start}, {middle}, {end} [, {flags} [, {skip} [, {stopline}]]])
				Number	search for other end of start/end pair
searchpairpos( {start}, {middle}, {end} [, {flags} [, {skip} [, {stopline}]]])
				List	search for other end of start/end pair
searchpos( {pattern} [, {flags} [, {stopline}]])
				List	search for {pattern}
server2client( {clientid}, {string})
				Number	send reply string
serverlist()			String	get a list of available servers
setbufvar( {expr}, {varname}, {val})	set {varname} in buffer {expr} to {val}
setcmdpos( {pos})		Number	set cursor position in command-line
setline( {lnum}, {line})	Number	set line {lnum} to {line}
setloclist( {nr}, {list}[, {action}])
				Number	modify location list using {list}
setpos( {expr}, {list})		none	set the {expr} position to {list}
setqflist( {list}[, {action}])	Number	modify quickfix list using {list}
setreg( {n}, {v}[, {opt}])	Number	set register to value and type
settabwinvar( {tabnr}, {winnr}, {varname}, {val})    set {varname} in window
					{winnr} in tab page {tabnr} to {val}
setwinvar( {nr}, {varname}, {val})	set {varname} in window {nr} to {val}
shellescape( {string})		String	escape {string} for use as shell
					command argument
simplify( {filename})		String	simplify filename as much as possible
sort( {list} [, {func}])	List	sort {list}, using {func} to compare
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}
str2nr( {expr} [, {base}])	Number	convert string to number
strftime( {format}[, {time}])	String	time in specified format
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( {src}, {start}[, {len}])
				String	{len} characters of {src} at {start}
strridx( {haystack}, {needle} [, {start}])
				Number	last index of {needle} in {haystack}
strtrans( {expr})		String	translate string to make it printable
submatch( {nr})			String	specific match in ":substitute"
substitute( {expr}, {pat}, {sub}, {flags})
				String	all {pat} in {expr} replaced with {sub}
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}
system( {expr} [, {input}])	String	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
taglist( {expr})		List	list of tags matching {expr}
tagfiles()			List    tags files used
tempname()			String	name for a temporary file
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}
type( {name})			Number	type of variable {name}
values( {dict})			List	values in {dict}
virtcol( {expr})		Number	screen column of cursor or mark
visualmode( [expr])		String	last visual mode used
winbufnr( {nr})			Number	buffer number of window {nr}
wincol()			Number	window column of the cursor
winheight( {nr})		Number	height of window {nr}
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}
writefile({list}, {fname} [, {binary}])
				Number	write list of lines to file {fname}


add({list}, {expr})					*add()*
		Append the item {expr} to |List| {list}.  Returns the
		resulting |List|.  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|.
		Use |insert()| to add an item at another position.



append({lnum}, {expr})					*append()*
		When {expr} is a |List|: Append each item of the |List| as a
		text line below line {lnum} in the current buffer.
		Otherwise append {expr} 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"])
 

							*argc()*
argc()		The result is the number of files in the argument list of the
		current window.  See |arglist|.


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


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


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


							*browsedir()*
browsedir({title}, {initdir})
		Put up a directory requester.  This only works when
		"has("browse")" returns non-zero (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.


bufexists({expr})					*bufexists()*
		The result is a Number, which is non-zero if a buffer called
		{expr} exists.
		If the {expr} argument is a number, buffer numbers are used.
		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 'filetype' 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.
		Use "bufexists(0)" to test for the existence of an alternate
		file name.

							*buffer_exists()*
		Obsolete name: buffer_exists().


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


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


bufname({expr})						*bufname()*
		The result is the name of a buffer, as it is displayed by the
		":ls" command.
		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)
 		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 not zero, a new, unlisted,
		buffer is created and its number is returned.
		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.

							*buffer_number()*
		Obsolete name: buffer_number().

							*last_buffer_nr()*
		Obsolete name for bufnr("$"): last_buffer_nr().


bufwinnr({expr})					*bufwinnr()*
		The result is a Number, which is the number 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 " . (bufwinnr(1))

 		The number can be used with |CTRL-W_w| and ":wincmd w"
		|:wincmd|.
		Only deals with the current tab page.



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|.
		{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 returns zero.
		This function is only useful when there are multibyte
		characters, otherwise the returned value is equal to {nr}.
		Composing characters are counted as a separate character.
		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))
 		If there are less than {nr} characters -1 is returned.
		If there are exactly {nr} characters the length of the string
		is returned.


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|


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})						*char2nr()*
		Return number value of the first char in {expr}.  Examples:
			char2nr(" ")		returns 32
			char2nr("ABC")		returns 65
 		The current 'encoding' is used.  Example for "utf-8":
			char2nr("á")		returns 225
			char2nr("á"[0])		returns 195
 		nr2char() does the opposite.


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


							*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 characters in the cursor line plus one)
		    'x	    position of mark x (if the mark is not set, 0 is
			    returned)
		To get the line number use |line()|.  To get both use
		|getpos()|.
		For the screen column position use |virtcol()|.
		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>
 


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


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.


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 non-zero when searching for matches is to be aborted,
		zero otherwise.
		Only to be used by the function specified with the
		'completefunc' option.


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


							*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 vise versa.  But the items are identical, thus
		changing an item changes the contents of both |Lists|.  Also
		see |deepcopy()|.


count({comp}, {expr} [, {ic} [, {start}]])			*count()*
		Return the number of times an item with value {expr} appears
		in |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 non-zero then case is ignored.



							*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