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