blob: 86b9686346a15003199a6342c311e444b4a2ffbb [file] [log] [blame]
Bram Moolenaar30ab04e2022-05-14 13:33:50 +01001*eval.txt* For Vim version 8.2. Last change: 2022 May 13
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 Moolenaar6f4754b2022-01-23 12:07:04 +000057 {only when compiled with the |+float| feature} *E1076*
Bram Moolenaar446cb832008-06-24 21:56:24 +000058 Examples: 123.456 1.15e-6 -1.1e3
59
Bram Moolenaard8b02732005-01-14 21:48:43 +000060String A NUL terminated string of 8-bit unsigned characters (bytes).
Bram Moolenaar446cb832008-06-24 21:56:24 +000061 |expr-string| Examples: "ab\txx\"--" 'x-z''a,c'
Bram Moolenaard8b02732005-01-14 21:48:43 +000062
Bram Moolenaard8968242019-01-15 22:51:57 +010063List An ordered sequence of items, see |List| for details.
Bram Moolenaard8b02732005-01-14 21:48:43 +000064 Example: [1, 2, ['a', 'b']]
Bram Moolenaar071d4272004-06-13 20:20:40 +000065
Bram Moolenaar39a58ca2005-06-27 22:42:44 +000066Dictionary An associative, unordered array: Each entry has a key and a
67 value. |Dictionary|
Bram Moolenaard5abb4c2019-07-13 22:46:10 +020068 Examples:
69 {'blue': "#0000ff", 'red': "#ff0000"}
Bram Moolenaar4c6d9042019-07-16 22:04:02 +020070 #{blue: "#0000ff", red: "#ff0000"}
Bram Moolenaar39a58ca2005-06-27 22:42:44 +000071
Bram Moolenaar835dc632016-02-07 14:27:38 +010072Funcref A reference to a function |Funcref|.
73 Example: function("strlen")
Bram Moolenaar1d429612016-05-24 15:44:17 +020074 It can be bound to a dictionary and arguments, it then works
75 like a Partial.
76 Example: function("Callback", [arg], myDict)
Bram Moolenaar835dc632016-02-07 14:27:38 +010077
Bram Moolenaar02e83b42016-02-21 20:10:26 +010078Special |v:false|, |v:true|, |v:none| and |v:null|. *Special*
Bram Moolenaar835dc632016-02-07 14:27:38 +010079
Bram Moolenaarebf7dfa2016-04-14 12:46:51 +020080Job Used for a job, see |job_start()|. *Job* *Jobs*
Bram Moolenaar38a55632016-02-15 22:07:32 +010081
Bram Moolenaarebf7dfa2016-04-14 12:46:51 +020082Channel Used for a channel, see |ch_open()|. *Channel* *Channels*
Bram Moolenaar835dc632016-02-07 14:27:38 +010083
Bram Moolenaard8968242019-01-15 22:51:57 +010084Blob Binary Large Object. Stores any sequence of bytes. See |Blob|
85 for details
Bram Moolenaar6e5ea8d2019-01-12 22:47:31 +010086 Example: 0zFF00ED015DAF
87 0z is an empty Blob.
88
Bram Moolenaard7ee7ce2005-01-03 21:02:03 +000089The Number and String types are converted automatically, depending on how they
90are used.
Bram Moolenaar071d4272004-06-13 20:20:40 +000091
92Conversion from a Number to a String is by making the ASCII representation of
Bram Moolenaar24ea3ba2010-09-19 19:01:21 +020093the Number. Examples:
94 Number 123 --> String "123" ~
95 Number 0 --> String "0" ~
96 Number -1 --> String "-1" ~
Bram Moolenaar00a927d2010-05-14 23:24:24 +020097 *octal*
Bram Moolenaard43906d2020-07-20 21:31:32 +020098Conversion from a String to a Number only happens in legacy Vim script, not in
99Vim9 script. It is done by converting the first digits to a number.
100Hexadecimal "0xf9", Octal "017" or "0o17", and Binary "0b10"
Bram Moolenaar6f02b002021-01-10 20:22:54 +0100101numbers are recognized
Bram Moolenaar5da36052021-12-27 15:39:57 +0000102NOTE: when using |Vim9| script or |scriptversion-4| octal with a leading "0"
103is not recognized. The 0o notation requires patch 8.2.0886.
Bram Moolenaar6f02b002021-01-10 20:22:54 +0100104If the String doesn't start with digits, the result is zero.
Bram Moolenaarfa735342016-01-03 22:14:44 +0100105Examples:
Bram Moolenaar24ea3ba2010-09-19 19:01:21 +0200106 String "456" --> Number 456 ~
107 String "6bar" --> Number 6 ~
108 String "foo" --> Number 0 ~
109 String "0xf1" --> Number 241 ~
110 String "0100" --> Number 64 ~
Bram Moolenaarc17e66c2020-06-02 21:38:22 +0200111 String "0o100" --> Number 64 ~
Bram Moolenaarfa735342016-01-03 22:14:44 +0100112 String "0b101" --> Number 5 ~
Bram Moolenaar24ea3ba2010-09-19 19:01:21 +0200113 String "-8" --> Number -8 ~
114 String "+8" --> Number 0 ~
Bram Moolenaar071d4272004-06-13 20:20:40 +0000115
116To force conversion from String to Number, add zero to it: >
117 :echo "0100" + 0
Bram Moolenaar97b2ad32006-03-18 21:40:56 +0000118< 64 ~
119
120To avoid a leading zero to cause octal conversion, or for using a different
121base, use |str2nr()|.
Bram Moolenaar071d4272004-06-13 20:20:40 +0000122
Bram Moolenaard09091d2019-01-17 16:07:22 +0100123 *TRUE* *FALSE* *Boolean*
Bram Moolenaar071d4272004-06-13 20:20:40 +0000124For boolean operators Numbers are used. Zero is FALSE, non-zero is TRUE.
Bram Moolenaar6aa57292021-08-14 21:25:52 +0200125You can also use |v:false| and |v:true|, in Vim9 script |false| and |true|.
Bram Moolenaar1c6737b2020-09-07 22:18:52 +0200126When TRUE is returned from a function it is the Number one, FALSE is the
127number zero.
Bram Moolenaar071d4272004-06-13 20:20:40 +0000128
Bram Moolenaare381d3d2016-07-07 14:50:41 +0200129Note that in the command: >
Bram Moolenaar071d4272004-06-13 20:20:40 +0000130 :if "foo"
Bram Moolenaare381d3d2016-07-07 14:50:41 +0200131 :" NOT executed
132"foo" is converted to 0, which means FALSE. If the string starts with a
133non-zero number it means TRUE: >
134 :if "8foo"
135 :" executed
136To test for a non-empty string, use empty(): >
Bram Moolenaar3a0d8092012-10-21 03:02:54 +0200137 :if !empty("foo")
Bram Moolenaar92f26c22020-10-03 20:17:30 +0200138
139< *falsy* *truthy*
140An expression can be used as a condition, ignoring the type and only using
141whether the value is "sort of true" or "sort of false". Falsy is:
142 the number zero
143 empty string, blob, list or dictionary
144Other values are truthy. Examples:
145 0 falsy
146 1 truthy
147 -1 truthy
148 0.0 falsy
149 0.1 truthy
150 '' falsy
151 'x' truthy
152 [] falsy
153 [0] truthy
154 {} falsy
155 #{x: 1} truthy
156 0z falsy
157 0z00 truthy
158
Bram Moolenaare381d3d2016-07-07 14:50:41 +0200159 *non-zero-arg*
160Function arguments often behave slightly different from |TRUE|: If the
161argument is present and it evaluates to a non-zero Number, |v:true| or a
Bram Moolenaar64d8e252016-09-06 22:12:34 +0200162non-empty String, then the value is considered to be TRUE.
Bram Moolenaar01164a62017-11-02 22:58:42 +0100163Note that " " and "0" are also non-empty strings, thus considered to be TRUE.
164A List, Dictionary or Float is not a Number or String, thus evaluate to FALSE.
Bram Moolenaare381d3d2016-07-07 14:50:41 +0200165
Bram Moolenaar2f0936c2022-01-08 21:51:59 +0000166 *E611* *E745* *E728* *E703* *E729* *E730* *E731* *E908* *E910*
167 *E913* *E974* *E975* *E976*
Bram Moolenaard09091d2019-01-17 16:07:22 +0100168|List|, |Dictionary|, |Funcref|, |Job|, |Channel| and |Blob| types are not
169automatically converted.
Bram Moolenaard7ee7ce2005-01-03 21:02:03 +0000170
Bram Moolenaar446cb832008-06-24 21:56:24 +0000171 *E805* *E806* *E808*
Bram Moolenaar58b85342016-08-14 19:54:54 +0200172When mixing Number and Float the Number is converted to Float. Otherwise
Bram Moolenaar446cb832008-06-24 21:56:24 +0000173there is no automatic conversion of Float. You can use str2float() for String
174to Float, printf() for Float to String and float2nr() for Float to Number.
175
Bram Moolenaar2f0936c2022-01-08 21:51:59 +0000176 *E362* *E891* *E892* *E893* *E894* *E907* *E911* *E914*
Bram Moolenaar13d5aee2016-01-21 23:36:05 +0100177When expecting a Float a Number can also be used, but nothing else.
178
Bram Moolenaarf6f32c32016-03-12 19:03:59 +0100179 *no-type-checking*
180You will not get an error if you try to change the type of a variable.
Bram Moolenaard7ee7ce2005-01-03 21:02:03 +0000181
Bram Moolenaar13065c42005-01-08 16:08:21 +0000182
Bram Moolenaar9588a0f2005-01-08 21:45:39 +00001831.2 Function references ~
Dominique Pelle7765f5c2022-04-10 11:26:53 +0100184 *Funcref* *E695* *E718* *E1192*
Bram Moolenaar58b85342016-08-14 19:54:54 +0200185A Funcref variable is obtained with the |function()| function, the |funcref()|
186function or created with the lambda expression |expr-lambda|. It can be used
187in an expression in the place of a function name, before the parenthesis
188around the arguments, to invoke the function it refers to. Example: >
Bram Moolenaard7ee7ce2005-01-03 21:02:03 +0000189
190 :let Fn = function("MyFunc")
191 :echo Fn()
Bram Moolenaar3a3a7232005-01-17 22:16:15 +0000192< *E704* *E705* *E707*
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000193A Funcref variable must start with a capital, "s:", "w:", "t:" or "b:". You
Bram Moolenaar7cba6c02013-09-05 22:13:31 +0200194can use "g:" but the following name must still start with a capital. You
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000195cannot have both a Funcref variable and a function with the same name.
Bram Moolenaard7ee7ce2005-01-03 21:02:03 +0000196
Bram Moolenaar3a3a7232005-01-17 22:16:15 +0000197A special case is defining a function and directly assigning its Funcref to a
198Dictionary entry. Example: >
199 :function dict.init() dict
200 : let self.val = 0
201 :endfunction
202
203The key of the Dictionary can start with a lower case letter. The actual
204function name is not used here. Also see |numbered-function|.
205
206A Funcref can also be used with the |:call| command: >
207 :call Fn()
208 :call dict.init()
Bram Moolenaar13065c42005-01-08 16:08:21 +0000209
210The name of the referenced function can be obtained with |string()|. >
Bram Moolenaar383f9bc2005-01-19 22:18:32 +0000211 :let func = string(Fn)
Bram Moolenaar13065c42005-01-08 16:08:21 +0000212
213You can use |call()| to invoke a Funcref and use a list variable for the
214arguments: >
Bram Moolenaar383f9bc2005-01-19 22:18:32 +0000215 :let r = call(Fn, mylist)
Bram Moolenaar1d429612016-05-24 15:44:17 +0200216<
217 *Partial*
218A Funcref optionally binds a Dictionary and/or arguments. This is also called
219a Partial. This is created by passing the Dictionary and/or arguments to
Bram Moolenaar58b85342016-08-14 19:54:54 +0200220function() or funcref(). When calling the function the Dictionary and/or
221arguments will be passed to the function. Example: >
Bram Moolenaar1d429612016-05-24 15:44:17 +0200222
223 let Cb = function('Callback', ['foo'], myDict)
Bram Moolenaarba3ff532018-11-04 14:45:49 +0100224 call Cb('bar')
Bram Moolenaar1d429612016-05-24 15:44:17 +0200225
226This will invoke the function as if using: >
Bram Moolenaarba3ff532018-11-04 14:45:49 +0100227 call myDict.Callback('foo', 'bar')
Bram Moolenaar1d429612016-05-24 15:44:17 +0200228
229This is very useful when passing a function around, e.g. in the arguments of
230|ch_open()|.
231
232Note that binding a function to a Dictionary also happens when the function is
233a member of the Dictionary: >
234
235 let myDict.myFunction = MyFunction
236 call myDict.myFunction()
237
238Here MyFunction() will get myDict passed as "self". This happens when the
239"myFunction" member is accessed. When making assigning "myFunction" to
240otherDict and calling it, it will be bound to otherDict: >
241
242 let otherDict.myFunction = myDict.myFunction
243 call otherDict.myFunction()
244
245Now "self" will be "otherDict". But when the dictionary was bound explicitly
246this won't happen: >
247
248 let myDict.myFunction = function(MyFunction, myDict)
249 let otherDict.myFunction = myDict.myFunction
250 call otherDict.myFunction()
251
Bram Moolenaard823fa92016-08-12 16:29:27 +0200252Here "self" will be "myDict", because it was bound explicitly.
Bram Moolenaard7ee7ce2005-01-03 21:02:03 +0000253
254
Bram Moolenaar9588a0f2005-01-08 21:45:39 +00002551.3 Lists ~
Bram Moolenaar7e38ea22014-04-05 22:55:53 +0200256 *list* *List* *Lists* *E686*
Bram Moolenaard7ee7ce2005-01-03 21:02:03 +0000257A List is an ordered sequence of items. An item can be of any type. Items
Bram Moolenaar58b85342016-08-14 19:54:54 +0200258can be accessed by their index number. Items can be added and removed at any
Bram Moolenaard7ee7ce2005-01-03 21:02:03 +0000259position in the sequence.
260
Bram Moolenaar13065c42005-01-08 16:08:21 +0000261
262List creation ~
263 *E696* *E697*
Bram Moolenaarcbaff5e2022-04-08 17:45:08 +0100264A List is created with a comma-separated list of items in square brackets.
Bram Moolenaar13065c42005-01-08 16:08:21 +0000265Examples: >
266 :let mylist = [1, two, 3, "four"]
267 :let emptylist = []
Bram Moolenaard7ee7ce2005-01-03 21:02:03 +0000268
Bram Moolenaar58b85342016-08-14 19:54:54 +0200269An item can be any expression. Using a List for an item creates a
Bram Moolenaarf9393ef2006-04-24 19:47:27 +0000270List of Lists: >
Bram Moolenaar13065c42005-01-08 16:08:21 +0000271 :let nestlist = [[11, 12], [21, 22], [31, 32]]
Bram Moolenaard7ee7ce2005-01-03 21:02:03 +0000272
273An extra comma after the last item is ignored.
274
Bram Moolenaar13065c42005-01-08 16:08:21 +0000275
276List index ~
277 *list-index* *E684*
Bram Moolenaard7ee7ce2005-01-03 21:02:03 +0000278An item in the List can be accessed by putting the index in square brackets
Bram Moolenaar13065c42005-01-08 16:08:21 +0000279after the List. Indexes are zero-based, thus the first item has index zero. >
280 :let item = mylist[0] " get the first item: 1
Bram Moolenaard7ee7ce2005-01-03 21:02:03 +0000281 :let item = mylist[2] " get the third item: 3
Bram Moolenaar13065c42005-01-08 16:08:21 +0000282
Bram Moolenaar9588a0f2005-01-08 21:45:39 +0000283When the resulting item is a list this can be repeated: >
Bram Moolenaar13065c42005-01-08 16:08:21 +0000284 :let item = nestlist[0][1] " get the first list, second item: 12
Bram Moolenaard7ee7ce2005-01-03 21:02:03 +0000285<
Bram Moolenaar13065c42005-01-08 16:08:21 +0000286A negative index is counted from the end. Index -1 refers to the last item in
287the List, -2 to the last but one item, etc. >
Bram Moolenaard7ee7ce2005-01-03 21:02:03 +0000288 :let last = mylist[-1] " get the last item: "four"
289
Bram Moolenaar13065c42005-01-08 16:08:21 +0000290To avoid an error for an invalid index use the |get()| function. When an item
Bram Moolenaar9588a0f2005-01-08 21:45:39 +0000291is not available it returns zero or the default value you specify: >
Bram Moolenaar13065c42005-01-08 16:08:21 +0000292 :echo get(mylist, idx)
293 :echo get(mylist, idx, "NONE")
294
295
296List concatenation ~
Bram Moolenaar34453202021-01-31 13:08:38 +0100297 *list-concatenation*
Bram Moolenaar13065c42005-01-08 16:08:21 +0000298Two lists can be concatenated with the "+" operator: >
299 :let longlist = mylist + [5, 6]
Bram Moolenaar383f9bc2005-01-19 22:18:32 +0000300 :let mylist += [7, 8]
Bram Moolenaar13065c42005-01-08 16:08:21 +0000301
Bram Moolenaar34453202021-01-31 13:08:38 +0100302To prepend or append an item, turn the item into a list by putting [] around
303it. To change a list in-place, refer to |list-modification| below.
Bram Moolenaar13065c42005-01-08 16:08:21 +0000304
305
306Sublist ~
Bram Moolenaarbc8801c2016-08-02 21:04:33 +0200307 *sublist*
Bram Moolenaard7ee7ce2005-01-03 21:02:03 +0000308A part of the List can be obtained by specifying the first and last index,
309separated by a colon in square brackets: >
Bram Moolenaar13065c42005-01-08 16:08:21 +0000310 :let shortlist = mylist[2:-1] " get List [3, "four"]
Bram Moolenaard7ee7ce2005-01-03 21:02:03 +0000311
312Omitting the first index is similar to zero. Omitting the last index is
Bram Moolenaaref2f6562007-05-06 13:32:59 +0000313similar to -1. >
Bram Moolenaar540d6e32005-01-09 21:20:18 +0000314 :let endlist = mylist[2:] " from item 2 to the end: [3, "four"]
315 :let shortlist = mylist[2:2] " List with one item: [3]
316 :let otherlist = mylist[:] " make a copy of the List
Bram Moolenaard7ee7ce2005-01-03 21:02:03 +0000317
Bram Moolenaar6601b622021-01-13 21:47:15 +0100318Notice that the last index is inclusive. If you prefer using an exclusive
319index use the |slice()| method.
320
Bram Moolenaarf9393ef2006-04-24 19:47:27 +0000321If the first index is beyond the last item of the List or the second item is
322before the first item, the result is an empty list. There is no error
323message.
324
325If the second index is equal to or greater than the length of the list the
326length minus one is used: >
Bram Moolenaar9e54a0e2006-04-14 20:42:25 +0000327 :let mylist = [0, 1, 2, 3]
328 :echo mylist[2:8] " result: [2, 3]
329
Bram Moolenaara7fc0102005-05-18 22:17:12 +0000330NOTE: mylist[s:e] means using the variable "s:e" as index. Watch out for
Bram Moolenaar58b85342016-08-14 19:54:54 +0200331using a single letter variable before the ":". Insert a space when needed:
Bram Moolenaara7fc0102005-05-18 22:17:12 +0000332mylist[s : e].
333
Bram Moolenaard7ee7ce2005-01-03 21:02:03 +0000334
Bram Moolenaar13065c42005-01-08 16:08:21 +0000335List identity ~
Bram Moolenaard8b02732005-01-14 21:48:43 +0000336 *list-identity*
Bram Moolenaar13065c42005-01-08 16:08:21 +0000337When variable "aa" is a list and you assign it to another variable "bb", both
338variables refer to the same list. Thus changing the list "aa" will also
339change "bb": >
340 :let aa = [1, 2, 3]
341 :let bb = aa
342 :call add(aa, 4)
343 :echo bb
Bram Moolenaar3a3a7232005-01-17 22:16:15 +0000344< [1, 2, 3, 4]
Bram Moolenaar13065c42005-01-08 16:08:21 +0000345
346Making a copy of a list is done with the |copy()| function. Using [:] also
347works, as explained above. This creates a shallow copy of the list: Changing
Bram Moolenaar9588a0f2005-01-08 21:45:39 +0000348a list item in the list will also change the item in the copied list: >
Bram Moolenaar13065c42005-01-08 16:08:21 +0000349 :let aa = [[1, 'a'], 2, 3]
350 :let bb = copy(aa)
Bram Moolenaar3a3a7232005-01-17 22:16:15 +0000351 :call add(aa, 4)
Bram Moolenaar13065c42005-01-08 16:08:21 +0000352 :let aa[0][1] = 'aaa'
353 :echo aa
Bram Moolenaar3a3a7232005-01-17 22:16:15 +0000354< [[1, aaa], 2, 3, 4] >
Bram Moolenaar13065c42005-01-08 16:08:21 +0000355 :echo bb
Bram Moolenaar3a3a7232005-01-17 22:16:15 +0000356< [[1, aaa], 2, 3]
Bram Moolenaar13065c42005-01-08 16:08:21 +0000357
Bram Moolenaar9588a0f2005-01-08 21:45:39 +0000358To make a completely independent list use |deepcopy()|. This also makes a
Bram Moolenaar3a3a7232005-01-17 22:16:15 +0000359copy of the values in the list, recursively. Up to a hundred levels deep.
Bram Moolenaar13065c42005-01-08 16:08:21 +0000360
361The operator "is" can be used to check if two variables refer to the same
Bram Moolenaar3a3a7232005-01-17 22:16:15 +0000362List. "isnot" does the opposite. In contrast "==" compares if two lists have
Bram Moolenaar9588a0f2005-01-08 21:45:39 +0000363the same value. >
364 :let alist = [1, 2, 3]
365 :let blist = [1, 2, 3]
366 :echo alist is blist
Bram Moolenaar3a3a7232005-01-17 22:16:15 +0000367< 0 >
Bram Moolenaar9588a0f2005-01-08 21:45:39 +0000368 :echo alist == blist
Bram Moolenaar3a3a7232005-01-17 22:16:15 +0000369< 1
Bram Moolenaar13065c42005-01-08 16:08:21 +0000370
Bram Moolenaar9ba0eb82005-06-13 22:28:56 +0000371Note about comparing lists: Two lists are considered equal if they have the
372same length and all items compare equal, as with using "==". There is one
Bram Moolenaar7d1f5db2005-07-03 21:39:27 +0000373exception: When comparing a number with a string they are considered
374different. There is no automatic type conversion, as with using "==" on
375variables. Example: >
376 echo 4 == "4"
Bram Moolenaar9ba0eb82005-06-13 22:28:56 +0000377< 1 >
Bram Moolenaar7d1f5db2005-07-03 21:39:27 +0000378 echo [4] == ["4"]
Bram Moolenaar9ba0eb82005-06-13 22:28:56 +0000379< 0
380
Bram Moolenaar7d1f5db2005-07-03 21:39:27 +0000381Thus comparing Lists is more strict than comparing numbers and strings. You
Bram Moolenaar446cb832008-06-24 21:56:24 +0000382can compare simple values this way too by putting them in a list: >
Bram Moolenaar7d1f5db2005-07-03 21:39:27 +0000383
384 :let a = 5
385 :let b = "5"
Bram Moolenaar446cb832008-06-24 21:56:24 +0000386 :echo a == b
Bram Moolenaar7d1f5db2005-07-03 21:39:27 +0000387< 1 >
Bram Moolenaar446cb832008-06-24 21:56:24 +0000388 :echo [a] == [b]
Bram Moolenaar7d1f5db2005-07-03 21:39:27 +0000389< 0
Bram Moolenaar9ba0eb82005-06-13 22:28:56 +0000390
Bram Moolenaar13065c42005-01-08 16:08:21 +0000391
392List unpack ~
393
394To unpack the items in a list to individual variables, put the variables in
395square brackets, like list items: >
396 :let [var1, var2] = mylist
397
398When the number of variables does not match the number of items in the list
399this produces an error. To handle any extra items from the list append ";"
400and a variable name: >
401 :let [var1, var2; rest] = mylist
402
403This works like: >
404 :let var1 = mylist[0]
405 :let var2 = mylist[1]
Bram Moolenaar5f2bb9f2005-01-11 21:29:04 +0000406 :let rest = mylist[2:]
Bram Moolenaar13065c42005-01-08 16:08:21 +0000407
408Except that there is no error if there are only two items. "rest" will be an
409empty list then.
410
411
412List modification ~
413 *list-modification*
Bram Moolenaar9588a0f2005-01-08 21:45:39 +0000414To change a specific item of a list use |:let| this way: >
Bram Moolenaar13065c42005-01-08 16:08:21 +0000415 :let list[4] = "four"
416 :let listlist[0][3] = item
417
Bram Moolenaar9588a0f2005-01-08 21:45:39 +0000418To change part of a list you can specify the first and last item to be
Bram Moolenaar3a3a7232005-01-17 22:16:15 +0000419modified. The value must at least have the number of items in the range: >
Bram Moolenaar9588a0f2005-01-08 21:45:39 +0000420 :let list[3:5] = [3, 4, 5]
421
Bram Moolenaar13065c42005-01-08 16:08:21 +0000422Adding and removing items from a list is done with functions. Here are a few
423examples: >
424 :call insert(list, 'a') " prepend item 'a'
425 :call insert(list, 'a', 3) " insert item 'a' before list[3]
426 :call add(list, "new") " append String item
Bram Moolenaar3a3a7232005-01-17 22:16:15 +0000427 :call add(list, [1, 2]) " append a List as one new item
Bram Moolenaar13065c42005-01-08 16:08:21 +0000428 :call extend(list, [1, 2]) " extend the list with two more items
429 :let i = remove(list, 3) " remove item 3
Bram Moolenaar9cd15162005-01-16 22:02:49 +0000430 :unlet list[3] " idem
Bram Moolenaar13065c42005-01-08 16:08:21 +0000431 :let l = remove(list, 3, -1) " remove items 3 to last item
Bram Moolenaar9cd15162005-01-16 22:02:49 +0000432 :unlet list[3 : ] " idem
Bram Moolenaar3a3a7232005-01-17 22:16:15 +0000433 :call filter(list, 'v:val !~ "x"') " remove items with an 'x'
Bram Moolenaar13065c42005-01-08 16:08:21 +0000434
Bram Moolenaar3a3a7232005-01-17 22:16:15 +0000435Changing the order of items in a list: >
Bram Moolenaar9588a0f2005-01-08 21:45:39 +0000436 :call sort(list) " sort a list alphabetically
437 :call reverse(list) " reverse the order of items
Bram Moolenaar327aa022014-03-25 18:24:23 +0100438 :call uniq(sort(list)) " sort and remove duplicates
Bram Moolenaar9588a0f2005-01-08 21:45:39 +0000439
Bram Moolenaar13065c42005-01-08 16:08:21 +0000440
441For loop ~
442
Bram Moolenaar74e54fc2021-03-26 20:41:29 +0100443The |:for| loop executes commands for each item in a List, String or Blob.
444A variable is set to each item in sequence. Example with a List: >
Bram Moolenaar3a3a7232005-01-17 22:16:15 +0000445 :for item in mylist
446 : call Doit(item)
Bram Moolenaar13065c42005-01-08 16:08:21 +0000447 :endfor
448
449This works like: >
450 :let index = 0
451 :while index < len(mylist)
Bram Moolenaar3a3a7232005-01-17 22:16:15 +0000452 : let item = mylist[index]
453 : :call Doit(item)
Bram Moolenaar13065c42005-01-08 16:08:21 +0000454 : let index = index + 1
455 :endwhile
456
Bram Moolenaar5f2bb9f2005-01-11 21:29:04 +0000457If all you want to do is modify each item in the list then the |map()|
Bram Moolenaar3a3a7232005-01-17 22:16:15 +0000458function will be a simpler method than a for loop.
Bram Moolenaar5f2bb9f2005-01-11 21:29:04 +0000459
Bram Moolenaar58b85342016-08-14 19:54:54 +0200460Just like the |:let| command, |:for| also accepts a list of variables. This
Bram Moolenaar74e54fc2021-03-26 20:41:29 +0100461requires the argument to be a List of Lists. >
Bram Moolenaar13065c42005-01-08 16:08:21 +0000462 :for [lnum, col] in [[1, 3], [2, 8], [3, 0]]
463 : call Doit(lnum, col)
464 :endfor
465
466This works like a |:let| command is done for each list item. Again, the types
467must remain the same to avoid an error.
468
Bram Moolenaar3a3a7232005-01-17 22:16:15 +0000469It is also possible to put remaining items in a List variable: >
Bram Moolenaar13065c42005-01-08 16:08:21 +0000470 :for [i, j; rest] in listlist
471 : call Doit(i, j)
472 : if !empty(rest)
Bram Moolenaarc51cf032022-02-26 12:25:45 +0000473 : echo "remainder: " .. string(rest)
Bram Moolenaar13065c42005-01-08 16:08:21 +0000474 : endif
475 :endfor
476
Bram Moolenaar74e54fc2021-03-26 20:41:29 +0100477For a Blob one byte at a time is used.
478
479For a String one character, including any composing characters, is used as a
480String. Example: >
481 for c in text
482 echo 'This character is ' .. c
483 endfor
484
Bram Moolenaar13065c42005-01-08 16:08:21 +0000485
486List functions ~
Bram Moolenaar3a3a7232005-01-17 22:16:15 +0000487 *E714*
Bram Moolenaar13065c42005-01-08 16:08:21 +0000488Functions that are useful with a List: >
Bram Moolenaar9588a0f2005-01-08 21:45:39 +0000489 :let r = call(funcname, list) " call a function with an argument list
Bram Moolenaar13065c42005-01-08 16:08:21 +0000490 :if empty(list) " check if list is empty
Bram Moolenaar2fda12f2005-01-15 22:14:15 +0000491 :let l = len(list) " number of items in list
492 :let big = max(list) " maximum value in list
493 :let small = min(list) " minimum value in list
Bram Moolenaar9588a0f2005-01-08 21:45:39 +0000494 :let xs = count(list, 'x') " count nr of times 'x' appears in list
495 :let i = index(list, 'x') " index of first 'x' in list
Bram Moolenaar13065c42005-01-08 16:08:21 +0000496 :let lines = getline(1, 10) " get ten text lines from buffer
497 :call append('$', lines) " append text lines in buffer
Bram Moolenaar5f2bb9f2005-01-11 21:29:04 +0000498 :let list = split("a b c") " create list from items in a string
499 :let string = join(list, ', ') " create string from list items
Bram Moolenaar2fda12f2005-01-15 22:14:15 +0000500 :let s = string(list) " String representation of list
Bram Moolenaarc51cf032022-02-26 12:25:45 +0000501 :call map(list, '">> " .. v:val') " prepend ">> " to each item
Bram Moolenaar13065c42005-01-08 16:08:21 +0000502
Bram Moolenaar0cb032e2005-04-23 20:52:00 +0000503Don't forget that a combination of features can make things simple. For
504example, to add up all the numbers in a list: >
Bram Moolenaarc51cf032022-02-26 12:25:45 +0000505 :exe 'let sum = ' .. join(nrlist, '+')
Bram Moolenaar0cb032e2005-04-23 20:52:00 +0000506
Bram Moolenaar13065c42005-01-08 16:08:21 +0000507
Bram Moolenaard8b02732005-01-14 21:48:43 +00005081.4 Dictionaries ~
Bram Moolenaard8968242019-01-15 22:51:57 +0100509 *dict* *Dict* *Dictionaries* *Dictionary*
Bram Moolenaard8b02732005-01-14 21:48:43 +0000510A Dictionary is an associative array: Each entry has a key and a value. The
Bram Moolenaar3a3a7232005-01-17 22:16:15 +0000511entry can be located with the key. The entries are stored without a specific
512ordering.
Bram Moolenaard8b02732005-01-14 21:48:43 +0000513
514
515Dictionary creation ~
Bram Moolenaar3a3a7232005-01-17 22:16:15 +0000516 *E720* *E721* *E722* *E723*
Bram Moolenaarcbaff5e2022-04-08 17:45:08 +0100517A Dictionary is created with a comma-separated list of entries in curly
Bram Moolenaar3a3a7232005-01-17 22:16:15 +0000518braces. Each entry has a key and a value, separated by a colon. Each key can
519only appear once. Examples: >
Bram Moolenaard8b02732005-01-14 21:48:43 +0000520 :let mydict = {1: 'one', 2: 'two', 3: 'three'}
521 :let emptydict = {}
Bram Moolenaar3a3a7232005-01-17 22:16:15 +0000522< *E713* *E716* *E717*
Bram Moolenaard8b02732005-01-14 21:48:43 +0000523A key is always a String. You can use a Number, it will be converted to a
524String automatically. Thus the String '4' and the number 4 will find the same
Bram Moolenaar58b85342016-08-14 19:54:54 +0200525entry. Note that the String '04' and the Number 04 are different, since the
Bram Moolenaard899e512022-05-07 21:54:03 +0100526Number will be converted to the String '4', leading zeros are dropped. The
527empty string can also be used as a key.
Bram Moolenaar5da36052021-12-27 15:39:57 +0000528
529In |Vim9| script literaly keys can be used if the key consists of alphanumeric
530characters, underscore and dash, see |vim9-literal-dict|.
Bram Moolenaar56c860c2019-08-17 20:09:31 +0200531 *literal-Dict* *#{}*
Bram Moolenaar5da36052021-12-27 15:39:57 +0000532To avoid having to put quotes around every key the #{} form can be used in
533legacy script. This does require the key to consist only of ASCII letters,
534digits, '-' and '_'. Example: >
Bram Moolenaar10455d42019-11-21 15:36:18 +0100535 :let mydict = #{zero: 0, one_key: 1, two-key: 2, 333: 3}
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200536Note that 333 here is the string "333". Empty keys are not possible with #{}.
Bram Moolenaard899e512022-05-07 21:54:03 +0100537In |Vim9| script the #{} form cannot be used because it can be confused with
538the start of a comment.
Bram Moolenaard8b02732005-01-14 21:48:43 +0000539
Bram Moolenaar58b85342016-08-14 19:54:54 +0200540A value can be any expression. Using a Dictionary for a value creates a
Bram Moolenaard8b02732005-01-14 21:48:43 +0000541nested Dictionary: >
542 :let nestdict = {1: {11: 'a', 12: 'b'}, 2: {21: 'c'}}
543
544An extra comma after the last entry is ignored.
545
546
547Accessing entries ~
548
549The normal way to access an entry is by putting the key in square brackets: >
550 :let val = mydict["one"]
551 :let mydict["four"] = 4
552
Bram Moolenaar3a3a7232005-01-17 22:16:15 +0000553You can add new entries to an existing Dictionary this way, unlike Lists.
Bram Moolenaard8b02732005-01-14 21:48:43 +0000554
555For keys that consist entirely of letters, digits and underscore the following
556form can be used |expr-entry|: >
557 :let val = mydict.one
558 :let mydict.four = 4
559
560Since an entry can be any type, also a List and a Dictionary, the indexing and
561key lookup can be repeated: >
Bram Moolenaar3a3a7232005-01-17 22:16:15 +0000562 :echo dict.key[idx].key
Bram Moolenaard8b02732005-01-14 21:48:43 +0000563
564
565Dictionary to List conversion ~
566
Bram Moolenaar58b85342016-08-14 19:54:54 +0200567You may want to loop over the entries in a dictionary. For this you need to
Bram Moolenaard8b02732005-01-14 21:48:43 +0000568turn the Dictionary into a List and pass it to |:for|.
569
570Most often you want to loop over the keys, using the |keys()| function: >
571 :for key in keys(mydict)
Bram Moolenaarc51cf032022-02-26 12:25:45 +0000572 : echo key .. ': ' .. mydict[key]
Bram Moolenaard8b02732005-01-14 21:48:43 +0000573 :endfor
574
575The List of keys is unsorted. You may want to sort them first: >
576 :for key in sort(keys(mydict))
577
578To loop over the values use the |values()| function: >
579 :for v in values(mydict)
Bram Moolenaarc51cf032022-02-26 12:25:45 +0000580 : echo "value: " .. v
Bram Moolenaard8b02732005-01-14 21:48:43 +0000581 :endfor
582
583If you want both the key and the value use the |items()| function. It returns
Bram Moolenaard47d5222018-12-09 20:43:55 +0100584a List in which each item is a List with two items, the key and the value: >
Bram Moolenaaref2f6562007-05-06 13:32:59 +0000585 :for [key, value] in items(mydict)
Bram Moolenaarc51cf032022-02-26 12:25:45 +0000586 : echo key .. ': ' .. value
Bram Moolenaard8b02732005-01-14 21:48:43 +0000587 :endfor
588
589
590Dictionary identity ~
Bram Moolenaar7c626922005-02-07 22:01:03 +0000591 *dict-identity*
Bram Moolenaard8b02732005-01-14 21:48:43 +0000592Just like Lists you need to use |copy()| and |deepcopy()| to make a copy of a
593Dictionary. Otherwise, assignment results in referring to the same
594Dictionary: >
595 :let onedict = {'a': 1, 'b': 2}
596 :let adict = onedict
597 :let adict['a'] = 11
598 :echo onedict['a']
599 11
600
Bram Moolenaarf3bd51a2005-06-14 22:11:18 +0000601Two Dictionaries compare equal if all the key-value pairs compare equal. For
602more info see |list-identity|.
Bram Moolenaard8b02732005-01-14 21:48:43 +0000603
604
605Dictionary modification ~
606 *dict-modification*
607To change an already existing entry of a Dictionary, or to add a new entry,
608use |:let| this way: >
609 :let dict[4] = "four"
610 :let dict['one'] = item
611
Bram Moolenaar9cd15162005-01-16 22:02:49 +0000612Removing an entry from a Dictionary is done with |remove()| or |:unlet|.
613Three ways to remove the entry with key "aaa" from dict: >
614 :let i = remove(dict, 'aaa')
615 :unlet dict.aaa
616 :unlet dict['aaa']
Bram Moolenaard8b02732005-01-14 21:48:43 +0000617
618Merging a Dictionary with another is done with |extend()|: >
Bram Moolenaar3a3a7232005-01-17 22:16:15 +0000619 :call extend(adict, bdict)
620This extends adict with all entries from bdict. Duplicate keys cause entries
621in adict to be overwritten. An optional third argument can change this.
Bram Moolenaar383f9bc2005-01-19 22:18:32 +0000622Note that the order of entries in a Dictionary is irrelevant, thus don't
623expect ":echo adict" to show the items from bdict after the older entries in
624adict.
Bram Moolenaard8b02732005-01-14 21:48:43 +0000625
626Weeding out entries from a Dictionary can be done with |filter()|: >
Bram Moolenaaref2f6562007-05-06 13:32:59 +0000627 :call filter(dict, 'v:val =~ "x"')
Bram Moolenaar3a3a7232005-01-17 22:16:15 +0000628This removes all entries from "dict" with a value not matching 'x'.
Bram Moolenaar388a5d42020-05-26 21:20:45 +0200629This can also be used to remove all entries: >
630 call filter(dict, 0)
Bram Moolenaar2fda12f2005-01-15 22:14:15 +0000631
632
633Dictionary function ~
Bram Moolenaar26402cb2013-02-20 21:26:00 +0100634 *Dictionary-function* *self* *E725* *E862*
Bram Moolenaar2fda12f2005-01-15 22:14:15 +0000635When a function is defined with the "dict" attribute it can be used in a
Bram Moolenaar58b85342016-08-14 19:54:54 +0200636special way with a dictionary. Example: >
Bram Moolenaar2fda12f2005-01-15 22:14:15 +0000637 :function Mylen() dict
Bram Moolenaar3a3a7232005-01-17 22:16:15 +0000638 : return len(self.data)
Bram Moolenaar2fda12f2005-01-15 22:14:15 +0000639 :endfunction
Bram Moolenaar3a3a7232005-01-17 22:16:15 +0000640 :let mydict = {'data': [0, 1, 2, 3], 'len': function("Mylen")}
641 :echo mydict.len()
Bram Moolenaar2fda12f2005-01-15 22:14:15 +0000642
643This is like a method in object oriented programming. The entry in the
644Dictionary is a |Funcref|. The local variable "self" refers to the dictionary
645the function was invoked from.
646
Bram Moolenaar3a3a7232005-01-17 22:16:15 +0000647It is also possible to add a function without the "dict" attribute as a
648Funcref to a Dictionary, but the "self" variable is not available then.
649
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000650 *numbered-function* *anonymous-function*
Bram Moolenaar2fda12f2005-01-15 22:14:15 +0000651To avoid the extra name for the function it can be defined and directly
652assigned to a Dictionary in this way: >
Bram Moolenaar3a3a7232005-01-17 22:16:15 +0000653 :let mydict = {'data': [0, 1, 2, 3]}
Bram Moolenaar5a5f4592015-04-13 12:43:06 +0200654 :function mydict.len()
Bram Moolenaar3a3a7232005-01-17 22:16:15 +0000655 : return len(self.data)
Bram Moolenaar2fda12f2005-01-15 22:14:15 +0000656 :endfunction
Bram Moolenaar3a3a7232005-01-17 22:16:15 +0000657 :echo mydict.len()
Bram Moolenaar2fda12f2005-01-15 22:14:15 +0000658
Bram Moolenaar3a3a7232005-01-17 22:16:15 +0000659The function will then get a number and the value of dict.len is a |Funcref|
Bram Moolenaar58b85342016-08-14 19:54:54 +0200660that references this function. The function can only be used through a
Bram Moolenaar3a3a7232005-01-17 22:16:15 +0000661|Funcref|. It will automatically be deleted when there is no |Funcref|
662remaining that refers to it.
663
664It is not necessary to use the "dict" attribute for a numbered function.
Bram Moolenaar2fda12f2005-01-15 22:14:15 +0000665
Bram Moolenaar1affd722010-08-04 17:49:30 +0200666If you get an error for a numbered function, you can find out what it is with
667a trick. Assuming the function is 42, the command is: >
Bram Moolenaar34cc7d82021-09-21 20:09:51 +0200668 :function g:42
Bram Moolenaar1affd722010-08-04 17:49:30 +0200669
Bram Moolenaar2fda12f2005-01-15 22:14:15 +0000670
671Functions for Dictionaries ~
Bram Moolenaar3a3a7232005-01-17 22:16:15 +0000672 *E715*
673Functions that can be used with a Dictionary: >
Bram Moolenaar2fda12f2005-01-15 22:14:15 +0000674 :if has_key(dict, 'foo') " TRUE if dict has entry with key "foo"
675 :if empty(dict) " TRUE if dict is empty
676 :let l = len(dict) " number of items in dict
677 :let big = max(dict) " maximum value in dict
678 :let small = min(dict) " minimum value in dict
679 :let xs = count(dict, 'x') " count nr of times 'x' appears in dict
680 :let s = string(dict) " String representation of dict
Bram Moolenaarc51cf032022-02-26 12:25:45 +0000681 :call map(dict, '">> " .. v:val') " prepend ">> " to each item
Bram Moolenaard8b02732005-01-14 21:48:43 +0000682
683
Bram Moolenaard8968242019-01-15 22:51:57 +01006841.5 Blobs ~
685 *blob* *Blob* *Blobs* *E978*
Bram Moolenaaraff74912019-03-30 18:11:49 +0100686A Blob is a binary object. It can be used to read an image from a file and
687send it over a channel, for example.
688
689A Blob mostly behaves like a |List| of numbers, where each number has the
690value of an 8-bit byte, from 0 to 255.
Bram Moolenaard8968242019-01-15 22:51:57 +0100691
692
693Blob creation ~
694
695A Blob can be created with a |blob-literal|: >
696 :let b = 0zFF00ED015DAF
Bram Moolenaar0d17f0d2019-01-22 22:20:38 +0100697Dots can be inserted between bytes (pair of hex characters) for readability,
698they don't change the value: >
699 :let b = 0zFF00.ED01.5DAF
Bram Moolenaard8968242019-01-15 22:51:57 +0100700
701A blob can be read from a file with |readfile()| passing the {type} argument
702set to "B", for example: >
703 :let b = readfile('image.png', 'B')
704
705A blob can be read from a channel with the |ch_readblob()| function.
706
707
708Blob index ~
709 *blob-index* *E979*
710A byte in the Blob can be accessed by putting the index in square brackets
711after the Blob. Indexes are zero-based, thus the first byte has index zero. >
712 :let myblob = 0z00112233
713 :let byte = myblob[0] " get the first byte: 0x00
714 :let byte = myblob[2] " get the third byte: 0x22
715
716A negative index is counted from the end. Index -1 refers to the last byte in
717the Blob, -2 to the last but one byte, etc. >
718 :let last = myblob[-1] " get the last byte: 0x33
719
720To avoid an error for an invalid index use the |get()| function. When an item
721is not available it returns -1 or the default value you specify: >
722 :echo get(myblob, idx)
723 :echo get(myblob, idx, 999)
724
725
Bram Moolenaar5e66b422019-01-24 21:58:10 +0100726Blob iteration ~
727
728The |:for| loop executes commands for each byte of a Blob. The loop variable is
729set to each byte in the Blob. Example: >
730 :for byte in 0z112233
731 : call Doit(byte)
732 :endfor
733This calls Doit() with 0x11, 0x22 and 0x33.
734
735
Bram Moolenaard8968242019-01-15 22:51:57 +0100736Blob concatenation ~
737
738Two blobs can be concatenated with the "+" operator: >
739 :let longblob = myblob + 0z4455
740 :let myblob += 0z6677
741
742To change a blob in-place see |blob-modification| below.
743
744
745Part of a blob ~
746
747A part of the Blob can be obtained by specifying the first and last index,
748separated by a colon in square brackets: >
749 :let myblob = 0z00112233
Bram Moolenaard09091d2019-01-17 16:07:22 +0100750 :let shortblob = myblob[1:2] " get 0z1122
Bram Moolenaard8968242019-01-15 22:51:57 +0100751 :let shortblob = myblob[2:-1] " get 0z2233
752
753Omitting the first index is similar to zero. Omitting the last index is
754similar to -1. >
755 :let endblob = myblob[2:] " from item 2 to the end: 0z2233
756 :let shortblob = myblob[2:2] " Blob with one byte: 0z22
757 :let otherblob = myblob[:] " make a copy of the Blob
758
Bram Moolenaard09091d2019-01-17 16:07:22 +0100759If the first index is beyond the last byte of the Blob or the second index is
Bram Moolenaaraa5df7e2019-02-03 14:53:10 +0100760before the first index, the result is an empty Blob. There is no error
Bram Moolenaard8968242019-01-15 22:51:57 +0100761message.
762
763If the second index is equal to or greater than the length of the list the
764length minus one is used: >
765 :echo myblob[2:8] " result: 0z2233
766
767
768Blob modification ~
Bram Moolenaara2baa732022-02-04 16:09:54 +0000769 *blob-modification* *E1182* *E1184*
Bram Moolenaard8968242019-01-15 22:51:57 +0100770To change a specific byte of a blob use |:let| this way: >
771 :let blob[4] = 0x44
772
773When the index is just one beyond the end of the Blob, it is appended. Any
774higher index is an error.
775
776To change a sequence of bytes the [:] notation can be used: >
777 let blob[1:3] = 0z445566
Bram Moolenaard09091d2019-01-17 16:07:22 +0100778The length of the replaced bytes must be exactly the same as the value
Bram Moolenaard8968242019-01-15 22:51:57 +0100779provided. *E972*
780
781To change part of a blob you can specify the first and last byte to be
Bram Moolenaard09091d2019-01-17 16:07:22 +0100782modified. The value must have the same number of bytes in the range: >
783 :let blob[3:5] = 0z334455
Bram Moolenaard8968242019-01-15 22:51:57 +0100784
785You can also use the functions |add()|, |remove()| and |insert()|.
786
787
788Blob identity ~
789
790Blobs can be compared for equality: >
791 if blob == 0z001122
792And for equal identity: >
793 if blob is otherblob
794< *blob-identity* *E977*
795When variable "aa" is a Blob and you assign it to another variable "bb", both
796variables refer to the same Blob. Then the "is" operator returns true.
797
798When making a copy using [:] or |copy()| the values are the same, but the
799identity is different: >
800 :let blob = 0z112233
801 :let blob2 = blob
802 :echo blob == blob2
803< 1 >
804 :echo blob is blob2
805< 1 >
806 :let blob3 = blob[:]
807 :echo blob == blob3
808< 1 >
809 :echo blob is blob3
810< 0
811
Bram Moolenaard09091d2019-01-17 16:07:22 +0100812Making a copy of a Blob is done with the |copy()| function. Using [:] also
Bram Moolenaard8968242019-01-15 22:51:57 +0100813works, as explained above.
814
815
8161.6 More about variables ~
Bram Moolenaar13065c42005-01-08 16:08:21 +0000817 *more-variables*
Bram Moolenaar071d4272004-06-13 20:20:40 +0000818If you need to know the type of a variable or expression, use the |type()|
819function.
820
821When the '!' flag is included in the 'viminfo' option, global variables that
822start with an uppercase letter, and don't contain a lowercase letter, are
823stored in the viminfo file |viminfo-file|.
824
825When the 'sessionoptions' option contains "global", global variables that
826start with an uppercase letter and contain at least one lowercase letter are
827stored in the session file |session-file|.
828
829variable name can be stored where ~
830my_var_6 not
831My_Var_6 session file
832MY_VAR_6 viminfo file
833
834
Bram Moolenaar5da36052021-12-27 15:39:57 +0000835In legacy script it is possible to form a variable name with curly braces, see
Bram Moolenaar071d4272004-06-13 20:20:40 +0000836|curly-braces-names|.
837
838==============================================================================
8392. Expression syntax *expression-syntax*
Bram Moolenaarf10911e2022-01-29 22:20:48 +0000840 *E1143*
Bram Moolenaar071d4272004-06-13 20:20:40 +0000841Expression syntax summary, from least to most significant:
842
Bram Moolenaar50ba5262016-09-22 22:33:02 +0200843|expr1| expr2
Bram Moolenaar89bcfda2016-08-30 23:26:57 +0200844 expr2 ? expr1 : expr1 if-then-else
Bram Moolenaar071d4272004-06-13 20:20:40 +0000845
Bram Moolenaar89bcfda2016-08-30 23:26:57 +0200846|expr2| expr3
Bram Moolenaar0f248b02019-04-04 15:36:05 +0200847 expr3 || expr3 ... logical OR
Bram Moolenaar071d4272004-06-13 20:20:40 +0000848
Bram Moolenaar89bcfda2016-08-30 23:26:57 +0200849|expr3| expr4
Bram Moolenaar0f248b02019-04-04 15:36:05 +0200850 expr4 && expr4 ... logical AND
Bram Moolenaar071d4272004-06-13 20:20:40 +0000851
Bram Moolenaar89bcfda2016-08-30 23:26:57 +0200852|expr4| expr5
853 expr5 == expr5 equal
Bram Moolenaar071d4272004-06-13 20:20:40 +0000854 expr5 != expr5 not equal
855 expr5 > expr5 greater than
856 expr5 >= expr5 greater than or equal
857 expr5 < expr5 smaller than
858 expr5 <= expr5 smaller than or equal
859 expr5 =~ expr5 regexp matches
860 expr5 !~ expr5 regexp doesn't match
861
862 expr5 ==? expr5 equal, ignoring case
863 expr5 ==# expr5 equal, match case
864 etc. As above, append ? for ignoring case, # for
865 matching case
866
Bram Moolenaar5e66b422019-01-24 21:58:10 +0100867 expr5 is expr5 same |List|, |Dictionary| or |Blob| instance
868 expr5 isnot expr5 different |List|, |Dictionary| or |Blob|
869 instance
Bram Moolenaarde8866b2005-01-06 23:24:37 +0000870
Bram Moolenaar89bcfda2016-08-30 23:26:57 +0200871|expr5| expr6
Bram Moolenaar0f248b02019-04-04 15:36:05 +0200872 expr6 + expr6 ... number addition, list or blob concatenation
873 expr6 - expr6 ... number subtraction
874 expr6 . expr6 ... string concatenation
875 expr6 .. expr6 ... string concatenation
Bram Moolenaar071d4272004-06-13 20:20:40 +0000876
Bram Moolenaar89bcfda2016-08-30 23:26:57 +0200877|expr6| expr7
Bram Moolenaar0f248b02019-04-04 15:36:05 +0200878 expr7 * expr7 ... number multiplication
879 expr7 / expr7 ... number division
880 expr7 % expr7 ... number modulo
Bram Moolenaar071d4272004-06-13 20:20:40 +0000881
Bram Moolenaar89bcfda2016-08-30 23:26:57 +0200882|expr7| expr8
Bram Moolenaar5da36052021-12-27 15:39:57 +0000883 <type>expr8 type check and conversion (|Vim9| only)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000884
Bram Moolenaar89bcfda2016-08-30 23:26:57 +0200885|expr8| expr9
Bram Moolenaar5da36052021-12-27 15:39:57 +0000886 ! expr8 logical NOT
887 - expr8 unary minus
888 + expr8 unary plus
Bram Moolenaar2fda12f2005-01-15 22:14:15 +0000889
Bram Moolenaar5da36052021-12-27 15:39:57 +0000890|expr9| expr10
891 expr9[expr1] byte of a String or item of a |List|
892 expr9[expr1 : expr1] substring of a String or sublist of a |List|
893 expr9.name entry in a |Dictionary|
894 expr9(expr1, ...) function call with |Funcref| variable
895 expr9->name(expr1, ...) |method| call
896
897|expr10| number number constant
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +0000898 "string" string constant, backslash is special
Bram Moolenaard8b02732005-01-14 21:48:43 +0000899 'string' string constant, ' is doubled
Bram Moolenaar32466aa2006-02-24 23:53:04 +0000900 [expr1, ...] |List|
901 {expr1: expr1, ...} |Dictionary|
Bram Moolenaar5da36052021-12-27 15:39:57 +0000902 #{key: expr1, ...} legacy |Dictionary|
Bram Moolenaar071d4272004-06-13 20:20:40 +0000903 &option option value
904 (expr1) nested expression
905 variable internal variable
906 va{ria}ble internal variable with curly braces
907 $VAR environment variable
908 @r contents of register 'r'
909 function(expr1, ...) function call
910 func{ti}on(expr1, ...) function call with curly braces
Bram Moolenaar5da36052021-12-27 15:39:57 +0000911 {args -> expr1} legacy lambda expression
912 (args) => expr1 Vim9 lambda expression
Bram Moolenaar071d4272004-06-13 20:20:40 +0000913
914
Bram Moolenaar0f248b02019-04-04 15:36:05 +0200915"..." indicates that the operations in this level can be concatenated.
Bram Moolenaar071d4272004-06-13 20:20:40 +0000916Example: >
917 &nu || &list && &shell == "csh"
918
919All expressions within one level are parsed from left to right.
920
Bram Moolenaarf10911e2022-01-29 22:20:48 +0000921Expression nesting is limited to 1000 levels deep (300 when build with MSVC)
922to avoid running out of stack and crashing. *E1169*
923
Bram Moolenaar071d4272004-06-13 20:20:40 +0000924
Bram Moolenaarc51cf032022-02-26 12:25:45 +0000925expr1 *expr1* *ternary* *falsy-operator* *??* *E109*
Bram Moolenaar071d4272004-06-13 20:20:40 +0000926-----
927
Bram Moolenaarc51cf032022-02-26 12:25:45 +0000928The ternary operator: expr2 ? expr1 : expr1
Bram Moolenaar92f26c22020-10-03 20:17:30 +0200929The falsy operator: expr2 ?? expr1
930
Bram Moolenaarc51cf032022-02-26 12:25:45 +0000931Ternary operator ~
Bram Moolenaar071d4272004-06-13 20:20:40 +0000932
Bram Moolenaar5da36052021-12-27 15:39:57 +0000933In legacy script the expression before the '?' is evaluated to a number. If
934it evaluates to |TRUE|, the result is the value of the expression between the
935'?' and ':', otherwise the result is the value of the expression after the
936':'.
937
938In |Vim9| script the first expression must evaluate to a boolean, see
939|vim9-boolean|.
940
Bram Moolenaar071d4272004-06-13 20:20:40 +0000941Example: >
942 :echo lnum == 1 ? "top" : lnum
943
944Since the first expression is an "expr2", it cannot contain another ?:. The
945other two expressions can, thus allow for recursive use of ?:.
946Example: >
947 :echo lnum == 1 ? "top" : lnum == 1000 ? "last" : lnum
948
949To keep this readable, using |line-continuation| is suggested: >
950 :echo lnum == 1
951 :\ ? "top"
952 :\ : lnum == 1000
953 :\ ? "last"
954 :\ : lnum
955
Bram Moolenaaref2f6562007-05-06 13:32:59 +0000956You should always put a space before the ':', otherwise it can be mistaken for
957use in a variable such as "a:1".
958
Bram Moolenaar92f26c22020-10-03 20:17:30 +0200959Falsy operator ~
960
961This is also known as the "null coalescing operator", but that's too
962complicated, thus we just call it the falsy operator.
963
964The expression before the '??' is evaluated. If it evaluates to
965|truthy|, this is used as the result. Otherwise the expression after the '??'
966is evaluated and used as the result. This is most useful to have a default
967value for an expression that may result in zero or empty: >
968 echo theList ?? 'list is empty'
969 echo GetName() ?? 'unknown'
970
971These are similar, but not equal: >
972 expr2 ?? expr1
973 expr2 ? expr2 : expr1
Bram Moolenaar5da36052021-12-27 15:39:57 +0000974In the second line "expr2" is evaluated twice. And in |Vim9| script the type
975of expr2 before "?" must be a boolean.
Bram Moolenaar92f26c22020-10-03 20:17:30 +0200976
Bram Moolenaar071d4272004-06-13 20:20:40 +0000977
978expr2 and expr3 *expr2* *expr3*
979---------------
980
Bram Moolenaar04186092016-08-29 21:55:35 +0200981expr3 || expr3 .. logical OR *expr-barbar*
982expr4 && expr4 .. logical AND *expr-&&*
983
Bram Moolenaar5da36052021-12-27 15:39:57 +0000984The "||" and "&&" operators take one argument on each side.
Bram Moolenaar071d4272004-06-13 20:20:40 +0000985
Bram Moolenaar5da36052021-12-27 15:39:57 +0000986In legacy script the arguments are (converted to) Numbers.
987
988In |Vim9| script the values must be boolean, see |vim9-boolean|. Use "!!" to
989convert any type to a boolean.
990
991The result is:
Bram Moolenaare381d3d2016-07-07 14:50:41 +0200992 input output ~
993n1 n2 n1 || n2 n1 && n2 ~
994|FALSE| |FALSE| |FALSE| |FALSE|
995|FALSE| |TRUE| |TRUE| |FALSE|
996|TRUE| |FALSE| |TRUE| |FALSE|
997|TRUE| |TRUE| |TRUE| |TRUE|
Bram Moolenaar071d4272004-06-13 20:20:40 +0000998
999The operators can be concatenated, for example: >
1000
1001 &nu || &list && &shell == "csh"
1002
1003Note that "&&" takes precedence over "||", so this has the meaning of: >
1004
1005 &nu || (&list && &shell == "csh")
1006
1007Once the result is known, the expression "short-circuits", that is, further
1008arguments are not evaluated. This is like what happens in C. For example: >
1009
1010 let a = 1
1011 echo a || b
1012
Bram Moolenaare381d3d2016-07-07 14:50:41 +02001013This is valid even if there is no variable called "b" because "a" is |TRUE|,
1014so the result must be |TRUE|. Similarly below: >
Bram Moolenaar071d4272004-06-13 20:20:40 +00001015
1016 echo exists("b") && b == "yes"
1017
1018This is valid whether "b" has been defined or not. The second clause will
1019only be evaluated if "b" has been defined.
1020
1021
Bram Moolenaara2baa732022-02-04 16:09:54 +00001022expr4 *expr4* *E1153*
Bram Moolenaar071d4272004-06-13 20:20:40 +00001023-----
1024
1025expr5 {cmp} expr5
1026
Bram Moolenaar5da36052021-12-27 15:39:57 +00001027Compare two expr5 expressions. In legacy script the result is a 0 if it
1028evaluates to false, or 1 if it evaluates to true. In |Vim9| script the result
1029is |true| or |false|.
Bram Moolenaar071d4272004-06-13 20:20:40 +00001030
Bram Moolenaar446cb832008-06-24 21:56:24 +00001031 *expr-==* *expr-!=* *expr->* *expr->=*
Bram Moolenaar071d4272004-06-13 20:20:40 +00001032 *expr-<* *expr-<=* *expr-=~* *expr-!~*
1033 *expr-==#* *expr-!=#* *expr->#* *expr->=#*
1034 *expr-<#* *expr-<=#* *expr-=~#* *expr-!~#*
1035 *expr-==?* *expr-!=?* *expr->?* *expr->=?*
1036 *expr-<?* *expr-<=?* *expr-=~?* *expr-!~?*
Bram Moolenaar251e1912011-06-19 05:09:16 +02001037 *expr-is* *expr-isnot* *expr-is#* *expr-isnot#*
Bram Moolenaar6f4754b2022-01-23 12:07:04 +00001038 *expr-is?* *expr-isnot?* *E1072*
Bram Moolenaar071d4272004-06-13 20:20:40 +00001039 use 'ignorecase' match case ignore case ~
1040equal == ==# ==?
1041not equal != !=# !=?
1042greater than > ># >?
1043greater than or equal >= >=# >=?
1044smaller than < <# <?
1045smaller than or equal <= <=# <=?
1046regexp matches =~ =~# =~?
1047regexp doesn't match !~ !~# !~?
Bram Moolenaar251e1912011-06-19 05:09:16 +02001048same instance is is# is?
1049different instance isnot isnot# isnot?
Bram Moolenaar071d4272004-06-13 20:20:40 +00001050
1051Examples:
1052"abc" ==# "Abc" evaluates to 0
1053"abc" ==? "Abc" evaluates to 1
1054"abc" == "Abc" evaluates to 1 if 'ignorecase' is set, 0 otherwise
Bram Moolenaar5da36052021-12-27 15:39:57 +00001055NOTE: In |Vim9| script 'ignorecase' is not used.
Bram Moolenaar071d4272004-06-13 20:20:40 +00001056
Bram Moolenaar13065c42005-01-08 16:08:21 +00001057 *E691* *E692*
Bram Moolenaar01164a62017-11-02 22:58:42 +01001058A |List| can only be compared with a |List| and only "equal", "not equal",
1059"is" and "isnot" can be used. This compares the values of the list,
1060recursively. Ignoring case means case is ignored when comparing item values.
Bram Moolenaarde8866b2005-01-06 23:24:37 +00001061
Bram Moolenaar3a3a7232005-01-17 22:16:15 +00001062 *E735* *E736*
Bram Moolenaar32466aa2006-02-24 23:53:04 +00001063A |Dictionary| can only be compared with a |Dictionary| and only "equal", "not
Bram Moolenaar01164a62017-11-02 22:58:42 +01001064equal", "is" and "isnot" can be used. This compares the key/values of the
1065|Dictionary| recursively. Ignoring case means case is ignored when comparing
1066item values.
Bram Moolenaar3a3a7232005-01-17 22:16:15 +00001067
Bram Moolenaaraa3b15d2016-04-21 08:53:19 +02001068 *E694*
Bram Moolenaare18dbe82016-07-02 21:42:23 +02001069A |Funcref| can only be compared with a |Funcref| and only "equal", "not
1070equal", "is" and "isnot" can be used. Case is never ignored. Whether
1071arguments or a Dictionary are bound (with a partial) matters. The
1072Dictionaries must also be equal (or the same, in case of "is") and the
1073arguments must be equal (or the same).
1074
1075To compare Funcrefs to see if they refer to the same function, ignoring bound
1076Dictionary and arguments, use |get()| to get the function name: >
1077 if get(Part1, 'name') == get(Part2, 'name')
1078 " Part1 and Part2 refer to the same function
Bram Moolenaar6f4754b2022-01-23 12:07:04 +00001079< *E1037*
Bram Moolenaar5e66b422019-01-24 21:58:10 +01001080Using "is" or "isnot" with a |List|, |Dictionary| or |Blob| checks whether
1081the expressions are referring to the same |List|, |Dictionary| or |Blob|
1082instance. A copy of a |List| is different from the original |List|. When
1083using "is" without a |List|, |Dictionary| or |Blob|, it is equivalent to
1084using "equal", using "isnot" equivalent to using "not equal". Except that
1085a different type means the values are different: >
Bram Moolenaar86edef62016-03-13 18:07:30 +01001086 echo 4 == '4'
1087 1
1088 echo 4 is '4'
1089 0
1090 echo 0 is []
1091 0
1092"is#"/"isnot#" and "is?"/"isnot?" can be used to match and ignore case.
Bram Moolenaarde8866b2005-01-06 23:24:37 +00001093
Bram Moolenaar5da36052021-12-27 15:39:57 +00001094In legacy script, when comparing a String with a Number, the String is
1095converted to a Number, and the comparison is done on Numbers. This means
1096that: >
Bram Moolenaar86edef62016-03-13 18:07:30 +01001097 echo 0 == 'x'
1098 1
1099because 'x' converted to a Number is zero. However: >
1100 echo [0] == ['x']
1101 0
1102Inside a List or Dictionary this conversion is not used.
Bram Moolenaar071d4272004-06-13 20:20:40 +00001103
Bram Moolenaar5da36052021-12-27 15:39:57 +00001104In |Vim9| script the types must match.
1105
Bram Moolenaar071d4272004-06-13 20:20:40 +00001106When comparing two Strings, this is done with strcmp() or stricmp(). This
1107results in the mathematical difference (comparing byte values), not
1108necessarily the alphabetical difference in the local language.
1109
Bram Moolenaar446cb832008-06-24 21:56:24 +00001110When using the operators with a trailing '#', or the short version and
Bram Moolenaaref2f6562007-05-06 13:32:59 +00001111'ignorecase' is off, the comparing is done with strcmp(): case matters.
Bram Moolenaar071d4272004-06-13 20:20:40 +00001112
1113When using the operators with a trailing '?', or the short version and
Bram Moolenaaref2f6562007-05-06 13:32:59 +00001114'ignorecase' is set, the comparing is done with stricmp(): case is ignored.
1115
1116'smartcase' is not used.
Bram Moolenaar071d4272004-06-13 20:20:40 +00001117
1118The "=~" and "!~" operators match the lefthand argument with the righthand
1119argument, which is used as a pattern. See |pattern| for what a pattern is.
1120This matching is always done like 'magic' was set and 'cpoptions' is empty, no
1121matter what the actual value of 'magic' or 'cpoptions' is. This makes scripts
1122portable. To avoid backslashes in the regexp pattern to be doubled, use a
1123single-quote string, see |literal-string|.
1124Since a string is considered to be a single line, a multi-line pattern
1125(containing \n, backslash-n) will not match. However, a literal NL character
1126can be matched like an ordinary character. Examples:
1127 "foo\nbar" =~ "\n" evaluates to 1
1128 "foo\nbar" =~ "\\n" evaluates to 0
1129
1130
Bram Moolenaar6f4754b2022-01-23 12:07:04 +00001131expr5 and expr6 *expr5* *expr6* *E1036* *E1051*
Bram Moolenaar071d4272004-06-13 20:20:40 +00001132---------------
Bram Moolenaar0f248b02019-04-04 15:36:05 +02001133expr6 + expr6 Number addition, |List| or |Blob| concatenation *expr-+*
1134expr6 - expr6 Number subtraction *expr--*
1135expr6 . expr6 String concatenation *expr-.*
1136expr6 .. expr6 String concatenation *expr-..*
Bram Moolenaar071d4272004-06-13 20:20:40 +00001137
Bram Moolenaara23ccb82006-02-27 00:08:02 +00001138For |Lists| only "+" is possible and then both expr6 must be a list. The
Bram Moolenaar32466aa2006-02-24 23:53:04 +00001139result is a new list with the two lists Concatenated.
Bram Moolenaarde8866b2005-01-06 23:24:37 +00001140
Bram Moolenaar0f248b02019-04-04 15:36:05 +02001141For String concatenation ".." is preferred, since "." is ambiguous, it is also
1142used for |Dict| member access and floating point numbers.
Bram Moolenaar5da36052021-12-27 15:39:57 +00001143In |Vim9| script and when |vimscript-version| is 2 or higher, using "." is not
1144allowed.
1145
1146In |Vim9| script the arguments of ".." are converted to String for simple
1147types: Number, Float, Special and Bool. For other types |string()| should be
1148used.
Bram Moolenaar0f248b02019-04-04 15:36:05 +02001149
Bram Moolenaar5e66b422019-01-24 21:58:10 +01001150expr7 * expr7 Number multiplication *expr-star*
1151expr7 / expr7 Number division *expr-/*
1152expr7 % expr7 Number modulo *expr-%*
Bram Moolenaar071d4272004-06-13 20:20:40 +00001153
Bram Moolenaar5da36052021-12-27 15:39:57 +00001154In legacy script, for all operators except "." and "..", Strings are converted
1155to Numbers.
1156
Bram Moolenaard6e256c2011-12-14 15:32:50 +01001157For bitwise operators see |and()|, |or()| and |xor()|.
Bram Moolenaar071d4272004-06-13 20:20:40 +00001158
Bram Moolenaar5da36052021-12-27 15:39:57 +00001159Note the difference between "+" and ".." in legacy script:
Bram Moolenaar071d4272004-06-13 20:20:40 +00001160 "123" + "456" = 579
Bram Moolenaar5da36052021-12-27 15:39:57 +00001161 "123" .. "456" = "123456"
Bram Moolenaar071d4272004-06-13 20:20:40 +00001162
Bram Moolenaar5da36052021-12-27 15:39:57 +00001163Since '..' has the same precedence as '+' and '-', you need to read: >
1164 1 .. 90 + 90.0
Bram Moolenaar446cb832008-06-24 21:56:24 +00001165As: >
Bram Moolenaar5da36052021-12-27 15:39:57 +00001166 (1 .. 90) + 90.0
1167That works in legacy script, since the String "190" is automatically converted
1168to the Number 190, which can be added to the Float 90.0. However: >
1169 1 .. 90 * 90.0
Bram Moolenaar446cb832008-06-24 21:56:24 +00001170Should be read as: >
Bram Moolenaar5da36052021-12-27 15:39:57 +00001171 1 .. (90 * 90.0)
1172Since '..' has lower precedence than '*'. This does NOT work, since this
Bram Moolenaar446cb832008-06-24 21:56:24 +00001173attempts to concatenate a Float and a String.
1174
1175When dividing a Number by zero the result depends on the value:
1176 0 / 0 = -0x80000000 (like NaN for Float)
1177 >0 / 0 = 0x7fffffff (like positive infinity)
1178 <0 / 0 = -0x7fffffff (like negative infinity)
1179 (before Vim 7.2 it was always 0x7fffffff)
Bram Moolenaara2baa732022-02-04 16:09:54 +00001180In |Vim9| script dividing a number by zero is an error. *E1154*
Bram Moolenaar446cb832008-06-24 21:56:24 +00001181
Bram Moolenaar22fcfad2016-07-01 18:17:26 +02001182When 64-bit Number support is enabled:
1183 0 / 0 = -0x8000000000000000 (like NaN for Float)
1184 >0 / 0 = 0x7fffffffffffffff (like positive infinity)
1185 <0 / 0 = -0x7fffffffffffffff (like negative infinity)
1186
Bram Moolenaar071d4272004-06-13 20:20:40 +00001187When the righthand side of '%' is zero, the result is 0.
1188
Bram Moolenaar32466aa2006-02-24 23:53:04 +00001189None of these work for |Funcref|s.
Bram Moolenaarde8866b2005-01-06 23:24:37 +00001190
Bram Moolenaar6f4754b2022-01-23 12:07:04 +00001191".", ".." and "%" do not work for Float. *E804* *E1035*
Bram Moolenaar446cb832008-06-24 21:56:24 +00001192
Bram Moolenaar071d4272004-06-13 20:20:40 +00001193
1194expr7 *expr7*
1195-----
Bram Moolenaar5da36052021-12-27 15:39:57 +00001196<type>expr8
1197
1198This is only available in |Vim9| script, see |type-casting|.
1199
1200
1201expr8 *expr8*
1202-----
1203! expr8 logical NOT *expr-!*
1204- expr8 unary minus *expr-unary--*
1205+ expr8 unary plus *expr-unary-+*
Bram Moolenaar071d4272004-06-13 20:20:40 +00001206
Bram Moolenaare381d3d2016-07-07 14:50:41 +02001207For '!' |TRUE| becomes |FALSE|, |FALSE| becomes |TRUE| (one).
Bram Moolenaar071d4272004-06-13 20:20:40 +00001208For '-' the sign of the number is changed.
Bram Moolenaar6f02b002021-01-10 20:22:54 +01001209For '+' the number is unchanged. Note: "++" has no effect.
Bram Moolenaar071d4272004-06-13 20:20:40 +00001210
Bram Moolenaar5da36052021-12-27 15:39:57 +00001211In legacy script a String will be converted to a Number first. Note that if
1212the string does not start with a digit you likely don't get what you expect.
1213
1214In |Vim9| script an error is given when "-" or "+" is used and the type is not
1215a number.
1216
1217In |Vim9| script "!" can be used for any type and the result is always a
1218boolean. Use "!!" to convert any type to a boolean, according to whether the
1219value is |falsy|.
Bram Moolenaar071d4272004-06-13 20:20:40 +00001220
Bram Moolenaar58b85342016-08-14 19:54:54 +02001221These three can be repeated and mixed. Examples:
Bram Moolenaar071d4272004-06-13 20:20:40 +00001222 !-1 == 0
1223 !!8 == 1
1224 --9 == 9
1225
1226
Bram Moolenaar5da36052021-12-27 15:39:57 +00001227expr9 *expr9*
Bram Moolenaar071d4272004-06-13 20:20:40 +00001228-----
Bram Moolenaar5da36052021-12-27 15:39:57 +00001229This expression is either |expr10| or a sequence of the alternatives below,
Bram Moolenaarfc65cab2018-08-28 22:58:02 +02001230in any order. E.g., these are all possible:
Bram Moolenaar5da36052021-12-27 15:39:57 +00001231 expr9[expr1].name
1232 expr9.name[expr1]
1233 expr9(expr1, ...)[expr1].name
1234 expr9->(expr1, ...)[expr1]
Bram Moolenaarac92e252019-08-03 21:58:38 +02001235Evaluation is always from left to right.
Bram Moolenaarfc65cab2018-08-28 22:58:02 +02001236
Bram Moolenaar5da36052021-12-27 15:39:57 +00001237expr9[expr1] item of String or |List| *expr-[]* *E111*
Bram Moolenaar6f4754b2022-01-23 12:07:04 +00001238 *E909* *subscript* *E1062*
Bram Moolenaare3c37d82020-08-15 18:39:05 +02001239In legacy Vim script:
Bram Moolenaar5da36052021-12-27 15:39:57 +00001240If expr9 is a Number or String this results in a String that contains the
1241expr1'th single byte from expr9. expr9 is used as a String (a number is
Bram Moolenaare3c37d82020-08-15 18:39:05 +02001242automatically converted to a String), expr1 as a Number. This doesn't
Bram Moolenaar207f0092020-08-30 17:20:20 +02001243recognize multibyte encodings, see `byteidx()` for an alternative, or use
Bram Moolenaare3c37d82020-08-15 18:39:05 +02001244`split()` to turn the string into a list of characters. Example, to get the
1245byte under the cursor: >
Bram Moolenaar61660ea2006-04-07 21:40:07 +00001246 :let c = getline(".")[col(".") - 1]
Bram Moolenaar071d4272004-06-13 20:20:40 +00001247
Bram Moolenaara2baa732022-02-04 16:09:54 +00001248In |Vim9| script: *E1147* *E1148*
Bram Moolenaar5da36052021-12-27 15:39:57 +00001249If expr9 is a String this results in a String that contains the expr1'th
1250single character (including any composing characters) from expr9. To use byte
Bram Moolenaar02b4d9b2021-03-14 19:46:45 +01001251indexes use |strpart()|.
Bram Moolenaare3c37d82020-08-15 18:39:05 +02001252
1253Index zero gives the first byte or character. Careful: text column numbers
1254start with one!
1255
Bram Moolenaar071d4272004-06-13 20:20:40 +00001256If the length of the String is less than the index, the result is an empty
Bram Moolenaar85084ef2016-01-17 22:26:33 +01001257String. A negative index always results in an empty string (reason: backward
Bram Moolenaare3c37d82020-08-15 18:39:05 +02001258compatibility). Use [-1:] to get the last byte or character.
Bram Moolenaar6f02b002021-01-10 20:22:54 +01001259In Vim9 script a negative index is used like with a list: count from the end.
Bram Moolenaard7ee7ce2005-01-03 21:02:03 +00001260
Bram Moolenaar5da36052021-12-27 15:39:57 +00001261If expr9 is a |List| then it results the item at index expr1. See |list-index|
Bram Moolenaard7ee7ce2005-01-03 21:02:03 +00001262for possible index values. If the index is out of range this results in an
Bram Moolenaar58b85342016-08-14 19:54:54 +02001263error. Example: >
Bram Moolenaard7ee7ce2005-01-03 21:02:03 +00001264 :let item = mylist[-1] " get last item
1265
Bram Moolenaar32466aa2006-02-24 23:53:04 +00001266Generally, if a |List| index is equal to or higher than the length of the
1267|List|, or more negative than the length of the |List|, this results in an
1268error.
Bram Moolenaard7ee7ce2005-01-03 21:02:03 +00001269
Bram Moolenaard8b02732005-01-14 21:48:43 +00001270
Bram Moolenaar5da36052021-12-27 15:39:57 +00001271expr9[expr1a : expr1b] substring or sublist *expr-[:]*
Bram Moolenaard7ee7ce2005-01-03 21:02:03 +00001272
Bram Moolenaar5da36052021-12-27 15:39:57 +00001273If expr9 is a String this results in the substring with the bytes or
1274characters from expr1a to and including expr1b. expr9 is used as a String,
Bram Moolenaar207f0092020-08-30 17:20:20 +02001275expr1a and expr1b are used as a Number.
Bram Moolenaare3c37d82020-08-15 18:39:05 +02001276
1277In legacy Vim script the indexes are byte indexes. This doesn't recognize
Bram Moolenaar5da36052021-12-27 15:39:57 +00001278multibyte encodings, see |byteidx()| for computing the indexes. If expr9 is
Bram Moolenaare3c37d82020-08-15 18:39:05 +02001279a Number it is first converted to a String.
1280
Bram Moolenaar02b4d9b2021-03-14 19:46:45 +01001281In Vim9 script the indexes are character indexes and include composing
1282characters. To use byte indexes use |strpart()|. To use character indexes
1283without including composing characters use |strcharpart()|.
Bram Moolenaard7ee7ce2005-01-03 21:02:03 +00001284
Bram Moolenaar6601b622021-01-13 21:47:15 +01001285The item at index expr1b is included, it is inclusive. For an exclusive index
1286use the |slice()| function.
1287
Bram Moolenaard7ee7ce2005-01-03 21:02:03 +00001288If expr1a is omitted zero is used. If expr1b is omitted the length of the
1289string minus one is used.
1290
1291A negative number can be used to measure from the end of the string. -1 is
1292the last character, -2 the last but one, etc.
1293
1294If an index goes out of range for the string characters are omitted. If
1295expr1b is smaller than expr1a the result is an empty string.
1296
1297Examples: >
1298 :let c = name[-1:] " last byte of a string
Bram Moolenaar207f0092020-08-30 17:20:20 +02001299 :let c = name[0:-1] " the whole string
Bram Moolenaard7ee7ce2005-01-03 21:02:03 +00001300 :let c = name[-2:-2] " last but one byte of a string
1301 :let s = line(".")[4:] " from the fifth byte to the end
1302 :let s = s[:-3] " remove last two bytes
Bram Moolenaar8f3f58f2010-01-06 20:52:26 +01001303<
Bram Moolenaarbc8801c2016-08-02 21:04:33 +02001304 *slice*
Bram Moolenaar5da36052021-12-27 15:39:57 +00001305If expr9 is a |List| this results in a new |List| with the items indicated by
Bram Moolenaar58b85342016-08-14 19:54:54 +02001306the indexes expr1a and expr1b. This works like with a String, as explained
Bram Moolenaarbc8801c2016-08-02 21:04:33 +02001307just above. Also see |sublist| below. Examples: >
Bram Moolenaard7ee7ce2005-01-03 21:02:03 +00001308 :let l = mylist[:3] " first four items
1309 :let l = mylist[4:4] " List with one item
1310 :let l = mylist[:] " shallow copy of a List
1311
Bram Moolenaar5da36052021-12-27 15:39:57 +00001312If expr9 is a |Blob| this results in a new |Blob| with the bytes in the
Bram Moolenaar6e5ea8d2019-01-12 22:47:31 +01001313indexes expr1a and expr1b, inclusive. Examples: >
1314 :let b = 0zDEADBEEF
1315 :let bs = b[1:2] " 0zADBE
Bram Moolenaard09091d2019-01-17 16:07:22 +01001316 :let bs = b[:] " copy of 0zDEADBEEF
Bram Moolenaar6e5ea8d2019-01-12 22:47:31 +01001317
Bram Moolenaar5da36052021-12-27 15:39:57 +00001318Using expr9[expr1] or expr9[expr1a : expr1b] on a |Funcref| results in an
Bram Moolenaar32466aa2006-02-24 23:53:04 +00001319error.
Bram Moolenaar071d4272004-06-13 20:20:40 +00001320
Bram Moolenaarda440d22016-01-16 21:27:23 +01001321Watch out for confusion between a namespace and a variable followed by a colon
1322for a sublist: >
1323 mylist[n:] " uses variable n
1324 mylist[s:] " uses namespace s:, error!
1325
Bram Moolenaard8b02732005-01-14 21:48:43 +00001326
Bram Moolenaar5da36052021-12-27 15:39:57 +00001327expr9.name entry in a |Dictionary| *expr-entry*
Bram Moolenaara2baa732022-02-04 16:09:54 +00001328 *E1203* *E1229*
Bram Moolenaar5da36052021-12-27 15:39:57 +00001329If expr9 is a |Dictionary| and it is followed by a dot, then the following
Bram Moolenaar32466aa2006-02-24 23:53:04 +00001330name will be used as a key in the |Dictionary|. This is just like:
Bram Moolenaar5da36052021-12-27 15:39:57 +00001331expr9[name].
Bram Moolenaard8b02732005-01-14 21:48:43 +00001332
1333The name must consist of alphanumeric characters, just like a variable name,
1334but it may start with a number. Curly braces cannot be used.
1335
1336There must not be white space before or after the dot.
1337
1338Examples: >
1339 :let dict = {"one": 1, 2: "two"}
Bram Moolenaar68e65602019-05-26 21:33:31 +02001340 :echo dict.one " shows "1"
1341 :echo dict.2 " shows "two"
1342 :echo dict .2 " error because of space before the dot
Bram Moolenaard8b02732005-01-14 21:48:43 +00001343
1344Note that the dot is also used for String concatenation. To avoid confusion
1345always put spaces around the dot for String concatenation.
1346
1347
Bram Moolenaarf10911e2022-01-29 22:20:48 +00001348expr9(expr1, ...) |Funcref| function call *E1085*
Bram Moolenaar2fda12f2005-01-15 22:14:15 +00001349
Bram Moolenaar5da36052021-12-27 15:39:57 +00001350When expr9 is a |Funcref| type variable, invoke the function it refers to.
Bram Moolenaar2fda12f2005-01-15 22:14:15 +00001351
1352
Bram Moolenaar5da36052021-12-27 15:39:57 +00001353expr9->name([args]) method call *method* *->*
1354expr9->{lambda}([args])
Bram Moolenaara2baa732022-02-04 16:09:54 +00001355 *E260* *E276* *E1265*
Bram Moolenaar25e42232019-08-04 15:04:10 +02001356For methods that are also available as global functions this is the same as: >
Bram Moolenaar5da36052021-12-27 15:39:57 +00001357 name(expr9 [, args])
1358There can also be methods specifically for the type of "expr9".
Bram Moolenaar2fda12f2005-01-15 22:14:15 +00001359
Bram Moolenaar51841322019-08-08 21:10:01 +02001360This allows for chaining, passing the value that one method returns to the
1361next method: >
Bram Moolenaar25e42232019-08-04 15:04:10 +02001362 mylist->filter(filterexpr)->map(mapexpr)->sort()->join()
1363<
Bram Moolenaar22a0c0c2019-08-09 23:25:08 +02001364Example of using a lambda: >
Bram Moolenaar02b31112019-08-31 22:16:38 +02001365 GetPercentage()->{x -> x * 100}()->printf('%d%%')
Bram Moolenaar56c860c2019-08-17 20:09:31 +02001366<
Bram Moolenaar5da36052021-12-27 15:39:57 +00001367When using -> the |expr8| operators will be applied first, thus: >
Bram Moolenaar93cf85f2019-08-17 21:36:28 +02001368 -1.234->string()
1369Is equivalent to: >
1370 (-1.234)->string()
1371And NOT: >
1372 -(1.234->string())
Bram Moolenaar6f4754b2022-01-23 12:07:04 +00001373
1374What comes after "->" can be a name, a simple expression (not containing any
Bram Moolenaar944697a2022-02-20 19:48:20 +00001375parenthesis), or any expression in parentheses: >
Bram Moolenaar6f4754b2022-01-23 12:07:04 +00001376 base->name(args)
1377 base->some.name(args)
1378 base->alist[idx](args)
1379 base->(getFuncRef())(args)
1380Note that in the last call the base is passed to the function resulting from
1381"(getFuncRef())", inserted before "args".
1382
Bram Moolenaar51841322019-08-08 21:10:01 +02001383 *E274*
1384"->name(" must not contain white space. There can be white space before the
1385"->" and after the "(", thus you can split the lines like this: >
1386 mylist
1387 \ ->filter(filterexpr)
1388 \ ->map(mapexpr)
1389 \ ->sort()
1390 \ ->join()
Bram Moolenaar56c860c2019-08-17 20:09:31 +02001391
1392When using the lambda form there must be no white space between the } and the
1393(.
1394
Bram Moolenaar25e42232019-08-04 15:04:10 +02001395
Bram Moolenaar5da36052021-12-27 15:39:57 +00001396 *expr10*
Bram Moolenaar071d4272004-06-13 20:20:40 +00001397number
1398------
Bram Moolenaarb0d45e72017-11-05 18:19:24 +01001399number number constant *expr-number*
Bram Moolenaar071d4272004-06-13 20:20:40 +00001400
Bram Moolenaar6f02b002021-01-10 20:22:54 +01001401 *0x* *hex-number* *0o* *octal-number* *binary-number*
Bram Moolenaar7571d552016-08-18 22:54:46 +02001402Decimal, Hexadecimal (starting with 0x or 0X), Binary (starting with 0b or 0B)
Bram Moolenaarc17e66c2020-06-02 21:38:22 +02001403and Octal (starting with 0, 0o or 0O).
Bram Moolenaar071d4272004-06-13 20:20:40 +00001404
Bram Moolenaar446cb832008-06-24 21:56:24 +00001405 *floating-point-format*
1406Floating point numbers can be written in two forms:
1407
1408 [-+]{N}.{M}
Bram Moolenaar8a94d872015-01-25 13:02:57 +01001409 [-+]{N}.{M}[eE][-+]{exp}
Bram Moolenaar446cb832008-06-24 21:56:24 +00001410
1411{N} and {M} are numbers. Both {N} and {M} must be present and can only
Bram Moolenaar6aa57292021-08-14 21:25:52 +02001412contain digits, except that in |Vim9| script in {N} single quotes between
1413digits are ignored.
Bram Moolenaar446cb832008-06-24 21:56:24 +00001414[-+] means there is an optional plus or minus sign.
1415{exp} is the exponent, power of 10.
Bram Moolenaar58b85342016-08-14 19:54:54 +02001416Only a decimal point is accepted, not a comma. No matter what the current
Bram Moolenaar446cb832008-06-24 21:56:24 +00001417locale is.
1418{only when compiled with the |+float| feature}
1419
1420Examples:
1421 123.456
1422 +0.0001
1423 55.0
1424 -0.123
1425 1.234e03
1426 1.0E-6
1427 -3.1416e+88
1428
1429These are INVALID:
1430 3. empty {M}
1431 1e40 missing .{M}
1432
1433Rationale:
1434Before floating point was introduced, the text "123.456" was interpreted as
1435the two numbers "123" and "456", both converted to a string and concatenated,
1436resulting in the string "123456". Since this was considered pointless, and we
Bram Moolenaare37d50a2008-08-06 17:06:04 +00001437could not find it intentionally being used in Vim scripts, this backwards
Bram Moolenaar446cb832008-06-24 21:56:24 +00001438incompatibility was accepted in favor of being able to use the normal notation
1439for floating point numbers.
1440
Bram Moolenaard47d5222018-12-09 20:43:55 +01001441 *float-pi* *float-e*
1442A few useful values to copy&paste: >
1443 :let pi = 3.14159265359
1444 :let e = 2.71828182846
1445Or, if you don't want to write them in as floating-point literals, you can
1446also use functions, like the following: >
1447 :let pi = acos(-1.0)
1448 :let e = exp(1.0)
Bram Moolenaar98aefe72018-12-13 22:20:09 +01001449<
Bram Moolenaar446cb832008-06-24 21:56:24 +00001450 *floating-point-precision*
1451The precision and range of floating points numbers depends on what "double"
1452means in the library Vim was compiled with. There is no way to change this at
1453runtime.
1454
1455The default for displaying a |Float| is to use 6 decimal places, like using
1456printf("%g", f). You can select something else when using the |printf()|
1457function. Example: >
1458 :echo printf('%.15e', atan(1))
1459< 7.853981633974483e-01
1460
1461
Bram Moolenaar071d4272004-06-13 20:20:40 +00001462
Bram Moolenaar979243b2015-06-26 19:35:49 +02001463string *string* *String* *expr-string* *E114*
Bram Moolenaar071d4272004-06-13 20:20:40 +00001464------
1465"string" string constant *expr-quote*
1466
1467Note that double quotes are used.
1468
1469A string constant accepts these special characters:
1470\... three-digit octal number (e.g., "\316")
1471\.. two-digit octal number (must be followed by non-digit)
1472\. one-digit octal number (must be followed by non-digit)
1473\x.. byte specified with two hex numbers (e.g., "\x1f")
1474\x. byte specified with one hex number (must be followed by non-hex char)
1475\X.. same as \x..
1476\X. same as \x.
Bram Moolenaar446cb832008-06-24 21:56:24 +00001477\u.... character specified with up to 4 hex numbers, stored according to the
Bram Moolenaar071d4272004-06-13 20:20:40 +00001478 current value of 'encoding' (e.g., "\u02a4")
Bram Moolenaar541f92d2015-06-19 13:27:23 +02001479\U.... same as \u but allows up to 8 hex numbers.
Bram Moolenaar071d4272004-06-13 20:20:40 +00001480\b backspace <BS>
1481\e escape <Esc>
Bram Moolenaar6e649222021-10-04 21:32:54 +01001482\f formfeed 0x0C
Bram Moolenaar071d4272004-06-13 20:20:40 +00001483\n newline <NL>
1484\r return <CR>
1485\t tab <Tab>
1486\\ backslash
1487\" double quote
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001488\<xxx> Special key named "xxx". e.g. "\<C-W>" for CTRL-W. This is for use
Bram Moolenaar58b85342016-08-14 19:54:54 +02001489 in mappings, the 0x80 byte is escaped.
1490 To use the double quote character it must be escaped: "<M-\">".
Bram Moolenaar6e649222021-10-04 21:32:54 +01001491 Don't use <Char-xxxx> to get a UTF-8 character, use \uxxxx as
Bram Moolenaar58b85342016-08-14 19:54:54 +02001492 mentioned above.
Bram Moolenaarfccd93f2020-05-31 22:06:51 +02001493\<*xxx> Like \<xxx> but prepends a modifier instead of including it in the
1494 character. E.g. "\<C-w>" is one character 0x17 while "\<*C-w>" is four
Bram Moolenaarebe9d342020-05-30 21:52:54 +02001495 bytes: 3 for the CTRL modifier and then character "W".
Bram Moolenaar071d4272004-06-13 20:20:40 +00001496
Bram Moolenaaref2f6562007-05-06 13:32:59 +00001497Note that "\xff" is stored as the byte 255, which may be invalid in some
1498encodings. Use "\u00ff" to store character 255 according to the current value
1499of 'encoding'.
1500
Bram Moolenaar071d4272004-06-13 20:20:40 +00001501Note that "\000" and "\x00" force the end of the string.
1502
1503
Bram Moolenaard8968242019-01-15 22:51:57 +01001504blob-literal *blob-literal* *E973*
Bram Moolenaar6e5ea8d2019-01-12 22:47:31 +01001505------------
1506
1507Hexadecimal starting with 0z or 0Z, with an arbitrary number of bytes.
1508The sequence must be an even number of hex characters. Example: >
1509 :let b = 0zFF00ED015DAF
1510
1511
Bram Moolenaar071d4272004-06-13 20:20:40 +00001512literal-string *literal-string* *E115*
1513---------------
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00001514'string' string constant *expr-'*
Bram Moolenaar071d4272004-06-13 20:20:40 +00001515
1516Note that single quotes are used.
1517
Bram Moolenaar58b85342016-08-14 19:54:54 +02001518This string is taken as it is. No backslashes are removed or have a special
Bram Moolenaard8b02732005-01-14 21:48:43 +00001519meaning. The only exception is that two quotes stand for one quote.
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00001520
1521Single quoted strings are useful for patterns, so that backslashes do not need
Bram Moolenaar58b85342016-08-14 19:54:54 +02001522to be doubled. These two commands are equivalent: >
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00001523 if a =~ "\\s*"
1524 if a =~ '\s*'
Bram Moolenaar071d4272004-06-13 20:20:40 +00001525
1526
LemonBoy2eaef102022-05-06 13:14:50 +01001527interpolated-string *interp-string* *E256*
1528--------------------
1529$"string" interpolated string constant *expr-$quote*
1530$'string' interpolated literal string constant *expr-$'*
1531
1532Interpolated strings are an extension of the |string| and |literal-string|,
1533allowing the inclusion of Vim script expressions (see |expr1|). Any
1534expression returning a value can be enclosed between curly braces. The value
1535is converted to a string. All the text and results of the expressions
1536are concatenated to make a new string.
Bram Moolenaar3f32a5f2022-05-12 20:34:15 +01001537 *E1278*
LemonBoy2eaef102022-05-06 13:14:50 +01001538To include an opening brace '{' or closing brace '}' in the string content
Bram Moolenaar3f32a5f2022-05-12 20:34:15 +01001539double it. For double quoted strings using a backslash also works. A single
1540closing brace '}' will result in an error.
LemonBoy2eaef102022-05-06 13:14:50 +01001541
1542Examples: >
1543 let your_name = input("What's your name? ")
Bram Moolenaar3f32a5f2022-05-12 20:34:15 +01001544< What's your name? Peter ~
1545>
1546 echo
LemonBoy2eaef102022-05-06 13:14:50 +01001547 echo $"Hello, {your_name}!"
Bram Moolenaar3f32a5f2022-05-12 20:34:15 +01001548< Hello, Peter! ~
1549>
1550 echo $"The square root of {{9}} is {sqrt(9)}"
1551< The square root of {9} is 3.0 ~
1552
LemonBoy2eaef102022-05-06 13:14:50 +01001553
Bram Moolenaar071d4272004-06-13 20:20:40 +00001554option *expr-option* *E112* *E113*
1555------
1556&option option value, local value if possible
1557&g:option global option value
1558&l:option local option value
1559
1560Examples: >
Bram Moolenaarc51cf032022-02-26 12:25:45 +00001561 echo "tabstop is " .. &tabstop
Bram Moolenaar071d4272004-06-13 20:20:40 +00001562 if &insertmode
1563
1564Any option name can be used here. See |options|. When using the local value
1565and there is no buffer-local or window-local value, the global value is used
1566anyway.
1567
1568
Bram Moolenaaref2f6562007-05-06 13:32:59 +00001569register *expr-register* *@r*
Bram Moolenaar071d4272004-06-13 20:20:40 +00001570--------
1571@r contents of register 'r'
1572
1573The result is the contents of the named register, as a single string.
1574Newlines are inserted where required. To get the contents of the unnamed
Bram Moolenaar58b85342016-08-14 19:54:54 +02001575register use @" or @@. See |registers| for an explanation of the available
Bram Moolenaare7566042005-06-17 22:00:15 +00001576registers.
1577
1578When using the '=' register you get the expression itself, not what it
1579evaluates to. Use |eval()| to evaluate it.
Bram Moolenaar071d4272004-06-13 20:20:40 +00001580
1581
Bram Moolenaara2baa732022-02-04 16:09:54 +00001582nesting *expr-nesting* *E110*
Bram Moolenaar071d4272004-06-13 20:20:40 +00001583-------
1584(expr1) nested expression
1585
1586
1587environment variable *expr-env*
1588--------------------
1589$VAR environment variable
1590
1591The String value of any environment variable. When it is not defined, the
1592result is an empty string.
Bram Moolenaar691ddee2019-05-09 14:52:41 +02001593
1594The functions `getenv()` and `setenv()` can also be used and work for
1595environment variables with non-alphanumeric names.
1596The function `environ()` can be used to get a Dict with all environment
1597variables.
1598
1599
Bram Moolenaar071d4272004-06-13 20:20:40 +00001600 *expr-env-expand*
1601Note that there is a difference between using $VAR directly and using
1602expand("$VAR"). Using it directly will only expand environment variables that
1603are known inside the current Vim session. Using expand() will first try using
1604the environment variables known inside the current Vim session. If that
1605fails, a shell will be used to expand the variable. This can be slow, but it
1606does expand all variables that the shell knows about. Example: >
Bram Moolenaar34401cc2014-08-29 15:12:19 +02001607 :echo $shell
1608 :echo expand("$shell")
1609The first one probably doesn't echo anything, the second echoes the $shell
Bram Moolenaar071d4272004-06-13 20:20:40 +00001610variable (if your shell supports it).
1611
1612
Bram Moolenaarf10911e2022-01-29 22:20:48 +00001613internal variable *expr-variable* *E1015* *E1089*
Bram Moolenaar071d4272004-06-13 20:20:40 +00001614-----------------
1615variable internal variable
1616See below |internal-variables|.
1617
1618
Bram Moolenaar05159a02005-02-26 23:04:13 +00001619function call *expr-function* *E116* *E118* *E119* *E120*
Bram Moolenaar071d4272004-06-13 20:20:40 +00001620-------------
1621function(expr1, ...) function call
1622See below |functions|.
1623
1624
Bram Moolenaar069c1e72016-07-15 21:25:08 +02001625lambda expression *expr-lambda* *lambda*
1626-----------------
Bram Moolenaar2f0936c2022-01-08 21:51:59 +00001627{args -> expr1} legacy lambda expression *E451*
Bram Moolenaar5da36052021-12-27 15:39:57 +00001628(args) => expr1 |Vim9| lambda expression
Bram Moolenaar069c1e72016-07-15 21:25:08 +02001629
1630A lambda expression creates a new unnamed function which returns the result of
Bram Moolenaar42ebd062016-07-17 13:35:14 +02001631evaluating |expr1|. Lambda expressions differ from |user-functions| in
Bram Moolenaar069c1e72016-07-15 21:25:08 +02001632the following ways:
1633
16341. The body of the lambda expression is an |expr1| and not a sequence of |Ex|
1635 commands.
Bram Moolenaar1e96d9b2016-07-29 22:15:09 +020016362. The prefix "a:" should not be used for arguments. E.g.: >
Bram Moolenaar069c1e72016-07-15 21:25:08 +02001637 :let F = {arg1, arg2 -> arg1 - arg2}
1638 :echo F(5, 2)
1639< 3
1640
1641The arguments are optional. Example: >
1642 :let F = {-> 'error function'}
Bram Moolenaar130cbfc2021-04-07 21:07:20 +02001643 :echo F('ignored')
Bram Moolenaar069c1e72016-07-15 21:25:08 +02001644< error function
Bram Moolenaar130cbfc2021-04-07 21:07:20 +02001645
Bram Moolenaar5da36052021-12-27 15:39:57 +00001646The |Vim9| lambda does not only use a different syntax, it also adds type
1647checking and can be split over multiple lines, see |vim9-lambda|.
Bram Moolenaar130cbfc2021-04-07 21:07:20 +02001648
Bram Moolenaar1e96d9b2016-07-29 22:15:09 +02001649 *closure*
1650Lambda expressions can access outer scope variables and arguments. This is
Bram Moolenaar50ba5262016-09-22 22:33:02 +02001651often called a closure. Example where "i" and "a:arg" are used in a lambda
Bram Moolenaar6bb2cdf2018-02-24 19:53:53 +01001652while they already exist in the function scope. They remain valid even after
1653the function returns: >
Bram Moolenaar1e96d9b2016-07-29 22:15:09 +02001654 :function Foo(arg)
1655 : let i = 3
1656 : return {x -> x + i - a:arg}
1657 :endfunction
1658 :let Bar = Foo(4)
1659 :echo Bar(6)
1660< 5
Bram Moolenaar437bafe2016-08-01 15:40:54 +02001661
Bram Moolenaar388a5d42020-05-26 21:20:45 +02001662Note that the variables must exist in the outer scope before the lambda is
Bram Moolenaar6bb2cdf2018-02-24 19:53:53 +01001663defined for this to work. See also |:func-closure|.
1664
1665Lambda and closure support can be checked with: >
Bram Moolenaar437bafe2016-08-01 15:40:54 +02001666 if has('lambda')
Bram Moolenaar069c1e72016-07-15 21:25:08 +02001667
1668Examples for using a lambda expression with |sort()|, |map()| and |filter()|: >
1669 :echo map([1, 2, 3], {idx, val -> val + 1})
1670< [2, 3, 4] >
1671 :echo sort([3,7,2,1,4], {a, b -> a - b})
1672< [1, 2, 3, 4, 7]
1673
1674The lambda expression is also useful for Channel, Job and timer: >
1675 :let timer = timer_start(500,
1676 \ {-> execute("echo 'Handler called'", "")},
1677 \ {'repeat': 3})
1678< Handler called
1679 Handler called
1680 Handler called
1681
Bram Moolenaar90df4b92021-07-07 20:26:08 +02001682Note that it is possible to cause memory to be used and not freed if the
1683closure is referenced by the context it depends on: >
1684 function Function()
1685 let x = 0
1686 let F = {-> x}
1687 endfunction
1688The closure uses "x" from the function scope, and "F" in that same scope
1689refers to the closure. This cycle results in the memory not being freed.
1690Recommendation: don't do this.
1691
1692Notice how execute() is used to execute an Ex command. That's ugly though.
Bram Moolenaar130cbfc2021-04-07 21:07:20 +02001693In Vim9 script you can use a command block, see |inline-function|.
Bram Moolenaar1e96d9b2016-07-29 22:15:09 +02001694
1695Lambda expressions have internal names like '<lambda>42'. If you get an error
1696for a lambda expression, you can find what it is with the following command: >
Bram Moolenaar6f02b002021-01-10 20:22:54 +01001697 :function <lambda>42
Bram Moolenaar1e96d9b2016-07-29 22:15:09 +02001698See also: |numbered-function|
1699
Bram Moolenaar071d4272004-06-13 20:20:40 +00001700==============================================================================
Bram Moolenaar6f4754b2022-01-23 12:07:04 +000017013. Internal variable *internal-variables* *E461* *E1001*
Bram Moolenaar4a748032010-09-30 21:47:56 +02001702
Bram Moolenaar071d4272004-06-13 20:20:40 +00001703An internal variable name can be made up of letters, digits and '_'. But it
Bram Moolenaar2f0936c2022-01-08 21:51:59 +00001704cannot start with a digit. In legacy script it is also possible to use curly
Bram Moolenaar5da36052021-12-27 15:39:57 +00001705braces, see |curly-braces-names|.
Bram Moolenaar071d4272004-06-13 20:20:40 +00001706
Bram Moolenaar2f0936c2022-01-08 21:51:59 +00001707In legacy script an internal variable is created with the ":let" command
Bram Moolenaar5da36052021-12-27 15:39:57 +00001708|:let|. An internal variable is explicitly destroyed with the ":unlet"
1709command |:unlet|.
Bram Moolenaar9588a0f2005-01-08 21:45:39 +00001710Using a name that is not an internal variable or refers to a variable that has
1711been destroyed results in an error.
Bram Moolenaar071d4272004-06-13 20:20:40 +00001712
Bram Moolenaar5da36052021-12-27 15:39:57 +00001713In |Vim9| script `:let` is not used and variables work differently, see |:var|.
1714
Bram Moolenaar65e0d772020-06-14 17:29:55 +02001715 *variable-scope*
Bram Moolenaar071d4272004-06-13 20:20:40 +00001716There are several name spaces for variables. Which one is to be used is
1717specified by what is prepended:
1718
Bram Moolenaar5da36052021-12-27 15:39:57 +00001719 (nothing) In a function: local to the function;
1720 in a legacy script: global;
1721 in a |Vim9| script: local to the script
Bram Moolenaar071d4272004-06-13 20:20:40 +00001722|buffer-variable| b: Local to the current buffer.
1723|window-variable| w: Local to the current window.
Bram Moolenaar910f66f2006-04-05 20:41:53 +00001724|tabpage-variable| t: Local to the current tab page.
Bram Moolenaar071d4272004-06-13 20:20:40 +00001725|global-variable| g: Global.
Bram Moolenaar5da36052021-12-27 15:39:57 +00001726|local-variable| l: Local to a function (only in a legacy function)
Bram Moolenaar071d4272004-06-13 20:20:40 +00001727|script-variable| s: Local to a |:source|'ed Vim script.
Bram Moolenaar5da36052021-12-27 15:39:57 +00001728|function-argument| a: Function argument (only in a legacy function).
Bram Moolenaar75b81562014-04-06 14:09:13 +02001729|vim-variable| v: Global, predefined by Vim.
Bram Moolenaar071d4272004-06-13 20:20:40 +00001730
Bram Moolenaar32466aa2006-02-24 23:53:04 +00001731The scope name by itself can be used as a |Dictionary|. For example, to
1732delete all script-local variables: >
Bram Moolenaar8f999f12005-01-25 22:12:55 +00001733 :for k in keys(s:)
1734 : unlet s:[k]
1735 :endfor
Bram Moolenaar65e0d772020-06-14 17:29:55 +02001736
Bram Moolenaar5da36052021-12-27 15:39:57 +00001737Note: in Vim9 script variables can also be local to a block of commands, see
1738|vim9-scopes|.
Bram Moolenaar531da592013-05-06 05:58:55 +02001739 *buffer-variable* *b:var* *b:*
Bram Moolenaar071d4272004-06-13 20:20:40 +00001740A variable name that is preceded with "b:" is local to the current buffer.
1741Thus you can have several "b:foo" variables, one for each buffer.
1742This kind of variable is deleted when the buffer is wiped out or deleted with
1743|:bdelete|.
1744
1745One local buffer variable is predefined:
Bram Moolenaarbf884932013-04-05 22:26:15 +02001746 *b:changedtick* *changetick*
Bram Moolenaar071d4272004-06-13 20:20:40 +00001747b:changedtick The total number of changes to the current buffer. It is
1748 incremented for each change. An undo command is also a change
Bram Moolenaarc024b462019-06-08 18:07:21 +02001749 in this case. Resetting 'modified' when writing the buffer is
1750 also counted.
1751 This can be used to perform an action only when the buffer has
1752 changed. Example: >
Bram Moolenaar071d4272004-06-13 20:20:40 +00001753 :if my_changedtick != b:changedtick
Bram Moolenaar446cb832008-06-24 21:56:24 +00001754 : let my_changedtick = b:changedtick
1755 : call My_Update()
Bram Moolenaar071d4272004-06-13 20:20:40 +00001756 :endif
Bram Moolenaar3df01732017-02-17 22:47:16 +01001757< You cannot change or delete the b:changedtick variable.
1758
Bram Moolenaar531da592013-05-06 05:58:55 +02001759 *window-variable* *w:var* *w:*
Bram Moolenaar071d4272004-06-13 20:20:40 +00001760A variable name that is preceded with "w:" is local to the current window. It
1761is deleted when the window is closed.
1762
Bram Moolenaarad3b3662013-05-17 18:14:19 +02001763 *tabpage-variable* *t:var* *t:*
Bram Moolenaar910f66f2006-04-05 20:41:53 +00001764A variable name that is preceded with "t:" is local to the current tab page,
1765It is deleted when the tab page is closed. {not available when compiled
Bram Moolenaardb84e452010-08-15 13:50:43 +02001766without the |+windows| feature}
Bram Moolenaar910f66f2006-04-05 20:41:53 +00001767
Bram Moolenaar531da592013-05-06 05:58:55 +02001768 *global-variable* *g:var* *g:*
Bram Moolenaar04fb9162021-12-30 20:24:12 +00001769Inside functions and in |Vim9| script global variables are accessed with "g:".
1770Omitting this will access a variable local to a function or script. "g:"
1771can also be used in any other place if you like.
Bram Moolenaar071d4272004-06-13 20:20:40 +00001772
Bram Moolenaar531da592013-05-06 05:58:55 +02001773 *local-variable* *l:var* *l:*
Bram Moolenaar071d4272004-06-13 20:20:40 +00001774Inside functions local variables are accessed without prepending anything.
Bram Moolenaaref2f6562007-05-06 13:32:59 +00001775But you can also prepend "l:" if you like. However, without prepending "l:"
1776you may run into reserved variable names. For example "count". By itself it
1777refers to "v:count". Using "l:count" you can have a local variable with the
1778same name.
Bram Moolenaar071d4272004-06-13 20:20:40 +00001779
1780 *script-variable* *s:var*
Bram Moolenaar04fb9162021-12-30 20:24:12 +00001781In a legacy Vim script variables starting with "s:" can be used. They cannot
1782be accessed from outside of the scripts, thus are local to the script.
1783In |Vim9| script the "s:" prefix can be omitted, variables are script-local by
1784default.
Bram Moolenaar071d4272004-06-13 20:20:40 +00001785
1786They can be used in:
1787- commands executed while the script is sourced
1788- functions defined in the script
1789- autocommands defined in the script
1790- functions and autocommands defined in functions and autocommands which were
1791 defined in the script (recursively)
1792- user defined commands defined in the script
1793Thus not in:
1794- other scripts sourced from this one
1795- mappings
Bram Moolenaar8f3f58f2010-01-06 20:52:26 +01001796- menus
Bram Moolenaar071d4272004-06-13 20:20:40 +00001797- etc.
1798
Bram Moolenaaref2f6562007-05-06 13:32:59 +00001799Script variables can be used to avoid conflicts with global variable names.
1800Take this example: >
Bram Moolenaar071d4272004-06-13 20:20:40 +00001801
1802 let s:counter = 0
1803 function MyCounter()
1804 let s:counter = s:counter + 1
1805 echo s:counter
1806 endfunction
1807 command Tick call MyCounter()
1808
1809You can now invoke "Tick" from any script, and the "s:counter" variable in
1810that script will not be changed, only the "s:counter" in the script where
1811"Tick" was defined is used.
1812
1813Another example that does the same: >
1814
1815 let s:counter = 0
1816 command Tick let s:counter = s:counter + 1 | echo s:counter
1817
1818When calling a function and invoking a user-defined command, the context for
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001819script variables is set to the script where the function or command was
Bram Moolenaar071d4272004-06-13 20:20:40 +00001820defined.
1821
1822The script variables are also available when a function is defined inside a
1823function that is defined in a script. Example: >
1824
1825 let s:counter = 0
1826 function StartCounting(incr)
1827 if a:incr
1828 function MyCounter()
1829 let s:counter = s:counter + 1
1830 endfunction
1831 else
1832 function MyCounter()
1833 let s:counter = s:counter - 1
1834 endfunction
1835 endif
1836 endfunction
1837
1838This defines the MyCounter() function either for counting up or counting down
1839when calling StartCounting(). It doesn't matter from where StartCounting() is
1840called, the s:counter variable will be accessible in MyCounter().
1841
1842When the same script is sourced again it will use the same script variables.
1843They will remain valid as long as Vim is running. This can be used to
1844maintain a counter: >
1845
1846 if !exists("s:counter")
1847 let s:counter = 1
1848 echo "script executed for the first time"
1849 else
1850 let s:counter = s:counter + 1
Bram Moolenaarc51cf032022-02-26 12:25:45 +00001851 echo "script executed " .. s:counter .. " times now"
Bram Moolenaar071d4272004-06-13 20:20:40 +00001852 endif
1853
1854Note that this means that filetype plugins don't get a different set of script
1855variables for each buffer. Use local buffer variables instead |b:var|.
1856
1857
Bram Moolenaard47d5222018-12-09 20:43:55 +01001858PREDEFINED VIM VARIABLES *vim-variable* *v:var* *v:*
Bram Moolenaar6f4754b2022-01-23 12:07:04 +00001859 *E963* *E1063*
Bram Moolenaard47d5222018-12-09 20:43:55 +01001860Some variables can be set by the user, but the type cannot be changed.
Bram Moolenaar071d4272004-06-13 20:20:40 +00001861
Bram Moolenaar69bf6342019-10-29 04:16:57 +01001862 *v:argv* *argv-variable*
1863v:argv The command line arguments Vim was invoked with. This is a
1864 list of strings. The first item is the Vim command.
Bram Moolenaar1588bc82022-03-08 21:35:07 +00001865 See |v:progpath| for the command with full path.
Bram Moolenaar69bf6342019-10-29 04:16:57 +01001866
Bram Moolenaare4efc3b2005-03-07 23:16:51 +00001867 *v:beval_col* *beval_col-variable*
1868v:beval_col The number of the column, over which the mouse pointer is.
1869 This is the byte index in the |v:beval_lnum| line.
1870 Only valid while evaluating the 'balloonexpr' option.
1871
1872 *v:beval_bufnr* *beval_bufnr-variable*
1873v:beval_bufnr The number of the buffer, over which the mouse pointer is. Only
1874 valid while evaluating the 'balloonexpr' option.
1875
1876 *v:beval_lnum* *beval_lnum-variable*
1877v:beval_lnum The number of the line, over which the mouse pointer is. Only
1878 valid while evaluating the 'balloonexpr' option.
1879
1880 *v:beval_text* *beval_text-variable*
Bram Moolenaar24bbcfe2005-06-28 23:32:02 +00001881v:beval_text The text under or after the mouse pointer. Usually a word as
1882 it is useful for debugging a C program. 'iskeyword' applies,
1883 but a dot and "->" before the position is included. When on a
1884 ']' the text before it is used, including the matching '[' and
Bram Moolenaare4efc3b2005-03-07 23:16:51 +00001885 word before it. When on a Visual area within one line the
Bram Moolenaarb4d5fba2017-09-11 19:31:28 +02001886 highlighted text is used. Also see |<cexpr>|.
Bram Moolenaare4efc3b2005-03-07 23:16:51 +00001887 Only valid while evaluating the 'balloonexpr' option.
1888
1889 *v:beval_winnr* *beval_winnr-variable*
1890v:beval_winnr The number of the window, over which the mouse pointer is. Only
Bram Moolenaar00654022011-02-25 14:42:19 +01001891 valid while evaluating the 'balloonexpr' option. The first
1892 window has number zero (unlike most other places where a
1893 window gets a number).
Bram Moolenaare4efc3b2005-03-07 23:16:51 +00001894
Bram Moolenaar511972d2016-06-04 18:09:59 +02001895 *v:beval_winid* *beval_winid-variable*
Bram Moolenaar7571d552016-08-18 22:54:46 +02001896v:beval_winid The |window-ID| of the window, over which the mouse pointer
1897 is. Otherwise like v:beval_winnr.
Bram Moolenaar511972d2016-06-04 18:09:59 +02001898
Bram Moolenaarf193fff2006-04-27 00:02:13 +00001899 *v:char* *char-variable*
Bram Moolenaar8f3f58f2010-01-06 20:52:26 +01001900v:char Argument for evaluating 'formatexpr' and used for the typed
Bram Moolenaar945e2db2010-06-05 17:43:32 +02001901 character when using <expr> in an abbreviation |:map-<expr>|.
Bram Moolenaare6ae6222013-05-21 21:01:10 +02001902 It is also used by the |InsertCharPre| and |InsertEnter| events.
Bram Moolenaarf193fff2006-04-27 00:02:13 +00001903
Bram Moolenaar071d4272004-06-13 20:20:40 +00001904 *v:charconvert_from* *charconvert_from-variable*
1905v:charconvert_from
1906 The name of the character encoding of a file to be converted.
1907 Only valid while evaluating the 'charconvert' option.
1908
1909 *v:charconvert_to* *charconvert_to-variable*
1910v:charconvert_to
1911 The name of the character encoding of a file after conversion.
1912 Only valid while evaluating the 'charconvert' option.
1913
1914 *v:cmdarg* *cmdarg-variable*
1915v:cmdarg This variable is used for two purposes:
1916 1. The extra arguments given to a file read/write command.
1917 Currently these are "++enc=" and "++ff=". This variable is
1918 set before an autocommand event for a file read/write
1919 command is triggered. There is a leading space to make it
1920 possible to append this variable directly after the
Bram Moolenaar58b85342016-08-14 19:54:54 +02001921 read/write command. Note: The "+cmd" argument isn't
Bram Moolenaar071d4272004-06-13 20:20:40 +00001922 included here, because it will be executed anyway.
1923 2. When printing a PostScript file with ":hardcopy" this is
1924 the argument for the ":hardcopy" command. This can be used
1925 in 'printexpr'.
1926
1927 *v:cmdbang* *cmdbang-variable*
1928v:cmdbang Set like v:cmdarg for a file read/write command. When a "!"
1929 was used the value is 1, otherwise it is 0. Note that this
1930 can only be used in autocommands. For user commands |<bang>|
1931 can be used.
Bram Moolenaar84cf6bd2020-06-16 20:03:43 +02001932 *v:collate* *collate-variable*
1933v:collate The current locale setting for collation order of the runtime
1934 environment. This allows Vim scripts to be aware of the
1935 current locale encoding. Technical: it's the value of
1936 LC_COLLATE. When not using a locale the value is "C".
1937 This variable can not be set directly, use the |:language|
1938 command.
1939 See |multi-lang|.
Bram Moolenaar071d4272004-06-13 20:20:40 +00001940
Drew Vogele30d1022021-10-24 20:35:07 +01001941 *v:colornames*
1942v:colornames A dictionary that maps color names to hex color strings. These
1943 color names can be used with the |highlight-guifg|,
1944 |highlight-guibg|, and |highlight-guisp| parameters. Updating
1945 an entry in v:colornames has no immediate effect on the syntax
1946 highlighting. The highlight commands (probably in a
1947 colorscheme script) need to be re-evaluated in order to use
1948 the updated color values. For example: >
1949
1950 :let v:colornames['fuscia'] = '#cf3ab4'
1951 :let v:colornames['mauve'] = '#915f6d'
1952 :highlight Normal guifg=fuscia guibg=mauve
1953<
1954 This cannot be used to override the |cterm-colors| but it can
1955 be used to override other colors. For example, the X11 colors
1956 defined in the `colors/lists/default.vim` (previously defined
1957 in |rgb.txt|). When defining new color names in a plugin, the
1958 recommended practice is to set a color entry only when it does
1959 not already exist. For example: >
1960
1961 :call extend(v:colornames, {
1962 \ 'fuscia': '#cf3ab4',
1963 \ 'mauve': '#915f6d,
1964 \ }, 'keep')
1965<
Bram Moolenaar113cb512021-11-07 20:27:04 +00001966 Using |extend()| with the 'keep' option updates each color only
Drew Vogele30d1022021-10-24 20:35:07 +01001967 if it did not exist in |v:colornames|. Doing so allows the
1968 user to choose the precise color value for a common name
1969 by setting it in their |.vimrc|.
1970
1971 It is possible to remove entries from this dictionary but
Drew Vogela0fca172021-11-13 10:50:01 +00001972 doing so is NOT recommended, because it is disruptive to
Drew Vogele30d1022021-10-24 20:35:07 +01001973 other scripts. It is also unlikely to achieve the desired
Bram Moolenaar113cb512021-11-07 20:27:04 +00001974 result because the |:colorscheme| and |:highlight| commands will
Drew Vogele30d1022021-10-24 20:35:07 +01001975 both automatically load all `colors/lists/default.vim` color
1976 scripts.
1977
Bram Moolenaar42a45122015-07-10 17:56:23 +02001978 *v:completed_item* *completed_item-variable*
1979v:completed_item
1980 |Dictionary| containing the |complete-items| for the most
1981 recently completed word after |CompleteDone|. The
1982 |Dictionary| is empty if the completion failed.
1983
Bram Moolenaar071d4272004-06-13 20:20:40 +00001984 *v:count* *count-variable*
1985v:count The count given for the last Normal mode command. Can be used
Bram Moolenaar58b85342016-08-14 19:54:54 +02001986 to get the count before a mapping. Read-only. Example: >
Bram Moolenaarc51cf032022-02-26 12:25:45 +00001987 :map _x :<C-U>echo "the count is " .. v:count<CR>
Bram Moolenaar071d4272004-06-13 20:20:40 +00001988< Note: The <C-U> is required to remove the line range that you
1989 get when typing ':' after a count.
Bram Moolenaar8f3f58f2010-01-06 20:52:26 +01001990 When there are two counts, as in "3d2w", they are multiplied,
1991 just like what happens in the command, "d6w" for the example.
Bram Moolenaar1d2ba7f2006-02-14 22:29:30 +00001992 Also used for evaluating the 'formatexpr' option.
Bram Moolenaard2e716e2019-04-20 14:39:52 +02001993 "count" also works, for backwards compatibility, unless
1994 |scriptversion| is 3 or higher.
Bram Moolenaar071d4272004-06-13 20:20:40 +00001995
1996 *v:count1* *count1-variable*
1997v:count1 Just like "v:count", but defaults to one when no count is
1998 used.
1999
2000 *v:ctype* *ctype-variable*
2001v:ctype The current locale setting for characters of the runtime
2002 environment. This allows Vim scripts to be aware of the
2003 current locale encoding. Technical: it's the value of
2004 LC_CTYPE. When not using a locale the value is "C".
2005 This variable can not be set directly, use the |:language|
2006 command.
2007 See |multi-lang|.
2008
2009 *v:dying* *dying-variable*
Bram Moolenaar58b85342016-08-14 19:54:54 +02002010v:dying Normally zero. When a deadly signal is caught it's set to
Bram Moolenaar071d4272004-06-13 20:20:40 +00002011 one. When multiple signals are caught the number increases.
2012 Can be used in an autocommand to check if Vim didn't
2013 terminate normally. {only works on Unix}
2014 Example: >
2015 :au VimLeave * if v:dying | echo "\nAAAAaaaarrrggghhhh!!!\n" | endif
Bram Moolenaar0e1e25f2010-05-28 21:07:08 +02002016< Note: if another deadly signal is caught when v:dying is one,
2017 VimLeave autocommands will not be executed.
2018
Bram Moolenaarf0068c52020-11-30 17:42:10 +01002019 *v:exiting* *exiting-variable*
2020v:exiting Vim exit code. Normally zero, non-zero when something went
2021 wrong. The value is v:null before invoking the |VimLeavePre|
2022 and |VimLeave| autocmds. See |:q|, |:x| and |:cquit|.
2023 Example: >
2024 :au VimLeave * echo "Exit value is " .. v:exiting
2025<
Bram Moolenaar37f4cbd2019-08-23 20:58:45 +02002026 *v:echospace* *echospace-variable*
2027v:echospace Number of screen cells that can be used for an `:echo` message
2028 in the last screen line before causing the |hit-enter-prompt|.
2029 Depends on 'showcmd', 'ruler' and 'columns'. You need to
2030 check 'cmdheight' for whether there are full-width lines
2031 available above the last line.
2032
Bram Moolenaar071d4272004-06-13 20:20:40 +00002033 *v:errmsg* *errmsg-variable*
2034v:errmsg Last given error message. It's allowed to set this variable.
2035 Example: >
2036 :let v:errmsg = ""
2037 :silent! next
2038 :if v:errmsg != ""
2039 : ... handle error
Bram Moolenaard2e716e2019-04-20 14:39:52 +02002040< "errmsg" also works, for backwards compatibility, unless
2041 |scriptversion| is 3 or higher.
Bram Moolenaar071d4272004-06-13 20:20:40 +00002042
Bram Moolenaar65a54642018-04-28 16:56:53 +02002043 *v:errors* *errors-variable* *assert-return*
Bram Moolenaar683fa182015-11-30 21:38:24 +01002044v:errors Errors found by assert functions, such as |assert_true()|.
Bram Moolenaar43345542015-11-29 17:35:35 +01002045 This is a list of strings.
2046 The assert functions append an item when an assert fails.
Bram Moolenaar65a54642018-04-28 16:56:53 +02002047 The return value indicates this: a one is returned if an item
2048 was added to v:errors, otherwise zero is returned.
Bram Moolenaar43345542015-11-29 17:35:35 +01002049 To remove old results make it empty: >
2050 :let v:errors = []
2051< If v:errors is set to anything but a list it is made an empty
2052 list by the assert function.
2053
Bram Moolenaar7e1652c2017-12-16 18:27:02 +01002054 *v:event* *event-variable*
2055v:event Dictionary containing information about the current
Bram Moolenaar560979e2020-02-04 22:53:05 +01002056 |autocommand|. See the specific event for what it puts in
2057 this dictionary.
Bram Moolenaar2c7f8c52020-04-20 19:52:53 +02002058 The dictionary is emptied when the |autocommand| finishes,
2059 please refer to |dict-identity| for how to get an independent
2060 copy of it. Use |deepcopy()| if you want to keep the
2061 information after the event triggers. Example: >
2062 au TextYankPost * let g:foo = deepcopy(v:event)
2063<
Bram Moolenaar071d4272004-06-13 20:20:40 +00002064 *v:exception* *exception-variable*
2065v:exception The value of the exception most recently caught and not
2066 finished. See also |v:throwpoint| and |throw-variables|.
2067 Example: >
2068 :try
2069 : throw "oops"
2070 :catch /.*/
Bram Moolenaar54775062019-07-31 21:07:14 +02002071 : echo "caught " .. v:exception
Bram Moolenaar071d4272004-06-13 20:20:40 +00002072 :endtry
2073< Output: "caught oops".
2074
Bram Moolenaar520e1e42016-01-23 19:46:28 +01002075 *v:false* *false-variable*
2076v:false A Number with value zero. Used to put "false" in JSON. See
Bram Moolenaar6463ca22016-02-13 17:04:46 +01002077 |json_encode()|.
Bram Moolenaarc95a3022016-06-12 23:01:46 +02002078 When used as a string this evaluates to "v:false". >
Bram Moolenaar705ada12016-01-24 17:56:50 +01002079 echo v:false
Bram Moolenaarc95a3022016-06-12 23:01:46 +02002080< v:false ~
2081 That is so that eval() can parse the string back to the same
Bram Moolenaardf48fb42016-07-22 21:50:18 +02002082 value. Read-only.
Bram Moolenaar5da36052021-12-27 15:39:57 +00002083 In |Vim9| script "false" can be used which has a boolean type.
Bram Moolenaar520e1e42016-01-23 19:46:28 +01002084
Bram Moolenaar19a09a12005-03-04 23:39:37 +00002085 *v:fcs_reason* *fcs_reason-variable*
2086v:fcs_reason The reason why the |FileChangedShell| event was triggered.
2087 Can be used in an autocommand to decide what to do and/or what
2088 to set v:fcs_choice to. Possible values:
2089 deleted file no longer exists
2090 conflict file contents, mode or timestamp was
2091 changed and buffer is modified
2092 changed file contents has changed
2093 mode mode of file changed
2094 time only file timestamp changed
2095
2096 *v:fcs_choice* *fcs_choice-variable*
2097v:fcs_choice What should happen after a |FileChangedShell| event was
2098 triggered. Can be used in an autocommand to tell Vim what to
2099 do with the affected buffer:
2100 reload Reload the buffer (does not work if
2101 the file was deleted).
Rob Pilling8196e942022-02-11 15:12:10 +00002102 edit Reload the buffer and detect the
2103 values for options such as
2104 'fileformat', 'fileencoding', 'binary'
2105 (does not work if the file was
2106 deleted).
Bram Moolenaar19a09a12005-03-04 23:39:37 +00002107 ask Ask the user what to do, as if there
2108 was no autocommand. Except that when
2109 only the timestamp changed nothing
2110 will happen.
2111 <empty> Nothing, the autocommand should do
2112 everything that needs to be done.
2113 The default is empty. If another (invalid) value is used then
2114 Vim behaves like it is empty, there is no warning message.
2115
Bram Moolenaar4c295022021-05-02 17:19:11 +02002116 *v:fname* *fname-variable*
Bram Moolenaar90df4b92021-07-07 20:26:08 +02002117v:fname When evaluating 'includeexpr': the file name that was
2118 detected. Empty otherwise.
Bram Moolenaar4c295022021-05-02 17:19:11 +02002119
Bram Moolenaar071d4272004-06-13 20:20:40 +00002120 *v:fname_in* *fname_in-variable*
Bram Moolenaar4e330bb2005-12-07 21:04:31 +00002121v:fname_in The name of the input file. Valid while evaluating:
Bram Moolenaar071d4272004-06-13 20:20:40 +00002122 option used for ~
2123 'charconvert' file to be converted
2124 'diffexpr' original file
2125 'patchexpr' original file
2126 'printexpr' file to be printed
Bram Moolenaar2c7a29c2005-12-12 22:02:31 +00002127 And set to the swap file name for |SwapExists|.
Bram Moolenaar071d4272004-06-13 20:20:40 +00002128
2129 *v:fname_out* *fname_out-variable*
2130v:fname_out The name of the output file. Only valid while
2131 evaluating:
2132 option used for ~
2133 'charconvert' resulting converted file (*)
2134 'diffexpr' output of diff
2135 'patchexpr' resulting patched file
2136 (*) When doing conversion for a write command (e.g., ":w
Bram Moolenaar58b85342016-08-14 19:54:54 +02002137 file") it will be equal to v:fname_in. When doing conversion
Bram Moolenaar071d4272004-06-13 20:20:40 +00002138 for a read command (e.g., ":e file") it will be a temporary
2139 file and different from v:fname_in.
2140
2141 *v:fname_new* *fname_new-variable*
2142v:fname_new The name of the new version of the file. Only valid while
2143 evaluating 'diffexpr'.
2144
2145 *v:fname_diff* *fname_diff-variable*
2146v:fname_diff The name of the diff (patch) file. Only valid while
2147 evaluating 'patchexpr'.
2148
2149 *v:folddashes* *folddashes-variable*
2150v:folddashes Used for 'foldtext': dashes representing foldlevel of a closed
2151 fold.
Bram Moolenaar7b0294c2004-10-11 10:16:09 +00002152 Read-only in the |sandbox|. |fold-foldtext|
Bram Moolenaar071d4272004-06-13 20:20:40 +00002153
2154 *v:foldlevel* *foldlevel-variable*
2155v:foldlevel Used for 'foldtext': foldlevel of closed fold.
Bram Moolenaar7b0294c2004-10-11 10:16:09 +00002156 Read-only in the |sandbox|. |fold-foldtext|
Bram Moolenaar071d4272004-06-13 20:20:40 +00002157
2158 *v:foldend* *foldend-variable*
2159v:foldend Used for 'foldtext': last line of closed fold.
Bram Moolenaar7b0294c2004-10-11 10:16:09 +00002160 Read-only in the |sandbox|. |fold-foldtext|
Bram Moolenaar071d4272004-06-13 20:20:40 +00002161
2162 *v:foldstart* *foldstart-variable*
2163v:foldstart Used for 'foldtext': first line of closed fold.
Bram Moolenaar7b0294c2004-10-11 10:16:09 +00002164 Read-only in the |sandbox|. |fold-foldtext|
Bram Moolenaar071d4272004-06-13 20:20:40 +00002165
Bram Moolenaar817a8802013-11-09 01:44:43 +01002166 *v:hlsearch* *hlsearch-variable*
Bram Moolenaarb0d45e72017-11-05 18:19:24 +01002167v:hlsearch Variable that indicates whether search highlighting is on.
Bram Moolenaar76440e22014-11-27 19:14:49 +01002168 Setting it makes sense only if 'hlsearch' is enabled which
2169 requires |+extra_search|. Setting this variable to zero acts
Bram Moolenaar705ada12016-01-24 17:56:50 +01002170 like the |:nohlsearch| command, setting it to one acts like >
Bram Moolenaar817a8802013-11-09 01:44:43 +01002171 let &hlsearch = &hlsearch
Bram Moolenaar86ae7202015-07-10 19:31:35 +02002172< Note that the value is restored when returning from a
2173 function. |function-search-undo|.
2174
Bram Moolenaar843ee412004-06-30 16:16:41 +00002175 *v:insertmode* *insertmode-variable*
2176v:insertmode Used for the |InsertEnter| and |InsertChange| autocommand
2177 events. Values:
2178 i Insert mode
2179 r Replace mode
2180 v Virtual Replace mode
2181
Bram Moolenaar2fda12f2005-01-15 22:14:15 +00002182 *v:key* *key-variable*
Bram Moolenaar32466aa2006-02-24 23:53:04 +00002183v:key Key of the current item of a |Dictionary|. Only valid while
Bram Moolenaar2fda12f2005-01-15 22:14:15 +00002184 evaluating the expression used with |map()| and |filter()|.
2185 Read-only.
2186
Bram Moolenaar071d4272004-06-13 20:20:40 +00002187 *v:lang* *lang-variable*
2188v:lang The current locale setting for messages of the runtime
2189 environment. This allows Vim scripts to be aware of the
2190 current language. Technical: it's the value of LC_MESSAGES.
2191 The value is system dependent.
2192 This variable can not be set directly, use the |:language|
2193 command.
2194 It can be different from |v:ctype| when messages are desired
2195 in a different language than what is used for character
2196 encoding. See |multi-lang|.
2197
2198 *v:lc_time* *lc_time-variable*
2199v:lc_time The current locale setting for time messages of the runtime
2200 environment. This allows Vim scripts to be aware of the
2201 current language. Technical: it's the value of LC_TIME.
2202 This variable can not be set directly, use the |:language|
2203 command. See |multi-lang|.
2204
2205 *v:lnum* *lnum-variable*
Bram Moolenaar368373e2010-07-19 20:46:22 +02002206v:lnum Line number for the 'foldexpr' |fold-expr|, 'formatexpr' and
2207 'indentexpr' expressions, tab page number for 'guitablabel'
2208 and 'guitabtooltip'. Only valid while one of these
2209 expressions is being evaluated. Read-only when in the
2210 |sandbox|.
Bram Moolenaar071d4272004-06-13 20:20:40 +00002211
naohiro ono56200ee2022-01-01 14:59:44 +00002212 *v:maxcol* *maxcol-variable*
Bram Moolenaar2f0936c2022-01-08 21:51:59 +00002213v:maxcol Maximum line length. Depending on where it is used it can be
Bram Moolenaar944697a2022-02-20 19:48:20 +00002214 screen columns, characters or bytes. The value currently is
2215 2147483647 on all systems.
naohiro ono56200ee2022-01-01 14:59:44 +00002216
Bram Moolenaar219b8702006-11-01 14:32:36 +00002217 *v:mouse_win* *mouse_win-variable*
2218v:mouse_win Window number for a mouse click obtained with |getchar()|.
2219 First window has number 1, like with |winnr()|. The value is
2220 zero when there was no mouse button click.
2221
Bram Moolenaar511972d2016-06-04 18:09:59 +02002222 *v:mouse_winid* *mouse_winid-variable*
2223v:mouse_winid Window ID for a mouse click obtained with |getchar()|.
2224 The value is zero when there was no mouse button click.
2225
Bram Moolenaar219b8702006-11-01 14:32:36 +00002226 *v:mouse_lnum* *mouse_lnum-variable*
2227v:mouse_lnum Line number for a mouse click obtained with |getchar()|.
2228 This is the text line number, not the screen line number. The
2229 value is zero when there was no mouse button click.
2230
2231 *v:mouse_col* *mouse_col-variable*
2232v:mouse_col Column number for a mouse click obtained with |getchar()|.
2233 This is the screen column number, like with |virtcol()|. The
2234 value is zero when there was no mouse button click.
2235
Bram Moolenaard09091d2019-01-17 16:07:22 +01002236 *v:none* *none-variable* *None*
Bram Moolenaar520e1e42016-01-23 19:46:28 +01002237v:none An empty String. Used to put an empty item in JSON. See
Bram Moolenaar6463ca22016-02-13 17:04:46 +01002238 |json_encode()|.
Bram Moolenaar2547aa92020-07-26 17:00:44 +02002239 This can also be used as a function argument to use the
2240 default value, see |none-function_argument|.
Bram Moolenaar705ada12016-01-24 17:56:50 +01002241 When used as a number this evaluates to zero.
Bram Moolenaarc95a3022016-06-12 23:01:46 +02002242 When used as a string this evaluates to "v:none". >
Bram Moolenaar705ada12016-01-24 17:56:50 +01002243 echo v:none
Bram Moolenaarc95a3022016-06-12 23:01:46 +02002244< v:none ~
2245 That is so that eval() can parse the string back to the same
Bram Moolenaardf48fb42016-07-22 21:50:18 +02002246 value. Read-only.
Bram Moolenaar1588bc82022-03-08 21:35:07 +00002247 Note that using `== v:none` and `!= v:none` will often give
2248 an error. Instead, use `is v:none` and `isnot v:none` .
Bram Moolenaar520e1e42016-01-23 19:46:28 +01002249
2250 *v:null* *null-variable*
2251v:null An empty String. Used to put "null" in JSON. See
Bram Moolenaar6463ca22016-02-13 17:04:46 +01002252 |json_encode()|.
Bram Moolenaar705ada12016-01-24 17:56:50 +01002253 When used as a number this evaluates to zero.
Bram Moolenaarc95a3022016-06-12 23:01:46 +02002254 When used as a string this evaluates to "v:null". >
Bram Moolenaar705ada12016-01-24 17:56:50 +01002255 echo v:null
Bram Moolenaarc95a3022016-06-12 23:01:46 +02002256< v:null ~
2257 That is so that eval() can parse the string back to the same
Bram Moolenaardf48fb42016-07-22 21:50:18 +02002258 value. Read-only.
Bram Moolenaar1588bc82022-03-08 21:35:07 +00002259 In |Vim9| script `null` can be used without "v:".
2260 In some places `v:null` and `null` can be used for a List,
2261 Dict, Job, etc. that is not set. That is slightly different
2262 than an empty List, Dict, etc.
Bram Moolenaar520e1e42016-01-23 19:46:28 +01002263
Bram Moolenaar57d5a012021-01-21 21:42:31 +01002264 *v:numbermax* *numbermax-variable*
2265v:numbermax Maximum value of a number.
2266
Bram Moolenaare0e39172021-01-25 21:14:57 +01002267 *v:numbermin* *numbermin-variable*
Bram Moolenaar2346a632021-06-13 19:02:49 +02002268v:numbermin Minimum value of a number (negative).
Bram Moolenaar57d5a012021-01-21 21:42:31 +01002269
Bram Moolenaarf9706e92020-02-22 14:27:04 +01002270 *v:numbersize* *numbersize-variable*
2271v:numbersize Number of bits in a Number. This is normally 64, but on some
Bram Moolenaarbc93ceb2020-02-26 13:36:21 +01002272 systems it may be 32.
Bram Moolenaarf9706e92020-02-22 14:27:04 +01002273
Bram Moolenaard812df62008-11-09 12:46:09 +00002274 *v:oldfiles* *oldfiles-variable*
2275v:oldfiles List of file names that is loaded from the |viminfo| file on
2276 startup. These are the files that Vim remembers marks for.
2277 The length of the List is limited by the ' argument of the
2278 'viminfo' option (default is 100).
Bram Moolenaar8d043172014-01-23 14:24:41 +01002279 When the |viminfo| file is not used the List is empty.
Bram Moolenaard812df62008-11-09 12:46:09 +00002280 Also see |:oldfiles| and |c_#<|.
2281 The List can be modified, but this has no effect on what is
2282 stored in the |viminfo| file later. If you use values other
2283 than String this will cause trouble.
Bram Moolenaardb84e452010-08-15 13:50:43 +02002284 {only when compiled with the |+viminfo| feature}
Bram Moolenaard812df62008-11-09 12:46:09 +00002285
Bram Moolenaar53744302015-07-17 17:38:22 +02002286 *v:option_new*
2287v:option_new New value of the option. Valid while executing an |OptionSet|
2288 autocommand.
2289 *v:option_old*
2290v:option_old Old value of the option. Valid while executing an |OptionSet|
Bram Moolenaard7c96872019-06-15 17:12:48 +02002291 autocommand. Depending on the command used for setting and the
2292 kind of option this is either the local old value or the
2293 global old value.
2294 *v:option_oldlocal*
2295v:option_oldlocal
2296 Old local value of the option. Valid while executing an
2297 |OptionSet| autocommand.
2298 *v:option_oldglobal*
2299v:option_oldglobal
2300 Old global value of the option. Valid while executing an
2301 |OptionSet| autocommand.
Bram Moolenaar53744302015-07-17 17:38:22 +02002302 *v:option_type*
2303v:option_type Scope of the set command. Valid while executing an
2304 |OptionSet| autocommand. Can be either "global" or "local"
Bram Moolenaard7c96872019-06-15 17:12:48 +02002305 *v:option_command*
2306v:option_command
2307 Command used to set the option. Valid while executing an
2308 |OptionSet| autocommand.
2309 value option was set via ~
2310 "setlocal" |:setlocal| or ":let l:xxx"
2311 "setglobal" |:setglobal| or ":let g:xxx"
2312 "set" |:set| or |:let|
2313 "modeline" |modeline|
Bram Moolenaar8af1fbf2008-01-05 12:35:21 +00002314 *v:operator* *operator-variable*
2315v:operator The last operator given in Normal mode. This is a single
2316 character except for commands starting with <g> or <z>,
2317 in which case it is two characters. Best used alongside
2318 |v:prevcount| and |v:register|. Useful if you want to cancel
2319 Operator-pending mode and then use the operator, e.g.: >
2320 :omap O <Esc>:call MyMotion(v:operator)<CR>
2321< The value remains set until another operator is entered, thus
2322 don't expect it to be empty.
2323 v:operator is not set for |:delete|, |:yank| or other Ex
2324 commands.
2325 Read-only.
2326
Bram Moolenaar071d4272004-06-13 20:20:40 +00002327 *v:prevcount* *prevcount-variable*
2328v:prevcount The count given for the last but one Normal mode command.
2329 This is the v:count value of the previous command. Useful if
Bram Moolenaar8af1fbf2008-01-05 12:35:21 +00002330 you want to cancel Visual or Operator-pending mode and then
2331 use the count, e.g.: >
Bram Moolenaar071d4272004-06-13 20:20:40 +00002332 :vmap % <Esc>:call MyFilter(v:prevcount)<CR>
2333< Read-only.
2334
Bram Moolenaar05159a02005-02-26 23:04:13 +00002335 *v:profiling* *profiling-variable*
Bram Moolenaar58b85342016-08-14 19:54:54 +02002336v:profiling Normally zero. Set to one after using ":profile start".
Bram Moolenaar05159a02005-02-26 23:04:13 +00002337 See |profiling|.
2338
Bram Moolenaar071d4272004-06-13 20:20:40 +00002339 *v:progname* *progname-variable*
2340v:progname Contains the name (with path removed) with which Vim was
Bram Moolenaard38b0552012-04-25 19:07:41 +02002341 invoked. Allows you to do special initialisations for |view|,
2342 |evim| etc., or any other name you might symlink to Vim.
Bram Moolenaar071d4272004-06-13 20:20:40 +00002343 Read-only.
2344
Bram Moolenaara1706c92014-04-01 19:55:49 +02002345 *v:progpath* *progpath-variable*
Bram Moolenaar56c860c2019-08-17 20:09:31 +02002346v:progpath Contains the command with which Vim was invoked, in a form
2347 that when passed to the shell will run the same Vim executable
2348 as the current one (if $PATH remains unchanged).
2349 Useful if you want to message a Vim server using a
Bram Moolenaara1706c92014-04-01 19:55:49 +02002350 |--remote-expr|.
Bram Moolenaarc7f02552014-04-01 21:00:59 +02002351 To get the full path use: >
2352 echo exepath(v:progpath)
Bram Moolenaar56c860c2019-08-17 20:09:31 +02002353< If the command has a relative path it will be expanded to the
2354 full path, so that it still works after `:cd`. Thus starting
2355 "./vim" results in "/home/user/path/to/vim/src/vim".
2356 On Linux and other systems it will always be the full path.
2357 On Mac it may just be "vim" and using exepath() as mentioned
2358 above should be used to get the full path.
Bram Moolenaar08cab962017-03-04 14:37:18 +01002359 On MS-Windows the executable may be called "vim.exe", but the
2360 ".exe" is not added to v:progpath.
Bram Moolenaara1706c92014-04-01 19:55:49 +02002361 Read-only.
2362
Bram Moolenaar071d4272004-06-13 20:20:40 +00002363 *v:register* *register-variable*
Bram Moolenaard58e9292011-02-09 17:07:58 +01002364v:register The name of the register in effect for the current normal mode
Bram Moolenaard38b0552012-04-25 19:07:41 +02002365 command (regardless of whether that command actually used a
2366 register). Or for the currently executing normal mode mapping
2367 (use this in custom commands that take a register).
2368 If none is supplied it is the default register '"', unless
2369 'clipboard' contains "unnamed" or "unnamedplus", then it is
2370 '*' or '+'.
Bram Moolenaard58e9292011-02-09 17:07:58 +01002371 Also see |getreg()| and |setreg()|
Bram Moolenaar071d4272004-06-13 20:20:40 +00002372
Bram Moolenaar1c7715d2005-10-03 22:02:18 +00002373 *v:scrollstart* *scrollstart-variable*
2374v:scrollstart String describing the script or function that caused the
2375 screen to scroll up. It's only set when it is empty, thus the
2376 first reason is remembered. It is set to "Unknown" for a
2377 typed command.
2378 This can be used to find out why your script causes the
2379 hit-enter prompt.
2380
Bram Moolenaar071d4272004-06-13 20:20:40 +00002381 *v:servername* *servername-variable*
Bram Moolenaarc2ce52c2017-08-01 18:35:38 +02002382v:servername The resulting registered |client-server-name| if any.
Bram Moolenaar071d4272004-06-13 20:20:40 +00002383 Read-only.
2384
Bram Moolenaarb0d45e72017-11-05 18:19:24 +01002385
Bram Moolenaar446cb832008-06-24 21:56:24 +00002386v:searchforward *v:searchforward* *searchforward-variable*
2387 Search direction: 1 after a forward search, 0 after a
2388 backward search. It is reset to forward when directly setting
2389 the last search pattern, see |quote/|.
2390 Note that the value is restored when returning from a
2391 function. |function-search-undo|.
2392 Read-write.
2393
Bram Moolenaar071d4272004-06-13 20:20:40 +00002394 *v:shell_error* *shell_error-variable*
2395v:shell_error Result of the last shell command. When non-zero, the last
2396 shell command had an error. When zero, there was no problem.
2397 This only works when the shell returns the error code to Vim.
2398 The value -1 is often used when the command could not be
2399 executed. Read-only.
2400 Example: >
2401 :!mv foo bar
2402 :if v:shell_error
2403 : echo 'could not rename "foo" to "bar"!'
2404 :endif
Bram Moolenaard2e716e2019-04-20 14:39:52 +02002405< "shell_error" also works, for backwards compatibility, unless
2406 |scriptversion| is 3 or higher.
Bram Moolenaar071d4272004-06-13 20:20:40 +00002407
Bram Moolenaar113cb512021-11-07 20:27:04 +00002408 *v:sizeofint* *sizeofint-variable*
2409v:sizeofint Number of bytes in an int. Depends on how Vim was compiled.
2410 This is only useful for deciding whether a test will give the
2411 expected result.
2412
2413 *v:sizeoflong* *sizeoflong-variable*
2414v:sizeoflong Number of bytes in a long. Depends on how Vim was compiled.
2415 This is only useful for deciding whether a test will give the
2416 expected result.
2417
2418 *v:sizeofpointer* *sizeofpointer-variable*
2419v:sizeofpointer Number of bytes in a pointer. Depends on how Vim was compiled.
2420 This is only useful for deciding whether a test will give the
2421 expected result.
2422
Bram Moolenaar071d4272004-06-13 20:20:40 +00002423 *v:statusmsg* *statusmsg-variable*
2424v:statusmsg Last given status message. It's allowed to set this variable.
2425
Bram Moolenaar4e330bb2005-12-07 21:04:31 +00002426 *v:swapname* *swapname-variable*
2427v:swapname Only valid when executing |SwapExists| autocommands: Name of
2428 the swap file found. Read-only.
2429
2430 *v:swapchoice* *swapchoice-variable*
2431v:swapchoice |SwapExists| autocommands can set this to the selected choice
2432 for handling an existing swap file:
2433 'o' Open read-only
2434 'e' Edit anyway
2435 'r' Recover
2436 'd' Delete swapfile
2437 'q' Quit
2438 'a' Abort
Bram Moolenaar58b85342016-08-14 19:54:54 +02002439 The value should be a single-character string. An empty value
Bram Moolenaar4e330bb2005-12-07 21:04:31 +00002440 results in the user being asked, as would happen when there is
2441 no SwapExists autocommand. The default is empty.
2442
Bram Moolenaarb3480382005-12-11 21:33:32 +00002443 *v:swapcommand* *swapcommand-variable*
Bram Moolenaar4770d092006-01-12 23:22:24 +00002444v:swapcommand Normal mode command to be executed after a file has been
Bram Moolenaarb3480382005-12-11 21:33:32 +00002445 opened. Can be used for a |SwapExists| autocommand to have
Bram Moolenaar58b85342016-08-14 19:54:54 +02002446 another Vim open the file and jump to the right place. For
Bram Moolenaarb3480382005-12-11 21:33:32 +00002447 example, when jumping to a tag the value is ":tag tagname\r".
Bram Moolenaar1f35bf92006-03-07 22:38:47 +00002448 For ":edit +cmd file" the value is ":cmd\r".
Bram Moolenaarb3480382005-12-11 21:33:32 +00002449
Bram Moolenaard823fa92016-08-12 16:29:27 +02002450 *v:t_TYPE* *v:t_bool* *t_bool-variable*
Bram Moolenaard09091d2019-01-17 16:07:22 +01002451v:t_bool Value of |Boolean| type. Read-only. See: |type()|
Bram Moolenaard823fa92016-08-12 16:29:27 +02002452 *v:t_channel* *t_channel-variable*
Bram Moolenaard09091d2019-01-17 16:07:22 +01002453v:t_channel Value of |Channel| type. Read-only. See: |type()|
Bram Moolenaard823fa92016-08-12 16:29:27 +02002454 *v:t_dict* *t_dict-variable*
Bram Moolenaard09091d2019-01-17 16:07:22 +01002455v:t_dict Value of |Dictionary| type. Read-only. See: |type()|
Bram Moolenaard823fa92016-08-12 16:29:27 +02002456 *v:t_float* *t_float-variable*
Bram Moolenaard09091d2019-01-17 16:07:22 +01002457v:t_float Value of |Float| type. Read-only. See: |type()|
Bram Moolenaard823fa92016-08-12 16:29:27 +02002458 *v:t_func* *t_func-variable*
Bram Moolenaard09091d2019-01-17 16:07:22 +01002459v:t_func Value of |Funcref| type. Read-only. See: |type()|
Bram Moolenaard823fa92016-08-12 16:29:27 +02002460 *v:t_job* *t_job-variable*
Bram Moolenaard09091d2019-01-17 16:07:22 +01002461v:t_job Value of |Job| type. Read-only. See: |type()|
Bram Moolenaard823fa92016-08-12 16:29:27 +02002462 *v:t_list* *t_list-variable*
Bram Moolenaard09091d2019-01-17 16:07:22 +01002463v:t_list Value of |List| type. Read-only. See: |type()|
Bram Moolenaard823fa92016-08-12 16:29:27 +02002464 *v:t_none* *t_none-variable*
Bram Moolenaard09091d2019-01-17 16:07:22 +01002465v:t_none Value of |None| type. Read-only. See: |type()|
Bram Moolenaard823fa92016-08-12 16:29:27 +02002466 *v:t_number* *t_number-variable*
Bram Moolenaard09091d2019-01-17 16:07:22 +01002467v:t_number Value of |Number| type. Read-only. See: |type()|
Bram Moolenaard823fa92016-08-12 16:29:27 +02002468 *v:t_string* *t_string-variable*
Bram Moolenaard09091d2019-01-17 16:07:22 +01002469v:t_string Value of |String| type. Read-only. See: |type()|
Bram Moolenaar6e5ea8d2019-01-12 22:47:31 +01002470 *v:t_blob* *t_blob-variable*
Bram Moolenaard09091d2019-01-17 16:07:22 +01002471v:t_blob Value of |Blob| type. Read-only. See: |type()|
Bram Moolenaarf562e722016-07-19 17:25:25 +02002472
Bram Moolenaar071d4272004-06-13 20:20:40 +00002473 *v:termresponse* *termresponse-variable*
2474v:termresponse The escape sequence returned by the terminal for the |t_RV|
Bram Moolenaar58b85342016-08-14 19:54:54 +02002475 termcap entry. It is set when Vim receives an escape sequence
Bram Moolenaarb4230122019-05-30 18:40:53 +02002476 that starts with ESC [ or CSI, then '>' or '?' and ends in a
2477 'c', with only digits and ';' in between.
Bram Moolenaar071d4272004-06-13 20:20:40 +00002478 When this option is set, the TermResponse autocommand event is
2479 fired, so that you can react to the response from the
Bram Moolenaar0c0eddd2020-06-13 15:47:25 +02002480 terminal. You can use |terminalprops()| to see what Vim
2481 figured out about the terminal.
Bram Moolenaarb4230122019-05-30 18:40:53 +02002482 The response from a new xterm is: "<Esc>[> Pp ; Pv ; Pc c". Pp
Bram Moolenaar071d4272004-06-13 20:20:40 +00002483 is the terminal type: 0 for vt100 and 1 for vt220. Pv is the
2484 patch level (since this was introduced in patch 95, it's
Bram Moolenaarfa3b7232021-12-24 13:18:38 +00002485 always 95 or higher). Pc is always zero.
2486 If Pv is 141 or higher then Vim will try to request terminal
2487 codes. This only works with xterm |xterm-codes|.
Bram Moolenaar071d4272004-06-13 20:20:40 +00002488 {only when compiled with |+termresponse| feature}
2489
Bram Moolenaarf3af54e2017-08-30 14:53:06 +02002490 *v:termblinkresp*
2491v:termblinkresp The escape sequence returned by the terminal for the |t_RC|
2492 termcap entry. This is used to find out whether the terminal
2493 cursor is blinking. This is used by |term_getcursor()|.
2494
2495 *v:termstyleresp*
2496v:termstyleresp The escape sequence returned by the terminal for the |t_RS|
2497 termcap entry. This is used to find out what the shape of the
2498 cursor is. This is used by |term_getcursor()|.
2499
Bram Moolenaar65e4c4f2017-10-14 23:24:25 +02002500 *v:termrbgresp*
2501v:termrbgresp The escape sequence returned by the terminal for the |t_RB|
Bram Moolenaarf3af54e2017-08-30 14:53:06 +02002502 termcap entry. This is used to find out what the terminal
2503 background color is, see 'background'.
2504
Bram Moolenaar65e4c4f2017-10-14 23:24:25 +02002505 *v:termrfgresp*
2506v:termrfgresp The escape sequence returned by the terminal for the |t_RF|
2507 termcap entry. This is used to find out what the terminal
2508 foreground color is.
2509
Bram Moolenaarf3af54e2017-08-30 14:53:06 +02002510 *v:termu7resp*
2511v:termu7resp The escape sequence returned by the terminal for the |t_u7|
2512 termcap entry. This is used to find out what the terminal
2513 does with ambiguous width characters, see 'ambiwidth'.
2514
Bram Moolenaarebf7dfa2016-04-14 12:46:51 +02002515 *v:testing* *testing-variable*
Bram Moolenaar8e8df252016-05-25 21:23:21 +02002516v:testing Must be set before using `test_garbagecollect_now()`.
Bram Moolenaar036986f2017-03-16 17:41:02 +01002517 Also, when set certain error messages won't be shown for 2
Bram Moolenaarb0d45e72017-11-05 18:19:24 +01002518 seconds. (e.g. "'dictionary' option is empty")
Bram Moolenaarebf7dfa2016-04-14 12:46:51 +02002519
Bram Moolenaar071d4272004-06-13 20:20:40 +00002520 *v:this_session* *this_session-variable*
2521v:this_session Full filename of the last loaded or saved session file. See
2522 |:mksession|. It is allowed to set this variable. When no
2523 session file has been saved, this variable is empty.
Bram Moolenaard2e716e2019-04-20 14:39:52 +02002524 "this_session" also works, for backwards compatibility, unless
2525 |scriptversion| is 3 or higher
Bram Moolenaar071d4272004-06-13 20:20:40 +00002526
2527 *v:throwpoint* *throwpoint-variable*
2528v:throwpoint The point where the exception most recently caught and not
Bram Moolenaar58b85342016-08-14 19:54:54 +02002529 finished was thrown. Not set when commands are typed. See
Bram Moolenaar071d4272004-06-13 20:20:40 +00002530 also |v:exception| and |throw-variables|.
2531 Example: >
2532 :try
2533 : throw "oops"
2534 :catch /.*/
2535 : echo "Exception from" v:throwpoint
2536 :endtry
2537< Output: "Exception from test.vim, line 2"
2538
Bram Moolenaar520e1e42016-01-23 19:46:28 +01002539 *v:true* *true-variable*
2540v:true A Number with value one. Used to put "true" in JSON. See
Bram Moolenaar6463ca22016-02-13 17:04:46 +01002541 |json_encode()|.
Bram Moolenaarc95a3022016-06-12 23:01:46 +02002542 When used as a string this evaluates to "v:true". >
Bram Moolenaar705ada12016-01-24 17:56:50 +01002543 echo v:true
Bram Moolenaarc95a3022016-06-12 23:01:46 +02002544< v:true ~
2545 That is so that eval() can parse the string back to the same
Bram Moolenaardf48fb42016-07-22 21:50:18 +02002546 value. Read-only.
Bram Moolenaar5da36052021-12-27 15:39:57 +00002547 In |Vim9| script "true" can be used which has a boolean type.
Bram Moolenaar2fda12f2005-01-15 22:14:15 +00002548 *v:val* *val-variable*
Bram Moolenaar58b85342016-08-14 19:54:54 +02002549v:val Value of the current item of a |List| or |Dictionary|. Only
Bram Moolenaar32466aa2006-02-24 23:53:04 +00002550 valid while evaluating the expression used with |map()| and
Bram Moolenaar2fda12f2005-01-15 22:14:15 +00002551 |filter()|. Read-only.
2552
Bram Moolenaar071d4272004-06-13 20:20:40 +00002553 *v:version* *version-variable*
2554v:version Version number of Vim: Major version number times 100 plus
Bram Moolenaar9b283522019-06-17 22:19:33 +02002555 minor version number. Version 5.0 is 500. Version 5.1
Bram Moolenaar071d4272004-06-13 20:20:40 +00002556 is 501. Read-only. "version" also works, for backwards
Bram Moolenaard2e716e2019-04-20 14:39:52 +02002557 compatibility, unless |scriptversion| is 3 or higher.
Bram Moolenaar071d4272004-06-13 20:20:40 +00002558 Use |has()| to check if a certain patch was included, e.g.: >
Bram Moolenaar6716d9a2014-04-02 12:12:08 +02002559 if has("patch-7.4.123")
Bram Moolenaar071d4272004-06-13 20:20:40 +00002560< Note that patch numbers are specific to the version, thus both
2561 version 5.0 and 5.1 may have a patch 123, but these are
2562 completely different.
2563
Bram Moolenaar37df9a42019-06-14 14:39:51 +02002564 *v:versionlong* *versionlong-variable*
Bram Moolenaar9b283522019-06-17 22:19:33 +02002565v:versionlong Like v:version, but also including the patchlevel in the last
2566 four digits. Version 8.1 with patch 123 has value 8010123.
2567 This can be used like this: >
2568 if v:versionlong >= 8010123
Bram Moolenaar37df9a42019-06-14 14:39:51 +02002569< However, if there are gaps in the list of patches included
2570 this will not work well. This can happen if a recent patch
2571 was included into an older version, e.g. for a security fix.
2572 Use the has() function to make sure the patch is actually
2573 included.
2574
Bram Moolenaar14735512016-03-26 21:00:08 +01002575 *v:vim_did_enter* *vim_did_enter-variable*
2576v:vim_did_enter Zero until most of startup is done. It is set to one just
2577 before |VimEnter| autocommands are triggered.
2578
Bram Moolenaar071d4272004-06-13 20:20:40 +00002579 *v:warningmsg* *warningmsg-variable*
2580v:warningmsg Last given warning message. It's allowed to set this variable.
2581
Bram Moolenaar727c8762010-10-20 19:17:48 +02002582 *v:windowid* *windowid-variable*
2583v:windowid When any X11 based GUI is running or when running in a
2584 terminal and Vim connects to the X server (|-X|) this will be
Bram Moolenaar264e9fd2010-10-27 12:33:17 +02002585 set to the window ID.
2586 When an MS-Windows GUI is running this will be set to the
2587 window handle.
2588 Otherwise the value is zero.
Bram Moolenaar7571d552016-08-18 22:54:46 +02002589 Note: for windows inside Vim use |winnr()| or |win_getid()|,
2590 see |window-ID|.
Bram Moolenaar727c8762010-10-20 19:17:48 +02002591
Bram Moolenaar071d4272004-06-13 20:20:40 +00002592==============================================================================
25934. Builtin Functions *functions*
2594
2595See |function-list| for a list grouped by what the function is used for.
2596
Bram Moolenaar1cae5a02021-12-27 21:28:34 +00002597The alphabetic list of all builtin functions and details are in a separate
2598help file: |builtin-functions|.
Bram Moolenaar071d4272004-06-13 20:20:40 +00002599
2600==============================================================================
26015. Defining functions *user-functions*
2602
2603New functions can be defined. These can be called just like builtin
2604functions. The function executes a sequence of Ex commands. Normal mode
2605commands can be executed with the |:normal| command.
2606
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01002607This section is about the legacy functions. For the Vim9 functions, which
2608execute much faster, support type checking and more, see |vim9.txt|.
2609
Bram Moolenaar071d4272004-06-13 20:20:40 +00002610The function name must start with an uppercase letter, to avoid confusion with
2611builtin functions. To prevent from using the same name in different scripts
2612avoid obvious, short names. A good habit is to start the function name with
2613the name of the script, e.g., "HTMLcolor()".
2614
Bram Moolenaar5da36052021-12-27 15:39:57 +00002615In legacy script it is also possible to use curly braces, see
2616|curly-braces-names|.
2617The |autoload| facility is useful to define a function only when it's called.
Bram Moolenaar071d4272004-06-13 20:20:40 +00002618
2619 *local-function*
Bram Moolenaar5da36052021-12-27 15:39:57 +00002620A function local to a legacy script must start with "s:". A local script
2621function can only be called from within the script and from functions, user
2622commands and autocommands defined in the script. It is also possible to call
2623the function from a mapping defined in the script, but then |<SID>| must be
2624used instead of "s:" when the mapping is expanded outside of the script.
Bram Moolenaarbcb98982014-05-01 14:08:19 +02002625There are only script-local functions, no buffer-local or window-local
2626functions.
Bram Moolenaar071d4272004-06-13 20:20:40 +00002627
Bram Moolenaar5da36052021-12-27 15:39:57 +00002628In |Vim9| script functions are local to the script by default, prefix "g:" to
2629define a global function.
2630
Bram Moolenaar2f0936c2022-01-08 21:51:59 +00002631 *:fu* *:function* *E128* *E129* *E123* *E454*
Bram Moolenaar071d4272004-06-13 20:20:40 +00002632:fu[nction] List all functions and their arguments.
2633
2634:fu[nction] {name} List function {name}.
Bram Moolenaar32466aa2006-02-24 23:53:04 +00002635 {name} can also be a |Dictionary| entry that is a
2636 |Funcref|: >
Bram Moolenaar3a3a7232005-01-17 22:16:15 +00002637 :function dict.init
Bram Moolenaar92d640f2005-09-05 22:11:52 +00002638
2639:fu[nction] /{pattern} List functions with a name matching {pattern}.
2640 Example that lists all functions ending with "File": >
2641 :function /File$
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002642<
2643 *:function-verbose*
2644When 'verbose' is non-zero, listing a function will also display where it was
2645last defined. Example: >
2646
2647 :verbose function SetFileTypeSH
2648 function SetFileTypeSH(name)
2649 Last set from /usr/share/vim/vim-7.0/filetype.vim
2650<
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00002651See |:verbose-cmd| for more information.
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002652
Bram Moolenaarbcb98982014-05-01 14:08:19 +02002653 *E124* *E125* *E853* *E884*
Bram Moolenaar10ce39a2016-07-29 22:37:06 +02002654:fu[nction][!] {name}([arguments]) [range] [abort] [dict] [closure]
Bram Moolenaar01164a62017-11-02 22:58:42 +01002655 Define a new function by the name {name}. The body of
2656 the function follows in the next lines, until the
2657 matching |:endfunction|.
Bram Moolenaarb0d45e72017-11-05 18:19:24 +01002658
Bram Moolenaar01164a62017-11-02 22:58:42 +01002659 The name must be made of alphanumeric characters and
2660 '_', and must start with a capital or "s:" (see
2661 above). Note that using "b:" or "g:" is not allowed.
2662 (since patch 7.4.260 E884 is given if the function
2663 name has a colon in the name, e.g. for "foo:bar()".
2664 Before that patch no error was given).
Bram Moolenaar3a3a7232005-01-17 22:16:15 +00002665
Bram Moolenaar32466aa2006-02-24 23:53:04 +00002666 {name} can also be a |Dictionary| entry that is a
2667 |Funcref|: >
Bram Moolenaar3a3a7232005-01-17 22:16:15 +00002668 :function dict.init(arg)
Bram Moolenaar58b85342016-08-14 19:54:54 +02002669< "dict" must be an existing dictionary. The entry
Bram Moolenaar3a3a7232005-01-17 22:16:15 +00002670 "init" is added if it didn't exist yet. Otherwise [!]
Bram Moolenaar58b85342016-08-14 19:54:54 +02002671 is required to overwrite an existing function. The
Bram Moolenaar3a3a7232005-01-17 22:16:15 +00002672 result is a |Funcref| to a numbered function. The
2673 function can only be used with a |Funcref| and will be
2674 deleted if there are no more references to it.
Bram Moolenaar071d4272004-06-13 20:20:40 +00002675 *E127* *E122*
2676 When a function by this name already exists and [!] is
Bram Moolenaarded5f1b2018-11-10 17:33:29 +01002677 not used an error message is given. There is one
2678 exception: When sourcing a script again, a function
2679 that was previously defined in that script will be
2680 silently replaced.
2681 When [!] is used, an existing function is silently
2682 replaced. Unless it is currently being executed, that
2683 is an error.
Bram Moolenaarf8be4612017-06-23 20:52:40 +02002684 NOTE: Use ! wisely. If used without care it can cause
2685 an existing function to be replaced unexpectedly,
2686 which is hard to debug.
Bram Moolenaar388a5d42020-05-26 21:20:45 +02002687 NOTE: In Vim9 script script-local functions cannot be
2688 deleted or redefined.
Bram Moolenaar8f999f12005-01-25 22:12:55 +00002689
2690 For the {arguments} see |function-argument|.
2691
Bram Moolenaar8d043172014-01-23 14:24:41 +01002692 *:func-range* *a:firstline* *a:lastline*
Bram Moolenaar071d4272004-06-13 20:20:40 +00002693 When the [range] argument is added, the function is
2694 expected to take care of a range itself. The range is
2695 passed as "a:firstline" and "a:lastline". If [range]
2696 is excluded, ":{range}call" will call the function for
2697 each line in the range, with the cursor on the start
2698 of each line. See |function-range-example|.
Bram Moolenaar2df58b42012-11-28 18:21:11 +01002699 The cursor is still moved to the first line of the
2700 range, as is the case with all Ex commands.
Bram Moolenaar8d043172014-01-23 14:24:41 +01002701 *:func-abort*
Bram Moolenaar071d4272004-06-13 20:20:40 +00002702 When the [abort] argument is added, the function will
2703 abort as soon as an error is detected.
Bram Moolenaar8d043172014-01-23 14:24:41 +01002704 *:func-dict*
Bram Moolenaar2fda12f2005-01-15 22:14:15 +00002705 When the [dict] argument is added, the function must
Bram Moolenaar58b85342016-08-14 19:54:54 +02002706 be invoked through an entry in a |Dictionary|. The
Bram Moolenaar2fda12f2005-01-15 22:14:15 +00002707 local variable "self" will then be set to the
2708 dictionary. See |Dictionary-function|.
Bram Moolenaar10ce39a2016-07-29 22:37:06 +02002709 *:func-closure* *E932*
2710 When the [closure] argument is added, the function
2711 can access variables and arguments from the outer
2712 scope. This is usually called a closure. In this
2713 example Bar() uses "x" from the scope of Foo(). It
2714 remains referenced even after Foo() returns: >
2715 :function! Foo()
2716 : let x = 0
2717 : function! Bar() closure
2718 : let x += 1
2719 : return x
2720 : endfunction
Bram Moolenaarbc8801c2016-08-02 21:04:33 +02002721 : return funcref('Bar')
Bram Moolenaar10ce39a2016-07-29 22:37:06 +02002722 :endfunction
2723
2724 :let F = Foo()
2725 :echo F()
2726< 1 >
2727 :echo F()
2728< 2 >
2729 :echo F()
2730< 3
Bram Moolenaar071d4272004-06-13 20:20:40 +00002731
Bram Moolenaar446cb832008-06-24 21:56:24 +00002732 *function-search-undo*
Bram Moolenaar98692072006-02-04 00:57:42 +00002733 The last used search pattern and the redo command "."
Bram Moolenaar446cb832008-06-24 21:56:24 +00002734 will not be changed by the function. This also
2735 implies that the effect of |:nohlsearch| is undone
2736 when the function returns.
Bram Moolenaar98692072006-02-04 00:57:42 +00002737
Bram Moolenaara2baa732022-02-04 16:09:54 +00002738 *:endf* *:endfunction* *E126* *E193* *W22* *E1151*
Bram Moolenaar663bb232017-06-22 19:12:10 +02002739:endf[unction] [argument]
2740 The end of a function definition. Best is to put it
2741 on a line by its own, without [argument].
2742
2743 [argument] can be:
2744 | command command to execute next
2745 \n command command to execute next
2746 " comment always ignored
Bram Moolenaarf8be4612017-06-23 20:52:40 +02002747 anything else ignored, warning given when
2748 'verbose' is non-zero
Bram Moolenaar663bb232017-06-22 19:12:10 +02002749 The support for a following command was added in Vim
2750 8.0.0654, before that any argument was silently
2751 ignored.
Bram Moolenaar071d4272004-06-13 20:20:40 +00002752
Bram Moolenaarf8be4612017-06-23 20:52:40 +02002753 To be able to define a function inside an `:execute`
2754 command, use line breaks instead of |:bar|: >
2755 :exe "func Foo()\necho 'foo'\nendfunc"
2756<
Bram Moolenaarf10911e2022-01-29 22:20:48 +00002757 *:delf* *:delfunction* *E131* *E933* *E1084*
Bram Moolenaar663bb232017-06-22 19:12:10 +02002758:delf[unction][!] {name}
2759 Delete function {name}.
Bram Moolenaar32466aa2006-02-24 23:53:04 +00002760 {name} can also be a |Dictionary| entry that is a
2761 |Funcref|: >
Bram Moolenaar3a3a7232005-01-17 22:16:15 +00002762 :delfunc dict.init
Bram Moolenaar58b85342016-08-14 19:54:54 +02002763< This will remove the "init" entry from "dict". The
Bram Moolenaar3a3a7232005-01-17 22:16:15 +00002764 function is deleted if there are no more references to
2765 it.
Bram Moolenaar663bb232017-06-22 19:12:10 +02002766 With the ! there is no error if the function does not
2767 exist.
Bram Moolenaar071d4272004-06-13 20:20:40 +00002768 *:retu* *:return* *E133*
2769:retu[rn] [expr] Return from a function. When "[expr]" is given, it is
2770 evaluated and returned as the result of the function.
2771 If "[expr]" is not given, the number 0 is returned.
2772 When a function ends without an explicit ":return",
2773 the number 0 is returned.
Bram Moolenaarf10911e2022-01-29 22:20:48 +00002774 In a :def function *E1095* is given if unreachable
2775 code follows after the `:return`.
2776 In legacy script there is no check for unreachable
2777 lines, thus there is no warning if commands follow
2778 `:return`.
Bram Moolenaar071d4272004-06-13 20:20:40 +00002779
2780 If the ":return" is used after a |:try| but before the
2781 matching |:finally| (if present), the commands
2782 following the ":finally" up to the matching |:endtry|
2783 are executed first. This process applies to all
2784 nested ":try"s inside the function. The function
2785 returns at the outermost ":endtry".
2786
Bram Moolenaar8f999f12005-01-25 22:12:55 +00002787 *function-argument* *a:var*
Bram Moolenaar58b85342016-08-14 19:54:54 +02002788An argument can be defined by giving its name. In the function this can then
Bram Moolenaar8f999f12005-01-25 22:12:55 +00002789be used as "a:name" ("a:" for argument).
Bram Moolenaaref2f6562007-05-06 13:32:59 +00002790 *a:0* *a:1* *a:000* *E740* *...*
Bram Moolenaar8f999f12005-01-25 22:12:55 +00002791Up to 20 arguments can be given, separated by commas. After the named
2792arguments an argument "..." can be specified, which means that more arguments
2793may optionally be following. In the function the extra arguments can be used
2794as "a:1", "a:2", etc. "a:0" is set to the number of extra arguments (which
Bram Moolenaar32466aa2006-02-24 23:53:04 +00002795can be 0). "a:000" is set to a |List| that contains these arguments. Note
2796that "a:1" is the same as "a:000[0]".
Bram Moolenaarf10911e2022-01-29 22:20:48 +00002797 *E742* *E1090*
Bram Moolenaar2ce06f62005-01-31 19:19:04 +00002798The a: scope and the variables in it cannot be changed, they are fixed.
Bram Moolenaar069c1e72016-07-15 21:25:08 +02002799However, if a composite type is used, such as |List| or |Dictionary| , you can
2800change their contents. Thus you can pass a |List| to a function and have the
2801function add an item to it. If you want to make sure the function cannot
2802change a |List| or |Dictionary| use |:lockvar|.
Bram Moolenaar071d4272004-06-13 20:20:40 +00002803
Bram Moolenaar8f999f12005-01-25 22:12:55 +00002804It is also possible to define a function without any arguments. You must
Bram Moolenaar01164a62017-11-02 22:58:42 +01002805still supply the () then.
2806
Bram Moolenaar98ef2332018-03-18 14:44:37 +01002807It is allowed to define another function inside a function body.
Bram Moolenaar8f999f12005-01-25 22:12:55 +00002808
Bram Moolenaar42ae78c2019-05-09 21:08:58 +02002809 *optional-function-argument*
2810You can provide default values for positional named arguments. This makes
2811them optional for function calls. When a positional argument is not
2812specified at a call, the default expression is used to initialize it.
Bram Moolenaard1caa942020-04-10 22:10:56 +02002813This only works for functions declared with `:function` or `:def`, not for
2814lambda expressions |expr-lambda|.
Bram Moolenaar42ae78c2019-05-09 21:08:58 +02002815
2816Example: >
2817 function Something(key, value = 10)
Bram Moolenaar8aad88d2019-05-12 13:53:50 +02002818 echo a:key .. ": " .. a:value
Bram Moolenaar42ae78c2019-05-09 21:08:58 +02002819 endfunction
2820 call Something('empty') "empty: 10"
Bram Moolenaar8aad88d2019-05-12 13:53:50 +02002821 call Something('key', 20) "key: 20"
Bram Moolenaar42ae78c2019-05-09 21:08:58 +02002822
2823The argument default expressions are evaluated at the time of the function
2824call, not definition. Thus it is possible to use an expression which is
Bram Moolenaar68e65602019-05-26 21:33:31 +02002825invalid the moment the function is defined. The expressions are also only
Bram Moolenaar42ae78c2019-05-09 21:08:58 +02002826evaluated when arguments are not specified during a call.
Bram Moolenaar2547aa92020-07-26 17:00:44 +02002827 *none-function_argument*
Bram Moolenaar42ae78c2019-05-09 21:08:58 +02002828You can pass |v:none| to use the default expression. Note that this means you
2829cannot pass v:none as an ordinary value when an argument has a default
2830expression.
2831
2832Example: >
2833 function Something(a = 10, b = 20, c = 30)
2834 endfunction
2835 call Something(1, v:none, 3) " b = 20
2836<
2837 *E989*
2838Optional arguments with default expressions must occur after any mandatory
2839arguments. You can use "..." after all optional named arguments.
2840
2841It is possible for later argument defaults to refer to prior arguments,
2842but not the other way around. They must be prefixed with "a:", as with all
2843arguments.
2844
2845Example that works: >
2846 :function Okay(mandatory, optional = a:mandatory)
2847 :endfunction
2848Example that does NOT work: >
2849 :function NoGood(first = a:second, second = 10)
2850 :endfunction
2851<
Bram Moolenaard1caa942020-04-10 22:10:56 +02002852When not using "...", the number of arguments in a function call must be at
2853least equal to the number of mandatory named arguments. When using "...", the
2854number of arguments may be larger than the total of mandatory and optional
2855arguments.
Bram Moolenaar42ae78c2019-05-09 21:08:58 +02002856
Bram Moolenaar8f999f12005-01-25 22:12:55 +00002857 *local-variables*
Bram Moolenaar069c1e72016-07-15 21:25:08 +02002858Inside a function local variables can be used. These will disappear when the
2859function returns. Global variables need to be accessed with "g:".
Bram Moolenaar071d4272004-06-13 20:20:40 +00002860
2861Example: >
2862 :function Table(title, ...)
2863 : echohl Title
2864 : echo a:title
2865 : echohl None
Bram Moolenaarc51cf032022-02-26 12:25:45 +00002866 : echo a:0 .. " items:"
Bram Moolenaar677ee682005-01-27 14:41:15 +00002867 : for s in a:000
Bram Moolenaarc51cf032022-02-26 12:25:45 +00002868 : echon ' ' .. s
Bram Moolenaar677ee682005-01-27 14:41:15 +00002869 : endfor
Bram Moolenaar071d4272004-06-13 20:20:40 +00002870 :endfunction
2871
2872This function can then be called with: >
Bram Moolenaar677ee682005-01-27 14:41:15 +00002873 call Table("Table", "line1", "line2")
2874 call Table("Empty Table")
Bram Moolenaar071d4272004-06-13 20:20:40 +00002875
Bram Moolenaaref2f6562007-05-06 13:32:59 +00002876To return more than one value, return a |List|: >
2877 :function Compute(n1, n2)
Bram Moolenaar071d4272004-06-13 20:20:40 +00002878 : if a:n2 == 0
Bram Moolenaaref2f6562007-05-06 13:32:59 +00002879 : return ["fail", 0]
Bram Moolenaar071d4272004-06-13 20:20:40 +00002880 : endif
Bram Moolenaaref2f6562007-05-06 13:32:59 +00002881 : return ["ok", a:n1 / a:n2]
Bram Moolenaar071d4272004-06-13 20:20:40 +00002882 :endfunction
2883
2884This function can then be called with: >
Bram Moolenaaref2f6562007-05-06 13:32:59 +00002885 :let [success, div] = Compute(102, 6)
Bram Moolenaar071d4272004-06-13 20:20:40 +00002886 :if success == "ok"
2887 : echo div
2888 :endif
Bram Moolenaaref2f6562007-05-06 13:32:59 +00002889<
Bram Moolenaar6f4754b2022-01-23 12:07:04 +00002890 *:cal* *:call* *E107*
Bram Moolenaar071d4272004-06-13 20:20:40 +00002891:[range]cal[l] {name}([arguments])
2892 Call a function. The name of the function and its arguments
Bram Moolenaar68e65602019-05-26 21:33:31 +02002893 are as specified with `:function`. Up to 20 arguments can be
Bram Moolenaaref2f6562007-05-06 13:32:59 +00002894 used. The returned value is discarded.
Bram Moolenaar5da36052021-12-27 15:39:57 +00002895 In |Vim9| script using `:call` is optional, these two lines do
2896 the same thing: >
2897 call SomeFunc(arg)
2898 SomeFunc(arg)
2899< Without a range and for functions that accept a range, the
Bram Moolenaar071d4272004-06-13 20:20:40 +00002900 function is called once. When a range is given the cursor is
2901 positioned at the start of the first line before executing the
2902 function.
2903 When a range is given and the function doesn't handle it
2904 itself, the function is executed for each line in the range,
2905 with the cursor in the first column of that line. The cursor
2906 is left at the last line (possibly moved by the last function
Bram Moolenaar58b85342016-08-14 19:54:54 +02002907 call). The arguments are re-evaluated for each line. Thus
Bram Moolenaar071d4272004-06-13 20:20:40 +00002908 this works:
2909 *function-range-example* >
2910 :function Mynumber(arg)
Bram Moolenaarc51cf032022-02-26 12:25:45 +00002911 : echo line(".") .. " " .. a:arg
Bram Moolenaar071d4272004-06-13 20:20:40 +00002912 :endfunction
2913 :1,5call Mynumber(getline("."))
2914<
2915 The "a:firstline" and "a:lastline" are defined anyway, they
2916 can be used to do something different at the start or end of
2917 the range.
2918
2919 Example of a function that handles the range itself: >
2920
2921 :function Cont() range
Bram Moolenaarc51cf032022-02-26 12:25:45 +00002922 : execute (a:firstline + 1) .. "," .. a:lastline .. 's/^/\t\\ '
Bram Moolenaar071d4272004-06-13 20:20:40 +00002923 :endfunction
2924 :4,8call Cont()
2925<
2926 This function inserts the continuation character "\" in front
2927 of all the lines in the range, except the first one.
2928
Bram Moolenaaref2f6562007-05-06 13:32:59 +00002929 When the function returns a composite value it can be further
2930 dereferenced, but the range will not be used then. Example: >
2931 :4,8call GetDict().method()
2932< Here GetDict() gets the range but method() does not.
2933
Bram Moolenaar6f4754b2022-01-23 12:07:04 +00002934 *E117*
2935When a function cannot be found the error "E117: Unknown function" will be
2936given. If the function was using an autoload path or an autoload import and
2937the script is a |Vim9| script, this may also be caused by the function not
2938being exported.
2939
Bram Moolenaar071d4272004-06-13 20:20:40 +00002940 *E132*
2941The recursiveness of user functions is restricted with the |'maxfuncdepth'|
2942option.
2943
Bram Moolenaar25e42232019-08-04 15:04:10 +02002944It is also possible to use `:eval`. It does not support a range, but does
2945allow for method chaining, e.g.: >
2946 eval GetList()->Filter()->append('$')
2947
Bram Moolenaar088e8e32019-08-08 22:15:18 +02002948A function can also be called as part of evaluating an expression or when it
2949is used as a method: >
2950 let x = GetList()
2951 let y = GetList()->Filter()
2952
Bram Moolenaar7c626922005-02-07 22:01:03 +00002953
2954AUTOMATICALLY LOADING FUNCTIONS ~
Bram Moolenaar071d4272004-06-13 20:20:40 +00002955 *autoload-functions*
2956When using many or large functions, it's possible to automatically define them
Bram Moolenaar7c626922005-02-07 22:01:03 +00002957only when they are used. There are two methods: with an autocommand and with
2958the "autoload" directory in 'runtimepath'.
2959
2960
2961Using an autocommand ~
2962
Bram Moolenaar30ab04e2022-05-14 13:33:50 +01002963This is introduced in the user manual, section |51.4|.
Bram Moolenaar05159a02005-02-26 23:04:13 +00002964
Bram Moolenaar7c626922005-02-07 22:01:03 +00002965The autocommand is useful if you have a plugin that is a long Vim script file.
Bram Moolenaar68e65602019-05-26 21:33:31 +02002966You can define the autocommand and quickly quit the script with `:finish`.
Bram Moolenaar58b85342016-08-14 19:54:54 +02002967That makes Vim startup faster. The autocommand should then load the same file
Bram Moolenaar68e65602019-05-26 21:33:31 +02002968again, setting a variable to skip the `:finish` command.
Bram Moolenaar7c626922005-02-07 22:01:03 +00002969
2970Use the FuncUndefined autocommand event with a pattern that matches the
2971function(s) to be defined. Example: >
Bram Moolenaar071d4272004-06-13 20:20:40 +00002972
2973 :au FuncUndefined BufNet* source ~/vim/bufnetfuncs.vim
2974
2975The file "~/vim/bufnetfuncs.vim" should then define functions that start with
2976"BufNet". Also see |FuncUndefined|.
2977
Bram Moolenaar7c626922005-02-07 22:01:03 +00002978
2979Using an autoload script ~
Bram Moolenaar26a60b42005-02-22 08:49:11 +00002980 *autoload* *E746*
Bram Moolenaar30ab04e2022-05-14 13:33:50 +01002981This is introduced in the user manual, section |51.5|.
Bram Moolenaar05159a02005-02-26 23:04:13 +00002982
Bram Moolenaar7c626922005-02-07 22:01:03 +00002983Using a script in the "autoload" directory is simpler, but requires using
2984exactly the right file name. A function that can be autoloaded has a name
2985like this: >
2986
Bram Moolenaara7fc0102005-05-18 22:17:12 +00002987 :call filename#funcname()
Bram Moolenaar7c626922005-02-07 22:01:03 +00002988
Bram Moolenaar65e0d772020-06-14 17:29:55 +02002989These functions are always global, in Vim9 script "g:" needs to be used: >
2990 :call g:filename#funcname()
2991
Bram Moolenaar7c626922005-02-07 22:01:03 +00002992When such a function is called, and it is not defined yet, Vim will search the
2993"autoload" directories in 'runtimepath' for a script file called
2994"filename.vim". For example "~/.vim/autoload/filename.vim". That file should
2995then define the function like this: >
2996
Bram Moolenaara7fc0102005-05-18 22:17:12 +00002997 function filename#funcname()
Bram Moolenaar7c626922005-02-07 22:01:03 +00002998 echo "Done!"
2999 endfunction
3000
Bram Moolenaar60a795a2005-09-16 21:55:43 +00003001The file name and the name used before the # in the function must match
Bram Moolenaar7c626922005-02-07 22:01:03 +00003002exactly, and the defined function must have the name exactly as it will be
Bram Moolenaar65e0d772020-06-14 17:29:55 +02003003called. In Vim9 script the "g:" prefix must be used: >
3004 function g:filename#funcname()
3005
3006or for a compiled function: >
3007 def g:filename#funcname()
Bram Moolenaar7c626922005-02-07 22:01:03 +00003008
Bram Moolenaara7fc0102005-05-18 22:17:12 +00003009It is possible to use subdirectories. Every # in the function name works like
3010a path separator. Thus when calling a function: >
Bram Moolenaar7c626922005-02-07 22:01:03 +00003011
Bram Moolenaara7fc0102005-05-18 22:17:12 +00003012 :call foo#bar#func()
Bram Moolenaar7c626922005-02-07 22:01:03 +00003013
3014Vim will look for the file "autoload/foo/bar.vim" in 'runtimepath'.
3015
Bram Moolenaar26a60b42005-02-22 08:49:11 +00003016This also works when reading a variable that has not been set yet: >
3017
Bram Moolenaara7fc0102005-05-18 22:17:12 +00003018 :let l = foo#bar#lvar
Bram Moolenaar26a60b42005-02-22 08:49:11 +00003019
Bram Moolenaara5792f52005-11-23 21:25:05 +00003020However, when the autoload script was already loaded it won't be loaded again
3021for an unknown variable.
3022
Bram Moolenaar26a60b42005-02-22 08:49:11 +00003023When assigning a value to such a variable nothing special happens. This can
3024be used to pass settings to the autoload script before it's loaded: >
3025
Bram Moolenaara7fc0102005-05-18 22:17:12 +00003026 :let foo#bar#toggle = 1
3027 :call foo#bar#func()
Bram Moolenaar26a60b42005-02-22 08:49:11 +00003028
Bram Moolenaar4399ef42005-02-12 14:29:27 +00003029Note that when you make a mistake and call a function that is supposed to be
3030defined in an autoload script, but the script doesn't actually define the
Bram Moolenaarcb80aa22020-10-26 21:12:46 +01003031function, you will get an error message for the missing function. If you fix
3032the autoload script it won't be automatically loaded again. Either restart
3033Vim or manually source the script.
Bram Moolenaar26a60b42005-02-22 08:49:11 +00003034
3035Also note that if you have two script files, and one calls a function in the
Bram Moolenaar446cb832008-06-24 21:56:24 +00003036other and vice versa, before the used function is defined, it won't work.
Bram Moolenaar26a60b42005-02-22 08:49:11 +00003037Avoid using the autoload functionality at the toplevel.
Bram Moolenaar7c626922005-02-07 22:01:03 +00003038
Bram Moolenaar944697a2022-02-20 19:48:20 +00003039In |Vim9| script you will get error *E1263* if you define a function with
3040a "#" character in the name. You should use a name without "#" and use
3041`:export`.
Bram Moolenaar6f4754b2022-01-23 12:07:04 +00003042
Bram Moolenaar433f7c82006-03-21 21:29:36 +00003043Hint: If you distribute a bunch of scripts you can pack them together with the
3044|vimball| utility. Also read the user manual |distribute-script|.
3045
Bram Moolenaar071d4272004-06-13 20:20:40 +00003046==============================================================================
30476. Curly braces names *curly-braces-names*
3048
Bram Moolenaar84f72352012-03-11 15:57:40 +01003049In most places where you can use a variable, you can use a "curly braces name"
3050variable. This is a regular variable name with one or more expressions
3051wrapped in braces {} like this: >
Bram Moolenaar071d4272004-06-13 20:20:40 +00003052 my_{adjective}_variable
3053
Bram Moolenaar5da36052021-12-27 15:39:57 +00003054This only works in legacy Vim script, not in |Vim9| script.
3055
Bram Moolenaar071d4272004-06-13 20:20:40 +00003056When Vim encounters this, it evaluates the expression inside the braces, puts
3057that in place of the expression, and re-interprets the whole as a variable
3058name. So in the above example, if the variable "adjective" was set to
3059"noisy", then the reference would be to "my_noisy_variable", whereas if
3060"adjective" was set to "quiet", then it would be to "my_quiet_variable".
3061
3062One application for this is to create a set of variables governed by an option
Bram Moolenaar58b85342016-08-14 19:54:54 +02003063value. For example, the statement >
Bram Moolenaar071d4272004-06-13 20:20:40 +00003064 echo my_{&background}_message
3065
3066would output the contents of "my_dark_message" or "my_light_message" depending
3067on the current value of 'background'.
3068
3069You can use multiple brace pairs: >
3070 echo my_{adverb}_{adjective}_message
3071..or even nest them: >
3072 echo my_{ad{end_of_word}}_message
3073where "end_of_word" is either "verb" or "jective".
3074
3075However, the expression inside the braces must evaluate to a valid single
Bram Moolenaar402d2fe2005-04-15 21:00:38 +00003076variable name, e.g. this is invalid: >
Bram Moolenaar071d4272004-06-13 20:20:40 +00003077 :let foo='a + b'
3078 :echo c{foo}d
3079.. since the result of expansion is "ca + bd", which is not a variable name.
3080
3081 *curly-braces-function-names*
3082You can call and define functions by an evaluated name in a similar way.
3083Example: >
3084 :let func_end='whizz'
3085 :call my_func_{func_end}(parameter)
3086
3087This would call the function "my_func_whizz(parameter)".
3088
Bram Moolenaar84f72352012-03-11 15:57:40 +01003089This does NOT work: >
3090 :let i = 3
3091 :let @{i} = '' " error
3092 :echo @{i} " error
3093
Bram Moolenaar071d4272004-06-13 20:20:40 +00003094==============================================================================
30957. Commands *expression-commands*
3096
Bram Moolenaar5da36052021-12-27 15:39:57 +00003097Note: in |Vim9| script `:let` is not used. `:var` is used for variable
3098declarations and assignments do not use a command. |vim9-declaration|
Bram Moolenaar65e0d772020-06-14 17:29:55 +02003099
Bram Moolenaar071d4272004-06-13 20:20:40 +00003100:let {var-name} = {expr1} *:let* *E18*
3101 Set internal variable {var-name} to the result of the
3102 expression {expr1}. The variable will get the type
3103 from the {expr}. If {var-name} didn't exist yet, it
3104 is created.
3105
Bram Moolenaarf10911e2022-01-29 22:20:48 +00003106:let {var-name}[{idx}] = {expr1} *E689* *E1141*
Bram Moolenaar13065c42005-01-08 16:08:21 +00003107 Set a list item to the result of the expression
3108 {expr1}. {var-name} must refer to a list and {idx}
3109 must be a valid index in that list. For nested list
3110 the index can be repeated.
Bram Moolenaar446cb832008-06-24 21:56:24 +00003111 This cannot be used to add an item to a |List|.
Bram Moolenaar58b85342016-08-14 19:54:54 +02003112 This cannot be used to set a byte in a String. You
Bram Moolenaar446cb832008-06-24 21:56:24 +00003113 can do that like this: >
Bram Moolenaarc51cf032022-02-26 12:25:45 +00003114 :let var = var[0:2] .. 'X' .. var[4:]
Bram Moolenaar6e5ea8d2019-01-12 22:47:31 +01003115< When {var-name} is a |Blob| then {idx} can be the
3116 length of the blob, in which case one byte is
3117 appended.
3118
Bram Moolenaara2baa732022-02-04 16:09:54 +00003119 *E711* *E719* *E1165* *E1166* *E1183*
Bram Moolenaar3a3a7232005-01-17 22:16:15 +00003120:let {var-name}[{idx1}:{idx2}] = {expr1} *E708* *E709* *E710*
Bram Moolenaar32466aa2006-02-24 23:53:04 +00003121 Set a sequence of items in a |List| to the result of
3122 the expression {expr1}, which must be a list with the
Bram Moolenaar9588a0f2005-01-08 21:45:39 +00003123 correct number of items.
3124 {idx1} can be omitted, zero is used instead.
3125 {idx2} can be omitted, meaning the end of the list.
3126 When the selected range of items is partly past the
3127 end of the list, items will be added.
3128
Bram Moolenaar6f4754b2022-01-23 12:07:04 +00003129 *:let+=* *:let-=* *:letstar=* *:let/=* *:let%=*
3130 *:let.=* *:let..=* *E734* *E985* *E1019*
Bram Moolenaar3a3a7232005-01-17 22:16:15 +00003131:let {var} += {expr1} Like ":let {var} = {var} + {expr1}".
3132:let {var} -= {expr1} Like ":let {var} = {var} - {expr1}".
Bram Moolenaarff697e62019-02-12 22:28:33 +01003133:let {var} *= {expr1} Like ":let {var} = {var} * {expr1}".
3134:let {var} /= {expr1} Like ":let {var} = {var} / {expr1}".
3135:let {var} %= {expr1} Like ":let {var} = {var} % {expr1}".
Bram Moolenaar3a3a7232005-01-17 22:16:15 +00003136:let {var} .= {expr1} Like ":let {var} = {var} . {expr1}".
Bram Moolenaar558ca4a2019-04-04 18:15:38 +02003137:let {var} ..= {expr1} Like ":let {var} = {var} .. {expr1}".
Bram Moolenaar3a3a7232005-01-17 22:16:15 +00003138 These fail if {var} was not set yet and when the type
3139 of {var} and {expr1} don't fit the operator.
Bram Moolenaar558ca4a2019-04-04 18:15:38 +02003140 `.=` is not supported with Vim script version 2 and
3141 later, see |vimscript-version|.
Bram Moolenaar3a3a7232005-01-17 22:16:15 +00003142
3143
Bram Moolenaar071d4272004-06-13 20:20:40 +00003144:let ${env-name} = {expr1} *:let-environment* *:let-$*
3145 Set environment variable {env-name} to the result of
3146 the expression {expr1}. The type is always String.
Bram Moolenaar56c860c2019-08-17 20:09:31 +02003147
3148 On some systems making an environment variable empty
3149 causes it to be deleted. Many systems do not make a
3150 difference between an environment variable that is not
3151 set and an environment variable that is empty.
3152
Bram Moolenaar3a3a7232005-01-17 22:16:15 +00003153:let ${env-name} .= {expr1}
3154 Append {expr1} to the environment variable {env-name}.
3155 If the environment variable didn't exist yet this
3156 works like "=".
Bram Moolenaar071d4272004-06-13 20:20:40 +00003157
3158:let @{reg-name} = {expr1} *:let-register* *:let-@*
3159 Write the result of the expression {expr1} in register
3160 {reg-name}. {reg-name} must be a single letter, and
3161 must be the name of a writable register (see
3162 |registers|). "@@" can be used for the unnamed
3163 register, "@/" for the search pattern.
3164 If the result of {expr1} ends in a <CR> or <NL>, the
3165 register will be linewise, otherwise it will be set to
3166 characterwise.
3167 This can be used to clear the last search pattern: >
3168 :let @/ = ""
3169< This is different from searching for an empty string,
3170 that would match everywhere.
3171
Bram Moolenaar3a3a7232005-01-17 22:16:15 +00003172:let @{reg-name} .= {expr1}
Bram Moolenaar58b85342016-08-14 19:54:54 +02003173 Append {expr1} to register {reg-name}. If the
Bram Moolenaar3a3a7232005-01-17 22:16:15 +00003174 register was empty it's like setting it to {expr1}.
3175
Bram Moolenaaref2f6562007-05-06 13:32:59 +00003176:let &{option-name} = {expr1} *:let-option* *:let-&*
Bram Moolenaar071d4272004-06-13 20:20:40 +00003177 Set option {option-name} to the result of the
Bram Moolenaarfca34d62005-01-04 21:38:36 +00003178 expression {expr1}. A String or Number value is
3179 always converted to the type of the option.
Bram Moolenaar071d4272004-06-13 20:20:40 +00003180 For an option local to a window or buffer the effect
3181 is just like using the |:set| command: both the local
Bram Moolenaara5fac542005-10-12 20:58:49 +00003182 value and the global value are changed.
Bram Moolenaarfca34d62005-01-04 21:38:36 +00003183 Example: >
Bram Moolenaarc51cf032022-02-26 12:25:45 +00003184 :let &path = &path .. ',/usr/local/include'
Bram Moolenaar3df01732017-02-17 22:47:16 +01003185< This also works for terminal codes in the form t_xx.
3186 But only for alphanumerical names. Example: >
3187 :let &t_k1 = "\<Esc>[234;"
3188< When the code does not exist yet it will be created as
3189 a terminal key code, there is no error.
Bram Moolenaar071d4272004-06-13 20:20:40 +00003190
Bram Moolenaar3a3a7232005-01-17 22:16:15 +00003191:let &{option-name} .= {expr1}
3192 For a string option: Append {expr1} to the value.
3193 Does not insert a comma like |:set+=|.
3194
3195:let &{option-name} += {expr1}
3196:let &{option-name} -= {expr1}
3197 For a number or boolean option: Add or subtract
3198 {expr1}.
3199
Bram Moolenaar071d4272004-06-13 20:20:40 +00003200:let &l:{option-name} = {expr1}
Bram Moolenaar3a3a7232005-01-17 22:16:15 +00003201:let &l:{option-name} .= {expr1}
3202:let &l:{option-name} += {expr1}
3203:let &l:{option-name} -= {expr1}
Bram Moolenaar071d4272004-06-13 20:20:40 +00003204 Like above, but only set the local value of an option
3205 (if there is one). Works like |:setlocal|.
3206
3207:let &g:{option-name} = {expr1}
Bram Moolenaar3a3a7232005-01-17 22:16:15 +00003208:let &g:{option-name} .= {expr1}
3209:let &g:{option-name} += {expr1}
3210:let &g:{option-name} -= {expr1}
Bram Moolenaar071d4272004-06-13 20:20:40 +00003211 Like above, but only set the global value of an option
3212 (if there is one). Works like |:setglobal|.
Bram Moolenaarf10911e2022-01-29 22:20:48 +00003213 *E1093*
Bram Moolenaar13065c42005-01-08 16:08:21 +00003214:let [{name1}, {name2}, ...] = {expr1} *:let-unpack* *E687* *E688*
Bram Moolenaar32466aa2006-02-24 23:53:04 +00003215 {expr1} must evaluate to a |List|. The first item in
Bram Moolenaarfca34d62005-01-04 21:38:36 +00003216 the list is assigned to {name1}, the second item to
3217 {name2}, etc.
3218 The number of names must match the number of items in
Bram Moolenaar32466aa2006-02-24 23:53:04 +00003219 the |List|.
Bram Moolenaarfca34d62005-01-04 21:38:36 +00003220 Each name can be one of the items of the ":let"
3221 command as mentioned above.
3222 Example: >
3223 :let [s, item] = GetItem(s)
Bram Moolenaar3a3a7232005-01-17 22:16:15 +00003224< Detail: {expr1} is evaluated first, then the
3225 assignments are done in sequence. This matters if
3226 {name2} depends on {name1}. Example: >
3227 :let x = [0, 1]
3228 :let i = 0
3229 :let [i, x[i]] = [1, 2]
3230 :echo x
3231< The result is [0, 2].
3232
3233:let [{name1}, {name2}, ...] .= {expr1}
3234:let [{name1}, {name2}, ...] += {expr1}
3235:let [{name1}, {name2}, ...] -= {expr1}
3236 Like above, but append/add/subtract the value for each
Bram Moolenaar32466aa2006-02-24 23:53:04 +00003237 |List| item.
Bram Moolenaarfca34d62005-01-04 21:38:36 +00003238
Bram Moolenaard1caa942020-04-10 22:10:56 +02003239:let [{name}, ..., ; {lastname}] = {expr1} *E452*
Bram Moolenaar32466aa2006-02-24 23:53:04 +00003240 Like |:let-unpack| above, but the |List| may have more
Bram Moolenaar3a3a7232005-01-17 22:16:15 +00003241 items than there are names. A list of the remaining
3242 items is assigned to {lastname}. If there are no
3243 remaining items {lastname} is set to an empty list.
Bram Moolenaarfca34d62005-01-04 21:38:36 +00003244 Example: >
3245 :let [a, b; rest] = ["aval", "bval", 3, 4]
3246<
Bram Moolenaar3a3a7232005-01-17 22:16:15 +00003247:let [{name}, ..., ; {lastname}] .= {expr1}
3248:let [{name}, ..., ; {lastname}] += {expr1}
3249:let [{name}, ..., ; {lastname}] -= {expr1}
3250 Like above, but append/add/subtract the value for each
Bram Moolenaar32466aa2006-02-24 23:53:04 +00003251 |List| item.
Bram Moolenaar4a748032010-09-30 21:47:56 +02003252
Bram Moolenaar24582002019-07-21 14:14:26 +02003253 *:let=<<* *:let-heredoc*
Bram Moolenaarf10911e2022-01-29 22:20:48 +00003254 *E990* *E991* *E172* *E221* *E1145*
Yegappan Lakshmananefbfa862022-04-17 12:47:40 +01003255:let {var-name} =<< [trim] [eval] {endmarker}
Bram Moolenaarf5842c52019-05-19 18:41:26 +02003256text...
3257text...
Bram Moolenaar2e693a82019-10-16 22:35:02 +02003258{endmarker}
Bram Moolenaare46a4402020-06-30 20:38:27 +02003259 Set internal variable {var-name} to a |List|
3260 containing the lines of text bounded by the string
Yegappan Lakshmananefbfa862022-04-17 12:47:40 +01003261 {endmarker}.
3262
3263 If "eval" is not specified, then each line of text is
Bram Moolenaard899e512022-05-07 21:54:03 +01003264 used as a |literal-string|, except that single quotes
3265 doe not need to be doubled.
3266 If "eval" is specified, then any Vim expression in the
3267 form {expr} is evaluated and the result replaces the
3268 expression, like with |interp-string|.
Yegappan Lakshmananefbfa862022-04-17 12:47:40 +01003269 Example where $HOME is expanded: >
3270 let lines =<< trim eval END
3271 some text
Bram Moolenaard899e512022-05-07 21:54:03 +01003272 See the file {$HOME}/.vimrc
Yegappan Lakshmananefbfa862022-04-17 12:47:40 +01003273 more text
3274 END
3275< There can be multiple Vim expressions in a single line
3276 but an expression cannot span multiple lines. If any
3277 expression evaluation fails, then the assignment fails.
Yegappan Lakshmananefbfa862022-04-17 12:47:40 +01003278
Bram Moolenaar2e693a82019-10-16 22:35:02 +02003279 {endmarker} must not contain white space.
3280 {endmarker} cannot start with a lower case character.
3281 The last line should end only with the {endmarker}
3282 string without any other character. Watch out for
3283 white space after {endmarker}!
Bram Moolenaarf5842c52019-05-19 18:41:26 +02003284
Bram Moolenaare7eb9272019-06-24 00:58:07 +02003285 Without "trim" any white space characters in the lines
3286 of text are preserved. If "trim" is specified before
Bram Moolenaar2e693a82019-10-16 22:35:02 +02003287 {endmarker}, then indentation is stripped so you can
3288 do: >
Bram Moolenaare7eb9272019-06-24 00:58:07 +02003289 let text =<< trim END
3290 if ok
3291 echo 'done'
3292 endif
3293 END
3294< Results in: ["if ok", " echo 'done'", "endif"]
3295 The marker must line up with "let" and the indentation
3296 of the first line is removed from all the text lines.
3297 Specifically: all the leading indentation exactly
3298 matching the leading indentation of the first
3299 non-empty text line is stripped from the input lines.
3300 All leading indentation exactly matching the leading
3301 indentation before `let` is stripped from the line
Bram Moolenaar2e693a82019-10-16 22:35:02 +02003302 containing {endmarker}. Note that the difference
3303 between space and tab matters here.
Bram Moolenaarf5842c52019-05-19 18:41:26 +02003304
3305 If {var-name} didn't exist yet, it is created.
3306 Cannot be followed by another command, but can be
3307 followed by a comment.
3308
Bram Moolenaar2e693a82019-10-16 22:35:02 +02003309 To avoid line continuation to be applied, consider
3310 adding 'C' to 'cpoptions': >
3311 set cpo+=C
3312 let var =<< END
3313 \ leading backslash
3314 END
3315 set cpo-=C
3316<
Bram Moolenaarf5842c52019-05-19 18:41:26 +02003317 Examples: >
3318 let var1 =<< END
Bram Moolenaar2e693a82019-10-16 22:35:02 +02003319 Sample text 1
3320 Sample text 2
3321 Sample text 3
3322 END
Bram Moolenaarf5842c52019-05-19 18:41:26 +02003323
3324 let data =<< trim DATA
Bram Moolenaar2e693a82019-10-16 22:35:02 +02003325 1 2 3 4
3326 5 6 7 8
Bram Moolenaarf5842c52019-05-19 18:41:26 +02003327 DATA
Yegappan Lakshmananefbfa862022-04-17 12:47:40 +01003328
3329 let code =<< trim eval CODE
Bram Moolenaard899e512022-05-07 21:54:03 +01003330 let v = {10 + 20}
3331 let h = "{$HOME}"
3332 let s = "{Str1()} abc {Str2()}"
3333 let n = {MyFunc(3, 4)}
Yegappan Lakshmananefbfa862022-04-17 12:47:40 +01003334 CODE
Bram Moolenaarf5842c52019-05-19 18:41:26 +02003335<
Bram Moolenaar4a748032010-09-30 21:47:56 +02003336 *E121*
Bram Moolenaar58b85342016-08-14 19:54:54 +02003337:let {var-name} .. List the value of variable {var-name}. Multiple
Bram Moolenaardcaf10e2005-01-21 11:55:25 +00003338 variable names may be given. Special names recognized
3339 here: *E738*
Bram Moolenaarca003e12006-03-17 23:19:38 +00003340 g: global variables
3341 b: local buffer variables
3342 w: local window variables
Bram Moolenaar910f66f2006-04-05 20:41:53 +00003343 t: local tab page variables
Bram Moolenaarca003e12006-03-17 23:19:38 +00003344 s: script-local variables
3345 l: local function variables
Bram Moolenaardcaf10e2005-01-21 11:55:25 +00003346 v: Vim variables.
Bram Moolenaar65e0d772020-06-14 17:29:55 +02003347 This does not work in Vim9 script. |vim9-declaration|
Bram Moolenaar071d4272004-06-13 20:20:40 +00003348
Bram Moolenaard7ee7ce2005-01-03 21:02:03 +00003349:let List the values of all variables. The type of the
3350 variable is indicated before the value:
3351 <nothing> String
3352 # Number
Bram Moolenaarc9b4b052006-04-30 18:54:39 +00003353 * Funcref
Bram Moolenaar65e0d772020-06-14 17:29:55 +02003354 This does not work in Vim9 script. |vim9-declaration|
Bram Moolenaar071d4272004-06-13 20:20:40 +00003355
Bram Moolenaar6f4754b2022-01-23 12:07:04 +00003356:unl[et][!] {name} ... *:unlet* *:unl* *E108* *E795* *E1081*
Bram Moolenaar2ce06f62005-01-31 19:19:04 +00003357 Remove the internal variable {name}. Several variable
3358 names can be given, they are all removed. The name
Bram Moolenaar32466aa2006-02-24 23:53:04 +00003359 may also be a |List| or |Dictionary| item.
Bram Moolenaar071d4272004-06-13 20:20:40 +00003360 With [!] no error message is given for non-existing
3361 variables.
Bram Moolenaar32466aa2006-02-24 23:53:04 +00003362 One or more items from a |List| can be removed: >
Bram Moolenaar9cd15162005-01-16 22:02:49 +00003363 :unlet list[3] " remove fourth item
3364 :unlet list[3:] " remove fourth item to last
Bram Moolenaar32466aa2006-02-24 23:53:04 +00003365< One item from a |Dictionary| can be removed at a time: >
Bram Moolenaar9cd15162005-01-16 22:02:49 +00003366 :unlet dict['two']
3367 :unlet dict.two
Bram Moolenaarc236c162008-07-13 17:41:49 +00003368< This is especially useful to clean up used global
3369 variables and script-local variables (these are not
3370 deleted when the script ends). Function-local
3371 variables are automatically deleted when the function
3372 ends.
Bram Moolenaar071d4272004-06-13 20:20:40 +00003373
Bram Moolenaar137374f2018-05-13 15:59:50 +02003374:unl[et] ${env-name} ... *:unlet-environment* *:unlet-$*
3375 Remove environment variable {env-name}.
3376 Can mix {name} and ${env-name} in one :unlet command.
3377 No error message is given for a non-existing
3378 variable, also without !.
3379 If the system does not support deleting an environment
Bram Moolenaar9937a052019-06-15 15:45:06 +02003380 variable, it is made empty.
Bram Moolenaar137374f2018-05-13 15:59:50 +02003381
Bram Moolenaar6f4754b2022-01-23 12:07:04 +00003382 *:cons* *:const* *E1018*
Bram Moolenaar9937a052019-06-15 15:45:06 +02003383:cons[t] {var-name} = {expr1}
3384:cons[t] [{name1}, {name2}, ...] = {expr1}
Bram Moolenaar9937a052019-06-15 15:45:06 +02003385:cons[t] [{name}, ..., ; {lastname}] = {expr1}
3386:cons[t] {var-name} =<< [trim] {marker}
3387text...
3388text...
3389{marker}
3390 Similar to |:let|, but additionally lock the variable
3391 after setting the value. This is the same as locking
3392 the variable with |:lockvar| just after |:let|, thus: >
3393 :const x = 1
3394< is equivalent to: >
3395 :let x = 1
Bram Moolenaar021bda52020-08-17 21:07:22 +02003396 :lockvar! x
Bram Moolenaara187c432020-09-16 21:08:28 +02003397< NOTE: in Vim9 script `:const` works differently, see
3398 |vim9-const|
3399 This is useful if you want to make sure the variable
Bram Moolenaar021bda52020-08-17 21:07:22 +02003400 is not modified. If the value is a List or Dictionary
3401 literal then the items also cannot be changed: >
3402 const ll = [1, 2, 3]
3403 let ll[1] = 5 " Error!
Bram Moolenaar6e649222021-10-04 21:32:54 +01003404< Nested references are not locked: >
Bram Moolenaar021bda52020-08-17 21:07:22 +02003405 let lvar = ['a']
3406 const lconst = [0, lvar]
3407 let lconst[0] = 2 " Error!
3408 let lconst[1][0] = 'b' " OK
3409< *E995*
Bram Moolenaar9b283522019-06-17 22:19:33 +02003410 |:const| does not allow to for changing a variable: >
Bram Moolenaar9937a052019-06-15 15:45:06 +02003411 :let x = 1
3412 :const x = 2 " Error!
Bram Moolenaar1c196e72019-06-16 15:41:58 +02003413< *E996*
3414 Note that environment variables, option values and
3415 register values cannot be used here, since they cannot
3416 be locked.
3417
Bram Moolenaar85850f32019-07-19 22:05:51 +02003418:cons[t]
3419:cons[t] {var-name}
3420 If no argument is given or only {var-name} is given,
3421 the behavior is the same as |:let|.
3422
Bram Moolenaar2ce06f62005-01-31 19:19:04 +00003423:lockv[ar][!] [depth] {name} ... *:lockvar* *:lockv*
3424 Lock the internal variable {name}. Locking means that
3425 it can no longer be changed (until it is unlocked).
3426 A locked variable can be deleted: >
3427 :lockvar v
Bram Moolenaardad44732021-03-31 20:07:33 +02003428 :let v = 'asdf' " fails!
3429 :unlet v " works
Bram Moolenaarf10911e2022-01-29 22:20:48 +00003430< *E741* *E940* *E1118* *E1119* *E1120* *E1121* *E1122*
Bram Moolenaar2ce06f62005-01-31 19:19:04 +00003431 If you try to change a locked variable you get an
Bram Moolenaare7877fe2017-02-20 22:35:33 +01003432 error message: "E741: Value is locked: {name}".
3433 If you try to lock or unlock a built-in variable you
3434 get an error message: "E940: Cannot lock or unlock
3435 variable {name}".
Bram Moolenaar2ce06f62005-01-31 19:19:04 +00003436
Bram Moolenaar32466aa2006-02-24 23:53:04 +00003437 [depth] is relevant when locking a |List| or
3438 |Dictionary|. It specifies how deep the locking goes:
Bram Moolenaara187c432020-09-16 21:08:28 +02003439 0 Lock the variable {name} but not its
3440 value.
Bram Moolenaar32466aa2006-02-24 23:53:04 +00003441 1 Lock the |List| or |Dictionary| itself,
Bram Moolenaar2ce06f62005-01-31 19:19:04 +00003442 cannot add or remove items, but can
3443 still change their values.
3444 2 Also lock the values, cannot change
Bram Moolenaar32466aa2006-02-24 23:53:04 +00003445 the items. If an item is a |List| or
3446 |Dictionary|, cannot add or remove
Bram Moolenaar2ce06f62005-01-31 19:19:04 +00003447 items, but can still change the
3448 values.
Bram Moolenaar32466aa2006-02-24 23:53:04 +00003449 3 Like 2 but for the |List| /
3450 |Dictionary| in the |List| /
3451 |Dictionary|, one level deeper.
3452 The default [depth] is 2, thus when {name} is a |List|
3453 or |Dictionary| the values cannot be changed.
Bram Moolenaara187c432020-09-16 21:08:28 +02003454
3455 Example with [depth] 0: >
3456 let mylist = [1, 2, 3]
3457 lockvar 0 mylist
Bram Moolenaar6e649222021-10-04 21:32:54 +01003458 let mylist[0] = 77 " OK
3459 call add(mylist, 4] " OK
Bram Moolenaara187c432020-09-16 21:08:28 +02003460 let mylist = [7, 8, 9] " Error!
3461< *E743*
Bram Moolenaar2ce06f62005-01-31 19:19:04 +00003462 For unlimited depth use [!] and omit [depth].
3463 However, there is a maximum depth of 100 to catch
3464 loops.
3465
Bram Moolenaar32466aa2006-02-24 23:53:04 +00003466 Note that when two variables refer to the same |List|
3467 and you lock one of them, the |List| will also be
Bram Moolenaar910f66f2006-04-05 20:41:53 +00003468 locked when used through the other variable.
3469 Example: >
Bram Moolenaar2ce06f62005-01-31 19:19:04 +00003470 :let l = [0, 1, 2, 3]
3471 :let cl = l
3472 :lockvar l
3473 :let cl[1] = 99 " won't work!
3474< You may want to make a copy of a list to avoid this.
3475 See |deepcopy()|.
3476
3477
Bram Moolenaara2baa732022-02-04 16:09:54 +00003478:unlo[ckvar][!] [depth] {name} ... *:unlockvar* *:unlo* *E1246*
Bram Moolenaar2ce06f62005-01-31 19:19:04 +00003479 Unlock the internal variable {name}. Does the
3480 opposite of |:lockvar|.
3481
Bram Moolenaar61da1bf2019-06-06 12:14:49 +02003482:if {expr1} *:if* *:end* *:endif* *:en* *E171* *E579* *E580*
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003483:en[dif] Execute the commands until the next matching `:else`
3484 or `:endif` if {expr1} evaluates to non-zero.
Bram Moolenaarc51cf032022-02-26 12:25:45 +00003485 Although the short forms work, it is recommended to
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003486 always use `:endif` to avoid confusion and to make
3487 auto-indenting work properly.
Bram Moolenaar071d4272004-06-13 20:20:40 +00003488
3489 From Vim version 4.5 until 5.0, every Ex command in
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003490 between the `:if` and `:endif` is ignored. These two
Bram Moolenaar071d4272004-06-13 20:20:40 +00003491 commands were just to allow for future expansions in a
Bram Moolenaar85084ef2016-01-17 22:26:33 +01003492 backward compatible way. Nesting was allowed. Note
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003493 that any `:else` or `:elseif` was ignored, the `else`
Bram Moolenaar071d4272004-06-13 20:20:40 +00003494 part was not executed either.
3495
3496 You can use this to remain compatible with older
3497 versions: >
3498 :if version >= 500
3499 : version-5-specific-commands
3500 :endif
3501< The commands still need to be parsed to find the
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003502 `endif`. Sometimes an older Vim has a problem with a
3503 new command. For example, `:silent` is recognized as
3504 a `:substitute` command. In that case `:execute` can
Bram Moolenaar071d4272004-06-13 20:20:40 +00003505 avoid problems: >
3506 :if version >= 600
3507 : execute "silent 1,$delete"
3508 :endif
3509<
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003510 In |Vim9| script `:endif` cannot be shortened, to
3511 improve script readability.
3512 NOTE: The `:append` and `:insert` commands don't work
3513 properly in between `:if` and `:endif`.
Bram Moolenaar071d4272004-06-13 20:20:40 +00003514
3515 *:else* *:el* *E581* *E583*
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003516:el[se] Execute the commands until the next matching `:else`
3517 or `:endif` if they previously were not being
Bram Moolenaar071d4272004-06-13 20:20:40 +00003518 executed.
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003519 In |Vim9| script `:else` cannot be shortened, to
3520 improve script readability.
Bram Moolenaar071d4272004-06-13 20:20:40 +00003521
3522 *:elseif* *:elsei* *E582* *E584*
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003523:elsei[f] {expr1} Short for `:else` `:if`, with the addition that there
3524 is no extra `:endif`.
3525 In |Vim9| script `:elseif` cannot be shortened, to
3526 improve script readability.
Bram Moolenaar071d4272004-06-13 20:20:40 +00003527
3528:wh[ile] {expr1} *:while* *:endwhile* *:wh* *:endw*
Bram Moolenaar3a3a7232005-01-17 22:16:15 +00003529 *E170* *E585* *E588* *E733*
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003530:endw[hile] Repeat the commands between `:while` and `:endwhile`,
Bram Moolenaar071d4272004-06-13 20:20:40 +00003531 as long as {expr1} evaluates to non-zero.
3532 When an error is detected from a command inside the
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003533 loop, execution continues after the `endwhile`.
Bram Moolenaar12805862005-01-05 22:16:17 +00003534 Example: >
3535 :let lnum = 1
3536 :while lnum <= line("$")
3537 :call FixLine(lnum)
3538 :let lnum = lnum + 1
3539 :endwhile
3540<
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003541 In |Vim9| script `:while` and `:endwhile` cannot be
3542 shortened, to improve script readability.
3543 NOTE: The `:append` and `:insert` commands don't work
3544 properly inside a `:while` and `:for` loop.
Bram Moolenaar071d4272004-06-13 20:20:40 +00003545
Bram Moolenaar5e66b422019-01-24 21:58:10 +01003546:for {var} in {object} *:for* *E690* *E732*
Bram Moolenaar12805862005-01-05 22:16:17 +00003547:endfo[r] *:endfo* *:endfor*
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003548 Repeat the commands between `:for` and `:endfor` for
Bram Moolenaar3f32a5f2022-05-12 20:34:15 +01003549 each item in {object}. {object} can be a |List|,
3550 a |Blob| or a |String|. *E1177*
Bram Moolenaar5da36052021-12-27 15:39:57 +00003551
3552 Variable {var} is set to the value of each item.
3553 In |Vim9| script the loop variable must not have been
3554 declared yet, unless when it is a
3555 global/window/tab/buffer variable.
3556
3557 When an error is detected for a command inside the
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003558 loop, execution continues after the `endfor`.
Bram Moolenaar5e66b422019-01-24 21:58:10 +01003559 Changing {object} inside the loop affects what items
3560 are used. Make a copy if this is unwanted: >
Bram Moolenaarde8866b2005-01-06 23:24:37 +00003561 :for item in copy(mylist)
Bram Moolenaar5e66b422019-01-24 21:58:10 +01003562<
Bram Moolenaar5da36052021-12-27 15:39:57 +00003563 When {object} is a |List| and not making a copy, in
3564 legacy script Vim stores a reference to the next item
3565 in the |List| before executing the commands with the
3566 current item. Thus the current item can be removed
3567 without effect. Removing any later item means it will
3568 not be found. Thus the following example works (an
3569 inefficient way to make a |List| empty): >
Bram Moolenaar8f3f58f2010-01-06 20:52:26 +01003570 for item in mylist
3571 call remove(mylist, 0)
3572 endfor
Bram Moolenaar5e66b422019-01-24 21:58:10 +01003573< Note that reordering the |List| (e.g., with sort() or
Bram Moolenaar9588a0f2005-01-08 21:45:39 +00003574 reverse()) may have unexpected effects.
Bram Moolenaar5da36052021-12-27 15:39:57 +00003575 In |Vim9| script the index is used. If an item before
3576 the current one is deleted the next item will be
3577 skipped.
Bram Moolenaar12805862005-01-05 22:16:17 +00003578
Bram Moolenaar5e66b422019-01-24 21:58:10 +01003579 When {object} is a |Blob|, Vim always makes a copy to
3580 iterate over. Unlike with |List|, modifying the
3581 |Blob| does not affect the iteration.
3582
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003583 In |Vim9| script `:endfor` cannot be shortened, to
3584 improve script readability.
3585
Bram Moolenaar12805862005-01-05 22:16:17 +00003586:for [{var1}, {var2}, ...] in {listlist}
Bram Moolenaarf10911e2022-01-29 22:20:48 +00003587:endfo[r] *E1140*
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003588 Like `:for` above, but each item in {listlist} must be
Bram Moolenaar12805862005-01-05 22:16:17 +00003589 a list, of which each item is assigned to {var1},
3590 {var2}, etc. Example: >
3591 :for [lnum, col] in [[1, 3], [2, 5], [3, 8]]
3592 :echo getline(lnum)[col]
3593 :endfor
3594<
Bram Moolenaar071d4272004-06-13 20:20:40 +00003595 *:continue* *:con* *E586*
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003596:con[tinue] When used inside a `:while` or `:for` loop, jumps back
Bram Moolenaar12805862005-01-05 22:16:17 +00003597 to the start of the loop.
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003598 If it is used after a `:try` inside the loop but
3599 before the matching `:finally` (if present), the
3600 commands following the `:finally` up to the matching
3601 `:endtry` are executed first. This process applies to
3602 all nested `:try`s inside the loop. The outermost
3603 `:endtry` then jumps back to the start of the loop.
Bram Moolenaar071d4272004-06-13 20:20:40 +00003604
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003605 In |Vim9| script `:cont` is the shortest form, to
3606 improve script readability.
Bram Moolenaar071d4272004-06-13 20:20:40 +00003607 *:break* *:brea* *E587*
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003608:brea[k] When used inside a `:while` or `:for` loop, skips to
3609 the command after the matching `:endwhile` or
3610 `:endfor`.
3611 If it is used after a `:try` inside the loop but
3612 before the matching `:finally` (if present), the
3613 commands following the `:finally` up to the matching
3614 `:endtry` are executed first. This process applies to
3615 all nested `:try`s inside the loop. The outermost
3616 `:endtry` then jumps to the command after the loop.
3617
3618 In |Vim9| script `:break` cannot be shortened, to
3619 improve script readability.
Bram Moolenaar071d4272004-06-13 20:20:40 +00003620
Bram Moolenaar6f4754b2022-01-23 12:07:04 +00003621:try *:try* *:endt* *:endtry*
3622 *E600* *E601* *E602* *E1032*
Bram Moolenaar071d4272004-06-13 20:20:40 +00003623:endt[ry] Change the error handling for the commands between
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003624 `:try` and `:endtry` including everything being
3625 executed across `:source` commands, function calls,
Bram Moolenaar071d4272004-06-13 20:20:40 +00003626 or autocommand invocations.
3627
3628 When an error or interrupt is detected and there is
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003629 a `:finally` command following, execution continues
3630 after the `:finally`. Otherwise, or when the
3631 `:endtry` is reached thereafter, the next
3632 (dynamically) surrounding `:try` is checked for
3633 a corresponding `:finally` etc. Then the script
Bram Moolenaarbc93ceb2020-02-26 13:36:21 +01003634 processing is terminated. Whether a function
3635 definition has an "abort" argument does not matter.
Bram Moolenaar071d4272004-06-13 20:20:40 +00003636 Example: >
Bram Moolenaarbc93ceb2020-02-26 13:36:21 +01003637 try | call Unknown() | finally | echomsg "cleanup" | endtry
3638 echomsg "not reached"
Bram Moolenaar071d4272004-06-13 20:20:40 +00003639<
3640 Moreover, an error or interrupt (dynamically) inside
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003641 `:try` and `:endtry` is converted to an exception. It
3642 can be caught as if it were thrown by a `:throw`
3643 command (see `:catch`). In this case, the script
Bram Moolenaar071d4272004-06-13 20:20:40 +00003644 processing is not terminated.
3645
3646 The value "Vim:Interrupt" is used for an interrupt
3647 exception. An error in a Vim command is converted
3648 to a value of the form "Vim({command}):{errmsg}",
3649 other errors are converted to a value of the form
3650 "Vim:{errmsg}". {command} is the full command name,
3651 and {errmsg} is the message that is displayed if the
3652 error exception is not caught, always beginning with
3653 the error number.
3654 Examples: >
Bram Moolenaarbc93ceb2020-02-26 13:36:21 +01003655 try | sleep 100 | catch /^Vim:Interrupt$/ | endtry
3656 try | edit | catch /^Vim(edit):E\d\+/ | echo "error" | endtry
Bram Moolenaar071d4272004-06-13 20:20:40 +00003657<
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003658 In |Vim9| script `:endtry` cannot be shortened, to
3659 improve script readability.
3660
Bram Moolenaar6f4754b2022-01-23 12:07:04 +00003661 *:cat* *:catch*
3662 *E603* *E604* *E605* *E654* *E1033*
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003663:cat[ch] /{pattern}/ The following commands until the next `:catch`,
3664 `:finally`, or `:endtry` that belongs to the same
3665 `:try` as the `:catch` are executed when an exception
Bram Moolenaar071d4272004-06-13 20:20:40 +00003666 matching {pattern} is being thrown and has not yet
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003667 been caught by a previous `:catch`. Otherwise, these
Bram Moolenaar071d4272004-06-13 20:20:40 +00003668 commands are skipped.
3669 When {pattern} is omitted all errors are caught.
3670 Examples: >
Bram Moolenaar647e24b2019-03-17 16:39:46 +01003671 :catch /^Vim:Interrupt$/ " catch interrupts (CTRL-C)
3672 :catch /^Vim\%((\a\+)\)\=:E/ " catch all Vim errors
3673 :catch /^Vim\%((\a\+)\)\=:/ " catch errors and interrupts
3674 :catch /^Vim(write):/ " catch all errors in :write
3675 :catch /^Vim\%((\a\+)\)\=:E123:/ " catch error E123
3676 :catch /my-exception/ " catch user exception
3677 :catch /.*/ " catch everything
3678 :catch " same as /.*/
Bram Moolenaar071d4272004-06-13 20:20:40 +00003679<
3680 Another character can be used instead of / around the
3681 {pattern}, so long as it does not have a special
3682 meaning (e.g., '|' or '"') and doesn't occur inside
Bram Moolenaar6f4754b2022-01-23 12:07:04 +00003683 {pattern}. *E1067*
Bram Moolenaar7e38ea22014-04-05 22:55:53 +02003684 Information about the exception is available in
3685 |v:exception|. Also see |throw-variables|.
Bram Moolenaar071d4272004-06-13 20:20:40 +00003686 NOTE: It is not reliable to ":catch" the TEXT of
3687 an error message because it may vary in different
3688 locales.
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003689 In |Vim9| script `:catch` cannot be shortened, to
3690 improve script readability.
Bram Moolenaar071d4272004-06-13 20:20:40 +00003691
3692 *:fina* *:finally* *E606* *E607*
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003693:fina[lly] The following commands until the matching `:endtry`
Bram Moolenaar071d4272004-06-13 20:20:40 +00003694 are executed whenever the part between the matching
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003695 `:try` and the `:finally` is left: either by falling
3696 through to the `:finally` or by a `:continue`,
3697 `:break`, `:finish`, or `:return`, or by an error or
3698 interrupt or exception (see `:throw`).
3699
3700 In |Vim9| script `:finally` cannot be shortened, to
3701 improve script readability and avoid confusion with
3702 `:final`.
Bram Moolenaar071d4272004-06-13 20:20:40 +00003703
Bram Moolenaarf10911e2022-01-29 22:20:48 +00003704 *:th* *:throw* *E608* *E1129*
Bram Moolenaar071d4272004-06-13 20:20:40 +00003705:th[row] {expr1} The {expr1} is evaluated and thrown as an exception.
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003706 If the ":throw" is used after a `:try` but before the
3707 first corresponding `:catch`, commands are skipped
3708 until the first `:catch` matching {expr1} is reached.
3709 If there is no such `:catch` or if the ":throw" is
3710 used after a `:catch` but before the `:finally`, the
3711 commands following the `:finally` (if present) up to
3712 the matching `:endtry` are executed. If the `:throw`
3713 is after the `:finally`, commands up to the `:endtry`
Bram Moolenaar071d4272004-06-13 20:20:40 +00003714 are skipped. At the ":endtry", this process applies
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003715 again for the next dynamically surrounding `:try`
Bram Moolenaar071d4272004-06-13 20:20:40 +00003716 (which may be found in a calling function or sourcing
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003717 script), until a matching `:catch` has been found.
Bram Moolenaar071d4272004-06-13 20:20:40 +00003718 If the exception is not caught, the command processing
3719 is terminated.
3720 Example: >
3721 :try | throw "oops" | catch /^oo/ | echo "caught" | endtry
Bram Moolenaar662db672011-03-22 14:05:35 +01003722< Note that "catch" may need to be on a separate line
3723 for when an error causes the parsing to skip the whole
3724 line and not see the "|" that separates the commands.
Bram Moolenaar071d4272004-06-13 20:20:40 +00003725
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003726 In |Vim9| script `:throw` cannot be shortened, to
3727 improve script readability.
3728
Bram Moolenaar071d4272004-06-13 20:20:40 +00003729 *:ec* *:echo*
3730:ec[ho] {expr1} .. Echoes each {expr1}, with a space in between. The
3731 first {expr1} starts on a new line.
3732 Also see |:comment|.
3733 Use "\n" to start a new line. Use "\r" to move the
3734 cursor to the first column.
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003735 Uses the highlighting set by the `:echohl` command.
Bram Moolenaar071d4272004-06-13 20:20:40 +00003736 Cannot be followed by a comment.
3737 Example: >
3738 :echo "the value of 'shell' is" &shell
Bram Moolenaaref2f6562007-05-06 13:32:59 +00003739< *:echo-redraw*
3740 A later redraw may make the message disappear again.
3741 And since Vim mostly postpones redrawing until it's
3742 finished with a sequence of commands this happens
3743 quite often. To avoid that a command from before the
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003744 `:echo` causes a redraw afterwards (redraws are often
Bram Moolenaaref2f6562007-05-06 13:32:59 +00003745 postponed until you type something), force a redraw
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003746 with the `:redraw` command. Example: >
Bram Moolenaar071d4272004-06-13 20:20:40 +00003747 :new | redraw | echo "there is a new window"
3748<
3749 *:echon*
3750:echon {expr1} .. Echoes each {expr1}, without anything added. Also see
3751 |:comment|.
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003752 Uses the highlighting set by the `:echohl` command.
Bram Moolenaar071d4272004-06-13 20:20:40 +00003753 Cannot be followed by a comment.
3754 Example: >
3755 :echon "the value of 'shell' is " &shell
3756<
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003757 Note the difference between using `:echo`, which is a
3758 Vim command, and `:!echo`, which is an external shell
Bram Moolenaar071d4272004-06-13 20:20:40 +00003759 command: >
3760 :!echo % --> filename
3761< The arguments of ":!" are expanded, see |:_%|. >
3762 :!echo "%" --> filename or "filename"
3763< Like the previous example. Whether you see the double
3764 quotes or not depends on your 'shell'. >
3765 :echo % --> nothing
3766< The '%' is an illegal character in an expression. >
3767 :echo "%" --> %
3768< This just echoes the '%' character. >
3769 :echo expand("%") --> filename
3770< This calls the expand() function to expand the '%'.
3771
3772 *:echoh* *:echohl*
3773:echoh[l] {name} Use the highlight group {name} for the following
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003774 `:echo`, `:echon` and `:echomsg` commands. Also used
3775 for the `input()` prompt. Example: >
Bram Moolenaar071d4272004-06-13 20:20:40 +00003776 :echohl WarningMsg | echo "Don't panic!" | echohl None
3777< Don't forget to set the group back to "None",
3778 otherwise all following echo's will be highlighted.
3779
3780 *:echom* *:echomsg*
3781:echom[sg] {expr1} .. Echo the expression(s) as a true message, saving the
3782 message in the |message-history|.
3783 Spaces are placed between the arguments as with the
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003784 `:echo` command. But unprintable characters are
Bram Moolenaar071d4272004-06-13 20:20:40 +00003785 displayed, not interpreted.
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003786 The parsing works slightly different from `:echo`,
3787 more like `:execute`. All the expressions are first
Bram Moolenaaref2f6562007-05-06 13:32:59 +00003788 evaluated and concatenated before echoing anything.
Bram Moolenaar461a7fc2018-12-22 13:28:07 +01003789 If expressions does not evaluate to a Number or
3790 String, string() is used to turn it into a string.
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003791 Uses the highlighting set by the `:echohl` command.
Bram Moolenaar071d4272004-06-13 20:20:40 +00003792 Example: >
3793 :echomsg "It's a Zizzer Zazzer Zuzz, as you can plainly see."
Bram Moolenaaref2f6562007-05-06 13:32:59 +00003794< See |:echo-redraw| to avoid the message disappearing
3795 when the screen is redrawn.
Bram Moolenaar071d4272004-06-13 20:20:40 +00003796 *:echoe* *:echoerr*
3797:echoe[rr] {expr1} .. Echo the expression(s) as an error message, saving the
3798 message in the |message-history|. When used in a
3799 script or function the line number will be added.
3800 Spaces are placed between the arguments as with the
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003801 `:echomsg` command. When used inside a try conditional,
Bram Moolenaar071d4272004-06-13 20:20:40 +00003802 the message is raised as an error exception instead
3803 (see |try-echoerr|).
3804 Example: >
3805 :echoerr "This script just failed!"
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003806< If you just want a highlighted message use `:echohl`.
Bram Moolenaar071d4272004-06-13 20:20:40 +00003807 And to get a beep: >
3808 :exe "normal \<Esc>"
Bram Moolenaar4c868302021-03-22 16:19:45 +01003809
3810:echoc[onsole] {expr1} .. *:echoc* *:echoconsole*
3811 Intended for testing: works like `:echomsg` but when
3812 running in the GUI and started from a terminal write
3813 the text to stdout.
3814
Bram Moolenaar09c6f262019-11-17 15:55:14 +01003815 *:eval*
3816:eval {expr} Evaluate {expr} and discard the result. Example: >
3817 :eval Getlist()->Filter()->append('$')
3818
3819< The expression is supposed to have a side effect,
3820 since the resulting value is not used. In the example
3821 the `append()` call appends the List with text to the
3822 buffer. This is similar to `:call` but works with any
3823 expression.
Bram Moolenaara2baa732022-02-04 16:09:54 +00003824 In |Vim9| script an expression without an effect will
3825 result in error *E1207* . This should help noticing
3826 mistakes.
Bram Moolenaar09c6f262019-11-17 15:55:14 +01003827
3828 The command can be shortened to `:ev` or `:eva`, but
3829 these are hard to recognize and therefore not to be
3830 used.
3831
Bram Moolenaarbc93ceb2020-02-26 13:36:21 +01003832 The command cannot be followed by "|" and another
3833 command, since "|" is seen as part of the expression.
3834
Bram Moolenaar09c6f262019-11-17 15:55:14 +01003835
Bram Moolenaar071d4272004-06-13 20:20:40 +00003836 *:exe* *:execute*
3837:exe[cute] {expr1} .. Executes the string that results from the evaluation
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003838 of {expr1} as an Ex command.
3839 Multiple arguments are concatenated, with a space in
Bram Moolenaar7e6a5152021-01-02 16:39:53 +01003840 between. To avoid the extra space use the ".."
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003841 operator to concatenate strings into one argument.
3842 {expr1} is used as the processed command, command line
3843 editing keys are not recognized.
Bram Moolenaar071d4272004-06-13 20:20:40 +00003844 Cannot be followed by a comment.
3845 Examples: >
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003846 :execute "buffer" nextbuf
Bram Moolenaarc8cdf0f2021-03-13 13:28:13 +01003847 :execute "normal" count .. "w"
Bram Moolenaar071d4272004-06-13 20:20:40 +00003848<
3849 ":execute" can be used to append a command to commands
3850 that don't accept a '|'. Example: >
3851 :execute '!ls' | echo "theend"
3852
3853< ":execute" is also a nice way to avoid having to type
3854 control characters in a Vim script for a ":normal"
3855 command: >
3856 :execute "normal ixxx\<Esc>"
3857< This has an <Esc> character, see |expr-string|.
3858
Bram Moolenaar446cb832008-06-24 21:56:24 +00003859 Be careful to correctly escape special characters in
3860 file names. The |fnameescape()| function can be used
Bram Moolenaar05bb9532008-07-04 09:44:11 +00003861 for Vim commands, |shellescape()| for |:!| commands.
3862 Examples: >
Bram Moolenaarc8cdf0f2021-03-13 13:28:13 +01003863 :execute "e " .. fnameescape(filename)
3864 :execute "!ls " .. shellescape(filename, 1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00003865<
Bram Moolenaar071d4272004-06-13 20:20:40 +00003866 Note: The executed string may be any command-line, but
Bram Moolenaar76f3b1a2014-03-27 22:30:07 +01003867 starting or ending "if", "while" and "for" does not
3868 always work, because when commands are skipped the
3869 ":execute" is not evaluated and Vim loses track of
3870 where blocks start and end. Also "break" and
3871 "continue" should not be inside ":execute".
3872 This example does not work, because the ":execute" is
3873 not evaluated and Vim does not see the "while", and
3874 gives an error for finding an ":endwhile": >
3875 :if 0
3876 : execute 'while i > 5'
3877 : echo "test"
3878 : endwhile
3879 :endif
Bram Moolenaar071d4272004-06-13 20:20:40 +00003880<
3881 It is allowed to have a "while" or "if" command
3882 completely in the executed string: >
3883 :execute 'while i < 5 | echo i | let i = i + 1 | endwhile'
3884<
3885
Bram Moolenaar8f3f58f2010-01-06 20:52:26 +01003886 *:exe-comment*
Bram Moolenaar071d4272004-06-13 20:20:40 +00003887 ":execute", ":echo" and ":echon" cannot be followed by
3888 a comment directly, because they see the '"' as the
3889 start of a string. But, you can use '|' followed by a
3890 comment. Example: >
3891 :echo "foo" | "this is a comment
3892
3893==============================================================================
38948. Exception handling *exception-handling*
3895
3896The Vim script language comprises an exception handling feature. This section
3897explains how it can be used in a Vim script.
3898
3899Exceptions may be raised by Vim on an error or on interrupt, see
3900|catch-errors| and |catch-interrupt|. You can also explicitly throw an
3901exception by using the ":throw" command, see |throw-catch|.
3902
3903
3904TRY CONDITIONALS *try-conditionals*
3905
3906Exceptions can be caught or can cause cleanup code to be executed. You can
3907use a try conditional to specify catch clauses (that catch exceptions) and/or
3908a finally clause (to be executed for cleanup).
3909 A try conditional begins with a |:try| command and ends at the matching
3910|:endtry| command. In between, you can use a |:catch| command to start
3911a catch clause, or a |:finally| command to start a finally clause. There may
3912be none or multiple catch clauses, but there is at most one finally clause,
3913which must not be followed by any catch clauses. The lines before the catch
3914clauses and the finally clause is called a try block. >
3915
3916 :try
Bram Moolenaar446cb832008-06-24 21:56:24 +00003917 : ...
3918 : ... TRY BLOCK
3919 : ...
Bram Moolenaar071d4272004-06-13 20:20:40 +00003920 :catch /{pattern}/
Bram Moolenaar446cb832008-06-24 21:56:24 +00003921 : ...
3922 : ... CATCH CLAUSE
3923 : ...
Bram Moolenaar071d4272004-06-13 20:20:40 +00003924 :catch /{pattern}/
Bram Moolenaar446cb832008-06-24 21:56:24 +00003925 : ...
3926 : ... CATCH CLAUSE
3927 : ...
Bram Moolenaar071d4272004-06-13 20:20:40 +00003928 :finally
Bram Moolenaar446cb832008-06-24 21:56:24 +00003929 : ...
3930 : ... FINALLY CLAUSE
3931 : ...
Bram Moolenaar071d4272004-06-13 20:20:40 +00003932 :endtry
3933
3934The try conditional allows to watch code for exceptions and to take the
3935appropriate actions. Exceptions from the try block may be caught. Exceptions
3936from the try block and also the catch clauses may cause cleanup actions.
3937 When no exception is thrown during execution of the try block, the control
3938is transferred to the finally clause, if present. After its execution, the
3939script continues with the line following the ":endtry".
3940 When an exception occurs during execution of the try block, the remaining
3941lines in the try block are skipped. The exception is matched against the
3942patterns specified as arguments to the ":catch" commands. The catch clause
3943after the first matching ":catch" is taken, other catch clauses are not
3944executed. The catch clause ends when the next ":catch", ":finally", or
3945":endtry" command is reached - whatever is first. Then, the finally clause
3946(if present) is executed. When the ":endtry" is reached, the script execution
3947continues in the following line as usual.
3948 When an exception that does not match any of the patterns specified by the
3949":catch" commands is thrown in the try block, the exception is not caught by
3950that try conditional and none of the catch clauses is executed. Only the
3951finally clause, if present, is taken. The exception pends during execution of
3952the finally clause. It is resumed at the ":endtry", so that commands after
3953the ":endtry" are not executed and the exception might be caught elsewhere,
3954see |try-nesting|.
3955 When during execution of a catch clause another exception is thrown, the
Bram Moolenaar58b85342016-08-14 19:54:54 +02003956remaining lines in that catch clause are not executed. The new exception is
Bram Moolenaar071d4272004-06-13 20:20:40 +00003957not matched against the patterns in any of the ":catch" commands of the same
3958try conditional and none of its catch clauses is taken. If there is, however,
3959a finally clause, it is executed, and the exception pends during its
3960execution. The commands following the ":endtry" are not executed. The new
3961exception might, however, be caught elsewhere, see |try-nesting|.
3962 When during execution of the finally clause (if present) an exception is
Bram Moolenaar58b85342016-08-14 19:54:54 +02003963thrown, the remaining lines in the finally clause are skipped. If the finally
Bram Moolenaar071d4272004-06-13 20:20:40 +00003964clause has been taken because of an exception from the try block or one of the
3965catch clauses, the original (pending) exception is discarded. The commands
3966following the ":endtry" are not executed, and the exception from the finally
3967clause is propagated and can be caught elsewhere, see |try-nesting|.
3968
3969The finally clause is also executed, when a ":break" or ":continue" for
3970a ":while" loop enclosing the complete try conditional is executed from the
3971try block or a catch clause. Or when a ":return" or ":finish" is executed
3972from the try block or a catch clause of a try conditional in a function or
3973sourced script, respectively. The ":break", ":continue", ":return", or
3974":finish" pends during execution of the finally clause and is resumed when the
3975":endtry" is reached. It is, however, discarded when an exception is thrown
3976from the finally clause.
3977 When a ":break" or ":continue" for a ":while" loop enclosing the complete
3978try conditional or when a ":return" or ":finish" is encountered in the finally
3979clause, the rest of the finally clause is skipped, and the ":break",
3980":continue", ":return" or ":finish" is executed as usual. If the finally
3981clause has been taken because of an exception or an earlier ":break",
3982":continue", ":return", or ":finish" from the try block or a catch clause,
3983this pending exception or command is discarded.
3984
3985For examples see |throw-catch| and |try-finally|.
3986
3987
3988NESTING OF TRY CONDITIONALS *try-nesting*
3989
3990Try conditionals can be nested arbitrarily. That is, a complete try
3991conditional can be put into the try block, a catch clause, or the finally
3992clause of another try conditional. If the inner try conditional does not
3993catch an exception thrown in its try block or throws a new exception from one
3994of its catch clauses or its finally clause, the outer try conditional is
3995checked according to the rules above. If the inner try conditional is in the
3996try block of the outer try conditional, its catch clauses are checked, but
Bram Moolenaar58b85342016-08-14 19:54:54 +02003997otherwise only the finally clause is executed. It does not matter for
Bram Moolenaar071d4272004-06-13 20:20:40 +00003998nesting, whether the inner try conditional is directly contained in the outer
3999one, or whether the outer one sources a script or calls a function containing
4000the inner try conditional.
4001
4002When none of the active try conditionals catches an exception, just their
4003finally clauses are executed. Thereafter, the script processing terminates.
4004An error message is displayed in case of an uncaught exception explicitly
4005thrown by a ":throw" command. For uncaught error and interrupt exceptions
4006implicitly raised by Vim, the error message(s) or interrupt message are shown
4007as usual.
4008
4009For examples see |throw-catch|.
4010
4011
4012EXAMINING EXCEPTION HANDLING CODE *except-examine*
4013
4014Exception handling code can get tricky. If you are in doubt what happens, set
4015'verbose' to 13 or use the ":13verbose" command modifier when sourcing your
4016script file. Then you see when an exception is thrown, discarded, caught, or
4017finished. When using a verbosity level of at least 14, things pending in
4018a finally clause are also shown. This information is also given in debug mode
4019(see |debug-scripts|).
4020
4021
4022THROWING AND CATCHING EXCEPTIONS *throw-catch*
4023
4024You can throw any number or string as an exception. Use the |:throw| command
4025and pass the value to be thrown as argument: >
4026 :throw 4711
4027 :throw "string"
4028< *throw-expression*
4029You can also specify an expression argument. The expression is then evaluated
4030first, and the result is thrown: >
4031 :throw 4705 + strlen("string")
4032 :throw strpart("strings", 0, 6)
4033
4034An exception might be thrown during evaluation of the argument of the ":throw"
4035command. Unless it is caught there, the expression evaluation is abandoned.
4036The ":throw" command then does not throw a new exception.
4037 Example: >
4038
4039 :function! Foo(arg)
4040 : try
4041 : throw a:arg
4042 : catch /foo/
4043 : endtry
4044 : return 1
4045 :endfunction
4046 :
4047 :function! Bar()
4048 : echo "in Bar"
4049 : return 4710
4050 :endfunction
4051 :
4052 :throw Foo("arrgh") + Bar()
4053
4054This throws "arrgh", and "in Bar" is not displayed since Bar() is not
4055executed. >
4056 :throw Foo("foo") + Bar()
4057however displays "in Bar" and throws 4711.
4058
4059Any other command that takes an expression as argument might also be
Bram Moolenaar58b85342016-08-14 19:54:54 +02004060abandoned by an (uncaught) exception during the expression evaluation. The
Bram Moolenaar071d4272004-06-13 20:20:40 +00004061exception is then propagated to the caller of the command.
4062 Example: >
4063
4064 :if Foo("arrgh")
4065 : echo "then"
4066 :else
4067 : echo "else"
4068 :endif
4069
4070Here neither of "then" or "else" is displayed.
4071
4072 *catch-order*
4073Exceptions can be caught by a try conditional with one or more |:catch|
4074commands, see |try-conditionals|. The values to be caught by each ":catch"
4075command can be specified as a pattern argument. The subsequent catch clause
4076gets executed when a matching exception is caught.
4077 Example: >
4078
4079 :function! Foo(value)
4080 : try
4081 : throw a:value
4082 : catch /^\d\+$/
4083 : echo "Number thrown"
4084 : catch /.*/
4085 : echo "String thrown"
4086 : endtry
4087 :endfunction
4088 :
4089 :call Foo(0x1267)
4090 :call Foo('string')
4091
4092The first call to Foo() displays "Number thrown", the second "String thrown".
4093An exception is matched against the ":catch" commands in the order they are
4094specified. Only the first match counts. So you should place the more
4095specific ":catch" first. The following order does not make sense: >
4096
4097 : catch /.*/
4098 : echo "String thrown"
4099 : catch /^\d\+$/
4100 : echo "Number thrown"
4101
4102The first ":catch" here matches always, so that the second catch clause is
4103never taken.
4104
4105 *throw-variables*
4106If you catch an exception by a general pattern, you may access the exact value
4107in the variable |v:exception|: >
4108
4109 : catch /^\d\+$/
4110 : echo "Number thrown. Value is" v:exception
4111
4112You may also be interested where an exception was thrown. This is stored in
4113|v:throwpoint|. Note that "v:exception" and "v:throwpoint" are valid for the
4114exception most recently caught as long it is not finished.
4115 Example: >
4116
4117 :function! Caught()
4118 : if v:exception != ""
Bram Moolenaarc51cf032022-02-26 12:25:45 +00004119 : echo 'Caught "' . v:exception .. '" in ' .. v:throwpoint
Bram Moolenaar071d4272004-06-13 20:20:40 +00004120 : else
4121 : echo 'Nothing caught'
4122 : endif
4123 :endfunction
4124 :
4125 :function! Foo()
4126 : try
4127 : try
4128 : try
4129 : throw 4711
4130 : finally
4131 : call Caught()
4132 : endtry
4133 : catch /.*/
4134 : call Caught()
4135 : throw "oops"
4136 : endtry
4137 : catch /.*/
4138 : call Caught()
4139 : finally
4140 : call Caught()
4141 : endtry
4142 :endfunction
4143 :
4144 :call Foo()
4145
4146This displays >
4147
4148 Nothing caught
4149 Caught "4711" in function Foo, line 4
4150 Caught "oops" in function Foo, line 10
4151 Nothing caught
4152
4153A practical example: The following command ":LineNumber" displays the line
4154number in the script or function where it has been used: >
4155
4156 :function! LineNumber()
4157 : return substitute(v:throwpoint, '.*\D\(\d\+\).*', '\1', "")
4158 :endfunction
4159 :command! LineNumber try | throw "" | catch | echo LineNumber() | endtry
4160<
4161 *try-nested*
4162An exception that is not caught by a try conditional can be caught by
4163a surrounding try conditional: >
4164
4165 :try
4166 : try
4167 : throw "foo"
4168 : catch /foobar/
4169 : echo "foobar"
4170 : finally
4171 : echo "inner finally"
4172 : endtry
4173 :catch /foo/
4174 : echo "foo"
4175 :endtry
4176
4177The inner try conditional does not catch the exception, just its finally
4178clause is executed. The exception is then caught by the outer try
4179conditional. The example displays "inner finally" and then "foo".
4180
4181 *throw-from-catch*
4182You can catch an exception and throw a new one to be caught elsewhere from the
4183catch clause: >
4184
4185 :function! Foo()
4186 : throw "foo"
4187 :endfunction
4188 :
4189 :function! Bar()
4190 : try
4191 : call Foo()
4192 : catch /foo/
4193 : echo "Caught foo, throw bar"
4194 : throw "bar"
4195 : endtry
4196 :endfunction
4197 :
4198 :try
4199 : call Bar()
4200 :catch /.*/
4201 : echo "Caught" v:exception
4202 :endtry
4203
4204This displays "Caught foo, throw bar" and then "Caught bar".
4205
4206 *rethrow*
4207There is no real rethrow in the Vim script language, but you may throw
4208"v:exception" instead: >
4209
4210 :function! Bar()
4211 : try
4212 : call Foo()
4213 : catch /.*/
4214 : echo "Rethrow" v:exception
4215 : throw v:exception
4216 : endtry
4217 :endfunction
4218< *try-echoerr*
4219Note that this method cannot be used to "rethrow" Vim error or interrupt
4220exceptions, because it is not possible to fake Vim internal exceptions.
4221Trying so causes an error exception. You should throw your own exception
4222denoting the situation. If you want to cause a Vim error exception containing
4223the original error exception value, you can use the |:echoerr| command: >
4224
4225 :try
4226 : try
4227 : asdf
4228 : catch /.*/
4229 : echoerr v:exception
4230 : endtry
4231 :catch /.*/
4232 : echo v:exception
4233 :endtry
4234
4235This code displays
4236
Bram Moolenaar446cb832008-06-24 21:56:24 +00004237 Vim(echoerr):Vim:E492: Not an editor command: asdf ~
Bram Moolenaar071d4272004-06-13 20:20:40 +00004238
4239
4240CLEANUP CODE *try-finally*
4241
4242Scripts often change global settings and restore them at their end. If the
4243user however interrupts the script by pressing CTRL-C, the settings remain in
Bram Moolenaar58b85342016-08-14 19:54:54 +02004244an inconsistent state. The same may happen to you in the development phase of
Bram Moolenaar071d4272004-06-13 20:20:40 +00004245a script when an error occurs or you explicitly throw an exception without
4246catching it. You can solve these problems by using a try conditional with
4247a finally clause for restoring the settings. Its execution is guaranteed on
4248normal control flow, on error, on an explicit ":throw", and on interrupt.
4249(Note that errors and interrupts from inside the try conditional are converted
Bram Moolenaar58b85342016-08-14 19:54:54 +02004250to exceptions. When not caught, they terminate the script after the finally
Bram Moolenaar071d4272004-06-13 20:20:40 +00004251clause has been executed.)
4252Example: >
4253
4254 :try
4255 : let s:saved_ts = &ts
4256 : set ts=17
4257 :
4258 : " Do the hard work here.
4259 :
4260 :finally
4261 : let &ts = s:saved_ts
4262 : unlet s:saved_ts
4263 :endtry
4264
4265This method should be used locally whenever a function or part of a script
4266changes global settings which need to be restored on failure or normal exit of
4267that function or script part.
4268
4269 *break-finally*
4270Cleanup code works also when the try block or a catch clause is left by
4271a ":continue", ":break", ":return", or ":finish".
4272 Example: >
4273
4274 :let first = 1
4275 :while 1
4276 : try
4277 : if first
4278 : echo "first"
4279 : let first = 0
4280 : continue
4281 : else
4282 : throw "second"
4283 : endif
4284 : catch /.*/
4285 : echo v:exception
4286 : break
4287 : finally
4288 : echo "cleanup"
4289 : endtry
4290 : echo "still in while"
4291 :endwhile
4292 :echo "end"
4293
4294This displays "first", "cleanup", "second", "cleanup", and "end". >
4295
4296 :function! Foo()
4297 : try
4298 : return 4711
4299 : finally
4300 : echo "cleanup\n"
4301 : endtry
4302 : echo "Foo still active"
4303 :endfunction
4304 :
4305 :echo Foo() "returned by Foo"
4306
4307This displays "cleanup" and "4711 returned by Foo". You don't need to add an
Bram Moolenaar58b85342016-08-14 19:54:54 +02004308extra ":return" in the finally clause. (Above all, this would override the
Bram Moolenaar071d4272004-06-13 20:20:40 +00004309return value.)
4310
4311 *except-from-finally*
4312Using either of ":continue", ":break", ":return", ":finish", or ":throw" in
4313a finally clause is possible, but not recommended since it abandons the
4314cleanup actions for the try conditional. But, of course, interrupt and error
4315exceptions might get raised from a finally clause.
4316 Example where an error in the finally clause stops an interrupt from
4317working correctly: >
4318
4319 :try
4320 : try
4321 : echo "Press CTRL-C for interrupt"
4322 : while 1
4323 : endwhile
4324 : finally
4325 : unlet novar
4326 : endtry
4327 :catch /novar/
4328 :endtry
4329 :echo "Script still running"
4330 :sleep 1
4331
4332If you need to put commands that could fail into a finally clause, you should
4333think about catching or ignoring the errors in these commands, see
4334|catch-errors| and |ignore-errors|.
4335
4336
4337CATCHING ERRORS *catch-errors*
4338
4339If you want to catch specific errors, you just have to put the code to be
4340watched in a try block and add a catch clause for the error message. The
4341presence of the try conditional causes all errors to be converted to an
4342exception. No message is displayed and |v:errmsg| is not set then. To find
4343the right pattern for the ":catch" command, you have to know how the format of
4344the error exception is.
4345 Error exceptions have the following format: >
4346
4347 Vim({cmdname}):{errmsg}
4348or >
4349 Vim:{errmsg}
4350
4351{cmdname} is the name of the command that failed; the second form is used when
Bram Moolenaar58b85342016-08-14 19:54:54 +02004352the command name is not known. {errmsg} is the error message usually produced
Bram Moolenaar071d4272004-06-13 20:20:40 +00004353when the error occurs outside try conditionals. It always begins with
4354a capital "E", followed by a two or three-digit error number, a colon, and
4355a space.
4356
4357Examples:
4358
4359The command >
4360 :unlet novar
4361normally produces the error message >
4362 E108: No such variable: "novar"
4363which is converted inside try conditionals to an exception >
4364 Vim(unlet):E108: No such variable: "novar"
4365
4366The command >
4367 :dwim
4368normally produces the error message >
4369 E492: Not an editor command: dwim
4370which is converted inside try conditionals to an exception >
4371 Vim:E492: Not an editor command: dwim
4372
4373You can catch all ":unlet" errors by a >
4374 :catch /^Vim(unlet):/
4375or all errors for misspelled command names by a >
4376 :catch /^Vim:E492:/
4377
4378Some error messages may be produced by different commands: >
4379 :function nofunc
4380and >
4381 :delfunction nofunc
4382both produce the error message >
4383 E128: Function name must start with a capital: nofunc
4384which is converted inside try conditionals to an exception >
4385 Vim(function):E128: Function name must start with a capital: nofunc
4386or >
4387 Vim(delfunction):E128: Function name must start with a capital: nofunc
4388respectively. You can catch the error by its number independently on the
4389command that caused it if you use the following pattern: >
4390 :catch /^Vim(\a\+):E128:/
4391
4392Some commands like >
4393 :let x = novar
4394produce multiple error messages, here: >
4395 E121: Undefined variable: novar
4396 E15: Invalid expression: novar
4397Only the first is used for the exception value, since it is the most specific
4398one (see |except-several-errors|). So you can catch it by >
4399 :catch /^Vim(\a\+):E121:/
4400
4401You can catch all errors related to the name "nofunc" by >
4402 :catch /\<nofunc\>/
4403
4404You can catch all Vim errors in the ":write" and ":read" commands by >
4405 :catch /^Vim(\(write\|read\)):E\d\+:/
4406
4407You can catch all Vim errors by the pattern >
4408 :catch /^Vim\((\a\+)\)\=:E\d\+:/
4409<
4410 *catch-text*
4411NOTE: You should never catch the error message text itself: >
4412 :catch /No such variable/
Bram Moolenaar2b8388b2015-02-28 13:11:45 +01004413only works in the English locale, but not when the user has selected
Bram Moolenaar071d4272004-06-13 20:20:40 +00004414a different language by the |:language| command. It is however helpful to
4415cite the message text in a comment: >
4416 :catch /^Vim(\a\+):E108:/ " No such variable
4417
4418
4419IGNORING ERRORS *ignore-errors*
4420
4421You can ignore errors in a specific Vim command by catching them locally: >
4422
4423 :try
4424 : write
4425 :catch
4426 :endtry
4427
4428But you are strongly recommended NOT to use this simple form, since it could
4429catch more than you want. With the ":write" command, some autocommands could
4430be executed and cause errors not related to writing, for instance: >
4431
4432 :au BufWritePre * unlet novar
4433
4434There could even be such errors you are not responsible for as a script
4435writer: a user of your script might have defined such autocommands. You would
4436then hide the error from the user.
4437 It is much better to use >
4438
4439 :try
4440 : write
4441 :catch /^Vim(write):/
4442 :endtry
4443
4444which only catches real write errors. So catch only what you'd like to ignore
4445intentionally.
4446
4447For a single command that does not cause execution of autocommands, you could
4448even suppress the conversion of errors to exceptions by the ":silent!"
4449command: >
4450 :silent! nunmap k
4451This works also when a try conditional is active.
4452
4453
4454CATCHING INTERRUPTS *catch-interrupt*
4455
4456When there are active try conditionals, an interrupt (CTRL-C) is converted to
Bram Moolenaar58b85342016-08-14 19:54:54 +02004457the exception "Vim:Interrupt". You can catch it like every exception. The
Bram Moolenaar071d4272004-06-13 20:20:40 +00004458script is not terminated, then.
4459 Example: >
4460
4461 :function! TASK1()
4462 : sleep 10
4463 :endfunction
4464
4465 :function! TASK2()
4466 : sleep 20
4467 :endfunction
4468
4469 :while 1
4470 : let command = input("Type a command: ")
4471 : try
4472 : if command == ""
4473 : continue
4474 : elseif command == "END"
4475 : break
4476 : elseif command == "TASK1"
4477 : call TASK1()
4478 : elseif command == "TASK2"
4479 : call TASK2()
4480 : else
4481 : echo "\nIllegal command:" command
4482 : continue
4483 : endif
4484 : catch /^Vim:Interrupt$/
4485 : echo "\nCommand interrupted"
4486 : " Caught the interrupt. Continue with next prompt.
4487 : endtry
4488 :endwhile
4489
4490You can interrupt a task here by pressing CTRL-C; the script then asks for
Bram Moolenaar58b85342016-08-14 19:54:54 +02004491a new command. If you press CTRL-C at the prompt, the script is terminated.
Bram Moolenaar071d4272004-06-13 20:20:40 +00004492
4493For testing what happens when CTRL-C would be pressed on a specific line in
4494your script, use the debug mode and execute the |>quit| or |>interrupt|
4495command on that line. See |debug-scripts|.
4496
4497
4498CATCHING ALL *catch-all*
4499
4500The commands >
4501
4502 :catch /.*/
4503 :catch //
4504 :catch
4505
4506catch everything, error exceptions, interrupt exceptions and exceptions
4507explicitly thrown by the |:throw| command. This is useful at the top level of
4508a script in order to catch unexpected things.
4509 Example: >
4510
4511 :try
4512 :
4513 : " do the hard work here
4514 :
4515 :catch /MyException/
4516 :
4517 : " handle known problem
4518 :
4519 :catch /^Vim:Interrupt$/
4520 : echo "Script interrupted"
4521 :catch /.*/
Bram Moolenaarc51cf032022-02-26 12:25:45 +00004522 : echo "Internal error (" .. v:exception .. ")"
4523 : echo " - occurred at " .. v:throwpoint
Bram Moolenaar071d4272004-06-13 20:20:40 +00004524 :endtry
4525 :" end of script
4526
4527Note: Catching all might catch more things than you want. Thus, you are
4528strongly encouraged to catch only for problems that you can really handle by
4529specifying a pattern argument to the ":catch".
4530 Example: Catching all could make it nearly impossible to interrupt a script
4531by pressing CTRL-C: >
4532
4533 :while 1
4534 : try
4535 : sleep 1
4536 : catch
4537 : endtry
4538 :endwhile
4539
4540
4541EXCEPTIONS AND AUTOCOMMANDS *except-autocmd*
4542
4543Exceptions may be used during execution of autocommands. Example: >
4544
4545 :autocmd User x try
4546 :autocmd User x throw "Oops!"
4547 :autocmd User x catch
4548 :autocmd User x echo v:exception
4549 :autocmd User x endtry
4550 :autocmd User x throw "Arrgh!"
4551 :autocmd User x echo "Should not be displayed"
4552 :
4553 :try
4554 : doautocmd User x
4555 :catch
4556 : echo v:exception
4557 :endtry
4558
4559This displays "Oops!" and "Arrgh!".
4560
4561 *except-autocmd-Pre*
4562For some commands, autocommands get executed before the main action of the
4563command takes place. If an exception is thrown and not caught in the sequence
4564of autocommands, the sequence and the command that caused its execution are
4565abandoned and the exception is propagated to the caller of the command.
4566 Example: >
4567
4568 :autocmd BufWritePre * throw "FAIL"
4569 :autocmd BufWritePre * echo "Should not be displayed"
4570 :
4571 :try
4572 : write
4573 :catch
4574 : echo "Caught:" v:exception "from" v:throwpoint
4575 :endtry
4576
4577Here, the ":write" command does not write the file currently being edited (as
4578you can see by checking 'modified'), since the exception from the BufWritePre
4579autocommand abandons the ":write". The exception is then caught and the
4580script displays: >
4581
4582 Caught: FAIL from BufWrite Auto commands for "*"
4583<
4584 *except-autocmd-Post*
4585For some commands, autocommands get executed after the main action of the
4586command has taken place. If this main action fails and the command is inside
4587an active try conditional, the autocommands are skipped and an error exception
4588is thrown that can be caught by the caller of the command.
4589 Example: >
4590
4591 :autocmd BufWritePost * echo "File successfully written!"
4592 :
4593 :try
4594 : write /i/m/p/o/s/s/i/b/l/e
4595 :catch
4596 : echo v:exception
4597 :endtry
4598
4599This just displays: >
4600
4601 Vim(write):E212: Can't open file for writing (/i/m/p/o/s/s/i/b/l/e)
4602
4603If you really need to execute the autocommands even when the main action
4604fails, trigger the event from the catch clause.
4605 Example: >
4606
4607 :autocmd BufWritePre * set noreadonly
4608 :autocmd BufWritePost * set readonly
4609 :
4610 :try
4611 : write /i/m/p/o/s/s/i/b/l/e
4612 :catch
4613 : doautocmd BufWritePost /i/m/p/o/s/s/i/b/l/e
4614 :endtry
4615<
4616You can also use ":silent!": >
4617
4618 :let x = "ok"
4619 :let v:errmsg = ""
4620 :autocmd BufWritePost * if v:errmsg != ""
4621 :autocmd BufWritePost * let x = "after fail"
4622 :autocmd BufWritePost * endif
4623 :try
4624 : silent! write /i/m/p/o/s/s/i/b/l/e
4625 :catch
4626 :endtry
4627 :echo x
4628
4629This displays "after fail".
4630
4631If the main action of the command does not fail, exceptions from the
4632autocommands will be catchable by the caller of the command: >
4633
4634 :autocmd BufWritePost * throw ":-("
4635 :autocmd BufWritePost * echo "Should not be displayed"
4636 :
4637 :try
4638 : write
4639 :catch
4640 : echo v:exception
4641 :endtry
4642<
4643 *except-autocmd-Cmd*
4644For some commands, the normal action can be replaced by a sequence of
4645autocommands. Exceptions from that sequence will be catchable by the caller
4646of the command.
4647 Example: For the ":write" command, the caller cannot know whether the file
Bram Moolenaar58b85342016-08-14 19:54:54 +02004648had actually been written when the exception occurred. You need to tell it in
Bram Moolenaar071d4272004-06-13 20:20:40 +00004649some way. >
4650
4651 :if !exists("cnt")
4652 : let cnt = 0
4653 :
4654 : autocmd BufWriteCmd * if &modified
4655 : autocmd BufWriteCmd * let cnt = cnt + 1
4656 : autocmd BufWriteCmd * if cnt % 3 == 2
4657 : autocmd BufWriteCmd * throw "BufWriteCmdError"
4658 : autocmd BufWriteCmd * endif
4659 : autocmd BufWriteCmd * write | set nomodified
4660 : autocmd BufWriteCmd * if cnt % 3 == 0
4661 : autocmd BufWriteCmd * throw "BufWriteCmdError"
4662 : autocmd BufWriteCmd * endif
4663 : autocmd BufWriteCmd * echo "File successfully written!"
4664 : autocmd BufWriteCmd * endif
4665 :endif
4666 :
4667 :try
4668 : write
4669 :catch /^BufWriteCmdError$/
4670 : if &modified
4671 : echo "Error on writing (file contents not changed)"
4672 : else
4673 : echo "Error after writing"
4674 : endif
4675 :catch /^Vim(write):/
4676 : echo "Error on writing"
4677 :endtry
4678
4679When this script is sourced several times after making changes, it displays
4680first >
4681 File successfully written!
4682then >
4683 Error on writing (file contents not changed)
4684then >
4685 Error after writing
4686etc.
4687
4688 *except-autocmd-ill*
4689You cannot spread a try conditional over autocommands for different events.
4690The following code is ill-formed: >
4691
4692 :autocmd BufWritePre * try
4693 :
4694 :autocmd BufWritePost * catch
4695 :autocmd BufWritePost * echo v:exception
4696 :autocmd BufWritePost * endtry
4697 :
4698 :write
4699
4700
4701EXCEPTION HIERARCHIES AND PARAMETERIZED EXCEPTIONS *except-hier-param*
4702
4703Some programming languages allow to use hierarchies of exception classes or to
4704pass additional information with the object of an exception class. You can do
4705similar things in Vim.
4706 In order to throw an exception from a hierarchy, just throw the complete
4707class name with the components separated by a colon, for instance throw the
4708string "EXCEPT:MATHERR:OVERFLOW" for an overflow in a mathematical library.
4709 When you want to pass additional information with your exception class, add
4710it in parentheses, for instance throw the string "EXCEPT:IO:WRITEERR(myfile)"
4711for an error when writing "myfile".
4712 With the appropriate patterns in the ":catch" command, you can catch for
4713base classes or derived classes of your hierarchy. Additional information in
4714parentheses can be cut out from |v:exception| with the ":substitute" command.
4715 Example: >
4716
4717 :function! CheckRange(a, func)
4718 : if a:a < 0
Bram Moolenaarc51cf032022-02-26 12:25:45 +00004719 : throw "EXCEPT:MATHERR:RANGE(" .. a:func .. ")"
Bram Moolenaar071d4272004-06-13 20:20:40 +00004720 : endif
4721 :endfunction
4722 :
4723 :function! Add(a, b)
4724 : call CheckRange(a:a, "Add")
4725 : call CheckRange(a:b, "Add")
4726 : let c = a:a + a:b
4727 : if c < 0
4728 : throw "EXCEPT:MATHERR:OVERFLOW"
4729 : endif
4730 : return c
4731 :endfunction
4732 :
4733 :function! Div(a, b)
4734 : call CheckRange(a:a, "Div")
4735 : call CheckRange(a:b, "Div")
4736 : if (a:b == 0)
4737 : throw "EXCEPT:MATHERR:ZERODIV"
4738 : endif
4739 : return a:a / a:b
4740 :endfunction
4741 :
4742 :function! Write(file)
4743 : try
Bram Moolenaar446cb832008-06-24 21:56:24 +00004744 : execute "write" fnameescape(a:file)
Bram Moolenaar071d4272004-06-13 20:20:40 +00004745 : catch /^Vim(write):/
Bram Moolenaarc51cf032022-02-26 12:25:45 +00004746 : throw "EXCEPT:IO(" .. getcwd() .. ", " .. a:file .. "):WRITEERR"
Bram Moolenaar071d4272004-06-13 20:20:40 +00004747 : endtry
4748 :endfunction
4749 :
4750 :try
4751 :
Bram Moolenaar75ab5902022-04-18 15:36:40 +01004752 : " something with arithmetic and I/O
Bram Moolenaar071d4272004-06-13 20:20:40 +00004753 :
4754 :catch /^EXCEPT:MATHERR:RANGE/
4755 : let function = substitute(v:exception, '.*(\(\a\+\)).*', '\1', "")
4756 : echo "Range error in" function
4757 :
4758 :catch /^EXCEPT:MATHERR/ " catches OVERFLOW and ZERODIV
4759 : echo "Math error"
4760 :
4761 :catch /^EXCEPT:IO/
4762 : let dir = substitute(v:exception, '.*(\(.\+\),\s*.\+).*', '\1', "")
4763 : let file = substitute(v:exception, '.*(.\+,\s*\(.\+\)).*', '\1', "")
4764 : if file !~ '^/'
Bram Moolenaarc51cf032022-02-26 12:25:45 +00004765 : let file = dir .. "/" .. file
Bram Moolenaar071d4272004-06-13 20:20:40 +00004766 : endif
Bram Moolenaarc51cf032022-02-26 12:25:45 +00004767 : echo 'I/O error for "' .. file .. '"'
Bram Moolenaar071d4272004-06-13 20:20:40 +00004768 :
4769 :catch /^EXCEPT/
4770 : echo "Unspecified error"
4771 :
4772 :endtry
4773
4774The exceptions raised by Vim itself (on error or when pressing CTRL-C) use
4775a flat hierarchy: they are all in the "Vim" class. You cannot throw yourself
4776exceptions with the "Vim" prefix; they are reserved for Vim.
4777 Vim error exceptions are parameterized with the name of the command that
4778failed, if known. See |catch-errors|.
4779
4780
4781PECULIARITIES
4782 *except-compat*
4783The exception handling concept requires that the command sequence causing the
4784exception is aborted immediately and control is transferred to finally clauses
4785and/or a catch clause.
4786
4787In the Vim script language there are cases where scripts and functions
4788continue after an error: in functions without the "abort" flag or in a command
4789after ":silent!", control flow goes to the following line, and outside
4790functions, control flow goes to the line following the outermost ":endwhile"
4791or ":endif". On the other hand, errors should be catchable as exceptions
4792(thus, requiring the immediate abortion).
4793
4794This problem has been solved by converting errors to exceptions and using
4795immediate abortion (if not suppressed by ":silent!") only when a try
Bram Moolenaar58b85342016-08-14 19:54:54 +02004796conditional is active. This is no restriction since an (error) exception can
4797be caught only from an active try conditional. If you want an immediate
Bram Moolenaar071d4272004-06-13 20:20:40 +00004798termination without catching the error, just use a try conditional without
4799catch clause. (You can cause cleanup code being executed before termination
4800by specifying a finally clause.)
4801
4802When no try conditional is active, the usual abortion and continuation
4803behavior is used instead of immediate abortion. This ensures compatibility of
4804scripts written for Vim 6.1 and earlier.
4805
4806However, when sourcing an existing script that does not use exception handling
4807commands (or when calling one of its functions) from inside an active try
4808conditional of a new script, you might change the control flow of the existing
4809script on error. You get the immediate abortion on error and can catch the
4810error in the new script. If however the sourced script suppresses error
4811messages by using the ":silent!" command (checking for errors by testing
Bram Moolenaar58b85342016-08-14 19:54:54 +02004812|v:errmsg| if appropriate), its execution path is not changed. The error is
4813not converted to an exception. (See |:silent|.) So the only remaining cause
Bram Moolenaar071d4272004-06-13 20:20:40 +00004814where this happens is for scripts that don't care about errors and produce
4815error messages. You probably won't want to use such code from your new
4816scripts.
4817
4818 *except-syntax-err*
4819Syntax errors in the exception handling commands are never caught by any of
4820the ":catch" commands of the try conditional they belong to. Its finally
4821clauses, however, is executed.
4822 Example: >
4823
4824 :try
4825 : try
4826 : throw 4711
4827 : catch /\(/
4828 : echo "in catch with syntax error"
4829 : catch
4830 : echo "inner catch-all"
4831 : finally
4832 : echo "inner finally"
4833 : endtry
4834 :catch
Bram Moolenaarc51cf032022-02-26 12:25:45 +00004835 : echo 'outer catch-all caught "' .. v:exception .. '"'
Bram Moolenaar071d4272004-06-13 20:20:40 +00004836 : finally
4837 : echo "outer finally"
4838 :endtry
4839
4840This displays: >
4841 inner finally
4842 outer catch-all caught "Vim(catch):E54: Unmatched \("
4843 outer finally
4844The original exception is discarded and an error exception is raised, instead.
4845
4846 *except-single-line*
4847The ":try", ":catch", ":finally", and ":endtry" commands can be put on
4848a single line, but then syntax errors may make it difficult to recognize the
4849"catch" line, thus you better avoid this.
4850 Example: >
4851 :try | unlet! foo # | catch | endtry
4852raises an error exception for the trailing characters after the ":unlet!"
4853argument, but does not see the ":catch" and ":endtry" commands, so that the
4854error exception is discarded and the "E488: Trailing characters" message gets
4855displayed.
4856
4857 *except-several-errors*
4858When several errors appear in a single command, the first error message is
Bram Moolenaar53f7fcc2021-07-28 20:10:16 +02004859usually the most specific one and therefore converted to the error exception.
Bram Moolenaar071d4272004-06-13 20:20:40 +00004860 Example: >
4861 echo novar
4862causes >
4863 E121: Undefined variable: novar
4864 E15: Invalid expression: novar
4865The value of the error exception inside try conditionals is: >
4866 Vim(echo):E121: Undefined variable: novar
4867< *except-syntax-error*
4868But when a syntax error is detected after a normal error in the same command,
4869the syntax error is used for the exception being thrown.
4870 Example: >
4871 unlet novar #
4872causes >
4873 E108: No such variable: "novar"
4874 E488: Trailing characters
4875The value of the error exception inside try conditionals is: >
4876 Vim(unlet):E488: Trailing characters
4877This is done because the syntax error might change the execution path in a way
4878not intended by the user. Example: >
4879 try
4880 try | unlet novar # | catch | echo v:exception | endtry
4881 catch /.*/
4882 echo "outer catch:" v:exception
4883 endtry
4884This displays "outer catch: Vim(unlet):E488: Trailing characters", and then
4885a "E600: Missing :endtry" error message is given, see |except-single-line|.
4886
4887==============================================================================
48889. Examples *eval-examples*
4889
Bram Moolenaaref2f6562007-05-06 13:32:59 +00004890Printing in Binary ~
Bram Moolenaar071d4272004-06-13 20:20:40 +00004891>
Bram Moolenaar8f3f58f2010-01-06 20:52:26 +01004892 :" The function Nr2Bin() returns the binary string representation of a number.
Bram Moolenaaref2f6562007-05-06 13:32:59 +00004893 :func Nr2Bin(nr)
Bram Moolenaar071d4272004-06-13 20:20:40 +00004894 : let n = a:nr
4895 : let r = ""
4896 : while n
Bram Moolenaarc51cf032022-02-26 12:25:45 +00004897 : let r = '01'[n % 2] .. r
Bram Moolenaaref2f6562007-05-06 13:32:59 +00004898 : let n = n / 2
Bram Moolenaar071d4272004-06-13 20:20:40 +00004899 : endwhile
4900 : return r
4901 :endfunc
4902
Bram Moolenaaref2f6562007-05-06 13:32:59 +00004903 :" The function String2Bin() converts each character in a string to a
4904 :" binary string, separated with dashes.
4905 :func String2Bin(str)
Bram Moolenaar071d4272004-06-13 20:20:40 +00004906 : let out = ''
Bram Moolenaaref2f6562007-05-06 13:32:59 +00004907 : for ix in range(strlen(a:str))
Bram Moolenaarc51cf032022-02-26 12:25:45 +00004908 : let out = out .. '-' .. Nr2Bin(char2nr(a:str[ix]))
Bram Moolenaaref2f6562007-05-06 13:32:59 +00004909 : endfor
4910 : return out[1:]
Bram Moolenaar071d4272004-06-13 20:20:40 +00004911 :endfunc
4912
4913Example of its use: >
Bram Moolenaaref2f6562007-05-06 13:32:59 +00004914 :echo Nr2Bin(32)
4915result: "100000" >
4916 :echo String2Bin("32")
4917result: "110011-110010"
Bram Moolenaar071d4272004-06-13 20:20:40 +00004918
4919
Bram Moolenaaref2f6562007-05-06 13:32:59 +00004920Sorting lines ~
Bram Moolenaar071d4272004-06-13 20:20:40 +00004921
Bram Moolenaaref2f6562007-05-06 13:32:59 +00004922This example sorts lines with a specific compare function. >
4923
4924 :func SortBuffer()
4925 : let lines = getline(1, '$')
4926 : call sort(lines, function("Strcmp"))
4927 : call setline(1, lines)
Bram Moolenaar071d4272004-06-13 20:20:40 +00004928 :endfunction
4929
Bram Moolenaaref2f6562007-05-06 13:32:59 +00004930As a one-liner: >
4931 :call setline(1, sort(getline(1, '$'), function("Strcmp")))
Bram Moolenaar071d4272004-06-13 20:20:40 +00004932
Bram Moolenaar071d4272004-06-13 20:20:40 +00004933
Bram Moolenaaref2f6562007-05-06 13:32:59 +00004934scanf() replacement ~
Bram Moolenaar071d4272004-06-13 20:20:40 +00004935 *sscanf*
4936There is no sscanf() function in Vim. If you need to extract parts from a
4937line, you can use matchstr() and substitute() to do it. This example shows
4938how to get the file name, line number and column number out of a line like
4939"foobar.txt, 123, 45". >
4940 :" Set up the match bit
4941 :let mx='\(\f\+\),\s*\(\d\+\),\s*\(\d\+\)'
4942 :"get the part matching the whole expression
4943 :let l = matchstr(line, mx)
4944 :"get each item out of the match
4945 :let file = substitute(l, mx, '\1', '')
4946 :let lnum = substitute(l, mx, '\2', '')
4947 :let col = substitute(l, mx, '\3', '')
4948
4949The input is in the variable "line", the results in the variables "file",
4950"lnum" and "col". (idea from Michael Geddes)
4951
Bram Moolenaaref2f6562007-05-06 13:32:59 +00004952
4953getting the scriptnames in a Dictionary ~
4954 *scriptnames-dictionary*
4955The |:scriptnames| command can be used to get a list of all script files that
4956have been sourced. There is no equivalent function or variable for this
4957(because it's rarely needed). In case you need to manipulate the list this
4958code can be used: >
4959 " Get the output of ":scriptnames" in the scriptnames_output variable.
4960 let scriptnames_output = ''
4961 redir => scriptnames_output
4962 silent scriptnames
4963 redir END
Bram Moolenaarb0d45e72017-11-05 18:19:24 +01004964
Bram Moolenaar446cb832008-06-24 21:56:24 +00004965 " Split the output into lines and parse each line. Add an entry to the
Bram Moolenaaref2f6562007-05-06 13:32:59 +00004966 " "scripts" dictionary.
4967 let scripts = {}
4968 for line in split(scriptnames_output, "\n")
4969 " Only do non-blank lines.
4970 if line =~ '\S'
4971 " Get the first number in the line.
Bram Moolenaar446cb832008-06-24 21:56:24 +00004972 let nr = matchstr(line, '\d\+')
Bram Moolenaaref2f6562007-05-06 13:32:59 +00004973 " Get the file name, remove the script number " 123: ".
Bram Moolenaar446cb832008-06-24 21:56:24 +00004974 let name = substitute(line, '.\+:\s*', '', '')
Bram Moolenaaref2f6562007-05-06 13:32:59 +00004975 " Add an item to the Dictionary
Bram Moolenaar446cb832008-06-24 21:56:24 +00004976 let scripts[nr] = name
Bram Moolenaaref2f6562007-05-06 13:32:59 +00004977 endif
4978 endfor
4979 unlet scriptnames_output
4980
Bram Moolenaar071d4272004-06-13 20:20:40 +00004981==============================================================================
Bram Moolenaar558ca4a2019-04-04 18:15:38 +0200498210. Vim script versions *vimscript-version* *vimscript-versions*
Bram Moolenaar911ead12019-04-21 00:03:35 +02004983 *scriptversion*
Bram Moolenaar558ca4a2019-04-04 18:15:38 +02004984Over time many features have been added to Vim script. This includes Ex
4985commands, functions, variable types, etc. Each individual feature can be
4986checked with the |has()| and |exists()| functions.
4987
4988Sometimes old syntax of functionality gets in the way of making Vim better.
4989When support is taken away this will break older Vim scripts. To make this
4990explicit the |:scriptversion| command can be used. When a Vim script is not
4991compatible with older versions of Vim this will give an explicit error,
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +02004992instead of failing in mysterious ways.
Bram Moolenaar558ca4a2019-04-04 18:15:38 +02004993
Bram Moolenaara2baa732022-02-04 16:09:54 +00004994When using a legacy function, defined with `:function`, in |Vim9| script then
4995scriptversion 4 is used.
4996
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +02004997 *scriptversion-1* >
Bram Moolenaar558ca4a2019-04-04 18:15:38 +02004998 :scriptversion 1
4999< This is the original Vim script, same as not using a |:scriptversion|
5000 command. Can be used to go back to old syntax for a range of lines.
5001 Test for support with: >
5002 has('vimscript-1')
5003
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +02005004< *scriptversion-2* >
Bram Moolenaar558ca4a2019-04-04 18:15:38 +02005005 :scriptversion 2
Bram Moolenaar68e65602019-05-26 21:33:31 +02005006< String concatenation with "." is not supported, use ".." instead.
Bram Moolenaar558ca4a2019-04-04 18:15:38 +02005007 This avoids the ambiguity using "." for Dict member access and
5008 floating point numbers. Now ".5" means the number 0.5.
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +02005009
5010 *scriptversion-3* >
Bram Moolenaar911ead12019-04-21 00:03:35 +02005011 :scriptversion 3
5012< All |vim-variable|s must be prefixed by "v:". E.g. "version" doesn't
5013 work as |v:version| anymore, it can be used as a normal variable.
5014 Same for some obvious names as "count" and others.
Bram Moolenaar558ca4a2019-04-04 18:15:38 +02005015
Bram Moolenaar911ead12019-04-21 00:03:35 +02005016 Test for support with: >
5017 has('vimscript-3')
Bram Moolenaar60a8de22019-09-15 14:33:22 +02005018<
5019 *scriptversion-4* >
5020 :scriptversion 4
Bram Moolenaarc17e66c2020-06-02 21:38:22 +02005021< Numbers with a leading zero are not recognized as octal. "0o" or "0O"
5022 is still recognized as octal. With the
Bram Moolenaar60a8de22019-09-15 14:33:22 +02005023 previous version you get: >
Bram Moolenaarc17e66c2020-06-02 21:38:22 +02005024 echo 017 " displays 15 (octal)
5025 echo 0o17 " displays 15 (octal)
5026 echo 018 " displays 18 (decimal)
Bram Moolenaar60a8de22019-09-15 14:33:22 +02005027< with script version 4: >
Bram Moolenaarc17e66c2020-06-02 21:38:22 +02005028 echo 017 " displays 17 (decimal)
5029 echo 0o17 " displays 15 (octal)
5030 echo 018 " displays 18 (decimal)
Bram Moolenaar60a8de22019-09-15 14:33:22 +02005031< Also, it is possible to use single quotes inside numbers to make them
5032 easier to read: >
5033 echo 1'000'000
5034< The quotes must be surrounded by digits.
5035
5036 Test for support with: >
5037 has('vimscript-4')
Bram Moolenaar558ca4a2019-04-04 18:15:38 +02005038
5039==============================================================================
504011. No +eval feature *no-eval-feature*
Bram Moolenaar071d4272004-06-13 20:20:40 +00005041
5042When the |+eval| feature was disabled at compile time, none of the expression
5043evaluation commands are available. To prevent this from causing Vim scripts
5044to generate all kinds of errors, the ":if" and ":endif" commands are still
5045recognized, though the argument of the ":if" and everything between the ":if"
5046and the matching ":endif" is ignored. Nesting of ":if" blocks is allowed, but
5047only if the commands are at the start of the line. The ":else" command is not
5048recognized.
5049
5050Example of how to avoid executing commands when the |+eval| feature is
5051missing: >
5052
5053 :if 1
5054 : echo "Expression evaluation is compiled in"
5055 :else
5056 : echo "You will _never_ see this message"
5057 :endif
5058
Bram Moolenaar773a97c2019-06-06 20:39:55 +02005059To execute a command only when the |+eval| feature is disabled can be done in
5060two ways. The simplest is to exit the script (or Vim) prematurely: >
5061 if 1
5062 echo "commands executed with +eval"
5063 finish
5064 endif
5065 args " command executed without +eval
5066
5067If you do not want to abort loading the script you can use a trick, as this
5068example shows: >
Bram Moolenaar45d2cca2017-04-30 16:36:05 +02005069
5070 silent! while 0
5071 set history=111
5072 silent! endwhile
5073
5074When the |+eval| feature is available the command is skipped because of the
5075"while 0". Without the |+eval| feature the "while 0" is an error, which is
5076silently ignored, and the command is executed.
Bram Moolenaarcd5c8f82017-04-09 20:11:58 +02005077
Bram Moolenaar071d4272004-06-13 20:20:40 +00005078==============================================================================
Bram Moolenaar2f0936c2022-01-08 21:51:59 +0000507912. The sandbox *eval-sandbox* *sandbox*
Bram Moolenaar071d4272004-06-13 20:20:40 +00005080
Bram Moolenaar368373e2010-07-19 20:46:22 +02005081The 'foldexpr', 'formatexpr', 'includeexpr', 'indentexpr', 'statusline' and
5082'foldtext' options may be evaluated in a sandbox. This means that you are
5083protected from these expressions having nasty side effects. This gives some
5084safety for when these options are set from a modeline. It is also used when
5085the command from a tags file is executed and for CTRL-R = in the command line.
Bram Moolenaar7b0294c2004-10-11 10:16:09 +00005086The sandbox is also used for the |:sandbox| command.
Bram Moolenaar2f0936c2022-01-08 21:51:59 +00005087 *E48*
Bram Moolenaar071d4272004-06-13 20:20:40 +00005088These items are not allowed in the sandbox:
5089 - changing the buffer text
Bram Moolenaarb477af22018-07-15 20:20:18 +02005090 - defining or changing mapping, autocommands, user commands
Bram Moolenaar071d4272004-06-13 20:20:40 +00005091 - setting certain options (see |option-summary|)
Bram Moolenaaref2f6562007-05-06 13:32:59 +00005092 - setting certain v: variables (see |v:var|) *E794*
Bram Moolenaar071d4272004-06-13 20:20:40 +00005093 - executing a shell command
5094 - reading or writing a file
5095 - jumping to another buffer or editing a file
Bram Moolenaar4770d092006-01-12 23:22:24 +00005096 - executing Python, Perl, etc. commands
Bram Moolenaar7b0294c2004-10-11 10:16:09 +00005097This is not guaranteed 100% secure, but it should block most attacks.
5098
5099 *:san* *:sandbox*
Bram Moolenaar045e82d2005-07-08 22:25:33 +00005100:san[dbox] {cmd} Execute {cmd} in the sandbox. Useful to evaluate an
Bram Moolenaar7b0294c2004-10-11 10:16:09 +00005101 option that may have been set from a modeline, e.g.
5102 'foldexpr'.
5103
Bram Moolenaarb71eaae2006-01-20 23:10:18 +00005104 *sandbox-option*
5105A few options contain an expression. When this expression is evaluated it may
Bram Moolenaar9b2200a2006-03-20 21:55:45 +00005106have to be done in the sandbox to avoid a security risk. But the sandbox is
Bram Moolenaarb71eaae2006-01-20 23:10:18 +00005107restrictive, thus this only happens when the option was set from an insecure
5108location. Insecure in this context are:
Bram Moolenaar551dbcc2006-04-25 22:13:59 +00005109- sourcing a .vimrc or .exrc in the current directory
Bram Moolenaarb71eaae2006-01-20 23:10:18 +00005110- while executing in the sandbox
5111- value coming from a modeline
Bram Moolenaarb477af22018-07-15 20:20:18 +02005112- executing a function that was defined in the sandbox
Bram Moolenaarb71eaae2006-01-20 23:10:18 +00005113
5114Note that when in the sandbox and saving an option value and restoring it, the
5115option will still be marked as it was set in the sandbox.
5116
5117==============================================================================
Bram Moolenaar558ca4a2019-04-04 18:15:38 +0200511813. Textlock *textlock*
Bram Moolenaarb71eaae2006-01-20 23:10:18 +00005119
5120In a few situations it is not allowed to change the text in the buffer, jump
5121to another window and some other things that might confuse or break what Vim
5122is currently doing. This mostly applies to things that happen when Vim is
Bram Moolenaar58b85342016-08-14 19:54:54 +02005123actually doing something else. For example, evaluating the 'balloonexpr' may
Bram Moolenaarb71eaae2006-01-20 23:10:18 +00005124happen any moment the mouse cursor is resting at some position.
5125
5126This is not allowed when the textlock is active:
5127 - changing the buffer text
5128 - jumping to another buffer or window
5129 - editing another file
5130 - closing a window or quitting Vim
5131 - etc.
5132
Bram Moolenaar071d4272004-06-13 20:20:40 +00005133
Bram Moolenaar91f84f62018-07-29 15:07:52 +02005134 vim:tw=78:ts=8:noet:ft=help:norl: