blob: e7152bb6708195fbb9f5a96016080ee13acc8582 [file] [log] [blame]
Bram Moolenaar10e8ff92023-06-10 21:40:39 +01001*eval.txt* For Vim version 9.0. Last change: 2023 Jun 01
Bram Moolenaar071d4272004-06-13 20:20:40 +00002
3
Bram Moolenaar446cb832008-06-24 21:56:24 +00004 VIM REFERENCE MANUAL by Bram Moolenaar
Bram Moolenaar071d4272004-06-13 20:20:40 +00005
6
7Expression evaluation *expression* *expr* *E15* *eval*
Bram Moolenaar6f4754b2022-01-23 12:07:04 +00008 *E1002*
Bram Moolenaar071d4272004-06-13 20:20:40 +00009Using expressions is introduced in chapter 41 of the user manual |usr_41.txt|.
10
11Note: Expression evaluation can be disabled at compile time. If this has been
Bram Moolenaar58b85342016-08-14 19:54:54 +020012done, the features in this document are not available. See |+eval| and
Bram Moolenaard8b02732005-01-14 21:48:43 +000013|no-eval-feature|.
Bram Moolenaar071d4272004-06-13 20:20:40 +000014
Bram Moolenaar1cae5a02021-12-27 21:28:34 +000015This file is mainly about the backwards compatible (legacy) Vim script. For
Bram Moolenaar2f0936c2022-01-08 21:51:59 +000016specifics of Vim9 script, which can execute much faster, supports type
17checking and much more, see |vim9.txt|. Where the syntax or semantics differ
18a remark is given.
Bram Moolenaar8a7d6542020-01-26 15:56:19 +010019
Bram Moolenaar13065c42005-01-08 16:08:21 +0000201. Variables |variables|
21 1.1 Variable types
Bram Moolenaar9588a0f2005-01-08 21:45:39 +000022 1.2 Function references |Funcref|
Bram Moolenaar7c626922005-02-07 22:01:03 +000023 1.3 Lists |Lists|
Bram Moolenaard8b02732005-01-14 21:48:43 +000024 1.4 Dictionaries |Dictionaries|
Bram Moolenaard8968242019-01-15 22:51:57 +010025 1.5 Blobs |Blobs|
26 1.6 More about variables |more-variables|
Bram Moolenaar13065c42005-01-08 16:08:21 +0000272. Expression syntax |expression-syntax|
283. Internal variable |internal-variables|
294. Builtin Functions |functions|
305. Defining functions |user-functions|
316. Curly braces names |curly-braces-names|
327. Commands |expression-commands|
338. Exception handling |exception-handling|
349. Examples |eval-examples|
Bram Moolenaar558ca4a2019-04-04 18:15:38 +02003510. Vim script version |vimscript-version|
3611. No +eval feature |no-eval-feature|
3712. The sandbox |eval-sandbox|
3813. Textlock |textlock|
Bram Moolenaared997ad2019-07-21 16:42:00 +020039
40Testing support is documented in |testing.txt|.
41Profiling is documented at |profiling|.
Bram Moolenaar071d4272004-06-13 20:20:40 +000042
Bram Moolenaar071d4272004-06-13 20:20:40 +000043==============================================================================
441. Variables *variables*
45
Bram Moolenaar13065c42005-01-08 16:08:21 +0000461.1 Variable types ~
Bram Moolenaarf10911e2022-01-29 22:20:48 +000047 *E712* *E896* *E897* *E899* *E1098*
48 *E1107* *E1135* *E1138*
Bram Moolenaar06fe74a2019-08-31 16:20:32 +020049There are ten types of variables:
Bram Moolenaar071d4272004-06-13 20:20:40 +000050
Bram Moolenaar664f3cf2019-12-07 16:03:51 +010051 *Number* *Integer*
52Number A 32 or 64 bit signed number. |expr-number|
Bram Moolenaarf9706e92020-02-22 14:27:04 +010053 The number of bits is available in |v:numbersize|.
Bram Moolenaar6f02b002021-01-10 20:22:54 +010054 Examples: -123 0x10 0177 0o177 0b1011
Bram Moolenaard8b02732005-01-14 21:48:43 +000055
Bram Moolenaar446cb832008-06-24 21:56:24 +000056Float A floating point number. |floating-point-format| *Float*
Bram Moolenaar446cb832008-06-24 21:56:24 +000057 Examples: 123.456 1.15e-6 -1.1e3
58
Bram Moolenaard8b02732005-01-14 21:48:43 +000059String A NUL terminated string of 8-bit unsigned characters (bytes).
Bram Moolenaar446cb832008-06-24 21:56:24 +000060 |expr-string| Examples: "ab\txx\"--" 'x-z''a,c'
Bram Moolenaard8b02732005-01-14 21:48:43 +000061
Bram Moolenaard8968242019-01-15 22:51:57 +010062List An ordered sequence of items, see |List| for details.
Bram Moolenaard8b02732005-01-14 21:48:43 +000063 Example: [1, 2, ['a', 'b']]
Bram Moolenaar071d4272004-06-13 20:20:40 +000064
Bram Moolenaar39a58ca2005-06-27 22:42:44 +000065Dictionary An associative, unordered array: Each entry has a key and a
66 value. |Dictionary|
Bram Moolenaard5abb4c2019-07-13 22:46:10 +020067 Examples:
68 {'blue': "#0000ff", 'red': "#ff0000"}
Bram Moolenaar4c6d9042019-07-16 22:04:02 +020069 #{blue: "#0000ff", red: "#ff0000"}
Bram Moolenaar39a58ca2005-06-27 22:42:44 +000070
Bram Moolenaar835dc632016-02-07 14:27:38 +010071Funcref A reference to a function |Funcref|.
72 Example: function("strlen")
Bram Moolenaar1d429612016-05-24 15:44:17 +020073 It can be bound to a dictionary and arguments, it then works
74 like a Partial.
75 Example: function("Callback", [arg], myDict)
Bram Moolenaar835dc632016-02-07 14:27:38 +010076
Bram Moolenaar02e83b42016-02-21 20:10:26 +010077Special |v:false|, |v:true|, |v:none| and |v:null|. *Special*
Bram Moolenaar835dc632016-02-07 14:27:38 +010078
Bram Moolenaarebf7dfa2016-04-14 12:46:51 +020079Job Used for a job, see |job_start()|. *Job* *Jobs*
Bram Moolenaar38a55632016-02-15 22:07:32 +010080
Bram Moolenaarebf7dfa2016-04-14 12:46:51 +020081Channel Used for a channel, see |ch_open()|. *Channel* *Channels*
Bram Moolenaar835dc632016-02-07 14:27:38 +010082
Bram Moolenaard8968242019-01-15 22:51:57 +010083Blob Binary Large Object. Stores any sequence of bytes. See |Blob|
84 for details
Bram Moolenaar6e5ea8d2019-01-12 22:47:31 +010085 Example: 0zFF00ED015DAF
86 0z is an empty Blob.
87
Bram Moolenaard7ee7ce2005-01-03 21:02:03 +000088The Number and String types are converted automatically, depending on how they
89are used.
Bram Moolenaar071d4272004-06-13 20:20:40 +000090
91Conversion from a Number to a String is by making the ASCII representation of
Bram Moolenaar24ea3ba2010-09-19 19:01:21 +020092the Number. Examples:
93 Number 123 --> String "123" ~
94 Number 0 --> String "0" ~
95 Number -1 --> String "-1" ~
Bram Moolenaar00a927d2010-05-14 23:24:24 +020096 *octal*
Bram Moolenaard43906d2020-07-20 21:31:32 +020097Conversion from a String to a Number only happens in legacy Vim script, not in
98Vim9 script. It is done by converting the first digits to a number.
99Hexadecimal "0xf9", Octal "017" or "0o17", and Binary "0b10"
Bram Moolenaar6f02b002021-01-10 20:22:54 +0100100numbers are recognized
Bram Moolenaar5da36052021-12-27 15:39:57 +0000101NOTE: when using |Vim9| script or |scriptversion-4| octal with a leading "0"
102is not recognized. The 0o notation requires patch 8.2.0886.
Bram Moolenaar6f02b002021-01-10 20:22:54 +0100103If the String doesn't start with digits, the result is zero.
Bram Moolenaarfa735342016-01-03 22:14:44 +0100104Examples:
Bram Moolenaar24ea3ba2010-09-19 19:01:21 +0200105 String "456" --> Number 456 ~
106 String "6bar" --> Number 6 ~
107 String "foo" --> Number 0 ~
108 String "0xf1" --> Number 241 ~
109 String "0100" --> Number 64 ~
Bram Moolenaarc17e66c2020-06-02 21:38:22 +0200110 String "0o100" --> Number 64 ~
Bram Moolenaarfa735342016-01-03 22:14:44 +0100111 String "0b101" --> Number 5 ~
Bram Moolenaar24ea3ba2010-09-19 19:01:21 +0200112 String "-8" --> Number -8 ~
113 String "+8" --> Number 0 ~
Bram Moolenaar071d4272004-06-13 20:20:40 +0000114
115To force conversion from String to Number, add zero to it: >
116 :echo "0100" + 0
Bram Moolenaar97b2ad32006-03-18 21:40:56 +0000117< 64 ~
118
119To avoid a leading zero to cause octal conversion, or for using a different
120base, use |str2nr()|.
Bram Moolenaar071d4272004-06-13 20:20:40 +0000121
Bram Moolenaard09091d2019-01-17 16:07:22 +0100122 *TRUE* *FALSE* *Boolean*
Bram Moolenaar071d4272004-06-13 20:20:40 +0000123For boolean operators Numbers are used. Zero is FALSE, non-zero is TRUE.
Bram Moolenaar6aa57292021-08-14 21:25:52 +0200124You can also use |v:false| and |v:true|, in Vim9 script |false| and |true|.
Bram Moolenaar1c6737b2020-09-07 22:18:52 +0200125When TRUE is returned from a function it is the Number one, FALSE is the
126number zero.
Bram Moolenaar071d4272004-06-13 20:20:40 +0000127
Bram Moolenaare381d3d2016-07-07 14:50:41 +0200128Note that in the command: >
Bram Moolenaar071d4272004-06-13 20:20:40 +0000129 :if "foo"
Bram Moolenaare381d3d2016-07-07 14:50:41 +0200130 :" NOT executed
131"foo" is converted to 0, which means FALSE. If the string starts with a
132non-zero number it means TRUE: >
133 :if "8foo"
134 :" executed
135To test for a non-empty string, use empty(): >
Bram Moolenaar3a0d8092012-10-21 03:02:54 +0200136 :if !empty("foo")
Bram Moolenaar92f26c22020-10-03 20:17:30 +0200137
138< *falsy* *truthy*
139An expression can be used as a condition, ignoring the type and only using
140whether the value is "sort of true" or "sort of false". Falsy is:
141 the number zero
142 empty string, blob, list or dictionary
143Other values are truthy. Examples:
144 0 falsy
145 1 truthy
146 -1 truthy
147 0.0 falsy
148 0.1 truthy
149 '' falsy
150 'x' truthy
151 [] falsy
152 [0] truthy
153 {} falsy
154 #{x: 1} truthy
155 0z falsy
156 0z00 truthy
157
Bram Moolenaare381d3d2016-07-07 14:50:41 +0200158 *non-zero-arg*
159Function arguments often behave slightly different from |TRUE|: If the
160argument is present and it evaluates to a non-zero Number, |v:true| or a
Bram Moolenaar64d8e252016-09-06 22:12:34 +0200161non-empty String, then the value is considered to be TRUE.
Bram Moolenaar01164a62017-11-02 22:58:42 +0100162Note that " " and "0" are also non-empty strings, thus considered to be TRUE.
163A List, Dictionary or Float is not a Number or String, thus evaluate to FALSE.
Bram Moolenaare381d3d2016-07-07 14:50:41 +0200164
Bram Moolenaar2f0936c2022-01-08 21:51:59 +0000165 *E611* *E745* *E728* *E703* *E729* *E730* *E731* *E908* *E910*
Bram Moolenaar7db29e42022-12-11 15:53:04 +0000166 *E913* *E974* *E975* *E976* *E1319* *E1320* *E1321* *E1322*
167 *E1323* *E1324*
168|List|, |Dictionary|, |Funcref|, |Job|, |Channel|, |Blob|, |Class| and
169|object| types are not automatically 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
Bram Moolenaar86b48162022-12-06 18:20:10 +0000637In some situations it is not allowed to remove or add entries to a Dictionary.
638Especially when iterating over all the entries. You will get *E1313* or
639another error in that case.
640
Bram Moolenaar2fda12f2005-01-15 22:14:15 +0000641
642Dictionary function ~
Bram Moolenaar26402cb2013-02-20 21:26:00 +0100643 *Dictionary-function* *self* *E725* *E862*
Bram Moolenaar2fda12f2005-01-15 22:14:15 +0000644When a function is defined with the "dict" attribute it can be used in a
Bram Moolenaar58b85342016-08-14 19:54:54 +0200645special way with a dictionary. Example: >
Bram Moolenaar2fda12f2005-01-15 22:14:15 +0000646 :function Mylen() dict
Bram Moolenaar3a3a7232005-01-17 22:16:15 +0000647 : return len(self.data)
Bram Moolenaar2fda12f2005-01-15 22:14:15 +0000648 :endfunction
Bram Moolenaar3a3a7232005-01-17 22:16:15 +0000649 :let mydict = {'data': [0, 1, 2, 3], 'len': function("Mylen")}
650 :echo mydict.len()
Bram Moolenaar2fda12f2005-01-15 22:14:15 +0000651
652This is like a method in object oriented programming. The entry in the
653Dictionary is a |Funcref|. The local variable "self" refers to the dictionary
Bram Moolenaar86b48162022-12-06 18:20:10 +0000654the function was invoked from. When using |Vim9| script you can use classes
655and objects, see `:class`.
Bram Moolenaar2fda12f2005-01-15 22:14:15 +0000656
Bram Moolenaar3a3a7232005-01-17 22:16:15 +0000657It is also possible to add a function without the "dict" attribute as a
658Funcref to a Dictionary, but the "self" variable is not available then.
659
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000660 *numbered-function* *anonymous-function*
Bram Moolenaar2fda12f2005-01-15 22:14:15 +0000661To avoid the extra name for the function it can be defined and directly
662assigned to a Dictionary in this way: >
Bram Moolenaar3a3a7232005-01-17 22:16:15 +0000663 :let mydict = {'data': [0, 1, 2, 3]}
Bram Moolenaar5a5f4592015-04-13 12:43:06 +0200664 :function mydict.len()
Bram Moolenaar3a3a7232005-01-17 22:16:15 +0000665 : return len(self.data)
Bram Moolenaar2fda12f2005-01-15 22:14:15 +0000666 :endfunction
Bram Moolenaar3a3a7232005-01-17 22:16:15 +0000667 :echo mydict.len()
Bram Moolenaar2fda12f2005-01-15 22:14:15 +0000668
Bram Moolenaar3a3a7232005-01-17 22:16:15 +0000669The function will then get a number and the value of dict.len is a |Funcref|
Bram Moolenaar58b85342016-08-14 19:54:54 +0200670that references this function. The function can only be used through a
Bram Moolenaar3a3a7232005-01-17 22:16:15 +0000671|Funcref|. It will automatically be deleted when there is no |Funcref|
672remaining that refers to it.
673
674It is not necessary to use the "dict" attribute for a numbered function.
Bram Moolenaar2fda12f2005-01-15 22:14:15 +0000675
Bram Moolenaar1affd722010-08-04 17:49:30 +0200676If you get an error for a numbered function, you can find out what it is with
677a trick. Assuming the function is 42, the command is: >
Bram Moolenaar34cc7d82021-09-21 20:09:51 +0200678 :function g:42
Bram Moolenaar1affd722010-08-04 17:49:30 +0200679
Bram Moolenaar2fda12f2005-01-15 22:14:15 +0000680
681Functions for Dictionaries ~
Bram Moolenaar3a3a7232005-01-17 22:16:15 +0000682 *E715*
683Functions that can be used with a Dictionary: >
Bram Moolenaar2fda12f2005-01-15 22:14:15 +0000684 :if has_key(dict, 'foo') " TRUE if dict has entry with key "foo"
685 :if empty(dict) " TRUE if dict is empty
686 :let l = len(dict) " number of items in dict
687 :let big = max(dict) " maximum value in dict
688 :let small = min(dict) " minimum value in dict
689 :let xs = count(dict, 'x') " count nr of times 'x' appears in dict
690 :let s = string(dict) " String representation of dict
Bram Moolenaarc51cf032022-02-26 12:25:45 +0000691 :call map(dict, '">> " .. v:val') " prepend ">> " to each item
Bram Moolenaard8b02732005-01-14 21:48:43 +0000692
693
Bram Moolenaard8968242019-01-15 22:51:57 +01006941.5 Blobs ~
695 *blob* *Blob* *Blobs* *E978*
Bram Moolenaaraff74912019-03-30 18:11:49 +0100696A Blob is a binary object. It can be used to read an image from a file and
697send it over a channel, for example.
698
699A Blob mostly behaves like a |List| of numbers, where each number has the
700value of an 8-bit byte, from 0 to 255.
Bram Moolenaard8968242019-01-15 22:51:57 +0100701
702
703Blob creation ~
704
705A Blob can be created with a |blob-literal|: >
706 :let b = 0zFF00ED015DAF
Bram Moolenaar0d17f0d2019-01-22 22:20:38 +0100707Dots can be inserted between bytes (pair of hex characters) for readability,
708they don't change the value: >
709 :let b = 0zFF00.ED01.5DAF
Bram Moolenaard8968242019-01-15 22:51:57 +0100710
711A blob can be read from a file with |readfile()| passing the {type} argument
712set to "B", for example: >
713 :let b = readfile('image.png', 'B')
714
715A blob can be read from a channel with the |ch_readblob()| function.
716
717
718Blob index ~
719 *blob-index* *E979*
720A byte in the Blob can be accessed by putting the index in square brackets
721after the Blob. Indexes are zero-based, thus the first byte has index zero. >
722 :let myblob = 0z00112233
723 :let byte = myblob[0] " get the first byte: 0x00
724 :let byte = myblob[2] " get the third byte: 0x22
725
726A negative index is counted from the end. Index -1 refers to the last byte in
727the Blob, -2 to the last but one byte, etc. >
728 :let last = myblob[-1] " get the last byte: 0x33
729
730To avoid an error for an invalid index use the |get()| function. When an item
731is not available it returns -1 or the default value you specify: >
732 :echo get(myblob, idx)
733 :echo get(myblob, idx, 999)
734
735
Bram Moolenaar5e66b422019-01-24 21:58:10 +0100736Blob iteration ~
737
738The |:for| loop executes commands for each byte of a Blob. The loop variable is
739set to each byte in the Blob. Example: >
740 :for byte in 0z112233
741 : call Doit(byte)
742 :endfor
743This calls Doit() with 0x11, 0x22 and 0x33.
744
745
Bram Moolenaard8968242019-01-15 22:51:57 +0100746Blob concatenation ~
747
748Two blobs can be concatenated with the "+" operator: >
749 :let longblob = myblob + 0z4455
750 :let myblob += 0z6677
751
752To change a blob in-place see |blob-modification| below.
753
754
755Part of a blob ~
756
757A part of the Blob can be obtained by specifying the first and last index,
758separated by a colon in square brackets: >
759 :let myblob = 0z00112233
Bram Moolenaard09091d2019-01-17 16:07:22 +0100760 :let shortblob = myblob[1:2] " get 0z1122
Bram Moolenaard8968242019-01-15 22:51:57 +0100761 :let shortblob = myblob[2:-1] " get 0z2233
762
763Omitting the first index is similar to zero. Omitting the last index is
764similar to -1. >
765 :let endblob = myblob[2:] " from item 2 to the end: 0z2233
766 :let shortblob = myblob[2:2] " Blob with one byte: 0z22
767 :let otherblob = myblob[:] " make a copy of the Blob
768
Bram Moolenaard09091d2019-01-17 16:07:22 +0100769If the first index is beyond the last byte of the Blob or the second index is
Bram Moolenaaraa5df7e2019-02-03 14:53:10 +0100770before the first index, the result is an empty Blob. There is no error
Bram Moolenaard8968242019-01-15 22:51:57 +0100771message.
772
773If the second index is equal to or greater than the length of the list the
774length minus one is used: >
775 :echo myblob[2:8] " result: 0z2233
776
777
778Blob modification ~
Bram Moolenaara2baa732022-02-04 16:09:54 +0000779 *blob-modification* *E1182* *E1184*
Bram Moolenaard8968242019-01-15 22:51:57 +0100780To change a specific byte of a blob use |:let| this way: >
781 :let blob[4] = 0x44
782
783When the index is just one beyond the end of the Blob, it is appended. Any
784higher index is an error.
785
786To change a sequence of bytes the [:] notation can be used: >
787 let blob[1:3] = 0z445566
Bram Moolenaard09091d2019-01-17 16:07:22 +0100788The length of the replaced bytes must be exactly the same as the value
Bram Moolenaard8968242019-01-15 22:51:57 +0100789provided. *E972*
790
791To change part of a blob you can specify the first and last byte to be
Bram Moolenaard09091d2019-01-17 16:07:22 +0100792modified. The value must have the same number of bytes in the range: >
793 :let blob[3:5] = 0z334455
Bram Moolenaard8968242019-01-15 22:51:57 +0100794
795You can also use the functions |add()|, |remove()| and |insert()|.
796
797
798Blob identity ~
799
800Blobs can be compared for equality: >
801 if blob == 0z001122
802And for equal identity: >
803 if blob is otherblob
804< *blob-identity* *E977*
805When variable "aa" is a Blob and you assign it to another variable "bb", both
806variables refer to the same Blob. Then the "is" operator returns true.
807
808When making a copy using [:] or |copy()| the values are the same, but the
809identity is different: >
810 :let blob = 0z112233
811 :let blob2 = blob
812 :echo blob == blob2
813< 1 >
814 :echo blob is blob2
815< 1 >
816 :let blob3 = blob[:]
817 :echo blob == blob3
818< 1 >
819 :echo blob is blob3
820< 0
821
Bram Moolenaard09091d2019-01-17 16:07:22 +0100822Making a copy of a Blob is done with the |copy()| function. Using [:] also
Bram Moolenaard8968242019-01-15 22:51:57 +0100823works, as explained above.
824
825
8261.6 More about variables ~
Bram Moolenaar13065c42005-01-08 16:08:21 +0000827 *more-variables*
Bram Moolenaar071d4272004-06-13 20:20:40 +0000828If you need to know the type of a variable or expression, use the |type()|
829function.
830
831When the '!' flag is included in the 'viminfo' option, global variables that
832start with an uppercase letter, and don't contain a lowercase letter, are
833stored in the viminfo file |viminfo-file|.
834
835When the 'sessionoptions' option contains "global", global variables that
836start with an uppercase letter and contain at least one lowercase letter are
837stored in the session file |session-file|.
838
839variable name can be stored where ~
840my_var_6 not
841My_Var_6 session file
842MY_VAR_6 viminfo file
843
844
Bram Moolenaar5da36052021-12-27 15:39:57 +0000845In legacy script it is possible to form a variable name with curly braces, see
Bram Moolenaar071d4272004-06-13 20:20:40 +0000846|curly-braces-names|.
847
848==============================================================================
8492. Expression syntax *expression-syntax*
Bram Moolenaarf10911e2022-01-29 22:20:48 +0000850 *E1143*
Bram Moolenaar071d4272004-06-13 20:20:40 +0000851Expression syntax summary, from least to most significant:
852
Bram Moolenaar50ba5262016-09-22 22:33:02 +0200853|expr1| expr2
Bram Moolenaar89bcfda2016-08-30 23:26:57 +0200854 expr2 ? expr1 : expr1 if-then-else
Bram Moolenaar071d4272004-06-13 20:20:40 +0000855
Bram Moolenaar89bcfda2016-08-30 23:26:57 +0200856|expr2| expr3
Bram Moolenaar0f248b02019-04-04 15:36:05 +0200857 expr3 || expr3 ... logical OR
Bram Moolenaar071d4272004-06-13 20:20:40 +0000858
Bram Moolenaar89bcfda2016-08-30 23:26:57 +0200859|expr3| expr4
Bram Moolenaar0f248b02019-04-04 15:36:05 +0200860 expr4 && expr4 ... logical AND
Bram Moolenaar071d4272004-06-13 20:20:40 +0000861
Bram Moolenaar89bcfda2016-08-30 23:26:57 +0200862|expr4| expr5
863 expr5 == expr5 equal
Bram Moolenaar071d4272004-06-13 20:20:40 +0000864 expr5 != expr5 not equal
865 expr5 > expr5 greater than
866 expr5 >= expr5 greater than or equal
867 expr5 < expr5 smaller than
868 expr5 <= expr5 smaller than or equal
869 expr5 =~ expr5 regexp matches
870 expr5 !~ expr5 regexp doesn't match
871
872 expr5 ==? expr5 equal, ignoring case
873 expr5 ==# expr5 equal, match case
874 etc. As above, append ? for ignoring case, # for
875 matching case
876
Bram Moolenaar5e66b422019-01-24 21:58:10 +0100877 expr5 is expr5 same |List|, |Dictionary| or |Blob| instance
878 expr5 isnot expr5 different |List|, |Dictionary| or |Blob|
879 instance
Bram Moolenaarde8866b2005-01-06 23:24:37 +0000880
Yegappan Lakshmanana061f342022-05-22 19:13:49 +0100881|expr5| expr6 << expr6 bitwise left shift
882 expr6 >> expr6 bitwise right shift
Bram Moolenaar071d4272004-06-13 20:20:40 +0000883
Bram Moolenaar89bcfda2016-08-30 23:26:57 +0200884|expr6| expr7
Yegappan Lakshmanana061f342022-05-22 19:13:49 +0100885 expr7 + expr7 ... number addition, list or blob concatenation
886 expr7 - expr7 ... number subtraction
887 expr7 . expr7 ... string concatenation
888 expr7 .. expr7 ... string concatenation
Bram Moolenaar071d4272004-06-13 20:20:40 +0000889
Bram Moolenaar89bcfda2016-08-30 23:26:57 +0200890|expr7| expr8
Yegappan Lakshmanana061f342022-05-22 19:13:49 +0100891 expr8 * expr8 ... number multiplication
892 expr8 / expr8 ... number division
893 expr8 % expr8 ... number modulo
Bram Moolenaar071d4272004-06-13 20:20:40 +0000894
Bram Moolenaar89bcfda2016-08-30 23:26:57 +0200895|expr8| expr9
Yegappan Lakshmanana061f342022-05-22 19:13:49 +0100896 <type>expr9 type check and conversion (|Vim9| only)
Bram Moolenaar2fda12f2005-01-15 22:14:15 +0000897
Bram Moolenaar5da36052021-12-27 15:39:57 +0000898|expr9| expr10
Yegappan Lakshmanana061f342022-05-22 19:13:49 +0100899 ! expr9 logical NOT
900 - expr9 unary minus
901 + expr9 unary plus
Bram Moolenaar5da36052021-12-27 15:39:57 +0000902
Yegappan Lakshmanana061f342022-05-22 19:13:49 +0100903|expr10| expr11
904 expr10[expr1] byte of a String or item of a |List|
905 expr10[expr1 : expr1] substring of a String or sublist of a |List|
906 expr10.name entry in a |Dictionary|
907 expr10(expr1, ...) function call with |Funcref| variable
908 expr10->name(expr1, ...) |method| call
909
910|expr11| number number constant
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +0000911 "string" string constant, backslash is special
Bram Moolenaard8b02732005-01-14 21:48:43 +0000912 'string' string constant, ' is doubled
Bram Moolenaar32466aa2006-02-24 23:53:04 +0000913 [expr1, ...] |List|
914 {expr1: expr1, ...} |Dictionary|
Bram Moolenaar5da36052021-12-27 15:39:57 +0000915 #{key: expr1, ...} legacy |Dictionary|
Bram Moolenaar071d4272004-06-13 20:20:40 +0000916 &option option value
917 (expr1) nested expression
918 variable internal variable
919 va{ria}ble internal variable with curly braces
920 $VAR environment variable
921 @r contents of register 'r'
922 function(expr1, ...) function call
923 func{ti}on(expr1, ...) function call with curly braces
Bram Moolenaar5da36052021-12-27 15:39:57 +0000924 {args -> expr1} legacy lambda expression
925 (args) => expr1 Vim9 lambda expression
Bram Moolenaar071d4272004-06-13 20:20:40 +0000926
927
Bram Moolenaar0f248b02019-04-04 15:36:05 +0200928"..." indicates that the operations in this level can be concatenated.
Bram Moolenaar071d4272004-06-13 20:20:40 +0000929Example: >
930 &nu || &list && &shell == "csh"
931
932All expressions within one level are parsed from left to right.
933
Bram Moolenaarf10911e2022-01-29 22:20:48 +0000934Expression nesting is limited to 1000 levels deep (300 when build with MSVC)
935to avoid running out of stack and crashing. *E1169*
936
Bram Moolenaar071d4272004-06-13 20:20:40 +0000937
Bram Moolenaarc51cf032022-02-26 12:25:45 +0000938expr1 *expr1* *ternary* *falsy-operator* *??* *E109*
Bram Moolenaar071d4272004-06-13 20:20:40 +0000939-----
940
Bram Moolenaarc51cf032022-02-26 12:25:45 +0000941The ternary operator: expr2 ? expr1 : expr1
Bram Moolenaar92f26c22020-10-03 20:17:30 +0200942The falsy operator: expr2 ?? expr1
943
Bram Moolenaarc51cf032022-02-26 12:25:45 +0000944Ternary operator ~
Bram Moolenaar071d4272004-06-13 20:20:40 +0000945
Bram Moolenaar5da36052021-12-27 15:39:57 +0000946In legacy script the expression before the '?' is evaluated to a number. If
947it evaluates to |TRUE|, the result is the value of the expression between the
948'?' and ':', otherwise the result is the value of the expression after the
949':'.
950
951In |Vim9| script the first expression must evaluate to a boolean, see
952|vim9-boolean|.
953
Bram Moolenaar071d4272004-06-13 20:20:40 +0000954Example: >
955 :echo lnum == 1 ? "top" : lnum
956
957Since the first expression is an "expr2", it cannot contain another ?:. The
958other two expressions can, thus allow for recursive use of ?:.
959Example: >
960 :echo lnum == 1 ? "top" : lnum == 1000 ? "last" : lnum
961
962To keep this readable, using |line-continuation| is suggested: >
963 :echo lnum == 1
964 :\ ? "top"
965 :\ : lnum == 1000
966 :\ ? "last"
967 :\ : lnum
968
Bram Moolenaaref2f6562007-05-06 13:32:59 +0000969You should always put a space before the ':', otherwise it can be mistaken for
970use in a variable such as "a:1".
971
Bram Moolenaar92f26c22020-10-03 20:17:30 +0200972Falsy operator ~
973
974This is also known as the "null coalescing operator", but that's too
975complicated, thus we just call it the falsy operator.
976
977The expression before the '??' is evaluated. If it evaluates to
978|truthy|, this is used as the result. Otherwise the expression after the '??'
979is evaluated and used as the result. This is most useful to have a default
980value for an expression that may result in zero or empty: >
981 echo theList ?? 'list is empty'
982 echo GetName() ?? 'unknown'
983
984These are similar, but not equal: >
985 expr2 ?? expr1
986 expr2 ? expr2 : expr1
Bram Moolenaar5da36052021-12-27 15:39:57 +0000987In the second line "expr2" is evaluated twice. And in |Vim9| script the type
988of expr2 before "?" must be a boolean.
Bram Moolenaar92f26c22020-10-03 20:17:30 +0200989
Bram Moolenaar071d4272004-06-13 20:20:40 +0000990
991expr2 and expr3 *expr2* *expr3*
992---------------
993
Bram Moolenaar04186092016-08-29 21:55:35 +0200994expr3 || expr3 .. logical OR *expr-barbar*
995expr4 && expr4 .. logical AND *expr-&&*
996
Bram Moolenaar5da36052021-12-27 15:39:57 +0000997The "||" and "&&" operators take one argument on each side.
Bram Moolenaar071d4272004-06-13 20:20:40 +0000998
Bram Moolenaar5da36052021-12-27 15:39:57 +0000999In legacy script the arguments are (converted to) Numbers.
1000
1001In |Vim9| script the values must be boolean, see |vim9-boolean|. Use "!!" to
1002convert any type to a boolean.
1003
1004The result is:
Bram Moolenaare381d3d2016-07-07 14:50:41 +02001005 input output ~
1006n1 n2 n1 || n2 n1 && n2 ~
1007|FALSE| |FALSE| |FALSE| |FALSE|
1008|FALSE| |TRUE| |TRUE| |FALSE|
1009|TRUE| |FALSE| |TRUE| |FALSE|
1010|TRUE| |TRUE| |TRUE| |TRUE|
Bram Moolenaar071d4272004-06-13 20:20:40 +00001011
1012The operators can be concatenated, for example: >
1013
1014 &nu || &list && &shell == "csh"
1015
1016Note that "&&" takes precedence over "||", so this has the meaning of: >
1017
1018 &nu || (&list && &shell == "csh")
1019
1020Once the result is known, the expression "short-circuits", that is, further
1021arguments are not evaluated. This is like what happens in C. For example: >
1022
1023 let a = 1
1024 echo a || b
1025
Bram Moolenaare381d3d2016-07-07 14:50:41 +02001026This is valid even if there is no variable called "b" because "a" is |TRUE|,
1027so the result must be |TRUE|. Similarly below: >
Bram Moolenaar071d4272004-06-13 20:20:40 +00001028
1029 echo exists("b") && b == "yes"
1030
1031This is valid whether "b" has been defined or not. The second clause will
1032only be evaluated if "b" has been defined.
1033
1034
Bram Moolenaara2baa732022-02-04 16:09:54 +00001035expr4 *expr4* *E1153*
Bram Moolenaar071d4272004-06-13 20:20:40 +00001036-----
1037
1038expr5 {cmp} expr5
1039
Bram Moolenaar5da36052021-12-27 15:39:57 +00001040Compare two expr5 expressions. In legacy script the result is a 0 if it
1041evaluates to false, or 1 if it evaluates to true. In |Vim9| script the result
1042is |true| or |false|.
Bram Moolenaar071d4272004-06-13 20:20:40 +00001043
Bram Moolenaar446cb832008-06-24 21:56:24 +00001044 *expr-==* *expr-!=* *expr->* *expr->=*
Bram Moolenaar071d4272004-06-13 20:20:40 +00001045 *expr-<* *expr-<=* *expr-=~* *expr-!~*
1046 *expr-==#* *expr-!=#* *expr->#* *expr->=#*
1047 *expr-<#* *expr-<=#* *expr-=~#* *expr-!~#*
1048 *expr-==?* *expr-!=?* *expr->?* *expr->=?*
1049 *expr-<?* *expr-<=?* *expr-=~?* *expr-!~?*
Bram Moolenaar251e1912011-06-19 05:09:16 +02001050 *expr-is* *expr-isnot* *expr-is#* *expr-isnot#*
Bram Moolenaar6f4754b2022-01-23 12:07:04 +00001051 *expr-is?* *expr-isnot?* *E1072*
Bram Moolenaar071d4272004-06-13 20:20:40 +00001052 use 'ignorecase' match case ignore case ~
1053equal == ==# ==?
1054not equal != !=# !=?
1055greater than > ># >?
1056greater than or equal >= >=# >=?
1057smaller than < <# <?
1058smaller than or equal <= <=# <=?
1059regexp matches =~ =~# =~?
1060regexp doesn't match !~ !~# !~?
Bram Moolenaar251e1912011-06-19 05:09:16 +02001061same instance is is# is?
1062different instance isnot isnot# isnot?
Bram Moolenaar071d4272004-06-13 20:20:40 +00001063
1064Examples:
1065"abc" ==# "Abc" evaluates to 0
1066"abc" ==? "Abc" evaluates to 1
1067"abc" == "Abc" evaluates to 1 if 'ignorecase' is set, 0 otherwise
Bram Moolenaar5da36052021-12-27 15:39:57 +00001068NOTE: In |Vim9| script 'ignorecase' is not used.
Bram Moolenaar071d4272004-06-13 20:20:40 +00001069
Bram Moolenaar13065c42005-01-08 16:08:21 +00001070 *E691* *E692*
Bram Moolenaar01164a62017-11-02 22:58:42 +01001071A |List| can only be compared with a |List| and only "equal", "not equal",
1072"is" and "isnot" can be used. This compares the values of the list,
1073recursively. Ignoring case means case is ignored when comparing item values.
Bram Moolenaarde8866b2005-01-06 23:24:37 +00001074
Bram Moolenaar3a3a7232005-01-17 22:16:15 +00001075 *E735* *E736*
Bram Moolenaar32466aa2006-02-24 23:53:04 +00001076A |Dictionary| can only be compared with a |Dictionary| and only "equal", "not
Bram Moolenaar01164a62017-11-02 22:58:42 +01001077equal", "is" and "isnot" can be used. This compares the key/values of the
1078|Dictionary| recursively. Ignoring case means case is ignored when comparing
1079item values.
Bram Moolenaar3a3a7232005-01-17 22:16:15 +00001080
Bram Moolenaaraa3b15d2016-04-21 08:53:19 +02001081 *E694*
Bram Moolenaare18dbe82016-07-02 21:42:23 +02001082A |Funcref| can only be compared with a |Funcref| and only "equal", "not
1083equal", "is" and "isnot" can be used. Case is never ignored. Whether
1084arguments or a Dictionary are bound (with a partial) matters. The
1085Dictionaries must also be equal (or the same, in case of "is") and the
1086arguments must be equal (or the same).
1087
1088To compare Funcrefs to see if they refer to the same function, ignoring bound
1089Dictionary and arguments, use |get()| to get the function name: >
1090 if get(Part1, 'name') == get(Part2, 'name')
1091 " Part1 and Part2 refer to the same function
Bram Moolenaar6f4754b2022-01-23 12:07:04 +00001092< *E1037*
Bram Moolenaar5e66b422019-01-24 21:58:10 +01001093Using "is" or "isnot" with a |List|, |Dictionary| or |Blob| checks whether
1094the expressions are referring to the same |List|, |Dictionary| or |Blob|
1095instance. A copy of a |List| is different from the original |List|. When
1096using "is" without a |List|, |Dictionary| or |Blob|, it is equivalent to
1097using "equal", using "isnot" equivalent to using "not equal". Except that
1098a different type means the values are different: >
Bram Moolenaar86edef62016-03-13 18:07:30 +01001099 echo 4 == '4'
1100 1
1101 echo 4 is '4'
1102 0
1103 echo 0 is []
1104 0
1105"is#"/"isnot#" and "is?"/"isnot?" can be used to match and ignore case.
Bram Moolenaare1f3fd12022-08-15 18:51:32 +01001106In |Vim9| script this doesn't work, two strings are never identical.
Bram Moolenaarde8866b2005-01-06 23:24:37 +00001107
Bram Moolenaar5da36052021-12-27 15:39:57 +00001108In legacy script, when comparing a String with a Number, the String is
1109converted to a Number, and the comparison is done on Numbers. This means
1110that: >
Bram Moolenaar86edef62016-03-13 18:07:30 +01001111 echo 0 == 'x'
1112 1
1113because 'x' converted to a Number is zero. However: >
1114 echo [0] == ['x']
1115 0
1116Inside a List or Dictionary this conversion is not used.
Bram Moolenaar071d4272004-06-13 20:20:40 +00001117
Bram Moolenaar5da36052021-12-27 15:39:57 +00001118In |Vim9| script the types must match.
1119
Bram Moolenaar071d4272004-06-13 20:20:40 +00001120When comparing two Strings, this is done with strcmp() or stricmp(). This
1121results in the mathematical difference (comparing byte values), not
1122necessarily the alphabetical difference in the local language.
1123
Bram Moolenaar446cb832008-06-24 21:56:24 +00001124When using the operators with a trailing '#', or the short version and
Bram Moolenaaref2f6562007-05-06 13:32:59 +00001125'ignorecase' is off, the comparing is done with strcmp(): case matters.
Bram Moolenaar071d4272004-06-13 20:20:40 +00001126
1127When using the operators with a trailing '?', or the short version and
Bram Moolenaaref2f6562007-05-06 13:32:59 +00001128'ignorecase' is set, the comparing is done with stricmp(): case is ignored.
1129
1130'smartcase' is not used.
Bram Moolenaar071d4272004-06-13 20:20:40 +00001131
1132The "=~" and "!~" operators match the lefthand argument with the righthand
1133argument, which is used as a pattern. See |pattern| for what a pattern is.
1134This matching is always done like 'magic' was set and 'cpoptions' is empty, no
1135matter what the actual value of 'magic' or 'cpoptions' is. This makes scripts
1136portable. To avoid backslashes in the regexp pattern to be doubled, use a
1137single-quote string, see |literal-string|.
1138Since a string is considered to be a single line, a multi-line pattern
1139(containing \n, backslash-n) will not match. However, a literal NL character
1140can be matched like an ordinary character. Examples:
1141 "foo\nbar" =~ "\n" evaluates to 1
1142 "foo\nbar" =~ "\\n" evaluates to 0
1143
1144
Yegappan Lakshmanana061f342022-05-22 19:13:49 +01001145expr5 *expr5* *bitwise-shift*
1146-----
1147expr6 << expr6 bitwise left shift *expr-<<*
1148expr6 >> expr6 bitwise right shift *expr->>*
1149 *E1282* *E1283*
1150The "<<" and ">>" operators can be used to perform bitwise left or right shift
1151of the left operand by the number of bits specified by the right operand. The
Bram Moolenaar338bf582022-05-22 20:16:32 +01001152operands are used as positive numbers. When shifting right with ">>" the
Bram Moolenaard592deb2022-06-17 15:42:40 +01001153topmost bit (sometimes called the sign bit) is cleared. If the right operand
Bram Moolenaar338bf582022-05-22 20:16:32 +01001154(shift amount) is more than the maximum number of bits in a number
1155(|v:numbersize|) the result is zero.
Bram Moolenaar071d4272004-06-13 20:20:40 +00001156
Yegappan Lakshmanana061f342022-05-22 19:13:49 +01001157
1158expr6 and expr7 *expr6* *expr7* *E1036* *E1051*
1159---------------
1160expr7 + expr7 Number addition, |List| or |Blob| concatenation *expr-+*
1161expr7 - expr7 Number subtraction *expr--*
1162expr7 . expr7 String concatenation *expr-.*
1163expr7 .. expr7 String concatenation *expr-..*
1164
1165For |Lists| only "+" is possible and then both expr7 must be a list. The
Bram Moolenaar32466aa2006-02-24 23:53:04 +00001166result is a new list with the two lists Concatenated.
Bram Moolenaarde8866b2005-01-06 23:24:37 +00001167
Bram Moolenaar0f248b02019-04-04 15:36:05 +02001168For String concatenation ".." is preferred, since "." is ambiguous, it is also
1169used for |Dict| member access and floating point numbers.
Bram Moolenaar5da36052021-12-27 15:39:57 +00001170In |Vim9| script and when |vimscript-version| is 2 or higher, using "." is not
1171allowed.
1172
1173In |Vim9| script the arguments of ".." are converted to String for simple
1174types: Number, Float, Special and Bool. For other types |string()| should be
1175used.
Bram Moolenaar0f248b02019-04-04 15:36:05 +02001176
Yegappan Lakshmanana061f342022-05-22 19:13:49 +01001177expr8 * expr8 Number multiplication *expr-star*
1178expr8 / expr8 Number division *expr-/*
1179expr8 % expr8 Number modulo *expr-%*
Bram Moolenaar071d4272004-06-13 20:20:40 +00001180
Bram Moolenaar5da36052021-12-27 15:39:57 +00001181In legacy script, for all operators except "." and "..", Strings are converted
1182to Numbers.
1183
Bram Moolenaard6e256c2011-12-14 15:32:50 +01001184For bitwise operators see |and()|, |or()| and |xor()|.
Bram Moolenaar071d4272004-06-13 20:20:40 +00001185
Bram Moolenaar5da36052021-12-27 15:39:57 +00001186Note the difference between "+" and ".." in legacy script:
Bram Moolenaar071d4272004-06-13 20:20:40 +00001187 "123" + "456" = 579
Bram Moolenaar5da36052021-12-27 15:39:57 +00001188 "123" .. "456" = "123456"
Bram Moolenaar071d4272004-06-13 20:20:40 +00001189
Bram Moolenaar5da36052021-12-27 15:39:57 +00001190Since '..' has the same precedence as '+' and '-', you need to read: >
1191 1 .. 90 + 90.0
Bram Moolenaar446cb832008-06-24 21:56:24 +00001192As: >
Bram Moolenaar5da36052021-12-27 15:39:57 +00001193 (1 .. 90) + 90.0
1194That works in legacy script, since the String "190" is automatically converted
1195to the Number 190, which can be added to the Float 90.0. However: >
1196 1 .. 90 * 90.0
Bram Moolenaar446cb832008-06-24 21:56:24 +00001197Should be read as: >
Bram Moolenaar5da36052021-12-27 15:39:57 +00001198 1 .. (90 * 90.0)
1199Since '..' has lower precedence than '*'. This does NOT work, since this
Bram Moolenaar446cb832008-06-24 21:56:24 +00001200attempts to concatenate a Float and a String.
1201
1202When dividing a Number by zero the result depends on the value:
1203 0 / 0 = -0x80000000 (like NaN for Float)
1204 >0 / 0 = 0x7fffffff (like positive infinity)
1205 <0 / 0 = -0x7fffffff (like negative infinity)
1206 (before Vim 7.2 it was always 0x7fffffff)
Bram Moolenaara2baa732022-02-04 16:09:54 +00001207In |Vim9| script dividing a number by zero is an error. *E1154*
Bram Moolenaar446cb832008-06-24 21:56:24 +00001208
Bram Moolenaar22fcfad2016-07-01 18:17:26 +02001209When 64-bit Number support is enabled:
1210 0 / 0 = -0x8000000000000000 (like NaN for Float)
1211 >0 / 0 = 0x7fffffffffffffff (like positive infinity)
1212 <0 / 0 = -0x7fffffffffffffff (like negative infinity)
1213
Bram Moolenaar071d4272004-06-13 20:20:40 +00001214When the righthand side of '%' is zero, the result is 0.
1215
Bram Moolenaar32466aa2006-02-24 23:53:04 +00001216None of these work for |Funcref|s.
Bram Moolenaarde8866b2005-01-06 23:24:37 +00001217
Bram Moolenaar6f4754b2022-01-23 12:07:04 +00001218".", ".." and "%" do not work for Float. *E804* *E1035*
Bram Moolenaar446cb832008-06-24 21:56:24 +00001219
Bram Moolenaar071d4272004-06-13 20:20:40 +00001220
Yegappan Lakshmanana061f342022-05-22 19:13:49 +01001221expr8 *expr8*
Bram Moolenaar071d4272004-06-13 20:20:40 +00001222-----
Yegappan Lakshmanana061f342022-05-22 19:13:49 +01001223<type>expr9
Bram Moolenaar5da36052021-12-27 15:39:57 +00001224
1225This is only available in |Vim9| script, see |type-casting|.
1226
1227
Yegappan Lakshmanana061f342022-05-22 19:13:49 +01001228expr9 *expr9*
Bram Moolenaar5da36052021-12-27 15:39:57 +00001229-----
Yegappan Lakshmanana061f342022-05-22 19:13:49 +01001230! expr9 logical NOT *expr-!*
1231- expr9 unary minus *expr-unary--*
1232+ expr9 unary plus *expr-unary-+*
Bram Moolenaar071d4272004-06-13 20:20:40 +00001233
Bram Moolenaare381d3d2016-07-07 14:50:41 +02001234For '!' |TRUE| becomes |FALSE|, |FALSE| becomes |TRUE| (one).
Bram Moolenaar071d4272004-06-13 20:20:40 +00001235For '-' the sign of the number is changed.
Bram Moolenaar6f02b002021-01-10 20:22:54 +01001236For '+' the number is unchanged. Note: "++" has no effect.
Bram Moolenaar071d4272004-06-13 20:20:40 +00001237
Bram Moolenaar5da36052021-12-27 15:39:57 +00001238In legacy script a String will be converted to a Number first. Note that if
1239the string does not start with a digit you likely don't get what you expect.
1240
1241In |Vim9| script an error is given when "-" or "+" is used and the type is not
1242a number.
1243
1244In |Vim9| script "!" can be used for any type and the result is always a
1245boolean. Use "!!" to convert any type to a boolean, according to whether the
1246value is |falsy|.
Bram Moolenaar071d4272004-06-13 20:20:40 +00001247
Bram Moolenaar58b85342016-08-14 19:54:54 +02001248These three can be repeated and mixed. Examples:
Bram Moolenaar071d4272004-06-13 20:20:40 +00001249 !-1 == 0
1250 !!8 == 1
1251 --9 == 9
1252
1253
Yegappan Lakshmanana061f342022-05-22 19:13:49 +01001254expr10 *expr10*
1255------
1256This expression is either |expr11| or a sequence of the alternatives below,
Bram Moolenaarfc65cab2018-08-28 22:58:02 +02001257in any order. E.g., these are all possible:
Yegappan Lakshmanana061f342022-05-22 19:13:49 +01001258 expr10[expr1].name
1259 expr10.name[expr1]
1260 expr10(expr1, ...)[expr1].name
1261 expr10->(expr1, ...)[expr1]
Bram Moolenaarac92e252019-08-03 21:58:38 +02001262Evaluation is always from left to right.
Bram Moolenaarfc65cab2018-08-28 22:58:02 +02001263
Yegappan Lakshmanana061f342022-05-22 19:13:49 +01001264expr10[expr1] item of String or |List| *expr-[]* *E111*
Bram Moolenaar6f4754b2022-01-23 12:07:04 +00001265 *E909* *subscript* *E1062*
Bram Moolenaare3c37d82020-08-15 18:39:05 +02001266In legacy Vim script:
Yegappan Lakshmanana061f342022-05-22 19:13:49 +01001267If expr10 is a Number or String this results in a String that contains the
1268expr1'th single byte from expr10. expr10 is used as a String (a number is
Bram Moolenaare3c37d82020-08-15 18:39:05 +02001269automatically converted to a String), expr1 as a Number. This doesn't
Bram Moolenaar207f0092020-08-30 17:20:20 +02001270recognize multibyte encodings, see `byteidx()` for an alternative, or use
Bram Moolenaare3c37d82020-08-15 18:39:05 +02001271`split()` to turn the string into a list of characters. Example, to get the
1272byte under the cursor: >
Bram Moolenaar61660ea2006-04-07 21:40:07 +00001273 :let c = getline(".")[col(".") - 1]
Bram Moolenaar071d4272004-06-13 20:20:40 +00001274
Bram Moolenaara2baa732022-02-04 16:09:54 +00001275In |Vim9| script: *E1147* *E1148*
Yegappan Lakshmanana061f342022-05-22 19:13:49 +01001276If expr10 is a String this results in a String that contains the expr1'th
1277single character (including any composing characters) from expr10. To use byte
Bram Moolenaar02b4d9b2021-03-14 19:46:45 +01001278indexes use |strpart()|.
Bram Moolenaare3c37d82020-08-15 18:39:05 +02001279
1280Index zero gives the first byte or character. Careful: text column numbers
1281start with one!
1282
Bram Moolenaar071d4272004-06-13 20:20:40 +00001283If the length of the String is less than the index, the result is an empty
Bram Moolenaar85084ef2016-01-17 22:26:33 +01001284String. A negative index always results in an empty string (reason: backward
Bram Moolenaare3c37d82020-08-15 18:39:05 +02001285compatibility). Use [-1:] to get the last byte or character.
Bram Moolenaar6f02b002021-01-10 20:22:54 +01001286In Vim9 script a negative index is used like with a list: count from the end.
Bram Moolenaard7ee7ce2005-01-03 21:02:03 +00001287
Yegappan Lakshmanana061f342022-05-22 19:13:49 +01001288If expr10 is a |List| then it results the item at index expr1. See |list-index|
Bram Moolenaard7ee7ce2005-01-03 21:02:03 +00001289for possible index values. If the index is out of range this results in an
Bram Moolenaar58b85342016-08-14 19:54:54 +02001290error. Example: >
Bram Moolenaard7ee7ce2005-01-03 21:02:03 +00001291 :let item = mylist[-1] " get last item
1292
Bram Moolenaar32466aa2006-02-24 23:53:04 +00001293Generally, if a |List| index is equal to or higher than the length of the
1294|List|, or more negative than the length of the |List|, this results in an
1295error.
Bram Moolenaard7ee7ce2005-01-03 21:02:03 +00001296
Bram Moolenaard8b02732005-01-14 21:48:43 +00001297
Bram Moolenaar8a3b8052022-06-26 12:21:15 +01001298expr10[expr1a : expr1b] substring or |sublist| *expr-[:]* *substring*
Bram Moolenaard7ee7ce2005-01-03 21:02:03 +00001299
Yegappan Lakshmanana061f342022-05-22 19:13:49 +01001300If expr10 is a String this results in the substring with the bytes or
1301characters from expr1a to and including expr1b. expr10 is used as a String,
Bram Moolenaar207f0092020-08-30 17:20:20 +02001302expr1a and expr1b are used as a Number.
Bram Moolenaare3c37d82020-08-15 18:39:05 +02001303
1304In legacy Vim script the indexes are byte indexes. This doesn't recognize
Yegappan Lakshmanana061f342022-05-22 19:13:49 +01001305multibyte encodings, see |byteidx()| for computing the indexes. If expr10 is
Bram Moolenaare3c37d82020-08-15 18:39:05 +02001306a Number it is first converted to a String.
1307
Bram Moolenaar02b4d9b2021-03-14 19:46:45 +01001308In Vim9 script the indexes are character indexes and include composing
1309characters. To use byte indexes use |strpart()|. To use character indexes
1310without including composing characters use |strcharpart()|.
Bram Moolenaard7ee7ce2005-01-03 21:02:03 +00001311
Bram Moolenaar6601b622021-01-13 21:47:15 +01001312The item at index expr1b is included, it is inclusive. For an exclusive index
1313use the |slice()| function.
1314
Bram Moolenaard7ee7ce2005-01-03 21:02:03 +00001315If expr1a is omitted zero is used. If expr1b is omitted the length of the
1316string minus one is used.
1317
1318A negative number can be used to measure from the end of the string. -1 is
1319the last character, -2 the last but one, etc.
1320
1321If an index goes out of range for the string characters are omitted. If
1322expr1b is smaller than expr1a the result is an empty string.
1323
1324Examples: >
1325 :let c = name[-1:] " last byte of a string
Bram Moolenaar207f0092020-08-30 17:20:20 +02001326 :let c = name[0:-1] " the whole string
Bram Moolenaard7ee7ce2005-01-03 21:02:03 +00001327 :let c = name[-2:-2] " last but one byte of a string
1328 :let s = line(".")[4:] " from the fifth byte to the end
1329 :let s = s[:-3] " remove last two bytes
Bram Moolenaar8f3f58f2010-01-06 20:52:26 +01001330<
Bram Moolenaarbc8801c2016-08-02 21:04:33 +02001331 *slice*
Yegappan Lakshmanana061f342022-05-22 19:13:49 +01001332If expr10 is a |List| this results in a new |List| with the items indicated by
Bram Moolenaar58b85342016-08-14 19:54:54 +02001333the indexes expr1a and expr1b. This works like with a String, as explained
Bram Moolenaarbc8801c2016-08-02 21:04:33 +02001334just above. Also see |sublist| below. Examples: >
Bram Moolenaard7ee7ce2005-01-03 21:02:03 +00001335 :let l = mylist[:3] " first four items
1336 :let l = mylist[4:4] " List with one item
1337 :let l = mylist[:] " shallow copy of a List
1338
Yegappan Lakshmanana061f342022-05-22 19:13:49 +01001339If expr10 is a |Blob| this results in a new |Blob| with the bytes in the
Bram Moolenaar6e5ea8d2019-01-12 22:47:31 +01001340indexes expr1a and expr1b, inclusive. Examples: >
1341 :let b = 0zDEADBEEF
1342 :let bs = b[1:2] " 0zADBE
Bram Moolenaard09091d2019-01-17 16:07:22 +01001343 :let bs = b[:] " copy of 0zDEADBEEF
Bram Moolenaar6e5ea8d2019-01-12 22:47:31 +01001344
Yegappan Lakshmanana061f342022-05-22 19:13:49 +01001345Using expr10[expr1] or expr10[expr1a : expr1b] on a |Funcref| results in an
Bram Moolenaar32466aa2006-02-24 23:53:04 +00001346error.
Bram Moolenaar071d4272004-06-13 20:20:40 +00001347
Bram Moolenaarda440d22016-01-16 21:27:23 +01001348Watch out for confusion between a namespace and a variable followed by a colon
1349for a sublist: >
1350 mylist[n:] " uses variable n
1351 mylist[s:] " uses namespace s:, error!
1352
Bram Moolenaard8b02732005-01-14 21:48:43 +00001353
Yegappan Lakshmanana061f342022-05-22 19:13:49 +01001354expr10.name entry in a |Dictionary| *expr-entry*
Bram Moolenaara2baa732022-02-04 16:09:54 +00001355 *E1203* *E1229*
Yegappan Lakshmanana061f342022-05-22 19:13:49 +01001356If expr10 is a |Dictionary| and it is followed by a dot, then the following
Bram Moolenaar32466aa2006-02-24 23:53:04 +00001357name will be used as a key in the |Dictionary|. This is just like:
Yegappan Lakshmanana061f342022-05-22 19:13:49 +01001358expr10[name].
Bram Moolenaard8b02732005-01-14 21:48:43 +00001359
1360The name must consist of alphanumeric characters, just like a variable name,
1361but it may start with a number. Curly braces cannot be used.
1362
1363There must not be white space before or after the dot.
1364
1365Examples: >
1366 :let dict = {"one": 1, 2: "two"}
Bram Moolenaar68e65602019-05-26 21:33:31 +02001367 :echo dict.one " shows "1"
1368 :echo dict.2 " shows "two"
1369 :echo dict .2 " error because of space before the dot
Bram Moolenaard8b02732005-01-14 21:48:43 +00001370
1371Note that the dot is also used for String concatenation. To avoid confusion
1372always put spaces around the dot for String concatenation.
1373
1374
Bram Moolenaar938ae282023-02-20 20:44:55 +00001375expr10(expr1, ...) |Funcref| function call *E1085*
Bram Moolenaar2fda12f2005-01-15 22:14:15 +00001376
Yegappan Lakshmanana061f342022-05-22 19:13:49 +01001377When expr10 is a |Funcref| type variable, invoke the function it refers to.
Bram Moolenaar2fda12f2005-01-15 22:14:15 +00001378
1379
Yegappan Lakshmanana061f342022-05-22 19:13:49 +01001380expr10->name([args]) method call *method* *->*
1381expr10->{lambda}([args])
Bram Moolenaara2baa732022-02-04 16:09:54 +00001382 *E260* *E276* *E1265*
Bram Moolenaar25e42232019-08-04 15:04:10 +02001383For methods that are also available as global functions this is the same as: >
Yegappan Lakshmanana061f342022-05-22 19:13:49 +01001384 name(expr10 [, args])
1385There can also be methods specifically for the type of "expr10".
Bram Moolenaar2fda12f2005-01-15 22:14:15 +00001386
Bram Moolenaar51841322019-08-08 21:10:01 +02001387This allows for chaining, passing the value that one method returns to the
1388next method: >
Bram Moolenaar25e42232019-08-04 15:04:10 +02001389 mylist->filter(filterexpr)->map(mapexpr)->sort()->join()
1390<
Bram Moolenaar22a0c0c2019-08-09 23:25:08 +02001391Example of using a lambda: >
Bram Moolenaar02b31112019-08-31 22:16:38 +02001392 GetPercentage()->{x -> x * 100}()->printf('%d%%')
Bram Moolenaar56c860c2019-08-17 20:09:31 +02001393<
Yegappan Lakshmanana061f342022-05-22 19:13:49 +01001394When using -> the |expr9| operators will be applied first, thus: >
Bram Moolenaar93cf85f2019-08-17 21:36:28 +02001395 -1.234->string()
1396Is equivalent to: >
1397 (-1.234)->string()
1398And NOT: >
1399 -(1.234->string())
Bram Moolenaar6f4754b2022-01-23 12:07:04 +00001400
1401What comes after "->" can be a name, a simple expression (not containing any
Bram Moolenaar944697a2022-02-20 19:48:20 +00001402parenthesis), or any expression in parentheses: >
Bram Moolenaar6f4754b2022-01-23 12:07:04 +00001403 base->name(args)
1404 base->some.name(args)
1405 base->alist[idx](args)
1406 base->(getFuncRef())(args)
1407Note that in the last call the base is passed to the function resulting from
Bram Moolenaar2ecbe532022-07-29 21:36:21 +01001408"(getFuncRef())", inserted before "args". *E1275*
Bram Moolenaar6f4754b2022-01-23 12:07:04 +00001409
Bram Moolenaar51841322019-08-08 21:10:01 +02001410 *E274*
1411"->name(" must not contain white space. There can be white space before the
1412"->" and after the "(", thus you can split the lines like this: >
1413 mylist
1414 \ ->filter(filterexpr)
1415 \ ->map(mapexpr)
1416 \ ->sort()
1417 \ ->join()
Bram Moolenaar56c860c2019-08-17 20:09:31 +02001418
1419When using the lambda form there must be no white space between the } and the
1420(.
1421
Bram Moolenaar25e42232019-08-04 15:04:10 +02001422
Yegappan Lakshmanana061f342022-05-22 19:13:49 +01001423 *expr11*
Bram Moolenaar071d4272004-06-13 20:20:40 +00001424number
1425------
Bram Moolenaarb0d45e72017-11-05 18:19:24 +01001426number number constant *expr-number*
Bram Moolenaar071d4272004-06-13 20:20:40 +00001427
Bram Moolenaar6f02b002021-01-10 20:22:54 +01001428 *0x* *hex-number* *0o* *octal-number* *binary-number*
Bram Moolenaar7571d552016-08-18 22:54:46 +02001429Decimal, Hexadecimal (starting with 0x or 0X), Binary (starting with 0b or 0B)
Bram Moolenaarc17e66c2020-06-02 21:38:22 +02001430and Octal (starting with 0, 0o or 0O).
Bram Moolenaar071d4272004-06-13 20:20:40 +00001431
Bram Moolenaar338bf582022-05-22 20:16:32 +01001432Assuming 64 bit numbers are used (see |v:numbersize|) an unsigned number is
1433truncated to 0x7fffffffffffffff or 9223372036854775807. You can use -1 to get
14340xffffffffffffffff.
1435
Bram Moolenaar446cb832008-06-24 21:56:24 +00001436 *floating-point-format*
1437Floating point numbers can be written in two forms:
1438
1439 [-+]{N}.{M}
Bram Moolenaar8a94d872015-01-25 13:02:57 +01001440 [-+]{N}.{M}[eE][-+]{exp}
Bram Moolenaar446cb832008-06-24 21:56:24 +00001441
1442{N} and {M} are numbers. Both {N} and {M} must be present and can only
Bram Moolenaar6aa57292021-08-14 21:25:52 +02001443contain digits, except that in |Vim9| script in {N} single quotes between
1444digits are ignored.
Bram Moolenaar446cb832008-06-24 21:56:24 +00001445[-+] means there is an optional plus or minus sign.
1446{exp} is the exponent, power of 10.
Bram Moolenaar58b85342016-08-14 19:54:54 +02001447Only a decimal point is accepted, not a comma. No matter what the current
Bram Moolenaar446cb832008-06-24 21:56:24 +00001448locale is.
Bram Moolenaar446cb832008-06-24 21:56:24 +00001449
1450Examples:
1451 123.456
1452 +0.0001
1453 55.0
1454 -0.123
1455 1.234e03
1456 1.0E-6
1457 -3.1416e+88
1458
1459These are INVALID:
1460 3. empty {M}
1461 1e40 missing .{M}
1462
1463Rationale:
1464Before floating point was introduced, the text "123.456" was interpreted as
1465the two numbers "123" and "456", both converted to a string and concatenated,
1466resulting in the string "123456". Since this was considered pointless, and we
Bram Moolenaare37d50a2008-08-06 17:06:04 +00001467could not find it intentionally being used in Vim scripts, this backwards
Bram Moolenaar446cb832008-06-24 21:56:24 +00001468incompatibility was accepted in favor of being able to use the normal notation
1469for floating point numbers.
1470
Bram Moolenaard47d5222018-12-09 20:43:55 +01001471 *float-pi* *float-e*
1472A few useful values to copy&paste: >
1473 :let pi = 3.14159265359
1474 :let e = 2.71828182846
1475Or, if you don't want to write them in as floating-point literals, you can
1476also use functions, like the following: >
1477 :let pi = acos(-1.0)
1478 :let e = exp(1.0)
Bram Moolenaar98aefe72018-12-13 22:20:09 +01001479<
Bram Moolenaar446cb832008-06-24 21:56:24 +00001480 *floating-point-precision*
1481The precision and range of floating points numbers depends on what "double"
1482means in the library Vim was compiled with. There is no way to change this at
1483runtime.
1484
1485The default for displaying a |Float| is to use 6 decimal places, like using
1486printf("%g", f). You can select something else when using the |printf()|
1487function. Example: >
1488 :echo printf('%.15e', atan(1))
1489< 7.853981633974483e-01
1490
1491
Bram Moolenaar071d4272004-06-13 20:20:40 +00001492
Bram Moolenaar979243b2015-06-26 19:35:49 +02001493string *string* *String* *expr-string* *E114*
Bram Moolenaar071d4272004-06-13 20:20:40 +00001494------
1495"string" string constant *expr-quote*
1496
1497Note that double quotes are used.
1498
1499A string constant accepts these special characters:
1500\... three-digit octal number (e.g., "\316")
1501\.. two-digit octal number (must be followed by non-digit)
1502\. one-digit octal number (must be followed by non-digit)
1503\x.. byte specified with two hex numbers (e.g., "\x1f")
1504\x. byte specified with one hex number (must be followed by non-hex char)
1505\X.. same as \x..
1506\X. same as \x.
Bram Moolenaar446cb832008-06-24 21:56:24 +00001507\u.... character specified with up to 4 hex numbers, stored according to the
Bram Moolenaar071d4272004-06-13 20:20:40 +00001508 current value of 'encoding' (e.g., "\u02a4")
Bram Moolenaar541f92d2015-06-19 13:27:23 +02001509\U.... same as \u but allows up to 8 hex numbers.
Bram Moolenaar071d4272004-06-13 20:20:40 +00001510\b backspace <BS>
1511\e escape <Esc>
Bram Moolenaar6e649222021-10-04 21:32:54 +01001512\f formfeed 0x0C
Bram Moolenaar071d4272004-06-13 20:20:40 +00001513\n newline <NL>
1514\r return <CR>
1515\t tab <Tab>
1516\\ backslash
1517\" double quote
Bram Moolenaar00a927d2010-05-14 23:24:24 +02001518\<xxx> Special key named "xxx". e.g. "\<C-W>" for CTRL-W. This is for use
Bram Moolenaar58b85342016-08-14 19:54:54 +02001519 in mappings, the 0x80 byte is escaped.
1520 To use the double quote character it must be escaped: "<M-\">".
Bram Moolenaar6e649222021-10-04 21:32:54 +01001521 Don't use <Char-xxxx> to get a UTF-8 character, use \uxxxx as
Bram Moolenaar58b85342016-08-14 19:54:54 +02001522 mentioned above.
Bram Moolenaarfccd93f2020-05-31 22:06:51 +02001523\<*xxx> Like \<xxx> but prepends a modifier instead of including it in the
1524 character. E.g. "\<C-w>" is one character 0x17 while "\<*C-w>" is four
Bram Moolenaarebe9d342020-05-30 21:52:54 +02001525 bytes: 3 for the CTRL modifier and then character "W".
Bram Moolenaar071d4272004-06-13 20:20:40 +00001526
Bram Moolenaaref2f6562007-05-06 13:32:59 +00001527Note that "\xff" is stored as the byte 255, which may be invalid in some
1528encodings. Use "\u00ff" to store character 255 according to the current value
1529of 'encoding'.
1530
Bram Moolenaar071d4272004-06-13 20:20:40 +00001531Note that "\000" and "\x00" force the end of the string.
1532
1533
Bram Moolenaard8968242019-01-15 22:51:57 +01001534blob-literal *blob-literal* *E973*
Bram Moolenaar6e5ea8d2019-01-12 22:47:31 +01001535------------
1536
1537Hexadecimal starting with 0z or 0Z, with an arbitrary number of bytes.
1538The sequence must be an even number of hex characters. Example: >
1539 :let b = 0zFF00ED015DAF
1540
1541
Bram Moolenaar071d4272004-06-13 20:20:40 +00001542literal-string *literal-string* *E115*
1543---------------
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00001544'string' string constant *expr-'*
Bram Moolenaar071d4272004-06-13 20:20:40 +00001545
1546Note that single quotes are used.
1547
Bram Moolenaar58b85342016-08-14 19:54:54 +02001548This string is taken as it is. No backslashes are removed or have a special
Bram Moolenaard8b02732005-01-14 21:48:43 +00001549meaning. The only exception is that two quotes stand for one quote.
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00001550
1551Single quoted strings are useful for patterns, so that backslashes do not need
Bram Moolenaar58b85342016-08-14 19:54:54 +02001552to be doubled. These two commands are equivalent: >
Bram Moolenaar3fdfa4a2004-10-07 21:02:47 +00001553 if a =~ "\\s*"
1554 if a =~ '\s*'
Bram Moolenaar071d4272004-06-13 20:20:40 +00001555
1556
Bram Moolenaarb59ae592022-11-23 23:46:31 +00001557interpolated-string *$quote* *interpolated-string*
LemonBoy2eaef102022-05-06 13:14:50 +01001558--------------------
1559$"string" interpolated string constant *expr-$quote*
1560$'string' interpolated literal string constant *expr-$'*
1561
1562Interpolated strings are an extension of the |string| and |literal-string|,
1563allowing the inclusion of Vim script expressions (see |expr1|). Any
1564expression returning a value can be enclosed between curly braces. The value
1565is converted to a string. All the text and results of the expressions
1566are concatenated to make a new string.
Bram Moolenaar2ecbe532022-07-29 21:36:21 +01001567 *E1278* *E1279*
LemonBoy2eaef102022-05-06 13:14:50 +01001568To include an opening brace '{' or closing brace '}' in the string content
Bram Moolenaar3f32a5f2022-05-12 20:34:15 +01001569double it. For double quoted strings using a backslash also works. A single
1570closing brace '}' will result in an error.
LemonBoy2eaef102022-05-06 13:14:50 +01001571
1572Examples: >
1573 let your_name = input("What's your name? ")
Bram Moolenaar3f32a5f2022-05-12 20:34:15 +01001574< What's your name? Peter ~
1575>
1576 echo
LemonBoy2eaef102022-05-06 13:14:50 +01001577 echo $"Hello, {your_name}!"
Bram Moolenaar3f32a5f2022-05-12 20:34:15 +01001578< Hello, Peter! ~
1579>
1580 echo $"The square root of {{9}} is {sqrt(9)}"
1581< The square root of {9} is 3.0 ~
1582
Christian Brabandt67672ef2023-04-24 21:09:54 +01001583 *string-offset-encoding*
1584A string consists of multiple characters. How the characters are stored
1585depends on 'encoding'. Most common is UTF-8, which uses one byte for ASCII
1586characters, two bytes for other latin characters and more bytes for other
1587characters.
1588
1589A string offset can count characters or bytes. Other programs may use
1590UTF-16 encoding (16-bit words) and an offset of UTF-16 words. Some functions
1591use byte offsets, usually for UTF-8 encoding. Other functions use character
1592offsets, in which case the encoding doesn't matter.
1593
1594The different offsets for the string "a©😊" are below:
1595
1596 UTF-8 offsets:
1597 [0]: 61, [1]: C2, [2]: A9, [3]: F0, [4]: 9F, [5]: 98, [6]: 8A
1598 UTF-16 offsets:
1599 [0]: 0061, [1]: 00A9, [2]: D83D, [3]: DE0A
1600 UTF-32 (character) offsets:
1601 [0]: 00000061, [1]: 000000A9, [2]: 0001F60A
1602
1603You can use the "g8" and "ga" commands on a character to see the
1604decimal/hex/octal values.
1605
1606The functions |byteidx()|, |utf16idx()| and |charidx()| can be used to convert
1607between these indices. The functions |strlen()|, |strutf16len()| and
1608|strcharlen()| return the number of bytes, UTF-16 code units and characters in
1609a string respectively.
LemonBoy2eaef102022-05-06 13:14:50 +01001610
Bram Moolenaar071d4272004-06-13 20:20:40 +00001611option *expr-option* *E112* *E113*
1612------
1613&option option value, local value if possible
1614&g:option global option value
1615&l:option local option value
1616
1617Examples: >
Bram Moolenaarc51cf032022-02-26 12:25:45 +00001618 echo "tabstop is " .. &tabstop
Bram Moolenaar071d4272004-06-13 20:20:40 +00001619 if &insertmode
1620
1621Any option name can be used here. See |options|. When using the local value
1622and there is no buffer-local or window-local value, the global value is used
1623anyway.
1624
1625
Bram Moolenaaref2f6562007-05-06 13:32:59 +00001626register *expr-register* *@r*
Bram Moolenaar071d4272004-06-13 20:20:40 +00001627--------
1628@r contents of register 'r'
1629
1630The result is the contents of the named register, as a single string.
1631Newlines are inserted where required. To get the contents of the unnamed
Bram Moolenaar58b85342016-08-14 19:54:54 +02001632register use @" or @@. See |registers| for an explanation of the available
Bram Moolenaare7566042005-06-17 22:00:15 +00001633registers.
1634
1635When using the '=' register you get the expression itself, not what it
1636evaluates to. Use |eval()| to evaluate it.
Bram Moolenaar071d4272004-06-13 20:20:40 +00001637
1638
Bram Moolenaara2baa732022-02-04 16:09:54 +00001639nesting *expr-nesting* *E110*
Bram Moolenaar071d4272004-06-13 20:20:40 +00001640-------
1641(expr1) nested expression
1642
1643
1644environment variable *expr-env*
1645--------------------
1646$VAR environment variable
1647
1648The String value of any environment variable. When it is not defined, the
1649result is an empty string.
Bram Moolenaar691ddee2019-05-09 14:52:41 +02001650
1651The functions `getenv()` and `setenv()` can also be used and work for
1652environment variables with non-alphanumeric names.
1653The function `environ()` can be used to get a Dict with all environment
1654variables.
1655
1656
Bram Moolenaar071d4272004-06-13 20:20:40 +00001657 *expr-env-expand*
1658Note that there is a difference between using $VAR directly and using
1659expand("$VAR"). Using it directly will only expand environment variables that
1660are known inside the current Vim session. Using expand() will first try using
1661the environment variables known inside the current Vim session. If that
1662fails, a shell will be used to expand the variable. This can be slow, but it
1663does expand all variables that the shell knows about. Example: >
Bram Moolenaar34401cc2014-08-29 15:12:19 +02001664 :echo $shell
1665 :echo expand("$shell")
1666The first one probably doesn't echo anything, the second echoes the $shell
Bram Moolenaar071d4272004-06-13 20:20:40 +00001667variable (if your shell supports it).
1668
1669
Bram Moolenaarf10911e2022-01-29 22:20:48 +00001670internal variable *expr-variable* *E1015* *E1089*
Bram Moolenaar071d4272004-06-13 20:20:40 +00001671-----------------
1672variable internal variable
1673See below |internal-variables|.
1674
1675
Bram Moolenaar05159a02005-02-26 23:04:13 +00001676function call *expr-function* *E116* *E118* *E119* *E120*
Bram Moolenaar071d4272004-06-13 20:20:40 +00001677-------------
1678function(expr1, ...) function call
1679See below |functions|.
1680
1681
Bram Moolenaar069c1e72016-07-15 21:25:08 +02001682lambda expression *expr-lambda* *lambda*
1683-----------------
Bram Moolenaar938ae282023-02-20 20:44:55 +00001684{args -> expr1} legacy lambda expression *E451*
Bram Moolenaar5da36052021-12-27 15:39:57 +00001685(args) => expr1 |Vim9| lambda expression
Bram Moolenaar069c1e72016-07-15 21:25:08 +02001686
1687A lambda expression creates a new unnamed function which returns the result of
Bram Moolenaar42ebd062016-07-17 13:35:14 +02001688evaluating |expr1|. Lambda expressions differ from |user-functions| in
Bram Moolenaar069c1e72016-07-15 21:25:08 +02001689the following ways:
1690
16911. The body of the lambda expression is an |expr1| and not a sequence of |Ex|
1692 commands.
Bram Moolenaar1e96d9b2016-07-29 22:15:09 +020016932. The prefix "a:" should not be used for arguments. E.g.: >
Bram Moolenaar069c1e72016-07-15 21:25:08 +02001694 :let F = {arg1, arg2 -> arg1 - arg2}
1695 :echo F(5, 2)
1696< 3
1697
1698The arguments are optional. Example: >
1699 :let F = {-> 'error function'}
Bram Moolenaar130cbfc2021-04-07 21:07:20 +02001700 :echo F('ignored')
Bram Moolenaar069c1e72016-07-15 21:25:08 +02001701< error function
Bram Moolenaar130cbfc2021-04-07 21:07:20 +02001702
Bram Moolenaar5da36052021-12-27 15:39:57 +00001703The |Vim9| lambda does not only use a different syntax, it also adds type
1704checking and can be split over multiple lines, see |vim9-lambda|.
Bram Moolenaar130cbfc2021-04-07 21:07:20 +02001705
Bram Moolenaar1e96d9b2016-07-29 22:15:09 +02001706 *closure*
1707Lambda expressions can access outer scope variables and arguments. This is
Bram Moolenaar50ba5262016-09-22 22:33:02 +02001708often called a closure. Example where "i" and "a:arg" are used in a lambda
Bram Moolenaar6bb2cdf2018-02-24 19:53:53 +01001709while they already exist in the function scope. They remain valid even after
1710the function returns: >
Bram Moolenaar1e96d9b2016-07-29 22:15:09 +02001711 :function Foo(arg)
1712 : let i = 3
1713 : return {x -> x + i - a:arg}
1714 :endfunction
1715 :let Bar = Foo(4)
1716 :echo Bar(6)
1717< 5
Bram Moolenaar437bafe2016-08-01 15:40:54 +02001718
Bram Moolenaar388a5d42020-05-26 21:20:45 +02001719Note that the variables must exist in the outer scope before the lambda is
Bram Moolenaar6bb2cdf2018-02-24 19:53:53 +01001720defined for this to work. See also |:func-closure|.
1721
1722Lambda and closure support can be checked with: >
Bram Moolenaar437bafe2016-08-01 15:40:54 +02001723 if has('lambda')
Bram Moolenaar069c1e72016-07-15 21:25:08 +02001724
1725Examples for using a lambda expression with |sort()|, |map()| and |filter()|: >
1726 :echo map([1, 2, 3], {idx, val -> val + 1})
1727< [2, 3, 4] >
1728 :echo sort([3,7,2,1,4], {a, b -> a - b})
1729< [1, 2, 3, 4, 7]
1730
1731The lambda expression is also useful for Channel, Job and timer: >
1732 :let timer = timer_start(500,
1733 \ {-> execute("echo 'Handler called'", "")},
1734 \ {'repeat': 3})
1735< Handler called
1736 Handler called
1737 Handler called
1738
Bram Moolenaar90df4b92021-07-07 20:26:08 +02001739Note that it is possible to cause memory to be used and not freed if the
1740closure is referenced by the context it depends on: >
1741 function Function()
1742 let x = 0
1743 let F = {-> x}
1744 endfunction
1745The closure uses "x" from the function scope, and "F" in that same scope
1746refers to the closure. This cycle results in the memory not being freed.
1747Recommendation: don't do this.
1748
1749Notice how execute() is used to execute an Ex command. That's ugly though.
Bram Moolenaar130cbfc2021-04-07 21:07:20 +02001750In Vim9 script you can use a command block, see |inline-function|.
Bram Moolenaar1e96d9b2016-07-29 22:15:09 +02001751
Bram Moolenaar71b6d332022-09-10 13:13:14 +01001752Although you can use the loop variable of a `for` command, it must still exist
1753when the closure is called, otherwise you get an error. *E1302*
1754
Bram Moolenaar1e96d9b2016-07-29 22:15:09 +02001755Lambda expressions have internal names like '<lambda>42'. If you get an error
1756for a lambda expression, you can find what it is with the following command: >
Bram Moolenaar6f02b002021-01-10 20:22:54 +01001757 :function <lambda>42
Bram Moolenaar1e96d9b2016-07-29 22:15:09 +02001758See also: |numbered-function|
1759
Bram Moolenaar071d4272004-06-13 20:20:40 +00001760==============================================================================
Bram Moolenaar6f4754b2022-01-23 12:07:04 +000017613. Internal variable *internal-variables* *E461* *E1001*
Bram Moolenaar4a748032010-09-30 21:47:56 +02001762
Bram Moolenaar071d4272004-06-13 20:20:40 +00001763An internal variable name can be made up of letters, digits and '_'. But it
Bram Moolenaar2f0936c2022-01-08 21:51:59 +00001764cannot start with a digit. In legacy script it is also possible to use curly
Bram Moolenaar5da36052021-12-27 15:39:57 +00001765braces, see |curly-braces-names|.
Bram Moolenaar071d4272004-06-13 20:20:40 +00001766
Bram Moolenaar2f0936c2022-01-08 21:51:59 +00001767In legacy script an internal variable is created with the ":let" command
Bram Moolenaar5da36052021-12-27 15:39:57 +00001768|:let|. An internal variable is explicitly destroyed with the ":unlet"
1769command |:unlet|.
Bram Moolenaar9588a0f2005-01-08 21:45:39 +00001770Using a name that is not an internal variable or refers to a variable that has
1771been destroyed results in an error.
Bram Moolenaar071d4272004-06-13 20:20:40 +00001772
Bram Moolenaar5da36052021-12-27 15:39:57 +00001773In |Vim9| script `:let` is not used and variables work differently, see |:var|.
1774
Bram Moolenaar65e0d772020-06-14 17:29:55 +02001775 *variable-scope*
Bram Moolenaar071d4272004-06-13 20:20:40 +00001776There are several name spaces for variables. Which one is to be used is
1777specified by what is prepended:
1778
Bram Moolenaar5da36052021-12-27 15:39:57 +00001779 (nothing) In a function: local to the function;
1780 in a legacy script: global;
1781 in a |Vim9| script: local to the script
Bram Moolenaar071d4272004-06-13 20:20:40 +00001782|buffer-variable| b: Local to the current buffer.
1783|window-variable| w: Local to the current window.
Bram Moolenaar910f66f2006-04-05 20:41:53 +00001784|tabpage-variable| t: Local to the current tab page.
Bram Moolenaar071d4272004-06-13 20:20:40 +00001785|global-variable| g: Global.
Bram Moolenaar5da36052021-12-27 15:39:57 +00001786|local-variable| l: Local to a function (only in a legacy function)
Bram Moolenaar071d4272004-06-13 20:20:40 +00001787|script-variable| s: Local to a |:source|'ed Vim script.
Bram Moolenaar5da36052021-12-27 15:39:57 +00001788|function-argument| a: Function argument (only in a legacy function).
Bram Moolenaar75b81562014-04-06 14:09:13 +02001789|vim-variable| v: Global, predefined by Vim.
Bram Moolenaar071d4272004-06-13 20:20:40 +00001790
Bram Moolenaar32466aa2006-02-24 23:53:04 +00001791The scope name by itself can be used as a |Dictionary|. For example, to
1792delete all script-local variables: >
Bram Moolenaar8f999f12005-01-25 22:12:55 +00001793 :for k in keys(s:)
1794 : unlet s:[k]
1795 :endfor
Bram Moolenaar65e0d772020-06-14 17:29:55 +02001796
Bram Moolenaar5da36052021-12-27 15:39:57 +00001797Note: in Vim9 script variables can also be local to a block of commands, see
1798|vim9-scopes|.
Bram Moolenaar531da592013-05-06 05:58:55 +02001799 *buffer-variable* *b:var* *b:*
Bram Moolenaar071d4272004-06-13 20:20:40 +00001800A variable name that is preceded with "b:" is local to the current buffer.
1801Thus you can have several "b:foo" variables, one for each buffer.
1802This kind of variable is deleted when the buffer is wiped out or deleted with
1803|:bdelete|.
1804
1805One local buffer variable is predefined:
Bram Moolenaarbf884932013-04-05 22:26:15 +02001806 *b:changedtick* *changetick*
Bram Moolenaar071d4272004-06-13 20:20:40 +00001807b:changedtick The total number of changes to the current buffer. It is
1808 incremented for each change. An undo command is also a change
Bram Moolenaarc024b462019-06-08 18:07:21 +02001809 in this case. Resetting 'modified' when writing the buffer is
1810 also counted.
1811 This can be used to perform an action only when the buffer has
1812 changed. Example: >
Bram Moolenaar071d4272004-06-13 20:20:40 +00001813 :if my_changedtick != b:changedtick
Bram Moolenaar446cb832008-06-24 21:56:24 +00001814 : let my_changedtick = b:changedtick
1815 : call My_Update()
Bram Moolenaar071d4272004-06-13 20:20:40 +00001816 :endif
Bram Moolenaar3df01732017-02-17 22:47:16 +01001817< You cannot change or delete the b:changedtick variable.
Bram Moolenaar71badf92023-04-22 22:40:14 +01001818 If you need more information about the change see
1819 |listener_add()|.
Bram Moolenaar3df01732017-02-17 22:47:16 +01001820
Bram Moolenaar531da592013-05-06 05:58:55 +02001821 *window-variable* *w:var* *w:*
Bram Moolenaar071d4272004-06-13 20:20:40 +00001822A variable name that is preceded with "w:" is local to the current window. It
1823is deleted when the window is closed.
1824
Bram Moolenaarad3b3662013-05-17 18:14:19 +02001825 *tabpage-variable* *t:var* *t:*
Bram Moolenaar910f66f2006-04-05 20:41:53 +00001826A variable name that is preceded with "t:" is local to the current tab page,
1827It is deleted when the tab page is closed. {not available when compiled
Bram Moolenaardb84e452010-08-15 13:50:43 +02001828without the |+windows| feature}
Bram Moolenaar910f66f2006-04-05 20:41:53 +00001829
Bram Moolenaar531da592013-05-06 05:58:55 +02001830 *global-variable* *g:var* *g:*
Bram Moolenaar04fb9162021-12-30 20:24:12 +00001831Inside functions and in |Vim9| script global variables are accessed with "g:".
1832Omitting this will access a variable local to a function or script. "g:"
1833can also be used in any other place if you like.
Bram Moolenaar071d4272004-06-13 20:20:40 +00001834
Bram Moolenaar531da592013-05-06 05:58:55 +02001835 *local-variable* *l:var* *l:*
Bram Moolenaar071d4272004-06-13 20:20:40 +00001836Inside functions local variables are accessed without prepending anything.
Bram Moolenaaref2f6562007-05-06 13:32:59 +00001837But you can also prepend "l:" if you like. However, without prepending "l:"
1838you may run into reserved variable names. For example "count". By itself it
1839refers to "v:count". Using "l:count" you can have a local variable with the
1840same name.
Bram Moolenaar071d4272004-06-13 20:20:40 +00001841
1842 *script-variable* *s:var*
Bram Moolenaar04fb9162021-12-30 20:24:12 +00001843In a legacy Vim script variables starting with "s:" can be used. They cannot
1844be accessed from outside of the scripts, thus are local to the script.
1845In |Vim9| script the "s:" prefix can be omitted, variables are script-local by
1846default.
Bram Moolenaar071d4272004-06-13 20:20:40 +00001847
1848They can be used in:
1849- commands executed while the script is sourced
1850- functions defined in the script
1851- autocommands defined in the script
1852- functions and autocommands defined in functions and autocommands which were
1853 defined in the script (recursively)
1854- user defined commands defined in the script
1855Thus not in:
1856- other scripts sourced from this one
1857- mappings
Bram Moolenaar8f3f58f2010-01-06 20:52:26 +01001858- menus
Bram Moolenaar071d4272004-06-13 20:20:40 +00001859- etc.
1860
Bram Moolenaaref2f6562007-05-06 13:32:59 +00001861Script variables can be used to avoid conflicts with global variable names.
1862Take this example: >
Bram Moolenaar071d4272004-06-13 20:20:40 +00001863
1864 let s:counter = 0
1865 function MyCounter()
1866 let s:counter = s:counter + 1
1867 echo s:counter
1868 endfunction
1869 command Tick call MyCounter()
1870
1871You can now invoke "Tick" from any script, and the "s:counter" variable in
1872that script will not be changed, only the "s:counter" in the script where
1873"Tick" was defined is used.
1874
1875Another example that does the same: >
1876
1877 let s:counter = 0
1878 command Tick let s:counter = s:counter + 1 | echo s:counter
1879
1880When calling a function and invoking a user-defined command, the context for
Bram Moolenaar69a7cb42004-06-20 12:51:53 +00001881script variables is set to the script where the function or command was
Bram Moolenaar071d4272004-06-13 20:20:40 +00001882defined.
1883
1884The script variables are also available when a function is defined inside a
1885function that is defined in a script. Example: >
1886
1887 let s:counter = 0
1888 function StartCounting(incr)
1889 if a:incr
1890 function MyCounter()
1891 let s:counter = s:counter + 1
1892 endfunction
1893 else
1894 function MyCounter()
1895 let s:counter = s:counter - 1
1896 endfunction
1897 endif
1898 endfunction
1899
1900This defines the MyCounter() function either for counting up or counting down
1901when calling StartCounting(). It doesn't matter from where StartCounting() is
1902called, the s:counter variable will be accessible in MyCounter().
1903
1904When the same script is sourced again it will use the same script variables.
1905They will remain valid as long as Vim is running. This can be used to
1906maintain a counter: >
1907
1908 if !exists("s:counter")
1909 let s:counter = 1
1910 echo "script executed for the first time"
1911 else
1912 let s:counter = s:counter + 1
Bram Moolenaarc51cf032022-02-26 12:25:45 +00001913 echo "script executed " .. s:counter .. " times now"
Bram Moolenaar071d4272004-06-13 20:20:40 +00001914 endif
1915
1916Note that this means that filetype plugins don't get a different set of script
1917variables for each buffer. Use local buffer variables instead |b:var|.
1918
1919
Bram Moolenaard47d5222018-12-09 20:43:55 +01001920PREDEFINED VIM VARIABLES *vim-variable* *v:var* *v:*
Bram Moolenaar6f4754b2022-01-23 12:07:04 +00001921 *E963* *E1063*
Bram Moolenaard47d5222018-12-09 20:43:55 +01001922Some variables can be set by the user, but the type cannot be changed.
Bram Moolenaar071d4272004-06-13 20:20:40 +00001923
Bram Moolenaar69bf6342019-10-29 04:16:57 +01001924 *v:argv* *argv-variable*
1925v:argv The command line arguments Vim was invoked with. This is a
1926 list of strings. The first item is the Vim command.
Bram Moolenaar1588bc82022-03-08 21:35:07 +00001927 See |v:progpath| for the command with full path.
Bram Moolenaar69bf6342019-10-29 04:16:57 +01001928
Bram Moolenaare4efc3b2005-03-07 23:16:51 +00001929 *v:beval_col* *beval_col-variable*
1930v:beval_col The number of the column, over which the mouse pointer is.
1931 This is the byte index in the |v:beval_lnum| line.
1932 Only valid while evaluating the 'balloonexpr' option.
1933
1934 *v:beval_bufnr* *beval_bufnr-variable*
1935v:beval_bufnr The number of the buffer, over which the mouse pointer is. Only
1936 valid while evaluating the 'balloonexpr' option.
1937
1938 *v:beval_lnum* *beval_lnum-variable*
1939v:beval_lnum The number of the line, over which the mouse pointer is. Only
1940 valid while evaluating the 'balloonexpr' option.
1941
1942 *v:beval_text* *beval_text-variable*
Bram Moolenaar24bbcfe2005-06-28 23:32:02 +00001943v:beval_text The text under or after the mouse pointer. Usually a word as
1944 it is useful for debugging a C program. 'iskeyword' applies,
1945 but a dot and "->" before the position is included. When on a
1946 ']' the text before it is used, including the matching '[' and
Bram Moolenaare4efc3b2005-03-07 23:16:51 +00001947 word before it. When on a Visual area within one line the
Bram Moolenaarb4d5fba2017-09-11 19:31:28 +02001948 highlighted text is used. Also see |<cexpr>|.
Bram Moolenaare4efc3b2005-03-07 23:16:51 +00001949 Only valid while evaluating the 'balloonexpr' option.
1950
1951 *v:beval_winnr* *beval_winnr-variable*
1952v:beval_winnr The number of the window, over which the mouse pointer is. Only
Bram Moolenaar00654022011-02-25 14:42:19 +01001953 valid while evaluating the 'balloonexpr' option. The first
1954 window has number zero (unlike most other places where a
1955 window gets a number).
Bram Moolenaare4efc3b2005-03-07 23:16:51 +00001956
Bram Moolenaar511972d2016-06-04 18:09:59 +02001957 *v:beval_winid* *beval_winid-variable*
Bram Moolenaar7571d552016-08-18 22:54:46 +02001958v:beval_winid The |window-ID| of the window, over which the mouse pointer
1959 is. Otherwise like v:beval_winnr.
Bram Moolenaar511972d2016-06-04 18:09:59 +02001960
Bram Moolenaarf193fff2006-04-27 00:02:13 +00001961 *v:char* *char-variable*
Bram Moolenaar8f3f58f2010-01-06 20:52:26 +01001962v:char Argument for evaluating 'formatexpr' and used for the typed
Bram Moolenaar945e2db2010-06-05 17:43:32 +02001963 character when using <expr> in an abbreviation |:map-<expr>|.
Bram Moolenaare6ae6222013-05-21 21:01:10 +02001964 It is also used by the |InsertCharPre| and |InsertEnter| events.
Bram Moolenaarf193fff2006-04-27 00:02:13 +00001965
Bram Moolenaar071d4272004-06-13 20:20:40 +00001966 *v:charconvert_from* *charconvert_from-variable*
1967v:charconvert_from
1968 The name of the character encoding of a file to be converted.
1969 Only valid while evaluating the 'charconvert' option.
1970
1971 *v:charconvert_to* *charconvert_to-variable*
1972v:charconvert_to
1973 The name of the character encoding of a file after conversion.
1974 Only valid while evaluating the 'charconvert' option.
1975
1976 *v:cmdarg* *cmdarg-variable*
1977v:cmdarg This variable is used for two purposes:
1978 1. The extra arguments given to a file read/write command.
1979 Currently these are "++enc=" and "++ff=". This variable is
1980 set before an autocommand event for a file read/write
1981 command is triggered. There is a leading space to make it
1982 possible to append this variable directly after the
Bram Moolenaar58b85342016-08-14 19:54:54 +02001983 read/write command. Note: The "+cmd" argument isn't
Bram Moolenaar071d4272004-06-13 20:20:40 +00001984 included here, because it will be executed anyway.
1985 2. When printing a PostScript file with ":hardcopy" this is
1986 the argument for the ":hardcopy" command. This can be used
1987 in 'printexpr'.
1988
1989 *v:cmdbang* *cmdbang-variable*
1990v:cmdbang Set like v:cmdarg for a file read/write command. When a "!"
1991 was used the value is 1, otherwise it is 0. Note that this
1992 can only be used in autocommands. For user commands |<bang>|
1993 can be used.
Bram Moolenaar84cf6bd2020-06-16 20:03:43 +02001994 *v:collate* *collate-variable*
1995v:collate The current locale setting for collation order of the runtime
1996 environment. This allows Vim scripts to be aware of the
1997 current locale encoding. Technical: it's the value of
1998 LC_COLLATE. When not using a locale the value is "C".
1999 This variable can not be set directly, use the |:language|
2000 command.
2001 See |multi-lang|.
Bram Moolenaar071d4272004-06-13 20:20:40 +00002002
Bram Moolenaar76db9e02022-11-09 21:21:04 +00002003 *v:colornames*
Drew Vogele30d1022021-10-24 20:35:07 +01002004v:colornames A dictionary that maps color names to hex color strings. These
2005 color names can be used with the |highlight-guifg|,
2006 |highlight-guibg|, and |highlight-guisp| parameters. Updating
2007 an entry in v:colornames has no immediate effect on the syntax
2008 highlighting. The highlight commands (probably in a
2009 colorscheme script) need to be re-evaluated in order to use
2010 the updated color values. For example: >
2011
2012 :let v:colornames['fuscia'] = '#cf3ab4'
2013 :let v:colornames['mauve'] = '#915f6d'
2014 :highlight Normal guifg=fuscia guibg=mauve
2015<
2016 This cannot be used to override the |cterm-colors| but it can
2017 be used to override other colors. For example, the X11 colors
2018 defined in the `colors/lists/default.vim` (previously defined
2019 in |rgb.txt|). When defining new color names in a plugin, the
2020 recommended practice is to set a color entry only when it does
2021 not already exist. For example: >
2022
2023 :call extend(v:colornames, {
2024 \ 'fuscia': '#cf3ab4',
2025 \ 'mauve': '#915f6d,
2026 \ }, 'keep')
2027<
Bram Moolenaar113cb512021-11-07 20:27:04 +00002028 Using |extend()| with the 'keep' option updates each color only
Drew Vogele30d1022021-10-24 20:35:07 +01002029 if it did not exist in |v:colornames|. Doing so allows the
2030 user to choose the precise color value for a common name
2031 by setting it in their |.vimrc|.
2032
2033 It is possible to remove entries from this dictionary but
Drew Vogela0fca172021-11-13 10:50:01 +00002034 doing so is NOT recommended, because it is disruptive to
Drew Vogele30d1022021-10-24 20:35:07 +01002035 other scripts. It is also unlikely to achieve the desired
Bram Moolenaar113cb512021-11-07 20:27:04 +00002036 result because the |:colorscheme| and |:highlight| commands will
Drew Vogele30d1022021-10-24 20:35:07 +01002037 both automatically load all `colors/lists/default.vim` color
2038 scripts.
2039
Bram Moolenaar42a45122015-07-10 17:56:23 +02002040 *v:completed_item* *completed_item-variable*
2041v:completed_item
2042 |Dictionary| containing the |complete-items| for the most
2043 recently completed word after |CompleteDone|. The
2044 |Dictionary| is empty if the completion failed.
Shougo Matsushita61021aa2022-07-27 14:40:00 +01002045 Note: Plugins can modify the value to emulate the builtin
2046 |CompleteDone| event behavior.
Bram Moolenaar42a45122015-07-10 17:56:23 +02002047
Bram Moolenaar071d4272004-06-13 20:20:40 +00002048 *v:count* *count-variable*
2049v:count The count given for the last Normal mode command. Can be used
Bram Moolenaar58b85342016-08-14 19:54:54 +02002050 to get the count before a mapping. Read-only. Example: >
Bram Moolenaarc51cf032022-02-26 12:25:45 +00002051 :map _x :<C-U>echo "the count is " .. v:count<CR>
Bram Moolenaar071d4272004-06-13 20:20:40 +00002052< Note: The <C-U> is required to remove the line range that you
2053 get when typing ':' after a count.
Bram Moolenaar8f3f58f2010-01-06 20:52:26 +01002054 When there are two counts, as in "3d2w", they are multiplied,
2055 just like what happens in the command, "d6w" for the example.
Bram Moolenaar1d2ba7f2006-02-14 22:29:30 +00002056 Also used for evaluating the 'formatexpr' option.
Bram Moolenaard2e716e2019-04-20 14:39:52 +02002057 "count" also works, for backwards compatibility, unless
2058 |scriptversion| is 3 or higher.
Bram Moolenaar071d4272004-06-13 20:20:40 +00002059
2060 *v:count1* *count1-variable*
2061v:count1 Just like "v:count", but defaults to one when no count is
2062 used.
2063
2064 *v:ctype* *ctype-variable*
2065v:ctype The current locale setting for characters of the runtime
2066 environment. This allows Vim scripts to be aware of the
2067 current locale encoding. Technical: it's the value of
2068 LC_CTYPE. When not using a locale the value is "C".
2069 This variable can not be set directly, use the |:language|
2070 command.
2071 See |multi-lang|.
2072
2073 *v:dying* *dying-variable*
Bram Moolenaar58b85342016-08-14 19:54:54 +02002074v:dying Normally zero. When a deadly signal is caught it's set to
Bram Moolenaar071d4272004-06-13 20:20:40 +00002075 one. When multiple signals are caught the number increases.
2076 Can be used in an autocommand to check if Vim didn't
2077 terminate normally. {only works on Unix}
2078 Example: >
2079 :au VimLeave * if v:dying | echo "\nAAAAaaaarrrggghhhh!!!\n" | endif
Bram Moolenaar0e1e25f2010-05-28 21:07:08 +02002080< Note: if another deadly signal is caught when v:dying is one,
2081 VimLeave autocommands will not be executed.
2082
Bram Moolenaarf0068c52020-11-30 17:42:10 +01002083 *v:exiting* *exiting-variable*
2084v:exiting Vim exit code. Normally zero, non-zero when something went
2085 wrong. The value is v:null before invoking the |VimLeavePre|
2086 and |VimLeave| autocmds. See |:q|, |:x| and |:cquit|.
2087 Example: >
2088 :au VimLeave * echo "Exit value is " .. v:exiting
2089<
Bram Moolenaar37f4cbd2019-08-23 20:58:45 +02002090 *v:echospace* *echospace-variable*
2091v:echospace Number of screen cells that can be used for an `:echo` message
2092 in the last screen line before causing the |hit-enter-prompt|.
2093 Depends on 'showcmd', 'ruler' and 'columns'. You need to
2094 check 'cmdheight' for whether there are full-width lines
2095 available above the last line.
2096
Bram Moolenaar071d4272004-06-13 20:20:40 +00002097 *v:errmsg* *errmsg-variable*
2098v:errmsg Last given error message. It's allowed to set this variable.
2099 Example: >
2100 :let v:errmsg = ""
2101 :silent! next
2102 :if v:errmsg != ""
2103 : ... handle error
Bram Moolenaard2e716e2019-04-20 14:39:52 +02002104< "errmsg" also works, for backwards compatibility, unless
2105 |scriptversion| is 3 or higher.
Bram Moolenaar071d4272004-06-13 20:20:40 +00002106
Bram Moolenaar65a54642018-04-28 16:56:53 +02002107 *v:errors* *errors-variable* *assert-return*
Bram Moolenaar683fa182015-11-30 21:38:24 +01002108v:errors Errors found by assert functions, such as |assert_true()|.
Bram Moolenaar43345542015-11-29 17:35:35 +01002109 This is a list of strings.
2110 The assert functions append an item when an assert fails.
Bram Moolenaar65a54642018-04-28 16:56:53 +02002111 The return value indicates this: a one is returned if an item
2112 was added to v:errors, otherwise zero is returned.
Bram Moolenaar43345542015-11-29 17:35:35 +01002113 To remove old results make it empty: >
2114 :let v:errors = []
2115< If v:errors is set to anything but a list it is made an empty
2116 list by the assert function.
2117
Bram Moolenaar7e1652c2017-12-16 18:27:02 +01002118 *v:event* *event-variable*
2119v:event Dictionary containing information about the current
Bram Moolenaar560979e2020-02-04 22:53:05 +01002120 |autocommand|. See the specific event for what it puts in
2121 this dictionary.
Bram Moolenaar2c7f8c52020-04-20 19:52:53 +02002122 The dictionary is emptied when the |autocommand| finishes,
2123 please refer to |dict-identity| for how to get an independent
2124 copy of it. Use |deepcopy()| if you want to keep the
2125 information after the event triggers. Example: >
2126 au TextYankPost * let g:foo = deepcopy(v:event)
2127<
Bram Moolenaar071d4272004-06-13 20:20:40 +00002128 *v:exception* *exception-variable*
2129v:exception The value of the exception most recently caught and not
2130 finished. See also |v:throwpoint| and |throw-variables|.
2131 Example: >
2132 :try
2133 : throw "oops"
2134 :catch /.*/
Bram Moolenaar54775062019-07-31 21:07:14 +02002135 : echo "caught " .. v:exception
Bram Moolenaar071d4272004-06-13 20:20:40 +00002136 :endtry
2137< Output: "caught oops".
2138
Bram Moolenaar520e1e42016-01-23 19:46:28 +01002139 *v:false* *false-variable*
2140v:false A Number with value zero. Used to put "false" in JSON. See
Bram Moolenaar6463ca22016-02-13 17:04:46 +01002141 |json_encode()|.
Bram Moolenaarc95a3022016-06-12 23:01:46 +02002142 When used as a string this evaluates to "v:false". >
Bram Moolenaar705ada12016-01-24 17:56:50 +01002143 echo v:false
Bram Moolenaarc95a3022016-06-12 23:01:46 +02002144< v:false ~
2145 That is so that eval() can parse the string back to the same
Bram Moolenaardf48fb42016-07-22 21:50:18 +02002146 value. Read-only.
Bram Moolenaar5da36052021-12-27 15:39:57 +00002147 In |Vim9| script "false" can be used which has a boolean type.
Bram Moolenaar520e1e42016-01-23 19:46:28 +01002148
Bram Moolenaar19a09a12005-03-04 23:39:37 +00002149 *v:fcs_reason* *fcs_reason-variable*
2150v:fcs_reason The reason why the |FileChangedShell| event was triggered.
2151 Can be used in an autocommand to decide what to do and/or what
2152 to set v:fcs_choice to. Possible values:
2153 deleted file no longer exists
2154 conflict file contents, mode or timestamp was
2155 changed and buffer is modified
2156 changed file contents has changed
2157 mode mode of file changed
2158 time only file timestamp changed
2159
2160 *v:fcs_choice* *fcs_choice-variable*
2161v:fcs_choice What should happen after a |FileChangedShell| event was
2162 triggered. Can be used in an autocommand to tell Vim what to
2163 do with the affected buffer:
2164 reload Reload the buffer (does not work if
2165 the file was deleted).
Rob Pilling8196e942022-02-11 15:12:10 +00002166 edit Reload the buffer and detect the
2167 values for options such as
2168 'fileformat', 'fileencoding', 'binary'
2169 (does not work if the file was
2170 deleted).
Bram Moolenaar19a09a12005-03-04 23:39:37 +00002171 ask Ask the user what to do, as if there
2172 was no autocommand. Except that when
2173 only the timestamp changed nothing
2174 will happen.
2175 <empty> Nothing, the autocommand should do
2176 everything that needs to be done.
2177 The default is empty. If another (invalid) value is used then
2178 Vim behaves like it is empty, there is no warning message.
2179
Bram Moolenaar4c295022021-05-02 17:19:11 +02002180 *v:fname* *fname-variable*
Bram Moolenaar90df4b92021-07-07 20:26:08 +02002181v:fname When evaluating 'includeexpr': the file name that was
2182 detected. Empty otherwise.
Bram Moolenaar4c295022021-05-02 17:19:11 +02002183
Bram Moolenaar071d4272004-06-13 20:20:40 +00002184 *v:fname_in* *fname_in-variable*
Bram Moolenaar4e330bb2005-12-07 21:04:31 +00002185v:fname_in The name of the input file. Valid while evaluating:
Bram Moolenaar071d4272004-06-13 20:20:40 +00002186 option used for ~
2187 'charconvert' file to be converted
2188 'diffexpr' original file
2189 'patchexpr' original file
2190 'printexpr' file to be printed
Bram Moolenaar2c7a29c2005-12-12 22:02:31 +00002191 And set to the swap file name for |SwapExists|.
Bram Moolenaar071d4272004-06-13 20:20:40 +00002192
2193 *v:fname_out* *fname_out-variable*
2194v:fname_out The name of the output file. Only valid while
2195 evaluating:
2196 option used for ~
2197 'charconvert' resulting converted file (*)
2198 'diffexpr' output of diff
2199 'patchexpr' resulting patched file
2200 (*) When doing conversion for a write command (e.g., ":w
Bram Moolenaar58b85342016-08-14 19:54:54 +02002201 file") it will be equal to v:fname_in. When doing conversion
Bram Moolenaar071d4272004-06-13 20:20:40 +00002202 for a read command (e.g., ":e file") it will be a temporary
2203 file and different from v:fname_in.
2204
2205 *v:fname_new* *fname_new-variable*
2206v:fname_new The name of the new version of the file. Only valid while
2207 evaluating 'diffexpr'.
2208
2209 *v:fname_diff* *fname_diff-variable*
2210v:fname_diff The name of the diff (patch) file. Only valid while
2211 evaluating 'patchexpr'.
2212
2213 *v:folddashes* *folddashes-variable*
2214v:folddashes Used for 'foldtext': dashes representing foldlevel of a closed
2215 fold.
Bram Moolenaar7b0294c2004-10-11 10:16:09 +00002216 Read-only in the |sandbox|. |fold-foldtext|
Bram Moolenaar071d4272004-06-13 20:20:40 +00002217
2218 *v:foldlevel* *foldlevel-variable*
2219v:foldlevel Used for 'foldtext': foldlevel of closed fold.
Bram Moolenaar7b0294c2004-10-11 10:16:09 +00002220 Read-only in the |sandbox|. |fold-foldtext|
Bram Moolenaar071d4272004-06-13 20:20:40 +00002221
2222 *v:foldend* *foldend-variable*
2223v:foldend Used for 'foldtext': last line of closed fold.
Bram Moolenaar7b0294c2004-10-11 10:16:09 +00002224 Read-only in the |sandbox|. |fold-foldtext|
Bram Moolenaar071d4272004-06-13 20:20:40 +00002225
2226 *v:foldstart* *foldstart-variable*
2227v:foldstart Used for 'foldtext': first line of closed fold.
Bram Moolenaar7b0294c2004-10-11 10:16:09 +00002228 Read-only in the |sandbox|. |fold-foldtext|
Bram Moolenaar071d4272004-06-13 20:20:40 +00002229
Bram Moolenaar817a8802013-11-09 01:44:43 +01002230 *v:hlsearch* *hlsearch-variable*
Bram Moolenaarb0d45e72017-11-05 18:19:24 +01002231v:hlsearch Variable that indicates whether search highlighting is on.
Bram Moolenaar76440e22014-11-27 19:14:49 +01002232 Setting it makes sense only if 'hlsearch' is enabled which
2233 requires |+extra_search|. Setting this variable to zero acts
Bram Moolenaar705ada12016-01-24 17:56:50 +01002234 like the |:nohlsearch| command, setting it to one acts like >
Bram Moolenaar817a8802013-11-09 01:44:43 +01002235 let &hlsearch = &hlsearch
Bram Moolenaar86ae7202015-07-10 19:31:35 +02002236< Note that the value is restored when returning from a
2237 function. |function-search-undo|.
2238
Bram Moolenaar843ee412004-06-30 16:16:41 +00002239 *v:insertmode* *insertmode-variable*
2240v:insertmode Used for the |InsertEnter| and |InsertChange| autocommand
2241 events. Values:
2242 i Insert mode
2243 r Replace mode
2244 v Virtual Replace mode
2245
Bram Moolenaar2fda12f2005-01-15 22:14:15 +00002246 *v:key* *key-variable*
Bram Moolenaar32466aa2006-02-24 23:53:04 +00002247v:key Key of the current item of a |Dictionary|. Only valid while
Bram Moolenaar2fda12f2005-01-15 22:14:15 +00002248 evaluating the expression used with |map()| and |filter()|.
2249 Read-only.
2250
Bram Moolenaar071d4272004-06-13 20:20:40 +00002251 *v:lang* *lang-variable*
2252v:lang The current locale setting for messages of the runtime
2253 environment. This allows Vim scripts to be aware of the
2254 current language. Technical: it's the value of LC_MESSAGES.
2255 The value is system dependent.
2256 This variable can not be set directly, use the |:language|
2257 command.
2258 It can be different from |v:ctype| when messages are desired
2259 in a different language than what is used for character
2260 encoding. See |multi-lang|.
2261
2262 *v:lc_time* *lc_time-variable*
2263v:lc_time The current locale setting for time messages of the runtime
2264 environment. This allows Vim scripts to be aware of the
2265 current language. Technical: it's the value of LC_TIME.
2266 This variable can not be set directly, use the |:language|
2267 command. See |multi-lang|.
2268
2269 *v:lnum* *lnum-variable*
Bram Moolenaar368373e2010-07-19 20:46:22 +02002270v:lnum Line number for the 'foldexpr' |fold-expr|, 'formatexpr' and
2271 'indentexpr' expressions, tab page number for 'guitablabel'
2272 and 'guitabtooltip'. Only valid while one of these
2273 expressions is being evaluated. Read-only when in the
2274 |sandbox|.
Bram Moolenaar071d4272004-06-13 20:20:40 +00002275
naohiro ono56200ee2022-01-01 14:59:44 +00002276 *v:maxcol* *maxcol-variable*
Bram Moolenaar2f0936c2022-01-08 21:51:59 +00002277v:maxcol Maximum line length. Depending on where it is used it can be
Bram Moolenaar944697a2022-02-20 19:48:20 +00002278 screen columns, characters or bytes. The value currently is
2279 2147483647 on all systems.
naohiro ono56200ee2022-01-01 14:59:44 +00002280
Bram Moolenaar219b8702006-11-01 14:32:36 +00002281 *v:mouse_win* *mouse_win-variable*
2282v:mouse_win Window number for a mouse click obtained with |getchar()|.
2283 First window has number 1, like with |winnr()|. The value is
2284 zero when there was no mouse button click.
2285
Bram Moolenaar511972d2016-06-04 18:09:59 +02002286 *v:mouse_winid* *mouse_winid-variable*
2287v:mouse_winid Window ID for a mouse click obtained with |getchar()|.
2288 The value is zero when there was no mouse button click.
2289
Bram Moolenaar219b8702006-11-01 14:32:36 +00002290 *v:mouse_lnum* *mouse_lnum-variable*
2291v:mouse_lnum Line number for a mouse click obtained with |getchar()|.
2292 This is the text line number, not the screen line number. The
2293 value is zero when there was no mouse button click.
2294
2295 *v:mouse_col* *mouse_col-variable*
2296v:mouse_col Column number for a mouse click obtained with |getchar()|.
2297 This is the screen column number, like with |virtcol()|. The
2298 value is zero when there was no mouse button click.
2299
Bram Moolenaard09091d2019-01-17 16:07:22 +01002300 *v:none* *none-variable* *None*
Bram Moolenaar520e1e42016-01-23 19:46:28 +01002301v:none An empty String. Used to put an empty item in JSON. See
Bram Moolenaar6463ca22016-02-13 17:04:46 +01002302 |json_encode()|.
Bram Moolenaar2547aa92020-07-26 17:00:44 +02002303 This can also be used as a function argument to use the
2304 default value, see |none-function_argument|.
Bram Moolenaar705ada12016-01-24 17:56:50 +01002305 When used as a number this evaluates to zero.
Bram Moolenaarc95a3022016-06-12 23:01:46 +02002306 When used as a string this evaluates to "v:none". >
Bram Moolenaar705ada12016-01-24 17:56:50 +01002307 echo v:none
Bram Moolenaarc95a3022016-06-12 23:01:46 +02002308< v:none ~
2309 That is so that eval() can parse the string back to the same
Bram Moolenaardf48fb42016-07-22 21:50:18 +02002310 value. Read-only.
Bram Moolenaar1588bc82022-03-08 21:35:07 +00002311 Note that using `== v:none` and `!= v:none` will often give
2312 an error. Instead, use `is v:none` and `isnot v:none` .
Bram Moolenaar520e1e42016-01-23 19:46:28 +01002313
2314 *v:null* *null-variable*
2315v:null An empty String. Used to put "null" in JSON. See
Bram Moolenaar6463ca22016-02-13 17:04:46 +01002316 |json_encode()|.
Bram Moolenaar705ada12016-01-24 17:56:50 +01002317 When used as a number this evaluates to zero.
Bram Moolenaarc95a3022016-06-12 23:01:46 +02002318 When used as a string this evaluates to "v:null". >
Bram Moolenaar705ada12016-01-24 17:56:50 +01002319 echo v:null
Bram Moolenaarc95a3022016-06-12 23:01:46 +02002320< v:null ~
2321 That is so that eval() can parse the string back to the same
Bram Moolenaardf48fb42016-07-22 21:50:18 +02002322 value. Read-only.
Bram Moolenaar1588bc82022-03-08 21:35:07 +00002323 In |Vim9| script `null` can be used without "v:".
2324 In some places `v:null` and `null` can be used for a List,
2325 Dict, Job, etc. that is not set. That is slightly different
2326 than an empty List, Dict, etc.
Bram Moolenaar520e1e42016-01-23 19:46:28 +01002327
Bram Moolenaar57d5a012021-01-21 21:42:31 +01002328 *v:numbermax* *numbermax-variable*
2329v:numbermax Maximum value of a number.
2330
Bram Moolenaare0e39172021-01-25 21:14:57 +01002331 *v:numbermin* *numbermin-variable*
Bram Moolenaar2346a632021-06-13 19:02:49 +02002332v:numbermin Minimum value of a number (negative).
Bram Moolenaar57d5a012021-01-21 21:42:31 +01002333
Bram Moolenaarf9706e92020-02-22 14:27:04 +01002334 *v:numbersize* *numbersize-variable*
2335v:numbersize Number of bits in a Number. This is normally 64, but on some
Bram Moolenaarbc93ceb2020-02-26 13:36:21 +01002336 systems it may be 32.
Bram Moolenaarf9706e92020-02-22 14:27:04 +01002337
Bram Moolenaard812df62008-11-09 12:46:09 +00002338 *v:oldfiles* *oldfiles-variable*
2339v:oldfiles List of file names that is loaded from the |viminfo| file on
2340 startup. These are the files that Vim remembers marks for.
2341 The length of the List is limited by the ' argument of the
2342 'viminfo' option (default is 100).
Bram Moolenaar8d043172014-01-23 14:24:41 +01002343 When the |viminfo| file is not used the List is empty.
Bram Moolenaard812df62008-11-09 12:46:09 +00002344 Also see |:oldfiles| and |c_#<|.
2345 The List can be modified, but this has no effect on what is
2346 stored in the |viminfo| file later. If you use values other
2347 than String this will cause trouble.
Bram Moolenaardb84e452010-08-15 13:50:43 +02002348 {only when compiled with the |+viminfo| feature}
Bram Moolenaard812df62008-11-09 12:46:09 +00002349
Bram Moolenaar53744302015-07-17 17:38:22 +02002350 *v:option_new*
2351v:option_new New value of the option. Valid while executing an |OptionSet|
2352 autocommand.
2353 *v:option_old*
2354v:option_old Old value of the option. Valid while executing an |OptionSet|
Bram Moolenaard7c96872019-06-15 17:12:48 +02002355 autocommand. Depending on the command used for setting and the
2356 kind of option this is either the local old value or the
2357 global old value.
2358 *v:option_oldlocal*
2359v:option_oldlocal
2360 Old local value of the option. Valid while executing an
2361 |OptionSet| autocommand.
2362 *v:option_oldglobal*
2363v:option_oldglobal
2364 Old global value of the option. Valid while executing an
2365 |OptionSet| autocommand.
Bram Moolenaar53744302015-07-17 17:38:22 +02002366 *v:option_type*
2367v:option_type Scope of the set command. Valid while executing an
2368 |OptionSet| autocommand. Can be either "global" or "local"
Bram Moolenaard7c96872019-06-15 17:12:48 +02002369 *v:option_command*
2370v:option_command
2371 Command used to set the option. Valid while executing an
2372 |OptionSet| autocommand.
2373 value option was set via ~
2374 "setlocal" |:setlocal| or ":let l:xxx"
2375 "setglobal" |:setglobal| or ":let g:xxx"
2376 "set" |:set| or |:let|
2377 "modeline" |modeline|
Bram Moolenaar8af1fbf2008-01-05 12:35:21 +00002378 *v:operator* *operator-variable*
2379v:operator The last operator given in Normal mode. This is a single
2380 character except for commands starting with <g> or <z>,
2381 in which case it is two characters. Best used alongside
2382 |v:prevcount| and |v:register|. Useful if you want to cancel
2383 Operator-pending mode and then use the operator, e.g.: >
2384 :omap O <Esc>:call MyMotion(v:operator)<CR>
2385< The value remains set until another operator is entered, thus
2386 don't expect it to be empty.
2387 v:operator is not set for |:delete|, |:yank| or other Ex
2388 commands.
2389 Read-only.
2390
Bram Moolenaar071d4272004-06-13 20:20:40 +00002391 *v:prevcount* *prevcount-variable*
2392v:prevcount The count given for the last but one Normal mode command.
2393 This is the v:count value of the previous command. Useful if
Bram Moolenaar8af1fbf2008-01-05 12:35:21 +00002394 you want to cancel Visual or Operator-pending mode and then
2395 use the count, e.g.: >
Bram Moolenaar071d4272004-06-13 20:20:40 +00002396 :vmap % <Esc>:call MyFilter(v:prevcount)<CR>
2397< Read-only.
2398
Bram Moolenaar05159a02005-02-26 23:04:13 +00002399 *v:profiling* *profiling-variable*
Bram Moolenaar58b85342016-08-14 19:54:54 +02002400v:profiling Normally zero. Set to one after using ":profile start".
Bram Moolenaar05159a02005-02-26 23:04:13 +00002401 See |profiling|.
2402
Bram Moolenaar071d4272004-06-13 20:20:40 +00002403 *v:progname* *progname-variable*
2404v:progname Contains the name (with path removed) with which Vim was
Bram Moolenaard38b0552012-04-25 19:07:41 +02002405 invoked. Allows you to do special initialisations for |view|,
2406 |evim| etc., or any other name you might symlink to Vim.
Bram Moolenaar071d4272004-06-13 20:20:40 +00002407 Read-only.
2408
Bram Moolenaara1706c92014-04-01 19:55:49 +02002409 *v:progpath* *progpath-variable*
Bram Moolenaar56c860c2019-08-17 20:09:31 +02002410v:progpath Contains the command with which Vim was invoked, in a form
2411 that when passed to the shell will run the same Vim executable
2412 as the current one (if $PATH remains unchanged).
2413 Useful if you want to message a Vim server using a
Bram Moolenaara1706c92014-04-01 19:55:49 +02002414 |--remote-expr|.
Bram Moolenaarc7f02552014-04-01 21:00:59 +02002415 To get the full path use: >
2416 echo exepath(v:progpath)
Bram Moolenaar56c860c2019-08-17 20:09:31 +02002417< If the command has a relative path it will be expanded to the
2418 full path, so that it still works after `:cd`. Thus starting
2419 "./vim" results in "/home/user/path/to/vim/src/vim".
2420 On Linux and other systems it will always be the full path.
2421 On Mac it may just be "vim" and using exepath() as mentioned
2422 above should be used to get the full path.
Bram Moolenaar08cab962017-03-04 14:37:18 +01002423 On MS-Windows the executable may be called "vim.exe", but the
2424 ".exe" is not added to v:progpath.
Bram Moolenaara1706c92014-04-01 19:55:49 +02002425 Read-only.
2426
h_eastba77bbb2023-10-03 04:47:13 +09002427 *v:python3_version* *python3-version-variable*
Yee Cheng Chinc13b3d12023-08-20 21:18:38 +02002428v:python3_version
2429 Version of Python 3 that Vim was built against. When
2430 Python is loaded dynamically (|python-dynamic|), this version
2431 should exactly match the Python library up to the minor
2432 version (e.g. 3.10.2 and 3.10.3 are compatible as the minor
2433 version is "10", whereas 3.9.4 and 3.10.3 are not compatible).
2434 When |python-stable-abi| is used, this will be the minimum Python
2435 version that you can use instead. (e.g. if v:python3_version
2436 indicates 3.9, you can use 3.9, 3.10, or anything above).
2437
2438 This number is encoded as a hex number following Python ABI
2439 versioning conventions. Do the following to have a
2440 human-readable full version in hex: >
2441 echo printf("%08X", v:python3_version)
2442< You can obtain only the minor version by doing: >
2443 echo and(v:python3_version>>16,0xff)
2444< Read-only.
2445
Bram Moolenaar071d4272004-06-13 20:20:40 +00002446 *v:register* *register-variable*
Bram Moolenaard58e9292011-02-09 17:07:58 +01002447v:register The name of the register in effect for the current normal mode
Bram Moolenaard38b0552012-04-25 19:07:41 +02002448 command (regardless of whether that command actually used a
2449 register). Or for the currently executing normal mode mapping
2450 (use this in custom commands that take a register).
2451 If none is supplied it is the default register '"', unless
2452 'clipboard' contains "unnamed" or "unnamedplus", then it is
2453 '*' or '+'.
Bram Moolenaard58e9292011-02-09 17:07:58 +01002454 Also see |getreg()| and |setreg()|
Bram Moolenaar071d4272004-06-13 20:20:40 +00002455
Bram Moolenaar1c7715d2005-10-03 22:02:18 +00002456 *v:scrollstart* *scrollstart-variable*
2457v:scrollstart String describing the script or function that caused the
2458 screen to scroll up. It's only set when it is empty, thus the
2459 first reason is remembered. It is set to "Unknown" for a
2460 typed command.
2461 This can be used to find out why your script causes the
2462 hit-enter prompt.
2463
Bram Moolenaar071d4272004-06-13 20:20:40 +00002464 *v:servername* *servername-variable*
Bram Moolenaarc2ce52c2017-08-01 18:35:38 +02002465v:servername The resulting registered |client-server-name| if any.
Bram Moolenaar071d4272004-06-13 20:20:40 +00002466 Read-only.
2467
Bram Moolenaarb0d45e72017-11-05 18:19:24 +01002468
Bram Moolenaar446cb832008-06-24 21:56:24 +00002469v:searchforward *v:searchforward* *searchforward-variable*
2470 Search direction: 1 after a forward search, 0 after a
2471 backward search. It is reset to forward when directly setting
2472 the last search pattern, see |quote/|.
2473 Note that the value is restored when returning from a
2474 function. |function-search-undo|.
2475 Read-write.
2476
Bram Moolenaar071d4272004-06-13 20:20:40 +00002477 *v:shell_error* *shell_error-variable*
2478v:shell_error Result of the last shell command. When non-zero, the last
2479 shell command had an error. When zero, there was no problem.
2480 This only works when the shell returns the error code to Vim.
2481 The value -1 is often used when the command could not be
2482 executed. Read-only.
2483 Example: >
2484 :!mv foo bar
2485 :if v:shell_error
2486 : echo 'could not rename "foo" to "bar"!'
2487 :endif
Bram Moolenaard2e716e2019-04-20 14:39:52 +02002488< "shell_error" also works, for backwards compatibility, unless
2489 |scriptversion| is 3 or higher.
Bram Moolenaar071d4272004-06-13 20:20:40 +00002490
Bram Moolenaar113cb512021-11-07 20:27:04 +00002491 *v:sizeofint* *sizeofint-variable*
2492v:sizeofint Number of bytes in an int. Depends on how Vim was compiled.
2493 This is only useful for deciding whether a test will give the
2494 expected result.
2495
2496 *v:sizeoflong* *sizeoflong-variable*
2497v:sizeoflong Number of bytes in a long. Depends on how Vim was compiled.
2498 This is only useful for deciding whether a test will give the
2499 expected result.
2500
2501 *v:sizeofpointer* *sizeofpointer-variable*
2502v:sizeofpointer Number of bytes in a pointer. Depends on how Vim was compiled.
2503 This is only useful for deciding whether a test will give the
2504 expected result.
2505
Bram Moolenaar071d4272004-06-13 20:20:40 +00002506 *v:statusmsg* *statusmsg-variable*
2507v:statusmsg Last given status message. It's allowed to set this variable.
2508
Bram Moolenaar4e330bb2005-12-07 21:04:31 +00002509 *v:swapname* *swapname-variable*
2510v:swapname Only valid when executing |SwapExists| autocommands: Name of
2511 the swap file found. Read-only.
2512
2513 *v:swapchoice* *swapchoice-variable*
2514v:swapchoice |SwapExists| autocommands can set this to the selected choice
2515 for handling an existing swap file:
2516 'o' Open read-only
2517 'e' Edit anyway
2518 'r' Recover
2519 'd' Delete swapfile
2520 'q' Quit
2521 'a' Abort
Bram Moolenaar58b85342016-08-14 19:54:54 +02002522 The value should be a single-character string. An empty value
Bram Moolenaar4e330bb2005-12-07 21:04:31 +00002523 results in the user being asked, as would happen when there is
2524 no SwapExists autocommand. The default is empty.
2525
Bram Moolenaarb3480382005-12-11 21:33:32 +00002526 *v:swapcommand* *swapcommand-variable*
Bram Moolenaar4770d092006-01-12 23:22:24 +00002527v:swapcommand Normal mode command to be executed after a file has been
Bram Moolenaarb3480382005-12-11 21:33:32 +00002528 opened. Can be used for a |SwapExists| autocommand to have
Bram Moolenaar58b85342016-08-14 19:54:54 +02002529 another Vim open the file and jump to the right place. For
Bram Moolenaarb3480382005-12-11 21:33:32 +00002530 example, when jumping to a tag the value is ":tag tagname\r".
Bram Moolenaar1f35bf92006-03-07 22:38:47 +00002531 For ":edit +cmd file" the value is ":cmd\r".
Bram Moolenaarb3480382005-12-11 21:33:32 +00002532
Bram Moolenaard823fa92016-08-12 16:29:27 +02002533 *v:t_TYPE* *v:t_bool* *t_bool-variable*
Bram Moolenaard09091d2019-01-17 16:07:22 +01002534v:t_bool Value of |Boolean| type. Read-only. See: |type()|
Bram Moolenaard823fa92016-08-12 16:29:27 +02002535 *v:t_channel* *t_channel-variable*
Bram Moolenaard09091d2019-01-17 16:07:22 +01002536v:t_channel Value of |Channel| type. Read-only. See: |type()|
Bram Moolenaard823fa92016-08-12 16:29:27 +02002537 *v:t_dict* *t_dict-variable*
Bram Moolenaard09091d2019-01-17 16:07:22 +01002538v:t_dict Value of |Dictionary| type. Read-only. See: |type()|
Bram Moolenaard823fa92016-08-12 16:29:27 +02002539 *v:t_float* *t_float-variable*
Bram Moolenaard09091d2019-01-17 16:07:22 +01002540v:t_float Value of |Float| type. Read-only. See: |type()|
Bram Moolenaard823fa92016-08-12 16:29:27 +02002541 *v:t_func* *t_func-variable*
Bram Moolenaard09091d2019-01-17 16:07:22 +01002542v:t_func Value of |Funcref| type. Read-only. See: |type()|
Bram Moolenaard823fa92016-08-12 16:29:27 +02002543 *v:t_job* *t_job-variable*
Bram Moolenaard09091d2019-01-17 16:07:22 +01002544v:t_job Value of |Job| type. Read-only. See: |type()|
Bram Moolenaard823fa92016-08-12 16:29:27 +02002545 *v:t_list* *t_list-variable*
Bram Moolenaard09091d2019-01-17 16:07:22 +01002546v:t_list Value of |List| type. Read-only. See: |type()|
Bram Moolenaard823fa92016-08-12 16:29:27 +02002547 *v:t_none* *t_none-variable*
Bram Moolenaard09091d2019-01-17 16:07:22 +01002548v:t_none Value of |None| type. Read-only. See: |type()|
Bram Moolenaard823fa92016-08-12 16:29:27 +02002549 *v:t_number* *t_number-variable*
Bram Moolenaard09091d2019-01-17 16:07:22 +01002550v:t_number Value of |Number| type. Read-only. See: |type()|
Bram Moolenaard823fa92016-08-12 16:29:27 +02002551 *v:t_string* *t_string-variable*
Bram Moolenaard09091d2019-01-17 16:07:22 +01002552v:t_string Value of |String| type. Read-only. See: |type()|
Bram Moolenaar6e5ea8d2019-01-12 22:47:31 +01002553 *v:t_blob* *t_blob-variable*
Bram Moolenaard09091d2019-01-17 16:07:22 +01002554v:t_blob Value of |Blob| type. Read-only. See: |type()|
Bram Moolenaarc0c2c262023-01-12 21:08:53 +00002555 *v:t_class* *t_class-variable*
2556v:t_class Value of |class| type. Read-only. See: |type()|
2557 *v:t_object* *t_object-variable*
2558v:t_object Value of |object| type. Read-only. See: |type()|
Bram Moolenaarf562e722016-07-19 17:25:25 +02002559
Bram Moolenaar071d4272004-06-13 20:20:40 +00002560 *v:termresponse* *termresponse-variable*
2561v:termresponse The escape sequence returned by the terminal for the |t_RV|
Bram Moolenaar58b85342016-08-14 19:54:54 +02002562 termcap entry. It is set when Vim receives an escape sequence
Bram Moolenaarb4230122019-05-30 18:40:53 +02002563 that starts with ESC [ or CSI, then '>' or '?' and ends in a
2564 'c', with only digits and ';' in between.
Bram Moolenaar071d4272004-06-13 20:20:40 +00002565 When this option is set, the TermResponse autocommand event is
2566 fired, so that you can react to the response from the
Bram Moolenaar0c0eddd2020-06-13 15:47:25 +02002567 terminal. You can use |terminalprops()| to see what Vim
2568 figured out about the terminal.
Bram Moolenaarb4230122019-05-30 18:40:53 +02002569 The response from a new xterm is: "<Esc>[> Pp ; Pv ; Pc c". Pp
Bram Moolenaar071d4272004-06-13 20:20:40 +00002570 is the terminal type: 0 for vt100 and 1 for vt220. Pv is the
2571 patch level (since this was introduced in patch 95, it's
Bram Moolenaarfa3b7232021-12-24 13:18:38 +00002572 always 95 or higher). Pc is always zero.
2573 If Pv is 141 or higher then Vim will try to request terminal
2574 codes. This only works with xterm |xterm-codes|.
Bram Moolenaar071d4272004-06-13 20:20:40 +00002575 {only when compiled with |+termresponse| feature}
2576
Bram Moolenaarf3af54e2017-08-30 14:53:06 +02002577 *v:termblinkresp*
2578v:termblinkresp The escape sequence returned by the terminal for the |t_RC|
2579 termcap entry. This is used to find out whether the terminal
2580 cursor is blinking. This is used by |term_getcursor()|.
2581
2582 *v:termstyleresp*
2583v:termstyleresp The escape sequence returned by the terminal for the |t_RS|
2584 termcap entry. This is used to find out what the shape of the
2585 cursor is. This is used by |term_getcursor()|.
2586
Bram Moolenaar65e4c4f2017-10-14 23:24:25 +02002587 *v:termrbgresp*
2588v:termrbgresp The escape sequence returned by the terminal for the |t_RB|
Bram Moolenaarf3af54e2017-08-30 14:53:06 +02002589 termcap entry. This is used to find out what the terminal
2590 background color is, see 'background'.
2591
Bram Moolenaar65e4c4f2017-10-14 23:24:25 +02002592 *v:termrfgresp*
2593v:termrfgresp The escape sequence returned by the terminal for the |t_RF|
2594 termcap entry. This is used to find out what the terminal
2595 foreground color is.
2596
Bram Moolenaarf3af54e2017-08-30 14:53:06 +02002597 *v:termu7resp*
2598v:termu7resp The escape sequence returned by the terminal for the |t_u7|
2599 termcap entry. This is used to find out what the terminal
2600 does with ambiguous width characters, see 'ambiwidth'.
2601
Bram Moolenaarebf7dfa2016-04-14 12:46:51 +02002602 *v:testing* *testing-variable*
Bram Moolenaar8e8df252016-05-25 21:23:21 +02002603v:testing Must be set before using `test_garbagecollect_now()`.
Bram Moolenaar036986f2017-03-16 17:41:02 +01002604 Also, when set certain error messages won't be shown for 2
Bram Moolenaarb0d45e72017-11-05 18:19:24 +01002605 seconds. (e.g. "'dictionary' option is empty")
Bram Moolenaarebf7dfa2016-04-14 12:46:51 +02002606
Bram Moolenaar071d4272004-06-13 20:20:40 +00002607 *v:this_session* *this_session-variable*
2608v:this_session Full filename of the last loaded or saved session file. See
2609 |:mksession|. It is allowed to set this variable. When no
2610 session file has been saved, this variable is empty.
Bram Moolenaard2e716e2019-04-20 14:39:52 +02002611 "this_session" also works, for backwards compatibility, unless
2612 |scriptversion| is 3 or higher
Bram Moolenaar071d4272004-06-13 20:20:40 +00002613
2614 *v:throwpoint* *throwpoint-variable*
2615v:throwpoint The point where the exception most recently caught and not
Bram Moolenaar58b85342016-08-14 19:54:54 +02002616 finished was thrown. Not set when commands are typed. See
Bram Moolenaar071d4272004-06-13 20:20:40 +00002617 also |v:exception| and |throw-variables|.
2618 Example: >
2619 :try
2620 : throw "oops"
2621 :catch /.*/
2622 : echo "Exception from" v:throwpoint
2623 :endtry
2624< Output: "Exception from test.vim, line 2"
2625
Bram Moolenaar520e1e42016-01-23 19:46:28 +01002626 *v:true* *true-variable*
2627v:true A Number with value one. Used to put "true" in JSON. See
Bram Moolenaar6463ca22016-02-13 17:04:46 +01002628 |json_encode()|.
Bram Moolenaarc95a3022016-06-12 23:01:46 +02002629 When used as a string this evaluates to "v:true". >
Bram Moolenaar705ada12016-01-24 17:56:50 +01002630 echo v:true
Bram Moolenaarc95a3022016-06-12 23:01:46 +02002631< v:true ~
2632 That is so that eval() can parse the string back to the same
Bram Moolenaardf48fb42016-07-22 21:50:18 +02002633 value. Read-only.
Bram Moolenaar5da36052021-12-27 15:39:57 +00002634 In |Vim9| script "true" can be used which has a boolean type.
Bram Moolenaar2fda12f2005-01-15 22:14:15 +00002635 *v:val* *val-variable*
Bram Moolenaar58b85342016-08-14 19:54:54 +02002636v:val Value of the current item of a |List| or |Dictionary|. Only
Bram Moolenaar32466aa2006-02-24 23:53:04 +00002637 valid while evaluating the expression used with |map()| and
Bram Moolenaar2fda12f2005-01-15 22:14:15 +00002638 |filter()|. Read-only.
2639
Bram Moolenaar071d4272004-06-13 20:20:40 +00002640 *v:version* *version-variable*
2641v:version Version number of Vim: Major version number times 100 plus
Bram Moolenaar9b283522019-06-17 22:19:33 +02002642 minor version number. Version 5.0 is 500. Version 5.1
Bram Moolenaar071d4272004-06-13 20:20:40 +00002643 is 501. Read-only. "version" also works, for backwards
Bram Moolenaard2e716e2019-04-20 14:39:52 +02002644 compatibility, unless |scriptversion| is 3 or higher.
Bram Moolenaar071d4272004-06-13 20:20:40 +00002645 Use |has()| to check if a certain patch was included, e.g.: >
Bram Moolenaar6716d9a2014-04-02 12:12:08 +02002646 if has("patch-7.4.123")
Bram Moolenaar071d4272004-06-13 20:20:40 +00002647< Note that patch numbers are specific to the version, thus both
2648 version 5.0 and 5.1 may have a patch 123, but these are
2649 completely different.
2650
Bram Moolenaar37df9a42019-06-14 14:39:51 +02002651 *v:versionlong* *versionlong-variable*
Bram Moolenaar9b283522019-06-17 22:19:33 +02002652v:versionlong Like v:version, but also including the patchlevel in the last
2653 four digits. Version 8.1 with patch 123 has value 8010123.
2654 This can be used like this: >
2655 if v:versionlong >= 8010123
Bram Moolenaar37df9a42019-06-14 14:39:51 +02002656< However, if there are gaps in the list of patches included
2657 this will not work well. This can happen if a recent patch
2658 was included into an older version, e.g. for a security fix.
2659 Use the has() function to make sure the patch is actually
2660 included.
2661
Bram Moolenaar14735512016-03-26 21:00:08 +01002662 *v:vim_did_enter* *vim_did_enter-variable*
2663v:vim_did_enter Zero until most of startup is done. It is set to one just
2664 before |VimEnter| autocommands are triggered.
2665
Bram Moolenaar071d4272004-06-13 20:20:40 +00002666 *v:warningmsg* *warningmsg-variable*
2667v:warningmsg Last given warning message. It's allowed to set this variable.
2668
Bram Moolenaar727c8762010-10-20 19:17:48 +02002669 *v:windowid* *windowid-variable*
2670v:windowid When any X11 based GUI is running or when running in a
2671 terminal and Vim connects to the X server (|-X|) this will be
Bram Moolenaar264e9fd2010-10-27 12:33:17 +02002672 set to the window ID.
2673 When an MS-Windows GUI is running this will be set to the
2674 window handle.
2675 Otherwise the value is zero.
Bram Moolenaar7571d552016-08-18 22:54:46 +02002676 Note: for windows inside Vim use |winnr()| or |win_getid()|,
2677 see |window-ID|.
Bram Moolenaar727c8762010-10-20 19:17:48 +02002678
Bram Moolenaar071d4272004-06-13 20:20:40 +00002679==============================================================================
26804. Builtin Functions *functions*
2681
2682See |function-list| for a list grouped by what the function is used for.
2683
Bram Moolenaar1cae5a02021-12-27 21:28:34 +00002684The alphabetic list of all builtin functions and details are in a separate
2685help file: |builtin-functions|.
Bram Moolenaar071d4272004-06-13 20:20:40 +00002686
2687==============================================================================
26885. Defining functions *user-functions*
2689
2690New functions can be defined. These can be called just like builtin
Bram Moolenaar0daafaa2022-09-04 17:45:43 +01002691functions. The function takes arguments, executes a sequence of Ex commands
2692and can return a value.
Bram Moolenaar071d4272004-06-13 20:20:40 +00002693
Bram Moolenaar0daafaa2022-09-04 17:45:43 +01002694You can find most information about defining functions in |userfunc.txt|.
2695For Vim9 functions, which execute much faster, support type checking and more,
2696see |vim9.txt|.
Bram Moolenaar433f7c82006-03-21 21:29:36 +00002697
Bram Moolenaar071d4272004-06-13 20:20:40 +00002698==============================================================================
26996. Curly braces names *curly-braces-names*
2700
Bram Moolenaar84f72352012-03-11 15:57:40 +01002701In most places where you can use a variable, you can use a "curly braces name"
2702variable. This is a regular variable name with one or more expressions
2703wrapped in braces {} like this: >
Bram Moolenaar071d4272004-06-13 20:20:40 +00002704 my_{adjective}_variable
2705
Bram Moolenaar5da36052021-12-27 15:39:57 +00002706This only works in legacy Vim script, not in |Vim9| script.
2707
Bram Moolenaar071d4272004-06-13 20:20:40 +00002708When Vim encounters this, it evaluates the expression inside the braces, puts
2709that in place of the expression, and re-interprets the whole as a variable
2710name. So in the above example, if the variable "adjective" was set to
2711"noisy", then the reference would be to "my_noisy_variable", whereas if
2712"adjective" was set to "quiet", then it would be to "my_quiet_variable".
2713
2714One application for this is to create a set of variables governed by an option
Bram Moolenaar58b85342016-08-14 19:54:54 +02002715value. For example, the statement >
Bram Moolenaar071d4272004-06-13 20:20:40 +00002716 echo my_{&background}_message
2717
2718would output the contents of "my_dark_message" or "my_light_message" depending
2719on the current value of 'background'.
2720
2721You can use multiple brace pairs: >
2722 echo my_{adverb}_{adjective}_message
2723..or even nest them: >
2724 echo my_{ad{end_of_word}}_message
2725where "end_of_word" is either "verb" or "jective".
2726
2727However, the expression inside the braces must evaluate to a valid single
Bram Moolenaar402d2fe2005-04-15 21:00:38 +00002728variable name, e.g. this is invalid: >
Bram Moolenaar071d4272004-06-13 20:20:40 +00002729 :let foo='a + b'
2730 :echo c{foo}d
2731.. since the result of expansion is "ca + bd", which is not a variable name.
2732
2733 *curly-braces-function-names*
2734You can call and define functions by an evaluated name in a similar way.
2735Example: >
2736 :let func_end='whizz'
2737 :call my_func_{func_end}(parameter)
2738
2739This would call the function "my_func_whizz(parameter)".
2740
Bram Moolenaar84f72352012-03-11 15:57:40 +01002741This does NOT work: >
2742 :let i = 3
2743 :let @{i} = '' " error
2744 :echo @{i} " error
2745
Bram Moolenaar071d4272004-06-13 20:20:40 +00002746==============================================================================
27477. Commands *expression-commands*
2748
Bram Moolenaar5da36052021-12-27 15:39:57 +00002749Note: in |Vim9| script `:let` is not used. `:var` is used for variable
2750declarations and assignments do not use a command. |vim9-declaration|
Bram Moolenaar65e0d772020-06-14 17:29:55 +02002751
Bram Moolenaar071d4272004-06-13 20:20:40 +00002752:let {var-name} = {expr1} *:let* *E18*
2753 Set internal variable {var-name} to the result of the
2754 expression {expr1}. The variable will get the type
2755 from the {expr}. If {var-name} didn't exist yet, it
2756 is created.
2757
Bram Moolenaarf10911e2022-01-29 22:20:48 +00002758:let {var-name}[{idx}] = {expr1} *E689* *E1141*
Bram Moolenaar13065c42005-01-08 16:08:21 +00002759 Set a list item to the result of the expression
2760 {expr1}. {var-name} must refer to a list and {idx}
2761 must be a valid index in that list. For nested list
2762 the index can be repeated.
Bram Moolenaar446cb832008-06-24 21:56:24 +00002763 This cannot be used to add an item to a |List|.
Bram Moolenaar58b85342016-08-14 19:54:54 +02002764 This cannot be used to set a byte in a String. You
Bram Moolenaar446cb832008-06-24 21:56:24 +00002765 can do that like this: >
Bram Moolenaarc51cf032022-02-26 12:25:45 +00002766 :let var = var[0:2] .. 'X' .. var[4:]
Bram Moolenaar6e5ea8d2019-01-12 22:47:31 +01002767< When {var-name} is a |Blob| then {idx} can be the
2768 length of the blob, in which case one byte is
2769 appended.
2770
Bram Moolenaara2baa732022-02-04 16:09:54 +00002771 *E711* *E719* *E1165* *E1166* *E1183*
Bram Moolenaar3a3a7232005-01-17 22:16:15 +00002772:let {var-name}[{idx1}:{idx2}] = {expr1} *E708* *E709* *E710*
Bram Moolenaar32466aa2006-02-24 23:53:04 +00002773 Set a sequence of items in a |List| to the result of
2774 the expression {expr1}, which must be a list with the
Bram Moolenaar9588a0f2005-01-08 21:45:39 +00002775 correct number of items.
2776 {idx1} can be omitted, zero is used instead.
2777 {idx2} can be omitted, meaning the end of the list.
2778 When the selected range of items is partly past the
2779 end of the list, items will be added.
2780
Bram Moolenaar6f4754b2022-01-23 12:07:04 +00002781 *:let+=* *:let-=* *:letstar=* *:let/=* *:let%=*
2782 *:let.=* *:let..=* *E734* *E985* *E1019*
Bram Moolenaar3a3a7232005-01-17 22:16:15 +00002783:let {var} += {expr1} Like ":let {var} = {var} + {expr1}".
2784:let {var} -= {expr1} Like ":let {var} = {var} - {expr1}".
Bram Moolenaarff697e62019-02-12 22:28:33 +01002785:let {var} *= {expr1} Like ":let {var} = {var} * {expr1}".
2786:let {var} /= {expr1} Like ":let {var} = {var} / {expr1}".
2787:let {var} %= {expr1} Like ":let {var} = {var} % {expr1}".
Bram Moolenaar3a3a7232005-01-17 22:16:15 +00002788:let {var} .= {expr1} Like ":let {var} = {var} . {expr1}".
Bram Moolenaar558ca4a2019-04-04 18:15:38 +02002789:let {var} ..= {expr1} Like ":let {var} = {var} .. {expr1}".
Bram Moolenaar3a3a7232005-01-17 22:16:15 +00002790 These fail if {var} was not set yet and when the type
2791 of {var} and {expr1} don't fit the operator.
Bram Moolenaar558ca4a2019-04-04 18:15:38 +02002792 `.=` is not supported with Vim script version 2 and
2793 later, see |vimscript-version|.
Bram Moolenaar3a3a7232005-01-17 22:16:15 +00002794
2795
Bram Moolenaar071d4272004-06-13 20:20:40 +00002796:let ${env-name} = {expr1} *:let-environment* *:let-$*
2797 Set environment variable {env-name} to the result of
2798 the expression {expr1}. The type is always String.
Bram Moolenaar56c860c2019-08-17 20:09:31 +02002799
2800 On some systems making an environment variable empty
2801 causes it to be deleted. Many systems do not make a
2802 difference between an environment variable that is not
2803 set and an environment variable that is empty.
2804
Bram Moolenaar3a3a7232005-01-17 22:16:15 +00002805:let ${env-name} .= {expr1}
2806 Append {expr1} to the environment variable {env-name}.
2807 If the environment variable didn't exist yet this
2808 works like "=".
Bram Moolenaar071d4272004-06-13 20:20:40 +00002809
2810:let @{reg-name} = {expr1} *:let-register* *:let-@*
2811 Write the result of the expression {expr1} in register
2812 {reg-name}. {reg-name} must be a single letter, and
2813 must be the name of a writable register (see
2814 |registers|). "@@" can be used for the unnamed
2815 register, "@/" for the search pattern.
2816 If the result of {expr1} ends in a <CR> or <NL>, the
2817 register will be linewise, otherwise it will be set to
2818 characterwise.
2819 This can be used to clear the last search pattern: >
2820 :let @/ = ""
2821< This is different from searching for an empty string,
2822 that would match everywhere.
2823
Bram Moolenaar3a3a7232005-01-17 22:16:15 +00002824:let @{reg-name} .= {expr1}
Bram Moolenaar58b85342016-08-14 19:54:54 +02002825 Append {expr1} to register {reg-name}. If the
Bram Moolenaar3a3a7232005-01-17 22:16:15 +00002826 register was empty it's like setting it to {expr1}.
2827
Bram Moolenaaref2f6562007-05-06 13:32:59 +00002828:let &{option-name} = {expr1} *:let-option* *:let-&*
Bram Moolenaar071d4272004-06-13 20:20:40 +00002829 Set option {option-name} to the result of the
Bram Moolenaarfca34d62005-01-04 21:38:36 +00002830 expression {expr1}. A String or Number value is
2831 always converted to the type of the option.
Bram Moolenaar071d4272004-06-13 20:20:40 +00002832 For an option local to a window or buffer the effect
2833 is just like using the |:set| command: both the local
Bram Moolenaara5fac542005-10-12 20:58:49 +00002834 value and the global value are changed.
Bram Moolenaarfca34d62005-01-04 21:38:36 +00002835 Example: >
Bram Moolenaarc51cf032022-02-26 12:25:45 +00002836 :let &path = &path .. ',/usr/local/include'
Bram Moolenaar3df01732017-02-17 22:47:16 +01002837< This also works for terminal codes in the form t_xx.
2838 But only for alphanumerical names. Example: >
2839 :let &t_k1 = "\<Esc>[234;"
2840< When the code does not exist yet it will be created as
2841 a terminal key code, there is no error.
Bram Moolenaar071d4272004-06-13 20:20:40 +00002842
Bram Moolenaar3a3a7232005-01-17 22:16:15 +00002843:let &{option-name} .= {expr1}
2844 For a string option: Append {expr1} to the value.
2845 Does not insert a comma like |:set+=|.
2846
2847:let &{option-name} += {expr1}
2848:let &{option-name} -= {expr1}
2849 For a number or boolean option: Add or subtract
2850 {expr1}.
2851
Bram Moolenaar071d4272004-06-13 20:20:40 +00002852:let &l:{option-name} = {expr1}
Bram Moolenaar3a3a7232005-01-17 22:16:15 +00002853:let &l:{option-name} .= {expr1}
2854:let &l:{option-name} += {expr1}
2855:let &l:{option-name} -= {expr1}
Bram Moolenaar071d4272004-06-13 20:20:40 +00002856 Like above, but only set the local value of an option
2857 (if there is one). Works like |:setlocal|.
2858
2859:let &g:{option-name} = {expr1}
Bram Moolenaar3a3a7232005-01-17 22:16:15 +00002860:let &g:{option-name} .= {expr1}
2861:let &g:{option-name} += {expr1}
2862:let &g:{option-name} -= {expr1}
Bram Moolenaar071d4272004-06-13 20:20:40 +00002863 Like above, but only set the global value of an option
2864 (if there is one). Works like |:setglobal|.
Bram Moolenaarf10911e2022-01-29 22:20:48 +00002865 *E1093*
Bram Moolenaar13065c42005-01-08 16:08:21 +00002866:let [{name1}, {name2}, ...] = {expr1} *:let-unpack* *E687* *E688*
Bram Moolenaar32466aa2006-02-24 23:53:04 +00002867 {expr1} must evaluate to a |List|. The first item in
Bram Moolenaarfca34d62005-01-04 21:38:36 +00002868 the list is assigned to {name1}, the second item to
2869 {name2}, etc.
2870 The number of names must match the number of items in
Bram Moolenaar32466aa2006-02-24 23:53:04 +00002871 the |List|.
Bram Moolenaarfca34d62005-01-04 21:38:36 +00002872 Each name can be one of the items of the ":let"
2873 command as mentioned above.
2874 Example: >
2875 :let [s, item] = GetItem(s)
Bram Moolenaar3a3a7232005-01-17 22:16:15 +00002876< Detail: {expr1} is evaluated first, then the
2877 assignments are done in sequence. This matters if
2878 {name2} depends on {name1}. Example: >
2879 :let x = [0, 1]
2880 :let i = 0
2881 :let [i, x[i]] = [1, 2]
2882 :echo x
2883< The result is [0, 2].
2884
2885:let [{name1}, {name2}, ...] .= {expr1}
2886:let [{name1}, {name2}, ...] += {expr1}
2887:let [{name1}, {name2}, ...] -= {expr1}
2888 Like above, but append/add/subtract the value for each
Bram Moolenaar32466aa2006-02-24 23:53:04 +00002889 |List| item.
Bram Moolenaarfca34d62005-01-04 21:38:36 +00002890
Bram Moolenaard1caa942020-04-10 22:10:56 +02002891:let [{name}, ..., ; {lastname}] = {expr1} *E452*
Bram Moolenaar32466aa2006-02-24 23:53:04 +00002892 Like |:let-unpack| above, but the |List| may have more
Bram Moolenaar3a3a7232005-01-17 22:16:15 +00002893 items than there are names. A list of the remaining
2894 items is assigned to {lastname}. If there are no
2895 remaining items {lastname} is set to an empty list.
Bram Moolenaarfca34d62005-01-04 21:38:36 +00002896 Example: >
2897 :let [a, b; rest] = ["aval", "bval", 3, 4]
2898<
Bram Moolenaar3a3a7232005-01-17 22:16:15 +00002899:let [{name}, ..., ; {lastname}] .= {expr1}
2900:let [{name}, ..., ; {lastname}] += {expr1}
2901:let [{name}, ..., ; {lastname}] -= {expr1}
2902 Like above, but append/add/subtract the value for each
Bram Moolenaar32466aa2006-02-24 23:53:04 +00002903 |List| item.
Bram Moolenaar4a748032010-09-30 21:47:56 +02002904
Bram Moolenaar24582002019-07-21 14:14:26 +02002905 *:let=<<* *:let-heredoc*
Bram Moolenaarf10911e2022-01-29 22:20:48 +00002906 *E990* *E991* *E172* *E221* *E1145*
Yegappan Lakshmananefbfa862022-04-17 12:47:40 +01002907:let {var-name} =<< [trim] [eval] {endmarker}
Bram Moolenaarf5842c52019-05-19 18:41:26 +02002908text...
2909text...
Bram Moolenaar2e693a82019-10-16 22:35:02 +02002910{endmarker}
Bram Moolenaare46a4402020-06-30 20:38:27 +02002911 Set internal variable {var-name} to a |List|
2912 containing the lines of text bounded by the string
Yegappan Lakshmananefbfa862022-04-17 12:47:40 +01002913 {endmarker}.
2914
2915 If "eval" is not specified, then each line of text is
Bram Moolenaard899e512022-05-07 21:54:03 +01002916 used as a |literal-string|, except that single quotes
Bram Moolenaar8a3b8052022-06-26 12:21:15 +01002917 does not need to be doubled.
Bram Moolenaard899e512022-05-07 21:54:03 +01002918 If "eval" is specified, then any Vim expression in the
2919 form {expr} is evaluated and the result replaces the
Bram Moolenaarb59ae592022-11-23 23:46:31 +00002920 expression, like with |interpolated-string|.
Yegappan Lakshmananefbfa862022-04-17 12:47:40 +01002921 Example where $HOME is expanded: >
2922 let lines =<< trim eval END
2923 some text
Bram Moolenaard899e512022-05-07 21:54:03 +01002924 See the file {$HOME}/.vimrc
Yegappan Lakshmananefbfa862022-04-17 12:47:40 +01002925 more text
2926 END
2927< There can be multiple Vim expressions in a single line
2928 but an expression cannot span multiple lines. If any
2929 expression evaluation fails, then the assignment fails.
Yegappan Lakshmananefbfa862022-04-17 12:47:40 +01002930
Bram Moolenaar2e693a82019-10-16 22:35:02 +02002931 {endmarker} must not contain white space.
2932 {endmarker} cannot start with a lower case character.
2933 The last line should end only with the {endmarker}
2934 string without any other character. Watch out for
2935 white space after {endmarker}!
Bram Moolenaarf5842c52019-05-19 18:41:26 +02002936
Bram Moolenaare7eb9272019-06-24 00:58:07 +02002937 Without "trim" any white space characters in the lines
2938 of text are preserved. If "trim" is specified before
Bram Moolenaar2e693a82019-10-16 22:35:02 +02002939 {endmarker}, then indentation is stripped so you can
2940 do: >
Bram Moolenaare7eb9272019-06-24 00:58:07 +02002941 let text =<< trim END
2942 if ok
2943 echo 'done'
2944 endif
2945 END
2946< Results in: ["if ok", " echo 'done'", "endif"]
2947 The marker must line up with "let" and the indentation
2948 of the first line is removed from all the text lines.
2949 Specifically: all the leading indentation exactly
2950 matching the leading indentation of the first
2951 non-empty text line is stripped from the input lines.
2952 All leading indentation exactly matching the leading
2953 indentation before `let` is stripped from the line
Bram Moolenaar2e693a82019-10-16 22:35:02 +02002954 containing {endmarker}. Note that the difference
2955 between space and tab matters here.
Bram Moolenaarf5842c52019-05-19 18:41:26 +02002956
2957 If {var-name} didn't exist yet, it is created.
2958 Cannot be followed by another command, but can be
2959 followed by a comment.
2960
Bram Moolenaar2e693a82019-10-16 22:35:02 +02002961 To avoid line continuation to be applied, consider
2962 adding 'C' to 'cpoptions': >
2963 set cpo+=C
2964 let var =<< END
2965 \ leading backslash
2966 END
2967 set cpo-=C
2968<
Bram Moolenaarf5842c52019-05-19 18:41:26 +02002969 Examples: >
2970 let var1 =<< END
Bram Moolenaar2e693a82019-10-16 22:35:02 +02002971 Sample text 1
2972 Sample text 2
2973 Sample text 3
2974 END
Bram Moolenaarf5842c52019-05-19 18:41:26 +02002975
2976 let data =<< trim DATA
Bram Moolenaar2e693a82019-10-16 22:35:02 +02002977 1 2 3 4
2978 5 6 7 8
Bram Moolenaarf5842c52019-05-19 18:41:26 +02002979 DATA
Yegappan Lakshmananefbfa862022-04-17 12:47:40 +01002980
2981 let code =<< trim eval CODE
Bram Moolenaard899e512022-05-07 21:54:03 +01002982 let v = {10 + 20}
2983 let h = "{$HOME}"
2984 let s = "{Str1()} abc {Str2()}"
2985 let n = {MyFunc(3, 4)}
Yegappan Lakshmananefbfa862022-04-17 12:47:40 +01002986 CODE
Bram Moolenaarf5842c52019-05-19 18:41:26 +02002987<
Bram Moolenaar4a748032010-09-30 21:47:56 +02002988 *E121*
Bram Moolenaar58b85342016-08-14 19:54:54 +02002989:let {var-name} .. List the value of variable {var-name}. Multiple
Bram Moolenaardcaf10e2005-01-21 11:55:25 +00002990 variable names may be given. Special names recognized
2991 here: *E738*
Bram Moolenaarca003e12006-03-17 23:19:38 +00002992 g: global variables
2993 b: local buffer variables
2994 w: local window variables
Bram Moolenaar910f66f2006-04-05 20:41:53 +00002995 t: local tab page variables
Bram Moolenaarca003e12006-03-17 23:19:38 +00002996 s: script-local variables
2997 l: local function variables
Bram Moolenaardcaf10e2005-01-21 11:55:25 +00002998 v: Vim variables.
Bram Moolenaar65e0d772020-06-14 17:29:55 +02002999 This does not work in Vim9 script. |vim9-declaration|
Bram Moolenaar071d4272004-06-13 20:20:40 +00003000
Bram Moolenaard7ee7ce2005-01-03 21:02:03 +00003001:let List the values of all variables. The type of the
3002 variable is indicated before the value:
3003 <nothing> String
3004 # Number
Bram Moolenaarc9b4b052006-04-30 18:54:39 +00003005 * Funcref
Bram Moolenaar65e0d772020-06-14 17:29:55 +02003006 This does not work in Vim9 script. |vim9-declaration|
Bram Moolenaar071d4272004-06-13 20:20:40 +00003007
Bram Moolenaar6f4754b2022-01-23 12:07:04 +00003008:unl[et][!] {name} ... *:unlet* *:unl* *E108* *E795* *E1081*
Bram Moolenaar2ce06f62005-01-31 19:19:04 +00003009 Remove the internal variable {name}. Several variable
3010 names can be given, they are all removed. The name
Bram Moolenaar32466aa2006-02-24 23:53:04 +00003011 may also be a |List| or |Dictionary| item.
Bram Moolenaar071d4272004-06-13 20:20:40 +00003012 With [!] no error message is given for non-existing
3013 variables.
Bram Moolenaar32466aa2006-02-24 23:53:04 +00003014 One or more items from a |List| can be removed: >
Bram Moolenaar9cd15162005-01-16 22:02:49 +00003015 :unlet list[3] " remove fourth item
3016 :unlet list[3:] " remove fourth item to last
Bram Moolenaar32466aa2006-02-24 23:53:04 +00003017< One item from a |Dictionary| can be removed at a time: >
Bram Moolenaar9cd15162005-01-16 22:02:49 +00003018 :unlet dict['two']
3019 :unlet dict.two
Bram Moolenaarc236c162008-07-13 17:41:49 +00003020< This is especially useful to clean up used global
3021 variables and script-local variables (these are not
3022 deleted when the script ends). Function-local
3023 variables are automatically deleted when the function
3024 ends.
Bram Moolenaar1b5f03e2023-01-09 20:12:45 +00003025 In |Vim9| script variables declared in a function or
3026 script cannot be removed.
Bram Moolenaar071d4272004-06-13 20:20:40 +00003027
Bram Moolenaar137374f2018-05-13 15:59:50 +02003028:unl[et] ${env-name} ... *:unlet-environment* *:unlet-$*
3029 Remove environment variable {env-name}.
3030 Can mix {name} and ${env-name} in one :unlet command.
3031 No error message is given for a non-existing
3032 variable, also without !.
3033 If the system does not support deleting an environment
Bram Moolenaar9937a052019-06-15 15:45:06 +02003034 variable, it is made empty.
Bram Moolenaar137374f2018-05-13 15:59:50 +02003035
Bram Moolenaar6f4754b2022-01-23 12:07:04 +00003036 *:cons* *:const* *E1018*
Bram Moolenaar9937a052019-06-15 15:45:06 +02003037:cons[t] {var-name} = {expr1}
3038:cons[t] [{name1}, {name2}, ...] = {expr1}
Bram Moolenaar9937a052019-06-15 15:45:06 +02003039:cons[t] [{name}, ..., ; {lastname}] = {expr1}
3040:cons[t] {var-name} =<< [trim] {marker}
3041text...
3042text...
3043{marker}
3044 Similar to |:let|, but additionally lock the variable
3045 after setting the value. This is the same as locking
3046 the variable with |:lockvar| just after |:let|, thus: >
3047 :const x = 1
3048< is equivalent to: >
3049 :let x = 1
Bram Moolenaar021bda52020-08-17 21:07:22 +02003050 :lockvar! x
Bram Moolenaara187c432020-09-16 21:08:28 +02003051< NOTE: in Vim9 script `:const` works differently, see
3052 |vim9-const|
3053 This is useful if you want to make sure the variable
Bram Moolenaar021bda52020-08-17 21:07:22 +02003054 is not modified. If the value is a List or Dictionary
3055 literal then the items also cannot be changed: >
3056 const ll = [1, 2, 3]
3057 let ll[1] = 5 " Error!
Bram Moolenaar6e649222021-10-04 21:32:54 +01003058< Nested references are not locked: >
Bram Moolenaar021bda52020-08-17 21:07:22 +02003059 let lvar = ['a']
3060 const lconst = [0, lvar]
3061 let lconst[0] = 2 " Error!
3062 let lconst[1][0] = 'b' " OK
3063< *E995*
Bram Moolenaar9b283522019-06-17 22:19:33 +02003064 |:const| does not allow to for changing a variable: >
Bram Moolenaar9937a052019-06-15 15:45:06 +02003065 :let x = 1
3066 :const x = 2 " Error!
Bram Moolenaar1c196e72019-06-16 15:41:58 +02003067< *E996*
3068 Note that environment variables, option values and
3069 register values cannot be used here, since they cannot
3070 be locked.
3071
Bram Moolenaar85850f32019-07-19 22:05:51 +02003072:cons[t]
3073:cons[t] {var-name}
3074 If no argument is given or only {var-name} is given,
3075 the behavior is the same as |:let|.
3076
Bram Moolenaar2ce06f62005-01-31 19:19:04 +00003077:lockv[ar][!] [depth] {name} ... *:lockvar* *:lockv*
3078 Lock the internal variable {name}. Locking means that
3079 it can no longer be changed (until it is unlocked).
3080 A locked variable can be deleted: >
3081 :lockvar v
Bram Moolenaardad44732021-03-31 20:07:33 +02003082 :let v = 'asdf' " fails!
3083 :unlet v " works
Bram Moolenaarf10911e2022-01-29 22:20:48 +00003084< *E741* *E940* *E1118* *E1119* *E1120* *E1121* *E1122*
Bram Moolenaar2ce06f62005-01-31 19:19:04 +00003085 If you try to change a locked variable you get an
Bram Moolenaare7877fe2017-02-20 22:35:33 +01003086 error message: "E741: Value is locked: {name}".
3087 If you try to lock or unlock a built-in variable you
3088 get an error message: "E940: Cannot lock or unlock
3089 variable {name}".
Bram Moolenaar2ce06f62005-01-31 19:19:04 +00003090
Bram Moolenaar32466aa2006-02-24 23:53:04 +00003091 [depth] is relevant when locking a |List| or
3092 |Dictionary|. It specifies how deep the locking goes:
Bram Moolenaara187c432020-09-16 21:08:28 +02003093 0 Lock the variable {name} but not its
3094 value.
Bram Moolenaar32466aa2006-02-24 23:53:04 +00003095 1 Lock the |List| or |Dictionary| itself,
Bram Moolenaar2ce06f62005-01-31 19:19:04 +00003096 cannot add or remove items, but can
3097 still change their values.
3098 2 Also lock the values, cannot change
Bram Moolenaar32466aa2006-02-24 23:53:04 +00003099 the items. If an item is a |List| or
3100 |Dictionary|, cannot add or remove
Bram Moolenaar2ce06f62005-01-31 19:19:04 +00003101 items, but can still change the
3102 values.
Bram Moolenaar32466aa2006-02-24 23:53:04 +00003103 3 Like 2 but for the |List| /
3104 |Dictionary| in the |List| /
3105 |Dictionary|, one level deeper.
3106 The default [depth] is 2, thus when {name} is a |List|
3107 or |Dictionary| the values cannot be changed.
Bram Moolenaara187c432020-09-16 21:08:28 +02003108
3109 Example with [depth] 0: >
3110 let mylist = [1, 2, 3]
3111 lockvar 0 mylist
Bram Moolenaar6e649222021-10-04 21:32:54 +01003112 let mylist[0] = 77 " OK
Bram Moolenaar10e8ff92023-06-10 21:40:39 +01003113 call add(mylist, 4) " OK
Bram Moolenaara187c432020-09-16 21:08:28 +02003114 let mylist = [7, 8, 9] " Error!
3115< *E743*
Bram Moolenaar2ce06f62005-01-31 19:19:04 +00003116 For unlimited depth use [!] and omit [depth].
3117 However, there is a maximum depth of 100 to catch
3118 loops.
3119
Bram Moolenaar32466aa2006-02-24 23:53:04 +00003120 Note that when two variables refer to the same |List|
3121 and you lock one of them, the |List| will also be
Bram Moolenaar910f66f2006-04-05 20:41:53 +00003122 locked when used through the other variable.
3123 Example: >
Bram Moolenaar2ce06f62005-01-31 19:19:04 +00003124 :let l = [0, 1, 2, 3]
3125 :let cl = l
3126 :lockvar l
3127 :let cl[1] = 99 " won't work!
3128< You may want to make a copy of a list to avoid this.
3129 See |deepcopy()|.
3130
Yegappan Lakshmanancd39b692023-10-02 12:50:45 -07003131 *E1391* *E1392*
3132 Locking and unlocking object and class variables is
3133 currently NOT supported.
3134
Bram Moolenaar2ce06f62005-01-31 19:19:04 +00003135
Bram Moolenaara2baa732022-02-04 16:09:54 +00003136:unlo[ckvar][!] [depth] {name} ... *:unlockvar* *:unlo* *E1246*
Bram Moolenaar2ce06f62005-01-31 19:19:04 +00003137 Unlock the internal variable {name}. Does the
3138 opposite of |:lockvar|.
3139
Bram Moolenaard13166e2022-11-18 21:49:57 +00003140 If {name} does not exist:
3141 - In |Vim9| script an error is given.
3142 - In legacy script this is silently ignored.
3143
Bram Moolenaar61da1bf2019-06-06 12:14:49 +02003144:if {expr1} *:if* *:end* *:endif* *:en* *E171* *E579* *E580*
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003145:en[dif] Execute the commands until the next matching `:else`
3146 or `:endif` if {expr1} evaluates to non-zero.
Bram Moolenaarc51cf032022-02-26 12:25:45 +00003147 Although the short forms work, it is recommended to
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003148 always use `:endif` to avoid confusion and to make
3149 auto-indenting work properly.
Bram Moolenaar071d4272004-06-13 20:20:40 +00003150
3151 From Vim version 4.5 until 5.0, every Ex command in
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003152 between the `:if` and `:endif` is ignored. These two
Bram Moolenaar071d4272004-06-13 20:20:40 +00003153 commands were just to allow for future expansions in a
Bram Moolenaar85084ef2016-01-17 22:26:33 +01003154 backward compatible way. Nesting was allowed. Note
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003155 that any `:else` or `:elseif` was ignored, the `else`
Bram Moolenaar071d4272004-06-13 20:20:40 +00003156 part was not executed either.
3157
3158 You can use this to remain compatible with older
3159 versions: >
3160 :if version >= 500
3161 : version-5-specific-commands
3162 :endif
3163< The commands still need to be parsed to find the
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003164 `endif`. Sometimes an older Vim has a problem with a
3165 new command. For example, `:silent` is recognized as
3166 a `:substitute` command. In that case `:execute` can
Bram Moolenaar071d4272004-06-13 20:20:40 +00003167 avoid problems: >
3168 :if version >= 600
3169 : execute "silent 1,$delete"
3170 :endif
3171<
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003172 In |Vim9| script `:endif` cannot be shortened, to
3173 improve script readability.
3174 NOTE: The `:append` and `:insert` commands don't work
3175 properly in between `:if` and `:endif`.
Bram Moolenaar071d4272004-06-13 20:20:40 +00003176
3177 *:else* *:el* *E581* *E583*
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003178:el[se] Execute the commands until the next matching `:else`
3179 or `:endif` if they previously were not being
Bram Moolenaar071d4272004-06-13 20:20:40 +00003180 executed.
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003181 In |Vim9| script `:else` cannot be shortened, to
3182 improve script readability.
Bram Moolenaar071d4272004-06-13 20:20:40 +00003183
3184 *:elseif* *:elsei* *E582* *E584*
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003185:elsei[f] {expr1} Short for `:else` `:if`, with the addition that there
3186 is no extra `:endif`.
3187 In |Vim9| script `:elseif` cannot be shortened, to
3188 improve script readability.
Bram Moolenaar071d4272004-06-13 20:20:40 +00003189
3190:wh[ile] {expr1} *:while* *:endwhile* *:wh* *:endw*
Bram Moolenaar3a3a7232005-01-17 22:16:15 +00003191 *E170* *E585* *E588* *E733*
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003192:endw[hile] Repeat the commands between `:while` and `:endwhile`,
Bram Moolenaar071d4272004-06-13 20:20:40 +00003193 as long as {expr1} evaluates to non-zero.
3194 When an error is detected from a command inside the
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003195 loop, execution continues after the `endwhile`.
Bram Moolenaar12805862005-01-05 22:16:17 +00003196 Example: >
3197 :let lnum = 1
3198 :while lnum <= line("$")
3199 :call FixLine(lnum)
3200 :let lnum = lnum + 1
3201 :endwhile
3202<
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003203 In |Vim9| script `:while` and `:endwhile` cannot be
3204 shortened, to improve script readability.
3205 NOTE: The `:append` and `:insert` commands don't work
3206 properly inside a `:while` and `:for` loop.
Bram Moolenaar071d4272004-06-13 20:20:40 +00003207
Bram Moolenaar5e66b422019-01-24 21:58:10 +01003208:for {var} in {object} *:for* *E690* *E732*
Bram Moolenaar12805862005-01-05 22:16:17 +00003209:endfo[r] *:endfo* *:endfor*
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003210 Repeat the commands between `:for` and `:endfor` for
Bram Moolenaar3f32a5f2022-05-12 20:34:15 +01003211 each item in {object}. {object} can be a |List|,
3212 a |Blob| or a |String|. *E1177*
Bram Moolenaar5da36052021-12-27 15:39:57 +00003213
3214 Variable {var} is set to the value of each item.
3215 In |Vim9| script the loop variable must not have been
3216 declared yet, unless when it is a
3217 global/window/tab/buffer variable.
3218
3219 When an error is detected for a command inside the
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003220 loop, execution continues after the `endfor`.
Bram Moolenaar5e66b422019-01-24 21:58:10 +01003221 Changing {object} inside the loop affects what items
3222 are used. Make a copy if this is unwanted: >
Bram Moolenaarde8866b2005-01-06 23:24:37 +00003223 :for item in copy(mylist)
Bram Moolenaar5e66b422019-01-24 21:58:10 +01003224<
Bram Moolenaar5da36052021-12-27 15:39:57 +00003225 When {object} is a |List| and not making a copy, in
3226 legacy script Vim stores a reference to the next item
3227 in the |List| before executing the commands with the
3228 current item. Thus the current item can be removed
3229 without effect. Removing any later item means it will
3230 not be found. Thus the following example works (an
3231 inefficient way to make a |List| empty): >
Bram Moolenaar8f3f58f2010-01-06 20:52:26 +01003232 for item in mylist
3233 call remove(mylist, 0)
3234 endfor
Bram Moolenaar5e66b422019-01-24 21:58:10 +01003235< Note that reordering the |List| (e.g., with sort() or
Bram Moolenaar9588a0f2005-01-08 21:45:39 +00003236 reverse()) may have unexpected effects.
Bram Moolenaar5da36052021-12-27 15:39:57 +00003237 In |Vim9| script the index is used. If an item before
3238 the current one is deleted the next item will be
3239 skipped.
Bram Moolenaar12805862005-01-05 22:16:17 +00003240
Bram Moolenaar5e66b422019-01-24 21:58:10 +01003241 When {object} is a |Blob|, Vim always makes a copy to
3242 iterate over. Unlike with |List|, modifying the
3243 |Blob| does not affect the iteration.
3244
Bram Moolenaar9b03d3e2022-08-30 20:26:34 +01003245 When {object} is a |String| each item is a string with
3246 one character, plus any combining characters.
3247
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003248 In |Vim9| script `:endfor` cannot be shortened, to
3249 improve script readability.
3250
Bram Moolenaar12805862005-01-05 22:16:17 +00003251:for [{var1}, {var2}, ...] in {listlist}
Bram Moolenaarf10911e2022-01-29 22:20:48 +00003252:endfo[r] *E1140*
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003253 Like `:for` above, but each item in {listlist} must be
Bram Moolenaar12805862005-01-05 22:16:17 +00003254 a list, of which each item is assigned to {var1},
3255 {var2}, etc. Example: >
3256 :for [lnum, col] in [[1, 3], [2, 5], [3, 8]]
3257 :echo getline(lnum)[col]
3258 :endfor
3259<
Bram Moolenaar071d4272004-06-13 20:20:40 +00003260 *:continue* *:con* *E586*
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003261:con[tinue] When used inside a `:while` or `:for` loop, jumps back
Bram Moolenaar12805862005-01-05 22:16:17 +00003262 to the start of the loop.
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003263 If it is used after a `:try` inside the loop but
3264 before the matching `:finally` (if present), the
3265 commands following the `:finally` up to the matching
3266 `:endtry` are executed first. This process applies to
3267 all nested `:try`s inside the loop. The outermost
3268 `:endtry` then jumps back to the start of the loop.
Bram Moolenaar071d4272004-06-13 20:20:40 +00003269
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003270 In |Vim9| script `:cont` is the shortest form, to
3271 improve script readability.
Bram Moolenaar071d4272004-06-13 20:20:40 +00003272 *:break* *:brea* *E587*
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003273:brea[k] When used inside a `:while` or `:for` loop, skips to
3274 the command after the matching `:endwhile` or
3275 `:endfor`.
3276 If it is used after a `:try` inside the loop but
3277 before the matching `:finally` (if present), the
3278 commands following the `:finally` up to the matching
3279 `:endtry` are executed first. This process applies to
3280 all nested `:try`s inside the loop. The outermost
3281 `:endtry` then jumps to the command after the loop.
3282
3283 In |Vim9| script `:break` cannot be shortened, to
3284 improve script readability.
Bram Moolenaar071d4272004-06-13 20:20:40 +00003285
Bram Moolenaar6f4754b2022-01-23 12:07:04 +00003286:try *:try* *:endt* *:endtry*
3287 *E600* *E601* *E602* *E1032*
Bram Moolenaar071d4272004-06-13 20:20:40 +00003288:endt[ry] Change the error handling for the commands between
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003289 `:try` and `:endtry` including everything being
3290 executed across `:source` commands, function calls,
Bram Moolenaar071d4272004-06-13 20:20:40 +00003291 or autocommand invocations.
3292
3293 When an error or interrupt is detected and there is
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003294 a `:finally` command following, execution continues
3295 after the `:finally`. Otherwise, or when the
3296 `:endtry` is reached thereafter, the next
3297 (dynamically) surrounding `:try` is checked for
3298 a corresponding `:finally` etc. Then the script
Bram Moolenaarbc93ceb2020-02-26 13:36:21 +01003299 processing is terminated. Whether a function
3300 definition has an "abort" argument does not matter.
Bram Moolenaar071d4272004-06-13 20:20:40 +00003301 Example: >
Bram Moolenaarbc93ceb2020-02-26 13:36:21 +01003302 try | call Unknown() | finally | echomsg "cleanup" | endtry
3303 echomsg "not reached"
Bram Moolenaar071d4272004-06-13 20:20:40 +00003304<
3305 Moreover, an error or interrupt (dynamically) inside
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003306 `:try` and `:endtry` is converted to an exception. It
3307 can be caught as if it were thrown by a `:throw`
3308 command (see `:catch`). In this case, the script
Bram Moolenaar071d4272004-06-13 20:20:40 +00003309 processing is not terminated.
3310
3311 The value "Vim:Interrupt" is used for an interrupt
3312 exception. An error in a Vim command is converted
3313 to a value of the form "Vim({command}):{errmsg}",
3314 other errors are converted to a value of the form
3315 "Vim:{errmsg}". {command} is the full command name,
3316 and {errmsg} is the message that is displayed if the
3317 error exception is not caught, always beginning with
3318 the error number.
3319 Examples: >
Bram Moolenaarbc93ceb2020-02-26 13:36:21 +01003320 try | sleep 100 | catch /^Vim:Interrupt$/ | endtry
3321 try | edit | catch /^Vim(edit):E\d\+/ | echo "error" | endtry
Bram Moolenaar071d4272004-06-13 20:20:40 +00003322<
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003323 In |Vim9| script `:endtry` cannot be shortened, to
3324 improve script readability.
3325
Bram Moolenaar6f4754b2022-01-23 12:07:04 +00003326 *:cat* *:catch*
3327 *E603* *E604* *E605* *E654* *E1033*
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003328:cat[ch] /{pattern}/ The following commands until the next `:catch`,
3329 `:finally`, or `:endtry` that belongs to the same
3330 `:try` as the `:catch` are executed when an exception
Bram Moolenaar071d4272004-06-13 20:20:40 +00003331 matching {pattern} is being thrown and has not yet
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003332 been caught by a previous `:catch`. Otherwise, these
Bram Moolenaar071d4272004-06-13 20:20:40 +00003333 commands are skipped.
3334 When {pattern} is omitted all errors are caught.
3335 Examples: >
Bram Moolenaar647e24b2019-03-17 16:39:46 +01003336 :catch /^Vim:Interrupt$/ " catch interrupts (CTRL-C)
3337 :catch /^Vim\%((\a\+)\)\=:E/ " catch all Vim errors
3338 :catch /^Vim\%((\a\+)\)\=:/ " catch errors and interrupts
3339 :catch /^Vim(write):/ " catch all errors in :write
3340 :catch /^Vim\%((\a\+)\)\=:E123:/ " catch error E123
3341 :catch /my-exception/ " catch user exception
3342 :catch /.*/ " catch everything
3343 :catch " same as /.*/
Bram Moolenaar071d4272004-06-13 20:20:40 +00003344<
3345 Another character can be used instead of / around the
3346 {pattern}, so long as it does not have a special
3347 meaning (e.g., '|' or '"') and doesn't occur inside
Bram Moolenaar6f4754b2022-01-23 12:07:04 +00003348 {pattern}. *E1067*
Bram Moolenaar7e38ea22014-04-05 22:55:53 +02003349 Information about the exception is available in
3350 |v:exception|. Also see |throw-variables|.
Bram Moolenaar071d4272004-06-13 20:20:40 +00003351 NOTE: It is not reliable to ":catch" the TEXT of
3352 an error message because it may vary in different
3353 locales.
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003354 In |Vim9| script `:catch` cannot be shortened, to
3355 improve script readability.
Bram Moolenaar071d4272004-06-13 20:20:40 +00003356
3357 *:fina* *:finally* *E606* *E607*
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003358:fina[lly] The following commands until the matching `:endtry`
Bram Moolenaar071d4272004-06-13 20:20:40 +00003359 are executed whenever the part between the matching
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003360 `:try` and the `:finally` is left: either by falling
3361 through to the `:finally` or by a `:continue`,
3362 `:break`, `:finish`, or `:return`, or by an error or
3363 interrupt or exception (see `:throw`).
3364
3365 In |Vim9| script `:finally` cannot be shortened, to
3366 improve script readability and avoid confusion with
3367 `:final`.
Bram Moolenaar071d4272004-06-13 20:20:40 +00003368
Bram Moolenaarf10911e2022-01-29 22:20:48 +00003369 *:th* *:throw* *E608* *E1129*
Bram Moolenaar071d4272004-06-13 20:20:40 +00003370:th[row] {expr1} The {expr1} is evaluated and thrown as an exception.
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003371 If the ":throw" is used after a `:try` but before the
3372 first corresponding `:catch`, commands are skipped
3373 until the first `:catch` matching {expr1} is reached.
3374 If there is no such `:catch` or if the ":throw" is
3375 used after a `:catch` but before the `:finally`, the
3376 commands following the `:finally` (if present) up to
3377 the matching `:endtry` are executed. If the `:throw`
3378 is after the `:finally`, commands up to the `:endtry`
Bram Moolenaar071d4272004-06-13 20:20:40 +00003379 are skipped. At the ":endtry", this process applies
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003380 again for the next dynamically surrounding `:try`
Bram Moolenaar071d4272004-06-13 20:20:40 +00003381 (which may be found in a calling function or sourcing
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003382 script), until a matching `:catch` has been found.
Bram Moolenaar071d4272004-06-13 20:20:40 +00003383 If the exception is not caught, the command processing
3384 is terminated.
3385 Example: >
3386 :try | throw "oops" | catch /^oo/ | echo "caught" | endtry
Bram Moolenaar662db672011-03-22 14:05:35 +01003387< Note that "catch" may need to be on a separate line
3388 for when an error causes the parsing to skip the whole
3389 line and not see the "|" that separates the commands.
Bram Moolenaar071d4272004-06-13 20:20:40 +00003390
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003391 In |Vim9| script `:throw` cannot be shortened, to
3392 improve script readability.
3393
Bram Moolenaar071d4272004-06-13 20:20:40 +00003394 *:ec* *:echo*
3395:ec[ho] {expr1} .. Echoes each {expr1}, with a space in between. The
3396 first {expr1} starts on a new line.
3397 Also see |:comment|.
3398 Use "\n" to start a new line. Use "\r" to move the
3399 cursor to the first column.
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003400 Uses the highlighting set by the `:echohl` command.
Bram Moolenaar071d4272004-06-13 20:20:40 +00003401 Cannot be followed by a comment.
3402 Example: >
3403 :echo "the value of 'shell' is" &shell
Bram Moolenaaref2f6562007-05-06 13:32:59 +00003404< *:echo-redraw*
3405 A later redraw may make the message disappear again.
3406 And since Vim mostly postpones redrawing until it's
3407 finished with a sequence of commands this happens
3408 quite often. To avoid that a command from before the
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003409 `:echo` causes a redraw afterwards (redraws are often
Bram Moolenaaref2f6562007-05-06 13:32:59 +00003410 postponed until you type something), force a redraw
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003411 with the `:redraw` command. Example: >
Bram Moolenaar071d4272004-06-13 20:20:40 +00003412 :new | redraw | echo "there is a new window"
3413<
3414 *:echon*
3415:echon {expr1} .. Echoes each {expr1}, without anything added. Also see
3416 |:comment|.
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003417 Uses the highlighting set by the `:echohl` command.
Bram Moolenaar071d4272004-06-13 20:20:40 +00003418 Cannot be followed by a comment.
3419 Example: >
3420 :echon "the value of 'shell' is " &shell
3421<
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003422 Note the difference between using `:echo`, which is a
3423 Vim command, and `:!echo`, which is an external shell
Bram Moolenaar071d4272004-06-13 20:20:40 +00003424 command: >
3425 :!echo % --> filename
3426< The arguments of ":!" are expanded, see |:_%|. >
3427 :!echo "%" --> filename or "filename"
3428< Like the previous example. Whether you see the double
3429 quotes or not depends on your 'shell'. >
3430 :echo % --> nothing
3431< The '%' is an illegal character in an expression. >
3432 :echo "%" --> %
3433< This just echoes the '%' character. >
3434 :echo expand("%") --> filename
3435< This calls the expand() function to expand the '%'.
3436
3437 *:echoh* *:echohl*
3438:echoh[l] {name} Use the highlight group {name} for the following
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003439 `:echo`, `:echon` and `:echomsg` commands. Also used
3440 for the `input()` prompt. Example: >
Bram Moolenaar071d4272004-06-13 20:20:40 +00003441 :echohl WarningMsg | echo "Don't panic!" | echohl None
3442< Don't forget to set the group back to "None",
3443 otherwise all following echo's will be highlighted.
3444
3445 *:echom* *:echomsg*
3446:echom[sg] {expr1} .. Echo the expression(s) as a true message, saving the
3447 message in the |message-history|.
3448 Spaces are placed between the arguments as with the
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003449 `:echo` command. But unprintable characters are
Bram Moolenaar071d4272004-06-13 20:20:40 +00003450 displayed, not interpreted.
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003451 The parsing works slightly different from `:echo`,
3452 more like `:execute`. All the expressions are first
Bram Moolenaaref2f6562007-05-06 13:32:59 +00003453 evaluated and concatenated before echoing anything.
Bram Moolenaar461a7fc2018-12-22 13:28:07 +01003454 If expressions does not evaluate to a Number or
3455 String, string() is used to turn it into a string.
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003456 Uses the highlighting set by the `:echohl` command.
Bram Moolenaar071d4272004-06-13 20:20:40 +00003457 Example: >
3458 :echomsg "It's a Zizzer Zazzer Zuzz, as you can plainly see."
Bram Moolenaaref2f6562007-05-06 13:32:59 +00003459< See |:echo-redraw| to avoid the message disappearing
3460 when the screen is redrawn.
Bram Moolenaar37fef162022-08-29 18:16:32 +01003461
3462 *:echow* *:echowin* *:echowindow*
Bram Moolenaarbdc09a12022-10-07 14:31:45 +01003463:[N]echow[indow] {expr1} ..
Bram Moolenaar37fef162022-08-29 18:16:32 +01003464 Like |:echomsg| but when the messages popup window is
3465 available the message is displayed there. This means
3466 it will show for three seconds and avoid a
Bram Moolenaar9b03d3e2022-08-30 20:26:34 +01003467 |hit-enter| prompt. If you want to hide it before
3468 that, press Esc in Normal mode (when it would
Bram Moolenaar71b6d332022-09-10 13:13:14 +01003469 otherwise beep). If it disappears too soon you can
3470 use `:messages` to see the text.
Bram Moolenaarbdc09a12022-10-07 14:31:45 +01003471 When [N] is given then the window will show up for
3472 this number of seconds. The last `:echowindow` with a
3473 count matters, it is used once only.
Bram Moolenaar37fef162022-08-29 18:16:32 +01003474 The message window is available when Vim was compiled
3475 with the +timer and the +popupwin features.
3476
Bram Moolenaar071d4272004-06-13 20:20:40 +00003477 *:echoe* *:echoerr*
3478:echoe[rr] {expr1} .. Echo the expression(s) as an error message, saving the
3479 message in the |message-history|. When used in a
3480 script or function the line number will be added.
3481 Spaces are placed between the arguments as with the
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003482 `:echomsg` command. When used inside a try conditional,
Bram Moolenaar071d4272004-06-13 20:20:40 +00003483 the message is raised as an error exception instead
3484 (see |try-echoerr|).
3485 Example: >
3486 :echoerr "This script just failed!"
Bram Moolenaar1588bc82022-03-08 21:35:07 +00003487< If you just want a highlighted message use `:echohl`.
Bram Moolenaar071d4272004-06-13 20:20:40 +00003488 And to get a beep: >
3489 :exe "normal \<Esc>"
Bram Moolenaar4c868302021-03-22 16:19:45 +01003490
3491:echoc[onsole] {expr1} .. *:echoc* *:echoconsole*
3492 Intended for testing: works like `:echomsg` but when
3493 running in the GUI and started from a terminal write
3494 the text to stdout.
3495
Bram Moolenaar09c6f262019-11-17 15:55:14 +01003496 *:eval*
3497:eval {expr} Evaluate {expr} and discard the result. Example: >
3498 :eval Getlist()->Filter()->append('$')
3499
3500< The expression is supposed to have a side effect,
3501 since the resulting value is not used. In the example
3502 the `append()` call appends the List with text to the
3503 buffer. This is similar to `:call` but works with any
3504 expression.
Bram Moolenaara2baa732022-02-04 16:09:54 +00003505 In |Vim9| script an expression without an effect will
3506 result in error *E1207* . This should help noticing
3507 mistakes.
Bram Moolenaar09c6f262019-11-17 15:55:14 +01003508
3509 The command can be shortened to `:ev` or `:eva`, but
3510 these are hard to recognize and therefore not to be
3511 used.
3512
Bram Moolenaarbc93ceb2020-02-26 13:36:21 +01003513 The command cannot be followed by "|" and another
3514 command, since "|" is seen as part of the expression.
3515
Bram Moolenaar09c6f262019-11-17 15:55:14 +01003516
Bram Moolenaar071d4272004-06-13 20:20:40 +00003517 *:exe* *:execute*
3518:exe[cute] {expr1} .. Executes the string that results from the evaluation
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003519 of {expr1} as an Ex command.
3520 Multiple arguments are concatenated, with a space in
Bram Moolenaar7e6a5152021-01-02 16:39:53 +01003521 between. To avoid the extra space use the ".."
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003522 operator to concatenate strings into one argument.
3523 {expr1} is used as the processed command, command line
3524 editing keys are not recognized.
Bram Moolenaar071d4272004-06-13 20:20:40 +00003525 Cannot be followed by a comment.
3526 Examples: >
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003527 :execute "buffer" nextbuf
Bram Moolenaarc8cdf0f2021-03-13 13:28:13 +01003528 :execute "normal" count .. "w"
Bram Moolenaar071d4272004-06-13 20:20:40 +00003529<
3530 ":execute" can be used to append a command to commands
3531 that don't accept a '|'. Example: >
3532 :execute '!ls' | echo "theend"
3533
3534< ":execute" is also a nice way to avoid having to type
3535 control characters in a Vim script for a ":normal"
3536 command: >
3537 :execute "normal ixxx\<Esc>"
3538< This has an <Esc> character, see |expr-string|.
3539
Bram Moolenaar446cb832008-06-24 21:56:24 +00003540 Be careful to correctly escape special characters in
3541 file names. The |fnameescape()| function can be used
Bram Moolenaar05bb9532008-07-04 09:44:11 +00003542 for Vim commands, |shellescape()| for |:!| commands.
3543 Examples: >
Bram Moolenaarc8cdf0f2021-03-13 13:28:13 +01003544 :execute "e " .. fnameescape(filename)
3545 :execute "!ls " .. shellescape(filename, 1)
Bram Moolenaar446cb832008-06-24 21:56:24 +00003546<
Bram Moolenaar071d4272004-06-13 20:20:40 +00003547 Note: The executed string may be any command-line, but
Bram Moolenaar76f3b1a2014-03-27 22:30:07 +01003548 starting or ending "if", "while" and "for" does not
3549 always work, because when commands are skipped the
3550 ":execute" is not evaluated and Vim loses track of
3551 where blocks start and end. Also "break" and
3552 "continue" should not be inside ":execute".
3553 This example does not work, because the ":execute" is
3554 not evaluated and Vim does not see the "while", and
3555 gives an error for finding an ":endwhile": >
3556 :if 0
3557 : execute 'while i > 5'
3558 : echo "test"
3559 : endwhile
3560 :endif
Bram Moolenaar071d4272004-06-13 20:20:40 +00003561<
3562 It is allowed to have a "while" or "if" command
3563 completely in the executed string: >
3564 :execute 'while i < 5 | echo i | let i = i + 1 | endwhile'
3565<
3566
Bram Moolenaar8f3f58f2010-01-06 20:52:26 +01003567 *:exe-comment*
Bram Moolenaar071d4272004-06-13 20:20:40 +00003568 ":execute", ":echo" and ":echon" cannot be followed by
3569 a comment directly, because they see the '"' as the
3570 start of a string. But, you can use '|' followed by a
3571 comment. Example: >
3572 :echo "foo" | "this is a comment
3573
3574==============================================================================
35758. Exception handling *exception-handling*
3576
3577The Vim script language comprises an exception handling feature. This section
3578explains how it can be used in a Vim script.
3579
3580Exceptions may be raised by Vim on an error or on interrupt, see
3581|catch-errors| and |catch-interrupt|. You can also explicitly throw an
3582exception by using the ":throw" command, see |throw-catch|.
3583
3584
3585TRY CONDITIONALS *try-conditionals*
3586
3587Exceptions can be caught or can cause cleanup code to be executed. You can
3588use a try conditional to specify catch clauses (that catch exceptions) and/or
3589a finally clause (to be executed for cleanup).
3590 A try conditional begins with a |:try| command and ends at the matching
3591|:endtry| command. In between, you can use a |:catch| command to start
3592a catch clause, or a |:finally| command to start a finally clause. There may
3593be none or multiple catch clauses, but there is at most one finally clause,
3594which must not be followed by any catch clauses. The lines before the catch
3595clauses and the finally clause is called a try block. >
3596
3597 :try
Bram Moolenaar446cb832008-06-24 21:56:24 +00003598 : ...
3599 : ... TRY BLOCK
3600 : ...
Bram Moolenaar071d4272004-06-13 20:20:40 +00003601 :catch /{pattern}/
Bram Moolenaar446cb832008-06-24 21:56:24 +00003602 : ...
3603 : ... CATCH CLAUSE
3604 : ...
Bram Moolenaar071d4272004-06-13 20:20:40 +00003605 :catch /{pattern}/
Bram Moolenaar446cb832008-06-24 21:56:24 +00003606 : ...
3607 : ... CATCH CLAUSE
3608 : ...
Bram Moolenaar071d4272004-06-13 20:20:40 +00003609 :finally
Bram Moolenaar446cb832008-06-24 21:56:24 +00003610 : ...
3611 : ... FINALLY CLAUSE
3612 : ...
Bram Moolenaar071d4272004-06-13 20:20:40 +00003613 :endtry
3614
3615The try conditional allows to watch code for exceptions and to take the
3616appropriate actions. Exceptions from the try block may be caught. Exceptions
3617from the try block and also the catch clauses may cause cleanup actions.
3618 When no exception is thrown during execution of the try block, the control
3619is transferred to the finally clause, if present. After its execution, the
3620script continues with the line following the ":endtry".
3621 When an exception occurs during execution of the try block, the remaining
3622lines in the try block are skipped. The exception is matched against the
3623patterns specified as arguments to the ":catch" commands. The catch clause
3624after the first matching ":catch" is taken, other catch clauses are not
3625executed. The catch clause ends when the next ":catch", ":finally", or
3626":endtry" command is reached - whatever is first. Then, the finally clause
3627(if present) is executed. When the ":endtry" is reached, the script execution
3628continues in the following line as usual.
3629 When an exception that does not match any of the patterns specified by the
3630":catch" commands is thrown in the try block, the exception is not caught by
3631that try conditional and none of the catch clauses is executed. Only the
3632finally clause, if present, is taken. The exception pends during execution of
3633the finally clause. It is resumed at the ":endtry", so that commands after
3634the ":endtry" are not executed and the exception might be caught elsewhere,
3635see |try-nesting|.
3636 When during execution of a catch clause another exception is thrown, the
Bram Moolenaar58b85342016-08-14 19:54:54 +02003637remaining lines in that catch clause are not executed. The new exception is
Bram Moolenaar071d4272004-06-13 20:20:40 +00003638not matched against the patterns in any of the ":catch" commands of the same
3639try conditional and none of its catch clauses is taken. If there is, however,
3640a finally clause, it is executed, and the exception pends during its
3641execution. The commands following the ":endtry" are not executed. The new
3642exception might, however, be caught elsewhere, see |try-nesting|.
3643 When during execution of the finally clause (if present) an exception is
Bram Moolenaar58b85342016-08-14 19:54:54 +02003644thrown, the remaining lines in the finally clause are skipped. If the finally
Bram Moolenaar071d4272004-06-13 20:20:40 +00003645clause has been taken because of an exception from the try block or one of the
3646catch clauses, the original (pending) exception is discarded. The commands
3647following the ":endtry" are not executed, and the exception from the finally
3648clause is propagated and can be caught elsewhere, see |try-nesting|.
3649
3650The finally clause is also executed, when a ":break" or ":continue" for
3651a ":while" loop enclosing the complete try conditional is executed from the
3652try block or a catch clause. Or when a ":return" or ":finish" is executed
3653from the try block or a catch clause of a try conditional in a function or
3654sourced script, respectively. The ":break", ":continue", ":return", or
3655":finish" pends during execution of the finally clause and is resumed when the
3656":endtry" is reached. It is, however, discarded when an exception is thrown
3657from the finally clause.
3658 When a ":break" or ":continue" for a ":while" loop enclosing the complete
3659try conditional or when a ":return" or ":finish" is encountered in the finally
3660clause, the rest of the finally clause is skipped, and the ":break",
3661":continue", ":return" or ":finish" is executed as usual. If the finally
3662clause has been taken because of an exception or an earlier ":break",
3663":continue", ":return", or ":finish" from the try block or a catch clause,
3664this pending exception or command is discarded.
3665
3666For examples see |throw-catch| and |try-finally|.
3667
3668
Bram Moolenaar76db9e02022-11-09 21:21:04 +00003669NESTING OF TRY CONDITIONALS *try-nesting*
Bram Moolenaar071d4272004-06-13 20:20:40 +00003670
3671Try conditionals can be nested arbitrarily. That is, a complete try
3672conditional can be put into the try block, a catch clause, or the finally
3673clause of another try conditional. If the inner try conditional does not
3674catch an exception thrown in its try block or throws a new exception from one
3675of its catch clauses or its finally clause, the outer try conditional is
3676checked according to the rules above. If the inner try conditional is in the
3677try block of the outer try conditional, its catch clauses are checked, but
Bram Moolenaar58b85342016-08-14 19:54:54 +02003678otherwise only the finally clause is executed. It does not matter for
Bram Moolenaar071d4272004-06-13 20:20:40 +00003679nesting, whether the inner try conditional is directly contained in the outer
3680one, or whether the outer one sources a script or calls a function containing
3681the inner try conditional.
3682
3683When none of the active try conditionals catches an exception, just their
3684finally clauses are executed. Thereafter, the script processing terminates.
3685An error message is displayed in case of an uncaught exception explicitly
3686thrown by a ":throw" command. For uncaught error and interrupt exceptions
3687implicitly raised by Vim, the error message(s) or interrupt message are shown
3688as usual.
3689
3690For examples see |throw-catch|.
3691
3692
3693EXAMINING EXCEPTION HANDLING CODE *except-examine*
3694
3695Exception handling code can get tricky. If you are in doubt what happens, set
3696'verbose' to 13 or use the ":13verbose" command modifier when sourcing your
3697script file. Then you see when an exception is thrown, discarded, caught, or
3698finished. When using a verbosity level of at least 14, things pending in
3699a finally clause are also shown. This information is also given in debug mode
3700(see |debug-scripts|).
3701
3702
3703THROWING AND CATCHING EXCEPTIONS *throw-catch*
3704
3705You can throw any number or string as an exception. Use the |:throw| command
3706and pass the value to be thrown as argument: >
3707 :throw 4711
3708 :throw "string"
3709< *throw-expression*
3710You can also specify an expression argument. The expression is then evaluated
3711first, and the result is thrown: >
3712 :throw 4705 + strlen("string")
3713 :throw strpart("strings", 0, 6)
3714
3715An exception might be thrown during evaluation of the argument of the ":throw"
3716command. Unless it is caught there, the expression evaluation is abandoned.
3717The ":throw" command then does not throw a new exception.
3718 Example: >
3719
3720 :function! Foo(arg)
3721 : try
3722 : throw a:arg
3723 : catch /foo/
3724 : endtry
3725 : return 1
3726 :endfunction
3727 :
3728 :function! Bar()
3729 : echo "in Bar"
3730 : return 4710
3731 :endfunction
3732 :
3733 :throw Foo("arrgh") + Bar()
3734
3735This throws "arrgh", and "in Bar" is not displayed since Bar() is not
3736executed. >
3737 :throw Foo("foo") + Bar()
3738however displays "in Bar" and throws 4711.
3739
3740Any other command that takes an expression as argument might also be
Bram Moolenaar58b85342016-08-14 19:54:54 +02003741abandoned by an (uncaught) exception during the expression evaluation. The
Bram Moolenaar071d4272004-06-13 20:20:40 +00003742exception is then propagated to the caller of the command.
3743 Example: >
3744
3745 :if Foo("arrgh")
3746 : echo "then"
3747 :else
3748 : echo "else"
3749 :endif
3750
3751Here neither of "then" or "else" is displayed.
3752
3753 *catch-order*
3754Exceptions can be caught by a try conditional with one or more |:catch|
3755commands, see |try-conditionals|. The values to be caught by each ":catch"
3756command can be specified as a pattern argument. The subsequent catch clause
3757gets executed when a matching exception is caught.
3758 Example: >
3759
3760 :function! Foo(value)
3761 : try
3762 : throw a:value
3763 : catch /^\d\+$/
3764 : echo "Number thrown"
3765 : catch /.*/
3766 : echo "String thrown"
3767 : endtry
3768 :endfunction
3769 :
3770 :call Foo(0x1267)
3771 :call Foo('string')
3772
3773The first call to Foo() displays "Number thrown", the second "String thrown".
3774An exception is matched against the ":catch" commands in the order they are
3775specified. Only the first match counts. So you should place the more
3776specific ":catch" first. The following order does not make sense: >
3777
3778 : catch /.*/
3779 : echo "String thrown"
3780 : catch /^\d\+$/
3781 : echo "Number thrown"
3782
3783The first ":catch" here matches always, so that the second catch clause is
3784never taken.
3785
3786 *throw-variables*
3787If you catch an exception by a general pattern, you may access the exact value
3788in the variable |v:exception|: >
3789
3790 : catch /^\d\+$/
3791 : echo "Number thrown. Value is" v:exception
3792
3793You may also be interested where an exception was thrown. This is stored in
3794|v:throwpoint|. Note that "v:exception" and "v:throwpoint" are valid for the
3795exception most recently caught as long it is not finished.
3796 Example: >
3797
3798 :function! Caught()
3799 : if v:exception != ""
Bram Moolenaarc51cf032022-02-26 12:25:45 +00003800 : echo 'Caught "' . v:exception .. '" in ' .. v:throwpoint
Bram Moolenaar071d4272004-06-13 20:20:40 +00003801 : else
3802 : echo 'Nothing caught'
3803 : endif
3804 :endfunction
3805 :
3806 :function! Foo()
3807 : try
3808 : try
3809 : try
3810 : throw 4711
3811 : finally
3812 : call Caught()
3813 : endtry
3814 : catch /.*/
3815 : call Caught()
3816 : throw "oops"
3817 : endtry
3818 : catch /.*/
3819 : call Caught()
3820 : finally
3821 : call Caught()
3822 : endtry
3823 :endfunction
3824 :
3825 :call Foo()
3826
3827This displays >
3828
3829 Nothing caught
3830 Caught "4711" in function Foo, line 4
3831 Caught "oops" in function Foo, line 10
3832 Nothing caught
3833
3834A practical example: The following command ":LineNumber" displays the line
3835number in the script or function where it has been used: >
3836
3837 :function! LineNumber()
3838 : return substitute(v:throwpoint, '.*\D\(\d\+\).*', '\1', "")
3839 :endfunction
3840 :command! LineNumber try | throw "" | catch | echo LineNumber() | endtry
3841<
3842 *try-nested*
3843An exception that is not caught by a try conditional can be caught by
3844a surrounding try conditional: >
3845
3846 :try
3847 : try
3848 : throw "foo"
3849 : catch /foobar/
3850 : echo "foobar"
3851 : finally
3852 : echo "inner finally"
3853 : endtry
3854 :catch /foo/
3855 : echo "foo"
3856 :endtry
3857
3858The inner try conditional does not catch the exception, just its finally
3859clause is executed. The exception is then caught by the outer try
3860conditional. The example displays "inner finally" and then "foo".
3861
3862 *throw-from-catch*
3863You can catch an exception and throw a new one to be caught elsewhere from the
3864catch clause: >
3865
3866 :function! Foo()
3867 : throw "foo"
3868 :endfunction
3869 :
3870 :function! Bar()
3871 : try
3872 : call Foo()
3873 : catch /foo/
3874 : echo "Caught foo, throw bar"
3875 : throw "bar"
3876 : endtry
3877 :endfunction
3878 :
3879 :try
3880 : call Bar()
3881 :catch /.*/
3882 : echo "Caught" v:exception
3883 :endtry
3884
3885This displays "Caught foo, throw bar" and then "Caught bar".
3886
3887 *rethrow*
3888There is no real rethrow in the Vim script language, but you may throw
3889"v:exception" instead: >
3890
3891 :function! Bar()
3892 : try
3893 : call Foo()
3894 : catch /.*/
3895 : echo "Rethrow" v:exception
3896 : throw v:exception
3897 : endtry
3898 :endfunction
3899< *try-echoerr*
3900Note that this method cannot be used to "rethrow" Vim error or interrupt
3901exceptions, because it is not possible to fake Vim internal exceptions.
3902Trying so causes an error exception. You should throw your own exception
3903denoting the situation. If you want to cause a Vim error exception containing
3904the original error exception value, you can use the |:echoerr| command: >
3905
3906 :try
3907 : try
3908 : asdf
3909 : catch /.*/
3910 : echoerr v:exception
3911 : endtry
3912 :catch /.*/
3913 : echo v:exception
3914 :endtry
3915
3916This code displays
3917
Bram Moolenaar446cb832008-06-24 21:56:24 +00003918 Vim(echoerr):Vim:E492: Not an editor command: asdf ~
Bram Moolenaar071d4272004-06-13 20:20:40 +00003919
3920
3921CLEANUP CODE *try-finally*
3922
3923Scripts often change global settings and restore them at their end. If the
3924user however interrupts the script by pressing CTRL-C, the settings remain in
Bram Moolenaar58b85342016-08-14 19:54:54 +02003925an inconsistent state. The same may happen to you in the development phase of
Bram Moolenaar071d4272004-06-13 20:20:40 +00003926a script when an error occurs or you explicitly throw an exception without
3927catching it. You can solve these problems by using a try conditional with
3928a finally clause for restoring the settings. Its execution is guaranteed on
3929normal control flow, on error, on an explicit ":throw", and on interrupt.
3930(Note that errors and interrupts from inside the try conditional are converted
Bram Moolenaar58b85342016-08-14 19:54:54 +02003931to exceptions. When not caught, they terminate the script after the finally
Bram Moolenaar071d4272004-06-13 20:20:40 +00003932clause has been executed.)
3933Example: >
3934
3935 :try
3936 : let s:saved_ts = &ts
3937 : set ts=17
3938 :
3939 : " Do the hard work here.
3940 :
3941 :finally
3942 : let &ts = s:saved_ts
3943 : unlet s:saved_ts
3944 :endtry
3945
3946This method should be used locally whenever a function or part of a script
3947changes global settings which need to be restored on failure or normal exit of
3948that function or script part.
3949
3950 *break-finally*
3951Cleanup code works also when the try block or a catch clause is left by
3952a ":continue", ":break", ":return", or ":finish".
3953 Example: >
3954
3955 :let first = 1
3956 :while 1
3957 : try
3958 : if first
3959 : echo "first"
3960 : let first = 0
3961 : continue
3962 : else
3963 : throw "second"
3964 : endif
3965 : catch /.*/
3966 : echo v:exception
3967 : break
3968 : finally
3969 : echo "cleanup"
3970 : endtry
3971 : echo "still in while"
3972 :endwhile
3973 :echo "end"
3974
3975This displays "first", "cleanup", "second", "cleanup", and "end". >
3976
3977 :function! Foo()
3978 : try
3979 : return 4711
3980 : finally
3981 : echo "cleanup\n"
3982 : endtry
3983 : echo "Foo still active"
3984 :endfunction
3985 :
3986 :echo Foo() "returned by Foo"
3987
3988This displays "cleanup" and "4711 returned by Foo". You don't need to add an
Bram Moolenaar58b85342016-08-14 19:54:54 +02003989extra ":return" in the finally clause. (Above all, this would override the
Bram Moolenaar071d4272004-06-13 20:20:40 +00003990return value.)
3991
3992 *except-from-finally*
3993Using either of ":continue", ":break", ":return", ":finish", or ":throw" in
3994a finally clause is possible, but not recommended since it abandons the
3995cleanup actions for the try conditional. But, of course, interrupt and error
3996exceptions might get raised from a finally clause.
3997 Example where an error in the finally clause stops an interrupt from
3998working correctly: >
3999
4000 :try
4001 : try
4002 : echo "Press CTRL-C for interrupt"
4003 : while 1
4004 : endwhile
4005 : finally
4006 : unlet novar
4007 : endtry
4008 :catch /novar/
4009 :endtry
4010 :echo "Script still running"
4011 :sleep 1
4012
4013If you need to put commands that could fail into a finally clause, you should
4014think about catching or ignoring the errors in these commands, see
4015|catch-errors| and |ignore-errors|.
4016
4017
4018CATCHING ERRORS *catch-errors*
4019
4020If you want to catch specific errors, you just have to put the code to be
4021watched in a try block and add a catch clause for the error message. The
4022presence of the try conditional causes all errors to be converted to an
4023exception. No message is displayed and |v:errmsg| is not set then. To find
4024the right pattern for the ":catch" command, you have to know how the format of
4025the error exception is.
4026 Error exceptions have the following format: >
4027
4028 Vim({cmdname}):{errmsg}
4029or >
4030 Vim:{errmsg}
4031
4032{cmdname} is the name of the command that failed; the second form is used when
Bram Moolenaar58b85342016-08-14 19:54:54 +02004033the command name is not known. {errmsg} is the error message usually produced
Bram Moolenaar071d4272004-06-13 20:20:40 +00004034when the error occurs outside try conditionals. It always begins with
4035a capital "E", followed by a two or three-digit error number, a colon, and
4036a space.
4037
4038Examples:
4039
4040The command >
4041 :unlet novar
4042normally produces the error message >
4043 E108: No such variable: "novar"
4044which is converted inside try conditionals to an exception >
4045 Vim(unlet):E108: No such variable: "novar"
4046
4047The command >
4048 :dwim
4049normally produces the error message >
4050 E492: Not an editor command: dwim
4051which is converted inside try conditionals to an exception >
4052 Vim:E492: Not an editor command: dwim
4053
4054You can catch all ":unlet" errors by a >
4055 :catch /^Vim(unlet):/
4056or all errors for misspelled command names by a >
4057 :catch /^Vim:E492:/
4058
4059Some error messages may be produced by different commands: >
4060 :function nofunc
4061and >
4062 :delfunction nofunc
4063both produce the error message >
4064 E128: Function name must start with a capital: nofunc
4065which is converted inside try conditionals to an exception >
4066 Vim(function):E128: Function name must start with a capital: nofunc
4067or >
4068 Vim(delfunction):E128: Function name must start with a capital: nofunc
4069respectively. You can catch the error by its number independently on the
4070command that caused it if you use the following pattern: >
4071 :catch /^Vim(\a\+):E128:/
4072
4073Some commands like >
4074 :let x = novar
4075produce multiple error messages, here: >
4076 E121: Undefined variable: novar
4077 E15: Invalid expression: novar
4078Only the first is used for the exception value, since it is the most specific
4079one (see |except-several-errors|). So you can catch it by >
4080 :catch /^Vim(\a\+):E121:/
4081
4082You can catch all errors related to the name "nofunc" by >
4083 :catch /\<nofunc\>/
4084
4085You can catch all Vim errors in the ":write" and ":read" commands by >
4086 :catch /^Vim(\(write\|read\)):E\d\+:/
4087
4088You can catch all Vim errors by the pattern >
4089 :catch /^Vim\((\a\+)\)\=:E\d\+:/
4090<
4091 *catch-text*
4092NOTE: You should never catch the error message text itself: >
4093 :catch /No such variable/
Bram Moolenaar2b8388b2015-02-28 13:11:45 +01004094only works in the English locale, but not when the user has selected
Bram Moolenaar071d4272004-06-13 20:20:40 +00004095a different language by the |:language| command. It is however helpful to
4096cite the message text in a comment: >
4097 :catch /^Vim(\a\+):E108:/ " No such variable
4098
4099
4100IGNORING ERRORS *ignore-errors*
4101
4102You can ignore errors in a specific Vim command by catching them locally: >
4103
4104 :try
4105 : write
4106 :catch
4107 :endtry
4108
4109But you are strongly recommended NOT to use this simple form, since it could
4110catch more than you want. With the ":write" command, some autocommands could
4111be executed and cause errors not related to writing, for instance: >
4112
4113 :au BufWritePre * unlet novar
4114
4115There could even be such errors you are not responsible for as a script
4116writer: a user of your script might have defined such autocommands. You would
4117then hide the error from the user.
4118 It is much better to use >
4119
4120 :try
4121 : write
4122 :catch /^Vim(write):/
4123 :endtry
4124
4125which only catches real write errors. So catch only what you'd like to ignore
4126intentionally.
4127
4128For a single command that does not cause execution of autocommands, you could
4129even suppress the conversion of errors to exceptions by the ":silent!"
4130command: >
4131 :silent! nunmap k
4132This works also when a try conditional is active.
4133
4134
4135CATCHING INTERRUPTS *catch-interrupt*
4136
4137When there are active try conditionals, an interrupt (CTRL-C) is converted to
Bram Moolenaar58b85342016-08-14 19:54:54 +02004138the exception "Vim:Interrupt". You can catch it like every exception. The
Bram Moolenaar071d4272004-06-13 20:20:40 +00004139script is not terminated, then.
4140 Example: >
4141
4142 :function! TASK1()
4143 : sleep 10
4144 :endfunction
4145
4146 :function! TASK2()
4147 : sleep 20
4148 :endfunction
4149
4150 :while 1
4151 : let command = input("Type a command: ")
4152 : try
4153 : if command == ""
4154 : continue
4155 : elseif command == "END"
4156 : break
4157 : elseif command == "TASK1"
4158 : call TASK1()
4159 : elseif command == "TASK2"
4160 : call TASK2()
4161 : else
4162 : echo "\nIllegal command:" command
4163 : continue
4164 : endif
4165 : catch /^Vim:Interrupt$/
4166 : echo "\nCommand interrupted"
4167 : " Caught the interrupt. Continue with next prompt.
4168 : endtry
4169 :endwhile
4170
4171You can interrupt a task here by pressing CTRL-C; the script then asks for
Bram Moolenaar58b85342016-08-14 19:54:54 +02004172a new command. If you press CTRL-C at the prompt, the script is terminated.
Bram Moolenaar071d4272004-06-13 20:20:40 +00004173
4174For testing what happens when CTRL-C would be pressed on a specific line in
4175your script, use the debug mode and execute the |>quit| or |>interrupt|
4176command on that line. See |debug-scripts|.
4177
4178
4179CATCHING ALL *catch-all*
4180
4181The commands >
4182
4183 :catch /.*/
4184 :catch //
4185 :catch
4186
4187catch everything, error exceptions, interrupt exceptions and exceptions
4188explicitly thrown by the |:throw| command. This is useful at the top level of
4189a script in order to catch unexpected things.
4190 Example: >
4191
4192 :try
4193 :
4194 : " do the hard work here
4195 :
4196 :catch /MyException/
4197 :
4198 : " handle known problem
4199 :
4200 :catch /^Vim:Interrupt$/
4201 : echo "Script interrupted"
4202 :catch /.*/
Bram Moolenaarc51cf032022-02-26 12:25:45 +00004203 : echo "Internal error (" .. v:exception .. ")"
4204 : echo " - occurred at " .. v:throwpoint
Bram Moolenaar071d4272004-06-13 20:20:40 +00004205 :endtry
4206 :" end of script
4207
4208Note: Catching all might catch more things than you want. Thus, you are
4209strongly encouraged to catch only for problems that you can really handle by
4210specifying a pattern argument to the ":catch".
4211 Example: Catching all could make it nearly impossible to interrupt a script
4212by pressing CTRL-C: >
4213
4214 :while 1
4215 : try
4216 : sleep 1
4217 : catch
4218 : endtry
4219 :endwhile
4220
4221
4222EXCEPTIONS AND AUTOCOMMANDS *except-autocmd*
4223
4224Exceptions may be used during execution of autocommands. Example: >
4225
4226 :autocmd User x try
4227 :autocmd User x throw "Oops!"
4228 :autocmd User x catch
4229 :autocmd User x echo v:exception
4230 :autocmd User x endtry
4231 :autocmd User x throw "Arrgh!"
4232 :autocmd User x echo "Should not be displayed"
4233 :
4234 :try
4235 : doautocmd User x
4236 :catch
4237 : echo v:exception
4238 :endtry
4239
4240This displays "Oops!" and "Arrgh!".
4241
4242 *except-autocmd-Pre*
4243For some commands, autocommands get executed before the main action of the
4244command takes place. If an exception is thrown and not caught in the sequence
4245of autocommands, the sequence and the command that caused its execution are
4246abandoned and the exception is propagated to the caller of the command.
4247 Example: >
4248
4249 :autocmd BufWritePre * throw "FAIL"
4250 :autocmd BufWritePre * echo "Should not be displayed"
4251 :
4252 :try
4253 : write
4254 :catch
4255 : echo "Caught:" v:exception "from" v:throwpoint
4256 :endtry
4257
4258Here, the ":write" command does not write the file currently being edited (as
4259you can see by checking 'modified'), since the exception from the BufWritePre
4260autocommand abandons the ":write". The exception is then caught and the
4261script displays: >
4262
4263 Caught: FAIL from BufWrite Auto commands for "*"
4264<
4265 *except-autocmd-Post*
4266For some commands, autocommands get executed after the main action of the
4267command has taken place. If this main action fails and the command is inside
4268an active try conditional, the autocommands are skipped and an error exception
4269is thrown that can be caught by the caller of the command.
4270 Example: >
4271
4272 :autocmd BufWritePost * echo "File successfully written!"
4273 :
4274 :try
4275 : write /i/m/p/o/s/s/i/b/l/e
4276 :catch
4277 : echo v:exception
4278 :endtry
4279
4280This just displays: >
4281
4282 Vim(write):E212: Can't open file for writing (/i/m/p/o/s/s/i/b/l/e)
4283
4284If you really need to execute the autocommands even when the main action
4285fails, trigger the event from the catch clause.
4286 Example: >
4287
4288 :autocmd BufWritePre * set noreadonly
4289 :autocmd BufWritePost * set readonly
4290 :
4291 :try
4292 : write /i/m/p/o/s/s/i/b/l/e
4293 :catch
4294 : doautocmd BufWritePost /i/m/p/o/s/s/i/b/l/e
4295 :endtry
4296<
4297You can also use ":silent!": >
4298
4299 :let x = "ok"
4300 :let v:errmsg = ""
4301 :autocmd BufWritePost * if v:errmsg != ""
4302 :autocmd BufWritePost * let x = "after fail"
4303 :autocmd BufWritePost * endif
4304 :try
4305 : silent! write /i/m/p/o/s/s/i/b/l/e
4306 :catch
4307 :endtry
4308 :echo x
4309
4310This displays "after fail".
4311
4312If the main action of the command does not fail, exceptions from the
4313autocommands will be catchable by the caller of the command: >
4314
4315 :autocmd BufWritePost * throw ":-("
4316 :autocmd BufWritePost * echo "Should not be displayed"
4317 :
4318 :try
4319 : write
4320 :catch
4321 : echo v:exception
4322 :endtry
4323<
4324 *except-autocmd-Cmd*
4325For some commands, the normal action can be replaced by a sequence of
4326autocommands. Exceptions from that sequence will be catchable by the caller
4327of the command.
4328 Example: For the ":write" command, the caller cannot know whether the file
Bram Moolenaar58b85342016-08-14 19:54:54 +02004329had actually been written when the exception occurred. You need to tell it in
Bram Moolenaar071d4272004-06-13 20:20:40 +00004330some way. >
4331
4332 :if !exists("cnt")
4333 : let cnt = 0
4334 :
4335 : autocmd BufWriteCmd * if &modified
4336 : autocmd BufWriteCmd * let cnt = cnt + 1
4337 : autocmd BufWriteCmd * if cnt % 3 == 2
4338 : autocmd BufWriteCmd * throw "BufWriteCmdError"
4339 : autocmd BufWriteCmd * endif
4340 : autocmd BufWriteCmd * write | set nomodified
4341 : autocmd BufWriteCmd * if cnt % 3 == 0
4342 : autocmd BufWriteCmd * throw "BufWriteCmdError"
4343 : autocmd BufWriteCmd * endif
4344 : autocmd BufWriteCmd * echo "File successfully written!"
4345 : autocmd BufWriteCmd * endif
4346 :endif
4347 :
4348 :try
4349 : write
4350 :catch /^BufWriteCmdError$/
4351 : if &modified
4352 : echo "Error on writing (file contents not changed)"
4353 : else
4354 : echo "Error after writing"
4355 : endif
4356 :catch /^Vim(write):/
4357 : echo "Error on writing"
4358 :endtry
4359
4360When this script is sourced several times after making changes, it displays
4361first >
4362 File successfully written!
4363then >
4364 Error on writing (file contents not changed)
4365then >
4366 Error after writing
4367etc.
4368
4369 *except-autocmd-ill*
4370You cannot spread a try conditional over autocommands for different events.
4371The following code is ill-formed: >
4372
4373 :autocmd BufWritePre * try
4374 :
4375 :autocmd BufWritePost * catch
4376 :autocmd BufWritePost * echo v:exception
4377 :autocmd BufWritePost * endtry
4378 :
4379 :write
4380
4381
4382EXCEPTION HIERARCHIES AND PARAMETERIZED EXCEPTIONS *except-hier-param*
4383
4384Some programming languages allow to use hierarchies of exception classes or to
4385pass additional information with the object of an exception class. You can do
4386similar things in Vim.
4387 In order to throw an exception from a hierarchy, just throw the complete
4388class name with the components separated by a colon, for instance throw the
4389string "EXCEPT:MATHERR:OVERFLOW" for an overflow in a mathematical library.
4390 When you want to pass additional information with your exception class, add
4391it in parentheses, for instance throw the string "EXCEPT:IO:WRITEERR(myfile)"
4392for an error when writing "myfile".
4393 With the appropriate patterns in the ":catch" command, you can catch for
4394base classes or derived classes of your hierarchy. Additional information in
4395parentheses can be cut out from |v:exception| with the ":substitute" command.
4396 Example: >
4397
4398 :function! CheckRange(a, func)
4399 : if a:a < 0
Bram Moolenaarc51cf032022-02-26 12:25:45 +00004400 : throw "EXCEPT:MATHERR:RANGE(" .. a:func .. ")"
Bram Moolenaar071d4272004-06-13 20:20:40 +00004401 : endif
4402 :endfunction
4403 :
4404 :function! Add(a, b)
4405 : call CheckRange(a:a, "Add")
4406 : call CheckRange(a:b, "Add")
4407 : let c = a:a + a:b
4408 : if c < 0
4409 : throw "EXCEPT:MATHERR:OVERFLOW"
4410 : endif
4411 : return c
4412 :endfunction
4413 :
4414 :function! Div(a, b)
4415 : call CheckRange(a:a, "Div")
4416 : call CheckRange(a:b, "Div")
4417 : if (a:b == 0)
4418 : throw "EXCEPT:MATHERR:ZERODIV"
4419 : endif
4420 : return a:a / a:b
4421 :endfunction
4422 :
4423 :function! Write(file)
4424 : try
Bram Moolenaar446cb832008-06-24 21:56:24 +00004425 : execute "write" fnameescape(a:file)
Bram Moolenaar071d4272004-06-13 20:20:40 +00004426 : catch /^Vim(write):/
Bram Moolenaarc51cf032022-02-26 12:25:45 +00004427 : throw "EXCEPT:IO(" .. getcwd() .. ", " .. a:file .. "):WRITEERR"
Bram Moolenaar071d4272004-06-13 20:20:40 +00004428 : endtry
4429 :endfunction
4430 :
4431 :try
4432 :
Bram Moolenaar75ab5902022-04-18 15:36:40 +01004433 : " something with arithmetic and I/O
Bram Moolenaar071d4272004-06-13 20:20:40 +00004434 :
4435 :catch /^EXCEPT:MATHERR:RANGE/
4436 : let function = substitute(v:exception, '.*(\(\a\+\)).*', '\1', "")
4437 : echo "Range error in" function
4438 :
4439 :catch /^EXCEPT:MATHERR/ " catches OVERFLOW and ZERODIV
4440 : echo "Math error"
4441 :
4442 :catch /^EXCEPT:IO/
4443 : let dir = substitute(v:exception, '.*(\(.\+\),\s*.\+).*', '\1', "")
4444 : let file = substitute(v:exception, '.*(.\+,\s*\(.\+\)).*', '\1', "")
4445 : if file !~ '^/'
Bram Moolenaarc51cf032022-02-26 12:25:45 +00004446 : let file = dir .. "/" .. file
Bram Moolenaar071d4272004-06-13 20:20:40 +00004447 : endif
Bram Moolenaarc51cf032022-02-26 12:25:45 +00004448 : echo 'I/O error for "' .. file .. '"'
Bram Moolenaar071d4272004-06-13 20:20:40 +00004449 :
4450 :catch /^EXCEPT/
4451 : echo "Unspecified error"
4452 :
4453 :endtry
4454
4455The exceptions raised by Vim itself (on error or when pressing CTRL-C) use
4456a flat hierarchy: they are all in the "Vim" class. You cannot throw yourself
4457exceptions with the "Vim" prefix; they are reserved for Vim.
4458 Vim error exceptions are parameterized with the name of the command that
4459failed, if known. See |catch-errors|.
4460
4461
4462PECULIARITIES
4463 *except-compat*
4464The exception handling concept requires that the command sequence causing the
4465exception is aborted immediately and control is transferred to finally clauses
4466and/or a catch clause.
4467
4468In the Vim script language there are cases where scripts and functions
4469continue after an error: in functions without the "abort" flag or in a command
4470after ":silent!", control flow goes to the following line, and outside
4471functions, control flow goes to the line following the outermost ":endwhile"
4472or ":endif". On the other hand, errors should be catchable as exceptions
4473(thus, requiring the immediate abortion).
4474
4475This problem has been solved by converting errors to exceptions and using
4476immediate abortion (if not suppressed by ":silent!") only when a try
Bram Moolenaar58b85342016-08-14 19:54:54 +02004477conditional is active. This is no restriction since an (error) exception can
4478be caught only from an active try conditional. If you want an immediate
Bram Moolenaar071d4272004-06-13 20:20:40 +00004479termination without catching the error, just use a try conditional without
4480catch clause. (You can cause cleanup code being executed before termination
4481by specifying a finally clause.)
4482
4483When no try conditional is active, the usual abortion and continuation
4484behavior is used instead of immediate abortion. This ensures compatibility of
4485scripts written for Vim 6.1 and earlier.
4486
4487However, when sourcing an existing script that does not use exception handling
4488commands (or when calling one of its functions) from inside an active try
4489conditional of a new script, you might change the control flow of the existing
4490script on error. You get the immediate abortion on error and can catch the
4491error in the new script. If however the sourced script suppresses error
4492messages by using the ":silent!" command (checking for errors by testing
Bram Moolenaar58b85342016-08-14 19:54:54 +02004493|v:errmsg| if appropriate), its execution path is not changed. The error is
4494not converted to an exception. (See |:silent|.) So the only remaining cause
Bram Moolenaar071d4272004-06-13 20:20:40 +00004495where this happens is for scripts that don't care about errors and produce
4496error messages. You probably won't want to use such code from your new
4497scripts.
4498
4499 *except-syntax-err*
4500Syntax errors in the exception handling commands are never caught by any of
4501the ":catch" commands of the try conditional they belong to. Its finally
4502clauses, however, is executed.
4503 Example: >
4504
4505 :try
4506 : try
4507 : throw 4711
4508 : catch /\(/
4509 : echo "in catch with syntax error"
4510 : catch
4511 : echo "inner catch-all"
4512 : finally
4513 : echo "inner finally"
4514 : endtry
4515 :catch
Bram Moolenaarc51cf032022-02-26 12:25:45 +00004516 : echo 'outer catch-all caught "' .. v:exception .. '"'
Bram Moolenaar071d4272004-06-13 20:20:40 +00004517 : finally
4518 : echo "outer finally"
4519 :endtry
4520
4521This displays: >
4522 inner finally
4523 outer catch-all caught "Vim(catch):E54: Unmatched \("
4524 outer finally
4525The original exception is discarded and an error exception is raised, instead.
4526
4527 *except-single-line*
4528The ":try", ":catch", ":finally", and ":endtry" commands can be put on
4529a single line, but then syntax errors may make it difficult to recognize the
4530"catch" line, thus you better avoid this.
4531 Example: >
4532 :try | unlet! foo # | catch | endtry
4533raises an error exception for the trailing characters after the ":unlet!"
4534argument, but does not see the ":catch" and ":endtry" commands, so that the
4535error exception is discarded and the "E488: Trailing characters" message gets
4536displayed.
4537
4538 *except-several-errors*
4539When several errors appear in a single command, the first error message is
Bram Moolenaar53f7fcc2021-07-28 20:10:16 +02004540usually the most specific one and therefore converted to the error exception.
Bram Moolenaar071d4272004-06-13 20:20:40 +00004541 Example: >
4542 echo novar
4543causes >
4544 E121: Undefined variable: novar
4545 E15: Invalid expression: novar
4546The value of the error exception inside try conditionals is: >
4547 Vim(echo):E121: Undefined variable: novar
4548< *except-syntax-error*
4549But when a syntax error is detected after a normal error in the same command,
4550the syntax error is used for the exception being thrown.
4551 Example: >
4552 unlet novar #
4553causes >
4554 E108: No such variable: "novar"
4555 E488: Trailing characters
4556The value of the error exception inside try conditionals is: >
4557 Vim(unlet):E488: Trailing characters
4558This is done because the syntax error might change the execution path in a way
4559not intended by the user. Example: >
4560 try
4561 try | unlet novar # | catch | echo v:exception | endtry
4562 catch /.*/
4563 echo "outer catch:" v:exception
4564 endtry
4565This displays "outer catch: Vim(unlet):E488: Trailing characters", and then
4566a "E600: Missing :endtry" error message is given, see |except-single-line|.
4567
4568==============================================================================
45699. Examples *eval-examples*
4570
Bram Moolenaaref2f6562007-05-06 13:32:59 +00004571Printing in Binary ~
Bram Moolenaar071d4272004-06-13 20:20:40 +00004572>
Bram Moolenaar8f3f58f2010-01-06 20:52:26 +01004573 :" The function Nr2Bin() returns the binary string representation of a number.
Bram Moolenaaref2f6562007-05-06 13:32:59 +00004574 :func Nr2Bin(nr)
Bram Moolenaar071d4272004-06-13 20:20:40 +00004575 : let n = a:nr
4576 : let r = ""
4577 : while n
Bram Moolenaarc51cf032022-02-26 12:25:45 +00004578 : let r = '01'[n % 2] .. r
Bram Moolenaaref2f6562007-05-06 13:32:59 +00004579 : let n = n / 2
Bram Moolenaar071d4272004-06-13 20:20:40 +00004580 : endwhile
4581 : return r
4582 :endfunc
4583
Bram Moolenaaref2f6562007-05-06 13:32:59 +00004584 :" The function String2Bin() converts each character in a string to a
4585 :" binary string, separated with dashes.
4586 :func String2Bin(str)
Bram Moolenaar071d4272004-06-13 20:20:40 +00004587 : let out = ''
Bram Moolenaaref2f6562007-05-06 13:32:59 +00004588 : for ix in range(strlen(a:str))
Bram Moolenaarc51cf032022-02-26 12:25:45 +00004589 : let out = out .. '-' .. Nr2Bin(char2nr(a:str[ix]))
Bram Moolenaaref2f6562007-05-06 13:32:59 +00004590 : endfor
4591 : return out[1:]
Bram Moolenaar071d4272004-06-13 20:20:40 +00004592 :endfunc
4593
4594Example of its use: >
Bram Moolenaaref2f6562007-05-06 13:32:59 +00004595 :echo Nr2Bin(32)
4596result: "100000" >
4597 :echo String2Bin("32")
4598result: "110011-110010"
Bram Moolenaar071d4272004-06-13 20:20:40 +00004599
4600
Bram Moolenaaref2f6562007-05-06 13:32:59 +00004601Sorting lines ~
Bram Moolenaar071d4272004-06-13 20:20:40 +00004602
Bram Moolenaaref2f6562007-05-06 13:32:59 +00004603This example sorts lines with a specific compare function. >
4604
4605 :func SortBuffer()
4606 : let lines = getline(1, '$')
4607 : call sort(lines, function("Strcmp"))
4608 : call setline(1, lines)
Bram Moolenaar071d4272004-06-13 20:20:40 +00004609 :endfunction
4610
Bram Moolenaaref2f6562007-05-06 13:32:59 +00004611As a one-liner: >
4612 :call setline(1, sort(getline(1, '$'), function("Strcmp")))
Bram Moolenaar071d4272004-06-13 20:20:40 +00004613
Bram Moolenaar071d4272004-06-13 20:20:40 +00004614
Bram Moolenaaref2f6562007-05-06 13:32:59 +00004615scanf() replacement ~
Bram Moolenaar071d4272004-06-13 20:20:40 +00004616 *sscanf*
4617There is no sscanf() function in Vim. If you need to extract parts from a
4618line, you can use matchstr() and substitute() to do it. This example shows
4619how to get the file name, line number and column number out of a line like
4620"foobar.txt, 123, 45". >
4621 :" Set up the match bit
4622 :let mx='\(\f\+\),\s*\(\d\+\),\s*\(\d\+\)'
4623 :"get the part matching the whole expression
4624 :let l = matchstr(line, mx)
4625 :"get each item out of the match
4626 :let file = substitute(l, mx, '\1', '')
4627 :let lnum = substitute(l, mx, '\2', '')
4628 :let col = substitute(l, mx, '\3', '')
4629
4630The input is in the variable "line", the results in the variables "file",
4631"lnum" and "col". (idea from Michael Geddes)
4632
Bram Moolenaaref2f6562007-05-06 13:32:59 +00004633
4634getting the scriptnames in a Dictionary ~
4635 *scriptnames-dictionary*
Bram Moolenaardd60c362023-02-27 15:49:53 +00004636The `:scriptnames` command can be used to get a list of all script files that
4637have been sourced. There is also the `getscriptinfo()` function, but the
4638information returned is not exactly the same. In case you need to manipulate
Bram Moolenaar71badf92023-04-22 22:40:14 +01004639the list, this code can be used as a base: >
Bram Moolenaarb0d45e72017-11-05 18:19:24 +01004640
Bram Moolenaar71badf92023-04-22 22:40:14 +01004641 # Create or update scripts dictionary, indexed by SNR, and return it.
4642 def Scripts(scripts: dict<string> = {}): dict<string>
4643 for info in getscriptinfo()
4644 if scripts->has_key(info.sid)
4645 continue
4646 endif
4647 scripts[info.sid] = info.name
4648 endfor
4649 return scripts
4650 enddef
Bram Moolenaaref2f6562007-05-06 13:32:59 +00004651
Bram Moolenaar071d4272004-06-13 20:20:40 +00004652==============================================================================
Bram Moolenaar558ca4a2019-04-04 18:15:38 +0200465310. Vim script versions *vimscript-version* *vimscript-versions*
Bram Moolenaar911ead12019-04-21 00:03:35 +02004654 *scriptversion*
Bram Moolenaar558ca4a2019-04-04 18:15:38 +02004655Over time many features have been added to Vim script. This includes Ex
4656commands, functions, variable types, etc. Each individual feature can be
4657checked with the |has()| and |exists()| functions.
4658
4659Sometimes old syntax of functionality gets in the way of making Vim better.
4660When support is taken away this will break older Vim scripts. To make this
4661explicit the |:scriptversion| command can be used. When a Vim script is not
4662compatible with older versions of Vim this will give an explicit error,
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +02004663instead of failing in mysterious ways.
Bram Moolenaar558ca4a2019-04-04 18:15:38 +02004664
Bram Moolenaara2baa732022-02-04 16:09:54 +00004665When using a legacy function, defined with `:function`, in |Vim9| script then
4666scriptversion 4 is used.
4667
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +02004668 *scriptversion-1* >
Bram Moolenaar558ca4a2019-04-04 18:15:38 +02004669 :scriptversion 1
4670< This is the original Vim script, same as not using a |:scriptversion|
4671 command. Can be used to go back to old syntax for a range of lines.
4672 Test for support with: >
4673 has('vimscript-1')
4674
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +02004675< *scriptversion-2* >
Bram Moolenaar558ca4a2019-04-04 18:15:38 +02004676 :scriptversion 2
Bram Moolenaar68e65602019-05-26 21:33:31 +02004677< String concatenation with "." is not supported, use ".." instead.
Bram Moolenaar558ca4a2019-04-04 18:15:38 +02004678 This avoids the ambiguity using "." for Dict member access and
4679 floating point numbers. Now ".5" means the number 0.5.
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +02004680
4681 *scriptversion-3* >
Bram Moolenaar911ead12019-04-21 00:03:35 +02004682 :scriptversion 3
4683< All |vim-variable|s must be prefixed by "v:". E.g. "version" doesn't
4684 work as |v:version| anymore, it can be used as a normal variable.
4685 Same for some obvious names as "count" and others.
Bram Moolenaar558ca4a2019-04-04 18:15:38 +02004686
Bram Moolenaar911ead12019-04-21 00:03:35 +02004687 Test for support with: >
4688 has('vimscript-3')
Bram Moolenaar60a8de22019-09-15 14:33:22 +02004689<
4690 *scriptversion-4* >
4691 :scriptversion 4
Bram Moolenaarc17e66c2020-06-02 21:38:22 +02004692< Numbers with a leading zero are not recognized as octal. "0o" or "0O"
4693 is still recognized as octal. With the
Bram Moolenaar60a8de22019-09-15 14:33:22 +02004694 previous version you get: >
Bram Moolenaarc17e66c2020-06-02 21:38:22 +02004695 echo 017 " displays 15 (octal)
4696 echo 0o17 " displays 15 (octal)
4697 echo 018 " displays 18 (decimal)
Bram Moolenaar60a8de22019-09-15 14:33:22 +02004698< with script version 4: >
Bram Moolenaarc17e66c2020-06-02 21:38:22 +02004699 echo 017 " displays 17 (decimal)
4700 echo 0o17 " displays 15 (octal)
4701 echo 018 " displays 18 (decimal)
Bram Moolenaar60a8de22019-09-15 14:33:22 +02004702< Also, it is possible to use single quotes inside numbers to make them
4703 easier to read: >
4704 echo 1'000'000
4705< The quotes must be surrounded by digits.
4706
4707 Test for support with: >
4708 has('vimscript-4')
Bram Moolenaar558ca4a2019-04-04 18:15:38 +02004709
4710==============================================================================
471111. No +eval feature *no-eval-feature*
Bram Moolenaar071d4272004-06-13 20:20:40 +00004712
4713When the |+eval| feature was disabled at compile time, none of the expression
4714evaluation commands are available. To prevent this from causing Vim scripts
4715to generate all kinds of errors, the ":if" and ":endif" commands are still
4716recognized, though the argument of the ":if" and everything between the ":if"
4717and the matching ":endif" is ignored. Nesting of ":if" blocks is allowed, but
4718only if the commands are at the start of the line. The ":else" command is not
4719recognized.
4720
4721Example of how to avoid executing commands when the |+eval| feature is
4722missing: >
4723
4724 :if 1
4725 : echo "Expression evaluation is compiled in"
4726 :else
4727 : echo "You will _never_ see this message"
4728 :endif
4729
Bram Moolenaar773a97c2019-06-06 20:39:55 +02004730To execute a command only when the |+eval| feature is disabled can be done in
4731two ways. The simplest is to exit the script (or Vim) prematurely: >
4732 if 1
4733 echo "commands executed with +eval"
4734 finish
4735 endif
4736 args " command executed without +eval
4737
4738If you do not want to abort loading the script you can use a trick, as this
4739example shows: >
Bram Moolenaar45d2cca2017-04-30 16:36:05 +02004740
4741 silent! while 0
4742 set history=111
4743 silent! endwhile
4744
4745When the |+eval| feature is available the command is skipped because of the
4746"while 0". Without the |+eval| feature the "while 0" is an error, which is
4747silently ignored, and the command is executed.
Bram Moolenaarcd5c8f82017-04-09 20:11:58 +02004748
Bram Moolenaar071d4272004-06-13 20:20:40 +00004749==============================================================================
Bram Moolenaar2f0936c2022-01-08 21:51:59 +0000475012. The sandbox *eval-sandbox* *sandbox*
Bram Moolenaar071d4272004-06-13 20:20:40 +00004751
Bram Moolenaar368373e2010-07-19 20:46:22 +02004752The 'foldexpr', 'formatexpr', 'includeexpr', 'indentexpr', 'statusline' and
4753'foldtext' options may be evaluated in a sandbox. This means that you are
4754protected from these expressions having nasty side effects. This gives some
4755safety for when these options are set from a modeline. It is also used when
4756the command from a tags file is executed and for CTRL-R = in the command line.
Bram Moolenaar7b0294c2004-10-11 10:16:09 +00004757The sandbox is also used for the |:sandbox| command.
Bram Moolenaar2f0936c2022-01-08 21:51:59 +00004758 *E48*
Bram Moolenaar071d4272004-06-13 20:20:40 +00004759These items are not allowed in the sandbox:
4760 - changing the buffer text
Bram Moolenaarb477af22018-07-15 20:20:18 +02004761 - defining or changing mapping, autocommands, user commands
Bram Moolenaar071d4272004-06-13 20:20:40 +00004762 - setting certain options (see |option-summary|)
Bram Moolenaaref2f6562007-05-06 13:32:59 +00004763 - setting certain v: variables (see |v:var|) *E794*
Bram Moolenaar071d4272004-06-13 20:20:40 +00004764 - executing a shell command
4765 - reading or writing a file
4766 - jumping to another buffer or editing a file
Bram Moolenaar4770d092006-01-12 23:22:24 +00004767 - executing Python, Perl, etc. commands
Bram Moolenaar7b0294c2004-10-11 10:16:09 +00004768This is not guaranteed 100% secure, but it should block most attacks.
4769
4770 *:san* *:sandbox*
Bram Moolenaar045e82d2005-07-08 22:25:33 +00004771:san[dbox] {cmd} Execute {cmd} in the sandbox. Useful to evaluate an
Bram Moolenaar7b0294c2004-10-11 10:16:09 +00004772 option that may have been set from a modeline, e.g.
4773 'foldexpr'.
4774
Bram Moolenaarb71eaae2006-01-20 23:10:18 +00004775 *sandbox-option*
4776A few options contain an expression. When this expression is evaluated it may
Bram Moolenaar9b2200a2006-03-20 21:55:45 +00004777have to be done in the sandbox to avoid a security risk. But the sandbox is
Bram Moolenaarb71eaae2006-01-20 23:10:18 +00004778restrictive, thus this only happens when the option was set from an insecure
4779location. Insecure in this context are:
Bram Moolenaar551dbcc2006-04-25 22:13:59 +00004780- sourcing a .vimrc or .exrc in the current directory
Bram Moolenaarb71eaae2006-01-20 23:10:18 +00004781- while executing in the sandbox
4782- value coming from a modeline
Bram Moolenaarb477af22018-07-15 20:20:18 +02004783- executing a function that was defined in the sandbox
Bram Moolenaarb71eaae2006-01-20 23:10:18 +00004784
4785Note that when in the sandbox and saving an option value and restoring it, the
4786option will still be marked as it was set in the sandbox.
4787
4788==============================================================================
Bram Moolenaar558ca4a2019-04-04 18:15:38 +0200478913. Textlock *textlock*
Bram Moolenaarb71eaae2006-01-20 23:10:18 +00004790
4791In a few situations it is not allowed to change the text in the buffer, jump
4792to another window and some other things that might confuse or break what Vim
4793is currently doing. This mostly applies to things that happen when Vim is
Bram Moolenaar58b85342016-08-14 19:54:54 +02004794actually doing something else. For example, evaluating the 'balloonexpr' may
Bram Moolenaarb71eaae2006-01-20 23:10:18 +00004795happen any moment the mouse cursor is resting at some position.
4796
4797This is not allowed when the textlock is active:
4798 - changing the buffer text
4799 - jumping to another buffer or window
4800 - editing another file
4801 - closing a window or quitting Vim
4802 - etc.
4803
Bram Moolenaar071d4272004-06-13 20:20:40 +00004804
Bram Moolenaar91f84f62018-07-29 15:07:52 +02004805 vim:tw=78:ts=8:noet:ft=help:norl: