eval.txt For Vim version 7.4. Last change: 2014 Dec 07LINK

VIM REFERENCE MANUAL by Bram Moolenaar

Expression evaluation expression expr E15 evalLINK

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 variablesLINK

1.1 Variable types

E712LINK

There are six types of variables:

Number A 32 or 64 bit signed number. expr-number NumberLINK

Examples: -123 0x10 0177

Float A floating point number. floating-point-format FloatLINK

{only when compiled with the +float feature}

Examples: 123.456 1.15e-6 -1.1e3

String A NUL terminated string of 8-bit unsigned characters (bytes).

expr-string 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"

octalLINK

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 empty():

:if !empty("foo")

E745 E728 E703 E729 E730 E731LINK

List, Dictionary and Funcref types are not automatically converted.

E805 E806 E808LINK

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.

E706 sticky-type-checkingLINK

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, as well are Float and Number. Consider this sequence of

commands:

:let l = "string"

:let l = 44 " changes type from String to Number

:let l = [1, 2, 3] " error! l is still a Number

:let l = 4.4 " changes type from Number to Float

:let l = "string" " error!

1.2 Function references

Funcref E695 E718LINK

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 E707LINK

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)

1.3 Lists

list List Lists E686LINK

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 E697LINK

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 E684LINK

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

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

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

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

E714LINK

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 Dictionaries DictionaryLINK

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 E723LINK

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 E717LINK

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

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

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

Dictionary function

Dictionary-function self E725 E862LINK

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

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.

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

E715LINK

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

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

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 E109LINK

-----

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 expr3LINK

---------------

expr-barbar expr-&&LINK

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 expr4LINK

-----

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

expr-< expr-<= expr-=~ expr-!~LINK

expr-==# expr-!=# expr-># expr->=#LINK

expr-<# expr-<=# expr-=~# expr-!~#LINK

expr-==? expr-!=? expr->? expr->=?LINK

expr-<? expr-<=? expr-=~? expr-!~?LINK

expr-is expr-isnot expr-is# expr-isnot#LINK

expr-is? expr-isnot?LINK

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 E692LINK

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 E736LINK

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 E694LINK

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 or a Dictionary this checks if the

expressions are referring to the same List or Dictionary instance. A copy

of a List is different from the original List. When using "is" without

a List or a Dictionary 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 and "0 is []" is

false and not an error. "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 "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 expr6LINK

---------------

expr6 + expr6 .. Number addition or List concatenation expr-+LINK

expr6 - expr6 .. Number subtraction expr--LINK

expr6 . expr6 .. String concatenation expr-.LINK

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

expr7 / expr7 .. Number division expr-/LINK

expr7 % expr7 .. Number modulo expr-%LINK

For all, except ".", 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 the righthand side of '%' is zero, the result is 0.

None of these work for Funcrefs.

. and % do not work for Float. E804LINK

expr7 expr7LINK

-----

! expr7 logical NOT expr-!LINK

- expr7 unary minus expr-unary--LINK

+ expr7 unary plus expr-unary-+LINK

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 expr8LINK

-----

expr8[expr1] item of String or List expr-[] E111LINK

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. This doesn't recognize multi-byte encodings, see byteidx() for

an alternative.

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-[:]LINK

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. This doesn't recognize multi-byte encodings, see

byteidx() for computing the indexes.

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

sublist sliceLINK

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

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.

expr9LINK

number

------

number number constant expr-number LINK

hex-number octal-numberLINK

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

floating-point-formatLINK

Floating point numbers can be written in two forms:

[-+]{N}.{M}

[-+]{N}.{M}e[-+]{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}

float-pi float-eLINK

A few useful values to copy&paste:

:let pi = 3.14159265359

:let e = 2.71828182846

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.

floating-point-precisionLINK

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 expr-string E114LINK

------

"string" string constant expr-quoteLINK

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. This is for use

in mappings, the 0x80 byte is escaped. Don't use <Char-xxxx> to get a

utf-8 character, use \uxxxx as mentioned above.

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 E115LINK

---------------

'string' string constant expr-'LINK

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 E113LINK

------

&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 @rLINK

--------

@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 E110LINK

-------

(expr1) nested expression

environment variable expr-envLINK

--------------------

$VAR environment variable

The String value of any environment variable. When it is not defined, the

result is an empty string.

expr-env-expandLINK

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

-----------------

variable internal variable

See below internal-variables.

function call expr-function E116 E118 E119 E120LINK

-------------

function(expr1, ...) function call

See below functions.

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

3. Internal variable internal-variables E461LINK

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 b:LINK

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 changetickLINK

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 w:LINK

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

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

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

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

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

v:beval_col beval_col-variableLINK

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

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

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

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

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:char char-variableLINK

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

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

v:charconvert_to

The name of the character encoding of a file after conversion.

Only valid while evaluating the 'charconvert' option.

v:cmdarg cmdarg-variableLINK

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

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

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.

v:count1 count1-variableLINK

v:count1 Just like "v:count", but defaults to one when no count is

used.

v:ctype ctype-variableLINK

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

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:errmsg errmsg-variableLINK

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

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

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

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

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

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

v:fname_new The name of the new version of the file. Only valid while

evaluating 'diffexpr'.

v:fname_diff fname_diff-variableLINK

v:fname_diff The name of the diff (patch) file. Only valid while

evaluating 'patchexpr'.

v:folddashes folddashes-variableLINK

v:folddashes Used for 'foldtext': dashes representing foldlevel of a closed

fold.

Read-only in the sandbox. fold-foldtext

v:foldlevel foldlevel-variableLINK

v:foldlevel Used for 'foldtext': foldlevel of closed fold.

Read-only in the sandbox. fold-foldtext

v:foldend foldend-variableLINK

v:foldend Used for 'foldtext': last line of closed fold.

Read-only in the sandbox. fold-foldtext

v:foldstart foldstart-variableLINK

v:foldstart Used for 'foldtext': first line of closed fold.

Read-only in the sandbox. fold-foldtext

v:hlsearch hlsearch-variableLINK

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

the like :nohlsearch command, setting it to one acts like

let &hlsearch = &hlsearch

v:insertmode insertmode-variableLINK

v:insertmode Used for the InsertEnter and InsertChange autocommand

events. Values:

i Insert mode

r Replace mode

v Virtual Replace mode

v:key key-variableLINK

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

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

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

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

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

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

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:oldfiles oldfiles-variableLINK

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:operator operator-variableLINK

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

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

v:profiling Normally zero. Set to one after using ":profile start".

See profiling.

v:progname progname-variableLINK

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

v:progpath Contains the command with which Vim was invoked, including the

path. Useful if you want to message a Vim server using a

--remote-expr.

To get the full path use:

echo exepath(v:progpath)

NOTE: This does not work when the command is a relative path

and the current directory has changed.

Read-only.

v:register register-variableLINK

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

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

v:servername The resulting registered x11-clientserver name if any.

Read-only.

v:searchforward v:searchforward searchforward-variableLINK

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

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

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

v:swapname swapname-variableLINK

v:swapname Only valid when executing SwapExists autocommands: Name of

the swap file found. Read-only.

v:swapchoice swapchoice-variableLINK

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

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

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

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

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

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

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("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:warningmsg warningmsg-variableLINK

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

v:windowid windowid-variableLINK

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

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

4. Builtin Functions functionsLINK

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( {list}, {item}) List append {item} to List {list}

and( {expr}, {expr}) Number bitwise AND

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

arglistid( [{winnr}, [ {tabnr}]])

Number argument list id

argv( {nr}) String {nr} entry of the argument list

argv( ) List the argument list

asin( {expr}) Float arc sine of {expr}

atan( {expr}) Float arc tangent of {expr}

atan2( {expr}, {expr}) Float arc tangent of {expr1} / {expr2}

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}

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

changenr() Number current change number

char2nr( {expr}[, {utf8}]) Number ASCII/UTF8 value of first char in {expr}

cindent( {lnum}) Number C indent for line {lnum}

clearmatches() none clear all matches

col( {expr}) Number column nr 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

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( {list}, {expr} [, {ic} [, {start}]])

Number count how many {expr} are in {list}

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}

deepcopy( {expr} [, {noref}]) 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

exepath( {expr}) String full path of the command {expr}

exists( {expr}) Number TRUE if {expr} exists

extend( {expr1}, {expr2} [, {expr3}])

List/Dict insert items of {expr2} into {expr1}

exp( {expr}) Float exponential of {expr}

expand( {expr} [, {nosuf} [, {list}]])

any 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}

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

function( {name}) Funcref 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}

getbufline( {expr}, {lnum} [, {end}])

List lines {lnum} to {end} of buffer {expr}

getbufvar( {expr}, {varname} [, {def}])

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 current command-line type

getcmdwintype() String return current command-line window type

getcurpos() List position of the cursor

getcwd() String the current working directory

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}

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

getmatches() List list of current matches

getpid() Number process ID of Vim

getpos( {expr}) List position of cursor, mark, etc.

getqflist() List list of quickfix items

getreg( [{regname} [, 1 [, {list}]]])

String or List contents of register

getregtype( [{regname}]) String type of register

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}

getwinposx() Number X coord in pixels of GUI Vim window

getwinposy() Number Y coord in pixels of GUI Vim window

getwinvar( {nr}, {varname} [, {def}])

any variable {varname} in window {nr}

glob( {expr} [, {nosuf} [, {list}]])

any expand file wildcards in {expr}

globpath( {path}, {expr} [, {nosuf} [, {list}]])

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}]

invert( {expr}) Number bitwise invert

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

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( {expr}, {string}) List/Dict change each item in {expr} 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}

match( {expr}, {pat}[, {start}[, {count}]])

Number position where {pat} matches in {expr}

matchadd( {group}, {pattern}[, {priority}[, {id}]])

Number highlight {pattern} with {group}

matchaddpos( {group}, {list}[, {priority}[, {id}]])

Number highlight positions with {group}

matcharg( {nr}) List arguments of :match

matchdelete( {id}) Number delete match identified by {id}

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( [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}) String shorten directory names in a path

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

pumvisible() Number whether popup menu is visible

pyeval( {expr}) any evaluate Python expression

py3eval( {expr}) any evaluate python3 expression

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

round( {expr}) Float round off {expr}

screenattr( {row}, {col}) Number attribute at screen position

screenchar( {row}, {col}) Number character at screen position

screencol() Number current cursor column

screenrow() Number current cursor row

search( {pattern} [, {flags} [, {stopline} [, {timeout}]]])

Number search for {pattern}

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}]]])

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}

setmatches( {list}) 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}

setreg( {n}, {v}[, {opt}]) Number set register to value and type

settabvar( {nr}, {varname}, {val}) set {varname} in tab page {nr} to {val}

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}

sha256( {string}) String SHA256 checksum of {string}

shellescape( {string} [, {special}])

String escape {string} for use as shell

command argument

shiftwidth() Number effective value of 'shiftwidth'

simplify( {filename}) String simplify filename as much as possible

sin( {expr}) Float sine of {expr}

sinh( {expr}) Float hyperbolic sine of {expr}

sort( {list} [, {func} [, {dict}]])

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}

sqrt( {expr}) Float square root of {expr}

str2float( {expr}) Float convert String to Float

str2nr( {expr} [, {base}]) Number convert String to Number

strchars( {expr}) Number character length of the String {expr}

strdisplaywidth( {expr} [, {col}]) Number display length of the String {expr}

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

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}

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

taglist( {expr}) List list of tags matching {expr}

tagfiles() List tags files used

tempname() String name for a temporary file

tan( {expr}) Float tangent of {expr}

tanh( {expr}) Float hyperbolic tangent of {expr}

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}

trunc( {expr}) Float truncate Float {expr}

type( {name}) Number type of variable {name}

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

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} [, {flags}])

Number write list of lines to file {fname}

xor( {expr}, {expr}) Number bitwise XOR

abs({expr}) abs()LINK

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

{only available when compiled with the +float feature}

acos({expr}) acos()LINK

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

{only available when compiled with the +float feature}

add({list}, {expr}) add()LINK

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.

and({expr}, {expr}) and()LINK

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)

append({lnum}, {expr}) append()LINK

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()LINK

argc() The result is the number of files in the argument list of the

current window. See arglist.

argidx()LINK

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()LINK

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.

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

argv()LINK

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

asin({expr}) asin()LINK

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

{only available when compiled with the +float feature}

atan({expr}) atan()LINK

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

{only available when compiled with the +float feature}

atan2({expr1}, {expr2}) atan2()LINK

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

{only available when compiled with the +float feature}

browse()LINK

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()LINK

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()LINK

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

buffer_exists()LINK

Obsolete name: buffer_exists().

buflisted({expr}) buflisted()LINK

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()LINK

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()LINK

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()LINK

Obsolete name: buffer_name().

bufnr()LINK

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()LINK

Obsolete name: buffer_number().

last_buffer_nr()LINK

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

bufwinnr({expr}) bufwinnr()LINK

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()LINK

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()LINK

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

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.

byteidxcomp({expr}, {nr}) byteidxcomp()LINK

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 different from byteidx() when 'encoding' is set to

a Unicode encoding.

call({func}, {arglist} [, {dict}]) call() E699LINK

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

ceil({expr}) ceil()LINK

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

{only available when compiled with the +float feature}

changenr() changenr()LINK

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()LINK

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 1, always treat as utf-8 characters.

A combining character is a separate character.

nr2char() does the opposite.

cindent({lnum}) cindent()LINK

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.

clearmatches() clearmatches()LINK

Clears all matches previously defined by matchadd() and the

:match commands.

col()LINK

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

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() E785LINK

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

complete_add({expr}) complete_add()LINK

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()LINK

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()LINK

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

copy()LINK

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

see deepcopy().

cos({expr}) cos()LINK

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

{only available when compiled with the +float feature}

cosh({expr}) cosh()LINK

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

{only available when compiled with the +float feature}

count({comp}, {expr} [, {ic} [, {start}]]) count()LINK

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()LINK

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()LINK

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}, {off}]

[{lnum}, {col}, {off}, {curswant}]

This is like the return value of getpos() or getcurpos(),

but without the first item.

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.

deepcopy({expr}[, {noref}]) deepcopy() E698LINK

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, a copy for it

is made, recursively. Thus changing an item in the copy does

not change the contents of the original 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.

E724LINK

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

delete({fname}) delete()LINK

Deletes the file by the name {fname}. The result is a Number,

which is 0 if the file was deleted successfully, and non-zero

when the deletion failed.

Use remove() to delete an item from a List.

To delete a line from the buffer use :delete. Use :exe

when the line number is in a variable.

did_filetype()LINK

did_filetype() Returns non-zero 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

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()LINK

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.

diff_hlID({lnum}, {col}) diff_hlID()LINK

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.

empty({expr}) empty()LINK

Return the Number 1 if {expr} is empty, zero otherwise.

A List or Dictionary is empty when it does not have any

items. A Number is empty when its value is zero.

For a long List this is much faster than comparing the

length with zero.

escape({string}, {chars}) escape()LINK

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

eval()LINK

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 and composites of

them. Also works for Funcrefs that refer to existing

functions.

eventhandler() eventhandler()LINK

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()LINK

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

On MS-DOS and 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 ".exe;.com;.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-DOS and 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({expr}) exepath()LINK

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.

exists()LINK

exists({expr}) The result is a Number, which is non-zero if {expr} is

defined, zero otherwise. 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). Also works for a

variable that is a Funcref.

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.

For checking for a supported feature use has().

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.

exp({expr}) exp()LINK

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

{only available when compiled with the +float feature}

expand({expr} [, {nosuf} [, {list}]]) expand()LINK

Expand wildcards and the following special keywords in {expr}.

'wildignorecase' applies.

If {list} is given and it is non-zero, 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

<sfile> sourced script file or function name

<slnum> sourced script file line number

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

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.

extend({expr1}, {expr2} [, {expr3}]) extend()LINK

{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 item

{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 E737LINK

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.

Returns {expr1}.

feedkeys({string} [, {mode}]) feedkeys()LINK

Characters in {string} are queued for processing as if they

come from a mapping or were typed by the user. They are added

to the end of the typeahead buffer, thus if a mapping is still

being executed these characters come after them.

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.

If {mode} is absent, keys are remapped.

{mode} is a String, which can contain these character flags:

'm' Remap keys. This is default.

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

Return value is always 0.

filereadable({file}) filereadable()LINK

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_readable()LINK

Obsolete name: file_readable().

filewritable({file}) filewritable()LINK

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.

filter({expr}, {string}) filter()LINK

{expr} must be a List or a Dictionary.

For each item in {expr} evaluate {string} and when the result

is zero remove the item from the List or Dictionary.

Inside {string} v:val has the value of the current item.

For a Dictionary v:key has the key 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 {string} 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.

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 {expr}, the List or Dictionary that was filtered.

When an error is encountered while evaluating {string} no

further items in {expr} are processed.

finddir({name}[, {path}[, {count}]]) finddir()LINK

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}

findfile({name}[, {path}[, {count}]]) findfile()LINK

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

float2nr({expr}) float2nr()LINK

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

in -0x80000000.

Examples:

echo float2nr(3.95)

3

echo float2nr(-23.45)

-23

echo float2nr(1.0e100)

2147483647

echo float2nr(-1.0e150)

-2147483647

echo float2nr(1.0e-100)

0

{only available when compiled with the +float feature}

floor({expr}) floor()LINK

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

{only available when compiled with the +float feature}

fmod({expr1}, {expr2}) fmod()LINK

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

{only available when compiled with +float feature}

fnameescape({string}) fnameescape()LINK

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

fnamemodify({fname}, {mods}) fnamemodify()LINK

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

Note: Environment variables don't work in {fname}, use

expand() first then.

foldclosed({lnum}) foldclosed()LINK

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.

foldclosedend({lnum}) foldclosedend()LINK

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.

foldlevel({lnum}) foldlevel()LINK

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.

foldtext()LINK

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

{not available when compiled without the +folding feature}

foldtextresult({lnum}) foldtextresult()LINK

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}

foreground()LINK

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}

function({name}) function() E700LINK

Return a Funcref variable that refers to function {name}.

{name} can be a user defined function or an internal function.

garbagecollect([{atexit}]) garbagecollect()LINK

Cleanup unused Lists and Dictionaries 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.

get({list}, {idx} [, {default}]) get()LINK

Get item {idx} from List {list}. When this item is not

available return {default}. Return zero when {default} is

omitted.

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.

getbufline()LINK

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, "$")

getbufvar({expr}, {varname} [, {def}]) getbufvar()LINK

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.

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")

getchar([expr]) getchar()LINK

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 an 8-bit 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 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 and v:mouse_win. 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

There is no prompt, you will somehow have to make clear to the

user that a character has to be typed.

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 syntetic 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()LINK

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.

getcmdline() getcmdline()LINK

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

getcmdpos() getcmdpos()LINK

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()LINK

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()LINK

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.

getcurpos()LINK

getcurpos() Get the position of the cursor. This is like getpos('.'), but

includes an extra item in the list:

[bufnum, lnum, col, off, curswant]

The "curswant" number is the preferred column when moving the

cursor vertically.

This can be used to save and restore the cursor position:

let save_cursor = getcurpos()

MoveTheCursorAround

call setpos('.', save_cursor)

getcwd()LINK

getcwd() The result is a String, which is the name of the current

working directory.

getfsize({fname}) getfsize()LINK

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.

getfontname([{name}]) getfontname()LINK

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 2 GUI accepts any font name, thus checking

for a valid name does not work.

getfperm({fname}) getfperm()LINK

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

getftime({fname}) getftime()LINK

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.

getftype({fname}) getftype()LINK

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.

getline()LINK

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)

To get lines from another buffer see getbufline()

getloclist({nr}) getloclist()LINK

Returns a list with all the entries in the location list for

window {nr}. 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().

getmatches() getmatches()LINK

Returns a List with all matches previously defined 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

getpid()LINK

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. On MS-DOS it's always zero.

getpos()LINK

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.

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 getcurpos() and setpos().

getqflist() getqflist()LINK

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

lnum line number in the buffer (first line is 1)

col column number (first column is 1)

vcol non-zero: "col" is visual column

zero: "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 non-zero: 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

getreg([{regname} [, 1 [, {list}]]]) getreg()LINK

The result is a String, which is the contents of register

{regname}. Example:

:let cliptext = getreg('*')

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 non-zero 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).

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

getregtype([{regname}]) getregtype()LINK

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.

gettabvar({tabnr}, {varname} [, {def}]) gettabvar()LINK

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.

gettabwinvar({tabnr}, {winnr}, {varname} [, {def}]) gettabwinvar()LINK

Get the value of window-local variable {varname} in window

{winnr} in tab page {tabnr}.

When {varname} starts with "&" get the value of a window-local

option.

When {varname} is empty a dictionary with all window-local

variables is returned.

Note that {varname} must be the name without "w:".

Tabs are numbered starting with one. For the current tabpage

use getwinvar().

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')

getwinposx()LINK

getwinposx() The result is a Number, which is the X coordinate in pixels of

the left hand side of the GUI Vim window. The result will be

-1 if the information is not available.

getwinposy()LINK

getwinposy() The result is a Number, which is the Y coordinate in pixels of

the top of the GUI Vim window. The result will be -1 if the

information is not available.

getwinvar({winnr}, {varname} [, {def}]) getwinvar()LINK

Like gettabwinvar() for the current tabpage.

Examples:

:let list_is_on = getwinvar(2, '&list')

:echo "myvar = " . getwinvar(1, 'myvar')

glob({expr} [, {nosuf} [, {list}]]) glob()LINK

Expand the file wildcards in {expr}. See wildcards for the

use of special characters.

Unless the optional {nosuf} argument is given and is non-zero,

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

A name for a non-existing file is not included. A symbolic

link is only included if it points to an existing file.

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.

globpath({path}, {expr} [, {nosuf} [, {list}]]) globpath()LINK

Perform glob() 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 non-zero,

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 non-zero 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)

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.

has()LINK

has({feature}) The result is a Number, which is 1 if the feature {feature} is

supported, zero otherwise. The {feature} argument is a

string. See feature-list below.

Also see exists().

has_key({dict}, {key}) has_key()LINK

The result is a Number, which is 1 if Dictionary {dict} has

an entry with key {key}. Zero otherwise.

haslocaldir() haslocaldir()LINK

The result is a Number, which is 1 when the current

window has set a local path via :lcd, and 0 otherwise.

hasmapto({what} [, {mode} [, {abbr}]]) hasmapto()LINK

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 non-zero 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 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".

histadd({history}, {item}) histadd()LINK

Add the String {item} to the history {history} which can be

one of: hist-namesLINK

"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

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.

histdel({history} [, {item}]) histdel()LINK

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)

histget({history} [, {index}]) histget()LINK

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

histnr({history}) histnr()LINK

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")

hlexists({name}) hlexists()LINK

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()LINK

Obsolete name: highlight_exists().

hlID()LINK

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()LINK

Obsolete name: highlightID().

hostname() hostname()LINK

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()LINK

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.

{only available when compiled with the +multi_byte feature}

indent()LINK

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.

index({list}, {expr} [, {start} [, {ic}]]) index()LINK

Return the lowest index in List {list} 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 {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 non-zero, ignore case. Otherwise

case must match.

-1 is returned when {expr} is not found in {list}.

Example:

:let idx = index(words, "the")

:if index(numbers, 123) >= 0

input({prompt} [, {text} [, {completion}]]) input()LINK

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

inputdialog({prompt} [, {text} [, {cancelreturn}]]) inputdialog()LINK

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.

inputlist({textlist}) inputlist()LINK

{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. 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'])

inputrestore() inputrestore()LINK

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()LINK

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()LINK

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.

insert({list}, {item} [, {idx}]) insert()LINK

Insert {item} at the start of List {list}.

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

invert({expr}) invert()LINK

Bitwise invert. The argument is converted to a number. A

List, Dict or Float argument causes an error. Example:

:let bits = invert(bits)

isdirectory({directory}) isdirectory()LINK

The result is a Number, which is non-zero 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.

islocked({expr}) islocked() E786LINK

The result is a Number, which is non-zero 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.

items({dict}) items()LINK

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.

join({list} [, {sep}]) join()LINK

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

keys({dict}) keys()LINK

Return a List with all the keys of {dict}. The List is in

arbitrary order.

len() E701LINK

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 Dictionary the number of entries in the

Dictionary is returned.

Otherwise an error is given.

libcall() E364 E368LINK

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")

libcallnr()LINK

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)

line()LINK

line({expr}) 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

w$ last line visible in current window

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

Examples:

line(".") line number of the cursor

line("'t") line number of mark t

line("'" . marker) line number of mark marker

last-position-jumpLINK

This autocommand jumps to the last known position in a file

just after opening it, if the '" mark is set:

:au BufReadPost * if line("'\"") > 1 && line("'\"") <= line("$") | exe "normal! g`\"" | endif

line2byte({lnum}) line2byte()LINK

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.

lispindent({lnum}) lispindent()LINK

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.

localtime() localtime()LINK

Return the current time, measured as seconds since 1st Jan

1970. See also strftime() and getftime().

log({expr}) log()LINK

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

{only available when compiled with the +float feature}

log10({expr}) log10()LINK

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

{only available when compiled with the +float feature}

luaeval({expr}[, {expr}]) luaeval()LINK

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.

{only available when compiled with the +lua feature}

map({expr}, {string}) map()LINK

{expr} must be a List or a Dictionary.

Replace each item in {expr} with the result of evaluating

{string}.

Inside {string} 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 {string} 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

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 {expr}, the List or Dictionary that was filtered.

When an error is encountered while evaluating {string} no

further items in {expr} are processed.

maparg({name}[, {mode} [, {abbr} [, {dict}]]]) maparg()LINK

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.

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

"" Normal, Visual and Operator-pending

When {mode} is omitted, the modes for "" are used.

When {abbr} is there and it is non-zero use abbreviations

instead of mappings.

When {dict} is there and it is non-zero return a dictionary

containing all the information of the mapping with the

following items:

"lhs" The {lhs} of the mapping.

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

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

"nowait" Do not wait for other, longer mappings.

(:map-<nowait>).

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')

mapcheck({name}[, {mode} [, {abbr}]]) mapcheck()LINK

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

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

match({expr}, {pat}[, {start}[, {count}]]) match()LINK

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()LINK

Vim doesn't have a strpbrk() function. But you can do:

:let sepidx = match(line, '[.,;: \t]')

strcasestr()LINK

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.

matchadd() E798 E799 E801LINK

matchadd({group}, {pattern}[, {priority}[, {id}]])

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

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

matchadd() automatically chooses a free 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().

matchaddpos({group}, {pos}[, {priority}[, {id}]]) matchaddpos()LINK

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.

These matches cannot be set via setmatches(), however they

can still be deleted by clearmatches().

matcharg({nr}) matcharg()LINK

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.

matchdelete({id}) matchdelete() E802 E803LINK

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

matchend({expr}, {pat}[, {start}[, {count}]]) matchend()LINK

Same as match(), but return the index of first character

after the match. Example:

:echo matchend("testing", "ing")

results in "7".

strspn() strcspn()LINK

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

matchlist({expr}, {pat}[, {start}[, {count}]]) matchlist()LINK

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.

matchstr({expr}, {pat}[, {start}[, {count}]]) matchstr()LINK

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.

max()LINK

max({list}) Return the maximum value of all items in {list}.

If {list} is not a list or one of the items in {list} cannot

be used as a Number this results in an error.

An empty List results in zero.

min()LINK

min({list}) Return the minimum value of all items in {list}.

If {list} is not a list or one of the items in {list} cannot

be used as a Number this results in an error.

An empty List results in zero.

mkdir() E739LINK

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 0755 (rwxr-xr-x: r/w for

the user readable for others). Use 0700 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 0755.

Example:

:call mkdir($HOME . "/tmp/foo/bar", "p", 0700)

This function is not available in the sandbox.

Not available on all systems. To check use:

:if exists("*mkdir")

mode()LINK

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

that " " and "0" are also non-empty strings.

n Normal

no Operator-pending

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

R Replace R

Rv Virtual Replace gR

c Command-line

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

This is useful in the 'statusline' option or when used

with remote_expr() In most other places it always returns

"c" or "n".

Also see visualmode().

mzeval({expr}) mzeval()LINK

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")

{only available when compiled with the +mzscheme feature}

nextnonblank({lnum}) nextnonblank()LINK

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

nr2char({expr}[, {utf8}]) nr2char()LINK

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.

or({expr}, {expr}) or()LINK

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)

pathshorten({expr}) pathshorten()LINK

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 single letters. Leading

'~' and '.' characters are kept. Example:

:echo pathshorten('~/.vim/autoload/myfile.vim')

~/.v/a/myfile.vim

It doesn't matter if the path exists or not.

pow({x}, {y}) pow()LINK

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

{only available when compiled with the +float feature}

prevnonblank({lnum}) prevnonblank()LINK

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

printf({fmt}, {expr1} ...) printf()LINK

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"

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

%f floating point number in the form 123.456

%e floating point number in the form 1.234e3

%E floating point number in the form 1.234E3

%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 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, 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-o printf-x printf-XLINK

doxX The Number argument is converted to signed decimal

(d), 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.

printf-cLINK

c The Number argument is converted to a byte, and the

resulting character is written.

printf-sLINK

s The text of the String argument is used. If a

precision is specified, no more bytes than the number

specified are used.

S The text of the String argument is used. If a

precision is specified, no more display cells than the

number specified are used. Without the +multi_byte

feature works just like 's'.

printf-f E807LINK

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

"0.0 / 0.0" results in "nan".

Example:

echo printf("%.2f", 12.115)

12.12

Note that roundoff depends on the system libraries.

Use round() when in doubt.

printf-e printf-ELINK

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

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-%LINK

% 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 E767LINK

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.

pumvisible() pumvisible()LINK

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.

E860LINK

py3eval({expr}) py3eval()LINK

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.

{only available when compiled with the +python3 feature}

E858 E859LINK

pyeval({expr}) pyeval()LINK

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.

{only available when compiled with the +python feature}

E726 E727LINK

range({expr} [, {max} [, {stride}]]) range()LINK

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!

readfile()LINK

readfile({fname} [, {binary} [, {max}]])

Read file {fname} and return a List, each line of the file

as an item. Lines 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 {binary/append} 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.

When the file can't be opened an error message is given and

the result is an empty list.

Also see writefile().

reltime([{start} [, {end}]]) reltime()LINK

Return an item that represents a time value. The format of

the item depends on the system. It can be passed to

reltimestr() to convert it to a string.

Without an argument it 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().

{only available when compiled with the +reltime feature}

reltimestr({time}) reltimestr()LINK

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.

{only available when compiled with the +reltime feature}

remote_expr() E449LINK

remote_expr({server}, {string} [, {idvar}])

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, 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 cause a local error message to be issued

and the result will be the empty string.

Examples:

:echo remote_expr("gvim", "2+2")

:echo remote_expr("gvim1", "b:current_syntax")

remote_foreground({server}) remote_foreground()LINK

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.

{only in the Win32, Athena, Motif and GTK GUI versions and the

Win32 console version}

remote_peek({serverid} [, {retvar}]) remote_peek()LINK

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

remote_read({serverid}) remote_read()LINK

Return the oldest available reply from {serverid} and consume

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

remote_send() E241LINK

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>')

remove({list}, {idx} [, {end}]) remove()LINK

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)

remove({dict}, {key})

Remove the entry from {dict} with key {key}. Example:

:echo "removed " . remove(dict, "one")

If there is no {key} in {dict} this is an error.

Use delete() to remove a file.

rename({from}, {to}) rename()LINK

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.

repeat({expr}, {count}) repeat()LINK

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

resolve({filename}) resolve() E655LINK

On MS-Windows, when {filename} is a shortcut (a .lnk file),

returns the path the shortcut points to in a simplified form.

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.

reverse()LINK

reverse({list}) Reverse the order of items in {list} in-place. Returns

{list}.

If you want a list to remain unmodified make a copy first:

:let revlist = reverse(copy(mylist))

round({expr}) round()LINK

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

{only available when compiled with the +float feature}

screenattr(row, col) screenattr()LINK

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.

screenchar(row, col) screenchar()LINK

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.

screencol() screencol()LINK

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>

screenrow() screenrow()LINK

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.

Note: Same restrictions as with screencol().

search({pattern} [, {flags} [, {stopline} [, {timeout}]]]) search()LINK

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

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 {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}

search()-sub-matchLINK

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.

searchdecl({name} [, {global} [, {thisblock}]]) searchdecl()LINK

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

searchpair()LINK

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.

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()LINK

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({pattern} [, {flags} [, {stopline} [, {timeout}]]]) searchpos()LINK

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.

server2client( {clientid}, {string}) server2client()LINK

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")

serverlist() serverlist()LINK

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()

setbufvar({expr}, {varname}, {val}) setbufvar()LINK

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.

setcmdpos({pos}) setcmdpos()LINK

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.

setline({lnum}, {text}) setline()LINK

Set line {lnum} of the current buffer to {text}. To insert

lines use append().

{lnum} is used like with getline().

When {lnum} is just below the last line the {text} will be

added as a new 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.

setloclist({nr}, {list} [, {action}]) setloclist()LINK

Create or replace or add to the location list for window {nr}.

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.

setmatches({list}) setmatches()LINK

Restores a list of matches saved by getmatches(). Returns 0

if successful, otherwise -1. All current matches are cleared

before the list is restored. See example for getmatches().

setpos()LINK

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. Setting the cursor is only possible for

the current buffer. To set a mark in another buffer you can

use the bufnr() function to turn a file name into a buffer

number.

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.

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

setqflist({list} [, {action}]) setqflist()LINK

Create or replace or add to the quickfix list using the items

in {list}. Each item in {list} is 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.

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.

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 you supply an empty {list}, the quickfix list will be

cleared.

Note that the list is not exactly the same as what

getqflist() returns.

If {action} is set to 'a', then the items from {list} are

added to the existing quickfix list. If there is no existing

list, then a new list is created. If {action} is set to 'r',

then the items from the current quickfix list are replaced

with the items from {list}. If {action} is not present or is

set to ' ', then a new list is created.

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.

setreg()LINK

setreg({regname}, {value} [,{options}])

Set the register {regname} to {value}.

{value} may be any value returned by getreg(), including

a List.

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.

E883LINK

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')

This example shows using the functions to save and restore a

register (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).

:let var_a = getreg('a', 1, 1)

:let var_amode = getregtype('a')

....

:call setreg('a', var_a, var_amode)

You can also change the type of a register by appending

nothing:

:call setreg('a', '', 'al')

settabvar({tabnr}, {varname}, {val}) settabvar()LINK

Set tab-local variable {varname} to {val} in tab page {tabnr}.

t:var

Note that the variable name without "t:" must be used.

Tabs are numbered starting with one.

This function is not available in the sandbox.

settabwinvar({tabnr}, {winnr}, {varname}, {val}) settabwinvar()LINK

Set option or local variable {varname} in window {winnr} to

{val}.

Tabs are numbered starting with one. For the current tabpage

use setwinvar().

When {winnr} is zero the current window is used.

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.

setwinvar({nr}, {varname}, {val}) setwinvar()LINK

Like settabwinvar() for the current tab page.

Examples:

:call setwinvar(1, "&list", 0)

:call setwinvar(2, "myvar", "foobar")

sha256({string}) sha256()LINK

Returns a String with 64 hex charactes, which is the SHA256

checksum of {string}.

{only available when compiled with the +cryptv feature}

shellescape({string} [, {special}]) shellescape()LINK

Escape {string} for use as a shell command argument.

On MS-Windows and MS-DOS, when 'shellslash' is not set, it

will enclose {string} in double quotes and double all double

quotes within {string}.

For other systems, 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.

The <NL> character is also escaped. With a non-zero-arg

{special} and '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.

shiftwidth() shiftwidth()LINK

Returns the effective value of 'shiftwidth'. This is the

'shiftwidth' value unless it is zero, in which case it is the

'tabstop' value. To be backwards compatible in indent

plugins, use this:

if exists('*shiftwidth')

func s:sw()

return shiftwidth()

endfunc

else

func s:sw()

return &sw

endfunc

endif

And then use s:sw() instead of &sw.

simplify({filename}) simplify()LINK

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.

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

sin({expr}) sin()LINK

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

{only available when compiled with the +float feature}

sinh({expr}) sinh()LINK

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

{only available when compiled with the +float feature}

sort({list} [, {func} [, {dict}]]) sort() E702LINK

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

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

soundfold()LINK

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.

spellbadword()LINK

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 is used. The

'spell' option must be set and the value of 'spelllang' is

used.

spellsuggest()LINK

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

'spell' option must be set and the values of 'spelllang' and

'spellsuggest' are used.

split({expr} [, {pattern} [, {keepempty}]]) split()LINK

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

: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().

sqrt({expr}) sqrt()LINK

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.

{only available when compiled with the +float feature}

str2float( {expr}) str2float()LINK

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

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'))

{only available when compiled with the +float feature}

str2nr( {expr} [, {base}]) str2nr()LINK

Convert string {expr} to a number.

{base} is the conversion base, it can be 8, 10 or 16.

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.

When {base} is 16 a leading "0x" or "0X" is ignored. With a

different base the result will be zero.

Text after the number is silently ignored.

strchars({expr}) strchars()LINK

The result is a Number, which is the number of characters

String {expr} occupies. Composing characters are counted

separately.

Also see strlen(), strdisplaywidth() and strwidth().

strdisplaywidth({expr}[, {col}]) strdisplaywidth()LINK

The result is a Number, which is the number of display cells

String {expr} occupies on the screen when it starts a {col}.

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

strftime({format} [, {time}]) strftime()LINK

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() and getftime().

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")

stridx({haystack}, {needle} [, {start}]) stridx()LINK

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()LINK

stridx() works similar to the C function strstr(). When used

with a single character it works similar to strchr().

string()LINK

string({expr}) Return {expr} converted to a String. If {expr} is a Number,

Float, String or a composition of them, then the result can be

parsed back with eval().

{expr} type result

String 'string'

Number 123

Float 123.123456 or 1.123456e8

Funcref function('name')

List [item, item]

Dictionary {key: value, key: value}

Note that in String values the ' character is doubled.

Also see strtrans().

strlen()LINK

strlen({expr}) The result is a Number, which is the length of the String

{expr} in bytes.

If you want to count the number of multi-byte characters (not

counting composing characters) use something like this:

:let len = strlen(substitute(str, ".", "x", "g"))

If the argument is a Number it is first converted to a String.

For other types an error is given.

Also see len(), strchars(), strdisplaywidth() and

strwidth().

strpart({src}, {start}[, {len}]) strpart()LINK

The result is a String, which is part of {src}, starting from

byte {start}, with the byte length {len}.

When non-existing bytes are included, 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 three bytes under and after the cursor:

strpart(getline("."), col(".") - 1, 3)

strridx({haystack}, {needle} [, {start}]) strridx()LINK

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()LINK

When used with a single character it works similar to the C

function strrchr().

strtrans({expr}) strtrans()LINK

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.

strwidth({expr}) strwidth()LINK

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

submatch({nr}[, {list}]) submatch()LINK

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.

Example:

:s/\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.

substitute({expr}, {pat}, {sub}, {flags}) substitute()LINK

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')

synID({lnum}, {col}, {trans}) synID()LINK

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.

When {trans} is non-zero, transparent items are reduced to the

item that they reveal. This is useful when wanting to know

the effective color. When {trans} is zero, 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()LINK

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 (as with "fg") highlight-guisp

"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

Example (echoes the color of the syntax item under the

cursor):

:echo synIDattr(synIDtrans(synID(line("."), col("."), 1)), "fg")

synIDtrans({synID}) synIDtrans()LINK

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.

synconcealed({lnum}, {col}) synconcealed()LINK

The result is a List. 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. 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'. The third

and final item in the list is a unique number representing the

specific syntax region matched. 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 use see $VIMRUNTIME/syntax/2html.vim .

synstack({lnum}, {col}) synstack()LINK

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() E677LINK

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

Pipes are not used.

When prepended by :silent the shell 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 and OS/2 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.

systemlist({expr} [, {input}]) systemlist()LINK

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

Returns an empty string on error, so be careful not to run

into E706.

tabpagebuflist([{arg}]) tabpagebuflist()LINK

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

tabpagenr([{arg}]) tabpagenr()LINK

The result is a Number, which is the number of the current

tab page. The first tab page has number 1.

When the optional argument is "$", the number of the last tab

page is returned (the tab page count).

The number can be used with the :tab command.

tabpagewinnr({tabarg} [, {arg}]) tabpagewinnr()LINK

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.

tagfiles()LINK

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}) taglist()LINK

Returns a list of tags matching the regular expression {expr}.

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.

tempname() tempname() temp-file-nameLINK

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

tan({expr}) tan()LINK

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

{only available when compiled with the +float feature}

tanh({expr}) tanh()LINK

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

{only available when compiled with the +float feature}

tolower({expr}) tolower()LINK

The result is a copy of the String given, with all uppercase

characters turned into lowercase (just like applying gu to

the string).

toupper({expr}) toupper()LINK

The result is a copy of the String given, with all lowercase

characters turned into uppercase (just like applying gU to

the string).

tr({src}, {fromstr}, {tostr}) tr()LINK

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}"

trunc({expr}) trunc()LINK

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

{only available when compiled with the +float feature}

type()LINK

type({expr}) The result is a Number, depending on the type of {expr}:

Number: 0

String: 1

Funcref: 2

List: 3

Dictionary: 4

Float: 5

To avoid the magic numbers it should be used this way:

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

undofile({name}) undofile()LINK

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.

undotree() undotree()LINK

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() E882LINK

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

values({dict}) values()LINK

Return a List with all the values of {dict}. The List is

in arbitrary order.

virtcol({expr}) virtcol()LINK

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, '$'])"))

visualmode([expr]) visualmode()LINK

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

non-zero-argLINK

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. Note that " " and "0" are also

non-empty strings, thus cause the mode to be cleared. A List,

Dictionary or Float is not a Number or String, thus does not

cause the mode to be cleared.

wildmenumode() wildmenumode()LINK

Returns non-zero when the wildmenu is active and zero

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

winbufnr()LINK

winbufnr({nr}) The result is a Number, which is the number of the buffer

associated with window {nr}. 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))

wincol()LINK

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.

winheight({nr}) winheight()LINK

The result is a Number, which is the height of window {nr}.

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.

Examples:

:echo "The current window has " . winheight(0) . " lines."

winline()LINK

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()LINK

winnr([{arg}]) The result is a Number, which is the number of the current

window. The top window has number 1.

When the optional argument is "$", the number of the

last window is returned (the window count).

let window_count = winnr('$')

When the optional argument is "#", the number of the last

accessed window is returned (where CTRL-W_p goes to).

If there is no previous window or it is in another tab page 0

is returned.

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

:wincmd.

Also see tabpagewinnr().

winrestcmd()LINK

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()LINK

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.

winsaveview()LINK

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

skipcol columns skipped

Note that no option values are saved.

winwidth({nr}) winwidth()LINK

The result is a Number, which is the width of window {nr}.

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

: exe "normal 50\<C-W>|"

:endif

writefile()LINK

writefile({list}, {fname} [, {flags}])

Write List {list} 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 {flags} contains "a" then append mode is used, lines are

append to the file:

:call writefile(["foo"], "event.log", "a")

:call writefile(["bar"], "event.log", "a")

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")

xor({expr}, {expr}) xor()LINK

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)

feature-listLINK

There are four 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-patchLINK

3. Included patches. The "patch123" feature means that patch 123 has been

included. Note that this form does not check the version of Vim, you need

to inspect v:version for that.

Example (checking version 6.2.148 or later):

:if v:version > 602 || v:version == 602 && has("patch148")

Note that it's possible for patch 147 to be omitted even though 148 is

included.

4. Beyond a certain version or at a certain version and including a specific

patch. The "patch-7.4.237" feature means that the Vim version is 7.5 or

later, or it is version 7.4 and patch 237 was included.

Note that this only works for patch 7.4.237 and later, before that you

need to use the example above that checks v:version. Example:

:if has("patch-7.4.248")

Note that it's possible for patch 147 to be omitted even though 148 is

included.

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

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.

builtin_terms Compiled with some builtin terminals.

byte_offset Compiled with support for 'o' in 'statusline'

cindent Compiled with 'cindent' support.

clientserver Compiled with remote invocation support clientserver.

clipboard Compiled with 'clipboard' support.

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.

cryptv Compiled with encryption support encryption.

cscope Compiled with cscope support.

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 Direct-X and 'renderoptions'.

dnd Compiled with support for the "~ register quote_~.

dos16 16 bits DOS version of Vim.

dos32 32 bits DOS (DJGPP) version of Vim.

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 Compiled with extra Ex commands +ex_extra.

extra_search Compiled with support for 'incsearch' and

'hlsearch'

farsi Compiled with Farsi support 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, MS-DOS, and

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_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)

hangul_input Compiled with Hangul input support. hangul

iconv Can use iconv() for conversion.

insert_expand Compiled with support for CTRL-X expansion commands in

Insert mode.

jumplist Compiled with jumplist support.

keymap Compiled with 'keymap' support.

langmap Compiled with 'langmap' support.

libcall Compiled with libcall() support.

linebreak Compiled with 'linebreak', 'breakat', 'showbreak' and

'breakindent' support.

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 Macintosh version of Vim.

macunix Macintosh version of Vim, using Unix files (OS-X).

menu Compiled with support for :menu.

mksession Compiled with support for :mksession.

modify_fname Compiled with file name modifiers. filename-modifiers

mouse Compiled with support mouse.

mouse_dec Compiled with support for Dec terminal mouse.

mouse_gpm Compiled with support for gpm (Linux console mouse)

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'

multi_byte_encoding 'encoding' is set to a multi-byte 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.

ole Compiled with OLE automation support for Win32.

os2 OS/2 version of Vim.

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 Compiled with Python 2.x interface. has-python

python3 Compiled with Python 3.x interface. has-python

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.

showcmd Compiled with 'showcmd' support.

signs Compiled with :sign support.

smartindent Compiled with 'smartindent' support.

sniff Compiled with SNiFF interface support.

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_workshop Compiled with support for Sun workshop.

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 Compiled with support for old static tags

tag-old-static.

tag_any_white Compiled with support for any white characters in tags

files tag-any-white.

tcl Compiled with Tcl interface.

terminfo Compiled with terminfo instead of termcap.

termresponse Compiled with support for t_RV and v:termresponse.

textobjects Compiled with support for text-objects.

tgetent Compiled with tgetent support, able to use a termcap

or terminfo file.

title Compiled with window title support 'title'.

toolbar Compiled with support for gui-toolbar.

unix Unix version of Vim.

user_commands User-defined commands.

vertsplit Compiled with vertically split windows :vsplit.

vim_starting True while initial source'ing takes place. startup

viminfo Compiled with viminfo support.

virtualedit Compiled with 'virtualedit' option.

visual Compiled with Visual mode.

visualextra Compiled with extra Visual mode commands.

blockwise-operators.

vms VMS version of Vim.

vreplace Compiled with gR and gr commands.

wildignore Compiled with 'wildignore' option.

wildmenu Compiled with 'wildmenu' option.

win16 Win16 version of Vim (MS-Windows 3.1).

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.

winaltkeys Compiled with 'winaltkeys' option.

windows Compiled with support for more than one window.

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

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

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.

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

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 E123LINK

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

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 E884LINK

:fu[nction][!] {name}([arguments]) [range] [abort] [dict]

Define a new function by the name {name}. 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 E122LINK

When a function by this name already exists and [!] is

not used an error message is given. When [!] is used,

an existing function is silently replaced. Unless it

is currently being executed, that is an error.

For the {arguments} see function-argument.

:func-range a:firstline a:lastlineLINK

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

When the [abort] argument is added, the function will

abort as soon as an error is detected.

:func-dictLINK

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.

function-search-undoLINK

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 E193LINK

:endf[unction] The end of a function definition. Must be on a line

by its own, without other commands.

:delf :delfunction E130 E131LINK

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

:retu :return E133LINK

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

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

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

E742LINK

The a: scope and the variables in it cannot be changed, they are fixed.

However, if a List or Dictionary is used, 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.

When not using "...", the number of arguments in a function call must be equal

to the number of named arguments. When using "...", the number of arguments

may be larger.

It is also possible to define a function without any arguments. You must

still supply the () then. The body of the function follows in the next lines,

until the matching :endfunction. It is allowed to define another function

inside a function body.

local-variablesLINK

Inside a function variables can be used. These are local variables, which

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 E117LINK

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

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

E132LINK

The recursiveness of user functions is restricted with the 'maxfuncdepth'

option.

AUTOMATICALLY LOADING FUNCTIONS

autoload-functionsLINK

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 E746LINK

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()

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.

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, the script will be sourced every time you try to call the function.

And you will get an error message every time.

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

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

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

:let {var-name} = {expr1} :let E18LINK

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} E689LINK

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

E711 E719LINK

:let {var-name}[{idx1}:{idx2}] = {expr1} E708 E709 E710LINK

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-= :let.= E734LINK

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

:let ${env-name} = {expr1} :let-environment :let-$LINK

Set environment variable {env-name} to the result of

the expression {expr1}. The type is always String.

: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-@LINK

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-&LINK

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'

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

{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}

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.

E121LINK

:let {var-name} .. List the value of variable {var-name}. Multiple

variable names may be given. Special names recognized

here: E738LINK

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.

:let List the values of all variables. The type of the

variable is indicated before the value:

<nothing> String

# Number

* Funcref

:unl[et][!] {name} ... :unlet :unl E108 E795LINK

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.

:lockv[ar][!] [depth] {name} ... :lockvar :lockvLINK

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

E741LINK

If you try to change a locked variable you get an

error message: "E741: Value of {name} is locked"

[depth] is relevant when locking a List or

Dictionary. It specifies how deep the locking goes:

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.

E743LINK

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

Unlock the internal variable {name}. Does the

opposite of :lockvar.

:if {expr1} :if :endif :en E171 E579 E580LINK

: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

backwards 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 E583LINK

:el[se] Execute the commands until the next matching ":else"

or ":endif" if they previously were not being

executed.

:elseif :elsei E582 E584LINK

:elsei[f] {expr1} Short for ":else" ":if", with the addition that there

is no extra ":endif".

:wh[ile] {expr1} :while :endwhile :wh :endwLINK

E170 E585 E588 E733LINK

: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 {list} :for E690 E732LINK

:endfo[r] :endfo :endforLINK

Repeat the commands between ":for" and ":endfor" for

each item in {list}. 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 {list} inside the loop affects what items are

used. Make a copy if this is unwanted:

:for item in copy(mylist)

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

Note that the type of each list item should be

identical to avoid errors for the type of {var}

changing. Unlet the variable at the end of the loop

to allow multiple item types:

for item in ["foo", ["bar"]]

echo item

unlet item " E706 without this

endfor

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

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

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

: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 | edit too much | finally | echo "cleanup" | endtry

:echo "impossible" " not reached, script terminated above

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 E605LINK

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

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

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

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

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"

:echonLINK

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

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

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

The expressions must evaluate to a Number or String, a

Dictionary or List causes an error.

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

: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

:echo 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>"

:exe :executeLINK

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

":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-handlingLINK

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

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

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

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

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

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

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

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

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

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

rethrowLINK

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

sscanfLINK

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

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. No +eval feature no-eval-featureLINK

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

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

11. The sandbox eval-sandbox sandbox E48LINK

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, functions, user commands

- setting certain options (see option-summary)

- setting certain v: variables (see v:var) E794LINK

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

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

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

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.

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

12. Textlock textlockLINK

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:ft=help:norl: