annotate runtime/doc/usr_41.txt @ 0:76efa0be13f1

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