blob: 214b8c70ed38df8a87cb172eecb0c4a5170bbd16 [file] [log] [blame]
Bram Moolenaarcfa8f9a2022-06-03 21:59:47 +01001*usr_41.txt* For Vim version 8.2. Last change: 2022 Jun 03
Bram Moolenaar071d4272004-06-13 20:20:40 +00002
3 VIM USER MANUAL - by Bram Moolenaar
4
5 Write a Vim script
6
7
8The Vim script language is used for the startup vimrc file, syntax files, and
9many other things. This chapter explains the items that can be used in a Vim
Bram Moolenaarcfa8f9a2022-06-03 21:59:47 +010010script. There are a lot of them, therefore this is a long chapter.
Bram Moolenaar071d4272004-06-13 20:20:40 +000011
12|41.1| Introduction
13|41.2| Variables
14|41.3| Expressions
15|41.4| Conditionals
16|41.5| Executing an expression
17|41.6| Using functions
18|41.7| Defining a function
Bram Moolenaar7c626922005-02-07 22:01:03 +000019|41.8| Lists and Dictionaries
20|41.9| Exceptions
21|41.10| Various remarks
Bram Moolenaar071d4272004-06-13 20:20:40 +000022
23 Next chapter: |usr_42.txt| Add new menus
24 Previous chapter: |usr_40.txt| Make new commands
25Table of contents: |usr_toc.txt|
26
27==============================================================================
Bram Moolenaar9d75c832005-01-25 21:57:23 +000028*41.1* Introduction *vim-script-intro* *script*
Bram Moolenaar071d4272004-06-13 20:20:40 +000029
30Your first experience with Vim scripts is the vimrc file. Vim reads it when
Bram Moolenaarcfa8f9a2022-06-03 21:59:47 +010031it starts up and executes the commands. You can set options to the values you
32prefer, define mappings, select plugins and much more. You can use any colon
33command in it (commands that start with a ":"; these are sometimes referred to
34as Ex commands or command-line commands).
Bram Moolenaar04fb9162021-12-30 20:24:12 +000035
36Syntax files are also Vim scripts. As are files that set options for a
Bram Moolenaar071d4272004-06-13 20:20:40 +000037specific file type. A complicated macro can be defined by a separate Vim
38script file. You can think of other uses yourself.
39
Bram Moolenaar04fb9162021-12-30 20:24:12 +000040Vim script comes in two flavors: legacy and |Vim9|. Since this help file is
41for new users, we'll teach you the newer and more convenient |Vim9| syntax.
Bram Moolenaarcfa8f9a2022-06-03 21:59:47 +010042While legacy script is particularly for Vim, |Vim9| script looks more like
43other languages, such as JavaScript and TypeScript.
Bram Moolenaar04fb9162021-12-30 20:24:12 +000044
45To try out Vim script the best way is to edit a script file and source it.
46Basically: >
47 :edit test.vim
48 [insert the script lines you want]
49 :w
50 :source %
51
Bram Moolenaar071d4272004-06-13 20:20:40 +000052Let's start with a simple example: >
53
Bram Moolenaar04fb9162021-12-30 20:24:12 +000054 vim9script
55 var i = 1
56 while i < 5
57 echo "count is" i
58 i += 1
59 endwhile
Bram Moolenaar071d4272004-06-13 20:20:40 +000060<
Bram Moolenaar7c626922005-02-07 22:01:03 +000061The output of the example code is:
62
63 count is 1 ~
64 count is 2 ~
65 count is 3 ~
66 count is 4 ~
67
Bram Moolenaar04fb9162021-12-30 20:24:12 +000068In the first line the `vim9script` command makes clear this is a new, |Vim9|
69script file. That matters for how the rest of the file is used.
Bram Moolenaarcfa8f9a2022-06-03 21:59:47 +010070 *vim9-declarations*
Bram Moolenaar04fb9162021-12-30 20:24:12 +000071The `var i = 1` command declares the "i" variable and initializes it. The
Bram Moolenaar7c626922005-02-07 22:01:03 +000072generic form is: >
Bram Moolenaar071d4272004-06-13 20:20:40 +000073
Bram Moolenaar04fb9162021-12-30 20:24:12 +000074 var {name} = {expression}
Bram Moolenaar071d4272004-06-13 20:20:40 +000075
76In this case the variable name is "i" and the expression is a simple value,
77the number one.
Bram Moolenaar071d4272004-06-13 20:20:40 +000078
Bram Moolenaar04fb9162021-12-30 20:24:12 +000079The `while` command starts a loop. The generic form is: >
Bram Moolenaar071d4272004-06-13 20:20:40 +000080
Bram Moolenaar04fb9162021-12-30 20:24:12 +000081 while {condition}
82 {statements}
83 endwhile
84
85The statements until the matching `endwhile` are executed for as long as the
Bram Moolenaar071d4272004-06-13 20:20:40 +000086condition is true. The condition used here is the expression "i < 5". This
87is true when the variable i is smaller than five.
Bram Moolenaar071d4272004-06-13 20:20:40 +000088 Note:
89 If you happen to write a while loop that keeps on running, you can
90 interrupt it by pressing CTRL-C (CTRL-Break on MS-Windows).
91
Bram Moolenaar04fb9162021-12-30 20:24:12 +000092The `echo` command prints its arguments. In this case the string "count is"
Bram Moolenaar7c626922005-02-07 22:01:03 +000093and the value of the variable i. Since i is one, this will print:
94
95 count is 1 ~
96
Bram Moolenaar04fb9162021-12-30 20:24:12 +000097Then there is the `i += 1` command. This does the same thing as "i = i + 1",
98it adds one to the variable i and assigns the new value to the same variable.
Bram Moolenaar7c626922005-02-07 22:01:03 +000099
100The example was given to explain the commands, but would you really want to
Bram Moolenaar214641f2017-03-05 17:04:09 +0100101make such a loop, it can be written much more compact: >
Bram Moolenaaraf7f6412005-01-17 22:11:23 +0000102
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000103 for i in range(1, 4)
Bram Moolenaarcfa8f9a2022-06-03 21:59:47 +0100104 echo $"count is {i}"
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000105 endfor
Bram Moolenaaraf7f6412005-01-17 22:11:23 +0000106
Bram Moolenaarcfa8f9a2022-06-03 21:59:47 +0100107We won't explain how `for`, `range()`and `$"string"` work until later. Follow
108the links if you are impatient.
109
110
111TRYING OUT EXAMPLES
112
113You can easily try out most examples in these help files without saving the
114commands in a file. For example, to try out the "for" loop above do this:
1151. position the cursor on the "for"
1162. start Visual mode with "v"
1173. move down to the "endfor"
1184. press colon, then "so" and Enter
119
120After pressing colon you will see ":'<,'>", which is the range of the Visually
121selected text.
122
123For some commands it matters they are executed as in |Vim9| script. But typed
124commands normally use legacy script syntax, such as the example below that
125causes the E1004 error. For that use this fourth step:
1264. press colon, then "vim9 so" and Enter
127
128"vim9" is short for `vim9cmd`, which is a command modifier to execute the
129following command in |Vim9| syntax.
130
131Note that this won't work for examples that require a script context.
Bram Moolenaaraf7f6412005-01-17 22:11:23 +0000132
Bram Moolenaar071d4272004-06-13 20:20:40 +0000133
Bram Moolenaar7dd64a32019-05-31 21:41:05 +0200134FOUR KINDS OF NUMBERS
Bram Moolenaar071d4272004-06-13 20:20:40 +0000135
Bram Moolenaarcfa8f9a2022-06-03 21:59:47 +0100136Numbers can be decimal, hexadecimal, octal and binary.
Bram Moolenaar11e3c5b2021-04-21 18:09:37 +0200137
138A hexadecimal number starts with "0x" or "0X". For example "0x1f" is decimal
Bram Moolenaarcfa8f9a2022-06-03 21:59:47 +010013931 and 0x1234 is decimal 4660.
Bram Moolenaar11e3c5b2021-04-21 18:09:37 +0200140
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000141An octal number starts with "0o", "0O". "0o17" is decimal 15.
Bram Moolenaar11e3c5b2021-04-21 18:09:37 +0200142
143A binary number starts with "0b" or "0B". For example "0b101" is decimal 5.
144
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000145A decimal number is just digits. Careful: In legacy script don't put a zero
Bram Moolenaarcfa8f9a2022-06-03 21:59:47 +0100146before a decimal number, it will be interpreted as an octal number! That's
147one reason to use |Vim9| script.
Bram Moolenaar11e3c5b2021-04-21 18:09:37 +0200148
Bram Moolenaarcfa8f9a2022-06-03 21:59:47 +0100149The `echo` command evaluates its argument and when it is a number always
150prints the decimal form. Example: >
Bram Moolenaar071d4272004-06-13 20:20:40 +0000151
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000152 echo 0x7f 0o36
Bram Moolenaar071d4272004-06-13 20:20:40 +0000153< 127 30 ~
154
Bram Moolenaar7dd64a32019-05-31 21:41:05 +0200155A number is made negative with a minus sign. This also works for hexadecimal,
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000156octal and binary numbers: >
Bram Moolenaar071d4272004-06-13 20:20:40 +0000157
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000158 echo -0x7f
159< -127 ~
Bram Moolenaar071d4272004-06-13 20:20:40 +0000160
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000161A minus sign is also used for subtraction. This can sometimes lead to
162confusion. If we put a minus sign before both numbers we get an error: >
Bram Moolenaar071d4272004-06-13 20:20:40 +0000163
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000164 echo -0x7f -0o36
165< E1004: White space required before and after '-' at "-0o36" ~
166
167Note: if you are not using a |Vim9| script to try out these commands but type
168them directly, they will be executed as legacy script. Then the echo command
169sees the second minus sign as subtraction. To get the error, prefix the
170command with `vim9cmd`: >
171
172 vim9cmd echo -0x7f -0o36
173< E1004: White space required before and after '-' at "-0o36" ~
174
175White space in an expression is often required to make sure it is easy to read
176and avoid errors. Such as thinking that the "-0o36" above makes the number
177negative, while it is actually seen as a subtraction.
178
179To actually have the minus sign be used for negation, you can put the second
Bram Moolenaar944697a2022-02-20 19:48:20 +0000180expression in parentheses: >
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000181
182 echo -0x7f (-0o36)
Bram Moolenaarcfa8f9a2022-06-03 21:59:47 +0100183< -127 -30 ~
Bram Moolenaar071d4272004-06-13 20:20:40 +0000184
185==============================================================================
186*41.2* Variables
187
188A variable name consists of ASCII letters, digits and the underscore. It
189cannot start with a digit. Valid variable names are:
190
191 counter
192 _aap3
193 very_long_variable_name_with_underscores
Bram Moolenaarcfa8f9a2022-06-03 21:59:47 +0100194 CamelCaseName
Bram Moolenaar071d4272004-06-13 20:20:40 +0000195 LENGTH
196
197Invalid names are "foo+bar" and "6var".
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000198
199Some variables are global. To see a list of currently defined global
200variables type this command: >
Bram Moolenaar071d4272004-06-13 20:20:40 +0000201
202 :let
203
Bram Moolenaarcfa8f9a2022-06-03 21:59:47 +0100204You can use global variables everywhere. However, it is too easy to use the
205same name in two unrelated scripts. Therefore variables declared in a script
206are local to that script. For example, if you have this in "script1.vim": >
Bram Moolenaar071d4272004-06-13 20:20:40 +0000207
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000208 vim9script
209 var counter = 5
210 echo counter
211< 5 ~
Bram Moolenaar071d4272004-06-13 20:20:40 +0000212
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000213And you try to use the variable in "script2.vim": >
214
215 vim9script
216 echo counter
217< E121: Undefined variable: counter ~
218
219Using a script-local variable means you can be sure that it is only changed in
220that script and not elsewhere.
221
222If you do want to share variables between scripts, use the "g:" prefix and
Bram Moolenaarcfa8f9a2022-06-03 21:59:47 +0100223assign the value directly, do not use `var`. And use a specific name to avoid
224mistakes. Thus in "script1.vim": >
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000225
226 vim9script
Bram Moolenaarcfa8f9a2022-06-03 21:59:47 +0100227 g:mash_counter = 5
228 echo g:mash_counter
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000229< 5 ~
230
231And then in "script2.vim": >
232
233 vim9script
Bram Moolenaarcfa8f9a2022-06-03 21:59:47 +0100234 echo g:mash_counter
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000235< 5 ~
236
Bram Moolenaarcfa8f9a2022-06-03 21:59:47 +0100237Global variables can also be accessed on the command line, E.g. typing this: >
238 echo g:mash_counter
239That will not work for a script-local variable.
240
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000241More about script-local variables here: |script-variable|.
Bram Moolenaar071d4272004-06-13 20:20:40 +0000242
243There are more kinds of variables, see |internal-variables|. The most often
244used ones are:
245
246 b:name variable local to a buffer
247 w:name variable local to a window
248 g:name global variable (also in a function)
249 v:name variable predefined by Vim
250
251
252DELETING VARIABLES
253
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000254Variables take up memory and show up in the output of the `let` command. To
255delete a global variable use the `unlet` command. Example: >
Bram Moolenaar071d4272004-06-13 20:20:40 +0000256
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000257 unlet g:counter
Bram Moolenaar071d4272004-06-13 20:20:40 +0000258
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000259This deletes the global variable "g:counter" to free up the memory it uses.
260If you are not sure if the variable exists, and don't want an error message
261when it doesn't, append !: >
Bram Moolenaar071d4272004-06-13 20:20:40 +0000262
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000263 unlet! g:counter
Bram Moolenaar071d4272004-06-13 20:20:40 +0000264
Bram Moolenaarcfa8f9a2022-06-03 21:59:47 +0100265You cannot `unlet` script-local variables in |Vim9| script, only in legacy
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000266script.
Bram Moolenaar071d4272004-06-13 20:20:40 +0000267
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000268When a script finishes, the local variables declared there will not be
269deleted. Functions defined in the script can use them. Example:
270>
271 vim9script
272 var counter = 0
273 def g:GetCount(): number
274 s:counter += 1
275 return s:counter
276 enddef
Bram Moolenaar071d4272004-06-13 20:20:40 +0000277
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000278Every time you call the function it will return the next count: >
279 :echo g:GetCount()
280< 1 ~
281>
282 :echo g:GetCount()
283< 2 ~
Bram Moolenaar071d4272004-06-13 20:20:40 +0000284
Bram Moolenaarcfa8f9a2022-06-03 21:59:47 +0100285If you are worried a script-local variable is consuming too much memory, set
286it to an empty or null value after you no longer need it. Example: >
287 var lines = readfile(...)
288 ...
289 lines = []
Bram Moolenaar071d4272004-06-13 20:20:40 +0000290
Bram Moolenaarcfa8f9a2022-06-03 21:59:47 +0100291Note: below we'll leave out the `vim9script` line from examples, so we can
292concentrate on the relevant commands, but you'll still need to put it at the
293top of your script file.
Bram Moolenaar071d4272004-06-13 20:20:40 +0000294
295
296STRING VARIABLES AND CONSTANTS
297
298So far only numbers were used for the variable value. Strings can be used as
Bram Moolenaar7c626922005-02-07 22:01:03 +0000299well. Numbers and strings are the basic types of variables that Vim supports.
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000300Example: >
Bram Moolenaar071d4272004-06-13 20:20:40 +0000301
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000302 var name = "Peter"
303 echo name
Bram Moolenaar2f0936c2022-01-08 21:51:59 +0000304< Peter ~
Bram Moolenaar071d4272004-06-13 20:20:40 +0000305
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000306Every variable has a type. Very often, as in this example, the type is
307defined by assigning a value. This is called type inference. If you do not
308want to give the variable a value yet, you need to specify the type: >
Bram Moolenaar071d4272004-06-13 20:20:40 +0000309
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000310 var name: string
311 var age: number
Bram Moolenaarcfa8f9a2022-06-03 21:59:47 +0100312 if male
313 name = "Peter"
314 age = 42
315 else
316 name = "Elisa"
317 age = 45
318 endif
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000319
320If you make a mistake and try to assign the wrong type of value you'll get an
321error: >
322
323 age = "Peter"
324< E1012: Type mismatch; expected number but got string ~
325
326More about types in |41.8|.
327
Bram Moolenaarcfa8f9a2022-06-03 21:59:47 +0100328To assign a string value to a variable, you can use a string constant. There
329are two types of these. First the string in double quotes, as we used
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000330already. If you want to include a double quote inside the string, put a
331backslash in front of it: >
332
333 var name = "he is \"Peter\""
334 echo name
335< he is "Peter" ~
Bram Moolenaar071d4272004-06-13 20:20:40 +0000336
Bram Moolenaarcfa8f9a2022-06-03 21:59:47 +0100337To avoid the need for backslashes, you can use a string in single quotes: >
Bram Moolenaar071d4272004-06-13 20:20:40 +0000338
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000339 var name = 'he is "Peter"'
340 echo name
341< he is "Peter" ~
Bram Moolenaar071d4272004-06-13 20:20:40 +0000342
Bram Moolenaar7c626922005-02-07 22:01:03 +0000343Inside a single-quote string all the characters are as they are. Only the
344single quote itself is special: you need to use two to get one. A backslash
345is taken literally, thus you can't use it to change the meaning of the
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000346character after it: >
347
348 var name = 'P\e''ter'''
349 echo name
350< P\e'ter' ~
351
352In double-quote strings it is possible to use special characters. Here are a
353few useful ones:
Bram Moolenaar071d4272004-06-13 20:20:40 +0000354
355 \t <Tab>
356 \n <NL>, line break
357 \r <CR>, <Enter>
358 \e <Esc>
359 \b <BS>, backspace
360 \" "
361 \\ \, backslash
362 \<Esc> <Esc>
363 \<C-W> CTRL-W
364
365The last two are just examples. The "\<name>" form can be used to include
366the special key "name".
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000367
368See |expr-quote| for the full list of special items in a string.
Bram Moolenaar071d4272004-06-13 20:20:40 +0000369
370==============================================================================
371*41.3* Expressions
372
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000373Vim has a fairly standard way to handle expressions. You can read the
Bram Moolenaar071d4272004-06-13 20:20:40 +0000374definition here: |expression-syntax|. Here we will show the most common
375items.
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000376
377The numbers, strings and variables mentioned above are expressions by
Bram Moolenaar071d4272004-06-13 20:20:40 +0000378themselves. Thus everywhere an expression is expected, you can use a number,
379string or variable. Other basic items in an expression are:
380
381 $NAME environment variable
Bram Moolenaarcfa8f9a2022-06-03 21:59:47 +0100382 &name option value
383 @r register contents
Bram Moolenaar071d4272004-06-13 20:20:40 +0000384
385Examples: >
386
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000387 echo "The value of 'tabstop' is" &ts
388 echo "Your home directory is" $HOME
389 if @a == 'text'
Bram Moolenaar071d4272004-06-13 20:20:40 +0000390
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000391The &name form can also be used to set an option value, do something and
392restore the old value. Example: >
Bram Moolenaar071d4272004-06-13 20:20:40 +0000393
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000394 var save_ic = &ic
395 set noic
396 s/The Start/The Beginning/
397 &ic = save_ic
Bram Moolenaar071d4272004-06-13 20:20:40 +0000398
399This makes sure the "The Start" pattern is used with the 'ignorecase' option
Bram Moolenaar7c626922005-02-07 22:01:03 +0000400off. Still, it keeps the value that the user had set. (Another way to do
401this would be to add "\C" to the pattern, see |/\C|.)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000402
403
404MATHEMATICS
405
406It becomes more interesting if we combine these basic items. Let's start with
407mathematics on numbers:
408
409 a + b add
410 a - b subtract
411 a * b multiply
412 a / b divide
413 a % b modulo
414
415The usual precedence is used. Example: >
416
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000417 echo 10 + 5 * 2
Bram Moolenaar071d4272004-06-13 20:20:40 +0000418< 20 ~
419
Bram Moolenaar00654022011-02-25 14:42:19 +0100420Grouping is done with parentheses. No surprises here. Example: >
Bram Moolenaar071d4272004-06-13 20:20:40 +0000421
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000422 echo (10 + 5) * 2
Bram Moolenaar071d4272004-06-13 20:20:40 +0000423< 30 ~
424
Bram Moolenaarcfa8f9a2022-06-03 21:59:47 +0100425
426OTHERS
427
Bram Moolenaar1c6737b2020-09-07 22:18:52 +0200428Strings can be concatenated with ".." (see |expr6|). Example: >
Bram Moolenaar071d4272004-06-13 20:20:40 +0000429
Bram Moolenaarcfa8f9a2022-06-03 21:59:47 +0100430 echo "Name: " .. name
431 Name: Peter
Bram Moolenaar071d4272004-06-13 20:20:40 +0000432
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000433When the "echo" command gets multiple arguments, it separates them with a
Bram Moolenaar071d4272004-06-13 20:20:40 +0000434space. In the example the argument is a single expression, thus no space is
435inserted.
436
Bram Moolenaarcfa8f9a2022-06-03 21:59:47 +0100437If you don't like the concatenation you can use the $"string" form, which
438accepts an expression in curly braces: >
439 echo $"Name: {name}"
440
441See |interp-string| for more information.
442
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000443Borrowed from the C language is the conditional expression: >
Bram Moolenaar071d4272004-06-13 20:20:40 +0000444
445 a ? b : c
446
447If "a" evaluates to true "b" is used, otherwise "c" is used. Example: >
448
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000449 var nr = 4
450 echo nr > 5 ? "nr is big" : "nr is small"
451< nr is small ~
Bram Moolenaar071d4272004-06-13 20:20:40 +0000452
453The three parts of the constructs are always evaluated first, thus you could
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000454see it works as: >
Bram Moolenaar071d4272004-06-13 20:20:40 +0000455
456 (a) ? (b) : (c)
457
Bram Moolenaarcfa8f9a2022-06-03 21:59:47 +0100458There is also the falsy operator: >
459 echo name ?? "No name given"
460See |??|.
461
Bram Moolenaar071d4272004-06-13 20:20:40 +0000462==============================================================================
463*41.4* Conditionals
464
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000465The `if` commands executes the following statements, until the matching
466`endif`, only when a condition is met. The generic form is:
Bram Moolenaar071d4272004-06-13 20:20:40 +0000467
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000468 if {condition}
Bram Moolenaar071d4272004-06-13 20:20:40 +0000469 {statements}
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000470 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000471
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000472Only when the expression {condition} evaluates to true or one will the
473{statements} be executed. If they are not executed they must still be valid
474commands. If they contain garbage, Vim won't be able to find the matching
475`endif`.
Bram Moolenaar071d4272004-06-13 20:20:40 +0000476
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000477You can also use `else`. The generic form for this is:
478
479 if {condition}
Bram Moolenaar071d4272004-06-13 20:20:40 +0000480 {statements}
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000481 else
Bram Moolenaar071d4272004-06-13 20:20:40 +0000482 {statements}
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000483 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000484
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000485The second {statements} block is only executed if the first one isn't.
Bram Moolenaar071d4272004-06-13 20:20:40 +0000486
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000487Finally, there is `elseif`
488
489 if {condition}
Bram Moolenaar071d4272004-06-13 20:20:40 +0000490 {statements}
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000491 elseif {condition}
Bram Moolenaar071d4272004-06-13 20:20:40 +0000492 {statements}
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000493 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000494
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000495This works just like using `else` and then `if`, but without the need for an
496extra `endif`.
Bram Moolenaar071d4272004-06-13 20:20:40 +0000497
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000498A useful example for your vimrc file is checking the 'term' option and doing
499something depending upon its value: >
500
501 if &term == "xterm"
502 # Do stuff for xterm
503 elseif &term == "vt100"
504 # Do stuff for a vt100 terminal
505 else
506 # Do something for other terminals
507 endif
508
509This uses "#" to start a comment, more about that later.
Bram Moolenaar071d4272004-06-13 20:20:40 +0000510
511
512LOGIC OPERATIONS
513
514We already used some of them in the examples. These are the most often used
515ones:
516
517 a == b equal to
518 a != b not equal to
519 a > b greater than
520 a >= b greater than or equal to
521 a < b less than
522 a <= b less than or equal to
523
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000524The result is true if the condition is met and false otherwise. An example: >
Bram Moolenaar071d4272004-06-13 20:20:40 +0000525
Bram Moolenaarcfa8f9a2022-06-03 21:59:47 +0100526 if v:version >= 800
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000527 echo "congratulations"
528 else
529 echo "you are using an old version, upgrade!"
530 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000531
532Here "v:version" is a variable defined by Vim, which has the value of the Vim
Bram Moolenaarcfa8f9a2022-06-03 21:59:47 +0100533version. 800 is for version 8.0, version 8.1 has the value 801. This is
534useful to write a script that works with multiple versions of Vim.
535See |v:version|. You can also check for a specific feature with `has()` or a
536specific patch, see |has-patch|.
Bram Moolenaar071d4272004-06-13 20:20:40 +0000537
538The logic operators work both for numbers and strings. When comparing two
539strings, the mathematical difference is used. This compares byte values,
540which may not be right for some languages.
Bram Moolenaar071d4272004-06-13 20:20:40 +0000541
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000542If you try to compare a string with a number you will get an error.
Bram Moolenaar071d4272004-06-13 20:20:40 +0000543
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000544For strings there are two more useful items:
Bram Moolenaar071d4272004-06-13 20:20:40 +0000545
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000546 str =~ pat matches with
547 str !~ pat does not match with
Bram Moolenaar071d4272004-06-13 20:20:40 +0000548
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000549The left item "str" is used as a string. The right item "pat" is used as a
Bram Moolenaar071d4272004-06-13 20:20:40 +0000550pattern, like what's used for searching. Example: >
551
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000552 if str =~ " "
553 echo "str contains a space"
554 endif
555 if str !~ '\.$'
556 echo "str does not end in a full stop"
557 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000558
559Notice the use of a single-quote string for the pattern. This is useful,
Bram Moolenaarcfa8f9a2022-06-03 21:59:47 +0100560because patterns tend to contain many backslashes and backslashes need to be
561doubled in a double-quote string.
Bram Moolenaar071d4272004-06-13 20:20:40 +0000562
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000563The match is not anchored, if you want to match the whole string start with
564"^" and end with "$".
565
566The 'ignorecase' option is not used when comparing strings. When you do want
567to ignore case append "?". Thus "==?" compares two strings to be equal while
568ignoring case. For the full table see |expr-==|.
Bram Moolenaar071d4272004-06-13 20:20:40 +0000569
570
571MORE LOOPING
572
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000573The `while` command was already mentioned. Two more statements can be used in
574between the `while` and the `endwhile`:
Bram Moolenaar071d4272004-06-13 20:20:40 +0000575
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000576 continue Jump back to the start of the while loop; the
Bram Moolenaar071d4272004-06-13 20:20:40 +0000577 loop continues.
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000578 break Jump forward to the `endwhile`; the loop is
Bram Moolenaar071d4272004-06-13 20:20:40 +0000579 discontinued.
580
581Example: >
582
Bram Moolenaar2f0936c2022-01-08 21:51:59 +0000583 var counter = 1
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000584 while counter < 40
Bram Moolenaar2f0936c2022-01-08 21:51:59 +0000585 if skip_number(counter)
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000586 continue
587 endif
Bram Moolenaar2f0936c2022-01-08 21:51:59 +0000588 if last_number(counter)
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000589 break
590 endif
591 sleep 50m
Bram Moolenaar2f0936c2022-01-08 21:51:59 +0000592 ++counter
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000593 endwhile
Bram Moolenaar071d4272004-06-13 20:20:40 +0000594
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000595The `sleep` command makes Vim take a nap. The "50m" specifies fifty
596milliseconds. Another example is `sleep 4`, which sleeps for four seconds.
Bram Moolenaar071d4272004-06-13 20:20:40 +0000597
Bram Moolenaarcfa8f9a2022-06-03 21:59:47 +0100598`continue` and `break` can also be used in between `for` and `endfor`.
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000599Even more looping can be done with the `for` command, see below in |41.8|.
Bram Moolenaar7c626922005-02-07 22:01:03 +0000600
Bram Moolenaar071d4272004-06-13 20:20:40 +0000601==============================================================================
602*41.5* Executing an expression
603
604So far the commands in the script were executed by Vim directly. The
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000605`execute` command allows executing the result of an expression. This is a
Bram Moolenaar071d4272004-06-13 20:20:40 +0000606very powerful way to build commands and execute them.
Bram Moolenaar071d4272004-06-13 20:20:40 +0000607
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000608An example is to jump to a tag, which is contained in a variable: >
609
610 execute "tag " .. tag_name
Bram Moolenaar071d4272004-06-13 20:20:40 +0000611
Bram Moolenaar1c6737b2020-09-07 22:18:52 +0200612The ".." is used to concatenate the string "tag " with the value of variable
Bram Moolenaar071d4272004-06-13 20:20:40 +0000613"tag_name". Suppose "tag_name" has the value "get_cmd", then the command that
614will be executed is: >
615
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000616 tag get_cmd
Bram Moolenaar071d4272004-06-13 20:20:40 +0000617
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000618The `execute` command can only execute Ex commands. The `normal` command
Bram Moolenaar071d4272004-06-13 20:20:40 +0000619executes Normal mode commands. However, its argument is not an expression but
620the literal command characters. Example: >
621
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000622 normal gg=G
Bram Moolenaar071d4272004-06-13 20:20:40 +0000623
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000624This jumps to the first line with "gg" and formats all lines with the "="
625operator and the "G" movement.
626
627To make `normal` work with an expression, combine `execute` with it.
Bram Moolenaar071d4272004-06-13 20:20:40 +0000628Example: >
629
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000630 execute "normal " .. count .. "j"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000631
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000632This will move the cursor "count" lines down.
633
634Make sure that the argument for `normal` is a complete command. Otherwise
Bram Moolenaarcfa8f9a2022-06-03 21:59:47 +0100635Vim will run into the end of the argument and silently abort the command. For
636example, if you start the delete operator, you must give the movement command
637also. This works: >
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000638
639 normal d$
Bram Moolenaar071d4272004-06-13 20:20:40 +0000640
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000641This does nothing: >
Bram Moolenaar071d4272004-06-13 20:20:40 +0000642
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000643 normal d
644
645If you start Insert mode and do not end it with Esc, it will end anyway. This
646works to insert "new text": >
647
648 execute "normal inew text"
649
650If you want to do something after inserting text you do need to end Insert
651mode: >
652
653 execute "normal inew text\<Esc>b"
654
655This inserts "new text" and puts the cursor on the first letter of "text".
656Notice the use of the special key "\<Esc>". This avoids having to enter a
657real <Esc> character in your script. That is where `execute` with a
658double-quote string comes in handy.
Bram Moolenaar071d4272004-06-13 20:20:40 +0000659
Bram Moolenaarcfa8f9a2022-06-03 21:59:47 +0100660If you don't want to execute a string as a command but evaluate it to get the
661result of the expression, you can use the eval() function: >
Bram Moolenaar7c626922005-02-07 22:01:03 +0000662
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000663 var optname = "path"
664 var optvalue = eval('&' .. optname)
Bram Moolenaar7c626922005-02-07 22:01:03 +0000665
666A "&" character is prepended to "path", thus the argument to eval() is
667"&path". The result will then be the value of the 'path' option.
Bram Moolenaar7c626922005-02-07 22:01:03 +0000668
Bram Moolenaar071d4272004-06-13 20:20:40 +0000669==============================================================================
670*41.6* Using functions
671
672Vim defines many functions and provides a large amount of functionality that
673way. A few examples will be given in this section. You can find the whole
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000674list below: |function-list|.
Bram Moolenaar071d4272004-06-13 20:20:40 +0000675
Bram Moolenaarcfa8f9a2022-06-03 21:59:47 +0100676A function is called with the parameters in between parentheses, separated by
677commas. Example: >
Bram Moolenaar071d4272004-06-13 20:20:40 +0000678
Bram Moolenaarcfa8f9a2022-06-03 21:59:47 +0100679 search("Date: ", "W")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000680
681This calls the search() function, with arguments "Date: " and "W". The
682search() function uses its first argument as a search pattern and the second
683one as flags. The "W" flag means the search doesn't wrap around the end of
684the file.
685
Bram Moolenaarcfa8f9a2022-06-03 21:59:47 +0100686Using the `call` command is optional in |Vim9| script. This works the same
687way and also works in legacy script and on the command line: >
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000688
Bram Moolenaarcfa8f9a2022-06-03 21:59:47 +0100689 call search("Date: ", "W")
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000690
Bram Moolenaar071d4272004-06-13 20:20:40 +0000691A function can be called in an expression. Example: >
692
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000693 var line = getline(".")
694 var repl = substitute(line, '\a', "*", "g")
695 setline(".", repl)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000696
Bram Moolenaar7c626922005-02-07 22:01:03 +0000697The getline() function obtains a line from the current buffer. Its argument
698is a specification of the line number. In this case "." is used, which means
699the line where the cursor is.
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000700
Bram Moolenaarcfa8f9a2022-06-03 21:59:47 +0100701The substitute() function does something similar to the `:substitute` command.
702The first argument "line" is the string on which to perform the substitution.
703The second argument '\a' is the pattern, the third "*" is the replacement
704string. Finally, the last argument "g" is the flags.
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000705
706The setline() function sets the line, specified by the first argument, to a
Bram Moolenaar071d4272004-06-13 20:20:40 +0000707new string, the second argument. In this example the line under the cursor is
708replaced with the result of the substitute(). Thus the effect of the three
709statements is equal to: >
710
711 :substitute/\a/*/g
712
713Using the functions becomes more interesting when you do more work before and
714after the substitute() call.
715
716
717FUNCTIONS *function-list*
718
719There are many functions. We will mention them here, grouped by what they are
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000720used for. You can find an alphabetical list here: |builtin-function-list|.
721Use CTRL-] on the function name to jump to detailed help on it.
Bram Moolenaar071d4272004-06-13 20:20:40 +0000722
Bram Moolenaara3f41662010-07-11 19:01:06 +0200723String manipulation: *string-functions*
Bram Moolenaar9d401282019-04-06 13:18:12 +0200724 nr2char() get a character by its number value
725 list2str() get a character string from a list of numbers
726 char2nr() get number value of a character
727 str2list() get list of numbers from a string
Bram Moolenaar3577c6f2008-06-24 21:16:56 +0000728 str2nr() convert a string to a Number
729 str2float() convert a string to a Float
Bram Moolenaarc6fe9192006-04-09 21:54:49 +0000730 printf() format a string according to % items
Bram Moolenaar071d4272004-06-13 20:20:40 +0000731 escape() escape characters in a string with a '\'
Bram Moolenaar3577c6f2008-06-24 21:16:56 +0000732 shellescape() escape a string for use with a shell command
733 fnameescape() escape a file name for use with a Vim command
Bram Moolenaarc6fe9192006-04-09 21:54:49 +0000734 tr() translate characters from one set to another
Bram Moolenaar071d4272004-06-13 20:20:40 +0000735 strtrans() translate a string to make it printable
736 tolower() turn a string to lowercase
737 toupper() turn a string to uppercase
Bram Moolenaar4e4473c2020-08-28 22:24:57 +0200738 charclass() class of a character
Bram Moolenaar071d4272004-06-13 20:20:40 +0000739 match() position where a pattern matches in a string
740 matchend() position where a pattern match ends in a string
Bram Moolenaar635414d2020-09-11 22:25:15 +0200741 matchfuzzy() fuzzy matches a string in a list of strings
Bram Moolenaar4f73b8e2020-09-22 20:33:50 +0200742 matchfuzzypos() fuzzy matches a string in a list of strings
Bram Moolenaar071d4272004-06-13 20:20:40 +0000743 matchstr() match of a pattern in a string
Bram Moolenaar6f1d9a02016-07-24 14:12:38 +0200744 matchstrpos() match and positions of a pattern in a string
Bram Moolenaarc6fe9192006-04-09 21:54:49 +0000745 matchlist() like matchstr() and also return submatches
Bram Moolenaar071d4272004-06-13 20:20:40 +0000746 stridx() first index of a short string in a long string
747 strridx() last index of a short string in a long string
Bram Moolenaar8d043172014-01-23 14:24:41 +0100748 strlen() length of a string in bytes
Bram Moolenaar70ce8a12021-03-14 19:02:09 +0100749 strcharlen() length of a string in characters
750 strchars() number of characters in a string
Bram Moolenaar8d043172014-01-23 14:24:41 +0100751 strwidth() size of string when displayed
752 strdisplaywidth() size of string when displayed, deals with tabs
Bram Moolenaar08aac3c2020-08-28 21:04:24 +0200753 setcellwidths() set character cell width overrides
Bram Moolenaar071d4272004-06-13 20:20:40 +0000754 substitute() substitute a pattern match with a string
Bram Moolenaar251e1912011-06-19 05:09:16 +0200755 submatch() get a specific match in ":s" and substitute()
Bram Moolenaarc95a3022016-06-12 23:01:46 +0200756 strpart() get part of a string using byte index
757 strcharpart() get part of a string using char index
Bram Moolenaar6601b622021-01-13 21:47:15 +0100758 slice() take a slice of a string, using char index in
759 Vim9 script
Bram Moolenaarc95a3022016-06-12 23:01:46 +0200760 strgetchar() get character from a string using char index
Bram Moolenaar071d4272004-06-13 20:20:40 +0000761 expand() expand special keywords
Bram Moolenaar80dad482019-06-09 17:22:31 +0200762 expandcmd() expand a command like done for `:edit`
Bram Moolenaar071d4272004-06-13 20:20:40 +0000763 iconv() convert text from one encoding to another
Bram Moolenaarc6fe9192006-04-09 21:54:49 +0000764 byteidx() byte index of a character in a string
Bram Moolenaar8d043172014-01-23 14:24:41 +0100765 byteidxcomp() like byteidx() but count composing characters
Bram Moolenaar17793ef2020-12-28 12:56:58 +0100766 charidx() character index of a byte in a string
Bram Moolenaarc6fe9192006-04-09 21:54:49 +0000767 repeat() repeat a string multiple times
768 eval() evaluate a string expression
Bram Moolenaar063b9d12016-07-09 20:21:48 +0200769 execute() execute an Ex command and get the output
Bram Moolenaar7dd64a32019-05-31 21:41:05 +0200770 win_execute() like execute() but in a specified window
Bram Moolenaarb730f0c2018-11-25 03:56:26 +0100771 trim() trim characters from a string
Bram Moolenaar0b39c3f2020-08-30 15:52:10 +0200772 gettext() lookup message translation
Bram Moolenaar071d4272004-06-13 20:20:40 +0000773
Bram Moolenaara3f41662010-07-11 19:01:06 +0200774List manipulation: *list-functions*
Bram Moolenaaraf7f6412005-01-17 22:11:23 +0000775 get() get an item without error for wrong index
776 len() number of items in a List
777 empty() check if List is empty
778 insert() insert an item somewhere in a List
779 add() append an item to a List
780 extend() append a List to a List
Bram Moolenaarb0e6b512021-01-12 20:23:40 +0100781 extendnew() make a new List and append items
Bram Moolenaaraf7f6412005-01-17 22:11:23 +0000782 remove() remove one or more items from a List
783 copy() make a shallow copy of a List
784 deepcopy() make a full copy of a List
785 filter() remove selected items from a List
786 map() change each List item
Bram Moolenaarea696852020-11-09 18:31:39 +0100787 mapnew() make a new List with changed items
Bram Moolenaarebacddb2020-06-04 15:22:21 +0200788 reduce() reduce a List to a value
Bram Moolenaar6601b622021-01-13 21:47:15 +0100789 slice() take a slice of a List
Bram Moolenaaraf7f6412005-01-17 22:11:23 +0000790 sort() sort a List
791 reverse() reverse the order of a List
Bram Moolenaar76f3b1a2014-03-27 22:30:07 +0100792 uniq() remove copies of repeated adjacent items
Bram Moolenaaraf7f6412005-01-17 22:11:23 +0000793 split() split a String into a List
794 join() join List items into a String
Bram Moolenaarc6fe9192006-04-09 21:54:49 +0000795 range() return a List with a sequence of numbers
Bram Moolenaaraf7f6412005-01-17 22:11:23 +0000796 string() String representation of a List
797 call() call a function with List as arguments
Bram Moolenaar9ba0eb82005-06-13 22:28:56 +0000798 index() index of a value in a List
Bram Moolenaaraf7f6412005-01-17 22:11:23 +0000799 max() maximum value in a List
800 min() minimum value in a List
801 count() count number of times a value appears in a List
Bram Moolenaarc6fe9192006-04-09 21:54:49 +0000802 repeat() repeat a List multiple times
Bram Moolenaar077a1e62020-06-08 20:50:43 +0200803 flatten() flatten a List
Bram Moolenaar3b690062021-02-01 20:14:51 +0100804 flattennew() flatten a copy of a List
Bram Moolenaaraf7f6412005-01-17 22:11:23 +0000805
Bram Moolenaara3f41662010-07-11 19:01:06 +0200806Dictionary manipulation: *dict-functions*
Bram Moolenaar9ba0eb82005-06-13 22:28:56 +0000807 get() get an entry without an error for a wrong key
Bram Moolenaaraf7f6412005-01-17 22:11:23 +0000808 len() number of entries in a Dictionary
809 has_key() check whether a key appears in a Dictionary
810 empty() check if Dictionary is empty
811 remove() remove an entry from a Dictionary
812 extend() add entries from one Dictionary to another
Bram Moolenaarb0e6b512021-01-12 20:23:40 +0100813 extendnew() make a new Dictionary and append items
Bram Moolenaaraf7f6412005-01-17 22:11:23 +0000814 filter() remove selected entries from a Dictionary
815 map() change each Dictionary entry
Bram Moolenaarea696852020-11-09 18:31:39 +0100816 mapnew() make a new Dictionary with changed items
Bram Moolenaaraf7f6412005-01-17 22:11:23 +0000817 keys() get List of Dictionary keys
818 values() get List of Dictionary values
819 items() get List of Dictionary key-value pairs
820 copy() make a shallow copy of a Dictionary
821 deepcopy() make a full copy of a Dictionary
822 string() String representation of a Dictionary
823 max() maximum value in a Dictionary
824 min() minimum value in a Dictionary
825 count() count number of times a value appears
826
Bram Moolenaara3f41662010-07-11 19:01:06 +0200827Floating point computation: *float-functions*
Bram Moolenaar3577c6f2008-06-24 21:16:56 +0000828 float2nr() convert Float to Number
829 abs() absolute value (also works for Number)
830 round() round off
831 ceil() round up
832 floor() round down
833 trunc() remove value after decimal point
Bram Moolenaar8d043172014-01-23 14:24:41 +0100834 fmod() remainder of division
835 exp() exponential
836 log() natural logarithm (logarithm to base e)
Bram Moolenaar3577c6f2008-06-24 21:16:56 +0000837 log10() logarithm to base 10
838 pow() value of x to the exponent y
839 sqrt() square root
840 sin() sine
841 cos() cosine
Bram Moolenaar662db672011-03-22 14:05:35 +0100842 tan() tangent
843 asin() arc sine
844 acos() arc cosine
Bram Moolenaar3577c6f2008-06-24 21:16:56 +0000845 atan() arc tangent
Bram Moolenaar662db672011-03-22 14:05:35 +0100846 atan2() arc tangent
847 sinh() hyperbolic sine
848 cosh() hyperbolic cosine
849 tanh() hyperbolic tangent
Bram Moolenaarebacddb2020-06-04 15:22:21 +0200850 isinf() check for infinity
Bram Moolenaarc95a3022016-06-12 23:01:46 +0200851 isnan() check for not a number
Bram Moolenaar3577c6f2008-06-24 21:16:56 +0000852
Yegappan Lakshmanan5dfe4672021-09-14 17:54:30 +0200853Blob manipulation: *blob-functions*
854 blob2list() get a list of numbers from a blob
855 list2blob() get a blob from a list of numbers
856
Bram Moolenaarb6b046b2011-12-30 13:11:27 +0100857Other computation: *bitwise-function*
858 and() bitwise AND
859 invert() bitwise invert
860 or() bitwise OR
861 xor() bitwise XOR
Bram Moolenaar8d043172014-01-23 14:24:41 +0100862 sha256() SHA-256 hash
Bram Moolenaarebacddb2020-06-04 15:22:21 +0200863 rand() get a pseudo-random number
864 srand() initialize seed used by rand()
Bram Moolenaarb6b046b2011-12-30 13:11:27 +0100865
Bram Moolenaara3f41662010-07-11 19:01:06 +0200866Variables: *var-functions*
Bram Moolenaara47e05f2021-01-12 21:49:00 +0100867 type() type of a variable as a number
868 typename() type of a variable as text
Bram Moolenaarc6fe9192006-04-09 21:54:49 +0000869 islocked() check if a variable is locked
Bram Moolenaar214641f2017-03-05 17:04:09 +0100870 funcref() get a Funcref for a function reference
Bram Moolenaarc6fe9192006-04-09 21:54:49 +0000871 function() get a Funcref for a function name
872 getbufvar() get a variable value from a specific buffer
873 setbufvar() set a variable in a specific buffer
Bram Moolenaarc6249bb2006-04-15 20:25:09 +0000874 getwinvar() get a variable from specific window
Bram Moolenaar06b5d512010-05-22 15:37:44 +0200875 gettabvar() get a variable from specific tab page
Bram Moolenaarc6249bb2006-04-15 20:25:09 +0000876 gettabwinvar() get a variable from specific window & tab page
Bram Moolenaarc6fe9192006-04-09 21:54:49 +0000877 setwinvar() set a variable in a specific window
Bram Moolenaar06b5d512010-05-22 15:37:44 +0200878 settabvar() set a variable in a specific tab page
Bram Moolenaarc6249bb2006-04-15 20:25:09 +0000879 settabwinvar() set a variable in a specific window & tab page
Bram Moolenaarc6fe9192006-04-09 21:54:49 +0000880 garbagecollect() possibly free memory
881
Bram Moolenaara3f41662010-07-11 19:01:06 +0200882Cursor and mark position: *cursor-functions* *mark-functions*
Bram Moolenaar071d4272004-06-13 20:20:40 +0000883 col() column number of the cursor or a mark
884 virtcol() screen column of the cursor or a mark
885 line() line number of the cursor or mark
886 wincol() window column number of the cursor
887 winline() window line number of the cursor
888 cursor() position the cursor at a line/column
Bram Moolenaar8d043172014-01-23 14:24:41 +0100889 screencol() get screen column of the cursor
890 screenrow() get screen row of the cursor
Bram Moolenaarb3d17a22019-07-07 18:28:14 +0200891 screenpos() screen row and col of a text character
Bram Moolenaar5a6ec102022-05-27 21:58:00 +0100892 virtcol2col() byte index of a text character on screen
Bram Moolenaar822ff862014-06-12 21:46:14 +0200893 getcurpos() get position of the cursor
Bram Moolenaarc6fe9192006-04-09 21:54:49 +0000894 getpos() get position of cursor, mark, etc.
895 setpos() set position of cursor, mark, etc.
Bram Moolenaarcfb4b472020-05-31 15:41:57 +0200896 getmarklist() list of global/local marks
Bram Moolenaarc6fe9192006-04-09 21:54:49 +0000897 byte2line() get line number at a specific byte count
898 line2byte() byte count at a specific line
899 diff_filler() get the number of filler lines above a line
Bram Moolenaar8d043172014-01-23 14:24:41 +0100900 screenattr() get attribute at a screen line/row
901 screenchar() get character code at a screen line/row
Bram Moolenaar2912abb2019-03-29 14:16:42 +0100902 screenchars() get character codes at a screen line/row
903 screenstring() get string of characters at a screen line/row
Bram Moolenaar6f02b002021-01-10 20:22:54 +0100904 charcol() character number of the cursor or a mark
905 getcharpos() get character position of cursor, mark, etc.
906 setcharpos() set character position of cursor, mark, etc.
907 getcursorcharpos() get character position of the cursor
908 setcursorcharpos() set character position of the cursor
Bram Moolenaarc6fe9192006-04-09 21:54:49 +0000909
Bram Moolenaara3f41662010-07-11 19:01:06 +0200910Working with text in the current buffer: *text-functions*
Bram Moolenaar7c626922005-02-07 22:01:03 +0000911 getline() get a line or list of lines from the buffer
Bram Moolenaar071d4272004-06-13 20:20:40 +0000912 setline() replace a line in the buffer
Bram Moolenaar7c626922005-02-07 22:01:03 +0000913 append() append line or list of lines in the buffer
Bram Moolenaar071d4272004-06-13 20:20:40 +0000914 indent() indent of a specific line
915 cindent() indent according to C indenting
916 lispindent() indent according to Lisp indenting
917 nextnonblank() find next non-blank line
918 prevnonblank() find previous non-blank line
919 search() find a match for a pattern
Bram Moolenaar1d2ba7f2006-02-14 22:29:30 +0000920 searchpos() find a match for a pattern
Bram Moolenaarebacddb2020-06-04 15:22:21 +0200921 searchcount() get number of matches before/after the cursor
Bram Moolenaar071d4272004-06-13 20:20:40 +0000922 searchpair() find the other end of a start/skip/end
Bram Moolenaar1d2ba7f2006-02-14 22:29:30 +0000923 searchpairpos() find the other end of a start/skip/end
Bram Moolenaarc6fe9192006-04-09 21:54:49 +0000924 searchdecl() search for the declaration of a name
Bram Moolenaarc95a3022016-06-12 23:01:46 +0200925 getcharsearch() return character search information
926 setcharsearch() set character search information
Bram Moolenaar071d4272004-06-13 20:20:40 +0000927
Bram Moolenaar931a2772019-07-04 16:54:54 +0200928Working with text in another buffer:
929 getbufline() get a list of lines from the specified buffer
930 setbufline() replace a line in the specified buffer
931 appendbufline() append a list of lines in the specified buffer
932 deletebufline() delete lines from a specified buffer
933
Bram Moolenaara3f41662010-07-11 19:01:06 +0200934 *system-functions* *file-functions*
Bram Moolenaar071d4272004-06-13 20:20:40 +0000935System functions and manipulation of files:
Bram Moolenaar071d4272004-06-13 20:20:40 +0000936 glob() expand wildcards
937 globpath() expand wildcards in a number of directories
Bram Moolenaarc95a3022016-06-12 23:01:46 +0200938 glob2regpat() convert a glob pattern into a search pattern
Bram Moolenaarc6fe9192006-04-09 21:54:49 +0000939 findfile() find a file in a list of directories
940 finddir() find a directory in a list of directories
Bram Moolenaar071d4272004-06-13 20:20:40 +0000941 resolve() find out where a shortcut points to
942 fnamemodify() modify a file name
Bram Moolenaarc6fe9192006-04-09 21:54:49 +0000943 pathshorten() shorten directory names in a path
944 simplify() simplify a path without changing its meaning
Bram Moolenaar071d4272004-06-13 20:20:40 +0000945 executable() check if an executable program exists
Bram Moolenaar7e38ea22014-04-05 22:55:53 +0200946 exepath() full path of an executable program
Bram Moolenaar071d4272004-06-13 20:20:40 +0000947 filereadable() check if a file can be read
948 filewritable() check if a file can be written to
Bram Moolenaarc6fe9192006-04-09 21:54:49 +0000949 getfperm() get the permissions of a file
Bram Moolenaarc95a3022016-06-12 23:01:46 +0200950 setfperm() set the permissions of a file
Bram Moolenaarc6fe9192006-04-09 21:54:49 +0000951 getftype() get the kind of a file
LemonBoydca1d402022-04-28 15:26:33 +0100952 isabsolutepath() check if a path is absolute
Bram Moolenaar071d4272004-06-13 20:20:40 +0000953 isdirectory() check if a directory exists
Bram Moolenaar071d4272004-06-13 20:20:40 +0000954 getfsize() get the size of a file
Bram Moolenaarc6fe9192006-04-09 21:54:49 +0000955 getcwd() get the current working directory
Bram Moolenaar00aa0692019-04-27 20:37:57 +0200956 haslocaldir() check if current window used |:lcd| or |:tcd|
Bram Moolenaar071d4272004-06-13 20:20:40 +0000957 tempname() get the name of a temporary file
Bram Moolenaarc6fe9192006-04-09 21:54:49 +0000958 mkdir() create a new directory
Bram Moolenaar1063f3d2019-05-07 22:06:52 +0200959 chdir() change current working directory
Bram Moolenaar071d4272004-06-13 20:20:40 +0000960 delete() delete a file
961 rename() rename a file
Bram Moolenaar7e38ea22014-04-05 22:55:53 +0200962 system() get the result of a shell command as a string
963 systemlist() get the result of a shell command as a list
Bram Moolenaar691ddee2019-05-09 14:52:41 +0200964 environ() get all environment variables
965 getenv() get one environment variable
966 setenv() set an environment variable
Bram Moolenaar071d4272004-06-13 20:20:40 +0000967 hostname() name of the system
Bram Moolenaar3a7c85b2005-02-05 21:39:53 +0000968 readfile() read a file into a List of lines
Bram Moolenaarc423ad72021-01-13 20:38:03 +0100969 readblob() read a file into a Blob
Bram Moolenaar62e1bb42019-04-08 16:25:07 +0200970 readdir() get a List of file names in a directory
Bram Moolenaar6c9ba042020-06-01 16:09:41 +0200971 readdirex() get a List of file information in a directory
Bram Moolenaar314dd792019-02-03 15:27:20 +0100972 writefile() write a List of lines or Blob into a file
Bram Moolenaar071d4272004-06-13 20:20:40 +0000973
Bram Moolenaara3f41662010-07-11 19:01:06 +0200974Date and Time: *date-functions* *time-functions*
Bram Moolenaarc6fe9192006-04-09 21:54:49 +0000975 getftime() get last modification time of a file
976 localtime() get current time in seconds
977 strftime() convert time to a string
Bram Moolenaar10455d42019-11-21 15:36:18 +0100978 strptime() convert a date/time string to time
Bram Moolenaarc6fe9192006-04-09 21:54:49 +0000979 reltime() get the current or elapsed time accurately
980 reltimestr() convert reltime() result to a string
Bram Moolenaar03413f42016-04-12 21:07:15 +0200981 reltimefloat() convert reltime() result to a Float
Bram Moolenaarc6fe9192006-04-09 21:54:49 +0000982
Yegappan Lakshmanan1755a912022-05-19 10:31:47 +0100983Autocmds: *autocmd-functions*
984 autocmd_add() add a list of autocmds and groups
985 autocmd_delete() delete a list of autocmds and groups
986 autocmd_get() return a list of autocmds
987
Bram Moolenaara3f41662010-07-11 19:01:06 +0200988 *buffer-functions* *window-functions* *arg-functions*
Bram Moolenaar071d4272004-06-13 20:20:40 +0000989Buffers, windows and the argument list:
990 argc() number of entries in the argument list
991 argidx() current position in the argument list
Bram Moolenaar2d1fe052014-05-28 18:22:57 +0200992 arglistid() get id of the argument list
Bram Moolenaar071d4272004-06-13 20:20:40 +0000993 argv() get one entry from the argument list
Bram Moolenaar931a2772019-07-04 16:54:54 +0200994 bufadd() add a file to the list of buffers
Bram Moolenaar071d4272004-06-13 20:20:40 +0000995 bufexists() check if a buffer exists
996 buflisted() check if a buffer exists and is listed
Bram Moolenaar931a2772019-07-04 16:54:54 +0200997 bufload() ensure a buffer is loaded
Bram Moolenaar071d4272004-06-13 20:20:40 +0000998 bufloaded() check if a buffer exists and is loaded
999 bufname() get the name of a specific buffer
1000 bufnr() get the buffer number of a specific buffer
Bram Moolenaarc6fe9192006-04-09 21:54:49 +00001001 tabpagebuflist() return List of buffers in a tab page
1002 tabpagenr() get the number of a tab page
1003 tabpagewinnr() like winnr() for a specified tab page
Bram Moolenaar071d4272004-06-13 20:20:40 +00001004 winnr() get the window number for the current window
Bram Moolenaar82af8712016-06-04 20:20:29 +02001005 bufwinid() get the window ID of a specific buffer
Bram Moolenaar071d4272004-06-13 20:20:40 +00001006 bufwinnr() get the window number of a specific buffer
1007 winbufnr() get the buffer number of a specific window
Bram Moolenaara3347722019-05-11 21:14:24 +02001008 listener_add() add a callback to listen to changes
Bram Moolenaar68e65602019-05-26 21:33:31 +02001009 listener_flush() invoke listener callbacks
Bram Moolenaara3347722019-05-11 21:14:24 +02001010 listener_remove() remove a listener callback
Bram Moolenaarc95a3022016-06-12 23:01:46 +02001011 win_findbuf() find windows containing a buffer
1012 win_getid() get window ID of a window
Bram Moolenaarebacddb2020-06-04 15:22:21 +02001013 win_gettype() get type of window
Bram Moolenaarc95a3022016-06-12 23:01:46 +02001014 win_gotoid() go to window with ID
1015 win_id2tabwin() get tab and window nr from window ID
1016 win_id2win() get window nr from window ID
Daniel Steinbergee630312022-01-10 13:36:34 +00001017 win_move_separator() move window vertical separator
1018 win_move_statusline() move window status line
Bram Moolenaarebacddb2020-06-04 15:22:21 +02001019 win_splitmove() move window to a split of another window
Bram Moolenaarb5ae48e2016-08-12 22:23:25 +02001020 getbufinfo() get a list with buffer information
1021 gettabinfo() get a list with tab page information
1022 getwininfo() get a list with window information
Bram Moolenaar07ad8162018-02-13 13:59:59 +01001023 getchangelist() get a list of change list entries
Bram Moolenaar4f505882018-02-10 21:06:32 +01001024 getjumplist() get a list of jump list entries
Bram Moolenaarfc65cab2018-08-28 22:58:02 +02001025 swapinfo() information about a swap file
Bram Moolenaarb730f0c2018-11-25 03:56:26 +01001026 swapname() get the swap file path of a buffer
Bram Moolenaarc6fe9192006-04-09 21:54:49 +00001027
Bram Moolenaara3f41662010-07-11 19:01:06 +02001028Command line: *command-line-functions*
Shougo Matsushita79d599b2022-05-07 12:48:29 +01001029 getcmdcompltype() get the type of the current command line
1030 completion
Bram Moolenaarc6fe9192006-04-09 21:54:49 +00001031 getcmdline() get the current command line
1032 getcmdpos() get position of the cursor in the command line
Shougo Matsushita79d599b2022-05-07 12:48:29 +01001033 getcmdscreenpos() get screen position of the cursor in the
1034 command line
Bram Moolenaarc6fe9192006-04-09 21:54:49 +00001035 setcmdpos() set position of the cursor in the command line
1036 getcmdtype() return the current command-line type
Bram Moolenaarfb539272014-08-22 19:21:47 +02001037 getcmdwintype() return the current command-line window type
Bram Moolenaar6f1d9a02016-07-24 14:12:38 +02001038 getcompletion() list of command-line completion matches
Bram Moolenaar038e09e2021-02-06 12:38:51 +01001039 fullcommand() get full command name
Bram Moolenaarc6fe9192006-04-09 21:54:49 +00001040
Bram Moolenaara3f41662010-07-11 19:01:06 +02001041Quickfix and location lists: *quickfix-functions*
Bram Moolenaarc6fe9192006-04-09 21:54:49 +00001042 getqflist() list of quickfix errors
1043 setqflist() modify a quickfix list
1044 getloclist() list of location list items
1045 setloclist() modify a location list
1046
Bram Moolenaara3f41662010-07-11 19:01:06 +02001047Insert mode completion: *completion-functions*
Bram Moolenaarc6fe9192006-04-09 21:54:49 +00001048 complete() set found matches
1049 complete_add() add to found matches
1050 complete_check() check if completion should be aborted
Bram Moolenaarfd133322019-03-29 12:20:27 +01001051 complete_info() get current completion information
Bram Moolenaarc6fe9192006-04-09 21:54:49 +00001052 pumvisible() check if the popup menu is displayed
Bram Moolenaar5be4cee2019-09-27 19:34:08 +02001053 pum_getpos() position and size of popup menu if visible
Bram Moolenaar071d4272004-06-13 20:20:40 +00001054
Bram Moolenaara3f41662010-07-11 19:01:06 +02001055Folding: *folding-functions*
Bram Moolenaar071d4272004-06-13 20:20:40 +00001056 foldclosed() check for a closed fold at a specific line
1057 foldclosedend() like foldclosed() but return the last line
1058 foldlevel() check for the fold level at a specific line
1059 foldtext() generate the line displayed for a closed fold
Bram Moolenaarc6fe9192006-04-09 21:54:49 +00001060 foldtextresult() get the text displayed for a closed fold
Bram Moolenaar071d4272004-06-13 20:20:40 +00001061
Bram Moolenaara3f41662010-07-11 19:01:06 +02001062Syntax and highlighting: *syntax-functions* *highlighting-functions*
Bram Moolenaar6ee10162007-07-26 20:58:42 +00001063 clearmatches() clear all matches defined by |matchadd()| and
1064 the |:match| commands
1065 getmatches() get all matches defined by |matchadd()| and
1066 the |:match| commands
Bram Moolenaar071d4272004-06-13 20:20:40 +00001067 hlexists() check if a highlight group exists
Yegappan Lakshmanand1a8d652021-11-03 21:56:45 +00001068 hlget() get highlight group attributes
1069 hlset() set highlight group attributes
Bram Moolenaar071d4272004-06-13 20:20:40 +00001070 hlID() get ID of a highlight group
1071 synID() get syntax ID at a specific position
1072 synIDattr() get a specific attribute of a syntax ID
1073 synIDtrans() get translated syntax ID
Bram Moolenaar166af9b2010-11-16 20:34:40 +01001074 synstack() get list of syntax IDs at a specific position
Bram Moolenaar81af9252010-12-10 20:35:50 +01001075 synconcealed() get info about concealing
Bram Moolenaarc6fe9192006-04-09 21:54:49 +00001076 diff_hlID() get highlight ID for diff mode at a position
Bram Moolenaar6ee10162007-07-26 20:58:42 +00001077 matchadd() define a pattern to highlight (a "match")
Bram Moolenaarb3414592014-06-17 17:48:32 +02001078 matchaddpos() define a list of positions to highlight
Bram Moolenaarc6fe9192006-04-09 21:54:49 +00001079 matcharg() get info about |:match| arguments
Bram Moolenaar6ee10162007-07-26 20:58:42 +00001080 matchdelete() delete a match defined by |matchadd()| or a
1081 |:match| command
1082 setmatches() restore a list of matches saved by
1083 |getmatches()|
Bram Moolenaarc6fe9192006-04-09 21:54:49 +00001084
Bram Moolenaara3f41662010-07-11 19:01:06 +02001085Spelling: *spell-functions*
Bram Moolenaarc6fe9192006-04-09 21:54:49 +00001086 spellbadword() locate badly spelled word at or after cursor
1087 spellsuggest() return suggested spelling corrections
1088 soundfold() return the sound-a-like equivalent of a word
Bram Moolenaar071d4272004-06-13 20:20:40 +00001089
Bram Moolenaara3f41662010-07-11 19:01:06 +02001090History: *history-functions*
Bram Moolenaar071d4272004-06-13 20:20:40 +00001091 histadd() add an item to a history
1092 histdel() delete an item from a history
1093 histget() get an item from a history
1094 histnr() get highest index of a history list
1095
Bram Moolenaara3f41662010-07-11 19:01:06 +02001096Interactive: *interactive-functions*
Bram Moolenaarc6fe9192006-04-09 21:54:49 +00001097 browse() put up a file requester
1098 browsedir() put up a directory requester
Bram Moolenaar071d4272004-06-13 20:20:40 +00001099 confirm() let the user make a choice
1100 getchar() get a character from the user
Bram Moolenaarf7a023e2021-06-07 18:50:01 +02001101 getcharstr() get a character from the user as a string
Bram Moolenaar071d4272004-06-13 20:20:40 +00001102 getcharmod() get modifiers for the last typed character
Bram Moolenaar09c6f262019-11-17 15:55:14 +01001103 getmousepos() get last known mouse position
Bram Moolenaarebacddb2020-06-04 15:22:21 +02001104 echoraw() output characters as-is
Bram Moolenaar3577c6f2008-06-24 21:16:56 +00001105 feedkeys() put characters in the typeahead queue
Bram Moolenaar071d4272004-06-13 20:20:40 +00001106 input() get a line from the user
Bram Moolenaarc6fe9192006-04-09 21:54:49 +00001107 inputlist() let the user pick an entry from a list
Bram Moolenaar071d4272004-06-13 20:20:40 +00001108 inputsecret() get a line from the user without showing it
1109 inputdialog() get a line from the user in a dialog
Bram Moolenaar68b76a62005-03-25 21:53:48 +00001110 inputsave() save and clear typeahead
Bram Moolenaar071d4272004-06-13 20:20:40 +00001111 inputrestore() restore typeahead
1112
Bram Moolenaara3f41662010-07-11 19:01:06 +02001113GUI: *gui-functions*
Bram Moolenaarc6fe9192006-04-09 21:54:49 +00001114 getfontname() get name of current font being used
Bram Moolenaarb5b75622018-03-09 22:22:21 +01001115 getwinpos() position of the Vim window
1116 getwinposx() X position of the Vim window
1117 getwinposy() Y position of the Vim window
Bram Moolenaar214641f2017-03-05 17:04:09 +01001118 balloon_show() set the balloon content
Bram Moolenaara2a80162017-11-21 23:09:50 +01001119 balloon_split() split a message for a balloon
Bram Moolenaar691ddee2019-05-09 14:52:41 +02001120 balloon_gettext() get the text in the balloon
Bram Moolenaarc6fe9192006-04-09 21:54:49 +00001121
Bram Moolenaara3f41662010-07-11 19:01:06 +02001122Vim server: *server-functions*
Bram Moolenaar071d4272004-06-13 20:20:40 +00001123 serverlist() return the list of server names
Bram Moolenaar01164a62017-11-02 22:58:42 +01001124 remote_startserver() run a server
Bram Moolenaar071d4272004-06-13 20:20:40 +00001125 remote_send() send command characters to a Vim server
1126 remote_expr() evaluate an expression in a Vim server
1127 server2client() send a reply to a client of a Vim server
1128 remote_peek() check if there is a reply from a Vim server
1129 remote_read() read a reply from a Vim server
1130 foreground() move the Vim window to the foreground
1131 remote_foreground() move the Vim server window to the foreground
1132
Bram Moolenaara3f41662010-07-11 19:01:06 +02001133Window size and position: *window-size-functions*
Bram Moolenaarc6fe9192006-04-09 21:54:49 +00001134 winheight() get height of a specific window
1135 winwidth() get width of a specific window
Bram Moolenaarf0b03c42017-12-17 17:17:07 +01001136 win_screenpos() get screen position of a window
Bram Moolenaarb730f0c2018-11-25 03:56:26 +01001137 winlayout() get layout of windows in a tab page
Bram Moolenaarc6fe9192006-04-09 21:54:49 +00001138 winrestcmd() return command to restore window sizes
1139 winsaveview() get view of current window
1140 winrestview() restore saved view of current window
1141
Bram Moolenaar0eabd4d2020-03-15 16:13:53 +01001142Mappings and Menus: *mapping-functions*
h-east29b85712021-07-26 21:54:04 +02001143 digraph_get() get |digraph|
1144 digraph_getlist() get all |digraph|s
1145 digraph_set() register |digraph|
1146 digraph_setlist() register multiple |digraph|s
Bram Moolenaar071d4272004-06-13 20:20:40 +00001147 hasmapto() check if a mapping exists
1148 mapcheck() check if a matching mapping exists
1149 maparg() get rhs of a mapping
Ernie Rael09661202022-04-25 14:40:44 +01001150 maplist() get list of all mappings
Bram Moolenaarebacddb2020-06-04 15:22:21 +02001151 mapset() restore a mapping
Bram Moolenaar0eabd4d2020-03-15 16:13:53 +01001152 menu_info() get information about a menu item
Bram Moolenaar26402cb2013-02-20 21:26:00 +01001153 wildmenumode() check if the wildmode is active
1154
Bram Moolenaar683fa182015-11-30 21:38:24 +01001155Testing: *test-functions*
Bram Moolenaare18c0b32016-03-20 21:08:34 +01001156 assert_equal() assert that two expressions values are equal
Bram Moolenaarb730f0c2018-11-25 03:56:26 +01001157 assert_equalfile() assert that two file contents are equal
Bram Moolenaar03413f42016-04-12 21:07:15 +02001158 assert_notequal() assert that two expressions values are not equal
Bram Moolenaar6f1d9a02016-07-24 14:12:38 +02001159 assert_inrange() assert that an expression is inside a range
Bram Moolenaar7db8f6f2016-03-29 23:12:46 +02001160 assert_match() assert that a pattern matches the value
Bram Moolenaar03413f42016-04-12 21:07:15 +02001161 assert_notmatch() assert that a pattern does not match the value
Bram Moolenaar683fa182015-11-30 21:38:24 +01001162 assert_false() assert that an expression is false
1163 assert_true() assert that an expression is true
Bram Moolenaare18c0b32016-03-20 21:08:34 +01001164 assert_exception() assert that a command throws an exception
Bram Moolenaar22f1d0e2018-02-27 14:53:30 +01001165 assert_beeps() assert that a command beeps
Bram Moolenaar0df60302021-04-03 15:15:47 +02001166 assert_nobeep() assert that a command does not cause a beep
Bram Moolenaar22f1d0e2018-02-27 14:53:30 +01001167 assert_fails() assert that a command fails
Bram Moolenaar3c2881d2017-03-21 19:18:29 +01001168 assert_report() report a test failure
Bram Moolenaarc95a3022016-06-12 23:01:46 +02001169 test_alloc_fail() make memory allocation fail
Bram Moolenaar6f1d9a02016-07-24 14:12:38 +02001170 test_autochdir() enable 'autochdir' during startup
Bram Moolenaar036986f2017-03-16 17:41:02 +01001171 test_override() test with Vim internal overrides
1172 test_garbagecollect_now() free memory right now
Bram Moolenaarebacddb2020-06-04 15:22:21 +02001173 test_garbagecollect_soon() set a flag to free memory soon
Bram Moolenaar68e65602019-05-26 21:33:31 +02001174 test_getvalue() get value of an internal variable
Yegappan Lakshmanan06011e12022-01-30 12:37:29 +00001175 test_gui_event() generate a GUI event for testing
Bram Moolenaar214641f2017-03-05 17:04:09 +01001176 test_ignore_error() ignore a specific error message
Bram Moolenaar314dd792019-02-03 15:27:20 +01001177 test_null_blob() return a null Blob
Bram Moolenaarc95a3022016-06-12 23:01:46 +02001178 test_null_channel() return a null Channel
1179 test_null_dict() return a null Dict
Bram Moolenaarebacddb2020-06-04 15:22:21 +02001180 test_null_function() return a null Funcref
Bram Moolenaarc95a3022016-06-12 23:01:46 +02001181 test_null_job() return a null Job
1182 test_null_list() return a null List
1183 test_null_partial() return a null Partial function
1184 test_null_string() return a null String
Bram Moolenaar214641f2017-03-05 17:04:09 +01001185 test_settime() set the time Vim uses internally
Bram Moolenaarbb8476b2019-05-04 15:47:48 +02001186 test_setmouse() set the mouse position
Bram Moolenaarb730f0c2018-11-25 03:56:26 +01001187 test_feedinput() add key sequence to input buffer
1188 test_option_not_set() reset flag indicating option was set
Bram Moolenaarebacddb2020-06-04 15:22:21 +02001189 test_refcount() return an expression's reference count
1190 test_srand_seed() set the seed value for srand()
1191 test_unknown() return a value with unknown type
1192 test_void() return a value with void type
Bram Moolenaar683fa182015-11-30 21:38:24 +01001193
Bram Moolenaarc95a3022016-06-12 23:01:46 +02001194Inter-process communication: *channel-functions*
Bram Moolenaar51628222016-12-01 23:03:28 +01001195 ch_canread() check if there is something to read
Bram Moolenaar681baaf2016-02-04 20:57:07 +01001196 ch_open() open a channel
1197 ch_close() close a channel
Bram Moolenaar64d8e252016-09-06 22:12:34 +02001198 ch_close_in() close the in part of a channel
Bram Moolenaarc95a3022016-06-12 23:01:46 +02001199 ch_read() read a message from a channel
Bram Moolenaard09091d2019-01-17 16:07:22 +01001200 ch_readblob() read a Blob from a channel
Bram Moolenaarc95a3022016-06-12 23:01:46 +02001201 ch_readraw() read a raw message from a channel
Bram Moolenaar681baaf2016-02-04 20:57:07 +01001202 ch_sendexpr() send a JSON message over a channel
1203 ch_sendraw() send a raw message over a channel
Bram Moolenaarebacddb2020-06-04 15:22:21 +02001204 ch_evalexpr() evaluate an expression over channel
1205 ch_evalraw() evaluate a raw string over channel
Bram Moolenaarc95a3022016-06-12 23:01:46 +02001206 ch_status() get status of a channel
1207 ch_getbufnr() get the buffer number of a channel
1208 ch_getjob() get the job associated with a channel
1209 ch_info() get channel information
1210 ch_log() write a message in the channel log file
1211 ch_logfile() set the channel log file
1212 ch_setoptions() set the options for a channel
Bram Moolenaara02a5512016-06-17 12:48:11 +02001213 json_encode() encode an expression to a JSON string
1214 json_decode() decode a JSON string to Vim types
Bram Moolenaarc95a3022016-06-12 23:01:46 +02001215 js_encode() encode an expression to a JSON string
1216 js_decode() decode a JSON string to Vim types
1217
Bram Moolenaarebacddb2020-06-04 15:22:21 +02001218Jobs: *job-functions*
Bram Moolenaarc95a3022016-06-12 23:01:46 +02001219 job_start() start a job
1220 job_stop() stop a job
1221 job_status() get the status of a job
1222 job_getchannel() get the channel used by a job
1223 job_info() get information about a job
1224 job_setoptions() set options for a job
1225
Bram Moolenaar162b7142018-12-21 15:17:36 +01001226Signs: *sign-functions*
1227 sign_define() define or update a sign
1228 sign_getdefined() get a list of defined signs
1229 sign_getplaced() get a list of placed signs
Bram Moolenaar6b7b7192019-01-11 13:42:41 +01001230 sign_jump() jump to a sign
Bram Moolenaar162b7142018-12-21 15:17:36 +01001231 sign_place() place a sign
Bram Moolenaar809ce4d2019-07-13 21:21:40 +02001232 sign_placelist() place a list of signs
Bram Moolenaar162b7142018-12-21 15:17:36 +01001233 sign_undefine() undefine a sign
1234 sign_unplace() unplace a sign
Bram Moolenaar809ce4d2019-07-13 21:21:40 +02001235 sign_unplacelist() unplace a list of signs
Bram Moolenaar162b7142018-12-21 15:17:36 +01001236
Bram Moolenaarc572da52017-08-27 16:52:01 +02001237Terminal window: *terminal-functions*
1238 term_start() open a terminal window and run a job
1239 term_list() get the list of terminal buffers
1240 term_sendkeys() send keystrokes to a terminal
1241 term_wait() wait for screen to be updated
1242 term_getjob() get the job associated with a terminal
1243 term_scrape() get row of a terminal screen
1244 term_getline() get a line of text from a terminal
1245 term_getattr() get the value of attribute {what}
1246 term_getcursor() get the cursor position of a terminal
1247 term_getscrolled() get the scroll count of a terminal
1248 term_getaltscreen() get the alternate screen flag
1249 term_getsize() get the size of a terminal
1250 term_getstatus() get the status of a terminal
1251 term_gettitle() get the title of a terminal
1252 term_gettty() get the tty name of a terminal
Bram Moolenaar7dda86f2018-04-20 22:36:41 +02001253 term_setansicolors() set 16 ANSI colors, used for GUI
1254 term_getansicolors() get 16 ANSI colors, used for GUI
Bram Moolenaarb730f0c2018-11-25 03:56:26 +01001255 term_dumpdiff() display difference between two screen dumps
1256 term_dumpload() load a terminal screen dump in a window
1257 term_dumpwrite() dump contents of a terminal screen to a file
1258 term_setkill() set signal to stop job in a terminal
1259 term_setrestore() set command to restore a terminal
1260 term_setsize() set the size of a terminal
Bram Moolenaarebacddb2020-06-04 15:22:21 +02001261 term_setapi() set terminal JSON API function name prefix
Bram Moolenaarc572da52017-08-27 16:52:01 +02001262
Bram Moolenaar931a2772019-07-04 16:54:54 +02001263Popup window: *popup-window-functions*
1264 popup_create() create popup centered in the screen
1265 popup_atcursor() create popup just above the cursor position,
1266 closes when the cursor moves away
Bram Moolenaarb3d17a22019-07-07 18:28:14 +02001267 popup_beval() at the position indicated by v:beval_
1268 variables, closes when the mouse moves away
Bram Moolenaar931a2772019-07-04 16:54:54 +02001269 popup_notification() show a notification for three seconds
1270 popup_dialog() create popup centered with padding and border
1271 popup_menu() prompt for selecting an item from a list
1272 popup_hide() hide a popup temporarily
1273 popup_show() show a previously hidden popup
1274 popup_move() change the position and size of a popup
1275 popup_setoptions() override options of a popup
1276 popup_settext() replace the popup buffer contents
1277 popup_close() close one popup
1278 popup_clear() close all popups
1279 popup_filter_menu() select from a list of items
Bram Moolenaarebacddb2020-06-04 15:22:21 +02001280 popup_filter_yesno() block until 'y' or 'n' is pressed
Bram Moolenaar931a2772019-07-04 16:54:54 +02001281 popup_getoptions() get current options for a popup
1282 popup_getpos() get actual position and size of a popup
Bram Moolenaarebacddb2020-06-04 15:22:21 +02001283 popup_findinfo() get window ID for popup info window
1284 popup_findpreview() get window ID for popup preview window
1285 popup_list() get list of all popup window IDs
1286 popup_locate() get popup window ID from its screen position
Bram Moolenaar931a2772019-07-04 16:54:54 +02001287
Bram Moolenaarc95a3022016-06-12 23:01:46 +02001288Timers: *timer-functions*
1289 timer_start() create a timer
Bram Moolenaarb5ae48e2016-08-12 22:23:25 +02001290 timer_pause() pause or unpause a timer
Bram Moolenaarc95a3022016-06-12 23:01:46 +02001291 timer_stop() stop a timer
Bram Moolenaarb5ae48e2016-08-12 22:23:25 +02001292 timer_stopall() stop all timers
1293 timer_info() get information about timers
Bram Moolenaar298b4402016-01-28 22:38:53 +01001294
Bram Moolenaarb730f0c2018-11-25 03:56:26 +01001295Tags: *tag-functions*
1296 taglist() get list of matching tags
1297 tagfiles() get a list of tags files
1298 gettagstack() get the tag stack of a window
1299 settagstack() modify the tag stack of a window
1300
1301Prompt Buffer: *promptbuffer-functions*
Bram Moolenaar077cc7a2020-09-04 16:35:35 +02001302 prompt_getprompt() get the effective prompt text for a buffer
Bram Moolenaarb730f0c2018-11-25 03:56:26 +01001303 prompt_setcallback() set prompt callback for a buffer
1304 prompt_setinterrupt() set interrupt callback for a buffer
1305 prompt_setprompt() set the prompt text for a buffer
1306
Bram Moolenaarebacddb2020-06-04 15:22:21 +02001307Text Properties: *text-property-functions*
1308 prop_add() attach a property at a position
Yegappan Lakshmananccfb7c62021-08-16 21:39:09 +02001309 prop_add_list() attach a property at multiple positions
Bram Moolenaarebacddb2020-06-04 15:22:21 +02001310 prop_clear() remove all properties from a line or lines
1311 prop_find() search for a property
1312 prop_list() return a list of all properties in a line
1313 prop_remove() remove a property from a line
1314 prop_type_add() add/define a property type
1315 prop_type_change() change properties of a type
1316 prop_type_delete() remove a text property type
1317 prop_type_get() return the properties of a type
1318 prop_type_list() return a list of all property types
1319
1320Sound: *sound-functions*
1321 sound_clear() stop playing all sounds
1322 sound_playevent() play an event's sound
1323 sound_playfile() play a sound file
1324 sound_stop() stop playing a sound
1325
Bram Moolenaar26402cb2013-02-20 21:26:00 +01001326Various: *various-functions*
1327 mode() get current editing mode
Bram Moolenaarebacddb2020-06-04 15:22:21 +02001328 state() get current busy state
Bram Moolenaar26402cb2013-02-20 21:26:00 +01001329 visualmode() last visual mode used
Bram Moolenaar071d4272004-06-13 20:20:40 +00001330 exists() check if a variable, function, etc. exists
Bram Moolenaar26735992021-08-08 14:43:22 +02001331 exists_compiled() like exists() but check at compile time
Bram Moolenaar071d4272004-06-13 20:20:40 +00001332 has() check if a feature is supported in Vim
Bram Moolenaarc6fe9192006-04-09 21:54:49 +00001333 changenr() return number of most recent change
Bram Moolenaar071d4272004-06-13 20:20:40 +00001334 cscope_connection() check if a cscope connection exists
1335 did_filetype() check if a FileType autocommand was used
1336 eventhandler() check if invoked by an event handler
Bram Moolenaar3577c6f2008-06-24 21:16:56 +00001337 getpid() get process ID of Vim
Bram Moolenaarebacddb2020-06-04 15:22:21 +02001338 getimstatus() check if IME status is active
1339 interrupt() interrupt script execution
1340 windowsversion() get MS-Windows version
Bram Moolenaar0c0eddd2020-06-13 15:47:25 +02001341 terminalprops() properties of the terminal
Bram Moolenaarc6fe9192006-04-09 21:54:49 +00001342
Bram Moolenaar071d4272004-06-13 20:20:40 +00001343 libcall() call a function in an external library
1344 libcallnr() idem, returning a number
Bram Moolenaarc6fe9192006-04-09 21:54:49 +00001345
Bram Moolenaar8d043172014-01-23 14:24:41 +01001346 undofile() get the name of the undo file
1347 undotree() return the state of the undo tree
1348
Bram Moolenaar071d4272004-06-13 20:20:40 +00001349 getreg() get contents of a register
Bram Moolenaarbb861e22020-06-07 18:16:36 +02001350 getreginfo() get information about a register
Bram Moolenaar071d4272004-06-13 20:20:40 +00001351 getregtype() get type of a register
1352 setreg() set contents and type of a register
Bram Moolenaar0b6d9112018-05-22 20:35:17 +02001353 reg_executing() return the name of the register being executed
1354 reg_recording() return the name of the register being recorded
Bram Moolenaarc6fe9192006-04-09 21:54:49 +00001355
Bram Moolenaar8d043172014-01-23 14:24:41 +01001356 shiftwidth() effective value of 'shiftwidth'
1357
Bram Moolenaar063b9d12016-07-09 20:21:48 +02001358 wordcount() get byte/word/char count of buffer
1359
Bram Moolenaarebacddb2020-06-04 15:22:21 +02001360 luaeval() evaluate |Lua| expression
Bram Moolenaar7e506b62010-01-19 15:55:06 +01001361 mzeval() evaluate |MzScheme| expression
Bram Moolenaare9b892e2016-01-17 21:15:58 +01001362 perleval() evaluate Perl expression (|+perl|)
Bram Moolenaar8d043172014-01-23 14:24:41 +01001363 py3eval() evaluate Python expression (|+python3|)
1364 pyeval() evaluate Python expression (|+python|)
Bram Moolenaar690afe12017-01-28 18:34:47 +01001365 pyxeval() evaluate |python_x| expression
Bram Moolenaarebacddb2020-06-04 15:22:21 +02001366 rubyeval() evaluate |Ruby| expression
1367
Bram Moolenaar9d87a372018-12-18 21:41:50 +01001368 debugbreak() interrupt a program being debugged
Bram Moolenaar7e506b62010-01-19 15:55:06 +01001369
Bram Moolenaar071d4272004-06-13 20:20:40 +00001370==============================================================================
1371*41.7* Defining a function
1372
1373Vim enables you to define your own functions. The basic function declaration
1374begins as follows: >
1375
Bram Moolenaar04fb9162021-12-30 20:24:12 +00001376 def {name}({var1}, {var2}, ...): return-type
1377 {body}
1378 enddef
Bram Moolenaar071d4272004-06-13 20:20:40 +00001379<
1380 Note:
1381 Function names must begin with a capital letter.
1382
1383Let's define a short function to return the smaller of two numbers. It starts
1384with this line: >
1385
Bram Moolenaar04fb9162021-12-30 20:24:12 +00001386 def Min(num1: number, num2: number): number
Bram Moolenaar071d4272004-06-13 20:20:40 +00001387
Bram Moolenaar04fb9162021-12-30 20:24:12 +00001388This tells Vim that the function is named "Min", it takes two arguments that
1389are numbers: "num1" and "num2" and returns a number.
1390
1391The first thing you need to do is to check to see which number is smaller:
Bram Moolenaar071d4272004-06-13 20:20:40 +00001392 >
Bram Moolenaar04fb9162021-12-30 20:24:12 +00001393 if num1 < num2
Bram Moolenaar071d4272004-06-13 20:20:40 +00001394
Bram Moolenaar071d4272004-06-13 20:20:40 +00001395Let's assign the variable "smaller" the value of the smallest number: >
1396
Bram Moolenaar04fb9162021-12-30 20:24:12 +00001397 var smaller: number
1398 if num1 < num2
1399 smaller = num1
1400 else
1401 smaller = num2
1402 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +00001403
1404The variable "smaller" is a local variable. Variables used inside a function
Bram Moolenaar04fb9162021-12-30 20:24:12 +00001405are local unless prefixed by something like "g:", "w:", or "s:".
Bram Moolenaar071d4272004-06-13 20:20:40 +00001406
1407 Note:
1408 To access a global variable from inside a function you must prepend
Bram Moolenaar3577c6f2008-06-24 21:16:56 +00001409 "g:" to it. Thus "g:today" inside a function is used for the global
1410 variable "today", and "today" is another variable, local to the
Bram Moolenaar04fb9162021-12-30 20:24:12 +00001411 function or the script.
Bram Moolenaar071d4272004-06-13 20:20:40 +00001412
Bram Moolenaar04fb9162021-12-30 20:24:12 +00001413You now use the `return` statement to return the smallest number to the user.
Bram Moolenaar071d4272004-06-13 20:20:40 +00001414Finally, you end the function: >
1415
Bram Moolenaar04fb9162021-12-30 20:24:12 +00001416 return smaller
1417 enddef
Bram Moolenaar071d4272004-06-13 20:20:40 +00001418
1419The complete function definition is as follows: >
1420
Bram Moolenaar04fb9162021-12-30 20:24:12 +00001421 def Min(num1: number, num2: number): number
1422 var smaller: number
1423 if num1 < num2
1424 smaller = num1
1425 else
1426 smaller = num2
1427 endif
1428 return smaller
1429 enddef
Bram Moolenaar071d4272004-06-13 20:20:40 +00001430
Bram Moolenaar04fb9162021-12-30 20:24:12 +00001431Obviously this is a verbose example. You can make it shorter by using two
1432return commands: >
Bram Moolenaar7c626922005-02-07 22:01:03 +00001433
Bram Moolenaar04fb9162021-12-30 20:24:12 +00001434 def Min(num1: number, num2: number): number
1435 if num1 < num2
1436 return num1
1437 endif
1438 return num2
1439 enddef
1440
1441And if you remember the conditional expression, you need only one line: >
1442
1443 def Min(num1: number, num2: number): number
1444 return num1 < num2 ? num1 : num2
1445 enddef
Bram Moolenaar7c626922005-02-07 22:01:03 +00001446
Bram Moolenaard1f56e62006-02-22 21:25:37 +00001447A user defined function is called in exactly the same way as a built-in
Bram Moolenaar071d4272004-06-13 20:20:40 +00001448function. Only the name is different. The Min function can be used like
1449this: >
1450
Bram Moolenaar04fb9162021-12-30 20:24:12 +00001451 echo Min(5, 8)
Bram Moolenaar071d4272004-06-13 20:20:40 +00001452
Bram Moolenaar04fb9162021-12-30 20:24:12 +00001453Only now will the function be executed and the lines be parsed by Vim.
Bram Moolenaar071d4272004-06-13 20:20:40 +00001454If there are mistakes, like using an undefined variable or function, you will
1455now get an error message. When defining the function these errors are not
Bram Moolenaar04fb9162021-12-30 20:24:12 +00001456detected. To get the errors sooner you can tell Vim to compile all the
1457functions in the script: >
Bram Moolenaar071d4272004-06-13 20:20:40 +00001458
Bram Moolenaar04fb9162021-12-30 20:24:12 +00001459 defcompile
Bram Moolenaar071d4272004-06-13 20:20:40 +00001460
Bram Moolenaarcfa8f9a2022-06-03 21:59:47 +01001461Compiling functions takes a little time, but does report errors early. You
1462could use `:defcompile` at the end of your script while working on it, and
1463comment it out when everything is fine.
1464
1465For a function that does not return anything simply leave out the return type: >
Bram Moolenaar071d4272004-06-13 20:20:40 +00001466
Bram Moolenaar04fb9162021-12-30 20:24:12 +00001467 def SayIt(text: string)
1468 echo text
1469 enddef
1470
1471It is also possible to define a legacy function with `function` and
Bram Moolenaarcfa8f9a2022-06-03 21:59:47 +01001472`endfunction`. These do not have types and are not compiled. Therefore they
1473execute much slower.
Bram Moolenaar071d4272004-06-13 20:20:40 +00001474
1475
1476USING A RANGE
1477
Bram Moolenaar04fb9162021-12-30 20:24:12 +00001478A line range can be used with a function call. The function will be called
1479once for every line in the range, with the cursor in that line. Example: >
Bram Moolenaar071d4272004-06-13 20:20:40 +00001480
Bram Moolenaar04fb9162021-12-30 20:24:12 +00001481 def Number()
1482 echo "line " .. line(".") .. " contains: " .. getline(".")
1483 enddef
Bram Moolenaar071d4272004-06-13 20:20:40 +00001484
1485If you call this function with: >
1486
1487 :10,15call Number()
1488
Bram Moolenaar04fb9162021-12-30 20:24:12 +00001489The function will be called six times, starting on line 10 and ending on line
149015.
Bram Moolenaar071d4272004-06-13 20:20:40 +00001491
1492
1493VARIABLE NUMBER OF ARGUMENTS
1494
1495Vim enables you to define functions that have a variable number of arguments.
1496The following command, for instance, defines a function that must have 1
1497argument (start) and can have up to 20 additional arguments: >
1498
Bram Moolenaar04fb9162021-12-30 20:24:12 +00001499 def Show(start: string, ...items: list<string>)
Bram Moolenaar071d4272004-06-13 20:20:40 +00001500
Bram Moolenaarcfa8f9a2022-06-03 21:59:47 +01001501The variable "items" will be a list in the function containing the extra
1502arguments. You can use it like any list, for example: >
Bram Moolenaar071d4272004-06-13 20:20:40 +00001503
Bram Moolenaar04fb9162021-12-30 20:24:12 +00001504 def Show(start: string, ...items: list<string>)
1505 echohl Title
1506 echo "start is " .. start
1507 echohl None
1508 for index in range(len(items))
Bram Moolenaarcfa8f9a2022-06-03 21:59:47 +01001509 echon $" Arg {index} is {items[index]}"
Bram Moolenaar04fb9162021-12-30 20:24:12 +00001510 endfor
1511 echo
1512 enddef
Bram Moolenaar071d4272004-06-13 20:20:40 +00001513
Bram Moolenaar04fb9162021-12-30 20:24:12 +00001514You can call it like this: >
Bram Moolenaar071d4272004-06-13 20:20:40 +00001515
Bram Moolenaar04fb9162021-12-30 20:24:12 +00001516 Show('Title', 'one', 'two', 'three')
1517< start is Title Arg 0 is one Arg 1 is two Arg 2 is three ~
1518
1519This uses the `echohl` command to specify the highlighting used for the
1520following `echo` command. `echohl None` stops it again. The `echon` command
1521works like `echo`, but doesn't output a line break.
1522
1523If you call it with one argument the "items" list will be empty.
1524`range(len(items))` returns a list with the indexes, what `for` loops over,
1525we'll explain that further down.
Bram Moolenaar7c626922005-02-07 22:01:03 +00001526
Bram Moolenaar071d4272004-06-13 20:20:40 +00001527
1528LISTING FUNCTIONS
1529
Bram Moolenaar04fb9162021-12-30 20:24:12 +00001530The `function` command lists the names and arguments of all user-defined
Bram Moolenaar071d4272004-06-13 20:20:40 +00001531functions: >
1532
1533 :function
Bram Moolenaar04fb9162021-12-30 20:24:12 +00001534< def <SNR>86_Show(start: string, ...items: list<string>) ~
Bram Moolenaar071d4272004-06-13 20:20:40 +00001535 function GetVimIndent() ~
1536 function SetSyn(name) ~
1537
Bram Moolenaar04fb9162021-12-30 20:24:12 +00001538The "<SNR>" prefix means that a function is script-local. |Vim9| functions
1539wil start with "def" and include argument and return types. Legacy functions
1540are listed with "function".
1541
1542To see what a function does, use its name as an argument for `function`: >
Bram Moolenaar071d4272004-06-13 20:20:40 +00001543
1544 :function SetSyn
1545< 1 if &syntax == '' ~
1546 2 let &syntax = a:name ~
1547 3 endif ~
1548 endfunction ~
1549
Bram Moolenaarcfa8f9a2022-06-03 21:59:47 +01001550To see the "Show" function you need to include the script prefix, since
1551multiple "Show" functions can be defined in different scripts. To find
Bram Moolenaar04fb9162021-12-30 20:24:12 +00001552the exact name you can use `function`, but the result may be a very long list.
1553To only get the functions matching a pattern you can use the `filter` prefix:
1554>
Bram Moolenaar04fb9162021-12-30 20:24:12 +00001555 :filter Show function
1556< def <SNR>86_Show(start: string, ...items: list<string>) ~
1557>
1558 :function <SNR>86_Show
1559< 1 echohl Title ~
1560 2 echo "start is " .. start ~
1561 etc.
1562
Bram Moolenaar071d4272004-06-13 20:20:40 +00001563
1564DEBUGGING
1565
1566The line number is useful for when you get an error message or when debugging.
1567See |debug-scripts| about debugging mode.
Bram Moolenaar04fb9162021-12-30 20:24:12 +00001568
1569You can also set the 'verbose' option to 12 or higher to see all function
Bram Moolenaar071d4272004-06-13 20:20:40 +00001570calls. Set it to 15 or higher to see every executed line.
1571
1572
1573DELETING A FUNCTION
1574
Bram Moolenaar04fb9162021-12-30 20:24:12 +00001575To delete the SetSyn() function: >
Bram Moolenaar071d4272004-06-13 20:20:40 +00001576
Bram Moolenaar04fb9162021-12-30 20:24:12 +00001577 :delfunction SetSyn
Bram Moolenaar071d4272004-06-13 20:20:40 +00001578
Bram Moolenaar04fb9162021-12-30 20:24:12 +00001579Deleting only works for global functions and functions in legacy script, not
1580for functions defined in a |Vim9| script.
1581
1582You get an error when the function doesn't exist or cannot be deleted.
Bram Moolenaar071d4272004-06-13 20:20:40 +00001583
Bram Moolenaar7c626922005-02-07 22:01:03 +00001584
1585FUNCTION REFERENCES
1586
1587Sometimes it can be useful to have a variable point to one function or
Bram Moolenaarcfa8f9a2022-06-03 21:59:47 +01001588another. You can do it with a function reference variable. Often shortened
1589to "funcref". Example: >
Bram Moolenaar7c626922005-02-07 22:01:03 +00001590
Bram Moolenaarcfa8f9a2022-06-03 21:59:47 +01001591 def Right(): string
Bram Moolenaar04fb9162021-12-30 20:24:12 +00001592 return 'Right!'
1593 enddef
Bram Moolenaarcfa8f9a2022-06-03 21:59:47 +01001594 def Wrong(): string
Bram Moolenaar04fb9162021-12-30 20:24:12 +00001595 return 'Wrong!'
1596 enddef
1597
1598 var Afunc = g:result == 1 ? Right : Wrong
Bram Moolenaarcfa8f9a2022-06-03 21:59:47 +01001599 echo Afunc()
Bram Moolenaar7c626922005-02-07 22:01:03 +00001600< Wrong! ~
1601
Bram Moolenaarcfa8f9a2022-06-03 21:59:47 +01001602This assumes "g:result" is not one. See |Funcref| for details.
Bram Moolenaar04fb9162021-12-30 20:24:12 +00001603
Bram Moolenaar7c626922005-02-07 22:01:03 +00001604Note that the name of a variable that holds a function reference must start
1605with a capital. Otherwise it could be confused with the name of a builtin
1606function.
Bram Moolenaar7c626922005-02-07 22:01:03 +00001607
Yegappan Lakshmanan5dfe4672021-09-14 17:54:30 +02001608More information about defining your own functions here: |user-functions|.
1609
Bram Moolenaar071d4272004-06-13 20:20:40 +00001610==============================================================================
Bram Moolenaar7c626922005-02-07 22:01:03 +00001611*41.8* Lists and Dictionaries
1612
1613So far we have used the basic types String and Number. Vim also supports two
1614composite types: List and Dictionary.
1615
Bram Moolenaar04fb9162021-12-30 20:24:12 +00001616A List is an ordered sequence of items. The items can be any kind of value,
Bram Moolenaar7c626922005-02-07 22:01:03 +00001617thus you can make a List of numbers, a List of Lists and even a List of mixed
1618items. To create a List with three strings: >
1619
Bram Moolenaarcfa8f9a2022-06-03 21:59:47 +01001620 var alist = ['aap', 'noot', 'mies']
Bram Moolenaar7c626922005-02-07 22:01:03 +00001621
1622The List items are enclosed in square brackets and separated by commas. To
1623create an empty List: >
1624
Bram Moolenaar04fb9162021-12-30 20:24:12 +00001625 var alist = []
Bram Moolenaar7c626922005-02-07 22:01:03 +00001626
1627You can add items to a List with the add() function: >
1628
Bram Moolenaar04fb9162021-12-30 20:24:12 +00001629 var alist = []
1630 add(alist, 'foo')
1631 add(alist, 'bar')
1632 echo alist
Bram Moolenaar7c626922005-02-07 22:01:03 +00001633< ['foo', 'bar'] ~
1634
1635List concatenation is done with +: >
1636
Bram Moolenaar04fb9162021-12-30 20:24:12 +00001637 var alist = ['foo', 'bar']
1638 alist = alist + ['and', 'more']
1639 echo alist
1640< ['foo', 'bar', 'and', 'more'] ~
Bram Moolenaar7c626922005-02-07 22:01:03 +00001641
Bram Moolenaarcfa8f9a2022-06-03 21:59:47 +01001642Or, if you want to extend a List with a function, use `extend()`: >
Bram Moolenaar7c626922005-02-07 22:01:03 +00001643
Bram Moolenaar04fb9162021-12-30 20:24:12 +00001644 var alist = ['one']
1645 extend(alist, ['two', 'three'])
1646 echo alist
Bram Moolenaar7c626922005-02-07 22:01:03 +00001647< ['one', 'two', 'three'] ~
1648
Bram Moolenaarcfa8f9a2022-06-03 21:59:47 +01001649Notice that using `add()` will have a different effect than `extend()`: >
Bram Moolenaar7c626922005-02-07 22:01:03 +00001650
Bram Moolenaar04fb9162021-12-30 20:24:12 +00001651 var alist = ['one']
1652 add(alist, ['two', 'three'])
1653 echo alist
Bram Moolenaar7c626922005-02-07 22:01:03 +00001654< ['one', ['two', 'three']] ~
1655
Bram Moolenaar04fb9162021-12-30 20:24:12 +00001656The second argument of add() is added as an item, now you have a nested list.
Bram Moolenaar7c626922005-02-07 22:01:03 +00001657
1658
1659FOR LOOP
1660
1661One of the nice things you can do with a List is iterate over it: >
1662
Bram Moolenaar04fb9162021-12-30 20:24:12 +00001663 var alist = ['one', 'two', 'three']
1664 for n in alist
1665 echo n
1666 endfor
Bram Moolenaar7c626922005-02-07 22:01:03 +00001667< one ~
1668 two ~
1669 three ~
1670
Bram Moolenaar04fb9162021-12-30 20:24:12 +00001671This will loop over each element in List "alist", assigning each value to
Bram Moolenaar7c626922005-02-07 22:01:03 +00001672variable "n". The generic form of a for loop is: >
1673
Bram Moolenaarcfa8f9a2022-06-03 21:59:47 +01001674 for {varname} in {list-expression}
Bram Moolenaar04fb9162021-12-30 20:24:12 +00001675 {commands}
1676 endfor
Bram Moolenaar7c626922005-02-07 22:01:03 +00001677
1678To loop a certain number of times you need a List of a specific length. The
1679range() function creates one for you: >
1680
Bram Moolenaar04fb9162021-12-30 20:24:12 +00001681 for a in range(3)
1682 echo a
1683 endfor
Bram Moolenaar7c626922005-02-07 22:01:03 +00001684< 0 ~
1685 1 ~
1686 2 ~
1687
1688Notice that the first item of the List that range() produces is zero, thus the
Bram Moolenaarcfa8f9a2022-06-03 21:59:47 +01001689last item is one less than the length of the list. Detail: Internally range()
1690does not actually create the list, so that a large range used in a for loop
1691works efficiently. When used elsewhere, the range is turned into an actual
1692list, which takes more time for a long ist.
Bram Moolenaar7c626922005-02-07 22:01:03 +00001693
Bram Moolenaar04fb9162021-12-30 20:24:12 +00001694You can also specify the maximum value, the stride and even go backwards: >
1695
1696 for a in range(8, 4, -2)
1697 echo a
1698 endfor
Bram Moolenaar7c626922005-02-07 22:01:03 +00001699< 8 ~
1700 6 ~
1701 4 ~
1702
Bram Moolenaarcfa8f9a2022-06-03 21:59:47 +01001703A more useful example, looping over all the lines in the buffer: >
Bram Moolenaar7c626922005-02-07 22:01:03 +00001704
Bram Moolenaarcfa8f9a2022-06-03 21:59:47 +01001705 for line in getline(1, 50)
Bram Moolenaar04fb9162021-12-30 20:24:12 +00001706 if line =~ "Date: "
1707 echo line
1708 endif
1709 endfor
Bram Moolenaar7c626922005-02-07 22:01:03 +00001710
Bram Moolenaarcfa8f9a2022-06-03 21:59:47 +01001711This looks into lines 1 to 50 (inclusive) and echoes any date found in there.
1712
1713For further reading see |Lists|.
Bram Moolenaar7c626922005-02-07 22:01:03 +00001714
1715
1716DICTIONARIES
1717
1718A Dictionary stores key-value pairs. You can quickly lookup a value if you
1719know the key. A Dictionary is created with curly braces: >
Bram Moolenaarc9b4b052006-04-30 18:54:39 +00001720
Bram Moolenaar04fb9162021-12-30 20:24:12 +00001721 var uk2nl = {one: 'een', two: 'twee', three: 'drie'}
Bram Moolenaar7c626922005-02-07 22:01:03 +00001722
Bram Moolenaar4399ef42005-02-12 14:29:27 +00001723Now you can lookup words by putting the key in square brackets: >
Bram Moolenaar7c626922005-02-07 22:01:03 +00001724
Bram Moolenaar04fb9162021-12-30 20:24:12 +00001725 echo uk2nl['two']
1726< twee ~
1727
1728If the key does not have special characters, you can use the dot notation: >
1729
1730 echo uk2nl.two
Bram Moolenaar7c626922005-02-07 22:01:03 +00001731< twee ~
1732
1733The generic form for defining a Dictionary is: >
1734
1735 {<key> : <value>, ...}
1736
1737An empty Dictionary is one without any keys: >
1738
1739 {}
1740
1741The possibilities with Dictionaries are numerous. There are various functions
1742for them as well. For example, you can obtain a list of the keys and loop
1743over them: >
1744
Bram Moolenaar04fb9162021-12-30 20:24:12 +00001745 for key in keys(uk2nl)
1746 echo key
1747 endfor
Bram Moolenaar7c626922005-02-07 22:01:03 +00001748< three ~
1749 one ~
1750 two ~
1751
Bram Moolenaar3577c6f2008-06-24 21:16:56 +00001752You will notice the keys are not ordered. You can sort the list to get a
Bram Moolenaar7c626922005-02-07 22:01:03 +00001753specific order: >
1754
Bram Moolenaar04fb9162021-12-30 20:24:12 +00001755 for key in sort(keys(uk2nl))
1756 echo key
1757 endfor
Bram Moolenaar7c626922005-02-07 22:01:03 +00001758< one ~
1759 three ~
1760 two ~
1761
1762But you can never get back the order in which items are defined. For that you
1763need to use a List, it stores items in an ordered sequence.
1764
Bram Moolenaarcfa8f9a2022-06-03 21:59:47 +01001765For further reading see |Dictionaries|.
Bram Moolenaar7c626922005-02-07 22:01:03 +00001766
1767==============================================================================
1768*41.9* Exceptions
Bram Moolenaar071d4272004-06-13 20:20:40 +00001769
1770Let's start with an example: >
1771
Bram Moolenaar04fb9162021-12-30 20:24:12 +00001772 try
1773 read ~/templates/pascal.tmpl
1774 catch /E484:/
1775 echo "Sorry, the Pascal template file cannot be found."
1776 endtry
Bram Moolenaar071d4272004-06-13 20:20:40 +00001777
Bram Moolenaar04fb9162021-12-30 20:24:12 +00001778The `read` command will fail if the file does not exist. Instead of
Bram Moolenaar071d4272004-06-13 20:20:40 +00001779generating an error message, this code catches the error and gives the user a
Bram Moolenaarcfa8f9a2022-06-03 21:59:47 +01001780message with more information.
Bram Moolenaar071d4272004-06-13 20:20:40 +00001781
Bram Moolenaar04fb9162021-12-30 20:24:12 +00001782For the commands in between `try` and `endtry` errors are turned into
Bram Moolenaar071d4272004-06-13 20:20:40 +00001783exceptions. An exception is a string. In the case of an error the string
1784contains the error message. And every error message has a number. In this
1785case, the error we catch contains "E484:". This number is guaranteed to stay
1786the same (the text may change, e.g., it may be translated).
1787
Bram Moolenaar04fb9162021-12-30 20:24:12 +00001788Besides being able to give a nice error message, Vim will also continue
Bram Moolenaarcfa8f9a2022-06-03 21:59:47 +01001789executing commands after the `:endtry`. Otherwise, once an uncaught error is
1790encountered, execution of the script/function/mapping will be aborted.
Bram Moolenaar04fb9162021-12-30 20:24:12 +00001791
1792When the `read` command causes another error, the pattern "E484:" will not
Bram Moolenaar071d4272004-06-13 20:20:40 +00001793match in it. Thus this exception will not be caught and result in the usual
Bram Moolenaarcfa8f9a2022-06-03 21:59:47 +01001794error message and excecution is aborted.
Bram Moolenaar071d4272004-06-13 20:20:40 +00001795
1796You might be tempted to do this: >
1797
Bram Moolenaar04fb9162021-12-30 20:24:12 +00001798 try
1799 read ~/templates/pascal.tmpl
1800 catch
1801 echo "Sorry, the Pascal template file cannot be found."
1802 endtry
Bram Moolenaar071d4272004-06-13 20:20:40 +00001803
Bram Moolenaar04fb9162021-12-30 20:24:12 +00001804This means all errors are caught. But then you will not see an error that
1805would indicate a completely different problem, such as "E21: Cannot make
Bram Moolenaarcfa8f9a2022-06-03 21:59:47 +01001806changes, 'modifiable' is off". Think twice before you catch any error!
Bram Moolenaar071d4272004-06-13 20:20:40 +00001807
Bram Moolenaar04fb9162021-12-30 20:24:12 +00001808Another useful mechanism is the `finally` command: >
Bram Moolenaar071d4272004-06-13 20:20:40 +00001809
Bram Moolenaar04fb9162021-12-30 20:24:12 +00001810 var tmp = tempname()
1811 try
1812 exe ":.,$write " .. tmp
1813 exe "!filter " .. tmp
1814 :.,$delete
1815 exe ":$read " .. tmp
1816 finally
Bram Moolenaarcfa8f9a2022-06-03 21:59:47 +01001817 delete(tmp)
Bram Moolenaar04fb9162021-12-30 20:24:12 +00001818 endtry
Bram Moolenaar071d4272004-06-13 20:20:40 +00001819
1820This filters the lines from the cursor until the end of the file through the
1821"filter" command, which takes a file name argument. No matter if the
Bram Moolenaarcfa8f9a2022-06-03 21:59:47 +01001822filtering works, if something goes wrong in between `try` and `finally` or the
1823user cancels the filtering by pressing CTRL-C, the `delete(tmp)` call is
Bram Moolenaar071d4272004-06-13 20:20:40 +00001824always executed. This makes sure you don't leave the temporary file behind.
1825
Bram Moolenaarcfa8f9a2022-06-03 21:59:47 +01001826The `finally` does not catch the exception, the error will still abort
1827further execution.
1828
Bram Moolenaar071d4272004-06-13 20:20:40 +00001829More information about exception handling can be found in the reference
1830manual: |exception-handling|.
1831
1832==============================================================================
Bram Moolenaar7c626922005-02-07 22:01:03 +00001833*41.10* Various remarks
Bram Moolenaar071d4272004-06-13 20:20:40 +00001834
Bram Moolenaarcfa8f9a2022-06-03 21:59:47 +01001835Here are a few items that are useful to know when writing Vim scripts.
1836
1837
1838FILEFORMAT
Bram Moolenaar071d4272004-06-13 20:20:40 +00001839
Bram Moolenaar04fb9162021-12-30 20:24:12 +00001840The end-of-line character depends on the system. For Vim scripts it is
Bram Moolenaarcfa8f9a2022-06-03 21:59:47 +01001841recommended to always use the Unix fileformat. This also works on any other
Bram Moolenaar04fb9162021-12-30 20:24:12 +00001842system. That way you can copy your Vim scripts from MS-Windows to Unix and
1843they still work. See |:source_crnl|. To be sure it is set right, do this
1844before writing the file: >
1845
1846 :setlocal fileformat=unix
Bram Moolenaar071d4272004-06-13 20:20:40 +00001847
1848
1849WHITE SPACE
1850
1851Blank lines are allowed and ignored.
1852
Bram Moolenaar04fb9162021-12-30 20:24:12 +00001853Leading whitespace characters (blanks and TABs) are always ignored.
Bram Moolenaar071d4272004-06-13 20:20:40 +00001854
Bram Moolenaar04fb9162021-12-30 20:24:12 +00001855Trailing whitespace is often ignored, but not always. One command that
1856includes it is `map`.
Bram Moolenaar071d4272004-06-13 20:20:40 +00001857
1858To include a whitespace character in the value of an option, it must be
1859escaped by a "\" (backslash) as in the following example: >
1860
1861 :set tags=my\ nice\ file
1862
Bram Moolenaarcfa8f9a2022-06-03 21:59:47 +01001863If it would be written as: >
Bram Moolenaar071d4272004-06-13 20:20:40 +00001864
1865 :set tags=my nice file
1866
Bram Moolenaarcfa8f9a2022-06-03 21:59:47 +01001867This will issue an error, because it is interpreted as: >
Bram Moolenaar071d4272004-06-13 20:20:40 +00001868
1869 :set tags=my
1870 :set nice
1871 :set file
1872
Bram Moolenaar04fb9162021-12-30 20:24:12 +00001873|Vim9| script is very picky when it comes to white space. This was done
1874intentionally to make sure scripts are easy to read and to avoid mistakes.
Bram Moolenaarcfa8f9a2022-06-03 21:59:47 +01001875If you use white space sensibly it will just work. When not you will get an
1876error message telling you where white space is missing or should be removed.
Bram Moolenaar04fb9162021-12-30 20:24:12 +00001877
Bram Moolenaar071d4272004-06-13 20:20:40 +00001878
1879COMMENTS
1880
Bram Moolenaarcfa8f9a2022-06-03 21:59:47 +01001881In |Vim9| script the character # starts a comment. That character and
1882everything after it until the end-of-line is considered a comment and
Bram Moolenaar071d4272004-06-13 20:20:40 +00001883is ignored, except for commands that don't consider comments, as shown in
Bram Moolenaar04fb9162021-12-30 20:24:12 +00001884examples below. A comment can start on any character position on the line,
Bram Moolenaarcfa8f9a2022-06-03 21:59:47 +01001885but not when it is part of the command, e.g. inside a string.
Bram Moolenaar04fb9162021-12-30 20:24:12 +00001886
1887The character " (the double quote mark) starts a comment in legacy script.
Bram Moolenaarcfa8f9a2022-06-03 21:59:47 +01001888This involves some cleverness to make sure double quoted strings are not
1889recognized as comments (just one reason to prefer |Vim9| script).
Bram Moolenaar071d4272004-06-13 20:20:40 +00001890
1891There is a little "catch" with comments for some commands. Examples: >
1892
Bram Moolenaar04fb9162021-12-30 20:24:12 +00001893 abbrev dev development # shorthand
1894 map <F3> o#include # insert include
1895 execute cmd # do it
1896 !ls *.c # list C files
Bram Moolenaar071d4272004-06-13 20:20:40 +00001897
Bram Moolenaarcfa8f9a2022-06-03 21:59:47 +01001898- The abbreviation 'dev' will be expanded to 'development # shorthand'.
1899- The mapping of <F3> will actually be the whole line after the 'o# ....'
1900 including the '# insert include'.
1901- The `execute` command will give an error.
1902- The `!` command will send everything after it to the shell, most likely
1903 causing an error.
Bram Moolenaar071d4272004-06-13 20:20:40 +00001904
Bram Moolenaar04fb9162021-12-30 20:24:12 +00001905There can be no comment after `map`, `abbreviate`, `execute` and `!` commands
1906(there are a few more commands with this restriction). For the `map`,
1907`abbreviate` and `execute` commands there is a trick: >
1908
1909 abbrev dev development|# shorthand
1910 map <F3> o#include|# insert include
1911 execute '!ls *.c' |# do it
Bram Moolenaar071d4272004-06-13 20:20:40 +00001912
1913With the '|' character the command is separated from the next one. And that
Bram Moolenaar04fb9162021-12-30 20:24:12 +00001914next command is only a comment. The last command, using `execute` is a
1915general solution, it works for all commands that do not accept a comment or a
1916'|' to separate the next command.
Bram Moolenaar071d4272004-06-13 20:20:40 +00001917
1918Notice that there is no white space before the '|' in the abbreviation and
1919mapping. For these commands, any character until the end-of-line or '|' is
1920included. As a consequence of this behavior, you don't always see that
1921trailing whitespace is included: >
1922
Bram Moolenaar04fb9162021-12-30 20:24:12 +00001923 map <F4> o#include
Bram Moolenaar071d4272004-06-13 20:20:40 +00001924
Bram Moolenaarcfa8f9a2022-06-03 21:59:47 +01001925Here it is intended, in other cases it might be accidental. To spot these
1926problems, you can highlight trailing spaces: >
Bram Moolenaar04fb9162021-12-30 20:24:12 +00001927 match Search /\s\+$/
Bram Moolenaar071d4272004-06-13 20:20:40 +00001928
Bram Moolenaar9e1d2832007-05-06 12:51:41 +00001929For Unix there is one special way to comment a line, that allows making a Vim
Bram Moolenaar04fb9162021-12-30 20:24:12 +00001930script executable, and it also works in legacy script: >
Bram Moolenaar9e1d2832007-05-06 12:51:41 +00001931 #!/usr/bin/env vim -S
1932 echo "this is a Vim script"
1933 quit
1934
Bram Moolenaar071d4272004-06-13 20:20:40 +00001935
Bram Moolenaarcfa8f9a2022-06-03 21:59:47 +01001936Advance information about writing Vim script is in |usr_50.txt|.
Bram Moolenaar2d8ed022022-05-21 13:08:16 +01001937
Bram Moolenaar071d4272004-06-13 20:20:40 +00001938==============================================================================
Bram Moolenaar071d4272004-06-13 20:20:40 +00001939
1940Next chapter: |usr_42.txt| Add new menus
1941
Bram Moolenaard473c8c2018-08-11 18:00:22 +02001942Copyright: see |manual-copyright| vim:tw=78:ts=8:noet:ft=help:norl: