blob: 9ac4942ddef989d989b18f93248a48dd01a74246 [file] [log] [blame]
Bram Moolenaareb490412022-06-28 13:44:46 +01001*eval.txt* For Vim version 9.0. Last change: 2022 Jun 17
Bram Moolenaar071d4272004-06-13 20:20:40 +00002
3
Bram Moolenaar446cb832008-06-24 21:56:24 +00004 VIM REFERENCE MANUAL by Bram Moolenaar
Bram Moolenaar071d4272004-06-13 20:20:40 +00005
6
7Expression evaluation *expression* *expr* *E15* *eval*
Bram Moolenaar6f4754b2022-01-23 12:07:04 +00008 *E1002*
Bram Moolenaar071d4272004-06-13 20:20:40 +00009Using expressions is introduced in chapter 41 of the user manual |usr_41.txt|.
10
11Note: Expression evaluation can be disabled at compile time. If this has been
Bram Moolenaar58b85342016-08-14 19:54:54 +020012done, the features in this document are not available. See |+eval| and
Bram Moolenaard8b02732005-01-14 21:48:43 +000013|no-eval-feature|.
Bram Moolenaar071d4272004-06-13 20:20:40 +000014
Bram Moolenaar1cae5a02021-12-27 21:28:34 +000015This file is mainly about the backwards compatible (legacy) Vim script. For
Bram Moolenaar2f0936c2022-01-08 21:51:59 +000016specifics of Vim9 script, which can execute much faster, supports type
17checking and much more, see |vim9.txt|. Where the syntax or semantics differ
18a remark is given.
Bram Moolenaar8a7d6542020-01-26 15:56:19 +010019
Bram Moolenaar13065c42005-01-08 16:08:21 +0000201. Variables |variables|
21 1.1 Variable types
Bram Moolenaar9588a0f2005-01-08 21:45:39 +000022 1.2 Function references |Funcref|
Bram Moolenaar7c626922005-02-07 22:01:03 +000023 1.3 Lists |Lists|
Bram Moolenaard8b02732005-01-14 21:48:43 +000024 1.4 Dictionaries |Dictionaries|
Bram Moolenaard8968242019-01-15 22:51:57 +010025 1.5 Blobs |Blobs|
26 1.6 More about variables |more-variables|
Bram Moolenaar13065c42005-01-08 16:08:21 +0000272. Expression syntax |expression-syntax|
283. Internal variable |internal-variables|
294. Builtin Functions |functions|
305. Defining functions |user-functions|
316. Curly braces names |curly-braces-names|
327. Commands |expression-commands|
338. Exception handling |exception-handling|
349. Examples |eval-examples|
Bram Moolenaar558ca4a2019-04-04 18:15:38 +02003510. Vim script version |vimscript-version|
3611. No +eval feature |no-eval-feature|
3712. The sandbox |eval-sandbox|
3813. Textlock |textlock|
Bram Moolenaared997ad2019-07-21 16:42:00 +020039
40Testing support is documented in |testing.txt|.
41Profiling is documented at |profiling|.
Bram Moolenaar071d4272004-06-13 20:20:40 +000042
Bram Moolenaar071d4272004-06-13 20:20:40 +000043==============================================================================
441. Variables *variables*
45
Bram Moolenaar13065c42005-01-08 16:08:21 +0000461.1 Variable types ~
Bram Moolenaarf10911e2022-01-29 22:20:48 +000047 *E712* *E896* *E897* *E899* *E1098*
48 *E1107* *E1135* *E1138*
Bram Moolenaar06fe74a2019-08-31 16:20:32 +020049There are ten types of variables:
Bram Moolenaar071d4272004-06-13 20:20:40 +000050
Bram Moolenaar664f3cf2019-12-07 16:03:51 +010051 *Number* *Integer*
52Number A 32 or 64 bit signed number. |expr-number|
Bram Moolenaarf9706e92020-02-22 14:27:04 +010053 The number of bits is available in |v:numbersize|.
Bram Moolenaar6f02b002021-01-10 20:22:54 +010054 Examples: -123 0x10 0177 0o177 0b1011
Bram Moolenaard8b02732005-01-14 21:48:43 +000055
Bram Moolenaar446cb832008-06-24 21:56:24 +000056Float A floating point number. |floating-point-format| *Float*
Bram Moolenaar6f4754b2022-01-23 12:07:04 +000057 {only when compiled with the |+float| feature} *E1076*
Bram Moolenaar446cb832008-06-24 21:56:24 +000058 Examples: 123.456 1.15e-6 -1.1e3
59
Bram Moolenaard8b02732005-01-14 21:48:43 +000060String A NUL terminated string of 8-bit unsigned characters (bytes).
Bram Moolenaar446cb832008-06-24 21:56:24 +000061 |expr-string| Examples: "ab\txx\"--" 'x-z''a,c'
Bram Moolenaard8b02732005-01-14 21:48:43 +000062
Bram Moolenaard8968242019-01-15 22:51:57 +010063List An ordered sequence of items, see |List| for details.
Bram Moolenaard8b02732005-01-14 21:48:43 +000064 Example: [1, 2, ['a', 'b']]
Bram Moolenaar071d4272004-06-13 20:20:40 +000065
Bram Moolenaar39a58ca2005-06-27 22:42:44 +000066Dictionary An associative, unordered array: Each entry has a key and a
67 value. |Dictionary|
Bram Moolenaard5abb4c2019-07-13 22:46:10 +020068 Examples:
69 {'blue': "#0000ff", 'red': "#ff0000"}
Bram Moolenaar4c6d9042019-07-16 22:04:02 +020070 #{blue: "#0000ff", red: "#ff0000"}
Bram Moolenaar39a58ca2005-06-27 22:42:44 +000071
Bram Moolenaar835dc632016-02-07 14:27:38 +010072Funcref A reference to a function |Funcref|.
73 Example: function("strlen")
Bram Moolenaar1d429612016-05-24 15:44:17 +020074 It can be bound to a dictionary and arguments, it then works
75 like a Partial.
76 Example: function("Callback", [arg], myDict)
Bram Moolenaar835dc632016-02-07 14:27:38 +010077
Bram Moolenaar02e83b42016-02-21 20:10:26 +010078Special |v:false|, |v:true|, |v:none| and |v:null|. *Special*
Bram Moolenaar835dc632016-02-07 14:27:38 +010079
Bram Moolenaarebf7dfa2016-04-14 12:46:51 +020080Job Used for a job, see |job_start()|. *Job* *Jobs*
Bram Moolenaar38a55632016-02-15 22:07:32 +010081
Bram Moolenaarebf7dfa2016-04-14 12:46:51 +020082Channel Used for a channel, see |ch_open()|. *Channel* *Channels*
Bram Moolenaar835dc632016-02-07 14:27:38 +010083
Bram Moolenaard8968242019-01-15 22:51:57 +010084Blob Binary Large Object. Stores any sequence of bytes. See |Blob|
85 for details
Bram Moolenaar6e5ea8d2019-01-12 22:47:31 +010086 Example: 0zFF00ED015DAF
87 0z is an empty Blob.
88
Bram Moolenaard7ee7ce2005-01-03 21:02:03 +000089The Number and String types are converted automatically, depending on how they
90are used.
Bram Moolenaar071d4272004-06-13 20:20:40 +000091
92Conversion from a Number to a String is by making the ASCII representation of
Bram Moolenaar24ea3ba2010-09-19 19:01:21 +020093the Number. Examples:
94 Number 123 --> String "123" ~
95 Number 0 --> String "0" ~
96 Number -1 --> String "-1" ~
Bram Moolenaar00a927d2010-05-14 23:24:24 +020097 *octal*
Bram Moolenaard43906d2020-07-20 21:31:32 +020098Conversion from a String to a Number only happens in legacy Vim script, not in
99Vim9 script. It is done by converting the first digits to a number.
100Hexadecimal "0xf9", Octal "017" or "0o17", and Binary "0b10"
Bram Moolenaar6f02b002021-01-10 20:22:54 +0100101numbers are recognized
Bram Moolenaar5da36052021-12-27 15:39:57 +0000102NOTE: when using |Vim9| script or |scriptversion-4| octal with a leading "0"
103is not recognized. The 0o notation requires patch 8.2.0886.
Bram Moolenaar6f02b002021-01-10 20:22:54 +0100104If the String doesn't start with digits, the result is zero.
Bram Moolenaarfa735342016-01-03 22:14:44 +0100105Examples:
Bram Moolenaar24ea3ba2010-09-19 19:01:21 +0200106 String "456" --> Number 456 ~
107 String "6bar" --> Number 6 ~
108 String "foo" --> Number 0 ~
109 String "0xf1" --> Number 241 ~
110 String "0100" --> Number 64 ~
Bram Moolenaarc17e66c2020-06-02 21:38:22 +0200111 String "0o100" --> Number 64 ~
Bram Moolenaarfa735342016-01-03 22:14:44 +0100112 String "0b101" --> Number 5 ~
Bram Moolenaar24ea3ba2010-09-19 19:01:21 +0200113 String "-8" --> Number -8 ~
114 String "+8" --> Number 0 ~
Bram Moolenaar071d4272004-06-13 20:20:40 +0000115
116To force conversion from String to Number, add zero to it: >
117 :echo "0100" + 0
Bram Moolenaar97b2ad32006-03-18 21:40:56 +0000118< 64 ~
119
120To avoid a leading zero to cause octal conversion, or for using a different
121base, use |str2nr()|.
Bram Moolenaar071d4272004-06-13 20:20:40 +0000122
Bram Moolenaard09091d2019-01-17 16:07:22 +0100123 *TRUE* *FALSE* *Boolean*
Bram Moolenaar071d4272004-06-13 20:20:40 +0000124For boolean operators Numbers are used. Zero is FALSE, non-zero is TRUE.
Bram Moolenaar6aa57292021-08-14 21:25:52 +0200125You can also use |v:false| and |v:true|, in Vim9 script |false| and |true|.
Bram Moolenaar1c6737b2020-09-07 22:18:52 +0200126When TRUE is returned from a function it is the Number one, FALSE is the
127number zero.
Bram Moolenaar071d4272004-06-13 20:20:40 +0000128
Bram Moolenaare381d3d2016-07-07 14:50:41 +0200129Note that in the command: >
Bram Moolenaar071d4272004-06-13 20:20:40 +0000130 :if "foo"
Bram Moolenaare381d3d2016-07-07 14:50:41 +0200131 :" NOT executed
132"foo" is converted to 0, which means FALSE. If the string starts with a
133non-zero number it means TRUE: >
134 :if "8foo"
135 :" executed
136To test for a non-empty string, use empty(): >
Bram Moolenaar3a0d8092012-10-21 03:02:54 +0200137 :if !empty("foo")
Bram Moolenaar92f26c22020-10-03 20:17:30 +0200138
139< *falsy* *truthy*
140An expression can be used as a condition, ignoring the type and only using
141whether the value is "sort of true" or "sort of false". Falsy is:
142 the number zero
143 empty string, blob, list or dictionary
144Other values are truthy. Examples:
145 0 falsy
146 1 truthy
147 -1 truthy
148 0.0 falsy
149 0.1 truthy
150 '' falsy
151 'x' truthy
152 [] falsy
153 [0] truthy
154 {} falsy
155 #{x: 1} truthy
156 0z falsy
157 0z00 truthy
158
Bram Moolenaare381d3d2016-07-07 14:50:41 +0200159 *non-zero-arg*
160Function arguments often behave slightly different from |TRUE|: If the
161argument is present and it evaluates to a non-zero Number, |v:true| or a
Bram Moolenaar64d8e252016-09-06 22:12:34 +0200162non-empty String, then the value is considered to be TRUE.
Bram Moolenaar01164a62017-11-02 22:58:42 +0100163Note that " " and "0" are also non-empty strings, thus considered to be TRUE.
164A List, Dictionary or Float is not a Number or String, thus evaluate to FALSE.
Bram Moolenaare381d3d2016-07-07 14:50:41 +0200165
Bram Moolenaar2f0936c2022-01-08 21:51:59 +0000166 *E611* *E745* *E728* *E703* *E729* *E730* *E731* *E908* *E910*
167 *E913* *E974* *E975* *E976*
Bram Moolenaard09091d2019-01-17 16:07:22 +0100168|List|, |Dictionary|, |Funcref|, |Job|, |Channel| and |Blob| types are not
169automatically converted.
Bram Moolenaard7ee7ce2005-01-03 21:02:03 +0000170
Bram Moolenaar446cb832008-06-24 21:56:24 +0000171 *E805* *E806* *E808*
Bram Moolenaar58b85342016-08-14 19:54:54 +0200172When mixing Number and Float the Number is converted to Float. Otherwise
Bram Moolenaar446cb832008-06-24 21:56:24 +0000173there is no automatic conversion of Float. You can use str2float() for String
174to Float, printf() for Float to String and float2nr() for Float to Number.
175
Bram Moolenaar2f0936c2022-01-08 21:51:59 +0000176 *E362* *E891* *E892* *E893* *E894* *E907* *E911* *E914*
Bram Moolenaar13d5aee2016-01-21 23:36:05 +0100177When expecting a Float a Number can also be used, but nothing else.
178
Bram Moolenaarf6f32c32016-03-12 19:03:59 +0100179 *no-type-checking*
180You will not get an error if you try to change the type of a variable.
Bram Moolenaard7ee7ce2005-01-03 21:02:03 +0000181
Bram Moolenaar13065c42005-01-08 16:08:21 +0000182
Bram Moolenaar9588a0f2005-01-08 21:45:39 +00001831.2 Function references ~
Bram Moolenaar8a3b8052022-06-26 12:21:15 +0100184 *Funcref* *E695* *E718* *E1192*
Bram Moolenaar58b85342016-08-14 19:54:54 +0200185A Funcref variable is obtained with the |function()| function, the |funcref()|
Bram Moolenaarcfa8f9a2022-06-03 21:59:47 +0100186function, (in |Vim9| script) the name of a function, or created with the
187lambda expression |expr-lambda|. It can be used in an expression in the place
188of a function name, before the parenthesis around the arguments, to invoke the
189function it refers to. Example in |Vim9| script: >
Bram Moolenaard7ee7ce2005-01-03 21:02:03 +0000190
Bram Moolenaarcfa8f9a2022-06-03 21:59:47 +0100191 :var Fn = MyFunc
192 :echo Fn()
193
194Legacy script: >
Bram Moolenaard7ee7ce2005-01-03 21:02:03 +0000195 :let Fn = function("MyFunc")
196 :echo Fn()
Bram Moolenaar3a3a7232005-01-17 22:16:15 +0000197< *E704* *E705* *E707*
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000198A Funcref variable must start with a capital, "s:", "w:", "t:" or "b:". You
Bram Moolenaar7cba6c02013-09-05 22:13:31 +0200199can use "g:" but the following name must still start with a capital. You
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000200cannot have both a Funcref variable and a function with the same name.
Bram Moolenaard7ee7ce2005-01-03 21:02:03 +0000201
Bram Moolenaar3a3a7232005-01-17 22:16:15 +0000202A special case is defining a function and directly assigning its Funcref to a
203Dictionary entry. Example: >
204 :function dict.init() dict
205 : let self.val = 0
206 :endfunction
207
208The key of the Dictionary can start with a lower case letter. The actual
209function name is not used here. Also see |numbered-function|.
210
211A Funcref can also be used with the |:call| command: >
212 :call Fn()
213 :call dict.init()
Bram Moolenaar13065c42005-01-08 16:08:21 +0000214
215The name of the referenced function can be obtained with |string()|. >
Bram Moolenaar383f9bc2005-01-19 22:18:32 +0000216 :let func = string(Fn)
Bram Moolenaar13065c42005-01-08 16:08:21 +0000217
218You can use |call()| to invoke a Funcref and use a list variable for the
219arguments: >
Bram Moolenaar383f9bc2005-01-19 22:18:32 +0000220 :let r = call(Fn, mylist)
Bram Moolenaar1d429612016-05-24 15:44:17 +0200221<
222 *Partial*
223A Funcref optionally binds a Dictionary and/or arguments. This is also called
224a Partial. This is created by passing the Dictionary and/or arguments to
Bram Moolenaar58b85342016-08-14 19:54:54 +0200225function() or funcref(). When calling the function the Dictionary and/or
226arguments will be passed to the function. Example: >
Bram Moolenaar1d429612016-05-24 15:44:17 +0200227
228 let Cb = function('Callback', ['foo'], myDict)
Bram Moolenaarba3ff532018-11-04 14:45:49 +0100229 call Cb('bar')
Bram Moolenaar1d429612016-05-24 15:44:17 +0200230
231This will invoke the function as if using: >
Bram Moolenaarba3ff532018-11-04 14:45:49 +0100232 call myDict.Callback('foo', 'bar')
Bram Moolenaar1d429612016-05-24 15:44:17 +0200233
234This is very useful when passing a function around, e.g. in the arguments of
235|ch_open()|.
236
237Note that binding a function to a Dictionary also happens when the function is
238a member of the Dictionary: >
239
240 let myDict.myFunction = MyFunction
241 call myDict.myFunction()
242
243Here MyFunction() will get myDict passed as "self". This happens when the
244"myFunction" member is accessed. When making assigning "myFunction" to
245otherDict and calling it, it will be bound to otherDict: >
246
247 let otherDict.myFunction = myDict.myFunction
248 call otherDict.myFunction()
249
250Now "self" will be "otherDict". But when the dictionary was bound explicitly
251this won't happen: >
252
253 let myDict.myFunction = function(MyFunction, myDict)
254 let otherDict.myFunction = myDict.myFunction
255 call otherDict.myFunction()
256
Bram Moolenaard823fa92016-08-12 16:29:27 +0200257Here "self" will be "myDict", because it was bound explicitly.
Bram Moolenaard7ee7ce2005-01-03 21:02:03 +0000258
259
Bram Moolenaar9588a0f2005-01-08 21:45:39 +00002601.3 Lists ~
Bram Moolenaar7e38ea22014-04-05 22:55:53 +0200261 *list* *List* *Lists* *E686*
Bram Moolenaard7ee7ce2005-01-03 21:02:03 +0000262A List is an ordered sequence of items. An item can be of any type. Items
Bram Moolenaar58b85342016-08-14 19:54:54 +0200263can be accessed by their index number. Items can be added and removed at any
Bram Moolenaard7ee7ce2005-01-03 21:02:03 +0000264position in the sequence.
265
Bram Moolenaar13065c42005-01-08 16:08:21 +0000266
267List creation ~
268 *E696* *E697*
Bram Moolenaarcbaff5e2022-04-08 17:45:08 +0100269A List is created with a comma-separated list of items in square brackets.
Bram Moolenaar13065c42005-01-08 16:08:21 +0000270Examples: >
271 :let mylist = [1, two, 3, "four"]
272 :let emptylist = []
Bram Moolenaard7ee7ce2005-01-03 21:02:03 +0000273
Bram Moolenaar58b85342016-08-14 19:54:54 +0200274An item can be any expression. Using a List for an item creates a
Bram Moolenaarf9393ef2006-04-24 19:47:27 +0000275List of Lists: >
Bram Moolenaar13065c42005-01-08 16:08:21 +0000276 :let nestlist = [[11, 12], [21, 22], [31, 32]]
Bram Moolenaard7ee7ce2005-01-03 21:02:03 +0000277
278An extra comma after the last item is ignored.
279
Bram Moolenaar13065c42005-01-08 16:08:21 +0000280
281List index ~
282 *list-index* *E684*
Bram Moolenaard7ee7ce2005-01-03 21:02:03 +0000283An item in the List can be accessed by putting the index in square brackets
Bram Moolenaar13065c42005-01-08 16:08:21 +0000284after the List. Indexes are zero-based, thus the first item has index zero. >
285 :let item = mylist[0] " get the first item: 1
Bram Moolenaard7ee7ce2005-01-03 21:02:03 +0000286 :let item = mylist[2] " get the third item: 3
Bram Moolenaar13065c42005-01-08 16:08:21 +0000287
Bram Moolenaar9588a0f2005-01-08 21:45:39 +0000288When the resulting item is a list this can be repeated: >
Bram Moolenaar13065c42005-01-08 16:08:21 +0000289 :let item = nestlist[0][1] " get the first list, second item: 12
Bram Moolenaard7ee7ce2005-01-03 21:02:03 +0000290<
Bram Moolenaar13065c42005-01-08 16:08:21 +0000291A negative index is counted from the end. Index -1 refers to the last item in
292the List, -2 to the last but one item, etc. >
Bram Moolenaard7ee7ce2005-01-03 21:02:03 +0000293 :let last = mylist[-1] " get the last item: "four"
294
Bram Moolenaar13065c42005-01-08 16:08:21 +0000295To avoid an error for an invalid index use the |get()| function. When an item
Bram Moolenaar9588a0f2005-01-08 21:45:39 +0000296is not available it returns zero or the default value you specify: >
Bram Moolenaar13065c42005-01-08 16:08:21 +0000297 :echo get(mylist, idx)
298 :echo get(mylist, idx, "NONE")
299
300
301List concatenation ~
Bram Moolenaar34453202021-01-31 13:08:38 +0100302 *list-concatenation*
Bram Moolenaar13065c42005-01-08 16:08:21 +0000303Two lists can be concatenated with the "+" operator: >
304 :let longlist = mylist + [5, 6]
Bram Moolenaar383f9bc2005-01-19 22:18:32 +0000305 :let mylist += [7, 8]
Bram Moolenaar13065c42005-01-08 16:08:21 +0000306
Bram Moolenaar34453202021-01-31 13:08:38 +0100307To prepend or append an item, turn the item into a list by putting [] around
308it. To change a list in-place, refer to |list-modification| below.
Bram Moolenaar13065c42005-01-08 16:08:21 +0000309
310
311Sublist ~
Bram Moolenaarbc8801c2016-08-02 21:04:33 +0200312 *sublist*
Bram Moolenaard7ee7ce2005-01-03 21:02:03 +0000313A part of the List can be obtained by specifying the first and last index,
314separated by a colon in square brackets: >
Bram Moolenaar13065c42005-01-08 16:08:21 +0000315 :let shortlist = mylist[2:-1] " get List [3, "four"]
Bram Moolenaard7ee7ce2005-01-03 21:02:03 +0000316
317Omitting the first index is similar to zero. Omitting the last index is
Bram Moolenaaref2f6562007-05-06 13:32:59 +0000318similar to -1. >
Bram Moolenaar540d6e32005-01-09 21:20:18 +0000319 :let endlist = mylist[2:] " from item 2 to the end: [3, "four"]
320 :let shortlist = mylist[2:2] " List with one item: [3]
321 :let otherlist = mylist[:] " make a copy of the List
Bram Moolenaard7ee7ce2005-01-03 21:02:03 +0000322
Bram Moolenaar6601b622021-01-13 21:47:15 +0100323Notice that the last index is inclusive. If you prefer using an exclusive
324index use the |slice()| method.
325
Bram Moolenaarf9393ef2006-04-24 19:47:27 +0000326If the first index is beyond the last item of the List or the second item is
327before the first item, the result is an empty list. There is no error
328message.
329
330If the second index is equal to or greater than the length of the list the
331length minus one is used: >
Bram Moolenaar9e54a0e2006-04-14 20:42:25 +0000332 :let mylist = [0, 1, 2, 3]
333 :echo mylist[2:8] " result: [2, 3]
334
Bram Moolenaara7fc0102005-05-18 22:17:12 +0000335NOTE: mylist[s:e] means using the variable "s:e" as index. Watch out for
Bram Moolenaar58b85342016-08-14 19:54:54 +0200336using a single letter variable before the ":". Insert a space when needed:
Bram Moolenaara7fc0102005-05-18 22:17:12 +0000337mylist[s : e].
338
Bram Moolenaard7ee7ce2005-01-03 21:02:03 +0000339
Bram Moolenaar13065c42005-01-08 16:08:21 +0000340List identity ~
Bram Moolenaard8b02732005-01-14 21:48:43 +0000341 *list-identity*
Bram Moolenaar13065c42005-01-08 16:08:21 +0000342When variable "aa" is a list and you assign it to another variable "bb", both
343variables refer to the same list. Thus changing the list "aa" will also
344change "bb": >
345 :let aa = [1, 2, 3]
346 :let bb = aa
347 :call add(aa, 4)
348 :echo bb
Bram Moolenaar3a3a7232005-01-17 22:16:15 +0000349< [1, 2, 3, 4]
Bram Moolenaar13065c42005-01-08 16:08:21 +0000350
351Making a copy of a list is done with the |copy()| function. Using [:] also
352works, as explained above. This creates a shallow copy of the list: Changing
Bram Moolenaar9588a0f2005-01-08 21:45:39 +0000353a list item in the list will also change the item in the copied list: >
Bram Moolenaar13065c42005-01-08 16:08:21 +0000354 :let aa = [[1, 'a'], 2, 3]
355 :let bb = copy(aa)
Bram Moolenaar3a3a7232005-01-17 22:16:15 +0000356 :call add(aa, 4)
Bram Moolenaar13065c42005-01-08 16:08:21 +0000357 :let aa[0][1] = 'aaa'
358 :echo aa
Bram Moolenaar3a3a7232005-01-17 22:16:15 +0000359< [[1, aaa], 2, 3, 4] >
Bram Moolenaar13065c42005-01-08 16:08:21 +0000360 :echo bb
Bram Moolenaar3a3a7232005-01-17 22:16:15 +0000361< [[1, aaa], 2, 3]
Bram Moolenaar13065c42005-01-08 16:08:21 +0000362
Bram Moolenaar9588a0f2005-01-08 21:45:39 +0000363To make a completely independent list use |deepcopy()|. This also makes a
Bram Moolenaar3a3a7232005-01-17 22:16:15 +0000364copy of the values in the list, recursively. Up to a hundred levels deep.
Bram Moolenaar13065c42005-01-08 16:08:21 +0000365
366The operator "is" can be used to check if two variables refer to the same
Bram Moolenaar3a3a7232005-01-17 22:16:15 +0000367List. "isnot" does the opposite. In contrast "==" compares if two lists have
Bram Moolenaar9588a0f2005-01-08 21:45:39 +0000368the same value. >
369 :let alist = [1, 2, 3]
370 :let blist = [1, 2, 3]
371 :echo alist is blist
Bram Moolenaar3a3a7232005-01-17 22:16:15 +0000372< 0 >
Bram Moolenaar9588a0f2005-01-08 21:45:39 +0000373 :echo alist == blist
Bram Moolenaar3a3a7232005-01-17 22:16:15 +0000374< 1
Bram Moolenaar13065c42005-01-08 16:08:21 +0000375
Bram Moolenaar9ba0eb82005-06-13 22:28:56 +0000376Note about comparing lists: Two lists are considered equal if they have the
377same length and all items compare equal, as with using "==". There is one
Bram Moolenaar7d1f5db2005-07-03 21:39:27 +0000378exception: When comparing a number with a string they are considered
379different. There is no automatic type conversion, as with using "==" on
380variables. Example: >
381 echo 4 == "4"
Bram Moolenaar9ba0eb82005-06-13 22:28:56 +0000382< 1 >
Bram Moolenaar7d1f5db2005-07-03 21:39:27 +0000383 echo [4] == ["4"]
Bram Moolenaar9ba0eb82005-06-13 22:28:56 +0000384< 0
385
Bram Moolenaar7d1f5db2005-07-03 21:39:27 +0000386Thus comparing Lists is more strict than comparing numbers and strings. You
Bram Moolenaar446cb832008-06-24 21:56:24 +0000387can compare simple values this way too by putting them in a list: >
Bram Moolenaar7d1f5db2005-07-03 21:39:27 +0000388
389 :let a = 5
390 :let b = "5"
Bram Moolenaar446cb832008-06-24 21:56:24 +0000391 :echo a == b
Bram Moolenaar7d1f5db2005-07-03 21:39:27 +0000392< 1 >
Bram Moolenaar446cb832008-06-24 21:56:24 +0000393 :echo [a] == [b]
Bram Moolenaar7d1f5db2005-07-03 21:39:27 +0000394< 0
Bram Moolenaar9ba0eb82005-06-13 22:28:56 +0000395
Bram Moolenaar13065c42005-01-08 16:08:21 +0000396
397List unpack ~
398
399To unpack the items in a list to individual variables, put the variables in
400square brackets, like list items: >
401 :let [var1, var2] = mylist
402
403When the number of variables does not match the number of items in the list
404this produces an error. To handle any extra items from the list append ";"
405and a variable name: >
406 :let [var1, var2; rest] = mylist
407
408This works like: >
409 :let var1 = mylist[0]
410 :let var2 = mylist[1]
Bram Moolenaar5f2bb9f2005-01-11 21:29:04 +0000411 :let rest = mylist[2:]
Bram Moolenaar13065c42005-01-08 16:08:21 +0000412
413Except that there is no error if there are only two items. "rest" will be an
414empty list then.
415
416
417List modification ~
418 *list-modification*
Bram Moolenaar9588a0f2005-01-08 21:45:39 +0000419To change a specific item of a list use |:let| this way: >
Bram Moolenaar13065c42005-01-08 16:08:21 +0000420 :let list[4] = "four"
421 :let listlist[0][3] = item
422
Bram Moolenaar9588a0f2005-01-08 21:45:39 +0000423To change part of a list you can specify the first and last item to be
Bram Moolenaar3a3a7232005-01-17 22:16:15 +0000424modified. The value must at least have the number of items in the range: >
Bram Moolenaar9588a0f2005-01-08 21:45:39 +0000425 :let list[3:5] = [3, 4, 5]
426
Bram Moolenaar13065c42005-01-08 16:08:21 +0000427Adding and removing items from a list is done with functions. Here are a few
428examples: >
429 :call insert(list, 'a') " prepend item 'a'
430 :call insert(list, 'a', 3) " insert item 'a' before list[3]
431 :call add(list, "new") " append String item
Bram Moolenaar3a3a7232005-01-17 22:16:15 +0000432 :call add(list, [1, 2]) " append a List as one new item
Bram Moolenaar13065c42005-01-08 16:08:21 +0000433 :call extend(list, [1, 2]) " extend the list with two more items
434 :let i = remove(list, 3) " remove item 3
Bram Moolenaar9cd15162005-01-16 22:02:49 +0000435 :unlet list[3] " idem
Bram Moolenaar13065c42005-01-08 16:08:21 +0000436 :let l = remove(list, 3, -1) " remove items 3 to last item
Bram Moolenaar9cd15162005-01-16 22:02:49 +0000437 :unlet list[3 : ] " idem
Bram Moolenaar3a3a7232005-01-17 22:16:15 +0000438 :call filter(list, 'v:val !~ "x"') " remove items with an 'x'
Bram Moolenaar13065c42005-01-08 16:08:21 +0000439
Bram Moolenaar3a3a7232005-01-17 22:16:15 +0000440Changing the order of items in a list: >
Bram Moolenaar9588a0f2005-01-08 21:45:39 +0000441 :call sort(list) " sort a list alphabetically
442 :call reverse(list) " reverse the order of items
Bram Moolenaar327aa022014-03-25 18:24:23 +0100443 :call uniq(sort(list)) " sort and remove duplicates
Bram Moolenaar9588a0f2005-01-08 21:45:39 +0000444
Bram Moolenaar13065c42005-01-08 16:08:21 +0000445
446For loop ~
447
Bram Moolenaar74e54fc2021-03-26 20:41:29 +0100448The |:for| loop executes commands for each item in a List, String or Blob.
449A variable is set to each item in sequence. Example with a List: >
Bram Moolenaar3a3a7232005-01-17 22:16:15 +0000450 :for item in mylist
451 : call Doit(item)
Bram Moolenaar13065c42005-01-08 16:08:21 +0000452 :endfor
453
454This works like: >
455 :let index = 0
456 :while index < len(mylist)
Bram Moolenaar3a3a7232005-01-17 22:16:15 +0000457 : let item = mylist[index]
458 : :call Doit(item)
Bram Moolenaar13065c42005-01-08 16:08:21 +0000459 : let index = index + 1
460 :endwhile
461
Bram Moolenaar5f2bb9f2005-01-11 21:29:04 +0000462If all you want to do is modify each item in the list then the |map()|
Bram Moolenaar3a3a7232005-01-17 22:16:15 +0000463function will be a simpler method than a for loop.
Bram Moolenaar5f2bb9f2005-01-11 21:29:04 +0000464
Bram Moolenaar58b85342016-08-14 19:54:54 +0200465Just like the |:let| command, |:for| also accepts a list of variables. This
Bram Moolenaar74e54fc2021-03-26 20:41:29 +0100466requires the argument to be a List of Lists. >
Bram Moolenaar13065c42005-01-08 16:08:21 +0000467 :for [lnum, col] in [[1, 3], [2, 8], [3, 0]]
468 : call Doit(lnum, col)
469 :endfor
470
471This works like a |:let| command is done for each list item. Again, the types
472must remain the same to avoid an error.
473
Bram Moolenaar3a3a7232005-01-17 22:16:15 +0000474It is also possible to put remaining items in a List variable: >
Bram Moolenaar13065c42005-01-08 16:08:21 +0000475 :for [i, j; rest] in listlist
476 : call Doit(i, j)
477 : if !empty(rest)
Bram Moolenaarc51cf032022-02-26 12:25:45 +0000478 : echo "remainder: " .. string(rest)
Bram Moolenaar13065c42005-01-08 16:08:21 +0000479 : endif
480 :endfor
481
Bram Moolenaar74e54fc2021-03-26 20:41:29 +0100482For a Blob one byte at a time is used.
483
484For a String one character, including any composing characters, is used as a
485String. Example: >
486 for c in text
487 echo 'This character is ' .. c
488 endfor
489
Bram Moolenaar13065c42005-01-08 16:08:21 +0000490
491List functions ~
Bram Moolenaar3a3a7232005-01-17 22:16:15 +0000492 *E714*
Bram Moolenaar13065c42005-01-08 16:08:21 +0000493Functions that are useful with a List: >
Bram Moolenaar9588a0f2005-01-08 21:45:39 +0000494 :let r = call(funcname, list) " call a function with an argument list
Bram Moolenaar13065c42005-01-08 16:08:21 +0000495 :if empty(list) " check if list is empty
Bram Moolenaar2fda12f2005-01-15 22:14:15 +0000496 :let l = len(list) " number of items in list
497 :let big = max(list) " maximum value in list
498 :let small = min(list) " minimum value in list
Bram Moolenaar9588a0f2005-01-08 21:45:39 +0000499 :let xs = count(list, 'x') " count nr of times 'x' appears in list
500 :let i = index(list, 'x') " index of first 'x' in list
Bram Moolenaar13065c42005-01-08 16:08:21 +0000501 :let lines = getline(1, 10) " get ten text lines from buffer
502 :call append('$', lines) " append text lines in buffer
Bram Moolenaar5f2bb9f2005-01-11 21:29:04 +0000503 :let list = split("a b c") " create list from items in a string
504 :let string = join(list, ', ') " create string from list items
Bram Moolenaar2fda12f2005-01-15 22:14:15 +0000505 :let s = string(list) " String representation of list
Bram Moolenaarc51cf032022-02-26 12:25:45 +0000506 :call map(list, '">> " .. v:val') " prepend ">> " to each item
Bram Moolenaar13065c42005-01-08 16:08:21 +0000507
Bram Moolenaar0cb032e2005-04-23 20:52:00 +0000508Don't forget that a combination of features can make things simple. For
509example, to add up all the numbers in a list: >
Bram Moolenaarc51cf032022-02-26 12:25:45 +0000510 :exe 'let sum = ' .. join(nrlist, '+')
Bram Moolenaar0cb032e2005-04-23 20:52:00 +0000511
Bram Moolenaar13065c42005-01-08 16:08:21 +0000512
Bram Moolenaard8b02732005-01-14 21:48:43 +00005131.4 Dictionaries ~
Bram Moolenaard8968242019-01-15 22:51:57 +0100514 *dict* *Dict* *Dictionaries* *Dictionary*
Bram Moolenaard8b02732005-01-14 21:48:43 +0000515A Dictionary is an associative array: Each entry has a key and a value. The
Bram Moolenaar3a3a7232005-01-17 22:16:15 +0000516entry can be located with the key. The entries are stored without a specific
517ordering.
Bram Moolenaard8b02732005-01-14 21:48:43 +0000518
519
520Dictionary creation ~
Bram Moolenaar3a3a7232005-01-17 22:16:15 +0000521 *E720* *E721* *E722* *E723*
Bram Moolenaarcbaff5e2022-04-08 17:45:08 +0100522A Dictionary is created with a comma-separated list of entries in curly
Bram Moolenaar3a3a7232005-01-17 22:16:15 +0000523braces. Each entry has a key and a value, separated by a colon. Each key can
524only appear once. Examples: >
Bram Moolenaard8b02732005-01-14 21:48:43 +0000525 :let mydict = {1: 'one', 2: 'two', 3: 'three'}
526 :let emptydict = {}
Bram Moolenaar3a3a7232005-01-17 22:16:15 +0000527< *E713* *E716* *E717*
Bram Moolenaard8b02732005-01-14 21:48:43 +0000528A key is always a String. You can use a Number, it will be converted to a
529String automatically. Thus the String '4' and the number 4 will find the same
Bram Moolenaar58b85342016-08-14 19:54:54 +0200530entry. Note that the String '04' and the Number 04 are different, since the
Bram Moolenaard899e512022-05-07 21:54:03 +0100531Number will be converted to the String '4', leading zeros are dropped. The
532empty string can also be used as a key.
Bram Moolenaar5da36052021-12-27 15:39:57 +0000533
Bram Moolenaard799daa2022-06-20 11:17:32 +0100534In |Vim9| script a literal key can be used if it consists only of alphanumeric
Bram Moolenaar5da36052021-12-27 15:39:57 +0000535characters, underscore and dash, see |vim9-literal-dict|.
Bram Moolenaar56c860c2019-08-17 20:09:31 +0200536 *literal-Dict* *#{}*
Bram Moolenaar5da36052021-12-27 15:39:57 +0000537To avoid having to put quotes around every key the #{} form can be used in
538legacy script. This does require the key to consist only of ASCII letters,
539digits, '-' and '_'. Example: >
Bram Moolenaar10455d42019-11-21 15:36:18 +0100540 :let mydict = #{zero: 0, one_key: 1, two-key: 2, 333: 3}
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200541Note that 333 here is the string "333". Empty keys are not possible with #{}.
Bram Moolenaard899e512022-05-07 21:54:03 +0100542In |Vim9| script the #{} form cannot be used because it can be confused with
543the start of a comment.
Bram Moolenaard8b02732005-01-14 21:48:43 +0000544
Bram Moolenaar58b85342016-08-14 19:54:54 +0200545A value can be any expression. Using a Dictionary for a value creates a
Bram Moolenaard8b02732005-01-14 21:48:43 +0000546nested Dictionary: >
547 :let nestdict = {1: {11: 'a', 12: 'b'}, 2: {21: 'c'}}
548
549An extra comma after the last entry is ignored.
550
551
552Accessing entries ~
553
554The normal way to access an entry is by putting the key in square brackets: >
555 :let val = mydict["one"]
556 :let mydict["four"] = 4
557
Bram Moolenaar3a3a7232005-01-17 22:16:15 +0000558You can add new entries to an existing Dictionary this way, unlike Lists.
Bram Moolenaard8b02732005-01-14 21:48:43 +0000559
560For keys that consist entirely of letters, digits and underscore the following
561form can be used |expr-entry|: >
562 :let val = mydict.one
563 :let mydict.four = 4
564
565Since an entry can be any type, also a List and a Dictionary, the indexing and
566key lookup can be repeated: >
Bram Moolenaar3a3a7232005-01-17 22:16:15 +0000567 :echo dict.key[idx].key
Bram Moolenaard8b02732005-01-14 21:48:43 +0000568
569
570Dictionary to List conversion ~
571
Bram Moolenaar58b85342016-08-14 19:54:54 +0200572You may want to loop over the entries in a dictionary. For this you need to
Bram Moolenaard8b02732005-01-14 21:48:43 +0000573turn the Dictionary into a List and pass it to |:for|.
574
575Most often you want to loop over the keys, using the |keys()| function: >
576 :for key in keys(mydict)
Bram Moolenaarc51cf032022-02-26 12:25:45 +0000577 : echo key .. ': ' .. mydict[key]
Bram Moolenaard8b02732005-01-14 21:48:43 +0000578 :endfor
579
580The List of keys is unsorted. You may want to sort them first: >
581 :for key in sort(keys(mydict))
582
583To loop over the values use the |values()| function: >
584 :for v in values(mydict)
Bram Moolenaarc51cf032022-02-26 12:25:45 +0000585 : echo "value: " .. v
Bram Moolenaard8b02732005-01-14 21:48:43 +0000586 :endfor
587
588If you want both the key and the value use the |items()| function. It returns
Bram Moolenaard47d5222018-12-09 20:43:55 +0100589a List in which each item is a List with two items, the key and the value: >
Bram Moolenaaref2f6562007-05-06 13:32:59 +0000590 :for [key, value] in items(mydict)
Bram Moolenaarc51cf032022-02-26 12:25:45 +0000591 : echo key .. ': ' .. value
Bram Moolenaard8b02732005-01-14 21:48:43 +0000592 :endfor
593
594
595Dictionary identity ~
Bram Moolenaar7c626922005-02-07 22:01:03 +0000596 *dict-identity*
Bram Moolenaard8b02732005-01-14 21:48:43 +0000597Just like Lists you need to use |copy()| and |deepcopy()| to make a copy of a
598Dictionary. Otherwise, assignment results in referring to the same
599Dictionary: >
600 :let onedict = {'a': 1, 'b': 2}
601 :let adict = onedict
602 :let adict['a'] = 11
603 :echo onedict['a']
604 11
605
Bram Moolenaarf3bd51a2005-06-14 22:11:18 +0000606Two Dictionaries compare equal if all the key-value pairs compare equal. For
607more info see |list-identity|.
Bram Moolenaard8b02732005-01-14 21:48:43 +0000608
609
610Dictionary modification ~
611 *dict-modification*
612To change an already existing entry of a Dictionary, or to add a new entry,
613use |:let| this way: >
614 :let dict[4] = "four"
615 :let dict['one'] = item
616
Bram Moolenaar9cd15162005-01-16 22:02:49 +0000617Removing an entry from a Dictionary is done with |remove()| or |:unlet|.
618Three ways to remove the entry with key "aaa" from dict: >
619 :let i = remove(dict, 'aaa')
620 :unlet dict.aaa
621 :unlet dict['aaa']
Bram Moolenaard8b02732005-01-14 21:48:43 +0000622
623Merging a Dictionary with another is done with |extend()|: >
Bram Moolenaar3a3a7232005-01-17 22:16:15 +0000624 :call extend(adict, bdict)
625This extends adict with all entries from bdict. Duplicate keys cause entries
626in adict to be overwritten. An optional third argument can change this.
Bram Moolenaar383f9bc2005-01-19 22:18:32 +0000627Note that the order of entries in a Dictionary is irrelevant, thus don't
628expect ":echo adict" to show the items from bdict after the older entries in
629adict.
Bram Moolenaard8b02732005-01-14 21:48:43 +0000630
631Weeding out entries from a Dictionary can be done with |filter()|: >
Bram Moolenaaref2f6562007-05-06 13:32:59 +0000632 :call filter(dict, 'v:val =~ "x"')
Bram Moolenaar3a3a7232005-01-17 22:16:15 +0000633This removes all entries from "dict" with a value not matching 'x'.
Bram Moolenaar388a5d42020-05-26 21:20:45 +0200634This can also be used to remove all entries: >
635 call filter(dict, 0)
Bram Moolenaar2fda12f2005-01-15 22:14:15 +0000636
637
638Dictionary function ~
Bram Moolenaar26402cb2013-02-20 21:26:00 +0100639 *Dictionary-function* *self* *E725* *E862*
Bram Moolenaar2fda12f2005-01-15 22:14:15 +0000640When a function is defined with the "dict" attribute it can be used in a
Bram Moolenaar58b85342016-08-14 19:54:54 +0200641special way with a dictionary. Example: >
Bram Moolenaar2fda12f2005-01-15 22:14:15 +0000642 :function Mylen() dict
Bram Moolenaar3a3a7232005-01-17 22:16:15 +0000643 : return len(self.data)
Bram Moolenaar2fda12f2005-01-15 22:14:15 +0000644 :endfunction
Bram Moolenaar3a3a7232005-01-17 22:16:15 +0000645 :let mydict = {'data': [0, 1, 2, 3], 'len': function("Mylen")}
646 :echo mydict.len()
Bram Moolenaar2fda12f2005-01-15 22:14:15 +0000647
648This is like a method in object oriented programming. The entry in the
649Dictionary is a |Funcref|. The local variable "self" refers to the dictionary
650the function was invoked from.
651
Bram Moolenaar3a3a7232005-01-17 22:16:15 +0000652It is also possible to add a function without the "dict" attribute as a
653Funcref to a Dictionary, but the "self" variable is not available then.
654
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000655 *numbered-function* *anonymous-function*
Bram Moolenaar2fda12f2005-01-15 22:14:15 +0000656To avoid the extra name for the function it can be defined and directly
657assigned to a Dictionary in this way: >
Bram Moolenaar3a3a7232005-01-17 22:16:15 +0000658 :let mydict = {'data': [0, 1, 2, 3]}
Bram Moolenaar5a5f4592015-04-13 12:43:06 +0200659 :function mydict.len()
Bram Moolenaar3a3a7232005-01-17 22:16:15 +0000660 : return len(self.data)
Bram Moolenaar2fda12f2005-01-15 22:14:15 +0000661 :endfunction
Bram Moolenaar3a3a7232005-01-17 22:16:15 +0000662 :echo mydict.len()
Bram Moolenaar2fda12f2005-01-15 22:14:15 +0000663
Bram Moolenaar3a3a7232005-01-17 22:16:15 +0000664The function will then get a number and the value of dict.len is a |Funcref|
Bram Moolenaar58b85342016-08-14 19:54:54 +0200665that references this function. The function can only be used through a
Bram Moolenaar3a3a7232005-01-17 22:16:15 +0000666|Funcref|. It will automatically be deleted when there is no |Funcref|
667remaining that refers to it.
668
669It is not necessary to use the "dict" attribute for a numbered function.
Bram Moolenaar2fda12f2005-01-15 22:14:15 +0000670
Bram Moolenaar1affd722010-08-04 17:49:30 +0200671If you get an error for a numbered function, you can find out what it is with
672a trick. Assuming the function is 42, the command is: >
Bram Moolenaar34cc7d82021-09-21 20:09:51 +0200673 :function g:42
Bram Moolenaar1affd722010-08-04 17:49:30 +0200674
Bram Moolenaar2fda12f2005-01-15 22:14:15 +0000675
676Functions for Dictionaries ~
Bram Moolenaar3a3a7232005-01-17 22:16:15 +0000677 *E715*
678Functions that can be used with a Dictionary: >
Bram Moolenaar2fda12f2005-01-15 22:14:15 +0000679 :if has_key(dict, 'foo') " TRUE if dict has entry with key "foo"
680 :if empty(dict) " TRUE if dict is empty
681 :let l = len(dict) " number of items in dict
682 :let big = max(dict) " maximum value in dict
683 :let small = min(dict) " minimum value in dict
684 :let xs = count(dict, 'x') " count nr of times 'x' appears in dict
685 :let s = string(dict) " String representation of dict
Bram Moolenaarc51cf032022-02-26 12:25:45 +0000686 :call map(dict, '">> " .. v:val') " prepend ">> " to each item
Bram Moolenaard8b02732005-01-14 21:48:43 +0000687
688
Bram Moolenaard8968242019-01-15 22:51:57 +01006891.5 Blobs ~
690 *blob* *Blob* *Blobs* *E978*
Bram Moolenaaraff74912019-03-30 18:11:49 +0100691A Blob is a binary object. It can be used to read an image from a file and
692send it over a channel, for example.
693
694A Blob mostly behaves like a |List| of numbers, where each number has the
695value of an 8-bit byte, from 0 to 255.
Bram Moolenaard8968242019-01-15 22:51:57 +0100696
697
698Blob creation ~
699
700A Blob can be created with a |blob-literal|: >
701 :let b = 0zFF00ED015DAF
Bram Moolenaar0d17f0d2019-01-22 22:20:38 +0100702Dots can be inserted between bytes (pair of hex characters) for readability,
703they don't change the value: >
704 :let b = 0zFF00.ED01.5DAF
Bram Moolenaard8968242019-01-15 22:51:57 +0100705
706A blob can be read from a file with |readfile()| passing the {type} argument
707set to "B", for example: >
708 :let b = readfile('image.png', 'B')
709
710A blob can be read from a channel with the |ch_readblob()| function.
711
712
713Blob index ~
714 *blob-index* *E979*
715A byte in the Blob can be accessed by putting the index in square brackets
716after the Blob. Indexes are zero-based, thus the first byte has index zero. >
717 :let myblob = 0z00112233
718 :let byte = myblob[0] " get the first byte: 0x00
719 :let byte = myblob[2] " get the third byte: 0x22
720
721A negative index is counted from the end. Index -1 refers to the last byte in
722the Blob, -2 to the last but one byte, etc. >
723 :let last = myblob[-1] " get the last byte: 0x33
724
725To avoid an error for an invalid index use the |get()| function. When an item
726is not available it returns -1 or the default value you specify: >
727 :echo get(myblob, idx)
728 :echo get(myblob, idx, 999)
729
730
Bram Moolenaar5e66b422019-01-24 21:58:10 +0100731Blob iteration ~
732
733The |:for| loop executes commands for each byte of a Blob. The loop variable is
734set to each byte in the Blob. Example: >
735 :for byte in 0z112233
736 : call Doit(byte)
737 :endfor
738This calls Doit() with 0x11, 0x22 and 0x33.
739
740
Bram Moolenaard8968242019-01-15 22:51:57 +0100741Blob concatenation ~
742
743Two blobs can be concatenated with the "+" operator: >
744 :let longblob = myblob + 0z4455
745 :let myblob += 0z6677
746
747To change a blob in-place see |blob-modification| below.
748
749
750Part of a blob ~
751
752A part of the Blob can be obtained by specifying the first and last index,
753separated by a colon in square brackets: >
754 :let myblob = 0z00112233
Bram Moolenaard09091d2019-01-17 16:07:22 +0100755 :let shortblob = myblob[1:2] " get 0z1122
Bram Moolenaard8968242019-01-15 22:51:57 +0100756 :let shortblob = myblob[2:-1] " get 0z2233
757
758Omitting the first index is similar to zero. Omitting the last index is
759similar to -1. >
760 :let endblob = myblob[2:] " from item 2 to the end: 0z2233
761 :let shortblob = myblob[2:2] " Blob with one byte: 0z22
762 :let otherblob = myblob[:] " make a copy of the Blob
763
Bram Moolenaard09091d2019-01-17 16:07:22 +0100764If the first index is beyond the last byte of the Blob or the second index is
Bram Moolenaaraa5df7e2019-02-03 14:53:10 +0100765before the first index, the result is an empty Blob. There is no error
Bram Moolenaard8968242019-01-15 22:51:57 +0100766message.
767
768If the second index is equal to or greater than the length of the list the
769length minus one is used: >
770 :echo myblob[2:8] " result: 0z2233
771
772
773Blob modification ~
Bram Moolenaara2baa732022-02-04 16:09:54 +0000774 *blob-modification* *E1182* *E1184*
Bram Moolenaard8968242019-01-15 22:51:57 +0100775To change a specific byte of a blob use |:let| this way: >
776 :let blob[4] = 0x44
777
778When the index is just one beyond the end of the Blob, it is appended. Any
779higher index is an error.
780
781To change a sequence of bytes the [:] notation can be used: >
782 let blob[1:3] = 0z445566
Bram Moolenaard09091d2019-01-17 16:07:22 +0100783The length of the replaced bytes must be exactly the same as the value
Bram Moolenaard8968242019-01-15 22:51:57 +0100784provided. *E972*
785
786To change part of a blob you can specify the first and last byte to be
Bram Moolenaard09091d2019-01-17 16:07:22 +0100787modified. The value must have the same number of bytes in the range: >
788 :let blob[3:5] = 0z334455
Bram Moolenaard8968242019-01-15 22:51:57 +0100789
790You can also use the functions |add()|, |remove()| and |insert()|.
791
792
793Blob identity ~
794
795Blobs can be compared for equality: >
796 if blob == 0z001122
797And for equal identity: >
798 if blob is otherblob
799< *blob-identity* *E977*
800When variable "aa" is a Blob and you assign it to another variable "bb", both
801variables refer to the same Blob. Then the "is" operator returns true.
802
803When making a copy using [:] or |copy()| the values are the same, but the
804identity is different: >
805 :let blob = 0z112233
806 :let blob2 = blob
807 :echo blob == blob2
808< 1 >
809 :echo blob is blob2
810< 1 >
811 :let blob3 = blob[:]
812 :echo blob == blob3
813< 1 >
814 :echo blob is blob3
815< 0
816
Bram Moolenaard09091d2019-01-17 16:07:22 +0100817Making a copy of a Blob is done with the |copy()| function. Using [:] also
Bram Moolenaard8968242019-01-15 22:51:57 +0100818works, as explained above.
819
820
8211.6 More about variables ~
Bram Moolenaar13065c42005-01-08 16:08:21 +0000822 *more-variables*
Bram Moolenaar071d4272004-06-13 20:20:40 +0000823If you need to know the type of a variable or expression, use the |type()|
824function.
825
826When the '!' flag is included in the 'viminfo' option, global variables that
827start with an uppercase letter, and don't contain a lowercase letter, are
828stored in the viminfo file |viminfo-file|.
829
830When the 'sessionoptions' option contains "global", global variables that
831start with an uppercase letter and contain at least one lowercase letter are
832stored in the session file |session-file|.
833
834variable name can be stored where ~
835my_var_6 not
836My_Var_6 session file
837MY_VAR_6 viminfo file
838
839
Bram Moolenaar5da36052021-12-27 15:39:57 +0000840In legacy script it is possible to form a variable name with curly braces, see
Bram Moolenaar071d4272004-06-13 20:20:40 +0000841|curly-braces-names|.
842
843==============================================================================
8442. Expression syntax *expression-syntax*
Bram Moolenaarf10911e2022-01-29 22:20:48 +0000845 *E1143*
Bram Moolenaar071d4272004-06-13 20:20:40 +0000846Expression syntax summary, from least to most significant:
847
Bram Moolenaar50ba5262016-09-22 22:33:02 +0200848|expr1| expr2
Bram Moolenaar89bcfda2016-08-30 23:26:57 +0200849 expr2 ? expr1 : expr1 if-then-else
Bram Moolenaar071d4272004-06-13 20:20:40 +0000850
Bram Moolenaar89bcfda2016-08-30 23:26:57 +0200851|expr2| expr3
Bram Moolenaar0f248b02019-04-04 15:36:05 +0200852 expr3 || expr3 ... logical OR
Bram Moolenaar071d4272004-06-13 20:20:40 +0000853
Bram Moolenaar89bcfda2016-08-30 23:26:57 +0200854|expr3| expr4
Bram Moolenaar0f248b02019-04-04 15:36:05 +0200855 expr4 && expr4 ... logical AND
Bram Moolenaar071d4272004-06-13 20:20:40 +0000856
Bram Moolenaar89bcfda2016-08-30 23:26:57 +0200857|expr4| expr5
858 expr5 == expr5 equal
Bram Moolenaar071d4272004-06-13 20:20:40 +0000859 expr5 != expr5 not equal
860 expr5 > expr5 greater than
861 expr5 >= expr5 greater than or equal
862 expr5 < expr5 smaller than
863 expr5 <= expr5 smaller than or equal
864 expr5 =~ expr5 regexp matches
865 expr5 !~ expr5 regexp doesn't match
866
867 expr5 ==? expr5 equal, ignoring case
868 expr5 ==# expr5 equal, match case
869 etc. As above, append ? for ignoring case, # for
870 matching case
871
Bram Moolenaar5e66b422019-01-24 21:58:10 +0100872 expr5 is expr5 same |List|, |Dictionary| or |Blob| instance
873 expr5 isnot expr5 different |List|, |Dictionary| or |Blob|
874 instance
Bram Moolenaarde8866b2005-01-06 23:24:37 +0000875
Yegappan Lakshmanana061f342022-05-22 19:13:49 +0100876|expr5| expr6 << expr6 bitwise left shift
877 expr6 >> expr6 bitwise right shift
Bram Moolenaar071d4272004-06-13 20:20:40 +0000878
Bram Moolenaar89bcfda2016-08-30 23:26:57 +0200879|expr6| expr7
Yegappan Lakshmanana061f342022-05-22 19:13:49 +0100880 expr7 + expr7 ... number addition, list or blob concatenation
881 expr7 - expr7 ... number subtraction
882 expr7 . expr7 ... string concatenation
883 expr7 .. expr7 ... string concatenation
Bram Moolenaar071d4272004-06-13 20:20:40 +0000884
Bram Moolenaar89bcfda2016-08-30 23:26:57 +0200885|expr7| expr8
Yegappan Lakshmanana061f342022-05-22 19:13:49 +0100886 expr8 * expr8 ... number multiplication
887 expr8 / expr8 ... number division
888 expr8 % expr8 ... number modulo
Bram Moolenaar071d4272004-06-13 20:20:40 +0000889
Bram Moolenaar89bcfda2016-08-30 23:26:57 +0200890|expr8| expr9
Yegappan Lakshmanana061f342022-05-22 19:13:49 +0100891 <type>expr9 type check and conversion (|Vim9| only)
Bram Moolenaar2fda12f2005-01-15 22:14:15 +0000892
Bram Moolenaar5da36052021-12-27 15:39:57 +0000893|expr9| expr10
Yegappan Lakshmanana061f342022-05-22 19:13:49 +0100894 ! expr9 logical NOT
895 - expr9 unary minus
896 + expr9 unary plus
Bram Moolenaar5da36052021-12-27 15:39:57 +0000897
Yegappan Lakshmanana061f342022-05-22 19:13:49 +0100898|expr10| expr11
899 expr10[expr1] byte of a String or item of a |List|
900 expr10[expr1 : expr1] substring of a String or sublist of a |List|
901 expr10.name entry in a |Dictionary|
902 expr10(expr1, ...) function call with |Funcref| variable
903 expr10->name(expr1, ...) |method| call
904
905|expr11| number number constant
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +0000906 "string" string constant, backslash is special
Bram Moolenaard8b02732005-01-14 21:48:43 +0000907 'string' string constant, ' is doubled
Bram Moolenaar32466aa2006-02-24 23:53:04 +0000908 [expr1, ...] |List|
909 {expr1: expr1, ...} |Dictionary|
Bram Moolenaar5da36052021-12-27 15:39:57 +0000910 #{key: expr1, ...} legacy |Dictionary|
Bram Moolenaar071d4272004-06-13 20:20:40 +0000911 &option option value
912 (expr1) nested expression
913 variable internal variable
914 va{ria}ble internal variable with curly braces
915 $VAR environment variable
916 @r contents of register 'r'
917 function(expr1, ...) function call
918 func{ti}on(expr1, ...) function call with curly braces
Bram Moolenaar5da36052021-12-27 15:39:57 +0000919 {args -> expr1} legacy lambda expression
920 (args) => expr1 Vim9 lambda expression
Bram Moolenaar071d4272004-06-13 20:20:40 +0000921
922
Bram Moolenaar0f248b02019-04-04 15:36:05 +0200923"..." indicates that the operations in this level can be concatenated.
Bram Moolenaar071d4272004-06-13 20:20:40 +0000924Example: >
925 &nu || &list && &shell == "csh"
926
927All expressions within one level are parsed from left to right.
928
Bram Moolenaarf10911e2022-01-29 22:20:48 +0000929Expression nesting is limited to 1000 levels deep (300 when build with MSVC)
930to avoid running out of stack and crashing. *E1169*
931
Bram Moolenaar071d4272004-06-13 20:20:40 +0000932
Bram Moolenaarc51cf032022-02-26 12:25:45 +0000933expr1 *expr1* *ternary* *falsy-operator* *??* *E109*
Bram Moolenaar071d4272004-06-13 20:20:40 +0000934-----
935
Bram Moolenaarc51cf032022-02-26 12:25:45 +0000936The ternary operator: expr2 ? expr1 : expr1
Bram Moolenaar92f26c22020-10-03 20:17:30 +0200937The falsy operator: expr2 ?? expr1
938
Bram Moolenaarc51cf032022-02-26 12:25:45 +0000939Ternary operator ~
Bram Moolenaar071d4272004-06-13 20:20:40 +0000940
Bram Moolenaar5da36052021-12-27 15:39:57 +0000941In legacy script the expression before the '?' is evaluated to a number. If
942it evaluates to |TRUE|, the result is the value of the expression between the
943'?' and ':', otherwise the result is the value of the expression after the
944':'.
945
946In |Vim9| script the first expression must evaluate to a boolean, see
947|vim9-boolean|.
948
Bram Moolenaar071d4272004-06-13 20:20:40 +0000949Example: >
950 :echo lnum == 1 ? "top" : lnum
951
952Since the first expression is an "expr2", it cannot contain another ?:. The
953other two expressions can, thus allow for recursive use of ?:.
954Example: >
955 :echo lnum == 1 ? "top" : lnum == 1000 ? "last" : lnum
956
957To keep this readable, using |line-continuation| is suggested: >
958 :echo lnum == 1
959 :\ ? "top"
960 :\ : lnum == 1000
961 :\ ? "last"
962 :\ : lnum
963
Bram Moolenaaref2f6562007-05-06 13:32:59 +0000964You should always put a space before the ':', otherwise it can be mistaken for
965use in a variable such as "a:1".
966
Bram Moolenaar92f26c22020-10-03 20:17:30 +0200967Falsy operator ~
968
969This is also known as the "null coalescing operator", but that's too
970complicated, thus we just call it the falsy operator.
971
972The expression before the '??' is evaluated. If it evaluates to
973|truthy|, this is used as the result. Otherwise the expression after the '??'
974is evaluated and used as the result. This is most useful to have a default
975value for an expression that may result in zero or empty: >
976 echo theList ?? 'list is empty'
977 echo GetName() ?? 'unknown'
978
979These are similar, but not equal: >
980 expr2 ?? expr1
981 expr2 ? expr2 : expr1
Bram Moolenaar5da36052021-12-27 15:39:57 +0000982In the second line "expr2" is evaluated twice. And in |Vim9| script the type
983of expr2 before "?" must be a boolean.
Bram Moolenaar92f26c22020-10-03 20:17:30 +0200984
Bram Moolenaar071d4272004-06-13 20:20:40 +0000985
986expr2 and expr3 *expr2* *expr3*
987---------------
988
Bram Moolenaar04186092016-08-29 21:55:35 +0200989expr3 || expr3 .. logical OR *expr-barbar*
990expr4 && expr4 .. logical AND *expr-&&*
991
Bram Moolenaar5da36052021-12-27 15:39:57 +0000992The "||" and "&&" operators take one argument on each side.
Bram Moolenaar071d4272004-06-13 20:20:40 +0000993
Bram Moolenaar5da36052021-12-27 15:39:57 +0000994In legacy script the arguments are (converted to) Numbers.
995
996In |Vim9| script the values must be boolean, see |vim9-boolean|. Use "!!" to
997convert any type to a boolean.
998
999The result is:
Bram Moolenaare381d3d2016-07-07 14:50:41 +02001000 input output ~
1001n1 n2 n1 || n2 n1 && n2 ~
1002|FALSE| |FALSE| |FALSE| |FALSE|
1003|FALSE| |TRUE| |TRUE| |FALSE|
1004|TRUE| |FALSE| |TRUE| |FALSE|
1005|TRUE| |TRUE| |TRUE| |TRUE|
Bram Moolenaar071d4272004-06-13 20:20:40 +00001006
1007The operators can be concatenated, for example: >
1008
1009 &nu || &list && &shell == "csh"
1010
1011Note that "&&" takes precedence over "||", so this has the meaning of: >
1012
1013 &nu || (&list && &shell == "csh")
1014
1015Once the result is known, the expression "short-circuits", that is, further
1016arguments are not evaluated. This is like what happens in C. For example: >
1017
1018 let a = 1
1019 echo a || b
1020
Bram Moolenaare381d3d2016-07-07 14:50:41 +02001021This is valid even if there is no variable called "b" because "a" is |TRUE|,
1022so the result must be |TRUE|. Similarly below: >
Bram Moolenaar071d4272004-06-13 20:20:40 +00001023
1024 echo exists("b") && b == "yes"
1025
1026This is valid whether "b" has been defined or not. The second clause will
1027only be evaluated if "b" has been defined.
1028
1029
Bram Moolenaara2baa732022-02-04 16:09:54 +00001030expr4 *expr4* *E1153*
Bram Moolenaar071d4272004-06-13 20:20:40 +00001031-----
1032
1033expr5 {cmp} expr5
1034
Bram Moolenaar5da36052021-12-27 15:39:57 +00001035Compare two expr5 expressions. In legacy script the result is a 0 if it
1036evaluates to false, or 1 if it evaluates to true. In |Vim9| script the result
1037is |true| or |false|.
Bram Moolenaar071d4272004-06-13 20:20:40 +00001038
Bram Moolenaar446cb832008-06-24 21:56:24 +00001039 *expr-==* *expr-!=* *expr->* *expr->=*
Bram Moolenaar071d4272004-06-13 20:20:40 +00001040 *expr-<* *expr-<=* *expr-=~* *expr-!~*
1041 *expr-==#* *expr-!=#* *expr->#* *expr->=#*
1042 *expr-<#* *expr-<=#* *expr-=~#* *expr-!~#*
1043 *expr-==?* *expr-!=?* *expr->?* *expr->=?*
1044 *expr-<?* *expr-<=?* *expr-=~?* *expr-!~?*
Bram Moolenaar251e1912011-06-19 05:09:16 +02001045 *expr-is* *expr-isnot* *expr-is#* *expr-isnot#*
Bram Moolenaar6f4754b2022-01-23 12:07:04 +00001046 *expr-is?* *expr-isnot?* *E1072*
Bram Moolenaar071d4272004-06-13 20:20:40 +00001047 use 'ignorecase' match case ignore case ~
1048equal == ==# ==?
1049not equal != !=# !=?
1050greater than > ># >?
1051greater than or equal >= >=# >=?
1052smaller than < <# <?
1053smaller than or equal <= <=# <=?
1054regexp matches =~ =~# =~?
1055regexp doesn't match !~ !~# !~?
Bram Moolenaar251e1912011-06-19 05:09:16 +02001056same instance is is# is?
1057different instance isnot isnot# isnot?
Bram Moolenaar071d4272004-06-13 20:20:40 +00001058
1059Examples:
1060"abc" ==# "Abc" evaluates to 0
1061"abc" ==? "Abc" evaluates to 1
1062"abc" == "Abc" evaluates to 1 if 'ignorecase' is set, 0 otherwise
Bram Moolenaar5da36052021-12-27 15:39:57 +00001063NOTE: In |Vim9| script 'ignorecase' is not used.
Bram Moolenaar071d4272004-06-13 20:20:40 +00001064
Bram Moolenaar13065c42005-01-08 16:08:21 +00001065 *E691* *E692*
Bram Moolenaar01164a62017-11-02 22:58:42 +01001066A |List| can only be compared with a |List| and only "equal", "not equal",
1067"is" and "isnot" can be used. This compares the values of the list,
1068recursively. Ignoring case means case is ignored when comparing item values.
Bram Moolenaarde8866b2005-01-06 23:24:37 +00001069
Bram Moolenaar3a3a7232005-01-17 22:16:15 +00001070 *E735* *E736*
Bram Moolenaar32466aa2006-02-24 23:53:04 +00001071A |Dictionary| can only be compared with a |Dictionary| and only "equal", "not
Bram Moolenaar01164a62017-11-02 22:58:42 +01001072equal", "is" and "isnot" can be used. This compares the key/values of the
1073|Dictionary| recursively. Ignoring case means case is ignored when comparing
1074item values.
Bram Moolenaar3a3a7232005-01-17 22:16:15 +00001075
Bram Moolenaaraa3b15d2016-04-21 08:53:19 +02001076 *E694*
Bram Moolenaare18dbe82016-07-02 21:42:23 +02001077A |Funcref| can only be compared with a |Funcref| and only "equal", "not
1078equal", "is" and "isnot" can be used. Case is never ignored. Whether
1079arguments or a Dictionary are bound (with a partial) matters. The
1080Dictionaries must also be equal (or the same, in case of "is") and the
1081arguments must be equal (or the same).
1082
1083To compare Funcrefs to see if they refer to the same function, ignoring bound
1084Dictionary and arguments, use |get()| to get the function name: >
1085 if get(Part1, 'name') == get(Part2, 'name')
1086 " Part1 and Part2 refer to the same function
Bram Moolenaar6f4754b2022-01-23 12:07:04 +00001087< *E1037*
Bram Moolenaar5e66b422019-01-24 21:58:10 +01001088Using "is" or "isnot" with a |List|, |Dictionary| or |Blob| checks whether
1089the expressions are referring to the same |List|, |Dictionary| or |Blob|
1090instance. A copy of a |List| is different from the original |List|. When
1091using "is" without a |List|, |Dictionary| or |Blob|, it is equivalent to
1092using "equal", using "isnot" equivalent to using "not equal". Except that
1093a different type means the values are different: >
Bram Moolenaar86edef62016-03-13 18:07:30 +01001094 echo 4 == '4'
1095 1
1096 echo 4 is '4'
1097 0
1098 echo 0 is []
1099 0
1100"is#"/"isnot#" and "is?"/"isnot?" can be used to match and ignore case.
Bram Moolenaare1f3fd12022-08-15 18:51:32 +01001101In |Vim9| script this doesn't work, two strings are never identical.
Bram Moolenaarde8866b2005-01-06 23:24:37 +00001102
Bram Moolenaar5da36052021-12-27 15:39:57 +00001103In legacy script, when comparing a String with a Number, the String is
1104converted to a Number, and the comparison is done on Numbers. This means
1105that: >
Bram Moolenaar86edef62016-03-13 18:07:30 +01001106 echo 0 == 'x'
1107 1
1108because 'x' converted to a Number is zero. However: >
1109 echo [0] == ['x']
1110 0
1111Inside a List or Dictionary this conversion is not used.
Bram Moolenaar071d4272004-06-13 20:20:40 +00001112
Bram Moolenaar5da36052021-12-27 15:39:57 +00001113In |Vim9| script the types must match.
1114
Bram Moolenaar071d4272004-06-13 20:20:40 +00001115When comparing two Strings, this is done with strcmp() or stricmp(). This
1116results in the mathematical difference (comparing byte values), not
1117necessarily the alphabetical difference in the local language.
1118
Bram Moolenaar446cb832008-06-24 21:56:24 +00001119When using the operators with a trailing '#', or the short version and
Bram Moolenaaref2f6562007-05-06 13:32:59 +00001120'ignorecase' is off, the comparing is done with strcmp(): case matters.
Bram Moolenaar071d4272004-06-13 20:20:40 +00001121
1122When using the operators with a trailing '?', or the short version and
Bram Moolenaaref2f6562007-05-06 13:32:59 +00001123'ignorecase' is set, the comparing is done with stricmp(): case is ignored.
1124
1125'smartcase' is not used.
Bram Moolenaar071d4272004-06-13 20:20:40 +00001126
1127The "=~" and "!~" operators match the lefthand argument with the righthand
1128argument, which is used as a pattern. See |pattern| for what a pattern is.
1129This matching is always done like 'magic' was set and 'cpoptions' is empty, no
1130matter what the actual value of 'magic' or 'cpoptions' is. This makes scripts
1131portable. To avoid backslashes in the regexp pattern to be doubled, use a
1132single-quote string, see |literal-string|.
1133Since a string is considered to be a single line, a multi-line pattern
1134(containing \n, backslash-n) will not match. However, a literal NL character
1135can be matched like an ordinary character. Examples:
1136 "foo\nbar" =~ "\n" evaluates to 1
1137 "foo\nbar" =~ "\\n" evaluates to 0
1138
1139
Yegappan Lakshmanana061f342022-05-22 19:13:49 +01001140expr5 *expr5* *bitwise-shift*
1141-----
1142expr6 << expr6 bitwise left shift *expr-<<*
1143expr6 >> expr6 bitwise right shift *expr->>*
1144 *E1282* *E1283*
1145The "<<" and ">>" operators can be used to perform bitwise left or right shift
1146of the left operand by the number of bits specified by the right operand. The
Bram Moolenaar338bf582022-05-22 20:16:32 +01001147operands are used as positive numbers. When shifting right with ">>" the
Bram Moolenaard592deb2022-06-17 15:42:40 +01001148topmost bit (sometimes called the sign bit) is cleared. If the right operand
Bram Moolenaar338bf582022-05-22 20:16:32 +01001149(shift amount) is more than the maximum number of bits in a number
1150(|v:numbersize|) the result is zero.
Bram Moolenaar071d4272004-06-13 20:20:40 +00001151
Yegappan Lakshmanana061f342022-05-22 19:13:49 +01001152
1153expr6 and expr7 *expr6* *expr7* *E1036* *E1051*
1154---------------
1155expr7 + expr7 Number addition, |List| or |Blob| concatenation *expr-+*
1156expr7 - expr7 Number subtraction *expr--*
1157expr7 . expr7 String concatenation *expr-.*
1158expr7 .. expr7 String concatenation *expr-..*
1159
1160For |Lists| only "+" is possible and then both expr7 must be a list. The
Bram Moolenaar32466aa2006-02-24 23:53:04 +00001161result is a new list with the two lists Concatenated.
Bram Moolenaarde8866b2005-01-06 23:24:37 +00001162
Bram Moolenaar0f248b02019-04-04 15:36:05 +02001163For String concatenation ".." is preferred, since "." is ambiguous, it is also
1164used for |Dict| member access and floating point numbers.
Bram Moolenaar5da36052021-12-27 15:39:57 +00001165In |Vim9| script and when |vimscript-version| is 2 or higher, using "." is not
1166allowed.
1167
1168In |Vim9| script the arguments of ".." are converted to String for simple
1169types: Number, Float, Special and Bool. For other types |string()| should be
1170used.
Bram Moolenaar0f248b02019-04-04 15:36:05 +02001171
Yegappan Lakshmanana061f342022-05-22 19:13:49 +01001172expr8 * expr8 Number multiplication *expr-star*
1173expr8 / expr8 Number division *expr-/*
1174expr8 % expr8 Number modulo *expr-%*
Bram Moolenaar071d4272004-06-13 20:20:40 +00001175
Bram Moolenaar5da36052021-12-27 15:39:57 +00001176In legacy script, for all operators except "." and "..", Strings are converted
1177to Numbers.
1178
Bram Moolenaard6e256c2011-12-14 15:32:50 +01001179For bitwise operators see |and()|, |or()| and |xor()|.
Bram Moolenaar071d4272004-06-13 20:20:40 +00001180
Bram Moolenaar5da36052021-12-27 15:39:57 +00001181Note the difference between "+" and ".." in legacy script:
Bram Moolenaar071d4272004-06-13 20:20:40 +00001182 "123" + "456" = 579
Bram Moolenaar5da36052021-12-27 15:39:57 +00001183 "123" .. "456" = "123456"
Bram Moolenaar071d4272004-06-13 20:20:40 +00001184
Bram Moolenaar5da36052021-12-27 15:39:57 +00001185Since '..' has the same precedence as '+' and '-', you need to read: >
1186 1 .. 90 + 90.0
Bram Moolenaar446cb832008-06-24 21:56:24 +00001187As: >
Bram Moolenaar5da36052021-12-27 15:39:57 +00001188 (1 .. 90) + 90.0
1189That works in legacy script, since the String "190" is automatically converted
1190to the Number 190, which can be added to the Float 90.0. However: >
1191 1 .. 90 * 90.0
Bram Moolenaar446cb832008-06-24 21:56:24 +00001192Should be read as: >
Bram Moolenaar5da36052021-12-27 15:39:57 +00001193 1 .. (90 * 90.0)
1194Since '..' has lower precedence than '*'. This does NOT work, since this
Bram Moolenaar446cb832008-06-24 21:56:24 +00001195attempts to concatenate a Float and a String.
1196
1197When dividing a Number by zero the result depends on the value:
1198 0 / 0 = -0x80000000 (like NaN for Float)
1199 >0 / 0 = 0x7fffffff (like positive infinity)
1200 <0 / 0 = -0x7fffffff (like negative infinity)
1201 (before Vim 7.2 it was always 0x7fffffff)
Bram Moolenaara2baa732022-02-04 16:09:54 +00001202In |Vim9| script dividing a number by zero is an error. *E1154*
Bram Moolenaar446cb832008-06-24 21:56:24 +00001203
Bram Moolenaar22fcfad2016-07-01 18:17:26 +02001204When 64-bit Number support is enabled:
1205 0 / 0 = -0x8000000000000000 (like NaN for Float)
1206 >0 / 0 = 0x7fffffffffffffff (like positive infinity)
1207 <0 / 0 = -0x7fffffffffffffff (like negative infinity)
1208
Bram Moolenaar071d4272004-06-13 20:20:40 +00001209When the righthand side of '%' is zero, the result is 0.
1210
Bram Moolenaar32466aa2006-02-24 23:53:04 +00001211None of these work for |Funcref|s.
Bram Moolenaarde8866b2005-01-06 23:24:37 +00001212
Bram Moolenaar6f4754b2022-01-23 12:07:04 +00001213".", ".." and "%" do not work for Float. *E804* *E1035*
Bram Moolenaar446cb832008-06-24 21:56:24 +00001214
Bram Moolenaar071d4272004-06-13 20:20:40 +00001215
Yegappan Lakshmanana061f342022-05-22 19:13:49 +01001216expr8 *expr8*
Bram Moolenaar071d4272004-06-13 20:20:40 +00001217-----
Yegappan Lakshmanana061f342022-05-22 19:13:49 +01001218<type>expr9
Bram Moolenaar5da36052021-12-27 15:39:57 +00001219
1220This is only available in |Vim9| script, see |type-casting|.
1221
1222
Yegappan Lakshmanana061f342022-05-22 19:13:49 +01001223expr9 *expr9*
Bram Moolenaar5da36052021-12-27 15:39:57 +00001224-----
Yegappan Lakshmanana061f342022-05-22 19:13:49 +01001225! expr9 logical NOT *expr-!*
1226- expr9 unary minus *expr-unary--*
1227+ expr9 unary plus *expr-unary-+*
Bram Moolenaar071d4272004-06-13 20:20:40 +00001228
Bram Moolenaare381d3d2016-07-07 14:50:41 +02001229For '!' |TRUE| becomes |FALSE|, |FALSE| becomes |TRUE| (one).
Bram Moolenaar071d4272004-06-13 20:20:40 +00001230For '-' the sign of the number is changed.
Bram Moolenaar6f02b002021-01-10 20:22:54 +01001231For '+' the number is unchanged. Note: "++" has no effect.
Bram Moolenaar071d4272004-06-13 20:20:40 +00001232
Bram Moolenaar5da36052021-12-27 15:39:57 +00001233In legacy script a String will be converted to a Number first. Note that if
1234the string does not start with a digit you likely don't get what you expect.
1235
1236In |Vim9| script an error is given when "-" or "+" is used and the type is not
1237a number.
1238
1239In |Vim9| script "!" can be used for any type and the result is always a
1240boolean. Use "!!" to convert any type to a boolean, according to whether the
1241value is |falsy|.
Bram Moolenaar071d4272004-06-13 20:20:40 +00001242
Bram Moolenaar58b85342016-08-14 19:54:54 +02001243These three can be repeated and mixed. Examples:
Bram Moolenaar071d4272004-06-13 20:20:40 +00001244 !-1 == 0
1245 !!8 == 1
1246 --9 == 9
1247
1248
Yegappan Lakshmanana061f342022-05-22 19:13:49 +01001249expr10 *expr10*
1250------
1251This expression is either |expr11| or a sequence of the alternatives below,
Bram Moolenaarfc65cab2018-08-28 22:58:02 +02001252in any order. E.g., these are all possible:
Yegappan Lakshmanana061f342022-05-22 19:13:49 +01001253 expr10[expr1].name
1254 expr10.name[expr1]
1255 expr10(expr1, ...)[expr1].name
1256 expr10->(expr1, ...)[expr1]
Bram Moolenaarac92e252019-08-03 21:58:38 +02001257Evaluation is always from left to right.
Bram Moolenaarfc65cab2018-08-28 22:58:02 +02001258
Yegappan Lakshmanana061f342022-05-22 19:13:49 +01001259expr10[expr1] item of String or |List| *expr-[]* *E111*
Bram Moolenaar6f4754b2022-01-23 12:07:04 +00001260 *E909* *subscript* *E1062*
Bram Moolenaare3c37d82020-08-15 18:39:05 +02001261In legacy Vim script:
Yegappan Lakshmanana061f342022-05-22 19:13:49 +01001262If expr10 is a Number or String this results in a String that contains the
1263expr1'th single byte from expr10. expr10 is used as a String (a number is
Bram Moolenaare3c37d82020-08-15 18:39:05 +02001264automatically converted to a String), expr1 as a Number. This doesn't
Bram Moolenaar207f0092020-08-30 17:20:20 +02001265recognize multibyte encodings, see `byteidx()` for an alternative, or use
Bram Moolenaare3c37d82020-08-15 18:39:05 +02001266`split()` to turn the string into a list of characters. Example, to get the
1267byte under the cursor: >
Bram Moolenaar61660ea2006-04-07 21:40:07 +00001268 :let c = getline(".")[col(".") - 1]
Bram Moolenaar071d4272004-06-13 20:20:40 +00001269
Bram Moolenaara2baa732022-02-04 16:09:54 +00001270In |Vim9| script: *E1147* *E1148*
Yegappan Lakshmanana061f342022-05-22 19:13:49 +01001271If expr10 is a String this results in a String that contains the expr1'th
1272single character (including any composing characters) from expr10. To use byte
Bram Moolenaar02b4d9b2021-03-14 19:46:45 +01001273indexes use |strpart()|.
Bram Moolenaare3c37d82020-08-15 18:39:05 +02001274
1275Index zero gives the first byte or character. Careful: text column numbers
1276start with one!
1277
Bram Moolenaar071d4272004-06-13 20:20:40 +00001278If the length of the String is less than the index, the result is an empty
Bram Moolenaar85084ef2016-01-17 22:26:33 +01001279String. A negative index always results in an empty string (reason: backward
Bram Moolenaare3c37d82020-08-15 18:39:05 +02001280compatibility). Use [-1:] to get the last byte or character.
Bram Moolenaar6f02b002021-01-10 20:22:54 +01001281In Vim9 script a negative index is used like with a list: count from the end.
Bram Moolenaard7ee7ce2005-01-03 21:02:03 +00001282
Yegappan Lakshmanana061f342022-05-22 19:13:49 +01001283If expr10 is a |List| then it results the item at index expr1. See |list-index|
Bram Moolenaard7ee7ce2005-01-03 21:02:03 +00001284for possible index values. If the index is out of range this results in an
Bram Moolenaar58b85342016-08-14 19:54:54 +02001285error. Example: >
Bram Moolenaard7ee7ce2005-01-03 21:02:03 +00001286 :let item = mylist[-1] " get last item
1287
Bram Moolenaar32466aa2006-02-24 23:53:04 +00001288Generally, if a |List| index is equal to or higher than the length of the
1289|List|, or more negative than the length of the |List|, this results in an
1290error.
Bram Moolenaard7ee7ce2005-01-03 21:02:03 +00001291
Bram Moolenaard8b02732005-01-14 21:48:43 +00001292
Bram Moolenaar8a3b8052022-06-26 12:21:15 +01001293expr10[expr1a : expr1b] substring or |sublist| *expr-[:]* *substring*
Bram Moolenaard7ee7ce2005-01-03 21:02:03 +00001294
Yegappan Lakshmanana061f342022-05-22 19:13:49 +01001295If expr10 is a String this results in the substring with the bytes or
1296characters from expr1a to and including expr1b. expr10 is used as a String,
Bram Moolenaar207f0092020-08-30 17:20:20 +02001297expr1a and expr1b are used as a Number.
Bram Moolenaare3c37d82020-08-15 18:39:05 +02001298
1299In legacy Vim script the indexes are byte indexes. This doesn't recognize
Yegappan Lakshmanana061f342022-05-22 19:13:49 +01001300multibyte encodings, see |byteidx()| for computing the indexes. If expr10 is
Bram Moolenaare3c37d82020-08-15 18:39:05 +02001301a Number it is first converted to a String.
1302
Bram Moolenaar02b4d9b2021-03-14 19:46:45 +01001303In Vim9 script the indexes are character indexes and include composing
1304characters. To use byte indexes use |strpart()|. To use character indexes
1305without including composing characters use |strcharpart()|.
Bram Moolenaard7ee7ce2005-01-03 21:02:03 +00001306
Bram Moolenaar6601b622021-01-13 21:47:15 +01001307The item at index expr1b is included, it is inclusive. For an exclusive index
1308use the |slice()| function.
1309
Bram Moolenaard7ee7ce2005-01-03 21:02:03 +00001310If expr1a is omitted zero is used. If expr1b is omitted the length of the
1311string minus one is used.
1312
1313A negative number can be used to measure from the end of the string. -1 is
1314the last character, -2 the last but one, etc.
1315
1316If an index goes out of range for the string characters are omitted. If
1317expr1b is smaller than expr1a the result is an empty string.
1318
1319Examples: >
1320 :let c = name[-1:] " last byte of a string
Bram Moolenaar207f0092020-08-30 17:20:20 +02001321 :let c = name[0:-1] " the whole string
Bram Moolenaard7ee7ce2005-01-03 21:02:03 +00001322 :let c = name[-2:-2] " last but one byte of a string
1323 :let s = line(".")[4:] " from the fifth byte to the end
1324 :let s = s[:-3] " remove last two bytes
Bram Moolenaar8f3f58f2010-01-06 20:52:26 +01001325<
Bram Moolenaarbc8801c2016-08-02 21:04:33 +02001326 *slice*
Yegappan Lakshmanana061f342022-05-22 19:13:49 +01001327If expr10 is a |List| this results in a new |List| with the items indicated by
Bram Moolenaar58b85342016-08-14 19:54:54 +02001328the indexes expr1a and expr1b. This works like with a String, as explained
Bram Moolenaarbc8801c2016-08-02 21:04:33 +02001329just above. Also see |sublist| below. Examples: >
Bram Moolenaard7ee7ce2005-01-03 21:02:03 +00001330 :let l = mylist[:3] " first four items
1331 :let l = mylist[4:4] " List with one item
1332 :let l = mylist[:] " shallow copy of a List
1333
Yegappan Lakshmanana061f342022-05-22 19:13:49 +01001334If expr10 is a |Blob| this results in a new |Blob| with the bytes in the
Bram Moolenaar6e5ea8d2019-01-12 22:47:31 +01001335indexes expr1a and expr1b, inclusive. Examples: >
1336 :let b = 0zDEADBEEF
1337 :let bs = b[1:2] " 0zADBE
Bram Moolenaard09091d2019-01-17 16:07:22 +01001338 :let bs = b[:] " copy of 0zDEADBEEF
Bram Moolenaar6e5ea8d2019-01-12 22:47:31 +01001339
Yegappan Lakshmanana061f342022-05-22 19:13:49 +01001340Using expr10[expr1] or expr10[expr1a : expr1b] on a |Funcref| results in an
Bram Moolenaar32466aa2006-02-24 23:53:04 +00001341error.
Bram Moolenaar071d4272004-06-13 20:20:40 +00001342
Bram Moolenaarda440d22016-01-16 21:27:23 +01001343Watch out for confusion between a namespace and a variable followed by a colon
1344for a sublist: >
1345 mylist[n:] " uses variable n
1346 mylist[s:] " uses namespace s:, error!
1347
Bram Moolenaard8b02732005-01-14 21:48:43 +00001348
Yegappan Lakshmanana061f342022-05-22 19:13:49 +01001349expr10.name entry in a |Dictionary| *expr-entry*
Bram Moolenaara2baa732022-02-04 16:09:54 +00001350 *E1203* *E1229*
Yegappan Lakshmanana061f342022-05-22 19:13:49 +01001351If expr10 is a |Dictionary| and it is followed by a dot, then the following
Bram Moolenaar32466aa2006-02-24 23:53:04 +00001352name will be used as a key in the |Dictionary|. This is just like:
Yegappan Lakshmanana061f342022-05-22 19:13:49 +01001353expr10[name].
Bram Moolenaard8b02732005-01-14 21:48:43 +00001354
1355The name must consist of alphanumeric characters, just like a variable name,
1356but it may start with a number. Curly braces cannot be used.
1357
1358There must not be white space before or after the dot.
1359
1360Examples: >
1361 :let dict = {"one": 1, 2: "two"}
Bram Moolenaar68e65602019-05-26 21:33:31 +02001362 :echo dict.one " shows "1"
1363 :echo dict.2 " shows "two"
1364 :echo dict .2 " error because of space before the dot
Bram Moolenaard8b02732005-01-14 21:48:43 +00001365
1366Note that the dot is also used for String concatenation. To avoid confusion
1367always put spaces around the dot for String concatenation.
1368
1369
Yegappan Lakshmanana061f342022-05-22 19:13:49 +01001370expr10(expr1, ...) |Funcref| function call *E1085*
Bram Moolenaar2fda12f2005-01-15 22:14:15 +00001371
Yegappan Lakshmanana061f342022-05-22 19:13:49 +01001372When expr10 is a |Funcref| type variable, invoke the function it refers to.
Bram Moolenaar2fda12f2005-01-15 22:14:15 +00001373
1374
Yegappan Lakshmanana061f342022-05-22 19:13:49 +01001375expr10->name([args]) method call *method* *->*
1376expr10->{lambda}([args])
Bram Moolenaara2baa732022-02-04 16:09:54 +00001377 *E260* *E276* *E1265*
Bram Moolenaar25e42232019-08-04 15:04:10 +02001378For methods that are also available as global functions this is the same as: >
Yegappan Lakshmanana061f342022-05-22 19:13:49 +01001379 name(expr10 [, args])
1380There can also be methods specifically for the type of "expr10".
Bram Moolenaar2fda12f2005-01-15 22:14:15 +00001381
Bram Moolenaar51841322019-08-08 21:10:01 +02001382This allows for chaining, passing the value that one method returns to the
1383next method: >
Bram Moolenaar25e42232019-08-04 15:04:10 +02001384 mylist->filter(filterexpr)->map(mapexpr)->sort()->join()
1385<
Bram Moolenaar22a0c0c2019-08-09 23:25:08 +02001386Example of using a lambda: >
Bram Moolenaar02b31112019-08-31 22:16:38 +02001387 GetPercentage()->{x -> x * 100}()->printf('%d%%')
Bram Moolenaar56c860c2019-08-17 20:09:31 +02001388<
Yegappan Lakshmanana061f342022-05-22 19:13:49 +01001389When using -> the |expr9| operators will be applied first, thus: >
Bram Moolenaar93cf85f2019-08-17 21:36:28 +02001390 -1.234->string()
1391Is equivalent to: >
1392 (-1.234)->string()
1393And NOT: >
1394 -(1.234->string())
Bram Moolenaar6f4754b2022-01-23 12:07:04 +00001395
1396What comes after "->" can be a name, a simple expression (not containing any
Bram Moolenaar944697a2022-02-20 19:48:20 +00001397parenthesis), or any expression in parentheses: >
Bram Moolenaar6f4754b2022-01-23 12:07:04 +00001398 base->name(args)
1399 base->some.name(args)
1400 base->alist[idx](args)
1401 base->(getFuncRef())(args)
1402Note that in the last call the base is passed to the function resulting from
Bram Moolenaar2ecbe532022-07-29 21:36:21 +01001403"(getFuncRef())", inserted before "args". *E1275*
Bram Moolenaar6f4754b2022-01-23 12:07:04 +00001404
Bram Moolenaar51841322019-08-08 21:10:01 +02001405 *E274*
1406"->name(" must not contain white space. There can be white space before the
1407"->" and after the "(", thus you can split the lines like this: >
1408 mylist
1409 \ ->filter(filterexpr)
1410 \ ->map(mapexpr)
1411 \ ->sort()
1412 \ ->join()
Bram Moolenaar56c860c2019-08-17 20:09:31 +02001413
1414When using the lambda form there must be no white space between the } and the
1415(.
1416
Bram Moolenaar25e42232019-08-04 15:04:10 +02001417
Yegappan Lakshmanana061f342022-05-22 19:13:49 +01001418 *expr11*
Bram Moolenaar071d4272004-06-13 20:20:40 +00001419number
1420------
Bram Moolenaarb0d45e72017-11-05 18:19:24 +01001421number number constant *expr-number*
Bram Moolenaar071d4272004-06-13 20:20:40 +00001422
Bram Moolenaar6f02b002021-01-10 20:22:54 +01001423 *0x* *hex-number* *0o* *octal-number* *binary-number*
Bram Moolenaar7571d552016-08-18 22:54:46 +02001424Decimal, Hexadecimal (starting with 0x or 0X), Binary (starting with 0b or 0B)
Bram Moolenaarc17e66c2020-06-02 21:38:22 +02001425and Octal (starting with 0, 0o or 0O).
Bram Moolenaar071d4272004-06-13 20:20:40 +00001426
Bram Moolenaar338bf582022-05-22 20:16:32 +01001427Assuming 64 bit numbers are used (see |v:numbersize|) an unsigned number is
1428truncated to 0x7fffffffffffffff or 9223372036854775807. You can use -1 to get
14290xffffffffffffffff.
1430
Bram Moolenaar446cb832008-06-24 21:56:24 +00001431 *floating-point-format*
1432Floating point numbers can be written in two forms:
1433
1434 [-+]{N}.{M}
Bram Moolenaar8a94d872015-01-25 13:02:57 +01001435 [-+]{N}.{M}[eE][-+]{exp}
Bram Moolenaar446cb832008-06-24 21:56:24 +00001436
1437{N} and {M} are numbers. Both {N} and {M} must be present and can only
Bram Moolenaar6aa57292021-08-14 21:25:52 +02001438contain digits, except that in |Vim9| script in {N} single quotes between
1439digits are ignored.
Bram Moolenaar446cb832008-06-24 21:56:24 +00001440[-+] means there is an optional plus or minus sign.
1441{exp} is the exponent, power of 10.
Bram Moolenaar58b85342016-08-14 19:54:54 +02001442Only a decimal point is accepted, not a comma. No matter what the current
Bram Moolenaar446cb832008-06-24 21:56:24 +00001443locale is.
1444{only when compiled with the |+float| feature}
1445
1446Examples:
1447 123.456
1448 +0.0001
1449 55.0
1450 -0.123
1451 1.234e03
1452 1.0E-6
1453 -3.1416e+88
1454
1455These are INVALID:
1456 3. empty {M}
1457 1e40 missing .{M}
1458
1459Rationale:
1460Before floating point was introduced, the text "123.456" was interpreted as
1461the two numbers "123" and "456", both converted to a string and concatenated,
1462resulting in the string "123456". Since this was considered pointless, and we
Bram Moolenaare37d50a2008-08-06 17:06:04 +00001463could not find it intentionally being used in Vim scripts, this backwards
Bram Moolenaar446cb832008-06-24 21:56:24 +00001464incompatibility was accepted in favor of being able to use the normal notation
1465for floating point numbers.
1466
Bram Moolenaard47d5222018-12-09 20:43:55 +01001467 *float-pi* *float-e*
1468A few useful values to copy&paste: >
1469 :let pi = 3.14159265359
1470 :let e = 2.71828182846
1471Or, if you don't want to write them in as floating-point literals, you can
1472also use functions, like the following: >
1473 :let pi = acos(-1.0)
1474 :let e = exp(1.0)
Bram Moolenaar98aefe72018-12-13 22:20:09 +01001475<
Bram Moolenaar446cb832008-06-24 21:56:24 +00001476 *floating-point-precision*
1477The precision and range of floating points numbers depends on what "double"
1478means in the library Vim was compiled with. There is no way to change this at
1479runtime.
1480
1481The default for displaying a |Float| is to use 6 decimal places, like using
1482printf("%g", f). You can select something else when using the |printf()|
1483function. Example: >
1484 :echo printf('%.15e', atan(1))
1485< 7.853981633974483e-01
1486
1487
Bram Moolenaar071d4272004-06-13 20:20:40 +00001488
Bram Moolenaar979243b2015-06-26 19:35:49 +02001489string *string* *String* *expr-string* *E114*
Bram Moolenaar071d4272004-06-13 20:20:40 +00001490------
1491"string" string constant *expr-quote*
1492
1493Note that double quotes are used.
1494
1495A string constant accepts these special characters:
1496\... three-digit octal number (e.g., "\316")
1497\.. two-digit octal number (must be followed by non-digit)
1498\. one-digit octal number (must be followed by non-digit)
1499\x.. byte specified with two hex numbers (e.g., "\x1f")
1500\x. byte specified with one hex number (must be followed by non-hex char)
1501\X.. same as \x..
1502\X. same as \x.
Bram Moolenaar446cb832008-06-24 21:56:24 +00001503\u.... character specified with up to 4 hex numbers, stored according to the
Bram Moolenaar071d4272004-06-13 20:20:40 +00001504 current value of 'encoding' (e.g., "\u02a4")
Bram Moolenaar541f92d2015-06-19 13:27:23 +02001505\U.... same as \u but allows up to 8 hex numbers.
Bram Moolenaar071d4272004-06-13 20:20:40 +00001506\b backspace <BS>
1507\e escape <Esc>
Bram Moolenaar6e649222021-10-04 21:32:54 +01001508\f formfeed 0x0C
Bram Moolenaar071d4272004-06-13 20:20:40 +00001509\n newline <NL>
1510\r return <CR>
1511\t tab <Tab>
1512\\ backslash
1513\" double quote
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001514\<xxx> Special key named "xxx". e.g. "\<C-W>" for CTRL-W. This is for use
Bram Moolenaar58b85342016-08-14 19:54:54 +02001515 in mappings, the 0x80 byte is escaped.
1516 To use the double quote character it must be escaped: "<M-\">".
Bram Moolenaar6e649222021-10-04 21:32:54 +01001517 Don't use <Char-xxxx> to get a UTF-8 character, use \uxxxx as
Bram Moolenaar58b85342016-08-14 19:54:54 +02001518 mentioned above.
Bram Moolenaarfccd93f2020-05-31 22:06:51 +02001519\<*xxx> Like \<xxx> but prepends a modifier instead of including it in the
1520 character. E.g. "\<C-w>" is one character 0x17 while "\<*C-w>" is four
Bram Moolenaarebe9d342020-05-30 21:52:54 +02001521 bytes: 3 for the CTRL modifier and then character "W".
Bram Moolenaar071d4272004-06-13 20:20:40 +00001522
Bram Moolenaaref2f6562007-05-06 13:32:59 +00001523Note that "\xff" is stored as the byte 255, which may be invalid in some
1524encodings. Use "\u00ff" to store character 255 according to the current value
1525of 'encoding'.
1526
Bram Moolenaar071d4272004-06-13 20:20:40 +00001527Note that "\000" and "\x00" force the end of the string.
1528
1529
Bram Moolenaard8968242019-01-15 22:51:57 +01001530blob-literal *blob-literal* *E973*
Bram Moolenaar6e5ea8d2019-01-12 22:47:31 +01001531------------
1532
1533Hexadecimal starting with 0z or 0Z, with an arbitrary number of bytes.
1534The sequence must be an even number of hex characters. Example: >
1535 :let b = 0zFF00ED015DAF
1536
1537
Bram Moolenaar071d4272004-06-13 20:20:40 +00001538literal-string *literal-string* *E115*
1539---------------
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00001540'string' string constant *expr-'*
Bram Moolenaar071d4272004-06-13 20:20:40 +00001541
1542Note that single quotes are used.
1543
Bram Moolenaar58b85342016-08-14 19:54:54 +02001544This string is taken as it is. No backslashes are removed or have a special
Bram Moolenaard8b02732005-01-14 21:48:43 +00001545meaning. The only exception is that two quotes stand for one quote.
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00001546
1547Single quoted strings are useful for patterns, so that backslashes do not need
Bram Moolenaar58b85342016-08-14 19:54:54 +02001548to be doubled. These two commands are equivalent: >
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00001549 if a =~ "\\s*"
1550 if a =~ '\s*'
Bram Moolenaar071d4272004-06-13 20:20:40 +00001551
1552
Bram Moolenaar05a80612022-08-01 15:09:53 +01001553interpolated-string *$quote* *interp-string*
LemonBoy2eaef102022-05-06 13:14:50 +01001554--------------------
1555$"string" interpolated string constant *expr-$quote*
1556$'string' interpolated literal string constant *expr-$'*
1557
1558Interpolated strings are an extension of the |string| and |literal-string|,
1559allowing the inclusion of Vim script expressions (see |expr1|). Any
1560expression returning a value can be enclosed between curly braces. The value
1561is converted to a string. All the text and results of the expressions
1562are concatenated to make a new string.
Bram Moolenaar2ecbe532022-07-29 21:36:21 +01001563 *E1278* *E1279*
LemonBoy2eaef102022-05-06 13:14:50 +01001564To include an opening brace '{' or closing brace '}' in the string content
Bram Moolenaar3f32a5f2022-05-12 20:34:15 +01001565double it. For double quoted strings using a backslash also works. A single
1566closing brace '}' will result in an error.
LemonBoy2eaef102022-05-06 13:14:50 +01001567
1568Examples: >
1569 let your_name = input("What's your name? ")
Bram Moolenaar3f32a5f2022-05-12 20:34:15 +01001570< What's your name? Peter ~
1571>
1572 echo
LemonBoy2eaef102022-05-06 13:14:50 +01001573 echo $"Hello, {your_name}!"
Bram Moolenaar3f32a5f2022-05-12 20:34:15 +01001574< Hello, Peter! ~
1575>
1576 echo $"The square root of {{9}} is {sqrt(9)}"
1577< The square root of {9} is 3.0 ~
1578
LemonBoy2eaef102022-05-06 13:14:50 +01001579
Bram Moolenaar071d4272004-06-13 20:20:40 +00001580option *expr-option* *E112* *E113*
1581------
1582&option option value, local value if possible
1583&g:option global option value
1584&l:option local option value
1585
1586Examples: >
Bram Moolenaarc51cf032022-02-26 12:25:45 +00001587 echo "tabstop is " .. &tabstop
Bram Moolenaar071d4272004-06-13 20:20:40 +00001588 if &insertmode
1589
1590Any option name can be used here. See |options|. When using the local value
1591and there is no buffer-local or window-local value, the global value is used
1592anyway.
1593
1594
Bram Moolenaaref2f6562007-05-06 13:32:59 +00001595register *expr-register* *@r*
Bram Moolenaar071d4272004-06-13 20:20:40 +00001596--------
1597@r contents of register 'r'
1598
1599The result is the contents of the named register, as a single string.
1600Newlines are inserted where required. To get the contents of the unnamed
Bram Moolenaar58b85342016-08-14 19:54:54 +02001601register use @" or @@. See |registers| for an explanation of the available
Bram Moolenaare7566042005-06-17 22:00:15 +00001602registers.
1603
1604When using the '=' register you get the expression itself, not what it
1605evaluates to. Use |eval()| to evaluate it.
Bram Moolenaar071d4272004-06-13 20:20:40 +00001606
1607
Bram Moolenaara2baa732022-02-04 16:09:54 +00001608nesting *expr-nesting* *E110*
Bram Moolenaar071d4272004-06-13 20:20:40 +00001609-------
1610(expr1) nested expression
1611
1612
1613environment variable *expr-env*
1614--------------------
1615$VAR environment variable
1616
1617The String value of any environment variable. When it is not defined, the
1618result is an empty string.
Bram Moolenaar691ddee2019-05-09 14:52:41 +02001619
1620The functions `getenv()` and `setenv()` can also be used and work for
1621environment variables with non-alphanumeric names.
1622The function `environ()` can be used to get a Dict with all environment
1623variables.
1624
1625
Bram Moolenaar071d4272004-06-13 20:20:40 +00001626 *expr-env-expand*
1627Note that there is a difference between using $VAR directly and using
1628expand("$VAR"). Using it directly will only expand environment variables that
1629are known inside the current Vim session. Using expand() will first try using
1630the environment variables known inside the current Vim session. If that
1631fails, a shell will be used to expand the variable. This can be slow, but it
1632does expand all variables that the shell knows about. Example: >
Bram Moolenaar34401cc2014-08-29 15:12:19 +02001633 :echo $shell
1634 :echo expand("$shell")
1635The first one probably doesn't echo anything, the second echoes the $shell
Bram Moolenaar071d4272004-06-13 20:20:40 +00001636variable (if your shell supports it).
1637
1638
Bram Moolenaarf10911e2022-01-29 22:20:48 +00001639internal variable *expr-variable* *E1015* *E1089*
Bram Moolenaar071d4272004-06-13 20:20:40 +00001640-----------------
1641variable internal variable
1642See below |internal-variables|.
1643
1644
Bram Moolenaar05159a02005-02-26 23:04:13 +00001645function call *expr-function* *E116* *E118* *E119* *E120*
Bram Moolenaar071d4272004-06-13 20:20:40 +00001646-------------
1647function(expr1, ...) function call
1648See below |functions|.
1649
1650
Bram Moolenaar069c1e72016-07-15 21:25:08 +02001651lambda expression *expr-lambda* *lambda*
1652-----------------
Bram Moolenaar2f0936c2022-01-08 21:51:59 +00001653{args -> expr1} legacy lambda expression *E451*
Bram Moolenaar5da36052021-12-27 15:39:57 +00001654(args) => expr1 |Vim9| lambda expression
Bram Moolenaar069c1e72016-07-15 21:25:08 +02001655
1656A lambda expression creates a new unnamed function which returns the result of
Bram Moolenaar42ebd062016-07-17 13:35:14 +02001657evaluating |expr1|. Lambda expressions differ from |user-functions| in
Bram Moolenaar069c1e72016-07-15 21:25:08 +02001658the following ways:
1659
16601. The body of the lambda expression is an |expr1| and not a sequence of |Ex|
1661 commands.
Bram Moolenaar1e96d9b2016-07-29 22:15:09 +020016622. The prefix "a:" should not be used for arguments. E.g.: >
Bram Moolenaar069c1e72016-07-15 21:25:08 +02001663 :let F = {arg1, arg2 -> arg1 - arg2}
1664 :echo F(5, 2)
1665< 3
1666
1667The arguments are optional. Example: >
1668 :let F = {-> 'error function'}
Bram Moolenaar130cbfc2021-04-07 21:07:20 +02001669 :echo F('ignored')
Bram Moolenaar069c1e72016-07-15 21:25:08 +02001670< error function
Bram Moolenaar130cbfc2021-04-07 21:07:20 +02001671
Bram Moolenaar5da36052021-12-27 15:39:57 +00001672The |Vim9| lambda does not only use a different syntax, it also adds type
1673checking and can be split over multiple lines, see |vim9-lambda|.
Bram Moolenaar130cbfc2021-04-07 21:07:20 +02001674
Bram Moolenaar1e96d9b2016-07-29 22:15:09 +02001675 *closure*
1676Lambda expressions can access outer scope variables and arguments. This is
Bram Moolenaar50ba5262016-09-22 22:33:02 +02001677often called a closure. Example where "i" and "a:arg" are used in a lambda
Bram Moolenaar6bb2cdf2018-02-24 19:53:53 +01001678while they already exist in the function scope. They remain valid even after
1679the function returns: >
Bram Moolenaar1e96d9b2016-07-29 22:15:09 +02001680 :function Foo(arg)
1681 : let i = 3
1682 : return {x -> x + i - a:arg}
1683 :endfunction
1684 :let Bar = Foo(4)
1685 :echo Bar(6)
1686< 5
Bram Moolenaar437bafe2016-08-01 15:40:54 +02001687
Bram Moolenaar388a5d42020-05-26 21:20:45 +02001688Note that the variables must exist in the outer scope before the lambda is
Bram Moolenaar6bb2cdf2018-02-24 19:53:53 +01001689defined for this to work. See also |:func-closure|.
1690
1691Lambda and closure support can be checked with: >
Bram Moolenaar437bafe2016-08-01 15:40:54 +02001692 if has('lambda')
Bram Moolenaar069c1e72016-07-15 21:25:08 +02001693
1694Examples for using a lambda expression with |sort()|, |map()| and |filter()|: >
1695 :echo map([1, 2, 3], {idx, val -> val + 1})
1696< [2, 3, 4] >
1697 :echo sort([3,7,2,1,4], {a, b -> a - b})
1698< [1, 2, 3, 4, 7]
1699
1700The lambda expression is also useful for Channel, Job and timer: >
1701 :let timer = timer_start(500,
1702 \ {-> execute("echo 'Handler called'", "")},
1703 \ {'repeat': 3})
1704< Handler called
1705 Handler called
1706 Handler called
1707
Bram Moolenaar90df4b92021-07-07 20:26:08 +02001708Note that it is possible to cause memory to be used and not freed if the
1709closure is referenced by the context it depends on: >
1710 function Function()
1711 let x = 0
1712 let F = {-> x}
1713 endfunction
1714The closure uses "x" from the function scope, and "F" in that same scope
1715refers to the closure. This cycle results in the memory not being freed.
1716Recommendation: don't do this.
1717
1718Notice how execute() is used to execute an Ex command. That's ugly though.
Bram Moolenaar130cbfc2021-04-07 21:07:20 +02001719In Vim9 script you can use a command block, see |inline-function|.
Bram Moolenaar1e96d9b2016-07-29 22:15:09 +02001720
1721Lambda expressions have internal names like '<lambda>42'. If you get an error
1722for a lambda expression, you can find what it is with the following command: >
Bram Moolenaar6f02b002021-01-10 20:22:54 +01001723 :function <lambda>42
Bram Moolenaar1e96d9b2016-07-29 22:15:09 +02001724See also: |numbered-function|
1725
Bram Moolenaar071d4272004-06-13 20:20:40 +00001726==============================================================================
Bram Moolenaar6f4754b2022-01-23 12:07:04 +000017273. Internal variable *internal-variables* *E461* *E1001*
Bram Moolenaar4a748032010-09-30 21:47:56 +02001728
Bram Moolenaar071d4272004-06-13 20:20:40 +00001729An internal variable name can be made up of letters, digits and '_'. But it
Bram Moolenaar2f0936c2022-01-08 21:51:59 +00001730cannot start with a digit. In legacy script it is also possible to use curly
Bram Moolenaar5da36052021-12-27 15:39:57 +00001731braces, see |curly-braces-names|.
Bram Moolenaar071d4272004-06-13 20:20:40 +00001732
Bram Moolenaar2f0936c2022-01-08 21:51:59 +00001733In legacy script an internal variable is created with the ":let" command
Bram Moolenaar5da36052021-12-27 15:39:57 +00001734|:let|. An internal variable is explicitly destroyed with the ":unlet"
1735command |:unlet|.
Bram Moolenaar9588a0f2005-01-08 21:45:39 +00001736Using a name that is not an internal variable or refers to a variable that has
1737been destroyed results in an error.
Bram Moolenaar071d4272004-06-13 20:20:40 +00001738
Bram Moolenaar5da36052021-12-27 15:39:57 +00001739In |Vim9| script `:let` is not used and variables work differently, see |:var|.
1740
Bram Moolenaar65e0d772020-06-14 17:29:55 +02001741 *variable-scope*
Bram Moolenaar071d4272004-06-13 20:20:40 +00001742There are several name spaces for variables. Which one is to be used is
1743specified by what is prepended:
1744
Bram Moolenaar5da36052021-12-27 15:39:57 +00001745 (nothing) In a function: local to the function;
1746 in a legacy script: global;
1747 in a |Vim9| script: local to the script
Bram Moolenaar071d4272004-06-13 20:20:40 +00001748|buffer-variable| b: Local to the current buffer.
1749|window-variable| w: Local to the current window.
Bram Moolenaar910f66f2006-04-05 20:41:53 +00001750|tabpage-variable| t: Local to the current tab page.
Bram Moolenaar071d4272004-06-13 20:20:40 +00001751|global-variable| g: Global.
Bram Moolenaar5da36052021-12-27 15:39:57 +00001752|local-variable| l: Local to a function (only in a legacy function)
Bram Moolenaar071d4272004-06-13 20:20:40 +00001753|script-variable| s: Local to a |:source|'ed Vim script.
Bram Moolenaar5da36052021-12-27 15:39:57 +00001754|function-argument| a: Function argument (only in a legacy function).
Bram Moolenaar75b81562014-04-06 14:09:13 +02001755|vim-variable| v: Global, predefined by Vim.
Bram Moolenaar071d4272004-06-13 20:20:40 +00001756
Bram Moolenaar32466aa2006-02-24 23:53:04 +00001757The scope name by itself can be used as a |Dictionary|. For example, to
1758delete all script-local variables: >
Bram Moolenaar8f999f12005-01-25 22:12:55 +00001759 :for k in keys(s:)
1760 : unlet s:[k]
1761 :endfor
Bram Moolenaar65e0d772020-06-14 17:29:55 +02001762
Bram Moolenaar5da36052021-12-27 15:39:57 +00001763Note: in Vim9 script variables can also be local to a block of commands, see
1764|vim9-scopes|.
Bram Moolenaar531da592013-05-06 05:58:55 +02001765 *buffer-variable* *b:var* *b:*
Bram Moolenaar071d4272004-06-13 20:20:40 +00001766A variable name that is preceded with "b:" is local to the current buffer.
1767Thus you can have several "b:foo" variables, one for each buffer.
1768This kind of variable is deleted when the buffer is wiped out or deleted with
1769|:bdelete|.
1770
1771One local buffer variable is predefined:
Bram Moolenaarbf884932013-04-05 22:26:15 +02001772 *b:changedtick* *changetick*
Bram Moolenaar071d4272004-06-13 20:20:40 +00001773b:changedtick The total number of changes to the current buffer. It is
1774 incremented for each change. An undo command is also a change
Bram Moolenaarc024b462019-06-08 18:07:21 +02001775 in this case. Resetting 'modified' when writing the buffer is
1776 also counted.
1777 This can be used to perform an action only when the buffer has
1778 changed. Example: >
Bram Moolenaar071d4272004-06-13 20:20:40 +00001779 :if my_changedtick != b:changedtick
Bram Moolenaar446cb832008-06-24 21:56:24 +00001780 : let my_changedtick = b:changedtick
1781 : call My_Update()
Bram Moolenaar071d4272004-06-13 20:20:40 +00001782 :endif
Bram Moolenaar3df01732017-02-17 22:47:16 +01001783< You cannot change or delete the b:changedtick variable.
1784
Bram Moolenaar531da592013-05-06 05:58:55 +02001785 *window-variable* *w:var* *w:*
Bram Moolenaar071d4272004-06-13 20:20:40 +00001786A variable name that is preceded with "w:" is local to the current window. It
1787is deleted when the window is closed.
1788
Bram Moolenaarad3b3662013-05-17 18:14:19 +02001789 *tabpage-variable* *t:var* *t:*
Bram Moolenaar910f66f2006-04-05 20:41:53 +00001790A variable name that is preceded with "t:" is local to the current tab page,
1791It is deleted when the tab page is closed. {not available when compiled
Bram Moolenaardb84e452010-08-15 13:50:43 +02001792without the |+windows| feature}
Bram Moolenaar910f66f2006-04-05 20:41:53 +00001793
Bram Moolenaar531da592013-05-06 05:58:55 +02001794 *global-variable* *g:var* *g:*
Bram Moolenaar04fb9162021-12-30 20:24:12 +00001795Inside functions and in |Vim9| script global variables are accessed with "g:".
1796Omitting this will access a variable local to a function or script. "g:"
1797can also be used in any other place if you like.
Bram Moolenaar071d4272004-06-13 20:20:40 +00001798
Bram Moolenaar531da592013-05-06 05:58:55 +02001799 *local-variable* *l:var* *l:*
Bram Moolenaar071d4272004-06-13 20:20:40 +00001800Inside functions local variables are accessed without prepending anything.
Bram Moolenaaref2f6562007-05-06 13:32:59 +00001801But you can also prepend "l:" if you like. However, without prepending "l:"
1802you may run into reserved variable names. For example "count". By itself it
1803refers to "v:count". Using "l:count" you can have a local variable with the
1804same name.
Bram Moolenaar071d4272004-06-13 20:20:40 +00001805
1806 *script-variable* *s:var*
Bram Moolenaar04fb9162021-12-30 20:24:12 +00001807In a legacy Vim script variables starting with "s:" can be used. They cannot
1808be accessed from outside of the scripts, thus are local to the script.
1809In |Vim9| script the "s:" prefix can be omitted, variables are script-local by
1810default.
Bram Moolenaar071d4272004-06-13 20:20:40 +00001811
1812They can be used in:
1813- commands executed while the script is sourced
1814- functions defined in the script
1815- autocommands defined in the script
1816- functions and autocommands defined in functions and autocommands which were
1817 defined in the script (recursively)
1818- user defined commands defined in the script
1819Thus not in:
1820- other scripts sourced from this one
1821- mappings
Bram Moolenaar8f3f58f2010-01-06 20:52:26 +01001822- menus
Bram Moolenaar071d4272004-06-13 20:20:40 +00001823- etc.
1824
Bram Moolenaaref2f6562007-05-06 13:32:59 +00001825Script variables can be used to avoid conflicts with global variable names.
1826Take this example: >
Bram Moolenaar071d4272004-06-13 20:20:40 +00001827
1828 let s:counter = 0
1829 function MyCounter()
1830 let s:counter = s:counter + 1
1831 echo s:counter
1832 endfunction
1833 command Tick call MyCounter()
1834
1835You can now invoke "Tick" from any script, and the "s:counter" variable in
1836that script will not be changed, only the "s:counter" in the script where
1837"Tick" was defined is used.
1838
1839Another example that does the same: >
1840
1841 let s:counter = 0
1842 command Tick let s:counter = s:counter + 1 | echo s:counter
1843
1844When calling a function and invoking a user-defined command, the context for
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001845script variables is set to the script where the function or command was
Bram Moolenaar071d4272004-06-13 20:20:40 +00001846defined.
1847
1848The script variables are also available when a function is defined inside a
1849function that is defined in a script. Example: >
1850
1851 let s:counter = 0
1852 function StartCounting(incr)
1853 if a:incr
1854 function MyCounter()
1855 let s:counter = s:counter + 1
1856 endfunction
1857 else
1858 function MyCounter()
1859 let s:counter = s:counter - 1
1860 endfunction
1861 endif
1862 endfunction
1863
1864This defines the MyCounter() function either for counting up or counting down
1865when calling StartCounting(). It doesn't matter from where StartCounting() is
1866called, the s:counter variable will be accessible in MyCounter().
1867
1868When the same script is sourced again it will use the same script variables.
1869They will remain valid as long as Vim is running. This can be used to
1870maintain a counter: >
1871
1872 if !exists("s:counter")
1873 let s:counter = 1
1874 echo "script executed for the first time"
1875 else
1876 let s:counter = s:counter + 1
Bram Moolenaarc51cf032022-02-26 12:25:45 +00001877 echo "script executed " .. s:counter .. " times now"
Bram Moolenaar071d4272004-06-13 20:20:40 +00001878 endif
1879
1880Note that this means that filetype plugins don't get a different set of script
1881variables for each buffer. Use local buffer variables instead |b:var|.
1882
1883
Bram Moolenaard47d5222018-12-09 20:43:55 +01001884PREDEFINED VIM VARIABLES *vim-variable* *v:var* *v:*
Bram Moolenaar6f4754b2022-01-23 12:07:04 +00001885 *E963* *E1063*
Bram Moolenaard47d5222018-12-09 20:43:55 +01001886Some variables can be set by the user, but the type cannot be changed.
Bram Moolenaar071d4272004-06-13 20:20:40 +00001887
Bram Moolenaar69bf6342019-10-29 04:16:57 +01001888 *v:argv* *argv-variable*
1889v:argv The command line arguments Vim was invoked with. This is a
1890 list of strings. The first item is the Vim command.
Bram Moolenaar1588bc82022-03-08 21:35:07 +00001891 See |v:progpath| for the command with full path.
Bram Moolenaar69bf6342019-10-29 04:16:57 +01001892
Bram Moolenaare4efc3b2005-03-07 23:16:51 +00001893 *v:beval_col* *beval_col-variable*
1894v:beval_col The number of the column, over which the mouse pointer is.
1895 This is the byte index in the |v:beval_lnum| line.
1896 Only valid while evaluating the 'balloonexpr' option.
1897
1898 *v:beval_bufnr* *beval_bufnr-variable*
1899v:beval_bufnr The number of the buffer, over which the mouse pointer is. Only
1900 valid while evaluating the 'balloonexpr' option.
1901
1902 *v:beval_lnum* *beval_lnum-variable*
1903v:beval_lnum The number of the line, over which the mouse pointer is. Only
1904 valid while evaluating the 'balloonexpr' option.
1905
1906 *v:beval_text* *beval_text-variable*
Bram Moolenaar24bbcfe2005-06-28 23:32:02 +00001907v:beval_text The text under or after the mouse pointer. Usually a word as
1908 it is useful for debugging a C program. 'iskeyword' applies,
1909 but a dot and "->" before the position is included. When on a
1910 ']' the text before it is used, including the matching '[' and
Bram Moolenaare4efc3b2005-03-07 23:16:51 +00001911 word before it. When on a Visual area within one line the
Bram Moolenaarb4d5fba2017-09-11 19:31:28 +02001912 highlighted text is used. Also see |<cexpr>|.
Bram Moolenaare4efc3b2005-03-07 23:16:51 +00001913 Only valid while evaluating the 'balloonexpr' option.
1914
1915 *v:beval_winnr* *beval_winnr-variable*
1916v:beval_winnr The number of the window, over which the mouse pointer is. Only
Bram Moolenaar00654022011-02-25 14:42:19 +01001917 valid while evaluating the 'balloonexpr' option. The first
1918 window has number zero (unlike most other places where a
1919 window gets a number).
Bram Moolenaare4efc3b2005-03-07 23:16:51 +00001920
Bram Moolenaar511972d2016-06-04 18:09:59 +02001921 *v:beval_winid* *beval_winid-variable*
Bram Moolenaar7571d552016-08-18 22:54:46 +02001922v:beval_winid The |window-ID| of the window, over which the mouse pointer
1923 is. Otherwise like v:beval_winnr.
Bram Moolenaar511972d2016-06-04 18:09:59 +02001924
Bram Moolenaarf193fff2006-04-27 00:02:13 +00001925 *v:char* *char-variable*
Bram Moolenaar8f3f58f2010-01-06 20:52:26 +01001926v:char Argument for evaluating 'formatexpr' and used for the typed
Bram Moolenaar945e2db2010-06-05 17:43:32 +02001927 character when using <expr> in an abbreviation |:map-<expr>|.
Bram Moolenaare6ae6222013-05-21 21:01:10 +02001928 It is also used by the |InsertCharPre| and |InsertEnter| events.
Bram Moolenaarf193fff2006-04-27 00:02:13 +00001929
Bram Moolenaar071d4272004-06-13 20:20:40 +00001930 *v:charconvert_from* *charconvert_from-variable*
1931v:charconvert_from
1932 The name of the character encoding of a file to be converted.
1933 Only valid while evaluating the 'charconvert' option.
1934
1935 *v:charconvert_to* *charconvert_to-variable*
1936v:charconvert_to
1937 The name of the character encoding of a file after conversion.
1938 Only valid while evaluating the 'charconvert' option.
1939
1940 *v:cmdarg* *cmdarg-variable*
1941v:cmdarg This variable is used for two purposes:
1942 1. The extra arguments given to a file read/write command.
1943 Currently these are "++enc=" and "++ff=". This variable is
1944 set before an autocommand event for a file read/write
1945 command is triggered. There is a leading space to make it
1946 possible to append this variable directly after the
Bram Moolenaar58b85342016-08-14 19:54:54 +02001947 read/write command. Note: The "+cmd" argument isn't
Bram Moolenaar071d4272004-06-13 20:20:40 +00001948 included here, because it will be executed anyway.
1949 2. When printing a PostScript file with ":hardcopy" this is
1950 the argument for the ":hardcopy" command. This can be used
1951 in 'printexpr'.
1952
1953 *v:cmdbang* *cmdbang-variable*
1954v:cmdbang Set like v:cmdarg for a file read/write command. When a "!"
1955 was used the value is 1, otherwise it is 0. Note that this
1956 can only be used in autocommands. For user commands |<bang>|
1957 can be used.
Bram Moolenaar84cf6bd2020-06-16 20:03:43 +02001958 *v:collate* *collate-variable*
1959v:collate The current locale setting for collation order of the runtime
1960 environment. This allows Vim scripts to be aware of the
1961 current locale encoding. Technical: it's the value of
1962 LC_COLLATE. When not using a locale the value is "C".
1963 This variable can not be set directly, use the |:language|
1964 command.
1965 See |multi-lang|.
Bram Moolenaar071d4272004-06-13 20:20:40 +00001966
Drew Vogele30d1022021-10-24 20:35:07 +01001967 *v:colornames*
1968v:colornames A dictionary that maps color names to hex color strings. These
1969 color names can be used with the |highlight-guifg|,
1970 |highlight-guibg|, and |highlight-guisp| parameters. Updating
1971 an entry in v:colornames has no immediate effect on the syntax
1972 highlighting. The highlight commands (probably in a
1973 colorscheme script) need to be re-evaluated in order to use
1974 the updated color values. For example: >
1975
1976 :let v:colornames['fuscia'] = '#cf3ab4'
1977 :let v:colornames['mauve'] = '#915f6d'
1978 :highlight Normal guifg=fuscia guibg=mauve
1979<
1980 This cannot be used to override the |cterm-colors| but it can
1981 be used to override other colors. For example, the X11 colors
1982 defined in the `colors/lists/default.vim` (previously defined
1983 in |rgb.txt|). When defining new color names in a plugin, the
1984 recommended practice is to set a color entry only when it does
1985 not already exist. For example: >
1986
1987 :call extend(v:colornames, {
1988 \ 'fuscia': '#cf3ab4',
1989 \ 'mauve': '#915f6d,
1990 \ }, 'keep')
1991<
Bram Moolenaar113cb512021-11-07 20:27:04 +00001992 Using |extend()| with the 'keep' option updates each color only
Drew Vogele30d1022021-10-24 20:35:07 +01001993 if it did not exist in |v:colornames|. Doing so allows the
1994 user to choose the precise color value for a common name
1995 by setting it in their |.vimrc|.
1996
1997 It is possible to remove entries from this dictionary but
Drew Vogela0fca172021-11-13 10:50:01 +00001998 doing so is NOT recommended, because it is disruptive to
Drew Vogele30d1022021-10-24 20:35:07 +01001999 other scripts. It is also unlikely to achieve the desired
Bram Moolenaar113cb512021-11-07 20:27:04 +00002000 result because the |:colorscheme| and |:highlight| commands will
Drew Vogele30d1022021-10-24 20:35:07 +01002001 both automatically load all `colors/lists/default.vim` color
2002 scripts.
2003
Bram Moolenaar42a45122015-07-10 17:56:23 +02002004 *v:completed_item* *completed_item-variable*
2005v:completed_item
2006 |Dictionary| containing the |complete-items| for the most
2007 recently completed word after |CompleteDone|. The
2008 |Dictionary| is empty if the completion failed.
Shougo Matsushita61021aa2022-07-27 14:40:00 +01002009 Note: Plugins can modify the value to emulate the builtin
2010 |CompleteDone| event behavior.
Bram Moolenaar42a45122015-07-10 17:56:23 +02002011
Bram Moolenaar071d4272004-06-13 20:20:40 +00002012 *v:count* *count-variable*
2013v:count The count given for the last Normal mode command. Can be used
Bram Moolenaar58b85342016-08-14 19:54:54 +02002014 to get the count before a mapping. Read-only. Example: >
Bram Moolenaarc51cf032022-02-26 12:25:45 +00002015 :map _x :<C-U>echo "the count is " .. v:count<CR>
Bram Moolenaar071d4272004-06-13 20:20:40 +00002016< Note: The <C-U> is required to remove the line range that you
2017 get when typing ':' after a count.
Bram Moolenaar8f3f58f2010-01-06 20:52:26 +01002018 When there are two counts, as in "3d2w", they are multiplied,
2019 just like what happens in the command, "d6w" for the example.
Bram Moolenaar1d2ba7f2006-02-14 22:29:30 +00002020 Also used for evaluating the 'formatexpr' option.
Bram Moolenaard2e716e2019-04-20 14:39:52 +02002021 "count" also works, for backwards compatibility, unless
2022 |scriptversion| is 3 or higher.
Bram Moolenaar071d4272004-06-13 20:20:40 +00002023
2024 *v:count1* *count1-variable*
2025v:count1 Just like "v:count", but defaults to one when no count is
2026 used.
2027
2028 *v:ctype* *ctype-variable*
2029v:ctype The current locale setting for characters of the runtime
2030 environment. This allows Vim scripts to be aware of the
2031 current locale encoding. Technical: it's the value of
2032 LC_CTYPE. When not using a locale the value is "C".
2033 This variable can not be set directly, use the |:language|
2034 command.
2035 See |multi-lang|.
2036
2037 *v:dying* *dying-variable*
Bram Moolenaar58b85342016-08-14 19:54:54 +02002038v:dying Normally zero. When a deadly signal is caught it's set to
Bram Moolenaar071d4272004-06-13 20:20:40 +00002039 one. When multiple signals are caught the number increases.
2040 Can be used in an autocommand to check if Vim didn't
2041 terminate normally. {only works on Unix}
2042 Example: >
2043 :au VimLeave * if v:dying | echo "\nAAAAaaaarrrggghhhh!!!\n" | endif
Bram Moolenaar0e1e25f2010-05-28 21:07:08 +02002044< Note: if another deadly signal is caught when v:dying is one,
2045 VimLeave autocommands will not be executed.
2046
Bram Moolenaarf0068c52020-11-30 17:42:10 +01002047 *v:exiting* *exiting-variable*
2048v:exiting Vim exit code. Normally zero, non-zero when something went
2049 wrong. The value is v:null before invoking the |VimLeavePre|
2050 and |VimLeave| autocmds. See |:q|, |:x| and |:cquit|.
2051 Example: >
2052 :au VimLeave * echo "Exit value is " .. v:exiting
2053<
Bram Moolenaar37f4cbd2019-08-23 20:58:45 +02002054 *v:echospace* *echospace-variable*
2055v:echospace Number of screen cells that can be used for an `:echo` message
2056 in the last screen line before causing the |hit-enter-prompt|.
2057 Depends on 'showcmd', 'ruler' and 'columns'. You need to
2058 check 'cmdheight' for whether there are full-width lines
2059 available above the last line.
2060
Bram Moolenaar071d4272004-06-13 20:20:40 +00002061 *v:errmsg* *errmsg-variable*
2062v:errmsg Last given error message. It's allowed to set this variable.
2063 Example: >
2064 :let v:errmsg = ""
2065 :silent! next
2066 :if v:errmsg != ""
2067 : ... handle error
Bram Moolenaard2e716e2019-04-20 14:39:52 +02002068< "errmsg" also works, for backwards compatibility, unless
2069 |scriptversion| is 3 or higher.
Bram Moolenaar071d4272004-06-13 20:20:40 +00002070
Bram Moolenaar65a54642018-04-28 16:56:53 +02002071 *v:errors* *errors-variable* *assert-return*
Bram Moolenaar683fa182015-11-30 21:38:24 +01002072v:errors Errors found by assert functions, such as |assert_true()|.
Bram Moolenaar43345542015-11-29 17:35:35 +01002073 This is a list of strings.
2074 The assert functions append an item when an assert fails.
Bram Moolenaar65a54642018-04-28 16:56:53 +02002075 The return value indicates this: a one is returned if an item
2076 was added to v:errors, otherwise zero is returned.
Bram Moolenaar43345542015-11-29 17:35:35 +01002077 To remove old results make it empty: >
2078 :let v:errors = []
2079< If v:errors is set to anything but a list it is made an empty
2080 list by the assert function.
2081
Bram Moolenaar7e1652c2017-12-16 18:27:02 +01002082 *v:event* *event-variable*
2083v:event Dictionary containing information about the current
Bram Moolenaar560979e2020-02-04 22:53:05 +01002084 |autocommand|. See the specific event for what it puts in
2085 this dictionary.
Bram Moolenaar2c7f8c52020-04-20 19:52:53 +02002086 The dictionary is emptied when the |autocommand| finishes,
2087 please refer to |dict-identity| for how to get an independent
2088 copy of it. Use |deepcopy()| if you want to keep the
2089 information after the event triggers. Example: >
2090 au TextYankPost * let g:foo = deepcopy(v:event)
2091<
Bram Moolenaar071d4272004-06-13 20:20:40 +00002092 *v:exception* *exception-variable*
2093v:exception The value of the exception most recently caught and not
2094 finished. See also |v:throwpoint| and |throw-variables|.
2095 Example: >
2096 :try
2097 : throw "oops"
2098 :catch /.*/
Bram Moolenaar54775062019-07-31 21:07:14 +02002099 : echo "caught " .. v:exception
Bram Moolenaar071d4272004-06-13 20:20:40 +00002100 :endtry
2101< Output: "caught oops".
2102
Bram Moolenaar520e1e42016-01-23 19:46:28 +01002103 *v:false* *false-variable*
2104v:false A Number with value zero. Used to put "false" in JSON. See
Bram Moolenaar6463ca22016-02-13 17:04:46 +01002105 |json_encode()|.
Bram Moolenaarc95a3022016-06-12 23:01:46 +02002106 When used as a string this evaluates to "v:false". >
Bram Moolenaar705ada12016-01-24 17:56:50 +01002107 echo v:false
Bram Moolenaarc95a3022016-06-12 23:01:46 +02002108< v:false ~
2109 That is so that eval() can parse the string back to the same
Bram Moolenaardf48fb42016-07-22 21:50:18 +02002110 value. Read-only.
Bram Moolenaar5da36052021-12-27 15:39:57 +00002111 In |Vim9| script "false" can be used which has a boolean type.
Bram Moolenaar520e1e42016-01-23 19:46:28 +01002112
Bram Moolenaar19a09a12005-03-04 23:39:37 +00002113 *v:fcs_reason* *fcs_reason-variable*
2114v:fcs_reason The reason why the |FileChangedShell| event was triggered.
2115 Can be used in an autocommand to decide what to do and/or what
2116 to set v:fcs_choice to. Possible values:
2117 deleted file no longer exists
2118 conflict file contents, mode or timestamp was
2119 changed and buffer is modified
2120 changed file contents has changed
2121 mode mode of file changed
2122 time only file timestamp changed
2123
2124 *v:fcs_choice* *fcs_choice-variable*
2125v:fcs_choice What should happen after a |FileChangedShell| event was
2126 triggered. Can be used in an autocommand to tell Vim what to
2127 do with the affected buffer:
2128 reload Reload the buffer (does not work if
2129 the file was deleted).
Rob Pilling8196e942022-02-11 15:12:10 +00002130 edit Reload the buffer and detect the
2131 values for options such as
2132 'fileformat', 'fileencoding', 'binary'
2133 (does not work if the file was
2134 deleted).
Bram Moolenaar19a09a12005-03-04 23:39:37 +00002135 ask Ask the user what to do, as if there
2136 was no autocommand. Except that when
2137 only the timestamp changed nothing
2138 will happen.
2139 <empty> Nothing, the autocommand should do
2140 everything that needs to be done.
2141 The default is empty. If another (invalid) value is used then
2142 Vim behaves like it is empty, there is no warning message.
2143
Bram Moolenaar4c295022021-05-02 17:19:11 +02002144 *v:fname* *fname-variable*
Bram Moolenaar90df4b92021-07-07 20:26:08 +02002145v:fname When evaluating 'includeexpr': the file name that was
2146 detected. Empty otherwise.
Bram Moolenaar4c295022021-05-02 17:19:11 +02002147
Bram Moolenaar071d4272004-06-13 20:20:40 +00002148 *v:fname_in* *fname_in-variable*
Bram Moolenaar4e330bb2005-12-07 21:04:31 +00002149v:fname_in The name of the input file. Valid while evaluating:
Bram Moolenaar071d4272004-06-13 20:20:40 +00002150 option used for ~
2151 'charconvert' file to be converted
2152 'diffexpr' original file
2153 'patchexpr' original file
2154 'printexpr' file to be printed
Bram Moolenaar2c7a29c2005-12-12 22:02:31 +00002155 And set to the swap file name for |SwapExists|.
Bram Moolenaar071d4272004-06-13 20:20:40 +00002156
2157 *v:fname_out* *fname_out-variable*
2158v:fname_out The name of the output file. Only valid while
2159 evaluating:
2160 option used for ~
2161 'charconvert' resulting converted file (*)
2162 'diffexpr' output of diff
2163 'patchexpr' resulting patched file
2164 (*) When doing conversion for a write command (e.g., ":w
Bram Moolenaar58b85342016-08-14 19:54:54 +02002165 file") it will be equal to v:fname_in. When doing conversion
Bram Moolenaar071d4272004-06-13 20:20:40 +00002166 for a read command (e.g., ":e file") it will be a temporary
2167 file and different from v:fname_in.
2168
2169 *v:fname_new* *fname_new-variable*
2170v:fname_new The name of the new version of the file. Only valid while
2171 evaluating 'diffexpr'.
2172
2173 *v:fname_diff* *fname_diff-variable*
2174v:fname_diff The name of the diff (patch) file. Only valid while
2175 evaluating 'patchexpr'.
2176
2177 *v:folddashes* *folddashes-variable*
2178v:folddashes Used for 'foldtext': dashes representing foldlevel of a closed
2179 fold.
Bram Moolenaar7b0294c2004-10-11 10:16:09 +00002180 Read-only in the |sandbox|. |fold-foldtext|
Bram Moolenaar071d4272004-06-13 20:20:40 +00002181
2182 *v:foldlevel* *foldlevel-variable*
2183v:foldlevel Used for 'foldtext': foldlevel of closed fold.
Bram Moolenaar7b0294c2004-10-11 10:16:09 +00002184 Read-only in the |sandbox|. |fold-foldtext|
Bram Moolenaar071d4272004-06-13 20:20:40 +00002185
2186 *v:foldend* *foldend-variable*
2187v:foldend Used for 'foldtext': last line of closed fold.
Bram Moolenaar7b0294c2004-10-11 10:16:09 +00002188 Read-only in the |sandbox|. |fold-foldtext|
Bram Moolenaar071d4272004-06-13 20:20:40 +00002189
2190 *v:foldstart* *foldstart-variable*
2191v:foldstart Used for 'foldtext': first line of closed fold.
Bram Moolenaar7b0294c2004-10-11 10:16:09 +00002192 Read-only in the |sandbox|. |fold-foldtext|
Bram Moolenaar071d4272004-06-13 20:20:40 +00002193
Bram Moolenaar817a8802013-11-09 01:44:43 +01002194 *v:hlsearch* *hlsearch-variable*
Bram Moolenaarb0d45e72017-11-05 18:19:24 +01002195v:hlsearch Variable that indicates whether search highlighting is on.
Bram Moolenaar76440e22014-11-27 19:14:49 +01002196 Setting it makes sense only if 'hlsearch' is enabled which
2197 requires |+extra_search|. Setting this variable to zero acts
Bram Moolenaar705ada12016-01-24 17:56:50 +01002198 like the |:nohlsearch| command, setting it to one acts like >
Bram Moolenaar817a8802013-11-09 01:44:43 +01002199 let &hlsearch = &hlsearch
Bram Moolenaar86ae7202015-07-10 19:31:35 +02002200< Note that the value is restored when returning from a
2201 function. |function-search-undo|.
2202
Bram Moolenaar843ee412004-06-30 16:16:41 +00002203 *v:insertmode* *insertmode-variable*
2204v:insertmode Used for the |InsertEnter| and |InsertChange| autocommand
2205 events. Values:
2206 i Insert mode
2207 r Replace mode
2208 v Virtual Replace mode
2209
Bram Moolenaar2fda12f2005-01-15 22:14:15 +00002210 *v:key* *key-variable*
Bram Moolenaar32466aa2006-02-24 23:53:04 +00002211v:key Key of the current item of a |Dictionary|. Only valid while
Bram Moolenaar2fda12f2005-01-15 22:14:15 +00002212 evaluating the expression used with |map()| and |filter()|.
2213 Read-only.
2214
Bram Moolenaar071d4272004-06-13 20:20:40 +00002215 *v:lang* *lang-variable*
2216v:lang The current locale setting for messages of the runtime
2217 environment. This allows Vim scripts to be aware of the
2218 current language. Technical: it's the value of LC_MESSAGES.
2219 The value is system dependent.
2220 This variable can not be set directly, use the |:language|
2221 command.
2222 It can be different from |v:ctype| when messages are desired
2223 in a different language than what is used for character
2224 encoding. See |multi-lang|.
2225
2226 *v:lc_time* *lc_time-variable*
2227v:lc_time The current locale setting for time messages of the runtime
2228 environment. This allows Vim scripts to be aware of the
2229 current language. Technical: it's the value of LC_TIME.
2230 This variable can not be set directly, use the |:language|
2231 command. See |multi-lang|.
2232
2233 *v:lnum* *lnum-variable*
Bram Moolenaar368373e2010-07-19 20:46:22 +02002234v:lnum Line number for the 'foldexpr' |fold-expr|, 'formatexpr' and
2235 'indentexpr' expressions, tab page number for 'guitablabel'
2236 and 'guitabtooltip'. Only valid while one of these
2237 expressions is being evaluated. Read-only when in the
2238 |sandbox|.
Bram Moolenaar071d4272004-06-13 20:20:40 +00002239
naohiro ono56200ee2022-01-01 14:59:44 +00002240 *v:maxcol* *maxcol-variable*
Bram Moolenaar2f0936c2022-01-08 21:51:59 +00002241v:maxcol Maximum line length. Depending on where it is used it can be
Bram Moolenaar944697a2022-02-20 19:48:20 +00002242 screen columns, characters or bytes. The value currently is
2243 2147483647 on all systems.
naohiro ono56200ee2022-01-01 14:59:44 +00002244
Bram Moolenaar219b8702006-11-01 14:32:36 +00002245 *v:mouse_win* *mouse_win-variable*
2246v:mouse_win Window number for a mouse click obtained with |getchar()|.
2247 First window has number 1, like with |winnr()|. The value is
2248 zero when there was no mouse button click.
2249
Bram Moolenaar511972d2016-06-04 18:09:59 +02002250 *v:mouse_winid* *mouse_winid-variable*
2251v:mouse_winid Window ID for a mouse click obtained with |getchar()|.
2252 The value is zero when there was no mouse button click.
2253
Bram Moolenaar219b8702006-11-01 14:32:36 +00002254 *v:mouse_lnum* *mouse_lnum-variable*
2255v:mouse_lnum Line number for a mouse click obtained with |getchar()|.
2256 This is the text line number, not the screen line number. The
2257 value is zero when there was no mouse button click.
2258
2259 *v:mouse_col* *mouse_col-variable*
2260v:mouse_col Column number for a mouse click obtained with |getchar()|.
2261 This is the screen column number, like with |virtcol()|. The
2262 value is zero when there was no mouse button click.
2263
Bram Moolenaard09091d2019-01-17 16:07:22 +01002264 *v:none* *none-variable* *None*
Bram Moolenaar520e1e42016-01-23 19:46:28 +01002265v:none An empty String. Used to put an empty item in JSON. See
Bram Moolenaar6463ca22016-02-13 17:04:46 +01002266 |json_encode()|.
Bram Moolenaar2547aa92020-07-26 17:00:44 +02002267 This can also be used as a function argument to use the
2268 default value, see |none-function_argument|.
Bram Moolenaar705ada12016-01-24 17:56:50 +01002269 When used as a number this evaluates to zero.
Bram Moolenaarc95a3022016-06-12 23:01:46 +02002270 When used as a string this evaluates to "v:none". >
Bram Moolenaar705ada12016-01-24 17:56:50 +01002271 echo v:none
Bram Moolenaarc95a3022016-06-12 23:01:46 +02002272< v:none ~
2273 That is so that eval() can parse the string back to the same
Bram Moolenaardf48fb42016-07-22 21:50:18 +02002274 value. Read-only.
Bram Moolenaar1588bc82022-03-08 21:35:07 +00002275 Note that using `== v:none` and `!= v:none` will often give
2276 an error. Instead, use `is v:none` and `isnot v:none` .
Bram Moolenaar520e1e42016-01-23 19:46:28 +01002277
2278 *v:null* *null-variable*
2279v:null An empty String. Used to put "null" in JSON. See
Bram Moolenaar6463ca22016-02-13 17:04:46 +01002280 |json_encode()|.
Bram Moolenaar705ada12016-01-24 17:56:50 +01002281 When used as a number this evaluates to zero.
Bram Moolenaarc95a3022016-06-12 23:01:46 +02002282 When used as a string this evaluates to "v:null". >
Bram Moolenaar705ada12016-01-24 17:56:50 +01002283 echo v:null
Bram Moolenaarc95a3022016-06-12 23:01:46 +02002284< v:null ~
2285 That is so that eval() can parse the string back to the same
Bram Moolenaardf48fb42016-07-22 21:50:18 +02002286 value. Read-only.
Bram Moolenaar1588bc82022-03-08 21:35:07 +00002287 In |Vim9| script `null` can be used without "v:".
2288 In some places `v:null` and `null` can be used for a List,
2289 Dict, Job, etc. that is not set. That is slightly different
2290 than an empty List, Dict, etc.
Bram Moolenaar520e1e42016-01-23 19:46:28 +01002291
Bram Moolenaar57d5a012021-01-21 21:42:31 +01002292 *v:numbermax* *numbermax-variable*
2293v:numbermax Maximum value of a number.
2294
Bram Moolenaare0e39172021-01-25 21:14:57 +01002295 *v:numbermin* *numbermin-variable*
Bram Moolenaar2346a632021-06-13 19:02:49 +02002296v:numbermin Minimum value of a number (negative).
Bram Moolenaar57d5a012021-01-21 21:42:31 +01002297
Bram Moolenaarf9706e92020-02-22 14:27:04 +01002298 *v:numbersize* *numbersize-variable*
2299v:numbersize Number of bits in a Number. This is normally 64, but on some
Bram Moolenaarbc93ceb2020-02-26 13:36:21 +01002300 systems it may be 32.
Bram Moolenaarf9706e92020-02-22 14:27:04 +01002301
Bram Moolenaard812df62008-11-09 12:46:09 +00002302 *v:oldfiles* *oldfiles-variable*
2303v:oldfiles List of file names that is loaded from the |viminfo| file on
2304 startup. These are the files that Vim remembers marks for.
2305 The length of the List is limited by the ' argument of the
2306 'viminfo' option (default is 100).
Bram Moolenaar8d043172014-01-23 14:24:41 +01002307 When the |viminfo| file is not used the List is empty.
Bram Moolenaard812df62008-11-09 12:46:09 +00002308 Also see |:oldfiles| and |c_#<|.
2309 The List can be modified, but this has no effect on what is
2310 stored in the |viminfo| file later. If you use values other
2311 than String this will cause trouble.
Bram Moolenaardb84e452010-08-15 13:50:43 +02002312 {only when compiled with the |+viminfo| feature}
Bram Moolenaard812df62008-11-09 12:46:09 +00002313
Bram Moolenaar53744302015-07-17 17:38:22 +02002314 *v:option_new*
2315v:option_new New value of the option. Valid while executing an |OptionSet|
2316 autocommand.
2317 *v:option_old*
2318v:option_old Old value of the option. Valid while executing an |OptionSet|
Bram Moolenaard7c96872019-06-15 17:12:48 +02002319 autocommand. Depending on the command used for setting and the
2320 kind of option this is either the local old value or the
2321 global old value.
2322 *v:option_oldlocal*
2323v:option_oldlocal
2324 Old local value of the option. Valid while executing an
2325 |OptionSet| autocommand.
2326 *v:option_oldglobal*
2327v:option_oldglobal
2328 Old global value of the option. Valid while executing an
2329 |OptionSet| autocommand.
Bram Moolenaar53744302015-07-17 17:38:22 +02002330 *v:option_type*
2331v:option_type Scope of the set command. Valid while executing an
2332 |OptionSet| autocommand. Can be either "global" or "local"
Bram Moolenaard7c96872019-06-15 17:12:48 +02002333 *v:option_command*
2334v:option_command
2335 Command used to set the option. Valid while executing an
2336 |OptionSet| autocommand.
2337 value option was set via ~
2338 "setlocal" |:setlocal| or ":let l:xxx"
2339 "setglobal" |:setglobal| or ":let g:xxx"
2340 "set" |:set| or |:let|
2341 "modeline" |modeline|
Bram Moolenaar8af1fbf2008-01-05 12:35:21 +00002342 *v:operator* *operator-variable*
2343v:operator The last operator given in Normal mode. This is a single
2344 character except for commands starting with <g> or <z>,
2345 in which case it is two characters. Best used alongside
2346 |v:prevcount| and |v:register|. Useful if you want to cancel
2347 Operator-pending mode and then use the operator, e.g.: >
2348 :omap O <Esc>:call MyMotion(v:operator)<CR>
2349< The value remains set until another operator is entered, thus
2350 don't expect it to be empty.
2351 v:operator is not set for |:delete|, |:yank| or other Ex
2352 commands.
2353 Read-only.
2354
Bram Moolenaar071d4272004-06-13 20:20:40 +00002355 *v:prevcount* *prevcount-variable*
2356v:prevcount The count given for the last but one Normal mode command.
2357 This is the v:count value of the previous command. Useful if
Bram Moolenaar8af1fbf2008-01-05 12:35:21 +00002358 you want to cancel Visual or Operator-pending mode and then
2359 use the count, e.g.: >
Bram Moolenaar071d4272004-06-13 20:20:40 +00002360 :vmap % <Esc>:call MyFilter(v:prevcount)<CR>
2361< Read-only.
2362
Bram Moolenaar05159a02005-02-26 23:04:13 +00002363 *v:profiling* *profiling-variable*
Bram Moolenaar58b85342016-08-14 19:54:54 +02002364v:profiling Normally zero. Set to one after using ":profile start".
Bram Moolenaar05159a02005-02-26 23:04:13 +00002365 See |profiling|.
2366
Bram Moolenaar071d4272004-06-13 20:20:40 +00002367 *v:progname* *progname-variable*
2368v:progname Contains the name (with path removed) with which Vim was
Bram Moolenaard38b0552012-04-25 19:07:41 +02002369 invoked. Allows you to do special initialisations for |view|,
2370 |evim| etc., or any other name you might symlink to Vim.
Bram Moolenaar071d4272004-06-13 20:20:40 +00002371 Read-only.
2372
Bram Moolenaara1706c92014-04-01 19:55:49 +02002373 *v:progpath* *progpath-variable*
Bram Moolenaar56c860c2019-08-17 20:09:31 +02002374v:progpath Contains the command with which Vim was invoked, in a form
2375 that when passed to the shell will run the same Vim executable
2376 as the current one (if $PATH remains unchanged).
2377 Useful if you want to message a Vim server using a
Bram Moolenaara1706c92014-04-01 19:55:49 +02002378 |--remote-expr|.
Bram Moolenaarc7f02552014-04-01 21:00:59 +02002379 To get the full path use: >
2380 echo exepath(v:progpath)
Bram Moolenaar56c860c2019-08-17 20:09:31 +02002381< If the command has a relative path it will be expanded to the
2382 full path, so that it still works after `:cd`. Thus starting
2383 "./vim" results in "/home/user/path/to/vim/src/vim".
2384 On Linux and other systems it will always be the full path.
2385 On Mac it may just be "vim" and using exepath() as mentioned
2386 above should be used to get the full path.
Bram Moolenaar08cab962017-03-04 14:37:18 +01002387 On MS-Windows the executable may be called "vim.exe", but the
2388 ".exe" is not added to v:progpath.
Bram Moolenaara1706c92014-04-01 19:55:49 +02002389 Read-only.
2390
Bram Moolenaar071d4272004-06-13 20:20:40 +00002391 *v:register* *register-variable*
Bram Moolenaard58e9292011-02-09 17:07:58 +01002392v:register The name of the register in effect for the current normal mode
Bram Moolenaard38b0552012-04-25 19:07:41 +02002393 command (regardless of whether that command actually used a
2394 register). Or for the currently executing normal mode mapping
2395 (use this in custom commands that take a register).
2396 If none is supplied it is the default register '"', unless
2397 'clipboard' contains "unnamed" or "unnamedplus", then it is
2398 '*' or '+'.
Bram Moolenaard58e9292011-02-09 17:07:58 +01002399 Also see |getreg()| and |setreg()|
Bram Moolenaar071d4272004-06-13 20:20:40 +00002400
Bram Moolenaar1c7715d2005-10-03 22:02:18 +00002401 *v:scrollstart* *scrollstart-variable*
2402v:scrollstart String describing the script or function that caused the
2403 screen to scroll up. It's only set when it is empty, thus the
2404 first reason is remembered. It is set to "Unknown" for a
2405 typed command.
2406 This can be used to find out why your script causes the
2407 hit-enter prompt.
2408
Bram Moolenaar071d4272004-06-13 20:20:40 +00002409 *v:servername* *servername-variable*
Bram Moolenaarc2ce52c2017-08-01 18:35:38 +02002410v:servername The resulting registered |client-server-name| if any.
Bram Moolenaar071d4272004-06-13 20:20:40 +00002411 Read-only.
2412
Bram Moolenaarb0d45e72017-11-05 18:19:24 +01002413
Bram Moolenaar446cb832008-06-24 21:56:24 +00002414v:searchforward *v:searchforward* *searchforward-variable*
2415 Search direction: 1 after a forward search, 0 after a
2416 backward search. It is reset to forward when directly setting
2417 the last search pattern, see |quote/|.
2418 Note that the value is restored when returning from a
2419 function. |function-search-undo|.
2420 Read-write.
2421
Bram Moolenaar071d4272004-06-13 20:20:40 +00002422 *v:shell_error* *shell_error-variable*
2423v:shell_error Result of the last shell command. When non-zero, the last
2424 shell command had an error. When zero, there was no problem.
2425 This only works when the shell returns the error code to Vim.
2426 The value -1 is often used when the command could not be
2427 executed. Read-only.
2428 Example: >
2429 :!mv foo bar
2430 :if v:shell_error
2431 : echo 'could not rename "foo" to "bar"!'
2432 :endif
Bram Moolenaard2e716e2019-04-20 14:39:52 +02002433< "shell_error" also works, for backwards compatibility, unless
2434 |scriptversion| is 3 or higher.
Bram Moolenaar071d4272004-06-13 20:20:40 +00002435
Bram Moolenaar113cb512021-11-07 20:27:04 +00002436 *v:sizeofint* *sizeofint-variable*
2437v:sizeofint Number of bytes in an int. Depends on how Vim was compiled.
2438 This is only useful for deciding whether a test will give the
2439 expected result.
2440
2441 *v:sizeoflong* *sizeoflong-variable*
2442v:sizeoflong Number of bytes in a long. Depends on how Vim was compiled.
2443 This is only useful for deciding whether a test will give the
2444 expected result.
2445
2446 *v:sizeofpointer* *sizeofpointer-variable*
2447v:sizeofpointer Number of bytes in a pointer. Depends on how Vim was compiled.
2448 This is only useful for deciding whether a test will give the
2449 expected result.
2450
Bram Moolenaar071d4272004-06-13 20:20:40 +00002451 *v:statusmsg* *statusmsg-variable*
2452v:statusmsg Last given status message. It's allowed to set this variable.
2453
Bram Moolenaar4e330bb2005-12-07 21:04:31 +00002454 *v:swapname* *swapname-variable*
2455v:swapname Only valid when executing |SwapExists| autocommands: Name of
2456 the swap file found. Read-only.
2457
2458 *v:swapchoice* *swapchoice-variable*
2459v:swapchoice |SwapExists| autocommands can set this to the selected choice
2460 for handling an existing swap file:
2461 'o' Open read-only
2462 'e' Edit anyway
2463 'r' Recover
2464 'd' Delete swapfile
2465 'q' Quit
2466 'a' Abort
Bram Moolenaar58b85342016-08-14 19:54:54 +02002467 The value should be a single-character string. An empty value
Bram Moolenaar4e330bb2005-12-07 21:04:31 +00002468 results in the user being asked, as would happen when there is
2469 no SwapExists autocommand. The default is empty.
2470
Bram Moolenaarb3480382005-12-11 21:33:32 +00002471 *v:swapcommand* *swapcommand-variable*
Bram Moolenaar4770d092006-01-12 23:22:24 +00002472v:swapcommand Normal mode command to be executed after a file has been
Bram Moolenaarb3480382005-12-11 21:33:32 +00002473 opened. Can be used for a |SwapExists| autocommand to have
Bram Moolenaar58b85342016-08-14 19:54:54 +02002474 another Vim open the file and jump to the right place. For
Bram Moolenaarb3480382005-12-11 21:33:32 +00002475 example, when jumping to a tag the value is ":tag tagname\r".
Bram Moolenaar1f35bf92006-03-07 22:38:47 +00002476 For ":edit +cmd file" the value is ":cmd\r".
Bram Moolenaarb3480382005-12-11 21:33:32 +00002477
Bram Moolenaard823fa92016-08-12 16:29:27 +02002478 *v:t_TYPE* *v:t_bool* *t_bool-variable*
Bram Moolenaard09091d2019-01-17 16:07:22 +01002479v:t_bool Value of |Boolean| type. Read-only. See: |type()|
Bram Moolenaard823fa92016-08-12 16:29:27 +02002480 *v:t_channel* *t_channel-variable*
Bram Moolenaard09091d2019-01-17 16:07:22 +01002481v:t_channel Value of |Channel| type. Read-only. See: |type()|
Bram Moolenaard823fa92016-08-12 16:29:27 +02002482 *v:t_dict* *t_dict-variable*
Bram Moolenaard09091d2019-01-17 16:07:22 +01002483v:t_dict Value of |Dictionary| type. Read-only. See: |type()|
Bram Moolenaard823fa92016-08-12 16:29:27 +02002484 *v:t_float* *t_float-variable*
Bram Moolenaard09091d2019-01-17 16:07:22 +01002485v:t_float Value of |Float| type. Read-only. See: |type()|
Bram Moolenaard823fa92016-08-12 16:29:27 +02002486 *v:t_func* *t_func-variable*
Bram Moolenaard09091d2019-01-17 16:07:22 +01002487v:t_func Value of |Funcref| type. Read-only. See: |type()|
Bram Moolenaard823fa92016-08-12 16:29:27 +02002488 *v:t_job* *t_job-variable*
Bram Moolenaard09091d2019-01-17 16:07:22 +01002489v:t_job Value of |Job| type. Read-only. See: |type()|
Bram Moolenaard823fa92016-08-12 16:29:27 +02002490 *v:t_list* *t_list-variable*
Bram Moolenaard09091d2019-01-17 16:07:22 +01002491v:t_list Value of |List| type. Read-only. See: |type()|
Bram Moolenaard823fa92016-08-12 16:29:27 +02002492 *v:t_none* *t_none-variable*
Bram Moolenaard09091d2019-01-17 16:07:22 +01002493v:t_none Value of |None| type. Read-only. See: |type()|
Bram Moolenaard823fa92016-08-12 16:29:27 +02002494 *v:t_number* *t_number-variable*
Bram Moolenaard09091d2019-01-17 16:07:22 +01002495v:t_number Value of |Number| type. Read-only. See: |type()|
Bram Moolenaard823fa92016-08-12 16:29:27 +02002496 *v:t_string* *t_string-variable*
Bram Moolenaard09091d2019-01-17 16:07:22 +01002497v:t_string Value of |String| type. Read-only. See: |type()|
Bram Moolenaar6e5ea8d2019-01-12 22:47:31 +01002498 *v:t_blob* *t_blob-variable*
Bram Moolenaard09091d2019-01-17 16:07:22 +01002499v:t_blob Value of |Blob| type. Read-only. See: |type()|
Bram Moolenaarf562e722016-07-19 17:25:25 +02002500
Bram Moolenaar071d4272004-06-13 20:20:40 +00002501 *v:termresponse* *termresponse-variable*
2502v:termresponse The escape sequence returned by the terminal for the |t_RV|
Bram Moolenaar58b85342016-08-14 19:54:54 +02002503 termcap entry. It is set when Vim receives an escape sequence
Bram Moolenaarb4230122019-05-30 18:40:53 +02002504 that starts with ESC [ or CSI, then '>' or '?' and ends in a
2505 'c', with only digits and ';' in between.
Bram Moolenaar071d4272004-06-13 20:20:40 +00002506 When this option is set, the TermResponse autocommand event is
2507 fired, so that you can react to the response from the
Bram Moolenaar0c0eddd2020-06-13 15:47:25 +02002508 terminal. You can use |terminalprops()| to see what Vim
2509 figured out about the terminal.
Bram Moolenaarb4230122019-05-30 18:40:53 +02002510 The response from a new xterm is: "<Esc>[> Pp ; Pv ; Pc c". Pp
Bram Moolenaar071d4272004-06-13 20:20:40 +00002511 is the terminal type: 0 for vt100 and 1 for vt220. Pv is the
2512 patch level (since this was introduced in patch 95, it's
Bram Moolenaarfa3b7232021-12-24 13:18:38 +00002513 always 95 or higher). Pc is always zero.
2514 If Pv is 141 or higher then Vim will try to request terminal
2515 codes. This only works with xterm |xterm-codes|.
Bram Moolenaar071d4272004-06-13 20:20:40 +00002516 {only when compiled with |+termresponse| feature}
2517
Bram Moolenaarf3af54e2017-08-30 14:53:06 +02002518 *v:termblinkresp*
2519v:termblinkresp The escape sequence returned by the terminal for the |t_RC|
2520 termcap entry. This is used to find out whether the terminal
2521 cursor is blinking. This is used by |term_getcursor()|.
2522
2523 *v:termstyleresp*
2524v:termstyleresp The escape sequence returned by the terminal for the |t_RS|
2525 termcap entry. This is used to find out what the shape of the
2526 cursor is. This is used by |term_getcursor()|.
2527
Bram Moolenaar65e4c4f2017-10-14 23:24:25 +02002528 *v:termrbgresp*
2529v:termrbgresp The escape sequence returned by the terminal for the |t_RB|
Bram Moolenaarf3af54e2017-08-30 14:53:06 +02002530 termcap entry. This is used to find out what the terminal
2531 background color is, see 'background'.
2532
Bram Moolenaar65e4c4f2017-10-14 23:24:25 +02002533 *v:termrfgresp*
2534v:termrfgresp The escape sequence returned by the terminal for the |t_RF|
2535 termcap entry. This is used to find out what the terminal
2536 foreground color is.
2537
Bram Moolenaarf3af54e2017-08-30 14:53:06 +02002538 *v:termu7resp*
2539v:termu7resp The escape sequence returned by the terminal for the |t_u7|
2540 termcap entry. This is used to find out what the terminal
2541 does with ambiguous width characters, see 'ambiwidth'.
2542
Bram Moolenaarebf7dfa2016-04-14 12:46:51 +02002543 *v:testing* *testing-variable*
Bram Moolenaar8e8df252016-05-25 21:23:21 +02002544v:testing Must be set before using `test_garbagecollect_now()`.
Bram Moolenaar036986f2017-03-16 17:41:02 +01002545 Also, when set certain error messages won't be shown for 2
Bram Moolenaarb0d45e72017-11-05 18:19:24 +01002546 seconds. (e.g. "'dictionary' option is empty")
Bram Moolenaarebf7dfa2016-04-14 12:46:51 +02002547
Bram Moolenaar071d4272004-06-13 20:20:40 +00002548 *v:this_session* *this_session-variable*
2549v:this_session Full filename of the last loaded or saved session file. See
2550 |:mksession|. It is allowed to set this variable. When no
2551 session file has been saved, this variable is empty.
Bram Moolenaard2e716e2019-04-20 14:39:52 +02002552 "this_session" also works, for backwards compatibility, unless
2553 |scriptversion| is 3 or higher
Bram Moolenaar071d4272004-06-13 20:20:40 +00002554
2555 *v:throwpoint* *throwpoint-variable*
2556v:throwpoint The point where the exception most recently caught and not
Bram Moolenaar58b85342016-08-14 19:54:54 +02002557 finished was thrown. Not set when commands are typed. See
Bram Moolenaar071d4272004-06-13 20:20:40 +00002558 also |v:exception| and |throw-variables|.
2559 Example: >
2560 :try
2561 : throw "oops"
2562 :catch /.*/
2563 : echo "Exception from" v:throwpoint
2564 :endtry
2565< Output: "Exception from test.vim, line 2"
2566
Bram Moolenaar520e1e42016-01-23 19:46:28 +01002567 *v:true* *true-variable*
2568v:true A Number with value one. Used to put "true" in JSON. See
Bram Moolenaar6463ca22016-02-13 17:04:46 +01002569 |json_encode()|.
Bram Moolenaarc95a3022016-06-12 23:01:46 +02002570 When used as a string this evaluates to "v:true". >
Bram Moolenaar705ada12016-01-24 17:56:50 +01002571 echo v:true
Bram Moolenaarc95a3022016-06-12 23:01:46 +02002572< v:true ~
2573 That is so that eval() can parse the string back to the same
Bram Moolenaardf48fb42016-07-22 21:50:18 +02002574 value. Read-only.
Bram Moolenaar5da36052021-12-27 15:39:57 +00002575 In |Vim9| script "true" can be used which has a boolean type.
Bram Moolenaar2fda12f2005-01-15 22:14:15 +00002576 *v:val* *val-variable*
Bram Moolenaar58b85342016-08-14 19:54:54 +02002577v:val Value of the current item of a |List| or |Dictionary|. Only
Bram Moolenaar32466aa2006-02-24 23:53:04 +00002578 valid while evaluating the expression used with |map()| and
Bram Moolenaar2fda12f2005-01-15 22:14:15 +00002579 |filter()|. Read-only.
2580
Bram Moolenaar071d4272004-06-13 20:20:40 +00002581 *v:version* *version-variable*
2582v:version Version number of Vim: Major version number times 100 plus
Bram Moolenaar9b283522019-06-17 22:19:33 +02002583 minor version number. Version 5.0 is 500. Version 5.1
Bram Moolenaar071d4272004-06-13 20:20:40 +00002584 is 501. Read-only. "version" also works, for backwards
Bram Moolenaard2e716e2019-04-20 14:39:52 +02002585 compatibility, unless |scriptversion| is 3 or higher.
Bram Moolenaar071d4272004-06-13 20:20:40 +00002586 Use |has()| to check if a certain patch was included, e.g.: >
Bram Moolenaar6716d9a2014-04-02 12:12:08 +02002587 if has("patch-7.4.123")
Bram Moolenaar071d4272004-06-13 20:20:40 +00002588< Note that patch numbers are specific to the version, thus both
2589 version 5.0 and 5.1 may have a patch 123, but these are
2590 completely different.
2591
Bram Moolenaar37df9a42019-06-14 14:39:51 +02002592 *v:versionlong* *versionlong-variable*
Bram Moolenaar9b283522019-06-17 22:19:33 +02002593v:versionlong Like v:version, but also including the patchlevel in the last
2594 four digits. Version 8.1 with patch 123 has value 8010123.
2595 This can be used like this: >
2596 if v:versionlong >= 8010123
Bram Moolenaar37df9a42019-06-14 14:39:51 +02002597< However, if there are gaps in the list of patches included
2598 this will not work well. This can happen if a recent patch
2599 was included into an older version, e.g. for a security fix.
2600 Use the has() function to make sure the patch is actually
2601 included.
2602
Bram Moolenaar14735512016-03-26 21:00:08 +01002603 *v:vim_did_enter* *vim_did_enter-variable*
2604v:vim_did_enter Zero until most of startup is done. It is set to one just
2605 before |VimEnter| autocommands are triggered.
2606
Bram Moolenaar071d4272004-06-13 20:20:40 +00002607 *v:warningmsg* *warningmsg-variable*
2608v:warningmsg Last given warning message. It's allowed to set this variable.
2609
Bram Moolenaar727c8762010-10-20 19:17:48 +02002610 *v:windowid* *windowid-variable*
2611v:windowid When any X11 based GUI is running or when running in a
2612 terminal and Vim connects to the X server (|-X|) this will be
Bram Moolenaar264e9fd2010-10-27 12:33:17 +02002613 set to the window ID.
2614 When an MS-Windows GUI is running this will be set to the
2615 window handle.
2616 Otherwise the value is zero.
Bram Moolenaar7571d552016-08-18 22:54:46 +02002617 Note: for windows inside Vim use |winnr()| or |win_getid()|,
2618 see |window-ID|.
Bram Moolenaar727c8762010-10-20 19:17:48 +02002619
Bram Moolenaar071d4272004-06-13 20:20:40 +00002620==============================================================================
26214. Builtin Functions *functions*
2622
2623See |function-list| for a list grouped by what the function is used for.
2624
Bram Moolenaar1cae5a02021-12-27 21:28:34 +00002625The alphabetic list of all builtin functions and details are in a separate
2626help file: |builtin-functions|.
Bram Moolenaar071d4272004-06-13 20:20:40 +00002627
2628==============================================================================
26295. Defining functions *user-functions*
2630
2631New functions can be defined. These can be called just like builtin
2632functions. The function executes a sequence of Ex commands. Normal mode
2633commands can be executed with the |:normal| command.
2634
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01002635This section is about the legacy functions. For the Vim9 functions, which
2636execute much faster, support type checking and more, see |vim9.txt|.
2637
Bram Moolenaar071d4272004-06-13 20:20:40 +00002638The function name must start with an uppercase letter, to avoid confusion with
2639builtin functions. To prevent from using the same name in different scripts
2640avoid obvious, short names. A good habit is to start the function name with
2641the name of the script, e.g., "HTMLcolor()".
2642
Bram Moolenaar5da36052021-12-27 15:39:57 +00002643In legacy script it is also possible to use curly braces, see
2644|curly-braces-names|.
2645The |autoload| facility is useful to define a function only when it's called.
Bram Moolenaar071d4272004-06-13 20:20:40 +00002646
2647 *local-function*
Bram Moolenaar5da36052021-12-27 15:39:57 +00002648A function local to a legacy script must start with "s:". A local script
2649function can only be called from within the script and from functions, user
2650commands and autocommands defined in the script. It is also possible to call
2651the function from a mapping defined in the script, but then |<SID>| must be
2652used instead of "s:" when the mapping is expanded outside of the script.
Bram Moolenaarbcb98982014-05-01 14:08:19 +02002653There are only script-local functions, no buffer-local or window-local
2654functions.
Bram Moolenaar071d4272004-06-13 20:20:40 +00002655
Bram Moolenaar5da36052021-12-27 15:39:57 +00002656In |Vim9| script functions are local to the script by default, prefix "g:" to
2657define a global function.
2658
Bram Moolenaar2f0936c2022-01-08 21:51:59 +00002659 *:fu* *:function* *E128* *E129* *E123* *E454*
Bram Moolenaar071d4272004-06-13 20:20:40 +00002660:fu[nction] List all functions and their arguments.
2661
2662:fu[nction] {name} List function {name}.
Bram Moolenaar32466aa2006-02-24 23:53:04 +00002663 {name} can also be a |Dictionary| entry that is a
2664 |Funcref|: >
Bram Moolenaar3a3a7232005-01-17 22:16:15 +00002665 :function dict.init
Bram Moolenaar92d640f2005-09-05 22:11:52 +00002666
2667:fu[nction] /{pattern} List functions with a name matching {pattern}.
2668 Example that lists all functions ending with "File": >
2669 :function /File$
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002670<
2671 *:function-verbose*
2672When 'verbose' is non-zero, listing a function will also display where it was
2673last defined. Example: >
2674
2675 :verbose function SetFileTypeSH
2676 function SetFileTypeSH(name)
2677 Last set from /usr/share/vim/vim-7.0/filetype.vim
2678<
Bram Moolenaar8aff23a2005-08-19 20:40:30 +00002679See |:verbose-cmd| for more information.
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +00002680
Bram Moolenaarbcb98982014-05-01 14:08:19 +02002681 *E124* *E125* *E853* *E884*
Bram Moolenaar10ce39a2016-07-29 22:37:06 +02002682:fu[nction][!] {name}([arguments]) [range] [abort] [dict] [closure]
Bram Moolenaar01164a62017-11-02 22:58:42 +01002683 Define a new function by the name {name}. The body of
2684 the function follows in the next lines, until the
2685 matching |:endfunction|.
Bram Moolenaar2ecbe532022-07-29 21:36:21 +01002686 *E1267*
Bram Moolenaar01164a62017-11-02 22:58:42 +01002687 The name must be made of alphanumeric characters and
2688 '_', and must start with a capital or "s:" (see
2689 above). Note that using "b:" or "g:" is not allowed.
2690 (since patch 7.4.260 E884 is given if the function
2691 name has a colon in the name, e.g. for "foo:bar()".
2692 Before that patch no error was given).
Bram Moolenaar3a3a7232005-01-17 22:16:15 +00002693
Bram Moolenaar32466aa2006-02-24 23:53:04 +00002694 {name} can also be a |Dictionary| entry that is a
2695 |Funcref|: >
Bram Moolenaar3a3a7232005-01-17 22:16:15 +00002696 :function dict.init(arg)
Bram Moolenaar58b85342016-08-14 19:54:54 +02002697< "dict" must be an existing dictionary. The entry
Bram Moolenaar3a3a7232005-01-17 22:16:15 +00002698 "init" is added if it didn't exist yet. Otherwise [!]
Bram Moolenaar58b85342016-08-14 19:54:54 +02002699 is required to overwrite an existing function. The
Bram Moolenaar3a3a7232005-01-17 22:16:15 +00002700 result is a |Funcref| to a numbered function. The
2701 function can only be used with a |Funcref| and will be
2702 deleted if there are no more references to it.
Bram Moolenaar071d4272004-06-13 20:20:40 +00002703 *E127* *E122*
2704 When a function by this name already exists and [!] is
Bram Moolenaarded5f1b2018-11-10 17:33:29 +01002705 not used an error message is given. There is one
2706 exception: When sourcing a script again, a function
2707 that was previously defined in that script will be
2708 silently replaced.
2709 When [!] is used, an existing function is silently
2710 replaced. Unless it is currently being executed, that
2711 is an error.
Bram Moolenaarf8be4612017-06-23 20:52:40 +02002712 NOTE: Use ! wisely. If used without care it can cause
2713 an existing function to be replaced unexpectedly,
2714 which is hard to debug.
Bram Moolenaar388a5d42020-05-26 21:20:45 +02002715 NOTE: In Vim9 script script-local functions cannot be
2716 deleted or redefined.
Bram Moolenaar8f999f12005-01-25 22:12:55 +00002717
2718 For the {arguments} see |function-argument|.
2719
Bram Moolenaar8d043172014-01-23 14:24:41 +01002720 *:func-range* *a:firstline* *a:lastline*
Bram Moolenaar071d4272004-06-13 20:20:40 +00002721 When the [range] argument is added, the function is
2722 expected to take care of a range itself. The range is
2723 passed as "a:firstline" and "a:lastline". If [range]
2724 is excluded, ":{range}call" will call the function for
2725 each line in the range, with the cursor on the start
2726 of each line. See |function-range-example|.
Bram Moolenaar2df58b42012-11-28 18:21:11 +01002727 The cursor is still moved to the first line of the
2728 range, as is the case with all Ex commands.
Bram Moolenaar8d043172014-01-23 14:24:41 +01002729 *:func-abort*
Bram Moolenaar071d4272004-06-13 20:20:40 +00002730 When the [abort] argument is added, the function will
2731 abort as soon as an error is detected.
Bram Moolenaar8d043172014-01-23 14:24:41 +01002732 *:func-dict*
Bram Moolenaar2fda12f2005-01-15 22:14:15 +00002733 When the [dict] argument is added, the function must
Bram Moolenaar58b85342016-08-14 19:54:54 +02002734 be invoked through an entry in a |Dictionary|. The
Bram Moolenaar2fda12f2005-01-15 22:14:15 +00002735 local variable "self" will then be set to the
2736 dictionary. See |Dictionary-function|.
Bram Moolenaar10ce39a2016-07-29 22:37:06 +02002737 *:func-closure* *E932*
2738 When the [closure] argument is added, the function
2739 can access variables and arguments from the outer
2740 scope. This is usually called a closure. In this
2741 example Bar() uses "x" from the scope of Foo(). It
2742 remains referenced even after Foo() returns: >
2743 :function! Foo()
2744 : let x = 0
2745 : function! Bar() closure
2746 : let x += 1
2747 : return x
2748 : endfunction
Bram Moolenaarbc8801c2016-08-02 21:04:33 +02002749 : return funcref('Bar')
Bram Moolenaar10ce39a2016-07-29 22:37:06 +02002750 :endfunction
2751
2752 :let F = Foo()
2753 :echo F()
2754< 1 >
2755 :echo F()
2756< 2 >
2757 :echo F()
2758< 3
Bram Moolenaar071d4272004-06-13 20:20:40 +00002759
Bram Moolenaar446cb832008-06-24 21:56:24 +00002760 *function-search-undo*
Bram Moolenaar98692072006-02-04 00:57:42 +00002761 The last used search pattern and the redo command "."
Bram Moolenaar446cb832008-06-24 21:56:24 +00002762 will not be changed by the function. This also
2763 implies that the effect of |:nohlsearch| is undone
2764 when the function returns.
Bram Moolenaar98692072006-02-04 00:57:42 +00002765
Bram Moolenaara2baa732022-02-04 16:09:54 +00002766 *:endf* *:endfunction* *E126* *E193* *W22* *E1151*
Bram Moolenaar663bb232017-06-22 19:12:10 +02002767:endf[unction] [argument]
2768 The end of a function definition. Best is to put it
2769 on a line by its own, without [argument].
2770
2771 [argument] can be:
2772 | command command to execute next
2773 \n command command to execute next
2774 " comment always ignored
Bram Moolenaarf8be4612017-06-23 20:52:40 +02002775 anything else ignored, warning given when
2776 'verbose' is non-zero
Bram Moolenaar663bb232017-06-22 19:12:10 +02002777 The support for a following command was added in Vim
2778 8.0.0654, before that any argument was silently
2779 ignored.
Bram Moolenaar071d4272004-06-13 20:20:40 +00002780
Bram Moolenaarf8be4612017-06-23 20:52:40 +02002781 To be able to define a function inside an `:execute`
2782 command, use line breaks instead of |:bar|: >
2783 :exe "func Foo()\necho 'foo'\nendfunc"
2784<
Bram Moolenaarf10911e2022-01-29 22:20:48 +00002785 *:delf* *:delfunction* *E131* *E933* *E1084*
Bram Moolenaar663bb232017-06-22 19:12:10 +02002786:delf[unction][!] {name}
2787 Delete function {name}.
Bram Moolenaar32466aa2006-02-24 23:53:04 +00002788 {name} can also be a |Dictionary| entry that is a
2789 |Funcref|: >
Bram Moolenaar3a3a7232005-01-17 22:16:15 +00002790 :delfunc dict.init
Bram Moolenaar58b85342016-08-14 19:54:54 +02002791< This will remove the "init" entry from "dict". The
Bram Moolenaar3a3a7232005-01-17 22:16:15 +00002792 function is deleted if there are no more references to
2793 it.
Bram Moolenaar663bb232017-06-22 19:12:10 +02002794 With the ! there is no error if the function does not
2795 exist.
Bram Moolenaar071d4272004-06-13 20:20:40 +00002796 *:retu* *:return* *E133*
2797:retu[rn] [expr] Return from a function. When "[expr]" is given, it is
2798 evaluated and returned as the result of the function.
2799 If "[expr]" is not given, the number 0 is returned.
2800 When a function ends without an explicit ":return",
2801 the number 0 is returned.
Bram Moolenaarf10911e2022-01-29 22:20:48 +00002802 In a :def function *E1095* is given if unreachable
2803 code follows after the `:return`.
2804 In legacy script there is no check for unreachable
2805 lines, thus there is no warning if commands follow
2806 `:return`.
Bram Moolenaar071d4272004-06-13 20:20:40 +00002807
2808 If the ":return" is used after a |:try| but before the
2809 matching |:finally| (if present), the commands
2810 following the ":finally" up to the matching |:endtry|
2811 are executed first. This process applies to all
2812 nested ":try"s inside the function. The function
2813 returns at the outermost ":endtry".
2814
Bram Moolenaar8f999f12005-01-25 22:12:55 +00002815 *function-argument* *a:var*
Bram Moolenaar58b85342016-08-14 19:54:54 +02002816An argument can be defined by giving its name. In the function this can then
Bram Moolenaar8f999f12005-01-25 22:12:55 +00002817be used as "a:name" ("a:" for argument).
Bram Moolenaaref2f6562007-05-06 13:32:59 +00002818 *a:0* *a:1* *a:000* *E740* *...*
Bram Moolenaar8f999f12005-01-25 22:12:55 +00002819Up to 20 arguments can be given, separated by commas. After the named
2820arguments an argument "..." can be specified, which means that more arguments
2821may optionally be following. In the function the extra arguments can be used
2822as "a:1", "a:2", etc. "a:0" is set to the number of extra arguments (which
Bram Moolenaar32466aa2006-02-24 23:53:04 +00002823can be 0). "a:000" is set to a |List| that contains these arguments. Note
2824that "a:1" is the same as "a:000[0]".
Bram Moolenaarf10911e2022-01-29 22:20:48 +00002825 *E742* *E1090*
Bram Moolenaar2ce06f62005-01-31 19:19:04 +00002826The a: scope and the variables in it cannot be changed, they are fixed.
Bram Moolenaar069c1e72016-07-15 21:25:08 +02002827However, if a composite type is used, such as |List| or |Dictionary| , you can
2828change their contents. Thus you can pass a |List| to a function and have the
2829function add an item to it. If you want to make sure the function cannot
2830change a |List| or |Dictionary| use |:lockvar|.
Bram Moolenaar071d4272004-06-13 20:20:40 +00002831
Bram Moolenaar8f999f12005-01-25 22:12:55 +00002832It is also possible to define a function without any arguments. You must
Bram Moolenaar01164a62017-11-02 22:58:42 +01002833still supply the () then.
2834
Bram Moolenaar98ef2332018-03-18 14:44:37 +01002835It is allowed to define another function inside a function body.
Bram Moolenaar8f999f12005-01-25 22:12:55 +00002836
Bram Moolenaar42ae78c2019-05-09 21:08:58 +02002837 *optional-function-argument*
2838You can provide default values for positional named arguments. This makes
2839them optional for function calls. When a positional argument is not
2840specified at a call, the default expression is used to initialize it.
Bram Moolenaard1caa942020-04-10 22:10:56 +02002841This only works for functions declared with `:function` or `:def`, not for
2842lambda expressions |expr-lambda|.
Bram Moolenaar42ae78c2019-05-09 21:08:58 +02002843
2844Example: >
2845 function Something(key, value = 10)
Bram Moolenaar8aad88d2019-05-12 13:53:50 +02002846 echo a:key .. ": " .. a:value
Bram Moolenaar42ae78c2019-05-09 21:08:58 +02002847 endfunction
2848 call Something('empty') "empty: 10"
Bram Moolenaar8aad88d2019-05-12 13:53:50 +02002849 call Something('key', 20) "key: 20"
Bram Moolenaar42ae78c2019-05-09 21:08:58 +02002850
2851The argument default expressions are evaluated at the time of the function
2852call, not definition. Thus it is possible to use an expression which is
Bram Moolenaar68e65602019-05-26 21:33:31 +02002853invalid the moment the function is defined. The expressions are also only
Bram Moolenaar42ae78c2019-05-09 21:08:58 +02002854evaluated when arguments are not specified during a call.
Bram Moolenaar2547aa92020-07-26 17:00:44 +02002855 *none-function_argument*
Bram Moolenaar42ae78c2019-05-09 21:08:58 +02002856You can pass |v:none| to use the default expression. Note that this means you
2857cannot pass v:none as an ordinary value when an argument has a default
2858expression.
2859
2860Example: >
2861 function Something(a = 10, b = 20, c = 30)
2862 endfunction
2863 call Something(1, v:none, 3) " b = 20
2864<
2865 *E989*
2866Optional arguments with default expressions must occur after any mandatory
2867arguments. You can use "..." after all optional named arguments.
2868
2869It is possible for later argument defaults to refer to prior arguments,
2870but not the other way around. They must be prefixed with "a:", as with all
2871arguments.
2872
2873Example that works: >
2874 :function Okay(mandatory, optional = a:mandatory)
2875 :endfunction
2876Example that does NOT work: >
2877 :function NoGood(first = a:second, second = 10)
2878 :endfunction
2879<
Bram Moolenaard1caa942020-04-10 22:10:56 +02002880When not using "...", the number of arguments in a function call must be at
2881least equal to the number of mandatory named arguments. When using "...", the
2882number of arguments may be larger than the total of mandatory and optional
2883arguments.
Bram Moolenaar42ae78c2019-05-09 21:08:58 +02002884
Bram Moolenaar8f999f12005-01-25 22:12:55 +00002885 *local-variables*
Bram Moolenaar069c1e72016-07-15 21:25:08 +02002886Inside a function local variables can be used. These will disappear when the
2887function returns. Global variables need to be accessed with "g:".
Bram Moolenaar071d4272004-06-13 20:20:40 +00002888
2889Example: >
2890 :function Table(title, ...)
2891 : echohl Title
2892 : echo a:title
2893 : echohl None
Bram Moolenaarc51cf032022-02-26 12:25:45 +00002894 : echo a:0 .. " items:"
Bram Moolenaar677ee682005-01-27 14:41:15 +00002895 : for s in a:000
Bram Moolenaarc51cf032022-02-26 12:25:45 +00002896 : echon ' ' .. s
Bram Moolenaar677ee682005-01-27 14:41:15 +00002897 : endfor
Bram Moolenaar071d4272004-06-13 20:20:40 +00002898 :endfunction
2899
2900This function can then be called with: >
Bram Moolenaar677ee682005-01-27 14:41:15 +00002901 call Table("Table", "line1", "line2")
2902 call Table("Empty Table")
Bram Moolenaar071d4272004-06-13 20:20:40 +00002903
Bram Moolenaaref2f6562007-05-06 13:32:59 +00002904To return more than one value, return a |List|: >
2905 :function Compute(n1, n2)
Bram Moolenaar071d4272004-06-13 20:20:40 +00002906 : if a:n2 == 0
Bram Moolenaaref2f6562007-05-06 13:32:59 +00002907 : return ["fail", 0]
Bram Moolenaar071d4272004-06-13 20:20:40 +00002908 : endif
Bram Moolenaaref2f6562007-05-06 13:32:59 +00002909 : return ["ok", a:n1 / a:n2]
Bram Moolenaar071d4272004-06-13 20:20:40 +00002910 :endfunction
2911
2912This function can then be called with: >
Bram Moolenaaref2f6562007-05-06 13:32:59 +00002913 :let [success, div] = Compute(102, 6)
Bram Moolenaar071d4272004-06-13 20:20:40 +00002914 :if success == "ok"
2915 : echo div
2916 :endif
Bram Moolenaaref2f6562007-05-06 13:32:59 +00002917<
Bram Moolenaar6f4754b2022-01-23 12:07:04 +00002918 *:cal* *:call* *E107*
Bram Moolenaar071d4272004-06-13 20:20:40 +00002919:[range]cal[l] {name}([arguments])
2920 Call a function. The name of the function and its arguments
Bram Moolenaar68e65602019-05-26 21:33:31 +02002921 are as specified with `:function`. Up to 20 arguments can be
Bram Moolenaaref2f6562007-05-06 13:32:59 +00002922 used. The returned value is discarded.
Bram Moolenaar5da36052021-12-27 15:39:57 +00002923 In |Vim9| script using `:call` is optional, these two lines do
2924 the same thing: >
2925 call SomeFunc(arg)
2926 SomeFunc(arg)
2927< Without a range and for functions that accept a range, the
Bram Moolenaar071d4272004-06-13 20:20:40 +00002928 function is called once. When a range is given the cursor is
2929 positioned at the start of the first line before executing the
2930 function.
2931 When a range is given and the function doesn't handle it
2932 itself, the function is executed for each line in the range,
2933 with the cursor in the first column of that line. The cursor
2934 is left at the last line (possibly moved by the last function
Bram Moolenaar58b85342016-08-14 19:54:54 +02002935 call). The arguments are re-evaluated for each line. Thus
Bram Moolenaar071d4272004-06-13 20:20:40 +00002936 this works:
2937 *function-range-example* >
2938 :function Mynumber(arg)
Bram Moolenaarc51cf032022-02-26 12:25:45 +00002939 : echo line(".") .. " " .. a:arg
Bram Moolenaar071d4272004-06-13 20:20:40 +00002940 :endfunction
2941 :1,5call Mynumber(getline("."))
2942<
2943 The "a:firstline" and "a:lastline" are defined anyway, they
2944 can be used to do something different at the start or end of
2945 the range.
2946
2947 Example of a function that handles the range itself: >
2948
2949 :function Cont() range
Bram Moolenaarc51cf032022-02-26 12:25:45 +00002950 : execute (a:firstline + 1) .. "," .. a:lastline .. 's/^/\t\\ '
Bram Moolenaar071d4272004-06-13 20:20:40 +00002951 :endfunction
2952 :4,8call Cont()
2953<
2954 This function inserts the continuation character "\" in front
2955 of all the lines in the range, except the first one.
2956
Bram Moolenaaref2f6562007-05-06 13:32:59 +00002957 When the function returns a composite value it can be further
2958 dereferenced, but the range will not be used then. Example: >
2959 :4,8call GetDict().method()
2960< Here GetDict() gets the range but method() does not.
2961
Bram Moolenaar6f4754b2022-01-23 12:07:04 +00002962 *E117*
2963When a function cannot be found the error "E117: Unknown function" will be
2964given. If the function was using an autoload path or an autoload import and
2965the script is a |Vim9| script, this may also be caused by the function not
2966being exported.
2967
Bram Moolenaar071d4272004-06-13 20:20:40 +00002968 *E132*
2969The recursiveness of user functions is restricted with the |'maxfuncdepth'|
2970option.
2971
Bram Moolenaar25e42232019-08-04 15:04:10 +02002972It is also possible to use `:eval`. It does not support a range, but does
2973allow for method chaining, e.g.: >
2974 eval GetList()->Filter()->append('$')
2975
Bram Moolenaar088e8e32019-08-08 22:15:18 +02002976A function can also be called as part of evaluating an expression or when it
2977is used as a method: >
2978 let x = GetList()
2979 let y = GetList()->Filter()
2980
Bram Moolenaar7c626922005-02-07 22:01:03 +00002981
2982AUTOMATICALLY LOADING FUNCTIONS ~
Bram Moolenaar071d4272004-06-13 20:20:40 +00002983 *autoload-functions*
2984When using many or large functions, it's possible to automatically define them
Bram Moolenaar7c626922005-02-07 22:01:03 +00002985only when they are used. There are two methods: with an autocommand and with
2986the "autoload" directory in 'runtimepath'.
2987
2988
2989Using an autocommand ~
2990
Bram Moolenaar30ab04e2022-05-14 13:33:50 +01002991This is introduced in the user manual, section |51.4|.
Bram Moolenaar05159a02005-02-26 23:04:13 +00002992
Bram Moolenaar7c626922005-02-07 22:01:03 +00002993The autocommand is useful if you have a plugin that is a long Vim script file.
Bram Moolenaar68e65602019-05-26 21:33:31 +02002994You can define the autocommand and quickly quit the script with `:finish`.
Bram Moolenaar58b85342016-08-14 19:54:54 +02002995That makes Vim startup faster. The autocommand should then load the same file
Bram Moolenaar68e65602019-05-26 21:33:31 +02002996again, setting a variable to skip the `:finish` command.
Bram Moolenaar7c626922005-02-07 22:01:03 +00002997
2998Use the FuncUndefined autocommand event with a pattern that matches the
2999function(s) to be defined. Example: >
Bram Moolenaar071d4272004-06-13 20:20:40 +00003000
3001 :au FuncUndefined BufNet* source ~/vim/bufnetfuncs.vim
3002
3003The file "~/vim/bufnetfuncs.vim" should then define functions that start with
3004"BufNet". Also see |FuncUndefined|.
3005
Bram Moolenaar7c626922005-02-07 22:01:03 +00003006
3007Using an autoload script ~
Bram Moolenaar26a60b42005-02-22 08:49:11 +00003008 *autoload* *E746*
Bram Moolenaarcfa8f9a2022-06-03 21:59:47 +01003009This is introduced in the user manual, section |52.2|.
Bram Moolenaar05159a02005-02-26 23:04:13 +00003010
Bram Moolenaar7c626922005-02-07 22:01:03 +00003011Using a script in the "autoload" directory is simpler, but requires using
3012exactly the right file name. A function that can be autoloaded has a name
3013like this: >
3014
Bram Moolenaara7fc0102005-05-18 22:17:12 +00003015 :call filename#funcname()
Bram Moolenaar7c626922005-02-07 22:01:03 +00003016
Bram Moolenaar65e0d772020-06-14 17:29:55 +02003017These functions are always global, in Vim9 script "g:" needs to be used: >
3018 :call g:filename#funcname()
3019
Bram Moolenaar7c626922005-02-07 22:01:03 +00003020When such a function is called, and it is not defined yet, Vim will search the
3021"autoload" directories in 'runtimepath' for a script file called
3022"filename.vim". For example "~/.vim/autoload/filename.vim". That file should
3023then define the function like this: >
3024
Bram Moolenaara7fc0102005-05-18 22:17:12 +00003025 function filename#funcname()
Bram Moolenaar7c626922005-02-07 22:01:03 +00003026 echo "Done!"
3027 endfunction
3028
Bram Moolenaar60a795a2005-09-16 21:55:43 +00003029The file name and the name used before the # in the function must match
Bram Moolenaar7c626922005-02-07 22:01:03 +00003030exactly, and the defined function must have the name exactly as it will be
Bram Moolenaar65e0d772020-06-14 17:29:55 +02003031called. In Vim9 script the "g:" prefix must be used: >
3032 function g:filename#funcname()
3033
3034or for a compiled function: >
3035 def g:filename#funcname()
Bram Moolenaar7c626922005-02-07 22:01:03 +00003036
Bram Moolenaara7fc0102005-05-18 22:17:12 +00003037It is possible to use subdirectories. Every # in the function name works like
3038a path separator. Thus when calling a function: >
Bram Moolenaar7c626922005-02-07 22:01:03 +00003039
Bram Moolenaara7fc0102005-05-18 22:17:12 +00003040 :call foo#bar#func()
Bram Moolenaar7c626922005-02-07 22:01:03 +00003041
3042Vim will look for the file "autoload/foo/bar.vim" in 'runtimepath'.
3043
Bram Moolenaar26a60b42005-02-22 08:49:11 +00003044This also works when reading a variable that has not been set yet: >
3045
Bram Moolenaara7fc0102005-05-18 22:17:12 +00003046 :let l = foo#bar#lvar
Bram Moolenaar26a60b42005-02-22 08:49:11 +00003047
Bram Moolenaara5792f52005-11-23 21:25:05 +00003048However, when the autoload script was already loaded it won't be loaded again
3049for an unknown variable.
3050
Bram Moolenaar26a60b42005-02-22 08:49:11 +00003051When assigning a value to such a variable nothing special happens. This can
3052be used to pass settings to the autoload script before it's loaded: >
3053
Bram Moolenaara7fc0102005-05-18 22:17:12 +00003054 :let foo#bar#toggle = 1
3055 :call foo#bar#func()
Bram Moolenaar26a60b42005-02-22 08:49:11 +00003056
Bram Moolenaar4399ef42005-02-12 14:29:27 +00003057Note that when you make a mistake and call a function that is supposed to be
3058defined in an autoload script, but the script doesn't actually define the
Bram Moolenaarcb80aa22020-10-26 21:12:46 +01003059function, you will get an error message for the missing function. If you fix
3060the autoload script it won't be automatically loaded again. Either restart
3061Vim or manually source the script.
Bram Moolenaar26a60b42005-02-22 08:49:11 +00003062
3063Also note that if you have two script files, and one calls a function in the
Bram Moolenaar446cb832008-06-24 21:56:24 +00003064other and vice versa, before the used function is defined, it won't work.
Bram Moolenaar26a60b42005-02-22 08:49:11 +00003065Avoid using the autoload functionality at the toplevel.
Bram Moolenaar7c626922005-02-07 22:01:03 +00003066
Bram Moolenaar944697a2022-02-20 19:48:20 +00003067In |Vim9| script you will get error *E1263* if you define a function with
3068a "#" character in the name. You should use a name without "#" and use
3069`:export`.
Bram Moolenaar6f4754b2022-01-23 12:07:04 +00003070
Bram Moolenaar433f7c82006-03-21 21:29:36 +00003071Hint: If you distribute a bunch of scripts you can pack them together with the
3072|vimball| utility. Also read the user manual |distribute-script|.
3073
Bram Moolenaar071d4272004-06-13 20:20:40 +00003074==============================================================================
30756. Curly braces names *curly-braces-names*
3076
Bram Moolenaar84f72352012-03-11 15:57:40 +01003077In most places where you can use a variable, you can use a "curly braces name"
3078variable. This is a regular variable name with one or more expressions
3079wrapped in braces {} like this: >
Bram Moolenaar071d4272004-06-13 20:20:40 +00003080 my_{adjective}_variable
3081
Bram Moolenaar5da36052021-12-27 15:39:57 +00003082This only works in legacy Vim script, not in |Vim9| script.
3083
Bram Moolenaar071d4272004-06-13 20:20:40 +00003084When Vim encounters this, it evaluates the expression inside the braces, puts
3085that in place of the expression, and re-interprets the whole as a variable
3086name. So in the above example, if the variable "adjective" was set to
3087"noisy", then the reference would be to "my_noisy_variable", whereas if
3088"adjective" was set to "quiet", then it would be to "my_quiet_variable".
3089
3090One application for this is to create a set of variables governed by an option
Bram Moolenaar58b85342016-08-14 19:54:54 +02003091value. For example, the statement >
Bram Moolenaar071d4272004-06-13 20:20:40 +00003092 echo my_{&background}_message
3093
3094would output the contents of "my_dark_message" or "my_light_message" depending
3095on the current value of 'background'.
3096
3097You can use multiple brace pairs: >
3098 echo my_{adverb}_{adjective}_message
3099..or even nest them: >
3100 echo my_{ad{end_of_word}}_message
3101where "end_of_word" is either "verb" or "jective".
3102
3103However, the expression inside the braces must evaluate to a valid single
Bram Moolenaar402d2fe2005-04-15 21:00:38 +00003104variable name, e.g. this is invalid: >
Bram Moolenaar071d4272004-06-13 20:20:40 +00003105 :let foo='a + b'
3106 :echo c{foo}d
3107.. since the result of expansion is "ca + bd", which is not a variable name.
3108
3109 *curly-braces-function-names*
3110You can call and define functions by an evaluated name in a similar way.
3111Example: >
3112 :let func_end='whizz'
3113 :call my_func_{func_end}(parameter)
3114
3115This would call the function "my_func_whizz(parameter)".
3116
Bram Moolenaar84f72352012-03-11 15:57:40 +01003117This does NOT work: >
3118 :let i = 3
3119 :let @{i} = '' " error
3120 :echo @{i} " error
3121
Bram Moolenaar071d4272004-06-13 20:20:40 +00003122==============================================================================
31237. Commands *expression-commands*
3124
Bram Moolenaar5da36052021-12-27 15:39:57 +00003125Note: in |Vim9| script `:let` is not used. `:var` is used for variable
3126declarations and assignments do not use a command. |vim9-declaration|
Bram Moolenaar65e0d772020-06-14 17:29:55 +02003127
Bram Moolenaar071d4272004-06-13 20:20:40 +00003128:let {var-name} = {expr1} *:let* *E18*
3129 Set internal variable {var-name} to the result of the
3130 expression {expr1}. The variable will get the type
3131 from the {expr}. If {var-name} didn't exist yet, it
3132 is created.
3133
Bram Moolenaarf10911e2022-01-29 22:20:48 +00003134:let {var-name}[{idx}] = {expr1} *E689* *E1141*
Bram Moolenaar13065c42005-01-08 16:08:21 +00003135 Set a list item to the result of the expression
3136 {expr1}. {var-name} must refer to a list and {idx}
3137 must be a valid index in that list. For nested list
3138 the index can be repeated.
Bram Moolenaar446cb832008-06-24 21:56:24 +00003139 This cannot be used to add an item to a |List|.
Bram Moolenaar58b85342016-08-14 19:54:54 +02003140 This cannot be used to set a byte in a String. You
Bram Moolenaar446cb832008-06-24 21:56:24 +00003141 can do that like this: >
Bram Moolenaarc51cf032022-02-26 12:25:45 +00003142 :let var = var[0:2] .. 'X' .. var[4:]
Bram Moolenaar6e5ea8d2019-01-12 22:47:31 +01003143< When {var-name} is a |Blob| then {idx} can be the
3144 length of the blob, in which case one byte is
3145 appended.
3146
Bram Moolenaara2baa732022-02-04 16:09:54 +00003147 *E711* *E719* *E1165* *E1166* *E1183*
Bram Moolenaar3a3a7232005-01-17 22:16:15 +00003148:let {var-name}[{idx1}:{idx2}] = {expr1} *E708* *E709* *E710*
Bram Moolenaar32466aa2006-02-24 23:53:04 +00003149 Set a sequence of items in a |List| to the result of
3150 the expression {expr1}, which must be a list with the
Bram Moolenaar9588a0f2005-01-08 21:45:39 +00003151 correct number of items.
3152 {idx1} can be omitted, zero is used instead.
3153 {idx2} can be omitted, meaning the end of the list.
3154 When the selected range of items is partly past the
3155 end of the list, items will be added.
3156
Bram Moolenaar6f4754b2022-01-23 12:07:04 +00003157 *:let+=* *:let-=* *:letstar=* *:let/=* *:let%=*
3158 *:let.=* *:let..=* *E734* *E985* *E1019*
Bram Moolenaar3a3a7232005-01-17 22:16:15 +00003159:let {var} += {expr1} Like ":let {var} = {var} + {expr1}".
3160:let {var} -= {expr1} Like ":let {var} = {var} - {expr1}".
Bram Moolenaarff697e62019-02-12 22:28:33 +01003161:let {var} *= {expr1} Like ":let {var} = {var} * {expr1}".
3162:let {var} /= {expr1} Like ":let {var} = {var} / {expr1}".
3163:let {var} %= {expr1} Like ":let {var} = {var} % {expr1}".
Bram Moolenaar3a3a7232005-01-17 22:16:15 +00003164:let {var} .= {expr1} Like ":let {var} = {var} . {expr1}".
Bram Moolenaar558ca4a2019-04-04 18:15:38 +02003165:let {var} ..= {expr1} Like ":let {var} = {var} .. {expr1}".
Bram Moolenaar3a3a7232005-01-17 22:16:15 +00003166 These fail if {var} was not set yet and when the type
3167 of {var} and {expr1} don't fit the operator.
Bram Moolenaar558ca4a2019-04-04 18:15:38 +02003168 `.=` is not supported with Vim script version 2 and
3169 later, see |vimscript-version|.
Bram Moolenaar3a3a7232005-01-17 22:16:15 +00003170
3171
Bram Moolenaar071d4272004-06-13 20:20:40 +00003172:let ${env-name} = {expr1} *:let-environment* *:let-$*
3173 Set environment variable {env-name} to the result of
3174 the expression {expr1}. The type is always String.
Bram Moolenaar56c860c2019-08-17 20:09:31 +02003175
3176 On some systems making an environment variable empty
3177 causes it to be deleted. Many systems do not make a
3178 difference between an environment variable that is not
3179 set and an environment variable that is empty.
3180
Bram Moolenaar3a3a7232005-01-17 22:16:15 +00003181:let ${env-name} .= {expr1}
3182 Append {expr1} to the environment variable {env-name}.
3183 If the environment variable didn't exist yet this
3184 works like "=".
Bram Moolenaar071d4272004-06-13 20:20:40 +00003185
3186:let @{reg-name} = {expr1} *:let-register* *:let-@*
3187 Write the result of the expression {expr1} in register
3188 {reg-name}. {reg-name} must be a single letter, and
3189 must be the name of a writable register (see
3190 |registers|). "@@" can be used for the unnamed
3191 register, "@/" for the search pattern.
3192 If the result of {expr1} ends in a <CR> or <NL>, the
3193 register will be linewise, otherwise it will be set to
3194 characterwise.
3195 This can be used to clear the last search pattern: >
3196 :let @/ = ""
3197< This is different from searching for an empty string,
3198 that would match everywhere.
3199
Bram Moolenaar3a3a7232005-01-17 22:16:15 +00003200:let @{reg-name} .= {expr1}
Bram Moolenaar58b85342016-08-14 19:54:54 +02003201 Append {expr1} to register {reg-name}. If the
Bram Moolenaar3a3a7232005-01-17 22:16:15 +00003202 register was empty it's like setting it to {expr1}.
3203
Bram Moolenaaref2f6562007-05-06 13:32:59 +00003204:let &{option-name} = {expr1} *:let-option* *:let-&*
Bram Moolenaar071d4272004-06-13 20:20:40 +00003205 Set option {option-name} to the result of the
Bram Moolenaarfca34d62005-01-04 21:38:36 +00003206 expression {expr1}. A String or Number value is
3207 always converted to the type of the option.
Bram Moolenaar071d4272004-06-13 20:20:40 +00003208 For an option local to a window or buffer the effect
3209 is just like using the |:set| command: both the local
Bram Moolenaara5fac542005-10-12 20:58:49 +00003210 value and the global value are changed.
Bram Moolenaarfca34d62005-01-04 21:38:36 +00003211 Example: >
Bram Moolenaarc51cf032022-02-26 12:25:45 +00003212 :let &path = &path .. ',/usr/local/include'
Bram Moolenaar3df01732017-02-17 22:47:16 +01003213< This also works for terminal codes in the form t_xx.
3214 But only for alphanumerical names. Example: >
3215 :let &t_k1 = "\<Esc>[234;"
3216< When the code does not exist yet it will be created as
3217 a terminal key code, there is no error.
Bram Moolenaar071d4272004-06-13 20:20:40 +00003218
Bram Moolenaar3a3a7232005-01-17 22:16:15 +00003219:let &{option-name} .= {expr1}
3220 For a string option: Append {expr1} to the value.
3221 Does not insert a comma like |:set+=|.
3222
3223:let &{option-name} += {expr1}
3224:let &{option-name} -= {expr1}
3225 For a number or boolean option: Add or subtract
3226 {expr1}.
3227
Bram Moolenaar071d4272004-06-13 20:20:40 +00003228:let &l:{option-name} = {expr1}
Bram Moolenaar3a3a7232005-01-17 22:16:15 +00003229:let &l:{option-name} .= {expr1}
3230:let &l:{option-name} += {expr1}
3231:let &l:{option-name} -= {expr1}
Bram Moolenaar071d4272004-06-13 20:20:40 +00003232 Like above, but only set the local value of an option
3233 (if there is one). Works like |:setlocal|.
3234
3235:let &g:{option-name} = {expr1}
Bram Moolenaar3a3a7232005-01-17 22:16:15 +00003236:let &g:{option-name} .= {expr1}
3237:let &g:{option-name} += {expr1}
3238:let &g:{option-name} -= {expr1}
Bram Moolenaar071d4272004-06-13 20:20:40 +00003239 Like above, but only set the global value of an option
3240 (if there is one). Works like |:setglobal|.
Bram Moolenaarf10911e2022-01-29 22:20:48 +00003241 *E1093*
Bram Moolenaar13065c42005-01-08 16:08:21 +00003242:let [{name1}, {name2}, ...] = {expr1} *:let-unpack* *E687* *E688*
Bram Moolenaar32466aa2006-02-24 23:53:04 +00003243 {expr1} must evaluate to a |List|. The first item in
Bram Moolenaarfca34d62005-01-04 21:38:36 +00003244 the list is assigned to {name1}, the second item to
3245 {name2}, etc.
3246 The number of names must match the number of items in
Bram Moolenaar32466aa2006-02-24 23:53:04 +00003247 the |List|.
Bram Moolenaarfca34d62005-01-04 21:38:36 +00003248 Each name can be one of the items of the ":let"
3249 command as mentioned above.
3250 Example: >
3251 :let [s, item] = GetItem(s)
Bram Moolenaar3a3a7232005-01-17 22:16:15 +00003252< Detail: {expr1} is evaluated first, then the
3253 assignments are done in sequence. This matters if
3254 {name2} depends on {name1}. Example: >
3255 :let x = [0, 1]
3256 :let i = 0
3257 :let [i, x[i]] = [1, 2]
3258 :echo x
3259< The result is [0, 2].
3260
3261:let [{name1}, {name2}, ...] .= {expr1}
3262:let [{name1}, {name2}, ...] += {expr1}
3263:let [{name1}, {name2}, ...] -= {expr1}
3264 Like above, but append/add/subtract the value for each
Bram Moolenaar32466aa2006-02-24 23:53:04 +00003265 |List| item.
Bram Moolenaarfca34d62005-01-04 21:38:36 +00003266
Bram Moolenaard1caa942020-04-10 22:10:56 +02003267:let [{name}, ..., ; {lastname}] = {expr1} *E452*
Bram Moolenaar32466aa2006-02-24 23:53:04 +00003268 Like |:let-unpack| above, but the |List| may have more
Bram Moolenaar3a3a7232005-01-17 22:16:15 +00003269 items than there are names. A list of the remaining
3270 items is assigned to {lastname}. If there are no
3271 remaining items {lastname} is set to an empty list.
Bram Moolenaarfca34d62005-01-04 21:38:36 +00003272 Example: >
3273 :let [a, b; rest] = ["aval", "bval", 3, 4]
3274<
Bram Moolenaar3a3a7232005-01-17 22:16:15 +00003275:let [{name}, ..., ; {lastname}] .= {expr1}
3276:let [{name}, ..., ; {lastname}] += {expr1}
3277:let [{name}, ..., ; {lastname}] -= {expr1}
3278 Like above, but append/add/subtract the value for each
Bram Moolenaar32466aa2006-02-24 23:53:04 +00003279 |List| item.
Bram Moolenaar4a748032010-09-30 21:47:56 +02003280
Bram Moolenaar24582002019-07-21 14:14:26 +02003281 *:let=<<* *:let-heredoc*
Bram Moolenaarf10911e2022-01-29 22:20:48 +00003282 *E990* *E991* *E172* *E221* *E1145*
Yegappan Lakshmananefbfa862022-04-17 12:47:40 +01003283:let {var-name} =<< [trim] [eval] {endmarker}
Bram Moolenaarf5842c52019-05-19 18:41:26 +02003284text...
3285text...
Bram Moolenaar2e693a82019-10-16 22:35:02 +02003286{endmarker}
Bram Moolenaare46a4402020-06-30 20:38:27 +02003287 Set internal variable {var-name} to a |List|
3288 containing the lines of text bounded by the string
Yegappan Lakshmananefbfa862022-04-17 12:47:40 +01003289 {endmarker}.
3290
3291 If "eval" is not specified, then each line of text is
Bram Moolenaard899e512022-05-07 21:54:03 +01003292 used as a |literal-string|, except that single quotes
Bram Moolenaar8a3b8052022-06-26 12:21:15 +01003293 does not need to be doubled.
Bram Moolenaard899e512022-05-07 21:54:03 +01003294 If "eval" is specified, then any Vim expression in the
3295 form {expr} is evaluated and the result replaces the
3296 expression, like with |interp-string|.
Yegappan Lakshmananefbfa862022-04-17 12:47:40 +01003297 Example where $HOME is expanded: >
3298 let lines =<< trim eval END
3299 some text
Bram Moolenaard899e512022-05-07 21:54:03 +01003300 See the file {$HOME}/.vimrc
Yegappan Lakshmananefbfa862022-04-17 12:47:40 +01003301 more text
3302 END
3303< There can be multiple Vim expressions in a single line
3304 but an expression cannot span multiple lines. If any
3305 expression evaluation fails, then the assignment fails.
Yegappan Lakshmananefbfa862022-04-17 12:47:40 +01003306
Bram Moolenaar2e693a82019-10-16 22:35:02 +02003307 {endmarker} must not contain white space.
3308 {endmarker} cannot start with a lower case character.
3309 The last line should end only with the {endmarker}
3310 string without any other character. Watch out for
3311 white space after {endmarker}!
Bram Moolenaarf5842c52019-05-19 18:41:26 +02003312
Bram Moolenaare7eb9272019-06-24 00:58:07 +02003313 Without "trim" any white space characters in the lines
3314 of text are preserved. If "trim" is specified before
Bram Moolenaar2e693a82019-10-16 22:35:02 +02003315 {endmarker}, then indentation is stripped so you can
3316 do: >
Bram Moolenaare7eb9272019-06-24 00:58:07 +02003317 let text =<< trim END
3318 if ok
3319 echo 'done'
3320 endif
3321 END
3322< Results in: ["if ok", " echo 'done'", "endif"]
3323 The marker must line up with "let" and the indentation
3324 of the first line is removed from all the text lines.
3325 Specifically: all the leading indentation exactly
3326 matching the leading indentation of the first
3327 non-empty text line is stripped from the input lines.
3328 All leading indentation exactly matching the leading
3329 indentation before `let` is stripped from the line
Bram Moolenaar2e693a82019-10-16 22:35:02 +02003330 containing {endmarker}. Note that the difference
3331 between space and tab matters here.
Bram Moolenaarf5842c52019-05-19 18:41:26 +02003332
3333 If {var-name} didn't exist yet, it is created.
3334 Cannot be followed by another command, but can be
3335 followed by a comment.
3336
Bram Moolenaar2e693a82019-10-16 22:35:02 +02003337 To avoid line continuation to be applied, consider
3338 adding 'C' to 'cpoptions': >
3339 set cpo+=C
3340 let var =<< END
3341 \ leading backslash
3342 END
3343 set cpo-=C
3344<
Bram Moolenaarf5842c52019-05-19 18:41:26 +02003345 Examples: >
3346 let var1 =<< END
Bram Moolenaar2e693a82019-10-16 22:35:02 +02003347 Sample text 1
3348 Sample text 2
3349 Sample text 3
3350 END
Bram Moolenaarf5842c52019-05-19 18:41:26 +02003351
3352 let data =<< trim DATA
Bram Moolenaar2e693a82019-10-16 22:35:02 +02003353 1 2 3 4
3354 5 6 7 8
Bram Moolenaarf5842c52019-05-19 18:41:26 +02003355 DATA
Yegappan Lakshmananefbfa862022-04-17 12:47:40 +01003356
3357 let code =<< trim eval CODE
Bram Moolenaard899e512022-05-07 21:54:03 +01003358 let v = {10 + 20}
3359 let h = "{$HOME}"
3360 let s = "{Str1()} abc {Str2()}"
3361 let n = {MyFunc(3, 4)}
Yegappan Lakshmananefbfa862022-04-17 12:47:40 +01003362 CODE
Bram Moolenaarf5842c52019-05-19 18:41:26 +02003363<
Bram Moolenaar4a748032010-09-30 21:47:56 +02003364 *E121*
Bram Moolenaar58b85342016-08-14 19:54:54 +02003365:let {var-name} .. List the value of variable {var-name}. Multiple
Bram Moolenaardcaf10e2005-01-21 11:55:25 +00003366 variable names may be given. Special names recognized
3367 here: *E738*
Bram Moolenaarca003e12006-03-17 23:19:38 +00003368 g: global variables
3369 b: local buffer variables
3370 w: local window variables
Bram Moolenaar910f66f2006-04-05 20:41:53 +00003371 t: local tab page variables
Bram Moolenaarca003e12006-03-17 23:19:38 +00003372 s: script-local variables
3373 l: local function variables
Bram Moolenaardcaf10e2005-01-21 11:55:25 +00003374 v: Vim variables.
Bram Moolenaar65e0d772020-06-14 17:29:55 +02003375 This does not work in Vim9 script. |vim9-declaration|
Bram Moolenaar071d4272004-06-13 20:20:40 +00003376
Bram Moolenaard7ee7ce2005-01-03 21:02:03 +00003377:let List the values of all variables. The type of the
3378 variable is indicated before the value:
3379 <nothing> String
3380 # Number
Bram Moolenaarc9b4b052006-04-30 18:54:39 +00003381 * Funcref
Bram Moolenaar65e0d772020-06-14 17:29:55 +02003382 This does not work in Vim9 script. |vim9-declaration|
Bram Moolenaar071d4272004-06-13 20:20:40 +00003383
Bram Moolenaar6f4754b2022-01-23 12:07:04 +00003384:unl[et][!] {name} ... *:unlet* *:unl* *E108* *E795* *E1081*
Bram Moolenaar2ce06f62005-01-31 19:19:04 +00003385 Remove the internal variable {name}. Several variable
3386 names can be given, they are all removed. The name
Bram Moolenaar32466aa2006-02-24 23:53:04 +00003387 may also be a |List| or |Dictionary| item.
Bram Moolenaar071d4272004-06-13 20:20:40 +00003388 With [!] no error message is given for non-existing
3389 variables.
Bram Moolenaar32466aa2006-02-24 23:53:04 +00003390 One or more items from a |List| can be removed: >
Bram Moolenaar9cd15162005-01-16 22:02:49 +00003391 :unlet list[3] " remove fourth item
3392 :unlet list[3:] " remove fourth item to last
Bram Moolenaar32466aa2006-02-24 23:53:04 +00003393< One item from a |Dictionary| can be removed at a time: >
Bram Moolenaar9cd15162005-01-16 22:02:49 +00003394 :unlet dict['two']
3395 :unlet dict.two
Bram Moolenaarc236c162008-07-13 17:41:49 +00003396< This is especially useful to clean up used global
3397 variables and script-local variables (these are not
3398 deleted when the script ends). Function-local
3399 variables are automatically deleted when the function
3400 ends.
Bram Moolenaar071d4272004-06-13 20:20:40 +00003401
Bram Moolenaar137374f2018-05-13 15:59:50 +02003402:unl[et] ${env-name} ... *:unlet-environment* *:unlet-$*
3403 Remove environment variable {env-name}.
3404 Can mix {name} and ${env-name} in one :unlet command.
3405 No error message is given for a non-existing
3406 variable, also without !.
3407 If the system does not support deleting an environment
Bram Moolenaar9937a052019-06-15 15:45:06 +02003408 variable, it is made empty.
Bram Moolenaar137374f2018-05-13 15:59:50 +02003409
Bram Moolenaar6f4754b2022-01-23 12:07:04 +00003410 *:cons* *:const* *E1018*
Bram Moolenaar9937a052019-06-15 15:45:06 +02003411:cons[t] {var-name} = {expr1}
3412:cons[t] [{name1}, {name2}, ...] = {expr1}
Bram Moolenaar9937a052019-06-15 15:45:06 +02003413:cons[t] [{name}, ..., ; {lastname}] = {expr1}
3414:cons[t] {var-name} =<< [trim] {marker}
3415text...
3416text...
3417{marker}
3418 Similar to |:let|, but additionally lock the variable
3419 after setting the value. This is the same as locking
3420 the variable with |:lockvar| just after |:let|, thus: >
3421 :const x = 1
3422< is equivalent to: >
3423 :let x = 1
Bram Moolenaar021bda52020-08-17 21:07:22 +02003424 :lockvar! x
Bram Moolenaara187c432020-09-16 21:08:28 +02003425< NOTE: in Vim9 script `:const` works differently, see
3426 |vim9-const|
3427 This is useful if you want to make sure the variable
Bram Moolenaar021bda52020-08-17 21:07:22 +02003428 is not modified. If the value is a List or Dictionary
3429 literal then the items also cannot be changed: >
3430 const ll = [1, 2, 3]
3431 let ll[1] = 5 " Error!
Bram Moolenaar6e649222021-10-04 21:32:54 +01003432< Nested references are not locked: >
Bram Moolenaar021bda52020-08-17 21:07:22 +02003433 let lvar = ['a']
3434 const lconst = [0, lvar]
3435 let lconst[0] = 2 " Error!
3436 let lconst[1][0] = 'b' " OK
3437< *E995*
Bram Moolenaar9b283522019-06-17 22:19:33 +02003438 |:const| does not allow to for changing a variable: >
Bram Moolenaar9937a052019-06-15 15:45:06 +02003439 :let x = 1
3440 :const x = 2 " Error!
Bram Moolenaar1c196e72019-06-16 15:41:58 +02003441< *E996*
3442 Note that environment variables, option values and
3443 register values cannot be used here, since they cannot
3444 be locked.
3445
Bram Moolenaar85850f32019-07-19 22:05:51 +02003446:cons[t]
3447:cons[t] {var-name}
3448 If no argument is given or only {var-name} is given,
3449 the behavior is the same as |:let|.
3450
Bram Moolenaar2ce06f62005-01-31 19:19:04 +00003451:lockv[ar][!] [depth] {name} ... *:lockvar* *:lockv*
3452 Lock the internal variable {name}. Locking means that
3453 it can no longer be changed (until it is unlocked).
3454 A locked variable can be deleted: >
3455 :lockvar v
Bram Moolenaardad44732021-03-31 20:07:33 +02003456 :let v = 'asdf' " fails!
3457 :unlet v " works
Bram Moolenaarf10911e2022-01-29 22:20:48 +00003458< *E741* *E940* *E1118* *E1119* *E1120* *E1121* *E1122*
Bram Moolenaar2ce06f62005-01-31 19:19:04 +00003459 If you try to change a locked variable you get an
Bram Moolenaare7877fe2017-02-20 22:35:33 +01003460 error message: "E741: Value is locked: {name}".
3461 If you try to lock or unlock a built-in variable you
3462 get an error message: "E940: Cannot lock or unlock
3463 variable {name}".
Bram Moolenaar2ce06f62005-01-31 19:19:04 +00003464
Bram Moolenaar32466aa2006-02-24 23:53:04 +00003465 [depth] is relevant when locking a |List| or
3466 |Dictionary|. It specifies how deep the locking goes:
Bram Moolenaara187c432020-09-16 21:08:28 +02003467 0 Lock the variable {name} but not its
3468 value.
Bram Moolenaar32466aa2006-02-24 23:53:04 +00003469 1 Lock the |List| or |Dictionary| itself,
Bram Moolenaar2ce06f62005-01-31 19:19:04 +00003470 cannot add or remove items, but can
3471 still change their values.
3472 2 Also lock the values, cannot change
Bram Moolenaar32466aa2006-02-24 23:53:04 +00003473 the items. If an item is a |List| or
3474 |Dictionary|, cannot add or remove
Bram Moolenaar2ce06f62005-01-31 19:19:04 +00003475 items, but can still change the
3476 values.
Bram Moolenaar32466aa2006-02-24 23:53:04 +00003477 3 Like 2 but for the |List| /
3478 |Dictionary| in the |List| /
3479 |Dictionary|, one level deeper.
3480 The default [depth] is 2, thus when {name} is a |List|
3481 or |Dictionary| the values cannot be changed.
Bram Moolenaara187c432020-09-16 21:08:28 +02003482
3483 Example with [depth] 0: >
3484 let mylist = [1, 2, 3]
3485 lockvar 0 mylist
Bram Moolenaar6e649222021-10-04 21:32:54 +01003486 let mylist[0] = 77 " OK
3487 call add(mylist, 4] " OK
Bram Moolenaara187c432020-09-16 21:08:28 +02003488 let mylist = [7, 8, 9] " Error!
3489< *E743*
Bram Moolenaar2ce06f62005-01-31 19:19:04 +00003490 For unlimited depth use [!] and omit [depth].
3491 However, there is a maximum depth of 100 to catch
3492 loops.
3493
Bram Moolenaar32466aa2006-02-24 23:53:04 +00003494 Note that when two variables refer to the same |List|
3495 and you lock one of them, the |List| will also be
Bram Moolenaar910f66f2006-04-05 20:41:53 +00003496 locked when used through the other variable.
3497 Example: >
Bram Moolenaar2ce06f62005-01-31 19:19:04 +00003498 :let l = [0, 1, 2, 3]
3499 :let cl = l
3500 :lockvar l
3501 :let cl[1] = 99 " won't work!
3502< You may want to make a copy of a list to avoid this.
3503 See |deepcopy()|.
3504
3505
Bram Moolenaara2baa732022-02-04 16:09:54 +00003506:unlo[ckvar][!] [depth] {name} ... *:unlockvar* *:unlo* *E1246*
Bram Moolenaar2ce06f62005-01-31 19:19:04 +00003507 Unlock the internal variable {name}. Does the
3508 opposite of |:lockvar|.
3509
Bram Moolenaar61da1bf2019-06-06 12:14:49 +02003510:if {expr1} *:if* *:end* *:endif* *:en* *E171* *E579* *E580*
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003511:en[dif] Execute the commands until the next matching `:else`
3512 or `:endif` if {expr1} evaluates to non-zero.
Bram Moolenaarc51cf032022-02-26 12:25:45 +00003513 Although the short forms work, it is recommended to
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003514 always use `:endif` to avoid confusion and to make
3515 auto-indenting work properly.
Bram Moolenaar071d4272004-06-13 20:20:40 +00003516
3517 From Vim version 4.5 until 5.0, every Ex command in
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003518 between the `:if` and `:endif` is ignored. These two
Bram Moolenaar071d4272004-06-13 20:20:40 +00003519 commands were just to allow for future expansions in a
Bram Moolenaar85084ef2016-01-17 22:26:33 +01003520 backward compatible way. Nesting was allowed. Note
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003521 that any `:else` or `:elseif` was ignored, the `else`
Bram Moolenaar071d4272004-06-13 20:20:40 +00003522 part was not executed either.
3523
3524 You can use this to remain compatible with older
3525 versions: >
3526 :if version >= 500
3527 : version-5-specific-commands
3528 :endif
3529< The commands still need to be parsed to find the
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003530 `endif`. Sometimes an older Vim has a problem with a
3531 new command. For example, `:silent` is recognized as
3532 a `:substitute` command. In that case `:execute` can
Bram Moolenaar071d4272004-06-13 20:20:40 +00003533 avoid problems: >
3534 :if version >= 600
3535 : execute "silent 1,$delete"
3536 :endif
3537<
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003538 In |Vim9| script `:endif` cannot be shortened, to
3539 improve script readability.
3540 NOTE: The `:append` and `:insert` commands don't work
3541 properly in between `:if` and `:endif`.
Bram Moolenaar071d4272004-06-13 20:20:40 +00003542
3543 *:else* *:el* *E581* *E583*
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003544:el[se] Execute the commands until the next matching `:else`
3545 or `:endif` if they previously were not being
Bram Moolenaar071d4272004-06-13 20:20:40 +00003546 executed.
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003547 In |Vim9| script `:else` cannot be shortened, to
3548 improve script readability.
Bram Moolenaar071d4272004-06-13 20:20:40 +00003549
3550 *:elseif* *:elsei* *E582* *E584*
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003551:elsei[f] {expr1} Short for `:else` `:if`, with the addition that there
3552 is no extra `:endif`.
3553 In |Vim9| script `:elseif` cannot be shortened, to
3554 improve script readability.
Bram Moolenaar071d4272004-06-13 20:20:40 +00003555
3556:wh[ile] {expr1} *:while* *:endwhile* *:wh* *:endw*
Bram Moolenaar3a3a7232005-01-17 22:16:15 +00003557 *E170* *E585* *E588* *E733*
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003558:endw[hile] Repeat the commands between `:while` and `:endwhile`,
Bram Moolenaar071d4272004-06-13 20:20:40 +00003559 as long as {expr1} evaluates to non-zero.
3560 When an error is detected from a command inside the
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003561 loop, execution continues after the `endwhile`.
Bram Moolenaar12805862005-01-05 22:16:17 +00003562 Example: >
3563 :let lnum = 1
3564 :while lnum <= line("$")
3565 :call FixLine(lnum)
3566 :let lnum = lnum + 1
3567 :endwhile
3568<
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003569 In |Vim9| script `:while` and `:endwhile` cannot be
3570 shortened, to improve script readability.
3571 NOTE: The `:append` and `:insert` commands don't work
3572 properly inside a `:while` and `:for` loop.
Bram Moolenaar071d4272004-06-13 20:20:40 +00003573
Bram Moolenaar5e66b422019-01-24 21:58:10 +01003574:for {var} in {object} *:for* *E690* *E732*
Bram Moolenaar12805862005-01-05 22:16:17 +00003575:endfo[r] *:endfo* *:endfor*
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003576 Repeat the commands between `:for` and `:endfor` for
Bram Moolenaar3f32a5f2022-05-12 20:34:15 +01003577 each item in {object}. {object} can be a |List|,
3578 a |Blob| or a |String|. *E1177*
Bram Moolenaar5da36052021-12-27 15:39:57 +00003579
3580 Variable {var} is set to the value of each item.
3581 In |Vim9| script the loop variable must not have been
3582 declared yet, unless when it is a
3583 global/window/tab/buffer variable.
3584
3585 When an error is detected for a command inside the
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003586 loop, execution continues after the `endfor`.
Bram Moolenaar5e66b422019-01-24 21:58:10 +01003587 Changing {object} inside the loop affects what items
3588 are used. Make a copy if this is unwanted: >
Bram Moolenaarde8866b2005-01-06 23:24:37 +00003589 :for item in copy(mylist)
Bram Moolenaar5e66b422019-01-24 21:58:10 +01003590<
Bram Moolenaar5da36052021-12-27 15:39:57 +00003591 When {object} is a |List| and not making a copy, in
3592 legacy script Vim stores a reference to the next item
3593 in the |List| before executing the commands with the
3594 current item. Thus the current item can be removed
3595 without effect. Removing any later item means it will
3596 not be found. Thus the following example works (an
3597 inefficient way to make a |List| empty): >
Bram Moolenaar8f3f58f2010-01-06 20:52:26 +01003598 for item in mylist
3599 call remove(mylist, 0)
3600 endfor
Bram Moolenaar5e66b422019-01-24 21:58:10 +01003601< Note that reordering the |List| (e.g., with sort() or
Bram Moolenaar9588a0f2005-01-08 21:45:39 +00003602 reverse()) may have unexpected effects.
Bram Moolenaar5da36052021-12-27 15:39:57 +00003603 In |Vim9| script the index is used. If an item before
3604 the current one is deleted the next item will be
3605 skipped.
Bram Moolenaar12805862005-01-05 22:16:17 +00003606
Bram Moolenaar5e66b422019-01-24 21:58:10 +01003607 When {object} is a |Blob|, Vim always makes a copy to
3608 iterate over. Unlike with |List|, modifying the
3609 |Blob| does not affect the iteration.
3610
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003611 In |Vim9| script `:endfor` cannot be shortened, to
3612 improve script readability.
3613
Bram Moolenaar12805862005-01-05 22:16:17 +00003614:for [{var1}, {var2}, ...] in {listlist}
Bram Moolenaarf10911e2022-01-29 22:20:48 +00003615:endfo[r] *E1140*
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003616 Like `:for` above, but each item in {listlist} must be
Bram Moolenaar12805862005-01-05 22:16:17 +00003617 a list, of which each item is assigned to {var1},
3618 {var2}, etc. Example: >
3619 :for [lnum, col] in [[1, 3], [2, 5], [3, 8]]
3620 :echo getline(lnum)[col]
3621 :endfor
3622<
Bram Moolenaar071d4272004-06-13 20:20:40 +00003623 *:continue* *:con* *E586*
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003624:con[tinue] When used inside a `:while` or `:for` loop, jumps back
Bram Moolenaar12805862005-01-05 22:16:17 +00003625 to the start of the loop.
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003626 If it is used after a `:try` inside the loop but
3627 before the matching `:finally` (if present), the
3628 commands following the `:finally` up to the matching
3629 `:endtry` are executed first. This process applies to
3630 all nested `:try`s inside the loop. The outermost
3631 `:endtry` then jumps back to the start of the loop.
Bram Moolenaar071d4272004-06-13 20:20:40 +00003632
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003633 In |Vim9| script `:cont` is the shortest form, to
3634 improve script readability.
Bram Moolenaar071d4272004-06-13 20:20:40 +00003635 *:break* *:brea* *E587*
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003636:brea[k] When used inside a `:while` or `:for` loop, skips to
3637 the command after the matching `:endwhile` or
3638 `:endfor`.
3639 If it is used after a `:try` inside the loop but
3640 before the matching `:finally` (if present), the
3641 commands following the `:finally` up to the matching
3642 `:endtry` are executed first. This process applies to
3643 all nested `:try`s inside the loop. The outermost
3644 `:endtry` then jumps to the command after the loop.
3645
3646 In |Vim9| script `:break` cannot be shortened, to
3647 improve script readability.
Bram Moolenaar071d4272004-06-13 20:20:40 +00003648
Bram Moolenaar6f4754b2022-01-23 12:07:04 +00003649:try *:try* *:endt* *:endtry*
3650 *E600* *E601* *E602* *E1032*
Bram Moolenaar071d4272004-06-13 20:20:40 +00003651:endt[ry] Change the error handling for the commands between
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003652 `:try` and `:endtry` including everything being
3653 executed across `:source` commands, function calls,
Bram Moolenaar071d4272004-06-13 20:20:40 +00003654 or autocommand invocations.
3655
3656 When an error or interrupt is detected and there is
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003657 a `:finally` command following, execution continues
3658 after the `:finally`. Otherwise, or when the
3659 `:endtry` is reached thereafter, the next
3660 (dynamically) surrounding `:try` is checked for
3661 a corresponding `:finally` etc. Then the script
Bram Moolenaarbc93ceb2020-02-26 13:36:21 +01003662 processing is terminated. Whether a function
3663 definition has an "abort" argument does not matter.
Bram Moolenaar071d4272004-06-13 20:20:40 +00003664 Example: >
Bram Moolenaarbc93ceb2020-02-26 13:36:21 +01003665 try | call Unknown() | finally | echomsg "cleanup" | endtry
3666 echomsg "not reached"
Bram Moolenaar071d4272004-06-13 20:20:40 +00003667<
3668 Moreover, an error or interrupt (dynamically) inside
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003669 `:try` and `:endtry` is converted to an exception. It
3670 can be caught as if it were thrown by a `:throw`
3671 command (see `:catch`). In this case, the script
Bram Moolenaar071d4272004-06-13 20:20:40 +00003672 processing is not terminated.
3673
3674 The value "Vim:Interrupt" is used for an interrupt
3675 exception. An error in a Vim command is converted
3676 to a value of the form "Vim({command}):{errmsg}",
3677 other errors are converted to a value of the form
3678 "Vim:{errmsg}". {command} is the full command name,
3679 and {errmsg} is the message that is displayed if the
3680 error exception is not caught, always beginning with
3681 the error number.
3682 Examples: >
Bram Moolenaarbc93ceb2020-02-26 13:36:21 +01003683 try | sleep 100 | catch /^Vim:Interrupt$/ | endtry
3684 try | edit | catch /^Vim(edit):E\d\+/ | echo "error" | endtry
Bram Moolenaar071d4272004-06-13 20:20:40 +00003685<
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003686 In |Vim9| script `:endtry` cannot be shortened, to
3687 improve script readability.
3688
Bram Moolenaar6f4754b2022-01-23 12:07:04 +00003689 *:cat* *:catch*
3690 *E603* *E604* *E605* *E654* *E1033*
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003691:cat[ch] /{pattern}/ The following commands until the next `:catch`,
3692 `:finally`, or `:endtry` that belongs to the same
3693 `:try` as the `:catch` are executed when an exception
Bram Moolenaar071d4272004-06-13 20:20:40 +00003694 matching {pattern} is being thrown and has not yet
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003695 been caught by a previous `:catch`. Otherwise, these
Bram Moolenaar071d4272004-06-13 20:20:40 +00003696 commands are skipped.
3697 When {pattern} is omitted all errors are caught.
3698 Examples: >
Bram Moolenaar647e24b2019-03-17 16:39:46 +01003699 :catch /^Vim:Interrupt$/ " catch interrupts (CTRL-C)
3700 :catch /^Vim\%((\a\+)\)\=:E/ " catch all Vim errors
3701 :catch /^Vim\%((\a\+)\)\=:/ " catch errors and interrupts
3702 :catch /^Vim(write):/ " catch all errors in :write
3703 :catch /^Vim\%((\a\+)\)\=:E123:/ " catch error E123
3704 :catch /my-exception/ " catch user exception
3705 :catch /.*/ " catch everything
3706 :catch " same as /.*/
Bram Moolenaar071d4272004-06-13 20:20:40 +00003707<
3708 Another character can be used instead of / around the
3709 {pattern}, so long as it does not have a special
3710 meaning (e.g., '|' or '"') and doesn't occur inside
Bram Moolenaar6f4754b2022-01-23 12:07:04 +00003711 {pattern}. *E1067*
Bram Moolenaar7e38ea22014-04-05 22:55:53 +02003712 Information about the exception is available in
3713 |v:exception|. Also see |throw-variables|.
Bram Moolenaar071d4272004-06-13 20:20:40 +00003714 NOTE: It is not reliable to ":catch" the TEXT of
3715 an error message because it may vary in different
3716 locales.
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003717 In |Vim9| script `:catch` cannot be shortened, to
3718 improve script readability.
Bram Moolenaar071d4272004-06-13 20:20:40 +00003719
3720 *:fina* *:finally* *E606* *E607*
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003721:fina[lly] The following commands until the matching `:endtry`
Bram Moolenaar071d4272004-06-13 20:20:40 +00003722 are executed whenever the part between the matching
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003723 `:try` and the `:finally` is left: either by falling
3724 through to the `:finally` or by a `:continue`,
3725 `:break`, `:finish`, or `:return`, or by an error or
3726 interrupt or exception (see `:throw`).
3727
3728 In |Vim9| script `:finally` cannot be shortened, to
3729 improve script readability and avoid confusion with
3730 `:final`.
Bram Moolenaar071d4272004-06-13 20:20:40 +00003731
Bram Moolenaarf10911e2022-01-29 22:20:48 +00003732 *:th* *:throw* *E608* *E1129*
Bram Moolenaar071d4272004-06-13 20:20:40 +00003733:th[row] {expr1} The {expr1} is evaluated and thrown as an exception.
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003734 If the ":throw" is used after a `:try` but before the
3735 first corresponding `:catch`, commands are skipped
3736 until the first `:catch` matching {expr1} is reached.
3737 If there is no such `:catch` or if the ":throw" is
3738 used after a `:catch` but before the `:finally`, the
3739 commands following the `:finally` (if present) up to
3740 the matching `:endtry` are executed. If the `:throw`
3741 is after the `:finally`, commands up to the `:endtry`
Bram Moolenaar071d4272004-06-13 20:20:40 +00003742 are skipped. At the ":endtry", this process applies
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003743 again for the next dynamically surrounding `:try`
Bram Moolenaar071d4272004-06-13 20:20:40 +00003744 (which may be found in a calling function or sourcing
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003745 script), until a matching `:catch` has been found.
Bram Moolenaar071d4272004-06-13 20:20:40 +00003746 If the exception is not caught, the command processing
3747 is terminated.
3748 Example: >
3749 :try | throw "oops" | catch /^oo/ | echo "caught" | endtry
Bram Moolenaar662db672011-03-22 14:05:35 +01003750< Note that "catch" may need to be on a separate line
3751 for when an error causes the parsing to skip the whole
3752 line and not see the "|" that separates the commands.
Bram Moolenaar071d4272004-06-13 20:20:40 +00003753
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003754 In |Vim9| script `:throw` cannot be shortened, to
3755 improve script readability.
3756
Bram Moolenaar071d4272004-06-13 20:20:40 +00003757 *:ec* *:echo*
3758:ec[ho] {expr1} .. Echoes each {expr1}, with a space in between. The
3759 first {expr1} starts on a new line.
3760 Also see |:comment|.
3761 Use "\n" to start a new line. Use "\r" to move the
3762 cursor to the first column.
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003763 Uses the highlighting set by the `:echohl` command.
Bram Moolenaar071d4272004-06-13 20:20:40 +00003764 Cannot be followed by a comment.
3765 Example: >
3766 :echo "the value of 'shell' is" &shell
Bram Moolenaaref2f6562007-05-06 13:32:59 +00003767< *:echo-redraw*
3768 A later redraw may make the message disappear again.
3769 And since Vim mostly postpones redrawing until it's
3770 finished with a sequence of commands this happens
3771 quite often. To avoid that a command from before the
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003772 `:echo` causes a redraw afterwards (redraws are often
Bram Moolenaaref2f6562007-05-06 13:32:59 +00003773 postponed until you type something), force a redraw
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003774 with the `:redraw` command. Example: >
Bram Moolenaar071d4272004-06-13 20:20:40 +00003775 :new | redraw | echo "there is a new window"
3776<
3777 *:echon*
3778:echon {expr1} .. Echoes each {expr1}, without anything added. Also see
3779 |:comment|.
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003780 Uses the highlighting set by the `:echohl` command.
Bram Moolenaar071d4272004-06-13 20:20:40 +00003781 Cannot be followed by a comment.
3782 Example: >
3783 :echon "the value of 'shell' is " &shell
3784<
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003785 Note the difference between using `:echo`, which is a
3786 Vim command, and `:!echo`, which is an external shell
Bram Moolenaar071d4272004-06-13 20:20:40 +00003787 command: >
3788 :!echo % --> filename
3789< The arguments of ":!" are expanded, see |:_%|. >
3790 :!echo "%" --> filename or "filename"
3791< Like the previous example. Whether you see the double
3792 quotes or not depends on your 'shell'. >
3793 :echo % --> nothing
3794< The '%' is an illegal character in an expression. >
3795 :echo "%" --> %
3796< This just echoes the '%' character. >
3797 :echo expand("%") --> filename
3798< This calls the expand() function to expand the '%'.
3799
3800 *:echoh* *:echohl*
3801:echoh[l] {name} Use the highlight group {name} for the following
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003802 `:echo`, `:echon` and `:echomsg` commands. Also used
3803 for the `input()` prompt. Example: >
Bram Moolenaar071d4272004-06-13 20:20:40 +00003804 :echohl WarningMsg | echo "Don't panic!" | echohl None
3805< Don't forget to set the group back to "None",
3806 otherwise all following echo's will be highlighted.
3807
3808 *:echom* *:echomsg*
3809:echom[sg] {expr1} .. Echo the expression(s) as a true message, saving the
3810 message in the |message-history|.
3811 Spaces are placed between the arguments as with the
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003812 `:echo` command. But unprintable characters are
Bram Moolenaar071d4272004-06-13 20:20:40 +00003813 displayed, not interpreted.
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003814 The parsing works slightly different from `:echo`,
3815 more like `:execute`. All the expressions are first
Bram Moolenaaref2f6562007-05-06 13:32:59 +00003816 evaluated and concatenated before echoing anything.
Bram Moolenaar461a7fc2018-12-22 13:28:07 +01003817 If expressions does not evaluate to a Number or
3818 String, string() is used to turn it into a string.
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003819 Uses the highlighting set by the `:echohl` command.
Bram Moolenaar071d4272004-06-13 20:20:40 +00003820 Example: >
3821 :echomsg "It's a Zizzer Zazzer Zuzz, as you can plainly see."
Bram Moolenaaref2f6562007-05-06 13:32:59 +00003822< See |:echo-redraw| to avoid the message disappearing
3823 when the screen is redrawn.
Bram Moolenaar37fef162022-08-29 18:16:32 +01003824
3825 *:echow* *:echowin* *:echowindow*
3826:echow[indow] {expr1} ..
3827 Like |:echomsg| but when the messages popup window is
3828 available the message is displayed there. This means
3829 it will show for three seconds and avoid a
3830 |hit-enter| prompt.
3831 The message window is available when Vim was compiled
3832 with the +timer and the +popupwin features.
3833
Bram Moolenaar071d4272004-06-13 20:20:40 +00003834 *:echoe* *:echoerr*
3835:echoe[rr] {expr1} .. Echo the expression(s) as an error message, saving the
3836 message in the |message-history|. When used in a
3837 script or function the line number will be added.
3838 Spaces are placed between the arguments as with the
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003839 `:echomsg` command. When used inside a try conditional,
Bram Moolenaar071d4272004-06-13 20:20:40 +00003840 the message is raised as an error exception instead
3841 (see |try-echoerr|).
3842 Example: >
3843 :echoerr "This script just failed!"
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003844< If you just want a highlighted message use `:echohl`.
Bram Moolenaar071d4272004-06-13 20:20:40 +00003845 And to get a beep: >
3846 :exe "normal \<Esc>"
Bram Moolenaar4c868302021-03-22 16:19:45 +01003847
3848:echoc[onsole] {expr1} .. *:echoc* *:echoconsole*
3849 Intended for testing: works like `:echomsg` but when
3850 running in the GUI and started from a terminal write
3851 the text to stdout.
3852
Bram Moolenaar09c6f262019-11-17 15:55:14 +01003853 *:eval*
3854:eval {expr} Evaluate {expr} and discard the result. Example: >
3855 :eval Getlist()->Filter()->append('$')
3856
3857< The expression is supposed to have a side effect,
3858 since the resulting value is not used. In the example
3859 the `append()` call appends the List with text to the
3860 buffer. This is similar to `:call` but works with any
3861 expression.
Bram Moolenaara2baa732022-02-04 16:09:54 +00003862 In |Vim9| script an expression without an effect will
3863 result in error *E1207* . This should help noticing
3864 mistakes.
Bram Moolenaar09c6f262019-11-17 15:55:14 +01003865
3866 The command can be shortened to `:ev` or `:eva`, but
3867 these are hard to recognize and therefore not to be
3868 used.
3869
Bram Moolenaarbc93ceb2020-02-26 13:36:21 +01003870 The command cannot be followed by "|" and another
3871 command, since "|" is seen as part of the expression.
3872
Bram Moolenaar09c6f262019-11-17 15:55:14 +01003873
Bram Moolenaar071d4272004-06-13 20:20:40 +00003874 *:exe* *:execute*
3875:exe[cute] {expr1} .. Executes the string that results from the evaluation
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003876 of {expr1} as an Ex command.
3877 Multiple arguments are concatenated, with a space in
Bram Moolenaar7e6a5152021-01-02 16:39:53 +01003878 between. To avoid the extra space use the ".."
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003879 operator to concatenate strings into one argument.
3880 {expr1} is used as the processed command, command line
3881 editing keys are not recognized.
Bram Moolenaar071d4272004-06-13 20:20:40 +00003882 Cannot be followed by a comment.
3883 Examples: >
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003884 :execute "buffer" nextbuf
Bram Moolenaarc8cdf0f2021-03-13 13:28:13 +01003885 :execute "normal" count .. "w"
Bram Moolenaar071d4272004-06-13 20:20:40 +00003886<
3887 ":execute" can be used to append a command to commands
3888 that don't accept a '|'. Example: >
3889 :execute '!ls' | echo "theend"
3890
3891< ":execute" is also a nice way to avoid having to type
3892 control characters in a Vim script for a ":normal"
3893 command: >
3894 :execute "normal ixxx\<Esc>"
3895< This has an <Esc> character, see |expr-string|.
3896
Bram Moolenaar446cb832008-06-24 21:56:24 +00003897 Be careful to correctly escape special characters in
3898 file names. The |fnameescape()| function can be used
Bram Moolenaar05bb9532008-07-04 09:44:11 +00003899 for Vim commands, |shellescape()| for |:!| commands.
3900 Examples: >
Bram Moolenaarc8cdf0f2021-03-13 13:28:13 +01003901 :execute "e " .. fnameescape(filename)
3902 :execute "!ls " .. shellescape(filename, 1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00003903<
Bram Moolenaar071d4272004-06-13 20:20:40 +00003904 Note: The executed string may be any command-line, but
Bram Moolenaar76f3b1a2014-03-27 22:30:07 +01003905 starting or ending "if", "while" and "for" does not
3906 always work, because when commands are skipped the
3907 ":execute" is not evaluated and Vim loses track of
3908 where blocks start and end. Also "break" and
3909 "continue" should not be inside ":execute".
3910 This example does not work, because the ":execute" is
3911 not evaluated and Vim does not see the "while", and
3912 gives an error for finding an ":endwhile": >
3913 :if 0
3914 : execute 'while i > 5'
3915 : echo "test"
3916 : endwhile
3917 :endif
Bram Moolenaar071d4272004-06-13 20:20:40 +00003918<
3919 It is allowed to have a "while" or "if" command
3920 completely in the executed string: >
3921 :execute 'while i < 5 | echo i | let i = i + 1 | endwhile'
3922<
3923
Bram Moolenaar8f3f58f2010-01-06 20:52:26 +01003924 *:exe-comment*
Bram Moolenaar071d4272004-06-13 20:20:40 +00003925 ":execute", ":echo" and ":echon" cannot be followed by
3926 a comment directly, because they see the '"' as the
3927 start of a string. But, you can use '|' followed by a
3928 comment. Example: >
3929 :echo "foo" | "this is a comment
3930
3931==============================================================================
39328. Exception handling *exception-handling*
3933
3934The Vim script language comprises an exception handling feature. This section
3935explains how it can be used in a Vim script.
3936
3937Exceptions may be raised by Vim on an error or on interrupt, see
3938|catch-errors| and |catch-interrupt|. You can also explicitly throw an
3939exception by using the ":throw" command, see |throw-catch|.
3940
3941
3942TRY CONDITIONALS *try-conditionals*
3943
3944Exceptions can be caught or can cause cleanup code to be executed. You can
3945use a try conditional to specify catch clauses (that catch exceptions) and/or
3946a finally clause (to be executed for cleanup).
3947 A try conditional begins with a |:try| command and ends at the matching
3948|:endtry| command. In between, you can use a |:catch| command to start
3949a catch clause, or a |:finally| command to start a finally clause. There may
3950be none or multiple catch clauses, but there is at most one finally clause,
3951which must not be followed by any catch clauses. The lines before the catch
3952clauses and the finally clause is called a try block. >
3953
3954 :try
Bram Moolenaar446cb832008-06-24 21:56:24 +00003955 : ...
3956 : ... TRY BLOCK
3957 : ...
Bram Moolenaar071d4272004-06-13 20:20:40 +00003958 :catch /{pattern}/
Bram Moolenaar446cb832008-06-24 21:56:24 +00003959 : ...
3960 : ... CATCH CLAUSE
3961 : ...
Bram Moolenaar071d4272004-06-13 20:20:40 +00003962 :catch /{pattern}/
Bram Moolenaar446cb832008-06-24 21:56:24 +00003963 : ...
3964 : ... CATCH CLAUSE
3965 : ...
Bram Moolenaar071d4272004-06-13 20:20:40 +00003966 :finally
Bram Moolenaar446cb832008-06-24 21:56:24 +00003967 : ...
3968 : ... FINALLY CLAUSE
3969 : ...
Bram Moolenaar071d4272004-06-13 20:20:40 +00003970 :endtry
3971
3972The try conditional allows to watch code for exceptions and to take the
3973appropriate actions. Exceptions from the try block may be caught. Exceptions
3974from the try block and also the catch clauses may cause cleanup actions.
3975 When no exception is thrown during execution of the try block, the control
3976is transferred to the finally clause, if present. After its execution, the
3977script continues with the line following the ":endtry".
3978 When an exception occurs during execution of the try block, the remaining
3979lines in the try block are skipped. The exception is matched against the
3980patterns specified as arguments to the ":catch" commands. The catch clause
3981after the first matching ":catch" is taken, other catch clauses are not
3982executed. The catch clause ends when the next ":catch", ":finally", or
3983":endtry" command is reached - whatever is first. Then, the finally clause
3984(if present) is executed. When the ":endtry" is reached, the script execution
3985continues in the following line as usual.
3986 When an exception that does not match any of the patterns specified by the
3987":catch" commands is thrown in the try block, the exception is not caught by
3988that try conditional and none of the catch clauses is executed. Only the
3989finally clause, if present, is taken. The exception pends during execution of
3990the finally clause. It is resumed at the ":endtry", so that commands after
3991the ":endtry" are not executed and the exception might be caught elsewhere,
3992see |try-nesting|.
3993 When during execution of a catch clause another exception is thrown, the
Bram Moolenaar58b85342016-08-14 19:54:54 +02003994remaining lines in that catch clause are not executed. The new exception is
Bram Moolenaar071d4272004-06-13 20:20:40 +00003995not matched against the patterns in any of the ":catch" commands of the same
3996try conditional and none of its catch clauses is taken. If there is, however,
3997a finally clause, it is executed, and the exception pends during its
3998execution. The commands following the ":endtry" are not executed. The new
3999exception might, however, be caught elsewhere, see |try-nesting|.
4000 When during execution of the finally clause (if present) an exception is
Bram Moolenaar58b85342016-08-14 19:54:54 +02004001thrown, the remaining lines in the finally clause are skipped. If the finally
Bram Moolenaar071d4272004-06-13 20:20:40 +00004002clause has been taken because of an exception from the try block or one of the
4003catch clauses, the original (pending) exception is discarded. The commands
4004following the ":endtry" are not executed, and the exception from the finally
4005clause is propagated and can be caught elsewhere, see |try-nesting|.
4006
4007The finally clause is also executed, when a ":break" or ":continue" for
4008a ":while" loop enclosing the complete try conditional is executed from the
4009try block or a catch clause. Or when a ":return" or ":finish" is executed
4010from the try block or a catch clause of a try conditional in a function or
4011sourced script, respectively. The ":break", ":continue", ":return", or
4012":finish" pends during execution of the finally clause and is resumed when the
4013":endtry" is reached. It is, however, discarded when an exception is thrown
4014from the finally clause.
4015 When a ":break" or ":continue" for a ":while" loop enclosing the complete
4016try conditional or when a ":return" or ":finish" is encountered in the finally
4017clause, the rest of the finally clause is skipped, and the ":break",
4018":continue", ":return" or ":finish" is executed as usual. If the finally
4019clause has been taken because of an exception or an earlier ":break",
4020":continue", ":return", or ":finish" from the try block or a catch clause,
4021this pending exception or command is discarded.
4022
4023For examples see |throw-catch| and |try-finally|.
4024
4025
4026NESTING OF TRY CONDITIONALS *try-nesting*
4027
4028Try conditionals can be nested arbitrarily. That is, a complete try
4029conditional can be put into the try block, a catch clause, or the finally
4030clause of another try conditional. If the inner try conditional does not
4031catch an exception thrown in its try block or throws a new exception from one
4032of its catch clauses or its finally clause, the outer try conditional is
4033checked according to the rules above. If the inner try conditional is in the
4034try block of the outer try conditional, its catch clauses are checked, but
Bram Moolenaar58b85342016-08-14 19:54:54 +02004035otherwise only the finally clause is executed. It does not matter for
Bram Moolenaar071d4272004-06-13 20:20:40 +00004036nesting, whether the inner try conditional is directly contained in the outer
4037one, or whether the outer one sources a script or calls a function containing
4038the inner try conditional.
4039
4040When none of the active try conditionals catches an exception, just their
4041finally clauses are executed. Thereafter, the script processing terminates.
4042An error message is displayed in case of an uncaught exception explicitly
4043thrown by a ":throw" command. For uncaught error and interrupt exceptions
4044implicitly raised by Vim, the error message(s) or interrupt message are shown
4045as usual.
4046
4047For examples see |throw-catch|.
4048
4049
4050EXAMINING EXCEPTION HANDLING CODE *except-examine*
4051
4052Exception handling code can get tricky. If you are in doubt what happens, set
4053'verbose' to 13 or use the ":13verbose" command modifier when sourcing your
4054script file. Then you see when an exception is thrown, discarded, caught, or
4055finished. When using a verbosity level of at least 14, things pending in
4056a finally clause are also shown. This information is also given in debug mode
4057(see |debug-scripts|).
4058
4059
4060THROWING AND CATCHING EXCEPTIONS *throw-catch*
4061
4062You can throw any number or string as an exception. Use the |:throw| command
4063and pass the value to be thrown as argument: >
4064 :throw 4711
4065 :throw "string"
4066< *throw-expression*
4067You can also specify an expression argument. The expression is then evaluated
4068first, and the result is thrown: >
4069 :throw 4705 + strlen("string")
4070 :throw strpart("strings", 0, 6)
4071
4072An exception might be thrown during evaluation of the argument of the ":throw"
4073command. Unless it is caught there, the expression evaluation is abandoned.
4074The ":throw" command then does not throw a new exception.
4075 Example: >
4076
4077 :function! Foo(arg)
4078 : try
4079 : throw a:arg
4080 : catch /foo/
4081 : endtry
4082 : return 1
4083 :endfunction
4084 :
4085 :function! Bar()
4086 : echo "in Bar"
4087 : return 4710
4088 :endfunction
4089 :
4090 :throw Foo("arrgh") + Bar()
4091
4092This throws "arrgh", and "in Bar" is not displayed since Bar() is not
4093executed. >
4094 :throw Foo("foo") + Bar()
4095however displays "in Bar" and throws 4711.
4096
4097Any other command that takes an expression as argument might also be
Bram Moolenaar58b85342016-08-14 19:54:54 +02004098abandoned by an (uncaught) exception during the expression evaluation. The
Bram Moolenaar071d4272004-06-13 20:20:40 +00004099exception is then propagated to the caller of the command.
4100 Example: >
4101
4102 :if Foo("arrgh")
4103 : echo "then"
4104 :else
4105 : echo "else"
4106 :endif
4107
4108Here neither of "then" or "else" is displayed.
4109
4110 *catch-order*
4111Exceptions can be caught by a try conditional with one or more |:catch|
4112commands, see |try-conditionals|. The values to be caught by each ":catch"
4113command can be specified as a pattern argument. The subsequent catch clause
4114gets executed when a matching exception is caught.
4115 Example: >
4116
4117 :function! Foo(value)
4118 : try
4119 : throw a:value
4120 : catch /^\d\+$/
4121 : echo "Number thrown"
4122 : catch /.*/
4123 : echo "String thrown"
4124 : endtry
4125 :endfunction
4126 :
4127 :call Foo(0x1267)
4128 :call Foo('string')
4129
4130The first call to Foo() displays "Number thrown", the second "String thrown".
4131An exception is matched against the ":catch" commands in the order they are
4132specified. Only the first match counts. So you should place the more
4133specific ":catch" first. The following order does not make sense: >
4134
4135 : catch /.*/
4136 : echo "String thrown"
4137 : catch /^\d\+$/
4138 : echo "Number thrown"
4139
4140The first ":catch" here matches always, so that the second catch clause is
4141never taken.
4142
4143 *throw-variables*
4144If you catch an exception by a general pattern, you may access the exact value
4145in the variable |v:exception|: >
4146
4147 : catch /^\d\+$/
4148 : echo "Number thrown. Value is" v:exception
4149
4150You may also be interested where an exception was thrown. This is stored in
4151|v:throwpoint|. Note that "v:exception" and "v:throwpoint" are valid for the
4152exception most recently caught as long it is not finished.
4153 Example: >
4154
4155 :function! Caught()
4156 : if v:exception != ""
Bram Moolenaarc51cf032022-02-26 12:25:45 +00004157 : echo 'Caught "' . v:exception .. '" in ' .. v:throwpoint
Bram Moolenaar071d4272004-06-13 20:20:40 +00004158 : else
4159 : echo 'Nothing caught'
4160 : endif
4161 :endfunction
4162 :
4163 :function! Foo()
4164 : try
4165 : try
4166 : try
4167 : throw 4711
4168 : finally
4169 : call Caught()
4170 : endtry
4171 : catch /.*/
4172 : call Caught()
4173 : throw "oops"
4174 : endtry
4175 : catch /.*/
4176 : call Caught()
4177 : finally
4178 : call Caught()
4179 : endtry
4180 :endfunction
4181 :
4182 :call Foo()
4183
4184This displays >
4185
4186 Nothing caught
4187 Caught "4711" in function Foo, line 4
4188 Caught "oops" in function Foo, line 10
4189 Nothing caught
4190
4191A practical example: The following command ":LineNumber" displays the line
4192number in the script or function where it has been used: >
4193
4194 :function! LineNumber()
4195 : return substitute(v:throwpoint, '.*\D\(\d\+\).*', '\1', "")
4196 :endfunction
4197 :command! LineNumber try | throw "" | catch | echo LineNumber() | endtry
4198<
4199 *try-nested*
4200An exception that is not caught by a try conditional can be caught by
4201a surrounding try conditional: >
4202
4203 :try
4204 : try
4205 : throw "foo"
4206 : catch /foobar/
4207 : echo "foobar"
4208 : finally
4209 : echo "inner finally"
4210 : endtry
4211 :catch /foo/
4212 : echo "foo"
4213 :endtry
4214
4215The inner try conditional does not catch the exception, just its finally
4216clause is executed. The exception is then caught by the outer try
4217conditional. The example displays "inner finally" and then "foo".
4218
4219 *throw-from-catch*
4220You can catch an exception and throw a new one to be caught elsewhere from the
4221catch clause: >
4222
4223 :function! Foo()
4224 : throw "foo"
4225 :endfunction
4226 :
4227 :function! Bar()
4228 : try
4229 : call Foo()
4230 : catch /foo/
4231 : echo "Caught foo, throw bar"
4232 : throw "bar"
4233 : endtry
4234 :endfunction
4235 :
4236 :try
4237 : call Bar()
4238 :catch /.*/
4239 : echo "Caught" v:exception
4240 :endtry
4241
4242This displays "Caught foo, throw bar" and then "Caught bar".
4243
4244 *rethrow*
4245There is no real rethrow in the Vim script language, but you may throw
4246"v:exception" instead: >
4247
4248 :function! Bar()
4249 : try
4250 : call Foo()
4251 : catch /.*/
4252 : echo "Rethrow" v:exception
4253 : throw v:exception
4254 : endtry
4255 :endfunction
4256< *try-echoerr*
4257Note that this method cannot be used to "rethrow" Vim error or interrupt
4258exceptions, because it is not possible to fake Vim internal exceptions.
4259Trying so causes an error exception. You should throw your own exception
4260denoting the situation. If you want to cause a Vim error exception containing
4261the original error exception value, you can use the |:echoerr| command: >
4262
4263 :try
4264 : try
4265 : asdf
4266 : catch /.*/
4267 : echoerr v:exception
4268 : endtry
4269 :catch /.*/
4270 : echo v:exception
4271 :endtry
4272
4273This code displays
4274
Bram Moolenaar446cb832008-06-24 21:56:24 +00004275 Vim(echoerr):Vim:E492: Not an editor command: asdf ~
Bram Moolenaar071d4272004-06-13 20:20:40 +00004276
4277
4278CLEANUP CODE *try-finally*
4279
4280Scripts often change global settings and restore them at their end. If the
4281user however interrupts the script by pressing CTRL-C, the settings remain in
Bram Moolenaar58b85342016-08-14 19:54:54 +02004282an inconsistent state. The same may happen to you in the development phase of
Bram Moolenaar071d4272004-06-13 20:20:40 +00004283a script when an error occurs or you explicitly throw an exception without
4284catching it. You can solve these problems by using a try conditional with
4285a finally clause for restoring the settings. Its execution is guaranteed on
4286normal control flow, on error, on an explicit ":throw", and on interrupt.
4287(Note that errors and interrupts from inside the try conditional are converted
Bram Moolenaar58b85342016-08-14 19:54:54 +02004288to exceptions. When not caught, they terminate the script after the finally
Bram Moolenaar071d4272004-06-13 20:20:40 +00004289clause has been executed.)
4290Example: >
4291
4292 :try
4293 : let s:saved_ts = &ts
4294 : set ts=17
4295 :
4296 : " Do the hard work here.
4297 :
4298 :finally
4299 : let &ts = s:saved_ts
4300 : unlet s:saved_ts
4301 :endtry
4302
4303This method should be used locally whenever a function or part of a script
4304changes global settings which need to be restored on failure or normal exit of
4305that function or script part.
4306
4307 *break-finally*
4308Cleanup code works also when the try block or a catch clause is left by
4309a ":continue", ":break", ":return", or ":finish".
4310 Example: >
4311
4312 :let first = 1
4313 :while 1
4314 : try
4315 : if first
4316 : echo "first"
4317 : let first = 0
4318 : continue
4319 : else
4320 : throw "second"
4321 : endif
4322 : catch /.*/
4323 : echo v:exception
4324 : break
4325 : finally
4326 : echo "cleanup"
4327 : endtry
4328 : echo "still in while"
4329 :endwhile
4330 :echo "end"
4331
4332This displays "first", "cleanup", "second", "cleanup", and "end". >
4333
4334 :function! Foo()
4335 : try
4336 : return 4711
4337 : finally
4338 : echo "cleanup\n"
4339 : endtry
4340 : echo "Foo still active"
4341 :endfunction
4342 :
4343 :echo Foo() "returned by Foo"
4344
4345This displays "cleanup" and "4711 returned by Foo". You don't need to add an
Bram Moolenaar58b85342016-08-14 19:54:54 +02004346extra ":return" in the finally clause. (Above all, this would override the
Bram Moolenaar071d4272004-06-13 20:20:40 +00004347return value.)
4348
4349 *except-from-finally*
4350Using either of ":continue", ":break", ":return", ":finish", or ":throw" in
4351a finally clause is possible, but not recommended since it abandons the
4352cleanup actions for the try conditional. But, of course, interrupt and error
4353exceptions might get raised from a finally clause.
4354 Example where an error in the finally clause stops an interrupt from
4355working correctly: >
4356
4357 :try
4358 : try
4359 : echo "Press CTRL-C for interrupt"
4360 : while 1
4361 : endwhile
4362 : finally
4363 : unlet novar
4364 : endtry
4365 :catch /novar/
4366 :endtry
4367 :echo "Script still running"
4368 :sleep 1
4369
4370If you need to put commands that could fail into a finally clause, you should
4371think about catching or ignoring the errors in these commands, see
4372|catch-errors| and |ignore-errors|.
4373
4374
4375CATCHING ERRORS *catch-errors*
4376
4377If you want to catch specific errors, you just have to put the code to be
4378watched in a try block and add a catch clause for the error message. The
4379presence of the try conditional causes all errors to be converted to an
4380exception. No message is displayed and |v:errmsg| is not set then. To find
4381the right pattern for the ":catch" command, you have to know how the format of
4382the error exception is.
4383 Error exceptions have the following format: >
4384
4385 Vim({cmdname}):{errmsg}
4386or >
4387 Vim:{errmsg}
4388
4389{cmdname} is the name of the command that failed; the second form is used when
Bram Moolenaar58b85342016-08-14 19:54:54 +02004390the command name is not known. {errmsg} is the error message usually produced
Bram Moolenaar071d4272004-06-13 20:20:40 +00004391when the error occurs outside try conditionals. It always begins with
4392a capital "E", followed by a two or three-digit error number, a colon, and
4393a space.
4394
4395Examples:
4396
4397The command >
4398 :unlet novar
4399normally produces the error message >
4400 E108: No such variable: "novar"
4401which is converted inside try conditionals to an exception >
4402 Vim(unlet):E108: No such variable: "novar"
4403
4404The command >
4405 :dwim
4406normally produces the error message >
4407 E492: Not an editor command: dwim
4408which is converted inside try conditionals to an exception >
4409 Vim:E492: Not an editor command: dwim
4410
4411You can catch all ":unlet" errors by a >
4412 :catch /^Vim(unlet):/
4413or all errors for misspelled command names by a >
4414 :catch /^Vim:E492:/
4415
4416Some error messages may be produced by different commands: >
4417 :function nofunc
4418and >
4419 :delfunction nofunc
4420both produce the error message >
4421 E128: Function name must start with a capital: nofunc
4422which is converted inside try conditionals to an exception >
4423 Vim(function):E128: Function name must start with a capital: nofunc
4424or >
4425 Vim(delfunction):E128: Function name must start with a capital: nofunc
4426respectively. You can catch the error by its number independently on the
4427command that caused it if you use the following pattern: >
4428 :catch /^Vim(\a\+):E128:/
4429
4430Some commands like >
4431 :let x = novar
4432produce multiple error messages, here: >
4433 E121: Undefined variable: novar
4434 E15: Invalid expression: novar
4435Only the first is used for the exception value, since it is the most specific
4436one (see |except-several-errors|). So you can catch it by >
4437 :catch /^Vim(\a\+):E121:/
4438
4439You can catch all errors related to the name "nofunc" by >
4440 :catch /\<nofunc\>/
4441
4442You can catch all Vim errors in the ":write" and ":read" commands by >
4443 :catch /^Vim(\(write\|read\)):E\d\+:/
4444
4445You can catch all Vim errors by the pattern >
4446 :catch /^Vim\((\a\+)\)\=:E\d\+:/
4447<
4448 *catch-text*
4449NOTE: You should never catch the error message text itself: >
4450 :catch /No such variable/
Bram Moolenaar2b8388b2015-02-28 13:11:45 +01004451only works in the English locale, but not when the user has selected
Bram Moolenaar071d4272004-06-13 20:20:40 +00004452a different language by the |:language| command. It is however helpful to
4453cite the message text in a comment: >
4454 :catch /^Vim(\a\+):E108:/ " No such variable
4455
4456
4457IGNORING ERRORS *ignore-errors*
4458
4459You can ignore errors in a specific Vim command by catching them locally: >
4460
4461 :try
4462 : write
4463 :catch
4464 :endtry
4465
4466But you are strongly recommended NOT to use this simple form, since it could
4467catch more than you want. With the ":write" command, some autocommands could
4468be executed and cause errors not related to writing, for instance: >
4469
4470 :au BufWritePre * unlet novar
4471
4472There could even be such errors you are not responsible for as a script
4473writer: a user of your script might have defined such autocommands. You would
4474then hide the error from the user.
4475 It is much better to use >
4476
4477 :try
4478 : write
4479 :catch /^Vim(write):/
4480 :endtry
4481
4482which only catches real write errors. So catch only what you'd like to ignore
4483intentionally.
4484
4485For a single command that does not cause execution of autocommands, you could
4486even suppress the conversion of errors to exceptions by the ":silent!"
4487command: >
4488 :silent! nunmap k
4489This works also when a try conditional is active.
4490
4491
4492CATCHING INTERRUPTS *catch-interrupt*
4493
4494When there are active try conditionals, an interrupt (CTRL-C) is converted to
Bram Moolenaar58b85342016-08-14 19:54:54 +02004495the exception "Vim:Interrupt". You can catch it like every exception. The
Bram Moolenaar071d4272004-06-13 20:20:40 +00004496script is not terminated, then.
4497 Example: >
4498
4499 :function! TASK1()
4500 : sleep 10
4501 :endfunction
4502
4503 :function! TASK2()
4504 : sleep 20
4505 :endfunction
4506
4507 :while 1
4508 : let command = input("Type a command: ")
4509 : try
4510 : if command == ""
4511 : continue
4512 : elseif command == "END"
4513 : break
4514 : elseif command == "TASK1"
4515 : call TASK1()
4516 : elseif command == "TASK2"
4517 : call TASK2()
4518 : else
4519 : echo "\nIllegal command:" command
4520 : continue
4521 : endif
4522 : catch /^Vim:Interrupt$/
4523 : echo "\nCommand interrupted"
4524 : " Caught the interrupt. Continue with next prompt.
4525 : endtry
4526 :endwhile
4527
4528You can interrupt a task here by pressing CTRL-C; the script then asks for
Bram Moolenaar58b85342016-08-14 19:54:54 +02004529a new command. If you press CTRL-C at the prompt, the script is terminated.
Bram Moolenaar071d4272004-06-13 20:20:40 +00004530
4531For testing what happens when CTRL-C would be pressed on a specific line in
4532your script, use the debug mode and execute the |>quit| or |>interrupt|
4533command on that line. See |debug-scripts|.
4534
4535
4536CATCHING ALL *catch-all*
4537
4538The commands >
4539
4540 :catch /.*/
4541 :catch //
4542 :catch
4543
4544catch everything, error exceptions, interrupt exceptions and exceptions
4545explicitly thrown by the |:throw| command. This is useful at the top level of
4546a script in order to catch unexpected things.
4547 Example: >
4548
4549 :try
4550 :
4551 : " do the hard work here
4552 :
4553 :catch /MyException/
4554 :
4555 : " handle known problem
4556 :
4557 :catch /^Vim:Interrupt$/
4558 : echo "Script interrupted"
4559 :catch /.*/
Bram Moolenaarc51cf032022-02-26 12:25:45 +00004560 : echo "Internal error (" .. v:exception .. ")"
4561 : echo " - occurred at " .. v:throwpoint
Bram Moolenaar071d4272004-06-13 20:20:40 +00004562 :endtry
4563 :" end of script
4564
4565Note: Catching all might catch more things than you want. Thus, you are
4566strongly encouraged to catch only for problems that you can really handle by
4567specifying a pattern argument to the ":catch".
4568 Example: Catching all could make it nearly impossible to interrupt a script
4569by pressing CTRL-C: >
4570
4571 :while 1
4572 : try
4573 : sleep 1
4574 : catch
4575 : endtry
4576 :endwhile
4577
4578
4579EXCEPTIONS AND AUTOCOMMANDS *except-autocmd*
4580
4581Exceptions may be used during execution of autocommands. Example: >
4582
4583 :autocmd User x try
4584 :autocmd User x throw "Oops!"
4585 :autocmd User x catch
4586 :autocmd User x echo v:exception
4587 :autocmd User x endtry
4588 :autocmd User x throw "Arrgh!"
4589 :autocmd User x echo "Should not be displayed"
4590 :
4591 :try
4592 : doautocmd User x
4593 :catch
4594 : echo v:exception
4595 :endtry
4596
4597This displays "Oops!" and "Arrgh!".
4598
4599 *except-autocmd-Pre*
4600For some commands, autocommands get executed before the main action of the
4601command takes place. If an exception is thrown and not caught in the sequence
4602of autocommands, the sequence and the command that caused its execution are
4603abandoned and the exception is propagated to the caller of the command.
4604 Example: >
4605
4606 :autocmd BufWritePre * throw "FAIL"
4607 :autocmd BufWritePre * echo "Should not be displayed"
4608 :
4609 :try
4610 : write
4611 :catch
4612 : echo "Caught:" v:exception "from" v:throwpoint
4613 :endtry
4614
4615Here, the ":write" command does not write the file currently being edited (as
4616you can see by checking 'modified'), since the exception from the BufWritePre
4617autocommand abandons the ":write". The exception is then caught and the
4618script displays: >
4619
4620 Caught: FAIL from BufWrite Auto commands for "*"
4621<
4622 *except-autocmd-Post*
4623For some commands, autocommands get executed after the main action of the
4624command has taken place. If this main action fails and the command is inside
4625an active try conditional, the autocommands are skipped and an error exception
4626is thrown that can be caught by the caller of the command.
4627 Example: >
4628
4629 :autocmd BufWritePost * echo "File successfully written!"
4630 :
4631 :try
4632 : write /i/m/p/o/s/s/i/b/l/e
4633 :catch
4634 : echo v:exception
4635 :endtry
4636
4637This just displays: >
4638
4639 Vim(write):E212: Can't open file for writing (/i/m/p/o/s/s/i/b/l/e)
4640
4641If you really need to execute the autocommands even when the main action
4642fails, trigger the event from the catch clause.
4643 Example: >
4644
4645 :autocmd BufWritePre * set noreadonly
4646 :autocmd BufWritePost * set readonly
4647 :
4648 :try
4649 : write /i/m/p/o/s/s/i/b/l/e
4650 :catch
4651 : doautocmd BufWritePost /i/m/p/o/s/s/i/b/l/e
4652 :endtry
4653<
4654You can also use ":silent!": >
4655
4656 :let x = "ok"
4657 :let v:errmsg = ""
4658 :autocmd BufWritePost * if v:errmsg != ""
4659 :autocmd BufWritePost * let x = "after fail"
4660 :autocmd BufWritePost * endif
4661 :try
4662 : silent! write /i/m/p/o/s/s/i/b/l/e
4663 :catch
4664 :endtry
4665 :echo x
4666
4667This displays "after fail".
4668
4669If the main action of the command does not fail, exceptions from the
4670autocommands will be catchable by the caller of the command: >
4671
4672 :autocmd BufWritePost * throw ":-("
4673 :autocmd BufWritePost * echo "Should not be displayed"
4674 :
4675 :try
4676 : write
4677 :catch
4678 : echo v:exception
4679 :endtry
4680<
4681 *except-autocmd-Cmd*
4682For some commands, the normal action can be replaced by a sequence of
4683autocommands. Exceptions from that sequence will be catchable by the caller
4684of the command.
4685 Example: For the ":write" command, the caller cannot know whether the file
Bram Moolenaar58b85342016-08-14 19:54:54 +02004686had actually been written when the exception occurred. You need to tell it in
Bram Moolenaar071d4272004-06-13 20:20:40 +00004687some way. >
4688
4689 :if !exists("cnt")
4690 : let cnt = 0
4691 :
4692 : autocmd BufWriteCmd * if &modified
4693 : autocmd BufWriteCmd * let cnt = cnt + 1
4694 : autocmd BufWriteCmd * if cnt % 3 == 2
4695 : autocmd BufWriteCmd * throw "BufWriteCmdError"
4696 : autocmd BufWriteCmd * endif
4697 : autocmd BufWriteCmd * write | set nomodified
4698 : autocmd BufWriteCmd * if cnt % 3 == 0
4699 : autocmd BufWriteCmd * throw "BufWriteCmdError"
4700 : autocmd BufWriteCmd * endif
4701 : autocmd BufWriteCmd * echo "File successfully written!"
4702 : autocmd BufWriteCmd * endif
4703 :endif
4704 :
4705 :try
4706 : write
4707 :catch /^BufWriteCmdError$/
4708 : if &modified
4709 : echo "Error on writing (file contents not changed)"
4710 : else
4711 : echo "Error after writing"
4712 : endif
4713 :catch /^Vim(write):/
4714 : echo "Error on writing"
4715 :endtry
4716
4717When this script is sourced several times after making changes, it displays
4718first >
4719 File successfully written!
4720then >
4721 Error on writing (file contents not changed)
4722then >
4723 Error after writing
4724etc.
4725
4726 *except-autocmd-ill*
4727You cannot spread a try conditional over autocommands for different events.
4728The following code is ill-formed: >
4729
4730 :autocmd BufWritePre * try
4731 :
4732 :autocmd BufWritePost * catch
4733 :autocmd BufWritePost * echo v:exception
4734 :autocmd BufWritePost * endtry
4735 :
4736 :write
4737
4738
4739EXCEPTION HIERARCHIES AND PARAMETERIZED EXCEPTIONS *except-hier-param*
4740
4741Some programming languages allow to use hierarchies of exception classes or to
4742pass additional information with the object of an exception class. You can do
4743similar things in Vim.
4744 In order to throw an exception from a hierarchy, just throw the complete
4745class name with the components separated by a colon, for instance throw the
4746string "EXCEPT:MATHERR:OVERFLOW" for an overflow in a mathematical library.
4747 When you want to pass additional information with your exception class, add
4748it in parentheses, for instance throw the string "EXCEPT:IO:WRITEERR(myfile)"
4749for an error when writing "myfile".
4750 With the appropriate patterns in the ":catch" command, you can catch for
4751base classes or derived classes of your hierarchy. Additional information in
4752parentheses can be cut out from |v:exception| with the ":substitute" command.
4753 Example: >
4754
4755 :function! CheckRange(a, func)
4756 : if a:a < 0
Bram Moolenaarc51cf032022-02-26 12:25:45 +00004757 : throw "EXCEPT:MATHERR:RANGE(" .. a:func .. ")"
Bram Moolenaar071d4272004-06-13 20:20:40 +00004758 : endif
4759 :endfunction
4760 :
4761 :function! Add(a, b)
4762 : call CheckRange(a:a, "Add")
4763 : call CheckRange(a:b, "Add")
4764 : let c = a:a + a:b
4765 : if c < 0
4766 : throw "EXCEPT:MATHERR:OVERFLOW"
4767 : endif
4768 : return c
4769 :endfunction
4770 :
4771 :function! Div(a, b)
4772 : call CheckRange(a:a, "Div")
4773 : call CheckRange(a:b, "Div")
4774 : if (a:b == 0)
4775 : throw "EXCEPT:MATHERR:ZERODIV"
4776 : endif
4777 : return a:a / a:b
4778 :endfunction
4779 :
4780 :function! Write(file)
4781 : try
Bram Moolenaar446cb832008-06-24 21:56:24 +00004782 : execute "write" fnameescape(a:file)
Bram Moolenaar071d4272004-06-13 20:20:40 +00004783 : catch /^Vim(write):/
Bram Moolenaarc51cf032022-02-26 12:25:45 +00004784 : throw "EXCEPT:IO(" .. getcwd() .. ", " .. a:file .. "):WRITEERR"
Bram Moolenaar071d4272004-06-13 20:20:40 +00004785 : endtry
4786 :endfunction
4787 :
4788 :try
4789 :
Bram Moolenaar75ab5902022-04-18 15:36:40 +01004790 : " something with arithmetic and I/O
Bram Moolenaar071d4272004-06-13 20:20:40 +00004791 :
4792 :catch /^EXCEPT:MATHERR:RANGE/
4793 : let function = substitute(v:exception, '.*(\(\a\+\)).*', '\1', "")
4794 : echo "Range error in" function
4795 :
4796 :catch /^EXCEPT:MATHERR/ " catches OVERFLOW and ZERODIV
4797 : echo "Math error"
4798 :
4799 :catch /^EXCEPT:IO/
4800 : let dir = substitute(v:exception, '.*(\(.\+\),\s*.\+).*', '\1', "")
4801 : let file = substitute(v:exception, '.*(.\+,\s*\(.\+\)).*', '\1', "")
4802 : if file !~ '^/'
Bram Moolenaarc51cf032022-02-26 12:25:45 +00004803 : let file = dir .. "/" .. file
Bram Moolenaar071d4272004-06-13 20:20:40 +00004804 : endif
Bram Moolenaarc51cf032022-02-26 12:25:45 +00004805 : echo 'I/O error for "' .. file .. '"'
Bram Moolenaar071d4272004-06-13 20:20:40 +00004806 :
4807 :catch /^EXCEPT/
4808 : echo "Unspecified error"
4809 :
4810 :endtry
4811
4812The exceptions raised by Vim itself (on error or when pressing CTRL-C) use
4813a flat hierarchy: they are all in the "Vim" class. You cannot throw yourself
4814exceptions with the "Vim" prefix; they are reserved for Vim.
4815 Vim error exceptions are parameterized with the name of the command that
4816failed, if known. See |catch-errors|.
4817
4818
4819PECULIARITIES
4820 *except-compat*
4821The exception handling concept requires that the command sequence causing the
4822exception is aborted immediately and control is transferred to finally clauses
4823and/or a catch clause.
4824
4825In the Vim script language there are cases where scripts and functions
4826continue after an error: in functions without the "abort" flag or in a command
4827after ":silent!", control flow goes to the following line, and outside
4828functions, control flow goes to the line following the outermost ":endwhile"
4829or ":endif". On the other hand, errors should be catchable as exceptions
4830(thus, requiring the immediate abortion).
4831
4832This problem has been solved by converting errors to exceptions and using
4833immediate abortion (if not suppressed by ":silent!") only when a try
Bram Moolenaar58b85342016-08-14 19:54:54 +02004834conditional is active. This is no restriction since an (error) exception can
4835be caught only from an active try conditional. If you want an immediate
Bram Moolenaar071d4272004-06-13 20:20:40 +00004836termination without catching the error, just use a try conditional without
4837catch clause. (You can cause cleanup code being executed before termination
4838by specifying a finally clause.)
4839
4840When no try conditional is active, the usual abortion and continuation
4841behavior is used instead of immediate abortion. This ensures compatibility of
4842scripts written for Vim 6.1 and earlier.
4843
4844However, when sourcing an existing script that does not use exception handling
4845commands (or when calling one of its functions) from inside an active try
4846conditional of a new script, you might change the control flow of the existing
4847script on error. You get the immediate abortion on error and can catch the
4848error in the new script. If however the sourced script suppresses error
4849messages by using the ":silent!" command (checking for errors by testing
Bram Moolenaar58b85342016-08-14 19:54:54 +02004850|v:errmsg| if appropriate), its execution path is not changed. The error is
4851not converted to an exception. (See |:silent|.) So the only remaining cause
Bram Moolenaar071d4272004-06-13 20:20:40 +00004852where this happens is for scripts that don't care about errors and produce
4853error messages. You probably won't want to use such code from your new
4854scripts.
4855
4856 *except-syntax-err*
4857Syntax errors in the exception handling commands are never caught by any of
4858the ":catch" commands of the try conditional they belong to. Its finally
4859clauses, however, is executed.
4860 Example: >
4861
4862 :try
4863 : try
4864 : throw 4711
4865 : catch /\(/
4866 : echo "in catch with syntax error"
4867 : catch
4868 : echo "inner catch-all"
4869 : finally
4870 : echo "inner finally"
4871 : endtry
4872 :catch
Bram Moolenaarc51cf032022-02-26 12:25:45 +00004873 : echo 'outer catch-all caught "' .. v:exception .. '"'
Bram Moolenaar071d4272004-06-13 20:20:40 +00004874 : finally
4875 : echo "outer finally"
4876 :endtry
4877
4878This displays: >
4879 inner finally
4880 outer catch-all caught "Vim(catch):E54: Unmatched \("
4881 outer finally
4882The original exception is discarded and an error exception is raised, instead.
4883
4884 *except-single-line*
4885The ":try", ":catch", ":finally", and ":endtry" commands can be put on
4886a single line, but then syntax errors may make it difficult to recognize the
4887"catch" line, thus you better avoid this.
4888 Example: >
4889 :try | unlet! foo # | catch | endtry
4890raises an error exception for the trailing characters after the ":unlet!"
4891argument, but does not see the ":catch" and ":endtry" commands, so that the
4892error exception is discarded and the "E488: Trailing characters" message gets
4893displayed.
4894
4895 *except-several-errors*
4896When several errors appear in a single command, the first error message is
Bram Moolenaar53f7fcc2021-07-28 20:10:16 +02004897usually the most specific one and therefore converted to the error exception.
Bram Moolenaar071d4272004-06-13 20:20:40 +00004898 Example: >
4899 echo novar
4900causes >
4901 E121: Undefined variable: novar
4902 E15: Invalid expression: novar
4903The value of the error exception inside try conditionals is: >
4904 Vim(echo):E121: Undefined variable: novar
4905< *except-syntax-error*
4906But when a syntax error is detected after a normal error in the same command,
4907the syntax error is used for the exception being thrown.
4908 Example: >
4909 unlet novar #
4910causes >
4911 E108: No such variable: "novar"
4912 E488: Trailing characters
4913The value of the error exception inside try conditionals is: >
4914 Vim(unlet):E488: Trailing characters
4915This is done because the syntax error might change the execution path in a way
4916not intended by the user. Example: >
4917 try
4918 try | unlet novar # | catch | echo v:exception | endtry
4919 catch /.*/
4920 echo "outer catch:" v:exception
4921 endtry
4922This displays "outer catch: Vim(unlet):E488: Trailing characters", and then
4923a "E600: Missing :endtry" error message is given, see |except-single-line|.
4924
4925==============================================================================
49269. Examples *eval-examples*
4927
Bram Moolenaaref2f6562007-05-06 13:32:59 +00004928Printing in Binary ~
Bram Moolenaar071d4272004-06-13 20:20:40 +00004929>
Bram Moolenaar8f3f58f2010-01-06 20:52:26 +01004930 :" The function Nr2Bin() returns the binary string representation of a number.
Bram Moolenaaref2f6562007-05-06 13:32:59 +00004931 :func Nr2Bin(nr)
Bram Moolenaar071d4272004-06-13 20:20:40 +00004932 : let n = a:nr
4933 : let r = ""
4934 : while n
Bram Moolenaarc51cf032022-02-26 12:25:45 +00004935 : let r = '01'[n % 2] .. r
Bram Moolenaaref2f6562007-05-06 13:32:59 +00004936 : let n = n / 2
Bram Moolenaar071d4272004-06-13 20:20:40 +00004937 : endwhile
4938 : return r
4939 :endfunc
4940
Bram Moolenaaref2f6562007-05-06 13:32:59 +00004941 :" The function String2Bin() converts each character in a string to a
4942 :" binary string, separated with dashes.
4943 :func String2Bin(str)
Bram Moolenaar071d4272004-06-13 20:20:40 +00004944 : let out = ''
Bram Moolenaaref2f6562007-05-06 13:32:59 +00004945 : for ix in range(strlen(a:str))
Bram Moolenaarc51cf032022-02-26 12:25:45 +00004946 : let out = out .. '-' .. Nr2Bin(char2nr(a:str[ix]))
Bram Moolenaaref2f6562007-05-06 13:32:59 +00004947 : endfor
4948 : return out[1:]
Bram Moolenaar071d4272004-06-13 20:20:40 +00004949 :endfunc
4950
4951Example of its use: >
Bram Moolenaaref2f6562007-05-06 13:32:59 +00004952 :echo Nr2Bin(32)
4953result: "100000" >
4954 :echo String2Bin("32")
4955result: "110011-110010"
Bram Moolenaar071d4272004-06-13 20:20:40 +00004956
4957
Bram Moolenaaref2f6562007-05-06 13:32:59 +00004958Sorting lines ~
Bram Moolenaar071d4272004-06-13 20:20:40 +00004959
Bram Moolenaaref2f6562007-05-06 13:32:59 +00004960This example sorts lines with a specific compare function. >
4961
4962 :func SortBuffer()
4963 : let lines = getline(1, '$')
4964 : call sort(lines, function("Strcmp"))
4965 : call setline(1, lines)
Bram Moolenaar071d4272004-06-13 20:20:40 +00004966 :endfunction
4967
Bram Moolenaaref2f6562007-05-06 13:32:59 +00004968As a one-liner: >
4969 :call setline(1, sort(getline(1, '$'), function("Strcmp")))
Bram Moolenaar071d4272004-06-13 20:20:40 +00004970
Bram Moolenaar071d4272004-06-13 20:20:40 +00004971
Bram Moolenaaref2f6562007-05-06 13:32:59 +00004972scanf() replacement ~
Bram Moolenaar071d4272004-06-13 20:20:40 +00004973 *sscanf*
4974There is no sscanf() function in Vim. If you need to extract parts from a
4975line, you can use matchstr() and substitute() to do it. This example shows
4976how to get the file name, line number and column number out of a line like
4977"foobar.txt, 123, 45". >
4978 :" Set up the match bit
4979 :let mx='\(\f\+\),\s*\(\d\+\),\s*\(\d\+\)'
4980 :"get the part matching the whole expression
4981 :let l = matchstr(line, mx)
4982 :"get each item out of the match
4983 :let file = substitute(l, mx, '\1', '')
4984 :let lnum = substitute(l, mx, '\2', '')
4985 :let col = substitute(l, mx, '\3', '')
4986
4987The input is in the variable "line", the results in the variables "file",
4988"lnum" and "col". (idea from Michael Geddes)
4989
Bram Moolenaaref2f6562007-05-06 13:32:59 +00004990
4991getting the scriptnames in a Dictionary ~
4992 *scriptnames-dictionary*
4993The |:scriptnames| command can be used to get a list of all script files that
4994have been sourced. There is no equivalent function or variable for this
4995(because it's rarely needed). In case you need to manipulate the list this
4996code can be used: >
4997 " Get the output of ":scriptnames" in the scriptnames_output variable.
4998 let scriptnames_output = ''
4999 redir => scriptnames_output
5000 silent scriptnames
5001 redir END
Bram Moolenaarb0d45e72017-11-05 18:19:24 +01005002
Bram Moolenaar446cb832008-06-24 21:56:24 +00005003 " Split the output into lines and parse each line. Add an entry to the
Bram Moolenaaref2f6562007-05-06 13:32:59 +00005004 " "scripts" dictionary.
5005 let scripts = {}
5006 for line in split(scriptnames_output, "\n")
5007 " Only do non-blank lines.
5008 if line =~ '\S'
5009 " Get the first number in the line.
Bram Moolenaar446cb832008-06-24 21:56:24 +00005010 let nr = matchstr(line, '\d\+')
Bram Moolenaaref2f6562007-05-06 13:32:59 +00005011 " Get the file name, remove the script number " 123: ".
Bram Moolenaar446cb832008-06-24 21:56:24 +00005012 let name = substitute(line, '.\+:\s*', '', '')
Bram Moolenaaref2f6562007-05-06 13:32:59 +00005013 " Add an item to the Dictionary
Bram Moolenaar446cb832008-06-24 21:56:24 +00005014 let scripts[nr] = name
Bram Moolenaaref2f6562007-05-06 13:32:59 +00005015 endif
5016 endfor
5017 unlet scriptnames_output
5018
Bram Moolenaar071d4272004-06-13 20:20:40 +00005019==============================================================================
Bram Moolenaar558ca4a2019-04-04 18:15:38 +0200502010. Vim script versions *vimscript-version* *vimscript-versions*
Bram Moolenaar911ead12019-04-21 00:03:35 +02005021 *scriptversion*
Bram Moolenaar558ca4a2019-04-04 18:15:38 +02005022Over time many features have been added to Vim script. This includes Ex
5023commands, functions, variable types, etc. Each individual feature can be
5024checked with the |has()| and |exists()| functions.
5025
5026Sometimes old syntax of functionality gets in the way of making Vim better.
5027When support is taken away this will break older Vim scripts. To make this
5028explicit the |:scriptversion| command can be used. When a Vim script is not
5029compatible with older versions of Vim this will give an explicit error,
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +02005030instead of failing in mysterious ways.
Bram Moolenaar558ca4a2019-04-04 18:15:38 +02005031
Bram Moolenaara2baa732022-02-04 16:09:54 +00005032When using a legacy function, defined with `:function`, in |Vim9| script then
5033scriptversion 4 is used.
5034
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +02005035 *scriptversion-1* >
Bram Moolenaar558ca4a2019-04-04 18:15:38 +02005036 :scriptversion 1
5037< This is the original Vim script, same as not using a |:scriptversion|
5038 command. Can be used to go back to old syntax for a range of lines.
5039 Test for support with: >
5040 has('vimscript-1')
5041
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +02005042< *scriptversion-2* >
Bram Moolenaar558ca4a2019-04-04 18:15:38 +02005043 :scriptversion 2
Bram Moolenaar68e65602019-05-26 21:33:31 +02005044< String concatenation with "." is not supported, use ".." instead.
Bram Moolenaar558ca4a2019-04-04 18:15:38 +02005045 This avoids the ambiguity using "." for Dict member access and
5046 floating point numbers. Now ".5" means the number 0.5.
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +02005047
5048 *scriptversion-3* >
Bram Moolenaar911ead12019-04-21 00:03:35 +02005049 :scriptversion 3
5050< All |vim-variable|s must be prefixed by "v:". E.g. "version" doesn't
5051 work as |v:version| anymore, it can be used as a normal variable.
5052 Same for some obvious names as "count" and others.
Bram Moolenaar558ca4a2019-04-04 18:15:38 +02005053
Bram Moolenaar911ead12019-04-21 00:03:35 +02005054 Test for support with: >
5055 has('vimscript-3')
Bram Moolenaar60a8de22019-09-15 14:33:22 +02005056<
5057 *scriptversion-4* >
5058 :scriptversion 4
Bram Moolenaarc17e66c2020-06-02 21:38:22 +02005059< Numbers with a leading zero are not recognized as octal. "0o" or "0O"
5060 is still recognized as octal. With the
Bram Moolenaar60a8de22019-09-15 14:33:22 +02005061 previous version you get: >
Bram Moolenaarc17e66c2020-06-02 21:38:22 +02005062 echo 017 " displays 15 (octal)
5063 echo 0o17 " displays 15 (octal)
5064 echo 018 " displays 18 (decimal)
Bram Moolenaar60a8de22019-09-15 14:33:22 +02005065< with script version 4: >
Bram Moolenaarc17e66c2020-06-02 21:38:22 +02005066 echo 017 " displays 17 (decimal)
5067 echo 0o17 " displays 15 (octal)
5068 echo 018 " displays 18 (decimal)
Bram Moolenaar60a8de22019-09-15 14:33:22 +02005069< Also, it is possible to use single quotes inside numbers to make them
5070 easier to read: >
5071 echo 1'000'000
5072< The quotes must be surrounded by digits.
5073
5074 Test for support with: >
5075 has('vimscript-4')
Bram Moolenaar558ca4a2019-04-04 18:15:38 +02005076
5077==============================================================================
507811. No +eval feature *no-eval-feature*
Bram Moolenaar071d4272004-06-13 20:20:40 +00005079
5080When the |+eval| feature was disabled at compile time, none of the expression
5081evaluation commands are available. To prevent this from causing Vim scripts
5082to generate all kinds of errors, the ":if" and ":endif" commands are still
5083recognized, though the argument of the ":if" and everything between the ":if"
5084and the matching ":endif" is ignored. Nesting of ":if" blocks is allowed, but
5085only if the commands are at the start of the line. The ":else" command is not
5086recognized.
5087
5088Example of how to avoid executing commands when the |+eval| feature is
5089missing: >
5090
5091 :if 1
5092 : echo "Expression evaluation is compiled in"
5093 :else
5094 : echo "You will _never_ see this message"
5095 :endif
5096
Bram Moolenaar773a97c2019-06-06 20:39:55 +02005097To execute a command only when the |+eval| feature is disabled can be done in
5098two ways. The simplest is to exit the script (or Vim) prematurely: >
5099 if 1
5100 echo "commands executed with +eval"
5101 finish
5102 endif
5103 args " command executed without +eval
5104
5105If you do not want to abort loading the script you can use a trick, as this
5106example shows: >
Bram Moolenaar45d2cca2017-04-30 16:36:05 +02005107
5108 silent! while 0
5109 set history=111
5110 silent! endwhile
5111
5112When the |+eval| feature is available the command is skipped because of the
5113"while 0". Without the |+eval| feature the "while 0" is an error, which is
5114silently ignored, and the command is executed.
Bram Moolenaarcd5c8f82017-04-09 20:11:58 +02005115
Bram Moolenaar071d4272004-06-13 20:20:40 +00005116==============================================================================
Bram Moolenaar2f0936c2022-01-08 21:51:59 +0000511712. The sandbox *eval-sandbox* *sandbox*
Bram Moolenaar071d4272004-06-13 20:20:40 +00005118
Bram Moolenaar368373e2010-07-19 20:46:22 +02005119The 'foldexpr', 'formatexpr', 'includeexpr', 'indentexpr', 'statusline' and
5120'foldtext' options may be evaluated in a sandbox. This means that you are
5121protected from these expressions having nasty side effects. This gives some
5122safety for when these options are set from a modeline. It is also used when
5123the command from a tags file is executed and for CTRL-R = in the command line.
Bram Moolenaar7b0294c2004-10-11 10:16:09 +00005124The sandbox is also used for the |:sandbox| command.
Bram Moolenaar2f0936c2022-01-08 21:51:59 +00005125 *E48*
Bram Moolenaar071d4272004-06-13 20:20:40 +00005126These items are not allowed in the sandbox:
5127 - changing the buffer text
Bram Moolenaarb477af22018-07-15 20:20:18 +02005128 - defining or changing mapping, autocommands, user commands
Bram Moolenaar071d4272004-06-13 20:20:40 +00005129 - setting certain options (see |option-summary|)
Bram Moolenaaref2f6562007-05-06 13:32:59 +00005130 - setting certain v: variables (see |v:var|) *E794*
Bram Moolenaar071d4272004-06-13 20:20:40 +00005131 - executing a shell command
5132 - reading or writing a file
5133 - jumping to another buffer or editing a file
Bram Moolenaar4770d092006-01-12 23:22:24 +00005134 - executing Python, Perl, etc. commands
Bram Moolenaar7b0294c2004-10-11 10:16:09 +00005135This is not guaranteed 100% secure, but it should block most attacks.
5136
5137 *:san* *:sandbox*
Bram Moolenaar045e82d2005-07-08 22:25:33 +00005138:san[dbox] {cmd} Execute {cmd} in the sandbox. Useful to evaluate an
Bram Moolenaar7b0294c2004-10-11 10:16:09 +00005139 option that may have been set from a modeline, e.g.
5140 'foldexpr'.
5141
Bram Moolenaarb71eaae2006-01-20 23:10:18 +00005142 *sandbox-option*
5143A few options contain an expression. When this expression is evaluated it may
Bram Moolenaar9b2200a2006-03-20 21:55:45 +00005144have to be done in the sandbox to avoid a security risk. But the sandbox is
Bram Moolenaarb71eaae2006-01-20 23:10:18 +00005145restrictive, thus this only happens when the option was set from an insecure
5146location. Insecure in this context are:
Bram Moolenaar551dbcc2006-04-25 22:13:59 +00005147- sourcing a .vimrc or .exrc in the current directory
Bram Moolenaarb71eaae2006-01-20 23:10:18 +00005148- while executing in the sandbox
5149- value coming from a modeline
Bram Moolenaarb477af22018-07-15 20:20:18 +02005150- executing a function that was defined in the sandbox
Bram Moolenaarb71eaae2006-01-20 23:10:18 +00005151
5152Note that when in the sandbox and saving an option value and restoring it, the
5153option will still be marked as it was set in the sandbox.
5154
5155==============================================================================
Bram Moolenaar558ca4a2019-04-04 18:15:38 +0200515613. Textlock *textlock*
Bram Moolenaarb71eaae2006-01-20 23:10:18 +00005157
5158In a few situations it is not allowed to change the text in the buffer, jump
5159to another window and some other things that might confuse or break what Vim
5160is currently doing. This mostly applies to things that happen when Vim is
Bram Moolenaar58b85342016-08-14 19:54:54 +02005161actually doing something else. For example, evaluating the 'balloonexpr' may
Bram Moolenaarb71eaae2006-01-20 23:10:18 +00005162happen any moment the mouse cursor is resting at some position.
5163
5164This is not allowed when the textlock is active:
5165 - changing the buffer text
5166 - jumping to another buffer or window
5167 - editing another file
5168 - closing a window or quitting Vim
5169 - etc.
5170
Bram Moolenaar071d4272004-06-13 20:20:40 +00005171
Bram Moolenaar91f84f62018-07-29 15:07:52 +02005172 vim:tw=78:ts=8:noet:ft=help:norl: