blob: b2863d02f47bbdf05a84878f08bbd5c0cd5d839b [file] [log] [blame]
Bram Moolenaar86b48162022-12-06 18:20:10 +00001*eval.txt* For Vim version 9.0. Last change: 2022 Dec 03
Bram Moolenaar071d4272004-06-13 20:20:40 +00002
3
Bram Moolenaar446cb832008-06-24 21:56:24 +00004 VIM REFERENCE MANUAL by Bram Moolenaar
Bram Moolenaar071d4272004-06-13 20:20:40 +00005
6
7Expression evaluation *expression* *expr* *E15* *eval*
Bram Moolenaar6f4754b2022-01-23 12:07:04 +00008 *E1002*
Bram Moolenaar071d4272004-06-13 20:20:40 +00009Using expressions is introduced in chapter 41 of the user manual |usr_41.txt|.
10
11Note: Expression evaluation can be disabled at compile time. If this has been
Bram Moolenaar58b85342016-08-14 19:54:54 +020012done, the features in this document are not available. See |+eval| and
Bram Moolenaard8b02732005-01-14 21:48:43 +000013|no-eval-feature|.
Bram Moolenaar071d4272004-06-13 20:20:40 +000014
Bram Moolenaar1cae5a02021-12-27 21:28:34 +000015This file is mainly about the backwards compatible (legacy) Vim script. For
Bram Moolenaar2f0936c2022-01-08 21:51:59 +000016specifics of Vim9 script, which can execute much faster, supports type
17checking and much more, see |vim9.txt|. Where the syntax or semantics differ
18a remark is given.
Bram Moolenaar8a7d6542020-01-26 15:56:19 +010019
Bram Moolenaar13065c42005-01-08 16:08:21 +0000201. Variables |variables|
21 1.1 Variable types
Bram Moolenaar9588a0f2005-01-08 21:45:39 +000022 1.2 Function references |Funcref|
Bram Moolenaar7c626922005-02-07 22:01:03 +000023 1.3 Lists |Lists|
Bram Moolenaard8b02732005-01-14 21:48:43 +000024 1.4 Dictionaries |Dictionaries|
Bram Moolenaard8968242019-01-15 22:51:57 +010025 1.5 Blobs |Blobs|
26 1.6 More about variables |more-variables|
Bram Moolenaar13065c42005-01-08 16:08:21 +0000272. Expression syntax |expression-syntax|
283. Internal variable |internal-variables|
294. Builtin Functions |functions|
305. Defining functions |user-functions|
316. Curly braces names |curly-braces-names|
327. Commands |expression-commands|
338. Exception handling |exception-handling|
349. Examples |eval-examples|
Bram Moolenaar558ca4a2019-04-04 18:15:38 +02003510. Vim script version |vimscript-version|
3611. No +eval feature |no-eval-feature|
3712. The sandbox |eval-sandbox|
3813. Textlock |textlock|
Bram Moolenaared997ad2019-07-21 16:42:00 +020039
40Testing support is documented in |testing.txt|.
41Profiling is documented at |profiling|.
Bram Moolenaar071d4272004-06-13 20:20:40 +000042
Bram Moolenaar071d4272004-06-13 20:20:40 +000043==============================================================================
441. Variables *variables*
45
Bram Moolenaar13065c42005-01-08 16:08:21 +0000461.1 Variable types ~
Bram Moolenaarf10911e2022-01-29 22:20:48 +000047 *E712* *E896* *E897* *E899* *E1098*
48 *E1107* *E1135* *E1138*
Bram Moolenaar06fe74a2019-08-31 16:20:32 +020049There are ten types of variables:
Bram Moolenaar071d4272004-06-13 20:20:40 +000050
Bram Moolenaar664f3cf2019-12-07 16:03:51 +010051 *Number* *Integer*
52Number A 32 or 64 bit signed number. |expr-number|
Bram Moolenaarf9706e92020-02-22 14:27:04 +010053 The number of bits is available in |v:numbersize|.
Bram Moolenaar6f02b002021-01-10 20:22:54 +010054 Examples: -123 0x10 0177 0o177 0b1011
Bram Moolenaard8b02732005-01-14 21:48:43 +000055
Bram Moolenaar446cb832008-06-24 21:56:24 +000056Float A floating point number. |floating-point-format| *Float*
Bram Moolenaar446cb832008-06-24 21:56:24 +000057 Examples: 123.456 1.15e-6 -1.1e3
58
Bram Moolenaard8b02732005-01-14 21:48:43 +000059String A NUL terminated string of 8-bit unsigned characters (bytes).
Bram Moolenaar446cb832008-06-24 21:56:24 +000060 |expr-string| Examples: "ab\txx\"--" 'x-z''a,c'
Bram Moolenaard8b02732005-01-14 21:48:43 +000061
Bram Moolenaard8968242019-01-15 22:51:57 +010062List An ordered sequence of items, see |List| for details.
Bram Moolenaard8b02732005-01-14 21:48:43 +000063 Example: [1, 2, ['a', 'b']]
Bram Moolenaar071d4272004-06-13 20:20:40 +000064
Bram Moolenaar39a58ca2005-06-27 22:42:44 +000065Dictionary An associative, unordered array: Each entry has a key and a
66 value. |Dictionary|
Bram Moolenaard5abb4c2019-07-13 22:46:10 +020067 Examples:
68 {'blue': "#0000ff", 'red': "#ff0000"}
Bram Moolenaar4c6d9042019-07-16 22:04:02 +020069 #{blue: "#0000ff", red: "#ff0000"}
Bram Moolenaar39a58ca2005-06-27 22:42:44 +000070
Bram Moolenaar835dc632016-02-07 14:27:38 +010071Funcref A reference to a function |Funcref|.
72 Example: function("strlen")
Bram Moolenaar1d429612016-05-24 15:44:17 +020073 It can be bound to a dictionary and arguments, it then works
74 like a Partial.
75 Example: function("Callback", [arg], myDict)
Bram Moolenaar835dc632016-02-07 14:27:38 +010076
Bram Moolenaar02e83b42016-02-21 20:10:26 +010077Special |v:false|, |v:true|, |v:none| and |v:null|. *Special*
Bram Moolenaar835dc632016-02-07 14:27:38 +010078
Bram Moolenaarebf7dfa2016-04-14 12:46:51 +020079Job Used for a job, see |job_start()|. *Job* *Jobs*
Bram Moolenaar38a55632016-02-15 22:07:32 +010080
Bram Moolenaarebf7dfa2016-04-14 12:46:51 +020081Channel Used for a channel, see |ch_open()|. *Channel* *Channels*
Bram Moolenaar835dc632016-02-07 14:27:38 +010082
Bram Moolenaard8968242019-01-15 22:51:57 +010083Blob Binary Large Object. Stores any sequence of bytes. See |Blob|
84 for details
Bram Moolenaar6e5ea8d2019-01-12 22:47:31 +010085 Example: 0zFF00ED015DAF
86 0z is an empty Blob.
87
Bram Moolenaard7ee7ce2005-01-03 21:02:03 +000088The Number and String types are converted automatically, depending on how they
89are used.
Bram Moolenaar071d4272004-06-13 20:20:40 +000090
91Conversion from a Number to a String is by making the ASCII representation of
Bram Moolenaar24ea3ba2010-09-19 19:01:21 +020092the Number. Examples:
93 Number 123 --> String "123" ~
94 Number 0 --> String "0" ~
95 Number -1 --> String "-1" ~
Bram Moolenaar00a927d2010-05-14 23:24:24 +020096 *octal*
Bram Moolenaard43906d2020-07-20 21:31:32 +020097Conversion from a String to a Number only happens in legacy Vim script, not in
98Vim9 script. It is done by converting the first digits to a number.
99Hexadecimal "0xf9", Octal "017" or "0o17", and Binary "0b10"
Bram Moolenaar6f02b002021-01-10 20:22:54 +0100100numbers are recognized
Bram Moolenaar5da36052021-12-27 15:39:57 +0000101NOTE: when using |Vim9| script or |scriptversion-4| octal with a leading "0"
102is not recognized. The 0o notation requires patch 8.2.0886.
Bram Moolenaar6f02b002021-01-10 20:22:54 +0100103If the String doesn't start with digits, the result is zero.
Bram Moolenaarfa735342016-01-03 22:14:44 +0100104Examples:
Bram Moolenaar24ea3ba2010-09-19 19:01:21 +0200105 String "456" --> Number 456 ~
106 String "6bar" --> Number 6 ~
107 String "foo" --> Number 0 ~
108 String "0xf1" --> Number 241 ~
109 String "0100" --> Number 64 ~
Bram Moolenaarc17e66c2020-06-02 21:38:22 +0200110 String "0o100" --> Number 64 ~
Bram Moolenaarfa735342016-01-03 22:14:44 +0100111 String "0b101" --> Number 5 ~
Bram Moolenaar24ea3ba2010-09-19 19:01:21 +0200112 String "-8" --> Number -8 ~
113 String "+8" --> Number 0 ~
Bram Moolenaar071d4272004-06-13 20:20:40 +0000114
115To force conversion from String to Number, add zero to it: >
116 :echo "0100" + 0
Bram Moolenaar97b2ad32006-03-18 21:40:56 +0000117< 64 ~
118
119To avoid a leading zero to cause octal conversion, or for using a different
120base, use |str2nr()|.
Bram Moolenaar071d4272004-06-13 20:20:40 +0000121
Bram Moolenaard09091d2019-01-17 16:07:22 +0100122 *TRUE* *FALSE* *Boolean*
Bram Moolenaar071d4272004-06-13 20:20:40 +0000123For boolean operators Numbers are used. Zero is FALSE, non-zero is TRUE.
Bram Moolenaar6aa57292021-08-14 21:25:52 +0200124You can also use |v:false| and |v:true|, in Vim9 script |false| and |true|.
Bram Moolenaar1c6737b2020-09-07 22:18:52 +0200125When TRUE is returned from a function it is the Number one, FALSE is the
126number zero.
Bram Moolenaar071d4272004-06-13 20:20:40 +0000127
Bram Moolenaare381d3d2016-07-07 14:50:41 +0200128Note that in the command: >
Bram Moolenaar071d4272004-06-13 20:20:40 +0000129 :if "foo"
Bram Moolenaare381d3d2016-07-07 14:50:41 +0200130 :" NOT executed
131"foo" is converted to 0, which means FALSE. If the string starts with a
132non-zero number it means TRUE: >
133 :if "8foo"
134 :" executed
135To test for a non-empty string, use empty(): >
Bram Moolenaar3a0d8092012-10-21 03:02:54 +0200136 :if !empty("foo")
Bram Moolenaar92f26c22020-10-03 20:17:30 +0200137
138< *falsy* *truthy*
139An expression can be used as a condition, ignoring the type and only using
140whether the value is "sort of true" or "sort of false". Falsy is:
141 the number zero
142 empty string, blob, list or dictionary
143Other values are truthy. Examples:
144 0 falsy
145 1 truthy
146 -1 truthy
147 0.0 falsy
148 0.1 truthy
149 '' falsy
150 'x' truthy
151 [] falsy
152 [0] truthy
153 {} falsy
154 #{x: 1} truthy
155 0z falsy
156 0z00 truthy
157
Bram Moolenaare381d3d2016-07-07 14:50:41 +0200158 *non-zero-arg*
159Function arguments often behave slightly different from |TRUE|: If the
160argument is present and it evaluates to a non-zero Number, |v:true| or a
Bram Moolenaar64d8e252016-09-06 22:12:34 +0200161non-empty String, then the value is considered to be TRUE.
Bram Moolenaar01164a62017-11-02 22:58:42 +0100162Note that " " and "0" are also non-empty strings, thus considered to be TRUE.
163A List, Dictionary or Float is not a Number or String, thus evaluate to FALSE.
Bram Moolenaare381d3d2016-07-07 14:50:41 +0200164
Bram Moolenaar2f0936c2022-01-08 21:51:59 +0000165 *E611* *E745* *E728* *E703* *E729* *E730* *E731* *E908* *E910*
166 *E913* *E974* *E975* *E976*
Bram Moolenaard09091d2019-01-17 16:07:22 +0100167|List|, |Dictionary|, |Funcref|, |Job|, |Channel| and |Blob| types are not
168automatically converted.
Bram Moolenaard7ee7ce2005-01-03 21:02:03 +0000169
Bram Moolenaar446cb832008-06-24 21:56:24 +0000170 *E805* *E806* *E808*
Bram Moolenaar58b85342016-08-14 19:54:54 +0200171When mixing Number and Float the Number is converted to Float. Otherwise
Bram Moolenaar446cb832008-06-24 21:56:24 +0000172there is no automatic conversion of Float. You can use str2float() for String
173to Float, printf() for Float to String and float2nr() for Float to Number.
174
Bram Moolenaar2f0936c2022-01-08 21:51:59 +0000175 *E362* *E891* *E892* *E893* *E894* *E907* *E911* *E914*
Bram Moolenaar13d5aee2016-01-21 23:36:05 +0100176When expecting a Float a Number can also be used, but nothing else.
177
Bram Moolenaarf6f32c32016-03-12 19:03:59 +0100178 *no-type-checking*
179You will not get an error if you try to change the type of a variable.
Bram Moolenaard7ee7ce2005-01-03 21:02:03 +0000180
Bram Moolenaar13065c42005-01-08 16:08:21 +0000181
Bram Moolenaar9588a0f2005-01-08 21:45:39 +00001821.2 Function references ~
Bram Moolenaar8a3b8052022-06-26 12:21:15 +0100183 *Funcref* *E695* *E718* *E1192*
Bram Moolenaar58b85342016-08-14 19:54:54 +0200184A Funcref variable is obtained with the |function()| function, the |funcref()|
Bram Moolenaarcfa8f9a2022-06-03 21:59:47 +0100185function, (in |Vim9| script) the name of a function, or created with the
186lambda expression |expr-lambda|. It can be used in an expression in the place
187of a function name, before the parenthesis around the arguments, to invoke the
188function it refers to. Example in |Vim9| script: >
Bram Moolenaard7ee7ce2005-01-03 21:02:03 +0000189
Bram Moolenaarcfa8f9a2022-06-03 21:59:47 +0100190 :var Fn = MyFunc
191 :echo Fn()
192
193Legacy script: >
Bram Moolenaard7ee7ce2005-01-03 21:02:03 +0000194 :let Fn = function("MyFunc")
195 :echo Fn()
Bram Moolenaar3a3a7232005-01-17 22:16:15 +0000196< *E704* *E705* *E707*
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000197A Funcref variable must start with a capital, "s:", "w:", "t:" or "b:". You
Bram Moolenaar7cba6c02013-09-05 22:13:31 +0200198can use "g:" but the following name must still start with a capital. You
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000199cannot have both a Funcref variable and a function with the same name.
Bram Moolenaard7ee7ce2005-01-03 21:02:03 +0000200
Bram Moolenaar3a3a7232005-01-17 22:16:15 +0000201A special case is defining a function and directly assigning its Funcref to a
202Dictionary entry. Example: >
203 :function dict.init() dict
204 : let self.val = 0
205 :endfunction
206
207The key of the Dictionary can start with a lower case letter. The actual
208function name is not used here. Also see |numbered-function|.
209
210A Funcref can also be used with the |:call| command: >
211 :call Fn()
212 :call dict.init()
Bram Moolenaar13065c42005-01-08 16:08:21 +0000213
214The name of the referenced function can be obtained with |string()|. >
Bram Moolenaar383f9bc2005-01-19 22:18:32 +0000215 :let func = string(Fn)
Bram Moolenaar13065c42005-01-08 16:08:21 +0000216
217You can use |call()| to invoke a Funcref and use a list variable for the
218arguments: >
Bram Moolenaar383f9bc2005-01-19 22:18:32 +0000219 :let r = call(Fn, mylist)
Bram Moolenaar1d429612016-05-24 15:44:17 +0200220<
221 *Partial*
222A Funcref optionally binds a Dictionary and/or arguments. This is also called
223a Partial. This is created by passing the Dictionary and/or arguments to
Bram Moolenaar58b85342016-08-14 19:54:54 +0200224function() or funcref(). When calling the function the Dictionary and/or
225arguments will be passed to the function. Example: >
Bram Moolenaar1d429612016-05-24 15:44:17 +0200226
227 let Cb = function('Callback', ['foo'], myDict)
Bram Moolenaarba3ff532018-11-04 14:45:49 +0100228 call Cb('bar')
Bram Moolenaar1d429612016-05-24 15:44:17 +0200229
230This will invoke the function as if using: >
Bram Moolenaarba3ff532018-11-04 14:45:49 +0100231 call myDict.Callback('foo', 'bar')
Bram Moolenaar1d429612016-05-24 15:44:17 +0200232
233This is very useful when passing a function around, e.g. in the arguments of
234|ch_open()|.
235
236Note that binding a function to a Dictionary also happens when the function is
237a member of the Dictionary: >
238
239 let myDict.myFunction = MyFunction
240 call myDict.myFunction()
241
242Here MyFunction() will get myDict passed as "self". This happens when the
243"myFunction" member is accessed. When making assigning "myFunction" to
244otherDict and calling it, it will be bound to otherDict: >
245
246 let otherDict.myFunction = myDict.myFunction
247 call otherDict.myFunction()
248
249Now "self" will be "otherDict". But when the dictionary was bound explicitly
250this won't happen: >
251
252 let myDict.myFunction = function(MyFunction, myDict)
253 let otherDict.myFunction = myDict.myFunction
254 call otherDict.myFunction()
255
Bram Moolenaard823fa92016-08-12 16:29:27 +0200256Here "self" will be "myDict", because it was bound explicitly.
Bram Moolenaard7ee7ce2005-01-03 21:02:03 +0000257
258
Bram Moolenaar9588a0f2005-01-08 21:45:39 +00002591.3 Lists ~
Bram Moolenaar7e38ea22014-04-05 22:55:53 +0200260 *list* *List* *Lists* *E686*
Bram Moolenaard7ee7ce2005-01-03 21:02:03 +0000261A List is an ordered sequence of items. An item can be of any type. Items
Bram Moolenaar58b85342016-08-14 19:54:54 +0200262can be accessed by their index number. Items can be added and removed at any
Bram Moolenaard7ee7ce2005-01-03 21:02:03 +0000263position in the sequence.
264
Bram Moolenaar13065c42005-01-08 16:08:21 +0000265
266List creation ~
267 *E696* *E697*
Bram Moolenaarcbaff5e2022-04-08 17:45:08 +0100268A List is created with a comma-separated list of items in square brackets.
Bram Moolenaar13065c42005-01-08 16:08:21 +0000269Examples: >
270 :let mylist = [1, two, 3, "four"]
271 :let emptylist = []
Bram Moolenaard7ee7ce2005-01-03 21:02:03 +0000272
Bram Moolenaar58b85342016-08-14 19:54:54 +0200273An item can be any expression. Using a List for an item creates a
Bram Moolenaarf9393ef2006-04-24 19:47:27 +0000274List of Lists: >
Bram Moolenaar13065c42005-01-08 16:08:21 +0000275 :let nestlist = [[11, 12], [21, 22], [31, 32]]
Bram Moolenaard7ee7ce2005-01-03 21:02:03 +0000276
277An extra comma after the last item is ignored.
278
Bram Moolenaar13065c42005-01-08 16:08:21 +0000279
280List index ~
281 *list-index* *E684*
Bram Moolenaard7ee7ce2005-01-03 21:02:03 +0000282An item in the List can be accessed by putting the index in square brackets
Bram Moolenaar13065c42005-01-08 16:08:21 +0000283after the List. Indexes are zero-based, thus the first item has index zero. >
284 :let item = mylist[0] " get the first item: 1
Bram Moolenaard7ee7ce2005-01-03 21:02:03 +0000285 :let item = mylist[2] " get the third item: 3
Bram Moolenaar13065c42005-01-08 16:08:21 +0000286
Bram Moolenaar9588a0f2005-01-08 21:45:39 +0000287When the resulting item is a list this can be repeated: >
Bram Moolenaar13065c42005-01-08 16:08:21 +0000288 :let item = nestlist[0][1] " get the first list, second item: 12
Bram Moolenaard7ee7ce2005-01-03 21:02:03 +0000289<
Bram Moolenaar13065c42005-01-08 16:08:21 +0000290A negative index is counted from the end. Index -1 refers to the last item in
291the List, -2 to the last but one item, etc. >
Bram Moolenaard7ee7ce2005-01-03 21:02:03 +0000292 :let last = mylist[-1] " get the last item: "four"
293
Bram Moolenaar13065c42005-01-08 16:08:21 +0000294To avoid an error for an invalid index use the |get()| function. When an item
Bram Moolenaar9588a0f2005-01-08 21:45:39 +0000295is not available it returns zero or the default value you specify: >
Bram Moolenaar13065c42005-01-08 16:08:21 +0000296 :echo get(mylist, idx)
297 :echo get(mylist, idx, "NONE")
298
299
300List concatenation ~
Bram Moolenaar34453202021-01-31 13:08:38 +0100301 *list-concatenation*
Bram Moolenaar13065c42005-01-08 16:08:21 +0000302Two lists can be concatenated with the "+" operator: >
303 :let longlist = mylist + [5, 6]
Bram Moolenaar383f9bc2005-01-19 22:18:32 +0000304 :let mylist += [7, 8]
Bram Moolenaar13065c42005-01-08 16:08:21 +0000305
Bram Moolenaar34453202021-01-31 13:08:38 +0100306To prepend or append an item, turn the item into a list by putting [] around
307it. To change a list in-place, refer to |list-modification| below.
Bram Moolenaar13065c42005-01-08 16:08:21 +0000308
309
310Sublist ~
Bram Moolenaarbc8801c2016-08-02 21:04:33 +0200311 *sublist*
Bram Moolenaard7ee7ce2005-01-03 21:02:03 +0000312A part of the List can be obtained by specifying the first and last index,
313separated by a colon in square brackets: >
Bram Moolenaar13065c42005-01-08 16:08:21 +0000314 :let shortlist = mylist[2:-1] " get List [3, "four"]
Bram Moolenaard7ee7ce2005-01-03 21:02:03 +0000315
316Omitting the first index is similar to zero. Omitting the last index is
Bram Moolenaaref2f6562007-05-06 13:32:59 +0000317similar to -1. >
Bram Moolenaar540d6e32005-01-09 21:20:18 +0000318 :let endlist = mylist[2:] " from item 2 to the end: [3, "four"]
319 :let shortlist = mylist[2:2] " List with one item: [3]
320 :let otherlist = mylist[:] " make a copy of the List
Bram Moolenaard7ee7ce2005-01-03 21:02:03 +0000321
Bram Moolenaar6601b622021-01-13 21:47:15 +0100322Notice that the last index is inclusive. If you prefer using an exclusive
323index use the |slice()| method.
324
Bram Moolenaarf9393ef2006-04-24 19:47:27 +0000325If the first index is beyond the last item of the List or the second item is
326before the first item, the result is an empty list. There is no error
327message.
328
329If the second index is equal to or greater than the length of the list the
330length minus one is used: >
Bram Moolenaar9e54a0e2006-04-14 20:42:25 +0000331 :let mylist = [0, 1, 2, 3]
332 :echo mylist[2:8] " result: [2, 3]
333
Bram Moolenaara7fc0102005-05-18 22:17:12 +0000334NOTE: mylist[s:e] means using the variable "s:e" as index. Watch out for
Bram Moolenaar58b85342016-08-14 19:54:54 +0200335using a single letter variable before the ":". Insert a space when needed:
Bram Moolenaara7fc0102005-05-18 22:17:12 +0000336mylist[s : e].
337
Bram Moolenaard7ee7ce2005-01-03 21:02:03 +0000338
Bram Moolenaar13065c42005-01-08 16:08:21 +0000339List identity ~
Bram Moolenaard8b02732005-01-14 21:48:43 +0000340 *list-identity*
Bram Moolenaar13065c42005-01-08 16:08:21 +0000341When variable "aa" is a list and you assign it to another variable "bb", both
342variables refer to the same list. Thus changing the list "aa" will also
343change "bb": >
344 :let aa = [1, 2, 3]
345 :let bb = aa
346 :call add(aa, 4)
347 :echo bb
Bram Moolenaar3a3a7232005-01-17 22:16:15 +0000348< [1, 2, 3, 4]
Bram Moolenaar13065c42005-01-08 16:08:21 +0000349
350Making a copy of a list is done with the |copy()| function. Using [:] also
351works, as explained above. This creates a shallow copy of the list: Changing
Bram Moolenaar9588a0f2005-01-08 21:45:39 +0000352a list item in the list will also change the item in the copied list: >
Bram Moolenaar13065c42005-01-08 16:08:21 +0000353 :let aa = [[1, 'a'], 2, 3]
354 :let bb = copy(aa)
Bram Moolenaar3a3a7232005-01-17 22:16:15 +0000355 :call add(aa, 4)
Bram Moolenaar13065c42005-01-08 16:08:21 +0000356 :let aa[0][1] = 'aaa'
357 :echo aa
Bram Moolenaar3a3a7232005-01-17 22:16:15 +0000358< [[1, aaa], 2, 3, 4] >
Bram Moolenaar13065c42005-01-08 16:08:21 +0000359 :echo bb
Bram Moolenaar3a3a7232005-01-17 22:16:15 +0000360< [[1, aaa], 2, 3]
Bram Moolenaar13065c42005-01-08 16:08:21 +0000361
Bram Moolenaar9588a0f2005-01-08 21:45:39 +0000362To make a completely independent list use |deepcopy()|. This also makes a
Bram Moolenaar3a3a7232005-01-17 22:16:15 +0000363copy of the values in the list, recursively. Up to a hundred levels deep.
Bram Moolenaar13065c42005-01-08 16:08:21 +0000364
365The operator "is" can be used to check if two variables refer to the same
Bram Moolenaar3a3a7232005-01-17 22:16:15 +0000366List. "isnot" does the opposite. In contrast "==" compares if two lists have
Bram Moolenaar9588a0f2005-01-08 21:45:39 +0000367the same value. >
368 :let alist = [1, 2, 3]
369 :let blist = [1, 2, 3]
370 :echo alist is blist
Bram Moolenaar3a3a7232005-01-17 22:16:15 +0000371< 0 >
Bram Moolenaar9588a0f2005-01-08 21:45:39 +0000372 :echo alist == blist
Bram Moolenaar3a3a7232005-01-17 22:16:15 +0000373< 1
Bram Moolenaar13065c42005-01-08 16:08:21 +0000374
Bram Moolenaar9ba0eb82005-06-13 22:28:56 +0000375Note about comparing lists: Two lists are considered equal if they have the
376same length and all items compare equal, as with using "==". There is one
Bram Moolenaar7d1f5db2005-07-03 21:39:27 +0000377exception: When comparing a number with a string they are considered
378different. There is no automatic type conversion, as with using "==" on
379variables. Example: >
380 echo 4 == "4"
Bram Moolenaar9ba0eb82005-06-13 22:28:56 +0000381< 1 >
Bram Moolenaar7d1f5db2005-07-03 21:39:27 +0000382 echo [4] == ["4"]
Bram Moolenaar9ba0eb82005-06-13 22:28:56 +0000383< 0
384
Bram Moolenaar7d1f5db2005-07-03 21:39:27 +0000385Thus comparing Lists is more strict than comparing numbers and strings. You
Bram Moolenaar446cb832008-06-24 21:56:24 +0000386can compare simple values this way too by putting them in a list: >
Bram Moolenaar7d1f5db2005-07-03 21:39:27 +0000387
388 :let a = 5
389 :let b = "5"
Bram Moolenaar446cb832008-06-24 21:56:24 +0000390 :echo a == b
Bram Moolenaar7d1f5db2005-07-03 21:39:27 +0000391< 1 >
Bram Moolenaar446cb832008-06-24 21:56:24 +0000392 :echo [a] == [b]
Bram Moolenaar7d1f5db2005-07-03 21:39:27 +0000393< 0
Bram Moolenaar9ba0eb82005-06-13 22:28:56 +0000394
Bram Moolenaar13065c42005-01-08 16:08:21 +0000395
396List unpack ~
397
398To unpack the items in a list to individual variables, put the variables in
399square brackets, like list items: >
400 :let [var1, var2] = mylist
401
402When the number of variables does not match the number of items in the list
403this produces an error. To handle any extra items from the list append ";"
404and a variable name: >
405 :let [var1, var2; rest] = mylist
406
407This works like: >
408 :let var1 = mylist[0]
409 :let var2 = mylist[1]
Bram Moolenaar5f2bb9f2005-01-11 21:29:04 +0000410 :let rest = mylist[2:]
Bram Moolenaar13065c42005-01-08 16:08:21 +0000411
412Except that there is no error if there are only two items. "rest" will be an
413empty list then.
414
415
416List modification ~
417 *list-modification*
Bram Moolenaar9588a0f2005-01-08 21:45:39 +0000418To change a specific item of a list use |:let| this way: >
Bram Moolenaar13065c42005-01-08 16:08:21 +0000419 :let list[4] = "four"
420 :let listlist[0][3] = item
421
Bram Moolenaar9588a0f2005-01-08 21:45:39 +0000422To change part of a list you can specify the first and last item to be
Bram Moolenaar3a3a7232005-01-17 22:16:15 +0000423modified. The value must at least have the number of items in the range: >
Bram Moolenaar9588a0f2005-01-08 21:45:39 +0000424 :let list[3:5] = [3, 4, 5]
425
Bram Moolenaar13065c42005-01-08 16:08:21 +0000426Adding and removing items from a list is done with functions. Here are a few
427examples: >
428 :call insert(list, 'a') " prepend item 'a'
429 :call insert(list, 'a', 3) " insert item 'a' before list[3]
430 :call add(list, "new") " append String item
Bram Moolenaar3a3a7232005-01-17 22:16:15 +0000431 :call add(list, [1, 2]) " append a List as one new item
Bram Moolenaar13065c42005-01-08 16:08:21 +0000432 :call extend(list, [1, 2]) " extend the list with two more items
433 :let i = remove(list, 3) " remove item 3
Bram Moolenaar9cd15162005-01-16 22:02:49 +0000434 :unlet list[3] " idem
Bram Moolenaar13065c42005-01-08 16:08:21 +0000435 :let l = remove(list, 3, -1) " remove items 3 to last item
Bram Moolenaar9cd15162005-01-16 22:02:49 +0000436 :unlet list[3 : ] " idem
Bram Moolenaar3a3a7232005-01-17 22:16:15 +0000437 :call filter(list, 'v:val !~ "x"') " remove items with an 'x'
Bram Moolenaar13065c42005-01-08 16:08:21 +0000438
Bram Moolenaar3a3a7232005-01-17 22:16:15 +0000439Changing the order of items in a list: >
Bram Moolenaar9588a0f2005-01-08 21:45:39 +0000440 :call sort(list) " sort a list alphabetically
441 :call reverse(list) " reverse the order of items
Bram Moolenaar327aa022014-03-25 18:24:23 +0100442 :call uniq(sort(list)) " sort and remove duplicates
Bram Moolenaar9588a0f2005-01-08 21:45:39 +0000443
Bram Moolenaar13065c42005-01-08 16:08:21 +0000444
445For loop ~
446
Bram Moolenaar74e54fc2021-03-26 20:41:29 +0100447The |:for| loop executes commands for each item in a List, String or Blob.
448A variable is set to each item in sequence. Example with a List: >
Bram Moolenaar3a3a7232005-01-17 22:16:15 +0000449 :for item in mylist
450 : call Doit(item)
Bram Moolenaar13065c42005-01-08 16:08:21 +0000451 :endfor
452
453This works like: >
454 :let index = 0
455 :while index < len(mylist)
Bram Moolenaar3a3a7232005-01-17 22:16:15 +0000456 : let item = mylist[index]
457 : :call Doit(item)
Bram Moolenaar13065c42005-01-08 16:08:21 +0000458 : let index = index + 1
459 :endwhile
460
Bram Moolenaar5f2bb9f2005-01-11 21:29:04 +0000461If all you want to do is modify each item in the list then the |map()|
Bram Moolenaar3a3a7232005-01-17 22:16:15 +0000462function will be a simpler method than a for loop.
Bram Moolenaar5f2bb9f2005-01-11 21:29:04 +0000463
Bram Moolenaar58b85342016-08-14 19:54:54 +0200464Just like the |:let| command, |:for| also accepts a list of variables. This
Bram Moolenaar74e54fc2021-03-26 20:41:29 +0100465requires the argument to be a List of Lists. >
Bram Moolenaar13065c42005-01-08 16:08:21 +0000466 :for [lnum, col] in [[1, 3], [2, 8], [3, 0]]
467 : call Doit(lnum, col)
468 :endfor
469
470This works like a |:let| command is done for each list item. Again, the types
471must remain the same to avoid an error.
472
Bram Moolenaar3a3a7232005-01-17 22:16:15 +0000473It is also possible to put remaining items in a List variable: >
Bram Moolenaar13065c42005-01-08 16:08:21 +0000474 :for [i, j; rest] in listlist
475 : call Doit(i, j)
476 : if !empty(rest)
Bram Moolenaarc51cf032022-02-26 12:25:45 +0000477 : echo "remainder: " .. string(rest)
Bram Moolenaar13065c42005-01-08 16:08:21 +0000478 : endif
479 :endfor
480
Bram Moolenaar74e54fc2021-03-26 20:41:29 +0100481For a Blob one byte at a time is used.
482
483For a String one character, including any composing characters, is used as a
484String. Example: >
485 for c in text
486 echo 'This character is ' .. c
487 endfor
488
Bram Moolenaar13065c42005-01-08 16:08:21 +0000489
490List functions ~
Bram Moolenaar3a3a7232005-01-17 22:16:15 +0000491 *E714*
Bram Moolenaar13065c42005-01-08 16:08:21 +0000492Functions that are useful with a List: >
Bram Moolenaar9588a0f2005-01-08 21:45:39 +0000493 :let r = call(funcname, list) " call a function with an argument list
Bram Moolenaar13065c42005-01-08 16:08:21 +0000494 :if empty(list) " check if list is empty
Bram Moolenaar2fda12f2005-01-15 22:14:15 +0000495 :let l = len(list) " number of items in list
496 :let big = max(list) " maximum value in list
497 :let small = min(list) " minimum value in list
Bram Moolenaar9588a0f2005-01-08 21:45:39 +0000498 :let xs = count(list, 'x') " count nr of times 'x' appears in list
499 :let i = index(list, 'x') " index of first 'x' in list
Bram Moolenaar13065c42005-01-08 16:08:21 +0000500 :let lines = getline(1, 10) " get ten text lines from buffer
501 :call append('$', lines) " append text lines in buffer
Bram Moolenaar5f2bb9f2005-01-11 21:29:04 +0000502 :let list = split("a b c") " create list from items in a string
503 :let string = join(list, ', ') " create string from list items
Bram Moolenaar2fda12f2005-01-15 22:14:15 +0000504 :let s = string(list) " String representation of list
Bram Moolenaarc51cf032022-02-26 12:25:45 +0000505 :call map(list, '">> " .. v:val') " prepend ">> " to each item
Bram Moolenaar13065c42005-01-08 16:08:21 +0000506
Bram Moolenaar0cb032e2005-04-23 20:52:00 +0000507Don't forget that a combination of features can make things simple. For
508example, to add up all the numbers in a list: >
Bram Moolenaarc51cf032022-02-26 12:25:45 +0000509 :exe 'let sum = ' .. join(nrlist, '+')
Bram Moolenaar0cb032e2005-04-23 20:52:00 +0000510
Bram Moolenaar13065c42005-01-08 16:08:21 +0000511
Bram Moolenaard8b02732005-01-14 21:48:43 +00005121.4 Dictionaries ~
Bram Moolenaard8968242019-01-15 22:51:57 +0100513 *dict* *Dict* *Dictionaries* *Dictionary*
Bram Moolenaard8b02732005-01-14 21:48:43 +0000514A Dictionary is an associative array: Each entry has a key and a value. The
Bram Moolenaar3a3a7232005-01-17 22:16:15 +0000515entry can be located with the key. The entries are stored without a specific
516ordering.
Bram Moolenaard8b02732005-01-14 21:48:43 +0000517
518
519Dictionary creation ~
Bram Moolenaar3a3a7232005-01-17 22:16:15 +0000520 *E720* *E721* *E722* *E723*
Bram Moolenaarcbaff5e2022-04-08 17:45:08 +0100521A Dictionary is created with a comma-separated list of entries in curly
Bram Moolenaar3a3a7232005-01-17 22:16:15 +0000522braces. Each entry has a key and a value, separated by a colon. Each key can
523only appear once. Examples: >
Bram Moolenaard8b02732005-01-14 21:48:43 +0000524 :let mydict = {1: 'one', 2: 'two', 3: 'three'}
525 :let emptydict = {}
Bram Moolenaar3a3a7232005-01-17 22:16:15 +0000526< *E713* *E716* *E717*
Bram Moolenaard8b02732005-01-14 21:48:43 +0000527A key is always a String. You can use a Number, it will be converted to a
528String automatically. Thus the String '4' and the number 4 will find the same
Bram Moolenaar58b85342016-08-14 19:54:54 +0200529entry. Note that the String '04' and the Number 04 are different, since the
Bram Moolenaard899e512022-05-07 21:54:03 +0100530Number will be converted to the String '4', leading zeros are dropped. The
531empty string can also be used as a key.
Bram Moolenaar5da36052021-12-27 15:39:57 +0000532
Bram Moolenaard799daa2022-06-20 11:17:32 +0100533In |Vim9| script a literal key can be used if it consists only of alphanumeric
Bram Moolenaar5da36052021-12-27 15:39:57 +0000534characters, underscore and dash, see |vim9-literal-dict|.
Bram Moolenaar56c860c2019-08-17 20:09:31 +0200535 *literal-Dict* *#{}*
Bram Moolenaar5da36052021-12-27 15:39:57 +0000536To avoid having to put quotes around every key the #{} form can be used in
537legacy script. This does require the key to consist only of ASCII letters,
538digits, '-' and '_'. Example: >
Bram Moolenaar10455d42019-11-21 15:36:18 +0100539 :let mydict = #{zero: 0, one_key: 1, two-key: 2, 333: 3}
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200540Note that 333 here is the string "333". Empty keys are not possible with #{}.
Bram Moolenaard899e512022-05-07 21:54:03 +0100541In |Vim9| script the #{} form cannot be used because it can be confused with
542the start of a comment.
Bram Moolenaard8b02732005-01-14 21:48:43 +0000543
Bram Moolenaar58b85342016-08-14 19:54:54 +0200544A value can be any expression. Using a Dictionary for a value creates a
Bram Moolenaard8b02732005-01-14 21:48:43 +0000545nested Dictionary: >
546 :let nestdict = {1: {11: 'a', 12: 'b'}, 2: {21: 'c'}}
547
548An extra comma after the last entry is ignored.
549
550
551Accessing entries ~
552
553The normal way to access an entry is by putting the key in square brackets: >
554 :let val = mydict["one"]
555 :let mydict["four"] = 4
556
Bram Moolenaar3a3a7232005-01-17 22:16:15 +0000557You can add new entries to an existing Dictionary this way, unlike Lists.
Bram Moolenaard8b02732005-01-14 21:48:43 +0000558
559For keys that consist entirely of letters, digits and underscore the following
560form can be used |expr-entry|: >
561 :let val = mydict.one
562 :let mydict.four = 4
563
564Since an entry can be any type, also a List and a Dictionary, the indexing and
565key lookup can be repeated: >
Bram Moolenaar3a3a7232005-01-17 22:16:15 +0000566 :echo dict.key[idx].key
Bram Moolenaard8b02732005-01-14 21:48:43 +0000567
568
569Dictionary to List conversion ~
570
Bram Moolenaar58b85342016-08-14 19:54:54 +0200571You may want to loop over the entries in a dictionary. For this you need to
Bram Moolenaard8b02732005-01-14 21:48:43 +0000572turn the Dictionary into a List and pass it to |:for|.
573
574Most often you want to loop over the keys, using the |keys()| function: >
575 :for key in keys(mydict)
Bram Moolenaarc51cf032022-02-26 12:25:45 +0000576 : echo key .. ': ' .. mydict[key]
Bram Moolenaard8b02732005-01-14 21:48:43 +0000577 :endfor
578
579The List of keys is unsorted. You may want to sort them first: >
580 :for key in sort(keys(mydict))
581
582To loop over the values use the |values()| function: >
583 :for v in values(mydict)
Bram Moolenaarc51cf032022-02-26 12:25:45 +0000584 : echo "value: " .. v
Bram Moolenaard8b02732005-01-14 21:48:43 +0000585 :endfor
586
587If you want both the key and the value use the |items()| function. It returns
Bram Moolenaard47d5222018-12-09 20:43:55 +0100588a List in which each item is a List with two items, the key and the value: >
Bram Moolenaaref2f6562007-05-06 13:32:59 +0000589 :for [key, value] in items(mydict)
Bram Moolenaarc51cf032022-02-26 12:25:45 +0000590 : echo key .. ': ' .. value
Bram Moolenaard8b02732005-01-14 21:48:43 +0000591 :endfor
592
593
594Dictionary identity ~
Bram Moolenaar7c626922005-02-07 22:01:03 +0000595 *dict-identity*
Bram Moolenaard8b02732005-01-14 21:48:43 +0000596Just like Lists you need to use |copy()| and |deepcopy()| to make a copy of a
597Dictionary. Otherwise, assignment results in referring to the same
598Dictionary: >
599 :let onedict = {'a': 1, 'b': 2}
600 :let adict = onedict
601 :let adict['a'] = 11
602 :echo onedict['a']
603 11
604
Bram Moolenaarf3bd51a2005-06-14 22:11:18 +0000605Two Dictionaries compare equal if all the key-value pairs compare equal. For
606more info see |list-identity|.
Bram Moolenaard8b02732005-01-14 21:48:43 +0000607
608
609Dictionary modification ~
610 *dict-modification*
611To change an already existing entry of a Dictionary, or to add a new entry,
612use |:let| this way: >
613 :let dict[4] = "four"
614 :let dict['one'] = item
615
Bram Moolenaar9cd15162005-01-16 22:02:49 +0000616Removing an entry from a Dictionary is done with |remove()| or |:unlet|.
617Three ways to remove the entry with key "aaa" from dict: >
618 :let i = remove(dict, 'aaa')
619 :unlet dict.aaa
620 :unlet dict['aaa']
Bram Moolenaard8b02732005-01-14 21:48:43 +0000621
622Merging a Dictionary with another is done with |extend()|: >
Bram Moolenaar3a3a7232005-01-17 22:16:15 +0000623 :call extend(adict, bdict)
624This extends adict with all entries from bdict. Duplicate keys cause entries
625in adict to be overwritten. An optional third argument can change this.
Bram Moolenaar383f9bc2005-01-19 22:18:32 +0000626Note that the order of entries in a Dictionary is irrelevant, thus don't
627expect ":echo adict" to show the items from bdict after the older entries in
628adict.
Bram Moolenaard8b02732005-01-14 21:48:43 +0000629
630Weeding out entries from a Dictionary can be done with |filter()|: >
Bram Moolenaaref2f6562007-05-06 13:32:59 +0000631 :call filter(dict, 'v:val =~ "x"')
Bram Moolenaar3a3a7232005-01-17 22:16:15 +0000632This removes all entries from "dict" with a value not matching 'x'.
Bram Moolenaar388a5d42020-05-26 21:20:45 +0200633This can also be used to remove all entries: >
634 call filter(dict, 0)
Bram Moolenaar2fda12f2005-01-15 22:14:15 +0000635
Bram Moolenaar86b48162022-12-06 18:20:10 +0000636In some situations it is not allowed to remove or add entries to a Dictionary.
637Especially when iterating over all the entries. You will get *E1313* or
638another error in that case.
639
Bram Moolenaar2fda12f2005-01-15 22:14:15 +0000640
641Dictionary function ~
Bram Moolenaar26402cb2013-02-20 21:26:00 +0100642 *Dictionary-function* *self* *E725* *E862*
Bram Moolenaar2fda12f2005-01-15 22:14:15 +0000643When a function is defined with the "dict" attribute it can be used in a
Bram Moolenaar58b85342016-08-14 19:54:54 +0200644special way with a dictionary. Example: >
Bram Moolenaar2fda12f2005-01-15 22:14:15 +0000645 :function Mylen() dict
Bram Moolenaar3a3a7232005-01-17 22:16:15 +0000646 : return len(self.data)
Bram Moolenaar2fda12f2005-01-15 22:14:15 +0000647 :endfunction
Bram Moolenaar3a3a7232005-01-17 22:16:15 +0000648 :let mydict = {'data': [0, 1, 2, 3], 'len': function("Mylen")}
649 :echo mydict.len()
Bram Moolenaar2fda12f2005-01-15 22:14:15 +0000650
651This is like a method in object oriented programming. The entry in the
652Dictionary is a |Funcref|. The local variable "self" refers to the dictionary
Bram Moolenaar86b48162022-12-06 18:20:10 +0000653the function was invoked from. When using |Vim9| script you can use classes
654and objects, see `:class`.
Bram Moolenaar2fda12f2005-01-15 22:14:15 +0000655
Bram Moolenaar3a3a7232005-01-17 22:16:15 +0000656It is also possible to add a function without the "dict" attribute as a
657Funcref to a Dictionary, but the "self" variable is not available then.
658
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000659 *numbered-function* *anonymous-function*
Bram Moolenaar2fda12f2005-01-15 22:14:15 +0000660To avoid the extra name for the function it can be defined and directly
661assigned to a Dictionary in this way: >
Bram Moolenaar3a3a7232005-01-17 22:16:15 +0000662 :let mydict = {'data': [0, 1, 2, 3]}
Bram Moolenaar5a5f4592015-04-13 12:43:06 +0200663 :function mydict.len()
Bram Moolenaar3a3a7232005-01-17 22:16:15 +0000664 : return len(self.data)
Bram Moolenaar2fda12f2005-01-15 22:14:15 +0000665 :endfunction
Bram Moolenaar3a3a7232005-01-17 22:16:15 +0000666 :echo mydict.len()
Bram Moolenaar2fda12f2005-01-15 22:14:15 +0000667
Bram Moolenaar3a3a7232005-01-17 22:16:15 +0000668The function will then get a number and the value of dict.len is a |Funcref|
Bram Moolenaar58b85342016-08-14 19:54:54 +0200669that references this function. The function can only be used through a
Bram Moolenaar3a3a7232005-01-17 22:16:15 +0000670|Funcref|. It will automatically be deleted when there is no |Funcref|
671remaining that refers to it.
672
673It is not necessary to use the "dict" attribute for a numbered function.
Bram Moolenaar2fda12f2005-01-15 22:14:15 +0000674
Bram Moolenaar1affd722010-08-04 17:49:30 +0200675If you get an error for a numbered function, you can find out what it is with
676a trick. Assuming the function is 42, the command is: >
Bram Moolenaar34cc7d82021-09-21 20:09:51 +0200677 :function g:42
Bram Moolenaar1affd722010-08-04 17:49:30 +0200678
Bram Moolenaar2fda12f2005-01-15 22:14:15 +0000679
680Functions for Dictionaries ~
Bram Moolenaar3a3a7232005-01-17 22:16:15 +0000681 *E715*
682Functions that can be used with a Dictionary: >
Bram Moolenaar2fda12f2005-01-15 22:14:15 +0000683 :if has_key(dict, 'foo') " TRUE if dict has entry with key "foo"
684 :if empty(dict) " TRUE if dict is empty
685 :let l = len(dict) " number of items in dict
686 :let big = max(dict) " maximum value in dict
687 :let small = min(dict) " minimum value in dict
688 :let xs = count(dict, 'x') " count nr of times 'x' appears in dict
689 :let s = string(dict) " String representation of dict
Bram Moolenaarc51cf032022-02-26 12:25:45 +0000690 :call map(dict, '">> " .. v:val') " prepend ">> " to each item
Bram Moolenaard8b02732005-01-14 21:48:43 +0000691
692
Bram Moolenaard8968242019-01-15 22:51:57 +01006931.5 Blobs ~
694 *blob* *Blob* *Blobs* *E978*
Bram Moolenaaraff74912019-03-30 18:11:49 +0100695A Blob is a binary object. It can be used to read an image from a file and
696send it over a channel, for example.
697
698A Blob mostly behaves like a |List| of numbers, where each number has the
699value of an 8-bit byte, from 0 to 255.
Bram Moolenaard8968242019-01-15 22:51:57 +0100700
701
702Blob creation ~
703
704A Blob can be created with a |blob-literal|: >
705 :let b = 0zFF00ED015DAF
Bram Moolenaar0d17f0d2019-01-22 22:20:38 +0100706Dots can be inserted between bytes (pair of hex characters) for readability,
707they don't change the value: >
708 :let b = 0zFF00.ED01.5DAF
Bram Moolenaard8968242019-01-15 22:51:57 +0100709
710A blob can be read from a file with |readfile()| passing the {type} argument
711set to "B", for example: >
712 :let b = readfile('image.png', 'B')
713
714A blob can be read from a channel with the |ch_readblob()| function.
715
716
717Blob index ~
718 *blob-index* *E979*
719A byte in the Blob can be accessed by putting the index in square brackets
720after the Blob. Indexes are zero-based, thus the first byte has index zero. >
721 :let myblob = 0z00112233
722 :let byte = myblob[0] " get the first byte: 0x00
723 :let byte = myblob[2] " get the third byte: 0x22
724
725A negative index is counted from the end. Index -1 refers to the last byte in
726the Blob, -2 to the last but one byte, etc. >
727 :let last = myblob[-1] " get the last byte: 0x33
728
729To avoid an error for an invalid index use the |get()| function. When an item
730is not available it returns -1 or the default value you specify: >
731 :echo get(myblob, idx)
732 :echo get(myblob, idx, 999)
733
734
Bram Moolenaar5e66b422019-01-24 21:58:10 +0100735Blob iteration ~
736
737The |:for| loop executes commands for each byte of a Blob. The loop variable is
738set to each byte in the Blob. Example: >
739 :for byte in 0z112233
740 : call Doit(byte)
741 :endfor
742This calls Doit() with 0x11, 0x22 and 0x33.
743
744
Bram Moolenaard8968242019-01-15 22:51:57 +0100745Blob concatenation ~
746
747Two blobs can be concatenated with the "+" operator: >
748 :let longblob = myblob + 0z4455
749 :let myblob += 0z6677
750
751To change a blob in-place see |blob-modification| below.
752
753
754Part of a blob ~
755
756A part of the Blob can be obtained by specifying the first and last index,
757separated by a colon in square brackets: >
758 :let myblob = 0z00112233
Bram Moolenaard09091d2019-01-17 16:07:22 +0100759 :let shortblob = myblob[1:2] " get 0z1122
Bram Moolenaard8968242019-01-15 22:51:57 +0100760 :let shortblob = myblob[2:-1] " get 0z2233
761
762Omitting the first index is similar to zero. Omitting the last index is
763similar to -1. >
764 :let endblob = myblob[2:] " from item 2 to the end: 0z2233
765 :let shortblob = myblob[2:2] " Blob with one byte: 0z22
766 :let otherblob = myblob[:] " make a copy of the Blob
767
Bram Moolenaard09091d2019-01-17 16:07:22 +0100768If the first index is beyond the last byte of the Blob or the second index is
Bram Moolenaaraa5df7e2019-02-03 14:53:10 +0100769before the first index, the result is an empty Blob. There is no error
Bram Moolenaard8968242019-01-15 22:51:57 +0100770message.
771
772If the second index is equal to or greater than the length of the list the
773length minus one is used: >
774 :echo myblob[2:8] " result: 0z2233
775
776
777Blob modification ~
Bram Moolenaara2baa732022-02-04 16:09:54 +0000778 *blob-modification* *E1182* *E1184*
Bram Moolenaard8968242019-01-15 22:51:57 +0100779To change a specific byte of a blob use |:let| this way: >
780 :let blob[4] = 0x44
781
782When the index is just one beyond the end of the Blob, it is appended. Any
783higher index is an error.
784
785To change a sequence of bytes the [:] notation can be used: >
786 let blob[1:3] = 0z445566
Bram Moolenaard09091d2019-01-17 16:07:22 +0100787The length of the replaced bytes must be exactly the same as the value
Bram Moolenaard8968242019-01-15 22:51:57 +0100788provided. *E972*
789
790To change part of a blob you can specify the first and last byte to be
Bram Moolenaard09091d2019-01-17 16:07:22 +0100791modified. The value must have the same number of bytes in the range: >
792 :let blob[3:5] = 0z334455
Bram Moolenaard8968242019-01-15 22:51:57 +0100793
794You can also use the functions |add()|, |remove()| and |insert()|.
795
796
797Blob identity ~
798
799Blobs can be compared for equality: >
800 if blob == 0z001122
801And for equal identity: >
802 if blob is otherblob
803< *blob-identity* *E977*
804When variable "aa" is a Blob and you assign it to another variable "bb", both
805variables refer to the same Blob. Then the "is" operator returns true.
806
807When making a copy using [:] or |copy()| the values are the same, but the
808identity is different: >
809 :let blob = 0z112233
810 :let blob2 = blob
811 :echo blob == blob2
812< 1 >
813 :echo blob is blob2
814< 1 >
815 :let blob3 = blob[:]
816 :echo blob == blob3
817< 1 >
818 :echo blob is blob3
819< 0
820
Bram Moolenaard09091d2019-01-17 16:07:22 +0100821Making a copy of a Blob is done with the |copy()| function. Using [:] also
Bram Moolenaard8968242019-01-15 22:51:57 +0100822works, as explained above.
823
824
8251.6 More about variables ~
Bram Moolenaar13065c42005-01-08 16:08:21 +0000826 *more-variables*
Bram Moolenaar071d4272004-06-13 20:20:40 +0000827If you need to know the type of a variable or expression, use the |type()|
828function.
829
830When the '!' flag is included in the 'viminfo' option, global variables that
831start with an uppercase letter, and don't contain a lowercase letter, are
832stored in the viminfo file |viminfo-file|.
833
834When the 'sessionoptions' option contains "global", global variables that
835start with an uppercase letter and contain at least one lowercase letter are
836stored in the session file |session-file|.
837
838variable name can be stored where ~
839my_var_6 not
840My_Var_6 session file
841MY_VAR_6 viminfo file
842
843
Bram Moolenaar5da36052021-12-27 15:39:57 +0000844In legacy script it is possible to form a variable name with curly braces, see
Bram Moolenaar071d4272004-06-13 20:20:40 +0000845|curly-braces-names|.
846
847==============================================================================
8482. Expression syntax *expression-syntax*
Bram Moolenaarf10911e2022-01-29 22:20:48 +0000849 *E1143*
Bram Moolenaar071d4272004-06-13 20:20:40 +0000850Expression syntax summary, from least to most significant:
851
Bram Moolenaar50ba5262016-09-22 22:33:02 +0200852|expr1| expr2
Bram Moolenaar89bcfda2016-08-30 23:26:57 +0200853 expr2 ? expr1 : expr1 if-then-else
Bram Moolenaar071d4272004-06-13 20:20:40 +0000854
Bram Moolenaar89bcfda2016-08-30 23:26:57 +0200855|expr2| expr3
Bram Moolenaar0f248b02019-04-04 15:36:05 +0200856 expr3 || expr3 ... logical OR
Bram Moolenaar071d4272004-06-13 20:20:40 +0000857
Bram Moolenaar89bcfda2016-08-30 23:26:57 +0200858|expr3| expr4
Bram Moolenaar0f248b02019-04-04 15:36:05 +0200859 expr4 && expr4 ... logical AND
Bram Moolenaar071d4272004-06-13 20:20:40 +0000860
Bram Moolenaar89bcfda2016-08-30 23:26:57 +0200861|expr4| expr5
862 expr5 == expr5 equal
Bram Moolenaar071d4272004-06-13 20:20:40 +0000863 expr5 != expr5 not equal
864 expr5 > expr5 greater than
865 expr5 >= expr5 greater than or equal
866 expr5 < expr5 smaller than
867 expr5 <= expr5 smaller than or equal
868 expr5 =~ expr5 regexp matches
869 expr5 !~ expr5 regexp doesn't match
870
871 expr5 ==? expr5 equal, ignoring case
872 expr5 ==# expr5 equal, match case
873 etc. As above, append ? for ignoring case, # for
874 matching case
875
Bram Moolenaar5e66b422019-01-24 21:58:10 +0100876 expr5 is expr5 same |List|, |Dictionary| or |Blob| instance
877 expr5 isnot expr5 different |List|, |Dictionary| or |Blob|
878 instance
Bram Moolenaarde8866b2005-01-06 23:24:37 +0000879
Yegappan Lakshmanana061f342022-05-22 19:13:49 +0100880|expr5| expr6 << expr6 bitwise left shift
881 expr6 >> expr6 bitwise right shift
Bram Moolenaar071d4272004-06-13 20:20:40 +0000882
Bram Moolenaar89bcfda2016-08-30 23:26:57 +0200883|expr6| expr7
Yegappan Lakshmanana061f342022-05-22 19:13:49 +0100884 expr7 + expr7 ... number addition, list or blob concatenation
885 expr7 - expr7 ... number subtraction
886 expr7 . expr7 ... string concatenation
887 expr7 .. expr7 ... string concatenation
Bram Moolenaar071d4272004-06-13 20:20:40 +0000888
Bram Moolenaar89bcfda2016-08-30 23:26:57 +0200889|expr7| expr8
Yegappan Lakshmanana061f342022-05-22 19:13:49 +0100890 expr8 * expr8 ... number multiplication
891 expr8 / expr8 ... number division
892 expr8 % expr8 ... number modulo
Bram Moolenaar071d4272004-06-13 20:20:40 +0000893
Bram Moolenaar89bcfda2016-08-30 23:26:57 +0200894|expr8| expr9
Yegappan Lakshmanana061f342022-05-22 19:13:49 +0100895 <type>expr9 type check and conversion (|Vim9| only)
Bram Moolenaar2fda12f2005-01-15 22:14:15 +0000896
Bram Moolenaar5da36052021-12-27 15:39:57 +0000897|expr9| expr10
Yegappan Lakshmanana061f342022-05-22 19:13:49 +0100898 ! expr9 logical NOT
899 - expr9 unary minus
900 + expr9 unary plus
Bram Moolenaar5da36052021-12-27 15:39:57 +0000901
Yegappan Lakshmanana061f342022-05-22 19:13:49 +0100902|expr10| expr11
903 expr10[expr1] byte of a String or item of a |List|
904 expr10[expr1 : expr1] substring of a String or sublist of a |List|
905 expr10.name entry in a |Dictionary|
906 expr10(expr1, ...) function call with |Funcref| variable
907 expr10->name(expr1, ...) |method| call
908
909|expr11| number number constant
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +0000910 "string" string constant, backslash is special
Bram Moolenaard8b02732005-01-14 21:48:43 +0000911 'string' string constant, ' is doubled
Bram Moolenaar32466aa2006-02-24 23:53:04 +0000912 [expr1, ...] |List|
913 {expr1: expr1, ...} |Dictionary|
Bram Moolenaar5da36052021-12-27 15:39:57 +0000914 #{key: expr1, ...} legacy |Dictionary|
Bram Moolenaar071d4272004-06-13 20:20:40 +0000915 &option option value
916 (expr1) nested expression
917 variable internal variable
918 va{ria}ble internal variable with curly braces
919 $VAR environment variable
920 @r contents of register 'r'
921 function(expr1, ...) function call
922 func{ti}on(expr1, ...) function call with curly braces
Bram Moolenaar5da36052021-12-27 15:39:57 +0000923 {args -> expr1} legacy lambda expression
924 (args) => expr1 Vim9 lambda expression
Bram Moolenaar071d4272004-06-13 20:20:40 +0000925
926
Bram Moolenaar0f248b02019-04-04 15:36:05 +0200927"..." indicates that the operations in this level can be concatenated.
Bram Moolenaar071d4272004-06-13 20:20:40 +0000928Example: >
929 &nu || &list && &shell == "csh"
930
931All expressions within one level are parsed from left to right.
932
Bram Moolenaarf10911e2022-01-29 22:20:48 +0000933Expression nesting is limited to 1000 levels deep (300 when build with MSVC)
934to avoid running out of stack and crashing. *E1169*
935
Bram Moolenaar071d4272004-06-13 20:20:40 +0000936
Bram Moolenaarc51cf032022-02-26 12:25:45 +0000937expr1 *expr1* *ternary* *falsy-operator* *??* *E109*
Bram Moolenaar071d4272004-06-13 20:20:40 +0000938-----
939
Bram Moolenaarc51cf032022-02-26 12:25:45 +0000940The ternary operator: expr2 ? expr1 : expr1
Bram Moolenaar92f26c22020-10-03 20:17:30 +0200941The falsy operator: expr2 ?? expr1
942
Bram Moolenaarc51cf032022-02-26 12:25:45 +0000943Ternary operator ~
Bram Moolenaar071d4272004-06-13 20:20:40 +0000944
Bram Moolenaar5da36052021-12-27 15:39:57 +0000945In legacy script the expression before the '?' is evaluated to a number. If
946it evaluates to |TRUE|, the result is the value of the expression between the
947'?' and ':', otherwise the result is the value of the expression after the
948':'.
949
950In |Vim9| script the first expression must evaluate to a boolean, see
951|vim9-boolean|.
952
Bram Moolenaar071d4272004-06-13 20:20:40 +0000953Example: >
954 :echo lnum == 1 ? "top" : lnum
955
956Since the first expression is an "expr2", it cannot contain another ?:. The
957other two expressions can, thus allow for recursive use of ?:.
958Example: >
959 :echo lnum == 1 ? "top" : lnum == 1000 ? "last" : lnum
960
961To keep this readable, using |line-continuation| is suggested: >
962 :echo lnum == 1
963 :\ ? "top"
964 :\ : lnum == 1000
965 :\ ? "last"
966 :\ : lnum
967
Bram Moolenaaref2f6562007-05-06 13:32:59 +0000968You should always put a space before the ':', otherwise it can be mistaken for
969use in a variable such as "a:1".
970
Bram Moolenaar92f26c22020-10-03 20:17:30 +0200971Falsy operator ~
972
973This is also known as the "null coalescing operator", but that's too
974complicated, thus we just call it the falsy operator.
975
976The expression before the '??' is evaluated. If it evaluates to
977|truthy|, this is used as the result. Otherwise the expression after the '??'
978is evaluated and used as the result. This is most useful to have a default
979value for an expression that may result in zero or empty: >
980 echo theList ?? 'list is empty'
981 echo GetName() ?? 'unknown'
982
983These are similar, but not equal: >
984 expr2 ?? expr1
985 expr2 ? expr2 : expr1
Bram Moolenaar5da36052021-12-27 15:39:57 +0000986In the second line "expr2" is evaluated twice. And in |Vim9| script the type
987of expr2 before "?" must be a boolean.
Bram Moolenaar92f26c22020-10-03 20:17:30 +0200988
Bram Moolenaar071d4272004-06-13 20:20:40 +0000989
990expr2 and expr3 *expr2* *expr3*
991---------------
992
Bram Moolenaar04186092016-08-29 21:55:35 +0200993expr3 || expr3 .. logical OR *expr-barbar*
994expr4 && expr4 .. logical AND *expr-&&*
995
Bram Moolenaar5da36052021-12-27 15:39:57 +0000996The "||" and "&&" operators take one argument on each side.
Bram Moolenaar071d4272004-06-13 20:20:40 +0000997
Bram Moolenaar5da36052021-12-27 15:39:57 +0000998In legacy script the arguments are (converted to) Numbers.
999
1000In |Vim9| script the values must be boolean, see |vim9-boolean|. Use "!!" to
1001convert any type to a boolean.
1002
1003The result is:
Bram Moolenaare381d3d2016-07-07 14:50:41 +02001004 input output ~
1005n1 n2 n1 || n2 n1 && n2 ~
1006|FALSE| |FALSE| |FALSE| |FALSE|
1007|FALSE| |TRUE| |TRUE| |FALSE|
1008|TRUE| |FALSE| |TRUE| |FALSE|
1009|TRUE| |TRUE| |TRUE| |TRUE|
Bram Moolenaar071d4272004-06-13 20:20:40 +00001010
1011The operators can be concatenated, for example: >
1012
1013 &nu || &list && &shell == "csh"
1014
1015Note that "&&" takes precedence over "||", so this has the meaning of: >
1016
1017 &nu || (&list && &shell == "csh")
1018
1019Once the result is known, the expression "short-circuits", that is, further
1020arguments are not evaluated. This is like what happens in C. For example: >
1021
1022 let a = 1
1023 echo a || b
1024
Bram Moolenaare381d3d2016-07-07 14:50:41 +02001025This is valid even if there is no variable called "b" because "a" is |TRUE|,
1026so the result must be |TRUE|. Similarly below: >
Bram Moolenaar071d4272004-06-13 20:20:40 +00001027
1028 echo exists("b") && b == "yes"
1029
1030This is valid whether "b" has been defined or not. The second clause will
1031only be evaluated if "b" has been defined.
1032
1033
Bram Moolenaara2baa732022-02-04 16:09:54 +00001034expr4 *expr4* *E1153*
Bram Moolenaar071d4272004-06-13 20:20:40 +00001035-----
1036
1037expr5 {cmp} expr5
1038
Bram Moolenaar5da36052021-12-27 15:39:57 +00001039Compare two expr5 expressions. In legacy script the result is a 0 if it
1040evaluates to false, or 1 if it evaluates to true. In |Vim9| script the result
1041is |true| or |false|.
Bram Moolenaar071d4272004-06-13 20:20:40 +00001042
Bram Moolenaar446cb832008-06-24 21:56:24 +00001043 *expr-==* *expr-!=* *expr->* *expr->=*
Bram Moolenaar071d4272004-06-13 20:20:40 +00001044 *expr-<* *expr-<=* *expr-=~* *expr-!~*
1045 *expr-==#* *expr-!=#* *expr->#* *expr->=#*
1046 *expr-<#* *expr-<=#* *expr-=~#* *expr-!~#*
1047 *expr-==?* *expr-!=?* *expr->?* *expr->=?*
1048 *expr-<?* *expr-<=?* *expr-=~?* *expr-!~?*
Bram Moolenaar251e1912011-06-19 05:09:16 +02001049 *expr-is* *expr-isnot* *expr-is#* *expr-isnot#*
Bram Moolenaar6f4754b2022-01-23 12:07:04 +00001050 *expr-is?* *expr-isnot?* *E1072*
Bram Moolenaar071d4272004-06-13 20:20:40 +00001051 use 'ignorecase' match case ignore case ~
1052equal == ==# ==?
1053not equal != !=# !=?
1054greater than > ># >?
1055greater than or equal >= >=# >=?
1056smaller than < <# <?
1057smaller than or equal <= <=# <=?
1058regexp matches =~ =~# =~?
1059regexp doesn't match !~ !~# !~?
Bram Moolenaar251e1912011-06-19 05:09:16 +02001060same instance is is# is?
1061different instance isnot isnot# isnot?
Bram Moolenaar071d4272004-06-13 20:20:40 +00001062
1063Examples:
1064"abc" ==# "Abc" evaluates to 0
1065"abc" ==? "Abc" evaluates to 1
1066"abc" == "Abc" evaluates to 1 if 'ignorecase' is set, 0 otherwise
Bram Moolenaar5da36052021-12-27 15:39:57 +00001067NOTE: In |Vim9| script 'ignorecase' is not used.
Bram Moolenaar071d4272004-06-13 20:20:40 +00001068
Bram Moolenaar13065c42005-01-08 16:08:21 +00001069 *E691* *E692*
Bram Moolenaar01164a62017-11-02 22:58:42 +01001070A |List| can only be compared with a |List| and only "equal", "not equal",
1071"is" and "isnot" can be used. This compares the values of the list,
1072recursively. Ignoring case means case is ignored when comparing item values.
Bram Moolenaarde8866b2005-01-06 23:24:37 +00001073
Bram Moolenaar3a3a7232005-01-17 22:16:15 +00001074 *E735* *E736*
Bram Moolenaar32466aa2006-02-24 23:53:04 +00001075A |Dictionary| can only be compared with a |Dictionary| and only "equal", "not
Bram Moolenaar01164a62017-11-02 22:58:42 +01001076equal", "is" and "isnot" can be used. This compares the key/values of the
1077|Dictionary| recursively. Ignoring case means case is ignored when comparing
1078item values.
Bram Moolenaar3a3a7232005-01-17 22:16:15 +00001079
Bram Moolenaaraa3b15d2016-04-21 08:53:19 +02001080 *E694*
Bram Moolenaare18dbe82016-07-02 21:42:23 +02001081A |Funcref| can only be compared with a |Funcref| and only "equal", "not
1082equal", "is" and "isnot" can be used. Case is never ignored. Whether
1083arguments or a Dictionary are bound (with a partial) matters. The
1084Dictionaries must also be equal (or the same, in case of "is") and the
1085arguments must be equal (or the same).
1086
1087To compare Funcrefs to see if they refer to the same function, ignoring bound
1088Dictionary and arguments, use |get()| to get the function name: >
1089 if get(Part1, 'name') == get(Part2, 'name')
1090 " Part1 and Part2 refer to the same function
Bram Moolenaar6f4754b2022-01-23 12:07:04 +00001091< *E1037*
Bram Moolenaar5e66b422019-01-24 21:58:10 +01001092Using "is" or "isnot" with a |List|, |Dictionary| or |Blob| checks whether
1093the expressions are referring to the same |List|, |Dictionary| or |Blob|
1094instance. A copy of a |List| is different from the original |List|. When
1095using "is" without a |List|, |Dictionary| or |Blob|, it is equivalent to
1096using "equal", using "isnot" equivalent to using "not equal". Except that
1097a different type means the values are different: >
Bram Moolenaar86edef62016-03-13 18:07:30 +01001098 echo 4 == '4'
1099 1
1100 echo 4 is '4'
1101 0
1102 echo 0 is []
1103 0
1104"is#"/"isnot#" and "is?"/"isnot?" can be used to match and ignore case.
Bram Moolenaare1f3fd12022-08-15 18:51:32 +01001105In |Vim9| script this doesn't work, two strings are never identical.
Bram Moolenaarde8866b2005-01-06 23:24:37 +00001106
Bram Moolenaar5da36052021-12-27 15:39:57 +00001107In legacy script, when comparing a String with a Number, the String is
1108converted to a Number, and the comparison is done on Numbers. This means
1109that: >
Bram Moolenaar86edef62016-03-13 18:07:30 +01001110 echo 0 == 'x'
1111 1
1112because 'x' converted to a Number is zero. However: >
1113 echo [0] == ['x']
1114 0
1115Inside a List or Dictionary this conversion is not used.
Bram Moolenaar071d4272004-06-13 20:20:40 +00001116
Bram Moolenaar5da36052021-12-27 15:39:57 +00001117In |Vim9| script the types must match.
1118
Bram Moolenaar071d4272004-06-13 20:20:40 +00001119When comparing two Strings, this is done with strcmp() or stricmp(). This
1120results in the mathematical difference (comparing byte values), not
1121necessarily the alphabetical difference in the local language.
1122
Bram Moolenaar446cb832008-06-24 21:56:24 +00001123When using the operators with a trailing '#', or the short version and
Bram Moolenaaref2f6562007-05-06 13:32:59 +00001124'ignorecase' is off, the comparing is done with strcmp(): case matters.
Bram Moolenaar071d4272004-06-13 20:20:40 +00001125
1126When using the operators with a trailing '?', or the short version and
Bram Moolenaaref2f6562007-05-06 13:32:59 +00001127'ignorecase' is set, the comparing is done with stricmp(): case is ignored.
1128
1129'smartcase' is not used.
Bram Moolenaar071d4272004-06-13 20:20:40 +00001130
1131The "=~" and "!~" operators match the lefthand argument with the righthand
1132argument, which is used as a pattern. See |pattern| for what a pattern is.
1133This matching is always done like 'magic' was set and 'cpoptions' is empty, no
1134matter what the actual value of 'magic' or 'cpoptions' is. This makes scripts
1135portable. To avoid backslashes in the regexp pattern to be doubled, use a
1136single-quote string, see |literal-string|.
1137Since a string is considered to be a single line, a multi-line pattern
1138(containing \n, backslash-n) will not match. However, a literal NL character
1139can be matched like an ordinary character. Examples:
1140 "foo\nbar" =~ "\n" evaluates to 1
1141 "foo\nbar" =~ "\\n" evaluates to 0
1142
1143
Yegappan Lakshmanana061f342022-05-22 19:13:49 +01001144expr5 *expr5* *bitwise-shift*
1145-----
1146expr6 << expr6 bitwise left shift *expr-<<*
1147expr6 >> expr6 bitwise right shift *expr->>*
1148 *E1282* *E1283*
1149The "<<" and ">>" operators can be used to perform bitwise left or right shift
1150of the left operand by the number of bits specified by the right operand. The
Bram Moolenaar338bf582022-05-22 20:16:32 +01001151operands are used as positive numbers. When shifting right with ">>" the
Bram Moolenaard592deb2022-06-17 15:42:40 +01001152topmost bit (sometimes called the sign bit) is cleared. If the right operand
Bram Moolenaar338bf582022-05-22 20:16:32 +01001153(shift amount) is more than the maximum number of bits in a number
1154(|v:numbersize|) the result is zero.
Bram Moolenaar071d4272004-06-13 20:20:40 +00001155
Yegappan Lakshmanana061f342022-05-22 19:13:49 +01001156
1157expr6 and expr7 *expr6* *expr7* *E1036* *E1051*
1158---------------
1159expr7 + expr7 Number addition, |List| or |Blob| concatenation *expr-+*
1160expr7 - expr7 Number subtraction *expr--*
1161expr7 . expr7 String concatenation *expr-.*
1162expr7 .. expr7 String concatenation *expr-..*
1163
1164For |Lists| only "+" is possible and then both expr7 must be a list. The
Bram Moolenaar32466aa2006-02-24 23:53:04 +00001165result is a new list with the two lists Concatenated.
Bram Moolenaarde8866b2005-01-06 23:24:37 +00001166
Bram Moolenaar0f248b02019-04-04 15:36:05 +02001167For String concatenation ".." is preferred, since "." is ambiguous, it is also
1168used for |Dict| member access and floating point numbers.
Bram Moolenaar5da36052021-12-27 15:39:57 +00001169In |Vim9| script and when |vimscript-version| is 2 or higher, using "." is not
1170allowed.
1171
1172In |Vim9| script the arguments of ".." are converted to String for simple
1173types: Number, Float, Special and Bool. For other types |string()| should be
1174used.
Bram Moolenaar0f248b02019-04-04 15:36:05 +02001175
Yegappan Lakshmanana061f342022-05-22 19:13:49 +01001176expr8 * expr8 Number multiplication *expr-star*
1177expr8 / expr8 Number division *expr-/*
1178expr8 % expr8 Number modulo *expr-%*
Bram Moolenaar071d4272004-06-13 20:20:40 +00001179
Bram Moolenaar5da36052021-12-27 15:39:57 +00001180In legacy script, for all operators except "." and "..", Strings are converted
1181to Numbers.
1182
Bram Moolenaard6e256c2011-12-14 15:32:50 +01001183For bitwise operators see |and()|, |or()| and |xor()|.
Bram Moolenaar071d4272004-06-13 20:20:40 +00001184
Bram Moolenaar5da36052021-12-27 15:39:57 +00001185Note the difference between "+" and ".." in legacy script:
Bram Moolenaar071d4272004-06-13 20:20:40 +00001186 "123" + "456" = 579
Bram Moolenaar5da36052021-12-27 15:39:57 +00001187 "123" .. "456" = "123456"
Bram Moolenaar071d4272004-06-13 20:20:40 +00001188
Bram Moolenaar5da36052021-12-27 15:39:57 +00001189Since '..' has the same precedence as '+' and '-', you need to read: >
1190 1 .. 90 + 90.0
Bram Moolenaar446cb832008-06-24 21:56:24 +00001191As: >
Bram Moolenaar5da36052021-12-27 15:39:57 +00001192 (1 .. 90) + 90.0
1193That works in legacy script, since the String "190" is automatically converted
1194to the Number 190, which can be added to the Float 90.0. However: >
1195 1 .. 90 * 90.0
Bram Moolenaar446cb832008-06-24 21:56:24 +00001196Should be read as: >
Bram Moolenaar5da36052021-12-27 15:39:57 +00001197 1 .. (90 * 90.0)
1198Since '..' has lower precedence than '*'. This does NOT work, since this
Bram Moolenaar446cb832008-06-24 21:56:24 +00001199attempts to concatenate a Float and a String.
1200
1201When dividing a Number by zero the result depends on the value:
1202 0 / 0 = -0x80000000 (like NaN for Float)
1203 >0 / 0 = 0x7fffffff (like positive infinity)
1204 <0 / 0 = -0x7fffffff (like negative infinity)
1205 (before Vim 7.2 it was always 0x7fffffff)
Bram Moolenaara2baa732022-02-04 16:09:54 +00001206In |Vim9| script dividing a number by zero is an error. *E1154*
Bram Moolenaar446cb832008-06-24 21:56:24 +00001207
Bram Moolenaar22fcfad2016-07-01 18:17:26 +02001208When 64-bit Number support is enabled:
1209 0 / 0 = -0x8000000000000000 (like NaN for Float)
1210 >0 / 0 = 0x7fffffffffffffff (like positive infinity)
1211 <0 / 0 = -0x7fffffffffffffff (like negative infinity)
1212
Bram Moolenaar071d4272004-06-13 20:20:40 +00001213When the righthand side of '%' is zero, the result is 0.
1214
Bram Moolenaar32466aa2006-02-24 23:53:04 +00001215None of these work for |Funcref|s.
Bram Moolenaarde8866b2005-01-06 23:24:37 +00001216
Bram Moolenaar6f4754b2022-01-23 12:07:04 +00001217".", ".." and "%" do not work for Float. *E804* *E1035*
Bram Moolenaar446cb832008-06-24 21:56:24 +00001218
Bram Moolenaar071d4272004-06-13 20:20:40 +00001219
Yegappan Lakshmanana061f342022-05-22 19:13:49 +01001220expr8 *expr8*
Bram Moolenaar071d4272004-06-13 20:20:40 +00001221-----
Yegappan Lakshmanana061f342022-05-22 19:13:49 +01001222<type>expr9
Bram Moolenaar5da36052021-12-27 15:39:57 +00001223
1224This is only available in |Vim9| script, see |type-casting|.
1225
1226
Yegappan Lakshmanana061f342022-05-22 19:13:49 +01001227expr9 *expr9*
Bram Moolenaar5da36052021-12-27 15:39:57 +00001228-----
Yegappan Lakshmanana061f342022-05-22 19:13:49 +01001229! expr9 logical NOT *expr-!*
1230- expr9 unary minus *expr-unary--*
1231+ expr9 unary plus *expr-unary-+*
Bram Moolenaar071d4272004-06-13 20:20:40 +00001232
Bram Moolenaare381d3d2016-07-07 14:50:41 +02001233For '!' |TRUE| becomes |FALSE|, |FALSE| becomes |TRUE| (one).
Bram Moolenaar071d4272004-06-13 20:20:40 +00001234For '-' the sign of the number is changed.
Bram Moolenaar6f02b002021-01-10 20:22:54 +01001235For '+' the number is unchanged. Note: "++" has no effect.
Bram Moolenaar071d4272004-06-13 20:20:40 +00001236
Bram Moolenaar5da36052021-12-27 15:39:57 +00001237In legacy script a String will be converted to a Number first. Note that if
1238the string does not start with a digit you likely don't get what you expect.
1239
1240In |Vim9| script an error is given when "-" or "+" is used and the type is not
1241a number.
1242
1243In |Vim9| script "!" can be used for any type and the result is always a
1244boolean. Use "!!" to convert any type to a boolean, according to whether the
1245value is |falsy|.
Bram Moolenaar071d4272004-06-13 20:20:40 +00001246
Bram Moolenaar58b85342016-08-14 19:54:54 +02001247These three can be repeated and mixed. Examples:
Bram Moolenaar071d4272004-06-13 20:20:40 +00001248 !-1 == 0
1249 !!8 == 1
1250 --9 == 9
1251
1252
Yegappan Lakshmanana061f342022-05-22 19:13:49 +01001253expr10 *expr10*
1254------
1255This expression is either |expr11| or a sequence of the alternatives below,
Bram Moolenaarfc65cab2018-08-28 22:58:02 +02001256in any order. E.g., these are all possible:
Yegappan Lakshmanana061f342022-05-22 19:13:49 +01001257 expr10[expr1].name
1258 expr10.name[expr1]
1259 expr10(expr1, ...)[expr1].name
1260 expr10->(expr1, ...)[expr1]
Bram Moolenaarac92e252019-08-03 21:58:38 +02001261Evaluation is always from left to right.
Bram Moolenaarfc65cab2018-08-28 22:58:02 +02001262
Yegappan Lakshmanana061f342022-05-22 19:13:49 +01001263expr10[expr1] item of String or |List| *expr-[]* *E111*
Bram Moolenaar6f4754b2022-01-23 12:07:04 +00001264 *E909* *subscript* *E1062*
Bram Moolenaare3c37d82020-08-15 18:39:05 +02001265In legacy Vim script:
Yegappan Lakshmanana061f342022-05-22 19:13:49 +01001266If expr10 is a Number or String this results in a String that contains the
1267expr1'th single byte from expr10. expr10 is used as a String (a number is
Bram Moolenaare3c37d82020-08-15 18:39:05 +02001268automatically converted to a String), expr1 as a Number. This doesn't
Bram Moolenaar207f0092020-08-30 17:20:20 +02001269recognize multibyte encodings, see `byteidx()` for an alternative, or use
Bram Moolenaare3c37d82020-08-15 18:39:05 +02001270`split()` to turn the string into a list of characters. Example, to get the
1271byte under the cursor: >
Bram Moolenaar61660ea2006-04-07 21:40:07 +00001272 :let c = getline(".")[col(".") - 1]
Bram Moolenaar071d4272004-06-13 20:20:40 +00001273
Bram Moolenaara2baa732022-02-04 16:09:54 +00001274In |Vim9| script: *E1147* *E1148*
Yegappan Lakshmanana061f342022-05-22 19:13:49 +01001275If expr10 is a String this results in a String that contains the expr1'th
1276single character (including any composing characters) from expr10. To use byte
Bram Moolenaar02b4d9b2021-03-14 19:46:45 +01001277indexes use |strpart()|.
Bram Moolenaare3c37d82020-08-15 18:39:05 +02001278
1279Index zero gives the first byte or character. Careful: text column numbers
1280start with one!
1281
Bram Moolenaar071d4272004-06-13 20:20:40 +00001282If the length of the String is less than the index, the result is an empty
Bram Moolenaar85084ef2016-01-17 22:26:33 +01001283String. A negative index always results in an empty string (reason: backward
Bram Moolenaare3c37d82020-08-15 18:39:05 +02001284compatibility). Use [-1:] to get the last byte or character.
Bram Moolenaar6f02b002021-01-10 20:22:54 +01001285In Vim9 script a negative index is used like with a list: count from the end.
Bram Moolenaard7ee7ce2005-01-03 21:02:03 +00001286
Yegappan Lakshmanana061f342022-05-22 19:13:49 +01001287If expr10 is a |List| then it results the item at index expr1. See |list-index|
Bram Moolenaard7ee7ce2005-01-03 21:02:03 +00001288for possible index values. If the index is out of range this results in an
Bram Moolenaar58b85342016-08-14 19:54:54 +02001289error. Example: >
Bram Moolenaard7ee7ce2005-01-03 21:02:03 +00001290 :let item = mylist[-1] " get last item
1291
Bram Moolenaar32466aa2006-02-24 23:53:04 +00001292Generally, if a |List| index is equal to or higher than the length of the
1293|List|, or more negative than the length of the |List|, this results in an
1294error.
Bram Moolenaard7ee7ce2005-01-03 21:02:03 +00001295
Bram Moolenaard8b02732005-01-14 21:48:43 +00001296
Bram Moolenaar8a3b8052022-06-26 12:21:15 +01001297expr10[expr1a : expr1b] substring or |sublist| *expr-[:]* *substring*
Bram Moolenaard7ee7ce2005-01-03 21:02:03 +00001298
Yegappan Lakshmanana061f342022-05-22 19:13:49 +01001299If expr10 is a String this results in the substring with the bytes or
1300characters from expr1a to and including expr1b. expr10 is used as a String,
Bram Moolenaar207f0092020-08-30 17:20:20 +02001301expr1a and expr1b are used as a Number.
Bram Moolenaare3c37d82020-08-15 18:39:05 +02001302
1303In legacy Vim script the indexes are byte indexes. This doesn't recognize
Yegappan Lakshmanana061f342022-05-22 19:13:49 +01001304multibyte encodings, see |byteidx()| for computing the indexes. If expr10 is
Bram Moolenaare3c37d82020-08-15 18:39:05 +02001305a Number it is first converted to a String.
1306
Bram Moolenaar02b4d9b2021-03-14 19:46:45 +01001307In Vim9 script the indexes are character indexes and include composing
1308characters. To use byte indexes use |strpart()|. To use character indexes
1309without including composing characters use |strcharpart()|.
Bram Moolenaard7ee7ce2005-01-03 21:02:03 +00001310
Bram Moolenaar6601b622021-01-13 21:47:15 +01001311The item at index expr1b is included, it is inclusive. For an exclusive index
1312use the |slice()| function.
1313
Bram Moolenaard7ee7ce2005-01-03 21:02:03 +00001314If expr1a is omitted zero is used. If expr1b is omitted the length of the
1315string minus one is used.
1316
1317A negative number can be used to measure from the end of the string. -1 is
1318the last character, -2 the last but one, etc.
1319
1320If an index goes out of range for the string characters are omitted. If
1321expr1b is smaller than expr1a the result is an empty string.
1322
1323Examples: >
1324 :let c = name[-1:] " last byte of a string
Bram Moolenaar207f0092020-08-30 17:20:20 +02001325 :let c = name[0:-1] " the whole string
Bram Moolenaard7ee7ce2005-01-03 21:02:03 +00001326 :let c = name[-2:-2] " last but one byte of a string
1327 :let s = line(".")[4:] " from the fifth byte to the end
1328 :let s = s[:-3] " remove last two bytes
Bram Moolenaar8f3f58f2010-01-06 20:52:26 +01001329<
Bram Moolenaarbc8801c2016-08-02 21:04:33 +02001330 *slice*
Yegappan Lakshmanana061f342022-05-22 19:13:49 +01001331If expr10 is a |List| this results in a new |List| with the items indicated by
Bram Moolenaar58b85342016-08-14 19:54:54 +02001332the indexes expr1a and expr1b. This works like with a String, as explained
Bram Moolenaarbc8801c2016-08-02 21:04:33 +02001333just above. Also see |sublist| below. Examples: >
Bram Moolenaard7ee7ce2005-01-03 21:02:03 +00001334 :let l = mylist[:3] " first four items
1335 :let l = mylist[4:4] " List with one item
1336 :let l = mylist[:] " shallow copy of a List
1337
Yegappan Lakshmanana061f342022-05-22 19:13:49 +01001338If expr10 is a |Blob| this results in a new |Blob| with the bytes in the
Bram Moolenaar6e5ea8d2019-01-12 22:47:31 +01001339indexes expr1a and expr1b, inclusive. Examples: >
1340 :let b = 0zDEADBEEF
1341 :let bs = b[1:2] " 0zADBE
Bram Moolenaard09091d2019-01-17 16:07:22 +01001342 :let bs = b[:] " copy of 0zDEADBEEF
Bram Moolenaar6e5ea8d2019-01-12 22:47:31 +01001343
Yegappan Lakshmanana061f342022-05-22 19:13:49 +01001344Using expr10[expr1] or expr10[expr1a : expr1b] on a |Funcref| results in an
Bram Moolenaar32466aa2006-02-24 23:53:04 +00001345error.
Bram Moolenaar071d4272004-06-13 20:20:40 +00001346
Bram Moolenaarda440d22016-01-16 21:27:23 +01001347Watch out for confusion between a namespace and a variable followed by a colon
1348for a sublist: >
1349 mylist[n:] " uses variable n
1350 mylist[s:] " uses namespace s:, error!
1351
Bram Moolenaard8b02732005-01-14 21:48:43 +00001352
Yegappan Lakshmanana061f342022-05-22 19:13:49 +01001353expr10.name entry in a |Dictionary| *expr-entry*
Bram Moolenaara2baa732022-02-04 16:09:54 +00001354 *E1203* *E1229*
Yegappan Lakshmanana061f342022-05-22 19:13:49 +01001355If expr10 is a |Dictionary| and it is followed by a dot, then the following
Bram Moolenaar32466aa2006-02-24 23:53:04 +00001356name will be used as a key in the |Dictionary|. This is just like:
Yegappan Lakshmanana061f342022-05-22 19:13:49 +01001357expr10[name].
Bram Moolenaard8b02732005-01-14 21:48:43 +00001358
1359The name must consist of alphanumeric characters, just like a variable name,
1360but it may start with a number. Curly braces cannot be used.
1361
1362There must not be white space before or after the dot.
1363
1364Examples: >
1365 :let dict = {"one": 1, 2: "two"}
Bram Moolenaar68e65602019-05-26 21:33:31 +02001366 :echo dict.one " shows "1"
1367 :echo dict.2 " shows "two"
1368 :echo dict .2 " error because of space before the dot
Bram Moolenaard8b02732005-01-14 21:48:43 +00001369
1370Note that the dot is also used for String concatenation. To avoid confusion
1371always put spaces around the dot for String concatenation.
1372
1373
Yegappan Lakshmanana061f342022-05-22 19:13:49 +01001374expr10(expr1, ...) |Funcref| function call *E1085*
Bram Moolenaar2fda12f2005-01-15 22:14:15 +00001375
Yegappan Lakshmanana061f342022-05-22 19:13:49 +01001376When expr10 is a |Funcref| type variable, invoke the function it refers to.
Bram Moolenaar2fda12f2005-01-15 22:14:15 +00001377
1378
Yegappan Lakshmanana061f342022-05-22 19:13:49 +01001379expr10->name([args]) method call *method* *->*
1380expr10->{lambda}([args])
Bram Moolenaara2baa732022-02-04 16:09:54 +00001381 *E260* *E276* *E1265*
Bram Moolenaar25e42232019-08-04 15:04:10 +02001382For methods that are also available as global functions this is the same as: >
Yegappan Lakshmanana061f342022-05-22 19:13:49 +01001383 name(expr10 [, args])
1384There can also be methods specifically for the type of "expr10".
Bram Moolenaar2fda12f2005-01-15 22:14:15 +00001385
Bram Moolenaar51841322019-08-08 21:10:01 +02001386This allows for chaining, passing the value that one method returns to the
1387next method: >
Bram Moolenaar25e42232019-08-04 15:04:10 +02001388 mylist->filter(filterexpr)->map(mapexpr)->sort()->join()
1389<
Bram Moolenaar22a0c0c2019-08-09 23:25:08 +02001390Example of using a lambda: >
Bram Moolenaar02b31112019-08-31 22:16:38 +02001391 GetPercentage()->{x -> x * 100}()->printf('%d%%')
Bram Moolenaar56c860c2019-08-17 20:09:31 +02001392<
Yegappan Lakshmanana061f342022-05-22 19:13:49 +01001393When using -> the |expr9| operators will be applied first, thus: >
Bram Moolenaar93cf85f2019-08-17 21:36:28 +02001394 -1.234->string()
1395Is equivalent to: >
1396 (-1.234)->string()
1397And NOT: >
1398 -(1.234->string())
Bram Moolenaar6f4754b2022-01-23 12:07:04 +00001399
1400What comes after "->" can be a name, a simple expression (not containing any
Bram Moolenaar944697a2022-02-20 19:48:20 +00001401parenthesis), or any expression in parentheses: >
Bram Moolenaar6f4754b2022-01-23 12:07:04 +00001402 base->name(args)
1403 base->some.name(args)
1404 base->alist[idx](args)
1405 base->(getFuncRef())(args)
1406Note that in the last call the base is passed to the function resulting from
Bram Moolenaar2ecbe532022-07-29 21:36:21 +01001407"(getFuncRef())", inserted before "args". *E1275*
Bram Moolenaar6f4754b2022-01-23 12:07:04 +00001408
Bram Moolenaar51841322019-08-08 21:10:01 +02001409 *E274*
1410"->name(" must not contain white space. There can be white space before the
1411"->" and after the "(", thus you can split the lines like this: >
1412 mylist
1413 \ ->filter(filterexpr)
1414 \ ->map(mapexpr)
1415 \ ->sort()
1416 \ ->join()
Bram Moolenaar56c860c2019-08-17 20:09:31 +02001417
1418When using the lambda form there must be no white space between the } and the
1419(.
1420
Bram Moolenaar25e42232019-08-04 15:04:10 +02001421
Yegappan Lakshmanana061f342022-05-22 19:13:49 +01001422 *expr11*
Bram Moolenaar071d4272004-06-13 20:20:40 +00001423number
1424------
Bram Moolenaarb0d45e72017-11-05 18:19:24 +01001425number number constant *expr-number*
Bram Moolenaar071d4272004-06-13 20:20:40 +00001426
Bram Moolenaar6f02b002021-01-10 20:22:54 +01001427 *0x* *hex-number* *0o* *octal-number* *binary-number*
Bram Moolenaar7571d552016-08-18 22:54:46 +02001428Decimal, Hexadecimal (starting with 0x or 0X), Binary (starting with 0b or 0B)
Bram Moolenaarc17e66c2020-06-02 21:38:22 +02001429and Octal (starting with 0, 0o or 0O).
Bram Moolenaar071d4272004-06-13 20:20:40 +00001430
Bram Moolenaar338bf582022-05-22 20:16:32 +01001431Assuming 64 bit numbers are used (see |v:numbersize|) an unsigned number is
1432truncated to 0x7fffffffffffffff or 9223372036854775807. You can use -1 to get
14330xffffffffffffffff.
1434
Bram Moolenaar446cb832008-06-24 21:56:24 +00001435 *floating-point-format*
1436Floating point numbers can be written in two forms:
1437
1438 [-+]{N}.{M}
Bram Moolenaar8a94d872015-01-25 13:02:57 +01001439 [-+]{N}.{M}[eE][-+]{exp}
Bram Moolenaar446cb832008-06-24 21:56:24 +00001440
1441{N} and {M} are numbers. Both {N} and {M} must be present and can only
Bram Moolenaar6aa57292021-08-14 21:25:52 +02001442contain digits, except that in |Vim9| script in {N} single quotes between
1443digits are ignored.
Bram Moolenaar446cb832008-06-24 21:56:24 +00001444[-+] means there is an optional plus or minus sign.
1445{exp} is the exponent, power of 10.
Bram Moolenaar58b85342016-08-14 19:54:54 +02001446Only a decimal point is accepted, not a comma. No matter what the current
Bram Moolenaar446cb832008-06-24 21:56:24 +00001447locale is.
Bram Moolenaar446cb832008-06-24 21:56:24 +00001448
1449Examples:
1450 123.456
1451 +0.0001
1452 55.0
1453 -0.123
1454 1.234e03
1455 1.0E-6
1456 -3.1416e+88
1457
1458These are INVALID:
1459 3. empty {M}
1460 1e40 missing .{M}
1461
1462Rationale:
1463Before floating point was introduced, the text "123.456" was interpreted as
1464the two numbers "123" and "456", both converted to a string and concatenated,
1465resulting in the string "123456". Since this was considered pointless, and we
Bram Moolenaare37d50a2008-08-06 17:06:04 +00001466could not find it intentionally being used in Vim scripts, this backwards
Bram Moolenaar446cb832008-06-24 21:56:24 +00001467incompatibility was accepted in favor of being able to use the normal notation
1468for floating point numbers.
1469
Bram Moolenaard47d5222018-12-09 20:43:55 +01001470 *float-pi* *float-e*
1471A few useful values to copy&paste: >
1472 :let pi = 3.14159265359
1473 :let e = 2.71828182846
1474Or, if you don't want to write them in as floating-point literals, you can
1475also use functions, like the following: >
1476 :let pi = acos(-1.0)
1477 :let e = exp(1.0)
Bram Moolenaar98aefe72018-12-13 22:20:09 +01001478<
Bram Moolenaar446cb832008-06-24 21:56:24 +00001479 *floating-point-precision*
1480The precision and range of floating points numbers depends on what "double"
1481means in the library Vim was compiled with. There is no way to change this at
1482runtime.
1483
1484The default for displaying a |Float| is to use 6 decimal places, like using
1485printf("%g", f). You can select something else when using the |printf()|
1486function. Example: >
1487 :echo printf('%.15e', atan(1))
1488< 7.853981633974483e-01
1489
1490
Bram Moolenaar071d4272004-06-13 20:20:40 +00001491
Bram Moolenaar979243b2015-06-26 19:35:49 +02001492string *string* *String* *expr-string* *E114*
Bram Moolenaar071d4272004-06-13 20:20:40 +00001493------
1494"string" string constant *expr-quote*
1495
1496Note that double quotes are used.
1497
1498A string constant accepts these special characters:
1499\... three-digit octal number (e.g., "\316")
1500\.. two-digit octal number (must be followed by non-digit)
1501\. one-digit octal number (must be followed by non-digit)
1502\x.. byte specified with two hex numbers (e.g., "\x1f")
1503\x. byte specified with one hex number (must be followed by non-hex char)
1504\X.. same as \x..
1505\X. same as \x.
Bram Moolenaar446cb832008-06-24 21:56:24 +00001506\u.... character specified with up to 4 hex numbers, stored according to the
Bram Moolenaar071d4272004-06-13 20:20:40 +00001507 current value of 'encoding' (e.g., "\u02a4")
Bram Moolenaar541f92d2015-06-19 13:27:23 +02001508\U.... same as \u but allows up to 8 hex numbers.
Bram Moolenaar071d4272004-06-13 20:20:40 +00001509\b backspace <BS>
1510\e escape <Esc>
Bram Moolenaar6e649222021-10-04 21:32:54 +01001511\f formfeed 0x0C
Bram Moolenaar071d4272004-06-13 20:20:40 +00001512\n newline <NL>
1513\r return <CR>
1514\t tab <Tab>
1515\\ backslash
1516\" double quote
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001517\<xxx> Special key named "xxx". e.g. "\<C-W>" for CTRL-W. This is for use
Bram Moolenaar58b85342016-08-14 19:54:54 +02001518 in mappings, the 0x80 byte is escaped.
1519 To use the double quote character it must be escaped: "<M-\">".
Bram Moolenaar6e649222021-10-04 21:32:54 +01001520 Don't use <Char-xxxx> to get a UTF-8 character, use \uxxxx as
Bram Moolenaar58b85342016-08-14 19:54:54 +02001521 mentioned above.
Bram Moolenaarfccd93f2020-05-31 22:06:51 +02001522\<*xxx> Like \<xxx> but prepends a modifier instead of including it in the
1523 character. E.g. "\<C-w>" is one character 0x17 while "\<*C-w>" is four
Bram Moolenaarebe9d342020-05-30 21:52:54 +02001524 bytes: 3 for the CTRL modifier and then character "W".
Bram Moolenaar071d4272004-06-13 20:20:40 +00001525
Bram Moolenaaref2f6562007-05-06 13:32:59 +00001526Note that "\xff" is stored as the byte 255, which may be invalid in some
1527encodings. Use "\u00ff" to store character 255 according to the current value
1528of 'encoding'.
1529
Bram Moolenaar071d4272004-06-13 20:20:40 +00001530Note that "\000" and "\x00" force the end of the string.
1531
1532
Bram Moolenaard8968242019-01-15 22:51:57 +01001533blob-literal *blob-literal* *E973*
Bram Moolenaar6e5ea8d2019-01-12 22:47:31 +01001534------------
1535
1536Hexadecimal starting with 0z or 0Z, with an arbitrary number of bytes.
1537The sequence must be an even number of hex characters. Example: >
1538 :let b = 0zFF00ED015DAF
1539
1540
Bram Moolenaar071d4272004-06-13 20:20:40 +00001541literal-string *literal-string* *E115*
1542---------------
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00001543'string' string constant *expr-'*
Bram Moolenaar071d4272004-06-13 20:20:40 +00001544
1545Note that single quotes are used.
1546
Bram Moolenaar58b85342016-08-14 19:54:54 +02001547This string is taken as it is. No backslashes are removed or have a special
Bram Moolenaard8b02732005-01-14 21:48:43 +00001548meaning. The only exception is that two quotes stand for one quote.
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00001549
1550Single quoted strings are useful for patterns, so that backslashes do not need
Bram Moolenaar58b85342016-08-14 19:54:54 +02001551to be doubled. These two commands are equivalent: >
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00001552 if a =~ "\\s*"
1553 if a =~ '\s*'
Bram Moolenaar071d4272004-06-13 20:20:40 +00001554
1555
Bram Moolenaarb59ae592022-11-23 23:46:31 +00001556interpolated-string *$quote* *interpolated-string*
LemonBoy2eaef102022-05-06 13:14:50 +01001557--------------------
1558$"string" interpolated string constant *expr-$quote*
1559$'string' interpolated literal string constant *expr-$'*
1560
1561Interpolated strings are an extension of the |string| and |literal-string|,
1562allowing the inclusion of Vim script expressions (see |expr1|). Any
1563expression returning a value can be enclosed between curly braces. The value
1564is converted to a string. All the text and results of the expressions
1565are concatenated to make a new string.
Bram Moolenaar2ecbe532022-07-29 21:36:21 +01001566 *E1278* *E1279*
LemonBoy2eaef102022-05-06 13:14:50 +01001567To include an opening brace '{' or closing brace '}' in the string content
Bram Moolenaar3f32a5f2022-05-12 20:34:15 +01001568double it. For double quoted strings using a backslash also works. A single
1569closing brace '}' will result in an error.
LemonBoy2eaef102022-05-06 13:14:50 +01001570
1571Examples: >
1572 let your_name = input("What's your name? ")
Bram Moolenaar3f32a5f2022-05-12 20:34:15 +01001573< What's your name? Peter ~
1574>
1575 echo
LemonBoy2eaef102022-05-06 13:14:50 +01001576 echo $"Hello, {your_name}!"
Bram Moolenaar3f32a5f2022-05-12 20:34:15 +01001577< Hello, Peter! ~
1578>
1579 echo $"The square root of {{9}} is {sqrt(9)}"
1580< The square root of {9} is 3.0 ~
1581
LemonBoy2eaef102022-05-06 13:14:50 +01001582
Bram Moolenaar071d4272004-06-13 20:20:40 +00001583option *expr-option* *E112* *E113*
1584------
1585&option option value, local value if possible
1586&g:option global option value
1587&l:option local option value
1588
1589Examples: >
Bram Moolenaarc51cf032022-02-26 12:25:45 +00001590 echo "tabstop is " .. &tabstop
Bram Moolenaar071d4272004-06-13 20:20:40 +00001591 if &insertmode
1592
1593Any option name can be used here. See |options|. When using the local value
1594and there is no buffer-local or window-local value, the global value is used
1595anyway.
1596
1597
Bram Moolenaaref2f6562007-05-06 13:32:59 +00001598register *expr-register* *@r*
Bram Moolenaar071d4272004-06-13 20:20:40 +00001599--------
1600@r contents of register 'r'
1601
1602The result is the contents of the named register, as a single string.
1603Newlines are inserted where required. To get the contents of the unnamed
Bram Moolenaar58b85342016-08-14 19:54:54 +02001604register use @" or @@. See |registers| for an explanation of the available
Bram Moolenaare7566042005-06-17 22:00:15 +00001605registers.
1606
1607When using the '=' register you get the expression itself, not what it
1608evaluates to. Use |eval()| to evaluate it.
Bram Moolenaar071d4272004-06-13 20:20:40 +00001609
1610
Bram Moolenaara2baa732022-02-04 16:09:54 +00001611nesting *expr-nesting* *E110*
Bram Moolenaar071d4272004-06-13 20:20:40 +00001612-------
1613(expr1) nested expression
1614
1615
1616environment variable *expr-env*
1617--------------------
1618$VAR environment variable
1619
1620The String value of any environment variable. When it is not defined, the
1621result is an empty string.
Bram Moolenaar691ddee2019-05-09 14:52:41 +02001622
1623The functions `getenv()` and `setenv()` can also be used and work for
1624environment variables with non-alphanumeric names.
1625The function `environ()` can be used to get a Dict with all environment
1626variables.
1627
1628
Bram Moolenaar071d4272004-06-13 20:20:40 +00001629 *expr-env-expand*
1630Note that there is a difference between using $VAR directly and using
1631expand("$VAR"). Using it directly will only expand environment variables that
1632are known inside the current Vim session. Using expand() will first try using
1633the environment variables known inside the current Vim session. If that
1634fails, a shell will be used to expand the variable. This can be slow, but it
1635does expand all variables that the shell knows about. Example: >
Bram Moolenaar34401cc2014-08-29 15:12:19 +02001636 :echo $shell
1637 :echo expand("$shell")
1638The first one probably doesn't echo anything, the second echoes the $shell
Bram Moolenaar071d4272004-06-13 20:20:40 +00001639variable (if your shell supports it).
1640
1641
Bram Moolenaarf10911e2022-01-29 22:20:48 +00001642internal variable *expr-variable* *E1015* *E1089*
Bram Moolenaar071d4272004-06-13 20:20:40 +00001643-----------------
1644variable internal variable
1645See below |internal-variables|.
1646
1647
Bram Moolenaar05159a02005-02-26 23:04:13 +00001648function call *expr-function* *E116* *E118* *E119* *E120*
Bram Moolenaar071d4272004-06-13 20:20:40 +00001649-------------
1650function(expr1, ...) function call
1651See below |functions|.
1652
1653
Bram Moolenaar069c1e72016-07-15 21:25:08 +02001654lambda expression *expr-lambda* *lambda*
1655-----------------
Bram Moolenaar2f0936c2022-01-08 21:51:59 +00001656{args -> expr1} legacy lambda expression *E451*
Bram Moolenaar5da36052021-12-27 15:39:57 +00001657(args) => expr1 |Vim9| lambda expression
Bram Moolenaar069c1e72016-07-15 21:25:08 +02001658
1659A lambda expression creates a new unnamed function which returns the result of
Bram Moolenaar42ebd062016-07-17 13:35:14 +02001660evaluating |expr1|. Lambda expressions differ from |user-functions| in
Bram Moolenaar069c1e72016-07-15 21:25:08 +02001661the following ways:
1662
16631. The body of the lambda expression is an |expr1| and not a sequence of |Ex|
1664 commands.
Bram Moolenaar1e96d9b2016-07-29 22:15:09 +020016652. The prefix "a:" should not be used for arguments. E.g.: >
Bram Moolenaar069c1e72016-07-15 21:25:08 +02001666 :let F = {arg1, arg2 -> arg1 - arg2}
1667 :echo F(5, 2)
1668< 3
1669
1670The arguments are optional. Example: >
1671 :let F = {-> 'error function'}
Bram Moolenaar130cbfc2021-04-07 21:07:20 +02001672 :echo F('ignored')
Bram Moolenaar069c1e72016-07-15 21:25:08 +02001673< error function
Bram Moolenaar130cbfc2021-04-07 21:07:20 +02001674
Bram Moolenaar5da36052021-12-27 15:39:57 +00001675The |Vim9| lambda does not only use a different syntax, it also adds type
1676checking and can be split over multiple lines, see |vim9-lambda|.
Bram Moolenaar130cbfc2021-04-07 21:07:20 +02001677
Bram Moolenaar1e96d9b2016-07-29 22:15:09 +02001678 *closure*
1679Lambda expressions can access outer scope variables and arguments. This is
Bram Moolenaar50ba5262016-09-22 22:33:02 +02001680often called a closure. Example where "i" and "a:arg" are used in a lambda
Bram Moolenaar6bb2cdf2018-02-24 19:53:53 +01001681while they already exist in the function scope. They remain valid even after
1682the function returns: >
Bram Moolenaar1e96d9b2016-07-29 22:15:09 +02001683 :function Foo(arg)
1684 : let i = 3
1685 : return {x -> x + i - a:arg}
1686 :endfunction
1687 :let Bar = Foo(4)
1688 :echo Bar(6)
1689< 5
Bram Moolenaar437bafe2016-08-01 15:40:54 +02001690
Bram Moolenaar388a5d42020-05-26 21:20:45 +02001691Note that the variables must exist in the outer scope before the lambda is
Bram Moolenaar6bb2cdf2018-02-24 19:53:53 +01001692defined for this to work. See also |:func-closure|.
1693
1694Lambda and closure support can be checked with: >
Bram Moolenaar437bafe2016-08-01 15:40:54 +02001695 if has('lambda')
Bram Moolenaar069c1e72016-07-15 21:25:08 +02001696
1697Examples for using a lambda expression with |sort()|, |map()| and |filter()|: >
1698 :echo map([1, 2, 3], {idx, val -> val + 1})
1699< [2, 3, 4] >
1700 :echo sort([3,7,2,1,4], {a, b -> a - b})
1701< [1, 2, 3, 4, 7]
1702
1703The lambda expression is also useful for Channel, Job and timer: >
1704 :let timer = timer_start(500,
1705 \ {-> execute("echo 'Handler called'", "")},
1706 \ {'repeat': 3})
1707< Handler called
1708 Handler called
1709 Handler called
1710
Bram Moolenaar90df4b92021-07-07 20:26:08 +02001711Note that it is possible to cause memory to be used and not freed if the
1712closure is referenced by the context it depends on: >
1713 function Function()
1714 let x = 0
1715 let F = {-> x}
1716 endfunction
1717The closure uses "x" from the function scope, and "F" in that same scope
1718refers to the closure. This cycle results in the memory not being freed.
1719Recommendation: don't do this.
1720
1721Notice how execute() is used to execute an Ex command. That's ugly though.
Bram Moolenaar130cbfc2021-04-07 21:07:20 +02001722In Vim9 script you can use a command block, see |inline-function|.
Bram Moolenaar1e96d9b2016-07-29 22:15:09 +02001723
Bram Moolenaar71b6d332022-09-10 13:13:14 +01001724Although you can use the loop variable of a `for` command, it must still exist
1725when the closure is called, otherwise you get an error. *E1302*
1726
Bram Moolenaar1e96d9b2016-07-29 22:15:09 +02001727Lambda expressions have internal names like '<lambda>42'. If you get an error
1728for a lambda expression, you can find what it is with the following command: >
Bram Moolenaar6f02b002021-01-10 20:22:54 +01001729 :function <lambda>42
Bram Moolenaar1e96d9b2016-07-29 22:15:09 +02001730See also: |numbered-function|
1731
Bram Moolenaar071d4272004-06-13 20:20:40 +00001732==============================================================================
Bram Moolenaar6f4754b2022-01-23 12:07:04 +000017333. Internal variable *internal-variables* *E461* *E1001*
Bram Moolenaar4a748032010-09-30 21:47:56 +02001734
Bram Moolenaar071d4272004-06-13 20:20:40 +00001735An internal variable name can be made up of letters, digits and '_'. But it
Bram Moolenaar2f0936c2022-01-08 21:51:59 +00001736cannot start with a digit. In legacy script it is also possible to use curly
Bram Moolenaar5da36052021-12-27 15:39:57 +00001737braces, see |curly-braces-names|.
Bram Moolenaar071d4272004-06-13 20:20:40 +00001738
Bram Moolenaar2f0936c2022-01-08 21:51:59 +00001739In legacy script an internal variable is created with the ":let" command
Bram Moolenaar5da36052021-12-27 15:39:57 +00001740|:let|. An internal variable is explicitly destroyed with the ":unlet"
1741command |:unlet|.
Bram Moolenaar9588a0f2005-01-08 21:45:39 +00001742Using a name that is not an internal variable or refers to a variable that has
1743been destroyed results in an error.
Bram Moolenaar071d4272004-06-13 20:20:40 +00001744
Bram Moolenaar5da36052021-12-27 15:39:57 +00001745In |Vim9| script `:let` is not used and variables work differently, see |:var|.
1746
Bram Moolenaar65e0d772020-06-14 17:29:55 +02001747 *variable-scope*
Bram Moolenaar071d4272004-06-13 20:20:40 +00001748There are several name spaces for variables. Which one is to be used is
1749specified by what is prepended:
1750
Bram Moolenaar5da36052021-12-27 15:39:57 +00001751 (nothing) In a function: local to the function;
1752 in a legacy script: global;
1753 in a |Vim9| script: local to the script
Bram Moolenaar071d4272004-06-13 20:20:40 +00001754|buffer-variable| b: Local to the current buffer.
1755|window-variable| w: Local to the current window.
Bram Moolenaar910f66f2006-04-05 20:41:53 +00001756|tabpage-variable| t: Local to the current tab page.
Bram Moolenaar071d4272004-06-13 20:20:40 +00001757|global-variable| g: Global.
Bram Moolenaar5da36052021-12-27 15:39:57 +00001758|local-variable| l: Local to a function (only in a legacy function)
Bram Moolenaar071d4272004-06-13 20:20:40 +00001759|script-variable| s: Local to a |:source|'ed Vim script.
Bram Moolenaar5da36052021-12-27 15:39:57 +00001760|function-argument| a: Function argument (only in a legacy function).
Bram Moolenaar75b81562014-04-06 14:09:13 +02001761|vim-variable| v: Global, predefined by Vim.
Bram Moolenaar071d4272004-06-13 20:20:40 +00001762
Bram Moolenaar32466aa2006-02-24 23:53:04 +00001763The scope name by itself can be used as a |Dictionary|. For example, to
1764delete all script-local variables: >
Bram Moolenaar8f999f12005-01-25 22:12:55 +00001765 :for k in keys(s:)
1766 : unlet s:[k]
1767 :endfor
Bram Moolenaar65e0d772020-06-14 17:29:55 +02001768
Bram Moolenaar5da36052021-12-27 15:39:57 +00001769Note: in Vim9 script variables can also be local to a block of commands, see
1770|vim9-scopes|.
Bram Moolenaar531da592013-05-06 05:58:55 +02001771 *buffer-variable* *b:var* *b:*
Bram Moolenaar071d4272004-06-13 20:20:40 +00001772A variable name that is preceded with "b:" is local to the current buffer.
1773Thus you can have several "b:foo" variables, one for each buffer.
1774This kind of variable is deleted when the buffer is wiped out or deleted with
1775|:bdelete|.
1776
1777One local buffer variable is predefined:
Bram Moolenaarbf884932013-04-05 22:26:15 +02001778 *b:changedtick* *changetick*
Bram Moolenaar071d4272004-06-13 20:20:40 +00001779b:changedtick The total number of changes to the current buffer. It is
1780 incremented for each change. An undo command is also a change
Bram Moolenaarc024b462019-06-08 18:07:21 +02001781 in this case. Resetting 'modified' when writing the buffer is
1782 also counted.
1783 This can be used to perform an action only when the buffer has
1784 changed. Example: >
Bram Moolenaar071d4272004-06-13 20:20:40 +00001785 :if my_changedtick != b:changedtick
Bram Moolenaar446cb832008-06-24 21:56:24 +00001786 : let my_changedtick = b:changedtick
1787 : call My_Update()
Bram Moolenaar071d4272004-06-13 20:20:40 +00001788 :endif
Bram Moolenaar3df01732017-02-17 22:47:16 +01001789< You cannot change or delete the b:changedtick variable.
1790
Bram Moolenaar531da592013-05-06 05:58:55 +02001791 *window-variable* *w:var* *w:*
Bram Moolenaar071d4272004-06-13 20:20:40 +00001792A variable name that is preceded with "w:" is local to the current window. It
1793is deleted when the window is closed.
1794
Bram Moolenaarad3b3662013-05-17 18:14:19 +02001795 *tabpage-variable* *t:var* *t:*
Bram Moolenaar910f66f2006-04-05 20:41:53 +00001796A variable name that is preceded with "t:" is local to the current tab page,
1797It is deleted when the tab page is closed. {not available when compiled
Bram Moolenaardb84e452010-08-15 13:50:43 +02001798without the |+windows| feature}
Bram Moolenaar910f66f2006-04-05 20:41:53 +00001799
Bram Moolenaar531da592013-05-06 05:58:55 +02001800 *global-variable* *g:var* *g:*
Bram Moolenaar04fb9162021-12-30 20:24:12 +00001801Inside functions and in |Vim9| script global variables are accessed with "g:".
1802Omitting this will access a variable local to a function or script. "g:"
1803can also be used in any other place if you like.
Bram Moolenaar071d4272004-06-13 20:20:40 +00001804
Bram Moolenaar531da592013-05-06 05:58:55 +02001805 *local-variable* *l:var* *l:*
Bram Moolenaar071d4272004-06-13 20:20:40 +00001806Inside functions local variables are accessed without prepending anything.
Bram Moolenaaref2f6562007-05-06 13:32:59 +00001807But you can also prepend "l:" if you like. However, without prepending "l:"
1808you may run into reserved variable names. For example "count". By itself it
1809refers to "v:count". Using "l:count" you can have a local variable with the
1810same name.
Bram Moolenaar071d4272004-06-13 20:20:40 +00001811
1812 *script-variable* *s:var*
Bram Moolenaar04fb9162021-12-30 20:24:12 +00001813In a legacy Vim script variables starting with "s:" can be used. They cannot
1814be accessed from outside of the scripts, thus are local to the script.
1815In |Vim9| script the "s:" prefix can be omitted, variables are script-local by
1816default.
Bram Moolenaar071d4272004-06-13 20:20:40 +00001817
1818They can be used in:
1819- commands executed while the script is sourced
1820- functions defined in the script
1821- autocommands defined in the script
1822- functions and autocommands defined in functions and autocommands which were
1823 defined in the script (recursively)
1824- user defined commands defined in the script
1825Thus not in:
1826- other scripts sourced from this one
1827- mappings
Bram Moolenaar8f3f58f2010-01-06 20:52:26 +01001828- menus
Bram Moolenaar071d4272004-06-13 20:20:40 +00001829- etc.
1830
Bram Moolenaaref2f6562007-05-06 13:32:59 +00001831Script variables can be used to avoid conflicts with global variable names.
1832Take this example: >
Bram Moolenaar071d4272004-06-13 20:20:40 +00001833
1834 let s:counter = 0
1835 function MyCounter()
1836 let s:counter = s:counter + 1
1837 echo s:counter
1838 endfunction
1839 command Tick call MyCounter()
1840
1841You can now invoke "Tick" from any script, and the "s:counter" variable in
1842that script will not be changed, only the "s:counter" in the script where
1843"Tick" was defined is used.
1844
1845Another example that does the same: >
1846
1847 let s:counter = 0
1848 command Tick let s:counter = s:counter + 1 | echo s:counter
1849
1850When calling a function and invoking a user-defined command, the context for
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001851script variables is set to the script where the function or command was
Bram Moolenaar071d4272004-06-13 20:20:40 +00001852defined.
1853
1854The script variables are also available when a function is defined inside a
1855function that is defined in a script. Example: >
1856
1857 let s:counter = 0
1858 function StartCounting(incr)
1859 if a:incr
1860 function MyCounter()
1861 let s:counter = s:counter + 1
1862 endfunction
1863 else
1864 function MyCounter()
1865 let s:counter = s:counter - 1
1866 endfunction
1867 endif
1868 endfunction
1869
1870This defines the MyCounter() function either for counting up or counting down
1871when calling StartCounting(). It doesn't matter from where StartCounting() is
1872called, the s:counter variable will be accessible in MyCounter().
1873
1874When the same script is sourced again it will use the same script variables.
1875They will remain valid as long as Vim is running. This can be used to
1876maintain a counter: >
1877
1878 if !exists("s:counter")
1879 let s:counter = 1
1880 echo "script executed for the first time"
1881 else
1882 let s:counter = s:counter + 1
Bram Moolenaarc51cf032022-02-26 12:25:45 +00001883 echo "script executed " .. s:counter .. " times now"
Bram Moolenaar071d4272004-06-13 20:20:40 +00001884 endif
1885
1886Note that this means that filetype plugins don't get a different set of script
1887variables for each buffer. Use local buffer variables instead |b:var|.
1888
1889
Bram Moolenaard47d5222018-12-09 20:43:55 +01001890PREDEFINED VIM VARIABLES *vim-variable* *v:var* *v:*
Bram Moolenaar6f4754b2022-01-23 12:07:04 +00001891 *E963* *E1063*
Bram Moolenaard47d5222018-12-09 20:43:55 +01001892Some variables can be set by the user, but the type cannot be changed.
Bram Moolenaar071d4272004-06-13 20:20:40 +00001893
Bram Moolenaar69bf6342019-10-29 04:16:57 +01001894 *v:argv* *argv-variable*
1895v:argv The command line arguments Vim was invoked with. This is a
1896 list of strings. The first item is the Vim command.
Bram Moolenaar1588bc82022-03-08 21:35:07 +00001897 See |v:progpath| for the command with full path.
Bram Moolenaar69bf6342019-10-29 04:16:57 +01001898
Bram Moolenaare4efc3b2005-03-07 23:16:51 +00001899 *v:beval_col* *beval_col-variable*
1900v:beval_col The number of the column, over which the mouse pointer is.
1901 This is the byte index in the |v:beval_lnum| line.
1902 Only valid while evaluating the 'balloonexpr' option.
1903
1904 *v:beval_bufnr* *beval_bufnr-variable*
1905v:beval_bufnr The number of the buffer, over which the mouse pointer is. Only
1906 valid while evaluating the 'balloonexpr' option.
1907
1908 *v:beval_lnum* *beval_lnum-variable*
1909v:beval_lnum The number of the line, over which the mouse pointer is. Only
1910 valid while evaluating the 'balloonexpr' option.
1911
1912 *v:beval_text* *beval_text-variable*
Bram Moolenaar24bbcfe2005-06-28 23:32:02 +00001913v:beval_text The text under or after the mouse pointer. Usually a word as
1914 it is useful for debugging a C program. 'iskeyword' applies,
1915 but a dot and "->" before the position is included. When on a
1916 ']' the text before it is used, including the matching '[' and
Bram Moolenaare4efc3b2005-03-07 23:16:51 +00001917 word before it. When on a Visual area within one line the
Bram Moolenaarb4d5fba2017-09-11 19:31:28 +02001918 highlighted text is used. Also see |<cexpr>|.
Bram Moolenaare4efc3b2005-03-07 23:16:51 +00001919 Only valid while evaluating the 'balloonexpr' option.
1920
1921 *v:beval_winnr* *beval_winnr-variable*
1922v:beval_winnr The number of the window, over which the mouse pointer is. Only
Bram Moolenaar00654022011-02-25 14:42:19 +01001923 valid while evaluating the 'balloonexpr' option. The first
1924 window has number zero (unlike most other places where a
1925 window gets a number).
Bram Moolenaare4efc3b2005-03-07 23:16:51 +00001926
Bram Moolenaar511972d2016-06-04 18:09:59 +02001927 *v:beval_winid* *beval_winid-variable*
Bram Moolenaar7571d552016-08-18 22:54:46 +02001928v:beval_winid The |window-ID| of the window, over which the mouse pointer
1929 is. Otherwise like v:beval_winnr.
Bram Moolenaar511972d2016-06-04 18:09:59 +02001930
Bram Moolenaarf193fff2006-04-27 00:02:13 +00001931 *v:char* *char-variable*
Bram Moolenaar8f3f58f2010-01-06 20:52:26 +01001932v:char Argument for evaluating 'formatexpr' and used for the typed
Bram Moolenaar945e2db2010-06-05 17:43:32 +02001933 character when using <expr> in an abbreviation |:map-<expr>|.
Bram Moolenaare6ae6222013-05-21 21:01:10 +02001934 It is also used by the |InsertCharPre| and |InsertEnter| events.
Bram Moolenaarf193fff2006-04-27 00:02:13 +00001935
Bram Moolenaar071d4272004-06-13 20:20:40 +00001936 *v:charconvert_from* *charconvert_from-variable*
1937v:charconvert_from
1938 The name of the character encoding of a file to be converted.
1939 Only valid while evaluating the 'charconvert' option.
1940
1941 *v:charconvert_to* *charconvert_to-variable*
1942v:charconvert_to
1943 The name of the character encoding of a file after conversion.
1944 Only valid while evaluating the 'charconvert' option.
1945
1946 *v:cmdarg* *cmdarg-variable*
1947v:cmdarg This variable is used for two purposes:
1948 1. The extra arguments given to a file read/write command.
1949 Currently these are "++enc=" and "++ff=". This variable is
1950 set before an autocommand event for a file read/write
1951 command is triggered. There is a leading space to make it
1952 possible to append this variable directly after the
Bram Moolenaar58b85342016-08-14 19:54:54 +02001953 read/write command. Note: The "+cmd" argument isn't
Bram Moolenaar071d4272004-06-13 20:20:40 +00001954 included here, because it will be executed anyway.
1955 2. When printing a PostScript file with ":hardcopy" this is
1956 the argument for the ":hardcopy" command. This can be used
1957 in 'printexpr'.
1958
1959 *v:cmdbang* *cmdbang-variable*
1960v:cmdbang Set like v:cmdarg for a file read/write command. When a "!"
1961 was used the value is 1, otherwise it is 0. Note that this
1962 can only be used in autocommands. For user commands |<bang>|
1963 can be used.
Bram Moolenaar84cf6bd2020-06-16 20:03:43 +02001964 *v:collate* *collate-variable*
1965v:collate The current locale setting for collation order of the runtime
1966 environment. This allows Vim scripts to be aware of the
1967 current locale encoding. Technical: it's the value of
1968 LC_COLLATE. When not using a locale the value is "C".
1969 This variable can not be set directly, use the |:language|
1970 command.
1971 See |multi-lang|.
Bram Moolenaar071d4272004-06-13 20:20:40 +00001972
Bram Moolenaar76db9e02022-11-09 21:21:04 +00001973 *v:colornames*
Drew Vogele30d1022021-10-24 20:35:07 +01001974v:colornames A dictionary that maps color names to hex color strings. These
1975 color names can be used with the |highlight-guifg|,
1976 |highlight-guibg|, and |highlight-guisp| parameters. Updating
1977 an entry in v:colornames has no immediate effect on the syntax
1978 highlighting. The highlight commands (probably in a
1979 colorscheme script) need to be re-evaluated in order to use
1980 the updated color values. For example: >
1981
1982 :let v:colornames['fuscia'] = '#cf3ab4'
1983 :let v:colornames['mauve'] = '#915f6d'
1984 :highlight Normal guifg=fuscia guibg=mauve
1985<
1986 This cannot be used to override the |cterm-colors| but it can
1987 be used to override other colors. For example, the X11 colors
1988 defined in the `colors/lists/default.vim` (previously defined
1989 in |rgb.txt|). When defining new color names in a plugin, the
1990 recommended practice is to set a color entry only when it does
1991 not already exist. For example: >
1992
1993 :call extend(v:colornames, {
1994 \ 'fuscia': '#cf3ab4',
1995 \ 'mauve': '#915f6d,
1996 \ }, 'keep')
1997<
Bram Moolenaar113cb512021-11-07 20:27:04 +00001998 Using |extend()| with the 'keep' option updates each color only
Drew Vogele30d1022021-10-24 20:35:07 +01001999 if it did not exist in |v:colornames|. Doing so allows the
2000 user to choose the precise color value for a common name
2001 by setting it in their |.vimrc|.
2002
2003 It is possible to remove entries from this dictionary but
Drew Vogela0fca172021-11-13 10:50:01 +00002004 doing so is NOT recommended, because it is disruptive to
Drew Vogele30d1022021-10-24 20:35:07 +01002005 other scripts. It is also unlikely to achieve the desired
Bram Moolenaar113cb512021-11-07 20:27:04 +00002006 result because the |:colorscheme| and |:highlight| commands will
Drew Vogele30d1022021-10-24 20:35:07 +01002007 both automatically load all `colors/lists/default.vim` color
2008 scripts.
2009
Bram Moolenaar42a45122015-07-10 17:56:23 +02002010 *v:completed_item* *completed_item-variable*
2011v:completed_item
2012 |Dictionary| containing the |complete-items| for the most
2013 recently completed word after |CompleteDone|. The
2014 |Dictionary| is empty if the completion failed.
Shougo Matsushita61021aa2022-07-27 14:40:00 +01002015 Note: Plugins can modify the value to emulate the builtin
2016 |CompleteDone| event behavior.
Bram Moolenaar42a45122015-07-10 17:56:23 +02002017
Bram Moolenaar071d4272004-06-13 20:20:40 +00002018 *v:count* *count-variable*
2019v:count The count given for the last Normal mode command. Can be used
Bram Moolenaar58b85342016-08-14 19:54:54 +02002020 to get the count before a mapping. Read-only. Example: >
Bram Moolenaarc51cf032022-02-26 12:25:45 +00002021 :map _x :<C-U>echo "the count is " .. v:count<CR>
Bram Moolenaar071d4272004-06-13 20:20:40 +00002022< Note: The <C-U> is required to remove the line range that you
2023 get when typing ':' after a count.
Bram Moolenaar8f3f58f2010-01-06 20:52:26 +01002024 When there are two counts, as in "3d2w", they are multiplied,
2025 just like what happens in the command, "d6w" for the example.
Bram Moolenaar1d2ba7f2006-02-14 22:29:30 +00002026 Also used for evaluating the 'formatexpr' option.
Bram Moolenaard2e716e2019-04-20 14:39:52 +02002027 "count" also works, for backwards compatibility, unless
2028 |scriptversion| is 3 or higher.
Bram Moolenaar071d4272004-06-13 20:20:40 +00002029
2030 *v:count1* *count1-variable*
2031v:count1 Just like "v:count", but defaults to one when no count is
2032 used.
2033
2034 *v:ctype* *ctype-variable*
2035v:ctype The current locale setting for characters of the runtime
2036 environment. This allows Vim scripts to be aware of the
2037 current locale encoding. Technical: it's the value of
2038 LC_CTYPE. When not using a locale the value is "C".
2039 This variable can not be set directly, use the |:language|
2040 command.
2041 See |multi-lang|.
2042
2043 *v:dying* *dying-variable*
Bram Moolenaar58b85342016-08-14 19:54:54 +02002044v:dying Normally zero. When a deadly signal is caught it's set to
Bram Moolenaar071d4272004-06-13 20:20:40 +00002045 one. When multiple signals are caught the number increases.
2046 Can be used in an autocommand to check if Vim didn't
2047 terminate normally. {only works on Unix}
2048 Example: >
2049 :au VimLeave * if v:dying | echo "\nAAAAaaaarrrggghhhh!!!\n" | endif
Bram Moolenaar0e1e25f2010-05-28 21:07:08 +02002050< Note: if another deadly signal is caught when v:dying is one,
2051 VimLeave autocommands will not be executed.
2052
Bram Moolenaarf0068c52020-11-30 17:42:10 +01002053 *v:exiting* *exiting-variable*
2054v:exiting Vim exit code. Normally zero, non-zero when something went
2055 wrong. The value is v:null before invoking the |VimLeavePre|
2056 and |VimLeave| autocmds. See |:q|, |:x| and |:cquit|.
2057 Example: >
2058 :au VimLeave * echo "Exit value is " .. v:exiting
2059<
Bram Moolenaar37f4cbd2019-08-23 20:58:45 +02002060 *v:echospace* *echospace-variable*
2061v:echospace Number of screen cells that can be used for an `:echo` message
2062 in the last screen line before causing the |hit-enter-prompt|.
2063 Depends on 'showcmd', 'ruler' and 'columns'. You need to
2064 check 'cmdheight' for whether there are full-width lines
2065 available above the last line.
2066
Bram Moolenaar071d4272004-06-13 20:20:40 +00002067 *v:errmsg* *errmsg-variable*
2068v:errmsg Last given error message. It's allowed to set this variable.
2069 Example: >
2070 :let v:errmsg = ""
2071 :silent! next
2072 :if v:errmsg != ""
2073 : ... handle error
Bram Moolenaard2e716e2019-04-20 14:39:52 +02002074< "errmsg" also works, for backwards compatibility, unless
2075 |scriptversion| is 3 or higher.
Bram Moolenaar071d4272004-06-13 20:20:40 +00002076
Bram Moolenaar65a54642018-04-28 16:56:53 +02002077 *v:errors* *errors-variable* *assert-return*
Bram Moolenaar683fa182015-11-30 21:38:24 +01002078v:errors Errors found by assert functions, such as |assert_true()|.
Bram Moolenaar43345542015-11-29 17:35:35 +01002079 This is a list of strings.
2080 The assert functions append an item when an assert fails.
Bram Moolenaar65a54642018-04-28 16:56:53 +02002081 The return value indicates this: a one is returned if an item
2082 was added to v:errors, otherwise zero is returned.
Bram Moolenaar43345542015-11-29 17:35:35 +01002083 To remove old results make it empty: >
2084 :let v:errors = []
2085< If v:errors is set to anything but a list it is made an empty
2086 list by the assert function.
2087
Bram Moolenaar7e1652c2017-12-16 18:27:02 +01002088 *v:event* *event-variable*
2089v:event Dictionary containing information about the current
Bram Moolenaar560979e2020-02-04 22:53:05 +01002090 |autocommand|. See the specific event for what it puts in
2091 this dictionary.
Bram Moolenaar2c7f8c52020-04-20 19:52:53 +02002092 The dictionary is emptied when the |autocommand| finishes,
2093 please refer to |dict-identity| for how to get an independent
2094 copy of it. Use |deepcopy()| if you want to keep the
2095 information after the event triggers. Example: >
2096 au TextYankPost * let g:foo = deepcopy(v:event)
2097<
Bram Moolenaar071d4272004-06-13 20:20:40 +00002098 *v:exception* *exception-variable*
2099v:exception The value of the exception most recently caught and not
2100 finished. See also |v:throwpoint| and |throw-variables|.
2101 Example: >
2102 :try
2103 : throw "oops"
2104 :catch /.*/
Bram Moolenaar54775062019-07-31 21:07:14 +02002105 : echo "caught " .. v:exception
Bram Moolenaar071d4272004-06-13 20:20:40 +00002106 :endtry
2107< Output: "caught oops".
2108
Bram Moolenaar520e1e42016-01-23 19:46:28 +01002109 *v:false* *false-variable*
2110v:false A Number with value zero. Used to put "false" in JSON. See
Bram Moolenaar6463ca22016-02-13 17:04:46 +01002111 |json_encode()|.
Bram Moolenaarc95a3022016-06-12 23:01:46 +02002112 When used as a string this evaluates to "v:false". >
Bram Moolenaar705ada12016-01-24 17:56:50 +01002113 echo v:false
Bram Moolenaarc95a3022016-06-12 23:01:46 +02002114< v:false ~
2115 That is so that eval() can parse the string back to the same
Bram Moolenaardf48fb42016-07-22 21:50:18 +02002116 value. Read-only.
Bram Moolenaar5da36052021-12-27 15:39:57 +00002117 In |Vim9| script "false" can be used which has a boolean type.
Bram Moolenaar520e1e42016-01-23 19:46:28 +01002118
Bram Moolenaar19a09a12005-03-04 23:39:37 +00002119 *v:fcs_reason* *fcs_reason-variable*
2120v:fcs_reason The reason why the |FileChangedShell| event was triggered.
2121 Can be used in an autocommand to decide what to do and/or what
2122 to set v:fcs_choice to. Possible values:
2123 deleted file no longer exists
2124 conflict file contents, mode or timestamp was
2125 changed and buffer is modified
2126 changed file contents has changed
2127 mode mode of file changed
2128 time only file timestamp changed
2129
2130 *v:fcs_choice* *fcs_choice-variable*
2131v:fcs_choice What should happen after a |FileChangedShell| event was
2132 triggered. Can be used in an autocommand to tell Vim what to
2133 do with the affected buffer:
2134 reload Reload the buffer (does not work if
2135 the file was deleted).
Rob Pilling8196e942022-02-11 15:12:10 +00002136 edit Reload the buffer and detect the
2137 values for options such as
2138 'fileformat', 'fileencoding', 'binary'
2139 (does not work if the file was
2140 deleted).
Bram Moolenaar19a09a12005-03-04 23:39:37 +00002141 ask Ask the user what to do, as if there
2142 was no autocommand. Except that when
2143 only the timestamp changed nothing
2144 will happen.
2145 <empty> Nothing, the autocommand should do
2146 everything that needs to be done.
2147 The default is empty. If another (invalid) value is used then
2148 Vim behaves like it is empty, there is no warning message.
2149
Bram Moolenaar4c295022021-05-02 17:19:11 +02002150 *v:fname* *fname-variable*
Bram Moolenaar90df4b92021-07-07 20:26:08 +02002151v:fname When evaluating 'includeexpr': the file name that was
2152 detected. Empty otherwise.
Bram Moolenaar4c295022021-05-02 17:19:11 +02002153
Bram Moolenaar071d4272004-06-13 20:20:40 +00002154 *v:fname_in* *fname_in-variable*
Bram Moolenaar4e330bb2005-12-07 21:04:31 +00002155v:fname_in The name of the input file. Valid while evaluating:
Bram Moolenaar071d4272004-06-13 20:20:40 +00002156 option used for ~
2157 'charconvert' file to be converted
2158 'diffexpr' original file
2159 'patchexpr' original file
2160 'printexpr' file to be printed
Bram Moolenaar2c7a29c2005-12-12 22:02:31 +00002161 And set to the swap file name for |SwapExists|.
Bram Moolenaar071d4272004-06-13 20:20:40 +00002162
2163 *v:fname_out* *fname_out-variable*
2164v:fname_out The name of the output file. Only valid while
2165 evaluating:
2166 option used for ~
2167 'charconvert' resulting converted file (*)
2168 'diffexpr' output of diff
2169 'patchexpr' resulting patched file
2170 (*) When doing conversion for a write command (e.g., ":w
Bram Moolenaar58b85342016-08-14 19:54:54 +02002171 file") it will be equal to v:fname_in. When doing conversion
Bram Moolenaar071d4272004-06-13 20:20:40 +00002172 for a read command (e.g., ":e file") it will be a temporary
2173 file and different from v:fname_in.
2174
2175 *v:fname_new* *fname_new-variable*
2176v:fname_new The name of the new version of the file. Only valid while
2177 evaluating 'diffexpr'.
2178
2179 *v:fname_diff* *fname_diff-variable*
2180v:fname_diff The name of the diff (patch) file. Only valid while
2181 evaluating 'patchexpr'.
2182
2183 *v:folddashes* *folddashes-variable*
2184v:folddashes Used for 'foldtext': dashes representing foldlevel of a closed
2185 fold.
Bram Moolenaar7b0294c2004-10-11 10:16:09 +00002186 Read-only in the |sandbox|. |fold-foldtext|
Bram Moolenaar071d4272004-06-13 20:20:40 +00002187
2188 *v:foldlevel* *foldlevel-variable*
2189v:foldlevel Used for 'foldtext': foldlevel of closed fold.
Bram Moolenaar7b0294c2004-10-11 10:16:09 +00002190 Read-only in the |sandbox|. |fold-foldtext|
Bram Moolenaar071d4272004-06-13 20:20:40 +00002191
2192 *v:foldend* *foldend-variable*
2193v:foldend Used for 'foldtext': last line of closed fold.
Bram Moolenaar7b0294c2004-10-11 10:16:09 +00002194 Read-only in the |sandbox|. |fold-foldtext|
Bram Moolenaar071d4272004-06-13 20:20:40 +00002195
2196 *v:foldstart* *foldstart-variable*
2197v:foldstart Used for 'foldtext': first line of closed fold.
Bram Moolenaar7b0294c2004-10-11 10:16:09 +00002198 Read-only in the |sandbox|. |fold-foldtext|
Bram Moolenaar071d4272004-06-13 20:20:40 +00002199
Bram Moolenaar817a8802013-11-09 01:44:43 +01002200 *v:hlsearch* *hlsearch-variable*
Bram Moolenaarb0d45e72017-11-05 18:19:24 +01002201v:hlsearch Variable that indicates whether search highlighting is on.
Bram Moolenaar76440e22014-11-27 19:14:49 +01002202 Setting it makes sense only if 'hlsearch' is enabled which
2203 requires |+extra_search|. Setting this variable to zero acts
Bram Moolenaar705ada12016-01-24 17:56:50 +01002204 like the |:nohlsearch| command, setting it to one acts like >
Bram Moolenaar817a8802013-11-09 01:44:43 +01002205 let &hlsearch = &hlsearch
Bram Moolenaar86ae7202015-07-10 19:31:35 +02002206< Note that the value is restored when returning from a
2207 function. |function-search-undo|.
2208
Bram Moolenaar843ee412004-06-30 16:16:41 +00002209 *v:insertmode* *insertmode-variable*
2210v:insertmode Used for the |InsertEnter| and |InsertChange| autocommand
2211 events. Values:
2212 i Insert mode
2213 r Replace mode
2214 v Virtual Replace mode
2215
Bram Moolenaar2fda12f2005-01-15 22:14:15 +00002216 *v:key* *key-variable*
Bram Moolenaar32466aa2006-02-24 23:53:04 +00002217v:key Key of the current item of a |Dictionary|. Only valid while
Bram Moolenaar2fda12f2005-01-15 22:14:15 +00002218 evaluating the expression used with |map()| and |filter()|.
2219 Read-only.
2220
Bram Moolenaar071d4272004-06-13 20:20:40 +00002221 *v:lang* *lang-variable*
2222v:lang The current locale setting for messages of the runtime
2223 environment. This allows Vim scripts to be aware of the
2224 current language. Technical: it's the value of LC_MESSAGES.
2225 The value is system dependent.
2226 This variable can not be set directly, use the |:language|
2227 command.
2228 It can be different from |v:ctype| when messages are desired
2229 in a different language than what is used for character
2230 encoding. See |multi-lang|.
2231
2232 *v:lc_time* *lc_time-variable*
2233v:lc_time The current locale setting for time messages of the runtime
2234 environment. This allows Vim scripts to be aware of the
2235 current language. Technical: it's the value of LC_TIME.
2236 This variable can not be set directly, use the |:language|
2237 command. See |multi-lang|.
2238
2239 *v:lnum* *lnum-variable*
Bram Moolenaar368373e2010-07-19 20:46:22 +02002240v:lnum Line number for the 'foldexpr' |fold-expr|, 'formatexpr' and
2241 'indentexpr' expressions, tab page number for 'guitablabel'
2242 and 'guitabtooltip'. Only valid while one of these
2243 expressions is being evaluated. Read-only when in the
2244 |sandbox|.
Bram Moolenaar071d4272004-06-13 20:20:40 +00002245
naohiro ono56200ee2022-01-01 14:59:44 +00002246 *v:maxcol* *maxcol-variable*
Bram Moolenaar2f0936c2022-01-08 21:51:59 +00002247v:maxcol Maximum line length. Depending on where it is used it can be
Bram Moolenaar944697a2022-02-20 19:48:20 +00002248 screen columns, characters or bytes. The value currently is
2249 2147483647 on all systems.
naohiro ono56200ee2022-01-01 14:59:44 +00002250
Bram Moolenaar219b8702006-11-01 14:32:36 +00002251 *v:mouse_win* *mouse_win-variable*
2252v:mouse_win Window number for a mouse click obtained with |getchar()|.
2253 First window has number 1, like with |winnr()|. The value is
2254 zero when there was no mouse button click.
2255
Bram Moolenaar511972d2016-06-04 18:09:59 +02002256 *v:mouse_winid* *mouse_winid-variable*
2257v:mouse_winid Window ID for a mouse click obtained with |getchar()|.
2258 The value is zero when there was no mouse button click.
2259
Bram Moolenaar219b8702006-11-01 14:32:36 +00002260 *v:mouse_lnum* *mouse_lnum-variable*
2261v:mouse_lnum Line number for a mouse click obtained with |getchar()|.
2262 This is the text line number, not the screen line number. The
2263 value is zero when there was no mouse button click.
2264
2265 *v:mouse_col* *mouse_col-variable*
2266v:mouse_col Column number for a mouse click obtained with |getchar()|.
2267 This is the screen column number, like with |virtcol()|. The
2268 value is zero when there was no mouse button click.
2269
Bram Moolenaard09091d2019-01-17 16:07:22 +01002270 *v:none* *none-variable* *None*
Bram Moolenaar520e1e42016-01-23 19:46:28 +01002271v:none An empty String. Used to put an empty item in JSON. See
Bram Moolenaar6463ca22016-02-13 17:04:46 +01002272 |json_encode()|.
Bram Moolenaar2547aa92020-07-26 17:00:44 +02002273 This can also be used as a function argument to use the
2274 default value, see |none-function_argument|.
Bram Moolenaar705ada12016-01-24 17:56:50 +01002275 When used as a number this evaluates to zero.
Bram Moolenaarc95a3022016-06-12 23:01:46 +02002276 When used as a string this evaluates to "v:none". >
Bram Moolenaar705ada12016-01-24 17:56:50 +01002277 echo v:none
Bram Moolenaarc95a3022016-06-12 23:01:46 +02002278< v:none ~
2279 That is so that eval() can parse the string back to the same
Bram Moolenaardf48fb42016-07-22 21:50:18 +02002280 value. Read-only.
Bram Moolenaar1588bc82022-03-08 21:35:07 +00002281 Note that using `== v:none` and `!= v:none` will often give
2282 an error. Instead, use `is v:none` and `isnot v:none` .
Bram Moolenaar520e1e42016-01-23 19:46:28 +01002283
2284 *v:null* *null-variable*
2285v:null An empty String. Used to put "null" in JSON. See
Bram Moolenaar6463ca22016-02-13 17:04:46 +01002286 |json_encode()|.
Bram Moolenaar705ada12016-01-24 17:56:50 +01002287 When used as a number this evaluates to zero.
Bram Moolenaarc95a3022016-06-12 23:01:46 +02002288 When used as a string this evaluates to "v:null". >
Bram Moolenaar705ada12016-01-24 17:56:50 +01002289 echo v:null
Bram Moolenaarc95a3022016-06-12 23:01:46 +02002290< v:null ~
2291 That is so that eval() can parse the string back to the same
Bram Moolenaardf48fb42016-07-22 21:50:18 +02002292 value. Read-only.
Bram Moolenaar1588bc82022-03-08 21:35:07 +00002293 In |Vim9| script `null` can be used without "v:".
2294 In some places `v:null` and `null` can be used for a List,
2295 Dict, Job, etc. that is not set. That is slightly different
2296 than an empty List, Dict, etc.
Bram Moolenaar520e1e42016-01-23 19:46:28 +01002297
Bram Moolenaar57d5a012021-01-21 21:42:31 +01002298 *v:numbermax* *numbermax-variable*
2299v:numbermax Maximum value of a number.
2300
Bram Moolenaare0e39172021-01-25 21:14:57 +01002301 *v:numbermin* *numbermin-variable*
Bram Moolenaar2346a632021-06-13 19:02:49 +02002302v:numbermin Minimum value of a number (negative).
Bram Moolenaar57d5a012021-01-21 21:42:31 +01002303
Bram Moolenaarf9706e92020-02-22 14:27:04 +01002304 *v:numbersize* *numbersize-variable*
2305v:numbersize Number of bits in a Number. This is normally 64, but on some
Bram Moolenaarbc93ceb2020-02-26 13:36:21 +01002306 systems it may be 32.
Bram Moolenaarf9706e92020-02-22 14:27:04 +01002307
Bram Moolenaard812df62008-11-09 12:46:09 +00002308 *v:oldfiles* *oldfiles-variable*
2309v:oldfiles List of file names that is loaded from the |viminfo| file on
2310 startup. These are the files that Vim remembers marks for.
2311 The length of the List is limited by the ' argument of the
2312 'viminfo' option (default is 100).
Bram Moolenaar8d043172014-01-23 14:24:41 +01002313 When the |viminfo| file is not used the List is empty.
Bram Moolenaard812df62008-11-09 12:46:09 +00002314 Also see |:oldfiles| and |c_#<|.
2315 The List can be modified, but this has no effect on what is
2316 stored in the |viminfo| file later. If you use values other
2317 than String this will cause trouble.
Bram Moolenaardb84e452010-08-15 13:50:43 +02002318 {only when compiled with the |+viminfo| feature}
Bram Moolenaard812df62008-11-09 12:46:09 +00002319
Bram Moolenaar53744302015-07-17 17:38:22 +02002320 *v:option_new*
2321v:option_new New value of the option. Valid while executing an |OptionSet|
2322 autocommand.
2323 *v:option_old*
2324v:option_old Old value of the option. Valid while executing an |OptionSet|
Bram Moolenaard7c96872019-06-15 17:12:48 +02002325 autocommand. Depending on the command used for setting and the
2326 kind of option this is either the local old value or the
2327 global old value.
2328 *v:option_oldlocal*
2329v:option_oldlocal
2330 Old local value of the option. Valid while executing an
2331 |OptionSet| autocommand.
2332 *v:option_oldglobal*
2333v:option_oldglobal
2334 Old global value of the option. Valid while executing an
2335 |OptionSet| autocommand.
Bram Moolenaar53744302015-07-17 17:38:22 +02002336 *v:option_type*
2337v:option_type Scope of the set command. Valid while executing an
2338 |OptionSet| autocommand. Can be either "global" or "local"
Bram Moolenaard7c96872019-06-15 17:12:48 +02002339 *v:option_command*
2340v:option_command
2341 Command used to set the option. Valid while executing an
2342 |OptionSet| autocommand.
2343 value option was set via ~
2344 "setlocal" |:setlocal| or ":let l:xxx"
2345 "setglobal" |:setglobal| or ":let g:xxx"
2346 "set" |:set| or |:let|
2347 "modeline" |modeline|
Bram Moolenaar8af1fbf2008-01-05 12:35:21 +00002348 *v:operator* *operator-variable*
2349v:operator The last operator given in Normal mode. This is a single
2350 character except for commands starting with <g> or <z>,
2351 in which case it is two characters. Best used alongside
2352 |v:prevcount| and |v:register|. Useful if you want to cancel
2353 Operator-pending mode and then use the operator, e.g.: >
2354 :omap O <Esc>:call MyMotion(v:operator)<CR>
2355< The value remains set until another operator is entered, thus
2356 don't expect it to be empty.
2357 v:operator is not set for |:delete|, |:yank| or other Ex
2358 commands.
2359 Read-only.
2360
Bram Moolenaar071d4272004-06-13 20:20:40 +00002361 *v:prevcount* *prevcount-variable*
2362v:prevcount The count given for the last but one Normal mode command.
2363 This is the v:count value of the previous command. Useful if
Bram Moolenaar8af1fbf2008-01-05 12:35:21 +00002364 you want to cancel Visual or Operator-pending mode and then
2365 use the count, e.g.: >
Bram Moolenaar071d4272004-06-13 20:20:40 +00002366 :vmap % <Esc>:call MyFilter(v:prevcount)<CR>
2367< Read-only.
2368
Bram Moolenaar05159a02005-02-26 23:04:13 +00002369 *v:profiling* *profiling-variable*
Bram Moolenaar58b85342016-08-14 19:54:54 +02002370v:profiling Normally zero. Set to one after using ":profile start".
Bram Moolenaar05159a02005-02-26 23:04:13 +00002371 See |profiling|.
2372
Bram Moolenaar071d4272004-06-13 20:20:40 +00002373 *v:progname* *progname-variable*
2374v:progname Contains the name (with path removed) with which Vim was
Bram Moolenaard38b0552012-04-25 19:07:41 +02002375 invoked. Allows you to do special initialisations for |view|,
2376 |evim| etc., or any other name you might symlink to Vim.
Bram Moolenaar071d4272004-06-13 20:20:40 +00002377 Read-only.
2378
Bram Moolenaara1706c92014-04-01 19:55:49 +02002379 *v:progpath* *progpath-variable*
Bram Moolenaar56c860c2019-08-17 20:09:31 +02002380v:progpath Contains the command with which Vim was invoked, in a form
2381 that when passed to the shell will run the same Vim executable
2382 as the current one (if $PATH remains unchanged).
2383 Useful if you want to message a Vim server using a
Bram Moolenaara1706c92014-04-01 19:55:49 +02002384 |--remote-expr|.
Bram Moolenaarc7f02552014-04-01 21:00:59 +02002385 To get the full path use: >
2386 echo exepath(v:progpath)
Bram Moolenaar56c860c2019-08-17 20:09:31 +02002387< If the command has a relative path it will be expanded to the
2388 full path, so that it still works after `:cd`. Thus starting
2389 "./vim" results in "/home/user/path/to/vim/src/vim".
2390 On Linux and other systems it will always be the full path.
2391 On Mac it may just be "vim" and using exepath() as mentioned
2392 above should be used to get the full path.
Bram Moolenaar08cab962017-03-04 14:37:18 +01002393 On MS-Windows the executable may be called "vim.exe", but the
2394 ".exe" is not added to v:progpath.
Bram Moolenaara1706c92014-04-01 19:55:49 +02002395 Read-only.
2396
Bram Moolenaar071d4272004-06-13 20:20:40 +00002397 *v:register* *register-variable*
Bram Moolenaard58e9292011-02-09 17:07:58 +01002398v:register The name of the register in effect for the current normal mode
Bram Moolenaard38b0552012-04-25 19:07:41 +02002399 command (regardless of whether that command actually used a
2400 register). Or for the currently executing normal mode mapping
2401 (use this in custom commands that take a register).
2402 If none is supplied it is the default register '"', unless
2403 'clipboard' contains "unnamed" or "unnamedplus", then it is
2404 '*' or '+'.
Bram Moolenaard58e9292011-02-09 17:07:58 +01002405 Also see |getreg()| and |setreg()|
Bram Moolenaar071d4272004-06-13 20:20:40 +00002406
Bram Moolenaar1c7715d2005-10-03 22:02:18 +00002407 *v:scrollstart* *scrollstart-variable*
2408v:scrollstart String describing the script or function that caused the
2409 screen to scroll up. It's only set when it is empty, thus the
2410 first reason is remembered. It is set to "Unknown" for a
2411 typed command.
2412 This can be used to find out why your script causes the
2413 hit-enter prompt.
2414
Bram Moolenaar071d4272004-06-13 20:20:40 +00002415 *v:servername* *servername-variable*
Bram Moolenaarc2ce52c2017-08-01 18:35:38 +02002416v:servername The resulting registered |client-server-name| if any.
Bram Moolenaar071d4272004-06-13 20:20:40 +00002417 Read-only.
2418
Bram Moolenaarb0d45e72017-11-05 18:19:24 +01002419
Bram Moolenaar446cb832008-06-24 21:56:24 +00002420v:searchforward *v:searchforward* *searchforward-variable*
2421 Search direction: 1 after a forward search, 0 after a
2422 backward search. It is reset to forward when directly setting
2423 the last search pattern, see |quote/|.
2424 Note that the value is restored when returning from a
2425 function. |function-search-undo|.
2426 Read-write.
2427
Bram Moolenaar071d4272004-06-13 20:20:40 +00002428 *v:shell_error* *shell_error-variable*
2429v:shell_error Result of the last shell command. When non-zero, the last
2430 shell command had an error. When zero, there was no problem.
2431 This only works when the shell returns the error code to Vim.
2432 The value -1 is often used when the command could not be
2433 executed. Read-only.
2434 Example: >
2435 :!mv foo bar
2436 :if v:shell_error
2437 : echo 'could not rename "foo" to "bar"!'
2438 :endif
Bram Moolenaard2e716e2019-04-20 14:39:52 +02002439< "shell_error" also works, for backwards compatibility, unless
2440 |scriptversion| is 3 or higher.
Bram Moolenaar071d4272004-06-13 20:20:40 +00002441
Bram Moolenaar113cb512021-11-07 20:27:04 +00002442 *v:sizeofint* *sizeofint-variable*
2443v:sizeofint Number of bytes in an int. Depends on how Vim was compiled.
2444 This is only useful for deciding whether a test will give the
2445 expected result.
2446
2447 *v:sizeoflong* *sizeoflong-variable*
2448v:sizeoflong Number of bytes in a long. Depends on how Vim was compiled.
2449 This is only useful for deciding whether a test will give the
2450 expected result.
2451
2452 *v:sizeofpointer* *sizeofpointer-variable*
2453v:sizeofpointer Number of bytes in a pointer. Depends on how Vim was compiled.
2454 This is only useful for deciding whether a test will give the
2455 expected result.
2456
Bram Moolenaar071d4272004-06-13 20:20:40 +00002457 *v:statusmsg* *statusmsg-variable*
2458v:statusmsg Last given status message. It's allowed to set this variable.
2459
Bram Moolenaar4e330bb2005-12-07 21:04:31 +00002460 *v:swapname* *swapname-variable*
2461v:swapname Only valid when executing |SwapExists| autocommands: Name of
2462 the swap file found. Read-only.
2463
2464 *v:swapchoice* *swapchoice-variable*
2465v:swapchoice |SwapExists| autocommands can set this to the selected choice
2466 for handling an existing swap file:
2467 'o' Open read-only
2468 'e' Edit anyway
2469 'r' Recover
2470 'd' Delete swapfile
2471 'q' Quit
2472 'a' Abort
Bram Moolenaar58b85342016-08-14 19:54:54 +02002473 The value should be a single-character string. An empty value
Bram Moolenaar4e330bb2005-12-07 21:04:31 +00002474 results in the user being asked, as would happen when there is
2475 no SwapExists autocommand. The default is empty.
2476
Bram Moolenaarb3480382005-12-11 21:33:32 +00002477 *v:swapcommand* *swapcommand-variable*
Bram Moolenaar4770d092006-01-12 23:22:24 +00002478v:swapcommand Normal mode command to be executed after a file has been
Bram Moolenaarb3480382005-12-11 21:33:32 +00002479 opened. Can be used for a |SwapExists| autocommand to have
Bram Moolenaar58b85342016-08-14 19:54:54 +02002480 another Vim open the file and jump to the right place. For
Bram Moolenaarb3480382005-12-11 21:33:32 +00002481 example, when jumping to a tag the value is ":tag tagname\r".
Bram Moolenaar1f35bf92006-03-07 22:38:47 +00002482 For ":edit +cmd file" the value is ":cmd\r".
Bram Moolenaarb3480382005-12-11 21:33:32 +00002483
Bram Moolenaard823fa92016-08-12 16:29:27 +02002484 *v:t_TYPE* *v:t_bool* *t_bool-variable*
Bram Moolenaard09091d2019-01-17 16:07:22 +01002485v:t_bool Value of |Boolean| type. Read-only. See: |type()|
Bram Moolenaard823fa92016-08-12 16:29:27 +02002486 *v:t_channel* *t_channel-variable*
Bram Moolenaard09091d2019-01-17 16:07:22 +01002487v:t_channel Value of |Channel| type. Read-only. See: |type()|
Bram Moolenaard823fa92016-08-12 16:29:27 +02002488 *v:t_dict* *t_dict-variable*
Bram Moolenaard09091d2019-01-17 16:07:22 +01002489v:t_dict Value of |Dictionary| type. Read-only. See: |type()|
Bram Moolenaard823fa92016-08-12 16:29:27 +02002490 *v:t_float* *t_float-variable*
Bram Moolenaard09091d2019-01-17 16:07:22 +01002491v:t_float Value of |Float| type. Read-only. See: |type()|
Bram Moolenaard823fa92016-08-12 16:29:27 +02002492 *v:t_func* *t_func-variable*
Bram Moolenaard09091d2019-01-17 16:07:22 +01002493v:t_func Value of |Funcref| type. Read-only. See: |type()|
Bram Moolenaard823fa92016-08-12 16:29:27 +02002494 *v:t_job* *t_job-variable*
Bram Moolenaard09091d2019-01-17 16:07:22 +01002495v:t_job Value of |Job| type. Read-only. See: |type()|
Bram Moolenaard823fa92016-08-12 16:29:27 +02002496 *v:t_list* *t_list-variable*
Bram Moolenaard09091d2019-01-17 16:07:22 +01002497v:t_list Value of |List| type. Read-only. See: |type()|
Bram Moolenaard823fa92016-08-12 16:29:27 +02002498 *v:t_none* *t_none-variable*
Bram Moolenaard09091d2019-01-17 16:07:22 +01002499v:t_none Value of |None| type. Read-only. See: |type()|
Bram Moolenaard823fa92016-08-12 16:29:27 +02002500 *v:t_number* *t_number-variable*
Bram Moolenaard09091d2019-01-17 16:07:22 +01002501v:t_number Value of |Number| type. Read-only. See: |type()|
Bram Moolenaard823fa92016-08-12 16:29:27 +02002502 *v:t_string* *t_string-variable*
Bram Moolenaard09091d2019-01-17 16:07:22 +01002503v:t_string Value of |String| type. Read-only. See: |type()|
Bram Moolenaar6e5ea8d2019-01-12 22:47:31 +01002504 *v:t_blob* *t_blob-variable*
Bram Moolenaard09091d2019-01-17 16:07:22 +01002505v:t_blob Value of |Blob| type. Read-only. See: |type()|
Bram Moolenaarf562e722016-07-19 17:25:25 +02002506
Bram Moolenaar071d4272004-06-13 20:20:40 +00002507 *v:termresponse* *termresponse-variable*
2508v:termresponse The escape sequence returned by the terminal for the |t_RV|
Bram Moolenaar58b85342016-08-14 19:54:54 +02002509 termcap entry. It is set when Vim receives an escape sequence
Bram Moolenaarb4230122019-05-30 18:40:53 +02002510 that starts with ESC [ or CSI, then '>' or '?' and ends in a
2511 'c', with only digits and ';' in between.
Bram Moolenaar071d4272004-06-13 20:20:40 +00002512 When this option is set, the TermResponse autocommand event is
2513 fired, so that you can react to the response from the
Bram Moolenaar0c0eddd2020-06-13 15:47:25 +02002514 terminal. You can use |terminalprops()| to see what Vim
2515 figured out about the terminal.
Bram Moolenaarb4230122019-05-30 18:40:53 +02002516 The response from a new xterm is: "<Esc>[> Pp ; Pv ; Pc c". Pp
Bram Moolenaar071d4272004-06-13 20:20:40 +00002517 is the terminal type: 0 for vt100 and 1 for vt220. Pv is the
2518 patch level (since this was introduced in patch 95, it's
Bram Moolenaarfa3b7232021-12-24 13:18:38 +00002519 always 95 or higher). Pc is always zero.
2520 If Pv is 141 or higher then Vim will try to request terminal
2521 codes. This only works with xterm |xterm-codes|.
Bram Moolenaar071d4272004-06-13 20:20:40 +00002522 {only when compiled with |+termresponse| feature}
2523
Bram Moolenaarf3af54e2017-08-30 14:53:06 +02002524 *v:termblinkresp*
2525v:termblinkresp The escape sequence returned by the terminal for the |t_RC|
2526 termcap entry. This is used to find out whether the terminal
2527 cursor is blinking. This is used by |term_getcursor()|.
2528
2529 *v:termstyleresp*
2530v:termstyleresp The escape sequence returned by the terminal for the |t_RS|
2531 termcap entry. This is used to find out what the shape of the
2532 cursor is. This is used by |term_getcursor()|.
2533
Bram Moolenaar65e4c4f2017-10-14 23:24:25 +02002534 *v:termrbgresp*
2535v:termrbgresp The escape sequence returned by the terminal for the |t_RB|
Bram Moolenaarf3af54e2017-08-30 14:53:06 +02002536 termcap entry. This is used to find out what the terminal
2537 background color is, see 'background'.
2538
Bram Moolenaar65e4c4f2017-10-14 23:24:25 +02002539 *v:termrfgresp*
2540v:termrfgresp The escape sequence returned by the terminal for the |t_RF|
2541 termcap entry. This is used to find out what the terminal
2542 foreground color is.
2543
Bram Moolenaarf3af54e2017-08-30 14:53:06 +02002544 *v:termu7resp*
2545v:termu7resp The escape sequence returned by the terminal for the |t_u7|
2546 termcap entry. This is used to find out what the terminal
2547 does with ambiguous width characters, see 'ambiwidth'.
2548
Bram Moolenaarebf7dfa2016-04-14 12:46:51 +02002549 *v:testing* *testing-variable*
Bram Moolenaar8e8df252016-05-25 21:23:21 +02002550v:testing Must be set before using `test_garbagecollect_now()`.
Bram Moolenaar036986f2017-03-16 17:41:02 +01002551 Also, when set certain error messages won't be shown for 2
Bram Moolenaarb0d45e72017-11-05 18:19:24 +01002552 seconds. (e.g. "'dictionary' option is empty")
Bram Moolenaarebf7dfa2016-04-14 12:46:51 +02002553
Bram Moolenaar071d4272004-06-13 20:20:40 +00002554 *v:this_session* *this_session-variable*
2555v:this_session Full filename of the last loaded or saved session file. See
2556 |:mksession|. It is allowed to set this variable. When no
2557 session file has been saved, this variable is empty.
Bram Moolenaard2e716e2019-04-20 14:39:52 +02002558 "this_session" also works, for backwards compatibility, unless
2559 |scriptversion| is 3 or higher
Bram Moolenaar071d4272004-06-13 20:20:40 +00002560
2561 *v:throwpoint* *throwpoint-variable*
2562v:throwpoint The point where the exception most recently caught and not
Bram Moolenaar58b85342016-08-14 19:54:54 +02002563 finished was thrown. Not set when commands are typed. See
Bram Moolenaar071d4272004-06-13 20:20:40 +00002564 also |v:exception| and |throw-variables|.
2565 Example: >
2566 :try
2567 : throw "oops"
2568 :catch /.*/
2569 : echo "Exception from" v:throwpoint
2570 :endtry
2571< Output: "Exception from test.vim, line 2"
2572
Bram Moolenaar520e1e42016-01-23 19:46:28 +01002573 *v:true* *true-variable*
2574v:true A Number with value one. Used to put "true" in JSON. See
Bram Moolenaar6463ca22016-02-13 17:04:46 +01002575 |json_encode()|.
Bram Moolenaarc95a3022016-06-12 23:01:46 +02002576 When used as a string this evaluates to "v:true". >
Bram Moolenaar705ada12016-01-24 17:56:50 +01002577 echo v:true
Bram Moolenaarc95a3022016-06-12 23:01:46 +02002578< v:true ~
2579 That is so that eval() can parse the string back to the same
Bram Moolenaardf48fb42016-07-22 21:50:18 +02002580 value. Read-only.
Bram Moolenaar5da36052021-12-27 15:39:57 +00002581 In |Vim9| script "true" can be used which has a boolean type.
Bram Moolenaar2fda12f2005-01-15 22:14:15 +00002582 *v:val* *val-variable*
Bram Moolenaar58b85342016-08-14 19:54:54 +02002583v:val Value of the current item of a |List| or |Dictionary|. Only
Bram Moolenaar32466aa2006-02-24 23:53:04 +00002584 valid while evaluating the expression used with |map()| and
Bram Moolenaar2fda12f2005-01-15 22:14:15 +00002585 |filter()|. Read-only.
2586
Bram Moolenaar071d4272004-06-13 20:20:40 +00002587 *v:version* *version-variable*
2588v:version Version number of Vim: Major version number times 100 plus
Bram Moolenaar9b283522019-06-17 22:19:33 +02002589 minor version number. Version 5.0 is 500. Version 5.1
Bram Moolenaar071d4272004-06-13 20:20:40 +00002590 is 501. Read-only. "version" also works, for backwards
Bram Moolenaard2e716e2019-04-20 14:39:52 +02002591 compatibility, unless |scriptversion| is 3 or higher.
Bram Moolenaar071d4272004-06-13 20:20:40 +00002592 Use |has()| to check if a certain patch was included, e.g.: >
Bram Moolenaar6716d9a2014-04-02 12:12:08 +02002593 if has("patch-7.4.123")
Bram Moolenaar071d4272004-06-13 20:20:40 +00002594< Note that patch numbers are specific to the version, thus both
2595 version 5.0 and 5.1 may have a patch 123, but these are
2596 completely different.
2597
Bram Moolenaar37df9a42019-06-14 14:39:51 +02002598 *v:versionlong* *versionlong-variable*
Bram Moolenaar9b283522019-06-17 22:19:33 +02002599v:versionlong Like v:version, but also including the patchlevel in the last
2600 four digits. Version 8.1 with patch 123 has value 8010123.
2601 This can be used like this: >
2602 if v:versionlong >= 8010123
Bram Moolenaar37df9a42019-06-14 14:39:51 +02002603< However, if there are gaps in the list of patches included
2604 this will not work well. This can happen if a recent patch
2605 was included into an older version, e.g. for a security fix.
2606 Use the has() function to make sure the patch is actually
2607 included.
2608
Bram Moolenaar14735512016-03-26 21:00:08 +01002609 *v:vim_did_enter* *vim_did_enter-variable*
2610v:vim_did_enter Zero until most of startup is done. It is set to one just
2611 before |VimEnter| autocommands are triggered.
2612
Bram Moolenaar071d4272004-06-13 20:20:40 +00002613 *v:warningmsg* *warningmsg-variable*
2614v:warningmsg Last given warning message. It's allowed to set this variable.
2615
Bram Moolenaar727c8762010-10-20 19:17:48 +02002616 *v:windowid* *windowid-variable*
2617v:windowid When any X11 based GUI is running or when running in a
2618 terminal and Vim connects to the X server (|-X|) this will be
Bram Moolenaar264e9fd2010-10-27 12:33:17 +02002619 set to the window ID.
2620 When an MS-Windows GUI is running this will be set to the
2621 window handle.
2622 Otherwise the value is zero.
Bram Moolenaar7571d552016-08-18 22:54:46 +02002623 Note: for windows inside Vim use |winnr()| or |win_getid()|,
2624 see |window-ID|.
Bram Moolenaar727c8762010-10-20 19:17:48 +02002625
Bram Moolenaar071d4272004-06-13 20:20:40 +00002626==============================================================================
26274. Builtin Functions *functions*
2628
2629See |function-list| for a list grouped by what the function is used for.
2630
Bram Moolenaar1cae5a02021-12-27 21:28:34 +00002631The alphabetic list of all builtin functions and details are in a separate
2632help file: |builtin-functions|.
Bram Moolenaar071d4272004-06-13 20:20:40 +00002633
2634==============================================================================
26355. Defining functions *user-functions*
2636
2637New functions can be defined. These can be called just like builtin
Bram Moolenaar0daafaa2022-09-04 17:45:43 +01002638functions. The function takes arguments, executes a sequence of Ex commands
2639and can return a value.
Bram Moolenaar071d4272004-06-13 20:20:40 +00002640
Bram Moolenaar0daafaa2022-09-04 17:45:43 +01002641You can find most information about defining functions in |userfunc.txt|.
2642For Vim9 functions, which execute much faster, support type checking and more,
2643see |vim9.txt|.
Bram Moolenaar433f7c82006-03-21 21:29:36 +00002644
Bram Moolenaar071d4272004-06-13 20:20:40 +00002645==============================================================================
26466. Curly braces names *curly-braces-names*
2647
Bram Moolenaar84f72352012-03-11 15:57:40 +01002648In most places where you can use a variable, you can use a "curly braces name"
2649variable. This is a regular variable name with one or more expressions
2650wrapped in braces {} like this: >
Bram Moolenaar071d4272004-06-13 20:20:40 +00002651 my_{adjective}_variable
2652
Bram Moolenaar5da36052021-12-27 15:39:57 +00002653This only works in legacy Vim script, not in |Vim9| script.
2654
Bram Moolenaar071d4272004-06-13 20:20:40 +00002655When Vim encounters this, it evaluates the expression inside the braces, puts
2656that in place of the expression, and re-interprets the whole as a variable
2657name. So in the above example, if the variable "adjective" was set to
2658"noisy", then the reference would be to "my_noisy_variable", whereas if
2659"adjective" was set to "quiet", then it would be to "my_quiet_variable".
2660
2661One application for this is to create a set of variables governed by an option
Bram Moolenaar58b85342016-08-14 19:54:54 +02002662value. For example, the statement >
Bram Moolenaar071d4272004-06-13 20:20:40 +00002663 echo my_{&background}_message
2664
2665would output the contents of "my_dark_message" or "my_light_message" depending
2666on the current value of 'background'.
2667
2668You can use multiple brace pairs: >
2669 echo my_{adverb}_{adjective}_message
2670..or even nest them: >
2671 echo my_{ad{end_of_word}}_message
2672where "end_of_word" is either "verb" or "jective".
2673
2674However, the expression inside the braces must evaluate to a valid single
Bram Moolenaar402d2fe2005-04-15 21:00:38 +00002675variable name, e.g. this is invalid: >
Bram Moolenaar071d4272004-06-13 20:20:40 +00002676 :let foo='a + b'
2677 :echo c{foo}d
2678.. since the result of expansion is "ca + bd", which is not a variable name.
2679
2680 *curly-braces-function-names*
2681You can call and define functions by an evaluated name in a similar way.
2682Example: >
2683 :let func_end='whizz'
2684 :call my_func_{func_end}(parameter)
2685
2686This would call the function "my_func_whizz(parameter)".
2687
Bram Moolenaar84f72352012-03-11 15:57:40 +01002688This does NOT work: >
2689 :let i = 3
2690 :let @{i} = '' " error
2691 :echo @{i} " error
2692
Bram Moolenaar071d4272004-06-13 20:20:40 +00002693==============================================================================
26947. Commands *expression-commands*
2695
Bram Moolenaar5da36052021-12-27 15:39:57 +00002696Note: in |Vim9| script `:let` is not used. `:var` is used for variable
2697declarations and assignments do not use a command. |vim9-declaration|
Bram Moolenaar65e0d772020-06-14 17:29:55 +02002698
Bram Moolenaar071d4272004-06-13 20:20:40 +00002699:let {var-name} = {expr1} *:let* *E18*
2700 Set internal variable {var-name} to the result of the
2701 expression {expr1}. The variable will get the type
2702 from the {expr}. If {var-name} didn't exist yet, it
2703 is created.
2704
Bram Moolenaarf10911e2022-01-29 22:20:48 +00002705:let {var-name}[{idx}] = {expr1} *E689* *E1141*
Bram Moolenaar13065c42005-01-08 16:08:21 +00002706 Set a list item to the result of the expression
2707 {expr1}. {var-name} must refer to a list and {idx}
2708 must be a valid index in that list. For nested list
2709 the index can be repeated.
Bram Moolenaar446cb832008-06-24 21:56:24 +00002710 This cannot be used to add an item to a |List|.
Bram Moolenaar58b85342016-08-14 19:54:54 +02002711 This cannot be used to set a byte in a String. You
Bram Moolenaar446cb832008-06-24 21:56:24 +00002712 can do that like this: >
Bram Moolenaarc51cf032022-02-26 12:25:45 +00002713 :let var = var[0:2] .. 'X' .. var[4:]
Bram Moolenaar6e5ea8d2019-01-12 22:47:31 +01002714< When {var-name} is a |Blob| then {idx} can be the
2715 length of the blob, in which case one byte is
2716 appended.
2717
Bram Moolenaara2baa732022-02-04 16:09:54 +00002718 *E711* *E719* *E1165* *E1166* *E1183*
Bram Moolenaar3a3a7232005-01-17 22:16:15 +00002719:let {var-name}[{idx1}:{idx2}] = {expr1} *E708* *E709* *E710*
Bram Moolenaar32466aa2006-02-24 23:53:04 +00002720 Set a sequence of items in a |List| to the result of
2721 the expression {expr1}, which must be a list with the
Bram Moolenaar9588a0f2005-01-08 21:45:39 +00002722 correct number of items.
2723 {idx1} can be omitted, zero is used instead.
2724 {idx2} can be omitted, meaning the end of the list.
2725 When the selected range of items is partly past the
2726 end of the list, items will be added.
2727
Bram Moolenaar6f4754b2022-01-23 12:07:04 +00002728 *:let+=* *:let-=* *:letstar=* *:let/=* *:let%=*
2729 *:let.=* *:let..=* *E734* *E985* *E1019*
Bram Moolenaar3a3a7232005-01-17 22:16:15 +00002730:let {var} += {expr1} Like ":let {var} = {var} + {expr1}".
2731:let {var} -= {expr1} Like ":let {var} = {var} - {expr1}".
Bram Moolenaarff697e62019-02-12 22:28:33 +01002732:let {var} *= {expr1} Like ":let {var} = {var} * {expr1}".
2733:let {var} /= {expr1} Like ":let {var} = {var} / {expr1}".
2734:let {var} %= {expr1} Like ":let {var} = {var} % {expr1}".
Bram Moolenaar3a3a7232005-01-17 22:16:15 +00002735:let {var} .= {expr1} Like ":let {var} = {var} . {expr1}".
Bram Moolenaar558ca4a2019-04-04 18:15:38 +02002736:let {var} ..= {expr1} Like ":let {var} = {var} .. {expr1}".
Bram Moolenaar3a3a7232005-01-17 22:16:15 +00002737 These fail if {var} was not set yet and when the type
2738 of {var} and {expr1} don't fit the operator.
Bram Moolenaar558ca4a2019-04-04 18:15:38 +02002739 `.=` is not supported with Vim script version 2 and
2740 later, see |vimscript-version|.
Bram Moolenaar3a3a7232005-01-17 22:16:15 +00002741
2742
Bram Moolenaar071d4272004-06-13 20:20:40 +00002743:let ${env-name} = {expr1} *:let-environment* *:let-$*
2744 Set environment variable {env-name} to the result of
2745 the expression {expr1}. The type is always String.
Bram Moolenaar56c860c2019-08-17 20:09:31 +02002746
2747 On some systems making an environment variable empty
2748 causes it to be deleted. Many systems do not make a
2749 difference between an environment variable that is not
2750 set and an environment variable that is empty.
2751
Bram Moolenaar3a3a7232005-01-17 22:16:15 +00002752:let ${env-name} .= {expr1}
2753 Append {expr1} to the environment variable {env-name}.
2754 If the environment variable didn't exist yet this
2755 works like "=".
Bram Moolenaar071d4272004-06-13 20:20:40 +00002756
2757:let @{reg-name} = {expr1} *:let-register* *:let-@*
2758 Write the result of the expression {expr1} in register
2759 {reg-name}. {reg-name} must be a single letter, and
2760 must be the name of a writable register (see
2761 |registers|). "@@" can be used for the unnamed
2762 register, "@/" for the search pattern.
2763 If the result of {expr1} ends in a <CR> or <NL>, the
2764 register will be linewise, otherwise it will be set to
2765 characterwise.
2766 This can be used to clear the last search pattern: >
2767 :let @/ = ""
2768< This is different from searching for an empty string,
2769 that would match everywhere.
2770
Bram Moolenaar3a3a7232005-01-17 22:16:15 +00002771:let @{reg-name} .= {expr1}
Bram Moolenaar58b85342016-08-14 19:54:54 +02002772 Append {expr1} to register {reg-name}. If the
Bram Moolenaar3a3a7232005-01-17 22:16:15 +00002773 register was empty it's like setting it to {expr1}.
2774
Bram Moolenaaref2f6562007-05-06 13:32:59 +00002775:let &{option-name} = {expr1} *:let-option* *:let-&*
Bram Moolenaar071d4272004-06-13 20:20:40 +00002776 Set option {option-name} to the result of the
Bram Moolenaarfca34d62005-01-04 21:38:36 +00002777 expression {expr1}. A String or Number value is
2778 always converted to the type of the option.
Bram Moolenaar071d4272004-06-13 20:20:40 +00002779 For an option local to a window or buffer the effect
2780 is just like using the |:set| command: both the local
Bram Moolenaara5fac542005-10-12 20:58:49 +00002781 value and the global value are changed.
Bram Moolenaarfca34d62005-01-04 21:38:36 +00002782 Example: >
Bram Moolenaarc51cf032022-02-26 12:25:45 +00002783 :let &path = &path .. ',/usr/local/include'
Bram Moolenaar3df01732017-02-17 22:47:16 +01002784< This also works for terminal codes in the form t_xx.
2785 But only for alphanumerical names. Example: >
2786 :let &t_k1 = "\<Esc>[234;"
2787< When the code does not exist yet it will be created as
2788 a terminal key code, there is no error.
Bram Moolenaar071d4272004-06-13 20:20:40 +00002789
Bram Moolenaar3a3a7232005-01-17 22:16:15 +00002790:let &{option-name} .= {expr1}
2791 For a string option: Append {expr1} to the value.
2792 Does not insert a comma like |:set+=|.
2793
2794:let &{option-name} += {expr1}
2795:let &{option-name} -= {expr1}
2796 For a number or boolean option: Add or subtract
2797 {expr1}.
2798
Bram Moolenaar071d4272004-06-13 20:20:40 +00002799:let &l:{option-name} = {expr1}
Bram Moolenaar3a3a7232005-01-17 22:16:15 +00002800:let &l:{option-name} .= {expr1}
2801:let &l:{option-name} += {expr1}
2802:let &l:{option-name} -= {expr1}
Bram Moolenaar071d4272004-06-13 20:20:40 +00002803 Like above, but only set the local value of an option
2804 (if there is one). Works like |:setlocal|.
2805
2806:let &g:{option-name} = {expr1}
Bram Moolenaar3a3a7232005-01-17 22:16:15 +00002807:let &g:{option-name} .= {expr1}
2808:let &g:{option-name} += {expr1}
2809:let &g:{option-name} -= {expr1}
Bram Moolenaar071d4272004-06-13 20:20:40 +00002810 Like above, but only set the global value of an option
2811 (if there is one). Works like |:setglobal|.
Bram Moolenaarf10911e2022-01-29 22:20:48 +00002812 *E1093*
Bram Moolenaar13065c42005-01-08 16:08:21 +00002813:let [{name1}, {name2}, ...] = {expr1} *:let-unpack* *E687* *E688*
Bram Moolenaar32466aa2006-02-24 23:53:04 +00002814 {expr1} must evaluate to a |List|. The first item in
Bram Moolenaarfca34d62005-01-04 21:38:36 +00002815 the list is assigned to {name1}, the second item to
2816 {name2}, etc.
2817 The number of names must match the number of items in
Bram Moolenaar32466aa2006-02-24 23:53:04 +00002818 the |List|.
Bram Moolenaarfca34d62005-01-04 21:38:36 +00002819 Each name can be one of the items of the ":let"
2820 command as mentioned above.
2821 Example: >
2822 :let [s, item] = GetItem(s)
Bram Moolenaar3a3a7232005-01-17 22:16:15 +00002823< Detail: {expr1} is evaluated first, then the
2824 assignments are done in sequence. This matters if
2825 {name2} depends on {name1}. Example: >
2826 :let x = [0, 1]
2827 :let i = 0
2828 :let [i, x[i]] = [1, 2]
2829 :echo x
2830< The result is [0, 2].
2831
2832:let [{name1}, {name2}, ...] .= {expr1}
2833:let [{name1}, {name2}, ...] += {expr1}
2834:let [{name1}, {name2}, ...] -= {expr1}
2835 Like above, but append/add/subtract the value for each
Bram Moolenaar32466aa2006-02-24 23:53:04 +00002836 |List| item.
Bram Moolenaarfca34d62005-01-04 21:38:36 +00002837
Bram Moolenaard1caa942020-04-10 22:10:56 +02002838:let [{name}, ..., ; {lastname}] = {expr1} *E452*
Bram Moolenaar32466aa2006-02-24 23:53:04 +00002839 Like |:let-unpack| above, but the |List| may have more
Bram Moolenaar3a3a7232005-01-17 22:16:15 +00002840 items than there are names. A list of the remaining
2841 items is assigned to {lastname}. If there are no
2842 remaining items {lastname} is set to an empty list.
Bram Moolenaarfca34d62005-01-04 21:38:36 +00002843 Example: >
2844 :let [a, b; rest] = ["aval", "bval", 3, 4]
2845<
Bram Moolenaar3a3a7232005-01-17 22:16:15 +00002846:let [{name}, ..., ; {lastname}] .= {expr1}
2847:let [{name}, ..., ; {lastname}] += {expr1}
2848:let [{name}, ..., ; {lastname}] -= {expr1}
2849 Like above, but append/add/subtract the value for each
Bram Moolenaar32466aa2006-02-24 23:53:04 +00002850 |List| item.
Bram Moolenaar4a748032010-09-30 21:47:56 +02002851
Bram Moolenaar24582002019-07-21 14:14:26 +02002852 *:let=<<* *:let-heredoc*
Bram Moolenaarf10911e2022-01-29 22:20:48 +00002853 *E990* *E991* *E172* *E221* *E1145*
Yegappan Lakshmananefbfa862022-04-17 12:47:40 +01002854:let {var-name} =<< [trim] [eval] {endmarker}
Bram Moolenaarf5842c52019-05-19 18:41:26 +02002855text...
2856text...
Bram Moolenaar2e693a82019-10-16 22:35:02 +02002857{endmarker}
Bram Moolenaare46a4402020-06-30 20:38:27 +02002858 Set internal variable {var-name} to a |List|
2859 containing the lines of text bounded by the string
Yegappan Lakshmananefbfa862022-04-17 12:47:40 +01002860 {endmarker}.
2861
2862 If "eval" is not specified, then each line of text is
Bram Moolenaard899e512022-05-07 21:54:03 +01002863 used as a |literal-string|, except that single quotes
Bram Moolenaar8a3b8052022-06-26 12:21:15 +01002864 does not need to be doubled.
Bram Moolenaard899e512022-05-07 21:54:03 +01002865 If "eval" is specified, then any Vim expression in the
2866 form {expr} is evaluated and the result replaces the
Bram Moolenaarb59ae592022-11-23 23:46:31 +00002867 expression, like with |interpolated-string|.
Yegappan Lakshmananefbfa862022-04-17 12:47:40 +01002868 Example where $HOME is expanded: >
2869 let lines =<< trim eval END
2870 some text
Bram Moolenaard899e512022-05-07 21:54:03 +01002871 See the file {$HOME}/.vimrc
Yegappan Lakshmananefbfa862022-04-17 12:47:40 +01002872 more text
2873 END
2874< There can be multiple Vim expressions in a single line
2875 but an expression cannot span multiple lines. If any
2876 expression evaluation fails, then the assignment fails.
Yegappan Lakshmananefbfa862022-04-17 12:47:40 +01002877
Bram Moolenaar2e693a82019-10-16 22:35:02 +02002878 {endmarker} must not contain white space.
2879 {endmarker} cannot start with a lower case character.
2880 The last line should end only with the {endmarker}
2881 string without any other character. Watch out for
2882 white space after {endmarker}!
Bram Moolenaarf5842c52019-05-19 18:41:26 +02002883
Bram Moolenaare7eb9272019-06-24 00:58:07 +02002884 Without "trim" any white space characters in the lines
2885 of text are preserved. If "trim" is specified before
Bram Moolenaar2e693a82019-10-16 22:35:02 +02002886 {endmarker}, then indentation is stripped so you can
2887 do: >
Bram Moolenaare7eb9272019-06-24 00:58:07 +02002888 let text =<< trim END
2889 if ok
2890 echo 'done'
2891 endif
2892 END
2893< Results in: ["if ok", " echo 'done'", "endif"]
2894 The marker must line up with "let" and the indentation
2895 of the first line is removed from all the text lines.
2896 Specifically: all the leading indentation exactly
2897 matching the leading indentation of the first
2898 non-empty text line is stripped from the input lines.
2899 All leading indentation exactly matching the leading
2900 indentation before `let` is stripped from the line
Bram Moolenaar2e693a82019-10-16 22:35:02 +02002901 containing {endmarker}. Note that the difference
2902 between space and tab matters here.
Bram Moolenaarf5842c52019-05-19 18:41:26 +02002903
2904 If {var-name} didn't exist yet, it is created.
2905 Cannot be followed by another command, but can be
2906 followed by a comment.
2907
Bram Moolenaar2e693a82019-10-16 22:35:02 +02002908 To avoid line continuation to be applied, consider
2909 adding 'C' to 'cpoptions': >
2910 set cpo+=C
2911 let var =<< END
2912 \ leading backslash
2913 END
2914 set cpo-=C
2915<
Bram Moolenaarf5842c52019-05-19 18:41:26 +02002916 Examples: >
2917 let var1 =<< END
Bram Moolenaar2e693a82019-10-16 22:35:02 +02002918 Sample text 1
2919 Sample text 2
2920 Sample text 3
2921 END
Bram Moolenaarf5842c52019-05-19 18:41:26 +02002922
2923 let data =<< trim DATA
Bram Moolenaar2e693a82019-10-16 22:35:02 +02002924 1 2 3 4
2925 5 6 7 8
Bram Moolenaarf5842c52019-05-19 18:41:26 +02002926 DATA
Yegappan Lakshmananefbfa862022-04-17 12:47:40 +01002927
2928 let code =<< trim eval CODE
Bram Moolenaard899e512022-05-07 21:54:03 +01002929 let v = {10 + 20}
2930 let h = "{$HOME}"
2931 let s = "{Str1()} abc {Str2()}"
2932 let n = {MyFunc(3, 4)}
Yegappan Lakshmananefbfa862022-04-17 12:47:40 +01002933 CODE
Bram Moolenaarf5842c52019-05-19 18:41:26 +02002934<
Bram Moolenaar4a748032010-09-30 21:47:56 +02002935 *E121*
Bram Moolenaar58b85342016-08-14 19:54:54 +02002936:let {var-name} .. List the value of variable {var-name}. Multiple
Bram Moolenaardcaf10e2005-01-21 11:55:25 +00002937 variable names may be given. Special names recognized
2938 here: *E738*
Bram Moolenaarca003e12006-03-17 23:19:38 +00002939 g: global variables
2940 b: local buffer variables
2941 w: local window variables
Bram Moolenaar910f66f2006-04-05 20:41:53 +00002942 t: local tab page variables
Bram Moolenaarca003e12006-03-17 23:19:38 +00002943 s: script-local variables
2944 l: local function variables
Bram Moolenaardcaf10e2005-01-21 11:55:25 +00002945 v: Vim variables.
Bram Moolenaar65e0d772020-06-14 17:29:55 +02002946 This does not work in Vim9 script. |vim9-declaration|
Bram Moolenaar071d4272004-06-13 20:20:40 +00002947
Bram Moolenaard7ee7ce2005-01-03 21:02:03 +00002948:let List the values of all variables. The type of the
2949 variable is indicated before the value:
2950 <nothing> String
2951 # Number
Bram Moolenaarc9b4b052006-04-30 18:54:39 +00002952 * Funcref
Bram Moolenaar65e0d772020-06-14 17:29:55 +02002953 This does not work in Vim9 script. |vim9-declaration|
Bram Moolenaar071d4272004-06-13 20:20:40 +00002954
Bram Moolenaar6f4754b2022-01-23 12:07:04 +00002955:unl[et][!] {name} ... *:unlet* *:unl* *E108* *E795* *E1081*
Bram Moolenaar2ce06f62005-01-31 19:19:04 +00002956 Remove the internal variable {name}. Several variable
2957 names can be given, they are all removed. The name
Bram Moolenaar32466aa2006-02-24 23:53:04 +00002958 may also be a |List| or |Dictionary| item.
Bram Moolenaar071d4272004-06-13 20:20:40 +00002959 With [!] no error message is given for non-existing
2960 variables.
Bram Moolenaar32466aa2006-02-24 23:53:04 +00002961 One or more items from a |List| can be removed: >
Bram Moolenaar9cd15162005-01-16 22:02:49 +00002962 :unlet list[3] " remove fourth item
2963 :unlet list[3:] " remove fourth item to last
Bram Moolenaar32466aa2006-02-24 23:53:04 +00002964< One item from a |Dictionary| can be removed at a time: >
Bram Moolenaar9cd15162005-01-16 22:02:49 +00002965 :unlet dict['two']
2966 :unlet dict.two
Bram Moolenaarc236c162008-07-13 17:41:49 +00002967< This is especially useful to clean up used global
2968 variables and script-local variables (these are not
2969 deleted when the script ends). Function-local
2970 variables are automatically deleted when the function
2971 ends.
Bram Moolenaar071d4272004-06-13 20:20:40 +00002972
Bram Moolenaar137374f2018-05-13 15:59:50 +02002973:unl[et] ${env-name} ... *:unlet-environment* *:unlet-$*
2974 Remove environment variable {env-name}.
2975 Can mix {name} and ${env-name} in one :unlet command.
2976 No error message is given for a non-existing
2977 variable, also without !.
2978 If the system does not support deleting an environment
Bram Moolenaar9937a052019-06-15 15:45:06 +02002979 variable, it is made empty.
Bram Moolenaar137374f2018-05-13 15:59:50 +02002980
Bram Moolenaar6f4754b2022-01-23 12:07:04 +00002981 *:cons* *:const* *E1018*
Bram Moolenaar9937a052019-06-15 15:45:06 +02002982:cons[t] {var-name} = {expr1}
2983:cons[t] [{name1}, {name2}, ...] = {expr1}
Bram Moolenaar9937a052019-06-15 15:45:06 +02002984:cons[t] [{name}, ..., ; {lastname}] = {expr1}
2985:cons[t] {var-name} =<< [trim] {marker}
2986text...
2987text...
2988{marker}
2989 Similar to |:let|, but additionally lock the variable
2990 after setting the value. This is the same as locking
2991 the variable with |:lockvar| just after |:let|, thus: >
2992 :const x = 1
2993< is equivalent to: >
2994 :let x = 1
Bram Moolenaar021bda52020-08-17 21:07:22 +02002995 :lockvar! x
Bram Moolenaara187c432020-09-16 21:08:28 +02002996< NOTE: in Vim9 script `:const` works differently, see
2997 |vim9-const|
2998 This is useful if you want to make sure the variable
Bram Moolenaar021bda52020-08-17 21:07:22 +02002999 is not modified. If the value is a List or Dictionary
3000 literal then the items also cannot be changed: >
3001 const ll = [1, 2, 3]
3002 let ll[1] = 5 " Error!
Bram Moolenaar6e649222021-10-04 21:32:54 +01003003< Nested references are not locked: >
Bram Moolenaar021bda52020-08-17 21:07:22 +02003004 let lvar = ['a']
3005 const lconst = [0, lvar]
3006 let lconst[0] = 2 " Error!
3007 let lconst[1][0] = 'b' " OK
3008< *E995*
Bram Moolenaar9b283522019-06-17 22:19:33 +02003009 |:const| does not allow to for changing a variable: >
Bram Moolenaar9937a052019-06-15 15:45:06 +02003010 :let x = 1
3011 :const x = 2 " Error!
Bram Moolenaar1c196e72019-06-16 15:41:58 +02003012< *E996*
3013 Note that environment variables, option values and
3014 register values cannot be used here, since they cannot
3015 be locked.
3016
Bram Moolenaar85850f32019-07-19 22:05:51 +02003017:cons[t]
3018:cons[t] {var-name}
3019 If no argument is given or only {var-name} is given,
3020 the behavior is the same as |:let|.
3021
Bram Moolenaar2ce06f62005-01-31 19:19:04 +00003022:lockv[ar][!] [depth] {name} ... *:lockvar* *:lockv*
3023 Lock the internal variable {name}. Locking means that
3024 it can no longer be changed (until it is unlocked).
3025 A locked variable can be deleted: >
3026 :lockvar v
Bram Moolenaardad44732021-03-31 20:07:33 +02003027 :let v = 'asdf' " fails!
3028 :unlet v " works
Bram Moolenaarf10911e2022-01-29 22:20:48 +00003029< *E741* *E940* *E1118* *E1119* *E1120* *E1121* *E1122*
Bram Moolenaar2ce06f62005-01-31 19:19:04 +00003030 If you try to change a locked variable you get an
Bram Moolenaare7877fe2017-02-20 22:35:33 +01003031 error message: "E741: Value is locked: {name}".
3032 If you try to lock or unlock a built-in variable you
3033 get an error message: "E940: Cannot lock or unlock
3034 variable {name}".
Bram Moolenaar2ce06f62005-01-31 19:19:04 +00003035
Bram Moolenaar32466aa2006-02-24 23:53:04 +00003036 [depth] is relevant when locking a |List| or
3037 |Dictionary|. It specifies how deep the locking goes:
Bram Moolenaara187c432020-09-16 21:08:28 +02003038 0 Lock the variable {name} but not its
3039 value.
Bram Moolenaar32466aa2006-02-24 23:53:04 +00003040 1 Lock the |List| or |Dictionary| itself,
Bram Moolenaar2ce06f62005-01-31 19:19:04 +00003041 cannot add or remove items, but can
3042 still change their values.
3043 2 Also lock the values, cannot change
Bram Moolenaar32466aa2006-02-24 23:53:04 +00003044 the items. If an item is a |List| or
3045 |Dictionary|, cannot add or remove
Bram Moolenaar2ce06f62005-01-31 19:19:04 +00003046 items, but can still change the
3047 values.
Bram Moolenaar32466aa2006-02-24 23:53:04 +00003048 3 Like 2 but for the |List| /
3049 |Dictionary| in the |List| /
3050 |Dictionary|, one level deeper.
3051 The default [depth] is 2, thus when {name} is a |List|
3052 or |Dictionary| the values cannot be changed.
Bram Moolenaara187c432020-09-16 21:08:28 +02003053
3054 Example with [depth] 0: >
3055 let mylist = [1, 2, 3]
3056 lockvar 0 mylist
Bram Moolenaar6e649222021-10-04 21:32:54 +01003057 let mylist[0] = 77 " OK
3058 call add(mylist, 4] " OK
Bram Moolenaara187c432020-09-16 21:08:28 +02003059 let mylist = [7, 8, 9] " Error!
3060< *E743*
Bram Moolenaar2ce06f62005-01-31 19:19:04 +00003061 For unlimited depth use [!] and omit [depth].
3062 However, there is a maximum depth of 100 to catch
3063 loops.
3064
Bram Moolenaar32466aa2006-02-24 23:53:04 +00003065 Note that when two variables refer to the same |List|
3066 and you lock one of them, the |List| will also be
Bram Moolenaar910f66f2006-04-05 20:41:53 +00003067 locked when used through the other variable.
3068 Example: >
Bram Moolenaar2ce06f62005-01-31 19:19:04 +00003069 :let l = [0, 1, 2, 3]
3070 :let cl = l
3071 :lockvar l
3072 :let cl[1] = 99 " won't work!
3073< You may want to make a copy of a list to avoid this.
3074 See |deepcopy()|.
3075
3076
Bram Moolenaara2baa732022-02-04 16:09:54 +00003077:unlo[ckvar][!] [depth] {name} ... *:unlockvar* *:unlo* *E1246*
Bram Moolenaar2ce06f62005-01-31 19:19:04 +00003078 Unlock the internal variable {name}. Does the
3079 opposite of |:lockvar|.
3080
Bram Moolenaard13166e2022-11-18 21:49:57 +00003081 If {name} does not exist:
3082 - In |Vim9| script an error is given.
3083 - In legacy script this is silently ignored.
3084
Bram Moolenaar61da1bf2019-06-06 12:14:49 +02003085:if {expr1} *:if* *:end* *:endif* *:en* *E171* *E579* *E580*
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003086:en[dif] Execute the commands until the next matching `:else`
3087 or `:endif` if {expr1} evaluates to non-zero.
Bram Moolenaarc51cf032022-02-26 12:25:45 +00003088 Although the short forms work, it is recommended to
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003089 always use `:endif` to avoid confusion and to make
3090 auto-indenting work properly.
Bram Moolenaar071d4272004-06-13 20:20:40 +00003091
3092 From Vim version 4.5 until 5.0, every Ex command in
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003093 between the `:if` and `:endif` is ignored. These two
Bram Moolenaar071d4272004-06-13 20:20:40 +00003094 commands were just to allow for future expansions in a
Bram Moolenaar85084ef2016-01-17 22:26:33 +01003095 backward compatible way. Nesting was allowed. Note
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003096 that any `:else` or `:elseif` was ignored, the `else`
Bram Moolenaar071d4272004-06-13 20:20:40 +00003097 part was not executed either.
3098
3099 You can use this to remain compatible with older
3100 versions: >
3101 :if version >= 500
3102 : version-5-specific-commands
3103 :endif
3104< The commands still need to be parsed to find the
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003105 `endif`. Sometimes an older Vim has a problem with a
3106 new command. For example, `:silent` is recognized as
3107 a `:substitute` command. In that case `:execute` can
Bram Moolenaar071d4272004-06-13 20:20:40 +00003108 avoid problems: >
3109 :if version >= 600
3110 : execute "silent 1,$delete"
3111 :endif
3112<
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003113 In |Vim9| script `:endif` cannot be shortened, to
3114 improve script readability.
3115 NOTE: The `:append` and `:insert` commands don't work
3116 properly in between `:if` and `:endif`.
Bram Moolenaar071d4272004-06-13 20:20:40 +00003117
3118 *:else* *:el* *E581* *E583*
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003119:el[se] Execute the commands until the next matching `:else`
3120 or `:endif` if they previously were not being
Bram Moolenaar071d4272004-06-13 20:20:40 +00003121 executed.
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003122 In |Vim9| script `:else` cannot be shortened, to
3123 improve script readability.
Bram Moolenaar071d4272004-06-13 20:20:40 +00003124
3125 *:elseif* *:elsei* *E582* *E584*
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003126:elsei[f] {expr1} Short for `:else` `:if`, with the addition that there
3127 is no extra `:endif`.
3128 In |Vim9| script `:elseif` cannot be shortened, to
3129 improve script readability.
Bram Moolenaar071d4272004-06-13 20:20:40 +00003130
3131:wh[ile] {expr1} *:while* *:endwhile* *:wh* *:endw*
Bram Moolenaar3a3a7232005-01-17 22:16:15 +00003132 *E170* *E585* *E588* *E733*
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003133:endw[hile] Repeat the commands between `:while` and `:endwhile`,
Bram Moolenaar071d4272004-06-13 20:20:40 +00003134 as long as {expr1} evaluates to non-zero.
3135 When an error is detected from a command inside the
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003136 loop, execution continues after the `endwhile`.
Bram Moolenaar12805862005-01-05 22:16:17 +00003137 Example: >
3138 :let lnum = 1
3139 :while lnum <= line("$")
3140 :call FixLine(lnum)
3141 :let lnum = lnum + 1
3142 :endwhile
3143<
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003144 In |Vim9| script `:while` and `:endwhile` cannot be
3145 shortened, to improve script readability.
3146 NOTE: The `:append` and `:insert` commands don't work
3147 properly inside a `:while` and `:for` loop.
Bram Moolenaar071d4272004-06-13 20:20:40 +00003148
Bram Moolenaar5e66b422019-01-24 21:58:10 +01003149:for {var} in {object} *:for* *E690* *E732*
Bram Moolenaar12805862005-01-05 22:16:17 +00003150:endfo[r] *:endfo* *:endfor*
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003151 Repeat the commands between `:for` and `:endfor` for
Bram Moolenaar3f32a5f2022-05-12 20:34:15 +01003152 each item in {object}. {object} can be a |List|,
3153 a |Blob| or a |String|. *E1177*
Bram Moolenaar5da36052021-12-27 15:39:57 +00003154
3155 Variable {var} is set to the value of each item.
3156 In |Vim9| script the loop variable must not have been
3157 declared yet, unless when it is a
3158 global/window/tab/buffer variable.
3159
3160 When an error is detected for a command inside the
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003161 loop, execution continues after the `endfor`.
Bram Moolenaar5e66b422019-01-24 21:58:10 +01003162 Changing {object} inside the loop affects what items
3163 are used. Make a copy if this is unwanted: >
Bram Moolenaarde8866b2005-01-06 23:24:37 +00003164 :for item in copy(mylist)
Bram Moolenaar5e66b422019-01-24 21:58:10 +01003165<
Bram Moolenaar5da36052021-12-27 15:39:57 +00003166 When {object} is a |List| and not making a copy, in
3167 legacy script Vim stores a reference to the next item
3168 in the |List| before executing the commands with the
3169 current item. Thus the current item can be removed
3170 without effect. Removing any later item means it will
3171 not be found. Thus the following example works (an
3172 inefficient way to make a |List| empty): >
Bram Moolenaar8f3f58f2010-01-06 20:52:26 +01003173 for item in mylist
3174 call remove(mylist, 0)
3175 endfor
Bram Moolenaar5e66b422019-01-24 21:58:10 +01003176< Note that reordering the |List| (e.g., with sort() or
Bram Moolenaar9588a0f2005-01-08 21:45:39 +00003177 reverse()) may have unexpected effects.
Bram Moolenaar5da36052021-12-27 15:39:57 +00003178 In |Vim9| script the index is used. If an item before
3179 the current one is deleted the next item will be
3180 skipped.
Bram Moolenaar12805862005-01-05 22:16:17 +00003181
Bram Moolenaar5e66b422019-01-24 21:58:10 +01003182 When {object} is a |Blob|, Vim always makes a copy to
3183 iterate over. Unlike with |List|, modifying the
3184 |Blob| does not affect the iteration.
3185
Bram Moolenaar9b03d3e2022-08-30 20:26:34 +01003186 When {object} is a |String| each item is a string with
3187 one character, plus any combining characters.
3188
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003189 In |Vim9| script `:endfor` cannot be shortened, to
3190 improve script readability.
3191
Bram Moolenaar12805862005-01-05 22:16:17 +00003192:for [{var1}, {var2}, ...] in {listlist}
Bram Moolenaarf10911e2022-01-29 22:20:48 +00003193:endfo[r] *E1140*
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003194 Like `:for` above, but each item in {listlist} must be
Bram Moolenaar12805862005-01-05 22:16:17 +00003195 a list, of which each item is assigned to {var1},
3196 {var2}, etc. Example: >
3197 :for [lnum, col] in [[1, 3], [2, 5], [3, 8]]
3198 :echo getline(lnum)[col]
3199 :endfor
3200<
Bram Moolenaar071d4272004-06-13 20:20:40 +00003201 *:continue* *:con* *E586*
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003202:con[tinue] When used inside a `:while` or `:for` loop, jumps back
Bram Moolenaar12805862005-01-05 22:16:17 +00003203 to the start of the loop.
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003204 If it is used after a `:try` inside the loop but
3205 before the matching `:finally` (if present), the
3206 commands following the `:finally` up to the matching
3207 `:endtry` are executed first. This process applies to
3208 all nested `:try`s inside the loop. The outermost
3209 `:endtry` then jumps back to the start of the loop.
Bram Moolenaar071d4272004-06-13 20:20:40 +00003210
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003211 In |Vim9| script `:cont` is the shortest form, to
3212 improve script readability.
Bram Moolenaar071d4272004-06-13 20:20:40 +00003213 *:break* *:brea* *E587*
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003214:brea[k] When used inside a `:while` or `:for` loop, skips to
3215 the command after the matching `:endwhile` or
3216 `:endfor`.
3217 If it is used after a `:try` inside the loop but
3218 before the matching `:finally` (if present), the
3219 commands following the `:finally` up to the matching
3220 `:endtry` are executed first. This process applies to
3221 all nested `:try`s inside the loop. The outermost
3222 `:endtry` then jumps to the command after the loop.
3223
3224 In |Vim9| script `:break` cannot be shortened, to
3225 improve script readability.
Bram Moolenaar071d4272004-06-13 20:20:40 +00003226
Bram Moolenaar6f4754b2022-01-23 12:07:04 +00003227:try *:try* *:endt* *:endtry*
3228 *E600* *E601* *E602* *E1032*
Bram Moolenaar071d4272004-06-13 20:20:40 +00003229:endt[ry] Change the error handling for the commands between
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003230 `:try` and `:endtry` including everything being
3231 executed across `:source` commands, function calls,
Bram Moolenaar071d4272004-06-13 20:20:40 +00003232 or autocommand invocations.
3233
3234 When an error or interrupt is detected and there is
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003235 a `:finally` command following, execution continues
3236 after the `:finally`. Otherwise, or when the
3237 `:endtry` is reached thereafter, the next
3238 (dynamically) surrounding `:try` is checked for
3239 a corresponding `:finally` etc. Then the script
Bram Moolenaarbc93ceb2020-02-26 13:36:21 +01003240 processing is terminated. Whether a function
3241 definition has an "abort" argument does not matter.
Bram Moolenaar071d4272004-06-13 20:20:40 +00003242 Example: >
Bram Moolenaarbc93ceb2020-02-26 13:36:21 +01003243 try | call Unknown() | finally | echomsg "cleanup" | endtry
3244 echomsg "not reached"
Bram Moolenaar071d4272004-06-13 20:20:40 +00003245<
3246 Moreover, an error or interrupt (dynamically) inside
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003247 `:try` and `:endtry` is converted to an exception. It
3248 can be caught as if it were thrown by a `:throw`
3249 command (see `:catch`). In this case, the script
Bram Moolenaar071d4272004-06-13 20:20:40 +00003250 processing is not terminated.
3251
3252 The value "Vim:Interrupt" is used for an interrupt
3253 exception. An error in a Vim command is converted
3254 to a value of the form "Vim({command}):{errmsg}",
3255 other errors are converted to a value of the form
3256 "Vim:{errmsg}". {command} is the full command name,
3257 and {errmsg} is the message that is displayed if the
3258 error exception is not caught, always beginning with
3259 the error number.
3260 Examples: >
Bram Moolenaarbc93ceb2020-02-26 13:36:21 +01003261 try | sleep 100 | catch /^Vim:Interrupt$/ | endtry
3262 try | edit | catch /^Vim(edit):E\d\+/ | echo "error" | endtry
Bram Moolenaar071d4272004-06-13 20:20:40 +00003263<
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003264 In |Vim9| script `:endtry` cannot be shortened, to
3265 improve script readability.
3266
Bram Moolenaar6f4754b2022-01-23 12:07:04 +00003267 *:cat* *:catch*
3268 *E603* *E604* *E605* *E654* *E1033*
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003269:cat[ch] /{pattern}/ The following commands until the next `:catch`,
3270 `:finally`, or `:endtry` that belongs to the same
3271 `:try` as the `:catch` are executed when an exception
Bram Moolenaar071d4272004-06-13 20:20:40 +00003272 matching {pattern} is being thrown and has not yet
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003273 been caught by a previous `:catch`. Otherwise, these
Bram Moolenaar071d4272004-06-13 20:20:40 +00003274 commands are skipped.
3275 When {pattern} is omitted all errors are caught.
3276 Examples: >
Bram Moolenaar647e24b2019-03-17 16:39:46 +01003277 :catch /^Vim:Interrupt$/ " catch interrupts (CTRL-C)
3278 :catch /^Vim\%((\a\+)\)\=:E/ " catch all Vim errors
3279 :catch /^Vim\%((\a\+)\)\=:/ " catch errors and interrupts
3280 :catch /^Vim(write):/ " catch all errors in :write
3281 :catch /^Vim\%((\a\+)\)\=:E123:/ " catch error E123
3282 :catch /my-exception/ " catch user exception
3283 :catch /.*/ " catch everything
3284 :catch " same as /.*/
Bram Moolenaar071d4272004-06-13 20:20:40 +00003285<
3286 Another character can be used instead of / around the
3287 {pattern}, so long as it does not have a special
3288 meaning (e.g., '|' or '"') and doesn't occur inside
Bram Moolenaar6f4754b2022-01-23 12:07:04 +00003289 {pattern}. *E1067*
Bram Moolenaar7e38ea22014-04-05 22:55:53 +02003290 Information about the exception is available in
3291 |v:exception|. Also see |throw-variables|.
Bram Moolenaar071d4272004-06-13 20:20:40 +00003292 NOTE: It is not reliable to ":catch" the TEXT of
3293 an error message because it may vary in different
3294 locales.
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003295 In |Vim9| script `:catch` cannot be shortened, to
3296 improve script readability.
Bram Moolenaar071d4272004-06-13 20:20:40 +00003297
3298 *:fina* *:finally* *E606* *E607*
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003299:fina[lly] The following commands until the matching `:endtry`
Bram Moolenaar071d4272004-06-13 20:20:40 +00003300 are executed whenever the part between the matching
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003301 `:try` and the `:finally` is left: either by falling
3302 through to the `:finally` or by a `:continue`,
3303 `:break`, `:finish`, or `:return`, or by an error or
3304 interrupt or exception (see `:throw`).
3305
3306 In |Vim9| script `:finally` cannot be shortened, to
3307 improve script readability and avoid confusion with
3308 `:final`.
Bram Moolenaar071d4272004-06-13 20:20:40 +00003309
Bram Moolenaarf10911e2022-01-29 22:20:48 +00003310 *:th* *:throw* *E608* *E1129*
Bram Moolenaar071d4272004-06-13 20:20:40 +00003311:th[row] {expr1} The {expr1} is evaluated and thrown as an exception.
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003312 If the ":throw" is used after a `:try` but before the
3313 first corresponding `:catch`, commands are skipped
3314 until the first `:catch` matching {expr1} is reached.
3315 If there is no such `:catch` or if the ":throw" is
3316 used after a `:catch` but before the `:finally`, the
3317 commands following the `:finally` (if present) up to
3318 the matching `:endtry` are executed. If the `:throw`
3319 is after the `:finally`, commands up to the `:endtry`
Bram Moolenaar071d4272004-06-13 20:20:40 +00003320 are skipped. At the ":endtry", this process applies
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003321 again for the next dynamically surrounding `:try`
Bram Moolenaar071d4272004-06-13 20:20:40 +00003322 (which may be found in a calling function or sourcing
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003323 script), until a matching `:catch` has been found.
Bram Moolenaar071d4272004-06-13 20:20:40 +00003324 If the exception is not caught, the command processing
3325 is terminated.
3326 Example: >
3327 :try | throw "oops" | catch /^oo/ | echo "caught" | endtry
Bram Moolenaar662db672011-03-22 14:05:35 +01003328< Note that "catch" may need to be on a separate line
3329 for when an error causes the parsing to skip the whole
3330 line and not see the "|" that separates the commands.
Bram Moolenaar071d4272004-06-13 20:20:40 +00003331
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003332 In |Vim9| script `:throw` cannot be shortened, to
3333 improve script readability.
3334
Bram Moolenaar071d4272004-06-13 20:20:40 +00003335 *:ec* *:echo*
3336:ec[ho] {expr1} .. Echoes each {expr1}, with a space in between. The
3337 first {expr1} starts on a new line.
3338 Also see |:comment|.
3339 Use "\n" to start a new line. Use "\r" to move the
3340 cursor to the first column.
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003341 Uses the highlighting set by the `:echohl` command.
Bram Moolenaar071d4272004-06-13 20:20:40 +00003342 Cannot be followed by a comment.
3343 Example: >
3344 :echo "the value of 'shell' is" &shell
Bram Moolenaaref2f6562007-05-06 13:32:59 +00003345< *:echo-redraw*
3346 A later redraw may make the message disappear again.
3347 And since Vim mostly postpones redrawing until it's
3348 finished with a sequence of commands this happens
3349 quite often. To avoid that a command from before the
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003350 `:echo` causes a redraw afterwards (redraws are often
Bram Moolenaaref2f6562007-05-06 13:32:59 +00003351 postponed until you type something), force a redraw
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003352 with the `:redraw` command. Example: >
Bram Moolenaar071d4272004-06-13 20:20:40 +00003353 :new | redraw | echo "there is a new window"
3354<
3355 *:echon*
3356:echon {expr1} .. Echoes each {expr1}, without anything added. Also see
3357 |:comment|.
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003358 Uses the highlighting set by the `:echohl` command.
Bram Moolenaar071d4272004-06-13 20:20:40 +00003359 Cannot be followed by a comment.
3360 Example: >
3361 :echon "the value of 'shell' is " &shell
3362<
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003363 Note the difference between using `:echo`, which is a
3364 Vim command, and `:!echo`, which is an external shell
Bram Moolenaar071d4272004-06-13 20:20:40 +00003365 command: >
3366 :!echo % --> filename
3367< The arguments of ":!" are expanded, see |:_%|. >
3368 :!echo "%" --> filename or "filename"
3369< Like the previous example. Whether you see the double
3370 quotes or not depends on your 'shell'. >
3371 :echo % --> nothing
3372< The '%' is an illegal character in an expression. >
3373 :echo "%" --> %
3374< This just echoes the '%' character. >
3375 :echo expand("%") --> filename
3376< This calls the expand() function to expand the '%'.
3377
3378 *:echoh* *:echohl*
3379:echoh[l] {name} Use the highlight group {name} for the following
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003380 `:echo`, `:echon` and `:echomsg` commands. Also used
3381 for the `input()` prompt. Example: >
Bram Moolenaar071d4272004-06-13 20:20:40 +00003382 :echohl WarningMsg | echo "Don't panic!" | echohl None
3383< Don't forget to set the group back to "None",
3384 otherwise all following echo's will be highlighted.
3385
3386 *:echom* *:echomsg*
3387:echom[sg] {expr1} .. Echo the expression(s) as a true message, saving the
3388 message in the |message-history|.
3389 Spaces are placed between the arguments as with the
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003390 `:echo` command. But unprintable characters are
Bram Moolenaar071d4272004-06-13 20:20:40 +00003391 displayed, not interpreted.
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003392 The parsing works slightly different from `:echo`,
3393 more like `:execute`. All the expressions are first
Bram Moolenaaref2f6562007-05-06 13:32:59 +00003394 evaluated and concatenated before echoing anything.
Bram Moolenaar461a7fc2018-12-22 13:28:07 +01003395 If expressions does not evaluate to a Number or
3396 String, string() is used to turn it into a string.
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003397 Uses the highlighting set by the `:echohl` command.
Bram Moolenaar071d4272004-06-13 20:20:40 +00003398 Example: >
3399 :echomsg "It's a Zizzer Zazzer Zuzz, as you can plainly see."
Bram Moolenaaref2f6562007-05-06 13:32:59 +00003400< See |:echo-redraw| to avoid the message disappearing
3401 when the screen is redrawn.
Bram Moolenaar37fef162022-08-29 18:16:32 +01003402
3403 *:echow* *:echowin* *:echowindow*
Bram Moolenaarbdc09a12022-10-07 14:31:45 +01003404:[N]echow[indow] {expr1} ..
Bram Moolenaar37fef162022-08-29 18:16:32 +01003405 Like |:echomsg| but when the messages popup window is
3406 available the message is displayed there. This means
3407 it will show for three seconds and avoid a
Bram Moolenaar9b03d3e2022-08-30 20:26:34 +01003408 |hit-enter| prompt. If you want to hide it before
3409 that, press Esc in Normal mode (when it would
Bram Moolenaar71b6d332022-09-10 13:13:14 +01003410 otherwise beep). If it disappears too soon you can
3411 use `:messages` to see the text.
Bram Moolenaarbdc09a12022-10-07 14:31:45 +01003412 When [N] is given then the window will show up for
3413 this number of seconds. The last `:echowindow` with a
3414 count matters, it is used once only.
Bram Moolenaar37fef162022-08-29 18:16:32 +01003415 The message window is available when Vim was compiled
3416 with the +timer and the +popupwin features.
3417
Bram Moolenaar071d4272004-06-13 20:20:40 +00003418 *:echoe* *:echoerr*
3419:echoe[rr] {expr1} .. Echo the expression(s) as an error message, saving the
3420 message in the |message-history|. When used in a
3421 script or function the line number will be added.
3422 Spaces are placed between the arguments as with the
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003423 `:echomsg` command. When used inside a try conditional,
Bram Moolenaar071d4272004-06-13 20:20:40 +00003424 the message is raised as an error exception instead
3425 (see |try-echoerr|).
3426 Example: >
3427 :echoerr "This script just failed!"
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003428< If you just want a highlighted message use `:echohl`.
Bram Moolenaar071d4272004-06-13 20:20:40 +00003429 And to get a beep: >
3430 :exe "normal \<Esc>"
Bram Moolenaar4c868302021-03-22 16:19:45 +01003431
3432:echoc[onsole] {expr1} .. *:echoc* *:echoconsole*
3433 Intended for testing: works like `:echomsg` but when
3434 running in the GUI and started from a terminal write
3435 the text to stdout.
3436
Bram Moolenaar09c6f262019-11-17 15:55:14 +01003437 *:eval*
3438:eval {expr} Evaluate {expr} and discard the result. Example: >
3439 :eval Getlist()->Filter()->append('$')
3440
3441< The expression is supposed to have a side effect,
3442 since the resulting value is not used. In the example
3443 the `append()` call appends the List with text to the
3444 buffer. This is similar to `:call` but works with any
3445 expression.
Bram Moolenaara2baa732022-02-04 16:09:54 +00003446 In |Vim9| script an expression without an effect will
3447 result in error *E1207* . This should help noticing
3448 mistakes.
Bram Moolenaar09c6f262019-11-17 15:55:14 +01003449
3450 The command can be shortened to `:ev` or `:eva`, but
3451 these are hard to recognize and therefore not to be
3452 used.
3453
Bram Moolenaarbc93ceb2020-02-26 13:36:21 +01003454 The command cannot be followed by "|" and another
3455 command, since "|" is seen as part of the expression.
3456
Bram Moolenaar09c6f262019-11-17 15:55:14 +01003457
Bram Moolenaar071d4272004-06-13 20:20:40 +00003458 *:exe* *:execute*
3459:exe[cute] {expr1} .. Executes the string that results from the evaluation
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003460 of {expr1} as an Ex command.
3461 Multiple arguments are concatenated, with a space in
Bram Moolenaar7e6a5152021-01-02 16:39:53 +01003462 between. To avoid the extra space use the ".."
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003463 operator to concatenate strings into one argument.
3464 {expr1} is used as the processed command, command line
3465 editing keys are not recognized.
Bram Moolenaar071d4272004-06-13 20:20:40 +00003466 Cannot be followed by a comment.
3467 Examples: >
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003468 :execute "buffer" nextbuf
Bram Moolenaarc8cdf0f2021-03-13 13:28:13 +01003469 :execute "normal" count .. "w"
Bram Moolenaar071d4272004-06-13 20:20:40 +00003470<
3471 ":execute" can be used to append a command to commands
3472 that don't accept a '|'. Example: >
3473 :execute '!ls' | echo "theend"
3474
3475< ":execute" is also a nice way to avoid having to type
3476 control characters in a Vim script for a ":normal"
3477 command: >
3478 :execute "normal ixxx\<Esc>"
3479< This has an <Esc> character, see |expr-string|.
3480
Bram Moolenaar446cb832008-06-24 21:56:24 +00003481 Be careful to correctly escape special characters in
3482 file names. The |fnameescape()| function can be used
Bram Moolenaar05bb9532008-07-04 09:44:11 +00003483 for Vim commands, |shellescape()| for |:!| commands.
3484 Examples: >
Bram Moolenaarc8cdf0f2021-03-13 13:28:13 +01003485 :execute "e " .. fnameescape(filename)
3486 :execute "!ls " .. shellescape(filename, 1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00003487<
Bram Moolenaar071d4272004-06-13 20:20:40 +00003488 Note: The executed string may be any command-line, but
Bram Moolenaar76f3b1a2014-03-27 22:30:07 +01003489 starting or ending "if", "while" and "for" does not
3490 always work, because when commands are skipped the
3491 ":execute" is not evaluated and Vim loses track of
3492 where blocks start and end. Also "break" and
3493 "continue" should not be inside ":execute".
3494 This example does not work, because the ":execute" is
3495 not evaluated and Vim does not see the "while", and
3496 gives an error for finding an ":endwhile": >
3497 :if 0
3498 : execute 'while i > 5'
3499 : echo "test"
3500 : endwhile
3501 :endif
Bram Moolenaar071d4272004-06-13 20:20:40 +00003502<
3503 It is allowed to have a "while" or "if" command
3504 completely in the executed string: >
3505 :execute 'while i < 5 | echo i | let i = i + 1 | endwhile'
3506<
3507
Bram Moolenaar8f3f58f2010-01-06 20:52:26 +01003508 *:exe-comment*
Bram Moolenaar071d4272004-06-13 20:20:40 +00003509 ":execute", ":echo" and ":echon" cannot be followed by
3510 a comment directly, because they see the '"' as the
3511 start of a string. But, you can use '|' followed by a
3512 comment. Example: >
3513 :echo "foo" | "this is a comment
3514
3515==============================================================================
35168. Exception handling *exception-handling*
3517
3518The Vim script language comprises an exception handling feature. This section
3519explains how it can be used in a Vim script.
3520
3521Exceptions may be raised by Vim on an error or on interrupt, see
3522|catch-errors| and |catch-interrupt|. You can also explicitly throw an
3523exception by using the ":throw" command, see |throw-catch|.
3524
3525
3526TRY CONDITIONALS *try-conditionals*
3527
3528Exceptions can be caught or can cause cleanup code to be executed. You can
3529use a try conditional to specify catch clauses (that catch exceptions) and/or
3530a finally clause (to be executed for cleanup).
3531 A try conditional begins with a |:try| command and ends at the matching
3532|:endtry| command. In between, you can use a |:catch| command to start
3533a catch clause, or a |:finally| command to start a finally clause. There may
3534be none or multiple catch clauses, but there is at most one finally clause,
3535which must not be followed by any catch clauses. The lines before the catch
3536clauses and the finally clause is called a try block. >
3537
3538 :try
Bram Moolenaar446cb832008-06-24 21:56:24 +00003539 : ...
3540 : ... TRY BLOCK
3541 : ...
Bram Moolenaar071d4272004-06-13 20:20:40 +00003542 :catch /{pattern}/
Bram Moolenaar446cb832008-06-24 21:56:24 +00003543 : ...
3544 : ... CATCH CLAUSE
3545 : ...
Bram Moolenaar071d4272004-06-13 20:20:40 +00003546 :catch /{pattern}/
Bram Moolenaar446cb832008-06-24 21:56:24 +00003547 : ...
3548 : ... CATCH CLAUSE
3549 : ...
Bram Moolenaar071d4272004-06-13 20:20:40 +00003550 :finally
Bram Moolenaar446cb832008-06-24 21:56:24 +00003551 : ...
3552 : ... FINALLY CLAUSE
3553 : ...
Bram Moolenaar071d4272004-06-13 20:20:40 +00003554 :endtry
3555
3556The try conditional allows to watch code for exceptions and to take the
3557appropriate actions. Exceptions from the try block may be caught. Exceptions
3558from the try block and also the catch clauses may cause cleanup actions.
3559 When no exception is thrown during execution of the try block, the control
3560is transferred to the finally clause, if present. After its execution, the
3561script continues with the line following the ":endtry".
3562 When an exception occurs during execution of the try block, the remaining
3563lines in the try block are skipped. The exception is matched against the
3564patterns specified as arguments to the ":catch" commands. The catch clause
3565after the first matching ":catch" is taken, other catch clauses are not
3566executed. The catch clause ends when the next ":catch", ":finally", or
3567":endtry" command is reached - whatever is first. Then, the finally clause
3568(if present) is executed. When the ":endtry" is reached, the script execution
3569continues in the following line as usual.
3570 When an exception that does not match any of the patterns specified by the
3571":catch" commands is thrown in the try block, the exception is not caught by
3572that try conditional and none of the catch clauses is executed. Only the
3573finally clause, if present, is taken. The exception pends during execution of
3574the finally clause. It is resumed at the ":endtry", so that commands after
3575the ":endtry" are not executed and the exception might be caught elsewhere,
3576see |try-nesting|.
3577 When during execution of a catch clause another exception is thrown, the
Bram Moolenaar58b85342016-08-14 19:54:54 +02003578remaining lines in that catch clause are not executed. The new exception is
Bram Moolenaar071d4272004-06-13 20:20:40 +00003579not matched against the patterns in any of the ":catch" commands of the same
3580try conditional and none of its catch clauses is taken. If there is, however,
3581a finally clause, it is executed, and the exception pends during its
3582execution. The commands following the ":endtry" are not executed. The new
3583exception might, however, be caught elsewhere, see |try-nesting|.
3584 When during execution of the finally clause (if present) an exception is
Bram Moolenaar58b85342016-08-14 19:54:54 +02003585thrown, the remaining lines in the finally clause are skipped. If the finally
Bram Moolenaar071d4272004-06-13 20:20:40 +00003586clause has been taken because of an exception from the try block or one of the
3587catch clauses, the original (pending) exception is discarded. The commands
3588following the ":endtry" are not executed, and the exception from the finally
3589clause is propagated and can be caught elsewhere, see |try-nesting|.
3590
3591The finally clause is also executed, when a ":break" or ":continue" for
3592a ":while" loop enclosing the complete try conditional is executed from the
3593try block or a catch clause. Or when a ":return" or ":finish" is executed
3594from the try block or a catch clause of a try conditional in a function or
3595sourced script, respectively. The ":break", ":continue", ":return", or
3596":finish" pends during execution of the finally clause and is resumed when the
3597":endtry" is reached. It is, however, discarded when an exception is thrown
3598from the finally clause.
3599 When a ":break" or ":continue" for a ":while" loop enclosing the complete
3600try conditional or when a ":return" or ":finish" is encountered in the finally
3601clause, the rest of the finally clause is skipped, and the ":break",
3602":continue", ":return" or ":finish" is executed as usual. If the finally
3603clause has been taken because of an exception or an earlier ":break",
3604":continue", ":return", or ":finish" from the try block or a catch clause,
3605this pending exception or command is discarded.
3606
3607For examples see |throw-catch| and |try-finally|.
3608
3609
Bram Moolenaar76db9e02022-11-09 21:21:04 +00003610NESTING OF TRY CONDITIONALS *try-nesting*
Bram Moolenaar071d4272004-06-13 20:20:40 +00003611
3612Try conditionals can be nested arbitrarily. That is, a complete try
3613conditional can be put into the try block, a catch clause, or the finally
3614clause of another try conditional. If the inner try conditional does not
3615catch an exception thrown in its try block or throws a new exception from one
3616of its catch clauses or its finally clause, the outer try conditional is
3617checked according to the rules above. If the inner try conditional is in the
3618try block of the outer try conditional, its catch clauses are checked, but
Bram Moolenaar58b85342016-08-14 19:54:54 +02003619otherwise only the finally clause is executed. It does not matter for
Bram Moolenaar071d4272004-06-13 20:20:40 +00003620nesting, whether the inner try conditional is directly contained in the outer
3621one, or whether the outer one sources a script or calls a function containing
3622the inner try conditional.
3623
3624When none of the active try conditionals catches an exception, just their
3625finally clauses are executed. Thereafter, the script processing terminates.
3626An error message is displayed in case of an uncaught exception explicitly
3627thrown by a ":throw" command. For uncaught error and interrupt exceptions
3628implicitly raised by Vim, the error message(s) or interrupt message are shown
3629as usual.
3630
3631For examples see |throw-catch|.
3632
3633
3634EXAMINING EXCEPTION HANDLING CODE *except-examine*
3635
3636Exception handling code can get tricky. If you are in doubt what happens, set
3637'verbose' to 13 or use the ":13verbose" command modifier when sourcing your
3638script file. Then you see when an exception is thrown, discarded, caught, or
3639finished. When using a verbosity level of at least 14, things pending in
3640a finally clause are also shown. This information is also given in debug mode
3641(see |debug-scripts|).
3642
3643
3644THROWING AND CATCHING EXCEPTIONS *throw-catch*
3645
3646You can throw any number or string as an exception. Use the |:throw| command
3647and pass the value to be thrown as argument: >
3648 :throw 4711
3649 :throw "string"
3650< *throw-expression*
3651You can also specify an expression argument. The expression is then evaluated
3652first, and the result is thrown: >
3653 :throw 4705 + strlen("string")
3654 :throw strpart("strings", 0, 6)
3655
3656An exception might be thrown during evaluation of the argument of the ":throw"
3657command. Unless it is caught there, the expression evaluation is abandoned.
3658The ":throw" command then does not throw a new exception.
3659 Example: >
3660
3661 :function! Foo(arg)
3662 : try
3663 : throw a:arg
3664 : catch /foo/
3665 : endtry
3666 : return 1
3667 :endfunction
3668 :
3669 :function! Bar()
3670 : echo "in Bar"
3671 : return 4710
3672 :endfunction
3673 :
3674 :throw Foo("arrgh") + Bar()
3675
3676This throws "arrgh", and "in Bar" is not displayed since Bar() is not
3677executed. >
3678 :throw Foo("foo") + Bar()
3679however displays "in Bar" and throws 4711.
3680
3681Any other command that takes an expression as argument might also be
Bram Moolenaar58b85342016-08-14 19:54:54 +02003682abandoned by an (uncaught) exception during the expression evaluation. The
Bram Moolenaar071d4272004-06-13 20:20:40 +00003683exception is then propagated to the caller of the command.
3684 Example: >
3685
3686 :if Foo("arrgh")
3687 : echo "then"
3688 :else
3689 : echo "else"
3690 :endif
3691
3692Here neither of "then" or "else" is displayed.
3693
3694 *catch-order*
3695Exceptions can be caught by a try conditional with one or more |:catch|
3696commands, see |try-conditionals|. The values to be caught by each ":catch"
3697command can be specified as a pattern argument. The subsequent catch clause
3698gets executed when a matching exception is caught.
3699 Example: >
3700
3701 :function! Foo(value)
3702 : try
3703 : throw a:value
3704 : catch /^\d\+$/
3705 : echo "Number thrown"
3706 : catch /.*/
3707 : echo "String thrown"
3708 : endtry
3709 :endfunction
3710 :
3711 :call Foo(0x1267)
3712 :call Foo('string')
3713
3714The first call to Foo() displays "Number thrown", the second "String thrown".
3715An exception is matched against the ":catch" commands in the order they are
3716specified. Only the first match counts. So you should place the more
3717specific ":catch" first. The following order does not make sense: >
3718
3719 : catch /.*/
3720 : echo "String thrown"
3721 : catch /^\d\+$/
3722 : echo "Number thrown"
3723
3724The first ":catch" here matches always, so that the second catch clause is
3725never taken.
3726
3727 *throw-variables*
3728If you catch an exception by a general pattern, you may access the exact value
3729in the variable |v:exception|: >
3730
3731 : catch /^\d\+$/
3732 : echo "Number thrown. Value is" v:exception
3733
3734You may also be interested where an exception was thrown. This is stored in
3735|v:throwpoint|. Note that "v:exception" and "v:throwpoint" are valid for the
3736exception most recently caught as long it is not finished.
3737 Example: >
3738
3739 :function! Caught()
3740 : if v:exception != ""
Bram Moolenaarc51cf032022-02-26 12:25:45 +00003741 : echo 'Caught "' . v:exception .. '" in ' .. v:throwpoint
Bram Moolenaar071d4272004-06-13 20:20:40 +00003742 : else
3743 : echo 'Nothing caught'
3744 : endif
3745 :endfunction
3746 :
3747 :function! Foo()
3748 : try
3749 : try
3750 : try
3751 : throw 4711
3752 : finally
3753 : call Caught()
3754 : endtry
3755 : catch /.*/
3756 : call Caught()
3757 : throw "oops"
3758 : endtry
3759 : catch /.*/
3760 : call Caught()
3761 : finally
3762 : call Caught()
3763 : endtry
3764 :endfunction
3765 :
3766 :call Foo()
3767
3768This displays >
3769
3770 Nothing caught
3771 Caught "4711" in function Foo, line 4
3772 Caught "oops" in function Foo, line 10
3773 Nothing caught
3774
3775A practical example: The following command ":LineNumber" displays the line
3776number in the script or function where it has been used: >
3777
3778 :function! LineNumber()
3779 : return substitute(v:throwpoint, '.*\D\(\d\+\).*', '\1', "")
3780 :endfunction
3781 :command! LineNumber try | throw "" | catch | echo LineNumber() | endtry
3782<
3783 *try-nested*
3784An exception that is not caught by a try conditional can be caught by
3785a surrounding try conditional: >
3786
3787 :try
3788 : try
3789 : throw "foo"
3790 : catch /foobar/
3791 : echo "foobar"
3792 : finally
3793 : echo "inner finally"
3794 : endtry
3795 :catch /foo/
3796 : echo "foo"
3797 :endtry
3798
3799The inner try conditional does not catch the exception, just its finally
3800clause is executed. The exception is then caught by the outer try
3801conditional. The example displays "inner finally" and then "foo".
3802
3803 *throw-from-catch*
3804You can catch an exception and throw a new one to be caught elsewhere from the
3805catch clause: >
3806
3807 :function! Foo()
3808 : throw "foo"
3809 :endfunction
3810 :
3811 :function! Bar()
3812 : try
3813 : call Foo()
3814 : catch /foo/
3815 : echo "Caught foo, throw bar"
3816 : throw "bar"
3817 : endtry
3818 :endfunction
3819 :
3820 :try
3821 : call Bar()
3822 :catch /.*/
3823 : echo "Caught" v:exception
3824 :endtry
3825
3826This displays "Caught foo, throw bar" and then "Caught bar".
3827
3828 *rethrow*
3829There is no real rethrow in the Vim script language, but you may throw
3830"v:exception" instead: >
3831
3832 :function! Bar()
3833 : try
3834 : call Foo()
3835 : catch /.*/
3836 : echo "Rethrow" v:exception
3837 : throw v:exception
3838 : endtry
3839 :endfunction
3840< *try-echoerr*
3841Note that this method cannot be used to "rethrow" Vim error or interrupt
3842exceptions, because it is not possible to fake Vim internal exceptions.
3843Trying so causes an error exception. You should throw your own exception
3844denoting the situation. If you want to cause a Vim error exception containing
3845the original error exception value, you can use the |:echoerr| command: >
3846
3847 :try
3848 : try
3849 : asdf
3850 : catch /.*/
3851 : echoerr v:exception
3852 : endtry
3853 :catch /.*/
3854 : echo v:exception
3855 :endtry
3856
3857This code displays
3858
Bram Moolenaar446cb832008-06-24 21:56:24 +00003859 Vim(echoerr):Vim:E492: Not an editor command: asdf ~
Bram Moolenaar071d4272004-06-13 20:20:40 +00003860
3861
3862CLEANUP CODE *try-finally*
3863
3864Scripts often change global settings and restore them at their end. If the
3865user however interrupts the script by pressing CTRL-C, the settings remain in
Bram Moolenaar58b85342016-08-14 19:54:54 +02003866an inconsistent state. The same may happen to you in the development phase of
Bram Moolenaar071d4272004-06-13 20:20:40 +00003867a script when an error occurs or you explicitly throw an exception without
3868catching it. You can solve these problems by using a try conditional with
3869a finally clause for restoring the settings. Its execution is guaranteed on
3870normal control flow, on error, on an explicit ":throw", and on interrupt.
3871(Note that errors and interrupts from inside the try conditional are converted
Bram Moolenaar58b85342016-08-14 19:54:54 +02003872to exceptions. When not caught, they terminate the script after the finally
Bram Moolenaar071d4272004-06-13 20:20:40 +00003873clause has been executed.)
3874Example: >
3875
3876 :try
3877 : let s:saved_ts = &ts
3878 : set ts=17
3879 :
3880 : " Do the hard work here.
3881 :
3882 :finally
3883 : let &ts = s:saved_ts
3884 : unlet s:saved_ts
3885 :endtry
3886
3887This method should be used locally whenever a function or part of a script
3888changes global settings which need to be restored on failure or normal exit of
3889that function or script part.
3890
3891 *break-finally*
3892Cleanup code works also when the try block or a catch clause is left by
3893a ":continue", ":break", ":return", or ":finish".
3894 Example: >
3895
3896 :let first = 1
3897 :while 1
3898 : try
3899 : if first
3900 : echo "first"
3901 : let first = 0
3902 : continue
3903 : else
3904 : throw "second"
3905 : endif
3906 : catch /.*/
3907 : echo v:exception
3908 : break
3909 : finally
3910 : echo "cleanup"
3911 : endtry
3912 : echo "still in while"
3913 :endwhile
3914 :echo "end"
3915
3916This displays "first", "cleanup", "second", "cleanup", and "end". >
3917
3918 :function! Foo()
3919 : try
3920 : return 4711
3921 : finally
3922 : echo "cleanup\n"
3923 : endtry
3924 : echo "Foo still active"
3925 :endfunction
3926 :
3927 :echo Foo() "returned by Foo"
3928
3929This displays "cleanup" and "4711 returned by Foo". You don't need to add an
Bram Moolenaar58b85342016-08-14 19:54:54 +02003930extra ":return" in the finally clause. (Above all, this would override the
Bram Moolenaar071d4272004-06-13 20:20:40 +00003931return value.)
3932
3933 *except-from-finally*
3934Using either of ":continue", ":break", ":return", ":finish", or ":throw" in
3935a finally clause is possible, but not recommended since it abandons the
3936cleanup actions for the try conditional. But, of course, interrupt and error
3937exceptions might get raised from a finally clause.
3938 Example where an error in the finally clause stops an interrupt from
3939working correctly: >
3940
3941 :try
3942 : try
3943 : echo "Press CTRL-C for interrupt"
3944 : while 1
3945 : endwhile
3946 : finally
3947 : unlet novar
3948 : endtry
3949 :catch /novar/
3950 :endtry
3951 :echo "Script still running"
3952 :sleep 1
3953
3954If you need to put commands that could fail into a finally clause, you should
3955think about catching or ignoring the errors in these commands, see
3956|catch-errors| and |ignore-errors|.
3957
3958
3959CATCHING ERRORS *catch-errors*
3960
3961If you want to catch specific errors, you just have to put the code to be
3962watched in a try block and add a catch clause for the error message. The
3963presence of the try conditional causes all errors to be converted to an
3964exception. No message is displayed and |v:errmsg| is not set then. To find
3965the right pattern for the ":catch" command, you have to know how the format of
3966the error exception is.
3967 Error exceptions have the following format: >
3968
3969 Vim({cmdname}):{errmsg}
3970or >
3971 Vim:{errmsg}
3972
3973{cmdname} is the name of the command that failed; the second form is used when
Bram Moolenaar58b85342016-08-14 19:54:54 +02003974the command name is not known. {errmsg} is the error message usually produced
Bram Moolenaar071d4272004-06-13 20:20:40 +00003975when the error occurs outside try conditionals. It always begins with
3976a capital "E", followed by a two or three-digit error number, a colon, and
3977a space.
3978
3979Examples:
3980
3981The command >
3982 :unlet novar
3983normally produces the error message >
3984 E108: No such variable: "novar"
3985which is converted inside try conditionals to an exception >
3986 Vim(unlet):E108: No such variable: "novar"
3987
3988The command >
3989 :dwim
3990normally produces the error message >
3991 E492: Not an editor command: dwim
3992which is converted inside try conditionals to an exception >
3993 Vim:E492: Not an editor command: dwim
3994
3995You can catch all ":unlet" errors by a >
3996 :catch /^Vim(unlet):/
3997or all errors for misspelled command names by a >
3998 :catch /^Vim:E492:/
3999
4000Some error messages may be produced by different commands: >
4001 :function nofunc
4002and >
4003 :delfunction nofunc
4004both produce the error message >
4005 E128: Function name must start with a capital: nofunc
4006which is converted inside try conditionals to an exception >
4007 Vim(function):E128: Function name must start with a capital: nofunc
4008or >
4009 Vim(delfunction):E128: Function name must start with a capital: nofunc
4010respectively. You can catch the error by its number independently on the
4011command that caused it if you use the following pattern: >
4012 :catch /^Vim(\a\+):E128:/
4013
4014Some commands like >
4015 :let x = novar
4016produce multiple error messages, here: >
4017 E121: Undefined variable: novar
4018 E15: Invalid expression: novar
4019Only the first is used for the exception value, since it is the most specific
4020one (see |except-several-errors|). So you can catch it by >
4021 :catch /^Vim(\a\+):E121:/
4022
4023You can catch all errors related to the name "nofunc" by >
4024 :catch /\<nofunc\>/
4025
4026You can catch all Vim errors in the ":write" and ":read" commands by >
4027 :catch /^Vim(\(write\|read\)):E\d\+:/
4028
4029You can catch all Vim errors by the pattern >
4030 :catch /^Vim\((\a\+)\)\=:E\d\+:/
4031<
4032 *catch-text*
4033NOTE: You should never catch the error message text itself: >
4034 :catch /No such variable/
Bram Moolenaar2b8388b2015-02-28 13:11:45 +01004035only works in the English locale, but not when the user has selected
Bram Moolenaar071d4272004-06-13 20:20:40 +00004036a different language by the |:language| command. It is however helpful to
4037cite the message text in a comment: >
4038 :catch /^Vim(\a\+):E108:/ " No such variable
4039
4040
4041IGNORING ERRORS *ignore-errors*
4042
4043You can ignore errors in a specific Vim command by catching them locally: >
4044
4045 :try
4046 : write
4047 :catch
4048 :endtry
4049
4050But you are strongly recommended NOT to use this simple form, since it could
4051catch more than you want. With the ":write" command, some autocommands could
4052be executed and cause errors not related to writing, for instance: >
4053
4054 :au BufWritePre * unlet novar
4055
4056There could even be such errors you are not responsible for as a script
4057writer: a user of your script might have defined such autocommands. You would
4058then hide the error from the user.
4059 It is much better to use >
4060
4061 :try
4062 : write
4063 :catch /^Vim(write):/
4064 :endtry
4065
4066which only catches real write errors. So catch only what you'd like to ignore
4067intentionally.
4068
4069For a single command that does not cause execution of autocommands, you could
4070even suppress the conversion of errors to exceptions by the ":silent!"
4071command: >
4072 :silent! nunmap k
4073This works also when a try conditional is active.
4074
4075
4076CATCHING INTERRUPTS *catch-interrupt*
4077
4078When there are active try conditionals, an interrupt (CTRL-C) is converted to
Bram Moolenaar58b85342016-08-14 19:54:54 +02004079the exception "Vim:Interrupt". You can catch it like every exception. The
Bram Moolenaar071d4272004-06-13 20:20:40 +00004080script is not terminated, then.
4081 Example: >
4082
4083 :function! TASK1()
4084 : sleep 10
4085 :endfunction
4086
4087 :function! TASK2()
4088 : sleep 20
4089 :endfunction
4090
4091 :while 1
4092 : let command = input("Type a command: ")
4093 : try
4094 : if command == ""
4095 : continue
4096 : elseif command == "END"
4097 : break
4098 : elseif command == "TASK1"
4099 : call TASK1()
4100 : elseif command == "TASK2"
4101 : call TASK2()
4102 : else
4103 : echo "\nIllegal command:" command
4104 : continue
4105 : endif
4106 : catch /^Vim:Interrupt$/
4107 : echo "\nCommand interrupted"
4108 : " Caught the interrupt. Continue with next prompt.
4109 : endtry
4110 :endwhile
4111
4112You can interrupt a task here by pressing CTRL-C; the script then asks for
Bram Moolenaar58b85342016-08-14 19:54:54 +02004113a new command. If you press CTRL-C at the prompt, the script is terminated.
Bram Moolenaar071d4272004-06-13 20:20:40 +00004114
4115For testing what happens when CTRL-C would be pressed on a specific line in
4116your script, use the debug mode and execute the |>quit| or |>interrupt|
4117command on that line. See |debug-scripts|.
4118
4119
4120CATCHING ALL *catch-all*
4121
4122The commands >
4123
4124 :catch /.*/
4125 :catch //
4126 :catch
4127
4128catch everything, error exceptions, interrupt exceptions and exceptions
4129explicitly thrown by the |:throw| command. This is useful at the top level of
4130a script in order to catch unexpected things.
4131 Example: >
4132
4133 :try
4134 :
4135 : " do the hard work here
4136 :
4137 :catch /MyException/
4138 :
4139 : " handle known problem
4140 :
4141 :catch /^Vim:Interrupt$/
4142 : echo "Script interrupted"
4143 :catch /.*/
Bram Moolenaarc51cf032022-02-26 12:25:45 +00004144 : echo "Internal error (" .. v:exception .. ")"
4145 : echo " - occurred at " .. v:throwpoint
Bram Moolenaar071d4272004-06-13 20:20:40 +00004146 :endtry
4147 :" end of script
4148
4149Note: Catching all might catch more things than you want. Thus, you are
4150strongly encouraged to catch only for problems that you can really handle by
4151specifying a pattern argument to the ":catch".
4152 Example: Catching all could make it nearly impossible to interrupt a script
4153by pressing CTRL-C: >
4154
4155 :while 1
4156 : try
4157 : sleep 1
4158 : catch
4159 : endtry
4160 :endwhile
4161
4162
4163EXCEPTIONS AND AUTOCOMMANDS *except-autocmd*
4164
4165Exceptions may be used during execution of autocommands. Example: >
4166
4167 :autocmd User x try
4168 :autocmd User x throw "Oops!"
4169 :autocmd User x catch
4170 :autocmd User x echo v:exception
4171 :autocmd User x endtry
4172 :autocmd User x throw "Arrgh!"
4173 :autocmd User x echo "Should not be displayed"
4174 :
4175 :try
4176 : doautocmd User x
4177 :catch
4178 : echo v:exception
4179 :endtry
4180
4181This displays "Oops!" and "Arrgh!".
4182
4183 *except-autocmd-Pre*
4184For some commands, autocommands get executed before the main action of the
4185command takes place. If an exception is thrown and not caught in the sequence
4186of autocommands, the sequence and the command that caused its execution are
4187abandoned and the exception is propagated to the caller of the command.
4188 Example: >
4189
4190 :autocmd BufWritePre * throw "FAIL"
4191 :autocmd BufWritePre * echo "Should not be displayed"
4192 :
4193 :try
4194 : write
4195 :catch
4196 : echo "Caught:" v:exception "from" v:throwpoint
4197 :endtry
4198
4199Here, the ":write" command does not write the file currently being edited (as
4200you can see by checking 'modified'), since the exception from the BufWritePre
4201autocommand abandons the ":write". The exception is then caught and the
4202script displays: >
4203
4204 Caught: FAIL from BufWrite Auto commands for "*"
4205<
4206 *except-autocmd-Post*
4207For some commands, autocommands get executed after the main action of the
4208command has taken place. If this main action fails and the command is inside
4209an active try conditional, the autocommands are skipped and an error exception
4210is thrown that can be caught by the caller of the command.
4211 Example: >
4212
4213 :autocmd BufWritePost * echo "File successfully written!"
4214 :
4215 :try
4216 : write /i/m/p/o/s/s/i/b/l/e
4217 :catch
4218 : echo v:exception
4219 :endtry
4220
4221This just displays: >
4222
4223 Vim(write):E212: Can't open file for writing (/i/m/p/o/s/s/i/b/l/e)
4224
4225If you really need to execute the autocommands even when the main action
4226fails, trigger the event from the catch clause.
4227 Example: >
4228
4229 :autocmd BufWritePre * set noreadonly
4230 :autocmd BufWritePost * set readonly
4231 :
4232 :try
4233 : write /i/m/p/o/s/s/i/b/l/e
4234 :catch
4235 : doautocmd BufWritePost /i/m/p/o/s/s/i/b/l/e
4236 :endtry
4237<
4238You can also use ":silent!": >
4239
4240 :let x = "ok"
4241 :let v:errmsg = ""
4242 :autocmd BufWritePost * if v:errmsg != ""
4243 :autocmd BufWritePost * let x = "after fail"
4244 :autocmd BufWritePost * endif
4245 :try
4246 : silent! write /i/m/p/o/s/s/i/b/l/e
4247 :catch
4248 :endtry
4249 :echo x
4250
4251This displays "after fail".
4252
4253If the main action of the command does not fail, exceptions from the
4254autocommands will be catchable by the caller of the command: >
4255
4256 :autocmd BufWritePost * throw ":-("
4257 :autocmd BufWritePost * echo "Should not be displayed"
4258 :
4259 :try
4260 : write
4261 :catch
4262 : echo v:exception
4263 :endtry
4264<
4265 *except-autocmd-Cmd*
4266For some commands, the normal action can be replaced by a sequence of
4267autocommands. Exceptions from that sequence will be catchable by the caller
4268of the command.
4269 Example: For the ":write" command, the caller cannot know whether the file
Bram Moolenaar58b85342016-08-14 19:54:54 +02004270had actually been written when the exception occurred. You need to tell it in
Bram Moolenaar071d4272004-06-13 20:20:40 +00004271some way. >
4272
4273 :if !exists("cnt")
4274 : let cnt = 0
4275 :
4276 : autocmd BufWriteCmd * if &modified
4277 : autocmd BufWriteCmd * let cnt = cnt + 1
4278 : autocmd BufWriteCmd * if cnt % 3 == 2
4279 : autocmd BufWriteCmd * throw "BufWriteCmdError"
4280 : autocmd BufWriteCmd * endif
4281 : autocmd BufWriteCmd * write | set nomodified
4282 : autocmd BufWriteCmd * if cnt % 3 == 0
4283 : autocmd BufWriteCmd * throw "BufWriteCmdError"
4284 : autocmd BufWriteCmd * endif
4285 : autocmd BufWriteCmd * echo "File successfully written!"
4286 : autocmd BufWriteCmd * endif
4287 :endif
4288 :
4289 :try
4290 : write
4291 :catch /^BufWriteCmdError$/
4292 : if &modified
4293 : echo "Error on writing (file contents not changed)"
4294 : else
4295 : echo "Error after writing"
4296 : endif
4297 :catch /^Vim(write):/
4298 : echo "Error on writing"
4299 :endtry
4300
4301When this script is sourced several times after making changes, it displays
4302first >
4303 File successfully written!
4304then >
4305 Error on writing (file contents not changed)
4306then >
4307 Error after writing
4308etc.
4309
4310 *except-autocmd-ill*
4311You cannot spread a try conditional over autocommands for different events.
4312The following code is ill-formed: >
4313
4314 :autocmd BufWritePre * try
4315 :
4316 :autocmd BufWritePost * catch
4317 :autocmd BufWritePost * echo v:exception
4318 :autocmd BufWritePost * endtry
4319 :
4320 :write
4321
4322
4323EXCEPTION HIERARCHIES AND PARAMETERIZED EXCEPTIONS *except-hier-param*
4324
4325Some programming languages allow to use hierarchies of exception classes or to
4326pass additional information with the object of an exception class. You can do
4327similar things in Vim.
4328 In order to throw an exception from a hierarchy, just throw the complete
4329class name with the components separated by a colon, for instance throw the
4330string "EXCEPT:MATHERR:OVERFLOW" for an overflow in a mathematical library.
4331 When you want to pass additional information with your exception class, add
4332it in parentheses, for instance throw the string "EXCEPT:IO:WRITEERR(myfile)"
4333for an error when writing "myfile".
4334 With the appropriate patterns in the ":catch" command, you can catch for
4335base classes or derived classes of your hierarchy. Additional information in
4336parentheses can be cut out from |v:exception| with the ":substitute" command.
4337 Example: >
4338
4339 :function! CheckRange(a, func)
4340 : if a:a < 0
Bram Moolenaarc51cf032022-02-26 12:25:45 +00004341 : throw "EXCEPT:MATHERR:RANGE(" .. a:func .. ")"
Bram Moolenaar071d4272004-06-13 20:20:40 +00004342 : endif
4343 :endfunction
4344 :
4345 :function! Add(a, b)
4346 : call CheckRange(a:a, "Add")
4347 : call CheckRange(a:b, "Add")
4348 : let c = a:a + a:b
4349 : if c < 0
4350 : throw "EXCEPT:MATHERR:OVERFLOW"
4351 : endif
4352 : return c
4353 :endfunction
4354 :
4355 :function! Div(a, b)
4356 : call CheckRange(a:a, "Div")
4357 : call CheckRange(a:b, "Div")
4358 : if (a:b == 0)
4359 : throw "EXCEPT:MATHERR:ZERODIV"
4360 : endif
4361 : return a:a / a:b
4362 :endfunction
4363 :
4364 :function! Write(file)
4365 : try
Bram Moolenaar446cb832008-06-24 21:56:24 +00004366 : execute "write" fnameescape(a:file)
Bram Moolenaar071d4272004-06-13 20:20:40 +00004367 : catch /^Vim(write):/
Bram Moolenaarc51cf032022-02-26 12:25:45 +00004368 : throw "EXCEPT:IO(" .. getcwd() .. ", " .. a:file .. "):WRITEERR"
Bram Moolenaar071d4272004-06-13 20:20:40 +00004369 : endtry
4370 :endfunction
4371 :
4372 :try
4373 :
Bram Moolenaar75ab5902022-04-18 15:36:40 +01004374 : " something with arithmetic and I/O
Bram Moolenaar071d4272004-06-13 20:20:40 +00004375 :
4376 :catch /^EXCEPT:MATHERR:RANGE/
4377 : let function = substitute(v:exception, '.*(\(\a\+\)).*', '\1', "")
4378 : echo "Range error in" function
4379 :
4380 :catch /^EXCEPT:MATHERR/ " catches OVERFLOW and ZERODIV
4381 : echo "Math error"
4382 :
4383 :catch /^EXCEPT:IO/
4384 : let dir = substitute(v:exception, '.*(\(.\+\),\s*.\+).*', '\1', "")
4385 : let file = substitute(v:exception, '.*(.\+,\s*\(.\+\)).*', '\1', "")
4386 : if file !~ '^/'
Bram Moolenaarc51cf032022-02-26 12:25:45 +00004387 : let file = dir .. "/" .. file
Bram Moolenaar071d4272004-06-13 20:20:40 +00004388 : endif
Bram Moolenaarc51cf032022-02-26 12:25:45 +00004389 : echo 'I/O error for "' .. file .. '"'
Bram Moolenaar071d4272004-06-13 20:20:40 +00004390 :
4391 :catch /^EXCEPT/
4392 : echo "Unspecified error"
4393 :
4394 :endtry
4395
4396The exceptions raised by Vim itself (on error or when pressing CTRL-C) use
4397a flat hierarchy: they are all in the "Vim" class. You cannot throw yourself
4398exceptions with the "Vim" prefix; they are reserved for Vim.
4399 Vim error exceptions are parameterized with the name of the command that
4400failed, if known. See |catch-errors|.
4401
4402
4403PECULIARITIES
4404 *except-compat*
4405The exception handling concept requires that the command sequence causing the
4406exception is aborted immediately and control is transferred to finally clauses
4407and/or a catch clause.
4408
4409In the Vim script language there are cases where scripts and functions
4410continue after an error: in functions without the "abort" flag or in a command
4411after ":silent!", control flow goes to the following line, and outside
4412functions, control flow goes to the line following the outermost ":endwhile"
4413or ":endif". On the other hand, errors should be catchable as exceptions
4414(thus, requiring the immediate abortion).
4415
4416This problem has been solved by converting errors to exceptions and using
4417immediate abortion (if not suppressed by ":silent!") only when a try
Bram Moolenaar58b85342016-08-14 19:54:54 +02004418conditional is active. This is no restriction since an (error) exception can
4419be caught only from an active try conditional. If you want an immediate
Bram Moolenaar071d4272004-06-13 20:20:40 +00004420termination without catching the error, just use a try conditional without
4421catch clause. (You can cause cleanup code being executed before termination
4422by specifying a finally clause.)
4423
4424When no try conditional is active, the usual abortion and continuation
4425behavior is used instead of immediate abortion. This ensures compatibility of
4426scripts written for Vim 6.1 and earlier.
4427
4428However, when sourcing an existing script that does not use exception handling
4429commands (or when calling one of its functions) from inside an active try
4430conditional of a new script, you might change the control flow of the existing
4431script on error. You get the immediate abortion on error and can catch the
4432error in the new script. If however the sourced script suppresses error
4433messages by using the ":silent!" command (checking for errors by testing
Bram Moolenaar58b85342016-08-14 19:54:54 +02004434|v:errmsg| if appropriate), its execution path is not changed. The error is
4435not converted to an exception. (See |:silent|.) So the only remaining cause
Bram Moolenaar071d4272004-06-13 20:20:40 +00004436where this happens is for scripts that don't care about errors and produce
4437error messages. You probably won't want to use such code from your new
4438scripts.
4439
4440 *except-syntax-err*
4441Syntax errors in the exception handling commands are never caught by any of
4442the ":catch" commands of the try conditional they belong to. Its finally
4443clauses, however, is executed.
4444 Example: >
4445
4446 :try
4447 : try
4448 : throw 4711
4449 : catch /\(/
4450 : echo "in catch with syntax error"
4451 : catch
4452 : echo "inner catch-all"
4453 : finally
4454 : echo "inner finally"
4455 : endtry
4456 :catch
Bram Moolenaarc51cf032022-02-26 12:25:45 +00004457 : echo 'outer catch-all caught "' .. v:exception .. '"'
Bram Moolenaar071d4272004-06-13 20:20:40 +00004458 : finally
4459 : echo "outer finally"
4460 :endtry
4461
4462This displays: >
4463 inner finally
4464 outer catch-all caught "Vim(catch):E54: Unmatched \("
4465 outer finally
4466The original exception is discarded and an error exception is raised, instead.
4467
4468 *except-single-line*
4469The ":try", ":catch", ":finally", and ":endtry" commands can be put on
4470a single line, but then syntax errors may make it difficult to recognize the
4471"catch" line, thus you better avoid this.
4472 Example: >
4473 :try | unlet! foo # | catch | endtry
4474raises an error exception for the trailing characters after the ":unlet!"
4475argument, but does not see the ":catch" and ":endtry" commands, so that the
4476error exception is discarded and the "E488: Trailing characters" message gets
4477displayed.
4478
4479 *except-several-errors*
4480When several errors appear in a single command, the first error message is
Bram Moolenaar53f7fcc2021-07-28 20:10:16 +02004481usually the most specific one and therefore converted to the error exception.
Bram Moolenaar071d4272004-06-13 20:20:40 +00004482 Example: >
4483 echo novar
4484causes >
4485 E121: Undefined variable: novar
4486 E15: Invalid expression: novar
4487The value of the error exception inside try conditionals is: >
4488 Vim(echo):E121: Undefined variable: novar
4489< *except-syntax-error*
4490But when a syntax error is detected after a normal error in the same command,
4491the syntax error is used for the exception being thrown.
4492 Example: >
4493 unlet novar #
4494causes >
4495 E108: No such variable: "novar"
4496 E488: Trailing characters
4497The value of the error exception inside try conditionals is: >
4498 Vim(unlet):E488: Trailing characters
4499This is done because the syntax error might change the execution path in a way
4500not intended by the user. Example: >
4501 try
4502 try | unlet novar # | catch | echo v:exception | endtry
4503 catch /.*/
4504 echo "outer catch:" v:exception
4505 endtry
4506This displays "outer catch: Vim(unlet):E488: Trailing characters", and then
4507a "E600: Missing :endtry" error message is given, see |except-single-line|.
4508
4509==============================================================================
45109. Examples *eval-examples*
4511
Bram Moolenaaref2f6562007-05-06 13:32:59 +00004512Printing in Binary ~
Bram Moolenaar071d4272004-06-13 20:20:40 +00004513>
Bram Moolenaar8f3f58f2010-01-06 20:52:26 +01004514 :" The function Nr2Bin() returns the binary string representation of a number.
Bram Moolenaaref2f6562007-05-06 13:32:59 +00004515 :func Nr2Bin(nr)
Bram Moolenaar071d4272004-06-13 20:20:40 +00004516 : let n = a:nr
4517 : let r = ""
4518 : while n
Bram Moolenaarc51cf032022-02-26 12:25:45 +00004519 : let r = '01'[n % 2] .. r
Bram Moolenaaref2f6562007-05-06 13:32:59 +00004520 : let n = n / 2
Bram Moolenaar071d4272004-06-13 20:20:40 +00004521 : endwhile
4522 : return r
4523 :endfunc
4524
Bram Moolenaaref2f6562007-05-06 13:32:59 +00004525 :" The function String2Bin() converts each character in a string to a
4526 :" binary string, separated with dashes.
4527 :func String2Bin(str)
Bram Moolenaar071d4272004-06-13 20:20:40 +00004528 : let out = ''
Bram Moolenaaref2f6562007-05-06 13:32:59 +00004529 : for ix in range(strlen(a:str))
Bram Moolenaarc51cf032022-02-26 12:25:45 +00004530 : let out = out .. '-' .. Nr2Bin(char2nr(a:str[ix]))
Bram Moolenaaref2f6562007-05-06 13:32:59 +00004531 : endfor
4532 : return out[1:]
Bram Moolenaar071d4272004-06-13 20:20:40 +00004533 :endfunc
4534
4535Example of its use: >
Bram Moolenaaref2f6562007-05-06 13:32:59 +00004536 :echo Nr2Bin(32)
4537result: "100000" >
4538 :echo String2Bin("32")
4539result: "110011-110010"
Bram Moolenaar071d4272004-06-13 20:20:40 +00004540
4541
Bram Moolenaaref2f6562007-05-06 13:32:59 +00004542Sorting lines ~
Bram Moolenaar071d4272004-06-13 20:20:40 +00004543
Bram Moolenaaref2f6562007-05-06 13:32:59 +00004544This example sorts lines with a specific compare function. >
4545
4546 :func SortBuffer()
4547 : let lines = getline(1, '$')
4548 : call sort(lines, function("Strcmp"))
4549 : call setline(1, lines)
Bram Moolenaar071d4272004-06-13 20:20:40 +00004550 :endfunction
4551
Bram Moolenaaref2f6562007-05-06 13:32:59 +00004552As a one-liner: >
4553 :call setline(1, sort(getline(1, '$'), function("Strcmp")))
Bram Moolenaar071d4272004-06-13 20:20:40 +00004554
Bram Moolenaar071d4272004-06-13 20:20:40 +00004555
Bram Moolenaaref2f6562007-05-06 13:32:59 +00004556scanf() replacement ~
Bram Moolenaar071d4272004-06-13 20:20:40 +00004557 *sscanf*
4558There is no sscanf() function in Vim. If you need to extract parts from a
4559line, you can use matchstr() and substitute() to do it. This example shows
4560how to get the file name, line number and column number out of a line like
4561"foobar.txt, 123, 45". >
4562 :" Set up the match bit
4563 :let mx='\(\f\+\),\s*\(\d\+\),\s*\(\d\+\)'
4564 :"get the part matching the whole expression
4565 :let l = matchstr(line, mx)
4566 :"get each item out of the match
4567 :let file = substitute(l, mx, '\1', '')
4568 :let lnum = substitute(l, mx, '\2', '')
4569 :let col = substitute(l, mx, '\3', '')
4570
4571The input is in the variable "line", the results in the variables "file",
4572"lnum" and "col". (idea from Michael Geddes)
4573
Bram Moolenaaref2f6562007-05-06 13:32:59 +00004574
4575getting the scriptnames in a Dictionary ~
4576 *scriptnames-dictionary*
4577The |:scriptnames| command can be used to get a list of all script files that
4578have been sourced. There is no equivalent function or variable for this
4579(because it's rarely needed). In case you need to manipulate the list this
4580code can be used: >
4581 " Get the output of ":scriptnames" in the scriptnames_output variable.
4582 let scriptnames_output = ''
4583 redir => scriptnames_output
4584 silent scriptnames
4585 redir END
Bram Moolenaarb0d45e72017-11-05 18:19:24 +01004586
Bram Moolenaar446cb832008-06-24 21:56:24 +00004587 " Split the output into lines and parse each line. Add an entry to the
Bram Moolenaaref2f6562007-05-06 13:32:59 +00004588 " "scripts" dictionary.
4589 let scripts = {}
4590 for line in split(scriptnames_output, "\n")
4591 " Only do non-blank lines.
4592 if line =~ '\S'
4593 " Get the first number in the line.
Bram Moolenaar446cb832008-06-24 21:56:24 +00004594 let nr = matchstr(line, '\d\+')
Bram Moolenaaref2f6562007-05-06 13:32:59 +00004595 " Get the file name, remove the script number " 123: ".
Bram Moolenaar446cb832008-06-24 21:56:24 +00004596 let name = substitute(line, '.\+:\s*', '', '')
Bram Moolenaaref2f6562007-05-06 13:32:59 +00004597 " Add an item to the Dictionary
Bram Moolenaar446cb832008-06-24 21:56:24 +00004598 let scripts[nr] = name
Bram Moolenaaref2f6562007-05-06 13:32:59 +00004599 endif
4600 endfor
4601 unlet scriptnames_output
4602
Bram Moolenaar071d4272004-06-13 20:20:40 +00004603==============================================================================
Bram Moolenaar558ca4a2019-04-04 18:15:38 +0200460410. Vim script versions *vimscript-version* *vimscript-versions*
Bram Moolenaar911ead12019-04-21 00:03:35 +02004605 *scriptversion*
Bram Moolenaar558ca4a2019-04-04 18:15:38 +02004606Over time many features have been added to Vim script. This includes Ex
4607commands, functions, variable types, etc. Each individual feature can be
4608checked with the |has()| and |exists()| functions.
4609
4610Sometimes old syntax of functionality gets in the way of making Vim better.
4611When support is taken away this will break older Vim scripts. To make this
4612explicit the |:scriptversion| command can be used. When a Vim script is not
4613compatible with older versions of Vim this will give an explicit error,
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +02004614instead of failing in mysterious ways.
Bram Moolenaar558ca4a2019-04-04 18:15:38 +02004615
Bram Moolenaara2baa732022-02-04 16:09:54 +00004616When using a legacy function, defined with `:function`, in |Vim9| script then
4617scriptversion 4 is used.
4618
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +02004619 *scriptversion-1* >
Bram Moolenaar558ca4a2019-04-04 18:15:38 +02004620 :scriptversion 1
4621< This is the original Vim script, same as not using a |:scriptversion|
4622 command. Can be used to go back to old syntax for a range of lines.
4623 Test for support with: >
4624 has('vimscript-1')
4625
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +02004626< *scriptversion-2* >
Bram Moolenaar558ca4a2019-04-04 18:15:38 +02004627 :scriptversion 2
Bram Moolenaar68e65602019-05-26 21:33:31 +02004628< String concatenation with "." is not supported, use ".." instead.
Bram Moolenaar558ca4a2019-04-04 18:15:38 +02004629 This avoids the ambiguity using "." for Dict member access and
4630 floating point numbers. Now ".5" means the number 0.5.
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +02004631
4632 *scriptversion-3* >
Bram Moolenaar911ead12019-04-21 00:03:35 +02004633 :scriptversion 3
4634< All |vim-variable|s must be prefixed by "v:". E.g. "version" doesn't
4635 work as |v:version| anymore, it can be used as a normal variable.
4636 Same for some obvious names as "count" and others.
Bram Moolenaar558ca4a2019-04-04 18:15:38 +02004637
Bram Moolenaar911ead12019-04-21 00:03:35 +02004638 Test for support with: >
4639 has('vimscript-3')
Bram Moolenaar60a8de22019-09-15 14:33:22 +02004640<
4641 *scriptversion-4* >
4642 :scriptversion 4
Bram Moolenaarc17e66c2020-06-02 21:38:22 +02004643< Numbers with a leading zero are not recognized as octal. "0o" or "0O"
4644 is still recognized as octal. With the
Bram Moolenaar60a8de22019-09-15 14:33:22 +02004645 previous version you get: >
Bram Moolenaarc17e66c2020-06-02 21:38:22 +02004646 echo 017 " displays 15 (octal)
4647 echo 0o17 " displays 15 (octal)
4648 echo 018 " displays 18 (decimal)
Bram Moolenaar60a8de22019-09-15 14:33:22 +02004649< with script version 4: >
Bram Moolenaarc17e66c2020-06-02 21:38:22 +02004650 echo 017 " displays 17 (decimal)
4651 echo 0o17 " displays 15 (octal)
4652 echo 018 " displays 18 (decimal)
Bram Moolenaar60a8de22019-09-15 14:33:22 +02004653< Also, it is possible to use single quotes inside numbers to make them
4654 easier to read: >
4655 echo 1'000'000
4656< The quotes must be surrounded by digits.
4657
4658 Test for support with: >
4659 has('vimscript-4')
Bram Moolenaar558ca4a2019-04-04 18:15:38 +02004660
4661==============================================================================
466211. No +eval feature *no-eval-feature*
Bram Moolenaar071d4272004-06-13 20:20:40 +00004663
4664When the |+eval| feature was disabled at compile time, none of the expression
4665evaluation commands are available. To prevent this from causing Vim scripts
4666to generate all kinds of errors, the ":if" and ":endif" commands are still
4667recognized, though the argument of the ":if" and everything between the ":if"
4668and the matching ":endif" is ignored. Nesting of ":if" blocks is allowed, but
4669only if the commands are at the start of the line. The ":else" command is not
4670recognized.
4671
4672Example of how to avoid executing commands when the |+eval| feature is
4673missing: >
4674
4675 :if 1
4676 : echo "Expression evaluation is compiled in"
4677 :else
4678 : echo "You will _never_ see this message"
4679 :endif
4680
Bram Moolenaar773a97c2019-06-06 20:39:55 +02004681To execute a command only when the |+eval| feature is disabled can be done in
4682two ways. The simplest is to exit the script (or Vim) prematurely: >
4683 if 1
4684 echo "commands executed with +eval"
4685 finish
4686 endif
4687 args " command executed without +eval
4688
4689If you do not want to abort loading the script you can use a trick, as this
4690example shows: >
Bram Moolenaar45d2cca2017-04-30 16:36:05 +02004691
4692 silent! while 0
4693 set history=111
4694 silent! endwhile
4695
4696When the |+eval| feature is available the command is skipped because of the
4697"while 0". Without the |+eval| feature the "while 0" is an error, which is
4698silently ignored, and the command is executed.
Bram Moolenaarcd5c8f82017-04-09 20:11:58 +02004699
Bram Moolenaar071d4272004-06-13 20:20:40 +00004700==============================================================================
Bram Moolenaar2f0936c2022-01-08 21:51:59 +0000470112. The sandbox *eval-sandbox* *sandbox*
Bram Moolenaar071d4272004-06-13 20:20:40 +00004702
Bram Moolenaar368373e2010-07-19 20:46:22 +02004703The 'foldexpr', 'formatexpr', 'includeexpr', 'indentexpr', 'statusline' and
4704'foldtext' options may be evaluated in a sandbox. This means that you are
4705protected from these expressions having nasty side effects. This gives some
4706safety for when these options are set from a modeline. It is also used when
4707the command from a tags file is executed and for CTRL-R = in the command line.
Bram Moolenaar7b0294c2004-10-11 10:16:09 +00004708The sandbox is also used for the |:sandbox| command.
Bram Moolenaar2f0936c2022-01-08 21:51:59 +00004709 *E48*
Bram Moolenaar071d4272004-06-13 20:20:40 +00004710These items are not allowed in the sandbox:
4711 - changing the buffer text
Bram Moolenaarb477af22018-07-15 20:20:18 +02004712 - defining or changing mapping, autocommands, user commands
Bram Moolenaar071d4272004-06-13 20:20:40 +00004713 - setting certain options (see |option-summary|)
Bram Moolenaaref2f6562007-05-06 13:32:59 +00004714 - setting certain v: variables (see |v:var|) *E794*
Bram Moolenaar071d4272004-06-13 20:20:40 +00004715 - executing a shell command
4716 - reading or writing a file
4717 - jumping to another buffer or editing a file
Bram Moolenaar4770d092006-01-12 23:22:24 +00004718 - executing Python, Perl, etc. commands
Bram Moolenaar7b0294c2004-10-11 10:16:09 +00004719This is not guaranteed 100% secure, but it should block most attacks.
4720
4721 *:san* *:sandbox*
Bram Moolenaar045e82d2005-07-08 22:25:33 +00004722:san[dbox] {cmd} Execute {cmd} in the sandbox. Useful to evaluate an
Bram Moolenaar7b0294c2004-10-11 10:16:09 +00004723 option that may have been set from a modeline, e.g.
4724 'foldexpr'.
4725
Bram Moolenaarb71eaae2006-01-20 23:10:18 +00004726 *sandbox-option*
4727A few options contain an expression. When this expression is evaluated it may
Bram Moolenaar9b2200a2006-03-20 21:55:45 +00004728have to be done in the sandbox to avoid a security risk. But the sandbox is
Bram Moolenaarb71eaae2006-01-20 23:10:18 +00004729restrictive, thus this only happens when the option was set from an insecure
4730location. Insecure in this context are:
Bram Moolenaar551dbcc2006-04-25 22:13:59 +00004731- sourcing a .vimrc or .exrc in the current directory
Bram Moolenaarb71eaae2006-01-20 23:10:18 +00004732- while executing in the sandbox
4733- value coming from a modeline
Bram Moolenaarb477af22018-07-15 20:20:18 +02004734- executing a function that was defined in the sandbox
Bram Moolenaarb71eaae2006-01-20 23:10:18 +00004735
4736Note that when in the sandbox and saving an option value and restoring it, the
4737option will still be marked as it was set in the sandbox.
4738
4739==============================================================================
Bram Moolenaar558ca4a2019-04-04 18:15:38 +0200474013. Textlock *textlock*
Bram Moolenaarb71eaae2006-01-20 23:10:18 +00004741
4742In a few situations it is not allowed to change the text in the buffer, jump
4743to another window and some other things that might confuse or break what Vim
4744is currently doing. This mostly applies to things that happen when Vim is
Bram Moolenaar58b85342016-08-14 19:54:54 +02004745actually doing something else. For example, evaluating the 'balloonexpr' may
Bram Moolenaarb71eaae2006-01-20 23:10:18 +00004746happen any moment the mouse cursor is resting at some position.
4747
4748This is not allowed when the textlock is active:
4749 - changing the buffer text
4750 - jumping to another buffer or window
4751 - editing another file
4752 - closing a window or quitting Vim
4753 - etc.
4754
Bram Moolenaar071d4272004-06-13 20:20:40 +00004755
Bram Moolenaar91f84f62018-07-29 15:07:52 +02004756 vim:tw=78:ts=8:noet:ft=help:norl: