Hirohito Higashi | 96b3ef2 | 2025-07-05 15:31:23 +0200 | [diff] [blame] | 1 | *usr_41.txt* For Vim version 9.1. Last change: 2025 Jul 05 |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 2 | |
| 3 | VIM USER MANUAL - by Bram Moolenaar |
| 4 | |
| 5 | Write a Vim script |
| 6 | |
| 7 | |
| 8 | The Vim script language is used for the startup vimrc file, syntax files, and |
| 9 | many other things. This chapter explains the items that can be used in a Vim |
Bram Moolenaar | cfa8f9a | 2022-06-03 21:59:47 +0100 | [diff] [blame] | 10 | script. There are a lot of them, therefore this is a long chapter. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 11 | |
| 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 Moolenaar | 7c62692 | 2005-02-07 22:01:03 +0000 | [diff] [blame] | 19 | |41.8| Lists and Dictionaries |
Bram Moolenaar | 63f3260 | 2022-06-09 20:45:54 +0100 | [diff] [blame] | 20 | |41.9| White space |
| 21 | |41.10| Line continuation |
| 22 | |41.11| Comments |
| 23 | |41.12| Fileformat |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 24 | |
| 25 | Next chapter: |usr_42.txt| Add new menus |
| 26 | Previous chapter: |usr_40.txt| Make new commands |
| 27 | Table of contents: |usr_toc.txt| |
| 28 | |
| 29 | ============================================================================== |
Bram Moolenaar | 9d75c83 | 2005-01-25 21:57:23 +0000 | [diff] [blame] | 30 | *41.1* Introduction *vim-script-intro* *script* |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 31 | |
Ubaldo Tiberi | c593b9e | 2024-06-09 18:47:53 +0200 | [diff] [blame] | 32 | Let's start with some nomenclature. A Vim script is any file that Vim can |
h-east | 8ee0e0b | 2024-10-05 16:44:27 +0200 | [diff] [blame] | 33 | interpret and execute. This includes files written in Vim's scripting language |
Ubaldo Tiberi | c593b9e | 2024-06-09 18:47:53 +0200 | [diff] [blame] | 34 | like for example .vim files or configuration files like .vimrc and .gvimrc. |
| 35 | These scripts may define functions, commands and settings that Vim uses to |
| 36 | customize and extend its behavior. |
| 37 | |
Hirohito Higashi | fbe4a8f | 2025-04-27 15:28:30 +0200 | [diff] [blame] | 38 | *vim-script-notation* |
| 39 | The correct notation is "Vim script" (or "Vim9 script" when refering to the |
| 40 | new Vim9 language |Vim9-script|), so we will use "Vim script" to refer to the |
| 41 | Vim scripting language throughout this documentation. This shorthand helps to |
Ubaldo Tiberi | c593b9e | 2024-06-09 18:47:53 +0200 | [diff] [blame] | 42 | streamline explanations and discussions about scripting with Vim. |
| 43 | |
| 44 | A Vim plugin is a collection of one or more Vim scripts, along with additional |
| 45 | files like help documentation, configuration files, and other resources, |
| 46 | designed to add specific features or functionalities to Vim. A plugin can |
| 47 | provide new commands, enhance existing capabilities, and integrate external |
| 48 | tools or services into the Vim environment. |
| 49 | |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 50 | Your first experience with Vim scripts is the vimrc file. Vim reads it when |
Bram Moolenaar | cfa8f9a | 2022-06-03 21:59:47 +0100 | [diff] [blame] | 51 | it starts up and executes the commands. You can set options to the values you |
| 52 | prefer, define mappings, select plugins and much more. You can use any colon |
| 53 | command in it (commands that start with a ":"; these are sometimes referred to |
| 54 | as Ex commands or command-line commands). |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 55 | |
| 56 | Syntax files are also Vim scripts. As are files that set options for a |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 57 | specific file type. A complicated macro can be defined by a separate Vim |
| 58 | script file. You can think of other uses yourself. |
| 59 | |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 60 | Vim script comes in two flavors: legacy and |Vim9|. Since this help file is |
| 61 | for new users, we'll teach you the newer and more convenient |Vim9| syntax. |
Bram Moolenaar | cfa8f9a | 2022-06-03 21:59:47 +0100 | [diff] [blame] | 62 | While legacy script is particularly for Vim, |Vim9| script looks more like |
| 63 | other languages, such as JavaScript and TypeScript. |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 64 | |
| 65 | To try out Vim script the best way is to edit a script file and source it. |
| 66 | Basically: > |
| 67 | :edit test.vim |
| 68 | [insert the script lines you want] |
| 69 | :w |
| 70 | :source % |
| 71 | |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 72 | Let's start with a simple example: > |
| 73 | |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 74 | vim9script |
| 75 | var i = 1 |
| 76 | while i < 5 |
| 77 | echo "count is" i |
| 78 | i += 1 |
| 79 | endwhile |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 80 | < |
Bram Moolenaar | 7c62692 | 2005-02-07 22:01:03 +0000 | [diff] [blame] | 81 | The output of the example code is: |
| 82 | |
| 83 | count is 1 ~ |
| 84 | count is 2 ~ |
| 85 | count is 3 ~ |
| 86 | count is 4 ~ |
| 87 | |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 88 | In the first line the `vim9script` command makes clear this is a new, |Vim9| |
Bram Moolenaar | 016188f | 2022-06-06 20:52:59 +0100 | [diff] [blame] | 89 | script file. That matters for how the rest of the file is used. It is |
Doug Kearns | db7622e | 2024-02-25 15:21:54 +0100 | [diff] [blame] | 90 | recommended to put it in the very first line, before any comments. |
Bram Moolenaar | cfa8f9a | 2022-06-03 21:59:47 +0100 | [diff] [blame] | 91 | *vim9-declarations* |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 92 | The `var i = 1` command declares the "i" variable and initializes it. The |
Bram Moolenaar | 7c62692 | 2005-02-07 22:01:03 +0000 | [diff] [blame] | 93 | generic form is: > |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 94 | |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 95 | var {name} = {expression} |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 96 | |
| 97 | In this case the variable name is "i" and the expression is a simple value, |
| 98 | the number one. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 99 | |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 100 | The `while` command starts a loop. The generic form is: > |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 101 | |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 102 | while {condition} |
| 103 | {statements} |
| 104 | endwhile |
| 105 | |
| 106 | The statements until the matching `endwhile` are executed for as long as the |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 107 | condition is true. The condition used here is the expression "i < 5". This |
| 108 | is true when the variable i is smaller than five. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 109 | Note: |
| 110 | If you happen to write a while loop that keeps on running, you can |
| 111 | interrupt it by pressing CTRL-C (CTRL-Break on MS-Windows). |
| 112 | |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 113 | The `echo` command prints its arguments. In this case the string "count is" |
Bram Moolenaar | 7c62692 | 2005-02-07 22:01:03 +0000 | [diff] [blame] | 114 | and the value of the variable i. Since i is one, this will print: |
| 115 | |
| 116 | count is 1 ~ |
| 117 | |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 118 | Then there is the `i += 1` command. This does the same thing as "i = i + 1", |
| 119 | it adds one to the variable i and assigns the new value to the same variable. |
Bram Moolenaar | 7c62692 | 2005-02-07 22:01:03 +0000 | [diff] [blame] | 120 | |
| 121 | The example was given to explain the commands, but would you really want to |
Bram Moolenaar | 214641f | 2017-03-05 17:04:09 +0100 | [diff] [blame] | 122 | make such a loop, it can be written much more compact: > |
Bram Moolenaar | af7f641 | 2005-01-17 22:11:23 +0000 | [diff] [blame] | 123 | |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 124 | for i in range(1, 4) |
Bram Moolenaar | cfa8f9a | 2022-06-03 21:59:47 +0100 | [diff] [blame] | 125 | echo $"count is {i}" |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 126 | endfor |
Bram Moolenaar | af7f641 | 2005-01-17 22:11:23 +0000 | [diff] [blame] | 127 | |
Bram Moolenaar | cfa8f9a | 2022-06-03 21:59:47 +0100 | [diff] [blame] | 128 | We won't explain how `for`, `range()`and `$"string"` work until later. Follow |
| 129 | the links if you are impatient. |
| 130 | |
| 131 | |
| 132 | TRYING OUT EXAMPLES |
| 133 | |
| 134 | You can easily try out most examples in these help files without saving the |
Bram Moolenaar | 63f3260 | 2022-06-09 20:45:54 +0100 | [diff] [blame] | 135 | commands to a file. For example, to try out the "for" loop above do this: |
Bram Moolenaar | cfa8f9a | 2022-06-03 21:59:47 +0100 | [diff] [blame] | 136 | 1. position the cursor on the "for" |
| 137 | 2. start Visual mode with "v" |
| 138 | 3. move down to the "endfor" |
| 139 | 4. press colon, then "so" and Enter |
| 140 | |
| 141 | After pressing colon you will see ":'<,'>", which is the range of the Visually |
| 142 | selected text. |
| 143 | |
| 144 | For some commands it matters they are executed as in |Vim9| script. But typed |
| 145 | commands normally use legacy script syntax, such as the example below that |
| 146 | causes the E1004 error. For that use this fourth step: |
| 147 | 4. press colon, then "vim9 so" and Enter |
| 148 | |
| 149 | "vim9" is short for `vim9cmd`, which is a command modifier to execute the |
| 150 | following command in |Vim9| syntax. |
| 151 | |
| 152 | Note that this won't work for examples that require a script context. |
Bram Moolenaar | af7f641 | 2005-01-17 22:11:23 +0000 | [diff] [blame] | 153 | |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 154 | |
Bram Moolenaar | 7dd64a3 | 2019-05-31 21:41:05 +0200 | [diff] [blame] | 155 | FOUR KINDS OF NUMBERS |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 156 | |
Bram Moolenaar | cfa8f9a | 2022-06-03 21:59:47 +0100 | [diff] [blame] | 157 | Numbers can be decimal, hexadecimal, octal and binary. |
Bram Moolenaar | 11e3c5b | 2021-04-21 18:09:37 +0200 | [diff] [blame] | 158 | |
| 159 | A hexadecimal number starts with "0x" or "0X". For example "0x1f" is decimal |
Bram Moolenaar | 76db9e0 | 2022-11-09 21:21:04 +0000 | [diff] [blame] | 160 | 31 and "0x1234" is decimal 4660. |
Bram Moolenaar | 11e3c5b | 2021-04-21 18:09:37 +0200 | [diff] [blame] | 161 | |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 162 | An octal number starts with "0o", "0O". "0o17" is decimal 15. |
Bram Moolenaar | 11e3c5b | 2021-04-21 18:09:37 +0200 | [diff] [blame] | 163 | |
| 164 | A binary number starts with "0b" or "0B". For example "0b101" is decimal 5. |
| 165 | |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 166 | A decimal number is just digits. Careful: In legacy script don't put a zero |
Bram Moolenaar | cfa8f9a | 2022-06-03 21:59:47 +0100 | [diff] [blame] | 167 | before a decimal number, it will be interpreted as an octal number! That's |
| 168 | one reason to use |Vim9| script. |
Bram Moolenaar | 11e3c5b | 2021-04-21 18:09:37 +0200 | [diff] [blame] | 169 | |
Bram Moolenaar | cfa8f9a | 2022-06-03 21:59:47 +0100 | [diff] [blame] | 170 | The `echo` command evaluates its argument and when it is a number always |
| 171 | prints the decimal form. Example: > |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 172 | |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 173 | echo 0x7f 0o36 |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 174 | < 127 30 ~ |
| 175 | |
Bram Moolenaar | 7dd64a3 | 2019-05-31 21:41:05 +0200 | [diff] [blame] | 176 | A number is made negative with a minus sign. This also works for hexadecimal, |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 177 | octal and binary numbers: > |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 178 | |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 179 | echo -0x7f |
| 180 | < -127 ~ |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 181 | |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 182 | A minus sign is also used for subtraction. This can sometimes lead to |
| 183 | confusion. If we put a minus sign before both numbers we get an error: > |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 184 | |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 185 | echo -0x7f -0o36 |
| 186 | < E1004: White space required before and after '-' at "-0o36" ~ |
| 187 | |
| 188 | Note: if you are not using a |Vim9| script to try out these commands but type |
| 189 | them directly, they will be executed as legacy script. Then the echo command |
| 190 | sees the second minus sign as subtraction. To get the error, prefix the |
| 191 | command with `vim9cmd`: > |
| 192 | |
| 193 | vim9cmd echo -0x7f -0o36 |
| 194 | < E1004: White space required before and after '-' at "-0o36" ~ |
| 195 | |
| 196 | White space in an expression is often required to make sure it is easy to read |
| 197 | and avoid errors. Such as thinking that the "-0o36" above makes the number |
| 198 | negative, while it is actually seen as a subtraction. |
| 199 | |
| 200 | To actually have the minus sign be used for negation, you can put the second |
Bram Moolenaar | 944697a | 2022-02-20 19:48:20 +0000 | [diff] [blame] | 201 | expression in parentheses: > |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 202 | |
| 203 | echo -0x7f (-0o36) |
Bram Moolenaar | cfa8f9a | 2022-06-03 21:59:47 +0100 | [diff] [blame] | 204 | < -127 -30 ~ |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 205 | |
| 206 | ============================================================================== |
| 207 | *41.2* Variables |
| 208 | |
| 209 | A variable name consists of ASCII letters, digits and the underscore. It |
| 210 | cannot start with a digit. Valid variable names are: |
| 211 | |
| 212 | counter |
| 213 | _aap3 |
| 214 | very_long_variable_name_with_underscores |
Bram Moolenaar | cfa8f9a | 2022-06-03 21:59:47 +0100 | [diff] [blame] | 215 | CamelCaseName |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 216 | LENGTH |
| 217 | |
Bram Moolenaar | 63f3260 | 2022-06-09 20:45:54 +0100 | [diff] [blame] | 218 | Invalid names are "foo.bar" and "6var". |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 219 | |
| 220 | Some variables are global. To see a list of currently defined global |
| 221 | variables type this command: > |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 222 | |
| 223 | :let |
| 224 | |
Bram Moolenaar | cfa8f9a | 2022-06-03 21:59:47 +0100 | [diff] [blame] | 225 | You can use global variables everywhere. However, it is too easy to use the |
| 226 | same name in two unrelated scripts. Therefore variables declared in a script |
| 227 | are local to that script. For example, if you have this in "script1.vim": > |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 228 | |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 229 | vim9script |
| 230 | var counter = 5 |
| 231 | echo counter |
| 232 | < 5 ~ |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 233 | |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 234 | And you try to use the variable in "script2.vim": > |
| 235 | |
| 236 | vim9script |
| 237 | echo counter |
| 238 | < E121: Undefined variable: counter ~ |
| 239 | |
| 240 | Using a script-local variable means you can be sure that it is only changed in |
| 241 | that script and not elsewhere. |
| 242 | |
| 243 | If you do want to share variables between scripts, use the "g:" prefix and |
Bram Moolenaar | cfa8f9a | 2022-06-03 21:59:47 +0100 | [diff] [blame] | 244 | assign the value directly, do not use `var`. And use a specific name to avoid |
| 245 | mistakes. Thus in "script1.vim": > |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 246 | |
| 247 | vim9script |
Bram Moolenaar | cfa8f9a | 2022-06-03 21:59:47 +0100 | [diff] [blame] | 248 | g:mash_counter = 5 |
| 249 | echo g:mash_counter |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 250 | < 5 ~ |
| 251 | |
| 252 | And then in "script2.vim": > |
| 253 | |
| 254 | vim9script |
Bram Moolenaar | cfa8f9a | 2022-06-03 21:59:47 +0100 | [diff] [blame] | 255 | echo g:mash_counter |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 256 | < 5 ~ |
| 257 | |
Bram Moolenaar | cfa8f9a | 2022-06-03 21:59:47 +0100 | [diff] [blame] | 258 | Global variables can also be accessed on the command line, E.g. typing this: > |
| 259 | echo g:mash_counter |
| 260 | That will not work for a script-local variable. |
| 261 | |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 262 | More about script-local variables here: |script-variable|. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 263 | |
| 264 | There are more kinds of variables, see |internal-variables|. The most often |
| 265 | used ones are: |
| 266 | |
| 267 | b:name variable local to a buffer |
| 268 | w:name variable local to a window |
| 269 | g:name global variable (also in a function) |
| 270 | v:name variable predefined by Vim |
| 271 | |
| 272 | |
| 273 | DELETING VARIABLES |
| 274 | |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 275 | Variables take up memory and show up in the output of the `let` command. To |
| 276 | delete a global variable use the `unlet` command. Example: > |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 277 | |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 278 | unlet g:counter |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 279 | |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 280 | This deletes the global variable "g:counter" to free up the memory it uses. |
| 281 | If you are not sure if the variable exists, and don't want an error message |
| 282 | when it doesn't, append !: > |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 283 | |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 284 | unlet! g:counter |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 285 | |
Bram Moolenaar | cfa8f9a | 2022-06-03 21:59:47 +0100 | [diff] [blame] | 286 | You cannot `unlet` script-local variables in |Vim9| script, only in legacy |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 287 | script. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 288 | |
Bram Moolenaar | 48c3f4e | 2022-08-08 15:42:38 +0100 | [diff] [blame] | 289 | When a script has been processed to the end, the local variables declared |
| 290 | there will not be deleted. Functions defined in the script can use them. |
| 291 | Example: |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 292 | > |
| 293 | vim9script |
| 294 | var counter = 0 |
| 295 | def g:GetCount(): number |
Bram Moolenaar | 48c3f4e | 2022-08-08 15:42:38 +0100 | [diff] [blame] | 296 | counter += 1 |
| 297 | return counter |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 298 | enddef |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 299 | |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 300 | Every time you call the function it will return the next count: > |
| 301 | :echo g:GetCount() |
| 302 | < 1 ~ |
| 303 | > |
| 304 | :echo g:GetCount() |
| 305 | < 2 ~ |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 306 | |
Bram Moolenaar | cfa8f9a | 2022-06-03 21:59:47 +0100 | [diff] [blame] | 307 | If you are worried a script-local variable is consuming too much memory, set |
| 308 | it to an empty or null value after you no longer need it. Example: > |
| 309 | var lines = readfile(...) |
| 310 | ... |
| 311 | lines = [] |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 312 | |
Bram Moolenaar | cfa8f9a | 2022-06-03 21:59:47 +0100 | [diff] [blame] | 313 | Note: below we'll leave out the `vim9script` line from examples, so we can |
| 314 | concentrate on the relevant commands, but you'll still need to put it at the |
| 315 | top of your script file. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 316 | |
| 317 | |
| 318 | STRING VARIABLES AND CONSTANTS |
| 319 | |
| 320 | So far only numbers were used for the variable value. Strings can be used as |
Bram Moolenaar | 7c62692 | 2005-02-07 22:01:03 +0000 | [diff] [blame] | 321 | well. Numbers and strings are the basic types of variables that Vim supports. |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 322 | Example: > |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 323 | |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 324 | var name = "Peter" |
| 325 | echo name |
Bram Moolenaar | 2f0936c | 2022-01-08 21:51:59 +0000 | [diff] [blame] | 326 | < Peter ~ |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 327 | |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 328 | Every variable has a type. Very often, as in this example, the type is |
| 329 | defined by assigning a value. This is called type inference. If you do not |
| 330 | want to give the variable a value yet, you need to specify the type: > |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 331 | |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 332 | var name: string |
| 333 | var age: number |
Bram Moolenaar | cfa8f9a | 2022-06-03 21:59:47 +0100 | [diff] [blame] | 334 | if male |
| 335 | name = "Peter" |
| 336 | age = 42 |
| 337 | else |
| 338 | name = "Elisa" |
| 339 | age = 45 |
| 340 | endif |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 341 | |
| 342 | If you make a mistake and try to assign the wrong type of value you'll get an |
| 343 | error: > |
Bram Moolenaar | 8a3b805 | 2022-06-26 12:21:15 +0100 | [diff] [blame] | 344 | |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 345 | age = "Peter" |
| 346 | < E1012: Type mismatch; expected number but got string ~ |
| 347 | |
| 348 | More about types in |41.8|. |
| 349 | |
Bram Moolenaar | cfa8f9a | 2022-06-03 21:59:47 +0100 | [diff] [blame] | 350 | To assign a string value to a variable, you can use a string constant. There |
| 351 | are two types of these. First the string in double quotes, as we used |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 352 | already. If you want to include a double quote inside the string, put a |
| 353 | backslash in front of it: > |
| 354 | |
| 355 | var name = "he is \"Peter\"" |
| 356 | echo name |
| 357 | < he is "Peter" ~ |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 358 | |
Bram Moolenaar | cfa8f9a | 2022-06-03 21:59:47 +0100 | [diff] [blame] | 359 | To avoid the need for backslashes, you can use a string in single quotes: > |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 360 | |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 361 | var name = 'he is "Peter"' |
| 362 | echo name |
| 363 | < he is "Peter" ~ |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 364 | |
Bram Moolenaar | 7c62692 | 2005-02-07 22:01:03 +0000 | [diff] [blame] | 365 | Inside a single-quote string all the characters are as they are. Only the |
| 366 | single quote itself is special: you need to use two to get one. A backslash |
| 367 | is taken literally, thus you can't use it to change the meaning of the |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 368 | character after it: > |
| 369 | |
| 370 | var name = 'P\e''ter''' |
| 371 | echo name |
| 372 | < P\e'ter' ~ |
| 373 | |
| 374 | In double-quote strings it is possible to use special characters. Here are a |
| 375 | few useful ones: |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 376 | |
| 377 | \t <Tab> |
| 378 | \n <NL>, line break |
| 379 | \r <CR>, <Enter> |
| 380 | \e <Esc> |
| 381 | \b <BS>, backspace |
| 382 | \" " |
| 383 | \\ \, backslash |
| 384 | \<Esc> <Esc> |
| 385 | \<C-W> CTRL-W |
| 386 | |
| 387 | The last two are just examples. The "\<name>" form can be used to include |
| 388 | the special key "name". |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 389 | |
| 390 | See |expr-quote| for the full list of special items in a string. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 391 | |
| 392 | ============================================================================== |
| 393 | *41.3* Expressions |
| 394 | |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 395 | Vim has a fairly standard way to handle expressions. You can read the |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 396 | definition here: |expression-syntax|. Here we will show the most common |
| 397 | items. |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 398 | |
| 399 | The numbers, strings and variables mentioned above are expressions by |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 400 | themselves. Thus everywhere an expression is expected, you can use a number, |
| 401 | string or variable. Other basic items in an expression are: |
| 402 | |
| 403 | $NAME environment variable |
Bram Moolenaar | cfa8f9a | 2022-06-03 21:59:47 +0100 | [diff] [blame] | 404 | &name option value |
| 405 | @r register contents |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 406 | |
| 407 | Examples: > |
| 408 | |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 409 | echo "The value of 'tabstop' is" &ts |
| 410 | echo "Your home directory is" $HOME |
| 411 | if @a == 'text' |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 412 | |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 413 | The &name form can also be used to set an option value, do something and |
| 414 | restore the old value. Example: > |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 415 | |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 416 | var save_ic = &ic |
| 417 | set noic |
| 418 | s/The Start/The Beginning/ |
| 419 | &ic = save_ic |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 420 | |
| 421 | This makes sure the "The Start" pattern is used with the 'ignorecase' option |
Bram Moolenaar | 7c62692 | 2005-02-07 22:01:03 +0000 | [diff] [blame] | 422 | off. Still, it keeps the value that the user had set. (Another way to do |
| 423 | this would be to add "\C" to the pattern, see |/\C|.) |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 424 | |
| 425 | |
| 426 | MATHEMATICS |
| 427 | |
| 428 | It becomes more interesting if we combine these basic items. Let's start with |
| 429 | mathematics on numbers: |
| 430 | |
| 431 | a + b add |
| 432 | a - b subtract |
| 433 | a * b multiply |
| 434 | a / b divide |
| 435 | a % b modulo |
| 436 | |
| 437 | The usual precedence is used. Example: > |
| 438 | |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 439 | echo 10 + 5 * 2 |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 440 | < 20 ~ |
| 441 | |
Bram Moolenaar | 0065402 | 2011-02-25 14:42:19 +0100 | [diff] [blame] | 442 | Grouping is done with parentheses. No surprises here. Example: > |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 443 | |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 444 | echo (10 + 5) * 2 |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 445 | < 30 ~ |
| 446 | |
Bram Moolenaar | cfa8f9a | 2022-06-03 21:59:47 +0100 | [diff] [blame] | 447 | |
| 448 | OTHERS |
| 449 | |
Bram Moolenaar | 1c6737b | 2020-09-07 22:18:52 +0200 | [diff] [blame] | 450 | Strings can be concatenated with ".." (see |expr6|). Example: > |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 451 | |
Bram Moolenaar | cfa8f9a | 2022-06-03 21:59:47 +0100 | [diff] [blame] | 452 | echo "Name: " .. name |
| 453 | Name: Peter |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 454 | |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 455 | When the "echo" command gets multiple arguments, it separates them with a |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 456 | space. In the example the argument is a single expression, thus no space is |
| 457 | inserted. |
| 458 | |
Bram Moolenaar | cfa8f9a | 2022-06-03 21:59:47 +0100 | [diff] [blame] | 459 | If you don't like the concatenation you can use the $"string" form, which |
| 460 | accepts an expression in curly braces: > |
| 461 | echo $"Name: {name}" |
| 462 | |
Bram Moolenaar | b59ae59 | 2022-11-23 23:46:31 +0000 | [diff] [blame] | 463 | See |interpolated-string| for more information. |
Bram Moolenaar | cfa8f9a | 2022-06-03 21:59:47 +0100 | [diff] [blame] | 464 | |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 465 | Borrowed from the C language is the conditional expression: > |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 466 | |
| 467 | a ? b : c |
| 468 | |
| 469 | If "a" evaluates to true "b" is used, otherwise "c" is used. Example: > |
| 470 | |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 471 | var nr = 4 |
| 472 | echo nr > 5 ? "nr is big" : "nr is small" |
| 473 | < nr is small ~ |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 474 | |
| 475 | The three parts of the constructs are always evaluated first, thus you could |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 476 | see it works as: > |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 477 | |
| 478 | (a) ? (b) : (c) |
| 479 | |
Bram Moolenaar | cfa8f9a | 2022-06-03 21:59:47 +0100 | [diff] [blame] | 480 | There is also the falsy operator: > |
| 481 | echo name ?? "No name given" |
| 482 | See |??|. |
| 483 | |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 484 | ============================================================================== |
| 485 | *41.4* Conditionals |
| 486 | |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 487 | The `if` commands executes the following statements, until the matching |
| 488 | `endif`, only when a condition is met. The generic form is: |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 489 | |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 490 | if {condition} |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 491 | {statements} |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 492 | endif |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 493 | |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 494 | Only when the expression {condition} evaluates to true or one will the |
| 495 | {statements} be executed. If they are not executed they must still be valid |
| 496 | commands. If they contain garbage, Vim won't be able to find the matching |
| 497 | `endif`. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 498 | |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 499 | You can also use `else`. The generic form for this is: |
| 500 | |
| 501 | if {condition} |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 502 | {statements} |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 503 | else |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 504 | {statements} |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 505 | endif |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 506 | |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 507 | The second {statements} block is only executed if the first one isn't. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 508 | |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 509 | Finally, there is `elseif` |
| 510 | |
| 511 | if {condition} |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 512 | {statements} |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 513 | elseif {condition} |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 514 | {statements} |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 515 | endif |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 516 | |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 517 | This works just like using `else` and then `if`, but without the need for an |
| 518 | extra `endif`. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 519 | |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 520 | A useful example for your vimrc file is checking the 'term' option and doing |
| 521 | something depending upon its value: > |
| 522 | |
| 523 | if &term == "xterm" |
| 524 | # Do stuff for xterm |
| 525 | elseif &term == "vt100" |
| 526 | # Do stuff for a vt100 terminal |
| 527 | else |
| 528 | # Do something for other terminals |
| 529 | endif |
| 530 | |
| 531 | This uses "#" to start a comment, more about that later. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 532 | |
| 533 | |
| 534 | LOGIC OPERATIONS |
| 535 | |
| 536 | We already used some of them in the examples. These are the most often used |
| 537 | ones: |
| 538 | |
| 539 | a == b equal to |
| 540 | a != b not equal to |
| 541 | a > b greater than |
| 542 | a >= b greater than or equal to |
| 543 | a < b less than |
| 544 | a <= b less than or equal to |
| 545 | |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 546 | The result is true if the condition is met and false otherwise. An example: > |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 547 | |
Bram Moolenaar | cfa8f9a | 2022-06-03 21:59:47 +0100 | [diff] [blame] | 548 | if v:version >= 800 |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 549 | echo "congratulations" |
| 550 | else |
| 551 | echo "you are using an old version, upgrade!" |
| 552 | endif |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 553 | |
| 554 | Here "v:version" is a variable defined by Vim, which has the value of the Vim |
Bram Moolenaar | cfa8f9a | 2022-06-03 21:59:47 +0100 | [diff] [blame] | 555 | version. 800 is for version 8.0, version 8.1 has the value 801. This is |
| 556 | useful to write a script that works with multiple versions of Vim. |
| 557 | See |v:version|. You can also check for a specific feature with `has()` or a |
| 558 | specific patch, see |has-patch|. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 559 | |
| 560 | The logic operators work both for numbers and strings. When comparing two |
| 561 | strings, the mathematical difference is used. This compares byte values, |
| 562 | which may not be right for some languages. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 563 | |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 564 | If you try to compare a string with a number you will get an error. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 565 | |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 566 | For strings there are two more useful items: |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 567 | |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 568 | str =~ pat matches with |
| 569 | str !~ pat does not match with |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 570 | |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 571 | The left item "str" is used as a string. The right item "pat" is used as a |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 572 | pattern, like what's used for searching. Example: > |
| 573 | |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 574 | if str =~ " " |
| 575 | echo "str contains a space" |
| 576 | endif |
| 577 | if str !~ '\.$' |
| 578 | echo "str does not end in a full stop" |
| 579 | endif |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 580 | |
| 581 | Notice the use of a single-quote string for the pattern. This is useful, |
Bram Moolenaar | cfa8f9a | 2022-06-03 21:59:47 +0100 | [diff] [blame] | 582 | because patterns tend to contain many backslashes and backslashes need to be |
| 583 | doubled in a double-quote string. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 584 | |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 585 | The match is not anchored, if you want to match the whole string start with |
| 586 | "^" and end with "$". |
| 587 | |
| 588 | The 'ignorecase' option is not used when comparing strings. When you do want |
| 589 | to ignore case append "?". Thus "==?" compares two strings to be equal while |
| 590 | ignoring case. For the full table see |expr-==|. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 591 | |
| 592 | |
| 593 | MORE LOOPING |
| 594 | |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 595 | The `while` command was already mentioned. Two more statements can be used in |
| 596 | between the `while` and the `endwhile`: |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 597 | |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 598 | continue Jump back to the start of the while loop; the |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 599 | loop continues. |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 600 | break Jump forward to the `endwhile`; the loop is |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 601 | discontinued. |
| 602 | |
| 603 | Example: > |
| 604 | |
Bram Moolenaar | 2f0936c | 2022-01-08 21:51:59 +0000 | [diff] [blame] | 605 | var counter = 1 |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 606 | while counter < 40 |
Bram Moolenaar | 2f0936c | 2022-01-08 21:51:59 +0000 | [diff] [blame] | 607 | if skip_number(counter) |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 608 | continue |
| 609 | endif |
Bram Moolenaar | 2f0936c | 2022-01-08 21:51:59 +0000 | [diff] [blame] | 610 | if last_number(counter) |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 611 | break |
| 612 | endif |
| 613 | sleep 50m |
Bram Moolenaar | 2f0936c | 2022-01-08 21:51:59 +0000 | [diff] [blame] | 614 | ++counter |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 615 | endwhile |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 616 | |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 617 | The `sleep` command makes Vim take a nap. The "50m" specifies fifty |
| 618 | milliseconds. Another example is `sleep 4`, which sleeps for four seconds. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 619 | |
Bram Moolenaar | cfa8f9a | 2022-06-03 21:59:47 +0100 | [diff] [blame] | 620 | `continue` and `break` can also be used in between `for` and `endfor`. |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 621 | Even more looping can be done with the `for` command, see below in |41.8|. |
Bram Moolenaar | 7c62692 | 2005-02-07 22:01:03 +0000 | [diff] [blame] | 622 | |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 623 | ============================================================================== |
| 624 | *41.5* Executing an expression |
| 625 | |
| 626 | So far the commands in the script were executed by Vim directly. The |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 627 | `execute` command allows executing the result of an expression. This is a |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 628 | very powerful way to build commands and execute them. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 629 | |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 630 | An example is to jump to a tag, which is contained in a variable: > |
| 631 | |
| 632 | execute "tag " .. tag_name |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 633 | |
Bram Moolenaar | 1c6737b | 2020-09-07 22:18:52 +0200 | [diff] [blame] | 634 | The ".." is used to concatenate the string "tag " with the value of variable |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 635 | "tag_name". Suppose "tag_name" has the value "get_cmd", then the command that |
| 636 | will be executed is: > |
| 637 | |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 638 | tag get_cmd |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 639 | |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 640 | The `execute` command can only execute Ex commands. The `normal` command |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 641 | executes Normal mode commands. However, its argument is not an expression but |
| 642 | the literal command characters. Example: > |
| 643 | |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 644 | normal gg=G |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 645 | |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 646 | This jumps to the first line with "gg" and formats all lines with the "=" |
| 647 | operator and the "G" movement. |
| 648 | |
| 649 | To make `normal` work with an expression, combine `execute` with it. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 650 | Example: > |
| 651 | |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 652 | execute "normal " .. count .. "j" |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 653 | |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 654 | This will move the cursor "count" lines down. |
| 655 | |
| 656 | Make sure that the argument for `normal` is a complete command. Otherwise |
Bram Moolenaar | cfa8f9a | 2022-06-03 21:59:47 +0100 | [diff] [blame] | 657 | Vim will run into the end of the argument and silently abort the command. For |
| 658 | example, if you start the delete operator, you must give the movement command |
| 659 | also. This works: > |
Bram Moolenaar | 8a3b805 | 2022-06-26 12:21:15 +0100 | [diff] [blame] | 660 | |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 661 | normal d$ |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 662 | |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 663 | This does nothing: > |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 664 | |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 665 | normal d |
| 666 | |
| 667 | If you start Insert mode and do not end it with Esc, it will end anyway. This |
| 668 | works to insert "new text": > |
| 669 | |
| 670 | execute "normal inew text" |
| 671 | |
| 672 | If you want to do something after inserting text you do need to end Insert |
| 673 | mode: > |
| 674 | |
| 675 | execute "normal inew text\<Esc>b" |
| 676 | |
| 677 | This inserts "new text" and puts the cursor on the first letter of "text". |
| 678 | Notice the use of the special key "\<Esc>". This avoids having to enter a |
| 679 | real <Esc> character in your script. That is where `execute` with a |
| 680 | double-quote string comes in handy. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 681 | |
Bram Moolenaar | cfa8f9a | 2022-06-03 21:59:47 +0100 | [diff] [blame] | 682 | If you don't want to execute a string as a command but evaluate it to get the |
| 683 | result of the expression, you can use the eval() function: > |
Bram Moolenaar | 7c62692 | 2005-02-07 22:01:03 +0000 | [diff] [blame] | 684 | |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 685 | var optname = "path" |
| 686 | var optvalue = eval('&' .. optname) |
Bram Moolenaar | 7c62692 | 2005-02-07 22:01:03 +0000 | [diff] [blame] | 687 | |
| 688 | A "&" character is prepended to "path", thus the argument to eval() is |
| 689 | "&path". The result will then be the value of the 'path' option. |
Bram Moolenaar | 7c62692 | 2005-02-07 22:01:03 +0000 | [diff] [blame] | 690 | |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 691 | ============================================================================== |
| 692 | *41.6* Using functions |
| 693 | |
| 694 | Vim defines many functions and provides a large amount of functionality that |
| 695 | way. A few examples will be given in this section. You can find the whole |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 696 | list below: |function-list|. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 697 | |
Bram Moolenaar | cfa8f9a | 2022-06-03 21:59:47 +0100 | [diff] [blame] | 698 | A function is called with the parameters in between parentheses, separated by |
| 699 | commas. Example: > |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 700 | |
Bram Moolenaar | cfa8f9a | 2022-06-03 21:59:47 +0100 | [diff] [blame] | 701 | search("Date: ", "W") |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 702 | |
| 703 | This calls the search() function, with arguments "Date: " and "W". The |
| 704 | search() function uses its first argument as a search pattern and the second |
| 705 | one as flags. The "W" flag means the search doesn't wrap around the end of |
| 706 | the file. |
| 707 | |
Bram Moolenaar | 76db9e0 | 2022-11-09 21:21:04 +0000 | [diff] [blame] | 708 | Using the `call` command is optional in |Vim9| script. It is required in |
Bram Moolenaar | 63f3260 | 2022-06-09 20:45:54 +0100 | [diff] [blame] | 709 | legacy script and on the command line: > |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 710 | |
Bram Moolenaar | cfa8f9a | 2022-06-03 21:59:47 +0100 | [diff] [blame] | 711 | call search("Date: ", "W") |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 712 | |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 713 | A function can be called in an expression. Example: > |
| 714 | |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 715 | var line = getline(".") |
| 716 | var repl = substitute(line, '\a', "*", "g") |
| 717 | setline(".", repl) |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 718 | |
Bram Moolenaar | 7c62692 | 2005-02-07 22:01:03 +0000 | [diff] [blame] | 719 | The getline() function obtains a line from the current buffer. Its argument |
| 720 | is a specification of the line number. In this case "." is used, which means |
| 721 | the line where the cursor is. |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 722 | |
Bram Moolenaar | cfa8f9a | 2022-06-03 21:59:47 +0100 | [diff] [blame] | 723 | The substitute() function does something similar to the `:substitute` command. |
| 724 | The first argument "line" is the string on which to perform the substitution. |
| 725 | The second argument '\a' is the pattern, the third "*" is the replacement |
| 726 | string. Finally, the last argument "g" is the flags. |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 727 | |
| 728 | The setline() function sets the line, specified by the first argument, to a |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 729 | new string, the second argument. In this example the line under the cursor is |
| 730 | replaced with the result of the substitute(). Thus the effect of the three |
| 731 | statements is equal to: > |
| 732 | |
| 733 | :substitute/\a/*/g |
| 734 | |
Bram Moolenaar | 63f3260 | 2022-06-09 20:45:54 +0100 | [diff] [blame] | 735 | Using the functions becomes interesting when you do more work before and |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 736 | after the substitute() call. |
| 737 | |
| 738 | |
| 739 | FUNCTIONS *function-list* |
| 740 | |
| 741 | There are many functions. We will mention them here, grouped by what they are |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 742 | used for. You can find an alphabetical list here: |builtin-function-list|. |
| 743 | Use CTRL-] on the function name to jump to detailed help on it. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 744 | |
Bram Moolenaar | a3f4166 | 2010-07-11 19:01:06 +0200 | [diff] [blame] | 745 | String manipulation: *string-functions* |
Bram Moolenaar | 9d40128 | 2019-04-06 13:18:12 +0200 | [diff] [blame] | 746 | nr2char() get a character by its number value |
| 747 | list2str() get a character string from a list of numbers |
| 748 | char2nr() get number value of a character |
| 749 | str2list() get list of numbers from a string |
Bram Moolenaar | 3577c6f | 2008-06-24 21:16:56 +0000 | [diff] [blame] | 750 | str2nr() convert a string to a Number |
| 751 | str2float() convert a string to a Float |
Bram Moolenaar | c6fe919 | 2006-04-09 21:54:49 +0000 | [diff] [blame] | 752 | printf() format a string according to % items |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 753 | escape() escape characters in a string with a '\' |
Bram Moolenaar | 3577c6f | 2008-06-24 21:16:56 +0000 | [diff] [blame] | 754 | shellescape() escape a string for use with a shell command |
| 755 | fnameescape() escape a file name for use with a Vim command |
Bram Moolenaar | c6fe919 | 2006-04-09 21:54:49 +0000 | [diff] [blame] | 756 | tr() translate characters from one set to another |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 757 | strtrans() translate a string to make it printable |
Bram Moolenaar | 7b2d872 | 2022-09-12 15:16:29 +0100 | [diff] [blame] | 758 | keytrans() translate internal keycodes to a form that |
| 759 | can be used by |:map| |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 760 | tolower() turn a string to lowercase |
| 761 | toupper() turn a string to uppercase |
Bram Moolenaar | 4e4473c | 2020-08-28 22:24:57 +0200 | [diff] [blame] | 762 | charclass() class of a character |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 763 | match() position where a pattern matches in a string |
Yegappan Lakshmanan | f93b1c8 | 2024-01-04 22:28:46 +0100 | [diff] [blame] | 764 | matchbufline() all the matches of a pattern in a buffer |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 765 | matchend() position where a pattern match ends in a string |
Bram Moolenaar | 635414d | 2020-09-11 22:25:15 +0200 | [diff] [blame] | 766 | matchfuzzy() fuzzy matches a string in a list of strings |
Bram Moolenaar | 4f73b8e | 2020-09-22 20:33:50 +0200 | [diff] [blame] | 767 | matchfuzzypos() fuzzy matches a string in a list of strings |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 768 | matchstr() match of a pattern in a string |
Yegappan Lakshmanan | f93b1c8 | 2024-01-04 22:28:46 +0100 | [diff] [blame] | 769 | matchstrlist() all the matches of a pattern in a List of |
| 770 | strings |
Bram Moolenaar | 6f1d9a0 | 2016-07-24 14:12:38 +0200 | [diff] [blame] | 771 | matchstrpos() match and positions of a pattern in a string |
Bram Moolenaar | c6fe919 | 2006-04-09 21:54:49 +0000 | [diff] [blame] | 772 | matchlist() like matchstr() and also return submatches |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 773 | stridx() first index of a short string in a long string |
| 774 | strridx() last index of a short string in a long string |
Bram Moolenaar | 8d04317 | 2014-01-23 14:24:41 +0100 | [diff] [blame] | 775 | strlen() length of a string in bytes |
Bram Moolenaar | 70ce8a1 | 2021-03-14 19:02:09 +0100 | [diff] [blame] | 776 | strcharlen() length of a string in characters |
| 777 | strchars() number of characters in a string |
Christian Brabandt | 67672ef | 2023-04-24 21:09:54 +0100 | [diff] [blame] | 778 | strutf16len() number of UTF-16 code units in a string |
Bram Moolenaar | 8d04317 | 2014-01-23 14:24:41 +0100 | [diff] [blame] | 779 | strwidth() size of string when displayed |
| 780 | strdisplaywidth() size of string when displayed, deals with tabs |
Bram Moolenaar | 08aac3c | 2020-08-28 21:04:24 +0200 | [diff] [blame] | 781 | setcellwidths() set character cell width overrides |
Kota Kato | 66bb9ae | 2023-01-17 18:31:56 +0000 | [diff] [blame] | 782 | getcellwidths() get character cell width overrides |
mikoto2000 | 1083cae | 2024-11-11 21:24:14 +0100 | [diff] [blame] | 783 | getcellpixels() get character cell pixel size |
Yegappan Lakshmanan | 03ff1c2 | 2023-05-06 14:08:21 +0100 | [diff] [blame] | 784 | reverse() reverse the order of characters in a string |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 785 | substitute() substitute a pattern match with a string |
Bram Moolenaar | 251e191 | 2011-06-19 05:09:16 +0200 | [diff] [blame] | 786 | submatch() get a specific match in ":s" and substitute() |
Bram Moolenaar | c95a302 | 2016-06-12 23:01:46 +0200 | [diff] [blame] | 787 | strpart() get part of a string using byte index |
| 788 | strcharpart() get part of a string using char index |
Bram Moolenaar | 6601b62 | 2021-01-13 21:47:15 +0100 | [diff] [blame] | 789 | slice() take a slice of a string, using char index in |
| 790 | Vim9 script |
Bram Moolenaar | c95a302 | 2016-06-12 23:01:46 +0200 | [diff] [blame] | 791 | strgetchar() get character from a string using char index |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 792 | expand() expand special keywords |
Bram Moolenaar | 80dad48 | 2019-06-09 17:22:31 +0200 | [diff] [blame] | 793 | expandcmd() expand a command like done for `:edit` |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 794 | iconv() convert text from one encoding to another |
Bram Moolenaar | c6fe919 | 2006-04-09 21:54:49 +0000 | [diff] [blame] | 795 | byteidx() byte index of a character in a string |
Bram Moolenaar | 8d04317 | 2014-01-23 14:24:41 +0100 | [diff] [blame] | 796 | byteidxcomp() like byteidx() but count composing characters |
Bram Moolenaar | 17793ef | 2020-12-28 12:56:58 +0100 | [diff] [blame] | 797 | charidx() character index of a byte in a string |
Christian Brabandt | 67672ef | 2023-04-24 21:09:54 +0100 | [diff] [blame] | 798 | utf16idx() UTF-16 index of a byte in a string |
Bram Moolenaar | c6fe919 | 2006-04-09 21:54:49 +0000 | [diff] [blame] | 799 | repeat() repeat a string multiple times |
| 800 | eval() evaluate a string expression |
Bram Moolenaar | 063b9d1 | 2016-07-09 20:21:48 +0200 | [diff] [blame] | 801 | execute() execute an Ex command and get the output |
Bram Moolenaar | 7dd64a3 | 2019-05-31 21:41:05 +0200 | [diff] [blame] | 802 | win_execute() like execute() but in a specified window |
Bram Moolenaar | b730f0c | 2018-11-25 03:56:26 +0100 | [diff] [blame] | 803 | trim() trim characters from a string |
Christ van Willegen | ce0ef91 | 2024-06-20 23:41:59 +0200 | [diff] [blame] | 804 | bindtextdomain() set message lookup translation base path |
Bram Moolenaar | 0b39c3f | 2020-08-30 15:52:10 +0200 | [diff] [blame] | 805 | gettext() lookup message translation |
Christ van Willegen | c078675 | 2025-02-01 15:42:16 +0100 | [diff] [blame] | 806 | ngettext() lookup single/plural message translation |
Yegappan Lakshmanan | a11b23c | 2025-01-16 19:16:42 +0100 | [diff] [blame] | 807 | str2blob() convert a list of strings into a blob |
| 808 | blob2str() convert a blob into a list of strings |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 809 | |
Bram Moolenaar | a3f4166 | 2010-07-11 19:01:06 +0200 | [diff] [blame] | 810 | List manipulation: *list-functions* |
Bram Moolenaar | af7f641 | 2005-01-17 22:11:23 +0000 | [diff] [blame] | 811 | get() get an item without error for wrong index |
| 812 | len() number of items in a List |
| 813 | empty() check if List is empty |
| 814 | insert() insert an item somewhere in a List |
| 815 | add() append an item to a List |
| 816 | extend() append a List to a List |
Bram Moolenaar | b0e6b51 | 2021-01-12 20:23:40 +0100 | [diff] [blame] | 817 | extendnew() make a new List and append items |
Bram Moolenaar | af7f641 | 2005-01-17 22:11:23 +0000 | [diff] [blame] | 818 | remove() remove one or more items from a List |
| 819 | copy() make a shallow copy of a List |
| 820 | deepcopy() make a full copy of a List |
| 821 | filter() remove selected items from a List |
| 822 | map() change each List item |
Bram Moolenaar | ea69685 | 2020-11-09 18:31:39 +0100 | [diff] [blame] | 823 | mapnew() make a new List with changed items |
Ernie Rael | e79e207 | 2024-01-13 11:47:33 +0100 | [diff] [blame] | 824 | foreach() apply function to List items |
Bram Moolenaar | ebacddb | 2020-06-04 15:22:21 +0200 | [diff] [blame] | 825 | reduce() reduce a List to a value |
Bram Moolenaar | 6601b62 | 2021-01-13 21:47:15 +0100 | [diff] [blame] | 826 | slice() take a slice of a List |
Bram Moolenaar | af7f641 | 2005-01-17 22:11:23 +0000 | [diff] [blame] | 827 | sort() sort a List |
Yegappan Lakshmanan | 03ff1c2 | 2023-05-06 14:08:21 +0100 | [diff] [blame] | 828 | reverse() reverse the order of items in a List |
Bram Moolenaar | 76f3b1a | 2014-03-27 22:30:07 +0100 | [diff] [blame] | 829 | uniq() remove copies of repeated adjacent items |
Bram Moolenaar | af7f641 | 2005-01-17 22:11:23 +0000 | [diff] [blame] | 830 | split() split a String into a List |
| 831 | join() join List items into a String |
Bram Moolenaar | c6fe919 | 2006-04-09 21:54:49 +0000 | [diff] [blame] | 832 | range() return a List with a sequence of numbers |
Bram Moolenaar | af7f641 | 2005-01-17 22:11:23 +0000 | [diff] [blame] | 833 | string() String representation of a List |
| 834 | call() call a function with List as arguments |
Yegappan Lakshmanan | b218655 | 2022-08-13 13:09:20 +0100 | [diff] [blame] | 835 | index() index of a value in a List or Blob |
| 836 | indexof() index in a List or Blob where an expression |
Bram Moolenaar | b59ae59 | 2022-11-23 23:46:31 +0000 | [diff] [blame] | 837 | evaluates to true |
Bram Moolenaar | af7f641 | 2005-01-17 22:11:23 +0000 | [diff] [blame] | 838 | max() maximum value in a List |
| 839 | min() minimum value in a List |
| 840 | count() count number of times a value appears in a List |
Bram Moolenaar | c6fe919 | 2006-04-09 21:54:49 +0000 | [diff] [blame] | 841 | repeat() repeat a List multiple times |
Bram Moolenaar | 077a1e6 | 2020-06-08 20:50:43 +0200 | [diff] [blame] | 842 | flatten() flatten a List |
Bram Moolenaar | 3b69006 | 2021-02-01 20:14:51 +0100 | [diff] [blame] | 843 | flattennew() flatten a copy of a List |
Yegappan Lakshmanan | 9cb865e | 2025-03-23 16:42:16 +0100 | [diff] [blame] | 844 | items() get List of List index-value pairs |
| 845 | |
| 846 | Tuple manipulation: *tuple-functions* |
| 847 | copy() make a shallow copy of a Tuple |
| 848 | count() count number of times a value appears in a |
| 849 | Tuple |
| 850 | deepcopy() make a full copy of a Tuple |
| 851 | empty() check if Tuple is empty |
| 852 | foreach() apply function to Tuple items |
| 853 | get() get an item without error for wrong index |
| 854 | index() index of a value in a Tuple |
| 855 | indexof() index in a Tuple where an expression is true |
| 856 | items() get List of Tuple index-value pairs |
| 857 | join() join Tuple items into a String |
| 858 | len() number of items in a Tuple |
| 859 | list2tuple() convert a list of items into a Tuple |
| 860 | max() maximum value in a Tuple |
| 861 | min() minimum value in a Tuple |
| 862 | reduce() reduce a Tuple to a value |
| 863 | repeat() repeat a Tuple multiple times |
| 864 | reverse() reverse the order of items in a Tuple |
| 865 | slice() take a slice of a Tuple |
| 866 | string() string representation of a Tuple |
Yegappan Lakshmanan | 1c2f475 | 2025-03-30 15:37:24 +0200 | [diff] [blame] | 867 | tuple2list() convert a Tuple into a List |
Bram Moolenaar | af7f641 | 2005-01-17 22:11:23 +0000 | [diff] [blame] | 868 | |
Bram Moolenaar | a3f4166 | 2010-07-11 19:01:06 +0200 | [diff] [blame] | 869 | Dictionary manipulation: *dict-functions* |
Bram Moolenaar | 9ba0eb8 | 2005-06-13 22:28:56 +0000 | [diff] [blame] | 870 | get() get an entry without an error for a wrong key |
Bram Moolenaar | af7f641 | 2005-01-17 22:11:23 +0000 | [diff] [blame] | 871 | len() number of entries in a Dictionary |
| 872 | has_key() check whether a key appears in a Dictionary |
| 873 | empty() check if Dictionary is empty |
| 874 | remove() remove an entry from a Dictionary |
| 875 | extend() add entries from one Dictionary to another |
Bram Moolenaar | b0e6b51 | 2021-01-12 20:23:40 +0100 | [diff] [blame] | 876 | extendnew() make a new Dictionary and append items |
Bram Moolenaar | af7f641 | 2005-01-17 22:11:23 +0000 | [diff] [blame] | 877 | filter() remove selected entries from a Dictionary |
| 878 | map() change each Dictionary entry |
Bram Moolenaar | ea69685 | 2020-11-09 18:31:39 +0100 | [diff] [blame] | 879 | mapnew() make a new Dictionary with changed items |
Ernie Rael | e79e207 | 2024-01-13 11:47:33 +0100 | [diff] [blame] | 880 | foreach() apply function to Dictionary items |
Bram Moolenaar | af7f641 | 2005-01-17 22:11:23 +0000 | [diff] [blame] | 881 | keys() get List of Dictionary keys |
| 882 | values() get List of Dictionary values |
| 883 | items() get List of Dictionary key-value pairs |
| 884 | copy() make a shallow copy of a Dictionary |
| 885 | deepcopy() make a full copy of a Dictionary |
| 886 | string() String representation of a Dictionary |
| 887 | max() maximum value in a Dictionary |
| 888 | min() minimum value in a Dictionary |
| 889 | count() count number of times a value appears |
| 890 | |
Bram Moolenaar | a3f4166 | 2010-07-11 19:01:06 +0200 | [diff] [blame] | 891 | Floating point computation: *float-functions* |
Bram Moolenaar | 3577c6f | 2008-06-24 21:16:56 +0000 | [diff] [blame] | 892 | float2nr() convert Float to Number |
| 893 | abs() absolute value (also works for Number) |
| 894 | round() round off |
| 895 | ceil() round up |
| 896 | floor() round down |
| 897 | trunc() remove value after decimal point |
Bram Moolenaar | 8d04317 | 2014-01-23 14:24:41 +0100 | [diff] [blame] | 898 | fmod() remainder of division |
| 899 | exp() exponential |
| 900 | log() natural logarithm (logarithm to base e) |
Bram Moolenaar | 3577c6f | 2008-06-24 21:16:56 +0000 | [diff] [blame] | 901 | log10() logarithm to base 10 |
| 902 | pow() value of x to the exponent y |
| 903 | sqrt() square root |
| 904 | sin() sine |
| 905 | cos() cosine |
Bram Moolenaar | 662db67 | 2011-03-22 14:05:35 +0100 | [diff] [blame] | 906 | tan() tangent |
| 907 | asin() arc sine |
| 908 | acos() arc cosine |
Bram Moolenaar | 3577c6f | 2008-06-24 21:16:56 +0000 | [diff] [blame] | 909 | atan() arc tangent |
Bram Moolenaar | 662db67 | 2011-03-22 14:05:35 +0100 | [diff] [blame] | 910 | atan2() arc tangent |
| 911 | sinh() hyperbolic sine |
| 912 | cosh() hyperbolic cosine |
| 913 | tanh() hyperbolic tangent |
Bram Moolenaar | ebacddb | 2020-06-04 15:22:21 +0200 | [diff] [blame] | 914 | isinf() check for infinity |
Bram Moolenaar | c95a302 | 2016-06-12 23:01:46 +0200 | [diff] [blame] | 915 | isnan() check for not a number |
Bram Moolenaar | 3577c6f | 2008-06-24 21:16:56 +0000 | [diff] [blame] | 916 | |
Yegappan Lakshmanan | 5dfe467 | 2021-09-14 17:54:30 +0200 | [diff] [blame] | 917 | Blob manipulation: *blob-functions* |
| 918 | blob2list() get a list of numbers from a blob |
| 919 | list2blob() get a blob from a list of numbers |
Yegappan Lakshmanan | 03ff1c2 | 2023-05-06 14:08:21 +0100 | [diff] [blame] | 920 | reverse() reverse the order of numbers in a blob |
Yegappan Lakshmanan | 5dfe467 | 2021-09-14 17:54:30 +0200 | [diff] [blame] | 921 | |
Bram Moolenaar | b6b046b | 2011-12-30 13:11:27 +0100 | [diff] [blame] | 922 | Other computation: *bitwise-function* |
| 923 | and() bitwise AND |
| 924 | invert() bitwise invert |
| 925 | or() bitwise OR |
| 926 | xor() bitwise XOR |
Bram Moolenaar | 8d04317 | 2014-01-23 14:24:41 +0100 | [diff] [blame] | 927 | sha256() SHA-256 hash |
Bram Moolenaar | ebacddb | 2020-06-04 15:22:21 +0200 | [diff] [blame] | 928 | rand() get a pseudo-random number |
| 929 | srand() initialize seed used by rand() |
Bram Moolenaar | b6b046b | 2011-12-30 13:11:27 +0100 | [diff] [blame] | 930 | |
Bram Moolenaar | a3f4166 | 2010-07-11 19:01:06 +0200 | [diff] [blame] | 931 | Variables: *var-functions* |
h_east | 5985879 | 2023-10-25 22:47:05 +0900 | [diff] [blame] | 932 | instanceof() check if a variable is an instance of a given |
| 933 | class |
Bram Moolenaar | a47e05f | 2021-01-12 21:49:00 +0100 | [diff] [blame] | 934 | type() type of a variable as a number |
| 935 | typename() type of a variable as text |
Bram Moolenaar | c6fe919 | 2006-04-09 21:54:49 +0000 | [diff] [blame] | 936 | islocked() check if a variable is locked |
Bram Moolenaar | 214641f | 2017-03-05 17:04:09 +0100 | [diff] [blame] | 937 | funcref() get a Funcref for a function reference |
Bram Moolenaar | c6fe919 | 2006-04-09 21:54:49 +0000 | [diff] [blame] | 938 | function() get a Funcref for a function name |
| 939 | getbufvar() get a variable value from a specific buffer |
| 940 | setbufvar() set a variable in a specific buffer |
Bram Moolenaar | c6249bb | 2006-04-15 20:25:09 +0000 | [diff] [blame] | 941 | getwinvar() get a variable from specific window |
Bram Moolenaar | 06b5d51 | 2010-05-22 15:37:44 +0200 | [diff] [blame] | 942 | gettabvar() get a variable from specific tab page |
Bram Moolenaar | c6249bb | 2006-04-15 20:25:09 +0000 | [diff] [blame] | 943 | gettabwinvar() get a variable from specific window & tab page |
Bram Moolenaar | c6fe919 | 2006-04-09 21:54:49 +0000 | [diff] [blame] | 944 | setwinvar() set a variable in a specific window |
Bram Moolenaar | 06b5d51 | 2010-05-22 15:37:44 +0200 | [diff] [blame] | 945 | settabvar() set a variable in a specific tab page |
Bram Moolenaar | c6249bb | 2006-04-15 20:25:09 +0000 | [diff] [blame] | 946 | settabwinvar() set a variable in a specific window & tab page |
Bram Moolenaar | c6fe919 | 2006-04-09 21:54:49 +0000 | [diff] [blame] | 947 | garbagecollect() possibly free memory |
| 948 | |
Bram Moolenaar | a3f4166 | 2010-07-11 19:01:06 +0200 | [diff] [blame] | 949 | Cursor and mark position: *cursor-functions* *mark-functions* |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 950 | col() column number of the cursor or a mark |
| 951 | virtcol() screen column of the cursor or a mark |
| 952 | line() line number of the cursor or mark |
| 953 | wincol() window column number of the cursor |
| 954 | winline() window line number of the cursor |
| 955 | cursor() position the cursor at a line/column |
Bram Moolenaar | 8d04317 | 2014-01-23 14:24:41 +0100 | [diff] [blame] | 956 | screencol() get screen column of the cursor |
| 957 | screenrow() get screen row of the cursor |
Bram Moolenaar | b3d17a2 | 2019-07-07 18:28:14 +0200 | [diff] [blame] | 958 | screenpos() screen row and col of a text character |
Bram Moolenaar | 5a6ec10 | 2022-05-27 21:58:00 +0100 | [diff] [blame] | 959 | virtcol2col() byte index of a text character on screen |
Bram Moolenaar | 822ff86 | 2014-06-12 21:46:14 +0200 | [diff] [blame] | 960 | getcurpos() get position of the cursor |
Bram Moolenaar | c6fe919 | 2006-04-09 21:54:49 +0000 | [diff] [blame] | 961 | getpos() get position of cursor, mark, etc. |
| 962 | setpos() set position of cursor, mark, etc. |
Bram Moolenaar | cfb4b47 | 2020-05-31 15:41:57 +0200 | [diff] [blame] | 963 | getmarklist() list of global/local marks |
Bram Moolenaar | c6fe919 | 2006-04-09 21:54:49 +0000 | [diff] [blame] | 964 | byte2line() get line number at a specific byte count |
| 965 | line2byte() byte count at a specific line |
| 966 | diff_filler() get the number of filler lines above a line |
Bram Moolenaar | 8d04317 | 2014-01-23 14:24:41 +0100 | [diff] [blame] | 967 | screenattr() get attribute at a screen line/row |
| 968 | screenchar() get character code at a screen line/row |
Bram Moolenaar | 2912abb | 2019-03-29 14:16:42 +0100 | [diff] [blame] | 969 | screenchars() get character codes at a screen line/row |
| 970 | screenstring() get string of characters at a screen line/row |
Bram Moolenaar | 6f02b00 | 2021-01-10 20:22:54 +0100 | [diff] [blame] | 971 | charcol() character number of the cursor or a mark |
| 972 | getcharpos() get character position of cursor, mark, etc. |
| 973 | setcharpos() set character position of cursor, mark, etc. |
| 974 | getcursorcharpos() get character position of the cursor |
| 975 | setcursorcharpos() set character position of the cursor |
Bram Moolenaar | c6fe919 | 2006-04-09 21:54:49 +0000 | [diff] [blame] | 976 | |
Bram Moolenaar | a3f4166 | 2010-07-11 19:01:06 +0200 | [diff] [blame] | 977 | Working with text in the current buffer: *text-functions* |
Bram Moolenaar | 7c62692 | 2005-02-07 22:01:03 +0000 | [diff] [blame] | 978 | getline() get a line or list of lines from the buffer |
Shougo Matsushita | 3f905ab | 2024-02-21 00:02:45 +0100 | [diff] [blame] | 979 | getregion() get a region of text from the buffer |
Shougo Matsushita | b4757e6 | 2024-05-07 20:49:24 +0200 | [diff] [blame] | 980 | getregionpos() get a list of positions for a region |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 981 | setline() replace a line in the buffer |
Bram Moolenaar | 7c62692 | 2005-02-07 22:01:03 +0000 | [diff] [blame] | 982 | append() append line or list of lines in the buffer |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 983 | indent() indent of a specific line |
| 984 | cindent() indent according to C indenting |
| 985 | lispindent() indent according to Lisp indenting |
| 986 | nextnonblank() find next non-blank line |
| 987 | prevnonblank() find previous non-blank line |
| 988 | search() find a match for a pattern |
Bram Moolenaar | 1d2ba7f | 2006-02-14 22:29:30 +0000 | [diff] [blame] | 989 | searchpos() find a match for a pattern |
Bram Moolenaar | ebacddb | 2020-06-04 15:22:21 +0200 | [diff] [blame] | 990 | searchcount() get number of matches before/after the cursor |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 991 | searchpair() find the other end of a start/skip/end |
Bram Moolenaar | 1d2ba7f | 2006-02-14 22:29:30 +0000 | [diff] [blame] | 992 | searchpairpos() find the other end of a start/skip/end |
Bram Moolenaar | c6fe919 | 2006-04-09 21:54:49 +0000 | [diff] [blame] | 993 | searchdecl() search for the declaration of a name |
Bram Moolenaar | c95a302 | 2016-06-12 23:01:46 +0200 | [diff] [blame] | 994 | getcharsearch() return character search information |
| 995 | setcharsearch() set character search information |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 996 | |
Bram Moolenaar | 931a277 | 2019-07-04 16:54:54 +0200 | [diff] [blame] | 997 | Working with text in another buffer: |
| 998 | getbufline() get a list of lines from the specified buffer |
Bram Moolenaar | ce30ccc | 2022-11-21 19:57:04 +0000 | [diff] [blame] | 999 | getbufoneline() get a one line from the specified buffer |
Bram Moolenaar | 931a277 | 2019-07-04 16:54:54 +0200 | [diff] [blame] | 1000 | setbufline() replace a line in the specified buffer |
| 1001 | appendbufline() append a list of lines in the specified buffer |
| 1002 | deletebufline() delete lines from a specified buffer |
| 1003 | |
Bram Moolenaar | a3f4166 | 2010-07-11 19:01:06 +0200 | [diff] [blame] | 1004 | *system-functions* *file-functions* |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1005 | System functions and manipulation of files: |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1006 | glob() expand wildcards |
| 1007 | globpath() expand wildcards in a number of directories |
Bram Moolenaar | c95a302 | 2016-06-12 23:01:46 +0200 | [diff] [blame] | 1008 | glob2regpat() convert a glob pattern into a search pattern |
Bram Moolenaar | c6fe919 | 2006-04-09 21:54:49 +0000 | [diff] [blame] | 1009 | findfile() find a file in a list of directories |
| 1010 | finddir() find a directory in a list of directories |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1011 | resolve() find out where a shortcut points to |
| 1012 | fnamemodify() modify a file name |
Bram Moolenaar | c6fe919 | 2006-04-09 21:54:49 +0000 | [diff] [blame] | 1013 | pathshorten() shorten directory names in a path |
| 1014 | simplify() simplify a path without changing its meaning |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1015 | executable() check if an executable program exists |
Bram Moolenaar | 7e38ea2 | 2014-04-05 22:55:53 +0200 | [diff] [blame] | 1016 | exepath() full path of an executable program |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1017 | filereadable() check if a file can be read |
| 1018 | filewritable() check if a file can be written to |
Bram Moolenaar | c6fe919 | 2006-04-09 21:54:49 +0000 | [diff] [blame] | 1019 | getfperm() get the permissions of a file |
Bram Moolenaar | c95a302 | 2016-06-12 23:01:46 +0200 | [diff] [blame] | 1020 | setfperm() set the permissions of a file |
Bram Moolenaar | c6fe919 | 2006-04-09 21:54:49 +0000 | [diff] [blame] | 1021 | getftype() get the kind of a file |
LemonBoy | dca1d40 | 2022-04-28 15:26:33 +0100 | [diff] [blame] | 1022 | isabsolutepath() check if a path is absolute |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1023 | isdirectory() check if a directory exists |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1024 | getfsize() get the size of a file |
Bram Moolenaar | c6fe919 | 2006-04-09 21:54:49 +0000 | [diff] [blame] | 1025 | getcwd() get the current working directory |
Bram Moolenaar | 00aa069 | 2019-04-27 20:37:57 +0200 | [diff] [blame] | 1026 | haslocaldir() check if current window used |:lcd| or |:tcd| |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1027 | tempname() get the name of a temporary file |
Bram Moolenaar | c6fe919 | 2006-04-09 21:54:49 +0000 | [diff] [blame] | 1028 | mkdir() create a new directory |
Bram Moolenaar | 1063f3d | 2019-05-07 22:06:52 +0200 | [diff] [blame] | 1029 | chdir() change current working directory |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1030 | delete() delete a file |
| 1031 | rename() rename a file |
Bram Moolenaar | 7e38ea2 | 2014-04-05 22:55:53 +0200 | [diff] [blame] | 1032 | system() get the result of a shell command as a string |
| 1033 | systemlist() get the result of a shell command as a list |
Bram Moolenaar | 691ddee | 2019-05-09 14:52:41 +0200 | [diff] [blame] | 1034 | environ() get all environment variables |
| 1035 | getenv() get one environment variable |
| 1036 | setenv() set an environment variable |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1037 | hostname() name of the system |
Bram Moolenaar | 3a7c85b | 2005-02-05 21:39:53 +0000 | [diff] [blame] | 1038 | readfile() read a file into a List of lines |
Bram Moolenaar | c423ad7 | 2021-01-13 20:38:03 +0100 | [diff] [blame] | 1039 | readblob() read a file into a Blob |
Bram Moolenaar | 62e1bb4 | 2019-04-08 16:25:07 +0200 | [diff] [blame] | 1040 | readdir() get a List of file names in a directory |
Bram Moolenaar | 6c9ba04 | 2020-06-01 16:09:41 +0200 | [diff] [blame] | 1041 | readdirex() get a List of file information in a directory |
Bram Moolenaar | 314dd79 | 2019-02-03 15:27:20 +0100 | [diff] [blame] | 1042 | writefile() write a List of lines or Blob into a file |
Shougo Matsushita | 60c8743 | 2024-06-03 22:59:27 +0200 | [diff] [blame] | 1043 | filecopy() copy a file {from} to {to} |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1044 | |
Bram Moolenaar | a3f4166 | 2010-07-11 19:01:06 +0200 | [diff] [blame] | 1045 | Date and Time: *date-functions* *time-functions* |
Bram Moolenaar | c6fe919 | 2006-04-09 21:54:49 +0000 | [diff] [blame] | 1046 | getftime() get last modification time of a file |
| 1047 | localtime() get current time in seconds |
| 1048 | strftime() convert time to a string |
Bram Moolenaar | 10455d4 | 2019-11-21 15:36:18 +0100 | [diff] [blame] | 1049 | strptime() convert a date/time string to time |
Bram Moolenaar | c6fe919 | 2006-04-09 21:54:49 +0000 | [diff] [blame] | 1050 | reltime() get the current or elapsed time accurately |
| 1051 | reltimestr() convert reltime() result to a string |
Bram Moolenaar | 03413f4 | 2016-04-12 21:07:15 +0200 | [diff] [blame] | 1052 | reltimefloat() convert reltime() result to a Float |
Bram Moolenaar | c6fe919 | 2006-04-09 21:54:49 +0000 | [diff] [blame] | 1053 | |
Yegappan Lakshmanan | 1755a91 | 2022-05-19 10:31:47 +0100 | [diff] [blame] | 1054 | Autocmds: *autocmd-functions* |
| 1055 | autocmd_add() add a list of autocmds and groups |
| 1056 | autocmd_delete() delete a list of autocmds and groups |
| 1057 | autocmd_get() return a list of autocmds |
| 1058 | |
Bram Moolenaar | a3f4166 | 2010-07-11 19:01:06 +0200 | [diff] [blame] | 1059 | *buffer-functions* *window-functions* *arg-functions* |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1060 | Buffers, windows and the argument list: |
| 1061 | argc() number of entries in the argument list |
| 1062 | argidx() current position in the argument list |
Bram Moolenaar | 2d1fe05 | 2014-05-28 18:22:57 +0200 | [diff] [blame] | 1063 | arglistid() get id of the argument list |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1064 | argv() get one entry from the argument list |
Bram Moolenaar | 931a277 | 2019-07-04 16:54:54 +0200 | [diff] [blame] | 1065 | bufadd() add a file to the list of buffers |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1066 | bufexists() check if a buffer exists |
| 1067 | buflisted() check if a buffer exists and is listed |
Bram Moolenaar | 931a277 | 2019-07-04 16:54:54 +0200 | [diff] [blame] | 1068 | bufload() ensure a buffer is loaded |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1069 | bufloaded() check if a buffer exists and is loaded |
| 1070 | bufname() get the name of a specific buffer |
| 1071 | bufnr() get the buffer number of a specific buffer |
Bram Moolenaar | c6fe919 | 2006-04-09 21:54:49 +0000 | [diff] [blame] | 1072 | tabpagebuflist() return List of buffers in a tab page |
| 1073 | tabpagenr() get the number of a tab page |
| 1074 | tabpagewinnr() like winnr() for a specified tab page |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1075 | winnr() get the window number for the current window |
Bram Moolenaar | 82af871 | 2016-06-04 20:20:29 +0200 | [diff] [blame] | 1076 | bufwinid() get the window ID of a specific buffer |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1077 | bufwinnr() get the window number of a specific buffer |
| 1078 | winbufnr() get the buffer number of a specific window |
Bram Moolenaar | a334772 | 2019-05-11 21:14:24 +0200 | [diff] [blame] | 1079 | listener_add() add a callback to listen to changes |
Bram Moolenaar | 68e6560 | 2019-05-26 21:33:31 +0200 | [diff] [blame] | 1080 | listener_flush() invoke listener callbacks |
Bram Moolenaar | a334772 | 2019-05-11 21:14:24 +0200 | [diff] [blame] | 1081 | listener_remove() remove a listener callback |
Bram Moolenaar | c95a302 | 2016-06-12 23:01:46 +0200 | [diff] [blame] | 1082 | win_findbuf() find windows containing a buffer |
| 1083 | win_getid() get window ID of a window |
Bram Moolenaar | ebacddb | 2020-06-04 15:22:21 +0200 | [diff] [blame] | 1084 | win_gettype() get type of window |
Bram Moolenaar | c95a302 | 2016-06-12 23:01:46 +0200 | [diff] [blame] | 1085 | win_gotoid() go to window with ID |
| 1086 | win_id2tabwin() get tab and window nr from window ID |
| 1087 | win_id2win() get window nr from window ID |
Daniel Steinberg | ee63031 | 2022-01-10 13:36:34 +0000 | [diff] [blame] | 1088 | win_move_separator() move window vertical separator |
| 1089 | win_move_statusline() move window status line |
Bram Moolenaar | ebacddb | 2020-06-04 15:22:21 +0200 | [diff] [blame] | 1090 | win_splitmove() move window to a split of another window |
Bram Moolenaar | b5ae48e | 2016-08-12 22:23:25 +0200 | [diff] [blame] | 1091 | getbufinfo() get a list with buffer information |
| 1092 | gettabinfo() get a list with tab page information |
| 1093 | getwininfo() get a list with window information |
Bram Moolenaar | 07ad816 | 2018-02-13 13:59:59 +0100 | [diff] [blame] | 1094 | getchangelist() get a list of change list entries |
Bram Moolenaar | 4f50588 | 2018-02-10 21:06:32 +0100 | [diff] [blame] | 1095 | getjumplist() get a list of jump list entries |
Bram Moolenaar | c216a7a | 2022-12-05 13:50:55 +0000 | [diff] [blame] | 1096 | swapfilelist() list of existing swap files in 'directory' |
Bram Moolenaar | fc65cab | 2018-08-28 22:58:02 +0200 | [diff] [blame] | 1097 | swapinfo() information about a swap file |
Bram Moolenaar | b730f0c | 2018-11-25 03:56:26 +0100 | [diff] [blame] | 1098 | swapname() get the swap file path of a buffer |
Bram Moolenaar | c6fe919 | 2006-04-09 21:54:49 +0000 | [diff] [blame] | 1099 | |
Bram Moolenaar | a3f4166 | 2010-07-11 19:01:06 +0200 | [diff] [blame] | 1100 | Command line: *command-line-functions* |
Ruslan Russkikh | 0407d62 | 2024-10-08 22:21:05 +0200 | [diff] [blame] | 1101 | getcmdcomplpat() get completion pattern of the current command |
| 1102 | line |
Hirohito Higashi | 96b3ef2 | 2025-07-05 15:31:23 +0200 | [diff] [blame] | 1103 | getcmdcompltype() get the type of the current command line |
| 1104 | completion |
Shougo Matsushita | 6908428 | 2024-09-23 20:34:47 +0200 | [diff] [blame] | 1105 | getcmdline() get the current command line input |
| 1106 | getcmdprompt() get the current command line prompt |
Bram Moolenaar | c6fe919 | 2006-04-09 21:54:49 +0000 | [diff] [blame] | 1107 | getcmdpos() get position of the cursor in the command line |
Shougo Matsushita | 79d599b | 2022-05-07 12:48:29 +0100 | [diff] [blame] | 1108 | getcmdscreenpos() get screen position of the cursor in the |
| 1109 | command line |
Shougo Matsushita | 07ea5f1 | 2022-08-27 12:22:25 +0100 | [diff] [blame] | 1110 | setcmdline() set the current command line |
Bram Moolenaar | c6fe919 | 2006-04-09 21:54:49 +0000 | [diff] [blame] | 1111 | setcmdpos() set position of the cursor in the command line |
| 1112 | getcmdtype() return the current command-line type |
Bram Moolenaar | fb53927 | 2014-08-22 19:21:47 +0200 | [diff] [blame] | 1113 | getcmdwintype() return the current command-line window type |
Bram Moolenaar | 6f1d9a0 | 2016-07-24 14:12:38 +0200 | [diff] [blame] | 1114 | getcompletion() list of command-line completion matches |
Hirohito Higashi | 96b3ef2 | 2025-07-05 15:31:23 +0200 | [diff] [blame] | 1115 | getcompletiontype() get the type of the command-line completion |
| 1116 | for specified string |
Bram Moolenaar | 038e09e | 2021-02-06 12:38:51 +0100 | [diff] [blame] | 1117 | fullcommand() get full command name |
Hirohito Higashi | 31b78cc | 2025-04-21 19:39:15 +0200 | [diff] [blame] | 1118 | cmdcomplete_info() get command-line completion information |
Bram Moolenaar | c6fe919 | 2006-04-09 21:54:49 +0000 | [diff] [blame] | 1119 | |
Bram Moolenaar | a3f4166 | 2010-07-11 19:01:06 +0200 | [diff] [blame] | 1120 | Quickfix and location lists: *quickfix-functions* |
Bram Moolenaar | c6fe919 | 2006-04-09 21:54:49 +0000 | [diff] [blame] | 1121 | getqflist() list of quickfix errors |
| 1122 | setqflist() modify a quickfix list |
| 1123 | getloclist() list of location list items |
| 1124 | setloclist() modify a location list |
| 1125 | |
Bram Moolenaar | a3f4166 | 2010-07-11 19:01:06 +0200 | [diff] [blame] | 1126 | Insert mode completion: *completion-functions* |
Bram Moolenaar | c6fe919 | 2006-04-09 21:54:49 +0000 | [diff] [blame] | 1127 | complete() set found matches |
| 1128 | complete_add() add to found matches |
| 1129 | complete_check() check if completion should be aborted |
Bram Moolenaar | fd13332 | 2019-03-29 12:20:27 +0100 | [diff] [blame] | 1130 | complete_info() get current completion information |
glepnir | bcd5995 | 2025-04-24 21:48:35 +0200 | [diff] [blame] | 1131 | complete_match() get insert completion start match col and |
| 1132 | trigger text |
Bram Moolenaar | c6fe919 | 2006-04-09 21:54:49 +0000 | [diff] [blame] | 1133 | pumvisible() check if the popup menu is displayed |
Bram Moolenaar | 5be4cee | 2019-09-27 19:34:08 +0200 | [diff] [blame] | 1134 | pum_getpos() position and size of popup menu if visible |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1135 | |
Bram Moolenaar | a3f4166 | 2010-07-11 19:01:06 +0200 | [diff] [blame] | 1136 | Folding: *folding-functions* |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1137 | foldclosed() check for a closed fold at a specific line |
| 1138 | foldclosedend() like foldclosed() but return the last line |
| 1139 | foldlevel() check for the fold level at a specific line |
| 1140 | foldtext() generate the line displayed for a closed fold |
Bram Moolenaar | c6fe919 | 2006-04-09 21:54:49 +0000 | [diff] [blame] | 1141 | foldtextresult() get the text displayed for a closed fold |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1142 | |
Bram Moolenaar | a3f4166 | 2010-07-11 19:01:06 +0200 | [diff] [blame] | 1143 | Syntax and highlighting: *syntax-functions* *highlighting-functions* |
Bram Moolenaar | 6ee1016 | 2007-07-26 20:58:42 +0000 | [diff] [blame] | 1144 | clearmatches() clear all matches defined by |matchadd()| and |
| 1145 | the |:match| commands |
| 1146 | getmatches() get all matches defined by |matchadd()| and |
| 1147 | the |:match| commands |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1148 | hlexists() check if a highlight group exists |
Yegappan Lakshmanan | d1a8d65 | 2021-11-03 21:56:45 +0000 | [diff] [blame] | 1149 | hlget() get highlight group attributes |
| 1150 | hlset() set highlight group attributes |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1151 | hlID() get ID of a highlight group |
| 1152 | synID() get syntax ID at a specific position |
| 1153 | synIDattr() get a specific attribute of a syntax ID |
| 1154 | synIDtrans() get translated syntax ID |
Bram Moolenaar | 166af9b | 2010-11-16 20:34:40 +0100 | [diff] [blame] | 1155 | synstack() get list of syntax IDs at a specific position |
Christian Brabandt | 00ae5c5 | 2024-04-26 18:56:21 +0200 | [diff] [blame] | 1156 | synconcealed() get info about (syntax) concealing |
Bram Moolenaar | c6fe919 | 2006-04-09 21:54:49 +0000 | [diff] [blame] | 1157 | diff_hlID() get highlight ID for diff mode at a position |
Bram Moolenaar | 6ee1016 | 2007-07-26 20:58:42 +0000 | [diff] [blame] | 1158 | matchadd() define a pattern to highlight (a "match") |
Bram Moolenaar | b341459 | 2014-06-17 17:48:32 +0200 | [diff] [blame] | 1159 | matchaddpos() define a list of positions to highlight |
Bram Moolenaar | c6fe919 | 2006-04-09 21:54:49 +0000 | [diff] [blame] | 1160 | matcharg() get info about |:match| arguments |
Bram Moolenaar | 6ee1016 | 2007-07-26 20:58:42 +0000 | [diff] [blame] | 1161 | matchdelete() delete a match defined by |matchadd()| or a |
| 1162 | |:match| command |
| 1163 | setmatches() restore a list of matches saved by |
| 1164 | |getmatches()| |
Bram Moolenaar | c6fe919 | 2006-04-09 21:54:49 +0000 | [diff] [blame] | 1165 | |
Bram Moolenaar | a3f4166 | 2010-07-11 19:01:06 +0200 | [diff] [blame] | 1166 | Spelling: *spell-functions* |
Bram Moolenaar | c6fe919 | 2006-04-09 21:54:49 +0000 | [diff] [blame] | 1167 | spellbadword() locate badly spelled word at or after cursor |
| 1168 | spellsuggest() return suggested spelling corrections |
| 1169 | soundfold() return the sound-a-like equivalent of a word |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1170 | |
Bram Moolenaar | a3f4166 | 2010-07-11 19:01:06 +0200 | [diff] [blame] | 1171 | History: *history-functions* |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1172 | histadd() add an item to a history |
| 1173 | histdel() delete an item from a history |
| 1174 | histget() get an item from a history |
| 1175 | histnr() get highest index of a history list |
| 1176 | |
Bram Moolenaar | a3f4166 | 2010-07-11 19:01:06 +0200 | [diff] [blame] | 1177 | Interactive: *interactive-functions* |
Bram Moolenaar | c6fe919 | 2006-04-09 21:54:49 +0000 | [diff] [blame] | 1178 | browse() put up a file requester |
| 1179 | browsedir() put up a directory requester |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1180 | confirm() let the user make a choice |
| 1181 | getchar() get a character from the user |
Bram Moolenaar | f7a023e | 2021-06-07 18:50:01 +0200 | [diff] [blame] | 1182 | getcharstr() get a character from the user as a string |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1183 | getcharmod() get modifiers for the last typed character |
Bram Moolenaar | 09c6f26 | 2019-11-17 15:55:14 +0100 | [diff] [blame] | 1184 | getmousepos() get last known mouse position |
Bram Moolenaar | 24dc19c | 2022-11-14 19:49:15 +0000 | [diff] [blame] | 1185 | getmouseshape() get name of the current mouse shape |
Bram Moolenaar | ebacddb | 2020-06-04 15:22:21 +0200 | [diff] [blame] | 1186 | echoraw() output characters as-is |
Bram Moolenaar | 3577c6f | 2008-06-24 21:16:56 +0000 | [diff] [blame] | 1187 | feedkeys() put characters in the typeahead queue |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1188 | input() get a line from the user |
Bram Moolenaar | c6fe919 | 2006-04-09 21:54:49 +0000 | [diff] [blame] | 1189 | inputlist() let the user pick an entry from a list |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1190 | inputsecret() get a line from the user without showing it |
| 1191 | inputdialog() get a line from the user in a dialog |
Bram Moolenaar | 68b76a6 | 2005-03-25 21:53:48 +0000 | [diff] [blame] | 1192 | inputsave() save and clear typeahead |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1193 | inputrestore() restore typeahead |
| 1194 | |
Bram Moolenaar | a3f4166 | 2010-07-11 19:01:06 +0200 | [diff] [blame] | 1195 | GUI: *gui-functions* |
Bram Moolenaar | c6fe919 | 2006-04-09 21:54:49 +0000 | [diff] [blame] | 1196 | getfontname() get name of current font being used |
Bram Moolenaar | b5b7562 | 2018-03-09 22:22:21 +0100 | [diff] [blame] | 1197 | getwinpos() position of the Vim window |
| 1198 | getwinposx() X position of the Vim window |
| 1199 | getwinposy() Y position of the Vim window |
Bram Moolenaar | 214641f | 2017-03-05 17:04:09 +0100 | [diff] [blame] | 1200 | balloon_show() set the balloon content |
Bram Moolenaar | a2a8016 | 2017-11-21 23:09:50 +0100 | [diff] [blame] | 1201 | balloon_split() split a message for a balloon |
Bram Moolenaar | 691ddee | 2019-05-09 14:52:41 +0200 | [diff] [blame] | 1202 | balloon_gettext() get the text in the balloon |
Bram Moolenaar | c6fe919 | 2006-04-09 21:54:49 +0000 | [diff] [blame] | 1203 | |
Bram Moolenaar | a3f4166 | 2010-07-11 19:01:06 +0200 | [diff] [blame] | 1204 | Vim server: *server-functions* |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1205 | serverlist() return the list of server names |
Bram Moolenaar | 01164a6 | 2017-11-02 22:58:42 +0100 | [diff] [blame] | 1206 | remote_startserver() run a server |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1207 | remote_send() send command characters to a Vim server |
| 1208 | remote_expr() evaluate an expression in a Vim server |
| 1209 | server2client() send a reply to a client of a Vim server |
| 1210 | remote_peek() check if there is a reply from a Vim server |
| 1211 | remote_read() read a reply from a Vim server |
| 1212 | foreground() move the Vim window to the foreground |
| 1213 | remote_foreground() move the Vim server window to the foreground |
| 1214 | |
Bram Moolenaar | a3f4166 | 2010-07-11 19:01:06 +0200 | [diff] [blame] | 1215 | Window size and position: *window-size-functions* |
Bram Moolenaar | c6fe919 | 2006-04-09 21:54:49 +0000 | [diff] [blame] | 1216 | winheight() get height of a specific window |
| 1217 | winwidth() get width of a specific window |
Bram Moolenaar | f0b03c4 | 2017-12-17 17:17:07 +0100 | [diff] [blame] | 1218 | win_screenpos() get screen position of a window |
Bram Moolenaar | b730f0c | 2018-11-25 03:56:26 +0100 | [diff] [blame] | 1219 | winlayout() get layout of windows in a tab page |
Bram Moolenaar | c6fe919 | 2006-04-09 21:54:49 +0000 | [diff] [blame] | 1220 | winrestcmd() return command to restore window sizes |
| 1221 | winsaveview() get view of current window |
| 1222 | winrestview() restore saved view of current window |
| 1223 | |
Bram Moolenaar | 0eabd4d | 2020-03-15 16:13:53 +0100 | [diff] [blame] | 1224 | Mappings and Menus: *mapping-functions* |
h-east | 29b8571 | 2021-07-26 21:54:04 +0200 | [diff] [blame] | 1225 | digraph_get() get |digraph| |
| 1226 | digraph_getlist() get all |digraph|s |
| 1227 | digraph_set() register |digraph| |
| 1228 | digraph_setlist() register multiple |digraph|s |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1229 | hasmapto() check if a mapping exists |
| 1230 | mapcheck() check if a matching mapping exists |
| 1231 | maparg() get rhs of a mapping |
Ernie Rael | 0966120 | 2022-04-25 14:40:44 +0100 | [diff] [blame] | 1232 | maplist() get list of all mappings |
Bram Moolenaar | ebacddb | 2020-06-04 15:22:21 +0200 | [diff] [blame] | 1233 | mapset() restore a mapping |
Bram Moolenaar | 0eabd4d | 2020-03-15 16:13:53 +0100 | [diff] [blame] | 1234 | menu_info() get information about a menu item |
Bram Moolenaar | 26402cb | 2013-02-20 21:26:00 +0100 | [diff] [blame] | 1235 | wildmenumode() check if the wildmode is active |
| 1236 | |
Bram Moolenaar | 683fa18 | 2015-11-30 21:38:24 +0100 | [diff] [blame] | 1237 | Testing: *test-functions* |
Bram Moolenaar | e18c0b3 | 2016-03-20 21:08:34 +0100 | [diff] [blame] | 1238 | assert_equal() assert that two expressions values are equal |
Bram Moolenaar | b730f0c | 2018-11-25 03:56:26 +0100 | [diff] [blame] | 1239 | assert_equalfile() assert that two file contents are equal |
Bram Moolenaar | 03413f4 | 2016-04-12 21:07:15 +0200 | [diff] [blame] | 1240 | assert_notequal() assert that two expressions values are not equal |
Bram Moolenaar | 6f1d9a0 | 2016-07-24 14:12:38 +0200 | [diff] [blame] | 1241 | assert_inrange() assert that an expression is inside a range |
Bram Moolenaar | 7db8f6f | 2016-03-29 23:12:46 +0200 | [diff] [blame] | 1242 | assert_match() assert that a pattern matches the value |
Bram Moolenaar | 03413f4 | 2016-04-12 21:07:15 +0200 | [diff] [blame] | 1243 | assert_notmatch() assert that a pattern does not match the value |
Bram Moolenaar | 683fa18 | 2015-11-30 21:38:24 +0100 | [diff] [blame] | 1244 | assert_false() assert that an expression is false |
| 1245 | assert_true() assert that an expression is true |
Bram Moolenaar | e18c0b3 | 2016-03-20 21:08:34 +0100 | [diff] [blame] | 1246 | assert_exception() assert that a command throws an exception |
Bram Moolenaar | 22f1d0e | 2018-02-27 14:53:30 +0100 | [diff] [blame] | 1247 | assert_beeps() assert that a command beeps |
Bram Moolenaar | 0df6030 | 2021-04-03 15:15:47 +0200 | [diff] [blame] | 1248 | assert_nobeep() assert that a command does not cause a beep |
Bram Moolenaar | 22f1d0e | 2018-02-27 14:53:30 +0100 | [diff] [blame] | 1249 | assert_fails() assert that a command fails |
Bram Moolenaar | 3c2881d | 2017-03-21 19:18:29 +0100 | [diff] [blame] | 1250 | assert_report() report a test failure |
Bram Moolenaar | c95a302 | 2016-06-12 23:01:46 +0200 | [diff] [blame] | 1251 | test_alloc_fail() make memory allocation fail |
Bram Moolenaar | 6f1d9a0 | 2016-07-24 14:12:38 +0200 | [diff] [blame] | 1252 | test_autochdir() enable 'autochdir' during startup |
Bram Moolenaar | 036986f | 2017-03-16 17:41:02 +0100 | [diff] [blame] | 1253 | test_override() test with Vim internal overrides |
| 1254 | test_garbagecollect_now() free memory right now |
Bram Moolenaar | ebacddb | 2020-06-04 15:22:21 +0200 | [diff] [blame] | 1255 | test_garbagecollect_soon() set a flag to free memory soon |
Bram Moolenaar | 68e6560 | 2019-05-26 21:33:31 +0200 | [diff] [blame] | 1256 | test_getvalue() get value of an internal variable |
Yegappan Lakshmanan | 06011e1 | 2022-01-30 12:37:29 +0000 | [diff] [blame] | 1257 | test_gui_event() generate a GUI event for testing |
Bram Moolenaar | 214641f | 2017-03-05 17:04:09 +0100 | [diff] [blame] | 1258 | test_ignore_error() ignore a specific error message |
Christopher Plewright | 20b795e | 2022-12-20 20:01:58 +0000 | [diff] [blame] | 1259 | test_mswin_event() generate an MS-Windows event |
Bram Moolenaar | 314dd79 | 2019-02-03 15:27:20 +0100 | [diff] [blame] | 1260 | test_null_blob() return a null Blob |
Bram Moolenaar | c95a302 | 2016-06-12 23:01:46 +0200 | [diff] [blame] | 1261 | test_null_channel() return a null Channel |
| 1262 | test_null_dict() return a null Dict |
Bram Moolenaar | ebacddb | 2020-06-04 15:22:21 +0200 | [diff] [blame] | 1263 | test_null_function() return a null Funcref |
Bram Moolenaar | c95a302 | 2016-06-12 23:01:46 +0200 | [diff] [blame] | 1264 | test_null_job() return a null Job |
| 1265 | test_null_list() return a null List |
| 1266 | test_null_partial() return a null Partial function |
| 1267 | test_null_string() return a null String |
Yegappan Lakshmanan | 9cb865e | 2025-03-23 16:42:16 +0100 | [diff] [blame] | 1268 | test_null_tuple() return a null Tuple |
Bram Moolenaar | 214641f | 2017-03-05 17:04:09 +0100 | [diff] [blame] | 1269 | test_settime() set the time Vim uses internally |
Bram Moolenaar | bb8476b | 2019-05-04 15:47:48 +0200 | [diff] [blame] | 1270 | test_setmouse() set the mouse position |
Bram Moolenaar | b730f0c | 2018-11-25 03:56:26 +0100 | [diff] [blame] | 1271 | test_feedinput() add key sequence to input buffer |
| 1272 | test_option_not_set() reset flag indicating option was set |
Bram Moolenaar | ebacddb | 2020-06-04 15:22:21 +0200 | [diff] [blame] | 1273 | test_refcount() return an expression's reference count |
| 1274 | test_srand_seed() set the seed value for srand() |
| 1275 | test_unknown() return a value with unknown type |
| 1276 | test_void() return a value with void type |
Bram Moolenaar | 683fa18 | 2015-11-30 21:38:24 +0100 | [diff] [blame] | 1277 | |
Bram Moolenaar | c95a302 | 2016-06-12 23:01:46 +0200 | [diff] [blame] | 1278 | Inter-process communication: *channel-functions* |
Bram Moolenaar | 5162822 | 2016-12-01 23:03:28 +0100 | [diff] [blame] | 1279 | ch_canread() check if there is something to read |
Bram Moolenaar | 681baaf | 2016-02-04 20:57:07 +0100 | [diff] [blame] | 1280 | ch_open() open a channel |
| 1281 | ch_close() close a channel |
Bram Moolenaar | 64d8e25 | 2016-09-06 22:12:34 +0200 | [diff] [blame] | 1282 | ch_close_in() close the in part of a channel |
Bram Moolenaar | c95a302 | 2016-06-12 23:01:46 +0200 | [diff] [blame] | 1283 | ch_read() read a message from a channel |
Bram Moolenaar | d09091d | 2019-01-17 16:07:22 +0100 | [diff] [blame] | 1284 | ch_readblob() read a Blob from a channel |
Bram Moolenaar | c95a302 | 2016-06-12 23:01:46 +0200 | [diff] [blame] | 1285 | ch_readraw() read a raw message from a channel |
Bram Moolenaar | 681baaf | 2016-02-04 20:57:07 +0100 | [diff] [blame] | 1286 | ch_sendexpr() send a JSON message over a channel |
| 1287 | ch_sendraw() send a raw message over a channel |
Bram Moolenaar | ebacddb | 2020-06-04 15:22:21 +0200 | [diff] [blame] | 1288 | ch_evalexpr() evaluate an expression over channel |
| 1289 | ch_evalraw() evaluate a raw string over channel |
Bram Moolenaar | c95a302 | 2016-06-12 23:01:46 +0200 | [diff] [blame] | 1290 | ch_status() get status of a channel |
| 1291 | ch_getbufnr() get the buffer number of a channel |
| 1292 | ch_getjob() get the job associated with a channel |
| 1293 | ch_info() get channel information |
| 1294 | ch_log() write a message in the channel log file |
| 1295 | ch_logfile() set the channel log file |
| 1296 | ch_setoptions() set the options for a channel |
Bram Moolenaar | a02a551 | 2016-06-17 12:48:11 +0200 | [diff] [blame] | 1297 | json_encode() encode an expression to a JSON string |
| 1298 | json_decode() decode a JSON string to Vim types |
Bram Moolenaar | c95a302 | 2016-06-12 23:01:46 +0200 | [diff] [blame] | 1299 | js_encode() encode an expression to a JSON string |
| 1300 | js_decode() decode a JSON string to Vim types |
Yegappan Lakshmanan | 810785c | 2024-12-30 10:29:44 +0100 | [diff] [blame] | 1301 | base64_encode() encode a blob into a base64 string |
| 1302 | base64_decode() decode a base64 string into a blob |
Bram Moolenaar | 416bd91 | 2023-07-07 23:19:18 +0100 | [diff] [blame] | 1303 | err_teapot() give error 418 or 503 |
Bram Moolenaar | c95a302 | 2016-06-12 23:01:46 +0200 | [diff] [blame] | 1304 | |
Bram Moolenaar | ebacddb | 2020-06-04 15:22:21 +0200 | [diff] [blame] | 1305 | Jobs: *job-functions* |
Bram Moolenaar | c95a302 | 2016-06-12 23:01:46 +0200 | [diff] [blame] | 1306 | job_start() start a job |
| 1307 | job_stop() stop a job |
| 1308 | job_status() get the status of a job |
| 1309 | job_getchannel() get the channel used by a job |
| 1310 | job_info() get information about a job |
| 1311 | job_setoptions() set options for a job |
| 1312 | |
Bram Moolenaar | 162b714 | 2018-12-21 15:17:36 +0100 | [diff] [blame] | 1313 | Signs: *sign-functions* |
| 1314 | sign_define() define or update a sign |
| 1315 | sign_getdefined() get a list of defined signs |
| 1316 | sign_getplaced() get a list of placed signs |
Bram Moolenaar | 6b7b719 | 2019-01-11 13:42:41 +0100 | [diff] [blame] | 1317 | sign_jump() jump to a sign |
Bram Moolenaar | 162b714 | 2018-12-21 15:17:36 +0100 | [diff] [blame] | 1318 | sign_place() place a sign |
Bram Moolenaar | 809ce4d | 2019-07-13 21:21:40 +0200 | [diff] [blame] | 1319 | sign_placelist() place a list of signs |
Bram Moolenaar | 162b714 | 2018-12-21 15:17:36 +0100 | [diff] [blame] | 1320 | sign_undefine() undefine a sign |
| 1321 | sign_unplace() unplace a sign |
Bram Moolenaar | 809ce4d | 2019-07-13 21:21:40 +0200 | [diff] [blame] | 1322 | sign_unplacelist() unplace a list of signs |
Bram Moolenaar | 162b714 | 2018-12-21 15:17:36 +0100 | [diff] [blame] | 1323 | |
Bram Moolenaar | c572da5 | 2017-08-27 16:52:01 +0200 | [diff] [blame] | 1324 | Terminal window: *terminal-functions* |
| 1325 | term_start() open a terminal window and run a job |
| 1326 | term_list() get the list of terminal buffers |
| 1327 | term_sendkeys() send keystrokes to a terminal |
| 1328 | term_wait() wait for screen to be updated |
| 1329 | term_getjob() get the job associated with a terminal |
| 1330 | term_scrape() get row of a terminal screen |
| 1331 | term_getline() get a line of text from a terminal |
| 1332 | term_getattr() get the value of attribute {what} |
| 1333 | term_getcursor() get the cursor position of a terminal |
| 1334 | term_getscrolled() get the scroll count of a terminal |
| 1335 | term_getaltscreen() get the alternate screen flag |
| 1336 | term_getsize() get the size of a terminal |
| 1337 | term_getstatus() get the status of a terminal |
| 1338 | term_gettitle() get the title of a terminal |
| 1339 | term_gettty() get the tty name of a terminal |
Bram Moolenaar | 7dda86f | 2018-04-20 22:36:41 +0200 | [diff] [blame] | 1340 | term_setansicolors() set 16 ANSI colors, used for GUI |
| 1341 | term_getansicolors() get 16 ANSI colors, used for GUI |
Bram Moolenaar | b730f0c | 2018-11-25 03:56:26 +0100 | [diff] [blame] | 1342 | term_dumpdiff() display difference between two screen dumps |
| 1343 | term_dumpload() load a terminal screen dump in a window |
| 1344 | term_dumpwrite() dump contents of a terminal screen to a file |
| 1345 | term_setkill() set signal to stop job in a terminal |
| 1346 | term_setrestore() set command to restore a terminal |
| 1347 | term_setsize() set the size of a terminal |
Bram Moolenaar | ebacddb | 2020-06-04 15:22:21 +0200 | [diff] [blame] | 1348 | term_setapi() set terminal JSON API function name prefix |
Bram Moolenaar | c572da5 | 2017-08-27 16:52:01 +0200 | [diff] [blame] | 1349 | |
Bram Moolenaar | 931a277 | 2019-07-04 16:54:54 +0200 | [diff] [blame] | 1350 | Popup window: *popup-window-functions* |
| 1351 | popup_create() create popup centered in the screen |
| 1352 | popup_atcursor() create popup just above the cursor position, |
| 1353 | closes when the cursor moves away |
Bram Moolenaar | b3d17a2 | 2019-07-07 18:28:14 +0200 | [diff] [blame] | 1354 | popup_beval() at the position indicated by v:beval_ |
| 1355 | variables, closes when the mouse moves away |
Bram Moolenaar | 931a277 | 2019-07-04 16:54:54 +0200 | [diff] [blame] | 1356 | popup_notification() show a notification for three seconds |
| 1357 | popup_dialog() create popup centered with padding and border |
| 1358 | popup_menu() prompt for selecting an item from a list |
| 1359 | popup_hide() hide a popup temporarily |
| 1360 | popup_show() show a previously hidden popup |
| 1361 | popup_move() change the position and size of a popup |
| 1362 | popup_setoptions() override options of a popup |
| 1363 | popup_settext() replace the popup buffer contents |
Christian Brabandt | fbc37f1 | 2024-06-18 20:50:58 +0200 | [diff] [blame] | 1364 | popup_setbuf() set the popup buffer |
Bram Moolenaar | 931a277 | 2019-07-04 16:54:54 +0200 | [diff] [blame] | 1365 | popup_close() close one popup |
| 1366 | popup_clear() close all popups |
| 1367 | popup_filter_menu() select from a list of items |
Bram Moolenaar | ebacddb | 2020-06-04 15:22:21 +0200 | [diff] [blame] | 1368 | popup_filter_yesno() block until 'y' or 'n' is pressed |
Bram Moolenaar | 931a277 | 2019-07-04 16:54:54 +0200 | [diff] [blame] | 1369 | popup_getoptions() get current options for a popup |
| 1370 | popup_getpos() get actual position and size of a popup |
Bram Moolenaar | bdc09a1 | 2022-10-07 14:31:45 +0100 | [diff] [blame] | 1371 | popup_findecho() get window ID for popup used for `:echowindow` |
Bram Moolenaar | ebacddb | 2020-06-04 15:22:21 +0200 | [diff] [blame] | 1372 | popup_findinfo() get window ID for popup info window |
| 1373 | popup_findpreview() get window ID for popup preview window |
| 1374 | popup_list() get list of all popup window IDs |
| 1375 | popup_locate() get popup window ID from its screen position |
Bram Moolenaar | 931a277 | 2019-07-04 16:54:54 +0200 | [diff] [blame] | 1376 | |
Bram Moolenaar | c95a302 | 2016-06-12 23:01:46 +0200 | [diff] [blame] | 1377 | Timers: *timer-functions* |
| 1378 | timer_start() create a timer |
Bram Moolenaar | b5ae48e | 2016-08-12 22:23:25 +0200 | [diff] [blame] | 1379 | timer_pause() pause or unpause a timer |
Bram Moolenaar | c95a302 | 2016-06-12 23:01:46 +0200 | [diff] [blame] | 1380 | timer_stop() stop a timer |
Bram Moolenaar | b5ae48e | 2016-08-12 22:23:25 +0200 | [diff] [blame] | 1381 | timer_stopall() stop all timers |
| 1382 | timer_info() get information about timers |
Bram Moolenaar | 298b440 | 2016-01-28 22:38:53 +0100 | [diff] [blame] | 1383 | |
Bram Moolenaar | b730f0c | 2018-11-25 03:56:26 +0100 | [diff] [blame] | 1384 | Tags: *tag-functions* |
| 1385 | taglist() get list of matching tags |
| 1386 | tagfiles() get a list of tags files |
| 1387 | gettagstack() get the tag stack of a window |
| 1388 | settagstack() modify the tag stack of a window |
| 1389 | |
| 1390 | Prompt Buffer: *promptbuffer-functions* |
Bram Moolenaar | 077cc7a | 2020-09-04 16:35:35 +0200 | [diff] [blame] | 1391 | prompt_getprompt() get the effective prompt text for a buffer |
Bram Moolenaar | b730f0c | 2018-11-25 03:56:26 +0100 | [diff] [blame] | 1392 | prompt_setcallback() set prompt callback for a buffer |
| 1393 | prompt_setinterrupt() set interrupt callback for a buffer |
| 1394 | prompt_setprompt() set the prompt text for a buffer |
| 1395 | |
Yegappan Lakshmanan | f768c3d | 2022-08-22 13:15:13 +0100 | [diff] [blame] | 1396 | Registers: *register-functions* |
| 1397 | getreg() get contents of a register |
| 1398 | getreginfo() get information about a register |
| 1399 | getregtype() get type of a register |
| 1400 | setreg() set contents and type of a register |
| 1401 | reg_executing() return the name of the register being executed |
| 1402 | reg_recording() return the name of the register being recorded |
| 1403 | |
Bram Moolenaar | ebacddb | 2020-06-04 15:22:21 +0200 | [diff] [blame] | 1404 | Text Properties: *text-property-functions* |
| 1405 | prop_add() attach a property at a position |
Yegappan Lakshmanan | ccfb7c6 | 2021-08-16 21:39:09 +0200 | [diff] [blame] | 1406 | prop_add_list() attach a property at multiple positions |
Bram Moolenaar | ebacddb | 2020-06-04 15:22:21 +0200 | [diff] [blame] | 1407 | prop_clear() remove all properties from a line or lines |
| 1408 | prop_find() search for a property |
| 1409 | prop_list() return a list of all properties in a line |
| 1410 | prop_remove() remove a property from a line |
| 1411 | prop_type_add() add/define a property type |
| 1412 | prop_type_change() change properties of a type |
| 1413 | prop_type_delete() remove a text property type |
| 1414 | prop_type_get() return the properties of a type |
| 1415 | prop_type_list() return a list of all property types |
| 1416 | |
| 1417 | Sound: *sound-functions* |
| 1418 | sound_clear() stop playing all sounds |
| 1419 | sound_playevent() play an event's sound |
| 1420 | sound_playfile() play a sound file |
| 1421 | sound_stop() stop playing a sound |
| 1422 | |
Bram Moolenaar | 26402cb | 2013-02-20 21:26:00 +0100 | [diff] [blame] | 1423 | Various: *various-functions* |
| 1424 | mode() get current editing mode |
Bram Moolenaar | ebacddb | 2020-06-04 15:22:21 +0200 | [diff] [blame] | 1425 | state() get current busy state |
Bram Moolenaar | 26402cb | 2013-02-20 21:26:00 +0100 | [diff] [blame] | 1426 | visualmode() last visual mode used |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1427 | exists() check if a variable, function, etc. exists |
Bram Moolenaar | 2673599 | 2021-08-08 14:43:22 +0200 | [diff] [blame] | 1428 | exists_compiled() like exists() but check at compile time |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1429 | has() check if a feature is supported in Vim |
Bram Moolenaar | c6fe919 | 2006-04-09 21:54:49 +0000 | [diff] [blame] | 1430 | changenr() return number of most recent change |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1431 | cscope_connection() check if a cscope connection exists |
| 1432 | did_filetype() check if a FileType autocommand was used |
Yegappan Lakshmanan | fa37835 | 2024-02-01 22:05:27 +0100 | [diff] [blame] | 1433 | diff() diff two Lists of strings |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1434 | eventhandler() check if invoked by an event handler |
mikoto2000 | 1083cae | 2024-11-11 21:24:14 +0100 | [diff] [blame] | 1435 | getcellpixels() get List of cell pixel size |
Bram Moolenaar | 3577c6f | 2008-06-24 21:16:56 +0000 | [diff] [blame] | 1436 | getpid() get process ID of Vim |
ichizok | 663d18d | 2025-01-02 18:06:00 +0100 | [diff] [blame] | 1437 | getscriptinfo() get list of sourced Vim scripts |
| 1438 | getstacktrace() get current stack trace of Vim scripts |
Bram Moolenaar | ebacddb | 2020-06-04 15:22:21 +0200 | [diff] [blame] | 1439 | getimstatus() check if IME status is active |
| 1440 | interrupt() interrupt script execution |
| 1441 | windowsversion() get MS-Windows version |
Bram Moolenaar | 0c0eddd | 2020-06-13 15:47:25 +0200 | [diff] [blame] | 1442 | terminalprops() properties of the terminal |
Bram Moolenaar | c6fe919 | 2006-04-09 21:54:49 +0000 | [diff] [blame] | 1443 | |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1444 | libcall() call a function in an external library |
| 1445 | libcallnr() idem, returning a number |
Bram Moolenaar | c6fe919 | 2006-04-09 21:54:49 +0000 | [diff] [blame] | 1446 | |
Bram Moolenaar | 8d04317 | 2014-01-23 14:24:41 +0100 | [diff] [blame] | 1447 | undofile() get the name of the undo file |
Devin J. Pohly | 5fee111 | 2023-04-23 20:26:59 -0500 | [diff] [blame] | 1448 | undotree() return the state of the undo tree for a buffer |
Bram Moolenaar | 8d04317 | 2014-01-23 14:24:41 +0100 | [diff] [blame] | 1449 | |
Bram Moolenaar | 8d04317 | 2014-01-23 14:24:41 +0100 | [diff] [blame] | 1450 | shiftwidth() effective value of 'shiftwidth' |
| 1451 | |
Bram Moolenaar | 063b9d1 | 2016-07-09 20:21:48 +0200 | [diff] [blame] | 1452 | wordcount() get byte/word/char count of buffer |
| 1453 | |
Ernie Rael | c8e158b | 2024-07-09 18:39:52 +0200 | [diff] [blame] | 1454 | id() get unique string for item to use as a key |
| 1455 | |
Bram Moolenaar | ebacddb | 2020-06-04 15:22:21 +0200 | [diff] [blame] | 1456 | luaeval() evaluate |Lua| expression |
Bram Moolenaar | 7e506b6 | 2010-01-19 15:55:06 +0100 | [diff] [blame] | 1457 | mzeval() evaluate |MzScheme| expression |
Bram Moolenaar | e9b892e | 2016-01-17 21:15:58 +0100 | [diff] [blame] | 1458 | perleval() evaluate Perl expression (|+perl|) |
Bram Moolenaar | 8d04317 | 2014-01-23 14:24:41 +0100 | [diff] [blame] | 1459 | py3eval() evaluate Python expression (|+python3|) |
| 1460 | pyeval() evaluate Python expression (|+python|) |
Bram Moolenaar | 690afe1 | 2017-01-28 18:34:47 +0100 | [diff] [blame] | 1461 | pyxeval() evaluate |python_x| expression |
Bram Moolenaar | ebacddb | 2020-06-04 15:22:21 +0200 | [diff] [blame] | 1462 | rubyeval() evaluate |Ruby| expression |
| 1463 | |
Bram Moolenaar | 9d87a37 | 2018-12-18 21:41:50 +0100 | [diff] [blame] | 1464 | debugbreak() interrupt a program being debugged |
Bram Moolenaar | 7e506b6 | 2010-01-19 15:55:06 +0100 | [diff] [blame] | 1465 | |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1466 | ============================================================================== |
| 1467 | *41.7* Defining a function |
| 1468 | |
| 1469 | Vim enables you to define your own functions. The basic function declaration |
| 1470 | begins as follows: > |
| 1471 | |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 1472 | def {name}({var1}, {var2}, ...): return-type |
| 1473 | {body} |
| 1474 | enddef |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1475 | < |
| 1476 | Note: |
| 1477 | Function names must begin with a capital letter. |
| 1478 | |
| 1479 | Let's define a short function to return the smaller of two numbers. It starts |
| 1480 | with this line: > |
| 1481 | |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 1482 | def Min(num1: number, num2: number): number |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1483 | |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 1484 | This tells Vim that the function is named "Min", it takes two arguments that |
| 1485 | are numbers: "num1" and "num2" and returns a number. |
| 1486 | |
| 1487 | The first thing you need to do is to check to see which number is smaller: |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1488 | > |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 1489 | if num1 < num2 |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1490 | |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1491 | Let's assign the variable "smaller" the value of the smallest number: > |
| 1492 | |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 1493 | var smaller: number |
| 1494 | if num1 < num2 |
| 1495 | smaller = num1 |
| 1496 | else |
| 1497 | smaller = num2 |
| 1498 | endif |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1499 | |
Bram Moolenaar | 63f3260 | 2022-06-09 20:45:54 +0100 | [diff] [blame] | 1500 | The variable "smaller" is a local variable. It is declared to be a number, |
| 1501 | that way Vim can warn you for any mistakes. Variables used inside a function |
| 1502 | are local unless prefixed by something like "g:", "w:", or "b:". |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1503 | |
| 1504 | Note: |
| 1505 | To access a global variable from inside a function you must prepend |
Bram Moolenaar | 3577c6f | 2008-06-24 21:16:56 +0000 | [diff] [blame] | 1506 | "g:" to it. Thus "g:today" inside a function is used for the global |
| 1507 | variable "today", and "today" is another variable, local to the |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 1508 | function or the script. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1509 | |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 1510 | You now use the `return` statement to return the smallest number to the user. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1511 | Finally, you end the function: > |
| 1512 | |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 1513 | return smaller |
| 1514 | enddef |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1515 | |
| 1516 | The complete function definition is as follows: > |
| 1517 | |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 1518 | def Min(num1: number, num2: number): number |
| 1519 | var smaller: number |
| 1520 | if num1 < num2 |
| 1521 | smaller = num1 |
| 1522 | else |
| 1523 | smaller = num2 |
| 1524 | endif |
| 1525 | return smaller |
| 1526 | enddef |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1527 | |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 1528 | Obviously this is a verbose example. You can make it shorter by using two |
| 1529 | return commands: > |
Bram Moolenaar | 7c62692 | 2005-02-07 22:01:03 +0000 | [diff] [blame] | 1530 | |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 1531 | def Min(num1: number, num2: number): number |
| 1532 | if num1 < num2 |
| 1533 | return num1 |
| 1534 | endif |
| 1535 | return num2 |
| 1536 | enddef |
| 1537 | |
| 1538 | And if you remember the conditional expression, you need only one line: > |
| 1539 | |
| 1540 | def Min(num1: number, num2: number): number |
| 1541 | return num1 < num2 ? num1 : num2 |
| 1542 | enddef |
Bram Moolenaar | 7c62692 | 2005-02-07 22:01:03 +0000 | [diff] [blame] | 1543 | |
Bram Moolenaar | d1f56e6 | 2006-02-22 21:25:37 +0000 | [diff] [blame] | 1544 | A user defined function is called in exactly the same way as a built-in |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1545 | function. Only the name is different. The Min function can be used like |
| 1546 | this: > |
| 1547 | |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 1548 | echo Min(5, 8) |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1549 | |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 1550 | Only now will the function be executed and the lines be parsed by Vim. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1551 | If there are mistakes, like using an undefined variable or function, you will |
| 1552 | now get an error message. When defining the function these errors are not |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 1553 | detected. To get the errors sooner you can tell Vim to compile all the |
| 1554 | functions in the script: > |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1555 | |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 1556 | defcompile |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1557 | |
Bram Moolenaar | cfa8f9a | 2022-06-03 21:59:47 +0100 | [diff] [blame] | 1558 | Compiling functions takes a little time, but does report errors early. You |
| 1559 | could use `:defcompile` at the end of your script while working on it, and |
| 1560 | comment it out when everything is fine. |
| 1561 | |
| 1562 | For a function that does not return anything simply leave out the return type: > |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1563 | |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 1564 | def SayIt(text: string) |
| 1565 | echo text |
| 1566 | enddef |
| 1567 | |
Bram Moolenaar | 63f3260 | 2022-06-09 20:45:54 +0100 | [diff] [blame] | 1568 | If you want to return any kind of value, you can use the "any" return type: > |
| 1569 | def GetValue(): any |
| 1570 | This disables type checking for the return value, use only when needed. |
| 1571 | |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 1572 | It is also possible to define a legacy function with `function` and |
Bram Moolenaar | cfa8f9a | 2022-06-03 21:59:47 +0100 | [diff] [blame] | 1573 | `endfunction`. These do not have types and are not compiled. Therefore they |
| 1574 | execute much slower. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1575 | |
| 1576 | |
| 1577 | USING A RANGE |
| 1578 | |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 1579 | A line range can be used with a function call. The function will be called |
| 1580 | once for every line in the range, with the cursor in that line. Example: > |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1581 | |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 1582 | def Number() |
| 1583 | echo "line " .. line(".") .. " contains: " .. getline(".") |
| 1584 | enddef |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1585 | |
| 1586 | If you call this function with: > |
| 1587 | |
Bram Moolenaar | 63f3260 | 2022-06-09 20:45:54 +0100 | [diff] [blame] | 1588 | :10,15Number() |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1589 | |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 1590 | The function will be called six times, starting on line 10 and ending on line |
| 1591 | 15. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1592 | |
| 1593 | |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1594 | LISTING FUNCTIONS |
| 1595 | |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 1596 | The `function` command lists the names and arguments of all user-defined |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1597 | functions: > |
| 1598 | |
| 1599 | :function |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 1600 | < def <SNR>86_Show(start: string, ...items: list<string>) ~ |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1601 | function GetVimIndent() ~ |
| 1602 | function SetSyn(name) ~ |
| 1603 | |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 1604 | The "<SNR>" prefix means that a function is script-local. |Vim9| functions |
Bram Moolenaar | 6ba83ba | 2022-06-12 22:15:57 +0100 | [diff] [blame] | 1605 | will start with "def" and include argument and return types. Legacy functions |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 1606 | are listed with "function". |
| 1607 | |
| 1608 | To see what a function does, use its name as an argument for `function`: > |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1609 | |
| 1610 | :function SetSyn |
| 1611 | < 1 if &syntax == '' ~ |
| 1612 | 2 let &syntax = a:name ~ |
| 1613 | 3 endif ~ |
| 1614 | endfunction ~ |
| 1615 | |
Bram Moolenaar | cfa8f9a | 2022-06-03 21:59:47 +0100 | [diff] [blame] | 1616 | To see the "Show" function you need to include the script prefix, since |
| 1617 | multiple "Show" functions can be defined in different scripts. To find |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 1618 | the exact name you can use `function`, but the result may be a very long list. |
| 1619 | To only get the functions matching a pattern you can use the `filter` prefix: |
| 1620 | > |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 1621 | :filter Show function |
| 1622 | < def <SNR>86_Show(start: string, ...items: list<string>) ~ |
| 1623 | > |
| 1624 | :function <SNR>86_Show |
| 1625 | < 1 echohl Title ~ |
| 1626 | 2 echo "start is " .. start ~ |
| 1627 | etc. |
| 1628 | |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1629 | |
| 1630 | DEBUGGING |
| 1631 | |
| 1632 | The line number is useful for when you get an error message or when debugging. |
| 1633 | See |debug-scripts| about debugging mode. |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 1634 | |
| 1635 | You can also set the 'verbose' option to 12 or higher to see all function |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1636 | calls. Set it to 15 or higher to see every executed line. |
| 1637 | |
| 1638 | |
| 1639 | DELETING A FUNCTION |
| 1640 | |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 1641 | To delete the SetSyn() function: > |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1642 | |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 1643 | :delfunction SetSyn |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1644 | |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 1645 | Deleting only works for global functions and functions in legacy script, not |
| 1646 | for functions defined in a |Vim9| script. |
| 1647 | |
| 1648 | You get an error when the function doesn't exist or cannot be deleted. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1649 | |
Bram Moolenaar | 7c62692 | 2005-02-07 22:01:03 +0000 | [diff] [blame] | 1650 | |
| 1651 | FUNCTION REFERENCES |
| 1652 | |
| 1653 | Sometimes it can be useful to have a variable point to one function or |
Bram Moolenaar | cfa8f9a | 2022-06-03 21:59:47 +0100 | [diff] [blame] | 1654 | another. You can do it with a function reference variable. Often shortened |
| 1655 | to "funcref". Example: > |
Bram Moolenaar | 7c62692 | 2005-02-07 22:01:03 +0000 | [diff] [blame] | 1656 | |
Bram Moolenaar | cfa8f9a | 2022-06-03 21:59:47 +0100 | [diff] [blame] | 1657 | def Right(): string |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 1658 | return 'Right!' |
| 1659 | enddef |
Bram Moolenaar | cfa8f9a | 2022-06-03 21:59:47 +0100 | [diff] [blame] | 1660 | def Wrong(): string |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 1661 | return 'Wrong!' |
| 1662 | enddef |
Bram Moolenaar | 8a3b805 | 2022-06-26 12:21:15 +0100 | [diff] [blame] | 1663 | |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 1664 | var Afunc = g:result == 1 ? Right : Wrong |
Bram Moolenaar | cfa8f9a | 2022-06-03 21:59:47 +0100 | [diff] [blame] | 1665 | echo Afunc() |
Bram Moolenaar | 7c62692 | 2005-02-07 22:01:03 +0000 | [diff] [blame] | 1666 | < Wrong! ~ |
| 1667 | |
Bram Moolenaar | cfa8f9a | 2022-06-03 21:59:47 +0100 | [diff] [blame] | 1668 | This assumes "g:result" is not one. See |Funcref| for details. |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 1669 | |
Bram Moolenaar | 7c62692 | 2005-02-07 22:01:03 +0000 | [diff] [blame] | 1670 | Note that the name of a variable that holds a function reference must start |
| 1671 | with a capital. Otherwise it could be confused with the name of a builtin |
| 1672 | function. |
Bram Moolenaar | 7c62692 | 2005-02-07 22:01:03 +0000 | [diff] [blame] | 1673 | |
Bram Moolenaar | 63f3260 | 2022-06-09 20:45:54 +0100 | [diff] [blame] | 1674 | |
| 1675 | FURTHER READING |
| 1676 | |
| 1677 | Using a variable number of arguments is introduced in section |50.2|. |
| 1678 | |
Yegappan Lakshmanan | 5dfe467 | 2021-09-14 17:54:30 +0200 | [diff] [blame] | 1679 | More information about defining your own functions here: |user-functions|. |
| 1680 | |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1681 | ============================================================================== |
Bram Moolenaar | 7c62692 | 2005-02-07 22:01:03 +0000 | [diff] [blame] | 1682 | *41.8* Lists and Dictionaries |
| 1683 | |
Yegappan Lakshmanan | 9cb865e | 2025-03-23 16:42:16 +0100 | [diff] [blame] | 1684 | So far we have used the basic types String and Number. Vim also supports |
| 1685 | three composite types: List, Tuple and Dictionary. |
Bram Moolenaar | 7c62692 | 2005-02-07 22:01:03 +0000 | [diff] [blame] | 1686 | |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 1687 | A List is an ordered sequence of items. The items can be any kind of value, |
Bram Moolenaar | 7c62692 | 2005-02-07 22:01:03 +0000 | [diff] [blame] | 1688 | thus you can make a List of numbers, a List of Lists and even a List of mixed |
| 1689 | items. To create a List with three strings: > |
| 1690 | |
Bram Moolenaar | cfa8f9a | 2022-06-03 21:59:47 +0100 | [diff] [blame] | 1691 | var alist = ['aap', 'noot', 'mies'] |
Bram Moolenaar | 7c62692 | 2005-02-07 22:01:03 +0000 | [diff] [blame] | 1692 | |
| 1693 | The List items are enclosed in square brackets and separated by commas. To |
| 1694 | create an empty List: > |
| 1695 | |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 1696 | var alist = [] |
Bram Moolenaar | 7c62692 | 2005-02-07 22:01:03 +0000 | [diff] [blame] | 1697 | |
| 1698 | You can add items to a List with the add() function: > |
| 1699 | |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 1700 | var alist = [] |
| 1701 | add(alist, 'foo') |
| 1702 | add(alist, 'bar') |
| 1703 | echo alist |
Bram Moolenaar | 7c62692 | 2005-02-07 22:01:03 +0000 | [diff] [blame] | 1704 | < ['foo', 'bar'] ~ |
| 1705 | |
| 1706 | List concatenation is done with +: > |
| 1707 | |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 1708 | var alist = ['foo', 'bar'] |
| 1709 | alist = alist + ['and', 'more'] |
| 1710 | echo alist |
| 1711 | < ['foo', 'bar', 'and', 'more'] ~ |
Bram Moolenaar | 7c62692 | 2005-02-07 22:01:03 +0000 | [diff] [blame] | 1712 | |
Bram Moolenaar | cfa8f9a | 2022-06-03 21:59:47 +0100 | [diff] [blame] | 1713 | Or, if you want to extend a List with a function, use `extend()`: > |
Bram Moolenaar | 7c62692 | 2005-02-07 22:01:03 +0000 | [diff] [blame] | 1714 | |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 1715 | var alist = ['one'] |
| 1716 | extend(alist, ['two', 'three']) |
| 1717 | echo alist |
Bram Moolenaar | 7c62692 | 2005-02-07 22:01:03 +0000 | [diff] [blame] | 1718 | < ['one', 'two', 'three'] ~ |
| 1719 | |
Bram Moolenaar | cfa8f9a | 2022-06-03 21:59:47 +0100 | [diff] [blame] | 1720 | Notice that using `add()` will have a different effect than `extend()`: > |
Bram Moolenaar | 7c62692 | 2005-02-07 22:01:03 +0000 | [diff] [blame] | 1721 | |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 1722 | var alist = ['one'] |
| 1723 | add(alist, ['two', 'three']) |
| 1724 | echo alist |
Bram Moolenaar | 7c62692 | 2005-02-07 22:01:03 +0000 | [diff] [blame] | 1725 | < ['one', ['two', 'three']] ~ |
| 1726 | |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 1727 | The second argument of add() is added as an item, now you have a nested list. |
Bram Moolenaar | 7c62692 | 2005-02-07 22:01:03 +0000 | [diff] [blame] | 1728 | |
| 1729 | |
| 1730 | FOR LOOP |
| 1731 | |
| 1732 | One of the nice things you can do with a List is iterate over it: > |
| 1733 | |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 1734 | var alist = ['one', 'two', 'three'] |
| 1735 | for n in alist |
| 1736 | echo n |
| 1737 | endfor |
Bram Moolenaar | 7c62692 | 2005-02-07 22:01:03 +0000 | [diff] [blame] | 1738 | < one ~ |
| 1739 | two ~ |
| 1740 | three ~ |
| 1741 | |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 1742 | This will loop over each element in List "alist", assigning each value to |
Bram Moolenaar | 7c62692 | 2005-02-07 22:01:03 +0000 | [diff] [blame] | 1743 | variable "n". The generic form of a for loop is: > |
| 1744 | |
Bram Moolenaar | cfa8f9a | 2022-06-03 21:59:47 +0100 | [diff] [blame] | 1745 | for {varname} in {list-expression} |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 1746 | {commands} |
| 1747 | endfor |
Bram Moolenaar | 7c62692 | 2005-02-07 22:01:03 +0000 | [diff] [blame] | 1748 | |
| 1749 | To loop a certain number of times you need a List of a specific length. The |
| 1750 | range() function creates one for you: > |
| 1751 | |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 1752 | for a in range(3) |
| 1753 | echo a |
| 1754 | endfor |
Bram Moolenaar | 7c62692 | 2005-02-07 22:01:03 +0000 | [diff] [blame] | 1755 | < 0 ~ |
| 1756 | 1 ~ |
| 1757 | 2 ~ |
| 1758 | |
| 1759 | Notice that the first item of the List that range() produces is zero, thus the |
Bram Moolenaar | cfa8f9a | 2022-06-03 21:59:47 +0100 | [diff] [blame] | 1760 | last item is one less than the length of the list. Detail: Internally range() |
| 1761 | does not actually create the list, so that a large range used in a for loop |
| 1762 | works efficiently. When used elsewhere, the range is turned into an actual |
Bram Moolenaar | 6ba83ba | 2022-06-12 22:15:57 +0100 | [diff] [blame] | 1763 | list, which takes more time for a long list. |
Bram Moolenaar | 7c62692 | 2005-02-07 22:01:03 +0000 | [diff] [blame] | 1764 | |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 1765 | You can also specify the maximum value, the stride and even go backwards: > |
| 1766 | |
| 1767 | for a in range(8, 4, -2) |
| 1768 | echo a |
| 1769 | endfor |
Bram Moolenaar | 7c62692 | 2005-02-07 22:01:03 +0000 | [diff] [blame] | 1770 | < 8 ~ |
| 1771 | 6 ~ |
| 1772 | 4 ~ |
| 1773 | |
Bram Moolenaar | cfa8f9a | 2022-06-03 21:59:47 +0100 | [diff] [blame] | 1774 | A more useful example, looping over all the lines in the buffer: > |
Bram Moolenaar | 7c62692 | 2005-02-07 22:01:03 +0000 | [diff] [blame] | 1775 | |
Bram Moolenaar | cfa8f9a | 2022-06-03 21:59:47 +0100 | [diff] [blame] | 1776 | for line in getline(1, 50) |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 1777 | if line =~ "Date: " |
| 1778 | echo line |
| 1779 | endif |
| 1780 | endfor |
Bram Moolenaar | 7c62692 | 2005-02-07 22:01:03 +0000 | [diff] [blame] | 1781 | |
Bram Moolenaar | cfa8f9a | 2022-06-03 21:59:47 +0100 | [diff] [blame] | 1782 | This looks into lines 1 to 50 (inclusive) and echoes any date found in there. |
| 1783 | |
| 1784 | For further reading see |Lists|. |
Bram Moolenaar | 7c62692 | 2005-02-07 22:01:03 +0000 | [diff] [blame] | 1785 | |
Yegappan Lakshmanan | 9cb865e | 2025-03-23 16:42:16 +0100 | [diff] [blame] | 1786 | TUPLE |
| 1787 | |
| 1788 | A Tuple is an immutable ordered sequence of items. An item can be of any |
| 1789 | type. Items can be accessed by their index number. To create a Tuple with |
| 1790 | three strings: > |
| 1791 | |
| 1792 | var atuple = ('one', 'two', 'three') |
| 1793 | |
| 1794 | The Tuple items are enclosed in parenthesis and separated by commas. To |
| 1795 | create an empty Tuple: > |
| 1796 | |
| 1797 | var atuple = () |
| 1798 | |
| 1799 | The |:for| loop can be used to iterate over the items in a Tuple similar to a |
| 1800 | List. |
| 1801 | |
| 1802 | For further reading see |Tuples|. |
Bram Moolenaar | 7c62692 | 2005-02-07 22:01:03 +0000 | [diff] [blame] | 1803 | |
| 1804 | DICTIONARIES |
| 1805 | |
| 1806 | A Dictionary stores key-value pairs. You can quickly lookup a value if you |
| 1807 | know the key. A Dictionary is created with curly braces: > |
Bram Moolenaar | c9b4b05 | 2006-04-30 18:54:39 +0000 | [diff] [blame] | 1808 | |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 1809 | var uk2nl = {one: 'een', two: 'twee', three: 'drie'} |
Bram Moolenaar | 7c62692 | 2005-02-07 22:01:03 +0000 | [diff] [blame] | 1810 | |
Bram Moolenaar | 4399ef4 | 2005-02-12 14:29:27 +0000 | [diff] [blame] | 1811 | Now you can lookup words by putting the key in square brackets: > |
Bram Moolenaar | 7c62692 | 2005-02-07 22:01:03 +0000 | [diff] [blame] | 1812 | |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 1813 | echo uk2nl['two'] |
| 1814 | < twee ~ |
| 1815 | |
| 1816 | If the key does not have special characters, you can use the dot notation: > |
| 1817 | |
| 1818 | echo uk2nl.two |
Bram Moolenaar | 7c62692 | 2005-02-07 22:01:03 +0000 | [diff] [blame] | 1819 | < twee ~ |
| 1820 | |
| 1821 | The generic form for defining a Dictionary is: > |
| 1822 | |
| 1823 | {<key> : <value>, ...} |
| 1824 | |
| 1825 | An empty Dictionary is one without any keys: > |
| 1826 | |
| 1827 | {} |
| 1828 | |
| 1829 | The possibilities with Dictionaries are numerous. There are various functions |
| 1830 | for them as well. For example, you can obtain a list of the keys and loop |
| 1831 | over them: > |
| 1832 | |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 1833 | for key in keys(uk2nl) |
| 1834 | echo key |
| 1835 | endfor |
Bram Moolenaar | 7c62692 | 2005-02-07 22:01:03 +0000 | [diff] [blame] | 1836 | < three ~ |
| 1837 | one ~ |
| 1838 | two ~ |
| 1839 | |
Bram Moolenaar | 3577c6f | 2008-06-24 21:16:56 +0000 | [diff] [blame] | 1840 | You will notice the keys are not ordered. You can sort the list to get a |
Bram Moolenaar | 7c62692 | 2005-02-07 22:01:03 +0000 | [diff] [blame] | 1841 | specific order: > |
| 1842 | |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 1843 | for key in sort(keys(uk2nl)) |
| 1844 | echo key |
| 1845 | endfor |
Bram Moolenaar | 7c62692 | 2005-02-07 22:01:03 +0000 | [diff] [blame] | 1846 | < one ~ |
| 1847 | three ~ |
| 1848 | two ~ |
| 1849 | |
| 1850 | But you can never get back the order in which items are defined. For that you |
| 1851 | need to use a List, it stores items in an ordered sequence. |
| 1852 | |
Bram Moolenaar | cfa8f9a | 2022-06-03 21:59:47 +0100 | [diff] [blame] | 1853 | For further reading see |Dictionaries|. |
Bram Moolenaar | 7c62692 | 2005-02-07 22:01:03 +0000 | [diff] [blame] | 1854 | |
| 1855 | ============================================================================== |
Bram Moolenaar | 63f3260 | 2022-06-09 20:45:54 +0100 | [diff] [blame] | 1856 | *41.9* White space |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1857 | |
Bram Moolenaar | 8cc5b55 | 2022-06-23 13:04:20 +0100 | [diff] [blame] | 1858 | Blank lines are allowed in a script and ignored. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1859 | |
Bram Moolenaar | 8cc5b55 | 2022-06-23 13:04:20 +0100 | [diff] [blame] | 1860 | Leading whitespace characters (blanks and TABs) are ignored, except when using |
| 1861 | |:let-heredoc| without "trim". |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1862 | |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 1863 | Trailing whitespace is often ignored, but not always. One command that |
Bram Moolenaar | 63f3260 | 2022-06-09 20:45:54 +0100 | [diff] [blame] | 1864 | includes it is `map`. You have to watch out for that, it can cause hard to |
| 1865 | understand mistakes. A generic solution is to never use trailing white space, |
| 1866 | unless you really need it. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1867 | |
| 1868 | To include a whitespace character in the value of an option, it must be |
| 1869 | escaped by a "\" (backslash) as in the following example: > |
| 1870 | |
| 1871 | :set tags=my\ nice\ file |
| 1872 | |
Bram Moolenaar | cfa8f9a | 2022-06-03 21:59:47 +0100 | [diff] [blame] | 1873 | If it would be written as: > |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1874 | |
| 1875 | :set tags=my nice file |
| 1876 | |
Bram Moolenaar | cfa8f9a | 2022-06-03 21:59:47 +0100 | [diff] [blame] | 1877 | This will issue an error, because it is interpreted as: > |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1878 | |
| 1879 | :set tags=my |
| 1880 | :set nice |
| 1881 | :set file |
| 1882 | |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 1883 | |Vim9| script is very picky when it comes to white space. This was done |
| 1884 | intentionally to make sure scripts are easy to read and to avoid mistakes. |
Bram Moolenaar | cfa8f9a | 2022-06-03 21:59:47 +0100 | [diff] [blame] | 1885 | If you use white space sensibly it will just work. When not you will get an |
| 1886 | error message telling you where white space is missing or should be removed. |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 1887 | |
Bram Moolenaar | 63f3260 | 2022-06-09 20:45:54 +0100 | [diff] [blame] | 1888 | ============================================================================== |
| 1889 | *41.10* Line continuation |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1890 | |
Bram Moolenaar | 63f3260 | 2022-06-09 20:45:54 +0100 | [diff] [blame] | 1891 | In legacy Vim script line continuation is done by preceding a continuation |
| 1892 | line with a backslash: > |
| 1893 | let mylist = [ |
| 1894 | \ 'one', |
| 1895 | \ 'two', |
| 1896 | \ ] |
| 1897 | |
| 1898 | This requires the 'cpo' option to exclude the "C" flag. Normally this is done |
| 1899 | by putting this at the start of the script: > |
| 1900 | let s:save_cpo = &cpo |
| 1901 | set cpo&vim |
| 1902 | |
| 1903 | And restore the option at the end of the script: > |
| 1904 | let &cpo = s:save_cpo |
| 1905 | unlet s:save_cpo |
| 1906 | |
| 1907 | A few more details can be found here: |line-continuation|. |
| 1908 | |
| 1909 | In |Vim9| script the backslash can still be used, but in most places it is not |
| 1910 | needed: > |
| 1911 | var mylist = [ |
| 1912 | 'one', |
| 1913 | 'two', |
| 1914 | ] |
| 1915 | |
| 1916 | Also, the 'cpo' option does not need to be changed. See |
| 1917 | |vim9-line-continuation| for details. |
| 1918 | |
| 1919 | ============================================================================== |
| 1920 | *41.11* Comments |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1921 | |
Bram Moolenaar | cfa8f9a | 2022-06-03 21:59:47 +0100 | [diff] [blame] | 1922 | In |Vim9| script the character # starts a comment. That character and |
| 1923 | everything after it until the end-of-line is considered a comment and |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1924 | is ignored, except for commands that don't consider comments, as shown in |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 1925 | examples below. A comment can start on any character position on the line, |
Bram Moolenaar | cfa8f9a | 2022-06-03 21:59:47 +0100 | [diff] [blame] | 1926 | but not when it is part of the command, e.g. inside a string. |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 1927 | |
Bram Moolenaar | 8a3b805 | 2022-06-26 12:21:15 +0100 | [diff] [blame] | 1928 | The character " (the double quote mark) starts a comment in legacy script. |
Bram Moolenaar | cfa8f9a | 2022-06-03 21:59:47 +0100 | [diff] [blame] | 1929 | This involves some cleverness to make sure double quoted strings are not |
| 1930 | recognized as comments (just one reason to prefer |Vim9| script). |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1931 | |
| 1932 | There is a little "catch" with comments for some commands. Examples: > |
| 1933 | |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 1934 | abbrev dev development # shorthand |
| 1935 | map <F3> o#include # insert include |
| 1936 | execute cmd # do it |
| 1937 | !ls *.c # list C files |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1938 | |
Bram Moolenaar | cfa8f9a | 2022-06-03 21:59:47 +0100 | [diff] [blame] | 1939 | - The abbreviation 'dev' will be expanded to 'development # shorthand'. |
| 1940 | - The mapping of <F3> will actually be the whole line after the 'o# ....' |
| 1941 | including the '# insert include'. |
| 1942 | - The `execute` command will give an error. |
| 1943 | - The `!` command will send everything after it to the shell, most likely |
| 1944 | causing an error. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1945 | |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 1946 | There can be no comment after `map`, `abbreviate`, `execute` and `!` commands |
| 1947 | (there are a few more commands with this restriction). For the `map`, |
| 1948 | `abbreviate` and `execute` commands there is a trick: > |
| 1949 | |
| 1950 | abbrev dev development|# shorthand |
| 1951 | map <F3> o#include|# insert include |
| 1952 | execute '!ls *.c' |# do it |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1953 | |
| 1954 | With the '|' character the command is separated from the next one. And that |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 1955 | next command is only a comment. The last command, using `execute` is a |
| 1956 | general solution, it works for all commands that do not accept a comment or a |
| 1957 | '|' to separate the next command. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1958 | |
| 1959 | Notice that there is no white space before the '|' in the abbreviation and |
| 1960 | mapping. For these commands, any character until the end-of-line or '|' is |
| 1961 | included. As a consequence of this behavior, you don't always see that |
| 1962 | trailing whitespace is included: > |
| 1963 | |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 1964 | map <F4> o#include |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1965 | |
Bram Moolenaar | cfa8f9a | 2022-06-03 21:59:47 +0100 | [diff] [blame] | 1966 | Here it is intended, in other cases it might be accidental. To spot these |
| 1967 | problems, you can highlight trailing spaces: > |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 1968 | match Search /\s\+$/ |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1969 | |
Bram Moolenaar | 9e1d283 | 2007-05-06 12:51:41 +0000 | [diff] [blame] | 1970 | For Unix there is one special way to comment a line, that allows making a Vim |
Bram Moolenaar | 04fb916 | 2021-12-30 20:24:12 +0000 | [diff] [blame] | 1971 | script executable, and it also works in legacy script: > |
Bram Moolenaar | 9e1d283 | 2007-05-06 12:51:41 +0000 | [diff] [blame] | 1972 | #!/usr/bin/env vim -S |
| 1973 | echo "this is a Vim script" |
| 1974 | quit |
| 1975 | |
Bram Moolenaar | 63f3260 | 2022-06-09 20:45:54 +0100 | [diff] [blame] | 1976 | ============================================================================== |
| 1977 | *41.12* Fileformat |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1978 | |
Bram Moolenaar | 63f3260 | 2022-06-09 20:45:54 +0100 | [diff] [blame] | 1979 | The end-of-line character depends on the system. For Vim scripts it is |
Bram Moolenaar | 8cc5b55 | 2022-06-23 13:04:20 +0100 | [diff] [blame] | 1980 | recommended to always use the Unix fileformat. Lines are then separated with |
| 1981 | the Newline character. This also works on any other system. That way you can |
| 1982 | copy your Vim scripts from MS-Windows to Unix and they still work. See |
| 1983 | |:source_crnl|. To be sure it is set right, do this before writing the file: |
| 1984 | > |
Bram Moolenaar | 63f3260 | 2022-06-09 20:45:54 +0100 | [diff] [blame] | 1985 | :setlocal fileformat=unix |
Bram Moolenaar | 2d8ed02 | 2022-05-21 13:08:16 +0100 | [diff] [blame] | 1986 | |
Bram Moolenaar | 8cc5b55 | 2022-06-23 13:04:20 +0100 | [diff] [blame] | 1987 | When using "dos" fileformat, lines are separated with CR-NL, two characters. |
| 1988 | The CR character causes various problems, better avoid this. |
| 1989 | |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1990 | ============================================================================== |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1991 | |
Bram Moolenaar | 63f3260 | 2022-06-09 20:45:54 +0100 | [diff] [blame] | 1992 | Advance information about writing Vim script is in |usr_50.txt|. |
| 1993 | |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1994 | Next chapter: |usr_42.txt| Add new menus |
| 1995 | |
Bram Moolenaar | d473c8c | 2018-08-11 18:00:22 +0200 | [diff] [blame] | 1996 | Copyright: see |manual-copyright| vim:tw=78:ts=8:noet:ft=help:norl: |