1*usr_41.txt* For Vim version 8.1. Last change: 2019 Jan 29 2 3 VIM USER MANUAL - by Bram Moolenaar 4 5 Write a Vim script 6 7 8The Vim script language is used for the startup vimrc file, syntax files, and 9many other things. This chapter explains the items that can be used in a Vim 10script. There are a lot of them, thus this is a long chapter. 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 19|41.8| Lists and Dictionaries 20|41.9| Exceptions 21|41.10| Various remarks 22|41.11| Writing a plugin 23|41.12| Writing a filetype plugin 24|41.13| Writing a compiler plugin 25|41.14| Writing a plugin that loads quickly 26|41.15| Writing library scripts 27|41.16| Distributing Vim scripts 28 29 Next chapter: |usr_42.txt| Add new menus 30 Previous chapter: |usr_40.txt| Make new commands 31Table of contents: |usr_toc.txt| 32 33============================================================================== 34*41.1* Introduction *vim-script-intro* *script* 35 36Your first experience with Vim scripts is the vimrc file. Vim reads it when 37it starts up and executes the commands. You can set options to values you 38prefer. And you can use any colon command in it (commands that start with a 39":"; these are sometimes referred to as Ex commands or command-line commands). 40 Syntax files are also Vim scripts. As are files that set options for a 41specific file type. A complicated macro can be defined by a separate Vim 42script file. You can think of other uses yourself. 43 44Let's start with a simple example: > 45 46 :let i = 1 47 :while i < 5 48 : echo "count is" i 49 : let i += 1 50 :endwhile 51< 52 Note: 53 The ":" characters are not really needed here. You only need to use 54 them when you type a command. In a Vim script file they can be left 55 out. We will use them here anyway to make clear these are colon 56 commands and make them stand out from Normal mode commands. 57 Note: 58 You can try out the examples by yanking the lines from the text here 59 and executing them with :@" 60 61The output of the example code is: 62 63 count is 1 ~ 64 count is 2 ~ 65 count is 3 ~ 66 count is 4 ~ 67 68In the first line the ":let" command assigns a value to a variable. The 69generic form is: > 70 71 :let {variable} = {expression} 72 73In this case the variable name is "i" and the expression is a simple value, 74the number one. 75 The ":while" command starts a loop. The generic form is: > 76 77 :while {condition} 78 : {statements} 79 :endwhile 80 81The statements until the matching ":endwhile" are executed for as long as the 82condition is true. The condition used here is the expression "i < 5". This 83is true when the variable i is smaller than five. 84 Note: 85 If you happen to write a while loop that keeps on running, you can 86 interrupt it by pressing CTRL-C (CTRL-Break on MS-Windows). 87 88The ":echo" command prints its arguments. In this case the string "count is" 89and the value of the variable i. Since i is one, this will print: 90 91 count is 1 ~ 92 93Then there is the ":let i += 1" command. This does the same thing as 94":let i = i + 1". This adds one to the variable i and assigns the new value 95to the same variable. 96 97The example was given to explain the commands, but would you really want to 98make such a loop, it can be written much more compact: > 99 100 :for i in range(1, 4) 101 : echo "count is" i 102 :endfor 103 104We won't explain how |:for| and |range()| work until later. Follow the links 105if you are impatient. 106 107 108THREE KINDS OF NUMBERS 109 110Numbers can be decimal, hexadecimal or octal. A hexadecimal number starts 111with "0x" or "0X". For example "0x1f" is decimal 31. An octal number starts 112with a zero. "017" is decimal 15. Careful: don't put a zero before a decimal 113number, it will be interpreted as an octal number! 114 The ":echo" command always prints decimal numbers. Example: > 115 116 :echo 0x7f 036 117< 127 30 ~ 118 119A number is made negative with a minus sign. This also works for hexadecimal 120and octal numbers. A minus sign is also used for subtraction. Compare this 121with the previous example: > 122 123 :echo 0x7f -036 124< 97 ~ 125 126White space in an expression is ignored. However, it's recommended to use it 127for separating items, to make the expression easier to read. For example, to 128avoid the confusion with a negative number above, put a space between the 129minus sign and the following number: > 130 131 :echo 0x7f - 036 132 133============================================================================== 134*41.2* Variables 135 136A variable name consists of ASCII letters, digits and the underscore. It 137cannot start with a digit. Valid variable names are: 138 139 counter 140 _aap3 141 very_long_variable_name_with_underscores 142 FuncLength 143 LENGTH 144 145Invalid names are "foo+bar" and "6var". 146 These variables are global. To see a list of currently defined variables 147use this command: > 148 149 :let 150 151You can use global variables everywhere. This also means that when the 152variable "count" is used in one script file, it might also be used in another 153file. This leads to confusion at least, and real problems at worst. To avoid 154this, you can use a variable local to a script file by prepending "s:". For 155example, one script contains this code: > 156 157 :let s:count = 1 158 :while s:count < 5 159 : source other.vim 160 : let s:count += 1 161 :endwhile 162 163Since "s:count" is local to this script, you can be sure that sourcing the 164"other.vim" script will not change this variable. If "other.vim" also uses an 165"s:count" variable, it will be a different copy, local to that script. More 166about script-local variables here: |script-variable|. 167 168There are more kinds of variables, see |internal-variables|. The most often 169used ones are: 170 171 b:name variable local to a buffer 172 w:name variable local to a window 173 g:name global variable (also in a function) 174 v:name variable predefined by Vim 175 176 177DELETING VARIABLES 178 179Variables take up memory and show up in the output of the ":let" command. To 180delete a variable use the ":unlet" command. Example: > 181 182 :unlet s:count 183 184This deletes the script-local variable "s:count" to free up the memory it 185uses. If you are not sure if the variable exists, and don't want an error 186message when it doesn't, append !: > 187 188 :unlet! s:count 189 190When a script finishes, the local variables used there will not be 191automatically freed. The next time the script executes, it can still use the 192old value. Example: > 193 194 :if !exists("s:call_count") 195 : let s:call_count = 0 196 :endif 197 :let s:call_count = s:call_count + 1 198 :echo "called" s:call_count "times" 199 200The "exists()" function checks if a variable has already been defined. Its 201argument is the name of the variable you want to check. Not the variable 202itself! If you would do this: > 203 204 :if !exists(s:call_count) 205 206Then the value of s:call_count will be used as the name of the variable that 207exists() checks. That's not what you want. 208 The exclamation mark ! negates a value. When the value was true, it 209becomes false. When it was false, it becomes true. You can read it as "not". 210Thus "if !exists()" can be read as "if not exists()". 211 What Vim calls true is anything that is not zero. Zero is false. 212 Note: 213 Vim automatically converts a string to a number when it is looking for 214 a number. When using a string that doesn't start with a digit the 215 resulting number is zero. Thus look out for this: > 216 :if "true" 217< The "true" will be interpreted as a zero, thus as false! 218 219 220STRING VARIABLES AND CONSTANTS 221 222So far only numbers were used for the variable value. Strings can be used as 223well. Numbers and strings are the basic types of variables that Vim supports. 224The type is dynamic, it is set each time when assigning a value to the 225variable with ":let". More about types in |41.8|. 226 To assign a string value to a variable, you need to use a string constant. 227There are two types of these. First the string in double quotes: > 228 229 :let name = "peter" 230 :echo name 231< peter ~ 232 233If you want to include a double quote inside the string, put a backslash in 234front of it: > 235 236 :let name = "\"peter\"" 237 :echo name 238< "peter" ~ 239 240To avoid the need for a backslash, you can use a string in single quotes: > 241 242 :let name = '"peter"' 243 :echo name 244< "peter" ~ 245 246Inside a single-quote string all the characters are as they are. Only the 247single quote itself is special: you need to use two to get one. A backslash 248is taken literally, thus you can't use it to change the meaning of the 249character after it. 250 In double-quote strings it is possible to use special characters. Here are 251a few useful ones: 252 253 \t <Tab> 254 \n <NL>, line break 255 \r <CR>, <Enter> 256 \e <Esc> 257 \b <BS>, backspace 258 \" " 259 \\ \, backslash 260 \<Esc> <Esc> 261 \<C-W> CTRL-W 262 263The last two are just examples. The "\<name>" form can be used to include 264the special key "name". 265 See |expr-quote| for the full list of special items in a string. 266 267============================================================================== 268*41.3* Expressions 269 270Vim has a rich, yet simple way to handle expressions. You can read the 271definition here: |expression-syntax|. Here we will show the most common 272items. 273 The numbers, strings and variables mentioned above are expressions by 274themselves. Thus everywhere an expression is expected, you can use a number, 275string or variable. Other basic items in an expression are: 276 277 $NAME environment variable 278 &name option 279 @r register 280 281Examples: > 282 283 :echo "The value of 'tabstop' is" &ts 284 :echo "Your home directory is" $HOME 285 :if @a > 5 286 287The &name form can be used to save an option value, set it to a new value, 288do something and restore the old value. Example: > 289 290 :let save_ic = &ic 291 :set noic 292 :/The Start/,$delete 293 :let &ic = save_ic 294 295This makes sure the "The Start" pattern is used with the 'ignorecase' option 296off. Still, it keeps the value that the user had set. (Another way to do 297this would be to add "\C" to the pattern, see |/\C|.) 298 299 300MATHEMATICS 301 302It becomes more interesting if we combine these basic items. Let's start with 303mathematics on numbers: 304 305 a + b add 306 a - b subtract 307 a * b multiply 308 a / b divide 309 a % b modulo 310 311The usual precedence is used. Example: > 312 313 :echo 10 + 5 * 2 314< 20 ~ 315 316Grouping is done with parentheses. No surprises here. Example: > 317 318 :echo (10 + 5) * 2 319< 30 ~ 320 321Strings can be concatenated with ".". Example: > 322 323 :echo "foo" . "bar" 324< foobar ~ 325 326When the ":echo" command gets multiple arguments, it separates them with a 327space. In the example the argument is a single expression, thus no space is 328inserted. 329 330Borrowed from the C language is the conditional expression: 331 332 a ? b : c 333 334If "a" evaluates to true "b" is used, otherwise "c" is used. Example: > 335 336 :let i = 4 337 :echo i > 5 ? "i is big" : "i is small" 338< i is small ~ 339 340The three parts of the constructs are always evaluated first, thus you could 341see it work as: 342 343 (a) ? (b) : (c) 344 345============================================================================== 346*41.4* Conditionals 347 348The ":if" commands executes the following statements, until the matching 349":endif", only when a condition is met. The generic form is: 350 351 :if {condition} 352 {statements} 353 :endif 354 355Only when the expression {condition} evaluates to true (non-zero) will the 356{statements} be executed. These must still be valid commands. If they 357contain garbage, Vim won't be able to find the ":endif". 358 You can also use ":else". The generic form for this is: 359 360 :if {condition} 361 {statements} 362 :else 363 {statements} 364 :endif 365 366The second {statements} is only executed if the first one isn't. 367 Finally, there is ":elseif": 368 369 :if {condition} 370 {statements} 371 :elseif {condition} 372 {statements} 373 :endif 374 375This works just like using ":else" and then "if", but without the need for an 376extra ":endif". 377 A useful example for your vimrc file is checking the 'term' option and 378doing something depending upon its value: > 379 380 :if &term == "xterm" 381 : " Do stuff for xterm 382 :elseif &term == "vt100" 383 : " Do stuff for a vt100 terminal 384 :else 385 : " Do something for other terminals 386 :endif 387 388 389LOGIC OPERATIONS 390 391We already used some of them in the examples. These are the most often used 392ones: 393 394 a == b equal to 395 a != b not equal to 396 a > b greater than 397 a >= b greater than or equal to 398 a < b less than 399 a <= b less than or equal to 400 401The result is one if the condition is met and zero otherwise. An example: > 402 403 :if v:version >= 700 404 : echo "congratulations" 405 :else 406 : echo "you are using an old version, upgrade!" 407 :endif 408 409Here "v:version" is a variable defined by Vim, which has the value of the Vim 410version. 600 is for version 6.0. Version 6.1 has the value 601. This is 411very useful to write a script that works with multiple versions of Vim. 412|v:version| 413 414The logic operators work both for numbers and strings. When comparing two 415strings, the mathematical difference is used. This compares byte values, 416which may not be right for some languages. 417 When comparing a string with a number, the string is first converted to a 418number. This is a bit tricky, because when a string doesn't look like a 419number, the number zero is used. Example: > 420 421 :if 0 == "one" 422 : echo "yes" 423 :endif 424 425This will echo "yes", because "one" doesn't look like a number, thus it is 426converted to the number zero. 427 428For strings there are two more items: 429 430 a =~ b matches with 431 a !~ b does not match with 432 433The left item "a" is used as a string. The right item "b" is used as a 434pattern, like what's used for searching. Example: > 435 436 :if str =~ " " 437 : echo "str contains a space" 438 :endif 439 :if str !~ '\.$' 440 : echo "str does not end in a full stop" 441 :endif 442 443Notice the use of a single-quote string for the pattern. This is useful, 444because backslashes would need to be doubled in a double-quote string and 445patterns tend to contain many backslashes. 446 447The 'ignorecase' option is used when comparing strings. When you don't want 448that, append "#" to match case and "?" to ignore case. Thus "==?" compares 449two strings to be equal while ignoring case. And "!~#" checks if a pattern 450doesn't match, also checking the case of letters. For the full table see 451|expr-==|. 452 453 454MORE LOOPING 455 456The ":while" command was already mentioned. Two more statements can be used 457in between the ":while" and the ":endwhile": 458 459 :continue Jump back to the start of the while loop; the 460 loop continues. 461 :break Jump forward to the ":endwhile"; the loop is 462 discontinued. 463 464Example: > 465 466 :while counter < 40 467 : call do_something() 468 : if skip_flag 469 : continue 470 : endif 471 : if finished_flag 472 : break 473 : endif 474 : sleep 50m 475 :endwhile 476 477The ":sleep" command makes Vim take a nap. The "50m" specifies fifty 478milliseconds. Another example is ":sleep 4", which sleeps for four seconds. 479 480Even more looping can be done with the ":for" command, see below in |41.8|. 481 482============================================================================== 483*41.5* Executing an expression 484 485So far the commands in the script were executed by Vim directly. The 486":execute" command allows executing the result of an expression. This is a 487very powerful way to build commands and execute them. 488 An example is to jump to a tag, which is contained in a variable: > 489 490 :execute "tag " . tag_name 491 492The "." is used to concatenate the string "tag " with the value of variable 493"tag_name". Suppose "tag_name" has the value "get_cmd", then the command that 494will be executed is: > 495 496 :tag get_cmd 497 498The ":execute" command can only execute colon commands. The ":normal" command 499executes Normal mode commands. However, its argument is not an expression but 500the literal command characters. Example: > 501 502 :normal gg=G 503 504This jumps to the first line and formats all lines with the "=" operator. 505 To make ":normal" work with an expression, combine ":execute" with it. 506Example: > 507 508 :execute "normal " . normal_commands 509 510The variable "normal_commands" must contain the Normal mode commands. 511 Make sure that the argument for ":normal" is a complete command. Otherwise 512Vim will run into the end of the argument and abort the command. For example, 513if you start Insert mode, you must leave Insert mode as well. This works: > 514 515 :execute "normal Inew text \<Esc>" 516 517This inserts "new text " in the current line. Notice the use of the special 518key "\<Esc>". This avoids having to enter a real <Esc> character in your 519script. 520 521If you don't want to execute a string but evaluate it to get its expression 522value, you can use the eval() function: > 523 524 :let optname = "path" 525 :let optval = eval('&' . optname) 526 527A "&" character is prepended to "path", thus the argument to eval() is 528"&path". The result will then be the value of the 'path' option. 529 The same thing can be done with: > 530 :exe 'let optval = &' . optname 531 532============================================================================== 533*41.6* Using functions 534 535Vim defines many functions and provides a large amount of functionality that 536way. A few examples will be given in this section. You can find the whole 537list here: |functions|. 538 539A function is called with the ":call" command. The parameters are passed in 540between parentheses separated by commas. Example: > 541 542 :call search("Date: ", "W") 543 544This calls the search() function, with arguments "Date: " and "W". The 545search() function uses its first argument as a search pattern and the second 546one as flags. The "W" flag means the search doesn't wrap around the end of 547the file. 548 549A function can be called in an expression. Example: > 550 551 :let line = getline(".") 552 :let repl = substitute(line, '\a', "*", "g") 553 :call setline(".", repl) 554 555The getline() function obtains a line from the current buffer. Its argument 556is a specification of the line number. In this case "." is used, which means 557the line where the cursor is. 558 The substitute() function does something similar to the ":substitute" 559command. The first argument is the string on which to perform the 560substitution. The second argument is the pattern, the third the replacement 561string. Finally, the last arguments are the flags. 562 The setline() function sets the line, specified by the first argument, to a 563new string, the second argument. In this example the line under the cursor is 564replaced with the result of the substitute(). Thus the effect of the three 565statements is equal to: > 566 567 :substitute/\a/*/g 568 569Using the functions becomes more interesting when you do more work before and 570after the substitute() call. 571 572 573FUNCTIONS *function-list* 574 575There are many functions. We will mention them here, grouped by what they are 576used for. You can find an alphabetical list here: |functions|. Use CTRL-] on 577the function name to jump to detailed help on it. 578 579String manipulation: *string-functions* 580 nr2char() get a character by its ASCII value 581 char2nr() get ASCII value of a character 582 str2nr() convert a string to a Number 583 str2float() convert a string to a Float 584 printf() format a string according to % items 585 escape() escape characters in a string with a '\' 586 shellescape() escape a string for use with a shell command 587 fnameescape() escape a file name for use with a Vim command 588 tr() translate characters from one set to another 589 strtrans() translate a string to make it printable 590 tolower() turn a string to lowercase 591 toupper() turn a string to uppercase 592 match() position where a pattern matches in a string 593 matchend() position where a pattern match ends in a string 594 matchstr() match of a pattern in a string 595 matchstrpos() match and positions of a pattern in a string 596 matchlist() like matchstr() and also return submatches 597 stridx() first index of a short string in a long string 598 strridx() last index of a short string in a long string 599 strlen() length of a string in bytes 600 strchars() length of a string in characters 601 strwidth() size of string when displayed 602 strdisplaywidth() size of string when displayed, deals with tabs 603 substitute() substitute a pattern match with a string 604 submatch() get a specific match in ":s" and substitute() 605 strpart() get part of a string using byte index 606 strcharpart() get part of a string using char index 607 strgetchar() get character from a string using char index 608 expand() expand special keywords 609 iconv() convert text from one encoding to another 610 byteidx() byte index of a character in a string 611 byteidxcomp() like byteidx() but count composing characters 612 repeat() repeat a string multiple times 613 eval() evaluate a string expression 614 execute() execute an Ex command and get the output 615 trim() trim characters from a string 616 617List manipulation: *list-functions* 618 get() get an item without error for wrong index 619 len() number of items in a List 620 empty() check if List is empty 621 insert() insert an item somewhere in a List 622 add() append an item to a List 623 extend() append a List to a List 624 remove() remove one or more items from a List 625 copy() make a shallow copy of a List 626 deepcopy() make a full copy of a List 627 filter() remove selected items from a List 628 map() change each List item 629 sort() sort a List 630 reverse() reverse the order of a List 631 uniq() remove copies of repeated adjacent items 632 split() split a String into a List 633 join() join List items into a String 634 range() return a List with a sequence of numbers 635 string() String representation of a List 636 call() call a function with List as arguments 637 index() index of a value in a List 638 max() maximum value in a List 639 min() minimum value in a List 640 count() count number of times a value appears in a List 641 repeat() repeat a List multiple times 642 643Dictionary manipulation: *dict-functions* 644 get() get an entry without an error for a wrong key 645 len() number of entries in a Dictionary 646 has_key() check whether a key appears in a Dictionary 647 empty() check if Dictionary is empty 648 remove() remove an entry from a Dictionary 649 extend() add entries from one Dictionary to another 650 filter() remove selected entries from a Dictionary 651 map() change each Dictionary entry 652 keys() get List of Dictionary keys 653 values() get List of Dictionary values 654 items() get List of Dictionary key-value pairs 655 copy() make a shallow copy of a Dictionary 656 deepcopy() make a full copy of a Dictionary 657 string() String representation of a Dictionary 658 max() maximum value in a Dictionary 659 min() minimum value in a Dictionary 660 count() count number of times a value appears 661 662Floating point computation: *float-functions* 663 float2nr() convert Float to Number 664 abs() absolute value (also works for Number) 665 round() round off 666 ceil() round up 667 floor() round down 668 trunc() remove value after decimal point 669 fmod() remainder of division 670 exp() exponential 671 log() natural logarithm (logarithm to base e) 672 log10() logarithm to base 10 673 pow() value of x to the exponent y 674 sqrt() square root 675 sin() sine 676 cos() cosine 677 tan() tangent 678 asin() arc sine 679 acos() arc cosine 680 atan() arc tangent 681 atan2() arc tangent 682 sinh() hyperbolic sine 683 cosh() hyperbolic cosine 684 tanh() hyperbolic tangent 685 isnan() check for not a number 686 687Other computation: *bitwise-function* 688 and() bitwise AND 689 invert() bitwise invert 690 or() bitwise OR 691 xor() bitwise XOR 692 sha256() SHA-256 hash 693 694Variables: *var-functions* 695 type() type of a variable 696 islocked() check if a variable is locked 697 funcref() get a Funcref for a function reference 698 function() get a Funcref for a function name 699 getbufvar() get a variable value from a specific buffer 700 setbufvar() set a variable in a specific buffer 701 getwinvar() get a variable from specific window 702 gettabvar() get a variable from specific tab page 703 gettabwinvar() get a variable from specific window & tab page 704 setwinvar() set a variable in a specific window 705 settabvar() set a variable in a specific tab page 706 settabwinvar() set a variable in a specific window & tab page 707 garbagecollect() possibly free memory 708 709Cursor and mark position: *cursor-functions* *mark-functions* 710 col() column number of the cursor or a mark 711 virtcol() screen column of the cursor or a mark 712 line() line number of the cursor or mark 713 wincol() window column number of the cursor 714 winline() window line number of the cursor 715 cursor() position the cursor at a line/column 716 screencol() get screen column of the cursor 717 screenrow() get screen row of the cursor 718 getcurpos() get position of the cursor 719 getpos() get position of cursor, mark, etc. 720 setpos() set position of cursor, mark, etc. 721 byte2line() get line number at a specific byte count 722 line2byte() byte count at a specific line 723 diff_filler() get the number of filler lines above a line 724 screenattr() get attribute at a screen line/row 725 screenchar() get character code at a screen line/row 726 727Working with text in the current buffer: *text-functions* 728 getline() get a line or list of lines from the buffer 729 setline() replace a line in the buffer 730 append() append line or list of lines in the buffer 731 indent() indent of a specific line 732 cindent() indent according to C indenting 733 lispindent() indent according to Lisp indenting 734 nextnonblank() find next non-blank line 735 prevnonblank() find previous non-blank line 736 search() find a match for a pattern 737 searchpos() find a match for a pattern 738 searchpair() find the other end of a start/skip/end 739 searchpairpos() find the other end of a start/skip/end 740 searchdecl() search for the declaration of a name 741 getcharsearch() return character search information 742 setcharsearch() set character search information 743 744 *system-functions* *file-functions* 745System functions and manipulation of files: 746 glob() expand wildcards 747 globpath() expand wildcards in a number of directories 748 glob2regpat() convert a glob pattern into a search pattern 749 findfile() find a file in a list of directories 750 finddir() find a directory in a list of directories 751 resolve() find out where a shortcut points to 752 fnamemodify() modify a file name 753 pathshorten() shorten directory names in a path 754 simplify() simplify a path without changing its meaning 755 executable() check if an executable program exists 756 exepath() full path of an executable program 757 filereadable() check if a file can be read 758 filewritable() check if a file can be written to 759 getfperm() get the permissions of a file 760 setfperm() set the permissions of a file 761 getftype() get the kind of a file 762 isdirectory() check if a directory exists 763 getfsize() get the size of a file 764 getcwd() get the current working directory 765 haslocaldir() check if current window used |:lcd| 766 tempname() get the name of a temporary file 767 mkdir() create a new directory 768 delete() delete a file 769 rename() rename a file 770 system() get the result of a shell command as a string 771 systemlist() get the result of a shell command as a list 772 hostname() name of the system 773 readfile() read a file into a List of lines 774 writefile() write a List of lines or Blob into a file 775 776Date and Time: *date-functions* *time-functions* 777 getftime() get last modification time of a file 778 localtime() get current time in seconds 779 strftime() convert time to a string 780 reltime() get the current or elapsed time accurately 781 reltimestr() convert reltime() result to a string 782 reltimefloat() convert reltime() result to a Float 783 784 *buffer-functions* *window-functions* *arg-functions* 785Buffers, windows and the argument list: 786 argc() number of entries in the argument list 787 argidx() current position in the argument list 788 arglistid() get id of the argument list 789 argv() get one entry from the argument list 790 bufexists() check if a buffer exists 791 buflisted() check if a buffer exists and is listed 792 bufloaded() check if a buffer exists and is loaded 793 bufname() get the name of a specific buffer 794 bufnr() get the buffer number of a specific buffer 795 tabpagebuflist() return List of buffers in a tab page 796 tabpagenr() get the number of a tab page 797 tabpagewinnr() like winnr() for a specified tab page 798 winnr() get the window number for the current window 799 bufwinid() get the window ID of a specific buffer 800 bufwinnr() get the window number of a specific buffer 801 winbufnr() get the buffer number of a specific window 802 getbufline() get a list of lines from the specified buffer 803 setbufline() replace a line in the specified buffer 804 appendbufline() append a list of lines in the specified buffer 805 deletebufline() delete lines from a specified buffer 806 win_findbuf() find windows containing a buffer 807 win_getid() get window ID of a window 808 win_gotoid() go to window with ID 809 win_id2tabwin() get tab and window nr from window ID 810 win_id2win() get window nr from window ID 811 getbufinfo() get a list with buffer information 812 gettabinfo() get a list with tab page information 813 getwininfo() get a list with window information 814 getchangelist() get a list of change list entries 815 getjumplist() get a list of jump list entries 816 swapinfo() information about a swap file 817 swapname() get the swap file path of a buffer 818 819Command line: *command-line-functions* 820 getcmdline() get the current command line 821 getcmdpos() get position of the cursor in the command line 822 setcmdpos() set position of the cursor in the command line 823 getcmdtype() return the current command-line type 824 getcmdwintype() return the current command-line window type 825 getcompletion() list of command-line completion matches 826 827Quickfix and location lists: *quickfix-functions* 828 getqflist() list of quickfix errors 829 setqflist() modify a quickfix list 830 getloclist() list of location list items 831 setloclist() modify a location list 832 833Insert mode completion: *completion-functions* 834 complete() set found matches 835 complete_add() add to found matches 836 complete_check() check if completion should be aborted 837 pumvisible() check if the popup menu is displayed 838 839Folding: *folding-functions* 840 foldclosed() check for a closed fold at a specific line 841 foldclosedend() like foldclosed() but return the last line 842 foldlevel() check for the fold level at a specific line 843 foldtext() generate the line displayed for a closed fold 844 foldtextresult() get the text displayed for a closed fold 845 846Syntax and highlighting: *syntax-functions* *highlighting-functions* 847 clearmatches() clear all matches defined by |matchadd()| and 848 the |:match| commands 849 getmatches() get all matches defined by |matchadd()| and 850 the |:match| commands 851 hlexists() check if a highlight group exists 852 hlID() get ID of a highlight group 853 synID() get syntax ID at a specific position 854 synIDattr() get a specific attribute of a syntax ID 855 synIDtrans() get translated syntax ID 856 synstack() get list of syntax IDs at a specific position 857 synconcealed() get info about concealing 858 diff_hlID() get highlight ID for diff mode at a position 859 matchadd() define a pattern to highlight (a "match") 860 matchaddpos() define a list of positions to highlight 861 matcharg() get info about |:match| arguments 862 matchdelete() delete a match defined by |matchadd()| or a 863 |:match| command 864 setmatches() restore a list of matches saved by 865 |getmatches()| 866 867Spelling: *spell-functions* 868 spellbadword() locate badly spelled word at or after cursor 869 spellsuggest() return suggested spelling corrections 870 soundfold() return the sound-a-like equivalent of a word 871 872History: *history-functions* 873 histadd() add an item to a history 874 histdel() delete an item from a history 875 histget() get an item from a history 876 histnr() get highest index of a history list 877 878Interactive: *interactive-functions* 879 browse() put up a file requester 880 browsedir() put up a directory requester 881 confirm() let the user make a choice 882 getchar() get a character from the user 883 getcharmod() get modifiers for the last typed character 884 feedkeys() put characters in the typeahead queue 885 input() get a line from the user 886 inputlist() let the user pick an entry from a list 887 inputsecret() get a line from the user without showing it 888 inputdialog() get a line from the user in a dialog 889 inputsave() save and clear typeahead 890 inputrestore() restore typeahead 891 892GUI: *gui-functions* 893 getfontname() get name of current font being used 894 getwinpos() position of the Vim window 895 getwinposx() X position of the Vim window 896 getwinposy() Y position of the Vim window 897 balloon_show() set the balloon content 898 balloon_split() split a message for a balloon 899 900Vim server: *server-functions* 901 serverlist() return the list of server names 902 remote_startserver() run a server 903 remote_send() send command characters to a Vim server 904 remote_expr() evaluate an expression in a Vim server 905 server2client() send a reply to a client of a Vim server 906 remote_peek() check if there is a reply from a Vim server 907 remote_read() read a reply from a Vim server 908 foreground() move the Vim window to the foreground 909 remote_foreground() move the Vim server window to the foreground 910 911Window size and position: *window-size-functions* 912 winheight() get height of a specific window 913 winwidth() get width of a specific window 914 win_screenpos() get screen position of a window 915 winlayout() get layout of windows in a tab page 916 winrestcmd() return command to restore window sizes 917 winsaveview() get view of current window 918 winrestview() restore saved view of current window 919 920Mappings: *mapping-functions* 921 hasmapto() check if a mapping exists 922 mapcheck() check if a matching mapping exists 923 maparg() get rhs of a mapping 924 wildmenumode() check if the wildmode is active 925 926Testing: *test-functions* 927 assert_equal() assert that two expressions values are equal 928 assert_equalfile() assert that two file contents are equal 929 assert_notequal() assert that two expressions values are not equal 930 assert_inrange() assert that an expression is inside a range 931 assert_match() assert that a pattern matches the value 932 assert_notmatch() assert that a pattern does not match the value 933 assert_false() assert that an expression is false 934 assert_true() assert that an expression is true 935 assert_exception() assert that a command throws an exception 936 assert_beeps() assert that a command beeps 937 assert_fails() assert that a command fails 938 assert_report() report a test failure 939 test_alloc_fail() make memory allocation fail 940 test_autochdir() enable 'autochdir' during startup 941 test_override() test with Vim internal overrides 942 test_garbagecollect_now() free memory right now 943 test_ignore_error() ignore a specific error message 944 test_null_blob() return a null Blob 945 test_null_channel() return a null Channel 946 test_null_dict() return a null Dict 947 test_null_job() return a null Job 948 test_null_list() return a null List 949 test_null_partial() return a null Partial function 950 test_null_string() return a null String 951 test_settime() set the time Vim uses internally 952 test_feedinput() add key sequence to input buffer 953 test_option_not_set() reset flag indicating option was set 954 test_scrollbar() simulate scrollbar movement in the GUI 955 956Inter-process communication: *channel-functions* 957 ch_canread() check if there is something to read 958 ch_open() open a channel 959 ch_close() close a channel 960 ch_close_in() close the in part of a channel 961 ch_read() read a message from a channel 962 ch_readblob() read a Blob from a channel 963 ch_readraw() read a raw message from a channel 964 ch_sendexpr() send a JSON message over a channel 965 ch_sendraw() send a raw message over a channel 966 ch_evalexpr() evaluates an expression over channel 967 ch_evalraw() evaluates a raw string over channel 968 ch_status() get status of a channel 969 ch_getbufnr() get the buffer number of a channel 970 ch_getjob() get the job associated with a channel 971 ch_info() get channel information 972 ch_log() write a message in the channel log file 973 ch_logfile() set the channel log file 974 ch_setoptions() set the options for a channel 975 json_encode() encode an expression to a JSON string 976 json_decode() decode a JSON string to Vim types 977 js_encode() encode an expression to a JSON string 978 js_decode() decode a JSON string to Vim types 979 980Jobs: *job-functions* 981 job_start() start a job 982 job_stop() stop a job 983 job_status() get the status of a job 984 job_getchannel() get the channel used by a job 985 job_info() get information about a job 986 job_setoptions() set options for a job 987 988Signs: *sign-functions* 989 sign_define() define or update a sign 990 sign_getdefined() get a list of defined signs 991 sign_getplaced() get a list of placed signs 992 sign_jump() jump to a sign 993 sign_place() place a sign 994 sign_undefine() undefine a sign 995 sign_unplace() unplace a sign 996 997Terminal window: *terminal-functions* 998 term_start() open a terminal window and run a job 999 term_list() get the list of terminal buffers 1000 term_sendkeys() send keystrokes to a terminal 1001 term_wait() wait for screen to be updated 1002 term_getjob() get the job associated with a terminal 1003 term_scrape() get row of a terminal screen 1004 term_getline() get a line of text from a terminal 1005 term_getattr() get the value of attribute {what} 1006 term_getcursor() get the cursor position of a terminal 1007 term_getscrolled() get the scroll count of a terminal 1008 term_getaltscreen() get the alternate screen flag 1009 term_getsize() get the size of a terminal 1010 term_getstatus() get the status of a terminal 1011 term_gettitle() get the title of a terminal 1012 term_gettty() get the tty name of a terminal 1013 term_setansicolors() set 16 ANSI colors, used for GUI 1014 term_getansicolors() get 16 ANSI colors, used for GUI 1015 term_dumpdiff() display difference between two screen dumps 1016 term_dumpload() load a terminal screen dump in a window 1017 term_dumpwrite() dump contents of a terminal screen to a file 1018 term_setkill() set signal to stop job in a terminal 1019 term_setrestore() set command to restore a terminal 1020 term_setsize() set the size of a terminal 1021 1022Timers: *timer-functions* 1023 timer_start() create a timer 1024 timer_pause() pause or unpause a timer 1025 timer_stop() stop a timer 1026 timer_stopall() stop all timers 1027 timer_info() get information about timers 1028 1029Tags: *tag-functions* 1030 taglist() get list of matching tags 1031 tagfiles() get a list of tags files 1032 gettagstack() get the tag stack of a window 1033 settagstack() modify the tag stack of a window 1034 1035Prompt Buffer: *promptbuffer-functions* 1036 prompt_setcallback() set prompt callback for a buffer 1037 prompt_setinterrupt() set interrupt callback for a buffer 1038 prompt_setprompt() set the prompt text for a buffer 1039 1040Various: *various-functions* 1041 mode() get current editing mode 1042 visualmode() last visual mode used 1043 exists() check if a variable, function, etc. exists 1044 has() check if a feature is supported in Vim 1045 changenr() return number of most recent change 1046 cscope_connection() check if a cscope connection exists 1047 did_filetype() check if a FileType autocommand was used 1048 eventhandler() check if invoked by an event handler 1049 getpid() get process ID of Vim 1050 1051 libcall() call a function in an external library 1052 libcallnr() idem, returning a number 1053 1054 undofile() get the name of the undo file 1055 undotree() return the state of the undo tree 1056 1057 getreg() get contents of a register 1058 getregtype() get type of a register 1059 setreg() set contents and type of a register 1060 reg_executing() return the name of the register being executed 1061 reg_recording() return the name of the register being recorded 1062 1063 shiftwidth() effective value of 'shiftwidth' 1064 1065 wordcount() get byte/word/char count of buffer 1066 1067 luaeval() evaluate Lua expression 1068 mzeval() evaluate |MzScheme| expression 1069 perleval() evaluate Perl expression (|+perl|) 1070 py3eval() evaluate Python expression (|+python3|) 1071 pyeval() evaluate Python expression (|+python|) 1072 pyxeval() evaluate |python_x| expression 1073 debugbreak() interrupt a program being debugged 1074 1075============================================================================== 1076*41.7* Defining a function 1077 1078Vim enables you to define your own functions. The basic function declaration 1079begins as follows: > 1080 1081 :function {name}({var1}, {var2}, ...) 1082 : {body} 1083 :endfunction 1084< 1085 Note: 1086 Function names must begin with a capital letter. 1087 1088Let's define a short function to return the smaller of two numbers. It starts 1089with this line: > 1090 1091 :function Min(num1, num2) 1092 1093This tells Vim that the function is named "Min" and it takes two arguments: 1094"num1" and "num2". 1095 The first thing you need to do is to check to see which number is smaller: 1096 > 1097 : if a:num1 < a:num2 1098 1099The special prefix "a:" tells Vim that the variable is a function argument. 1100Let's assign the variable "smaller" the value of the smallest number: > 1101 1102 : if a:num1 < a:num2 1103 : let smaller = a:num1 1104 : else 1105 : let smaller = a:num2 1106 : endif 1107 1108The variable "smaller" is a local variable. Variables used inside a function 1109are local unless prefixed by something like "g:", "a:", or "s:". 1110 1111 Note: 1112 To access a global variable from inside a function you must prepend 1113 "g:" to it. Thus "g:today" inside a function is used for the global 1114 variable "today", and "today" is another variable, local to the 1115 function. 1116 1117You now use the ":return" statement to return the smallest number to the user. 1118Finally, you end the function: > 1119 1120 : return smaller 1121 :endfunction 1122 1123The complete function definition is as follows: > 1124 1125 :function Min(num1, num2) 1126 : if a:num1 < a:num2 1127 : let smaller = a:num1 1128 : else 1129 : let smaller = a:num2 1130 : endif 1131 : return smaller 1132 :endfunction 1133 1134For people who like short functions, this does the same thing: > 1135 1136 :function Min(num1, num2) 1137 : if a:num1 < a:num2 1138 : return a:num1 1139 : endif 1140 : return a:num2 1141 :endfunction 1142 1143A user defined function is called in exactly the same way as a built-in 1144function. Only the name is different. The Min function can be used like 1145this: > 1146 1147 :echo Min(5, 8) 1148 1149Only now will the function be executed and the lines be interpreted by Vim. 1150If there are mistakes, like using an undefined variable or function, you will 1151now get an error message. When defining the function these errors are not 1152detected. 1153 1154When a function reaches ":endfunction" or ":return" is used without an 1155argument, the function returns zero. 1156 1157To redefine a function that already exists, use the ! for the ":function" 1158command: > 1159 1160 :function! Min(num1, num2, num3) 1161 1162 1163USING A RANGE 1164 1165The ":call" command can be given a line range. This can have one of two 1166meanings. When a function has been defined with the "range" keyword, it will 1167take care of the line range itself. 1168 The function will be passed the variables "a:firstline" and "a:lastline". 1169These will have the line numbers from the range the function was called with. 1170Example: > 1171 1172 :function Count_words() range 1173 : let lnum = a:firstline 1174 : let n = 0 1175 : while lnum <= a:lastline 1176 : let n = n + len(split(getline(lnum))) 1177 : let lnum = lnum + 1 1178 : endwhile 1179 : echo "found " . n . " words" 1180 :endfunction 1181 1182You can call this function with: > 1183 1184 :10,30call Count_words() 1185 1186It will be executed once and echo the number of words. 1187 The other way to use a line range is by defining a function without the 1188"range" keyword. The function will be called once for every line in the 1189range, with the cursor in that line. Example: > 1190 1191 :function Number() 1192 : echo "line " . line(".") . " contains: " . getline(".") 1193 :endfunction 1194 1195If you call this function with: > 1196 1197 :10,15call Number() 1198 1199The function will be called six times. 1200 1201 1202VARIABLE NUMBER OF ARGUMENTS 1203 1204Vim enables you to define functions that have a variable number of arguments. 1205The following command, for instance, defines a function that must have 1 1206argument (start) and can have up to 20 additional arguments: > 1207 1208 :function Show(start, ...) 1209 1210The variable "a:1" contains the first optional argument, "a:2" the second, and 1211so on. The variable "a:0" contains the number of extra arguments. 1212 For example: > 1213 1214 :function Show(start, ...) 1215 : echohl Title 1216 : echo "start is " . a:start 1217 : echohl None 1218 : let index = 1 1219 : while index <= a:0 1220 : echo " Arg " . index . " is " . a:{index} 1221 : let index = index + 1 1222 : endwhile 1223 : echo "" 1224 :endfunction 1225 1226This uses the ":echohl" command to specify the highlighting used for the 1227following ":echo" command. ":echohl None" stops it again. The ":echon" 1228command works like ":echo", but doesn't output a line break. 1229 1230You can also use the a:000 variable, it is a List of all the "..." arguments. 1231See |a:000|. 1232 1233 1234LISTING FUNCTIONS 1235 1236The ":function" command lists the names and arguments of all user-defined 1237functions: > 1238 1239 :function 1240< function Show(start, ...) ~ 1241 function GetVimIndent() ~ 1242 function SetSyn(name) ~ 1243 1244To see what a function does, use its name as an argument for ":function": > 1245 1246 :function SetSyn 1247< 1 if &syntax == '' ~ 1248 2 let &syntax = a:name ~ 1249 3 endif ~ 1250 endfunction ~ 1251 1252 1253DEBUGGING 1254 1255The line number is useful for when you get an error message or when debugging. 1256See |debug-scripts| about debugging mode. 1257 You can also set the 'verbose' option to 12 or higher to see all function 1258calls. Set it to 15 or higher to see every executed line. 1259 1260 1261DELETING A FUNCTION 1262 1263To delete the Show() function: > 1264 1265 :delfunction Show 1266 1267You get an error when the function doesn't exist. 1268 1269 1270FUNCTION REFERENCES 1271 1272Sometimes it can be useful to have a variable point to one function or 1273another. You can do it with the function() function. It turns the name of a 1274function into a reference: > 1275 1276 :let result = 0 " or 1 1277 :function! Right() 1278 : return 'Right!' 1279 :endfunc 1280 :function! Wrong() 1281 : return 'Wrong!' 1282 :endfunc 1283 : 1284 :if result == 1 1285 : let Afunc = function('Right') 1286 :else 1287 : let Afunc = function('Wrong') 1288 :endif 1289 :echo call(Afunc, []) 1290< Wrong! ~ 1291 1292Note that the name of a variable that holds a function reference must start 1293with a capital. Otherwise it could be confused with the name of a builtin 1294function. 1295 The way to invoke a function that a variable refers to is with the call() 1296function. Its first argument is the function reference, the second argument 1297is a List with arguments. 1298 1299Function references are most useful in combination with a Dictionary, as is 1300explained in the next section. 1301 1302============================================================================== 1303*41.8* Lists and Dictionaries 1304 1305So far we have used the basic types String and Number. Vim also supports two 1306composite types: List and Dictionary. 1307 1308A List is an ordered sequence of things. The things can be any kind of value, 1309thus you can make a List of numbers, a List of Lists and even a List of mixed 1310items. To create a List with three strings: > 1311 1312 :let alist = ['aap', 'mies', 'noot'] 1313 1314The List items are enclosed in square brackets and separated by commas. To 1315create an empty List: > 1316 1317 :let alist = [] 1318 1319You can add items to a List with the add() function: > 1320 1321 :let alist = [] 1322 :call add(alist, 'foo') 1323 :call add(alist, 'bar') 1324 :echo alist 1325< ['foo', 'bar'] ~ 1326 1327List concatenation is done with +: > 1328 1329 :echo alist + ['foo', 'bar'] 1330< ['foo', 'bar', 'foo', 'bar'] ~ 1331 1332Or, if you want to extend a List directly: > 1333 1334 :let alist = ['one'] 1335 :call extend(alist, ['two', 'three']) 1336 :echo alist 1337< ['one', 'two', 'three'] ~ 1338 1339Notice that using add() will have a different effect: > 1340 1341 :let alist = ['one'] 1342 :call add(alist, ['two', 'three']) 1343 :echo alist 1344< ['one', ['two', 'three']] ~ 1345 1346The second argument of add() is added as a single item. 1347 1348 1349FOR LOOP 1350 1351One of the nice things you can do with a List is iterate over it: > 1352 1353 :let alist = ['one', 'two', 'three'] 1354 :for n in alist 1355 : echo n 1356 :endfor 1357< one ~ 1358 two ~ 1359 three ~ 1360 1361This will loop over each element in List "alist", assigning the value to 1362variable "n". The generic form of a for loop is: > 1363 1364 :for {varname} in {listexpression} 1365 : {commands} 1366 :endfor 1367 1368To loop a certain number of times you need a List of a specific length. The 1369range() function creates one for you: > 1370 1371 :for a in range(3) 1372 : echo a 1373 :endfor 1374< 0 ~ 1375 1 ~ 1376 2 ~ 1377 1378Notice that the first item of the List that range() produces is zero, thus the 1379last item is one less than the length of the list. 1380 You can also specify the maximum value, the stride and even go backwards: > 1381 1382 :for a in range(8, 4, -2) 1383 : echo a 1384 :endfor 1385< 8 ~ 1386 6 ~ 1387 4 ~ 1388 1389A more useful example, looping over lines in the buffer: > 1390 1391 :for line in getline(1, 20) 1392 : if line =~ "Date: " 1393 : echo matchstr(line, 'Date: \zs.*') 1394 : endif 1395 :endfor 1396 1397This looks into lines 1 to 20 (inclusive) and echoes any date found in there. 1398 1399 1400DICTIONARIES 1401 1402A Dictionary stores key-value pairs. You can quickly lookup a value if you 1403know the key. A Dictionary is created with curly braces: > 1404 1405 :let uk2nl = {'one': 'een', 'two': 'twee', 'three': 'drie'} 1406 1407Now you can lookup words by putting the key in square brackets: > 1408 1409 :echo uk2nl['two'] 1410< twee ~ 1411 1412The generic form for defining a Dictionary is: > 1413 1414 {<key> : <value>, ...} 1415 1416An empty Dictionary is one without any keys: > 1417 1418 {} 1419 1420The possibilities with Dictionaries are numerous. There are various functions 1421for them as well. For example, you can obtain a list of the keys and loop 1422over them: > 1423 1424 :for key in keys(uk2nl) 1425 : echo key 1426 :endfor 1427< three ~ 1428 one ~ 1429 two ~ 1430 1431You will notice the keys are not ordered. You can sort the list to get a 1432specific order: > 1433 1434 :for key in sort(keys(uk2nl)) 1435 : echo key 1436 :endfor 1437< one ~ 1438 three ~ 1439 two ~ 1440 1441But you can never get back the order in which items are defined. For that you 1442need to use a List, it stores items in an ordered sequence. 1443 1444 1445DICTIONARY FUNCTIONS 1446 1447The items in a Dictionary can normally be obtained with an index in square 1448brackets: > 1449 1450 :echo uk2nl['one'] 1451< een ~ 1452 1453A method that does the same, but without so many punctuation characters: > 1454 1455 :echo uk2nl.one 1456< een ~ 1457 1458This only works for a key that is made of ASCII letters, digits and the 1459underscore. You can also assign a new value this way: > 1460 1461 :let uk2nl.four = 'vier' 1462 :echo uk2nl 1463< {'three': 'drie', 'four': 'vier', 'one': 'een', 'two': 'twee'} ~ 1464 1465And now for something special: you can directly define a function and store a 1466reference to it in the dictionary: > 1467 1468 :function uk2nl.translate(line) dict 1469 : return join(map(split(a:line), 'get(self, v:val, "???")')) 1470 :endfunction 1471 1472Let's first try it out: > 1473 1474 :echo uk2nl.translate('three two five one') 1475< drie twee ??? een ~ 1476 1477The first special thing you notice is the "dict" at the end of the ":function" 1478line. This marks the function as being used from a Dictionary. The "self" 1479local variable will then refer to that Dictionary. 1480 Now let's break up the complicated return command: > 1481 1482 split(a:line) 1483 1484The split() function takes a string, chops it into whitespace separated words 1485and returns a list with these words. Thus in the example it returns: > 1486 1487 :echo split('three two five one') 1488< ['three', 'two', 'five', 'one'] ~ 1489 1490This list is the first argument to the map() function. This will go through 1491the list, evaluating its second argument with "v:val" set to the value of each 1492item. This is a shortcut to using a for loop. This command: > 1493 1494 :let alist = map(split(a:line), 'get(self, v:val, "???")') 1495 1496Is equivalent to: > 1497 1498 :let alist = split(a:line) 1499 :for idx in range(len(alist)) 1500 : let alist[idx] = get(self, alist[idx], "???") 1501 :endfor 1502 1503The get() function checks if a key is present in a Dictionary. If it is, then 1504the value is retrieved. If it isn't, then the default value is returned, in 1505the example it's '???'. This is a convenient way to handle situations where a 1506key may not be present and you don't want an error message. 1507 1508The join() function does the opposite of split(): it joins together a list of 1509words, putting a space in between. 1510 This combination of split(), map() and join() is a nice way to filter a line 1511of words in a very compact way. 1512 1513 1514OBJECT ORIENTED PROGRAMMING 1515 1516Now that you can put both values and functions in a Dictionary, you can 1517actually use a Dictionary like an object. 1518 Above we used a Dictionary for translating Dutch to English. We might want 1519to do the same for other languages. Let's first make an object (aka 1520Dictionary) that has the translate function, but no words to translate: > 1521 1522 :let transdict = {} 1523 :function transdict.translate(line) dict 1524 : return join(map(split(a:line), 'get(self.words, v:val, "???")')) 1525 :endfunction 1526 1527It's slightly different from the function above, using 'self.words' to lookup 1528word translations. But we don't have a self.words. Thus you could call this 1529an abstract class. 1530 1531Now we can instantiate a Dutch translation object: > 1532 1533 :let uk2nl = copy(transdict) 1534 :let uk2nl.words = {'one': 'een', 'two': 'twee', 'three': 'drie'} 1535 :echo uk2nl.translate('three one') 1536< drie een ~ 1537 1538And a German translator: > 1539 1540 :let uk2de = copy(transdict) 1541 :let uk2de.words = {'one': 'eins', 'two': 'zwei', 'three': 'drei'} 1542 :echo uk2de.translate('three one') 1543< drei eins ~ 1544 1545You see that the copy() function is used to make a copy of the "transdict" 1546Dictionary and then the copy is changed to add the words. The original 1547remains the same, of course. 1548 1549Now you can go one step further, and use your preferred translator: > 1550 1551 :if $LANG =~ "de" 1552 : let trans = uk2de 1553 :else 1554 : let trans = uk2nl 1555 :endif 1556 :echo trans.translate('one two three') 1557< een twee drie ~ 1558 1559Here "trans" refers to one of the two objects (Dictionaries). No copy is 1560made. More about List and Dictionary identity can be found at |list-identity| 1561and |dict-identity|. 1562 1563Now you might use a language that isn't supported. You can overrule the 1564translate() function to do nothing: > 1565 1566 :let uk2uk = copy(transdict) 1567 :function! uk2uk.translate(line) 1568 : return a:line 1569 :endfunction 1570 :echo uk2uk.translate('three one wladiwostok') 1571< three one wladiwostok ~ 1572 1573Notice that a ! was used to overwrite the existing function reference. Now 1574use "uk2uk" when no recognized language is found: > 1575 1576 :if $LANG =~ "de" 1577 : let trans = uk2de 1578 :elseif $LANG =~ "nl" 1579 : let trans = uk2nl 1580 :else 1581 : let trans = uk2uk 1582 :endif 1583 :echo trans.translate('one two three') 1584< one two three ~ 1585 1586For further reading see |Lists| and |Dictionaries|. 1587 1588============================================================================== 1589*41.9* Exceptions 1590 1591Let's start with an example: > 1592 1593 :try 1594 : read ~/templates/pascal.tmpl 1595 :catch /E484:/ 1596 : echo "Sorry, the Pascal template file cannot be found." 1597 :endtry 1598 1599The ":read" command will fail if the file does not exist. Instead of 1600generating an error message, this code catches the error and gives the user a 1601nice message. 1602 1603For the commands in between ":try" and ":endtry" errors are turned into 1604exceptions. An exception is a string. In the case of an error the string 1605contains the error message. And every error message has a number. In this 1606case, the error we catch contains "E484:". This number is guaranteed to stay 1607the same (the text may change, e.g., it may be translated). 1608 1609When the ":read" command causes another error, the pattern "E484:" will not 1610match in it. Thus this exception will not be caught and result in the usual 1611error message. 1612 1613You might be tempted to do this: > 1614 1615 :try 1616 : read ~/templates/pascal.tmpl 1617 :catch 1618 : echo "Sorry, the Pascal template file cannot be found." 1619 :endtry 1620 1621This means all errors are caught. But then you will not see errors that are 1622useful, such as "E21: Cannot make changes, 'modifiable' is off". 1623 1624Another useful mechanism is the ":finally" command: > 1625 1626 :let tmp = tempname() 1627 :try 1628 : exe ".,$write " . tmp 1629 : exe "!filter " . tmp 1630 : .,$delete 1631 : exe "$read " . tmp 1632 :finally 1633 : call delete(tmp) 1634 :endtry 1635 1636This filters the lines from the cursor until the end of the file through the 1637"filter" command, which takes a file name argument. No matter if the 1638filtering works, something goes wrong in between ":try" and ":finally" or the 1639user cancels the filtering by pressing CTRL-C, the "call delete(tmp)" is 1640always executed. This makes sure you don't leave the temporary file behind. 1641 1642More information about exception handling can be found in the reference 1643manual: |exception-handling|. 1644 1645============================================================================== 1646*41.10* Various remarks 1647 1648Here is a summary of items that apply to Vim scripts. They are also mentioned 1649elsewhere, but form a nice checklist. 1650 1651The end-of-line character depends on the system. For Unix a single <NL> 1652character is used. For MS-DOS, Windows, OS/2 and the like, <CR><LF> is used. 1653This is important when using mappings that end in a <CR>. See |:source_crnl|. 1654 1655 1656WHITE SPACE 1657 1658Blank lines are allowed and ignored. 1659 1660Leading whitespace characters (blanks and TABs) are always ignored. The 1661whitespaces between parameters (e.g. between the "set" and the "cpoptions" in 1662the example below) are reduced to one blank character and plays the role of a 1663separator, the whitespaces after the last (visible) character may or may not 1664be ignored depending on the situation, see below. 1665 1666For a ":set" command involving the "=" (equal) sign, such as in: > 1667 1668 :set cpoptions =aABceFst 1669 1670the whitespace immediately before the "=" sign is ignored. But there can be 1671no whitespace after the "=" sign! 1672 1673To include a whitespace character in the value of an option, it must be 1674escaped by a "\" (backslash) as in the following example: > 1675 1676 :set tags=my\ nice\ file 1677 1678The same example written as: > 1679 1680 :set tags=my nice file 1681 1682will issue an error, because it is interpreted as: > 1683 1684 :set tags=my 1685 :set nice 1686 :set file 1687 1688 1689COMMENTS 1690 1691The character " (the double quote mark) starts a comment. Everything after 1692and including this character until the end-of-line is considered a comment and 1693is ignored, except for commands that don't consider comments, as shown in 1694examples below. A comment can start on any character position on the line. 1695 1696There is a little "catch" with comments for some commands. Examples: > 1697 1698 :abbrev dev development " shorthand 1699 :map <F3> o#include " insert include 1700 :execute cmd " do it 1701 :!ls *.c " list C files 1702 1703The abbreviation 'dev' will be expanded to 'development " shorthand'. The 1704mapping of <F3> will actually be the whole line after the 'o# ....' including 1705the '" insert include'. The "execute" command will give an error. The "!" 1706command will send everything after it to the shell, causing an error for an 1707unmatched '"' character. 1708 There can be no comment after ":map", ":abbreviate", ":execute" and "!" 1709commands (there are a few more commands with this restriction). For the 1710":map", ":abbreviate" and ":execute" commands there is a trick: > 1711 1712 :abbrev dev development|" shorthand 1713 :map <F3> o#include|" insert include 1714 :execute cmd |" do it 1715 1716With the '|' character the command is separated from the next one. And that 1717next command is only a comment. For the last command you need to do two 1718things: |:execute| and use '|': > 1719 :exe '!ls *.c' |" list C files 1720 1721Notice that there is no white space before the '|' in the abbreviation and 1722mapping. For these commands, any character until the end-of-line or '|' is 1723included. As a consequence of this behavior, you don't always see that 1724trailing whitespace is included: > 1725 1726 :map <F4> o#include 1727 1728To spot these problems, you can set the 'list' option when editing vimrc 1729files. 1730 1731For Unix there is one special way to comment a line, that allows making a Vim 1732script executable: > 1733 #!/usr/bin/env vim -S 1734 echo "this is a Vim script" 1735 quit 1736 1737The "#" command by itself lists a line with the line number. Adding an 1738exclamation mark changes it into doing nothing, so that you can add the shell 1739command to execute the rest of the file. |:#!| |-S| 1740 1741 1742PITFALLS 1743 1744Even bigger problem arises in the following example: > 1745 1746 :map ,ab o#include 1747 :unmap ,ab 1748 1749Here the unmap command will not work, because it tries to unmap ",ab ". This 1750does not exist as a mapped sequence. An error will be issued, which is very 1751hard to identify, because the ending whitespace character in ":unmap ,ab " is 1752not visible. 1753 1754And this is the same as what happens when one uses a comment after an 'unmap' 1755command: > 1756 1757 :unmap ,ab " comment 1758 1759Here the comment part will be ignored. However, Vim will try to unmap 1760',ab ', which does not exist. Rewrite it as: > 1761 1762 :unmap ,ab| " comment 1763 1764 1765RESTORING THE VIEW 1766 1767Sometimes you want to make a change and go back to where the cursor was. 1768Restoring the relative position would also be nice, so that the same line 1769appears at the top of the window. 1770 This example yanks the current line, puts it above the first line in the 1771file and then restores the view: > 1772 1773 map ,p ma"aYHmbgg"aP`bzt`a 1774 1775What this does: > 1776 ma"aYHmbgg"aP`bzt`a 1777< ma set mark a at cursor position 1778 "aY yank current line into register a 1779 Hmb go to top line in window and set mark b there 1780 gg go to first line in file 1781 "aP put the yanked line above it 1782 `b go back to top line in display 1783 zt position the text in the window as before 1784 `a go back to saved cursor position 1785 1786 1787PACKAGING 1788 1789To avoid your function names to interfere with functions that you get from 1790others, use this scheme: 1791- Prepend a unique string before each function name. I often use an 1792 abbreviation. For example, "OW_" is used for the option window functions. 1793- Put the definition of your functions together in a file. Set a global 1794 variable to indicate that the functions have been loaded. When sourcing the 1795 file again, first unload the functions. 1796Example: > 1797 1798 " This is the XXX package 1799 1800 if exists("XXX_loaded") 1801 delfun XXX_one 1802 delfun XXX_two 1803 endif 1804 1805 function XXX_one(a) 1806 ... body of function ... 1807 endfun 1808 1809 function XXX_two(b) 1810 ... body of function ... 1811 endfun 1812 1813 let XXX_loaded = 1 1814 1815============================================================================== 1816*41.11* Writing a plugin *write-plugin* 1817 1818You can write a Vim script in such a way that many people can use it. This is 1819called a plugin. Vim users can drop your script in their plugin directory and 1820use its features right away |add-plugin|. 1821 1822There are actually two types of plugins: 1823 1824 global plugins: For all types of files. 1825filetype plugins: Only for files of a specific type. 1826 1827In this section the first type is explained. Most items are also relevant for 1828writing filetype plugins. The specifics for filetype plugins are in the next 1829section |write-filetype-plugin|. 1830 1831 1832NAME 1833 1834First of all you must choose a name for your plugin. The features provided 1835by the plugin should be clear from its name. And it should be unlikely that 1836someone else writes a plugin with the same name but which does something 1837different. And please limit the name to 8 characters, to avoid problems on 1838old Windows systems. 1839 1840A script that corrects typing mistakes could be called "typecorr.vim". We 1841will use it here as an example. 1842 1843For the plugin to work for everybody, it should follow a few guidelines. This 1844will be explained step-by-step. The complete example plugin is at the end. 1845 1846 1847BODY 1848 1849Let's start with the body of the plugin, the lines that do the actual work: > 1850 1851 14 iabbrev teh the 1852 15 iabbrev otehr other 1853 16 iabbrev wnat want 1854 17 iabbrev synchronisation 1855 18 \ synchronization 1856 19 let s:count = 4 1857 1858The actual list should be much longer, of course. 1859 1860The line numbers have only been added to explain a few things, don't put them 1861in your plugin file! 1862 1863 1864HEADER 1865 1866You will probably add new corrections to the plugin and soon have several 1867versions lying around. And when distributing this file, people will want to 1868know who wrote this wonderful plugin and where they can send remarks. 1869Therefore, put a header at the top of your plugin: > 1870 1871 1 " Vim global plugin for correcting typing mistakes 1872 2 " Last Change: 2000 Oct 15 1873 3 " Maintainer: Bram Moolenaar <[email protected]> 1874 1875About copyright and licensing: Since plugins are very useful and it's hardly 1876worth restricting their distribution, please consider making your plugin 1877either public domain or use the Vim |license|. A short note about this near 1878the top of the plugin should be sufficient. Example: > 1879 1880 4 " License: This file is placed in the public domain. 1881 1882 1883LINE CONTINUATION, AVOIDING SIDE EFFECTS *use-cpo-save* 1884 1885In line 18 above, the line-continuation mechanism is used |line-continuation|. 1886Users with 'compatible' set will run into trouble here, they will get an error 1887message. We can't just reset 'compatible', because that has a lot of side 1888effects. To avoid this, we will set the 'cpoptions' option to its Vim default 1889value and restore it later. That will allow the use of line-continuation and 1890make the script work for most people. It is done like this: > 1891 1892 11 let s:save_cpo = &cpo 1893 12 set cpo&vim 1894 .. 1895 42 let &cpo = s:save_cpo 1896 43 unlet s:save_cpo 1897 1898We first store the old value of 'cpoptions' in the s:save_cpo variable. At 1899the end of the plugin this value is restored. 1900 1901Notice that a script-local variable is used |s:var|. A global variable could 1902already be in use for something else. Always use script-local variables for 1903things that are only used in the script. 1904 1905 1906NOT LOADING 1907 1908It's possible that a user doesn't always want to load this plugin. Or the 1909system administrator has dropped it in the system-wide plugin directory, but a 1910user has his own plugin he wants to use. Then the user must have a chance to 1911disable loading this specific plugin. This will make it possible: > 1912 1913 6 if exists("g:loaded_typecorr") 1914 7 finish 1915 8 endif 1916 9 let g:loaded_typecorr = 1 1917 1918This also avoids that when the script is loaded twice it would cause error 1919messages for redefining functions and cause trouble for autocommands that are 1920added twice. 1921 1922The name is recommended to start with "loaded_" and then the file name of the 1923plugin, literally. The "g:" is prepended just to avoid mistakes when using 1924the variable in a function (without "g:" it would be a variable local to the 1925function). 1926 1927Using "finish" stops Vim from reading the rest of the file, it's much quicker 1928than using if-endif around the whole file. 1929 1930 1931MAPPING 1932 1933Now let's make the plugin more interesting: We will add a mapping that adds a 1934correction for the word under the cursor. We could just pick a key sequence 1935for this mapping, but the user might already use it for something else. To 1936allow the user to define which keys a mapping in a plugin uses, the <Leader> 1937item can be used: > 1938 1939 22 map <unique> <Leader>a <Plug>TypecorrAdd 1940 1941The "<Plug>TypecorrAdd" thing will do the work, more about that further on. 1942 1943The user can set the "mapleader" variable to the key sequence that he wants 1944this mapping to start with. Thus if the user has done: > 1945 1946 let mapleader = "_" 1947 1948the mapping will define "_a". If the user didn't do this, the default value 1949will be used, which is a backslash. Then a map for "\a" will be defined. 1950 1951Note that <unique> is used, this will cause an error message if the mapping 1952already happened to exist. |:map-<unique>| 1953 1954But what if the user wants to define his own key sequence? We can allow that 1955with this mechanism: > 1956 1957 21 if !hasmapto('<Plug>TypecorrAdd') 1958 22 map <unique> <Leader>a <Plug>TypecorrAdd 1959 23 endif 1960 1961This checks if a mapping to "<Plug>TypecorrAdd" already exists, and only 1962defines the mapping from "<Leader>a" if it doesn't. The user then has a 1963chance of putting this in his vimrc file: > 1964 1965 map ,c <Plug>TypecorrAdd 1966 1967Then the mapped key sequence will be ",c" instead of "_a" or "\a". 1968 1969 1970PIECES 1971 1972If a script gets longer, you often want to break up the work in pieces. You 1973can use functions or mappings for this. But you don't want these functions 1974and mappings to interfere with the ones from other scripts. For example, you 1975could define a function Add(), but another script could try to define the same 1976function. To avoid this, we define the function local to the script by 1977prepending it with "s:". 1978 1979We will define a function that adds a new typing correction: > 1980 1981 30 function s:Add(from, correct) 1982 31 let to = input("type the correction for " . a:from . ": ") 1983 32 exe ":iabbrev " . a:from . " " . to 1984 .. 1985 36 endfunction 1986 1987Now we can call the function s:Add() from within this script. If another 1988script also defines s:Add(), it will be local to that script and can only 1989be called from the script it was defined in. There can also be a global Add() 1990function (without the "s:"), which is again another function. 1991 1992<SID> can be used with mappings. It generates a script ID, which identifies 1993the current script. In our typing correction plugin we use it like this: > 1994 1995 24 noremap <unique> <script> <Plug>TypecorrAdd <SID>Add 1996 .. 1997 28 noremap <SID>Add :call <SID>Add(expand("<cword>"), 1)<CR> 1998 1999Thus when a user types "\a", this sequence is invoked: > 2000 2001 \a -> <Plug>TypecorrAdd -> <SID>Add -> :call <SID>Add() 2002 2003If another script would also map <SID>Add, it would get another script ID and 2004thus define another mapping. 2005 2006Note that instead of s:Add() we use <SID>Add() here. That is because the 2007mapping is typed by the user, thus outside of the script. The <SID> is 2008translated to the script ID, so that Vim knows in which script to look for 2009the Add() function. 2010 2011This is a bit complicated, but it's required for the plugin to work together 2012with other plugins. The basic rule is that you use <SID>Add() in mappings and 2013s:Add() in other places (the script itself, autocommands, user commands). 2014 2015We can also add a menu entry to do the same as the mapping: > 2016 2017 26 noremenu <script> Plugin.Add\ Correction <SID>Add 2018 2019The "Plugin" menu is recommended for adding menu items for plugins. In this 2020case only one item is used. When adding more items, creating a submenu is 2021recommended. For example, "Plugin.CVS" could be used for a plugin that offers 2022CVS operations "Plugin.CVS.checkin", "Plugin.CVS.checkout", etc. 2023 2024Note that in line 28 ":noremap" is used to avoid that any other mappings cause 2025trouble. Someone may have remapped ":call", for example. In line 24 we also 2026use ":noremap", but we do want "<SID>Add" to be remapped. This is why 2027"<script>" is used here. This only allows mappings which are local to the 2028script. |:map-<script>| The same is done in line 26 for ":noremenu". 2029|:menu-<script>| 2030 2031 2032<SID> AND <Plug> *using-<Plug>* 2033 2034Both <SID> and <Plug> are used to avoid that mappings of typed keys interfere 2035with mappings that are only to be used from other mappings. Note the 2036difference between using <SID> and <Plug>: 2037 2038<Plug> is visible outside of the script. It is used for mappings which the 2039 user might want to map a key sequence to. <Plug> is a special code 2040 that a typed key will never produce. 2041 To make it very unlikely that other plugins use the same sequence of 2042 characters, use this structure: <Plug> scriptname mapname 2043 In our example the scriptname is "Typecorr" and the mapname is "Add". 2044 This results in "<Plug>TypecorrAdd". Only the first character of 2045 scriptname and mapname is uppercase, so that we can see where mapname 2046 starts. 2047 2048<SID> is the script ID, a unique identifier for a script. 2049 Internally Vim translates <SID> to "<SNR>123_", where "123" can be any 2050 number. Thus a function "<SID>Add()" will have a name "<SNR>11_Add()" 2051 in one script, and "<SNR>22_Add()" in another. You can see this if 2052 you use the ":function" command to get a list of functions. The 2053 translation of <SID> in mappings is exactly the same, that's how you 2054 can call a script-local function from a mapping. 2055 2056 2057USER COMMAND 2058 2059Now let's add a user command to add a correction: > 2060 2061 38 if !exists(":Correct") 2062 39 command -nargs=1 Correct :call s:Add(<q-args>, 0) 2063 40 endif 2064 2065The user command is defined only if no command with the same name already 2066exists. Otherwise we would get an error here. Overriding the existing user 2067command with ":command!" is not a good idea, this would probably make the user 2068wonder why the command he defined himself doesn't work. |:command| 2069 2070 2071SCRIPT VARIABLES 2072 2073When a variable starts with "s:" it is a script variable. It can only be used 2074inside a script. Outside the script it's not visible. This avoids trouble 2075with using the same variable name in different scripts. The variables will be 2076kept as long as Vim is running. And the same variables are used when sourcing 2077the same script again. |s:var| 2078 2079The fun is that these variables can also be used in functions, autocommands 2080and user commands that are defined in the script. In our example we can add 2081a few lines to count the number of corrections: > 2082 2083 19 let s:count = 4 2084 .. 2085 30 function s:Add(from, correct) 2086 .. 2087 34 let s:count = s:count + 1 2088 35 echo s:count . " corrections now" 2089 36 endfunction 2090 2091First s:count is initialized to 4 in the script itself. When later the 2092s:Add() function is called, it increments s:count. It doesn't matter from 2093where the function was called, since it has been defined in the script, it 2094will use the local variables from this script. 2095 2096 2097THE RESULT 2098 2099Here is the resulting complete example: > 2100 2101 1 " Vim global plugin for correcting typing mistakes 2102 2 " Last Change: 2000 Oct 15 2103 3 " Maintainer: Bram Moolenaar <[email protected]> 2104 4 " License: This file is placed in the public domain. 2105 5 2106 6 if exists("g:loaded_typecorr") 2107 7 finish 2108 8 endif 2109 9 let g:loaded_typecorr = 1 2110 10 2111 11 let s:save_cpo = &cpo 2112 12 set cpo&vim 2113 13 2114 14 iabbrev teh the 2115 15 iabbrev otehr other 2116 16 iabbrev wnat want 2117 17 iabbrev synchronisation 2118 18 \ synchronization 2119 19 let s:count = 4 2120 20 2121 21 if !hasmapto('<Plug>TypecorrAdd') 2122 22 map <unique> <Leader>a <Plug>TypecorrAdd 2123 23 endif 2124 24 noremap <unique> <script> <Plug>TypecorrAdd <SID>Add 2125 25 2126 26 noremenu <script> Plugin.Add\ Correction <SID>Add 2127 27 2128 28 noremap <SID>Add :call <SID>Add(expand("<cword>"), 1)<CR> 2129 29 2130 30 function s:Add(from, correct) 2131 31 let to = input("type the correction for " . a:from . ": ") 2132 32 exe ":iabbrev " . a:from . " " . to 2133 33 if a:correct | exe "normal viws\<C-R>\" \b\e" | endif 2134 34 let s:count = s:count + 1 2135 35 echo s:count . " corrections now" 2136 36 endfunction 2137 37 2138 38 if !exists(":Correct") 2139 39 command -nargs=1 Correct :call s:Add(<q-args>, 0) 2140 40 endif 2141 41 2142 42 let &cpo = s:save_cpo 2143 43 unlet s:save_cpo 2144 2145Line 33 wasn't explained yet. It applies the new correction to the word under 2146the cursor. The |:normal| command is used to use the new abbreviation. Note 2147that mappings and abbreviations are expanded here, even though the function 2148was called from a mapping defined with ":noremap". 2149 2150Using "unix" for the 'fileformat' option is recommended. The Vim scripts will 2151then work everywhere. Scripts with 'fileformat' set to "dos" do not work on 2152Unix. Also see |:source_crnl|. To be sure it is set right, do this before 2153writing the file: > 2154 2155 :set fileformat=unix 2156 2157 2158DOCUMENTATION *write-local-help* 2159 2160It's a good idea to also write some documentation for your plugin. Especially 2161when its behavior can be changed by the user. See |add-local-help| for how 2162they are installed. 2163 2164Here is a simple example for a plugin help file, called "typecorr.txt": > 2165 2166 1 *typecorr.txt* Plugin for correcting typing mistakes 2167 2 2168 3 If you make typing mistakes, this plugin will have them corrected 2169 4 automatically. 2170 5 2171 6 There are currently only a few corrections. Add your own if you like. 2172 7 2173 8 Mappings: 2174 9 <Leader>a or <Plug>TypecorrAdd 2175 10 Add a correction for the word under the cursor. 2176 11 2177 12 Commands: 2178 13 :Correct {word} 2179 14 Add a correction for {word}. 2180 15 2181 16 *typecorr-settings* 2182 17 This plugin doesn't have any settings. 2183 2184The first line is actually the only one for which the format matters. It will 2185be extracted from the help file to be put in the "LOCAL ADDITIONS:" section of 2186help.txt |local-additions|. The first "*" must be in the first column of the 2187first line. After adding your help file do ":help" and check that the entries 2188line up nicely. 2189 2190You can add more tags inside ** in your help file. But be careful not to use 2191existing help tags. You would probably use the name of your plugin in most of 2192them, like "typecorr-settings" in the example. 2193 2194Using references to other parts of the help in || is recommended. This makes 2195it easy for the user to find associated help. 2196 2197 2198FILETYPE DETECTION *plugin-filetype* 2199 2200If your filetype is not already detected by Vim, you should create a filetype 2201detection snippet in a separate file. It is usually in the form of an 2202autocommand that sets the filetype when the file name matches a pattern. 2203Example: > 2204 2205 au BufNewFile,BufRead *.foo set filetype=foofoo 2206 2207Write this single-line file as "ftdetect/foofoo.vim" in the first directory 2208that appears in 'runtimepath'. For Unix that would be 2209"~/.vim/ftdetect/foofoo.vim". The convention is to use the name of the 2210filetype for the script name. 2211 2212You can make more complicated checks if you like, for example to inspect the 2213contents of the file to recognize the language. Also see |new-filetype|. 2214 2215 2216SUMMARY *plugin-special* 2217 2218Summary of special things to use in a plugin: 2219 2220s:name Variables local to the script. 2221 2222<SID> Script-ID, used for mappings and functions local to 2223 the script. 2224 2225hasmapto() Function to test if the user already defined a mapping 2226 for functionality the script offers. 2227 2228<Leader> Value of "mapleader", which the user defines as the 2229 keys that plugin mappings start with. 2230 2231:map <unique> Give a warning if a mapping already exists. 2232 2233:noremap <script> Use only mappings local to the script, not global 2234 mappings. 2235 2236exists(":Cmd") Check if a user command already exists. 2237 2238============================================================================== 2239*41.12* Writing a filetype plugin *write-filetype-plugin* *ftplugin* 2240 2241A filetype plugin is like a global plugin, except that it sets options and 2242defines mappings for the current buffer only. See |add-filetype-plugin| for 2243how this type of plugin is used. 2244 2245First read the section on global plugins above |41.11|. All that is said there 2246also applies to filetype plugins. There are a few extras, which are explained 2247here. The essential thing is that a filetype plugin should only have an 2248effect on the current buffer. 2249 2250 2251DISABLING 2252 2253If you are writing a filetype plugin to be used by many people, they need a 2254chance to disable loading it. Put this at the top of the plugin: > 2255 2256 " Only do this when not done yet for this buffer 2257 if exists("b:did_ftplugin") 2258 finish 2259 endif 2260 let b:did_ftplugin = 1 2261 2262This also needs to be used to avoid that the same plugin is executed twice for 2263the same buffer (happens when using an ":edit" command without arguments). 2264 2265Now users can disable loading the default plugin completely by making a 2266filetype plugin with only this line: > 2267 2268 let b:did_ftplugin = 1 2269 2270This does require that the filetype plugin directory comes before $VIMRUNTIME 2271in 'runtimepath'! 2272 2273If you do want to use the default plugin, but overrule one of the settings, 2274you can write the different setting in a script: > 2275 2276 setlocal textwidth=70 2277 2278Now write this in the "after" directory, so that it gets sourced after the 2279distributed "vim.vim" ftplugin |after-directory|. For Unix this would be 2280"~/.vim/after/ftplugin/vim.vim". Note that the default plugin will have set 2281"b:did_ftplugin", but it is ignored here. 2282 2283 2284OPTIONS 2285 2286To make sure the filetype plugin only affects the current buffer use the > 2287 2288 :setlocal 2289 2290command to set options. And only set options which are local to a buffer (see 2291the help for the option to check that). When using |:setlocal| for global 2292options or options local to a window, the value will change for many buffers, 2293and that is not what a filetype plugin should do. 2294 2295When an option has a value that is a list of flags or items, consider using 2296"+=" and "-=" to keep the existing value. Be aware that the user may have 2297changed an option value already. First resetting to the default value and 2298then changing it is often a good idea. Example: > 2299 2300 :setlocal formatoptions& formatoptions+=ro 2301 2302 2303MAPPINGS 2304 2305To make sure mappings will only work in the current buffer use the > 2306 2307 :map <buffer> 2308 2309command. This needs to be combined with the two-step mapping explained above. 2310An example of how to define functionality in a filetype plugin: > 2311 2312 if !hasmapto('<Plug>JavaImport') 2313 map <buffer> <unique> <LocalLeader>i <Plug>JavaImport 2314 endif 2315 noremap <buffer> <unique> <Plug>JavaImport oimport ""<Left><Esc> 2316 2317|hasmapto()| is used to check if the user has already defined a map to 2318<Plug>JavaImport. If not, then the filetype plugin defines the default 2319mapping. This starts with |<LocalLeader>|, which allows the user to select 2320the key(s) he wants filetype plugin mappings to start with. The default is a 2321backslash. 2322"<unique>" is used to give an error message if the mapping already exists or 2323overlaps with an existing mapping. 2324|:noremap| is used to avoid that any other mappings that the user has defined 2325interferes. You might want to use ":noremap <script>" to allow remapping 2326mappings defined in this script that start with <SID>. 2327 2328The user must have a chance to disable the mappings in a filetype plugin, 2329without disabling everything. Here is an example of how this is done for a 2330plugin for the mail filetype: > 2331 2332 " Add mappings, unless the user didn't want this. 2333 if !exists("no_plugin_maps") && !exists("no_mail_maps") 2334 " Quote text by inserting "> " 2335 if !hasmapto('<Plug>MailQuote') 2336 vmap <buffer> <LocalLeader>q <Plug>MailQuote 2337 nmap <buffer> <LocalLeader>q <Plug>MailQuote 2338 endif 2339 vnoremap <buffer> <Plug>MailQuote :s/^/> /<CR> 2340 nnoremap <buffer> <Plug>MailQuote :.,$s/^/> /<CR> 2341 endif 2342 2343Two global variables are used: 2344|no_plugin_maps| disables mappings for all filetype plugins 2345|no_mail_maps| disables mappings for the "mail" filetype 2346 2347 2348USER COMMANDS 2349 2350To add a user command for a specific file type, so that it can only be used in 2351one buffer, use the "-buffer" argument to |:command|. Example: > 2352 2353 :command -buffer Make make %:r.s 2354 2355 2356VARIABLES 2357 2358A filetype plugin will be sourced for each buffer of the type it's for. Local 2359script variables |s:var| will be shared between all invocations. Use local 2360buffer variables |b:var| if you want a variable specifically for one buffer. 2361 2362 2363FUNCTIONS 2364 2365When defining a function, this only needs to be done once. But the filetype 2366plugin will be sourced every time a file with this filetype will be opened. 2367This construct makes sure the function is only defined once: > 2368 2369 :if !exists("*s:Func") 2370 : function s:Func(arg) 2371 : ... 2372 : endfunction 2373 :endif 2374< 2375 2376UNDO *undo_indent* *undo_ftplugin* 2377 2378When the user does ":setfiletype xyz" the effect of the previous filetype 2379should be undone. Set the b:undo_ftplugin variable to the commands that will 2380undo the settings in your filetype plugin. Example: > 2381 2382 let b:undo_ftplugin = "setlocal fo< com< tw< commentstring<" 2383 \ . "| unlet b:match_ignorecase b:match_words b:match_skip" 2384 2385Using ":setlocal" with "<" after the option name resets the option to its 2386global value. That is mostly the best way to reset the option value. 2387 2388This does require removing the "C" flag from 'cpoptions' to allow line 2389continuation, as mentioned above |use-cpo-save|. 2390 2391For undoing the effect of an indent script, the b:undo_indent variable should 2392be set accordingly. 2393 2394 2395FILE NAME 2396 2397The filetype must be included in the file name |ftplugin-name|. Use one of 2398these three forms: 2399 2400 .../ftplugin/stuff.vim 2401 .../ftplugin/stuff_foo.vim 2402 .../ftplugin/stuff/bar.vim 2403 2404"stuff" is the filetype, "foo" and "bar" are arbitrary names. 2405 2406 2407SUMMARY *ftplugin-special* 2408 2409Summary of special things to use in a filetype plugin: 2410 2411<LocalLeader> Value of "maplocalleader", which the user defines as 2412 the keys that filetype plugin mappings start with. 2413 2414:map <buffer> Define a mapping local to the buffer. 2415 2416:noremap <script> Only remap mappings defined in this script that start 2417 with <SID>. 2418 2419:setlocal Set an option for the current buffer only. 2420 2421:command -buffer Define a user command local to the buffer. 2422 2423exists("*s:Func") Check if a function was already defined. 2424 2425Also see |plugin-special|, the special things used for all plugins. 2426 2427============================================================================== 2428*41.13* Writing a compiler plugin *write-compiler-plugin* 2429 2430A compiler plugin sets options for use with a specific compiler. The user can 2431load it with the |:compiler| command. The main use is to set the 2432'errorformat' and 'makeprg' options. 2433 2434Easiest is to have a look at examples. This command will edit all the default 2435compiler plugins: > 2436 2437 :next $VIMRUNTIME/compiler/*.vim 2438 2439Use |:next| to go to the next plugin file. 2440 2441There are two special items about these files. First is a mechanism to allow 2442a user to overrule or add to the default file. The default files start with: > 2443 2444 :if exists("current_compiler") 2445 : finish 2446 :endif 2447 :let current_compiler = "mine" 2448 2449When you write a compiler file and put it in your personal runtime directory 2450(e.g., ~/.vim/compiler for Unix), you set the "current_compiler" variable to 2451make the default file skip the settings. 2452 *:CompilerSet* 2453The second mechanism is to use ":set" for ":compiler!" and ":setlocal" for 2454":compiler". Vim defines the ":CompilerSet" user command for this. However, 2455older Vim versions don't, thus your plugin should define it then. This is an 2456example: > 2457 2458 if exists(":CompilerSet") != 2 2459 command -nargs=* CompilerSet setlocal <args> 2460 endif 2461 CompilerSet errorformat& " use the default 'errorformat' 2462 CompilerSet makeprg=nmake 2463 2464When you write a compiler plugin for the Vim distribution or for a system-wide 2465runtime directory, use the mechanism mentioned above. When 2466"current_compiler" was already set by a user plugin nothing will be done. 2467 2468When you write a compiler plugin to overrule settings from a default plugin, 2469don't check "current_compiler". This plugin is supposed to be loaded 2470last, thus it should be in a directory at the end of 'runtimepath'. For Unix 2471that could be ~/.vim/after/compiler. 2472 2473============================================================================== 2474*41.14* Writing a plugin that loads quickly *write-plugin-quickload* 2475 2476A plugin may grow and become quite long. The startup delay may become 2477noticeable, while you hardly ever use the plugin. Then it's time for a 2478quickload plugin. 2479 2480The basic idea is that the plugin is loaded twice. The first time user 2481commands and mappings are defined that offer the functionality. The second 2482time the functions that implement the functionality are defined. 2483 2484It may sound surprising that quickload means loading a script twice. What we 2485mean is that it loads quickly the first time, postponing the bulk of the 2486script to the second time, which only happens when you actually use it. When 2487you always use the functionality it actually gets slower! 2488 2489Note that since Vim 7 there is an alternative: use the |autoload| 2490functionality |41.15|. 2491 2492The following example shows how it's done: > 2493 2494 " Vim global plugin for demonstrating quick loading 2495 " Last Change: 2005 Feb 25 2496 " Maintainer: Bram Moolenaar <[email protected]> 2497 " License: This file is placed in the public domain. 2498 2499 if !exists("s:did_load") 2500 command -nargs=* BNRead call BufNetRead(<f-args>) 2501 map <F19> :call BufNetWrite('something')<CR> 2502 2503 let s:did_load = 1 2504 exe 'au FuncUndefined BufNet* source ' . expand('<sfile>') 2505 finish 2506 endif 2507 2508 function BufNetRead(...) 2509 echo 'BufNetRead(' . string(a:000) . ')' 2510 " read functionality here 2511 endfunction 2512 2513 function BufNetWrite(...) 2514 echo 'BufNetWrite(' . string(a:000) . ')' 2515 " write functionality here 2516 endfunction 2517 2518When the script is first loaded "s:did_load" is not set. The commands between 2519the "if" and "endif" will be executed. This ends in a |:finish| command, thus 2520the rest of the script is not executed. 2521 2522The second time the script is loaded "s:did_load" exists and the commands 2523after the "endif" are executed. This defines the (possible long) 2524BufNetRead() and BufNetWrite() functions. 2525 2526If you drop this script in your plugin directory Vim will execute it on 2527startup. This is the sequence of events that happens: 2528 25291. The "BNRead" command is defined and the <F19> key is mapped when the script 2530 is sourced at startup. A |FuncUndefined| autocommand is defined. The 2531 ":finish" command causes the script to terminate early. 2532 25332. The user types the BNRead command or presses the <F19> key. The 2534 BufNetRead() or BufNetWrite() function will be called. 2535 25363. Vim can't find the function and triggers the |FuncUndefined| autocommand 2537 event. Since the pattern "BufNet*" matches the invoked function, the 2538 command "source fname" will be executed. "fname" will be equal to the name 2539 of the script, no matter where it is located, because it comes from 2540 expanding "<sfile>" (see |expand()|). 2541 25424. The script is sourced again, the "s:did_load" variable exists and the 2543 functions are defined. 2544 2545Notice that the functions that are loaded afterwards match the pattern in the 2546|FuncUndefined| autocommand. You must make sure that no other plugin defines 2547functions that match this pattern. 2548 2549============================================================================== 2550*41.15* Writing library scripts *write-library-script* 2551 2552Some functionality will be required in several places. When this becomes more 2553than a few lines you will want to put it in one script and use it from many 2554scripts. We will call that one script a library script. 2555 2556Manually loading a library script is possible, so long as you avoid loading it 2557when it's already done. You can do this with the |exists()| function. 2558Example: > 2559 2560 if !exists('*MyLibFunction') 2561 runtime library/mylibscript.vim 2562 endif 2563 call MyLibFunction(arg) 2564 2565Here you need to know that MyLibFunction() is defined in a script 2566"library/mylibscript.vim" in one of the directories in 'runtimepath'. 2567 2568To make this a bit simpler Vim offers the autoload mechanism. Then the 2569example looks like this: > 2570 2571 call mylib#myfunction(arg) 2572 2573That's a lot simpler, isn't it? Vim will recognize the function name and when 2574it's not defined search for the script "autoload/mylib.vim" in 'runtimepath'. 2575That script must define the "mylib#myfunction()" function. 2576 2577You can put many other functions in the mylib.vim script, you are free to 2578organize your functions in library scripts. But you must use function names 2579where the part before the '#' matches the script name. Otherwise Vim would 2580not know what script to load. 2581 2582If you get really enthusiastic and write lots of library scripts, you may 2583want to use subdirectories. Example: > 2584 2585 call netlib#ftp#read('somefile') 2586 2587For Unix the library script used for this could be: 2588 2589 ~/.vim/autoload/netlib/ftp.vim 2590 2591Where the function is defined like this: > 2592 2593 function netlib#ftp#read(fname) 2594 " Read the file fname through ftp 2595 endfunction 2596 2597Notice that the name the function is defined with is exactly the same as the 2598name used for calling the function. And the part before the last '#' 2599exactly matches the subdirectory and script name. 2600 2601You can use the same mechanism for variables: > 2602 2603 let weekdays = dutch#weekdays 2604 2605This will load the script "autoload/dutch.vim", which should contain something 2606like: > 2607 2608 let dutch#weekdays = ['zondag', 'maandag', 'dinsdag', 'woensdag', 2609 \ 'donderdag', 'vrijdag', 'zaterdag'] 2610 2611Further reading: |autoload|. 2612 2613============================================================================== 2614*41.16* Distributing Vim scripts *distribute-script* 2615 2616Vim users will look for scripts on the Vim website: http://www.vim.org. 2617If you made something that is useful for others, share it! 2618 2619Vim scripts can be used on any system. There might not be a tar or gzip 2620command. If you want to pack files together and/or compress them the "zip" 2621utility is recommended. 2622 2623For utmost portability use Vim itself to pack scripts together. This can be 2624done with the Vimball utility. See |vimball|. 2625 2626It's good if you add a line to allow automatic updating. See |glvs-plugins|. 2627 2628============================================================================== 2629 2630Next chapter: |usr_42.txt| Add new menus 2631 2632Copyright: see |manual-copyright| vim:tw=78:ts=8:noet:ft=help:norl: 2633