blob: 6d135364b47f7b71a94845972e62f2bd8ed9b855 [file] [log] [blame]
Bram Moolenaar016188f2022-06-06 20:52:59 +01001*usr_41.txt* For Vim version 8.2. Last change: 2022 Jun 04
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|
Bram Moolenaar016188f2022-06-06 20:52:59 +010069script file. That matters for how the rest of the file is used. It is
70recommended to put it in the very fist line, before any comments.
Bram Moolenaarcfa8f9a2022-06-03 21:59:47 +010071 *vim9-declarations*
Bram Moolenaar04fb9162021-12-30 20:24:12 +000072The `var i = 1` command declares the "i" variable and initializes it. The
Bram Moolenaar7c626922005-02-07 22:01:03 +000073generic form is: >
Bram Moolenaar071d4272004-06-13 20:20:40 +000074
Bram Moolenaar04fb9162021-12-30 20:24:12 +000075 var {name} = {expression}
Bram Moolenaar071d4272004-06-13 20:20:40 +000076
77In this case the variable name is "i" and the expression is a simple value,
78the number one.
Bram Moolenaar071d4272004-06-13 20:20:40 +000079
Bram Moolenaar04fb9162021-12-30 20:24:12 +000080The `while` command starts a loop. The generic form is: >
Bram Moolenaar071d4272004-06-13 20:20:40 +000081
Bram Moolenaar04fb9162021-12-30 20:24:12 +000082 while {condition}
83 {statements}
84 endwhile
85
86The statements until the matching `endwhile` are executed for as long as the
Bram Moolenaar071d4272004-06-13 20:20:40 +000087condition is true. The condition used here is the expression "i < 5". This
88is true when the variable i is smaller than five.
Bram Moolenaar071d4272004-06-13 20:20:40 +000089 Note:
90 If you happen to write a while loop that keeps on running, you can
91 interrupt it by pressing CTRL-C (CTRL-Break on MS-Windows).
92
Bram Moolenaar04fb9162021-12-30 20:24:12 +000093The `echo` command prints its arguments. In this case the string "count is"
Bram Moolenaar7c626922005-02-07 22:01:03 +000094and the value of the variable i. Since i is one, this will print:
95
96 count is 1 ~
97
Bram Moolenaar04fb9162021-12-30 20:24:12 +000098Then there is the `i += 1` command. This does the same thing as "i = i + 1",
99it adds one to the variable i and assigns the new value to the same variable.
Bram Moolenaar7c626922005-02-07 22:01:03 +0000100
101The example was given to explain the commands, but would you really want to
Bram Moolenaar214641f2017-03-05 17:04:09 +0100102make such a loop, it can be written much more compact: >
Bram Moolenaaraf7f6412005-01-17 22:11:23 +0000103
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000104 for i in range(1, 4)
Bram Moolenaarcfa8f9a2022-06-03 21:59:47 +0100105 echo $"count is {i}"
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000106 endfor
Bram Moolenaaraf7f6412005-01-17 22:11:23 +0000107
Bram Moolenaarcfa8f9a2022-06-03 21:59:47 +0100108We won't explain how `for`, `range()`and `$"string"` work until later. Follow
109the links if you are impatient.
110
111
112TRYING OUT EXAMPLES
113
114You can easily try out most examples in these help files without saving the
115commands in a file. For example, to try out the "for" loop above do this:
1161. position the cursor on the "for"
1172. start Visual mode with "v"
1183. move down to the "endfor"
1194. press colon, then "so" and Enter
120
121After pressing colon you will see ":'<,'>", which is the range of the Visually
122selected text.
123
124For some commands it matters they are executed as in |Vim9| script. But typed
125commands normally use legacy script syntax, such as the example below that
126causes the E1004 error. For that use this fourth step:
1274. press colon, then "vim9 so" and Enter
128
129"vim9" is short for `vim9cmd`, which is a command modifier to execute the
130following command in |Vim9| syntax.
131
132Note that this won't work for examples that require a script context.
Bram Moolenaaraf7f6412005-01-17 22:11:23 +0000133
Bram Moolenaar071d4272004-06-13 20:20:40 +0000134
Bram Moolenaar7dd64a32019-05-31 21:41:05 +0200135FOUR KINDS OF NUMBERS
Bram Moolenaar071d4272004-06-13 20:20:40 +0000136
Bram Moolenaarcfa8f9a2022-06-03 21:59:47 +0100137Numbers can be decimal, hexadecimal, octal and binary.
Bram Moolenaar11e3c5b2021-04-21 18:09:37 +0200138
139A hexadecimal number starts with "0x" or "0X". For example "0x1f" is decimal
Bram Moolenaarcfa8f9a2022-06-03 21:59:47 +010014031 and 0x1234 is decimal 4660.
Bram Moolenaar11e3c5b2021-04-21 18:09:37 +0200141
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000142An octal number starts with "0o", "0O". "0o17" is decimal 15.
Bram Moolenaar11e3c5b2021-04-21 18:09:37 +0200143
144A binary number starts with "0b" or "0B". For example "0b101" is decimal 5.
145
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000146A decimal number is just digits. Careful: In legacy script don't put a zero
Bram Moolenaarcfa8f9a2022-06-03 21:59:47 +0100147before a decimal number, it will be interpreted as an octal number! That's
148one reason to use |Vim9| script.
Bram Moolenaar11e3c5b2021-04-21 18:09:37 +0200149
Bram Moolenaarcfa8f9a2022-06-03 21:59:47 +0100150The `echo` command evaluates its argument and when it is a number always
151prints the decimal form. Example: >
Bram Moolenaar071d4272004-06-13 20:20:40 +0000152
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000153 echo 0x7f 0o36
Bram Moolenaar071d4272004-06-13 20:20:40 +0000154< 127 30 ~
155
Bram Moolenaar7dd64a32019-05-31 21:41:05 +0200156A number is made negative with a minus sign. This also works for hexadecimal,
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000157octal and binary numbers: >
Bram Moolenaar071d4272004-06-13 20:20:40 +0000158
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000159 echo -0x7f
160< -127 ~
Bram Moolenaar071d4272004-06-13 20:20:40 +0000161
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000162A minus sign is also used for subtraction. This can sometimes lead to
163confusion. If we put a minus sign before both numbers we get an error: >
Bram Moolenaar071d4272004-06-13 20:20:40 +0000164
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000165 echo -0x7f -0o36
166< E1004: White space required before and after '-' at "-0o36" ~
167
168Note: if you are not using a |Vim9| script to try out these commands but type
169them directly, they will be executed as legacy script. Then the echo command
170sees the second minus sign as subtraction. To get the error, prefix the
171command with `vim9cmd`: >
172
173 vim9cmd echo -0x7f -0o36
174< E1004: White space required before and after '-' at "-0o36" ~
175
176White space in an expression is often required to make sure it is easy to read
177and avoid errors. Such as thinking that the "-0o36" above makes the number
178negative, while it is actually seen as a subtraction.
179
180To actually have the minus sign be used for negation, you can put the second
Bram Moolenaar944697a2022-02-20 19:48:20 +0000181expression in parentheses: >
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000182
183 echo -0x7f (-0o36)
Bram Moolenaarcfa8f9a2022-06-03 21:59:47 +0100184< -127 -30 ~
Bram Moolenaar071d4272004-06-13 20:20:40 +0000185
186==============================================================================
187*41.2* Variables
188
189A variable name consists of ASCII letters, digits and the underscore. It
190cannot start with a digit. Valid variable names are:
191
192 counter
193 _aap3
194 very_long_variable_name_with_underscores
Bram Moolenaarcfa8f9a2022-06-03 21:59:47 +0100195 CamelCaseName
Bram Moolenaar071d4272004-06-13 20:20:40 +0000196 LENGTH
197
198Invalid names are "foo+bar" and "6var".
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000199
200Some variables are global. To see a list of currently defined global
201variables type this command: >
Bram Moolenaar071d4272004-06-13 20:20:40 +0000202
203 :let
204
Bram Moolenaarcfa8f9a2022-06-03 21:59:47 +0100205You can use global variables everywhere. However, it is too easy to use the
206same name in two unrelated scripts. Therefore variables declared in a script
207are local to that script. For example, if you have this in "script1.vim": >
Bram Moolenaar071d4272004-06-13 20:20:40 +0000208
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000209 vim9script
210 var counter = 5
211 echo counter
212< 5 ~
Bram Moolenaar071d4272004-06-13 20:20:40 +0000213
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000214And you try to use the variable in "script2.vim": >
215
216 vim9script
217 echo counter
218< E121: Undefined variable: counter ~
219
220Using a script-local variable means you can be sure that it is only changed in
221that script and not elsewhere.
222
223If you do want to share variables between scripts, use the "g:" prefix and
Bram Moolenaarcfa8f9a2022-06-03 21:59:47 +0100224assign the value directly, do not use `var`. And use a specific name to avoid
225mistakes. Thus in "script1.vim": >
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000226
227 vim9script
Bram Moolenaarcfa8f9a2022-06-03 21:59:47 +0100228 g:mash_counter = 5
229 echo g:mash_counter
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000230< 5 ~
231
232And then in "script2.vim": >
233
234 vim9script
Bram Moolenaarcfa8f9a2022-06-03 21:59:47 +0100235 echo g:mash_counter
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000236< 5 ~
237
Bram Moolenaarcfa8f9a2022-06-03 21:59:47 +0100238Global variables can also be accessed on the command line, E.g. typing this: >
239 echo g:mash_counter
240That will not work for a script-local variable.
241
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000242More about script-local variables here: |script-variable|.
Bram Moolenaar071d4272004-06-13 20:20:40 +0000243
244There are more kinds of variables, see |internal-variables|. The most often
245used ones are:
246
247 b:name variable local to a buffer
248 w:name variable local to a window
249 g:name global variable (also in a function)
250 v:name variable predefined by Vim
251
252
253DELETING VARIABLES
254
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000255Variables take up memory and show up in the output of the `let` command. To
256delete a global variable use the `unlet` command. Example: >
Bram Moolenaar071d4272004-06-13 20:20:40 +0000257
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000258 unlet g:counter
Bram Moolenaar071d4272004-06-13 20:20:40 +0000259
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000260This deletes the global variable "g:counter" to free up the memory it uses.
261If you are not sure if the variable exists, and don't want an error message
262when it doesn't, append !: >
Bram Moolenaar071d4272004-06-13 20:20:40 +0000263
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000264 unlet! g:counter
Bram Moolenaar071d4272004-06-13 20:20:40 +0000265
Bram Moolenaarcfa8f9a2022-06-03 21:59:47 +0100266You cannot `unlet` script-local variables in |Vim9| script, only in legacy
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000267script.
Bram Moolenaar071d4272004-06-13 20:20:40 +0000268
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000269When a script finishes, the local variables declared there will not be
270deleted. Functions defined in the script can use them. Example:
271>
272 vim9script
273 var counter = 0
274 def g:GetCount(): number
275 s:counter += 1
276 return s:counter
277 enddef
Bram Moolenaar071d4272004-06-13 20:20:40 +0000278
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000279Every time you call the function it will return the next count: >
280 :echo g:GetCount()
281< 1 ~
282>
283 :echo g:GetCount()
284< 2 ~
Bram Moolenaar071d4272004-06-13 20:20:40 +0000285
Bram Moolenaarcfa8f9a2022-06-03 21:59:47 +0100286If you are worried a script-local variable is consuming too much memory, set
287it to an empty or null value after you no longer need it. Example: >
288 var lines = readfile(...)
289 ...
290 lines = []
Bram Moolenaar071d4272004-06-13 20:20:40 +0000291
Bram Moolenaarcfa8f9a2022-06-03 21:59:47 +0100292Note: below we'll leave out the `vim9script` line from examples, so we can
293concentrate on the relevant commands, but you'll still need to put it at the
294top of your script file.
Bram Moolenaar071d4272004-06-13 20:20:40 +0000295
296
297STRING VARIABLES AND CONSTANTS
298
299So far only numbers were used for the variable value. Strings can be used as
Bram Moolenaar7c626922005-02-07 22:01:03 +0000300well. Numbers and strings are the basic types of variables that Vim supports.
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000301Example: >
Bram Moolenaar071d4272004-06-13 20:20:40 +0000302
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000303 var name = "Peter"
304 echo name
Bram Moolenaar2f0936c2022-01-08 21:51:59 +0000305< Peter ~
Bram Moolenaar071d4272004-06-13 20:20:40 +0000306
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000307Every variable has a type. Very often, as in this example, the type is
308defined by assigning a value. This is called type inference. If you do not
309want to give the variable a value yet, you need to specify the type: >
Bram Moolenaar071d4272004-06-13 20:20:40 +0000310
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000311 var name: string
312 var age: number
Bram Moolenaarcfa8f9a2022-06-03 21:59:47 +0100313 if male
314 name = "Peter"
315 age = 42
316 else
317 name = "Elisa"
318 age = 45
319 endif
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000320
321If you make a mistake and try to assign the wrong type of value you'll get an
322error: >
323
324 age = "Peter"
325< E1012: Type mismatch; expected number but got string ~
326
327More about types in |41.8|.
328
Bram Moolenaarcfa8f9a2022-06-03 21:59:47 +0100329To assign a string value to a variable, you can use a string constant. There
330are two types of these. First the string in double quotes, as we used
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000331already. If you want to include a double quote inside the string, put a
332backslash in front of it: >
333
334 var name = "he is \"Peter\""
335 echo name
336< he is "Peter" ~
Bram Moolenaar071d4272004-06-13 20:20:40 +0000337
Bram Moolenaarcfa8f9a2022-06-03 21:59:47 +0100338To avoid the need for backslashes, you can use a string in single quotes: >
Bram Moolenaar071d4272004-06-13 20:20:40 +0000339
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000340 var name = 'he is "Peter"'
341 echo name
342< he is "Peter" ~
Bram Moolenaar071d4272004-06-13 20:20:40 +0000343
Bram Moolenaar7c626922005-02-07 22:01:03 +0000344Inside a single-quote string all the characters are as they are. Only the
345single quote itself is special: you need to use two to get one. A backslash
346is taken literally, thus you can't use it to change the meaning of the
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000347character after it: >
348
349 var name = 'P\e''ter'''
350 echo name
351< P\e'ter' ~
352
353In double-quote strings it is possible to use special characters. Here are a
354few useful ones:
Bram Moolenaar071d4272004-06-13 20:20:40 +0000355
356 \t <Tab>
357 \n <NL>, line break
358 \r <CR>, <Enter>
359 \e <Esc>
360 \b <BS>, backspace
361 \" "
362 \\ \, backslash
363 \<Esc> <Esc>
364 \<C-W> CTRL-W
365
366The last two are just examples. The "\<name>" form can be used to include
367the special key "name".
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000368
369See |expr-quote| for the full list of special items in a string.
Bram Moolenaar071d4272004-06-13 20:20:40 +0000370
371==============================================================================
372*41.3* Expressions
373
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000374Vim has a fairly standard way to handle expressions. You can read the
Bram Moolenaar071d4272004-06-13 20:20:40 +0000375definition here: |expression-syntax|. Here we will show the most common
376items.
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000377
378The numbers, strings and variables mentioned above are expressions by
Bram Moolenaar071d4272004-06-13 20:20:40 +0000379themselves. Thus everywhere an expression is expected, you can use a number,
380string or variable. Other basic items in an expression are:
381
382 $NAME environment variable
Bram Moolenaarcfa8f9a2022-06-03 21:59:47 +0100383 &name option value
384 @r register contents
Bram Moolenaar071d4272004-06-13 20:20:40 +0000385
386Examples: >
387
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000388 echo "The value of 'tabstop' is" &ts
389 echo "Your home directory is" $HOME
390 if @a == 'text'
Bram Moolenaar071d4272004-06-13 20:20:40 +0000391
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000392The &name form can also be used to set an option value, do something and
393restore the old value. Example: >
Bram Moolenaar071d4272004-06-13 20:20:40 +0000394
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000395 var save_ic = &ic
396 set noic
397 s/The Start/The Beginning/
398 &ic = save_ic
Bram Moolenaar071d4272004-06-13 20:20:40 +0000399
400This makes sure the "The Start" pattern is used with the 'ignorecase' option
Bram Moolenaar7c626922005-02-07 22:01:03 +0000401off. Still, it keeps the value that the user had set. (Another way to do
402this would be to add "\C" to the pattern, see |/\C|.)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000403
404
405MATHEMATICS
406
407It becomes more interesting if we combine these basic items. Let's start with
408mathematics on numbers:
409
410 a + b add
411 a - b subtract
412 a * b multiply
413 a / b divide
414 a % b modulo
415
416The usual precedence is used. Example: >
417
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000418 echo 10 + 5 * 2
Bram Moolenaar071d4272004-06-13 20:20:40 +0000419< 20 ~
420
Bram Moolenaar00654022011-02-25 14:42:19 +0100421Grouping is done with parentheses. No surprises here. Example: >
Bram Moolenaar071d4272004-06-13 20:20:40 +0000422
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000423 echo (10 + 5) * 2
Bram Moolenaar071d4272004-06-13 20:20:40 +0000424< 30 ~
425
Bram Moolenaarcfa8f9a2022-06-03 21:59:47 +0100426
427OTHERS
428
Bram Moolenaar1c6737b2020-09-07 22:18:52 +0200429Strings can be concatenated with ".." (see |expr6|). Example: >
Bram Moolenaar071d4272004-06-13 20:20:40 +0000430
Bram Moolenaarcfa8f9a2022-06-03 21:59:47 +0100431 echo "Name: " .. name
432 Name: Peter
Bram Moolenaar071d4272004-06-13 20:20:40 +0000433
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000434When the "echo" command gets multiple arguments, it separates them with a
Bram Moolenaar071d4272004-06-13 20:20:40 +0000435space. In the example the argument is a single expression, thus no space is
436inserted.
437
Bram Moolenaarcfa8f9a2022-06-03 21:59:47 +0100438If you don't like the concatenation you can use the $"string" form, which
439accepts an expression in curly braces: >
440 echo $"Name: {name}"
441
442See |interp-string| for more information.
443
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000444Borrowed from the C language is the conditional expression: >
Bram Moolenaar071d4272004-06-13 20:20:40 +0000445
446 a ? b : c
447
448If "a" evaluates to true "b" is used, otherwise "c" is used. Example: >
449
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000450 var nr = 4
451 echo nr > 5 ? "nr is big" : "nr is small"
452< nr is small ~
Bram Moolenaar071d4272004-06-13 20:20:40 +0000453
454The three parts of the constructs are always evaluated first, thus you could
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000455see it works as: >
Bram Moolenaar071d4272004-06-13 20:20:40 +0000456
457 (a) ? (b) : (c)
458
Bram Moolenaarcfa8f9a2022-06-03 21:59:47 +0100459There is also the falsy operator: >
460 echo name ?? "No name given"
461See |??|.
462
Bram Moolenaar071d4272004-06-13 20:20:40 +0000463==============================================================================
464*41.4* Conditionals
465
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000466The `if` commands executes the following statements, until the matching
467`endif`, only when a condition is met. The generic form is:
Bram Moolenaar071d4272004-06-13 20:20:40 +0000468
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000469 if {condition}
Bram Moolenaar071d4272004-06-13 20:20:40 +0000470 {statements}
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000471 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000472
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000473Only when the expression {condition} evaluates to true or one will the
474{statements} be executed. If they are not executed they must still be valid
475commands. If they contain garbage, Vim won't be able to find the matching
476`endif`.
Bram Moolenaar071d4272004-06-13 20:20:40 +0000477
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000478You can also use `else`. The generic form for this is:
479
480 if {condition}
Bram Moolenaar071d4272004-06-13 20:20:40 +0000481 {statements}
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000482 else
Bram Moolenaar071d4272004-06-13 20:20:40 +0000483 {statements}
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000484 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000485
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000486The second {statements} block is only executed if the first one isn't.
Bram Moolenaar071d4272004-06-13 20:20:40 +0000487
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000488Finally, there is `elseif`
489
490 if {condition}
Bram Moolenaar071d4272004-06-13 20:20:40 +0000491 {statements}
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000492 elseif {condition}
Bram Moolenaar071d4272004-06-13 20:20:40 +0000493 {statements}
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000494 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000495
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000496This works just like using `else` and then `if`, but without the need for an
497extra `endif`.
Bram Moolenaar071d4272004-06-13 20:20:40 +0000498
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000499A useful example for your vimrc file is checking the 'term' option and doing
500something depending upon its value: >
501
502 if &term == "xterm"
503 # Do stuff for xterm
504 elseif &term == "vt100"
505 # Do stuff for a vt100 terminal
506 else
507 # Do something for other terminals
508 endif
509
510This uses "#" to start a comment, more about that later.
Bram Moolenaar071d4272004-06-13 20:20:40 +0000511
512
513LOGIC OPERATIONS
514
515We already used some of them in the examples. These are the most often used
516ones:
517
518 a == b equal to
519 a != b not equal to
520 a > b greater than
521 a >= b greater than or equal to
522 a < b less than
523 a <= b less than or equal to
524
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000525The result is true if the condition is met and false otherwise. An example: >
Bram Moolenaar071d4272004-06-13 20:20:40 +0000526
Bram Moolenaarcfa8f9a2022-06-03 21:59:47 +0100527 if v:version >= 800
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000528 echo "congratulations"
529 else
530 echo "you are using an old version, upgrade!"
531 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000532
533Here "v:version" is a variable defined by Vim, which has the value of the Vim
Bram Moolenaarcfa8f9a2022-06-03 21:59:47 +0100534version. 800 is for version 8.0, version 8.1 has the value 801. This is
535useful to write a script that works with multiple versions of Vim.
536See |v:version|. You can also check for a specific feature with `has()` or a
537specific patch, see |has-patch|.
Bram Moolenaar071d4272004-06-13 20:20:40 +0000538
539The logic operators work both for numbers and strings. When comparing two
540strings, the mathematical difference is used. This compares byte values,
541which may not be right for some languages.
Bram Moolenaar071d4272004-06-13 20:20:40 +0000542
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000543If you try to compare a string with a number you will get an error.
Bram Moolenaar071d4272004-06-13 20:20:40 +0000544
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000545For strings there are two more useful items:
Bram Moolenaar071d4272004-06-13 20:20:40 +0000546
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000547 str =~ pat matches with
548 str !~ pat does not match with
Bram Moolenaar071d4272004-06-13 20:20:40 +0000549
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000550The left item "str" is used as a string. The right item "pat" is used as a
Bram Moolenaar071d4272004-06-13 20:20:40 +0000551pattern, like what's used for searching. Example: >
552
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000553 if str =~ " "
554 echo "str contains a space"
555 endif
556 if str !~ '\.$'
557 echo "str does not end in a full stop"
558 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000559
560Notice the use of a single-quote string for the pattern. This is useful,
Bram Moolenaarcfa8f9a2022-06-03 21:59:47 +0100561because patterns tend to contain many backslashes and backslashes need to be
562doubled in a double-quote string.
Bram Moolenaar071d4272004-06-13 20:20:40 +0000563
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000564The match is not anchored, if you want to match the whole string start with
565"^" and end with "$".
566
567The 'ignorecase' option is not used when comparing strings. When you do want
568to ignore case append "?". Thus "==?" compares two strings to be equal while
569ignoring case. For the full table see |expr-==|.
Bram Moolenaar071d4272004-06-13 20:20:40 +0000570
571
572MORE LOOPING
573
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000574The `while` command was already mentioned. Two more statements can be used in
575between the `while` and the `endwhile`:
Bram Moolenaar071d4272004-06-13 20:20:40 +0000576
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000577 continue Jump back to the start of the while loop; the
Bram Moolenaar071d4272004-06-13 20:20:40 +0000578 loop continues.
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000579 break Jump forward to the `endwhile`; the loop is
Bram Moolenaar071d4272004-06-13 20:20:40 +0000580 discontinued.
581
582Example: >
583
Bram Moolenaar2f0936c2022-01-08 21:51:59 +0000584 var counter = 1
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000585 while counter < 40
Bram Moolenaar2f0936c2022-01-08 21:51:59 +0000586 if skip_number(counter)
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000587 continue
588 endif
Bram Moolenaar2f0936c2022-01-08 21:51:59 +0000589 if last_number(counter)
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000590 break
591 endif
592 sleep 50m
Bram Moolenaar2f0936c2022-01-08 21:51:59 +0000593 ++counter
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000594 endwhile
Bram Moolenaar071d4272004-06-13 20:20:40 +0000595
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000596The `sleep` command makes Vim take a nap. The "50m" specifies fifty
597milliseconds. Another example is `sleep 4`, which sleeps for four seconds.
Bram Moolenaar071d4272004-06-13 20:20:40 +0000598
Bram Moolenaarcfa8f9a2022-06-03 21:59:47 +0100599`continue` and `break` can also be used in between `for` and `endfor`.
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000600Even more looping can be done with the `for` command, see below in |41.8|.
Bram Moolenaar7c626922005-02-07 22:01:03 +0000601
Bram Moolenaar071d4272004-06-13 20:20:40 +0000602==============================================================================
603*41.5* Executing an expression
604
605So far the commands in the script were executed by Vim directly. The
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000606`execute` command allows executing the result of an expression. This is a
Bram Moolenaar071d4272004-06-13 20:20:40 +0000607very powerful way to build commands and execute them.
Bram Moolenaar071d4272004-06-13 20:20:40 +0000608
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000609An example is to jump to a tag, which is contained in a variable: >
610
611 execute "tag " .. tag_name
Bram Moolenaar071d4272004-06-13 20:20:40 +0000612
Bram Moolenaar1c6737b2020-09-07 22:18:52 +0200613The ".." is used to concatenate the string "tag " with the value of variable
Bram Moolenaar071d4272004-06-13 20:20:40 +0000614"tag_name". Suppose "tag_name" has the value "get_cmd", then the command that
615will be executed is: >
616
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000617 tag get_cmd
Bram Moolenaar071d4272004-06-13 20:20:40 +0000618
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000619The `execute` command can only execute Ex commands. The `normal` command
Bram Moolenaar071d4272004-06-13 20:20:40 +0000620executes Normal mode commands. However, its argument is not an expression but
621the literal command characters. Example: >
622
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000623 normal gg=G
Bram Moolenaar071d4272004-06-13 20:20:40 +0000624
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000625This jumps to the first line with "gg" and formats all lines with the "="
626operator and the "G" movement.
627
628To make `normal` work with an expression, combine `execute` with it.
Bram Moolenaar071d4272004-06-13 20:20:40 +0000629Example: >
630
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000631 execute "normal " .. count .. "j"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000632
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000633This will move the cursor "count" lines down.
634
635Make sure that the argument for `normal` is a complete command. Otherwise
Bram Moolenaarcfa8f9a2022-06-03 21:59:47 +0100636Vim will run into the end of the argument and silently abort the command. For
637example, if you start the delete operator, you must give the movement command
638also. This works: >
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000639
640 normal d$
Bram Moolenaar071d4272004-06-13 20:20:40 +0000641
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000642This does nothing: >
Bram Moolenaar071d4272004-06-13 20:20:40 +0000643
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000644 normal d
645
646If you start Insert mode and do not end it with Esc, it will end anyway. This
647works to insert "new text": >
648
649 execute "normal inew text"
650
651If you want to do something after inserting text you do need to end Insert
652mode: >
653
654 execute "normal inew text\<Esc>b"
655
656This inserts "new text" and puts the cursor on the first letter of "text".
657Notice the use of the special key "\<Esc>". This avoids having to enter a
658real <Esc> character in your script. That is where `execute` with a
659double-quote string comes in handy.
Bram Moolenaar071d4272004-06-13 20:20:40 +0000660
Bram Moolenaarcfa8f9a2022-06-03 21:59:47 +0100661If you don't want to execute a string as a command but evaluate it to get the
662result of the expression, you can use the eval() function: >
Bram Moolenaar7c626922005-02-07 22:01:03 +0000663
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000664 var optname = "path"
665 var optvalue = eval('&' .. optname)
Bram Moolenaar7c626922005-02-07 22:01:03 +0000666
667A "&" character is prepended to "path", thus the argument to eval() is
668"&path". The result will then be the value of the 'path' option.
Bram Moolenaar7c626922005-02-07 22:01:03 +0000669
Bram Moolenaar071d4272004-06-13 20:20:40 +0000670==============================================================================
671*41.6* Using functions
672
673Vim defines many functions and provides a large amount of functionality that
674way. A few examples will be given in this section. You can find the whole
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000675list below: |function-list|.
Bram Moolenaar071d4272004-06-13 20:20:40 +0000676
Bram Moolenaarcfa8f9a2022-06-03 21:59:47 +0100677A function is called with the parameters in between parentheses, separated by
678commas. Example: >
Bram Moolenaar071d4272004-06-13 20:20:40 +0000679
Bram Moolenaarcfa8f9a2022-06-03 21:59:47 +0100680 search("Date: ", "W")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000681
682This calls the search() function, with arguments "Date: " and "W". The
683search() function uses its first argument as a search pattern and the second
684one as flags. The "W" flag means the search doesn't wrap around the end of
685the file.
686
Bram Moolenaarcfa8f9a2022-06-03 21:59:47 +0100687Using the `call` command is optional in |Vim9| script. This works the same
688way and also works in legacy script and on the command line: >
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000689
Bram Moolenaarcfa8f9a2022-06-03 21:59:47 +0100690 call search("Date: ", "W")
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000691
Bram Moolenaar071d4272004-06-13 20:20:40 +0000692A function can be called in an expression. Example: >
693
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000694 var line = getline(".")
695 var repl = substitute(line, '\a', "*", "g")
696 setline(".", repl)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000697
Bram Moolenaar7c626922005-02-07 22:01:03 +0000698The getline() function obtains a line from the current buffer. Its argument
699is a specification of the line number. In this case "." is used, which means
700the line where the cursor is.
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000701
Bram Moolenaarcfa8f9a2022-06-03 21:59:47 +0100702The substitute() function does something similar to the `:substitute` command.
703The first argument "line" is the string on which to perform the substitution.
704The second argument '\a' is the pattern, the third "*" is the replacement
705string. Finally, the last argument "g" is the flags.
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000706
707The setline() function sets the line, specified by the first argument, to a
Bram Moolenaar071d4272004-06-13 20:20:40 +0000708new string, the second argument. In this example the line under the cursor is
709replaced with the result of the substitute(). Thus the effect of the three
710statements is equal to: >
711
712 :substitute/\a/*/g
713
714Using the functions becomes more interesting when you do more work before and
715after the substitute() call.
716
717
718FUNCTIONS *function-list*
719
720There are many functions. We will mention them here, grouped by what they are
Bram Moolenaar04fb9162021-12-30 20:24:12 +0000721used for. You can find an alphabetical list here: |builtin-function-list|.
722Use CTRL-] on the function name to jump to detailed help on it.
Bram Moolenaar071d4272004-06-13 20:20:40 +0000723
Bram Moolenaara3f41662010-07-11 19:01:06 +0200724String manipulation: *string-functions*
Bram Moolenaar9d401282019-04-06 13:18:12 +0200725 nr2char() get a character by its number value
726 list2str() get a character string from a list of numbers
727 char2nr() get number value of a character
728 str2list() get list of numbers from a string
Bram Moolenaar3577c6f2008-06-24 21:16:56 +0000729 str2nr() convert a string to a Number
730 str2float() convert a string to a Float
Bram Moolenaarc6fe9192006-04-09 21:54:49 +0000731 printf() format a string according to % items
Bram Moolenaar071d4272004-06-13 20:20:40 +0000732 escape() escape characters in a string with a '\'
Bram Moolenaar3577c6f2008-06-24 21:16:56 +0000733 shellescape() escape a string for use with a shell command
734 fnameescape() escape a file name for use with a Vim command
Bram Moolenaarc6fe9192006-04-09 21:54:49 +0000735 tr() translate characters from one set to another
Bram Moolenaar071d4272004-06-13 20:20:40 +0000736 strtrans() translate a string to make it printable
737 tolower() turn a string to lowercase
738 toupper() turn a string to uppercase
Bram Moolenaar4e4473c2020-08-28 22:24:57 +0200739 charclass() class of a character
Bram Moolenaar071d4272004-06-13 20:20:40 +0000740 match() position where a pattern matches in a string
741 matchend() position where a pattern match ends in a string
Bram Moolenaar635414d2020-09-11 22:25:15 +0200742 matchfuzzy() fuzzy matches a string in a list of strings
Bram Moolenaar4f73b8e2020-09-22 20:33:50 +0200743 matchfuzzypos() fuzzy matches a string in a list of strings
Bram Moolenaar071d4272004-06-13 20:20:40 +0000744 matchstr() match of a pattern in a string
Bram Moolenaar6f1d9a02016-07-24 14:12:38 +0200745 matchstrpos() match and positions of a pattern in a string
Bram Moolenaarc6fe9192006-04-09 21:54:49 +0000746 matchlist() like matchstr() and also return submatches
Bram Moolenaar071d4272004-06-13 20:20:40 +0000747 stridx() first index of a short string in a long string
748 strridx() last index of a short string in a long string
Bram Moolenaar8d043172014-01-23 14:24:41 +0100749 strlen() length of a string in bytes
Bram Moolenaar70ce8a12021-03-14 19:02:09 +0100750 strcharlen() length of a string in characters
751 strchars() number of characters in a string
Bram Moolenaar8d043172014-01-23 14:24:41 +0100752 strwidth() size of string when displayed
753 strdisplaywidth() size of string when displayed, deals with tabs
Bram Moolenaar08aac3c2020-08-28 21:04:24 +0200754 setcellwidths() set character cell width overrides
Bram Moolenaar071d4272004-06-13 20:20:40 +0000755 substitute() substitute a pattern match with a string
Bram Moolenaar251e1912011-06-19 05:09:16 +0200756 submatch() get a specific match in ":s" and substitute()
Bram Moolenaarc95a3022016-06-12 23:01:46 +0200757 strpart() get part of a string using byte index
758 strcharpart() get part of a string using char index
Bram Moolenaar6601b622021-01-13 21:47:15 +0100759 slice() take a slice of a string, using char index in
760 Vim9 script
Bram Moolenaarc95a3022016-06-12 23:01:46 +0200761 strgetchar() get character from a string using char index
Bram Moolenaar071d4272004-06-13 20:20:40 +0000762 expand() expand special keywords
Bram Moolenaar80dad482019-06-09 17:22:31 +0200763 expandcmd() expand a command like done for `:edit`
Bram Moolenaar071d4272004-06-13 20:20:40 +0000764 iconv() convert text from one encoding to another
Bram Moolenaarc6fe9192006-04-09 21:54:49 +0000765 byteidx() byte index of a character in a string
Bram Moolenaar8d043172014-01-23 14:24:41 +0100766 byteidxcomp() like byteidx() but count composing characters
Bram Moolenaar17793ef2020-12-28 12:56:58 +0100767 charidx() character index of a byte in a string
Bram Moolenaarc6fe9192006-04-09 21:54:49 +0000768 repeat() repeat a string multiple times
769 eval() evaluate a string expression
Bram Moolenaar063b9d12016-07-09 20:21:48 +0200770 execute() execute an Ex command and get the output
Bram Moolenaar7dd64a32019-05-31 21:41:05 +0200771 win_execute() like execute() but in a specified window
Bram Moolenaarb730f0c2018-11-25 03:56:26 +0100772 trim() trim characters from a string
Bram Moolenaar0b39c3f2020-08-30 15:52:10 +0200773 gettext() lookup message translation
Bram Moolenaar071d4272004-06-13 20:20:40 +0000774
Bram Moolenaara3f41662010-07-11 19:01:06 +0200775List manipulation: *list-functions*
Bram Moolenaaraf7f6412005-01-17 22:11:23 +0000776 get() get an item without error for wrong index
777 len() number of items in a List
778 empty() check if List is empty
779 insert() insert an item somewhere in a List
780 add() append an item to a List
781 extend() append a List to a List
Bram Moolenaarb0e6b512021-01-12 20:23:40 +0100782 extendnew() make a new List and append items
Bram Moolenaaraf7f6412005-01-17 22:11:23 +0000783 remove() remove one or more items from a List
784 copy() make a shallow copy of a List
785 deepcopy() make a full copy of a List
786 filter() remove selected items from a List
787 map() change each List item
Bram Moolenaarea696852020-11-09 18:31:39 +0100788 mapnew() make a new List with changed items
Bram Moolenaarebacddb2020-06-04 15:22:21 +0200789 reduce() reduce a List to a value
Bram Moolenaar6601b622021-01-13 21:47:15 +0100790 slice() take a slice of a List
Bram Moolenaaraf7f6412005-01-17 22:11:23 +0000791 sort() sort a List
792 reverse() reverse the order of a List
Bram Moolenaar76f3b1a2014-03-27 22:30:07 +0100793 uniq() remove copies of repeated adjacent items
Bram Moolenaaraf7f6412005-01-17 22:11:23 +0000794 split() split a String into a List
795 join() join List items into a String
Bram Moolenaarc6fe9192006-04-09 21:54:49 +0000796 range() return a List with a sequence of numbers
Bram Moolenaaraf7f6412005-01-17 22:11:23 +0000797 string() String representation of a List
798 call() call a function with List as arguments
Bram Moolenaar9ba0eb82005-06-13 22:28:56 +0000799 index() index of a value in a List
Bram Moolenaaraf7f6412005-01-17 22:11:23 +0000800 max() maximum value in a List
801 min() minimum value in a List
802 count() count number of times a value appears in a List
Bram Moolenaarc6fe9192006-04-09 21:54:49 +0000803 repeat() repeat a List multiple times
Bram Moolenaar077a1e62020-06-08 20:50:43 +0200804 flatten() flatten a List
Bram Moolenaar3b690062021-02-01 20:14:51 +0100805 flattennew() flatten a copy of a List
Bram Moolenaaraf7f6412005-01-17 22:11:23 +0000806
Bram Moolenaara3f41662010-07-11 19:01:06 +0200807Dictionary manipulation: *dict-functions*
Bram Moolenaar9ba0eb82005-06-13 22:28:56 +0000808 get() get an entry without an error for a wrong key
Bram Moolenaaraf7f6412005-01-17 22:11:23 +0000809 len() number of entries in a Dictionary
810 has_key() check whether a key appears in a Dictionary
811 empty() check if Dictionary is empty
812 remove() remove an entry from a Dictionary
813 extend() add entries from one Dictionary to another
Bram Moolenaarb0e6b512021-01-12 20:23:40 +0100814 extendnew() make a new Dictionary and append items
Bram Moolenaaraf7f6412005-01-17 22:11:23 +0000815 filter() remove selected entries from a Dictionary
816 map() change each Dictionary entry
Bram Moolenaarea696852020-11-09 18:31:39 +0100817 mapnew() make a new Dictionary with changed items
Bram Moolenaaraf7f6412005-01-17 22:11:23 +0000818 keys() get List of Dictionary keys
819 values() get List of Dictionary values
820 items() get List of Dictionary key-value pairs
821 copy() make a shallow copy of a Dictionary
822 deepcopy() make a full copy of a Dictionary
823 string() String representation of a Dictionary
824 max() maximum value in a Dictionary
825 min() minimum value in a Dictionary
826 count() count number of times a value appears
827
Bram Moolenaara3f41662010-07-11 19:01:06 +0200828Floating point computation: *float-functions*
Bram Moolenaar3577c6f2008-06-24 21:16:56 +0000829 float2nr() convert Float to Number
830 abs() absolute value (also works for Number)
831 round() round off
832 ceil() round up
833 floor() round down
834 trunc() remove value after decimal point
Bram Moolenaar8d043172014-01-23 14:24:41 +0100835 fmod() remainder of division
836 exp() exponential
837 log() natural logarithm (logarithm to base e)
Bram Moolenaar3577c6f2008-06-24 21:16:56 +0000838 log10() logarithm to base 10
839 pow() value of x to the exponent y
840 sqrt() square root
841 sin() sine
842 cos() cosine
Bram Moolenaar662db672011-03-22 14:05:35 +0100843 tan() tangent
844 asin() arc sine
845 acos() arc cosine
Bram Moolenaar3577c6f2008-06-24 21:16:56 +0000846 atan() arc tangent
Bram Moolenaar662db672011-03-22 14:05:35 +0100847 atan2() arc tangent
848 sinh() hyperbolic sine
849 cosh() hyperbolic cosine
850 tanh() hyperbolic tangent
Bram Moolenaarebacddb2020-06-04 15:22:21 +0200851 isinf() check for infinity
Bram Moolenaarc95a3022016-06-12 23:01:46 +0200852 isnan() check for not a number
Bram Moolenaar3577c6f2008-06-24 21:16:56 +0000853
Yegappan Lakshmanan5dfe4672021-09-14 17:54:30 +0200854Blob manipulation: *blob-functions*
855 blob2list() get a list of numbers from a blob
856 list2blob() get a blob from a list of numbers
857
Bram Moolenaarb6b046b2011-12-30 13:11:27 +0100858Other computation: *bitwise-function*
859 and() bitwise AND
860 invert() bitwise invert
861 or() bitwise OR
862 xor() bitwise XOR
Bram Moolenaar8d043172014-01-23 14:24:41 +0100863 sha256() SHA-256 hash
Bram Moolenaarebacddb2020-06-04 15:22:21 +0200864 rand() get a pseudo-random number
865 srand() initialize seed used by rand()
Bram Moolenaarb6b046b2011-12-30 13:11:27 +0100866
Bram Moolenaara3f41662010-07-11 19:01:06 +0200867Variables: *var-functions*
Bram Moolenaara47e05f2021-01-12 21:49:00 +0100868 type() type of a variable as a number
869 typename() type of a variable as text
Bram Moolenaarc6fe9192006-04-09 21:54:49 +0000870 islocked() check if a variable is locked
Bram Moolenaar214641f2017-03-05 17:04:09 +0100871 funcref() get a Funcref for a function reference
Bram Moolenaarc6fe9192006-04-09 21:54:49 +0000872 function() get a Funcref for a function name
873 getbufvar() get a variable value from a specific buffer
874 setbufvar() set a variable in a specific buffer
Bram Moolenaarc6249bb2006-04-15 20:25:09 +0000875 getwinvar() get a variable from specific window
Bram Moolenaar06b5d512010-05-22 15:37:44 +0200876 gettabvar() get a variable from specific tab page
Bram Moolenaarc6249bb2006-04-15 20:25:09 +0000877 gettabwinvar() get a variable from specific window & tab page
Bram Moolenaarc6fe9192006-04-09 21:54:49 +0000878 setwinvar() set a variable in a specific window
Bram Moolenaar06b5d512010-05-22 15:37:44 +0200879 settabvar() set a variable in a specific tab page
Bram Moolenaarc6249bb2006-04-15 20:25:09 +0000880 settabwinvar() set a variable in a specific window & tab page
Bram Moolenaarc6fe9192006-04-09 21:54:49 +0000881 garbagecollect() possibly free memory
882
Bram Moolenaara3f41662010-07-11 19:01:06 +0200883Cursor and mark position: *cursor-functions* *mark-functions*
Bram Moolenaar071d4272004-06-13 20:20:40 +0000884 col() column number of the cursor or a mark
885 virtcol() screen column of the cursor or a mark
886 line() line number of the cursor or mark
887 wincol() window column number of the cursor
888 winline() window line number of the cursor
889 cursor() position the cursor at a line/column
Bram Moolenaar8d043172014-01-23 14:24:41 +0100890 screencol() get screen column of the cursor
891 screenrow() get screen row of the cursor
Bram Moolenaarb3d17a22019-07-07 18:28:14 +0200892 screenpos() screen row and col of a text character
Bram Moolenaar5a6ec102022-05-27 21:58:00 +0100893 virtcol2col() byte index of a text character on screen
Bram Moolenaar822ff862014-06-12 21:46:14 +0200894 getcurpos() get position of the cursor
Bram Moolenaarc6fe9192006-04-09 21:54:49 +0000895 getpos() get position of cursor, mark, etc.
896 setpos() set position of cursor, mark, etc.
Bram Moolenaarcfb4b472020-05-31 15:41:57 +0200897 getmarklist() list of global/local marks
Bram Moolenaarc6fe9192006-04-09 21:54:49 +0000898 byte2line() get line number at a specific byte count
899 line2byte() byte count at a specific line
900 diff_filler() get the number of filler lines above a line
Bram Moolenaar8d043172014-01-23 14:24:41 +0100901 screenattr() get attribute at a screen line/row
902 screenchar() get character code at a screen line/row
Bram Moolenaar2912abb2019-03-29 14:16:42 +0100903 screenchars() get character codes at a screen line/row
904 screenstring() get string of characters at a screen line/row
Bram Moolenaar6f02b002021-01-10 20:22:54 +0100905 charcol() character number of the cursor or a mark
906 getcharpos() get character position of cursor, mark, etc.
907 setcharpos() set character position of cursor, mark, etc.
908 getcursorcharpos() get character position of the cursor
909 setcursorcharpos() set character position of the cursor
Bram Moolenaarc6fe9192006-04-09 21:54:49 +0000910
Bram Moolenaara3f41662010-07-11 19:01:06 +0200911Working with text in the current buffer: *text-functions*
Bram Moolenaar7c626922005-02-07 22:01:03 +0000912 getline() get a line or list of lines from the buffer
Bram Moolenaar071d4272004-06-13 20:20:40 +0000913 setline() replace a line in the buffer
Bram Moolenaar7c626922005-02-07 22:01:03 +0000914 append() append line or list of lines in the buffer
Bram Moolenaar071d4272004-06-13 20:20:40 +0000915 indent() indent of a specific line
916 cindent() indent according to C indenting
917 lispindent() indent according to Lisp indenting
918 nextnonblank() find next non-blank line
919 prevnonblank() find previous non-blank line
920 search() find a match for a pattern
Bram Moolenaar1d2ba7f2006-02-14 22:29:30 +0000921 searchpos() find a match for a pattern
Bram Moolenaarebacddb2020-06-04 15:22:21 +0200922 searchcount() get number of matches before/after the cursor
Bram Moolenaar071d4272004-06-13 20:20:40 +0000923 searchpair() find the other end of a start/skip/end
Bram Moolenaar1d2ba7f2006-02-14 22:29:30 +0000924 searchpairpos() find the other end of a start/skip/end
Bram Moolenaarc6fe9192006-04-09 21:54:49 +0000925 searchdecl() search for the declaration of a name
Bram Moolenaarc95a3022016-06-12 23:01:46 +0200926 getcharsearch() return character search information
927 setcharsearch() set character search information
Bram Moolenaar071d4272004-06-13 20:20:40 +0000928
Bram Moolenaar931a2772019-07-04 16:54:54 +0200929Working with text in another buffer:
930 getbufline() get a list of lines from the specified buffer
931 setbufline() replace a line in the specified buffer
932 appendbufline() append a list of lines in the specified buffer
933 deletebufline() delete lines from a specified buffer
934
Bram Moolenaara3f41662010-07-11 19:01:06 +0200935 *system-functions* *file-functions*
Bram Moolenaar071d4272004-06-13 20:20:40 +0000936System functions and manipulation of files:
Bram Moolenaar071d4272004-06-13 20:20:40 +0000937 glob() expand wildcards
938 globpath() expand wildcards in a number of directories
Bram Moolenaarc95a3022016-06-12 23:01:46 +0200939 glob2regpat() convert a glob pattern into a search pattern
Bram Moolenaarc6fe9192006-04-09 21:54:49 +0000940 findfile() find a file in a list of directories
941 finddir() find a directory in a list of directories
Bram Moolenaar071d4272004-06-13 20:20:40 +0000942 resolve() find out where a shortcut points to
943 fnamemodify() modify a file name
Bram Moolenaarc6fe9192006-04-09 21:54:49 +0000944 pathshorten() shorten directory names in a path
945 simplify() simplify a path without changing its meaning
Bram Moolenaar071d4272004-06-13 20:20:40 +0000946 executable() check if an executable program exists
Bram Moolenaar7e38ea22014-04-05 22:55:53 +0200947 exepath() full path of an executable program
Bram Moolenaar071d4272004-06-13 20:20:40 +0000948 filereadable() check if a file can be read
949 filewritable() check if a file can be written to
Bram Moolenaarc6fe9192006-04-09 21:54:49 +0000950 getfperm() get the permissions of a file
Bram Moolenaarc95a3022016-06-12 23:01:46 +0200951 setfperm() set the permissions of a file
Bram Moolenaarc6fe9192006-04-09 21:54:49 +0000952 getftype() get the kind of a file
LemonBoydca1d402022-04-28 15:26:33 +0100953 isabsolutepath() check if a path is absolute
Bram Moolenaar071d4272004-06-13 20:20:40 +0000954 isdirectory() check if a directory exists
Bram Moolenaar071d4272004-06-13 20:20:40 +0000955 getfsize() get the size of a file
Bram Moolenaarc6fe9192006-04-09 21:54:49 +0000956 getcwd() get the current working directory
Bram Moolenaar00aa0692019-04-27 20:37:57 +0200957 haslocaldir() check if current window used |:lcd| or |:tcd|
Bram Moolenaar071d4272004-06-13 20:20:40 +0000958 tempname() get the name of a temporary file
Bram Moolenaarc6fe9192006-04-09 21:54:49 +0000959 mkdir() create a new directory
Bram Moolenaar1063f3d2019-05-07 22:06:52 +0200960 chdir() change current working directory
Bram Moolenaar071d4272004-06-13 20:20:40 +0000961 delete() delete a file
962 rename() rename a file
Bram Moolenaar7e38ea22014-04-05 22:55:53 +0200963 system() get the result of a shell command as a string
964 systemlist() get the result of a shell command as a list
Bram Moolenaar691ddee2019-05-09 14:52:41 +0200965 environ() get all environment variables
966 getenv() get one environment variable
967 setenv() set an environment variable
Bram Moolenaar071d4272004-06-13 20:20:40 +0000968 hostname() name of the system
Bram Moolenaar3a7c85b2005-02-05 21:39:53 +0000969 readfile() read a file into a List of lines
Bram Moolenaarc423ad72021-01-13 20:38:03 +0100970 readblob() read a file into a Blob
Bram Moolenaar62e1bb42019-04-08 16:25:07 +0200971 readdir() get a List of file names in a directory
Bram Moolenaar6c9ba042020-06-01 16:09:41 +0200972 readdirex() get a List of file information in a directory
Bram Moolenaar314dd792019-02-03 15:27:20 +0100973 writefile() write a List of lines or Blob into a file
Bram Moolenaar071d4272004-06-13 20:20:40 +0000974
Bram Moolenaara3f41662010-07-11 19:01:06 +0200975Date and Time: *date-functions* *time-functions*
Bram Moolenaarc6fe9192006-04-09 21:54:49 +0000976 getftime() get last modification time of a file
977 localtime() get current time in seconds
978 strftime() convert time to a string
Bram Moolenaar10455d42019-11-21 15:36:18 +0100979 strptime() convert a date/time string to time
Bram Moolenaarc6fe9192006-04-09 21:54:49 +0000980 reltime() get the current or elapsed time accurately
981 reltimestr() convert reltime() result to a string
Bram Moolenaar03413f42016-04-12 21:07:15 +0200982 reltimefloat() convert reltime() result to a Float
Bram Moolenaarc6fe9192006-04-09 21:54:49 +0000983
Yegappan Lakshmanan1755a912022-05-19 10:31:47 +0100984Autocmds: *autocmd-functions*
985 autocmd_add() add a list of autocmds and groups
986 autocmd_delete() delete a list of autocmds and groups
987 autocmd_get() return a list of autocmds
988
Bram Moolenaara3f41662010-07-11 19:01:06 +0200989 *buffer-functions* *window-functions* *arg-functions*
Bram Moolenaar071d4272004-06-13 20:20:40 +0000990Buffers, windows and the argument list:
991 argc() number of entries in the argument list
992 argidx() current position in the argument list
Bram Moolenaar2d1fe052014-05-28 18:22:57 +0200993 arglistid() get id of the argument list
Bram Moolenaar071d4272004-06-13 20:20:40 +0000994 argv() get one entry from the argument list
Bram Moolenaar931a2772019-07-04 16:54:54 +0200995 bufadd() add a file to the list of buffers
Bram Moolenaar071d4272004-06-13 20:20:40 +0000996 bufexists() check if a buffer exists
997 buflisted() check if a buffer exists and is listed
Bram Moolenaar931a2772019-07-04 16:54:54 +0200998 bufload() ensure a buffer is loaded
Bram Moolenaar071d4272004-06-13 20:20:40 +0000999 bufloaded() check if a buffer exists and is loaded
1000 bufname() get the name of a specific buffer
1001 bufnr() get the buffer number of a specific buffer
Bram Moolenaarc6fe9192006-04-09 21:54:49 +00001002 tabpagebuflist() return List of buffers in a tab page
1003 tabpagenr() get the number of a tab page
1004 tabpagewinnr() like winnr() for a specified tab page
Bram Moolenaar071d4272004-06-13 20:20:40 +00001005 winnr() get the window number for the current window
Bram Moolenaar82af8712016-06-04 20:20:29 +02001006 bufwinid() get the window ID of a specific buffer
Bram Moolenaar071d4272004-06-13 20:20:40 +00001007 bufwinnr() get the window number of a specific buffer
1008 winbufnr() get the buffer number of a specific window
Bram Moolenaara3347722019-05-11 21:14:24 +02001009 listener_add() add a callback to listen to changes
Bram Moolenaar68e65602019-05-26 21:33:31 +02001010 listener_flush() invoke listener callbacks
Bram Moolenaara3347722019-05-11 21:14:24 +02001011 listener_remove() remove a listener callback
Bram Moolenaarc95a3022016-06-12 23:01:46 +02001012 win_findbuf() find windows containing a buffer
1013 win_getid() get window ID of a window
Bram Moolenaarebacddb2020-06-04 15:22:21 +02001014 win_gettype() get type of window
Bram Moolenaarc95a3022016-06-12 23:01:46 +02001015 win_gotoid() go to window with ID
1016 win_id2tabwin() get tab and window nr from window ID
1017 win_id2win() get window nr from window ID
Daniel Steinbergee630312022-01-10 13:36:34 +00001018 win_move_separator() move window vertical separator
1019 win_move_statusline() move window status line
Bram Moolenaarebacddb2020-06-04 15:22:21 +02001020 win_splitmove() move window to a split of another window
Bram Moolenaarb5ae48e2016-08-12 22:23:25 +02001021 getbufinfo() get a list with buffer information
1022 gettabinfo() get a list with tab page information
1023 getwininfo() get a list with window information
Bram Moolenaar07ad8162018-02-13 13:59:59 +01001024 getchangelist() get a list of change list entries
Bram Moolenaar4f505882018-02-10 21:06:32 +01001025 getjumplist() get a list of jump list entries
Bram Moolenaarfc65cab2018-08-28 22:58:02 +02001026 swapinfo() information about a swap file
Bram Moolenaarb730f0c2018-11-25 03:56:26 +01001027 swapname() get the swap file path of a buffer
Bram Moolenaarc6fe9192006-04-09 21:54:49 +00001028
Bram Moolenaara3f41662010-07-11 19:01:06 +02001029Command line: *command-line-functions*
Shougo Matsushita79d599b2022-05-07 12:48:29 +01001030 getcmdcompltype() get the type of the current command line
1031 completion
Bram Moolenaarc6fe9192006-04-09 21:54:49 +00001032 getcmdline() get the current command line
1033 getcmdpos() get position of the cursor in the command line
Shougo Matsushita79d599b2022-05-07 12:48:29 +01001034 getcmdscreenpos() get screen position of the cursor in the
1035 command line
Bram Moolenaarc6fe9192006-04-09 21:54:49 +00001036 setcmdpos() set position of the cursor in the command line
1037 getcmdtype() return the current command-line type
Bram Moolenaarfb539272014-08-22 19:21:47 +02001038 getcmdwintype() return the current command-line window type
Bram Moolenaar6f1d9a02016-07-24 14:12:38 +02001039 getcompletion() list of command-line completion matches
Bram Moolenaar038e09e2021-02-06 12:38:51 +01001040 fullcommand() get full command name
Bram Moolenaarc6fe9192006-04-09 21:54:49 +00001041
Bram Moolenaara3f41662010-07-11 19:01:06 +02001042Quickfix and location lists: *quickfix-functions*
Bram Moolenaarc6fe9192006-04-09 21:54:49 +00001043 getqflist() list of quickfix errors
1044 setqflist() modify a quickfix list
1045 getloclist() list of location list items
1046 setloclist() modify a location list
1047
Bram Moolenaara3f41662010-07-11 19:01:06 +02001048Insert mode completion: *completion-functions*
Bram Moolenaarc6fe9192006-04-09 21:54:49 +00001049 complete() set found matches
1050 complete_add() add to found matches
1051 complete_check() check if completion should be aborted
Bram Moolenaarfd133322019-03-29 12:20:27 +01001052 complete_info() get current completion information
Bram Moolenaarc6fe9192006-04-09 21:54:49 +00001053 pumvisible() check if the popup menu is displayed
Bram Moolenaar5be4cee2019-09-27 19:34:08 +02001054 pum_getpos() position and size of popup menu if visible
Bram Moolenaar071d4272004-06-13 20:20:40 +00001055
Bram Moolenaara3f41662010-07-11 19:01:06 +02001056Folding: *folding-functions*
Bram Moolenaar071d4272004-06-13 20:20:40 +00001057 foldclosed() check for a closed fold at a specific line
1058 foldclosedend() like foldclosed() but return the last line
1059 foldlevel() check for the fold level at a specific line
1060 foldtext() generate the line displayed for a closed fold
Bram Moolenaarc6fe9192006-04-09 21:54:49 +00001061 foldtextresult() get the text displayed for a closed fold
Bram Moolenaar071d4272004-06-13 20:20:40 +00001062
Bram Moolenaara3f41662010-07-11 19:01:06 +02001063Syntax and highlighting: *syntax-functions* *highlighting-functions*
Bram Moolenaar6ee10162007-07-26 20:58:42 +00001064 clearmatches() clear all matches defined by |matchadd()| and
1065 the |:match| commands
1066 getmatches() get all matches defined by |matchadd()| and
1067 the |:match| commands
Bram Moolenaar071d4272004-06-13 20:20:40 +00001068 hlexists() check if a highlight group exists
Yegappan Lakshmanand1a8d652021-11-03 21:56:45 +00001069 hlget() get highlight group attributes
1070 hlset() set highlight group attributes
Bram Moolenaar071d4272004-06-13 20:20:40 +00001071 hlID() get ID of a highlight group
1072 synID() get syntax ID at a specific position
1073 synIDattr() get a specific attribute of a syntax ID
1074 synIDtrans() get translated syntax ID
Bram Moolenaar166af9b2010-11-16 20:34:40 +01001075 synstack() get list of syntax IDs at a specific position
Bram Moolenaar81af9252010-12-10 20:35:50 +01001076 synconcealed() get info about concealing
Bram Moolenaarc6fe9192006-04-09 21:54:49 +00001077 diff_hlID() get highlight ID for diff mode at a position
Bram Moolenaar6ee10162007-07-26 20:58:42 +00001078 matchadd() define a pattern to highlight (a "match")
Bram Moolenaarb3414592014-06-17 17:48:32 +02001079 matchaddpos() define a list of positions to highlight
Bram Moolenaarc6fe9192006-04-09 21:54:49 +00001080 matcharg() get info about |:match| arguments
Bram Moolenaar6ee10162007-07-26 20:58:42 +00001081 matchdelete() delete a match defined by |matchadd()| or a
1082 |:match| command
1083 setmatches() restore a list of matches saved by
1084 |getmatches()|
Bram Moolenaarc6fe9192006-04-09 21:54:49 +00001085
Bram Moolenaara3f41662010-07-11 19:01:06 +02001086Spelling: *spell-functions*
Bram Moolenaarc6fe9192006-04-09 21:54:49 +00001087 spellbadword() locate badly spelled word at or after cursor
1088 spellsuggest() return suggested spelling corrections
1089 soundfold() return the sound-a-like equivalent of a word
Bram Moolenaar071d4272004-06-13 20:20:40 +00001090
Bram Moolenaara3f41662010-07-11 19:01:06 +02001091History: *history-functions*
Bram Moolenaar071d4272004-06-13 20:20:40 +00001092 histadd() add an item to a history
1093 histdel() delete an item from a history
1094 histget() get an item from a history
1095 histnr() get highest index of a history list
1096
Bram Moolenaara3f41662010-07-11 19:01:06 +02001097Interactive: *interactive-functions*
Bram Moolenaarc6fe9192006-04-09 21:54:49 +00001098 browse() put up a file requester
1099 browsedir() put up a directory requester
Bram Moolenaar071d4272004-06-13 20:20:40 +00001100 confirm() let the user make a choice
1101 getchar() get a character from the user
Bram Moolenaarf7a023e2021-06-07 18:50:01 +02001102 getcharstr() get a character from the user as a string
Bram Moolenaar071d4272004-06-13 20:20:40 +00001103 getcharmod() get modifiers for the last typed character
Bram Moolenaar09c6f262019-11-17 15:55:14 +01001104 getmousepos() get last known mouse position
Bram Moolenaarebacddb2020-06-04 15:22:21 +02001105 echoraw() output characters as-is
Bram Moolenaar3577c6f2008-06-24 21:16:56 +00001106 feedkeys() put characters in the typeahead queue
Bram Moolenaar071d4272004-06-13 20:20:40 +00001107 input() get a line from the user
Bram Moolenaarc6fe9192006-04-09 21:54:49 +00001108 inputlist() let the user pick an entry from a list
Bram Moolenaar071d4272004-06-13 20:20:40 +00001109 inputsecret() get a line from the user without showing it
1110 inputdialog() get a line from the user in a dialog
Bram Moolenaar68b76a62005-03-25 21:53:48 +00001111 inputsave() save and clear typeahead
Bram Moolenaar071d4272004-06-13 20:20:40 +00001112 inputrestore() restore typeahead
1113
Bram Moolenaara3f41662010-07-11 19:01:06 +02001114GUI: *gui-functions*
Bram Moolenaarc6fe9192006-04-09 21:54:49 +00001115 getfontname() get name of current font being used
Bram Moolenaarb5b75622018-03-09 22:22:21 +01001116 getwinpos() position of the Vim window
1117 getwinposx() X position of the Vim window
1118 getwinposy() Y position of the Vim window
Bram Moolenaar214641f2017-03-05 17:04:09 +01001119 balloon_show() set the balloon content
Bram Moolenaara2a80162017-11-21 23:09:50 +01001120 balloon_split() split a message for a balloon
Bram Moolenaar691ddee2019-05-09 14:52:41 +02001121 balloon_gettext() get the text in the balloon
Bram Moolenaarc6fe9192006-04-09 21:54:49 +00001122
Bram Moolenaara3f41662010-07-11 19:01:06 +02001123Vim server: *server-functions*
Bram Moolenaar071d4272004-06-13 20:20:40 +00001124 serverlist() return the list of server names
Bram Moolenaar01164a62017-11-02 22:58:42 +01001125 remote_startserver() run a server
Bram Moolenaar071d4272004-06-13 20:20:40 +00001126 remote_send() send command characters to a Vim server
1127 remote_expr() evaluate an expression in a Vim server
1128 server2client() send a reply to a client of a Vim server
1129 remote_peek() check if there is a reply from a Vim server
1130 remote_read() read a reply from a Vim server
1131 foreground() move the Vim window to the foreground
1132 remote_foreground() move the Vim server window to the foreground
1133
Bram Moolenaara3f41662010-07-11 19:01:06 +02001134Window size and position: *window-size-functions*
Bram Moolenaarc6fe9192006-04-09 21:54:49 +00001135 winheight() get height of a specific window
1136 winwidth() get width of a specific window
Bram Moolenaarf0b03c42017-12-17 17:17:07 +01001137 win_screenpos() get screen position of a window
Bram Moolenaarb730f0c2018-11-25 03:56:26 +01001138 winlayout() get layout of windows in a tab page
Bram Moolenaarc6fe9192006-04-09 21:54:49 +00001139 winrestcmd() return command to restore window sizes
1140 winsaveview() get view of current window
1141 winrestview() restore saved view of current window
1142
Bram Moolenaar0eabd4d2020-03-15 16:13:53 +01001143Mappings and Menus: *mapping-functions*
h-east29b85712021-07-26 21:54:04 +02001144 digraph_get() get |digraph|
1145 digraph_getlist() get all |digraph|s
1146 digraph_set() register |digraph|
1147 digraph_setlist() register multiple |digraph|s
Bram Moolenaar071d4272004-06-13 20:20:40 +00001148 hasmapto() check if a mapping exists
1149 mapcheck() check if a matching mapping exists
1150 maparg() get rhs of a mapping
Ernie Rael09661202022-04-25 14:40:44 +01001151 maplist() get list of all mappings
Bram Moolenaarebacddb2020-06-04 15:22:21 +02001152 mapset() restore a mapping
Bram Moolenaar0eabd4d2020-03-15 16:13:53 +01001153 menu_info() get information about a menu item
Bram Moolenaar26402cb2013-02-20 21:26:00 +01001154 wildmenumode() check if the wildmode is active
1155
Bram Moolenaar683fa182015-11-30 21:38:24 +01001156Testing: *test-functions*
Bram Moolenaare18c0b32016-03-20 21:08:34 +01001157 assert_equal() assert that two expressions values are equal
Bram Moolenaarb730f0c2018-11-25 03:56:26 +01001158 assert_equalfile() assert that two file contents are equal
Bram Moolenaar03413f42016-04-12 21:07:15 +02001159 assert_notequal() assert that two expressions values are not equal
Bram Moolenaar6f1d9a02016-07-24 14:12:38 +02001160 assert_inrange() assert that an expression is inside a range
Bram Moolenaar7db8f6f2016-03-29 23:12:46 +02001161 assert_match() assert that a pattern matches the value
Bram Moolenaar03413f42016-04-12 21:07:15 +02001162 assert_notmatch() assert that a pattern does not match the value
Bram Moolenaar683fa182015-11-30 21:38:24 +01001163 assert_false() assert that an expression is false
1164 assert_true() assert that an expression is true
Bram Moolenaare18c0b32016-03-20 21:08:34 +01001165 assert_exception() assert that a command throws an exception
Bram Moolenaar22f1d0e2018-02-27 14:53:30 +01001166 assert_beeps() assert that a command beeps
Bram Moolenaar0df60302021-04-03 15:15:47 +02001167 assert_nobeep() assert that a command does not cause a beep
Bram Moolenaar22f1d0e2018-02-27 14:53:30 +01001168 assert_fails() assert that a command fails
Bram Moolenaar3c2881d2017-03-21 19:18:29 +01001169 assert_report() report a test failure
Bram Moolenaarc95a3022016-06-12 23:01:46 +02001170 test_alloc_fail() make memory allocation fail
Bram Moolenaar6f1d9a02016-07-24 14:12:38 +02001171 test_autochdir() enable 'autochdir' during startup
Bram Moolenaar036986f2017-03-16 17:41:02 +01001172 test_override() test with Vim internal overrides
1173 test_garbagecollect_now() free memory right now
Bram Moolenaarebacddb2020-06-04 15:22:21 +02001174 test_garbagecollect_soon() set a flag to free memory soon
Bram Moolenaar68e65602019-05-26 21:33:31 +02001175 test_getvalue() get value of an internal variable
Yegappan Lakshmanan06011e12022-01-30 12:37:29 +00001176 test_gui_event() generate a GUI event for testing
Bram Moolenaar214641f2017-03-05 17:04:09 +01001177 test_ignore_error() ignore a specific error message
Bram Moolenaar314dd792019-02-03 15:27:20 +01001178 test_null_blob() return a null Blob
Bram Moolenaarc95a3022016-06-12 23:01:46 +02001179 test_null_channel() return a null Channel
1180 test_null_dict() return a null Dict
Bram Moolenaarebacddb2020-06-04 15:22:21 +02001181 test_null_function() return a null Funcref
Bram Moolenaarc95a3022016-06-12 23:01:46 +02001182 test_null_job() return a null Job
1183 test_null_list() return a null List
1184 test_null_partial() return a null Partial function
1185 test_null_string() return a null String
Bram Moolenaar214641f2017-03-05 17:04:09 +01001186 test_settime() set the time Vim uses internally
Bram Moolenaarbb8476b2019-05-04 15:47:48 +02001187 test_setmouse() set the mouse position
Bram Moolenaarb730f0c2018-11-25 03:56:26 +01001188 test_feedinput() add key sequence to input buffer
1189 test_option_not_set() reset flag indicating option was set
Bram Moolenaarebacddb2020-06-04 15:22:21 +02001190 test_refcount() return an expression's reference count
1191 test_srand_seed() set the seed value for srand()
1192 test_unknown() return a value with unknown type
1193 test_void() return a value with void type
Bram Moolenaar683fa182015-11-30 21:38:24 +01001194
Bram Moolenaarc95a3022016-06-12 23:01:46 +02001195Inter-process communication: *channel-functions*
Bram Moolenaar51628222016-12-01 23:03:28 +01001196 ch_canread() check if there is something to read
Bram Moolenaar681baaf2016-02-04 20:57:07 +01001197 ch_open() open a channel
1198 ch_close() close a channel
Bram Moolenaar64d8e252016-09-06 22:12:34 +02001199 ch_close_in() close the in part of a channel
Bram Moolenaarc95a3022016-06-12 23:01:46 +02001200 ch_read() read a message from a channel
Bram Moolenaard09091d2019-01-17 16:07:22 +01001201 ch_readblob() read a Blob from a channel
Bram Moolenaarc95a3022016-06-12 23:01:46 +02001202 ch_readraw() read a raw message from a channel
Bram Moolenaar681baaf2016-02-04 20:57:07 +01001203 ch_sendexpr() send a JSON message over a channel
1204 ch_sendraw() send a raw message over a channel
Bram Moolenaarebacddb2020-06-04 15:22:21 +02001205 ch_evalexpr() evaluate an expression over channel
1206 ch_evalraw() evaluate a raw string over channel
Bram Moolenaarc95a3022016-06-12 23:01:46 +02001207 ch_status() get status of a channel
1208 ch_getbufnr() get the buffer number of a channel
1209 ch_getjob() get the job associated with a channel
1210 ch_info() get channel information
1211 ch_log() write a message in the channel log file
1212 ch_logfile() set the channel log file
1213 ch_setoptions() set the options for a channel
Bram Moolenaara02a5512016-06-17 12:48:11 +02001214 json_encode() encode an expression to a JSON string
1215 json_decode() decode a JSON string to Vim types
Bram Moolenaarc95a3022016-06-12 23:01:46 +02001216 js_encode() encode an expression to a JSON string
1217 js_decode() decode a JSON string to Vim types
1218
Bram Moolenaarebacddb2020-06-04 15:22:21 +02001219Jobs: *job-functions*
Bram Moolenaarc95a3022016-06-12 23:01:46 +02001220 job_start() start a job
1221 job_stop() stop a job
1222 job_status() get the status of a job
1223 job_getchannel() get the channel used by a job
1224 job_info() get information about a job
1225 job_setoptions() set options for a job
1226
Bram Moolenaar162b7142018-12-21 15:17:36 +01001227Signs: *sign-functions*
1228 sign_define() define or update a sign
1229 sign_getdefined() get a list of defined signs
1230 sign_getplaced() get a list of placed signs
Bram Moolenaar6b7b7192019-01-11 13:42:41 +01001231 sign_jump() jump to a sign
Bram Moolenaar162b7142018-12-21 15:17:36 +01001232 sign_place() place a sign
Bram Moolenaar809ce4d2019-07-13 21:21:40 +02001233 sign_placelist() place a list of signs
Bram Moolenaar162b7142018-12-21 15:17:36 +01001234 sign_undefine() undefine a sign
1235 sign_unplace() unplace a sign
Bram Moolenaar809ce4d2019-07-13 21:21:40 +02001236 sign_unplacelist() unplace a list of signs
Bram Moolenaar162b7142018-12-21 15:17:36 +01001237
Bram Moolenaarc572da52017-08-27 16:52:01 +02001238Terminal window: *terminal-functions*
1239 term_start() open a terminal window and run a job
1240 term_list() get the list of terminal buffers
1241 term_sendkeys() send keystrokes to a terminal
1242 term_wait() wait for screen to be updated
1243 term_getjob() get the job associated with a terminal
1244 term_scrape() get row of a terminal screen
1245 term_getline() get a line of text from a terminal
1246 term_getattr() get the value of attribute {what}
1247 term_getcursor() get the cursor position of a terminal
1248 term_getscrolled() get the scroll count of a terminal
1249 term_getaltscreen() get the alternate screen flag
1250 term_getsize() get the size of a terminal
1251 term_getstatus() get the status of a terminal
1252 term_gettitle() get the title of a terminal
1253 term_gettty() get the tty name of a terminal
Bram Moolenaar7dda86f2018-04-20 22:36:41 +02001254 term_setansicolors() set 16 ANSI colors, used for GUI
1255 term_getansicolors() get 16 ANSI colors, used for GUI
Bram Moolenaarb730f0c2018-11-25 03:56:26 +01001256 term_dumpdiff() display difference between two screen dumps
1257 term_dumpload() load a terminal screen dump in a window
1258 term_dumpwrite() dump contents of a terminal screen to a file
1259 term_setkill() set signal to stop job in a terminal
1260 term_setrestore() set command to restore a terminal
1261 term_setsize() set the size of a terminal
Bram Moolenaarebacddb2020-06-04 15:22:21 +02001262 term_setapi() set terminal JSON API function name prefix
Bram Moolenaarc572da52017-08-27 16:52:01 +02001263
Bram Moolenaar931a2772019-07-04 16:54:54 +02001264Popup window: *popup-window-functions*
1265 popup_create() create popup centered in the screen
1266 popup_atcursor() create popup just above the cursor position,
1267 closes when the cursor moves away
Bram Moolenaarb3d17a22019-07-07 18:28:14 +02001268 popup_beval() at the position indicated by v:beval_
1269 variables, closes when the mouse moves away
Bram Moolenaar931a2772019-07-04 16:54:54 +02001270 popup_notification() show a notification for three seconds
1271 popup_dialog() create popup centered with padding and border
1272 popup_menu() prompt for selecting an item from a list
1273 popup_hide() hide a popup temporarily
1274 popup_show() show a previously hidden popup
1275 popup_move() change the position and size of a popup
1276 popup_setoptions() override options of a popup
1277 popup_settext() replace the popup buffer contents
1278 popup_close() close one popup
1279 popup_clear() close all popups
1280 popup_filter_menu() select from a list of items
Bram Moolenaarebacddb2020-06-04 15:22:21 +02001281 popup_filter_yesno() block until 'y' or 'n' is pressed
Bram Moolenaar931a2772019-07-04 16:54:54 +02001282 popup_getoptions() get current options for a popup
1283 popup_getpos() get actual position and size of a popup
Bram Moolenaarebacddb2020-06-04 15:22:21 +02001284 popup_findinfo() get window ID for popup info window
1285 popup_findpreview() get window ID for popup preview window
1286 popup_list() get list of all popup window IDs
1287 popup_locate() get popup window ID from its screen position
Bram Moolenaar931a2772019-07-04 16:54:54 +02001288
Bram Moolenaarc95a3022016-06-12 23:01:46 +02001289Timers: *timer-functions*
1290 timer_start() create a timer
Bram Moolenaarb5ae48e2016-08-12 22:23:25 +02001291 timer_pause() pause or unpause a timer
Bram Moolenaarc95a3022016-06-12 23:01:46 +02001292 timer_stop() stop a timer
Bram Moolenaarb5ae48e2016-08-12 22:23:25 +02001293 timer_stopall() stop all timers
1294 timer_info() get information about timers
Bram Moolenaar298b4402016-01-28 22:38:53 +01001295
Bram Moolenaarb730f0c2018-11-25 03:56:26 +01001296Tags: *tag-functions*
1297 taglist() get list of matching tags
1298 tagfiles() get a list of tags files
1299 gettagstack() get the tag stack of a window
1300 settagstack() modify the tag stack of a window
1301
1302Prompt Buffer: *promptbuffer-functions*
Bram Moolenaar077cc7a2020-09-04 16:35:35 +02001303 prompt_getprompt() get the effective prompt text for a buffer
Bram Moolenaarb730f0c2018-11-25 03:56:26 +01001304 prompt_setcallback() set prompt callback for a buffer
1305 prompt_setinterrupt() set interrupt callback for a buffer
1306 prompt_setprompt() set the prompt text for a buffer
1307
Bram Moolenaarebacddb2020-06-04 15:22:21 +02001308Text Properties: *text-property-functions*
1309 prop_add() attach a property at a position
Yegappan Lakshmananccfb7c62021-08-16 21:39:09 +02001310 prop_add_list() attach a property at multiple positions
Bram Moolenaarebacddb2020-06-04 15:22:21 +02001311 prop_clear() remove all properties from a line or lines
1312 prop_find() search for a property
1313 prop_list() return a list of all properties in a line
1314 prop_remove() remove a property from a line
1315 prop_type_add() add/define a property type
1316 prop_type_change() change properties of a type
1317 prop_type_delete() remove a text property type
1318 prop_type_get() return the properties of a type
1319 prop_type_list() return a list of all property types
1320
1321Sound: *sound-functions*
1322 sound_clear() stop playing all sounds
1323 sound_playevent() play an event's sound
1324 sound_playfile() play a sound file
1325 sound_stop() stop playing a sound
1326
Bram Moolenaar26402cb2013-02-20 21:26:00 +01001327Various: *various-functions*
1328 mode() get current editing mode
Bram Moolenaarebacddb2020-06-04 15:22:21 +02001329 state() get current busy state
Bram Moolenaar26402cb2013-02-20 21:26:00 +01001330 visualmode() last visual mode used
Bram Moolenaar071d4272004-06-13 20:20:40 +00001331 exists() check if a variable, function, etc. exists
Bram Moolenaar26735992021-08-08 14:43:22 +02001332 exists_compiled() like exists() but check at compile time
Bram Moolenaar071d4272004-06-13 20:20:40 +00001333 has() check if a feature is supported in Vim
Bram Moolenaarc6fe9192006-04-09 21:54:49 +00001334 changenr() return number of most recent change
Bram Moolenaar071d4272004-06-13 20:20:40 +00001335 cscope_connection() check if a cscope connection exists
1336 did_filetype() check if a FileType autocommand was used
1337 eventhandler() check if invoked by an event handler
Bram Moolenaar3577c6f2008-06-24 21:16:56 +00001338 getpid() get process ID of Vim
Bram Moolenaarebacddb2020-06-04 15:22:21 +02001339 getimstatus() check if IME status is active
1340 interrupt() interrupt script execution
1341 windowsversion() get MS-Windows version
Bram Moolenaar0c0eddd2020-06-13 15:47:25 +02001342 terminalprops() properties of the terminal
Bram Moolenaarc6fe9192006-04-09 21:54:49 +00001343
Bram Moolenaar071d4272004-06-13 20:20:40 +00001344 libcall() call a function in an external library
1345 libcallnr() idem, returning a number
Bram Moolenaarc6fe9192006-04-09 21:54:49 +00001346
Bram Moolenaar8d043172014-01-23 14:24:41 +01001347 undofile() get the name of the undo file
1348 undotree() return the state of the undo tree
1349
Bram Moolenaar071d4272004-06-13 20:20:40 +00001350 getreg() get contents of a register
Bram Moolenaarbb861e22020-06-07 18:16:36 +02001351 getreginfo() get information about a register
Bram Moolenaar071d4272004-06-13 20:20:40 +00001352 getregtype() get type of a register
1353 setreg() set contents and type of a register
Bram Moolenaar0b6d9112018-05-22 20:35:17 +02001354 reg_executing() return the name of the register being executed
1355 reg_recording() return the name of the register being recorded
Bram Moolenaarc6fe9192006-04-09 21:54:49 +00001356
Bram Moolenaar8d043172014-01-23 14:24:41 +01001357 shiftwidth() effective value of 'shiftwidth'
1358
Bram Moolenaar063b9d12016-07-09 20:21:48 +02001359 wordcount() get byte/word/char count of buffer
1360
Bram Moolenaarebacddb2020-06-04 15:22:21 +02001361 luaeval() evaluate |Lua| expression
Bram Moolenaar7e506b62010-01-19 15:55:06 +01001362 mzeval() evaluate |MzScheme| expression
Bram Moolenaare9b892e2016-01-17 21:15:58 +01001363 perleval() evaluate Perl expression (|+perl|)
Bram Moolenaar8d043172014-01-23 14:24:41 +01001364 py3eval() evaluate Python expression (|+python3|)
1365 pyeval() evaluate Python expression (|+python|)
Bram Moolenaar690afe12017-01-28 18:34:47 +01001366 pyxeval() evaluate |python_x| expression
Bram Moolenaarebacddb2020-06-04 15:22:21 +02001367 rubyeval() evaluate |Ruby| expression
1368
Bram Moolenaar9d87a372018-12-18 21:41:50 +01001369 debugbreak() interrupt a program being debugged
Bram Moolenaar7e506b62010-01-19 15:55:06 +01001370
Bram Moolenaar071d4272004-06-13 20:20:40 +00001371==============================================================================
1372*41.7* Defining a function
1373
1374Vim enables you to define your own functions. The basic function declaration
1375begins as follows: >
1376
Bram Moolenaar04fb9162021-12-30 20:24:12 +00001377 def {name}({var1}, {var2}, ...): return-type
1378 {body}
1379 enddef
Bram Moolenaar071d4272004-06-13 20:20:40 +00001380<
1381 Note:
1382 Function names must begin with a capital letter.
1383
1384Let's define a short function to return the smaller of two numbers. It starts
1385with this line: >
1386
Bram Moolenaar04fb9162021-12-30 20:24:12 +00001387 def Min(num1: number, num2: number): number
Bram Moolenaar071d4272004-06-13 20:20:40 +00001388
Bram Moolenaar04fb9162021-12-30 20:24:12 +00001389This tells Vim that the function is named "Min", it takes two arguments that
1390are numbers: "num1" and "num2" and returns a number.
1391
1392The first thing you need to do is to check to see which number is smaller:
Bram Moolenaar071d4272004-06-13 20:20:40 +00001393 >
Bram Moolenaar04fb9162021-12-30 20:24:12 +00001394 if num1 < num2
Bram Moolenaar071d4272004-06-13 20:20:40 +00001395
Bram Moolenaar071d4272004-06-13 20:20:40 +00001396Let's assign the variable "smaller" the value of the smallest number: >
1397
Bram Moolenaar04fb9162021-12-30 20:24:12 +00001398 var smaller: number
1399 if num1 < num2
1400 smaller = num1
1401 else
1402 smaller = num2
1403 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +00001404
1405The variable "smaller" is a local variable. Variables used inside a function
Bram Moolenaar04fb9162021-12-30 20:24:12 +00001406are local unless prefixed by something like "g:", "w:", or "s:".
Bram Moolenaar071d4272004-06-13 20:20:40 +00001407
1408 Note:
1409 To access a global variable from inside a function you must prepend
Bram Moolenaar3577c6f2008-06-24 21:16:56 +00001410 "g:" to it. Thus "g:today" inside a function is used for the global
1411 variable "today", and "today" is another variable, local to the
Bram Moolenaar04fb9162021-12-30 20:24:12 +00001412 function or the script.
Bram Moolenaar071d4272004-06-13 20:20:40 +00001413
Bram Moolenaar04fb9162021-12-30 20:24:12 +00001414You now use the `return` statement to return the smallest number to the user.
Bram Moolenaar071d4272004-06-13 20:20:40 +00001415Finally, you end the function: >
1416
Bram Moolenaar04fb9162021-12-30 20:24:12 +00001417 return smaller
1418 enddef
Bram Moolenaar071d4272004-06-13 20:20:40 +00001419
1420The complete function definition is as follows: >
1421
Bram Moolenaar04fb9162021-12-30 20:24:12 +00001422 def Min(num1: number, num2: number): number
1423 var smaller: number
1424 if num1 < num2
1425 smaller = num1
1426 else
1427 smaller = num2
1428 endif
1429 return smaller
1430 enddef
Bram Moolenaar071d4272004-06-13 20:20:40 +00001431
Bram Moolenaar04fb9162021-12-30 20:24:12 +00001432Obviously this is a verbose example. You can make it shorter by using two
1433return commands: >
Bram Moolenaar7c626922005-02-07 22:01:03 +00001434
Bram Moolenaar04fb9162021-12-30 20:24:12 +00001435 def Min(num1: number, num2: number): number
1436 if num1 < num2
1437 return num1
1438 endif
1439 return num2
1440 enddef
1441
1442And if you remember the conditional expression, you need only one line: >
1443
1444 def Min(num1: number, num2: number): number
1445 return num1 < num2 ? num1 : num2
1446 enddef
Bram Moolenaar7c626922005-02-07 22:01:03 +00001447
Bram Moolenaard1f56e62006-02-22 21:25:37 +00001448A user defined function is called in exactly the same way as a built-in
Bram Moolenaar071d4272004-06-13 20:20:40 +00001449function. Only the name is different. The Min function can be used like
1450this: >
1451
Bram Moolenaar04fb9162021-12-30 20:24:12 +00001452 echo Min(5, 8)
Bram Moolenaar071d4272004-06-13 20:20:40 +00001453
Bram Moolenaar04fb9162021-12-30 20:24:12 +00001454Only now will the function be executed and the lines be parsed by Vim.
Bram Moolenaar071d4272004-06-13 20:20:40 +00001455If there are mistakes, like using an undefined variable or function, you will
1456now get an error message. When defining the function these errors are not
Bram Moolenaar04fb9162021-12-30 20:24:12 +00001457detected. To get the errors sooner you can tell Vim to compile all the
1458functions in the script: >
Bram Moolenaar071d4272004-06-13 20:20:40 +00001459
Bram Moolenaar04fb9162021-12-30 20:24:12 +00001460 defcompile
Bram Moolenaar071d4272004-06-13 20:20:40 +00001461
Bram Moolenaarcfa8f9a2022-06-03 21:59:47 +01001462Compiling functions takes a little time, but does report errors early. You
1463could use `:defcompile` at the end of your script while working on it, and
1464comment it out when everything is fine.
1465
1466For a function that does not return anything simply leave out the return type: >
Bram Moolenaar071d4272004-06-13 20:20:40 +00001467
Bram Moolenaar04fb9162021-12-30 20:24:12 +00001468 def SayIt(text: string)
1469 echo text
1470 enddef
1471
1472It is also possible to define a legacy function with `function` and
Bram Moolenaarcfa8f9a2022-06-03 21:59:47 +01001473`endfunction`. These do not have types and are not compiled. Therefore they
1474execute much slower.
Bram Moolenaar071d4272004-06-13 20:20:40 +00001475
1476
1477USING A RANGE
1478
Bram Moolenaar04fb9162021-12-30 20:24:12 +00001479A line range can be used with a function call. The function will be called
1480once for every line in the range, with the cursor in that line. Example: >
Bram Moolenaar071d4272004-06-13 20:20:40 +00001481
Bram Moolenaar04fb9162021-12-30 20:24:12 +00001482 def Number()
1483 echo "line " .. line(".") .. " contains: " .. getline(".")
1484 enddef
Bram Moolenaar071d4272004-06-13 20:20:40 +00001485
1486If you call this function with: >
1487
1488 :10,15call Number()
1489
Bram Moolenaar04fb9162021-12-30 20:24:12 +00001490The function will be called six times, starting on line 10 and ending on line
149115.
Bram Moolenaar071d4272004-06-13 20:20:40 +00001492
1493
1494VARIABLE NUMBER OF ARGUMENTS
1495
1496Vim enables you to define functions that have a variable number of arguments.
1497The following command, for instance, defines a function that must have 1
1498argument (start) and can have up to 20 additional arguments: >
1499
Bram Moolenaar04fb9162021-12-30 20:24:12 +00001500 def Show(start: string, ...items: list<string>)
Bram Moolenaar071d4272004-06-13 20:20:40 +00001501
Bram Moolenaarcfa8f9a2022-06-03 21:59:47 +01001502The variable "items" will be a list in the function containing the extra
1503arguments. You can use it like any list, for example: >
Bram Moolenaar071d4272004-06-13 20:20:40 +00001504
Bram Moolenaar04fb9162021-12-30 20:24:12 +00001505 def Show(start: string, ...items: list<string>)
1506 echohl Title
1507 echo "start is " .. start
1508 echohl None
1509 for index in range(len(items))
Bram Moolenaarcfa8f9a2022-06-03 21:59:47 +01001510 echon $" Arg {index} is {items[index]}"
Bram Moolenaar04fb9162021-12-30 20:24:12 +00001511 endfor
1512 echo
1513 enddef
Bram Moolenaar071d4272004-06-13 20:20:40 +00001514
Bram Moolenaar04fb9162021-12-30 20:24:12 +00001515You can call it like this: >
Bram Moolenaar071d4272004-06-13 20:20:40 +00001516
Bram Moolenaar04fb9162021-12-30 20:24:12 +00001517 Show('Title', 'one', 'two', 'three')
1518< start is Title Arg 0 is one Arg 1 is two Arg 2 is three ~
1519
1520This uses the `echohl` command to specify the highlighting used for the
1521following `echo` command. `echohl None` stops it again. The `echon` command
1522works like `echo`, but doesn't output a line break.
1523
1524If you call it with one argument the "items" list will be empty.
1525`range(len(items))` returns a list with the indexes, what `for` loops over,
1526we'll explain that further down.
Bram Moolenaar7c626922005-02-07 22:01:03 +00001527
Bram Moolenaar071d4272004-06-13 20:20:40 +00001528
1529LISTING FUNCTIONS
1530
Bram Moolenaar04fb9162021-12-30 20:24:12 +00001531The `function` command lists the names and arguments of all user-defined
Bram Moolenaar071d4272004-06-13 20:20:40 +00001532functions: >
1533
1534 :function
Bram Moolenaar04fb9162021-12-30 20:24:12 +00001535< def <SNR>86_Show(start: string, ...items: list<string>) ~
Bram Moolenaar071d4272004-06-13 20:20:40 +00001536 function GetVimIndent() ~
1537 function SetSyn(name) ~
1538
Bram Moolenaar04fb9162021-12-30 20:24:12 +00001539The "<SNR>" prefix means that a function is script-local. |Vim9| functions
1540wil start with "def" and include argument and return types. Legacy functions
1541are listed with "function".
1542
1543To see what a function does, use its name as an argument for `function`: >
Bram Moolenaar071d4272004-06-13 20:20:40 +00001544
1545 :function SetSyn
1546< 1 if &syntax == '' ~
1547 2 let &syntax = a:name ~
1548 3 endif ~
1549 endfunction ~
1550
Bram Moolenaarcfa8f9a2022-06-03 21:59:47 +01001551To see the "Show" function you need to include the script prefix, since
1552multiple "Show" functions can be defined in different scripts. To find
Bram Moolenaar04fb9162021-12-30 20:24:12 +00001553the exact name you can use `function`, but the result may be a very long list.
1554To only get the functions matching a pattern you can use the `filter` prefix:
1555>
Bram Moolenaar04fb9162021-12-30 20:24:12 +00001556 :filter Show function
1557< def <SNR>86_Show(start: string, ...items: list<string>) ~
1558>
1559 :function <SNR>86_Show
1560< 1 echohl Title ~
1561 2 echo "start is " .. start ~
1562 etc.
1563
Bram Moolenaar071d4272004-06-13 20:20:40 +00001564
1565DEBUGGING
1566
1567The line number is useful for when you get an error message or when debugging.
1568See |debug-scripts| about debugging mode.
Bram Moolenaar04fb9162021-12-30 20:24:12 +00001569
1570You can also set the 'verbose' option to 12 or higher to see all function
Bram Moolenaar071d4272004-06-13 20:20:40 +00001571calls. Set it to 15 or higher to see every executed line.
1572
1573
1574DELETING A FUNCTION
1575
Bram Moolenaar04fb9162021-12-30 20:24:12 +00001576To delete the SetSyn() function: >
Bram Moolenaar071d4272004-06-13 20:20:40 +00001577
Bram Moolenaar04fb9162021-12-30 20:24:12 +00001578 :delfunction SetSyn
Bram Moolenaar071d4272004-06-13 20:20:40 +00001579
Bram Moolenaar04fb9162021-12-30 20:24:12 +00001580Deleting only works for global functions and functions in legacy script, not
1581for functions defined in a |Vim9| script.
1582
1583You get an error when the function doesn't exist or cannot be deleted.
Bram Moolenaar071d4272004-06-13 20:20:40 +00001584
Bram Moolenaar7c626922005-02-07 22:01:03 +00001585
1586FUNCTION REFERENCES
1587
1588Sometimes it can be useful to have a variable point to one function or
Bram Moolenaarcfa8f9a2022-06-03 21:59:47 +01001589another. You can do it with a function reference variable. Often shortened
1590to "funcref". Example: >
Bram Moolenaar7c626922005-02-07 22:01:03 +00001591
Bram Moolenaarcfa8f9a2022-06-03 21:59:47 +01001592 def Right(): string
Bram Moolenaar04fb9162021-12-30 20:24:12 +00001593 return 'Right!'
1594 enddef
Bram Moolenaarcfa8f9a2022-06-03 21:59:47 +01001595 def Wrong(): string
Bram Moolenaar04fb9162021-12-30 20:24:12 +00001596 return 'Wrong!'
1597 enddef
1598
1599 var Afunc = g:result == 1 ? Right : Wrong
Bram Moolenaarcfa8f9a2022-06-03 21:59:47 +01001600 echo Afunc()
Bram Moolenaar7c626922005-02-07 22:01:03 +00001601< Wrong! ~
1602
Bram Moolenaarcfa8f9a2022-06-03 21:59:47 +01001603This assumes "g:result" is not one. See |Funcref| for details.
Bram Moolenaar04fb9162021-12-30 20:24:12 +00001604
Bram Moolenaar7c626922005-02-07 22:01:03 +00001605Note that the name of a variable that holds a function reference must start
1606with a capital. Otherwise it could be confused with the name of a builtin
1607function.
Bram Moolenaar7c626922005-02-07 22:01:03 +00001608
Yegappan Lakshmanan5dfe4672021-09-14 17:54:30 +02001609More information about defining your own functions here: |user-functions|.
1610
Bram Moolenaar071d4272004-06-13 20:20:40 +00001611==============================================================================
Bram Moolenaar7c626922005-02-07 22:01:03 +00001612*41.8* Lists and Dictionaries
1613
1614So far we have used the basic types String and Number. Vim also supports two
1615composite types: List and Dictionary.
1616
Bram Moolenaar04fb9162021-12-30 20:24:12 +00001617A List is an ordered sequence of items. The items can be any kind of value,
Bram Moolenaar7c626922005-02-07 22:01:03 +00001618thus you can make a List of numbers, a List of Lists and even a List of mixed
1619items. To create a List with three strings: >
1620
Bram Moolenaarcfa8f9a2022-06-03 21:59:47 +01001621 var alist = ['aap', 'noot', 'mies']
Bram Moolenaar7c626922005-02-07 22:01:03 +00001622
1623The List items are enclosed in square brackets and separated by commas. To
1624create an empty List: >
1625
Bram Moolenaar04fb9162021-12-30 20:24:12 +00001626 var alist = []
Bram Moolenaar7c626922005-02-07 22:01:03 +00001627
1628You can add items to a List with the add() function: >
1629
Bram Moolenaar04fb9162021-12-30 20:24:12 +00001630 var alist = []
1631 add(alist, 'foo')
1632 add(alist, 'bar')
1633 echo alist
Bram Moolenaar7c626922005-02-07 22:01:03 +00001634< ['foo', 'bar'] ~
1635
1636List concatenation is done with +: >
1637
Bram Moolenaar04fb9162021-12-30 20:24:12 +00001638 var alist = ['foo', 'bar']
1639 alist = alist + ['and', 'more']
1640 echo alist
1641< ['foo', 'bar', 'and', 'more'] ~
Bram Moolenaar7c626922005-02-07 22:01:03 +00001642
Bram Moolenaarcfa8f9a2022-06-03 21:59:47 +01001643Or, if you want to extend a List with a function, use `extend()`: >
Bram Moolenaar7c626922005-02-07 22:01:03 +00001644
Bram Moolenaar04fb9162021-12-30 20:24:12 +00001645 var alist = ['one']
1646 extend(alist, ['two', 'three'])
1647 echo alist
Bram Moolenaar7c626922005-02-07 22:01:03 +00001648< ['one', 'two', 'three'] ~
1649
Bram Moolenaarcfa8f9a2022-06-03 21:59:47 +01001650Notice that using `add()` will have a different effect than `extend()`: >
Bram Moolenaar7c626922005-02-07 22:01:03 +00001651
Bram Moolenaar04fb9162021-12-30 20:24:12 +00001652 var alist = ['one']
1653 add(alist, ['two', 'three'])
1654 echo alist
Bram Moolenaar7c626922005-02-07 22:01:03 +00001655< ['one', ['two', 'three']] ~
1656
Bram Moolenaar04fb9162021-12-30 20:24:12 +00001657The second argument of add() is added as an item, now you have a nested list.
Bram Moolenaar7c626922005-02-07 22:01:03 +00001658
1659
1660FOR LOOP
1661
1662One of the nice things you can do with a List is iterate over it: >
1663
Bram Moolenaar04fb9162021-12-30 20:24:12 +00001664 var alist = ['one', 'two', 'three']
1665 for n in alist
1666 echo n
1667 endfor
Bram Moolenaar7c626922005-02-07 22:01:03 +00001668< one ~
1669 two ~
1670 three ~
1671
Bram Moolenaar04fb9162021-12-30 20:24:12 +00001672This will loop over each element in List "alist", assigning each value to
Bram Moolenaar7c626922005-02-07 22:01:03 +00001673variable "n". The generic form of a for loop is: >
1674
Bram Moolenaarcfa8f9a2022-06-03 21:59:47 +01001675 for {varname} in {list-expression}
Bram Moolenaar04fb9162021-12-30 20:24:12 +00001676 {commands}
1677 endfor
Bram Moolenaar7c626922005-02-07 22:01:03 +00001678
1679To loop a certain number of times you need a List of a specific length. The
1680range() function creates one for you: >
1681
Bram Moolenaar04fb9162021-12-30 20:24:12 +00001682 for a in range(3)
1683 echo a
1684 endfor
Bram Moolenaar7c626922005-02-07 22:01:03 +00001685< 0 ~
1686 1 ~
1687 2 ~
1688
1689Notice that the first item of the List that range() produces is zero, thus the
Bram Moolenaarcfa8f9a2022-06-03 21:59:47 +01001690last item is one less than the length of the list. Detail: Internally range()
1691does not actually create the list, so that a large range used in a for loop
1692works efficiently. When used elsewhere, the range is turned into an actual
1693list, which takes more time for a long ist.
Bram Moolenaar7c626922005-02-07 22:01:03 +00001694
Bram Moolenaar04fb9162021-12-30 20:24:12 +00001695You can also specify the maximum value, the stride and even go backwards: >
1696
1697 for a in range(8, 4, -2)
1698 echo a
1699 endfor
Bram Moolenaar7c626922005-02-07 22:01:03 +00001700< 8 ~
1701 6 ~
1702 4 ~
1703
Bram Moolenaarcfa8f9a2022-06-03 21:59:47 +01001704A more useful example, looping over all the lines in the buffer: >
Bram Moolenaar7c626922005-02-07 22:01:03 +00001705
Bram Moolenaarcfa8f9a2022-06-03 21:59:47 +01001706 for line in getline(1, 50)
Bram Moolenaar04fb9162021-12-30 20:24:12 +00001707 if line =~ "Date: "
1708 echo line
1709 endif
1710 endfor
Bram Moolenaar7c626922005-02-07 22:01:03 +00001711
Bram Moolenaarcfa8f9a2022-06-03 21:59:47 +01001712This looks into lines 1 to 50 (inclusive) and echoes any date found in there.
1713
1714For further reading see |Lists|.
Bram Moolenaar7c626922005-02-07 22:01:03 +00001715
1716
1717DICTIONARIES
1718
1719A Dictionary stores key-value pairs. You can quickly lookup a value if you
1720know the key. A Dictionary is created with curly braces: >
Bram Moolenaarc9b4b052006-04-30 18:54:39 +00001721
Bram Moolenaar04fb9162021-12-30 20:24:12 +00001722 var uk2nl = {one: 'een', two: 'twee', three: 'drie'}
Bram Moolenaar7c626922005-02-07 22:01:03 +00001723
Bram Moolenaar4399ef42005-02-12 14:29:27 +00001724Now you can lookup words by putting the key in square brackets: >
Bram Moolenaar7c626922005-02-07 22:01:03 +00001725
Bram Moolenaar04fb9162021-12-30 20:24:12 +00001726 echo uk2nl['two']
1727< twee ~
1728
1729If the key does not have special characters, you can use the dot notation: >
1730
1731 echo uk2nl.two
Bram Moolenaar7c626922005-02-07 22:01:03 +00001732< twee ~
1733
1734The generic form for defining a Dictionary is: >
1735
1736 {<key> : <value>, ...}
1737
1738An empty Dictionary is one without any keys: >
1739
1740 {}
1741
1742The possibilities with Dictionaries are numerous. There are various functions
1743for them as well. For example, you can obtain a list of the keys and loop
1744over them: >
1745
Bram Moolenaar04fb9162021-12-30 20:24:12 +00001746 for key in keys(uk2nl)
1747 echo key
1748 endfor
Bram Moolenaar7c626922005-02-07 22:01:03 +00001749< three ~
1750 one ~
1751 two ~
1752
Bram Moolenaar3577c6f2008-06-24 21:16:56 +00001753You will notice the keys are not ordered. You can sort the list to get a
Bram Moolenaar7c626922005-02-07 22:01:03 +00001754specific order: >
1755
Bram Moolenaar04fb9162021-12-30 20:24:12 +00001756 for key in sort(keys(uk2nl))
1757 echo key
1758 endfor
Bram Moolenaar7c626922005-02-07 22:01:03 +00001759< one ~
1760 three ~
1761 two ~
1762
1763But you can never get back the order in which items are defined. For that you
1764need to use a List, it stores items in an ordered sequence.
1765
Bram Moolenaarcfa8f9a2022-06-03 21:59:47 +01001766For further reading see |Dictionaries|.
Bram Moolenaar7c626922005-02-07 22:01:03 +00001767
1768==============================================================================
1769*41.9* Exceptions
Bram Moolenaar071d4272004-06-13 20:20:40 +00001770
1771Let's start with an example: >
1772
Bram Moolenaar04fb9162021-12-30 20:24:12 +00001773 try
1774 read ~/templates/pascal.tmpl
1775 catch /E484:/
1776 echo "Sorry, the Pascal template file cannot be found."
1777 endtry
Bram Moolenaar071d4272004-06-13 20:20:40 +00001778
Bram Moolenaar04fb9162021-12-30 20:24:12 +00001779The `read` command will fail if the file does not exist. Instead of
Bram Moolenaar071d4272004-06-13 20:20:40 +00001780generating an error message, this code catches the error and gives the user a
Bram Moolenaarcfa8f9a2022-06-03 21:59:47 +01001781message with more information.
Bram Moolenaar071d4272004-06-13 20:20:40 +00001782
Bram Moolenaar04fb9162021-12-30 20:24:12 +00001783For the commands in between `try` and `endtry` errors are turned into
Bram Moolenaar071d4272004-06-13 20:20:40 +00001784exceptions. An exception is a string. In the case of an error the string
1785contains the error message. And every error message has a number. In this
1786case, the error we catch contains "E484:". This number is guaranteed to stay
1787the same (the text may change, e.g., it may be translated).
1788
Bram Moolenaar04fb9162021-12-30 20:24:12 +00001789Besides being able to give a nice error message, Vim will also continue
Bram Moolenaarcfa8f9a2022-06-03 21:59:47 +01001790executing commands after the `:endtry`. Otherwise, once an uncaught error is
1791encountered, execution of the script/function/mapping will be aborted.
Bram Moolenaar04fb9162021-12-30 20:24:12 +00001792
1793When the `read` command causes another error, the pattern "E484:" will not
Bram Moolenaar071d4272004-06-13 20:20:40 +00001794match in it. Thus this exception will not be caught and result in the usual
Bram Moolenaar016188f2022-06-06 20:52:59 +01001795error message and execution is aborted.
Bram Moolenaar071d4272004-06-13 20:20:40 +00001796
1797You might be tempted to do this: >
1798
Bram Moolenaar04fb9162021-12-30 20:24:12 +00001799 try
1800 read ~/templates/pascal.tmpl
1801 catch
1802 echo "Sorry, the Pascal template file cannot be found."
1803 endtry
Bram Moolenaar071d4272004-06-13 20:20:40 +00001804
Bram Moolenaar04fb9162021-12-30 20:24:12 +00001805This means all errors are caught. But then you will not see an error that
1806would indicate a completely different problem, such as "E21: Cannot make
Bram Moolenaarcfa8f9a2022-06-03 21:59:47 +01001807changes, 'modifiable' is off". Think twice before you catch any error!
Bram Moolenaar071d4272004-06-13 20:20:40 +00001808
Bram Moolenaar04fb9162021-12-30 20:24:12 +00001809Another useful mechanism is the `finally` command: >
Bram Moolenaar071d4272004-06-13 20:20:40 +00001810
Bram Moolenaar04fb9162021-12-30 20:24:12 +00001811 var tmp = tempname()
1812 try
1813 exe ":.,$write " .. tmp
1814 exe "!filter " .. tmp
1815 :.,$delete
1816 exe ":$read " .. tmp
1817 finally
Bram Moolenaarcfa8f9a2022-06-03 21:59:47 +01001818 delete(tmp)
Bram Moolenaar04fb9162021-12-30 20:24:12 +00001819 endtry
Bram Moolenaar071d4272004-06-13 20:20:40 +00001820
1821This filters the lines from the cursor until the end of the file through the
1822"filter" command, which takes a file name argument. No matter if the
Bram Moolenaarcfa8f9a2022-06-03 21:59:47 +01001823filtering works, if something goes wrong in between `try` and `finally` or the
1824user cancels the filtering by pressing CTRL-C, the `delete(tmp)` call is
Bram Moolenaar071d4272004-06-13 20:20:40 +00001825always executed. This makes sure you don't leave the temporary file behind.
1826
Bram Moolenaarcfa8f9a2022-06-03 21:59:47 +01001827The `finally` does not catch the exception, the error will still abort
1828further execution.
1829
Bram Moolenaar071d4272004-06-13 20:20:40 +00001830More information about exception handling can be found in the reference
1831manual: |exception-handling|.
1832
1833==============================================================================
Bram Moolenaar7c626922005-02-07 22:01:03 +00001834*41.10* Various remarks
Bram Moolenaar071d4272004-06-13 20:20:40 +00001835
Bram Moolenaarcfa8f9a2022-06-03 21:59:47 +01001836Here are a few items that are useful to know when writing Vim scripts.
1837
1838
1839FILEFORMAT
Bram Moolenaar071d4272004-06-13 20:20:40 +00001840
Bram Moolenaar04fb9162021-12-30 20:24:12 +00001841The end-of-line character depends on the system. For Vim scripts it is
Bram Moolenaarcfa8f9a2022-06-03 21:59:47 +01001842recommended to always use the Unix fileformat. This also works on any other
Bram Moolenaar04fb9162021-12-30 20:24:12 +00001843system. That way you can copy your Vim scripts from MS-Windows to Unix and
1844they still work. See |:source_crnl|. To be sure it is set right, do this
1845before writing the file: >
1846
1847 :setlocal fileformat=unix
Bram Moolenaar071d4272004-06-13 20:20:40 +00001848
1849
1850WHITE SPACE
1851
1852Blank lines are allowed and ignored.
1853
Bram Moolenaar04fb9162021-12-30 20:24:12 +00001854Leading whitespace characters (blanks and TABs) are always ignored.
Bram Moolenaar071d4272004-06-13 20:20:40 +00001855
Bram Moolenaar04fb9162021-12-30 20:24:12 +00001856Trailing whitespace is often ignored, but not always. One command that
1857includes it is `map`.
Bram Moolenaar071d4272004-06-13 20:20:40 +00001858
1859To include a whitespace character in the value of an option, it must be
1860escaped by a "\" (backslash) as in the following example: >
1861
1862 :set tags=my\ nice\ file
1863
Bram Moolenaarcfa8f9a2022-06-03 21:59:47 +01001864If it would be written as: >
Bram Moolenaar071d4272004-06-13 20:20:40 +00001865
1866 :set tags=my nice file
1867
Bram Moolenaarcfa8f9a2022-06-03 21:59:47 +01001868This will issue an error, because it is interpreted as: >
Bram Moolenaar071d4272004-06-13 20:20:40 +00001869
1870 :set tags=my
1871 :set nice
1872 :set file
1873
Bram Moolenaar04fb9162021-12-30 20:24:12 +00001874|Vim9| script is very picky when it comes to white space. This was done
1875intentionally to make sure scripts are easy to read and to avoid mistakes.
Bram Moolenaarcfa8f9a2022-06-03 21:59:47 +01001876If you use white space sensibly it will just work. When not you will get an
1877error message telling you where white space is missing or should be removed.
Bram Moolenaar04fb9162021-12-30 20:24:12 +00001878
Bram Moolenaar071d4272004-06-13 20:20:40 +00001879
1880COMMENTS
1881
Bram Moolenaarcfa8f9a2022-06-03 21:59:47 +01001882In |Vim9| script the character # starts a comment. That character and
1883everything after it until the end-of-line is considered a comment and
Bram Moolenaar071d4272004-06-13 20:20:40 +00001884is ignored, except for commands that don't consider comments, as shown in
Bram Moolenaar04fb9162021-12-30 20:24:12 +00001885examples below. A comment can start on any character position on the line,
Bram Moolenaarcfa8f9a2022-06-03 21:59:47 +01001886but not when it is part of the command, e.g. inside a string.
Bram Moolenaar04fb9162021-12-30 20:24:12 +00001887
1888The character " (the double quote mark) starts a comment in legacy script.
Bram Moolenaarcfa8f9a2022-06-03 21:59:47 +01001889This involves some cleverness to make sure double quoted strings are not
1890recognized as comments (just one reason to prefer |Vim9| script).
Bram Moolenaar071d4272004-06-13 20:20:40 +00001891
1892There is a little "catch" with comments for some commands. Examples: >
1893
Bram Moolenaar04fb9162021-12-30 20:24:12 +00001894 abbrev dev development # shorthand
1895 map <F3> o#include # insert include
1896 execute cmd # do it
1897 !ls *.c # list C files
Bram Moolenaar071d4272004-06-13 20:20:40 +00001898
Bram Moolenaarcfa8f9a2022-06-03 21:59:47 +01001899- The abbreviation 'dev' will be expanded to 'development # shorthand'.
1900- The mapping of <F3> will actually be the whole line after the 'o# ....'
1901 including the '# insert include'.
1902- The `execute` command will give an error.
1903- The `!` command will send everything after it to the shell, most likely
1904 causing an error.
Bram Moolenaar071d4272004-06-13 20:20:40 +00001905
Bram Moolenaar04fb9162021-12-30 20:24:12 +00001906There can be no comment after `map`, `abbreviate`, `execute` and `!` commands
1907(there are a few more commands with this restriction). For the `map`,
1908`abbreviate` and `execute` commands there is a trick: >
1909
1910 abbrev dev development|# shorthand
1911 map <F3> o#include|# insert include
1912 execute '!ls *.c' |# do it
Bram Moolenaar071d4272004-06-13 20:20:40 +00001913
1914With the '|' character the command is separated from the next one. And that
Bram Moolenaar04fb9162021-12-30 20:24:12 +00001915next command is only a comment. The last command, using `execute` is a
1916general solution, it works for all commands that do not accept a comment or a
1917'|' to separate the next command.
Bram Moolenaar071d4272004-06-13 20:20:40 +00001918
1919Notice that there is no white space before the '|' in the abbreviation and
1920mapping. For these commands, any character until the end-of-line or '|' is
1921included. As a consequence of this behavior, you don't always see that
1922trailing whitespace is included: >
1923
Bram Moolenaar04fb9162021-12-30 20:24:12 +00001924 map <F4> o#include
Bram Moolenaar071d4272004-06-13 20:20:40 +00001925
Bram Moolenaarcfa8f9a2022-06-03 21:59:47 +01001926Here it is intended, in other cases it might be accidental. To spot these
1927problems, you can highlight trailing spaces: >
Bram Moolenaar04fb9162021-12-30 20:24:12 +00001928 match Search /\s\+$/
Bram Moolenaar071d4272004-06-13 20:20:40 +00001929
Bram Moolenaar9e1d2832007-05-06 12:51:41 +00001930For Unix there is one special way to comment a line, that allows making a Vim
Bram Moolenaar04fb9162021-12-30 20:24:12 +00001931script executable, and it also works in legacy script: >
Bram Moolenaar9e1d2832007-05-06 12:51:41 +00001932 #!/usr/bin/env vim -S
1933 echo "this is a Vim script"
1934 quit
1935
Bram Moolenaar071d4272004-06-13 20:20:40 +00001936
Bram Moolenaarcfa8f9a2022-06-03 21:59:47 +01001937Advance information about writing Vim script is in |usr_50.txt|.
Bram Moolenaar2d8ed022022-05-21 13:08:16 +01001938
Bram Moolenaar071d4272004-06-13 20:20:40 +00001939==============================================================================
Bram Moolenaar071d4272004-06-13 20:20:40 +00001940
1941Next chapter: |usr_42.txt| Add new menus
1942
Bram Moolenaard473c8c2018-08-11 18:00:22 +02001943Copyright: see |manual-copyright| vim:tw=78:ts=8:noet:ft=help:norl: