• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1<?xml version = '1.0'?>
2<?xml-stylesheet type="text/xsl" href="styleguide.xsl"?>
3<GUIDE title="Google Vimscript Style Guide">
4  <p class="revision">
5
6    Revision 1.1
7  </p>
8
9
10  <address>
11    Nate Soares<br/>
12    Joshua Hoak<br/>
13    David Barnett<br/>
14  </address>
15
16  <OVERVIEW>
17    <CATEGORY title="Background">
18      <p>
19        This is a casual version of the vimscript style guide, because
20        vimscript is a casual language. When submitting vim plugin code, you
21        must adhere to these rules. For clarifications, justifications, and
22        explanations about the finer points of vimscript, please refer to the
23        <a href="vimscriptfull.xml">heavy guide</a>.
24      </p>
25    </CATEGORY>
26  </OVERVIEW>
27
28  <CATEGORY title="Portability">
29    <p>
30      It's hard to get vimscript right. Many commands depend upon the user's
31      settings. By following these guidelines, you can hope to make your
32      scripts portable.
33    </p>
34    <STYLEPOINT title="Strings">
35      <SUMMARY>Prefer single quoted strings</SUMMARY>
36      <BODY>
37        <p>
38          Double quoted strings are semantically different in vimscript, and
39          you probably don't want them (they break regexes).
40        </p>
41        <p>
42          Use double quoted strings when you need an escape sequence (such as
43          <code>"\n"</code>) or if you know it doesn't matter and you need to
44          embed single quotes.
45        </p>
46      </BODY>
47    </STYLEPOINT>
48    <STYLEPOINT title="Matching Strings">
49      <SUMMARY>
50        Use the <code>=~#</code> or <code>=~?</code> operator families over the
51        <code>=~</code> family.
52      </SUMMARY>
53      <BODY>
54        <p>
55          The matching behavior depends upon the user's ignorecase and smartcase
56          settings and on whether you compare them with the <code>=~</code>,
57          <code>=~#</code>, or <code>=~?</code> family of operators. Use the
58          <code>=~#</code> and <code>=~?</code> operator families explicitly
59          when comparing strings unless you explicitly need to honor the user's
60          case sensitivity settings.
61        </p>
62      </BODY>
63    </STYLEPOINT>
64    <STYLEPOINT title="Regular Expressions">
65      <SUMMARY>Prefix all regexes with <code>\m\C</code>.</SUMMARY>
66      <BODY>
67        <p>
68          In addition to the case sensitivity settings, regex behavior depends
69          upon the user's nomagic setting. To make regexes act like nomagic and
70          noignorecase are set, prepend all regexes with <code>\m\C</code>.
71        </p>
72        <p>
73          You are welcome to use other magic levels (<code>\v</code>) and case
74          sensitivities (<code>\c</code>) so long as they are intentional and
75          explicit.
76        </p>
77      </BODY>
78    </STYLEPOINT>
79    <STYLEPOINT title="Dangerous commands">
80      <SUMMARY>Avoid commands with unintended side effects.</SUMMARY>
81      <BODY>
82        <p>
83          Avoid using <code>:s[ubstitute]</code> as it moves the cursor and
84          prints error messages. Prefer functions (such as
85          <code>search()</code>) better suited to scripts.
86        </p>
87        <p>
88          For many vim commands, functions exist that do the same thing with
89          fewer side effects. See <code>:help functions()</code> for a list of
90          built-in functions.
91        </p>
92      </BODY>
93    </STYLEPOINT>
94    <STYLEPOINT title="Fragile commands">
95      <SUMMARY>Avoid commands that rely on user settings.</SUMMARY>
96      <BODY>
97        <p>
98          Always use <code>normal!</code> instead of <code>normal</code>. The
99          latter depends upon the user's key mappings and could do anything.
100        </p>
101        <p>
102          Avoid <code>:s[ubstitute]</code>, as its behavior depends upon a
103          number of local settings.
104        </p>
105        <p>
106          The same applies to other commands not listed here.
107        </p>
108      </BODY>
109    </STYLEPOINT>
110    <STYLEPOINT title="Catching Exceptions">
111      <SUMMARY>Match error codes, not error text.</SUMMARY>
112      <BODY>
113        <p>Error text may be locale dependant.</p>
114      </BODY>
115    </STYLEPOINT>
116  </CATEGORY>
117
118  <CATEGORY title="General Guidelines">
119
120
121    <STYLEPOINT title="Messaging">
122      <SUMMARY>Message the user infrequently.</SUMMARY>
123      <BODY>
124        <p>
125          Loud scripts are annoying. Message the user only when:
126          <ul>
127            <li>A long-running process has kicked off.</li>
128            <li>An error has occurred.</li>
129          </ul>
130        </p>
131      </BODY>
132    </STYLEPOINT>
133    <STYLEPOINT title="Type checking">
134      <SUMMARY>Use strict and explicit checks where possible.</SUMMARY>
135      <BODY>
136        <p>
137          Vimscript has unsafe, unintuitive behavior when dealing with some
138          types. For instance, <code>0 == 'foo'</code> evaluates to true.
139        </p>
140        <p>
141          Use strict comparison operators where possible. When comparing against
142          a string literal, use the <code>is#</code> operator. Otherwise, prefer
143          <code>maktaba#value#IsEqual</code> or check <code>type()</code>
144          explicitly.
145        </p>
146        <p>
147          Check variable types explicitly before using them. Use functions from
148          <code>maktaba#ensure</code>, or check <code>maktaba#value</code> or
149          <code>type()</code> and throw your own errors.
150        </p>
151        <p>
152          Use <code>:unlet</code> for variables that may change types,
153          particularly those assigned inside loops.
154        </p>
155      </BODY>
156    </STYLEPOINT>
157    <STYLEPOINT title="Python">
158      <SUMMARY>Use sparingly.</SUMMARY>
159      <BODY>
160        <p>
161          Use python only when it provides critical functionality, for example
162          when writing threaded code.
163        </p>
164      </BODY>
165    </STYLEPOINT>
166    <STYLEPOINT title="Other Languages">
167      <SUMMARY>Use vimscript instead.</SUMMARY>
168      <BODY>
169        <p>
170          Avoid using other scripting languages such as ruby and lua. We can
171          not guarantee that the end user's vim has been compiled with support
172          for non-vimscript languages.
173        </p>
174      </BODY>
175    </STYLEPOINT>
176    <STYLEPOINT title="Boilerplate">
177      <SUMMARY>
178        Use <a href="https://github.com/google/maktaba">maktaba</a>.
179      </SUMMARY>
180      <BODY>
181        <p>
182          maktaba removes boilerplate, including:
183          <ul>
184            <li>Plugin creation</li>
185            <li>Error handling</li>
186            <li>Dependency checking</li>
187          </ul>
188        </p>
189      </BODY>
190    </STYLEPOINT>
191    <STYLEPOINT title="Plugin layout">
192      <SUMMARY>Organize functionality into modular plugins</SUMMARY>
193      <BODY>
194        <p>
195          Group your functionality as a plugin, unified in one directory (or
196          code repository) which shares your plugin's name (with a "vim-" prefix
197          or ".vim" suffix if desired). It should be split into plugin/,
198          autoload/, etc. subdirectories as necessary, and it should declare
199          metadata in the addon-info.json format (see the
200          <a href="https://github.com/MarcWeber/vim-addon-manager/blob/master/doc/vim-addon-manager-additional-documentation.txt">VAM documentation</a> for details).
201        </p>
202      </BODY>
203    </STYLEPOINT>
204    <STYLEPOINT title="Functions">
205      <SUMMARY>
206        In the autoload/ directory, defined with <code>[!]</code> and
207        <code>[abort]</code>.
208      </SUMMARY>
209      <BODY>
210        <p>
211          Autoloading allows functions to be loaded on demand, which makes
212          startuptime faster and enforces function namespacing.
213        </p>
214        <p>
215          Script-local functions are welcome, but should also live in autoload/
216          and be called by autoloaded functions.
217        </p>
218        <p>
219          Non-library plugins should expose commands instead of functions.
220          Command logic should be extracted into functions and autoloaded.
221        </p>
222        <p>
223          <code>[!]</code> allows developers to reload their functions
224          without complaint.
225        </p>
226        <p>
227          <code>[abort]</code> forces the function to halt when it encounters
228          an error.
229        </p>
230      </BODY>
231    </STYLEPOINT>
232    <STYLEPOINT title="Commands">
233      <SUMMARY>
234        In the plugin/commands.vim or under the ftplugin/ directory, defined
235        without <code>[!]</code>.
236      </SUMMARY>
237      <BODY>
238        <p>
239          General commands go in <code>plugin/commands.vim</code>.
240          Filetype-specific commands go in <code>ftplugin/</code>.
241        </p>
242        <p>
243          Excluding <code>[!]</code> prevents your plugin from silently
244          clobbering existing commands.  Command conflicts should be resolved by
245          the user.
246        </p>
247      </BODY>
248    </STYLEPOINT>
249    <STYLEPOINT title="Autocommands">
250      <SUMMARY>
251        Place them in plugin/autocmds.vim, within augroups.
252      </SUMMARY>
253      <BODY>
254        <p>
255          Place all autocommands in augroups.
256        </p>
257        <p>
258          The augroup name should be unique. It should either be, or be prefixed
259          with, the plugin name.
260        </p>
261        <p>
262          Clear the augroup with <code>autocmd!</code> before defining new
263          autocommands in the augroup. This makes your plugin re-entrable.
264        </p>
265      </BODY>
266    </STYLEPOINT>
267    <STYLEPOINT title="Mappings">
268      <SUMMARY>
269        Place them in <code>plugin/mappings.vim</code>, using
270        <code>maktaba#plugin#MapPrefix</code> to get a prefix.
271      </SUMMARY>
272      <BODY>
273        <p>
274          All key mappings should be defined in
275          <code>plugin/mappings.vim</code>.
276        </p>
277        <p>
278          Partial mappings (see :help using-&lt;Plug&gt;.) should be defined in
279          <code>plugin/plugs.vim</code>.
280        </p>
281      </BODY>
282    </STYLEPOINT>
283    <STYLEPOINT title="Settings">
284      <SUMMARY>Change settings locally</SUMMARY>
285      <BODY>
286        <p>
287          Use <code>:setlocal</code> and <code>&amp;l:</code> instead of
288          <code>:set</code> and <code>&amp;</code> unless you have explicit
289          reason to do otherwise.
290        </p>
291      </BODY>
292    </STYLEPOINT>
293  </CATEGORY>
294
295  <CATEGORY title="Style">
296    <p>
297      Follow google style conventions. When in doubt, treat vimscript style
298      like python style.
299    </p>
300
301    <STYLEPOINT title="Whitespace">
302      <SUMMARY>
303        Similar to python.
304
305        <br/>
306        <br/>
307      </SUMMARY>
308      <BODY>
309        <ul>
310          <li>Use two spaces for indents</li>
311          <li>Do not use tabs</li>
312          <li>Use spaces around operators
313            <p>This does not apply to arguments to commands.</p>
314            <CODE_SNIPPET>
315              let s:variable = "concatenated " . "strings"
316              command -range=% MyCommand
317            </CODE_SNIPPET>
318          </li>
319          <li>Do not introduce trailing whitespace
320            <p>You need not go out of your way to remove it.</p>
321            <p>
322              Trailing whitespace is allowed in mappings which prep commands
323              for user input, such as
324              "<code>noremap &lt;leader&gt;gf :grep -f </code>".
325            </p>
326          </li>
327          <li>Restrict lines to 80 columns wide</li>
328          <li>Indent continued lines by four spaces</li>
329          <li>Do not align arguments of commands
330            <BAD_CODE_SNIPPET>
331              command -bang MyCommand  call myplugin#foo()
332              command       MyCommand2 call myplugin#bar()
333            </BAD_CODE_SNIPPET>
334            <CODE_SNIPPET>
335              command -bang MyCommand call myplugin#foo()
336              command MyCommand2 call myplugin#bar()
337            </CODE_SNIPPET>
338          </li>
339        </ul>
340      </BODY>
341    </STYLEPOINT>
342
343    <STYLEPOINT title="Naming">
344      <SUMMARY>
345        <p>
346          In general, use
347          <code>plugin-names-like-this</code>,
348          <code>FunctionNamesLikeThis</code>,
349          <code>CommandNamesLikeThis</code>,
350          <code>augroup_names_like_this</code>,
351          <code>variable_names_like_this</code>.
352        </p>
353        <p>Always prefix variables with their scope.</p>
354      </SUMMARY>
355      <BODY>
356        <SUBSECTION title="plugin-names-like-this">
357          <p>Keep them short and sweet.</p>
358
359        </SUBSECTION>
360        <SUBSECTION title="FunctionNamesLikeThis">
361          <p>Prefix script-local functions with <code>s:</code></p>
362          <p>Autoloaded functions may not have a scope prefix.</p>
363          <p>
364            Do not create global functions. Use autoloaded functions
365            instead.
366          </p>
367        </SUBSECTION>
368        <SUBSECTION title="CommandNamesLikeThis">
369          <p>Prefer succinct command names over common command prefixes.</p>
370        </SUBSECTION>
371        <SUBSECTION title="variable_names_like_this">
372          <p>Augroup names count as variables for naming purposes.</p>
373        </SUBSECTION>
374        <SUBSECTION title="Prefix all variables with their scope.">
375          <ul>
376            <li>Global variables with <code>g:</code></li>
377            <li>Script-local variables with <code>s:</code></li>
378            <li>Function arguments with <code>a:</code></li>
379            <li>Function-local variables with <code>l:</code></li>
380            <li>Vim-predefined variables with <code>v:</code></li>
381            <li>Buffer-local variables with <code>b:</code></li>
382          </ul>
383          <p>
384            <code>g:</code>, <code>s:</code>, and <code>a:</code> must always
385            be used.
386          </p>
387          <p>
388            <code>b:</code> changes the variable semantics; use it when you
389            want buffer-local semantics.
390          </p>
391          <p>
392            <code>l:</code> and <code>v:</code> should be used for consistency,
393            future proofing, and to avoid subtle bugs. They are not strictly
394            required. Add them in new code but don’t go out of your way to add
395            them elsewhere.
396          </p>
397        </SUBSECTION>
398      </BODY>
399    </STYLEPOINT>
400  </CATEGORY>
401
402  <p align="right">
403    Revision 1.1
404  </p>
405
406
407  <address>
408    Nate Soares<br/>
409    Joshua Hoak<br/>
410    David Barnett<br/>
411  </address>
412</GUIDE>
413