blob: 6a576d31c5ac9a4b01731e9df3451737ba0b2dbb [file] [log] [blame]
Hirohito Higashi73b96502025-06-28 18:18:21 +02001*eval.txt* For Vim version 9.1. Last change: 2025 Jun 28
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|
Yegappan Lakshmanan9cb865e2025-03-23 16:42:16 +010024 1.4 Tuples |Tuples|
25 1.5 Dictionaries |Dictionaries|
26 1.6 Blobs |Blobs|
27 1.7 More about variables |more-variables|
Bram Moolenaar13065c42005-01-08 16:08:21 +0000282. Expression syntax |expression-syntax|
293. Internal variable |internal-variables|
304. Builtin Functions |functions|
315. Defining functions |user-functions|
326. Curly braces names |curly-braces-names|
337. Commands |expression-commands|
348. Exception handling |exception-handling|
359. Examples |eval-examples|
Bram Moolenaar558ca4a2019-04-04 18:15:38 +02003610. Vim script version |vimscript-version|
3711. No +eval feature |no-eval-feature|
3812. The sandbox |eval-sandbox|
3913. Textlock |textlock|
Christian Brabandtda4e4332023-11-05 10:45:12 +01004014. Vim script library |vim-script-library|
Bram Moolenaared997ad2019-07-21 16:42:00 +020041
42Testing support is documented in |testing.txt|.
43Profiling is documented at |profiling|.
Bram Moolenaar071d4272004-06-13 20:20:40 +000044
Bram Moolenaar071d4272004-06-13 20:20:40 +000045==============================================================================
461. Variables *variables*
47
Bram Moolenaar13065c42005-01-08 16:08:21 +0000481.1 Variable types ~
Bram Moolenaarf10911e2022-01-29 22:20:48 +000049 *E712* *E896* *E897* *E899* *E1098*
Yegappan Lakshmanan9cb865e2025-03-23 16:42:16 +010050 *E1107* *E1135* *E1138* *E1523*
51There are eleven types of variables:
Bram Moolenaar071d4272004-06-13 20:20:40 +000052
Bram Moolenaar664f3cf2019-12-07 16:03:51 +010053 *Number* *Integer*
54Number A 32 or 64 bit signed number. |expr-number|
Bram Moolenaarf9706e92020-02-22 14:27:04 +010055 The number of bits is available in |v:numbersize|.
Bram Moolenaar6f02b002021-01-10 20:22:54 +010056 Examples: -123 0x10 0177 0o177 0b1011
Bram Moolenaard8b02732005-01-14 21:48:43 +000057
Bram Moolenaar446cb832008-06-24 21:56:24 +000058Float A floating point number. |floating-point-format| *Float*
Bram Moolenaar446cb832008-06-24 21:56:24 +000059 Examples: 123.456 1.15e-6 -1.1e3
60
Bram Moolenaard8b02732005-01-14 21:48:43 +000061String A NUL terminated string of 8-bit unsigned characters (bytes).
Bram Moolenaar446cb832008-06-24 21:56:24 +000062 |expr-string| Examples: "ab\txx\"--" 'x-z''a,c'
Bram Moolenaard8b02732005-01-14 21:48:43 +000063
Bram Moolenaard8968242019-01-15 22:51:57 +010064List An ordered sequence of items, see |List| for details.
Bram Moolenaard8b02732005-01-14 21:48:43 +000065 Example: [1, 2, ['a', 'b']]
Bram Moolenaar071d4272004-06-13 20:20:40 +000066
Yegappan Lakshmanan9cb865e2025-03-23 16:42:16 +010067Tuple An ordered immutable sequence of items, see |Tuple| for
68 details.
69 Example: (1, 2, ('a', 'b'))
70
Bram Moolenaar39a58ca2005-06-27 22:42:44 +000071Dictionary An associative, unordered array: Each entry has a key and a
72 value. |Dictionary|
Bram Moolenaard5abb4c2019-07-13 22:46:10 +020073 Examples:
74 {'blue': "#0000ff", 'red': "#ff0000"}
Bram Moolenaar4c6d9042019-07-16 22:04:02 +020075 #{blue: "#0000ff", red: "#ff0000"}
Bram Moolenaar39a58ca2005-06-27 22:42:44 +000076
Bram Moolenaar835dc632016-02-07 14:27:38 +010077Funcref A reference to a function |Funcref|.
78 Example: function("strlen")
Bram Moolenaar1d429612016-05-24 15:44:17 +020079 It can be bound to a dictionary and arguments, it then works
80 like a Partial.
81 Example: function("Callback", [arg], myDict)
Bram Moolenaar835dc632016-02-07 14:27:38 +010082
Bram Moolenaar02e83b42016-02-21 20:10:26 +010083Special |v:false|, |v:true|, |v:none| and |v:null|. *Special*
Bram Moolenaar835dc632016-02-07 14:27:38 +010084
Bram Moolenaarebf7dfa2016-04-14 12:46:51 +020085Job Used for a job, see |job_start()|. *Job* *Jobs*
Bram Moolenaar38a55632016-02-15 22:07:32 +010086
Bram Moolenaarebf7dfa2016-04-14 12:46:51 +020087Channel Used for a channel, see |ch_open()|. *Channel* *Channels*
Bram Moolenaar835dc632016-02-07 14:27:38 +010088
Bram Moolenaard8968242019-01-15 22:51:57 +010089Blob Binary Large Object. Stores any sequence of bytes. See |Blob|
90 for details
Bram Moolenaar6e5ea8d2019-01-12 22:47:31 +010091 Example: 0zFF00ED015DAF
92 0z is an empty Blob.
93
Bram Moolenaard7ee7ce2005-01-03 21:02:03 +000094The Number and String types are converted automatically, depending on how they
95are used.
Bram Moolenaar071d4272004-06-13 20:20:40 +000096
97Conversion from a Number to a String is by making the ASCII representation of
Bram Moolenaar24ea3ba2010-09-19 19:01:21 +020098the Number. Examples:
99 Number 123 --> String "123" ~
100 Number 0 --> String "0" ~
101 Number -1 --> String "-1" ~
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200102 *octal*
Bram Moolenaard43906d2020-07-20 21:31:32 +0200103Conversion from a String to a Number only happens in legacy Vim script, not in
104Vim9 script. It is done by converting the first digits to a number.
105Hexadecimal "0xf9", Octal "017" or "0o17", and Binary "0b10"
Bram Moolenaar6f02b002021-01-10 20:22:54 +0100106numbers are recognized
Bram Moolenaar5da36052021-12-27 15:39:57 +0000107NOTE: when using |Vim9| script or |scriptversion-4| octal with a leading "0"
108is not recognized. The 0o notation requires patch 8.2.0886.
Bram Moolenaar6f02b002021-01-10 20:22:54 +0100109If the String doesn't start with digits, the result is zero.
Bram Moolenaarfa735342016-01-03 22:14:44 +0100110Examples:
Bram Moolenaar24ea3ba2010-09-19 19:01:21 +0200111 String "456" --> Number 456 ~
112 String "6bar" --> Number 6 ~
113 String "foo" --> Number 0 ~
114 String "0xf1" --> Number 241 ~
115 String "0100" --> Number 64 ~
Bram Moolenaarc17e66c2020-06-02 21:38:22 +0200116 String "0o100" --> Number 64 ~
Bram Moolenaarfa735342016-01-03 22:14:44 +0100117 String "0b101" --> Number 5 ~
Bram Moolenaar24ea3ba2010-09-19 19:01:21 +0200118 String "-8" --> Number -8 ~
119 String "+8" --> Number 0 ~
Bram Moolenaar071d4272004-06-13 20:20:40 +0000120
121To force conversion from String to Number, add zero to it: >
122 :echo "0100" + 0
Bram Moolenaar97b2ad32006-03-18 21:40:56 +0000123< 64 ~
124
125To avoid a leading zero to cause octal conversion, or for using a different
126base, use |str2nr()|.
Bram Moolenaar071d4272004-06-13 20:20:40 +0000127
Bram Moolenaard09091d2019-01-17 16:07:22 +0100128 *TRUE* *FALSE* *Boolean*
Bram Moolenaar071d4272004-06-13 20:20:40 +0000129For boolean operators Numbers are used. Zero is FALSE, non-zero is TRUE.
Bram Moolenaar6aa57292021-08-14 21:25:52 +0200130You can also use |v:false| and |v:true|, in Vim9 script |false| and |true|.
Bram Moolenaar1c6737b2020-09-07 22:18:52 +0200131When TRUE is returned from a function it is the Number one, FALSE is the
132number zero.
Bram Moolenaar071d4272004-06-13 20:20:40 +0000133
Bram Moolenaare381d3d2016-07-07 14:50:41 +0200134Note that in the command: >
Bram Moolenaar071d4272004-06-13 20:20:40 +0000135 :if "foo"
Bram Moolenaare381d3d2016-07-07 14:50:41 +0200136 :" NOT executed
137"foo" is converted to 0, which means FALSE. If the string starts with a
138non-zero number it means TRUE: >
139 :if "8foo"
140 :" executed
141To test for a non-empty string, use empty(): >
Bram Moolenaar3a0d8092012-10-21 03:02:54 +0200142 :if !empty("foo")
Bram Moolenaar92f26c22020-10-03 20:17:30 +0200143
144< *falsy* *truthy*
145An expression can be used as a condition, ignoring the type and only using
146whether the value is "sort of true" or "sort of false". Falsy is:
147 the number zero
148 empty string, blob, list or dictionary
149Other values are truthy. Examples:
150 0 falsy
151 1 truthy
152 -1 truthy
153 0.0 falsy
154 0.1 truthy
155 '' falsy
156 'x' truthy
157 [] falsy
158 [0] truthy
159 {} falsy
160 #{x: 1} truthy
161 0z falsy
162 0z00 truthy
163
Bram Moolenaare381d3d2016-07-07 14:50:41 +0200164 *non-zero-arg*
165Function arguments often behave slightly different from |TRUE|: If the
166argument is present and it evaluates to a non-zero Number, |v:true| or a
Bram Moolenaar64d8e252016-09-06 22:12:34 +0200167non-empty String, then the value is considered to be TRUE.
Bram Moolenaar01164a62017-11-02 22:58:42 +0100168Note that " " and "0" are also non-empty strings, thus considered to be TRUE.
169A List, Dictionary or Float is not a Number or String, thus evaluate to FALSE.
Bram Moolenaare381d3d2016-07-07 14:50:41 +0200170
Bram Moolenaar2f0936c2022-01-08 21:51:59 +0000171 *E611* *E745* *E728* *E703* *E729* *E730* *E731* *E908* *E910*
Bram Moolenaar7db29e42022-12-11 15:53:04 +0000172 *E913* *E974* *E975* *E976* *E1319* *E1320* *E1321* *E1322*
Yegappan Lakshmanan9cb865e2025-03-23 16:42:16 +0100173 *E1323* *E1324* *E1520* *E1522*
174|List|, |Tuple|, |Dictionary|, |Funcref|, |Job|, |Channel|, |Blob|, |Class|
175and |object| types are not automatically converted.
Bram Moolenaard7ee7ce2005-01-03 21:02:03 +0000176
Bram Moolenaar446cb832008-06-24 21:56:24 +0000177 *E805* *E806* *E808*
Bram Moolenaar58b85342016-08-14 19:54:54 +0200178When mixing Number and Float the Number is converted to Float. Otherwise
Bram Moolenaar446cb832008-06-24 21:56:24 +0000179there is no automatic conversion of Float. You can use str2float() for String
180to Float, printf() for Float to String and float2nr() for Float to Number.
181
Yegappan Lakshmanan9cb865e2025-03-23 16:42:16 +0100182 *E362* *E891* *E892* *E893* *E894*
183 *E907* *E911* *E914* *E1521*
Bram Moolenaar13d5aee2016-01-21 23:36:05 +0100184When expecting a Float a Number can also be used, but nothing else.
185
Bram Moolenaarf6f32c32016-03-12 19:03:59 +0100186 *no-type-checking*
187You will not get an error if you try to change the type of a variable.
Bram Moolenaard7ee7ce2005-01-03 21:02:03 +0000188
Bram Moolenaar13065c42005-01-08 16:08:21 +0000189
Bram Moolenaar9588a0f2005-01-08 21:45:39 +00001901.2 Function references ~
Bram Moolenaar8a3b8052022-06-26 12:21:15 +0100191 *Funcref* *E695* *E718* *E1192*
Bram Moolenaar58b85342016-08-14 19:54:54 +0200192A Funcref variable is obtained with the |function()| function, the |funcref()|
Bram Moolenaarcfa8f9a2022-06-03 21:59:47 +0100193function, (in |Vim9| script) the name of a function, or created with the
194lambda expression |expr-lambda|. It can be used in an expression in the place
195of a function name, before the parenthesis around the arguments, to invoke the
196function it refers to. Example in |Vim9| script: >
Bram Moolenaard7ee7ce2005-01-03 21:02:03 +0000197
Bram Moolenaarcfa8f9a2022-06-03 21:59:47 +0100198 :var Fn = MyFunc
199 :echo Fn()
200
201Legacy script: >
Bram Moolenaard7ee7ce2005-01-03 21:02:03 +0000202 :let Fn = function("MyFunc")
203 :echo Fn()
Bram Moolenaar3a3a7232005-01-17 22:16:15 +0000204< *E704* *E705* *E707*
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000205A Funcref variable must start with a capital, "s:", "w:", "t:" or "b:". You
Bram Moolenaar7cba6c02013-09-05 22:13:31 +0200206can use "g:" but the following name must still start with a capital. You
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000207cannot have both a Funcref variable and a function with the same name.
Bram Moolenaard7ee7ce2005-01-03 21:02:03 +0000208
Bram Moolenaar3a3a7232005-01-17 22:16:15 +0000209A special case is defining a function and directly assigning its Funcref to a
210Dictionary entry. Example: >
211 :function dict.init() dict
212 : let self.val = 0
213 :endfunction
214
215The key of the Dictionary can start with a lower case letter. The actual
216function name is not used here. Also see |numbered-function|.
217
218A Funcref can also be used with the |:call| command: >
219 :call Fn()
220 :call dict.init()
Bram Moolenaar13065c42005-01-08 16:08:21 +0000221
222The name of the referenced function can be obtained with |string()|. >
Bram Moolenaar383f9bc2005-01-19 22:18:32 +0000223 :let func = string(Fn)
Bram Moolenaar13065c42005-01-08 16:08:21 +0000224
225You can use |call()| to invoke a Funcref and use a list variable for the
226arguments: >
Bram Moolenaar383f9bc2005-01-19 22:18:32 +0000227 :let r = call(Fn, mylist)
Bram Moolenaar1d429612016-05-24 15:44:17 +0200228<
229 *Partial*
230A Funcref optionally binds a Dictionary and/or arguments. This is also called
231a Partial. This is created by passing the Dictionary and/or arguments to
Bram Moolenaar58b85342016-08-14 19:54:54 +0200232function() or funcref(). When calling the function the Dictionary and/or
233arguments will be passed to the function. Example: >
Bram Moolenaar1d429612016-05-24 15:44:17 +0200234
235 let Cb = function('Callback', ['foo'], myDict)
Bram Moolenaarba3ff532018-11-04 14:45:49 +0100236 call Cb('bar')
Bram Moolenaar1d429612016-05-24 15:44:17 +0200237
238This will invoke the function as if using: >
Bram Moolenaarba3ff532018-11-04 14:45:49 +0100239 call myDict.Callback('foo', 'bar')
Bram Moolenaar1d429612016-05-24 15:44:17 +0200240
241This is very useful when passing a function around, e.g. in the arguments of
242|ch_open()|.
243
244Note that binding a function to a Dictionary also happens when the function is
245a member of the Dictionary: >
246
247 let myDict.myFunction = MyFunction
248 call myDict.myFunction()
249
250Here MyFunction() will get myDict passed as "self". This happens when the
251"myFunction" member is accessed. When making assigning "myFunction" to
252otherDict and calling it, it will be bound to otherDict: >
253
254 let otherDict.myFunction = myDict.myFunction
255 call otherDict.myFunction()
256
257Now "self" will be "otherDict". But when the dictionary was bound explicitly
258this won't happen: >
259
260 let myDict.myFunction = function(MyFunction, myDict)
261 let otherDict.myFunction = myDict.myFunction
262 call otherDict.myFunction()
263
Bram Moolenaard823fa92016-08-12 16:29:27 +0200264Here "self" will be "myDict", because it was bound explicitly.
Bram Moolenaard7ee7ce2005-01-03 21:02:03 +0000265
266
Bram Moolenaar9588a0f2005-01-08 21:45:39 +00002671.3 Lists ~
Bram Moolenaar7e38ea22014-04-05 22:55:53 +0200268 *list* *List* *Lists* *E686*
Bram Moolenaard7ee7ce2005-01-03 21:02:03 +0000269A List is an ordered sequence of items. An item can be of any type. Items
Bram Moolenaar58b85342016-08-14 19:54:54 +0200270can be accessed by their index number. Items can be added and removed at any
Bram Moolenaard7ee7ce2005-01-03 21:02:03 +0000271position in the sequence.
272
Bram Moolenaar13065c42005-01-08 16:08:21 +0000273
274List creation ~
275 *E696* *E697*
Yegappan Lakshmanan9cb865e2025-03-23 16:42:16 +0100276A List is created with a comma-separated sequence of items in square brackets.
Bram Moolenaar13065c42005-01-08 16:08:21 +0000277Examples: >
Yegappan Lakshmanan9cb865e2025-03-23 16:42:16 +0100278 :let mylist = [1, "two", 3, "four"]
Bram Moolenaar13065c42005-01-08 16:08:21 +0000279 :let emptylist = []
Bram Moolenaard7ee7ce2005-01-03 21:02:03 +0000280
Bram Moolenaar58b85342016-08-14 19:54:54 +0200281An item can be any expression. Using a List for an item creates a
Bram Moolenaarf9393ef2006-04-24 19:47:27 +0000282List of Lists: >
Bram Moolenaar13065c42005-01-08 16:08:21 +0000283 :let nestlist = [[11, 12], [21, 22], [31, 32]]
Bram Moolenaard7ee7ce2005-01-03 21:02:03 +0000284
285An extra comma after the last item is ignored.
286
Bram Moolenaar13065c42005-01-08 16:08:21 +0000287
288List index ~
289 *list-index* *E684*
Bram Moolenaard7ee7ce2005-01-03 21:02:03 +0000290An item in the List can be accessed by putting the index in square brackets
Bram Moolenaar13065c42005-01-08 16:08:21 +0000291after the List. Indexes are zero-based, thus the first item has index zero. >
292 :let item = mylist[0] " get the first item: 1
Bram Moolenaard7ee7ce2005-01-03 21:02:03 +0000293 :let item = mylist[2] " get the third item: 3
Bram Moolenaar13065c42005-01-08 16:08:21 +0000294
Bram Moolenaar9588a0f2005-01-08 21:45:39 +0000295When the resulting item is a list this can be repeated: >
Bram Moolenaar13065c42005-01-08 16:08:21 +0000296 :let item = nestlist[0][1] " get the first list, second item: 12
Bram Moolenaard7ee7ce2005-01-03 21:02:03 +0000297<
Bram Moolenaar13065c42005-01-08 16:08:21 +0000298A negative index is counted from the end. Index -1 refers to the last item in
299the List, -2 to the last but one item, etc. >
Bram Moolenaard7ee7ce2005-01-03 21:02:03 +0000300 :let last = mylist[-1] " get the last item: "four"
301
Bram Moolenaar13065c42005-01-08 16:08:21 +0000302To avoid an error for an invalid index use the |get()| function. When an item
Bram Moolenaar9588a0f2005-01-08 21:45:39 +0000303is not available it returns zero or the default value you specify: >
Bram Moolenaar13065c42005-01-08 16:08:21 +0000304 :echo get(mylist, idx)
305 :echo get(mylist, idx, "NONE")
306
307
308List concatenation ~
Bram Moolenaar34453202021-01-31 13:08:38 +0100309 *list-concatenation*
Bram Moolenaar13065c42005-01-08 16:08:21 +0000310Two lists can be concatenated with the "+" operator: >
311 :let longlist = mylist + [5, 6]
zeertzjqb8170142024-02-08 11:21:44 +0100312 :let longlist = [5, 6] + mylist
313To prepend or append an item, turn it into a list by putting [] around it.
314
315A list can be concatenated with another one in-place using |:let+=| or
316|extend()|: >
Bram Moolenaar383f9bc2005-01-19 22:18:32 +0000317 :let mylist += [7, 8]
qeatzyc9c2e2d2024-02-07 17:52:25 +0100318 :call extend(mylist, [7, 8])
zeertzjqb8170142024-02-08 11:21:44 +0100319<
320See |list-modification| below for more about changing a list in-place.
Bram Moolenaar13065c42005-01-08 16:08:21 +0000321
322
323Sublist ~
Bram Moolenaarbc8801c2016-08-02 21:04:33 +0200324 *sublist*
Bram Moolenaard7ee7ce2005-01-03 21:02:03 +0000325A part of the List can be obtained by specifying the first and last index,
326separated by a colon in square brackets: >
Bram Moolenaar13065c42005-01-08 16:08:21 +0000327 :let shortlist = mylist[2:-1] " get List [3, "four"]
Bram Moolenaard7ee7ce2005-01-03 21:02:03 +0000328
329Omitting the first index is similar to zero. Omitting the last index is
Bram Moolenaaref2f6562007-05-06 13:32:59 +0000330similar to -1. >
Bram Moolenaar540d6e32005-01-09 21:20:18 +0000331 :let endlist = mylist[2:] " from item 2 to the end: [3, "four"]
332 :let shortlist = mylist[2:2] " List with one item: [3]
333 :let otherlist = mylist[:] " make a copy of the List
Bram Moolenaard7ee7ce2005-01-03 21:02:03 +0000334
Bram Moolenaar6601b622021-01-13 21:47:15 +0100335Notice that the last index is inclusive. If you prefer using an exclusive
Yegappan Lakshmanan9cb865e2025-03-23 16:42:16 +0100336index use the |slice()| function.
Bram Moolenaar6601b622021-01-13 21:47:15 +0100337
Yegappan Lakshmanan9cb865e2025-03-23 16:42:16 +0100338If the first index is beyond the last item of the List or the last index is
Bram Moolenaarf9393ef2006-04-24 19:47:27 +0000339before the first item, the result is an empty list. There is no error
340message.
341
Yegappan Lakshmanan9cb865e2025-03-23 16:42:16 +0100342If the last index is equal to or greater than the length of the list the
Bram Moolenaarf9393ef2006-04-24 19:47:27 +0000343length minus one is used: >
Bram Moolenaar9e54a0e2006-04-14 20:42:25 +0000344 :let mylist = [0, 1, 2, 3]
345 :echo mylist[2:8] " result: [2, 3]
346
Bram Moolenaara7fc0102005-05-18 22:17:12 +0000347NOTE: mylist[s:e] means using the variable "s:e" as index. Watch out for
Bram Moolenaar58b85342016-08-14 19:54:54 +0200348using a single letter variable before the ":". Insert a space when needed:
Bram Moolenaara7fc0102005-05-18 22:17:12 +0000349mylist[s : e].
350
Bram Moolenaard7ee7ce2005-01-03 21:02:03 +0000351
Bram Moolenaar13065c42005-01-08 16:08:21 +0000352List identity ~
Bram Moolenaard8b02732005-01-14 21:48:43 +0000353 *list-identity*
Bram Moolenaar13065c42005-01-08 16:08:21 +0000354When variable "aa" is a list and you assign it to another variable "bb", both
355variables refer to the same list. Thus changing the list "aa" will also
356change "bb": >
357 :let aa = [1, 2, 3]
358 :let bb = aa
359 :call add(aa, 4)
360 :echo bb
Bram Moolenaar3a3a7232005-01-17 22:16:15 +0000361< [1, 2, 3, 4]
Bram Moolenaar13065c42005-01-08 16:08:21 +0000362
363Making a copy of a list is done with the |copy()| function. Using [:] also
364works, as explained above. This creates a shallow copy of the list: Changing
Bram Moolenaar9588a0f2005-01-08 21:45:39 +0000365a list item in the list will also change the item in the copied list: >
Bram Moolenaar13065c42005-01-08 16:08:21 +0000366 :let aa = [[1, 'a'], 2, 3]
367 :let bb = copy(aa)
Bram Moolenaar3a3a7232005-01-17 22:16:15 +0000368 :call add(aa, 4)
Bram Moolenaar13065c42005-01-08 16:08:21 +0000369 :let aa[0][1] = 'aaa'
370 :echo aa
Bram Moolenaar3a3a7232005-01-17 22:16:15 +0000371< [[1, aaa], 2, 3, 4] >
Bram Moolenaar13065c42005-01-08 16:08:21 +0000372 :echo bb
Bram Moolenaar3a3a7232005-01-17 22:16:15 +0000373< [[1, aaa], 2, 3]
Bram Moolenaar13065c42005-01-08 16:08:21 +0000374
Bram Moolenaar9588a0f2005-01-08 21:45:39 +0000375To make a completely independent list use |deepcopy()|. This also makes a
Bram Moolenaar3a3a7232005-01-17 22:16:15 +0000376copy of the values in the list, recursively. Up to a hundred levels deep.
Bram Moolenaar13065c42005-01-08 16:08:21 +0000377
378The operator "is" can be used to check if two variables refer to the same
Bram Moolenaar3a3a7232005-01-17 22:16:15 +0000379List. "isnot" does the opposite. In contrast "==" compares if two lists have
Bram Moolenaar9588a0f2005-01-08 21:45:39 +0000380the same value. >
381 :let alist = [1, 2, 3]
382 :let blist = [1, 2, 3]
383 :echo alist is blist
Bram Moolenaar3a3a7232005-01-17 22:16:15 +0000384< 0 >
Bram Moolenaar9588a0f2005-01-08 21:45:39 +0000385 :echo alist == blist
Bram Moolenaar3a3a7232005-01-17 22:16:15 +0000386< 1
Bram Moolenaar13065c42005-01-08 16:08:21 +0000387
Bram Moolenaar9ba0eb82005-06-13 22:28:56 +0000388Note about comparing lists: Two lists are considered equal if they have the
389same length and all items compare equal, as with using "==". There is one
Bram Moolenaar7d1f5db2005-07-03 21:39:27 +0000390exception: When comparing a number with a string they are considered
391different. There is no automatic type conversion, as with using "==" on
392variables. Example: >
393 echo 4 == "4"
Bram Moolenaar9ba0eb82005-06-13 22:28:56 +0000394< 1 >
Bram Moolenaar7d1f5db2005-07-03 21:39:27 +0000395 echo [4] == ["4"]
Bram Moolenaar9ba0eb82005-06-13 22:28:56 +0000396< 0
397
Bram Moolenaar7d1f5db2005-07-03 21:39:27 +0000398Thus comparing Lists is more strict than comparing numbers and strings. You
Bram Moolenaar446cb832008-06-24 21:56:24 +0000399can compare simple values this way too by putting them in a list: >
Bram Moolenaar7d1f5db2005-07-03 21:39:27 +0000400
401 :let a = 5
402 :let b = "5"
Bram Moolenaar446cb832008-06-24 21:56:24 +0000403 :echo a == b
Bram Moolenaar7d1f5db2005-07-03 21:39:27 +0000404< 1 >
Bram Moolenaar446cb832008-06-24 21:56:24 +0000405 :echo [a] == [b]
Bram Moolenaar7d1f5db2005-07-03 21:39:27 +0000406< 0
Bram Moolenaar9ba0eb82005-06-13 22:28:56 +0000407
Bram Moolenaar13065c42005-01-08 16:08:21 +0000408
409List unpack ~
410
411To unpack the items in a list to individual variables, put the variables in
412square brackets, like list items: >
413 :let [var1, var2] = mylist
414
415When the number of variables does not match the number of items in the list
416this produces an error. To handle any extra items from the list append ";"
417and a variable name: >
418 :let [var1, var2; rest] = mylist
419
420This works like: >
421 :let var1 = mylist[0]
422 :let var2 = mylist[1]
Bram Moolenaar5f2bb9f2005-01-11 21:29:04 +0000423 :let rest = mylist[2:]
Bram Moolenaar13065c42005-01-08 16:08:21 +0000424
425Except that there is no error if there are only two items. "rest" will be an
426empty list then.
427
428
429List modification ~
430 *list-modification*
Bram Moolenaar9588a0f2005-01-08 21:45:39 +0000431To change a specific item of a list use |:let| this way: >
Bram Moolenaar13065c42005-01-08 16:08:21 +0000432 :let list[4] = "four"
433 :let listlist[0][3] = item
434
Bram Moolenaar9588a0f2005-01-08 21:45:39 +0000435To change part of a list you can specify the first and last item to be
Bram Moolenaar3a3a7232005-01-17 22:16:15 +0000436modified. The value must at least have the number of items in the range: >
Bram Moolenaar9588a0f2005-01-08 21:45:39 +0000437 :let list[3:5] = [3, 4, 5]
438
zeertzjqb8170142024-02-08 11:21:44 +0100439To add items to a List in-place, you can use |:let+=| (|list-concatenation|): >
Yegappan Lakshmanan1af35632024-02-06 11:03:36 +0100440 :let listA = [1, 2]
441 :let listA += [3, 4]
442<
443When two variables refer to the same List, changing one List in-place will
444cause the referenced List to be changed in-place: >
445 :let listA = [1, 2]
446 :let listB = listA
447 :let listB += [3, 4]
448 :echo listA
449 [1, 2, 3, 4]
450<
Bram Moolenaar13065c42005-01-08 16:08:21 +0000451Adding and removing items from a list is done with functions. Here are a few
452examples: >
453 :call insert(list, 'a') " prepend item 'a'
454 :call insert(list, 'a', 3) " insert item 'a' before list[3]
455 :call add(list, "new") " append String item
Bram Moolenaar3a3a7232005-01-17 22:16:15 +0000456 :call add(list, [1, 2]) " append a List as one new item
Bram Moolenaar13065c42005-01-08 16:08:21 +0000457 :call extend(list, [1, 2]) " extend the list with two more items
458 :let i = remove(list, 3) " remove item 3
Bram Moolenaar9cd15162005-01-16 22:02:49 +0000459 :unlet list[3] " idem
Bram Moolenaar13065c42005-01-08 16:08:21 +0000460 :let l = remove(list, 3, -1) " remove items 3 to last item
Bram Moolenaar9cd15162005-01-16 22:02:49 +0000461 :unlet list[3 : ] " idem
Bram Moolenaar3a3a7232005-01-17 22:16:15 +0000462 :call filter(list, 'v:val !~ "x"') " remove items with an 'x'
Bram Moolenaar13065c42005-01-08 16:08:21 +0000463
Bram Moolenaar3a3a7232005-01-17 22:16:15 +0000464Changing the order of items in a list: >
Bram Moolenaar9588a0f2005-01-08 21:45:39 +0000465 :call sort(list) " sort a list alphabetically
466 :call reverse(list) " reverse the order of items
Bram Moolenaar327aa022014-03-25 18:24:23 +0100467 :call uniq(sort(list)) " sort and remove duplicates
Bram Moolenaar9588a0f2005-01-08 21:45:39 +0000468
Bram Moolenaar13065c42005-01-08 16:08:21 +0000469
470For loop ~
471
Yegappan Lakshmanan9cb865e2025-03-23 16:42:16 +0100472The |:for| loop executes commands for each item in a List, Tuple, String or
473Blob. A variable is set to each item in sequence. Example with a List: >
Bram Moolenaar3a3a7232005-01-17 22:16:15 +0000474 :for item in mylist
475 : call Doit(item)
Bram Moolenaar13065c42005-01-08 16:08:21 +0000476 :endfor
477
478This works like: >
479 :let index = 0
480 :while index < len(mylist)
Bram Moolenaar3a3a7232005-01-17 22:16:15 +0000481 : let item = mylist[index]
482 : :call Doit(item)
Bram Moolenaar13065c42005-01-08 16:08:21 +0000483 : let index = index + 1
484 :endwhile
485
Bram Moolenaar5f2bb9f2005-01-11 21:29:04 +0000486If all you want to do is modify each item in the list then the |map()|
Bram Moolenaar3a3a7232005-01-17 22:16:15 +0000487function will be a simpler method than a for loop.
Bram Moolenaar5f2bb9f2005-01-11 21:29:04 +0000488
Bram Moolenaar58b85342016-08-14 19:54:54 +0200489Just like the |:let| command, |:for| also accepts a list of variables. This
Bram Moolenaar74e54fc2021-03-26 20:41:29 +0100490requires the argument to be a List of Lists. >
Bram Moolenaar13065c42005-01-08 16:08:21 +0000491 :for [lnum, col] in [[1, 3], [2, 8], [3, 0]]
492 : call Doit(lnum, col)
493 :endfor
494
495This works like a |:let| command is done for each list item. Again, the types
496must remain the same to avoid an error.
497
Bram Moolenaar3a3a7232005-01-17 22:16:15 +0000498It is also possible to put remaining items in a List variable: >
Bram Moolenaar13065c42005-01-08 16:08:21 +0000499 :for [i, j; rest] in listlist
500 : call Doit(i, j)
501 : if !empty(rest)
Bram Moolenaarc51cf032022-02-26 12:25:45 +0000502 : echo "remainder: " .. string(rest)
Bram Moolenaar13065c42005-01-08 16:08:21 +0000503 : endif
504 :endfor
505
Yegappan Lakshmanan9cb865e2025-03-23 16:42:16 +0100506For a Tuple one tuple item at a time is used.
507
Bram Moolenaar74e54fc2021-03-26 20:41:29 +0100508For a Blob one byte at a time is used.
509
510For a String one character, including any composing characters, is used as a
511String. Example: >
512 for c in text
513 echo 'This character is ' .. c
514 endfor
515
Bram Moolenaar13065c42005-01-08 16:08:21 +0000516
517List functions ~
Bram Moolenaar3a3a7232005-01-17 22:16:15 +0000518 *E714*
Bram Moolenaar13065c42005-01-08 16:08:21 +0000519Functions that are useful with a List: >
Bram Moolenaar9588a0f2005-01-08 21:45:39 +0000520 :let r = call(funcname, list) " call a function with an argument list
Bram Moolenaar13065c42005-01-08 16:08:21 +0000521 :if empty(list) " check if list is empty
Bram Moolenaar2fda12f2005-01-15 22:14:15 +0000522 :let l = len(list) " number of items in list
523 :let big = max(list) " maximum value in list
524 :let small = min(list) " minimum value in list
Bram Moolenaar9588a0f2005-01-08 21:45:39 +0000525 :let xs = count(list, 'x') " count nr of times 'x' appears in list
526 :let i = index(list, 'x') " index of first 'x' in list
Bram Moolenaar13065c42005-01-08 16:08:21 +0000527 :let lines = getline(1, 10) " get ten text lines from buffer
528 :call append('$', lines) " append text lines in buffer
Bram Moolenaar5f2bb9f2005-01-11 21:29:04 +0000529 :let list = split("a b c") " create list from items in a string
530 :let string = join(list, ', ') " create string from list items
Bram Moolenaar2fda12f2005-01-15 22:14:15 +0000531 :let s = string(list) " String representation of list
Bram Moolenaarc51cf032022-02-26 12:25:45 +0000532 :call map(list, '">> " .. v:val') " prepend ">> " to each item
Bram Moolenaar13065c42005-01-08 16:08:21 +0000533
Bram Moolenaar0cb032e2005-04-23 20:52:00 +0000534Don't forget that a combination of features can make things simple. For
535example, to add up all the numbers in a list: >
Bram Moolenaarc51cf032022-02-26 12:25:45 +0000536 :exe 'let sum = ' .. join(nrlist, '+')
Bram Moolenaar0cb032e2005-04-23 20:52:00 +0000537
Yegappan Lakshmanan9cb865e2025-03-23 16:42:16 +01005381.4 Tuples ~
539 *tuple* *Tuple* *Tuples*
540 *E1532* *E1533*
541A Tuple is an ordered sequence of items. An item can be of any type. Items
542can be accessed by their index number. A Tuple is immutable.
Bram Moolenaar13065c42005-01-08 16:08:21 +0000543
Yegappan Lakshmanan1c2f4752025-03-30 15:37:24 +0200544A Tuple is similar to a List but uses less memory and provides O(1) lookup
545time for an item.
Yegappan Lakshmanan9cb865e2025-03-23 16:42:16 +0100546
547Tuple creation ~
548 *E1526* *E1527*
549A Tuple is created with a comma-separated sequence of items in parentheses.
550Examples: >
551 :let mytuple = (1, "two", 3, "four")
552 :let tuple = (5,)
553 :let emptytuple = ()
554
555An item can be any expression. If there is only one item in the tuple, then
556the item must be followed by a comma.
557
558Using a Tuple for an item creates a Tuple of Tuples: >
559 :let nesttuple = ((11, 12), (21, 22), (31, 32))
560
561
562Tuple index ~
563 *tuple-index* *E1519*
564An item in the Tuple can be accessed by putting the index in square brackets
565after the Tuple. Indexes are zero-based, thus the first item has index zero.
566>
567 :let item = mytuple[0] " get the first item: 1
568 :let item = mytuple[2] " get the third item: 3
569
570When the resulting item is a tuple this can be repeated: >
571 :let item = nesttuple[0][1] " get the first tuple, second item: 12
572<
573A negative index is counted from the end. Index -1 refers to the last item in
574the Tuple, -2 to the last but one item, etc. >
575 :let last = mytuple[-1] " get the last item: "four"
576
577To avoid an error for an invalid index use the |get()| function. When an item
578is not available it returns zero or the default value you specify: >
579 :echo get(mytuple, idx)
580 :echo get(mytuple, idx, "NONE")
581
582
Yegappan Lakshmanan1c2f4752025-03-30 15:37:24 +0200583Tuple modification ~
584 *tuple-modification*
585A tuple is immutable and items cannot be added or removed from a tuple. But
586List and Dict items within a tuple can be modified: >
587 :let tuple = (1, [2, 3], {'a': 4})
588 :let tuple[1][0] = 10
589 :let tuple[2]['a'] = 20
590
591
Yegappan Lakshmanan9cb865e2025-03-23 16:42:16 +0100592Tuple concatenation ~
593 *tuple-concatenation*
594Two tuples can be concatenated with the "+" operator: >
595 :let longtuple = mytuple + (5, 6)
596 :let longtuple = (5, 6) + mytuple
597To prepend or append an item, turn it into a tuple by putting () around it.
598The item must be followed by a comma.
599
600 *E1540*
601Two variadic tuples with same item type can be concatenated but with different
602item types cannot be concatenated. Examples: >
603 var a: tuple<...list<number>> = (1, 2)
604 var b: tuple<...list<string>> = ('a', 'b')
605 echo a + b # not allowed
606
607 var a: tuple<number, number> = (1, 2)
608 var b: tuple<...list<string>> = ('a', 'b')
609 echo a + b # allowed
610
611 var a: tuple<...list<number>> = (1, 2)
612 var b: tuple<number, number> = (3, 4)
613 echo a + b # not allowed
614
615 var a: tuple<...list<number>> = (1, 2)
616 var b: tuple<number, ...list<number>> = (3, 4)
617 echo a + b # not allowed
618<
619Note that a tuple is immutable and items cannot be added or removed from a
620tuple.
621
622
623Subtuple ~
624 *subtuple*
625A part of the Tuple can be obtained by specifying the first and last index,
626separated by a colon in square brackets: >
627 :let shorttuple = mytuple[2:-1] " get Tuple (3, "four")
628
629Omitting the first index is similar to zero. Omitting the last index is
630similar to -1. >
631 :let endtuple = mytuple[2:] " from item 2 to the end: (3, "four")
632 :let shorttuple = mytuple[2:2] " Tuple with one item: (3,)
633 :let othertuple = mytuple[:] " make a copy of the Tuple
634
635Notice that the last index is inclusive. If you prefer using an exclusive
636index, use the |slice()| function.
637
638If the first index is beyond the last item of the Tuple or the last index is
639before the first item, the result is an empty tuple. There is no error
640message.
641
642If the last index is equal to or greater than the length of the tuple, the
643length minus one is used: >
644 :let mytuple = (0, 1, 2, 3)
645 :echo mytuple[2:8] " result: (2, 3)
646
647NOTE: mytuple[s:e] means using the variable "s:e" as index. Watch out for
648using a single letter variable before the ":". Insert a space when needed:
649mytuple[s : e].
650
651
652Tuple identity ~
653 *tuple-identity*
654When variable "aa" is a tuple and you assign it to another variable "bb", both
655variables refer to the same tuple: >
656 :let aa = (1, 2, 3)
657 :let bb = aa
658<
659
660Making a copy of a tuple is done with the |copy()| function. Using [:] also
661works, as explained above. This creates a shallow copy of the tuple: For
662example, changing a list item in the tuple will also change the item in the
663copied tuple: >
664 :let aa = ([1, 'a'], 2, 3)
665 :let bb = copy(aa)
666 :let aa[0][1] = 'aaa'
667 :echo aa
668< ([1, aaa], 2, 3) >
669 :echo bb
670< ([1, aaa], 2, 3)
671
672To make a completely independent tuple, use |deepcopy()|. This also makes a
673copy of the values in the tuple, recursively. Up to a hundred levels deep.
674
675The operator "is" can be used to check if two variables refer to the same
676Tuple. "isnot" does the opposite. In contrast, "==" compares if two tuples
677have the same value. >
678 :let atuple = (1, 2, 3)
679 :let btuple = (1, 2, 3)
680 :echo atuple is btuple
681< 0 >
682 :echo atuple == btuple
683< 1
684
685Note about comparing tuples: Two tuples are considered equal if they have the
686same length and all items compare equal, as with using "==". There is one
687exception: When comparing a number with a string they are considered
688different. There is no automatic type conversion, as with using "==" on
689variables. Example: >
690 echo 4 == "4"
691< 1 >
692 echo (4,) == ("4",)
693< 0
694
695Thus comparing Tuples is more strict than comparing numbers and strings. You
696can compare simple values this way too by putting them in a tuple: >
697
698 :let a = 5
699 :let b = "5"
700 :echo a == b
701< 1 >
702 :echo (a,) == (b,)
703< 0
704
705
706Tuple unpack ~
707
708To unpack the items in a tuple to individual variables, put the variables in
709square brackets, like list items: >
710 :let [var1, var2] = mytuple
711
712When the number of variables does not match the number of items in the tuple
713this produces an error. To handle any extra items from the tuple, append ";"
714and a variable name (which will then be of type tuple): >
715 :let [var1, var2; rest] = mytuple
716
717This works like: >
718 :let var1 = mytuple[0]
719 :let var2 = mytuple[1]
720 :let rest = mytuple[2:]
721
722Except that there is no error if there are only two items. "rest" will be an
723empty tuple then.
724
725
726Tuple functions ~
727 *E1536*
728Functions that are useful with a Tuple: >
729 :let xs = count(tuple, 'x') " count number of 'x's in tuple
730 :if empty(tuple) " check if tuple is empty
731 :let i = index(tuple, 'x') " index of first 'x' in tuple
732 :let l = items(tuple) " list of items in a tuple
733 :let string = join(tuple, ', ') " create string from tuple items
734 :let l = len(tuple) " number of items in tuple
735 :let big = max(tuple) " maximum value in tuple
736 :let small = min(tuple) " minimum value in tuple
737 :let r = repeat(tuple, n) " repeat a tuple n times
738 :let r = reverse(tuple) " reverse a tuple
739 :let s = slice(tuple, n1, n2) " slice a tuple
740 :let s = string(tuple) " String representation of tuple
741 :let l = tuple2list(tuple) " convert a tuple to list
742 :let t = list2tuple(list) " convert a list to tuple
743<
744 *E1524*
745A tuple cannot be used with the |map()|, |mapnew()| and |filter()| functions.
746
7471.5 Dictionaries ~
Bram Moolenaard8968242019-01-15 22:51:57 +0100748 *dict* *Dict* *Dictionaries* *Dictionary*
Bram Moolenaard8b02732005-01-14 21:48:43 +0000749A Dictionary is an associative array: Each entry has a key and a value. The
Bram Moolenaar3a3a7232005-01-17 22:16:15 +0000750entry can be located with the key. The entries are stored without a specific
751ordering.
Bram Moolenaard8b02732005-01-14 21:48:43 +0000752
753
754Dictionary creation ~
Bram Moolenaar3a3a7232005-01-17 22:16:15 +0000755 *E720* *E721* *E722* *E723*
Yegappan Lakshmanan9cb865e2025-03-23 16:42:16 +0100756A Dictionary is created with a comma-separated sequence of entries in curly
Bram Moolenaar3a3a7232005-01-17 22:16:15 +0000757braces. Each entry has a key and a value, separated by a colon. Each key can
758only appear once. Examples: >
Yegappan Lakshmanan9cb865e2025-03-23 16:42:16 +0100759 :let mydict = {'one': 1, 'two': 2, 'three': 3}
Bram Moolenaard8b02732005-01-14 21:48:43 +0000760 :let emptydict = {}
Bram Moolenaar3a3a7232005-01-17 22:16:15 +0000761< *E713* *E716* *E717*
Bram Moolenaard8b02732005-01-14 21:48:43 +0000762A key is always a String. You can use a Number, it will be converted to a
763String automatically. Thus the String '4' and the number 4 will find the same
Bram Moolenaar58b85342016-08-14 19:54:54 +0200764entry. Note that the String '04' and the Number 04 are different, since the
Bram Moolenaard899e512022-05-07 21:54:03 +0100765Number will be converted to the String '4', leading zeros are dropped. The
766empty string can also be used as a key.
Bram Moolenaar5da36052021-12-27 15:39:57 +0000767
Bram Moolenaard799daa2022-06-20 11:17:32 +0100768In |Vim9| script a literal key can be used if it consists only of alphanumeric
Bram Moolenaar5da36052021-12-27 15:39:57 +0000769characters, underscore and dash, see |vim9-literal-dict|.
Bram Moolenaar56c860c2019-08-17 20:09:31 +0200770 *literal-Dict* *#{}*
Bram Moolenaar5da36052021-12-27 15:39:57 +0000771To avoid having to put quotes around every key the #{} form can be used in
772legacy script. This does require the key to consist only of ASCII letters,
773digits, '-' and '_'. Example: >
Bram Moolenaar10455d42019-11-21 15:36:18 +0100774 :let mydict = #{zero: 0, one_key: 1, two-key: 2, 333: 3}
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200775Note that 333 here is the string "333". Empty keys are not possible with #{}.
Bram Moolenaard899e512022-05-07 21:54:03 +0100776In |Vim9| script the #{} form cannot be used because it can be confused with
777the start of a comment.
Bram Moolenaard8b02732005-01-14 21:48:43 +0000778
Bram Moolenaar58b85342016-08-14 19:54:54 +0200779A value can be any expression. Using a Dictionary for a value creates a
Bram Moolenaard8b02732005-01-14 21:48:43 +0000780nested Dictionary: >
781 :let nestdict = {1: {11: 'a', 12: 'b'}, 2: {21: 'c'}}
782
783An extra comma after the last entry is ignored.
784
785
786Accessing entries ~
787
788The normal way to access an entry is by putting the key in square brackets: >
Yegappan Lakshmanan9cb865e2025-03-23 16:42:16 +0100789 :let mydict = {'one': 1, 'two': 2, 'three': 3}
Bram Moolenaard8b02732005-01-14 21:48:43 +0000790 :let val = mydict["one"]
791 :let mydict["four"] = 4
Yegappan Lakshmanan9cb865e2025-03-23 16:42:16 +0100792 :let val = mydict.one
793 :let mydict.four = 4
Bram Moolenaard8b02732005-01-14 21:48:43 +0000794
Bram Moolenaar3a3a7232005-01-17 22:16:15 +0000795You can add new entries to an existing Dictionary this way, unlike Lists.
Bram Moolenaard8b02732005-01-14 21:48:43 +0000796
797For keys that consist entirely of letters, digits and underscore the following
798form can be used |expr-entry|: >
799 :let val = mydict.one
800 :let mydict.four = 4
801
802Since an entry can be any type, also a List and a Dictionary, the indexing and
803key lookup can be repeated: >
Bram Moolenaar3a3a7232005-01-17 22:16:15 +0000804 :echo dict.key[idx].key
Bram Moolenaard8b02732005-01-14 21:48:43 +0000805
806
807Dictionary to List conversion ~
808
Bram Moolenaar58b85342016-08-14 19:54:54 +0200809You may want to loop over the entries in a dictionary. For this you need to
Bram Moolenaard8b02732005-01-14 21:48:43 +0000810turn the Dictionary into a List and pass it to |:for|.
811
812Most often you want to loop over the keys, using the |keys()| function: >
813 :for key in keys(mydict)
Bram Moolenaarc51cf032022-02-26 12:25:45 +0000814 : echo key .. ': ' .. mydict[key]
Bram Moolenaard8b02732005-01-14 21:48:43 +0000815 :endfor
816
817The List of keys is unsorted. You may want to sort them first: >
818 :for key in sort(keys(mydict))
819
820To loop over the values use the |values()| function: >
821 :for v in values(mydict)
Bram Moolenaarc51cf032022-02-26 12:25:45 +0000822 : echo "value: " .. v
Bram Moolenaard8b02732005-01-14 21:48:43 +0000823 :endfor
824
825If you want both the key and the value use the |items()| function. It returns
Bram Moolenaard47d5222018-12-09 20:43:55 +0100826a List in which each item is a List with two items, the key and the value: >
Bram Moolenaaref2f6562007-05-06 13:32:59 +0000827 :for [key, value] in items(mydict)
Bram Moolenaarc51cf032022-02-26 12:25:45 +0000828 : echo key .. ': ' .. value
Bram Moolenaard8b02732005-01-14 21:48:43 +0000829 :endfor
830
831
832Dictionary identity ~
Bram Moolenaar7c626922005-02-07 22:01:03 +0000833 *dict-identity*
Bram Moolenaard8b02732005-01-14 21:48:43 +0000834Just like Lists you need to use |copy()| and |deepcopy()| to make a copy of a
835Dictionary. Otherwise, assignment results in referring to the same
836Dictionary: >
837 :let onedict = {'a': 1, 'b': 2}
838 :let adict = onedict
839 :let adict['a'] = 11
840 :echo onedict['a']
841 11
842
Bram Moolenaarf3bd51a2005-06-14 22:11:18 +0000843Two Dictionaries compare equal if all the key-value pairs compare equal. For
844more info see |list-identity|.
Bram Moolenaard8b02732005-01-14 21:48:43 +0000845
846
847Dictionary modification ~
848 *dict-modification*
849To change an already existing entry of a Dictionary, or to add a new entry,
850use |:let| this way: >
851 :let dict[4] = "four"
852 :let dict['one'] = item
853
Bram Moolenaar9cd15162005-01-16 22:02:49 +0000854Removing an entry from a Dictionary is done with |remove()| or |:unlet|.
855Three ways to remove the entry with key "aaa" from dict: >
856 :let i = remove(dict, 'aaa')
857 :unlet dict.aaa
858 :unlet dict['aaa']
Bram Moolenaard8b02732005-01-14 21:48:43 +0000859
860Merging a Dictionary with another is done with |extend()|: >
Bram Moolenaar3a3a7232005-01-17 22:16:15 +0000861 :call extend(adict, bdict)
862This extends adict with all entries from bdict. Duplicate keys cause entries
863in adict to be overwritten. An optional third argument can change this.
Bram Moolenaar383f9bc2005-01-19 22:18:32 +0000864Note that the order of entries in a Dictionary is irrelevant, thus don't
865expect ":echo adict" to show the items from bdict after the older entries in
866adict.
Bram Moolenaard8b02732005-01-14 21:48:43 +0000867
868Weeding out entries from a Dictionary can be done with |filter()|: >
Bram Moolenaaref2f6562007-05-06 13:32:59 +0000869 :call filter(dict, 'v:val =~ "x"')
Bram Moolenaar3a3a7232005-01-17 22:16:15 +0000870This removes all entries from "dict" with a value not matching 'x'.
Bram Moolenaar388a5d42020-05-26 21:20:45 +0200871This can also be used to remove all entries: >
872 call filter(dict, 0)
Bram Moolenaar2fda12f2005-01-15 22:14:15 +0000873
Bram Moolenaar86b48162022-12-06 18:20:10 +0000874In some situations it is not allowed to remove or add entries to a Dictionary.
875Especially when iterating over all the entries. You will get *E1313* or
876another error in that case.
877
Bram Moolenaar2fda12f2005-01-15 22:14:15 +0000878
879Dictionary function ~
Bram Moolenaar26402cb2013-02-20 21:26:00 +0100880 *Dictionary-function* *self* *E725* *E862*
Bram Moolenaar2fda12f2005-01-15 22:14:15 +0000881When a function is defined with the "dict" attribute it can be used in a
Bram Moolenaar58b85342016-08-14 19:54:54 +0200882special way with a dictionary. Example: >
Bram Moolenaar2fda12f2005-01-15 22:14:15 +0000883 :function Mylen() dict
Bram Moolenaar3a3a7232005-01-17 22:16:15 +0000884 : return len(self.data)
Bram Moolenaar2fda12f2005-01-15 22:14:15 +0000885 :endfunction
Bram Moolenaar3a3a7232005-01-17 22:16:15 +0000886 :let mydict = {'data': [0, 1, 2, 3], 'len': function("Mylen")}
887 :echo mydict.len()
Bram Moolenaar2fda12f2005-01-15 22:14:15 +0000888
889This is like a method in object oriented programming. The entry in the
890Dictionary is a |Funcref|. The local variable "self" refers to the dictionary
Bram Moolenaar86b48162022-12-06 18:20:10 +0000891the function was invoked from. When using |Vim9| script you can use classes
892and objects, see `:class`.
Bram Moolenaar2fda12f2005-01-15 22:14:15 +0000893
Bram Moolenaar3a3a7232005-01-17 22:16:15 +0000894It is also possible to add a function without the "dict" attribute as a
895Funcref to a Dictionary, but the "self" variable is not available then.
896
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000897 *numbered-function* *anonymous-function*
Bram Moolenaar2fda12f2005-01-15 22:14:15 +0000898To avoid the extra name for the function it can be defined and directly
899assigned to a Dictionary in this way: >
Bram Moolenaar3a3a7232005-01-17 22:16:15 +0000900 :let mydict = {'data': [0, 1, 2, 3]}
Bram Moolenaar5a5f4592015-04-13 12:43:06 +0200901 :function mydict.len()
Bram Moolenaar3a3a7232005-01-17 22:16:15 +0000902 : return len(self.data)
Bram Moolenaar2fda12f2005-01-15 22:14:15 +0000903 :endfunction
Bram Moolenaar3a3a7232005-01-17 22:16:15 +0000904 :echo mydict.len()
Bram Moolenaar2fda12f2005-01-15 22:14:15 +0000905
Bram Moolenaar3a3a7232005-01-17 22:16:15 +0000906The function will then get a number and the value of dict.len is a |Funcref|
Bram Moolenaar58b85342016-08-14 19:54:54 +0200907that references this function. The function can only be used through a
Bram Moolenaar3a3a7232005-01-17 22:16:15 +0000908|Funcref|. It will automatically be deleted when there is no |Funcref|
909remaining that refers to it.
910
911It is not necessary to use the "dict" attribute for a numbered function.
Bram Moolenaar2fda12f2005-01-15 22:14:15 +0000912
Bram Moolenaar1affd722010-08-04 17:49:30 +0200913If you get an error for a numbered function, you can find out what it is with
914a trick. Assuming the function is 42, the command is: >
Bram Moolenaar34cc7d82021-09-21 20:09:51 +0200915 :function g:42
Bram Moolenaar1affd722010-08-04 17:49:30 +0200916
Bram Moolenaar2fda12f2005-01-15 22:14:15 +0000917
918Functions for Dictionaries ~
Bram Moolenaar3a3a7232005-01-17 22:16:15 +0000919 *E715*
920Functions that can be used with a Dictionary: >
Bram Moolenaar2fda12f2005-01-15 22:14:15 +0000921 :if has_key(dict, 'foo') " TRUE if dict has entry with key "foo"
922 :if empty(dict) " TRUE if dict is empty
923 :let l = len(dict) " number of items in dict
924 :let big = max(dict) " maximum value in dict
925 :let small = min(dict) " minimum value in dict
926 :let xs = count(dict, 'x') " count nr of times 'x' appears in dict
927 :let s = string(dict) " String representation of dict
Bram Moolenaarc51cf032022-02-26 12:25:45 +0000928 :call map(dict, '">> " .. v:val') " prepend ">> " to each item
Bram Moolenaard8b02732005-01-14 21:48:43 +0000929
930
Yegappan Lakshmanan9cb865e2025-03-23 16:42:16 +01009311.6 Blobs ~
Bram Moolenaard8968242019-01-15 22:51:57 +0100932 *blob* *Blob* *Blobs* *E978*
Bram Moolenaaraff74912019-03-30 18:11:49 +0100933A Blob is a binary object. It can be used to read an image from a file and
934send it over a channel, for example.
935
936A Blob mostly behaves like a |List| of numbers, where each number has the
937value of an 8-bit byte, from 0 to 255.
Bram Moolenaard8968242019-01-15 22:51:57 +0100938
939
940Blob creation ~
941
942A Blob can be created with a |blob-literal|: >
943 :let b = 0zFF00ED015DAF
Bram Moolenaar0d17f0d2019-01-22 22:20:38 +0100944Dots can be inserted between bytes (pair of hex characters) for readability,
945they don't change the value: >
946 :let b = 0zFF00.ED01.5DAF
Bram Moolenaard8968242019-01-15 22:51:57 +0100947
948A blob can be read from a file with |readfile()| passing the {type} argument
949set to "B", for example: >
950 :let b = readfile('image.png', 'B')
951
952A blob can be read from a channel with the |ch_readblob()| function.
953
954
955Blob index ~
956 *blob-index* *E979*
957A byte in the Blob can be accessed by putting the index in square brackets
958after the Blob. Indexes are zero-based, thus the first byte has index zero. >
959 :let myblob = 0z00112233
960 :let byte = myblob[0] " get the first byte: 0x00
961 :let byte = myblob[2] " get the third byte: 0x22
962
963A negative index is counted from the end. Index -1 refers to the last byte in
964the Blob, -2 to the last but one byte, etc. >
965 :let last = myblob[-1] " get the last byte: 0x33
966
967To avoid an error for an invalid index use the |get()| function. When an item
968is not available it returns -1 or the default value you specify: >
969 :echo get(myblob, idx)
970 :echo get(myblob, idx, 999)
971
972
Bram Moolenaar5e66b422019-01-24 21:58:10 +0100973Blob iteration ~
974
975The |:for| loop executes commands for each byte of a Blob. The loop variable is
976set to each byte in the Blob. Example: >
977 :for byte in 0z112233
978 : call Doit(byte)
979 :endfor
980This calls Doit() with 0x11, 0x22 and 0x33.
981
982
Bram Moolenaard8968242019-01-15 22:51:57 +0100983Blob concatenation ~
zeertzjqb8170142024-02-08 11:21:44 +0100984 *blob-concatenation*
Bram Moolenaard8968242019-01-15 22:51:57 +0100985Two blobs can be concatenated with the "+" operator: >
986 :let longblob = myblob + 0z4455
zeertzjqb8170142024-02-08 11:21:44 +0100987 :let longblob = 0z4455 + myblob
988<
989A blob can be concatenated with another one in-place using |:let+=|: >
Bram Moolenaard8968242019-01-15 22:51:57 +0100990 :let myblob += 0z6677
zeertzjqb8170142024-02-08 11:21:44 +0100991<
992See |blob-modification| below for more about changing a blob in-place.
Bram Moolenaard8968242019-01-15 22:51:57 +0100993
994
995Part of a blob ~
996
997A part of the Blob can be obtained by specifying the first and last index,
998separated by a colon in square brackets: >
999 :let myblob = 0z00112233
Bram Moolenaard09091d2019-01-17 16:07:22 +01001000 :let shortblob = myblob[1:2] " get 0z1122
Bram Moolenaard8968242019-01-15 22:51:57 +01001001 :let shortblob = myblob[2:-1] " get 0z2233
1002
1003Omitting the first index is similar to zero. Omitting the last index is
1004similar to -1. >
1005 :let endblob = myblob[2:] " from item 2 to the end: 0z2233
1006 :let shortblob = myblob[2:2] " Blob with one byte: 0z22
1007 :let otherblob = myblob[:] " make a copy of the Blob
1008
Bram Moolenaard09091d2019-01-17 16:07:22 +01001009If the first index is beyond the last byte of the Blob or the second index is
Bram Moolenaaraa5df7e2019-02-03 14:53:10 +01001010before the first index, the result is an empty Blob. There is no error
Bram Moolenaard8968242019-01-15 22:51:57 +01001011message.
1012
1013If the second index is equal to or greater than the length of the list the
1014length minus one is used: >
1015 :echo myblob[2:8] " result: 0z2233
1016
1017
1018Blob modification ~
h-east08be9dd2024-12-23 10:11:25 +01001019 *blob-modification* *E1184*
Bram Moolenaard8968242019-01-15 22:51:57 +01001020To change a specific byte of a blob use |:let| this way: >
1021 :let blob[4] = 0x44
1022
1023When the index is just one beyond the end of the Blob, it is appended. Any
1024higher index is an error.
1025
1026To change a sequence of bytes the [:] notation can be used: >
1027 let blob[1:3] = 0z445566
Bram Moolenaard09091d2019-01-17 16:07:22 +01001028The length of the replaced bytes must be exactly the same as the value
Bram Moolenaard8968242019-01-15 22:51:57 +01001029provided. *E972*
1030
1031To change part of a blob you can specify the first and last byte to be
Bram Moolenaard09091d2019-01-17 16:07:22 +01001032modified. The value must have the same number of bytes in the range: >
1033 :let blob[3:5] = 0z334455
Bram Moolenaard8968242019-01-15 22:51:57 +01001034
zeertzjqb8170142024-02-08 11:21:44 +01001035To add items to a Blob in-place, you can use |:let+=| (|blob-concatenation|): >
1036 :let blobA = 0z1122
1037 :let blobA += 0z3344
1038<
1039When two variables refer to the same Blob, changing one Blob in-place will
1040cause the referenced Blob to be changed in-place: >
1041 :let blobA = 0z1122
1042 :let blobB = blobA
1043 :let blobB += 0z3344
1044 :echo blobA
1045 0z11223344
1046<
Bram Moolenaard8968242019-01-15 22:51:57 +01001047You can also use the functions |add()|, |remove()| and |insert()|.
1048
1049
1050Blob identity ~
1051
1052Blobs can be compared for equality: >
1053 if blob == 0z001122
1054And for equal identity: >
1055 if blob is otherblob
1056< *blob-identity* *E977*
1057When variable "aa" is a Blob and you assign it to another variable "bb", both
1058variables refer to the same Blob. Then the "is" operator returns true.
1059
1060When making a copy using [:] or |copy()| the values are the same, but the
1061identity is different: >
1062 :let blob = 0z112233
1063 :let blob2 = blob
1064 :echo blob == blob2
1065< 1 >
1066 :echo blob is blob2
1067< 1 >
1068 :let blob3 = blob[:]
1069 :echo blob == blob3
1070< 1 >
1071 :echo blob is blob3
1072< 0
1073
Bram Moolenaard09091d2019-01-17 16:07:22 +01001074Making a copy of a Blob is done with the |copy()| function. Using [:] also
Bram Moolenaard8968242019-01-15 22:51:57 +01001075works, as explained above.
1076
1077
Yegappan Lakshmanan9cb865e2025-03-23 16:42:16 +010010781.7 More about variables ~
Bram Moolenaar13065c42005-01-08 16:08:21 +00001079 *more-variables*
Bram Moolenaar071d4272004-06-13 20:20:40 +00001080If you need to know the type of a variable or expression, use the |type()|
1081function.
1082
1083When the '!' flag is included in the 'viminfo' option, global variables that
1084start with an uppercase letter, and don't contain a lowercase letter, are
1085stored in the viminfo file |viminfo-file|.
1086
1087When the 'sessionoptions' option contains "global", global variables that
1088start with an uppercase letter and contain at least one lowercase letter are
1089stored in the session file |session-file|.
1090
1091variable name can be stored where ~
1092my_var_6 not
1093My_Var_6 session file
1094MY_VAR_6 viminfo file
1095
1096
Bram Moolenaar5da36052021-12-27 15:39:57 +00001097In legacy script it is possible to form a variable name with curly braces, see
Bram Moolenaar071d4272004-06-13 20:20:40 +00001098|curly-braces-names|.
1099
1100==============================================================================
11012. Expression syntax *expression-syntax*
Bram Moolenaarf10911e2022-01-29 22:20:48 +00001102 *E1143*
Bram Moolenaar071d4272004-06-13 20:20:40 +00001103Expression syntax summary, from least to most significant:
1104
Bram Moolenaar50ba5262016-09-22 22:33:02 +02001105|expr1| expr2
Bram Moolenaar89bcfda2016-08-30 23:26:57 +02001106 expr2 ? expr1 : expr1 if-then-else
Bram Moolenaar071d4272004-06-13 20:20:40 +00001107
Bram Moolenaar89bcfda2016-08-30 23:26:57 +02001108|expr2| expr3
Bram Moolenaar0f248b02019-04-04 15:36:05 +02001109 expr3 || expr3 ... logical OR
Bram Moolenaar071d4272004-06-13 20:20:40 +00001110
Bram Moolenaar89bcfda2016-08-30 23:26:57 +02001111|expr3| expr4
Bram Moolenaar0f248b02019-04-04 15:36:05 +02001112 expr4 && expr4 ... logical AND
Bram Moolenaar071d4272004-06-13 20:20:40 +00001113
Bram Moolenaar89bcfda2016-08-30 23:26:57 +02001114|expr4| expr5
1115 expr5 == expr5 equal
Bram Moolenaar071d4272004-06-13 20:20:40 +00001116 expr5 != expr5 not equal
1117 expr5 > expr5 greater than
1118 expr5 >= expr5 greater than or equal
1119 expr5 < expr5 smaller than
1120 expr5 <= expr5 smaller than or equal
1121 expr5 =~ expr5 regexp matches
1122 expr5 !~ expr5 regexp doesn't match
1123
1124 expr5 ==? expr5 equal, ignoring case
1125 expr5 ==# expr5 equal, match case
1126 etc. As above, append ? for ignoring case, # for
1127 matching case
1128
Yegappan Lakshmanan9cb865e2025-03-23 16:42:16 +01001129 expr5 is expr5 same |List|, |Tuple|, |Dictionary| or |Blob|
Bram Moolenaar5e66b422019-01-24 21:58:10 +01001130 instance
Yegappan Lakshmanan9cb865e2025-03-23 16:42:16 +01001131 expr5 isnot expr5 different |List|, |Tuple|, |Dictionary| or
1132 |Blob| instance
Bram Moolenaarde8866b2005-01-06 23:24:37 +00001133
K.Takatac23fc362023-12-09 05:51:04 +09001134|expr5| expr6
1135 expr6 << expr6 bitwise left shift
Yegappan Lakshmanana061f342022-05-22 19:13:49 +01001136 expr6 >> expr6 bitwise right shift
Bram Moolenaar071d4272004-06-13 20:20:40 +00001137
Bram Moolenaar89bcfda2016-08-30 23:26:57 +02001138|expr6| expr7
Yegappan Lakshmanan9cb865e2025-03-23 16:42:16 +01001139 expr7 + expr7 ... number addition, list or tuple or blob
1140 concatenation
Yegappan Lakshmanana061f342022-05-22 19:13:49 +01001141 expr7 - expr7 ... number subtraction
1142 expr7 . expr7 ... string concatenation
1143 expr7 .. expr7 ... string concatenation
Bram Moolenaar071d4272004-06-13 20:20:40 +00001144
Bram Moolenaar89bcfda2016-08-30 23:26:57 +02001145|expr7| expr8
Yegappan Lakshmanana061f342022-05-22 19:13:49 +01001146 expr8 * expr8 ... number multiplication
1147 expr8 / expr8 ... number division
1148 expr8 % expr8 ... number modulo
Bram Moolenaar071d4272004-06-13 20:20:40 +00001149
Bram Moolenaar89bcfda2016-08-30 23:26:57 +02001150|expr8| expr9
Yegappan Lakshmanana061f342022-05-22 19:13:49 +01001151 <type>expr9 type check and conversion (|Vim9| only)
Bram Moolenaar2fda12f2005-01-15 22:14:15 +00001152
Bram Moolenaar5da36052021-12-27 15:39:57 +00001153|expr9| expr10
Yegappan Lakshmanana061f342022-05-22 19:13:49 +01001154 ! expr9 logical NOT
1155 - expr9 unary minus
1156 + expr9 unary plus
Bram Moolenaar5da36052021-12-27 15:39:57 +00001157
Yegappan Lakshmanana061f342022-05-22 19:13:49 +01001158|expr10| expr11
Yegappan Lakshmanan9cb865e2025-03-23 16:42:16 +01001159 expr10[expr1] byte of a String or item of a |List| or
1160 |Tuple|
Yegappan Lakshmanana061f342022-05-22 19:13:49 +01001161 expr10[expr1 : expr1] substring of a String or sublist of a |List|
Yegappan Lakshmanan9cb865e2025-03-23 16:42:16 +01001162 or a slice of a |Tuple|
Yegappan Lakshmanana061f342022-05-22 19:13:49 +01001163 expr10.name entry in a |Dictionary|
1164 expr10(expr1, ...) function call with |Funcref| variable
1165 expr10->name(expr1, ...) |method| call
1166
1167|expr11| number number constant
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00001168 "string" string constant, backslash is special
Bram Moolenaard8b02732005-01-14 21:48:43 +00001169 'string' string constant, ' is doubled
Bram Moolenaar32466aa2006-02-24 23:53:04 +00001170 [expr1, ...] |List|
Yegappan Lakshmanan9cb865e2025-03-23 16:42:16 +01001171 (expr1, ...) |Tuple|
Bram Moolenaar32466aa2006-02-24 23:53:04 +00001172 {expr1: expr1, ...} |Dictionary|
Bram Moolenaar5da36052021-12-27 15:39:57 +00001173 #{key: expr1, ...} legacy |Dictionary|
Bram Moolenaar071d4272004-06-13 20:20:40 +00001174 &option option value
1175 (expr1) nested expression
1176 variable internal variable
1177 va{ria}ble internal variable with curly braces
1178 $VAR environment variable
1179 @r contents of register 'r'
1180 function(expr1, ...) function call
1181 func{ti}on(expr1, ...) function call with curly braces
Bram Moolenaar5da36052021-12-27 15:39:57 +00001182 {args -> expr1} legacy lambda expression
1183 (args) => expr1 Vim9 lambda expression
Bram Moolenaar071d4272004-06-13 20:20:40 +00001184
1185
Bram Moolenaar0f248b02019-04-04 15:36:05 +02001186"..." indicates that the operations in this level can be concatenated.
Bram Moolenaar071d4272004-06-13 20:20:40 +00001187Example: >
1188 &nu || &list && &shell == "csh"
1189
1190All expressions within one level are parsed from left to right.
1191
Bram Moolenaarf10911e2022-01-29 22:20:48 +00001192Expression nesting is limited to 1000 levels deep (300 when build with MSVC)
1193to avoid running out of stack and crashing. *E1169*
1194
Bram Moolenaar071d4272004-06-13 20:20:40 +00001195
Bram Moolenaarc51cf032022-02-26 12:25:45 +00001196expr1 *expr1* *ternary* *falsy-operator* *??* *E109*
Bram Moolenaar071d4272004-06-13 20:20:40 +00001197-----
1198
Bram Moolenaarc51cf032022-02-26 12:25:45 +00001199The ternary operator: expr2 ? expr1 : expr1
Bram Moolenaar92f26c22020-10-03 20:17:30 +02001200The falsy operator: expr2 ?? expr1
1201
Bram Moolenaarc51cf032022-02-26 12:25:45 +00001202Ternary operator ~
Bram Moolenaar071d4272004-06-13 20:20:40 +00001203
Bram Moolenaar5da36052021-12-27 15:39:57 +00001204In legacy script the expression before the '?' is evaluated to a number. If
1205it evaluates to |TRUE|, the result is the value of the expression between the
1206'?' and ':', otherwise the result is the value of the expression after the
1207':'.
1208
1209In |Vim9| script the first expression must evaluate to a boolean, see
1210|vim9-boolean|.
1211
Bram Moolenaar071d4272004-06-13 20:20:40 +00001212Example: >
1213 :echo lnum == 1 ? "top" : lnum
1214
1215Since the first expression is an "expr2", it cannot contain another ?:. The
1216other two expressions can, thus allow for recursive use of ?:.
1217Example: >
1218 :echo lnum == 1 ? "top" : lnum == 1000 ? "last" : lnum
1219
1220To keep this readable, using |line-continuation| is suggested: >
1221 :echo lnum == 1
1222 :\ ? "top"
1223 :\ : lnum == 1000
1224 :\ ? "last"
1225 :\ : lnum
1226
Bram Moolenaaref2f6562007-05-06 13:32:59 +00001227You should always put a space before the ':', otherwise it can be mistaken for
1228use in a variable such as "a:1".
1229
Bram Moolenaar92f26c22020-10-03 20:17:30 +02001230Falsy operator ~
1231
1232This is also known as the "null coalescing operator", but that's too
1233complicated, thus we just call it the falsy operator.
1234
1235The expression before the '??' is evaluated. If it evaluates to
1236|truthy|, this is used as the result. Otherwise the expression after the '??'
1237is evaluated and used as the result. This is most useful to have a default
1238value for an expression that may result in zero or empty: >
1239 echo theList ?? 'list is empty'
1240 echo GetName() ?? 'unknown'
1241
1242These are similar, but not equal: >
1243 expr2 ?? expr1
1244 expr2 ? expr2 : expr1
Bram Moolenaar5da36052021-12-27 15:39:57 +00001245In the second line "expr2" is evaluated twice. And in |Vim9| script the type
1246of expr2 before "?" must be a boolean.
Bram Moolenaar92f26c22020-10-03 20:17:30 +02001247
Bram Moolenaar071d4272004-06-13 20:20:40 +00001248
1249expr2 and expr3 *expr2* *expr3*
1250---------------
1251
Bram Moolenaar04186092016-08-29 21:55:35 +02001252expr3 || expr3 .. logical OR *expr-barbar*
1253expr4 && expr4 .. logical AND *expr-&&*
1254
Bram Moolenaar5da36052021-12-27 15:39:57 +00001255The "||" and "&&" operators take one argument on each side.
Bram Moolenaar071d4272004-06-13 20:20:40 +00001256
Bram Moolenaar5da36052021-12-27 15:39:57 +00001257In legacy script the arguments are (converted to) Numbers.
1258
1259In |Vim9| script the values must be boolean, see |vim9-boolean|. Use "!!" to
1260convert any type to a boolean.
1261
1262The result is:
Bram Moolenaare381d3d2016-07-07 14:50:41 +02001263 input output ~
1264n1 n2 n1 || n2 n1 && n2 ~
1265|FALSE| |FALSE| |FALSE| |FALSE|
1266|FALSE| |TRUE| |TRUE| |FALSE|
1267|TRUE| |FALSE| |TRUE| |FALSE|
1268|TRUE| |TRUE| |TRUE| |TRUE|
Bram Moolenaar071d4272004-06-13 20:20:40 +00001269
1270The operators can be concatenated, for example: >
1271
1272 &nu || &list && &shell == "csh"
1273
1274Note that "&&" takes precedence over "||", so this has the meaning of: >
1275
1276 &nu || (&list && &shell == "csh")
1277
1278Once the result is known, the expression "short-circuits", that is, further
1279arguments are not evaluated. This is like what happens in C. For example: >
1280
1281 let a = 1
1282 echo a || b
1283
Bram Moolenaare381d3d2016-07-07 14:50:41 +02001284This is valid even if there is no variable called "b" because "a" is |TRUE|,
1285so the result must be |TRUE|. Similarly below: >
Bram Moolenaar071d4272004-06-13 20:20:40 +00001286
1287 echo exists("b") && b == "yes"
1288
1289This is valid whether "b" has been defined or not. The second clause will
1290only be evaluated if "b" has been defined.
1291
1292
Bram Moolenaara2baa732022-02-04 16:09:54 +00001293expr4 *expr4* *E1153*
Bram Moolenaar071d4272004-06-13 20:20:40 +00001294-----
1295
1296expr5 {cmp} expr5
1297
Bram Moolenaar5da36052021-12-27 15:39:57 +00001298Compare two expr5 expressions. In legacy script the result is a 0 if it
1299evaluates to false, or 1 if it evaluates to true. In |Vim9| script the result
1300is |true| or |false|.
Bram Moolenaar071d4272004-06-13 20:20:40 +00001301
Bram Moolenaar446cb832008-06-24 21:56:24 +00001302 *expr-==* *expr-!=* *expr->* *expr->=*
Bram Moolenaar071d4272004-06-13 20:20:40 +00001303 *expr-<* *expr-<=* *expr-=~* *expr-!~*
1304 *expr-==#* *expr-!=#* *expr->#* *expr->=#*
1305 *expr-<#* *expr-<=#* *expr-=~#* *expr-!~#*
1306 *expr-==?* *expr-!=?* *expr->?* *expr->=?*
1307 *expr-<?* *expr-<=?* *expr-=~?* *expr-!~?*
Bram Moolenaar251e1912011-06-19 05:09:16 +02001308 *expr-is* *expr-isnot* *expr-is#* *expr-isnot#*
Bram Moolenaar6f4754b2022-01-23 12:07:04 +00001309 *expr-is?* *expr-isnot?* *E1072*
Bram Moolenaar071d4272004-06-13 20:20:40 +00001310 use 'ignorecase' match case ignore case ~
1311equal == ==# ==?
1312not equal != !=# !=?
1313greater than > ># >?
1314greater than or equal >= >=# >=?
1315smaller than < <# <?
1316smaller than or equal <= <=# <=?
1317regexp matches =~ =~# =~?
1318regexp doesn't match !~ !~# !~?
Bram Moolenaar251e1912011-06-19 05:09:16 +02001319same instance is is# is?
1320different instance isnot isnot# isnot?
Bram Moolenaar071d4272004-06-13 20:20:40 +00001321
1322Examples:
1323"abc" ==# "Abc" evaluates to 0
1324"abc" ==? "Abc" evaluates to 1
1325"abc" == "Abc" evaluates to 1 if 'ignorecase' is set, 0 otherwise
Bram Moolenaar5da36052021-12-27 15:39:57 +00001326NOTE: In |Vim9| script 'ignorecase' is not used.
Bram Moolenaar071d4272004-06-13 20:20:40 +00001327
Yegappan Lakshmanan9cb865e2025-03-23 16:42:16 +01001328 *E691* *E692* *E1517* *E1518*
Bram Moolenaar01164a62017-11-02 22:58:42 +01001329A |List| can only be compared with a |List| and only "equal", "not equal",
1330"is" and "isnot" can be used. This compares the values of the list,
1331recursively. Ignoring case means case is ignored when comparing item values.
Yegappan Lakshmanan9cb865e2025-03-23 16:42:16 +01001332Same applies for a |Tuple|.
Bram Moolenaarde8866b2005-01-06 23:24:37 +00001333
Bram Moolenaar3a3a7232005-01-17 22:16:15 +00001334 *E735* *E736*
Bram Moolenaar32466aa2006-02-24 23:53:04 +00001335A |Dictionary| can only be compared with a |Dictionary| and only "equal", "not
Bram Moolenaar01164a62017-11-02 22:58:42 +01001336equal", "is" and "isnot" can be used. This compares the key/values of the
1337|Dictionary| recursively. Ignoring case means case is ignored when comparing
1338item values.
Bram Moolenaar3a3a7232005-01-17 22:16:15 +00001339
Bram Moolenaaraa3b15d2016-04-21 08:53:19 +02001340 *E694*
Bram Moolenaare18dbe82016-07-02 21:42:23 +02001341A |Funcref| can only be compared with a |Funcref| and only "equal", "not
1342equal", "is" and "isnot" can be used. Case is never ignored. Whether
1343arguments or a Dictionary are bound (with a partial) matters. The
1344Dictionaries must also be equal (or the same, in case of "is") and the
1345arguments must be equal (or the same).
1346
1347To compare Funcrefs to see if they refer to the same function, ignoring bound
1348Dictionary and arguments, use |get()| to get the function name: >
1349 if get(Part1, 'name') == get(Part2, 'name')
1350 " Part1 and Part2 refer to the same function
Bram Moolenaar6f4754b2022-01-23 12:07:04 +00001351< *E1037*
Yegappan Lakshmanan9cb865e2025-03-23 16:42:16 +01001352Using "is" or "isnot" with a |List|, |Tuple|, |Dictionary| or |Blob| checks
1353whether the expressions are referring to the same |List|, |Tuple|,
1354|Dictionary| or |Blob| instance. A copy of a |List| or |Tuple| is different
1355from the original |List| or |Tuple|. When using "is" without a |List|,
1356|Tuple|, |Dictionary| or |Blob|, it is equivalent to using "equal", using
1357"isnot" is equivalent to using "not equal". Except that a different type
1358means the values are different: >
Bram Moolenaar86edef62016-03-13 18:07:30 +01001359 echo 4 == '4'
1360 1
1361 echo 4 is '4'
1362 0
1363 echo 0 is []
1364 0
1365"is#"/"isnot#" and "is?"/"isnot?" can be used to match and ignore case.
Bram Moolenaare1f3fd12022-08-15 18:51:32 +01001366In |Vim9| script this doesn't work, two strings are never identical.
Bram Moolenaarde8866b2005-01-06 23:24:37 +00001367
Bram Moolenaar5da36052021-12-27 15:39:57 +00001368In legacy script, when comparing a String with a Number, the String is
1369converted to a Number, and the comparison is done on Numbers. This means
1370that: >
Bram Moolenaar86edef62016-03-13 18:07:30 +01001371 echo 0 == 'x'
1372 1
1373because 'x' converted to a Number is zero. However: >
1374 echo [0] == ['x']
1375 0
Yegappan Lakshmanan9cb865e2025-03-23 16:42:16 +01001376Inside a List or Tuple or Dictionary this conversion is not used.
Bram Moolenaar071d4272004-06-13 20:20:40 +00001377
Bram Moolenaar5da36052021-12-27 15:39:57 +00001378In |Vim9| script the types must match.
1379
Bram Moolenaar071d4272004-06-13 20:20:40 +00001380When comparing two Strings, this is done with strcmp() or stricmp(). This
1381results in the mathematical difference (comparing byte values), not
1382necessarily the alphabetical difference in the local language.
1383
Bram Moolenaar446cb832008-06-24 21:56:24 +00001384When using the operators with a trailing '#', or the short version and
Bram Moolenaaref2f6562007-05-06 13:32:59 +00001385'ignorecase' is off, the comparing is done with strcmp(): case matters.
Bram Moolenaar071d4272004-06-13 20:20:40 +00001386
1387When using the operators with a trailing '?', or the short version and
Bram Moolenaaref2f6562007-05-06 13:32:59 +00001388'ignorecase' is set, the comparing is done with stricmp(): case is ignored.
1389
1390'smartcase' is not used.
Bram Moolenaar071d4272004-06-13 20:20:40 +00001391
1392The "=~" and "!~" operators match the lefthand argument with the righthand
1393argument, which is used as a pattern. See |pattern| for what a pattern is.
1394This matching is always done like 'magic' was set and 'cpoptions' is empty, no
1395matter what the actual value of 'magic' or 'cpoptions' is. This makes scripts
1396portable. To avoid backslashes in the regexp pattern to be doubled, use a
1397single-quote string, see |literal-string|.
1398Since a string is considered to be a single line, a multi-line pattern
1399(containing \n, backslash-n) will not match. However, a literal NL character
1400can be matched like an ordinary character. Examples:
1401 "foo\nbar" =~ "\n" evaluates to 1
1402 "foo\nbar" =~ "\\n" evaluates to 0
1403
1404
Yegappan Lakshmanana061f342022-05-22 19:13:49 +01001405expr5 *expr5* *bitwise-shift*
1406-----
1407expr6 << expr6 bitwise left shift *expr-<<*
1408expr6 >> expr6 bitwise right shift *expr->>*
1409 *E1282* *E1283*
1410The "<<" and ">>" operators can be used to perform bitwise left or right shift
1411of the left operand by the number of bits specified by the right operand. The
Bram Moolenaar338bf582022-05-22 20:16:32 +01001412operands are used as positive numbers. When shifting right with ">>" the
Bram Moolenaard592deb2022-06-17 15:42:40 +01001413topmost bit (sometimes called the sign bit) is cleared. If the right operand
Bram Moolenaar338bf582022-05-22 20:16:32 +01001414(shift amount) is more than the maximum number of bits in a number
1415(|v:numbersize|) the result is zero.
Bram Moolenaar071d4272004-06-13 20:20:40 +00001416
Yegappan Lakshmanana061f342022-05-22 19:13:49 +01001417
1418expr6 and expr7 *expr6* *expr7* *E1036* *E1051*
1419---------------
Yegappan Lakshmanan9cb865e2025-03-23 16:42:16 +01001420 *expr-+*
1421expr7 + expr7 Number addition, |List| or |Tuple| or |Blob| concatenation
Yegappan Lakshmanana061f342022-05-22 19:13:49 +01001422expr7 - expr7 Number subtraction *expr--*
1423expr7 . expr7 String concatenation *expr-.*
1424expr7 .. expr7 String concatenation *expr-..*
1425
1426For |Lists| only "+" is possible and then both expr7 must be a list. The
Yegappan Lakshmanan9cb865e2025-03-23 16:42:16 +01001427result is a new list with the two lists concatenated. Same for a |Tuple|.
Bram Moolenaarde8866b2005-01-06 23:24:37 +00001428
Bram Moolenaar0f248b02019-04-04 15:36:05 +02001429For String concatenation ".." is preferred, since "." is ambiguous, it is also
1430used for |Dict| member access and floating point numbers.
Bram Moolenaar5da36052021-12-27 15:39:57 +00001431In |Vim9| script and when |vimscript-version| is 2 or higher, using "." is not
1432allowed.
1433
1434In |Vim9| script the arguments of ".." are converted to String for simple
1435types: Number, Float, Special and Bool. For other types |string()| should be
1436used.
Bram Moolenaar0f248b02019-04-04 15:36:05 +02001437
Yegappan Lakshmanana061f342022-05-22 19:13:49 +01001438expr8 * expr8 Number multiplication *expr-star*
1439expr8 / expr8 Number division *expr-/*
1440expr8 % expr8 Number modulo *expr-%*
Bram Moolenaar071d4272004-06-13 20:20:40 +00001441
Bram Moolenaar5da36052021-12-27 15:39:57 +00001442In legacy script, for all operators except "." and "..", Strings are converted
1443to Numbers.
1444
Bram Moolenaard6e256c2011-12-14 15:32:50 +01001445For bitwise operators see |and()|, |or()| and |xor()|.
Bram Moolenaar071d4272004-06-13 20:20:40 +00001446
Bram Moolenaar5da36052021-12-27 15:39:57 +00001447Note the difference between "+" and ".." in legacy script:
Bram Moolenaar071d4272004-06-13 20:20:40 +00001448 "123" + "456" = 579
Bram Moolenaar5da36052021-12-27 15:39:57 +00001449 "123" .. "456" = "123456"
Bram Moolenaar071d4272004-06-13 20:20:40 +00001450
Bram Moolenaar5da36052021-12-27 15:39:57 +00001451Since '..' has the same precedence as '+' and '-', you need to read: >
1452 1 .. 90 + 90.0
Bram Moolenaar446cb832008-06-24 21:56:24 +00001453As: >
Bram Moolenaar5da36052021-12-27 15:39:57 +00001454 (1 .. 90) + 90.0
1455That works in legacy script, since the String "190" is automatically converted
1456to the Number 190, which can be added to the Float 90.0. However: >
1457 1 .. 90 * 90.0
Bram Moolenaar446cb832008-06-24 21:56:24 +00001458Should be read as: >
Bram Moolenaar5da36052021-12-27 15:39:57 +00001459 1 .. (90 * 90.0)
1460Since '..' has lower precedence than '*'. This does NOT work, since this
Bram Moolenaar446cb832008-06-24 21:56:24 +00001461attempts to concatenate a Float and a String.
1462
1463When dividing a Number by zero the result depends on the value:
1464 0 / 0 = -0x80000000 (like NaN for Float)
1465 >0 / 0 = 0x7fffffff (like positive infinity)
1466 <0 / 0 = -0x7fffffff (like negative infinity)
1467 (before Vim 7.2 it was always 0x7fffffff)
Bram Moolenaara2baa732022-02-04 16:09:54 +00001468In |Vim9| script dividing a number by zero is an error. *E1154*
Bram Moolenaar446cb832008-06-24 21:56:24 +00001469
Bram Moolenaar22fcfad2016-07-01 18:17:26 +02001470When 64-bit Number support is enabled:
1471 0 / 0 = -0x8000000000000000 (like NaN for Float)
1472 >0 / 0 = 0x7fffffffffffffff (like positive infinity)
1473 <0 / 0 = -0x7fffffffffffffff (like negative infinity)
1474
Bram Moolenaar071d4272004-06-13 20:20:40 +00001475When the righthand side of '%' is zero, the result is 0.
1476
Bram Moolenaar32466aa2006-02-24 23:53:04 +00001477None of these work for |Funcref|s.
Bram Moolenaarde8866b2005-01-06 23:24:37 +00001478
Bram Moolenaar6f4754b2022-01-23 12:07:04 +00001479".", ".." and "%" do not work for Float. *E804* *E1035*
Bram Moolenaar446cb832008-06-24 21:56:24 +00001480
Bram Moolenaar071d4272004-06-13 20:20:40 +00001481
Yegappan Lakshmanana061f342022-05-22 19:13:49 +01001482expr8 *expr8*
Bram Moolenaar071d4272004-06-13 20:20:40 +00001483-----
Yegappan Lakshmanana061f342022-05-22 19:13:49 +01001484<type>expr9
Bram Moolenaar5da36052021-12-27 15:39:57 +00001485
1486This is only available in |Vim9| script, see |type-casting|.
1487
1488
Yegappan Lakshmanana061f342022-05-22 19:13:49 +01001489expr9 *expr9*
Bram Moolenaar5da36052021-12-27 15:39:57 +00001490-----
Yegappan Lakshmanana061f342022-05-22 19:13:49 +01001491! expr9 logical NOT *expr-!*
1492- expr9 unary minus *expr-unary--*
1493+ expr9 unary plus *expr-unary-+*
Bram Moolenaar071d4272004-06-13 20:20:40 +00001494
Bram Moolenaare381d3d2016-07-07 14:50:41 +02001495For '!' |TRUE| becomes |FALSE|, |FALSE| becomes |TRUE| (one).
Bram Moolenaar071d4272004-06-13 20:20:40 +00001496For '-' the sign of the number is changed.
Bram Moolenaar6f02b002021-01-10 20:22:54 +01001497For '+' the number is unchanged. Note: "++" has no effect.
Bram Moolenaar071d4272004-06-13 20:20:40 +00001498
Bram Moolenaar5da36052021-12-27 15:39:57 +00001499In legacy script a String will be converted to a Number first. Note that if
1500the string does not start with a digit you likely don't get what you expect.
1501
1502In |Vim9| script an error is given when "-" or "+" is used and the type is not
1503a number.
1504
1505In |Vim9| script "!" can be used for any type and the result is always a
1506boolean. Use "!!" to convert any type to a boolean, according to whether the
1507value is |falsy|.
Bram Moolenaar071d4272004-06-13 20:20:40 +00001508
Bram Moolenaar58b85342016-08-14 19:54:54 +02001509These three can be repeated and mixed. Examples:
Bram Moolenaar071d4272004-06-13 20:20:40 +00001510 !-1 == 0
1511 !!8 == 1
1512 --9 == 9
1513
1514
Yegappan Lakshmanana061f342022-05-22 19:13:49 +01001515expr10 *expr10*
1516------
1517This expression is either |expr11| or a sequence of the alternatives below,
Bram Moolenaarfc65cab2018-08-28 22:58:02 +02001518in any order. E.g., these are all possible:
Yegappan Lakshmanana061f342022-05-22 19:13:49 +01001519 expr10[expr1].name
1520 expr10.name[expr1]
1521 expr10(expr1, ...)[expr1].name
1522 expr10->(expr1, ...)[expr1]
Bram Moolenaarac92e252019-08-03 21:58:38 +02001523Evaluation is always from left to right.
Bram Moolenaarfc65cab2018-08-28 22:58:02 +02001524
Yegappan Lakshmanan9cb865e2025-03-23 16:42:16 +01001525 *expr-[]* *E111*
1526expr10[expr1] item of String or |List| or |Tuple|
Bram Moolenaar6f4754b2022-01-23 12:07:04 +00001527 *E909* *subscript* *E1062*
Bram Moolenaare3c37d82020-08-15 18:39:05 +02001528In legacy Vim script:
Yegappan Lakshmanana061f342022-05-22 19:13:49 +01001529If expr10 is a Number or String this results in a String that contains the
1530expr1'th single byte from expr10. expr10 is used as a String (a number is
Bram Moolenaare3c37d82020-08-15 18:39:05 +02001531automatically converted to a String), expr1 as a Number. This doesn't
Bram Moolenaar207f0092020-08-30 17:20:20 +02001532recognize multibyte encodings, see `byteidx()` for an alternative, or use
Bram Moolenaare3c37d82020-08-15 18:39:05 +02001533`split()` to turn the string into a list of characters. Example, to get the
1534byte under the cursor: >
Bram Moolenaar61660ea2006-04-07 21:40:07 +00001535 :let c = getline(".")[col(".") - 1]
Bram Moolenaar071d4272004-06-13 20:20:40 +00001536
Bram Moolenaara2baa732022-02-04 16:09:54 +00001537In |Vim9| script: *E1147* *E1148*
Yegappan Lakshmanana061f342022-05-22 19:13:49 +01001538If expr10 is a String this results in a String that contains the expr1'th
1539single character (including any composing characters) from expr10. To use byte
Bram Moolenaar02b4d9b2021-03-14 19:46:45 +01001540indexes use |strpart()|.
Bram Moolenaare3c37d82020-08-15 18:39:05 +02001541
1542Index zero gives the first byte or character. Careful: text column numbers
1543start with one!
1544
Bram Moolenaar071d4272004-06-13 20:20:40 +00001545If the length of the String is less than the index, the result is an empty
Bram Moolenaar85084ef2016-01-17 22:26:33 +01001546String. A negative index always results in an empty string (reason: backward
Bram Moolenaare3c37d82020-08-15 18:39:05 +02001547compatibility). Use [-1:] to get the last byte or character.
Bram Moolenaar6f02b002021-01-10 20:22:54 +01001548In Vim9 script a negative index is used like with a list: count from the end.
Bram Moolenaard7ee7ce2005-01-03 21:02:03 +00001549
Yegappan Lakshmanana061f342022-05-22 19:13:49 +01001550If expr10 is a |List| then it results the item at index expr1. See |list-index|
Bram Moolenaard7ee7ce2005-01-03 21:02:03 +00001551for possible index values. If the index is out of range this results in an
Bram Moolenaar58b85342016-08-14 19:54:54 +02001552error. Example: >
Bram Moolenaard7ee7ce2005-01-03 21:02:03 +00001553 :let item = mylist[-1] " get last item
1554
Bram Moolenaar32466aa2006-02-24 23:53:04 +00001555Generally, if a |List| index is equal to or higher than the length of the
1556|List|, or more negative than the length of the |List|, this results in an
1557error.
Bram Moolenaard7ee7ce2005-01-03 21:02:03 +00001558
Yegappan Lakshmanan9cb865e2025-03-23 16:42:16 +01001559A |Tuple| index is similar to a |List| index as explained above.
1560
Bram Moolenaard8b02732005-01-14 21:48:43 +00001561
Bram Moolenaar8a3b8052022-06-26 12:21:15 +01001562expr10[expr1a : expr1b] substring or |sublist| *expr-[:]* *substring*
Bram Moolenaard7ee7ce2005-01-03 21:02:03 +00001563
Yegappan Lakshmanana061f342022-05-22 19:13:49 +01001564If expr10 is a String this results in the substring with the bytes or
1565characters from expr1a to and including expr1b. expr10 is used as a String,
Bram Moolenaar207f0092020-08-30 17:20:20 +02001566expr1a and expr1b are used as a Number.
Bram Moolenaare3c37d82020-08-15 18:39:05 +02001567
1568In legacy Vim script the indexes are byte indexes. This doesn't recognize
Yegappan Lakshmanana061f342022-05-22 19:13:49 +01001569multibyte encodings, see |byteidx()| for computing the indexes. If expr10 is
Bram Moolenaare3c37d82020-08-15 18:39:05 +02001570a Number it is first converted to a String.
1571
Bram Moolenaar02b4d9b2021-03-14 19:46:45 +01001572In Vim9 script the indexes are character indexes and include composing
1573characters. To use byte indexes use |strpart()|. To use character indexes
1574without including composing characters use |strcharpart()|.
Bram Moolenaard7ee7ce2005-01-03 21:02:03 +00001575
Bram Moolenaar6601b622021-01-13 21:47:15 +01001576The item at index expr1b is included, it is inclusive. For an exclusive index
1577use the |slice()| function.
1578
Bram Moolenaard7ee7ce2005-01-03 21:02:03 +00001579If expr1a is omitted zero is used. If expr1b is omitted the length of the
1580string minus one is used.
1581
1582A negative number can be used to measure from the end of the string. -1 is
1583the last character, -2 the last but one, etc.
1584
1585If an index goes out of range for the string characters are omitted. If
1586expr1b is smaller than expr1a the result is an empty string.
1587
1588Examples: >
1589 :let c = name[-1:] " last byte of a string
Bram Moolenaar207f0092020-08-30 17:20:20 +02001590 :let c = name[0:-1] " the whole string
Bram Moolenaard7ee7ce2005-01-03 21:02:03 +00001591 :let c = name[-2:-2] " last but one byte of a string
1592 :let s = line(".")[4:] " from the fifth byte to the end
1593 :let s = s[:-3] " remove last two bytes
Bram Moolenaar8f3f58f2010-01-06 20:52:26 +01001594<
Bram Moolenaarbc8801c2016-08-02 21:04:33 +02001595 *slice*
Yegappan Lakshmanana061f342022-05-22 19:13:49 +01001596If expr10 is a |List| this results in a new |List| with the items indicated by
Bram Moolenaar58b85342016-08-14 19:54:54 +02001597the indexes expr1a and expr1b. This works like with a String, as explained
Bram Moolenaarbc8801c2016-08-02 21:04:33 +02001598just above. Also see |sublist| below. Examples: >
Bram Moolenaard7ee7ce2005-01-03 21:02:03 +00001599 :let l = mylist[:3] " first four items
1600 :let l = mylist[4:4] " List with one item
1601 :let l = mylist[:] " shallow copy of a List
Yegappan Lakshmanan9cb865e2025-03-23 16:42:16 +01001602A |Tuple| slice is similar to a |List| slice.
Bram Moolenaard7ee7ce2005-01-03 21:02:03 +00001603
Yegappan Lakshmanana061f342022-05-22 19:13:49 +01001604If expr10 is a |Blob| this results in a new |Blob| with the bytes in the
Bram Moolenaar6e5ea8d2019-01-12 22:47:31 +01001605indexes expr1a and expr1b, inclusive. Examples: >
1606 :let b = 0zDEADBEEF
1607 :let bs = b[1:2] " 0zADBE
Bram Moolenaard09091d2019-01-17 16:07:22 +01001608 :let bs = b[:] " copy of 0zDEADBEEF
Bram Moolenaar6e5ea8d2019-01-12 22:47:31 +01001609
Yegappan Lakshmanana061f342022-05-22 19:13:49 +01001610Using expr10[expr1] or expr10[expr1a : expr1b] on a |Funcref| results in an
Bram Moolenaar32466aa2006-02-24 23:53:04 +00001611error.
Bram Moolenaar071d4272004-06-13 20:20:40 +00001612
Bram Moolenaarda440d22016-01-16 21:27:23 +01001613Watch out for confusion between a namespace and a variable followed by a colon
1614for a sublist: >
1615 mylist[n:] " uses variable n
1616 mylist[s:] " uses namespace s:, error!
1617
Bram Moolenaard8b02732005-01-14 21:48:43 +00001618
Yegappan Lakshmanana061f342022-05-22 19:13:49 +01001619expr10.name entry in a |Dictionary| *expr-entry*
Bram Moolenaara2baa732022-02-04 16:09:54 +00001620 *E1203* *E1229*
Yegappan Lakshmanana061f342022-05-22 19:13:49 +01001621If expr10 is a |Dictionary| and it is followed by a dot, then the following
Bram Moolenaar32466aa2006-02-24 23:53:04 +00001622name will be used as a key in the |Dictionary|. This is just like:
Yegappan Lakshmanana061f342022-05-22 19:13:49 +01001623expr10[name].
Bram Moolenaard8b02732005-01-14 21:48:43 +00001624
1625The name must consist of alphanumeric characters, just like a variable name,
1626but it may start with a number. Curly braces cannot be used.
1627
1628There must not be white space before or after the dot.
1629
1630Examples: >
1631 :let dict = {"one": 1, 2: "two"}
Bram Moolenaar68e65602019-05-26 21:33:31 +02001632 :echo dict.one " shows "1"
1633 :echo dict.2 " shows "two"
1634 :echo dict .2 " error because of space before the dot
Bram Moolenaard8b02732005-01-14 21:48:43 +00001635
1636Note that the dot is also used for String concatenation. To avoid confusion
1637always put spaces around the dot for String concatenation.
1638
1639
Bram Moolenaar938ae282023-02-20 20:44:55 +00001640expr10(expr1, ...) |Funcref| function call *E1085*
Bram Moolenaar2fda12f2005-01-15 22:14:15 +00001641
Yegappan Lakshmanana061f342022-05-22 19:13:49 +01001642When expr10 is a |Funcref| type variable, invoke the function it refers to.
Bram Moolenaar2fda12f2005-01-15 22:14:15 +00001643
1644
Yegappan Lakshmanana061f342022-05-22 19:13:49 +01001645expr10->name([args]) method call *method* *->*
1646expr10->{lambda}([args])
Bram Moolenaara2baa732022-02-04 16:09:54 +00001647 *E260* *E276* *E1265*
Bram Moolenaar25e42232019-08-04 15:04:10 +02001648For methods that are also available as global functions this is the same as: >
Yegappan Lakshmanana061f342022-05-22 19:13:49 +01001649 name(expr10 [, args])
1650There can also be methods specifically for the type of "expr10".
Bram Moolenaar2fda12f2005-01-15 22:14:15 +00001651
Bram Moolenaar51841322019-08-08 21:10:01 +02001652This allows for chaining, passing the value that one method returns to the
1653next method: >
Bram Moolenaar25e42232019-08-04 15:04:10 +02001654 mylist->filter(filterexpr)->map(mapexpr)->sort()->join()
1655<
Bram Moolenaar22a0c0c2019-08-09 23:25:08 +02001656Example of using a lambda: >
Bram Moolenaar02b31112019-08-31 22:16:38 +02001657 GetPercentage()->{x -> x * 100}()->printf('%d%%')
Bram Moolenaar56c860c2019-08-17 20:09:31 +02001658<
Yegappan Lakshmanana061f342022-05-22 19:13:49 +01001659When using -> the |expr9| operators will be applied first, thus: >
Bram Moolenaar93cf85f2019-08-17 21:36:28 +02001660 -1.234->string()
1661Is equivalent to: >
1662 (-1.234)->string()
1663And NOT: >
1664 -(1.234->string())
Bram Moolenaar6f4754b2022-01-23 12:07:04 +00001665
1666What comes after "->" can be a name, a simple expression (not containing any
Bram Moolenaar944697a2022-02-20 19:48:20 +00001667parenthesis), or any expression in parentheses: >
Bram Moolenaar6f4754b2022-01-23 12:07:04 +00001668 base->name(args)
1669 base->some.name(args)
1670 base->alist[idx](args)
1671 base->(getFuncRef())(args)
1672Note that in the last call the base is passed to the function resulting from
Bram Moolenaar2ecbe532022-07-29 21:36:21 +01001673"(getFuncRef())", inserted before "args". *E1275*
Bram Moolenaar6f4754b2022-01-23 12:07:04 +00001674
Bram Moolenaar51841322019-08-08 21:10:01 +02001675 *E274*
1676"->name(" must not contain white space. There can be white space before the
1677"->" and after the "(", thus you can split the lines like this: >
1678 mylist
1679 \ ->filter(filterexpr)
1680 \ ->map(mapexpr)
1681 \ ->sort()
1682 \ ->join()
Bram Moolenaar56c860c2019-08-17 20:09:31 +02001683
1684When using the lambda form there must be no white space between the } and the
1685(.
1686
Bram Moolenaar25e42232019-08-04 15:04:10 +02001687
Yegappan Lakshmanana061f342022-05-22 19:13:49 +01001688 *expr11*
Bram Moolenaar071d4272004-06-13 20:20:40 +00001689number
1690------
Bram Moolenaarb0d45e72017-11-05 18:19:24 +01001691number number constant *expr-number*
Bram Moolenaar071d4272004-06-13 20:20:40 +00001692
Bram Moolenaar6f02b002021-01-10 20:22:54 +01001693 *0x* *hex-number* *0o* *octal-number* *binary-number*
Bram Moolenaar7571d552016-08-18 22:54:46 +02001694Decimal, Hexadecimal (starting with 0x or 0X), Binary (starting with 0b or 0B)
Bram Moolenaarc17e66c2020-06-02 21:38:22 +02001695and Octal (starting with 0, 0o or 0O).
Bram Moolenaar071d4272004-06-13 20:20:40 +00001696
Bram Moolenaar338bf582022-05-22 20:16:32 +01001697Assuming 64 bit numbers are used (see |v:numbersize|) an unsigned number is
1698truncated to 0x7fffffffffffffff or 9223372036854775807. You can use -1 to get
16990xffffffffffffffff.
1700
Bram Moolenaar446cb832008-06-24 21:56:24 +00001701 *floating-point-format*
1702Floating point numbers can be written in two forms:
1703
1704 [-+]{N}.{M}
Bram Moolenaar8a94d872015-01-25 13:02:57 +01001705 [-+]{N}.{M}[eE][-+]{exp}
Bram Moolenaar446cb832008-06-24 21:56:24 +00001706
1707{N} and {M} are numbers. Both {N} and {M} must be present and can only
Bram Moolenaar6aa57292021-08-14 21:25:52 +02001708contain digits, except that in |Vim9| script in {N} single quotes between
1709digits are ignored.
Bram Moolenaar446cb832008-06-24 21:56:24 +00001710[-+] means there is an optional plus or minus sign.
1711{exp} is the exponent, power of 10.
Bram Moolenaar58b85342016-08-14 19:54:54 +02001712Only a decimal point is accepted, not a comma. No matter what the current
Bram Moolenaar446cb832008-06-24 21:56:24 +00001713locale is.
Bram Moolenaar446cb832008-06-24 21:56:24 +00001714
1715Examples:
1716 123.456
1717 +0.0001
1718 55.0
1719 -0.123
1720 1.234e03
1721 1.0E-6
1722 -3.1416e+88
1723
1724These are INVALID:
1725 3. empty {M}
1726 1e40 missing .{M}
1727
1728Rationale:
1729Before floating point was introduced, the text "123.456" was interpreted as
1730the two numbers "123" and "456", both converted to a string and concatenated,
1731resulting in the string "123456". Since this was considered pointless, and we
Bram Moolenaare37d50a2008-08-06 17:06:04 +00001732could not find it intentionally being used in Vim scripts, this backwards
Bram Moolenaar446cb832008-06-24 21:56:24 +00001733incompatibility was accepted in favor of being able to use the normal notation
1734for floating point numbers.
1735
Bram Moolenaard47d5222018-12-09 20:43:55 +01001736 *float-pi* *float-e*
1737A few useful values to copy&paste: >
1738 :let pi = 3.14159265359
1739 :let e = 2.71828182846
1740Or, if you don't want to write them in as floating-point literals, you can
1741also use functions, like the following: >
1742 :let pi = acos(-1.0)
1743 :let e = exp(1.0)
Bram Moolenaar98aefe72018-12-13 22:20:09 +01001744<
Bram Moolenaar446cb832008-06-24 21:56:24 +00001745 *floating-point-precision*
1746The precision and range of floating points numbers depends on what "double"
1747means in the library Vim was compiled with. There is no way to change this at
1748runtime.
1749
1750The default for displaying a |Float| is to use 6 decimal places, like using
1751printf("%g", f). You can select something else when using the |printf()|
1752function. Example: >
1753 :echo printf('%.15e', atan(1))
1754< 7.853981633974483e-01
1755
1756
Bram Moolenaar071d4272004-06-13 20:20:40 +00001757
Bram Moolenaar979243b2015-06-26 19:35:49 +02001758string *string* *String* *expr-string* *E114*
Bram Moolenaar071d4272004-06-13 20:20:40 +00001759------
1760"string" string constant *expr-quote*
1761
1762Note that double quotes are used.
1763
1764A string constant accepts these special characters:
1765\... three-digit octal number (e.g., "\316")
1766\.. two-digit octal number (must be followed by non-digit)
1767\. one-digit octal number (must be followed by non-digit)
1768\x.. byte specified with two hex numbers (e.g., "\x1f")
1769\x. byte specified with one hex number (must be followed by non-hex char)
1770\X.. same as \x..
1771\X. same as \x.
Bram Moolenaar446cb832008-06-24 21:56:24 +00001772\u.... character specified with up to 4 hex numbers, stored according to the
Bram Moolenaar071d4272004-06-13 20:20:40 +00001773 current value of 'encoding' (e.g., "\u02a4")
Bram Moolenaar541f92d2015-06-19 13:27:23 +02001774\U.... same as \u but allows up to 8 hex numbers.
Bram Moolenaar071d4272004-06-13 20:20:40 +00001775\b backspace <BS>
1776\e escape <Esc>
Bram Moolenaar6e649222021-10-04 21:32:54 +01001777\f formfeed 0x0C
Bram Moolenaar071d4272004-06-13 20:20:40 +00001778\n newline <NL>
1779\r return <CR>
1780\t tab <Tab>
1781\\ backslash
1782\" double quote
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001783\<xxx> Special key named "xxx". e.g. "\<C-W>" for CTRL-W. This is for use
Bram Moolenaar58b85342016-08-14 19:54:54 +02001784 in mappings, the 0x80 byte is escaped.
1785 To use the double quote character it must be escaped: "<M-\">".
Bram Moolenaar6e649222021-10-04 21:32:54 +01001786 Don't use <Char-xxxx> to get a UTF-8 character, use \uxxxx as
Bram Moolenaar58b85342016-08-14 19:54:54 +02001787 mentioned above.
Bram Moolenaarfccd93f2020-05-31 22:06:51 +02001788\<*xxx> Like \<xxx> but prepends a modifier instead of including it in the
1789 character. E.g. "\<C-w>" is one character 0x17 while "\<*C-w>" is four
Bram Moolenaarebe9d342020-05-30 21:52:54 +02001790 bytes: 3 for the CTRL modifier and then character "W".
Bram Moolenaar071d4272004-06-13 20:20:40 +00001791
Bram Moolenaaref2f6562007-05-06 13:32:59 +00001792Note that "\xff" is stored as the byte 255, which may be invalid in some
1793encodings. Use "\u00ff" to store character 255 according to the current value
1794of 'encoding'.
1795
Bram Moolenaar071d4272004-06-13 20:20:40 +00001796Note that "\000" and "\x00" force the end of the string.
1797
1798
Bram Moolenaard8968242019-01-15 22:51:57 +01001799blob-literal *blob-literal* *E973*
Bram Moolenaar6e5ea8d2019-01-12 22:47:31 +01001800------------
1801
1802Hexadecimal starting with 0z or 0Z, with an arbitrary number of bytes.
1803The sequence must be an even number of hex characters. Example: >
1804 :let b = 0zFF00ED015DAF
1805
1806
Bram Moolenaar071d4272004-06-13 20:20:40 +00001807literal-string *literal-string* *E115*
1808---------------
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00001809'string' string constant *expr-'*
Bram Moolenaar071d4272004-06-13 20:20:40 +00001810
1811Note that single quotes are used.
1812
Bram Moolenaar58b85342016-08-14 19:54:54 +02001813This string is taken as it is. No backslashes are removed or have a special
Bram Moolenaard8b02732005-01-14 21:48:43 +00001814meaning. The only exception is that two quotes stand for one quote.
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00001815
1816Single quoted strings are useful for patterns, so that backslashes do not need
Bram Moolenaar58b85342016-08-14 19:54:54 +02001817to be doubled. These two commands are equivalent: >
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00001818 if a =~ "\\s*"
1819 if a =~ '\s*'
Bram Moolenaar071d4272004-06-13 20:20:40 +00001820
1821
Bram Moolenaarb59ae592022-11-23 23:46:31 +00001822interpolated-string *$quote* *interpolated-string*
LemonBoy2eaef102022-05-06 13:14:50 +01001823--------------------
1824$"string" interpolated string constant *expr-$quote*
1825$'string' interpolated literal string constant *expr-$'*
1826
1827Interpolated strings are an extension of the |string| and |literal-string|,
1828allowing the inclusion of Vim script expressions (see |expr1|). Any
1829expression returning a value can be enclosed between curly braces. The value
1830is converted to a string. All the text and results of the expressions
1831are concatenated to make a new string.
Bram Moolenaar2ecbe532022-07-29 21:36:21 +01001832 *E1278* *E1279*
LemonBoy2eaef102022-05-06 13:14:50 +01001833To include an opening brace '{' or closing brace '}' in the string content
Bram Moolenaar3f32a5f2022-05-12 20:34:15 +01001834double it. For double quoted strings using a backslash also works. A single
1835closing brace '}' will result in an error.
LemonBoy2eaef102022-05-06 13:14:50 +01001836
1837Examples: >
1838 let your_name = input("What's your name? ")
Bram Moolenaar3f32a5f2022-05-12 20:34:15 +01001839< What's your name? Peter ~
1840>
1841 echo
LemonBoy2eaef102022-05-06 13:14:50 +01001842 echo $"Hello, {your_name}!"
Bram Moolenaar3f32a5f2022-05-12 20:34:15 +01001843< Hello, Peter! ~
1844>
1845 echo $"The square root of {{9}} is {sqrt(9)}"
1846< The square root of {9} is 3.0 ~
1847
Christian Brabandt67672ef2023-04-24 21:09:54 +01001848 *string-offset-encoding*
1849A string consists of multiple characters. How the characters are stored
1850depends on 'encoding'. Most common is UTF-8, which uses one byte for ASCII
1851characters, two bytes for other latin characters and more bytes for other
1852characters.
1853
1854A string offset can count characters or bytes. Other programs may use
1855UTF-16 encoding (16-bit words) and an offset of UTF-16 words. Some functions
1856use byte offsets, usually for UTF-8 encoding. Other functions use character
1857offsets, in which case the encoding doesn't matter.
1858
1859The different offsets for the string "a©😊" are below:
1860
1861 UTF-8 offsets:
1862 [0]: 61, [1]: C2, [2]: A9, [3]: F0, [4]: 9F, [5]: 98, [6]: 8A
1863 UTF-16 offsets:
1864 [0]: 0061, [1]: 00A9, [2]: D83D, [3]: DE0A
1865 UTF-32 (character) offsets:
1866 [0]: 00000061, [1]: 000000A9, [2]: 0001F60A
1867
1868You can use the "g8" and "ga" commands on a character to see the
1869decimal/hex/octal values.
1870
1871The functions |byteidx()|, |utf16idx()| and |charidx()| can be used to convert
1872between these indices. The functions |strlen()|, |strutf16len()| and
1873|strcharlen()| return the number of bytes, UTF-16 code units and characters in
1874a string respectively.
LemonBoy2eaef102022-05-06 13:14:50 +01001875
Bram Moolenaar071d4272004-06-13 20:20:40 +00001876option *expr-option* *E112* *E113*
1877------
1878&option option value, local value if possible
1879&g:option global option value
1880&l:option local option value
1881
1882Examples: >
Bram Moolenaarc51cf032022-02-26 12:25:45 +00001883 echo "tabstop is " .. &tabstop
Bram Moolenaar071d4272004-06-13 20:20:40 +00001884 if &insertmode
1885
1886Any option name can be used here. See |options|. When using the local value
1887and there is no buffer-local or window-local value, the global value is used
1888anyway.
1889
1890
Bram Moolenaaref2f6562007-05-06 13:32:59 +00001891register *expr-register* *@r*
Bram Moolenaar071d4272004-06-13 20:20:40 +00001892--------
1893@r contents of register 'r'
1894
1895The result is the contents of the named register, as a single string.
1896Newlines are inserted where required. To get the contents of the unnamed
Bram Moolenaar58b85342016-08-14 19:54:54 +02001897register use @" or @@. See |registers| for an explanation of the available
Bram Moolenaare7566042005-06-17 22:00:15 +00001898registers.
1899
1900When using the '=' register you get the expression itself, not what it
1901evaluates to. Use |eval()| to evaluate it.
Bram Moolenaar071d4272004-06-13 20:20:40 +00001902
1903
Bram Moolenaara2baa732022-02-04 16:09:54 +00001904nesting *expr-nesting* *E110*
Bram Moolenaar071d4272004-06-13 20:20:40 +00001905-------
1906(expr1) nested expression
1907
1908
1909environment variable *expr-env*
1910--------------------
1911$VAR environment variable
1912
1913The String value of any environment variable. When it is not defined, the
1914result is an empty string.
Bram Moolenaar691ddee2019-05-09 14:52:41 +02001915
1916The functions `getenv()` and `setenv()` can also be used and work for
1917environment variables with non-alphanumeric names.
1918The function `environ()` can be used to get a Dict with all environment
1919variables.
1920
1921
Bram Moolenaar071d4272004-06-13 20:20:40 +00001922 *expr-env-expand*
1923Note that there is a difference between using $VAR directly and using
1924expand("$VAR"). Using it directly will only expand environment variables that
1925are known inside the current Vim session. Using expand() will first try using
1926the environment variables known inside the current Vim session. If that
1927fails, a shell will be used to expand the variable. This can be slow, but it
1928does expand all variables that the shell knows about. Example: >
Bram Moolenaar34401cc2014-08-29 15:12:19 +02001929 :echo $shell
1930 :echo expand("$shell")
1931The first one probably doesn't echo anything, the second echoes the $shell
Bram Moolenaar071d4272004-06-13 20:20:40 +00001932variable (if your shell supports it).
1933
1934
Bram Moolenaarf10911e2022-01-29 22:20:48 +00001935internal variable *expr-variable* *E1015* *E1089*
Bram Moolenaar071d4272004-06-13 20:20:40 +00001936-----------------
1937variable internal variable
1938See below |internal-variables|.
1939
1940
Bram Moolenaar05159a02005-02-26 23:04:13 +00001941function call *expr-function* *E116* *E118* *E119* *E120*
Bram Moolenaar071d4272004-06-13 20:20:40 +00001942-------------
1943function(expr1, ...) function call
1944See below |functions|.
1945
1946
Bram Moolenaar069c1e72016-07-15 21:25:08 +02001947lambda expression *expr-lambda* *lambda*
1948-----------------
Bram Moolenaar938ae282023-02-20 20:44:55 +00001949{args -> expr1} legacy lambda expression *E451*
Bram Moolenaar5da36052021-12-27 15:39:57 +00001950(args) => expr1 |Vim9| lambda expression
Bram Moolenaar069c1e72016-07-15 21:25:08 +02001951
1952A lambda expression creates a new unnamed function which returns the result of
Bram Moolenaar42ebd062016-07-17 13:35:14 +02001953evaluating |expr1|. Lambda expressions differ from |user-functions| in
Bram Moolenaar069c1e72016-07-15 21:25:08 +02001954the following ways:
1955
19561. The body of the lambda expression is an |expr1| and not a sequence of |Ex|
1957 commands.
Bram Moolenaar1e96d9b2016-07-29 22:15:09 +020019582. The prefix "a:" should not be used for arguments. E.g.: >
Bram Moolenaar069c1e72016-07-15 21:25:08 +02001959 :let F = {arg1, arg2 -> arg1 - arg2}
1960 :echo F(5, 2)
1961< 3
1962
1963The arguments are optional. Example: >
1964 :let F = {-> 'error function'}
Bram Moolenaar130cbfc2021-04-07 21:07:20 +02001965 :echo F('ignored')
Bram Moolenaar069c1e72016-07-15 21:25:08 +02001966< error function
Bram Moolenaar130cbfc2021-04-07 21:07:20 +02001967
Bram Moolenaar5da36052021-12-27 15:39:57 +00001968The |Vim9| lambda does not only use a different syntax, it also adds type
1969checking and can be split over multiple lines, see |vim9-lambda|.
Bram Moolenaar130cbfc2021-04-07 21:07:20 +02001970
Bram Moolenaar1e96d9b2016-07-29 22:15:09 +02001971 *closure*
1972Lambda expressions can access outer scope variables and arguments. This is
Bram Moolenaar50ba5262016-09-22 22:33:02 +02001973often called a closure. Example where "i" and "a:arg" are used in a lambda
Bram Moolenaar6bb2cdf2018-02-24 19:53:53 +01001974while they already exist in the function scope. They remain valid even after
1975the function returns: >
Bram Moolenaar1e96d9b2016-07-29 22:15:09 +02001976 :function Foo(arg)
1977 : let i = 3
1978 : return {x -> x + i - a:arg}
1979 :endfunction
1980 :let Bar = Foo(4)
1981 :echo Bar(6)
1982< 5
Bram Moolenaar437bafe2016-08-01 15:40:54 +02001983
Bram Moolenaar388a5d42020-05-26 21:20:45 +02001984Note that the variables must exist in the outer scope before the lambda is
Bram Moolenaar6bb2cdf2018-02-24 19:53:53 +01001985defined for this to work. See also |:func-closure|.
1986
1987Lambda and closure support can be checked with: >
Bram Moolenaar437bafe2016-08-01 15:40:54 +02001988 if has('lambda')
Bram Moolenaar069c1e72016-07-15 21:25:08 +02001989
1990Examples for using a lambda expression with |sort()|, |map()| and |filter()|: >
1991 :echo map([1, 2, 3], {idx, val -> val + 1})
1992< [2, 3, 4] >
1993 :echo sort([3,7,2,1,4], {a, b -> a - b})
1994< [1, 2, 3, 4, 7]
1995
1996The lambda expression is also useful for Channel, Job and timer: >
1997 :let timer = timer_start(500,
1998 \ {-> execute("echo 'Handler called'", "")},
1999 \ {'repeat': 3})
2000< Handler called
2001 Handler called
2002 Handler called
2003
Bram Moolenaar90df4b92021-07-07 20:26:08 +02002004Note that it is possible to cause memory to be used and not freed if the
2005closure is referenced by the context it depends on: >
2006 function Function()
2007 let x = 0
2008 let F = {-> x}
2009 endfunction
2010The closure uses "x" from the function scope, and "F" in that same scope
2011refers to the closure. This cycle results in the memory not being freed.
2012Recommendation: don't do this.
2013
2014Notice how execute() is used to execute an Ex command. That's ugly though.
Bram Moolenaar130cbfc2021-04-07 21:07:20 +02002015In Vim9 script you can use a command block, see |inline-function|.
Bram Moolenaar1e96d9b2016-07-29 22:15:09 +02002016
Bram Moolenaar71b6d332022-09-10 13:13:14 +01002017Although you can use the loop variable of a `for` command, it must still exist
2018when the closure is called, otherwise you get an error. *E1302*
2019
Bram Moolenaar1e96d9b2016-07-29 22:15:09 +02002020Lambda expressions have internal names like '<lambda>42'. If you get an error
2021for a lambda expression, you can find what it is with the following command: >
Bram Moolenaar6f02b002021-01-10 20:22:54 +01002022 :function <lambda>42
Bram Moolenaar1e96d9b2016-07-29 22:15:09 +02002023See also: |numbered-function|
2024
Bram Moolenaar071d4272004-06-13 20:20:40 +00002025==============================================================================
Bram Moolenaar6f4754b2022-01-23 12:07:04 +000020263. Internal variable *internal-variables* *E461* *E1001*
Bram Moolenaar4a748032010-09-30 21:47:56 +02002027
Bram Moolenaar071d4272004-06-13 20:20:40 +00002028An internal variable name can be made up of letters, digits and '_'. But it
Bram Moolenaar2f0936c2022-01-08 21:51:59 +00002029cannot start with a digit. In legacy script it is also possible to use curly
Bram Moolenaar5da36052021-12-27 15:39:57 +00002030braces, see |curly-braces-names|.
Bram Moolenaar071d4272004-06-13 20:20:40 +00002031
Bram Moolenaar2f0936c2022-01-08 21:51:59 +00002032In legacy script an internal variable is created with the ":let" command
Bram Moolenaar5da36052021-12-27 15:39:57 +00002033|:let|. An internal variable is explicitly destroyed with the ":unlet"
2034command |:unlet|.
Bram Moolenaar9588a0f2005-01-08 21:45:39 +00002035Using a name that is not an internal variable or refers to a variable that has
2036been destroyed results in an error.
Bram Moolenaar071d4272004-06-13 20:20:40 +00002037
Bram Moolenaar5da36052021-12-27 15:39:57 +00002038In |Vim9| script `:let` is not used and variables work differently, see |:var|.
2039
Bram Moolenaar65e0d772020-06-14 17:29:55 +02002040 *variable-scope*
Bram Moolenaar071d4272004-06-13 20:20:40 +00002041There are several name spaces for variables. Which one is to be used is
2042specified by what is prepended:
2043
Bram Moolenaar5da36052021-12-27 15:39:57 +00002044 (nothing) In a function: local to the function;
2045 in a legacy script: global;
2046 in a |Vim9| script: local to the script
Bram Moolenaar071d4272004-06-13 20:20:40 +00002047|buffer-variable| b: Local to the current buffer.
2048|window-variable| w: Local to the current window.
Bram Moolenaar910f66f2006-04-05 20:41:53 +00002049|tabpage-variable| t: Local to the current tab page.
Bram Moolenaar071d4272004-06-13 20:20:40 +00002050|global-variable| g: Global.
Bram Moolenaar5da36052021-12-27 15:39:57 +00002051|local-variable| l: Local to a function (only in a legacy function)
Bram Moolenaar071d4272004-06-13 20:20:40 +00002052|script-variable| s: Local to a |:source|'ed Vim script.
Bram Moolenaar5da36052021-12-27 15:39:57 +00002053|function-argument| a: Function argument (only in a legacy function).
Bram Moolenaar75b81562014-04-06 14:09:13 +02002054|vim-variable| v: Global, predefined by Vim.
Bram Moolenaar071d4272004-06-13 20:20:40 +00002055
Bram Moolenaar32466aa2006-02-24 23:53:04 +00002056The scope name by itself can be used as a |Dictionary|. For example, to
2057delete all script-local variables: >
Bram Moolenaar8f999f12005-01-25 22:12:55 +00002058 :for k in keys(s:)
2059 : unlet s:[k]
2060 :endfor
Bram Moolenaar65e0d772020-06-14 17:29:55 +02002061
Bram Moolenaar5da36052021-12-27 15:39:57 +00002062Note: in Vim9 script variables can also be local to a block of commands, see
2063|vim9-scopes|.
Bram Moolenaar531da592013-05-06 05:58:55 +02002064 *buffer-variable* *b:var* *b:*
Bram Moolenaar071d4272004-06-13 20:20:40 +00002065A variable name that is preceded with "b:" is local to the current buffer.
2066Thus you can have several "b:foo" variables, one for each buffer.
2067This kind of variable is deleted when the buffer is wiped out or deleted with
2068|:bdelete|.
2069
2070One local buffer variable is predefined:
Bram Moolenaarbf884932013-04-05 22:26:15 +02002071 *b:changedtick* *changetick*
Bram Moolenaar071d4272004-06-13 20:20:40 +00002072b:changedtick The total number of changes to the current buffer. It is
2073 incremented for each change. An undo command is also a change
Bram Moolenaarc024b462019-06-08 18:07:21 +02002074 in this case. Resetting 'modified' when writing the buffer is
2075 also counted.
2076 This can be used to perform an action only when the buffer has
2077 changed. Example: >
Bram Moolenaar071d4272004-06-13 20:20:40 +00002078 :if my_changedtick != b:changedtick
Bram Moolenaar446cb832008-06-24 21:56:24 +00002079 : let my_changedtick = b:changedtick
2080 : call My_Update()
Bram Moolenaar071d4272004-06-13 20:20:40 +00002081 :endif
Bram Moolenaar3df01732017-02-17 22:47:16 +01002082< You cannot change or delete the b:changedtick variable.
Bram Moolenaar71badf92023-04-22 22:40:14 +01002083 If you need more information about the change see
2084 |listener_add()|.
Bram Moolenaar3df01732017-02-17 22:47:16 +01002085
Bram Moolenaar531da592013-05-06 05:58:55 +02002086 *window-variable* *w:var* *w:*
Bram Moolenaar071d4272004-06-13 20:20:40 +00002087A variable name that is preceded with "w:" is local to the current window. It
2088is deleted when the window is closed.
2089
Bram Moolenaarad3b3662013-05-17 18:14:19 +02002090 *tabpage-variable* *t:var* *t:*
Bram Moolenaar910f66f2006-04-05 20:41:53 +00002091A variable name that is preceded with "t:" is local to the current tab page,
2092It is deleted when the tab page is closed. {not available when compiled
Bram Moolenaardb84e452010-08-15 13:50:43 +02002093without the |+windows| feature}
Bram Moolenaar910f66f2006-04-05 20:41:53 +00002094
Bram Moolenaar531da592013-05-06 05:58:55 +02002095 *global-variable* *g:var* *g:*
Bram Moolenaar04fb9162021-12-30 20:24:12 +00002096Inside functions and in |Vim9| script global variables are accessed with "g:".
2097Omitting this will access a variable local to a function or script. "g:"
2098can also be used in any other place if you like.
Bram Moolenaar071d4272004-06-13 20:20:40 +00002099
Bram Moolenaar531da592013-05-06 05:58:55 +02002100 *local-variable* *l:var* *l:*
Bram Moolenaar071d4272004-06-13 20:20:40 +00002101Inside functions local variables are accessed without prepending anything.
Bram Moolenaaref2f6562007-05-06 13:32:59 +00002102But you can also prepend "l:" if you like. However, without prepending "l:"
2103you may run into reserved variable names. For example "count". By itself it
2104refers to "v:count". Using "l:count" you can have a local variable with the
2105same name.
Bram Moolenaar071d4272004-06-13 20:20:40 +00002106
2107 *script-variable* *s:var*
Bram Moolenaar04fb9162021-12-30 20:24:12 +00002108In a legacy Vim script variables starting with "s:" can be used. They cannot
2109be accessed from outside of the scripts, thus are local to the script.
2110In |Vim9| script the "s:" prefix can be omitted, variables are script-local by
2111default.
Bram Moolenaar071d4272004-06-13 20:20:40 +00002112
2113They can be used in:
2114- commands executed while the script is sourced
2115- functions defined in the script
2116- autocommands defined in the script
2117- functions and autocommands defined in functions and autocommands which were
2118 defined in the script (recursively)
2119- user defined commands defined in the script
2120Thus not in:
2121- other scripts sourced from this one
2122- mappings
Bram Moolenaar8f3f58f2010-01-06 20:52:26 +01002123- menus
Bram Moolenaar071d4272004-06-13 20:20:40 +00002124- etc.
2125
Bram Moolenaaref2f6562007-05-06 13:32:59 +00002126Script variables can be used to avoid conflicts with global variable names.
2127Take this example: >
Bram Moolenaar071d4272004-06-13 20:20:40 +00002128
2129 let s:counter = 0
2130 function MyCounter()
2131 let s:counter = s:counter + 1
2132 echo s:counter
2133 endfunction
2134 command Tick call MyCounter()
2135
2136You can now invoke "Tick" from any script, and the "s:counter" variable in
2137that script will not be changed, only the "s:counter" in the script where
2138"Tick" was defined is used.
2139
2140Another example that does the same: >
2141
2142 let s:counter = 0
2143 command Tick let s:counter = s:counter + 1 | echo s:counter
2144
2145When calling a function and invoking a user-defined command, the context for
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00002146script variables is set to the script where the function or command was
Bram Moolenaar071d4272004-06-13 20:20:40 +00002147defined.
2148
2149The script variables are also available when a function is defined inside a
2150function that is defined in a script. Example: >
2151
2152 let s:counter = 0
2153 function StartCounting(incr)
2154 if a:incr
2155 function MyCounter()
2156 let s:counter = s:counter + 1
2157 endfunction
2158 else
2159 function MyCounter()
2160 let s:counter = s:counter - 1
2161 endfunction
2162 endif
2163 endfunction
2164
2165This defines the MyCounter() function either for counting up or counting down
2166when calling StartCounting(). It doesn't matter from where StartCounting() is
2167called, the s:counter variable will be accessible in MyCounter().
2168
2169When the same script is sourced again it will use the same script variables.
2170They will remain valid as long as Vim is running. This can be used to
2171maintain a counter: >
2172
2173 if !exists("s:counter")
2174 let s:counter = 1
2175 echo "script executed for the first time"
2176 else
2177 let s:counter = s:counter + 1
Bram Moolenaarc51cf032022-02-26 12:25:45 +00002178 echo "script executed " .. s:counter .. " times now"
Bram Moolenaar071d4272004-06-13 20:20:40 +00002179 endif
2180
2181Note that this means that filetype plugins don't get a different set of script
2182variables for each buffer. Use local buffer variables instead |b:var|.
2183
2184
Bram Moolenaard47d5222018-12-09 20:43:55 +01002185PREDEFINED VIM VARIABLES *vim-variable* *v:var* *v:*
Bram Moolenaar6f4754b2022-01-23 12:07:04 +00002186 *E963* *E1063*
ichizok663d18d2025-01-02 18:06:00 +01002187Most variables are read-only, when a variable can be set by the user, it will
2188be mentioned at the variable description below. The type cannot be changed.
Bram Moolenaar071d4272004-06-13 20:20:40 +00002189
Bram Moolenaar69bf6342019-10-29 04:16:57 +01002190 *v:argv* *argv-variable*
2191v:argv The command line arguments Vim was invoked with. This is a
2192 list of strings. The first item is the Vim command.
Bram Moolenaar1588bc82022-03-08 21:35:07 +00002193 See |v:progpath| for the command with full path.
Bram Moolenaar69bf6342019-10-29 04:16:57 +01002194
Bram Moolenaare4efc3b2005-03-07 23:16:51 +00002195 *v:beval_col* *beval_col-variable*
2196v:beval_col The number of the column, over which the mouse pointer is.
2197 This is the byte index in the |v:beval_lnum| line.
2198 Only valid while evaluating the 'balloonexpr' option.
2199
2200 *v:beval_bufnr* *beval_bufnr-variable*
2201v:beval_bufnr The number of the buffer, over which the mouse pointer is. Only
2202 valid while evaluating the 'balloonexpr' option.
2203
2204 *v:beval_lnum* *beval_lnum-variable*
2205v:beval_lnum The number of the line, over which the mouse pointer is. Only
2206 valid while evaluating the 'balloonexpr' option.
2207
2208 *v:beval_text* *beval_text-variable*
Bram Moolenaar24bbcfe2005-06-28 23:32:02 +00002209v:beval_text The text under or after the mouse pointer. Usually a word as
2210 it is useful for debugging a C program. 'iskeyword' applies,
2211 but a dot and "->" before the position is included. When on a
2212 ']' the text before it is used, including the matching '[' and
Bram Moolenaare4efc3b2005-03-07 23:16:51 +00002213 word before it. When on a Visual area within one line the
Bram Moolenaarb4d5fba2017-09-11 19:31:28 +02002214 highlighted text is used. Also see |<cexpr>|.
Bram Moolenaare4efc3b2005-03-07 23:16:51 +00002215 Only valid while evaluating the 'balloonexpr' option.
2216
2217 *v:beval_winnr* *beval_winnr-variable*
2218v:beval_winnr The number of the window, over which the mouse pointer is. Only
Bram Moolenaar00654022011-02-25 14:42:19 +01002219 valid while evaluating the 'balloonexpr' option. The first
2220 window has number zero (unlike most other places where a
2221 window gets a number).
Bram Moolenaare4efc3b2005-03-07 23:16:51 +00002222
Bram Moolenaar511972d2016-06-04 18:09:59 +02002223 *v:beval_winid* *beval_winid-variable*
Bram Moolenaar7571d552016-08-18 22:54:46 +02002224v:beval_winid The |window-ID| of the window, over which the mouse pointer
2225 is. Otherwise like v:beval_winnr.
Bram Moolenaar511972d2016-06-04 18:09:59 +02002226
Bram Moolenaarf193fff2006-04-27 00:02:13 +00002227 *v:char* *char-variable*
Bram Moolenaar8f3f58f2010-01-06 20:52:26 +01002228v:char Argument for evaluating 'formatexpr' and used for the typed
Bram Moolenaar945e2db2010-06-05 17:43:32 +02002229 character when using <expr> in an abbreviation |:map-<expr>|.
Shougo Matsushita83678842024-07-11 22:05:12 +02002230 It is also used by the |InsertCharPre|, |InsertEnter| and
2231 |KeyInputPre| events.
Bram Moolenaarf193fff2006-04-27 00:02:13 +00002232
Bram Moolenaar071d4272004-06-13 20:20:40 +00002233 *v:charconvert_from* *charconvert_from-variable*
2234v:charconvert_from
2235 The name of the character encoding of a file to be converted.
2236 Only valid while evaluating the 'charconvert' option.
2237
2238 *v:charconvert_to* *charconvert_to-variable*
2239v:charconvert_to
2240 The name of the character encoding of a file after conversion.
2241 Only valid while evaluating the 'charconvert' option.
2242
Foxe Chenb90c2392025-06-27 21:10:35 +02002243 *v:clipmethod*
2244v:clipmethod The current method of accessing the clipboard that is being
Hirohito Higashi73b96502025-06-28 18:18:21 +02002245 used. Can either have the value of:
Foxe Chenb90c2392025-06-27 21:10:35 +02002246 wayland The Wayland protocol is being used.
2247 x11 X11 selections are being used.
Hirohito Higashi73b96502025-06-28 18:18:21 +02002248 none The above methods are unavailable or
2249 cannot be used.
Foxe Chenb90c2392025-06-27 21:10:35 +02002250 See 'clipmethod' for more details.
2251
Bram Moolenaar071d4272004-06-13 20:20:40 +00002252 *v:cmdarg* *cmdarg-variable*
2253v:cmdarg This variable is used for two purposes:
2254 1. The extra arguments given to a file read/write command.
2255 Currently these are "++enc=" and "++ff=". This variable is
2256 set before an autocommand event for a file read/write
2257 command is triggered. There is a leading space to make it
2258 possible to append this variable directly after the
Bram Moolenaar58b85342016-08-14 19:54:54 +02002259 read/write command. Note: The "+cmd" argument isn't
Bram Moolenaar071d4272004-06-13 20:20:40 +00002260 included here, because it will be executed anyway.
2261 2. When printing a PostScript file with ":hardcopy" this is
2262 the argument for the ":hardcopy" command. This can be used
2263 in 'printexpr'.
2264
2265 *v:cmdbang* *cmdbang-variable*
2266v:cmdbang Set like v:cmdarg for a file read/write command. When a "!"
2267 was used the value is 1, otherwise it is 0. Note that this
2268 can only be used in autocommands. For user commands |<bang>|
2269 can be used.
zeertzjq20e045f2024-10-28 22:05:26 +01002270
Bram Moolenaar84cf6bd2020-06-16 20:03:43 +02002271 *v:collate* *collate-variable*
2272v:collate The current locale setting for collation order of the runtime
2273 environment. This allows Vim scripts to be aware of the
2274 current locale encoding. Technical: it's the value of
2275 LC_COLLATE. When not using a locale the value is "C".
2276 This variable can not be set directly, use the |:language|
2277 command.
2278 See |multi-lang|.
Bram Moolenaar071d4272004-06-13 20:20:40 +00002279
Bram Moolenaar76db9e02022-11-09 21:21:04 +00002280 *v:colornames*
Drew Vogele30d1022021-10-24 20:35:07 +01002281v:colornames A dictionary that maps color names to hex color strings. These
2282 color names can be used with the |highlight-guifg|,
Christian Brabandt0f4054f2024-02-05 10:30:01 +01002283 |highlight-guibg|, and |highlight-guisp| parameters.
2284
2285 The key values in the dictionary (the color names) should be
2286 lower cased, because Vim looks up a color by its lower case
2287 name.
2288
2289 Updating an entry in v:colornames has no immediate effect on
2290 the syntax highlighting. The highlight commands (probably in a
Drew Vogele30d1022021-10-24 20:35:07 +01002291 colorscheme script) need to be re-evaluated in order to use
2292 the updated color values. For example: >
2293
2294 :let v:colornames['fuscia'] = '#cf3ab4'
2295 :let v:colornames['mauve'] = '#915f6d'
2296 :highlight Normal guifg=fuscia guibg=mauve
2297<
2298 This cannot be used to override the |cterm-colors| but it can
2299 be used to override other colors. For example, the X11 colors
2300 defined in the `colors/lists/default.vim` (previously defined
2301 in |rgb.txt|). When defining new color names in a plugin, the
2302 recommended practice is to set a color entry only when it does
2303 not already exist. For example: >
2304
2305 :call extend(v:colornames, {
2306 \ 'fuscia': '#cf3ab4',
2307 \ 'mauve': '#915f6d,
2308 \ }, 'keep')
2309<
Bram Moolenaar113cb512021-11-07 20:27:04 +00002310 Using |extend()| with the 'keep' option updates each color only
Drew Vogele30d1022021-10-24 20:35:07 +01002311 if it did not exist in |v:colornames|. Doing so allows the
2312 user to choose the precise color value for a common name
2313 by setting it in their |.vimrc|.
2314
2315 It is possible to remove entries from this dictionary but
Drew Vogela0fca172021-11-13 10:50:01 +00002316 doing so is NOT recommended, because it is disruptive to
Drew Vogele30d1022021-10-24 20:35:07 +01002317 other scripts. It is also unlikely to achieve the desired
Bram Moolenaar113cb512021-11-07 20:27:04 +00002318 result because the |:colorscheme| and |:highlight| commands will
Drew Vogele30d1022021-10-24 20:35:07 +01002319 both automatically load all `colors/lists/default.vim` color
2320 scripts.
2321
Alin Mr6d1d1802024-03-20 20:26:23 +01002322 You can make changes to that file, but make sure to add new
2323 keys instead of updating existing ones, otherwise Vim will skip
Yee Cheng China7b81202025-02-23 09:32:47 +01002324 loading the file (thinking it hasn't been changed).
Alin Mr6d1d1802024-03-20 20:26:23 +01002325
Bram Moolenaar42a45122015-07-10 17:56:23 +02002326 *v:completed_item* *completed_item-variable*
2327v:completed_item
2328 |Dictionary| containing the |complete-items| for the most
2329 recently completed word after |CompleteDone|. The
2330 |Dictionary| is empty if the completion failed.
Shougo Matsushita61021aa2022-07-27 14:40:00 +01002331 Note: Plugins can modify the value to emulate the builtin
2332 |CompleteDone| event behavior.
Bram Moolenaar42a45122015-07-10 17:56:23 +02002333
Bram Moolenaar071d4272004-06-13 20:20:40 +00002334 *v:count* *count-variable*
2335v:count The count given for the last Normal mode command. Can be used
Bram Moolenaar58b85342016-08-14 19:54:54 +02002336 to get the count before a mapping. Read-only. Example: >
Bram Moolenaarc51cf032022-02-26 12:25:45 +00002337 :map _x :<C-U>echo "the count is " .. v:count<CR>
Bram Moolenaar071d4272004-06-13 20:20:40 +00002338< Note: The <C-U> is required to remove the line range that you
2339 get when typing ':' after a count.
Bram Moolenaar8f3f58f2010-01-06 20:52:26 +01002340 When there are two counts, as in "3d2w", they are multiplied,
2341 just like what happens in the command, "d6w" for the example.
Bram Moolenaar1d2ba7f2006-02-14 22:29:30 +00002342 Also used for evaluating the 'formatexpr' option.
Bram Moolenaard2e716e2019-04-20 14:39:52 +02002343 "count" also works, for backwards compatibility, unless
2344 |scriptversion| is 3 or higher.
Bram Moolenaar071d4272004-06-13 20:20:40 +00002345
2346 *v:count1* *count1-variable*
2347v:count1 Just like "v:count", but defaults to one when no count is
2348 used.
2349
2350 *v:ctype* *ctype-variable*
2351v:ctype The current locale setting for characters of the runtime
2352 environment. This allows Vim scripts to be aware of the
2353 current locale encoding. Technical: it's the value of
2354 LC_CTYPE. When not using a locale the value is "C".
2355 This variable can not be set directly, use the |:language|
2356 command.
2357 See |multi-lang|.
2358
2359 *v:dying* *dying-variable*
Bram Moolenaar58b85342016-08-14 19:54:54 +02002360v:dying Normally zero. When a deadly signal is caught it's set to
Bram Moolenaar071d4272004-06-13 20:20:40 +00002361 one. When multiple signals are caught the number increases.
2362 Can be used in an autocommand to check if Vim didn't
2363 terminate normally. {only works on Unix}
2364 Example: >
2365 :au VimLeave * if v:dying | echo "\nAAAAaaaarrrggghhhh!!!\n" | endif
Bram Moolenaar0e1e25f2010-05-28 21:07:08 +02002366< Note: if another deadly signal is caught when v:dying is one,
2367 VimLeave autocommands will not be executed.
2368
Bram Moolenaarf0068c52020-11-30 17:42:10 +01002369 *v:exiting* *exiting-variable*
2370v:exiting Vim exit code. Normally zero, non-zero when something went
2371 wrong. The value is v:null before invoking the |VimLeavePre|
2372 and |VimLeave| autocmds. See |:q|, |:x| and |:cquit|.
2373 Example: >
2374 :au VimLeave * echo "Exit value is " .. v:exiting
2375<
Bram Moolenaar37f4cbd2019-08-23 20:58:45 +02002376 *v:echospace* *echospace-variable*
2377v:echospace Number of screen cells that can be used for an `:echo` message
2378 in the last screen line before causing the |hit-enter-prompt|.
2379 Depends on 'showcmd', 'ruler' and 'columns'. You need to
2380 check 'cmdheight' for whether there are full-width lines
2381 available above the last line.
2382
Bram Moolenaar071d4272004-06-13 20:20:40 +00002383 *v:errmsg* *errmsg-variable*
2384v:errmsg Last given error message. It's allowed to set this variable.
2385 Example: >
2386 :let v:errmsg = ""
2387 :silent! next
2388 :if v:errmsg != ""
2389 : ... handle error
Bram Moolenaard2e716e2019-04-20 14:39:52 +02002390< "errmsg" also works, for backwards compatibility, unless
2391 |scriptversion| is 3 or higher.
Bram Moolenaar071d4272004-06-13 20:20:40 +00002392
Bram Moolenaar65a54642018-04-28 16:56:53 +02002393 *v:errors* *errors-variable* *assert-return*
Bram Moolenaar683fa182015-11-30 21:38:24 +01002394v:errors Errors found by assert functions, such as |assert_true()|.
Bram Moolenaar43345542015-11-29 17:35:35 +01002395 This is a list of strings.
2396 The assert functions append an item when an assert fails.
Bram Moolenaar65a54642018-04-28 16:56:53 +02002397 The return value indicates this: a one is returned if an item
2398 was added to v:errors, otherwise zero is returned.
Bram Moolenaar43345542015-11-29 17:35:35 +01002399 To remove old results make it empty: >
2400 :let v:errors = []
2401< If v:errors is set to anything but a list it is made an empty
2402 list by the assert function.
2403
Bram Moolenaar7e1652c2017-12-16 18:27:02 +01002404 *v:event* *event-variable*
2405v:event Dictionary containing information about the current
Bram Moolenaar560979e2020-02-04 22:53:05 +01002406 |autocommand|. See the specific event for what it puts in
2407 this dictionary.
Bram Moolenaar2c7f8c52020-04-20 19:52:53 +02002408 The dictionary is emptied when the |autocommand| finishes,
2409 please refer to |dict-identity| for how to get an independent
2410 copy of it. Use |deepcopy()| if you want to keep the
2411 information after the event triggers. Example: >
2412 au TextYankPost * let g:foo = deepcopy(v:event)
2413<
Bram Moolenaar071d4272004-06-13 20:20:40 +00002414 *v:exception* *exception-variable*
2415v:exception The value of the exception most recently caught and not
ichizok663d18d2025-01-02 18:06:00 +01002416 finished. See also |v:stacktrace|, |v:throwpoint|, and
2417 |throw-variables|.
Bram Moolenaar071d4272004-06-13 20:20:40 +00002418 Example: >
2419 :try
2420 : throw "oops"
2421 :catch /.*/
Bram Moolenaar54775062019-07-31 21:07:14 +02002422 : echo "caught " .. v:exception
Bram Moolenaar071d4272004-06-13 20:20:40 +00002423 :endtry
2424< Output: "caught oops".
2425
Bram Moolenaar520e1e42016-01-23 19:46:28 +01002426 *v:false* *false-variable*
2427v:false A Number with value zero. Used to put "false" in JSON. See
Bram Moolenaar6463ca22016-02-13 17:04:46 +01002428 |json_encode()|.
Bram Moolenaarc95a3022016-06-12 23:01:46 +02002429 When used as a string this evaluates to "v:false". >
Bram Moolenaar705ada12016-01-24 17:56:50 +01002430 echo v:false
Bram Moolenaarc95a3022016-06-12 23:01:46 +02002431< v:false ~
2432 That is so that eval() can parse the string back to the same
Bram Moolenaardf48fb42016-07-22 21:50:18 +02002433 value. Read-only.
Bram Moolenaar5da36052021-12-27 15:39:57 +00002434 In |Vim9| script "false" can be used which has a boolean type.
Bram Moolenaar520e1e42016-01-23 19:46:28 +01002435
Bram Moolenaar19a09a12005-03-04 23:39:37 +00002436 *v:fcs_reason* *fcs_reason-variable*
2437v:fcs_reason The reason why the |FileChangedShell| event was triggered.
2438 Can be used in an autocommand to decide what to do and/or what
2439 to set v:fcs_choice to. Possible values:
2440 deleted file no longer exists
2441 conflict file contents, mode or timestamp was
2442 changed and buffer is modified
2443 changed file contents has changed
2444 mode mode of file changed
2445 time only file timestamp changed
2446
2447 *v:fcs_choice* *fcs_choice-variable*
2448v:fcs_choice What should happen after a |FileChangedShell| event was
2449 triggered. Can be used in an autocommand to tell Vim what to
2450 do with the affected buffer:
2451 reload Reload the buffer (does not work if
2452 the file was deleted).
Rob Pilling8196e942022-02-11 15:12:10 +00002453 edit Reload the buffer and detect the
2454 values for options such as
2455 'fileformat', 'fileencoding', 'binary'
2456 (does not work if the file was
2457 deleted).
Bram Moolenaar19a09a12005-03-04 23:39:37 +00002458 ask Ask the user what to do, as if there
2459 was no autocommand. Except that when
2460 only the timestamp changed nothing
2461 will happen.
2462 <empty> Nothing, the autocommand should do
2463 everything that needs to be done.
2464 The default is empty. If another (invalid) value is used then
2465 Vim behaves like it is empty, there is no warning message.
2466
Bram Moolenaar4c295022021-05-02 17:19:11 +02002467 *v:fname* *fname-variable*
Bram Moolenaar90df4b92021-07-07 20:26:08 +02002468v:fname When evaluating 'includeexpr': the file name that was
Yegappan Lakshmanana13f3a42024-11-02 18:40:10 +01002469 detected. Empty otherwise.
Bram Moolenaar4c295022021-05-02 17:19:11 +02002470
Bram Moolenaar071d4272004-06-13 20:20:40 +00002471 *v:fname_in* *fname_in-variable*
Bram Moolenaar4e330bb2005-12-07 21:04:31 +00002472v:fname_in The name of the input file. Valid while evaluating:
Bram Moolenaar071d4272004-06-13 20:20:40 +00002473 option used for ~
2474 'charconvert' file to be converted
2475 'diffexpr' original file
2476 'patchexpr' original file
2477 'printexpr' file to be printed
Bram Moolenaar2c7a29c2005-12-12 22:02:31 +00002478 And set to the swap file name for |SwapExists|.
Bram Moolenaar071d4272004-06-13 20:20:40 +00002479
2480 *v:fname_out* *fname_out-variable*
2481v:fname_out The name of the output file. Only valid while
2482 evaluating:
2483 option used for ~
2484 'charconvert' resulting converted file (*)
2485 'diffexpr' output of diff
2486 'patchexpr' resulting patched file
2487 (*) When doing conversion for a write command (e.g., ":w
Bram Moolenaar58b85342016-08-14 19:54:54 +02002488 file") it will be equal to v:fname_in. When doing conversion
Bram Moolenaar071d4272004-06-13 20:20:40 +00002489 for a read command (e.g., ":e file") it will be a temporary
2490 file and different from v:fname_in.
2491
2492 *v:fname_new* *fname_new-variable*
2493v:fname_new The name of the new version of the file. Only valid while
2494 evaluating 'diffexpr'.
2495
2496 *v:fname_diff* *fname_diff-variable*
2497v:fname_diff The name of the diff (patch) file. Only valid while
2498 evaluating 'patchexpr'.
2499
2500 *v:folddashes* *folddashes-variable*
2501v:folddashes Used for 'foldtext': dashes representing foldlevel of a closed
2502 fold.
Bram Moolenaar7b0294c2004-10-11 10:16:09 +00002503 Read-only in the |sandbox|. |fold-foldtext|
Bram Moolenaar071d4272004-06-13 20:20:40 +00002504
2505 *v:foldlevel* *foldlevel-variable*
2506v:foldlevel Used for 'foldtext': foldlevel of closed fold.
Bram Moolenaar7b0294c2004-10-11 10:16:09 +00002507 Read-only in the |sandbox|. |fold-foldtext|
Bram Moolenaar071d4272004-06-13 20:20:40 +00002508
2509 *v:foldend* *foldend-variable*
2510v:foldend Used for 'foldtext': last line of closed fold.
Bram Moolenaar7b0294c2004-10-11 10:16:09 +00002511 Read-only in the |sandbox|. |fold-foldtext|
Bram Moolenaar071d4272004-06-13 20:20:40 +00002512
2513 *v:foldstart* *foldstart-variable*
2514v:foldstart Used for 'foldtext': first line of closed fold.
Bram Moolenaar7b0294c2004-10-11 10:16:09 +00002515 Read-only in the |sandbox|. |fold-foldtext|
Bram Moolenaar071d4272004-06-13 20:20:40 +00002516
Bram Moolenaar817a8802013-11-09 01:44:43 +01002517 *v:hlsearch* *hlsearch-variable*
Bram Moolenaarb0d45e72017-11-05 18:19:24 +01002518v:hlsearch Variable that indicates whether search highlighting is on.
Bram Moolenaar76440e22014-11-27 19:14:49 +01002519 Setting it makes sense only if 'hlsearch' is enabled which
2520 requires |+extra_search|. Setting this variable to zero acts
Bram Moolenaar705ada12016-01-24 17:56:50 +01002521 like the |:nohlsearch| command, setting it to one acts like >
Bram Moolenaar817a8802013-11-09 01:44:43 +01002522 let &hlsearch = &hlsearch
Bram Moolenaar86ae7202015-07-10 19:31:35 +02002523< Note that the value is restored when returning from a
2524 function. |function-search-undo|.
2525
Bram Moolenaar843ee412004-06-30 16:16:41 +00002526 *v:insertmode* *insertmode-variable*
2527v:insertmode Used for the |InsertEnter| and |InsertChange| autocommand
2528 events. Values:
2529 i Insert mode
2530 r Replace mode
2531 v Virtual Replace mode
2532
Bram Moolenaar2fda12f2005-01-15 22:14:15 +00002533 *v:key* *key-variable*
Bram Moolenaar32466aa2006-02-24 23:53:04 +00002534v:key Key of the current item of a |Dictionary|. Only valid while
Bram Moolenaar2fda12f2005-01-15 22:14:15 +00002535 evaluating the expression used with |map()| and |filter()|.
2536 Read-only.
2537
Bram Moolenaar071d4272004-06-13 20:20:40 +00002538 *v:lang* *lang-variable*
2539v:lang The current locale setting for messages of the runtime
2540 environment. This allows Vim scripts to be aware of the
2541 current language. Technical: it's the value of LC_MESSAGES.
2542 The value is system dependent.
2543 This variable can not be set directly, use the |:language|
2544 command.
2545 It can be different from |v:ctype| when messages are desired
2546 in a different language than what is used for character
2547 encoding. See |multi-lang|.
2548
2549 *v:lc_time* *lc_time-variable*
2550v:lc_time The current locale setting for time messages of the runtime
2551 environment. This allows Vim scripts to be aware of the
2552 current language. Technical: it's the value of LC_TIME.
2553 This variable can not be set directly, use the |:language|
2554 command. See |multi-lang|.
2555
2556 *v:lnum* *lnum-variable*
Bram Moolenaar368373e2010-07-19 20:46:22 +02002557v:lnum Line number for the 'foldexpr' |fold-expr|, 'formatexpr' and
2558 'indentexpr' expressions, tab page number for 'guitablabel'
2559 and 'guitabtooltip'. Only valid while one of these
2560 expressions is being evaluated. Read-only when in the
2561 |sandbox|.
Bram Moolenaar071d4272004-06-13 20:20:40 +00002562
naohiro ono56200ee2022-01-01 14:59:44 +00002563 *v:maxcol* *maxcol-variable*
Bram Moolenaar2f0936c2022-01-08 21:51:59 +00002564v:maxcol Maximum line length. Depending on where it is used it can be
Bram Moolenaar944697a2022-02-20 19:48:20 +00002565 screen columns, characters or bytes. The value currently is
2566 2147483647 on all systems.
naohiro ono56200ee2022-01-01 14:59:44 +00002567
Bram Moolenaar219b8702006-11-01 14:32:36 +00002568 *v:mouse_win* *mouse_win-variable*
2569v:mouse_win Window number for a mouse click obtained with |getchar()|.
2570 First window has number 1, like with |winnr()|. The value is
2571 zero when there was no mouse button click.
2572
Bram Moolenaar511972d2016-06-04 18:09:59 +02002573 *v:mouse_winid* *mouse_winid-variable*
2574v:mouse_winid Window ID for a mouse click obtained with |getchar()|.
2575 The value is zero when there was no mouse button click.
2576
Bram Moolenaar219b8702006-11-01 14:32:36 +00002577 *v:mouse_lnum* *mouse_lnum-variable*
2578v:mouse_lnum Line number for a mouse click obtained with |getchar()|.
2579 This is the text line number, not the screen line number. The
2580 value is zero when there was no mouse button click.
2581
2582 *v:mouse_col* *mouse_col-variable*
2583v:mouse_col Column number for a mouse click obtained with |getchar()|.
2584 This is the screen column number, like with |virtcol()|. The
2585 value is zero when there was no mouse button click.
2586
Bram Moolenaard09091d2019-01-17 16:07:22 +01002587 *v:none* *none-variable* *None*
Bram Moolenaar520e1e42016-01-23 19:46:28 +01002588v:none An empty String. Used to put an empty item in JSON. See
Bram Moolenaar6463ca22016-02-13 17:04:46 +01002589 |json_encode()|.
Bram Moolenaar2547aa92020-07-26 17:00:44 +02002590 This can also be used as a function argument to use the
2591 default value, see |none-function_argument|.
Bram Moolenaar705ada12016-01-24 17:56:50 +01002592 When used as a number this evaluates to zero.
Bram Moolenaarc95a3022016-06-12 23:01:46 +02002593 When used as a string this evaluates to "v:none". >
Bram Moolenaar705ada12016-01-24 17:56:50 +01002594 echo v:none
Bram Moolenaarc95a3022016-06-12 23:01:46 +02002595< v:none ~
2596 That is so that eval() can parse the string back to the same
Bram Moolenaardf48fb42016-07-22 21:50:18 +02002597 value. Read-only.
Bram Moolenaar1588bc82022-03-08 21:35:07 +00002598 Note that using `== v:none` and `!= v:none` will often give
2599 an error. Instead, use `is v:none` and `isnot v:none` .
Bram Moolenaar520e1e42016-01-23 19:46:28 +01002600
2601 *v:null* *null-variable*
2602v:null An empty String. Used to put "null" in JSON. See
Bram Moolenaar6463ca22016-02-13 17:04:46 +01002603 |json_encode()|.
Bram Moolenaar705ada12016-01-24 17:56:50 +01002604 When used as a number this evaluates to zero.
Bram Moolenaarc95a3022016-06-12 23:01:46 +02002605 When used as a string this evaluates to "v:null". >
Bram Moolenaar705ada12016-01-24 17:56:50 +01002606 echo v:null
Bram Moolenaarc95a3022016-06-12 23:01:46 +02002607< v:null ~
2608 That is so that eval() can parse the string back to the same
Bram Moolenaardf48fb42016-07-22 21:50:18 +02002609 value. Read-only.
Bram Moolenaar1588bc82022-03-08 21:35:07 +00002610 In |Vim9| script `null` can be used without "v:".
2611 In some places `v:null` and `null` can be used for a List,
2612 Dict, Job, etc. that is not set. That is slightly different
2613 than an empty List, Dict, etc.
Bram Moolenaar520e1e42016-01-23 19:46:28 +01002614
Bram Moolenaar57d5a012021-01-21 21:42:31 +01002615 *v:numbermax* *numbermax-variable*
2616v:numbermax Maximum value of a number.
2617
Bram Moolenaare0e39172021-01-25 21:14:57 +01002618 *v:numbermin* *numbermin-variable*
Bram Moolenaar2346a632021-06-13 19:02:49 +02002619v:numbermin Minimum value of a number (negative).
Bram Moolenaar57d5a012021-01-21 21:42:31 +01002620
Bram Moolenaarf9706e92020-02-22 14:27:04 +01002621 *v:numbersize* *numbersize-variable*
2622v:numbersize Number of bits in a Number. This is normally 64, but on some
Bram Moolenaarbc93ceb2020-02-26 13:36:21 +01002623 systems it may be 32.
Bram Moolenaarf9706e92020-02-22 14:27:04 +01002624
Bram Moolenaard812df62008-11-09 12:46:09 +00002625 *v:oldfiles* *oldfiles-variable*
2626v:oldfiles List of file names that is loaded from the |viminfo| file on
2627 startup. These are the files that Vim remembers marks for.
2628 The length of the List is limited by the ' argument of the
2629 'viminfo' option (default is 100).
Bram Moolenaar8d043172014-01-23 14:24:41 +01002630 When the |viminfo| file is not used the List is empty.
Bram Moolenaard812df62008-11-09 12:46:09 +00002631 Also see |:oldfiles| and |c_#<|.
2632 The List can be modified, but this has no effect on what is
2633 stored in the |viminfo| file later. If you use values other
2634 than String this will cause trouble.
Bram Moolenaardb84e452010-08-15 13:50:43 +02002635 {only when compiled with the |+viminfo| feature}
Bram Moolenaard812df62008-11-09 12:46:09 +00002636
Bram Moolenaar53744302015-07-17 17:38:22 +02002637 *v:option_new*
2638v:option_new New value of the option. Valid while executing an |OptionSet|
2639 autocommand.
2640 *v:option_old*
2641v:option_old Old value of the option. Valid while executing an |OptionSet|
Bram Moolenaard7c96872019-06-15 17:12:48 +02002642 autocommand. Depending on the command used for setting and the
2643 kind of option this is either the local old value or the
2644 global old value.
2645 *v:option_oldlocal*
2646v:option_oldlocal
2647 Old local value of the option. Valid while executing an
2648 |OptionSet| autocommand.
2649 *v:option_oldglobal*
2650v:option_oldglobal
2651 Old global value of the option. Valid while executing an
2652 |OptionSet| autocommand.
Bram Moolenaar53744302015-07-17 17:38:22 +02002653 *v:option_type*
2654v:option_type Scope of the set command. Valid while executing an
2655 |OptionSet| autocommand. Can be either "global" or "local"
Bram Moolenaard7c96872019-06-15 17:12:48 +02002656 *v:option_command*
2657v:option_command
2658 Command used to set the option. Valid while executing an
2659 |OptionSet| autocommand.
2660 value option was set via ~
2661 "setlocal" |:setlocal| or ":let l:xxx"
2662 "setglobal" |:setglobal| or ":let g:xxx"
2663 "set" |:set| or |:let|
2664 "modeline" |modeline|
Bram Moolenaar8af1fbf2008-01-05 12:35:21 +00002665 *v:operator* *operator-variable*
2666v:operator The last operator given in Normal mode. This is a single
2667 character except for commands starting with <g> or <z>,
2668 in which case it is two characters. Best used alongside
2669 |v:prevcount| and |v:register|. Useful if you want to cancel
2670 Operator-pending mode and then use the operator, e.g.: >
2671 :omap O <Esc>:call MyMotion(v:operator)<CR>
2672< The value remains set until another operator is entered, thus
2673 don't expect it to be empty.
2674 v:operator is not set for |:delete|, |:yank| or other Ex
2675 commands.
2676 Read-only.
2677
Bram Moolenaar071d4272004-06-13 20:20:40 +00002678 *v:prevcount* *prevcount-variable*
2679v:prevcount The count given for the last but one Normal mode command.
2680 This is the v:count value of the previous command. Useful if
Bram Moolenaar8af1fbf2008-01-05 12:35:21 +00002681 you want to cancel Visual or Operator-pending mode and then
2682 use the count, e.g.: >
Bram Moolenaar071d4272004-06-13 20:20:40 +00002683 :vmap % <Esc>:call MyFilter(v:prevcount)<CR>
2684< Read-only.
2685
Bram Moolenaar05159a02005-02-26 23:04:13 +00002686 *v:profiling* *profiling-variable*
Bram Moolenaar58b85342016-08-14 19:54:54 +02002687v:profiling Normally zero. Set to one after using ":profile start".
Bram Moolenaar05159a02005-02-26 23:04:13 +00002688 See |profiling|.
2689
Bram Moolenaar071d4272004-06-13 20:20:40 +00002690 *v:progname* *progname-variable*
2691v:progname Contains the name (with path removed) with which Vim was
Bram Moolenaard38b0552012-04-25 19:07:41 +02002692 invoked. Allows you to do special initialisations for |view|,
2693 |evim| etc., or any other name you might symlink to Vim.
Bram Moolenaar071d4272004-06-13 20:20:40 +00002694 Read-only.
2695
Bram Moolenaara1706c92014-04-01 19:55:49 +02002696 *v:progpath* *progpath-variable*
Bram Moolenaar56c860c2019-08-17 20:09:31 +02002697v:progpath Contains the command with which Vim was invoked, in a form
2698 that when passed to the shell will run the same Vim executable
2699 as the current one (if $PATH remains unchanged).
2700 Useful if you want to message a Vim server using a
Bram Moolenaara1706c92014-04-01 19:55:49 +02002701 |--remote-expr|.
Bram Moolenaarc7f02552014-04-01 21:00:59 +02002702 To get the full path use: >
2703 echo exepath(v:progpath)
Bram Moolenaar56c860c2019-08-17 20:09:31 +02002704< If the command has a relative path it will be expanded to the
2705 full path, so that it still works after `:cd`. Thus starting
2706 "./vim" results in "/home/user/path/to/vim/src/vim".
2707 On Linux and other systems it will always be the full path.
2708 On Mac it may just be "vim" and using exepath() as mentioned
2709 above should be used to get the full path.
Bram Moolenaar08cab962017-03-04 14:37:18 +01002710 On MS-Windows the executable may be called "vim.exe", but the
2711 ".exe" is not added to v:progpath.
Bram Moolenaara1706c92014-04-01 19:55:49 +02002712 Read-only.
2713
h_eastba77bbb2023-10-03 04:47:13 +09002714 *v:python3_version* *python3-version-variable*
Yee Cheng Chinc13b3d12023-08-20 21:18:38 +02002715v:python3_version
2716 Version of Python 3 that Vim was built against. When
2717 Python is loaded dynamically (|python-dynamic|), this version
2718 should exactly match the Python library up to the minor
2719 version (e.g. 3.10.2 and 3.10.3 are compatible as the minor
2720 version is "10", whereas 3.9.4 and 3.10.3 are not compatible).
2721 When |python-stable-abi| is used, this will be the minimum Python
2722 version that you can use instead. (e.g. if v:python3_version
2723 indicates 3.9, you can use 3.9, 3.10, or anything above).
2724
2725 This number is encoded as a hex number following Python ABI
2726 versioning conventions. Do the following to have a
2727 human-readable full version in hex: >
2728 echo printf("%08X", v:python3_version)
2729< You can obtain only the minor version by doing: >
2730 echo and(v:python3_version>>16,0xff)
2731< Read-only.
2732
Bram Moolenaar071d4272004-06-13 20:20:40 +00002733 *v:register* *register-variable*
Bram Moolenaard58e9292011-02-09 17:07:58 +01002734v:register The name of the register in effect for the current normal mode
Bram Moolenaard38b0552012-04-25 19:07:41 +02002735 command (regardless of whether that command actually used a
2736 register). Or for the currently executing normal mode mapping
2737 (use this in custom commands that take a register).
2738 If none is supplied it is the default register '"', unless
2739 'clipboard' contains "unnamed" or "unnamedplus", then it is
2740 '*' or '+'.
Bram Moolenaard58e9292011-02-09 17:07:58 +01002741 Also see |getreg()| and |setreg()|
Bram Moolenaar071d4272004-06-13 20:20:40 +00002742
Bram Moolenaar1c7715d2005-10-03 22:02:18 +00002743 *v:scrollstart* *scrollstart-variable*
2744v:scrollstart String describing the script or function that caused the
2745 screen to scroll up. It's only set when it is empty, thus the
2746 first reason is remembered. It is set to "Unknown" for a
2747 typed command.
2748 This can be used to find out why your script causes the
2749 hit-enter prompt.
2750
Bram Moolenaar071d4272004-06-13 20:20:40 +00002751 *v:servername* *servername-variable*
Bram Moolenaarc2ce52c2017-08-01 18:35:38 +02002752v:servername The resulting registered |client-server-name| if any.
Bram Moolenaar071d4272004-06-13 20:20:40 +00002753 Read-only.
2754
Bram Moolenaarb0d45e72017-11-05 18:19:24 +01002755
Bram Moolenaar446cb832008-06-24 21:56:24 +00002756v:searchforward *v:searchforward* *searchforward-variable*
2757 Search direction: 1 after a forward search, 0 after a
2758 backward search. It is reset to forward when directly setting
2759 the last search pattern, see |quote/|.
2760 Note that the value is restored when returning from a
2761 function. |function-search-undo|.
2762 Read-write.
2763
Bram Moolenaar071d4272004-06-13 20:20:40 +00002764 *v:shell_error* *shell_error-variable*
2765v:shell_error Result of the last shell command. When non-zero, the last
2766 shell command had an error. When zero, there was no problem.
2767 This only works when the shell returns the error code to Vim.
2768 The value -1 is often used when the command could not be
2769 executed. Read-only.
2770 Example: >
2771 :!mv foo bar
2772 :if v:shell_error
2773 : echo 'could not rename "foo" to "bar"!'
2774 :endif
Bram Moolenaard2e716e2019-04-20 14:39:52 +02002775< "shell_error" also works, for backwards compatibility, unless
2776 |scriptversion| is 3 or higher.
Bram Moolenaar071d4272004-06-13 20:20:40 +00002777
Bram Moolenaar113cb512021-11-07 20:27:04 +00002778 *v:sizeofint* *sizeofint-variable*
2779v:sizeofint Number of bytes in an int. Depends on how Vim was compiled.
2780 This is only useful for deciding whether a test will give the
2781 expected result.
2782
2783 *v:sizeoflong* *sizeoflong-variable*
2784v:sizeoflong Number of bytes in a long. Depends on how Vim was compiled.
2785 This is only useful for deciding whether a test will give the
2786 expected result.
2787
2788 *v:sizeofpointer* *sizeofpointer-variable*
2789v:sizeofpointer Number of bytes in a pointer. Depends on how Vim was compiled.
2790 This is only useful for deciding whether a test will give the
2791 expected result.
2792
ichizok663d18d2025-01-02 18:06:00 +01002793 *v:stacktrace* *stacktrace-variable*
2794v:stacktrace The stack trace of the exception most recently caught and
2795 not finished. Refer to |getstacktrace()| for the structure of
2796 stack trace. See also |v:exception|, |v:throwpoint|, and
2797 |throw-variables|.
2798
Bram Moolenaar071d4272004-06-13 20:20:40 +00002799 *v:statusmsg* *statusmsg-variable*
2800v:statusmsg Last given status message. It's allowed to set this variable.
2801
Bram Moolenaar4e330bb2005-12-07 21:04:31 +00002802 *v:swapname* *swapname-variable*
2803v:swapname Only valid when executing |SwapExists| autocommands: Name of
2804 the swap file found. Read-only.
2805
2806 *v:swapchoice* *swapchoice-variable*
2807v:swapchoice |SwapExists| autocommands can set this to the selected choice
2808 for handling an existing swap file:
2809 'o' Open read-only
2810 'e' Edit anyway
2811 'r' Recover
2812 'd' Delete swapfile
2813 'q' Quit
2814 'a' Abort
Bram Moolenaar58b85342016-08-14 19:54:54 +02002815 The value should be a single-character string. An empty value
Bram Moolenaar4e330bb2005-12-07 21:04:31 +00002816 results in the user being asked, as would happen when there is
2817 no SwapExists autocommand. The default is empty.
2818
Bram Moolenaarb3480382005-12-11 21:33:32 +00002819 *v:swapcommand* *swapcommand-variable*
Bram Moolenaar4770d092006-01-12 23:22:24 +00002820v:swapcommand Normal mode command to be executed after a file has been
Bram Moolenaarb3480382005-12-11 21:33:32 +00002821 opened. Can be used for a |SwapExists| autocommand to have
Bram Moolenaar58b85342016-08-14 19:54:54 +02002822 another Vim open the file and jump to the right place. For
Bram Moolenaarb3480382005-12-11 21:33:32 +00002823 example, when jumping to a tag the value is ":tag tagname\r".
Bram Moolenaar1f35bf92006-03-07 22:38:47 +00002824 For ":edit +cmd file" the value is ":cmd\r".
Bram Moolenaarb3480382005-12-11 21:33:32 +00002825
Bram Moolenaard823fa92016-08-12 16:29:27 +02002826 *v:t_TYPE* *v:t_bool* *t_bool-variable*
Bram Moolenaard09091d2019-01-17 16:07:22 +01002827v:t_bool Value of |Boolean| type. Read-only. See: |type()|
Bram Moolenaard823fa92016-08-12 16:29:27 +02002828 *v:t_channel* *t_channel-variable*
Bram Moolenaard09091d2019-01-17 16:07:22 +01002829v:t_channel Value of |Channel| type. Read-only. See: |type()|
Bram Moolenaard823fa92016-08-12 16:29:27 +02002830 *v:t_dict* *t_dict-variable*
Bram Moolenaard09091d2019-01-17 16:07:22 +01002831v:t_dict Value of |Dictionary| type. Read-only. See: |type()|
Bram Moolenaard823fa92016-08-12 16:29:27 +02002832 *v:t_float* *t_float-variable*
Bram Moolenaard09091d2019-01-17 16:07:22 +01002833v:t_float Value of |Float| type. Read-only. See: |type()|
Bram Moolenaard823fa92016-08-12 16:29:27 +02002834 *v:t_func* *t_func-variable*
Bram Moolenaard09091d2019-01-17 16:07:22 +01002835v:t_func Value of |Funcref| type. Read-only. See: |type()|
Bram Moolenaard823fa92016-08-12 16:29:27 +02002836 *v:t_job* *t_job-variable*
Bram Moolenaard09091d2019-01-17 16:07:22 +01002837v:t_job Value of |Job| type. Read-only. See: |type()|
Bram Moolenaard823fa92016-08-12 16:29:27 +02002838 *v:t_list* *t_list-variable*
Bram Moolenaard09091d2019-01-17 16:07:22 +01002839v:t_list Value of |List| type. Read-only. See: |type()|
Bram Moolenaard823fa92016-08-12 16:29:27 +02002840 *v:t_none* *t_none-variable*
Bram Moolenaard09091d2019-01-17 16:07:22 +01002841v:t_none Value of |None| type. Read-only. See: |type()|
Bram Moolenaard823fa92016-08-12 16:29:27 +02002842 *v:t_number* *t_number-variable*
Bram Moolenaard09091d2019-01-17 16:07:22 +01002843v:t_number Value of |Number| type. Read-only. See: |type()|
Bram Moolenaard823fa92016-08-12 16:29:27 +02002844 *v:t_string* *t_string-variable*
Bram Moolenaard09091d2019-01-17 16:07:22 +01002845v:t_string Value of |String| type. Read-only. See: |type()|
Bram Moolenaar6e5ea8d2019-01-12 22:47:31 +01002846 *v:t_blob* *t_blob-variable*
Bram Moolenaard09091d2019-01-17 16:07:22 +01002847v:t_blob Value of |Blob| type. Read-only. See: |type()|
Bram Moolenaarc0c2c262023-01-12 21:08:53 +00002848 *v:t_class* *t_class-variable*
2849v:t_class Value of |class| type. Read-only. See: |type()|
2850 *v:t_object* *t_object-variable*
2851v:t_object Value of |object| type. Read-only. See: |type()|
Yegappan Lakshmanan2a71b542023-12-14 20:03:03 +01002852 *v:t_typealias* *t_typealias-variable*
2853v:t_typealias Value of |typealias| type. Read-only. See: |type()|
Yegappan Lakshmanan3164cf82024-03-28 10:36:42 +01002854 *v:t_enum* *t_enum-variable*
2855v:t_enum Value of |enum| type. Read-only. See: |type()|
2856 *v:t_enumvalue* *t_enumvalue-variable*
2857v:t_enumvalue Value of |enumvalue| type. Read-only. See: |type()|
Yegappan Lakshmanan9cb865e2025-03-23 16:42:16 +01002858 *v:t_tuple* *t_tuple-variable*
2859v:t_tuple Value of |Tuple| type. Read-only. See: |type()|
Bram Moolenaarf562e722016-07-19 17:25:25 +02002860
Bram Moolenaar071d4272004-06-13 20:20:40 +00002861 *v:termresponse* *termresponse-variable*
2862v:termresponse The escape sequence returned by the terminal for the |t_RV|
Bram Moolenaar58b85342016-08-14 19:54:54 +02002863 termcap entry. It is set when Vim receives an escape sequence
Bram Moolenaarb4230122019-05-30 18:40:53 +02002864 that starts with ESC [ or CSI, then '>' or '?' and ends in a
2865 'c', with only digits and ';' in between.
Bram Moolenaar071d4272004-06-13 20:20:40 +00002866 When this option is set, the TermResponse autocommand event is
2867 fired, so that you can react to the response from the
Danek Duvalld7d56032024-01-14 20:19:59 +01002868 terminal. The TermResponseAll event is also fired, with
2869 <amatch> set to "version". You can use |terminalprops()| to see
2870 what Vim figured out about the terminal.
Bram Moolenaarb4230122019-05-30 18:40:53 +02002871 The response from a new xterm is: "<Esc>[> Pp ; Pv ; Pc c". Pp
Bram Moolenaar071d4272004-06-13 20:20:40 +00002872 is the terminal type: 0 for vt100 and 1 for vt220. Pv is the
2873 patch level (since this was introduced in patch 95, it's
Bram Moolenaarfa3b7232021-12-24 13:18:38 +00002874 always 95 or higher). Pc is always zero.
2875 If Pv is 141 or higher then Vim will try to request terminal
2876 codes. This only works with xterm |xterm-codes|.
Bram Moolenaar071d4272004-06-13 20:20:40 +00002877 {only when compiled with |+termresponse| feature}
2878
Bram Moolenaarf3af54e2017-08-30 14:53:06 +02002879 *v:termblinkresp*
2880v:termblinkresp The escape sequence returned by the terminal for the |t_RC|
2881 termcap entry. This is used to find out whether the terminal
Danek Duvalld7d56032024-01-14 20:19:59 +01002882 cursor is blinking. This is used by |term_getcursor()|. When
2883 this option is set, the TermResponseAll autocommand event is
2884 fired, with <amatch> set to "cursorblink".
Bram Moolenaarf3af54e2017-08-30 14:53:06 +02002885
2886 *v:termstyleresp*
2887v:termstyleresp The escape sequence returned by the terminal for the |t_RS|
2888 termcap entry. This is used to find out what the shape of the
Danek Duvalld7d56032024-01-14 20:19:59 +01002889 cursor is. This is used by |term_getcursor()|. When this
2890 option is set, the TermResponseAll autocommand event is fired,
2891 with <amatch> set to "cursorshape".
Bram Moolenaarf3af54e2017-08-30 14:53:06 +02002892
Bram Moolenaar65e4c4f2017-10-14 23:24:25 +02002893 *v:termrbgresp*
2894v:termrbgresp The escape sequence returned by the terminal for the |t_RB|
Bram Moolenaarf3af54e2017-08-30 14:53:06 +02002895 termcap entry. This is used to find out what the terminal
Danek Duvalld7d56032024-01-14 20:19:59 +01002896 background color is; see 'background'. When this option is
2897 set, the TermResponseAll autocommand event is fired, with
2898 <amatch> set to "background".
Bram Moolenaarf3af54e2017-08-30 14:53:06 +02002899
Bram Moolenaar65e4c4f2017-10-14 23:24:25 +02002900 *v:termrfgresp*
2901v:termrfgresp The escape sequence returned by the terminal for the |t_RF|
2902 termcap entry. This is used to find out what the terminal
Danek Duvalld7d56032024-01-14 20:19:59 +01002903 foreground color is. When this option is set, the
2904 TermResponseAll autocommand event is fired, with <amatch> set
2905 to "foreground".
Bram Moolenaar65e4c4f2017-10-14 23:24:25 +02002906
Bram Moolenaarf3af54e2017-08-30 14:53:06 +02002907 *v:termu7resp*
2908v:termu7resp The escape sequence returned by the terminal for the |t_u7|
2909 termcap entry. This is used to find out what the terminal
Danek Duvalld7d56032024-01-14 20:19:59 +01002910 does with ambiguous width characters, see 'ambiwidth'. When
2911 this option is set, the TermResponseAll autocommand event is
2912 fired, with <amatch> set to "ambiguouswidth".
Bram Moolenaarf3af54e2017-08-30 14:53:06 +02002913
Bram Moolenaarebf7dfa2016-04-14 12:46:51 +02002914 *v:testing* *testing-variable*
Bram Moolenaar8e8df252016-05-25 21:23:21 +02002915v:testing Must be set before using `test_garbagecollect_now()`.
Bram Moolenaar036986f2017-03-16 17:41:02 +01002916 Also, when set certain error messages won't be shown for 2
Bram Moolenaarb0d45e72017-11-05 18:19:24 +01002917 seconds. (e.g. "'dictionary' option is empty")
Bram Moolenaarebf7dfa2016-04-14 12:46:51 +02002918
Bram Moolenaar071d4272004-06-13 20:20:40 +00002919 *v:this_session* *this_session-variable*
2920v:this_session Full filename of the last loaded or saved session file. See
2921 |:mksession|. It is allowed to set this variable. When no
2922 session file has been saved, this variable is empty.
Bram Moolenaard2e716e2019-04-20 14:39:52 +02002923 "this_session" also works, for backwards compatibility, unless
2924 |scriptversion| is 3 or higher
Bram Moolenaar071d4272004-06-13 20:20:40 +00002925
2926 *v:throwpoint* *throwpoint-variable*
2927v:throwpoint The point where the exception most recently caught and not
Bram Moolenaar58b85342016-08-14 19:54:54 +02002928 finished was thrown. Not set when commands are typed. See
ichizok663d18d2025-01-02 18:06:00 +01002929 also |v:exception|, |v:stacktrace|, and |throw-variables|.
Bram Moolenaar071d4272004-06-13 20:20:40 +00002930 Example: >
2931 :try
2932 : throw "oops"
2933 :catch /.*/
2934 : echo "Exception from" v:throwpoint
2935 :endtry
2936< Output: "Exception from test.vim, line 2"
2937
Bram Moolenaar520e1e42016-01-23 19:46:28 +01002938 *v:true* *true-variable*
2939v:true A Number with value one. Used to put "true" in JSON. See
Bram Moolenaar6463ca22016-02-13 17:04:46 +01002940 |json_encode()|.
Bram Moolenaarc95a3022016-06-12 23:01:46 +02002941 When used as a string this evaluates to "v:true". >
Bram Moolenaar705ada12016-01-24 17:56:50 +01002942 echo v:true
Bram Moolenaarc95a3022016-06-12 23:01:46 +02002943< v:true ~
2944 That is so that eval() can parse the string back to the same
Bram Moolenaardf48fb42016-07-22 21:50:18 +02002945 value. Read-only.
Bram Moolenaar5da36052021-12-27 15:39:57 +00002946 In |Vim9| script "true" can be used which has a boolean type.
Bram Moolenaar2fda12f2005-01-15 22:14:15 +00002947 *v:val* *val-variable*
Bram Moolenaar58b85342016-08-14 19:54:54 +02002948v:val Value of the current item of a |List| or |Dictionary|. Only
Bram Moolenaar32466aa2006-02-24 23:53:04 +00002949 valid while evaluating the expression used with |map()| and
Bram Moolenaar2fda12f2005-01-15 22:14:15 +00002950 |filter()|. Read-only.
2951
Bram Moolenaar071d4272004-06-13 20:20:40 +00002952 *v:version* *version-variable*
2953v:version Version number of Vim: Major version number times 100 plus
Bram Moolenaar9b283522019-06-17 22:19:33 +02002954 minor version number. Version 5.0 is 500. Version 5.1
Bram Moolenaar071d4272004-06-13 20:20:40 +00002955 is 501. Read-only. "version" also works, for backwards
Bram Moolenaard2e716e2019-04-20 14:39:52 +02002956 compatibility, unless |scriptversion| is 3 or higher.
Bram Moolenaar071d4272004-06-13 20:20:40 +00002957 Use |has()| to check if a certain patch was included, e.g.: >
Bram Moolenaar6716d9a2014-04-02 12:12:08 +02002958 if has("patch-7.4.123")
Bram Moolenaar071d4272004-06-13 20:20:40 +00002959< Note that patch numbers are specific to the version, thus both
2960 version 5.0 and 5.1 may have a patch 123, but these are
2961 completely different.
2962
Bram Moolenaar37df9a42019-06-14 14:39:51 +02002963 *v:versionlong* *versionlong-variable*
Bram Moolenaar9b283522019-06-17 22:19:33 +02002964v:versionlong Like v:version, but also including the patchlevel in the last
2965 four digits. Version 8.1 with patch 123 has value 8010123.
2966 This can be used like this: >
2967 if v:versionlong >= 8010123
Bram Moolenaar37df9a42019-06-14 14:39:51 +02002968< However, if there are gaps in the list of patches included
2969 this will not work well. This can happen if a recent patch
2970 was included into an older version, e.g. for a security fix.
2971 Use the has() function to make sure the patch is actually
2972 included.
2973
Bram Moolenaar14735512016-03-26 21:00:08 +01002974 *v:vim_did_enter* *vim_did_enter-variable*
2975v:vim_did_enter Zero until most of startup is done. It is set to one just
2976 before |VimEnter| autocommands are triggered.
2977
Bram Moolenaar071d4272004-06-13 20:20:40 +00002978 *v:warningmsg* *warningmsg-variable*
2979v:warningmsg Last given warning message. It's allowed to set this variable.
2980
Foxe Chenb90c2392025-06-27 21:10:35 +02002981 *v:wayland_display*
2982v:wayland_display
2983 The name of the Wayland display that Vim is connected to.
2984 Equivalent to the $WAYLAND_DISPLAY environment variable.
2985 If this is empty, then Vim is not connected to any display.
2986
Bram Moolenaar727c8762010-10-20 19:17:48 +02002987 *v:windowid* *windowid-variable*
Christian Brabandte5bc2e42024-06-01 20:55:09 +02002988v:windowid When any X11/Wayland based GUI is running or when running in a
Bram Moolenaar727c8762010-10-20 19:17:48 +02002989 terminal and Vim connects to the X server (|-X|) this will be
Bram Moolenaar264e9fd2010-10-27 12:33:17 +02002990 set to the window ID.
2991 When an MS-Windows GUI is running this will be set to the
2992 window handle.
2993 Otherwise the value is zero.
Bram Moolenaar7571d552016-08-18 22:54:46 +02002994 Note: for windows inside Vim use |winnr()| or |win_getid()|,
2995 see |window-ID|.
Bram Moolenaar727c8762010-10-20 19:17:48 +02002996
Bram Moolenaar071d4272004-06-13 20:20:40 +00002997==============================================================================
29984. Builtin Functions *functions*
2999
3000See |function-list| for a list grouped by what the function is used for.
3001
Bram Moolenaar1cae5a02021-12-27 21:28:34 +00003002The alphabetic list of all builtin functions and details are in a separate
3003help file: |builtin-functions|.
Bram Moolenaar071d4272004-06-13 20:20:40 +00003004
3005==============================================================================
30065. Defining functions *user-functions*
3007
3008New functions can be defined. These can be called just like builtin
Bram Moolenaar0daafaa2022-09-04 17:45:43 +01003009functions. The function takes arguments, executes a sequence of Ex commands
3010and can return a value.
Bram Moolenaar071d4272004-06-13 20:20:40 +00003011
Bram Moolenaar0daafaa2022-09-04 17:45:43 +01003012You can find most information about defining functions in |userfunc.txt|.
3013For Vim9 functions, which execute much faster, support type checking and more,
3014see |vim9.txt|.
Bram Moolenaar433f7c82006-03-21 21:29:36 +00003015
Bram Moolenaar071d4272004-06-13 20:20:40 +00003016==============================================================================
30176. Curly braces names *curly-braces-names*
3018
Bram Moolenaar84f72352012-03-11 15:57:40 +01003019In most places where you can use a variable, you can use a "curly braces name"
3020variable. This is a regular variable name with one or more expressions
3021wrapped in braces {} like this: >
Bram Moolenaar071d4272004-06-13 20:20:40 +00003022 my_{adjective}_variable
3023
Bram Moolenaar5da36052021-12-27 15:39:57 +00003024This only works in legacy Vim script, not in |Vim9| script.
3025
Bram Moolenaar071d4272004-06-13 20:20:40 +00003026When Vim encounters this, it evaluates the expression inside the braces, puts
3027that in place of the expression, and re-interprets the whole as a variable
3028name. So in the above example, if the variable "adjective" was set to
3029"noisy", then the reference would be to "my_noisy_variable", whereas if
3030"adjective" was set to "quiet", then it would be to "my_quiet_variable".
3031
3032One application for this is to create a set of variables governed by an option
Bram Moolenaar58b85342016-08-14 19:54:54 +02003033value. For example, the statement >
Bram Moolenaar071d4272004-06-13 20:20:40 +00003034 echo my_{&background}_message
3035
3036would output the contents of "my_dark_message" or "my_light_message" depending
3037on the current value of 'background'.
3038
3039You can use multiple brace pairs: >
3040 echo my_{adverb}_{adjective}_message
3041..or even nest them: >
3042 echo my_{ad{end_of_word}}_message
3043where "end_of_word" is either "verb" or "jective".
3044
3045However, the expression inside the braces must evaluate to a valid single
Bram Moolenaar402d2fe2005-04-15 21:00:38 +00003046variable name, e.g. this is invalid: >
Bram Moolenaar071d4272004-06-13 20:20:40 +00003047 :let foo='a + b'
3048 :echo c{foo}d
3049.. since the result of expansion is "ca + bd", which is not a variable name.
3050
3051 *curly-braces-function-names*
3052You can call and define functions by an evaluated name in a similar way.
3053Example: >
3054 :let func_end='whizz'
3055 :call my_func_{func_end}(parameter)
3056
3057This would call the function "my_func_whizz(parameter)".
3058
Bram Moolenaar84f72352012-03-11 15:57:40 +01003059This does NOT work: >
3060 :let i = 3
3061 :let @{i} = '' " error
3062 :echo @{i} " error
3063
Bram Moolenaar071d4272004-06-13 20:20:40 +00003064==============================================================================
30657. Commands *expression-commands*
3066
Bram Moolenaar5da36052021-12-27 15:39:57 +00003067Note: in |Vim9| script `:let` is not used. `:var` is used for variable
3068declarations and assignments do not use a command. |vim9-declaration|
Bram Moolenaar65e0d772020-06-14 17:29:55 +02003069
Bram Moolenaar071d4272004-06-13 20:20:40 +00003070:let {var-name} = {expr1} *:let* *E18*
3071 Set internal variable {var-name} to the result of the
3072 expression {expr1}. The variable will get the type
3073 from the {expr}. If {var-name} didn't exist yet, it
3074 is created.
3075
Bram Moolenaarf10911e2022-01-29 22:20:48 +00003076:let {var-name}[{idx}] = {expr1} *E689* *E1141*
Bram Moolenaar13065c42005-01-08 16:08:21 +00003077 Set a list item to the result of the expression
3078 {expr1}. {var-name} must refer to a list and {idx}
3079 must be a valid index in that list. For nested list
3080 the index can be repeated.
Bram Moolenaar446cb832008-06-24 21:56:24 +00003081 This cannot be used to add an item to a |List|.
Bram Moolenaar58b85342016-08-14 19:54:54 +02003082 This cannot be used to set a byte in a String. You
Bram Moolenaar446cb832008-06-24 21:56:24 +00003083 can do that like this: >
Bram Moolenaarc51cf032022-02-26 12:25:45 +00003084 :let var = var[0:2] .. 'X' .. var[4:]
Bram Moolenaar6e5ea8d2019-01-12 22:47:31 +01003085< When {var-name} is a |Blob| then {idx} can be the
3086 length of the blob, in which case one byte is
3087 appended.
3088
Bram Moolenaara2baa732022-02-04 16:09:54 +00003089 *E711* *E719* *E1165* *E1166* *E1183*
Bram Moolenaar3a3a7232005-01-17 22:16:15 +00003090:let {var-name}[{idx1}:{idx2}] = {expr1} *E708* *E709* *E710*
Bram Moolenaar32466aa2006-02-24 23:53:04 +00003091 Set a sequence of items in a |List| to the result of
3092 the expression {expr1}, which must be a list with the
Bram Moolenaar9588a0f2005-01-08 21:45:39 +00003093 correct number of items.
3094 {idx1} can be omitted, zero is used instead.
3095 {idx2} can be omitted, meaning the end of the list.
3096 When the selected range of items is partly past the
3097 end of the list, items will be added.
3098
Bram Moolenaar6f4754b2022-01-23 12:07:04 +00003099 *:let+=* *:let-=* *:letstar=* *:let/=* *:let%=*
3100 *:let.=* *:let..=* *E734* *E985* *E1019*
Bram Moolenaar3a3a7232005-01-17 22:16:15 +00003101:let {var} += {expr1} Like ":let {var} = {var} + {expr1}".
3102:let {var} -= {expr1} Like ":let {var} = {var} - {expr1}".
Bram Moolenaarff697e62019-02-12 22:28:33 +01003103:let {var} *= {expr1} Like ":let {var} = {var} * {expr1}".
3104:let {var} /= {expr1} Like ":let {var} = {var} / {expr1}".
3105:let {var} %= {expr1} Like ":let {var} = {var} % {expr1}".
Bram Moolenaar3a3a7232005-01-17 22:16:15 +00003106:let {var} .= {expr1} Like ":let {var} = {var} . {expr1}".
Bram Moolenaar558ca4a2019-04-04 18:15:38 +02003107:let {var} ..= {expr1} Like ":let {var} = {var} .. {expr1}".
Bram Moolenaar3a3a7232005-01-17 22:16:15 +00003108 These fail if {var} was not set yet and when the type
3109 of {var} and {expr1} don't fit the operator.
zeertzjqb8170142024-02-08 11:21:44 +01003110 `+=` modifies a |List| or a |Blob| in-place instead of
3111 creating a new one.
Bram Moolenaar558ca4a2019-04-04 18:15:38 +02003112 `.=` is not supported with Vim script version 2 and
3113 later, see |vimscript-version|.
Bram Moolenaar3a3a7232005-01-17 22:16:15 +00003114
3115
Bram Moolenaar071d4272004-06-13 20:20:40 +00003116:let ${env-name} = {expr1} *:let-environment* *:let-$*
3117 Set environment variable {env-name} to the result of
3118 the expression {expr1}. The type is always String.
Bram Moolenaar56c860c2019-08-17 20:09:31 +02003119
3120 On some systems making an environment variable empty
3121 causes it to be deleted. Many systems do not make a
3122 difference between an environment variable that is not
3123 set and an environment variable that is empty.
3124
Bram Moolenaar3a3a7232005-01-17 22:16:15 +00003125:let ${env-name} .= {expr1}
3126 Append {expr1} to the environment variable {env-name}.
3127 If the environment variable didn't exist yet this
3128 works like "=".
Bram Moolenaar071d4272004-06-13 20:20:40 +00003129
3130:let @{reg-name} = {expr1} *:let-register* *:let-@*
3131 Write the result of the expression {expr1} in register
3132 {reg-name}. {reg-name} must be a single letter, and
3133 must be the name of a writable register (see
3134 |registers|). "@@" can be used for the unnamed
3135 register, "@/" for the search pattern.
3136 If the result of {expr1} ends in a <CR> or <NL>, the
3137 register will be linewise, otherwise it will be set to
3138 characterwise.
3139 This can be used to clear the last search pattern: >
3140 :let @/ = ""
3141< This is different from searching for an empty string,
3142 that would match everywhere.
3143
Bram Moolenaar3a3a7232005-01-17 22:16:15 +00003144:let @{reg-name} .= {expr1}
Bram Moolenaar58b85342016-08-14 19:54:54 +02003145 Append {expr1} to register {reg-name}. If the
Bram Moolenaar3a3a7232005-01-17 22:16:15 +00003146 register was empty it's like setting it to {expr1}.
3147
Bram Moolenaaref2f6562007-05-06 13:32:59 +00003148:let &{option-name} = {expr1} *:let-option* *:let-&*
Bram Moolenaar071d4272004-06-13 20:20:40 +00003149 Set option {option-name} to the result of the
Bram Moolenaarfca34d62005-01-04 21:38:36 +00003150 expression {expr1}. A String or Number value is
3151 always converted to the type of the option.
Bram Moolenaar071d4272004-06-13 20:20:40 +00003152 For an option local to a window or buffer the effect
3153 is just like using the |:set| command: both the local
Bram Moolenaara5fac542005-10-12 20:58:49 +00003154 value and the global value are changed.
Bram Moolenaarfca34d62005-01-04 21:38:36 +00003155 Example: >
Bram Moolenaarc51cf032022-02-26 12:25:45 +00003156 :let &path = &path .. ',/usr/local/include'
Bram Moolenaar3df01732017-02-17 22:47:16 +01003157< This also works for terminal codes in the form t_xx.
3158 But only for alphanumerical names. Example: >
3159 :let &t_k1 = "\<Esc>[234;"
3160< When the code does not exist yet it will be created as
3161 a terminal key code, there is no error.
Bram Moolenaar071d4272004-06-13 20:20:40 +00003162
Bram Moolenaar3a3a7232005-01-17 22:16:15 +00003163:let &{option-name} .= {expr1}
3164 For a string option: Append {expr1} to the value.
3165 Does not insert a comma like |:set+=|.
3166
3167:let &{option-name} += {expr1}
3168:let &{option-name} -= {expr1}
3169 For a number or boolean option: Add or subtract
3170 {expr1}.
3171
Bram Moolenaar071d4272004-06-13 20:20:40 +00003172:let &l:{option-name} = {expr1}
Bram Moolenaar3a3a7232005-01-17 22:16:15 +00003173:let &l:{option-name} .= {expr1}
3174:let &l:{option-name} += {expr1}
3175:let &l:{option-name} -= {expr1}
Bram Moolenaar071d4272004-06-13 20:20:40 +00003176 Like above, but only set the local value of an option
3177 (if there is one). Works like |:setlocal|.
3178
3179:let &g:{option-name} = {expr1}
Bram Moolenaar3a3a7232005-01-17 22:16:15 +00003180:let &g:{option-name} .= {expr1}
3181:let &g:{option-name} += {expr1}
3182:let &g:{option-name} -= {expr1}
Bram Moolenaar071d4272004-06-13 20:20:40 +00003183 Like above, but only set the global value of an option
3184 (if there is one). Works like |:setglobal|.
Yegappan Lakshmanan9cb865e2025-03-23 16:42:16 +01003185 *E1093* *E1537* *E1538* *E1535*
Bram Moolenaar13065c42005-01-08 16:08:21 +00003186:let [{name1}, {name2}, ...] = {expr1} *:let-unpack* *E687* *E688*
Yegappan Lakshmanan9cb865e2025-03-23 16:42:16 +01003187 {expr1} must evaluate to a |List| or a |Tuple|. The
3188 first item in the list or tuple is assigned to
3189 {name1}, the second item to {name2}, etc.
Bram Moolenaarfca34d62005-01-04 21:38:36 +00003190 The number of names must match the number of items in
Yegappan Lakshmanan9cb865e2025-03-23 16:42:16 +01003191 the |List| or |Tuple|.
Bram Moolenaarfca34d62005-01-04 21:38:36 +00003192 Each name can be one of the items of the ":let"
3193 command as mentioned above.
3194 Example: >
3195 :let [s, item] = GetItem(s)
Bram Moolenaar3a3a7232005-01-17 22:16:15 +00003196< Detail: {expr1} is evaluated first, then the
3197 assignments are done in sequence. This matters if
3198 {name2} depends on {name1}. Example: >
3199 :let x = [0, 1]
3200 :let i = 0
3201 :let [i, x[i]] = [1, 2]
3202 :echo x
3203< The result is [0, 2].
3204
3205:let [{name1}, {name2}, ...] .= {expr1}
3206:let [{name1}, {name2}, ...] += {expr1}
3207:let [{name1}, {name2}, ...] -= {expr1}
Yegappan Lakshmanan9cb865e2025-03-23 16:42:16 +01003208:let [{name1}, {name2}, ...] *= {expr1}
3209:let [{name1}, {name2}, ...] /= {expr1}
3210:let [{name1}, {name2}, ...] %= {expr1}
3211 Like above, but append, add, subtract, multiply,
3212 divide, or modulo the value for each |List| or |Tuple|
3213 item.
Bram Moolenaarfca34d62005-01-04 21:38:36 +00003214
Bram Moolenaard1caa942020-04-10 22:10:56 +02003215:let [{name}, ..., ; {lastname}] = {expr1} *E452*
Yegappan Lakshmanan9cb865e2025-03-23 16:42:16 +01003216 Like |:let-unpack| above, but the |List| or |Tuple|
3217 may have more items than there are names. A list or a
3218 tuple of the remaining items is assigned to
3219 {lastname}. If there are no remaining items,
3220 {lastname} is set to an empty list or tuple.
Bram Moolenaarfca34d62005-01-04 21:38:36 +00003221 Example: >
3222 :let [a, b; rest] = ["aval", "bval", 3, 4]
Yegappan Lakshmanan9cb865e2025-03-23 16:42:16 +01003223 :let [a, b; rest] = ("aval", "bval", 3, 4)
Bram Moolenaarfca34d62005-01-04 21:38:36 +00003224<
Bram Moolenaar3a3a7232005-01-17 22:16:15 +00003225:let [{name}, ..., ; {lastname}] .= {expr1}
3226:let [{name}, ..., ; {lastname}] += {expr1}
3227:let [{name}, ..., ; {lastname}] -= {expr1}
3228 Like above, but append/add/subtract the value for each
Bram Moolenaar32466aa2006-02-24 23:53:04 +00003229 |List| item.
Bram Moolenaar4a748032010-09-30 21:47:56 +02003230
Bram Moolenaar24582002019-07-21 14:14:26 +02003231 *:let=<<* *:let-heredoc*
Bram Moolenaarf10911e2022-01-29 22:20:48 +00003232 *E990* *E991* *E172* *E221* *E1145*
Yegappan Lakshmananefbfa862022-04-17 12:47:40 +01003233:let {var-name} =<< [trim] [eval] {endmarker}
Bram Moolenaarf5842c52019-05-19 18:41:26 +02003234text...
3235text...
Bram Moolenaar2e693a82019-10-16 22:35:02 +02003236{endmarker}
Bram Moolenaare46a4402020-06-30 20:38:27 +02003237 Set internal variable {var-name} to a |List|
3238 containing the lines of text bounded by the string
Yegappan Lakshmananefbfa862022-04-17 12:47:40 +01003239 {endmarker}.
3240
3241 If "eval" is not specified, then each line of text is
Bram Moolenaard899e512022-05-07 21:54:03 +01003242 used as a |literal-string|, except that single quotes
Bram Moolenaar8a3b8052022-06-26 12:21:15 +01003243 does not need to be doubled.
Bram Moolenaard899e512022-05-07 21:54:03 +01003244 If "eval" is specified, then any Vim expression in the
3245 form {expr} is evaluated and the result replaces the
Bram Moolenaarb59ae592022-11-23 23:46:31 +00003246 expression, like with |interpolated-string|.
Yegappan Lakshmananefbfa862022-04-17 12:47:40 +01003247 Example where $HOME is expanded: >
3248 let lines =<< trim eval END
3249 some text
Bram Moolenaard899e512022-05-07 21:54:03 +01003250 See the file {$HOME}/.vimrc
Yegappan Lakshmananefbfa862022-04-17 12:47:40 +01003251 more text
3252 END
3253< There can be multiple Vim expressions in a single line
3254 but an expression cannot span multiple lines. If any
3255 expression evaluation fails, then the assignment fails.
Yegappan Lakshmananefbfa862022-04-17 12:47:40 +01003256
Bram Moolenaar2e693a82019-10-16 22:35:02 +02003257 {endmarker} must not contain white space.
3258 {endmarker} cannot start with a lower case character.
3259 The last line should end only with the {endmarker}
3260 string without any other character. Watch out for
3261 white space after {endmarker}!
Bram Moolenaarf5842c52019-05-19 18:41:26 +02003262
Bram Moolenaare7eb9272019-06-24 00:58:07 +02003263 Without "trim" any white space characters in the lines
3264 of text are preserved. If "trim" is specified before
Bram Moolenaar2e693a82019-10-16 22:35:02 +02003265 {endmarker}, then indentation is stripped so you can
3266 do: >
Bram Moolenaare7eb9272019-06-24 00:58:07 +02003267 let text =<< trim END
3268 if ok
3269 echo 'done'
3270 endif
3271 END
3272< Results in: ["if ok", " echo 'done'", "endif"]
3273 The marker must line up with "let" and the indentation
3274 of the first line is removed from all the text lines.
3275 Specifically: all the leading indentation exactly
3276 matching the leading indentation of the first
3277 non-empty text line is stripped from the input lines.
3278 All leading indentation exactly matching the leading
3279 indentation before `let` is stripped from the line
Bram Moolenaar2e693a82019-10-16 22:35:02 +02003280 containing {endmarker}. Note that the difference
3281 between space and tab matters here.
Bram Moolenaarf5842c52019-05-19 18:41:26 +02003282
3283 If {var-name} didn't exist yet, it is created.
3284 Cannot be followed by another command, but can be
3285 followed by a comment.
3286
Bram Moolenaar2e693a82019-10-16 22:35:02 +02003287 To avoid line continuation to be applied, consider
3288 adding 'C' to 'cpoptions': >
3289 set cpo+=C
3290 let var =<< END
3291 \ leading backslash
3292 END
3293 set cpo-=C
3294<
Bram Moolenaarf5842c52019-05-19 18:41:26 +02003295 Examples: >
3296 let var1 =<< END
Bram Moolenaar2e693a82019-10-16 22:35:02 +02003297 Sample text 1
3298 Sample text 2
3299 Sample text 3
3300 END
Bram Moolenaarf5842c52019-05-19 18:41:26 +02003301
3302 let data =<< trim DATA
Bram Moolenaar2e693a82019-10-16 22:35:02 +02003303 1 2 3 4
3304 5 6 7 8
Bram Moolenaarf5842c52019-05-19 18:41:26 +02003305 DATA
Yegappan Lakshmananefbfa862022-04-17 12:47:40 +01003306
3307 let code =<< trim eval CODE
Bram Moolenaard899e512022-05-07 21:54:03 +01003308 let v = {10 + 20}
3309 let h = "{$HOME}"
3310 let s = "{Str1()} abc {Str2()}"
3311 let n = {MyFunc(3, 4)}
Yegappan Lakshmananefbfa862022-04-17 12:47:40 +01003312 CODE
Bram Moolenaarf5842c52019-05-19 18:41:26 +02003313<
Bram Moolenaar4a748032010-09-30 21:47:56 +02003314 *E121*
Bram Moolenaar58b85342016-08-14 19:54:54 +02003315:let {var-name} .. List the value of variable {var-name}. Multiple
Bram Moolenaardcaf10e2005-01-21 11:55:25 +00003316 variable names may be given. Special names recognized
3317 here: *E738*
Bram Moolenaarca003e12006-03-17 23:19:38 +00003318 g: global variables
3319 b: local buffer variables
3320 w: local window variables
Bram Moolenaar910f66f2006-04-05 20:41:53 +00003321 t: local tab page variables
Bram Moolenaarca003e12006-03-17 23:19:38 +00003322 s: script-local variables
3323 l: local function variables
Bram Moolenaardcaf10e2005-01-21 11:55:25 +00003324 v: Vim variables.
Bram Moolenaar65e0d772020-06-14 17:29:55 +02003325 This does not work in Vim9 script. |vim9-declaration|
Bram Moolenaar071d4272004-06-13 20:20:40 +00003326
Bram Moolenaard7ee7ce2005-01-03 21:02:03 +00003327:let List the values of all variables. The type of the
3328 variable is indicated before the value:
3329 <nothing> String
3330 # Number
Bram Moolenaarc9b4b052006-04-30 18:54:39 +00003331 * Funcref
Bram Moolenaar65e0d772020-06-14 17:29:55 +02003332 This does not work in Vim9 script. |vim9-declaration|
Bram Moolenaar071d4272004-06-13 20:20:40 +00003333
Bram Moolenaar6f4754b2022-01-23 12:07:04 +00003334:unl[et][!] {name} ... *:unlet* *:unl* *E108* *E795* *E1081*
Bram Moolenaar2ce06f62005-01-31 19:19:04 +00003335 Remove the internal variable {name}. Several variable
3336 names can be given, they are all removed. The name
Bram Moolenaar32466aa2006-02-24 23:53:04 +00003337 may also be a |List| or |Dictionary| item.
Bram Moolenaar071d4272004-06-13 20:20:40 +00003338 With [!] no error message is given for non-existing
3339 variables.
Bram Moolenaar32466aa2006-02-24 23:53:04 +00003340 One or more items from a |List| can be removed: >
Bram Moolenaar9cd15162005-01-16 22:02:49 +00003341 :unlet list[3] " remove fourth item
3342 :unlet list[3:] " remove fourth item to last
Bram Moolenaar32466aa2006-02-24 23:53:04 +00003343< One item from a |Dictionary| can be removed at a time: >
Bram Moolenaar9cd15162005-01-16 22:02:49 +00003344 :unlet dict['two']
3345 :unlet dict.two
Bram Moolenaarc236c162008-07-13 17:41:49 +00003346< This is especially useful to clean up used global
3347 variables and script-local variables (these are not
3348 deleted when the script ends). Function-local
3349 variables are automatically deleted when the function
3350 ends.
Bram Moolenaar1b5f03e2023-01-09 20:12:45 +00003351 In |Vim9| script variables declared in a function or
3352 script cannot be removed.
Bram Moolenaar071d4272004-06-13 20:20:40 +00003353
Bram Moolenaar137374f2018-05-13 15:59:50 +02003354:unl[et] ${env-name} ... *:unlet-environment* *:unlet-$*
3355 Remove environment variable {env-name}.
3356 Can mix {name} and ${env-name} in one :unlet command.
3357 No error message is given for a non-existing
3358 variable, also without !.
3359 If the system does not support deleting an environment
Bram Moolenaar9937a052019-06-15 15:45:06 +02003360 variable, it is made empty.
Bram Moolenaar137374f2018-05-13 15:59:50 +02003361
Bram Moolenaar6f4754b2022-01-23 12:07:04 +00003362 *:cons* *:const* *E1018*
Bram Moolenaar9937a052019-06-15 15:45:06 +02003363:cons[t] {var-name} = {expr1}
3364:cons[t] [{name1}, {name2}, ...] = {expr1}
Bram Moolenaar9937a052019-06-15 15:45:06 +02003365:cons[t] [{name}, ..., ; {lastname}] = {expr1}
h-east53753f62024-05-05 18:42:31 +02003366:cons[t] {var-name} =<< [trim] [eval] {marker}
Bram Moolenaar9937a052019-06-15 15:45:06 +02003367text...
3368text...
3369{marker}
3370 Similar to |:let|, but additionally lock the variable
3371 after setting the value. This is the same as locking
3372 the variable with |:lockvar| just after |:let|, thus: >
3373 :const x = 1
3374< is equivalent to: >
3375 :let x = 1
Bram Moolenaar021bda52020-08-17 21:07:22 +02003376 :lockvar! x
Bram Moolenaara187c432020-09-16 21:08:28 +02003377< NOTE: in Vim9 script `:const` works differently, see
3378 |vim9-const|
3379 This is useful if you want to make sure the variable
Bram Moolenaar021bda52020-08-17 21:07:22 +02003380 is not modified. If the value is a List or Dictionary
3381 literal then the items also cannot be changed: >
3382 const ll = [1, 2, 3]
3383 let ll[1] = 5 " Error!
Bram Moolenaar6e649222021-10-04 21:32:54 +01003384< Nested references are not locked: >
Bram Moolenaar021bda52020-08-17 21:07:22 +02003385 let lvar = ['a']
3386 const lconst = [0, lvar]
3387 let lconst[0] = 2 " Error!
3388 let lconst[1][0] = 'b' " OK
3389< *E995*
Shane Harperc1b39842024-07-17 19:40:40 +02003390 It is an error to specify an existing variable with
h-east52e7cc22024-07-28 17:03:29 +02003391 |:const|. >
Bram Moolenaar9937a052019-06-15 15:45:06 +02003392 :let x = 1
Shane Harperc1b39842024-07-17 19:40:40 +02003393 :const x = 1 " Error!
Bram Moolenaar1c196e72019-06-16 15:41:58 +02003394< *E996*
3395 Note that environment variables, option values and
3396 register values cannot be used here, since they cannot
3397 be locked.
3398
Bram Moolenaar85850f32019-07-19 22:05:51 +02003399:cons[t]
3400:cons[t] {var-name}
3401 If no argument is given or only {var-name} is given,
3402 the behavior is the same as |:let|.
3403
Bram Moolenaar2ce06f62005-01-31 19:19:04 +00003404:lockv[ar][!] [depth] {name} ... *:lockvar* *:lockv*
3405 Lock the internal variable {name}. Locking means that
3406 it can no longer be changed (until it is unlocked).
3407 A locked variable can be deleted: >
3408 :lockvar v
Bram Moolenaardad44732021-03-31 20:07:33 +02003409 :let v = 'asdf' " fails!
3410 :unlet v " works
Bram Moolenaarf10911e2022-01-29 22:20:48 +00003411< *E741* *E940* *E1118* *E1119* *E1120* *E1121* *E1122*
Bram Moolenaar2ce06f62005-01-31 19:19:04 +00003412 If you try to change a locked variable you get an
Bram Moolenaare7877fe2017-02-20 22:35:33 +01003413 error message: "E741: Value is locked: {name}".
3414 If you try to lock or unlock a built-in variable you
3415 get an error message: "E940: Cannot lock or unlock
3416 variable {name}".
Bram Moolenaar2ce06f62005-01-31 19:19:04 +00003417
Yegappan Lakshmanan9cb865e2025-03-23 16:42:16 +01003418 [depth] is relevant when locking a |List|, a |Tuple|
3419 or a |Dictionary|. It specifies how deep the locking
3420 goes:
Bram Moolenaara187c432020-09-16 21:08:28 +02003421 0 Lock the variable {name} but not its
3422 value.
Yegappan Lakshmanan9cb865e2025-03-23 16:42:16 +01003423 1 Lock the |List| or |Tuple| or
3424 |Dictionary| itself, cannot add or
3425 remove items, but can still change
3426 their values.
Bram Moolenaar2ce06f62005-01-31 19:19:04 +00003427 2 Also lock the values, cannot change
Bram Moolenaar32466aa2006-02-24 23:53:04 +00003428 the items. If an item is a |List| or
Yegappan Lakshmanan9cb865e2025-03-23 16:42:16 +01003429 |Tuple| or |Dictionary|, cannot add or
3430 remove items, but can still change the
Bram Moolenaar2ce06f62005-01-31 19:19:04 +00003431 values.
Yegappan Lakshmanan9cb865e2025-03-23 16:42:16 +01003432 3 Like 2 but for the |List| / |Tuple| /
3433 |Dictionary| in the |List| / |Tuple| /
Bram Moolenaar32466aa2006-02-24 23:53:04 +00003434 |Dictionary|, one level deeper.
Yegappan Lakshmanan9cb865e2025-03-23 16:42:16 +01003435 The default [depth] is 2, thus when {name} is a
3436 |List|, a |Tuple| or a |Dictionary| the values cannot
3437 be changed.
Bram Moolenaara187c432020-09-16 21:08:28 +02003438
3439 Example with [depth] 0: >
3440 let mylist = [1, 2, 3]
3441 lockvar 0 mylist
Bram Moolenaar6e649222021-10-04 21:32:54 +01003442 let mylist[0] = 77 " OK
Bram Moolenaar10e8ff92023-06-10 21:40:39 +01003443 call add(mylist, 4) " OK
Bram Moolenaara187c432020-09-16 21:08:28 +02003444 let mylist = [7, 8, 9] " Error!
3445< *E743*
Bram Moolenaar2ce06f62005-01-31 19:19:04 +00003446 For unlimited depth use [!] and omit [depth].
3447 However, there is a maximum depth of 100 to catch
3448 loops.
3449
Bram Moolenaar32466aa2006-02-24 23:53:04 +00003450 Note that when two variables refer to the same |List|
3451 and you lock one of them, the |List| will also be
Bram Moolenaar910f66f2006-04-05 20:41:53 +00003452 locked when used through the other variable.
3453 Example: >
Bram Moolenaar2ce06f62005-01-31 19:19:04 +00003454 :let l = [0, 1, 2, 3]
3455 :let cl = l
3456 :lockvar l
3457 :let cl[1] = 99 " won't work!
3458< You may want to make a copy of a list to avoid this.
3459 See |deepcopy()|.
3460
Yegappan Lakshmanancd39b692023-10-02 12:50:45 -07003461 *E1391* *E1392*
3462 Locking and unlocking object and class variables is
3463 currently NOT supported.
3464
Bram Moolenaar2ce06f62005-01-31 19:19:04 +00003465
Bram Moolenaara2baa732022-02-04 16:09:54 +00003466:unlo[ckvar][!] [depth] {name} ... *:unlockvar* *:unlo* *E1246*
Bram Moolenaar2ce06f62005-01-31 19:19:04 +00003467 Unlock the internal variable {name}. Does the
3468 opposite of |:lockvar|.
3469
Bram Moolenaard13166e2022-11-18 21:49:57 +00003470 If {name} does not exist:
3471 - In |Vim9| script an error is given.
3472 - In legacy script this is silently ignored.
3473
Bram Moolenaar61da1bf2019-06-06 12:14:49 +02003474:if {expr1} *:if* *:end* *:endif* *:en* *E171* *E579* *E580*
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003475:en[dif] Execute the commands until the next matching `:else`
3476 or `:endif` if {expr1} evaluates to non-zero.
Bram Moolenaarc51cf032022-02-26 12:25:45 +00003477 Although the short forms work, it is recommended to
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003478 always use `:endif` to avoid confusion and to make
3479 auto-indenting work properly.
Bram Moolenaar071d4272004-06-13 20:20:40 +00003480
3481 From Vim version 4.5 until 5.0, every Ex command in
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003482 between the `:if` and `:endif` is ignored. These two
Bram Moolenaar071d4272004-06-13 20:20:40 +00003483 commands were just to allow for future expansions in a
Bram Moolenaar85084ef2016-01-17 22:26:33 +01003484 backward compatible way. Nesting was allowed. Note
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003485 that any `:else` or `:elseif` was ignored, the `else`
Bram Moolenaar071d4272004-06-13 20:20:40 +00003486 part was not executed either.
3487
3488 You can use this to remain compatible with older
3489 versions: >
3490 :if version >= 500
3491 : version-5-specific-commands
3492 :endif
3493< The commands still need to be parsed to find the
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003494 `endif`. Sometimes an older Vim has a problem with a
3495 new command. For example, `:silent` is recognized as
3496 a `:substitute` command. In that case `:execute` can
Bram Moolenaar071d4272004-06-13 20:20:40 +00003497 avoid problems: >
3498 :if version >= 600
3499 : execute "silent 1,$delete"
3500 :endif
3501<
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003502 In |Vim9| script `:endif` cannot be shortened, to
3503 improve script readability.
3504 NOTE: The `:append` and `:insert` commands don't work
3505 properly in between `:if` and `:endif`.
Bram Moolenaar071d4272004-06-13 20:20:40 +00003506
3507 *:else* *:el* *E581* *E583*
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003508:el[se] Execute the commands until the next matching `:else`
3509 or `:endif` if they previously were not being
Bram Moolenaar071d4272004-06-13 20:20:40 +00003510 executed.
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003511 In |Vim9| script `:else` cannot be shortened, to
3512 improve script readability.
Bram Moolenaar071d4272004-06-13 20:20:40 +00003513
3514 *:elseif* *:elsei* *E582* *E584*
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003515:elsei[f] {expr1} Short for `:else` `:if`, with the addition that there
3516 is no extra `:endif`.
3517 In |Vim9| script `:elseif` cannot be shortened, to
3518 improve script readability.
Bram Moolenaar071d4272004-06-13 20:20:40 +00003519
3520:wh[ile] {expr1} *:while* *:endwhile* *:wh* *:endw*
Bram Moolenaar3a3a7232005-01-17 22:16:15 +00003521 *E170* *E585* *E588* *E733*
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003522:endw[hile] Repeat the commands between `:while` and `:endwhile`,
Bram Moolenaar071d4272004-06-13 20:20:40 +00003523 as long as {expr1} evaluates to non-zero.
3524 When an error is detected from a command inside the
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003525 loop, execution continues after the `endwhile`.
Bram Moolenaar12805862005-01-05 22:16:17 +00003526 Example: >
3527 :let lnum = 1
3528 :while lnum <= line("$")
3529 :call FixLine(lnum)
3530 :let lnum = lnum + 1
3531 :endwhile
3532<
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003533 In |Vim9| script `:while` and `:endwhile` cannot be
3534 shortened, to improve script readability.
3535 NOTE: The `:append` and `:insert` commands don't work
3536 properly inside a `:while` and `:for` loop.
Bram Moolenaar071d4272004-06-13 20:20:40 +00003537
Bram Moolenaar5e66b422019-01-24 21:58:10 +01003538:for {var} in {object} *:for* *E690* *E732*
Bram Moolenaar12805862005-01-05 22:16:17 +00003539:endfo[r] *:endfo* *:endfor*
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003540 Repeat the commands between `:for` and `:endfor` for
Bram Moolenaar3f32a5f2022-05-12 20:34:15 +01003541 each item in {object}. {object} can be a |List|,
Yegappan Lakshmanan9cb865e2025-03-23 16:42:16 +01003542 a |Tuple|, a |Blob| or a |String|. *E1177*
Bram Moolenaar5da36052021-12-27 15:39:57 +00003543
3544 Variable {var} is set to the value of each item.
3545 In |Vim9| script the loop variable must not have been
3546 declared yet, unless when it is a
3547 global/window/tab/buffer variable.
3548
3549 When an error is detected for a command inside the
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003550 loop, execution continues after the `endfor`.
Bram Moolenaar5e66b422019-01-24 21:58:10 +01003551 Changing {object} inside the loop affects what items
3552 are used. Make a copy if this is unwanted: >
Bram Moolenaarde8866b2005-01-06 23:24:37 +00003553 :for item in copy(mylist)
Bram Moolenaar5e66b422019-01-24 21:58:10 +01003554<
Bram Moolenaar5da36052021-12-27 15:39:57 +00003555 When {object} is a |List| and not making a copy, in
3556 legacy script Vim stores a reference to the next item
3557 in the |List| before executing the commands with the
3558 current item. Thus the current item can be removed
3559 without effect. Removing any later item means it will
3560 not be found. Thus the following example works (an
3561 inefficient way to make a |List| empty): >
Bram Moolenaar8f3f58f2010-01-06 20:52:26 +01003562 for item in mylist
3563 call remove(mylist, 0)
3564 endfor
Bram Moolenaar5e66b422019-01-24 21:58:10 +01003565< Note that reordering the |List| (e.g., with sort() or
Bram Moolenaar9588a0f2005-01-08 21:45:39 +00003566 reverse()) may have unexpected effects.
Bram Moolenaar5da36052021-12-27 15:39:57 +00003567 In |Vim9| script the index is used. If an item before
3568 the current one is deleted the next item will be
3569 skipped.
Bram Moolenaar12805862005-01-05 22:16:17 +00003570
Bram Moolenaar5e66b422019-01-24 21:58:10 +01003571 When {object} is a |Blob|, Vim always makes a copy to
3572 iterate over. Unlike with |List|, modifying the
3573 |Blob| does not affect the iteration.
3574
Bram Moolenaar9b03d3e2022-08-30 20:26:34 +01003575 When {object} is a |String| each item is a string with
3576 one character, plus any combining characters.
3577
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003578 In |Vim9| script `:endfor` cannot be shortened, to
3579 improve script readability.
3580
Bram Moolenaar12805862005-01-05 22:16:17 +00003581:for [{var1}, {var2}, ...] in {listlist}
Bram Moolenaarf10911e2022-01-29 22:20:48 +00003582:endfo[r] *E1140*
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003583 Like `:for` above, but each item in {listlist} must be
Bram Moolenaar12805862005-01-05 22:16:17 +00003584 a list, of which each item is assigned to {var1},
3585 {var2}, etc. Example: >
3586 :for [lnum, col] in [[1, 3], [2, 5], [3, 8]]
3587 :echo getline(lnum)[col]
3588 :endfor
3589<
Bram Moolenaar071d4272004-06-13 20:20:40 +00003590 *:continue* *:con* *E586*
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003591:con[tinue] When used inside a `:while` or `:for` loop, jumps back
Bram Moolenaar12805862005-01-05 22:16:17 +00003592 to the start of the loop.
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003593 If it is used after a `:try` inside the loop but
3594 before the matching `:finally` (if present), the
3595 commands following the `:finally` up to the matching
3596 `:endtry` are executed first. This process applies to
3597 all nested `:try`s inside the loop. The outermost
3598 `:endtry` then jumps back to the start of the loop.
Bram Moolenaar071d4272004-06-13 20:20:40 +00003599
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003600 In |Vim9| script `:cont` is the shortest form, to
3601 improve script readability.
Bram Moolenaar071d4272004-06-13 20:20:40 +00003602 *:break* *:brea* *E587*
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003603:brea[k] When used inside a `:while` or `:for` loop, skips to
3604 the command after the matching `:endwhile` or
3605 `:endfor`.
3606 If it is used after a `:try` inside the loop but
3607 before the matching `:finally` (if present), the
3608 commands following the `:finally` up to the matching
3609 `:endtry` are executed first. This process applies to
3610 all nested `:try`s inside the loop. The outermost
3611 `:endtry` then jumps to the command after the loop.
3612
3613 In |Vim9| script `:break` cannot be shortened, to
3614 improve script readability.
Bram Moolenaar071d4272004-06-13 20:20:40 +00003615
Bram Moolenaar6f4754b2022-01-23 12:07:04 +00003616:try *:try* *:endt* *:endtry*
3617 *E600* *E601* *E602* *E1032*
Bram Moolenaar071d4272004-06-13 20:20:40 +00003618:endt[ry] Change the error handling for the commands between
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003619 `:try` and `:endtry` including everything being
3620 executed across `:source` commands, function calls,
Bram Moolenaar071d4272004-06-13 20:20:40 +00003621 or autocommand invocations.
3622
3623 When an error or interrupt is detected and there is
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003624 a `:finally` command following, execution continues
3625 after the `:finally`. Otherwise, or when the
3626 `:endtry` is reached thereafter, the next
3627 (dynamically) surrounding `:try` is checked for
3628 a corresponding `:finally` etc. Then the script
Bram Moolenaarbc93ceb2020-02-26 13:36:21 +01003629 processing is terminated. Whether a function
3630 definition has an "abort" argument does not matter.
Bram Moolenaar071d4272004-06-13 20:20:40 +00003631 Example: >
Bram Moolenaarbc93ceb2020-02-26 13:36:21 +01003632 try | call Unknown() | finally | echomsg "cleanup" | endtry
3633 echomsg "not reached"
Bram Moolenaar071d4272004-06-13 20:20:40 +00003634<
3635 Moreover, an error or interrupt (dynamically) inside
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003636 `:try` and `:endtry` is converted to an exception. It
3637 can be caught as if it were thrown by a `:throw`
3638 command (see `:catch`). In this case, the script
Bram Moolenaar071d4272004-06-13 20:20:40 +00003639 processing is not terminated.
3640
3641 The value "Vim:Interrupt" is used for an interrupt
3642 exception. An error in a Vim command is converted
3643 to a value of the form "Vim({command}):{errmsg}",
3644 other errors are converted to a value of the form
3645 "Vim:{errmsg}". {command} is the full command name,
3646 and {errmsg} is the message that is displayed if the
3647 error exception is not caught, always beginning with
3648 the error number.
3649 Examples: >
Bram Moolenaarbc93ceb2020-02-26 13:36:21 +01003650 try | sleep 100 | catch /^Vim:Interrupt$/ | endtry
3651 try | edit | catch /^Vim(edit):E\d\+/ | echo "error" | endtry
Bram Moolenaar071d4272004-06-13 20:20:40 +00003652<
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003653 In |Vim9| script `:endtry` cannot be shortened, to
3654 improve script readability.
3655
Bram Moolenaar6f4754b2022-01-23 12:07:04 +00003656 *:cat* *:catch*
3657 *E603* *E604* *E605* *E654* *E1033*
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003658:cat[ch] /{pattern}/ The following commands until the next `:catch`,
3659 `:finally`, or `:endtry` that belongs to the same
3660 `:try` as the `:catch` are executed when an exception
Bram Moolenaar071d4272004-06-13 20:20:40 +00003661 matching {pattern} is being thrown and has not yet
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003662 been caught by a previous `:catch`. Otherwise, these
Bram Moolenaar071d4272004-06-13 20:20:40 +00003663 commands are skipped.
3664 When {pattern} is omitted all errors are caught.
3665 Examples: >
Bram Moolenaar647e24b2019-03-17 16:39:46 +01003666 :catch /^Vim:Interrupt$/ " catch interrupts (CTRL-C)
3667 :catch /^Vim\%((\a\+)\)\=:E/ " catch all Vim errors
3668 :catch /^Vim\%((\a\+)\)\=:/ " catch errors and interrupts
3669 :catch /^Vim(write):/ " catch all errors in :write
3670 :catch /^Vim\%((\a\+)\)\=:E123:/ " catch error E123
3671 :catch /my-exception/ " catch user exception
3672 :catch /.*/ " catch everything
3673 :catch " same as /.*/
Bram Moolenaar071d4272004-06-13 20:20:40 +00003674<
3675 Another character can be used instead of / around the
3676 {pattern}, so long as it does not have a special
3677 meaning (e.g., '|' or '"') and doesn't occur inside
Bram Moolenaar6f4754b2022-01-23 12:07:04 +00003678 {pattern}. *E1067*
Bram Moolenaar7e38ea22014-04-05 22:55:53 +02003679 Information about the exception is available in
3680 |v:exception|. Also see |throw-variables|.
Bram Moolenaar071d4272004-06-13 20:20:40 +00003681 NOTE: It is not reliable to ":catch" the TEXT of
3682 an error message because it may vary in different
3683 locales.
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003684 In |Vim9| script `:catch` cannot be shortened, to
3685 improve script readability.
Bram Moolenaar071d4272004-06-13 20:20:40 +00003686
3687 *:fina* *:finally* *E606* *E607*
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003688:fina[lly] The following commands until the matching `:endtry`
Bram Moolenaar071d4272004-06-13 20:20:40 +00003689 are executed whenever the part between the matching
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003690 `:try` and the `:finally` is left: either by falling
3691 through to the `:finally` or by a `:continue`,
3692 `:break`, `:finish`, or `:return`, or by an error or
3693 interrupt or exception (see `:throw`).
3694
3695 In |Vim9| script `:finally` cannot be shortened, to
3696 improve script readability and avoid confusion with
3697 `:final`.
Bram Moolenaar071d4272004-06-13 20:20:40 +00003698
Bram Moolenaarf10911e2022-01-29 22:20:48 +00003699 *:th* *:throw* *E608* *E1129*
Bram Moolenaar071d4272004-06-13 20:20:40 +00003700:th[row] {expr1} The {expr1} is evaluated and thrown as an exception.
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003701 If the ":throw" is used after a `:try` but before the
3702 first corresponding `:catch`, commands are skipped
3703 until the first `:catch` matching {expr1} is reached.
3704 If there is no such `:catch` or if the ":throw" is
3705 used after a `:catch` but before the `:finally`, the
3706 commands following the `:finally` (if present) up to
3707 the matching `:endtry` are executed. If the `:throw`
3708 is after the `:finally`, commands up to the `:endtry`
Bram Moolenaar071d4272004-06-13 20:20:40 +00003709 are skipped. At the ":endtry", this process applies
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003710 again for the next dynamically surrounding `:try`
Bram Moolenaar071d4272004-06-13 20:20:40 +00003711 (which may be found in a calling function or sourcing
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003712 script), until a matching `:catch` has been found.
Bram Moolenaar071d4272004-06-13 20:20:40 +00003713 If the exception is not caught, the command processing
3714 is terminated.
3715 Example: >
3716 :try | throw "oops" | catch /^oo/ | echo "caught" | endtry
Bram Moolenaar662db672011-03-22 14:05:35 +01003717< Note that "catch" may need to be on a separate line
3718 for when an error causes the parsing to skip the whole
3719 line and not see the "|" that separates the commands.
Bram Moolenaar071d4272004-06-13 20:20:40 +00003720
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003721 In |Vim9| script `:throw` cannot be shortened, to
3722 improve script readability.
3723
Bram Moolenaar071d4272004-06-13 20:20:40 +00003724 *:ec* *:echo*
3725:ec[ho] {expr1} .. Echoes each {expr1}, with a space in between. The
3726 first {expr1} starts on a new line.
3727 Also see |:comment|.
3728 Use "\n" to start a new line. Use "\r" to move the
3729 cursor to the first column.
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003730 Uses the highlighting set by the `:echohl` command.
Bram Moolenaar071d4272004-06-13 20:20:40 +00003731 Cannot be followed by a comment.
3732 Example: >
3733 :echo "the value of 'shell' is" &shell
Bram Moolenaaref2f6562007-05-06 13:32:59 +00003734< *:echo-redraw*
3735 A later redraw may make the message disappear again.
3736 And since Vim mostly postpones redrawing until it's
3737 finished with a sequence of commands this happens
3738 quite often. To avoid that a command from before the
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003739 `:echo` causes a redraw afterwards (redraws are often
Bram Moolenaaref2f6562007-05-06 13:32:59 +00003740 postponed until you type something), force a redraw
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003741 with the `:redraw` command. Example: >
Bram Moolenaar071d4272004-06-13 20:20:40 +00003742 :new | redraw | echo "there is a new window"
3743<
3744 *:echon*
3745:echon {expr1} .. Echoes each {expr1}, without anything added. Also see
3746 |:comment|.
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003747 Uses the highlighting set by the `:echohl` command.
Bram Moolenaar071d4272004-06-13 20:20:40 +00003748 Cannot be followed by a comment.
3749 Example: >
3750 :echon "the value of 'shell' is " &shell
3751<
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003752 Note the difference between using `:echo`, which is a
3753 Vim command, and `:!echo`, which is an external shell
Bram Moolenaar071d4272004-06-13 20:20:40 +00003754 command: >
3755 :!echo % --> filename
3756< The arguments of ":!" are expanded, see |:_%|. >
3757 :!echo "%" --> filename or "filename"
3758< Like the previous example. Whether you see the double
3759 quotes or not depends on your 'shell'. >
3760 :echo % --> nothing
3761< The '%' is an illegal character in an expression. >
3762 :echo "%" --> %
3763< This just echoes the '%' character. >
3764 :echo expand("%") --> filename
3765< This calls the expand() function to expand the '%'.
3766
3767 *:echoh* *:echohl*
3768:echoh[l] {name} Use the highlight group {name} for the following
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003769 `:echo`, `:echon` and `:echomsg` commands. Also used
3770 for the `input()` prompt. Example: >
Bram Moolenaar071d4272004-06-13 20:20:40 +00003771 :echohl WarningMsg | echo "Don't panic!" | echohl None
3772< Don't forget to set the group back to "None",
3773 otherwise all following echo's will be highlighted.
3774
3775 *:echom* *:echomsg*
3776:echom[sg] {expr1} .. Echo the expression(s) as a true message, saving the
3777 message in the |message-history|.
3778 Spaces are placed between the arguments as with the
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003779 `:echo` command. But unprintable characters are
Bram Moolenaar071d4272004-06-13 20:20:40 +00003780 displayed, not interpreted.
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003781 The parsing works slightly different from `:echo`,
3782 more like `:execute`. All the expressions are first
Bram Moolenaaref2f6562007-05-06 13:32:59 +00003783 evaluated and concatenated before echoing anything.
Bram Moolenaar461a7fc2018-12-22 13:28:07 +01003784 If expressions does not evaluate to a Number or
3785 String, string() is used to turn it into a string.
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003786 Uses the highlighting set by the `:echohl` command.
Bram Moolenaar071d4272004-06-13 20:20:40 +00003787 Example: >
3788 :echomsg "It's a Zizzer Zazzer Zuzz, as you can plainly see."
Bram Moolenaaref2f6562007-05-06 13:32:59 +00003789< See |:echo-redraw| to avoid the message disappearing
3790 when the screen is redrawn.
Bram Moolenaar37fef162022-08-29 18:16:32 +01003791
3792 *:echow* *:echowin* *:echowindow*
Bram Moolenaarbdc09a12022-10-07 14:31:45 +01003793:[N]echow[indow] {expr1} ..
Bram Moolenaar37fef162022-08-29 18:16:32 +01003794 Like |:echomsg| but when the messages popup window is
3795 available the message is displayed there. This means
3796 it will show for three seconds and avoid a
Bram Moolenaar9b03d3e2022-08-30 20:26:34 +01003797 |hit-enter| prompt. If you want to hide it before
3798 that, press Esc in Normal mode (when it would
Bram Moolenaar71b6d332022-09-10 13:13:14 +01003799 otherwise beep). If it disappears too soon you can
3800 use `:messages` to see the text.
Bram Moolenaarbdc09a12022-10-07 14:31:45 +01003801 When [N] is given then the window will show up for
3802 this number of seconds. The last `:echowindow` with a
3803 count matters, it is used once only.
Bram Moolenaar37fef162022-08-29 18:16:32 +01003804 The message window is available when Vim was compiled
3805 with the +timer and the +popupwin features.
3806
Bram Moolenaar071d4272004-06-13 20:20:40 +00003807 *:echoe* *:echoerr*
3808:echoe[rr] {expr1} .. Echo the expression(s) as an error message, saving the
3809 message in the |message-history|. When used in a
3810 script or function the line number will be added.
3811 Spaces are placed between the arguments as with the
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003812 `:echomsg` command. When used inside a try conditional,
Bram Moolenaar071d4272004-06-13 20:20:40 +00003813 the message is raised as an error exception instead
3814 (see |try-echoerr|).
3815 Example: >
3816 :echoerr "This script just failed!"
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003817< If you just want a highlighted message use `:echohl`.
Bram Moolenaar071d4272004-06-13 20:20:40 +00003818 And to get a beep: >
3819 :exe "normal \<Esc>"
Bram Moolenaar4c868302021-03-22 16:19:45 +01003820
3821:echoc[onsole] {expr1} .. *:echoc* *:echoconsole*
3822 Intended for testing: works like `:echomsg` but when
3823 running in the GUI and started from a terminal write
3824 the text to stdout.
3825
Bram Moolenaar09c6f262019-11-17 15:55:14 +01003826 *:eval*
3827:eval {expr} Evaluate {expr} and discard the result. Example: >
3828 :eval Getlist()->Filter()->append('$')
3829
3830< The expression is supposed to have a side effect,
3831 since the resulting value is not used. In the example
3832 the `append()` call appends the List with text to the
3833 buffer. This is similar to `:call` but works with any
3834 expression.
Bram Moolenaara2baa732022-02-04 16:09:54 +00003835 In |Vim9| script an expression without an effect will
3836 result in error *E1207* . This should help noticing
3837 mistakes.
Bram Moolenaar09c6f262019-11-17 15:55:14 +01003838
3839 The command can be shortened to `:ev` or `:eva`, but
3840 these are hard to recognize and therefore not to be
3841 used.
3842
Bram Moolenaarbc93ceb2020-02-26 13:36:21 +01003843 The command cannot be followed by "|" and another
3844 command, since "|" is seen as part of the expression.
3845
Bram Moolenaar09c6f262019-11-17 15:55:14 +01003846
Bram Moolenaar071d4272004-06-13 20:20:40 +00003847 *:exe* *:execute*
3848:exe[cute] {expr1} .. Executes the string that results from the evaluation
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003849 of {expr1} as an Ex command.
3850 Multiple arguments are concatenated, with a space in
Bram Moolenaar7e6a5152021-01-02 16:39:53 +01003851 between. To avoid the extra space use the ".."
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003852 operator to concatenate strings into one argument.
3853 {expr1} is used as the processed command, command line
3854 editing keys are not recognized.
Bram Moolenaar071d4272004-06-13 20:20:40 +00003855 Cannot be followed by a comment.
3856 Examples: >
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003857 :execute "buffer" nextbuf
Bram Moolenaarc8cdf0f2021-03-13 13:28:13 +01003858 :execute "normal" count .. "w"
Bram Moolenaar071d4272004-06-13 20:20:40 +00003859<
3860 ":execute" can be used to append a command to commands
3861 that don't accept a '|'. Example: >
3862 :execute '!ls' | echo "theend"
3863
3864< ":execute" is also a nice way to avoid having to type
3865 control characters in a Vim script for a ":normal"
3866 command: >
3867 :execute "normal ixxx\<Esc>"
3868< This has an <Esc> character, see |expr-string|.
3869
Bram Moolenaar446cb832008-06-24 21:56:24 +00003870 Be careful to correctly escape special characters in
3871 file names. The |fnameescape()| function can be used
Bram Moolenaar05bb9532008-07-04 09:44:11 +00003872 for Vim commands, |shellescape()| for |:!| commands.
3873 Examples: >
Bram Moolenaarc8cdf0f2021-03-13 13:28:13 +01003874 :execute "e " .. fnameescape(filename)
3875 :execute "!ls " .. shellescape(filename, 1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00003876<
Bram Moolenaar071d4272004-06-13 20:20:40 +00003877 Note: The executed string may be any command-line, but
Bram Moolenaar76f3b1a2014-03-27 22:30:07 +01003878 starting or ending "if", "while" and "for" does not
3879 always work, because when commands are skipped the
3880 ":execute" is not evaluated and Vim loses track of
3881 where blocks start and end. Also "break" and
3882 "continue" should not be inside ":execute".
3883 This example does not work, because the ":execute" is
3884 not evaluated and Vim does not see the "while", and
3885 gives an error for finding an ":endwhile": >
3886 :if 0
3887 : execute 'while i > 5'
3888 : echo "test"
3889 : endwhile
3890 :endif
Bram Moolenaar071d4272004-06-13 20:20:40 +00003891<
3892 It is allowed to have a "while" or "if" command
3893 completely in the executed string: >
3894 :execute 'while i < 5 | echo i | let i = i + 1 | endwhile'
3895<
3896
Bram Moolenaar8f3f58f2010-01-06 20:52:26 +01003897 *:exe-comment*
Bram Moolenaar071d4272004-06-13 20:20:40 +00003898 ":execute", ":echo" and ":echon" cannot be followed by
3899 a comment directly, because they see the '"' as the
3900 start of a string. But, you can use '|' followed by a
3901 comment. Example: >
3902 :echo "foo" | "this is a comment
3903
3904==============================================================================
39058. Exception handling *exception-handling*
3906
3907The Vim script language comprises an exception handling feature. This section
3908explains how it can be used in a Vim script.
3909
3910Exceptions may be raised by Vim on an error or on interrupt, see
3911|catch-errors| and |catch-interrupt|. You can also explicitly throw an
3912exception by using the ":throw" command, see |throw-catch|.
3913
3914
3915TRY CONDITIONALS *try-conditionals*
3916
3917Exceptions can be caught or can cause cleanup code to be executed. You can
3918use a try conditional to specify catch clauses (that catch exceptions) and/or
3919a finally clause (to be executed for cleanup).
3920 A try conditional begins with a |:try| command and ends at the matching
3921|:endtry| command. In between, you can use a |:catch| command to start
3922a catch clause, or a |:finally| command to start a finally clause. There may
3923be none or multiple catch clauses, but there is at most one finally clause,
3924which must not be followed by any catch clauses. The lines before the catch
3925clauses and the finally clause is called a try block. >
3926
3927 :try
Bram Moolenaar446cb832008-06-24 21:56:24 +00003928 : ...
3929 : ... TRY BLOCK
3930 : ...
Bram Moolenaar071d4272004-06-13 20:20:40 +00003931 :catch /{pattern}/
Bram Moolenaar446cb832008-06-24 21:56:24 +00003932 : ...
3933 : ... CATCH CLAUSE
3934 : ...
Bram Moolenaar071d4272004-06-13 20:20:40 +00003935 :catch /{pattern}/
Bram Moolenaar446cb832008-06-24 21:56:24 +00003936 : ...
3937 : ... CATCH CLAUSE
3938 : ...
Bram Moolenaar071d4272004-06-13 20:20:40 +00003939 :finally
Bram Moolenaar446cb832008-06-24 21:56:24 +00003940 : ...
3941 : ... FINALLY CLAUSE
3942 : ...
Bram Moolenaar071d4272004-06-13 20:20:40 +00003943 :endtry
3944
3945The try conditional allows to watch code for exceptions and to take the
3946appropriate actions. Exceptions from the try block may be caught. Exceptions
3947from the try block and also the catch clauses may cause cleanup actions.
3948 When no exception is thrown during execution of the try block, the control
3949is transferred to the finally clause, if present. After its execution, the
3950script continues with the line following the ":endtry".
3951 When an exception occurs during execution of the try block, the remaining
3952lines in the try block are skipped. The exception is matched against the
3953patterns specified as arguments to the ":catch" commands. The catch clause
3954after the first matching ":catch" is taken, other catch clauses are not
3955executed. The catch clause ends when the next ":catch", ":finally", or
3956":endtry" command is reached - whatever is first. Then, the finally clause
3957(if present) is executed. When the ":endtry" is reached, the script execution
3958continues in the following line as usual.
3959 When an exception that does not match any of the patterns specified by the
3960":catch" commands is thrown in the try block, the exception is not caught by
3961that try conditional and none of the catch clauses is executed. Only the
3962finally clause, if present, is taken. The exception pends during execution of
3963the finally clause. It is resumed at the ":endtry", so that commands after
3964the ":endtry" are not executed and the exception might be caught elsewhere,
3965see |try-nesting|.
3966 When during execution of a catch clause another exception is thrown, the
Bram Moolenaar58b85342016-08-14 19:54:54 +02003967remaining lines in that catch clause are not executed. The new exception is
Bram Moolenaar071d4272004-06-13 20:20:40 +00003968not matched against the patterns in any of the ":catch" commands of the same
3969try conditional and none of its catch clauses is taken. If there is, however,
3970a finally clause, it is executed, and the exception pends during its
3971execution. The commands following the ":endtry" are not executed. The new
3972exception might, however, be caught elsewhere, see |try-nesting|.
3973 When during execution of the finally clause (if present) an exception is
Bram Moolenaar58b85342016-08-14 19:54:54 +02003974thrown, the remaining lines in the finally clause are skipped. If the finally
Bram Moolenaar071d4272004-06-13 20:20:40 +00003975clause has been taken because of an exception from the try block or one of the
3976catch clauses, the original (pending) exception is discarded. The commands
3977following the ":endtry" are not executed, and the exception from the finally
3978clause is propagated and can be caught elsewhere, see |try-nesting|.
3979
3980The finally clause is also executed, when a ":break" or ":continue" for
3981a ":while" loop enclosing the complete try conditional is executed from the
3982try block or a catch clause. Or when a ":return" or ":finish" is executed
3983from the try block or a catch clause of a try conditional in a function or
3984sourced script, respectively. The ":break", ":continue", ":return", or
3985":finish" pends during execution of the finally clause and is resumed when the
3986":endtry" is reached. It is, however, discarded when an exception is thrown
3987from the finally clause.
3988 When a ":break" or ":continue" for a ":while" loop enclosing the complete
3989try conditional or when a ":return" or ":finish" is encountered in the finally
3990clause, the rest of the finally clause is skipped, and the ":break",
3991":continue", ":return" or ":finish" is executed as usual. If the finally
3992clause has been taken because of an exception or an earlier ":break",
3993":continue", ":return", or ":finish" from the try block or a catch clause,
3994this pending exception or command is discarded.
3995
3996For examples see |throw-catch| and |try-finally|.
3997
3998
Bram Moolenaar76db9e02022-11-09 21:21:04 +00003999NESTING OF TRY CONDITIONALS *try-nesting*
Bram Moolenaar071d4272004-06-13 20:20:40 +00004000
4001Try conditionals can be nested arbitrarily. That is, a complete try
4002conditional can be put into the try block, a catch clause, or the finally
4003clause of another try conditional. If the inner try conditional does not
4004catch an exception thrown in its try block or throws a new exception from one
4005of its catch clauses or its finally clause, the outer try conditional is
4006checked according to the rules above. If the inner try conditional is in the
4007try block of the outer try conditional, its catch clauses are checked, but
Bram Moolenaar58b85342016-08-14 19:54:54 +02004008otherwise only the finally clause is executed. It does not matter for
Bram Moolenaar071d4272004-06-13 20:20:40 +00004009nesting, whether the inner try conditional is directly contained in the outer
4010one, or whether the outer one sources a script or calls a function containing
4011the inner try conditional.
4012
4013When none of the active try conditionals catches an exception, just their
4014finally clauses are executed. Thereafter, the script processing terminates.
4015An error message is displayed in case of an uncaught exception explicitly
4016thrown by a ":throw" command. For uncaught error and interrupt exceptions
4017implicitly raised by Vim, the error message(s) or interrupt message are shown
4018as usual.
4019
4020For examples see |throw-catch|.
4021
4022
4023EXAMINING EXCEPTION HANDLING CODE *except-examine*
4024
4025Exception handling code can get tricky. If you are in doubt what happens, set
4026'verbose' to 13 or use the ":13verbose" command modifier when sourcing your
4027script file. Then you see when an exception is thrown, discarded, caught, or
4028finished. When using a verbosity level of at least 14, things pending in
4029a finally clause are also shown. This information is also given in debug mode
4030(see |debug-scripts|).
4031
4032
4033THROWING AND CATCHING EXCEPTIONS *throw-catch*
4034
4035You can throw any number or string as an exception. Use the |:throw| command
4036and pass the value to be thrown as argument: >
4037 :throw 4711
4038 :throw "string"
4039< *throw-expression*
4040You can also specify an expression argument. The expression is then evaluated
4041first, and the result is thrown: >
4042 :throw 4705 + strlen("string")
4043 :throw strpart("strings", 0, 6)
4044
4045An exception might be thrown during evaluation of the argument of the ":throw"
4046command. Unless it is caught there, the expression evaluation is abandoned.
4047The ":throw" command then does not throw a new exception.
4048 Example: >
4049
4050 :function! Foo(arg)
4051 : try
4052 : throw a:arg
4053 : catch /foo/
4054 : endtry
4055 : return 1
4056 :endfunction
4057 :
4058 :function! Bar()
4059 : echo "in Bar"
4060 : return 4710
4061 :endfunction
4062 :
4063 :throw Foo("arrgh") + Bar()
4064
4065This throws "arrgh", and "in Bar" is not displayed since Bar() is not
4066executed. >
4067 :throw Foo("foo") + Bar()
4068however displays "in Bar" and throws 4711.
4069
4070Any other command that takes an expression as argument might also be
Bram Moolenaar58b85342016-08-14 19:54:54 +02004071abandoned by an (uncaught) exception during the expression evaluation. The
Bram Moolenaar071d4272004-06-13 20:20:40 +00004072exception is then propagated to the caller of the command.
4073 Example: >
4074
4075 :if Foo("arrgh")
4076 : echo "then"
4077 :else
4078 : echo "else"
4079 :endif
4080
4081Here neither of "then" or "else" is displayed.
4082
4083 *catch-order*
4084Exceptions can be caught by a try conditional with one or more |:catch|
4085commands, see |try-conditionals|. The values to be caught by each ":catch"
4086command can be specified as a pattern argument. The subsequent catch clause
4087gets executed when a matching exception is caught.
4088 Example: >
4089
4090 :function! Foo(value)
4091 : try
4092 : throw a:value
4093 : catch /^\d\+$/
4094 : echo "Number thrown"
4095 : catch /.*/
4096 : echo "String thrown"
4097 : endtry
4098 :endfunction
4099 :
4100 :call Foo(0x1267)
4101 :call Foo('string')
4102
4103The first call to Foo() displays "Number thrown", the second "String thrown".
4104An exception is matched against the ":catch" commands in the order they are
4105specified. Only the first match counts. So you should place the more
4106specific ":catch" first. The following order does not make sense: >
4107
4108 : catch /.*/
4109 : echo "String thrown"
4110 : catch /^\d\+$/
4111 : echo "Number thrown"
4112
4113The first ":catch" here matches always, so that the second catch clause is
4114never taken.
4115
4116 *throw-variables*
4117If you catch an exception by a general pattern, you may access the exact value
4118in the variable |v:exception|: >
4119
4120 : catch /^\d\+$/
4121 : echo "Number thrown. Value is" v:exception
4122
4123You may also be interested where an exception was thrown. This is stored in
ichizok663d18d2025-01-02 18:06:00 +01004124|v:throwpoint|. And you can obtain the stack trace from |v:stacktrace|.
4125Note that "v:exception", "v:stacktrace" and "v:throwpoint" are valid for the
Bram Moolenaar071d4272004-06-13 20:20:40 +00004126exception most recently caught as long it is not finished.
4127 Example: >
4128
4129 :function! Caught()
4130 : if v:exception != ""
Bram Moolenaarc51cf032022-02-26 12:25:45 +00004131 : echo 'Caught "' . v:exception .. '" in ' .. v:throwpoint
Bram Moolenaar071d4272004-06-13 20:20:40 +00004132 : else
4133 : echo 'Nothing caught'
4134 : endif
4135 :endfunction
4136 :
4137 :function! Foo()
4138 : try
4139 : try
4140 : try
4141 : throw 4711
4142 : finally
4143 : call Caught()
4144 : endtry
4145 : catch /.*/
4146 : call Caught()
4147 : throw "oops"
4148 : endtry
4149 : catch /.*/
4150 : call Caught()
4151 : finally
4152 : call Caught()
4153 : endtry
4154 :endfunction
4155 :
4156 :call Foo()
4157
4158This displays >
4159
4160 Nothing caught
4161 Caught "4711" in function Foo, line 4
4162 Caught "oops" in function Foo, line 10
4163 Nothing caught
4164
4165A practical example: The following command ":LineNumber" displays the line
4166number in the script or function where it has been used: >
4167
4168 :function! LineNumber()
4169 : return substitute(v:throwpoint, '.*\D\(\d\+\).*', '\1', "")
4170 :endfunction
4171 :command! LineNumber try | throw "" | catch | echo LineNumber() | endtry
4172<
4173 *try-nested*
4174An exception that is not caught by a try conditional can be caught by
4175a surrounding try conditional: >
4176
4177 :try
4178 : try
4179 : throw "foo"
4180 : catch /foobar/
4181 : echo "foobar"
4182 : finally
4183 : echo "inner finally"
4184 : endtry
4185 :catch /foo/
4186 : echo "foo"
4187 :endtry
4188
4189The inner try conditional does not catch the exception, just its finally
4190clause is executed. The exception is then caught by the outer try
4191conditional. The example displays "inner finally" and then "foo".
4192
4193 *throw-from-catch*
4194You can catch an exception and throw a new one to be caught elsewhere from the
4195catch clause: >
4196
4197 :function! Foo()
4198 : throw "foo"
4199 :endfunction
4200 :
4201 :function! Bar()
4202 : try
4203 : call Foo()
4204 : catch /foo/
4205 : echo "Caught foo, throw bar"
4206 : throw "bar"
4207 : endtry
4208 :endfunction
4209 :
4210 :try
4211 : call Bar()
4212 :catch /.*/
4213 : echo "Caught" v:exception
4214 :endtry
4215
4216This displays "Caught foo, throw bar" and then "Caught bar".
4217
4218 *rethrow*
4219There is no real rethrow in the Vim script language, but you may throw
4220"v:exception" instead: >
4221
4222 :function! Bar()
4223 : try
4224 : call Foo()
4225 : catch /.*/
4226 : echo "Rethrow" v:exception
4227 : throw v:exception
4228 : endtry
4229 :endfunction
4230< *try-echoerr*
4231Note that this method cannot be used to "rethrow" Vim error or interrupt
4232exceptions, because it is not possible to fake Vim internal exceptions.
4233Trying so causes an error exception. You should throw your own exception
4234denoting the situation. If you want to cause a Vim error exception containing
4235the original error exception value, you can use the |:echoerr| command: >
4236
4237 :try
4238 : try
4239 : asdf
4240 : catch /.*/
4241 : echoerr v:exception
4242 : endtry
4243 :catch /.*/
4244 : echo v:exception
4245 :endtry
4246
4247This code displays
4248
Bram Moolenaar446cb832008-06-24 21:56:24 +00004249 Vim(echoerr):Vim:E492: Not an editor command: asdf ~
Bram Moolenaar071d4272004-06-13 20:20:40 +00004250
4251
4252CLEANUP CODE *try-finally*
4253
4254Scripts often change global settings and restore them at their end. If the
4255user however interrupts the script by pressing CTRL-C, the settings remain in
Bram Moolenaar58b85342016-08-14 19:54:54 +02004256an inconsistent state. The same may happen to you in the development phase of
Bram Moolenaar071d4272004-06-13 20:20:40 +00004257a script when an error occurs or you explicitly throw an exception without
4258catching it. You can solve these problems by using a try conditional with
4259a finally clause for restoring the settings. Its execution is guaranteed on
4260normal control flow, on error, on an explicit ":throw", and on interrupt.
4261(Note that errors and interrupts from inside the try conditional are converted
Bram Moolenaar58b85342016-08-14 19:54:54 +02004262to exceptions. When not caught, they terminate the script after the finally
Bram Moolenaar071d4272004-06-13 20:20:40 +00004263clause has been executed.)
4264Example: >
4265
4266 :try
4267 : let s:saved_ts = &ts
4268 : set ts=17
4269 :
4270 : " Do the hard work here.
4271 :
4272 :finally
4273 : let &ts = s:saved_ts
4274 : unlet s:saved_ts
4275 :endtry
4276
4277This method should be used locally whenever a function or part of a script
4278changes global settings which need to be restored on failure or normal exit of
4279that function or script part.
4280
4281 *break-finally*
4282Cleanup code works also when the try block or a catch clause is left by
4283a ":continue", ":break", ":return", or ":finish".
4284 Example: >
4285
4286 :let first = 1
4287 :while 1
4288 : try
4289 : if first
4290 : echo "first"
4291 : let first = 0
4292 : continue
4293 : else
4294 : throw "second"
4295 : endif
4296 : catch /.*/
4297 : echo v:exception
4298 : break
4299 : finally
4300 : echo "cleanup"
4301 : endtry
4302 : echo "still in while"
4303 :endwhile
4304 :echo "end"
4305
4306This displays "first", "cleanup", "second", "cleanup", and "end". >
4307
4308 :function! Foo()
4309 : try
4310 : return 4711
4311 : finally
4312 : echo "cleanup\n"
4313 : endtry
4314 : echo "Foo still active"
4315 :endfunction
4316 :
4317 :echo Foo() "returned by Foo"
4318
4319This displays "cleanup" and "4711 returned by Foo". You don't need to add an
Bram Moolenaar58b85342016-08-14 19:54:54 +02004320extra ":return" in the finally clause. (Above all, this would override the
Bram Moolenaar071d4272004-06-13 20:20:40 +00004321return value.)
4322
4323 *except-from-finally*
4324Using either of ":continue", ":break", ":return", ":finish", or ":throw" in
4325a finally clause is possible, but not recommended since it abandons the
4326cleanup actions for the try conditional. But, of course, interrupt and error
4327exceptions might get raised from a finally clause.
4328 Example where an error in the finally clause stops an interrupt from
4329working correctly: >
4330
4331 :try
4332 : try
4333 : echo "Press CTRL-C for interrupt"
4334 : while 1
4335 : endwhile
4336 : finally
4337 : unlet novar
4338 : endtry
4339 :catch /novar/
4340 :endtry
4341 :echo "Script still running"
4342 :sleep 1
4343
4344If you need to put commands that could fail into a finally clause, you should
4345think about catching or ignoring the errors in these commands, see
4346|catch-errors| and |ignore-errors|.
4347
4348
4349CATCHING ERRORS *catch-errors*
4350
4351If you want to catch specific errors, you just have to put the code to be
4352watched in a try block and add a catch clause for the error message. The
4353presence of the try conditional causes all errors to be converted to an
4354exception. No message is displayed and |v:errmsg| is not set then. To find
4355the right pattern for the ":catch" command, you have to know how the format of
4356the error exception is.
4357 Error exceptions have the following format: >
4358
4359 Vim({cmdname}):{errmsg}
4360or >
4361 Vim:{errmsg}
4362
4363{cmdname} is the name of the command that failed; the second form is used when
Bram Moolenaar58b85342016-08-14 19:54:54 +02004364the command name is not known. {errmsg} is the error message usually produced
Bram Moolenaar071d4272004-06-13 20:20:40 +00004365when the error occurs outside try conditionals. It always begins with
4366a capital "E", followed by a two or three-digit error number, a colon, and
4367a space.
4368
4369Examples:
4370
4371The command >
4372 :unlet novar
4373normally produces the error message >
4374 E108: No such variable: "novar"
4375which is converted inside try conditionals to an exception >
4376 Vim(unlet):E108: No such variable: "novar"
4377
4378The command >
4379 :dwim
4380normally produces the error message >
4381 E492: Not an editor command: dwim
4382which is converted inside try conditionals to an exception >
4383 Vim:E492: Not an editor command: dwim
4384
4385You can catch all ":unlet" errors by a >
4386 :catch /^Vim(unlet):/
4387or all errors for misspelled command names by a >
4388 :catch /^Vim:E492:/
4389
4390Some error messages may be produced by different commands: >
4391 :function nofunc
4392and >
4393 :delfunction nofunc
4394both produce the error message >
4395 E128: Function name must start with a capital: nofunc
4396which is converted inside try conditionals to an exception >
4397 Vim(function):E128: Function name must start with a capital: nofunc
4398or >
4399 Vim(delfunction):E128: Function name must start with a capital: nofunc
4400respectively. You can catch the error by its number independently on the
4401command that caused it if you use the following pattern: >
4402 :catch /^Vim(\a\+):E128:/
4403
4404Some commands like >
4405 :let x = novar
4406produce multiple error messages, here: >
4407 E121: Undefined variable: novar
4408 E15: Invalid expression: novar
4409Only the first is used for the exception value, since it is the most specific
4410one (see |except-several-errors|). So you can catch it by >
4411 :catch /^Vim(\a\+):E121:/
4412
4413You can catch all errors related to the name "nofunc" by >
4414 :catch /\<nofunc\>/
4415
4416You can catch all Vim errors in the ":write" and ":read" commands by >
4417 :catch /^Vim(\(write\|read\)):E\d\+:/
4418
4419You can catch all Vim errors by the pattern >
4420 :catch /^Vim\((\a\+)\)\=:E\d\+:/
4421<
4422 *catch-text*
4423NOTE: You should never catch the error message text itself: >
4424 :catch /No such variable/
Bram Moolenaar2b8388b2015-02-28 13:11:45 +01004425only works in the English locale, but not when the user has selected
Bram Moolenaar071d4272004-06-13 20:20:40 +00004426a different language by the |:language| command. It is however helpful to
4427cite the message text in a comment: >
4428 :catch /^Vim(\a\+):E108:/ " No such variable
4429
4430
4431IGNORING ERRORS *ignore-errors*
4432
4433You can ignore errors in a specific Vim command by catching them locally: >
4434
4435 :try
4436 : write
4437 :catch
4438 :endtry
4439
4440But you are strongly recommended NOT to use this simple form, since it could
4441catch more than you want. With the ":write" command, some autocommands could
4442be executed and cause errors not related to writing, for instance: >
4443
4444 :au BufWritePre * unlet novar
4445
4446There could even be such errors you are not responsible for as a script
4447writer: a user of your script might have defined such autocommands. You would
4448then hide the error from the user.
4449 It is much better to use >
4450
4451 :try
4452 : write
4453 :catch /^Vim(write):/
4454 :endtry
4455
4456which only catches real write errors. So catch only what you'd like to ignore
4457intentionally.
4458
4459For a single command that does not cause execution of autocommands, you could
4460even suppress the conversion of errors to exceptions by the ":silent!"
4461command: >
4462 :silent! nunmap k
4463This works also when a try conditional is active.
4464
4465
4466CATCHING INTERRUPTS *catch-interrupt*
4467
4468When there are active try conditionals, an interrupt (CTRL-C) is converted to
Bram Moolenaar58b85342016-08-14 19:54:54 +02004469the exception "Vim:Interrupt". You can catch it like every exception. The
Bram Moolenaar071d4272004-06-13 20:20:40 +00004470script is not terminated, then.
4471 Example: >
4472
4473 :function! TASK1()
4474 : sleep 10
4475 :endfunction
4476
4477 :function! TASK2()
4478 : sleep 20
4479 :endfunction
4480
4481 :while 1
4482 : let command = input("Type a command: ")
4483 : try
4484 : if command == ""
4485 : continue
4486 : elseif command == "END"
4487 : break
4488 : elseif command == "TASK1"
4489 : call TASK1()
4490 : elseif command == "TASK2"
4491 : call TASK2()
4492 : else
4493 : echo "\nIllegal command:" command
4494 : continue
4495 : endif
4496 : catch /^Vim:Interrupt$/
4497 : echo "\nCommand interrupted"
4498 : " Caught the interrupt. Continue with next prompt.
4499 : endtry
4500 :endwhile
4501
4502You can interrupt a task here by pressing CTRL-C; the script then asks for
Bram Moolenaar58b85342016-08-14 19:54:54 +02004503a new command. If you press CTRL-C at the prompt, the script is terminated.
Bram Moolenaar071d4272004-06-13 20:20:40 +00004504
4505For testing what happens when CTRL-C would be pressed on a specific line in
4506your script, use the debug mode and execute the |>quit| or |>interrupt|
4507command on that line. See |debug-scripts|.
4508
4509
4510CATCHING ALL *catch-all*
4511
4512The commands >
4513
4514 :catch /.*/
4515 :catch //
4516 :catch
4517
4518catch everything, error exceptions, interrupt exceptions and exceptions
4519explicitly thrown by the |:throw| command. This is useful at the top level of
4520a script in order to catch unexpected things.
4521 Example: >
4522
4523 :try
4524 :
4525 : " do the hard work here
4526 :
4527 :catch /MyException/
4528 :
4529 : " handle known problem
4530 :
4531 :catch /^Vim:Interrupt$/
4532 : echo "Script interrupted"
4533 :catch /.*/
Bram Moolenaarc51cf032022-02-26 12:25:45 +00004534 : echo "Internal error (" .. v:exception .. ")"
4535 : echo " - occurred at " .. v:throwpoint
Bram Moolenaar071d4272004-06-13 20:20:40 +00004536 :endtry
4537 :" end of script
4538
4539Note: Catching all might catch more things than you want. Thus, you are
4540strongly encouraged to catch only for problems that you can really handle by
4541specifying a pattern argument to the ":catch".
4542 Example: Catching all could make it nearly impossible to interrupt a script
4543by pressing CTRL-C: >
4544
4545 :while 1
4546 : try
4547 : sleep 1
4548 : catch
4549 : endtry
4550 :endwhile
4551
4552
4553EXCEPTIONS AND AUTOCOMMANDS *except-autocmd*
4554
4555Exceptions may be used during execution of autocommands. Example: >
4556
4557 :autocmd User x try
4558 :autocmd User x throw "Oops!"
4559 :autocmd User x catch
4560 :autocmd User x echo v:exception
4561 :autocmd User x endtry
4562 :autocmd User x throw "Arrgh!"
4563 :autocmd User x echo "Should not be displayed"
4564 :
4565 :try
4566 : doautocmd User x
4567 :catch
4568 : echo v:exception
4569 :endtry
4570
4571This displays "Oops!" and "Arrgh!".
4572
4573 *except-autocmd-Pre*
4574For some commands, autocommands get executed before the main action of the
4575command takes place. If an exception is thrown and not caught in the sequence
4576of autocommands, the sequence and the command that caused its execution are
4577abandoned and the exception is propagated to the caller of the command.
4578 Example: >
4579
4580 :autocmd BufWritePre * throw "FAIL"
4581 :autocmd BufWritePre * echo "Should not be displayed"
4582 :
4583 :try
4584 : write
4585 :catch
4586 : echo "Caught:" v:exception "from" v:throwpoint
4587 :endtry
4588
4589Here, the ":write" command does not write the file currently being edited (as
4590you can see by checking 'modified'), since the exception from the BufWritePre
4591autocommand abandons the ":write". The exception is then caught and the
4592script displays: >
4593
4594 Caught: FAIL from BufWrite Auto commands for "*"
4595<
4596 *except-autocmd-Post*
4597For some commands, autocommands get executed after the main action of the
4598command has taken place. If this main action fails and the command is inside
4599an active try conditional, the autocommands are skipped and an error exception
4600is thrown that can be caught by the caller of the command.
4601 Example: >
4602
4603 :autocmd BufWritePost * echo "File successfully written!"
4604 :
4605 :try
4606 : write /i/m/p/o/s/s/i/b/l/e
4607 :catch
4608 : echo v:exception
4609 :endtry
4610
4611This just displays: >
4612
4613 Vim(write):E212: Can't open file for writing (/i/m/p/o/s/s/i/b/l/e)
4614
4615If you really need to execute the autocommands even when the main action
4616fails, trigger the event from the catch clause.
4617 Example: >
4618
4619 :autocmd BufWritePre * set noreadonly
4620 :autocmd BufWritePost * set readonly
4621 :
4622 :try
4623 : write /i/m/p/o/s/s/i/b/l/e
4624 :catch
4625 : doautocmd BufWritePost /i/m/p/o/s/s/i/b/l/e
4626 :endtry
4627<
4628You can also use ":silent!": >
4629
4630 :let x = "ok"
4631 :let v:errmsg = ""
4632 :autocmd BufWritePost * if v:errmsg != ""
4633 :autocmd BufWritePost * let x = "after fail"
4634 :autocmd BufWritePost * endif
4635 :try
4636 : silent! write /i/m/p/o/s/s/i/b/l/e
4637 :catch
4638 :endtry
4639 :echo x
4640
4641This displays "after fail".
4642
4643If the main action of the command does not fail, exceptions from the
4644autocommands will be catchable by the caller of the command: >
4645
4646 :autocmd BufWritePost * throw ":-("
4647 :autocmd BufWritePost * echo "Should not be displayed"
4648 :
4649 :try
4650 : write
4651 :catch
4652 : echo v:exception
4653 :endtry
4654<
4655 *except-autocmd-Cmd*
4656For some commands, the normal action can be replaced by a sequence of
4657autocommands. Exceptions from that sequence will be catchable by the caller
4658of the command.
4659 Example: For the ":write" command, the caller cannot know whether the file
Bram Moolenaar58b85342016-08-14 19:54:54 +02004660had actually been written when the exception occurred. You need to tell it in
Bram Moolenaar071d4272004-06-13 20:20:40 +00004661some way. >
4662
4663 :if !exists("cnt")
4664 : let cnt = 0
4665 :
4666 : autocmd BufWriteCmd * if &modified
4667 : autocmd BufWriteCmd * let cnt = cnt + 1
4668 : autocmd BufWriteCmd * if cnt % 3 == 2
4669 : autocmd BufWriteCmd * throw "BufWriteCmdError"
4670 : autocmd BufWriteCmd * endif
4671 : autocmd BufWriteCmd * write | set nomodified
4672 : autocmd BufWriteCmd * if cnt % 3 == 0
4673 : autocmd BufWriteCmd * throw "BufWriteCmdError"
4674 : autocmd BufWriteCmd * endif
4675 : autocmd BufWriteCmd * echo "File successfully written!"
4676 : autocmd BufWriteCmd * endif
4677 :endif
4678 :
4679 :try
4680 : write
4681 :catch /^BufWriteCmdError$/
4682 : if &modified
4683 : echo "Error on writing (file contents not changed)"
4684 : else
4685 : echo "Error after writing"
4686 : endif
4687 :catch /^Vim(write):/
4688 : echo "Error on writing"
4689 :endtry
4690
4691When this script is sourced several times after making changes, it displays
4692first >
4693 File successfully written!
4694then >
4695 Error on writing (file contents not changed)
4696then >
4697 Error after writing
4698etc.
4699
4700 *except-autocmd-ill*
4701You cannot spread a try conditional over autocommands for different events.
4702The following code is ill-formed: >
4703
4704 :autocmd BufWritePre * try
4705 :
4706 :autocmd BufWritePost * catch
4707 :autocmd BufWritePost * echo v:exception
4708 :autocmd BufWritePost * endtry
4709 :
4710 :write
4711
4712
4713EXCEPTION HIERARCHIES AND PARAMETERIZED EXCEPTIONS *except-hier-param*
4714
4715Some programming languages allow to use hierarchies of exception classes or to
4716pass additional information with the object of an exception class. You can do
4717similar things in Vim.
4718 In order to throw an exception from a hierarchy, just throw the complete
4719class name with the components separated by a colon, for instance throw the
4720string "EXCEPT:MATHERR:OVERFLOW" for an overflow in a mathematical library.
4721 When you want to pass additional information with your exception class, add
4722it in parentheses, for instance throw the string "EXCEPT:IO:WRITEERR(myfile)"
4723for an error when writing "myfile".
4724 With the appropriate patterns in the ":catch" command, you can catch for
4725base classes or derived classes of your hierarchy. Additional information in
4726parentheses can be cut out from |v:exception| with the ":substitute" command.
4727 Example: >
4728
4729 :function! CheckRange(a, func)
4730 : if a:a < 0
Bram Moolenaarc51cf032022-02-26 12:25:45 +00004731 : throw "EXCEPT:MATHERR:RANGE(" .. a:func .. ")"
Bram Moolenaar071d4272004-06-13 20:20:40 +00004732 : endif
4733 :endfunction
4734 :
4735 :function! Add(a, b)
4736 : call CheckRange(a:a, "Add")
4737 : call CheckRange(a:b, "Add")
4738 : let c = a:a + a:b
4739 : if c < 0
4740 : throw "EXCEPT:MATHERR:OVERFLOW"
4741 : endif
4742 : return c
4743 :endfunction
4744 :
4745 :function! Div(a, b)
4746 : call CheckRange(a:a, "Div")
4747 : call CheckRange(a:b, "Div")
4748 : if (a:b == 0)
4749 : throw "EXCEPT:MATHERR:ZERODIV"
4750 : endif
4751 : return a:a / a:b
4752 :endfunction
4753 :
4754 :function! Write(file)
4755 : try
Bram Moolenaar446cb832008-06-24 21:56:24 +00004756 : execute "write" fnameescape(a:file)
Bram Moolenaar071d4272004-06-13 20:20:40 +00004757 : catch /^Vim(write):/
Bram Moolenaarc51cf032022-02-26 12:25:45 +00004758 : throw "EXCEPT:IO(" .. getcwd() .. ", " .. a:file .. "):WRITEERR"
Bram Moolenaar071d4272004-06-13 20:20:40 +00004759 : endtry
4760 :endfunction
4761 :
4762 :try
4763 :
Bram Moolenaar75ab5902022-04-18 15:36:40 +01004764 : " something with arithmetic and I/O
Bram Moolenaar071d4272004-06-13 20:20:40 +00004765 :
4766 :catch /^EXCEPT:MATHERR:RANGE/
4767 : let function = substitute(v:exception, '.*(\(\a\+\)).*', '\1', "")
4768 : echo "Range error in" function
4769 :
4770 :catch /^EXCEPT:MATHERR/ " catches OVERFLOW and ZERODIV
4771 : echo "Math error"
4772 :
4773 :catch /^EXCEPT:IO/
4774 : let dir = substitute(v:exception, '.*(\(.\+\),\s*.\+).*', '\1', "")
4775 : let file = substitute(v:exception, '.*(.\+,\s*\(.\+\)).*', '\1', "")
4776 : if file !~ '^/'
Bram Moolenaarc51cf032022-02-26 12:25:45 +00004777 : let file = dir .. "/" .. file
Bram Moolenaar071d4272004-06-13 20:20:40 +00004778 : endif
Bram Moolenaarc51cf032022-02-26 12:25:45 +00004779 : echo 'I/O error for "' .. file .. '"'
Bram Moolenaar071d4272004-06-13 20:20:40 +00004780 :
4781 :catch /^EXCEPT/
4782 : echo "Unspecified error"
4783 :
4784 :endtry
4785
4786The exceptions raised by Vim itself (on error or when pressing CTRL-C) use
4787a flat hierarchy: they are all in the "Vim" class. You cannot throw yourself
4788exceptions with the "Vim" prefix; they are reserved for Vim.
4789 Vim error exceptions are parameterized with the name of the command that
4790failed, if known. See |catch-errors|.
4791
4792
4793PECULIARITIES
4794 *except-compat*
4795The exception handling concept requires that the command sequence causing the
4796exception is aborted immediately and control is transferred to finally clauses
4797and/or a catch clause.
4798
4799In the Vim script language there are cases where scripts and functions
4800continue after an error: in functions without the "abort" flag or in a command
4801after ":silent!", control flow goes to the following line, and outside
4802functions, control flow goes to the line following the outermost ":endwhile"
4803or ":endif". On the other hand, errors should be catchable as exceptions
4804(thus, requiring the immediate abortion).
4805
4806This problem has been solved by converting errors to exceptions and using
4807immediate abortion (if not suppressed by ":silent!") only when a try
Bram Moolenaar58b85342016-08-14 19:54:54 +02004808conditional is active. This is no restriction since an (error) exception can
4809be caught only from an active try conditional. If you want an immediate
Bram Moolenaar071d4272004-06-13 20:20:40 +00004810termination without catching the error, just use a try conditional without
4811catch clause. (You can cause cleanup code being executed before termination
4812by specifying a finally clause.)
4813
4814When no try conditional is active, the usual abortion and continuation
4815behavior is used instead of immediate abortion. This ensures compatibility of
4816scripts written for Vim 6.1 and earlier.
4817
4818However, when sourcing an existing script that does not use exception handling
4819commands (or when calling one of its functions) from inside an active try
4820conditional of a new script, you might change the control flow of the existing
4821script on error. You get the immediate abortion on error and can catch the
4822error in the new script. If however the sourced script suppresses error
4823messages by using the ":silent!" command (checking for errors by testing
Bram Moolenaar58b85342016-08-14 19:54:54 +02004824|v:errmsg| if appropriate), its execution path is not changed. The error is
4825not converted to an exception. (See |:silent|.) So the only remaining cause
Bram Moolenaar071d4272004-06-13 20:20:40 +00004826where this happens is for scripts that don't care about errors and produce
4827error messages. You probably won't want to use such code from your new
4828scripts.
4829
4830 *except-syntax-err*
4831Syntax errors in the exception handling commands are never caught by any of
4832the ":catch" commands of the try conditional they belong to. Its finally
4833clauses, however, is executed.
4834 Example: >
4835
4836 :try
4837 : try
4838 : throw 4711
4839 : catch /\(/
4840 : echo "in catch with syntax error"
4841 : catch
4842 : echo "inner catch-all"
4843 : finally
4844 : echo "inner finally"
4845 : endtry
4846 :catch
Bram Moolenaarc51cf032022-02-26 12:25:45 +00004847 : echo 'outer catch-all caught "' .. v:exception .. '"'
Bram Moolenaar071d4272004-06-13 20:20:40 +00004848 : finally
4849 : echo "outer finally"
4850 :endtry
4851
4852This displays: >
4853 inner finally
4854 outer catch-all caught "Vim(catch):E54: Unmatched \("
4855 outer finally
4856The original exception is discarded and an error exception is raised, instead.
4857
4858 *except-single-line*
4859The ":try", ":catch", ":finally", and ":endtry" commands can be put on
4860a single line, but then syntax errors may make it difficult to recognize the
4861"catch" line, thus you better avoid this.
4862 Example: >
4863 :try | unlet! foo # | catch | endtry
4864raises an error exception for the trailing characters after the ":unlet!"
4865argument, but does not see the ":catch" and ":endtry" commands, so that the
4866error exception is discarded and the "E488: Trailing characters" message gets
4867displayed.
4868
4869 *except-several-errors*
4870When several errors appear in a single command, the first error message is
Bram Moolenaar53f7fcc2021-07-28 20:10:16 +02004871usually the most specific one and therefore converted to the error exception.
Bram Moolenaar071d4272004-06-13 20:20:40 +00004872 Example: >
4873 echo novar
4874causes >
4875 E121: Undefined variable: novar
4876 E15: Invalid expression: novar
4877The value of the error exception inside try conditionals is: >
4878 Vim(echo):E121: Undefined variable: novar
4879< *except-syntax-error*
4880But when a syntax error is detected after a normal error in the same command,
4881the syntax error is used for the exception being thrown.
4882 Example: >
4883 unlet novar #
4884causes >
4885 E108: No such variable: "novar"
4886 E488: Trailing characters
4887The value of the error exception inside try conditionals is: >
4888 Vim(unlet):E488: Trailing characters
4889This is done because the syntax error might change the execution path in a way
4890not intended by the user. Example: >
4891 try
4892 try | unlet novar # | catch | echo v:exception | endtry
4893 catch /.*/
4894 echo "outer catch:" v:exception
4895 endtry
4896This displays "outer catch: Vim(unlet):E488: Trailing characters", and then
4897a "E600: Missing :endtry" error message is given, see |except-single-line|.
4898
4899==============================================================================
49009. Examples *eval-examples*
4901
Bram Moolenaaref2f6562007-05-06 13:32:59 +00004902Printing in Binary ~
Bram Moolenaar071d4272004-06-13 20:20:40 +00004903>
Bram Moolenaar8f3f58f2010-01-06 20:52:26 +01004904 :" The function Nr2Bin() returns the binary string representation of a number.
Bram Moolenaaref2f6562007-05-06 13:32:59 +00004905 :func Nr2Bin(nr)
Bram Moolenaar071d4272004-06-13 20:20:40 +00004906 : let n = a:nr
4907 : let r = ""
4908 : while n
Bram Moolenaarc51cf032022-02-26 12:25:45 +00004909 : let r = '01'[n % 2] .. r
Bram Moolenaaref2f6562007-05-06 13:32:59 +00004910 : let n = n / 2
Bram Moolenaar071d4272004-06-13 20:20:40 +00004911 : endwhile
4912 : return r
4913 :endfunc
4914
Bram Moolenaaref2f6562007-05-06 13:32:59 +00004915 :" The function String2Bin() converts each character in a string to a
4916 :" binary string, separated with dashes.
4917 :func String2Bin(str)
Bram Moolenaar071d4272004-06-13 20:20:40 +00004918 : let out = ''
Bram Moolenaaref2f6562007-05-06 13:32:59 +00004919 : for ix in range(strlen(a:str))
Bram Moolenaarc51cf032022-02-26 12:25:45 +00004920 : let out = out .. '-' .. Nr2Bin(char2nr(a:str[ix]))
Bram Moolenaaref2f6562007-05-06 13:32:59 +00004921 : endfor
4922 : return out[1:]
Bram Moolenaar071d4272004-06-13 20:20:40 +00004923 :endfunc
4924
4925Example of its use: >
Bram Moolenaaref2f6562007-05-06 13:32:59 +00004926 :echo Nr2Bin(32)
4927result: "100000" >
4928 :echo String2Bin("32")
4929result: "110011-110010"
Bram Moolenaar071d4272004-06-13 20:20:40 +00004930
4931
Bram Moolenaaref2f6562007-05-06 13:32:59 +00004932Sorting lines ~
Bram Moolenaar071d4272004-06-13 20:20:40 +00004933
Bram Moolenaaref2f6562007-05-06 13:32:59 +00004934This example sorts lines with a specific compare function. >
4935
4936 :func SortBuffer()
4937 : let lines = getline(1, '$')
4938 : call sort(lines, function("Strcmp"))
4939 : call setline(1, lines)
Bram Moolenaar071d4272004-06-13 20:20:40 +00004940 :endfunction
4941
Bram Moolenaaref2f6562007-05-06 13:32:59 +00004942As a one-liner: >
4943 :call setline(1, sort(getline(1, '$'), function("Strcmp")))
Bram Moolenaar071d4272004-06-13 20:20:40 +00004944
Bram Moolenaar071d4272004-06-13 20:20:40 +00004945
Bram Moolenaaref2f6562007-05-06 13:32:59 +00004946scanf() replacement ~
Bram Moolenaar071d4272004-06-13 20:20:40 +00004947 *sscanf*
4948There is no sscanf() function in Vim. If you need to extract parts from a
4949line, you can use matchstr() and substitute() to do it. This example shows
4950how to get the file name, line number and column number out of a line like
4951"foobar.txt, 123, 45". >
4952 :" Set up the match bit
4953 :let mx='\(\f\+\),\s*\(\d\+\),\s*\(\d\+\)'
4954 :"get the part matching the whole expression
4955 :let l = matchstr(line, mx)
4956 :"get each item out of the match
4957 :let file = substitute(l, mx, '\1', '')
4958 :let lnum = substitute(l, mx, '\2', '')
4959 :let col = substitute(l, mx, '\3', '')
4960
4961The input is in the variable "line", the results in the variables "file",
4962"lnum" and "col". (idea from Michael Geddes)
4963
Bram Moolenaaref2f6562007-05-06 13:32:59 +00004964
4965getting the scriptnames in a Dictionary ~
4966 *scriptnames-dictionary*
Bram Moolenaardd60c362023-02-27 15:49:53 +00004967The `:scriptnames` command can be used to get a list of all script files that
4968have been sourced. There is also the `getscriptinfo()` function, but the
4969information returned is not exactly the same. In case you need to manipulate
Bram Moolenaar71badf92023-04-22 22:40:14 +01004970the list, this code can be used as a base: >
Bram Moolenaarb0d45e72017-11-05 18:19:24 +01004971
Bram Moolenaar71badf92023-04-22 22:40:14 +01004972 # Create or update scripts dictionary, indexed by SNR, and return it.
4973 def Scripts(scripts: dict<string> = {}): dict<string>
4974 for info in getscriptinfo()
4975 if scripts->has_key(info.sid)
4976 continue
4977 endif
4978 scripts[info.sid] = info.name
4979 endfor
4980 return scripts
4981 enddef
Bram Moolenaaref2f6562007-05-06 13:32:59 +00004982
Bram Moolenaar071d4272004-06-13 20:20:40 +00004983==============================================================================
Bram Moolenaar558ca4a2019-04-04 18:15:38 +0200498410. Vim script versions *vimscript-version* *vimscript-versions*
Bram Moolenaar911ead12019-04-21 00:03:35 +02004985 *scriptversion*
Bram Moolenaar558ca4a2019-04-04 18:15:38 +02004986Over time many features have been added to Vim script. This includes Ex
4987commands, functions, variable types, etc. Each individual feature can be
4988checked with the |has()| and |exists()| functions.
4989
4990Sometimes old syntax of functionality gets in the way of making Vim better.
4991When support is taken away this will break older Vim scripts. To make this
4992explicit the |:scriptversion| command can be used. When a Vim script is not
4993compatible with older versions of Vim this will give an explicit error,
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +02004994instead of failing in mysterious ways.
Bram Moolenaar558ca4a2019-04-04 18:15:38 +02004995
Bram Moolenaara2baa732022-02-04 16:09:54 +00004996When using a legacy function, defined with `:function`, in |Vim9| script then
4997scriptversion 4 is used.
4998
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +02004999 *scriptversion-1* >
Bram Moolenaar558ca4a2019-04-04 18:15:38 +02005000 :scriptversion 1
5001< This is the original Vim script, same as not using a |:scriptversion|
5002 command. Can be used to go back to old syntax for a range of lines.
5003 Test for support with: >
5004 has('vimscript-1')
5005
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +02005006< *scriptversion-2* >
Bram Moolenaar558ca4a2019-04-04 18:15:38 +02005007 :scriptversion 2
Bram Moolenaar68e65602019-05-26 21:33:31 +02005008< String concatenation with "." is not supported, use ".." instead.
Bram Moolenaar558ca4a2019-04-04 18:15:38 +02005009 This avoids the ambiguity using "." for Dict member access and
5010 floating point numbers. Now ".5" means the number 0.5.
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +02005011
5012 *scriptversion-3* >
Bram Moolenaar911ead12019-04-21 00:03:35 +02005013 :scriptversion 3
5014< All |vim-variable|s must be prefixed by "v:". E.g. "version" doesn't
5015 work as |v:version| anymore, it can be used as a normal variable.
5016 Same for some obvious names as "count" and others.
Bram Moolenaar558ca4a2019-04-04 18:15:38 +02005017
Bram Moolenaar911ead12019-04-21 00:03:35 +02005018 Test for support with: >
5019 has('vimscript-3')
Bram Moolenaar60a8de22019-09-15 14:33:22 +02005020<
5021 *scriptversion-4* >
5022 :scriptversion 4
Bram Moolenaarc17e66c2020-06-02 21:38:22 +02005023< Numbers with a leading zero are not recognized as octal. "0o" or "0O"
5024 is still recognized as octal. With the
Bram Moolenaar60a8de22019-09-15 14:33:22 +02005025 previous version you get: >
Bram Moolenaarc17e66c2020-06-02 21:38:22 +02005026 echo 017 " displays 15 (octal)
5027 echo 0o17 " displays 15 (octal)
5028 echo 018 " displays 18 (decimal)
Bram Moolenaar60a8de22019-09-15 14:33:22 +02005029< with script version 4: >
Bram Moolenaarc17e66c2020-06-02 21:38:22 +02005030 echo 017 " displays 17 (decimal)
5031 echo 0o17 " displays 15 (octal)
5032 echo 018 " displays 18 (decimal)
Bram Moolenaar60a8de22019-09-15 14:33:22 +02005033< Also, it is possible to use single quotes inside numbers to make them
5034 easier to read: >
5035 echo 1'000'000
5036< The quotes must be surrounded by digits.
5037
5038 Test for support with: >
5039 has('vimscript-4')
Bram Moolenaar558ca4a2019-04-04 18:15:38 +02005040
5041==============================================================================
504211. No +eval feature *no-eval-feature*
Bram Moolenaar071d4272004-06-13 20:20:40 +00005043
5044When the |+eval| feature was disabled at compile time, none of the expression
5045evaluation commands are available. To prevent this from causing Vim scripts
5046to generate all kinds of errors, the ":if" and ":endif" commands are still
5047recognized, though the argument of the ":if" and everything between the ":if"
5048and the matching ":endif" is ignored. Nesting of ":if" blocks is allowed, but
5049only if the commands are at the start of the line. The ":else" command is not
5050recognized.
5051
5052Example of how to avoid executing commands when the |+eval| feature is
5053missing: >
5054
5055 :if 1
5056 : echo "Expression evaluation is compiled in"
5057 :else
5058 : echo "You will _never_ see this message"
5059 :endif
5060
Bram Moolenaar773a97c2019-06-06 20:39:55 +02005061To execute a command only when the |+eval| feature is disabled can be done in
5062two ways. The simplest is to exit the script (or Vim) prematurely: >
5063 if 1
5064 echo "commands executed with +eval"
5065 finish
5066 endif
5067 args " command executed without +eval
5068
5069If you do not want to abort loading the script you can use a trick, as this
5070example shows: >
Bram Moolenaar45d2cca2017-04-30 16:36:05 +02005071
5072 silent! while 0
5073 set history=111
5074 silent! endwhile
5075
5076When the |+eval| feature is available the command is skipped because of the
5077"while 0". Without the |+eval| feature the "while 0" is an error, which is
5078silently ignored, and the command is executed.
Bram Moolenaarcd5c8f82017-04-09 20:11:58 +02005079
Bram Moolenaar071d4272004-06-13 20:20:40 +00005080==============================================================================
Bram Moolenaar2f0936c2022-01-08 21:51:59 +0000508112. The sandbox *eval-sandbox* *sandbox*
Bram Moolenaar071d4272004-06-13 20:20:40 +00005082
Bram Moolenaar368373e2010-07-19 20:46:22 +02005083The 'foldexpr', 'formatexpr', 'includeexpr', 'indentexpr', 'statusline' and
5084'foldtext' options may be evaluated in a sandbox. This means that you are
5085protected from these expressions having nasty side effects. This gives some
5086safety for when these options are set from a modeline. It is also used when
5087the command from a tags file is executed and for CTRL-R = in the command line.
Bram Moolenaar7b0294c2004-10-11 10:16:09 +00005088The sandbox is also used for the |:sandbox| command.
Bram Moolenaar2f0936c2022-01-08 21:51:59 +00005089 *E48*
Bram Moolenaar071d4272004-06-13 20:20:40 +00005090These items are not allowed in the sandbox:
5091 - changing the buffer text
Bram Moolenaarb477af22018-07-15 20:20:18 +02005092 - defining or changing mapping, autocommands, user commands
Bram Moolenaar071d4272004-06-13 20:20:40 +00005093 - setting certain options (see |option-summary|)
Bram Moolenaaref2f6562007-05-06 13:32:59 +00005094 - setting certain v: variables (see |v:var|) *E794*
Bram Moolenaar071d4272004-06-13 20:20:40 +00005095 - executing a shell command
5096 - reading or writing a file
5097 - jumping to another buffer or editing a file
Bram Moolenaar4770d092006-01-12 23:22:24 +00005098 - executing Python, Perl, etc. commands
Bram Moolenaar7b0294c2004-10-11 10:16:09 +00005099This is not guaranteed 100% secure, but it should block most attacks.
5100
5101 *:san* *:sandbox*
Bram Moolenaar045e82d2005-07-08 22:25:33 +00005102:san[dbox] {cmd} Execute {cmd} in the sandbox. Useful to evaluate an
Bram Moolenaar7b0294c2004-10-11 10:16:09 +00005103 option that may have been set from a modeline, e.g.
5104 'foldexpr'.
5105
Bram Moolenaarb71eaae2006-01-20 23:10:18 +00005106 *sandbox-option*
5107A few options contain an expression. When this expression is evaluated it may
Bram Moolenaar9b2200a2006-03-20 21:55:45 +00005108have to be done in the sandbox to avoid a security risk. But the sandbox is
Bram Moolenaarb71eaae2006-01-20 23:10:18 +00005109restrictive, thus this only happens when the option was set from an insecure
5110location. Insecure in this context are:
Bram Moolenaar551dbcc2006-04-25 22:13:59 +00005111- sourcing a .vimrc or .exrc in the current directory
Bram Moolenaarb71eaae2006-01-20 23:10:18 +00005112- while executing in the sandbox
5113- value coming from a modeline
Bram Moolenaarb477af22018-07-15 20:20:18 +02005114- executing a function that was defined in the sandbox
Bram Moolenaarb71eaae2006-01-20 23:10:18 +00005115
5116Note that when in the sandbox and saving an option value and restoring it, the
5117option will still be marked as it was set in the sandbox.
5118
5119==============================================================================
Bram Moolenaar558ca4a2019-04-04 18:15:38 +0200512013. Textlock *textlock*
Bram Moolenaarb71eaae2006-01-20 23:10:18 +00005121
5122In a few situations it is not allowed to change the text in the buffer, jump
5123to another window and some other things that might confuse or break what Vim
5124is currently doing. This mostly applies to things that happen when Vim is
Bram Moolenaar58b85342016-08-14 19:54:54 +02005125actually doing something else. For example, evaluating the 'balloonexpr' may
Bram Moolenaarb71eaae2006-01-20 23:10:18 +00005126happen any moment the mouse cursor is resting at some position.
5127
5128This is not allowed when the textlock is active:
5129 - changing the buffer text
5130 - jumping to another buffer or window
5131 - editing another file
5132 - closing a window or quitting Vim
5133 - etc.
5134
Christian Brabandtda4e4332023-11-05 10:45:12 +01005135==============================================================================
513614. Vim script library *vim-script-library*
5137
5138Vim comes bundled with a Vim script library, that can be used by runtime,
5139script authors. Currently, it only includes very few functions, but it may
5140grow over time.
5141
h_east596a9f22023-11-21 21:24:23 +09005142The functions are available as |Vim9-script| as well as using legacy Vim
Christian Brabandtda4e4332023-11-05 10:45:12 +01005143script (to be used for non Vim 9.0 versions and Neovim).
5144
5145 *dist#vim* *dist#vim9*
h_east596a9f22023-11-21 21:24:23 +09005146The functions make use of the autoloaded prefix "dist#vim" (for legacy Vim
5147script and Neovim) and "dist#vim9" for Vim9 script.
Christian Brabandtda4e4332023-11-05 10:45:12 +01005148
5149The following functions are available:
5150
5151dist#vim#IsSafeExecutable(filetype, executable) ~
5152dist#vim9#IsSafeExecutable(filetype:string, executable:string): bool ~
5153
5154This function takes a filetype and an executable and checks whether it is safe
5155to execute the given executable. For security reasons users may not want to
5156have Vim execute random executables or may have forbidden to do so for
5157specific filetypes by setting the "<filetype>_exec" variable (|plugin_exec|).
5158
5159It returns |true| or |false| to indicate whether the plugin should run the given
zeertzjq61e984e2023-12-09 15:18:33 +08005160executable. It takes the following arguments:
Christian Brabandtda4e4332023-11-05 10:45:12 +01005161
5162 argument type ~
5163
5164 filetype string
5165 executable string
5166
Christian Brabandta2dd40c2025-06-04 21:59:01 +02005167 *package-open*
5168The |:Open| and |:Launch| command are provided by the included plugin
5169$VIMRUNTIME/plugin/openPlugin.vim
5170
Christian Brabandt9301b432025-04-02 19:32:03 +02005171 *dist#vim9#Open()* *:Open* *:URLOpen*
Luca Saccarola76680122025-01-29 18:33:46 +01005172 *g:Openprg* *gx*
Luca Saccarolac729d6d2025-01-25 16:07:12 +01005173dist#vim9#Open(file: string) ~
5174
5175Opens `path` with the system default handler (macOS `open`, Windows
5176`explorer.exe`, Linux `xdg-open`, …). If the variable |g:Openprg| exists the
5177string specified in the variable is used instead.
5178
Christian Brabandt9301b432025-04-02 19:32:03 +02005179The |:Open| user command uses file completion for its argument.
5180
Christian Brabandta2dd40c2025-06-04 21:59:01 +02005181The |:URLOpen| user command works the same but does not perform file
5182completion and therefore does not expand special characters |cmdline-special|.
5183
Luca Saccarola76680122025-01-29 18:33:46 +01005184This function is by default called using the gx mapping. In visual mode
5185tries to open the visually selected text.
5186
5187Associated setting variables:
5188`g:gx_word`: control how gx picks up the text under the cursor. Uses
5189 `g:netrw_gx` as a fallback for backward compatibility.
5190 (default: `<cfile>`)
5191
5192`g:nogx`: disables the gx mapping. Uses `g:netrw_nogx` as a fallback for
5193 backward compatibility. (default: `unset`)
5194
5195
Luca Saccarolac729d6d2025-01-25 16:07:12 +01005196NOTE: Escaping of the path is automatically applied.
5197
5198Usage: >vim
5199 :call dist#vim9#Open(<path>)
5200 :Open <path>
Christian Brabandta2dd40c2025-06-04 21:59:01 +02005201 :URLOpen <path>
Luca Saccarolac729d6d2025-01-25 16:07:12 +01005202<
Christian Brabandt9301b432025-04-02 19:32:03 +02005203 *dist#vim9#Launch()* *:Launch*
Luca Saccarolac729d6d2025-01-25 16:07:12 +01005204dist#vim9#Launch(file: string) ~
5205
5206Launches <args> with the appropriate system programs. Intended for launching
5207GUI programs within Vim.
5208
Christian Brabandt9301b432025-04-02 19:32:03 +02005209The |:Launch| user command uses shell completion for its first argument.
5210
Luca Saccarolac729d6d2025-01-25 16:07:12 +01005211NOTE: escaping of <args> is left to the user
5212
5213Examples: >vim
5214 vim9script
5215
5216 import autoload 'dist/vim9.vim'
5217 # Execute 'makeprg' into another xterm window
5218 vim9.Launch('xterm ' .. expandcmd(&makeprg))
5219<
5220
5221Usage: >vim
5222 :call dist#vim9#Launch(<args>)
5223 :Launch <app> <args>.
5224<
Bram Moolenaar071d4272004-06-13 20:20:40 +00005225
Bram Moolenaar91f84f62018-07-29 15:07:52 +02005226 vim:tw=78:ts=8:noet:ft=help:norl: