blob: fa7e3439382ae608e12b73ba72147bae56eeca82 [file] [log] [blame]
dbarnett@google.com4882d602014-04-12 06:08:42 +00001<?xml version = '1.0'?>
2<?xml-stylesheet type="text/xsl" href="styleguide.xsl"?>
3<GUIDE title="Google Vimscript 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 the in-depth vimscript guide. If you're just a casual user
20 looking to write a plugin, the
21 <a href="vimscriptguide.html">abbreviated style guide</a> is for you.
22 </p>
23 <p>
24 This rather rotund guide dives into justifications and clarifications.
25 It provides an idealized set of rules that are rather too draconian to
26 push on casual scripters.
27 </p>
28
29 <p>
30 It's for users who want to know why certain decisions were made in the
31 abbreviated guide and who want to learn a thing or two about using
32 vimscript safely.
33 </p>
34 <p>
35 Fair warning: Vimscript is a maddening abyss. When you gaze into it, it
36 gazes also into you. Proceed with caution.
37 </p>
38 </CATEGORY>
39 </OVERVIEW>
40
41 <CATEGORY title="Portability">
42 <p>
43 Vim is highly configurable. Users can change many of the default
44 settings, including the case sensitivity, the regular expression rules,
45 the substitution rules, and more. In order for your vimscript to work
46 for all users, follow these guidelines:
47 </p>
48 <ul>
49 <li>
50 Always prefix regular expressions with one of <code>\m</code>,
51 <code>\v</code>, <code>\M</code>, or <code>\V</code> (prefer
52 tersity)
53 <ul>
54 <li>
55 Users can change the global "magic level" of regular expressions.
56 This changes how atoms are parsed in regular expressions,
57 including <code>.</code>, <code>*</code>, and <code>{</code>.
58 </li>
59 <li>
60 Even if your regular expression does not contain characters which
61 are affected by the <code>magic</code> setting you must prefix it
62 with one of the magic control atoms. This future-proofs your
63 regular expression against other devs modifying it and forgetting
64 to add the control atom.
65 </li>
66 <li>
67 If you have no opinion about what type of regular expression to
68 use, prefer the one which makes your regular expression most
69 concise.
70 </li>
71 </ul>
72 </li>
73 <li>
74 Avoid using <code>:s[ubstitute]</code> in scripts.
75 <ul>
76 <li>
77 <code>:substitute</code> moves the cursor.
78 </li>
79 <li>
80 <code>:substitute</code> outputs an error message when the match
81 does not exist.
82 </li>
83 <li>
84 The meaning of the <code>g</code> flag depends upon the
85 <code>gdefault</code> setting. If you do use
86 <code>:substitute</code> you must save <code>gdefault</code>, set
87 it to <code>0</code> or <code>1</code>, perform the substitution,
88 and then restore it.
89 </li>
90 <li>
91 Script authors who want a safe way to replace text in the buffer
92 are encouraged to use <code>maktaba#buffer#Replace</code>.
93 </li>
94 </ul>
95 </li>
96 <li>
97 Always use case-explicit operators for strings (<code>=~#</code> and
98 <code>=~?</code>, never <code>=~</code>).
99 <ul>
100 <li>
101 This also applies to <code>!~ == != &gt; &gt;= &lt;</code> and
102 <code>&lt;=</code>
103 </li>
104 <li>
105 This only applies for strings. <code>==</code> and
106 <code>&gt;=</code> are fine for numbers, but <code>==#</code> and
107 <code>&gt;=#</code> must be used for strings.
108 </li>
109 <li>
110 The behavior of <code>=~</code> and friends is dependant upon the
111 <code>ignorecase</code> setting.
112 </li>
113 <li>
114 You may break this rule when you explicitly want to obey the
115 user's <code>ignorecase</code> setting. Be prepared to justify
116 your reasoning.
117 </li>
118 </ul>
119 </li>
120 <li>
121 When using regular expressions as arguments to functions, prepend them
122 with <code>\c</code> or <code>\C</code>.
123 <ul>
124 <li>
125 This forces case to be either explicitly matched or ignored.
126 </li>
127 <li>
128 This is recommended, but not required, when comparing regexes with
129 operators that specify case sensitivity (<code>=~#</code>, etc.).
130 </li>
131 <li>
132 This rule applies when your regexes are matching syntax, external
133 APIs, external messages, and most other cases.
134 </li>
135 <li>
136 It does not apply when matching text in the buffer. When matching
137 text in the buffer you should honor the <code>ignorecase</code>
138 setting.
139 </li>
140 <li>
141 You may also ignore this rule any time that you explicitly want to
142 honor the <code>ignorecase</code> setting. Be prepared to justify
143 your reasoning.
144 </li>
145 </ul>
146 </li>
147 <li>
148 Always use <code>normal!</code> instead of <code>normal</code>.
149 <ul>
150 <li>
151 If you forgo the <code>!</code> the command will use the user's
152 key mappings and you have literally no idea what your macro will
153 do.
154 </li>
155 </ul>
156 </li>
157 <li>
158 Always use the <code>noremap</code> family of commands.
159 <ul>
160 <li>
161 Your plugins generally shouldn't introduce mappings, but if they
162 do, the <code>map</code> command respects the users existing
163 mappings and could do anything.
164 </li>
165 </ul>
166 </li>
167 <li>
168 When using <code>catch</code>, match the error code rather than the
169 error text.
170 <ul>
171 <li>
172 The error text may be locale-dependant.
173 </li>
174 <li>
175 See <code>:help error-messages</code>.
176 </li>
177 </ul>
178 </li>
179 </ul>
180 <p>
181 In general, guard all commands and functions against user settings.
182 </p>
183
184 </CATEGORY>
185 <CATEGORY title="Language Guide">
186 <ul>
187
188
189 <li>
190 Line continuations: <strong>Yes</strong>
191 <ul>
192
193 <li>
194 Plugins that support vi compatibility mode must save and restore
195 compatibility options as described in the
196 <strong>Errata section</strong> so line continuations work properly.
197 </li>
198 </ul>
199 </li>
200 <li>
201 Exceptions: <strong>Yes, with caution</strong>
202 <ul>
203 <li>
204 Always use an error code in thrown exception messages.
205 </li>
206 <li>
207 Prefer the <code>maktaba#error</code> codes found in
208 <code>maktaba</code>.
209 </li>
210 <li>
211 Fall back to the vim error codes. See
212 <code>:help error-messages</code>.
213 </li>
214 <li>
215 Generate custom error messages using
216 <code>maktaba#error#Message</code>.
217 </li>
218 </ul>
219 </li>
220 <li>
221 Global Variables: <strong>As configuration only</strong>
222 <ul>
223 <li>
224 See the plugin guide.
225 </li>
226 </ul>
227 </li>
228 <li>
229 Messaging: <strong>As little as possible.</strong>
230 <ul>
231 <li>
232 Loud scripts are annoying.
233 </li>
234 <li>
235 Message the user when an error has occured.
236 </li>
237 <li>
238 Message the user when an operation which takes a long time has
239 begun work.
240 </li>
241 <li>
242 Avoid messaging otherwise.
243 </li>
244 </ul>
245 </li>
246 <li>
247 Type checking:
248 <strong>Use strict and explicit checks where possible.</strong>
249 <ul>
250 <li>
251 Vimscript has unsafe, unintuitive behavior when dealing with some
252 types. For instance, <code>0 == 'foo'</code> evaluates to true.
253 </li>
254 <li>
255 Use strict comparison operators where possible. When comparing
256 against a string literal, use the <code>is#</code> operator.
257 Otherwise, prefer <code>maktaba#value#IsEqual</code> or check
258 <code>type()</code> explicitly.
259 </li>
260 <li>
261 Check variable types explicitly before using them. Use functions
262 from <code>maktaba#ensure</code>, or check
263 <code>maktaba#value</code> or <code>type()</code> and throw your own
264 errors.
265 </li>
266 <li>
267 Use <code>:unlet</code> for variables that may change types,
268 particularly those assigned inside loops.
269 </li>
270 </ul>
271 </li>
272 <li>
273 FuncRefs: <strong>No in most cases.</strong>
274 <ul>
275 <li>
276 FuncRefs have inconsistently enforced naming restrictions.
277 (Functions can have names that FuncRefs can not.)
278 </li>
279 <li>
280 FuncRefs have inconsistent ability to be reassigned (in Vim
281 7.2 and before you must unlet a FuncRef before assigning it).
282 </li>
283 <li>
284 In most instances where a FuncRef is needed a string works
285 just as well: just pass the string that you would use to make
286 the FuncRef.
287 </li>
288 <li>
289 Consider using <code>maktaba#function</code> instead to create and
290 manipulate handles to functions.
291 </li>
292 </ul>
293 </li>
294 <li>
295 Python: <strong>Sparingly</strong>
296 <ul>
297
298 <li>
299 Hurts code reuse since python code embedded in python plugins is
300 awkward to share between plugins.
301 </li>
302 <li>
303 Using python introduces python language version dependencies, which
304 are likely to get stale.
305 </li>
306 <li>
307 Exception: It's reasonable to use python for plugin functionality
308 that needs to do work in the background, as vimscript can not do
309 this.
310 </li>
311 </ul>
312 </li>
313 <li>
314 Ruby: <strong>No</strong>
315 <ul>
316 <li>
317 We can not assume ruby interoperability.
318 </li>
319 <li>
320 You shouldn't depend upon the version of the ruby language that the
321 user has installed.
322 </li>
323 </ul>
324 </li>
325 <li>
326 Lua: <strong>No</strong>
327 <ul>
328 <li>
329 For the same reasons an Ruby.
330 </li>
331 </ul>
332 </li>
333 <li>
334 Dict Functions: <strong>Encouraged</strong>
335 <ul>
336 <li>
337 Vimscript can attach functions to dictionaries. Such functions
338 have access to the <code>self</code> parameter which access
339 the dict state.
340 </li>
341 <li>
342 Use these where you would use a class in python.
343 </li>
344 <li>
345 Do not over-use this feature; it is not necessary for helper
346 functions or API functions, only for encapsulated objects.
347 </li>
348 </ul>
349 </li>
350 </ul>
351 <p>
352 All other language features are fair game.
353 </p>
354 </CATEGORY>
355 <CATEGORY title="Structure">
356 <ul>
357 <li>
358 Provided functionality should be packed into modular plugins.
359 <ul>
360 <li>
361 Every function in your plugin should be specific to your
362 plugin.
363 </li>
364 <li>
365 General utility functions should be abstracted into library plugins.
366 </li>
367 <li>
368 Manage dependencies with <code>maktaba</code>.
369 </li>
370 </ul>
371 </li>
372 <li>
373 <code>plugin-names-like-this</code>
374 <ul>
375 <li>
376 Plugin names should be descriptive and concise.
377 </li>
378
379
380 </ul>
381 </li>
382 <li>
383 Each plugin must consist of one directory (or code repository), sharing
384 a name with the plugin (with a "vim-" prefix or ".vim" suffix if
385 desired).
386 </li>
387 <li>
388 Plugin metadata should be declared in the addon-info.json format (see
Ackermann Yuriyacb4f902016-04-01 21:36:44 +1300389 the <a href="https://github.com/MarcWeber/vim-addon-manager/blob/master/doc/vim-addon-manager-additional-documentation.txt">VAM documentation</a> for details).
dbarnett@google.com4882d602014-04-12 06:08:42 +0000390 </li>
391 <li>
392 Functions should go in the <code>autoload/</code> subdirectory of
393 your plugin.
394 <ul>
395 <li>
396 This allows them to be late-loaded, which speeds up startup
397 time.
398 </li>
399 <li>
400 This helps vim enforce namespacing conventions.
401 </li>
402 </ul>
403 </li>
404 <li>
405 Each file in the <code>plugin/</code> or <code>instant/</code> directory
406 should begin with the boilerplate
407 <CODE_SNIPPET>
408 let [s:plugin, s:enter] = maktaba#plugin#Enter(expand('&lt;sfile&gt;:p'))
409 if !s:enter
410 finish
411 endif
412 </CODE_SNIPPET>
413 (This prevents re-entry and allows users to selectively disable
414 functionality.)
415 </li>
416 <li>
417 User configuration should be via plugin flags defined in
418 <code>instant/flags.vim</code>.
419 <ul>
420 <li>
421 Define flags with
422 <code>call s:plugin.Flag('FLAGNAME', DEFAULT_VALUE)</code>.
423 </li>
424 <li>
425 Users can configure these flags using the <code>:Glaive</code>
426 command (see <a href="https://github.com/google/glaive">glaive</a>).
427 </li>
428 </ul>
429 </li>
430 <li>
431 Commands, autocommands, mappings, and settings changes should
432 occur either in the <code>plugin/</code> or the
433 <code>ftplugin/</code> subdirectories.
434 <ul>
435 <li>
436 All commands should be defined in <code>plugin/commands.vim</code>
437 or <code>ftplugin/</code> files.
438 </li>
439 <li>
440 Autocommands should be defined in <code>plugin/autocmds.vim</code>,
441 inside an augroup.
442 </li>
443 <li>
444 Mappings should be defined in <code>plugin/mappings.vim</code> and
445 will be disabled unless explicitly enabled by users.
446 </li>
447 <li>
448 If the plugin configures any standard vim settings, those should be
449 configured in <code>plugin/settings.vim</code> or
450 <code>instant/settings.vim</code>.
451 </li>
452 </ul>
453 </li>
454 <li>
455 Avoid using the <code>after/</code> subdirectory.
456 <ul>
457 <li>
458 <code>after/</code> should be reserved for the user.
459 </li>
460 <li>
461 It is difficult for the user to add their own overrides when
462 plugins use <code>after/</code>.
463 </li>
464 </ul>
465 </li>
466 </ul>
467
468 <STYLEPOINT title="Libraries vs. Functionality">
469 <SUMMARY>
470 Separate library-providing plugins from command-providing plugins.
471 </SUMMARY>
472 <BODY>
473 <p>
474 Many plugins provide either user functionality (commands,
475 autocommands, etc) or an API (of autoloaded functions) but not both.
476 This separation is encouraged, as it allows other plugins to pull in a
477 library without also pulling in commands, setting changes, and other
478 plugin functionality that affects the end user.
479 </p>
480 </BODY>
481 </STYLEPOINT>
482
483 <STYLEPOINT title="Configuration">
484 <SUMMARY>
485 Don't clobber user settings. Provide as much configurability as
486 possible: that's what Vim's all about.
487 </SUMMARY>
488 <BODY>
489 <ul>
490 <li>
491 Use maktaba flags for plugin configuration. Users can configure them
492 using the <code>:Glaive</code> command.
493
494 </li>
495 <li>
496 Check if configuration variables exist before setting them.
497 <CODE_SNIPPET>
498 if !exists('g:myplugin_option')
499 let g:myplugin_option = 1
500 endif
501 </CODE_SNIPPET>
502 </li>
503 </ul>
504 </BODY>
505 </STYLEPOINT>
506 </CATEGORY>
507 <CATEGORY title="Style Guide">
508 <p>
509 Follow google-wide style conventions. Mimic google python style when
510 in doubt.
511 </p>
512
513
514
515 <STYLEPOINT title="Documentation">
516 <SUMMARY>
517 Use <a href="https://github.com/google/vimdoc">vimdoc</a>.
518 </SUMMARY>
519 <BODY>
520 <p>
521 Provide help files generated by
522 <a href="https://github.com/google/vimdoc">vimdoc</a>. Write
523 documentation in .vim files in conformance with the vimdoc standards
524 and include fields like "description" and "author" in the
525 addon-info.json file (see the
Ackermann Yuriyacb4f902016-04-01 21:36:44 +1300526 <a href="https://github.com/MarcWeber/vim-addon-manager/blob/master/doc/vim-addon-manager-additional-documentation.txt">VAM documentation</a>).
dbarnett@google.com4882d602014-04-12 06:08:42 +0000527 </p>
528 </BODY>
529 </STYLEPOINT>
530
531 <STYLEPOINT title="Whitespace">
532 <SUMMARY>
533 Follow google-wide conventions.
534 </SUMMARY>
535 <BODY>
536 <ul>
537 <li>
538 Use two spaces for indents.
539 </li>
540 <li>
541 Do not use tabs.
542 </li>
543 <li>
544 Use spaces around operators except for arguments to commands.
545 <ul>
546 <li>
547 Using spaces around operators for commands is often invalid
548 syntax. This is inconsistently enforced by vimscript. To be
549 safe, always omit whitespace around arguments to commands.
550 </li>
551 <li>
552 <CODE_SNIPPET>
553 let s:variable = "concatenated " . "strings"
554 command -range=% MyCommand
555 </CODE_SNIPPET>
556 <BAD_CODE_SNIPPET>
557 let s:variable="concatenated "."strings"
558 command -range = % MyCommand
559 </BAD_CODE_SNIPPET>
560 </li>
561 </ul>
562 </li>
563 <li>
564 Do not introduce trailing whitespace.
565 <ul>
566 <li>
567 You need not go out of your way to remove it.
568 </li>
569 </ul>
570 </li>
571 <li>
572 Restrict lines to 80 columns wide.
573 </li>
574 <li>
575 Indent continued lines by two tabs (four spaces).
576 </li>
577 <li>
578 Do not waste whitespace aligning common segments of similar
579 commands. It is both difficult and expensive to maintain.
580 <ul>
581 <li>
582 <CODE_SNIPPET>
583 command -bang MyCommand call myplugin#foo()
584 command MyCommand2 call myplugin#bar()
585 </CODE_SNIPPET>
586 <BAD_CODE_SNIPPET>
587 command -bang MyCommand call myplugin#foo()
588 command MyCommand2 call myplugin#bar()
589 </BAD_CODE_SNIPPET>
590 </li>
591 </ul>
592 </li>
593 </ul>
594 <SUBSECTION title="Line Continuations">
595 <ul start="7">
596 <li>
597 Prefer line continuations on semantic boundaries.
598 <ul>
599 <li>
600 <CODE_SNIPPET>
601 command SomeLongCommand
602 \ call some#function()
603 </CODE_SNIPPET>
604 <BAD_CODE_SNIPPET>
605 command SomeLongCommand call
606 \ some#function()
607 </BAD_CODE_SNIPPET>
608 </li>
609 <li>
610 Use your best judgement.
611 </li>
612 </ul>
613 </li>
614 <li>
615 Place one space after the backslash denoting a line continuation.
616 <ul>
617 <li>
618 When continuing a multi-line command a pipe can be substituted
619 for this space as necessary, as follows:
620 <CODE_SNIPPET>
621 autocommand BufEnter &lt;buffer&gt;
622 \ if !empty(s:var)
623 \| call some#function()
624 \|else
625 \| call some#function(s:var)
626 \|endif
627 </CODE_SNIPPET>
628 </li>
629 </ul>
630 </li>
631 <li>
632 Do not continue multi-line commands when you can avoid it. Prefer
633 function calls.
634 </li>
635 </ul>
636 </SUBSECTION>
637 <SUBSECTION title="Comments">
638 <ul>
639 <li>
640 Place a space after the <code>"</code> before the comment text.
641 <ul>
642 <li>
643 <CODE_SNIPPET>
644 " I am a line comment.
645 call call(s:my_function)
646 </CODE_SNIPPET>
647 </li>
648 </ul>
649 </li>
650 <li>
651 Do not use inline comments.
652 <ul>
653 <li>
654 Some commands treat them as comments and others as unclosed
655 quotes. There are many edge cases. It's difficult to get
656 right and difficult to maintain.
657 </li>
658 <li>
659 Where you would use an inline comment, put a line comment on
660 the line above.
661 </li>
662 </ul>
663 </li>
664 <li>
665 When leaving blank lines in comments, include the quote in the
666 blank line.
667 <ul>
668 <li>
669 <CODE_SNIPPET>
670 " I am one continuous
671 "
672 " comment block
673 </CODE_SNIPPET>
674 </li>
675 </ul>
676 </li>
677 </ul>
678 </SUBSECTION>
679 </BODY>
680 </STYLEPOINT>
681
682 <STYLEPOINT title="Variables">
683 <SUMMARY>
684 <p>
685 <code>plugin-names-like-this</code>,
686 <code>FunctionNamesLikeThis</code>,
687 <code>CommandNamesLikeThis</code>,
688 <code>augroup_names_like_this</code>,
689 <code>variable_names_like_this</code>.
690 </p>
691 <p>
692 Prefix all variables with their scope.
693 </p>
694 </SUMMARY>
695 <BODY>
696 <ul>
697 <li>
698 <code>variable_names_like_this</code>
699 <ul>
700 <li>
701 FuncRef variables count as functions and should be named like
702 functions.
703 </li>
704 <li>
705 This (pathological) convention is enforced by vim itself.
706 </li>
707 </ul>
708 </li>
709 <li>
710 Prefix global variables with <code>g:</code>
711 <ul>
712 <li>
713 Vimscript allows you to create global variables without
714 prefixing them.
715 </li>
716 <li>
717 It is very bad practice to introduce non-prefixed global
718 variables into scope.
719 </li>
720 <li>
721 Global variables should only be used for plugin configuration.
722 </li>
723 <li>
724 This does not apply to functions defined in
725 <code>autoload</code> directories.
726 </li>
727 </ul>
728 </li>
729 <li>
730 Prefix script-local variables with <code>s:</code>
731 <ul>
732 <li>
733 This prevents namespace collisions between plugins.
734 </li>
735 <li>
736 This also applies to script-local functions.
737 </li>
738 </ul>
739 </li>
740 <li>
741 Prefix function arguments with <code>a:</code>
742 <ul>
743 <li>
744 This is enforced by vim itself.
745 </li>
746 </ul>
747 </li>
748 <li>
749 Prefix function-local variables with <code>l:</code>
750 <ul>
751 <li>
752 This is not enforced by vimscript but is good practice.
753 </li>
754 <li>
755 It helps you remember that all other variables must be
756 prefixed with scope.
757 </li>
758 <li>
759 <code>l:</code> disambiguates between function-local and
760 vim-predefined variables. For example, <code>count</code>
761 refers to
762 <code>v:count</code>, not <code>l:count</code>.
763 </li>
764 <li>
765 It future proofs your scripts against the introduction of new
766 vim-predefined variables.
767 </li>
768 </ul>
769 </li>
770 <li>
771 Prefix pre-defined vim variables with <code>v:</code>
772 <ul>
773 <li>
774 This is not enforced by vimscript but is good practice.
775 </li>
776 <li>
777 It provides context as to where the (undeclared) variable is
778 coming from.
779 </li>
780 <li>
781 It reminds you that the variable can not be assigned to.
782 </li>
783 </ul>
784 </li>
785 <li>
786 Prefix buffer-local variables with <code>b:</code>
787 <ul>
788 <li>
789 This is useful for plugins that keep per-buffer state.
790 </li>
791 </ul>
792 </li>
793 </ul>
794 </BODY>
795 </STYLEPOINT>
796
797 <STYLEPOINT title="Strings">
798 <SUMMARY>
799 Prefer single quotes.
800 </SUMMARY>
801 <BODY>
802 <p>
803 Prefer single quoted strings. Specifically, in order of precedence:
804 </p>
805 <ul>
806 <li>
807 Always use single quotes for regular expressions.
808 <ul>
809 <li>
810 <code>'\s*'</code> is not the same as <code>"\s*"</code>
811 </li>
812 <li>
813 Single quotes will prevent the need for excessive backslashes.
814 </li>
815 <li>
816 Double single quotes escape to one single quote in single
817 quoted strings: <code>'example ('')'</code> represents the
818 string
819 <code>example (')</code>
820 </li>
821 </ul>
822 </li>
823 <li>
824 If your string requires escape characters (<code>\n</code>,
825 <code>\t</code>, etc.) use double quotes.
826 <ul>
827 <li>
828 Escapes can not be expressed in single quoted strings.
829 </li>
830 <li>
831 Remember that <code>'\n'</code> in a regex does not represent a
832 newline, but rather "\n". You only need to use double quotes
833 when you want to embed the represented character itself (e.g. a
834 newline) in the string.
835 </li>
836 </ul>
837 </li>
838 <li>
839 If your string contains no escapes nor single quotes, use single
840 quoted strings.
841 <ul>
842 <li>
843 Most strings in vimscript are regexes, so this provides maximum
844 consistency.
845 </li>
846 </ul>
847 </li>
848 <li>
849 If your non-regex string contains single quotes but no double
850 quotes, use double quotes.
851 <ul>
852 <li>
853 Don't bother escaping strings if you don't have to.
854 </li>
855 <li>
856 This is similar to the python string rules.
857 </li>
858 </ul>
859 </li>
860 <li>
861 If your string contains both single and double quotes, use whichever
862 quoting style requires less escaping.
863 <ul>
864 <li>
865 Break ties in favor of single quotes.
866 </li>
867 </ul>
868 </li>
869 </ul>
870 </BODY>
871 </STYLEPOINT>
872
873 <STYLEPOINT title="Settings">
874 <SUMMARY>
875 Prefer long names. Set settings locally.
876 </SUMMARY>
877 <BODY>
878 <ul start="6">
879 <li>
880 Prefer long names of built in settings (i.e. <code>tabstop</code>
881 over
882 <code>ts</code>).
883 </li>
884 <li>
885 Set local settings unless you explicitly want to set global
886 settings.
887 <ul>
888 <li>
889 Use <code>setlocal</code> and <code>&amp;l:</code> instead of
890 <code>set</code> and <code>&amp;</code>.
891 </li>
892 </ul>
893 </li>
894 </ul>
895 </BODY>
896 </STYLEPOINT>
897 </CATEGORY>
898 <CATEGORY title="Usage Guide">
899 <p>
900 Vim plugins should provide any or all of the following:
901 <strong>Commands,</strong> <strong>Autocommands,</strong>
902 <strong>Functions,</strong> <strong>Statusline Flags, and</strong>
903 <strong>Mappings.</strong>
904 </p>
905
906 <STYLEPOINT title="Commands">
907 <SUMMARY>
908 <ul>
909 <li>Define in <code>plugin/commands.vim</code>.</li>
910 <li>CommandNamesLikeThis.</li>
911 <li>Prefer semantic names to a unified prefix.</li>
912 <li>Do not use <code>[!]</code></li>
913 <li>Extract logic into functions.</li>
914 </ul>
915 </SUMMARY>
916 <BODY>
917 <ul>
918 <li>
919 <code>CommandNamesLikeThis</code>
920 </li>
921 <li>
922 Commands should be defined in one block with no whitespace between
923 them.
924 <ul>
925 <li>
926 Name commands semantically at the expense of a common prefix.
927 </li>
928 <li>
929 <BAD_CODE_SNIPPET>
930 command WhitespaceFixTrailing
931 command WhitespaceFixIndentation
932 </BAD_CODE_SNIPPET>
933 <CODE_SNIPPET>
934 command FixTrailingWhitespace
935 command FixIndentation
936 </CODE_SNIPPET>
937 </li>
938 </ul>
939 </li>
940 <li>
941 Use <code>command</code> without a bang.
942 <ul>
943 <li>
944 This notifies users to command name conflicts immediately at
945 startup.
946 </li>
947 <li>
948 Command name collisions are an error and should not fail
949 silently.
950 </li>
951 <li>
952 Plugins are guarded against re-entry, so a single vim session
953 should never attempt to re-define defined commands.
954 </li>
955 </ul>
956 </li>
957 <li>
958 Do not put logic in commands.
959 <ul>
960 <li>
961 Delegate to functions instead.
962 </li>
963 <li>
964 Pass non-argument command parameters (<code>&lt;bang&gt;</code>,
965 <code>&lt;register&gt;</code>, etc.) before argument parameters
966 (<code>&lt;f-args&gt;</code>, etc.).
967 </li>
968 <li>
969 Otherwise variable-length argument functions are difficult to
970 implement.
971 </li>
972 </ul>
973 </li>
974 <li>
975 Do not autoload commands.
976 <ul>
977 <li>
978 Autoloaded commands will not be available until after a function
979 in the same file is called.
980 </li>
981 <li>
982 Commands intended to be used in the .vimrc should be defined in
983 a <code>instant/commands.vim</code> file in plugins using
984 maktaba, or explicitly installed via an autoload function in
985 non-maktaba plugins.
986 </li>
987 </ul>
988 </li>
989 </ul>
990 <SUBSECTION title="Conventions">
991 <ul>
992 <li>
993 Pass <code>&lt;bang&gt;</code> to functions with
994 <code>'&lt;bang&gt;' == '!'</code>.
995 <ul>
996 <li>
997 The function should receive a boolean parameter, not a string.
998 </li>
999 </ul>
1000 </li>
1001 </ul>
1002 </SUBSECTION>
1003 </BODY>
1004 </STYLEPOINT>
1005
1006 <STYLEPOINT title="Autocommands">
1007 <SUMMARY>
1008 <ul>
1009 <li>Define in <code>plugin/autocmds.vim</code>.</li>
1010 <li>Use augroups.</li>
1011 <li>augroup_names_like_this.</li>
1012 <li>Clear the augroup first.</li>
1013 <li>Extract logic into functions.</li>
1014 </ul>
1015 </SUMMARY>
1016 <BODY>
1017 <ul>
1018 <li>
1019 All autocommands should be defined in the
1020 <code>plugin/autocmds.vim</code> file.
1021 <ul>
1022 <li>
1023 This allows users to disable your autocommands with
1024 <code>Glaive myplugin !plugin[autocmds]</code>.
1025 </li>
1026 </ul>
1027 </li>
1028 <li>
1029 Declare all autocommands in an <code>augroup</code> block.
1030 <ul>
1031 <li>
1032 This allows your autocommands to be cleared with
1033 <code>autocmd!</code>.
1034 </li>
1035 <li>
1036 If your plugin only has one <code>augroup</code>, the
1037 <code>augroup</code> name should be the same as your plugin
1038 name, with underscores in place of any hyphens.
1039 </li>
1040 <li>
1041 Otherwise <code>augroup</code> names should start with your
1042 plugin name followed by an underscore.
1043 </li>
1044 </ul>
1045 </li>
1046 <li>
1047 Do not put logic in autocommands.
1048 <ul>
1049 <li>
1050 Delegate to functions instead.
1051 </li>
1052 </ul>
1053 </li>
1054 <li>
1055 When creating a new <code>augroup</code>, clear it with
1056 <code>autocmd!</code>
1057 <ul>
1058 <li>
1059 This allows your plugins to be re-enterable.
1060 </li>
1061 </ul>
1062 </li>
1063 </ul>
1064 </BODY>
1065 </STYLEPOINT>
1066
1067 <STYLEPOINT title="Functions">
1068 <SUMMARY>
1069 <ul>
1070 <li>FunctionNamesLikeThis.</li>
1071 <li>Autoload all functions.</li>
1072 <li>Prefix script-local functions with <code>s:</code></li>
1073 <li>Use <code>[!]</code>.</li>
1074 <li>Use <code>[abort]</code>.</li>
1075 </ul>
1076 </SUMMARY>
1077 <BODY>
1078 <ul>
1079 <li>
1080 <code>FunctionNamesLikeThis</code>
1081 </li>
1082 <li>
1083 Prefix all script-local functions with <code>s:</code>
1084 </li>
1085 <li>
1086 Do not provide global functions. Use autoloaded functions instead.
1087 </li>
1088 <li>
1089 Place two blank lines between top-level functions.
1090 </li>
1091 <li>
1092 Declare all functions with <code>abort</code>.
1093 <ul>
1094 <li>
1095 If you do not do this, the function's behavior depends upon
1096 whether it is called within a <code>try..endtry</code> block
1097 somewhere on the stack.
1098 </li>
1099 <li>
1100 The <code>abort</code> keyword forces the function to act
1101 consistently.
1102 </li>
1103 <li>
1104 Without it, the function may (or may not) attempt to continue
1105 execution after an error occurs.
1106 </li>
1107 </ul>
1108 </li>
1109 <li>
1110 Use <code>function!</code> with a bang.
1111 <ul>
1112 <li>
1113 This allows developers to re-source their scripts and have the
1114 functions reloaded without complaint.
1115 </li>
1116 <li>
1117 Function names should never collide because functions should
1118 always be either script-local or defined in an
1119 <code>autoload</code> directory.
1120 </li>
1121 <li>
1122 Failing to use a bang in any function in an autoload file will
1123 lead to cryptic errors if vim tries to re-source the file
1124 (e.g., if you refer to an nonexistent autoload function).
1125 </li>
1126 </ul>
1127 </li>
1128 <li>
1129 Use <code>...</code> for optional arguments, not for lists of
1130 arguments.
1131 <ul>
1132 <li>
1133 Vimscript functions take at most 20 arguments.
1134 </li>
1135 <li>
1136 Lists have no such length restriction.
1137 </li>
1138 <li>
1139 Your function is likely to break when given too many arguments
1140 if you use <code>...</code> for a list of arguments.
1141 </li>
1142 </ul>
1143 </li>
1144 <li>
1145 Throw exceptions rather than printing errors.
1146 <ul>
1147 <li>
1148 Printed errors can not be caught.
1149 </li>
1150 <li>
1151 Top-level functions expecting errors may catch them and print
1152 error messages, but even those should throw their own errors
1153 when they choke.
1154 </li>
1155 </ul>
1156 </li>
1157 </ul>
1158 </BODY>
1159 </STYLEPOINT>
1160
1161 <STYLEPOINT title="Mappings">
1162 <SUMMARY>
1163 <ul>
1164 <li>
1165 Provide opt-in key mappings in <code>plugin/mappings.vim</code>.
1166 </li>
1167 <li>
1168 <code>&lt;Plug&gt;</code> mappings can be defined in
1169 <code>plugin/plugs.vim</code> (unlike mappings.vim, plugs.vim is
1170 opt-out).
1171 </li>
1172 </ul>
1173 </SUMMARY>
1174 <BODY>
1175 <ul>
1176 <li>
1177 Define key mappings in <code>plugin/mappings.vim</code>, using
1178 <code>maktaba#plugin#MapPrefix</code> to get a prefix.
1179 <ul>
1180 <li>
1181 Mappings defined in the special <code>plugin/mappings.vim</code>
1182 file will be disabled by default (by the standard
1183 <code>maktaba#plugin#Enter()</code> boilerplate).
1184 </li>
1185 <li>
1186 Users can enable key mappings with
1187 <code>Glaive myplugin plugin[mappings]</code>.
1188 </li>
1189 </ul>
1190 </li>
1191 <li>
1192 Make all mappings with <code>&lt;unique&gt;</code>.
1193 <ul>
1194 <li>
1195 This will inform the user when they have a mapping conflict
1196 instead of silently clobbering their existing mappings.
1197 </li>
1198 </ul>
1199 </li>
1200 <li>
1201 You may provide pseudo-mappings using <code>&lt;Plug&gt;</code> and
1202 your plugin's name in <code>plugin/plugs.vim</code> (separate from
1203 standard key mappings).
1204 <ul>
1205 <li>
1206 <code>&lt;Plug&gt;</code> is a sequence which can not be typed.
1207 </li>
1208 <li>
1209 You can do something like
1210 <code>noremap &lt;Plug&gt;namespace#MappingName
1211 some_key_sequence</code>
1212 and then users can do
1213 <code>noremap &lt;leader&gt;x
1214 &lt;Plug&gt;namespace#MappingName</code>
1215 to take advantage of your pseudo-mapping.
1216 </li>
1217 <li>
1218 Pseudo-mappings should <strong>not</strong> be in
1219 <code>plugin/mappings.vim</code> or they will be disabled by
1220 default.
1221 </li>
1222 <li>
1223 Such pseudo-mappings should be named <code>&lt;Plug&gt;</code>
1224 followed by your plugin name, a pound sign, and a unique mapping
1225 name (CamelCased like a function).
1226 </li>
1227 </ul>
1228 </li>
1229 <li>
1230 Always use the <code>noremap</code> family of commands. Never use
1231 the <code>map</code> family.
1232 <ul>
1233 <li>
1234 <code>map</code> depends upon the user's existing mappings, and
1235 could do anything.
1236 </li>
1237 </ul>
1238 </li>
1239 <li>
1240 Only use <code>noremap</code> for commands that both make a motion
1241 and take a range.
1242 <ul>
1243 <li>
1244 <code>noremap</code> makes mappings in normal, visual, and
1245 operator-pending modes.
1246 </li>
1247 <li>
1248 If you don't want all these use <code>nnoremap</code>
1249 <code>onoremap</code> or <code>vnoremap</code> explicitly.
1250 </li>
1251 </ul>
1252 </li>
1253 <li>
1254 Always use <code>&lt;SID&gt;</code> in place of <code>s:</code> when
1255 accessing script locals in mappings.
1256 <ul>
1257 <li>
1258 Using <code>s:</code> will often fail as the mapping attempts to
1259 type a literal s and colon.
1260 </li>
1261 </ul>
1262 </li>
1263 </ul>
1264 </BODY>
1265 </STYLEPOINT>
1266 </CATEGORY>
1267 <CATEGORY title="Conventions">
1268 <STYLEPOINT title="Dependency Checking">
1269 <SUMMARY>
1270 Declare dependencies in addon-info.json and use <code>maktaba</code>.
1271 </SUMMARY>
1272 <BODY>
1273 <p>
1274 Declaring dependencies in addon-info.json allows conformant plugin
1275 managers (like VAM) to ensure dependencies are installed. See the
Ackermann Yuriyacb4f902016-04-01 21:36:44 +13001276 <a href="https://github.com/MarcWeber/vim-addon-manager/blob/master/doc/vim-addon-manager-additional-documentation.txt">VAM documentation</a> for details.
dbarnett@google.com4882d602014-04-12 06:08:42 +00001277 </p>
1278 <p>
1279 Calling <code>maktaba#library#Require</code> from dependent code at
1280 runtime ensures that dependencies have been installed and that they
1281 don't include unsafe non-library files.
1282 </p>
1283 </BODY>
1284 </STYLEPOINT>
1285
1286 <STYLEPOINT title="Statusline Flags">
1287 <SUMMARY>
1288 Use <code>&lt;plugin-name&gt;#status#Status()</code> or its
1289 finer-grained variants to provide statusline flags.
1290 </SUMMARY>
1291 <BODY>
1292 <p>
1293 Following is a convention for exposing statusline flags to the user. A
1294 plugin should never modify the user's statusline except for when that
1295 is the only purpose of the plugin (powerline, etc.).
1296 </p>
1297 <ul>
1298 <li>
1299 Provide the
1300 <code class="green">Info</code>,
1301 <code class="yellow">Alert</code>,
1302 <code class="orange">Warning</code>, and
1303 <code class="red">Error</code> functions under the
1304 <code>&lt;plugin-name&gt;#status</code> namespace.
1305 </li>
1306 <li>
1307 <code class="green">Info</code> should provide information about the
1308 state of the buffer.
1309 <ul>
1310 <li>
1311 Example: The current git branch.
1312 </li>
1313 </ul>
1314 </li>
1315 <li>
1316 <code class="yellow">Alert</code> should provide a quiet reminder
1317 that the buffer is non-standard.
1318 <ul>
1319 <li>
1320 Example: The readonly setting is on.
1321 </li>
1322 </ul>
1323 </li>
1324 <li>
1325 <code class="orange">Warning</code> should provide a warning about
1326 the current state of the buffer.
1327 <ul>
1328 <li>
1329 Example: The file has been edited elsewhere.
1330 </li>
1331 </ul>
1332 </li>
1333 <li>
1334 <code class="red">Error</code> should bring to attention a loud
1335 issue with the buffer.
1336 <ul>
1337 <li>
1338 Example: The file does not pass the syntax checker.
1339 </li>
1340 </ul>
1341 </li>
1342 <li>
1343 By following these conventions, users can easily build up their own
1344 statusline customizing the verbosity and colors to their tastes.
1345 </li>
1346 <li>
1347 All functions should take no arguments and should return either
1348 empty strings or strings enclosed by square brackets, e.g.
1349 <code>[Google]</code>. For example:
1350 <ul>
1351 <li>
1352 A trailing whitespace plugin might return <code>[$]</code> if
1353 the file contains trailing whitespace
1354 </li>
1355 <li>
1356 A prose writing plugin might return <code>[write]</code> if vim
1357 is in writing mode.
1358 </li>
1359 </ul>
1360 </li>
1361 <li>
1362 Consider providing the
1363 <code>&lt;plugin-name&gt;#status#Status</code> function.
1364 <ul>
1365 <li>
1366 It should return the first non-empty of <code>Error</code>,
1367 <code>Warning</code>, <code>Alert</code>, or <code>Info</code>.
1368 </li>
1369 <li>
1370 This is useful for users who want only the most relevant flag
1371 and do not have a colored statusline.
1372 </li>
1373 </ul>
1374 </li>
1375 </ul>
1376 </BODY>
1377 </STYLEPOINT>
1378 </CATEGORY>
1379 <CATEGORY title="Forbidden Commands">
1380 <p>
1381 These are commands which can only be used by a limited number of
1382 plugins, and should not in general be used by yours.
1383 </p>
1384 <ul>
1385 <li>
1386 Do not use <code>:match :2match</code> or <code>:3match</code>
1387 <ul>
1388 <li>
1389 These are reserved for the user and for vim itself.
1390 </li>
1391 <li>
dbarnett@google.com4052f392014-11-15 02:14:20 +00001392 Use <code>matchadd()</code> to create a matchlevel unique to your
dbarnett@google.com4882d602014-04-12 06:08:42 +00001393 plugin.
1394 </li>
1395 </ul>
1396 </li>
1397 <li>
1398 Do not use <code>echoerr</code>.
1399 <ul>
1400 <li>
1401 <code>echoerr</code> does not print the red error message that you
1402 might think it does.
1403 </li>
1404 <li>
1405 <code>echoerr</code> prints an error message as well as context
1406 about the code where <code>echoerr</code> was called.
1407 </li>
1408 <li>
1409 <code>echoerr</code> is best suited for debugging.
1410 </li>
1411 <li>
1412 Use <code>echohl</code> in tandem with <code>echomsg</code> if
1413 you want the red error bar.
1414 </li>
1415 </ul>
1416 </li>
1417 <li>
1418 Use <code>echomsg</code> instead of <code>echo</code>.
1419 <ul>
1420 <li>
1421 <code>echomsg</code> messages can be reviewed with the
1422 <code>:messages</code> command.
1423 </li>
1424 <li>
1425 <code>echo</code> messages disappear permanently on redraw, which
1426 can be very annoying to users who failed to read the message in
1427 time.
1428 </li>
1429 </ul>
1430 </li>
1431 </ul>
1432 </CATEGORY>
1433 <CATEGORY title="Layout">
1434 <p>
1435 Lay out <code>plugin/</code> files in the following sections, if
1436 applicable, separated by two blank lines:
1437 </p>
1438 <ul>
1439 <li>
1440 Declaration of script constants
1441 </li>
1442 <li>
1443 Declaration of configuration variables
1444 </li>
1445 <li>
1446 Other declarations (commands in <code>commands.vim</code> file,
1447 autocommands in <code>autocmds.vim</code> file, etc.)
1448 </li>
1449 </ul>
1450 <p>
1451 Lay out <code>autoload/</code> files in the following sections, if
1452 applicable, separated by two blank lines:
1453 </p>
1454 <ul>
1455 <li>
1456 <code>maktaba#library#Require</code> calls
1457 </li>
1458 <li>
1459 Script-local variables
1460 </li>
1461 <li>
1462 Script-local functions
1463 </li>
1464 <li>
1465 Private autoloaded functions
1466 </li>
1467 <li>
1468 Public autoloaded functions
1469 </li>
1470 </ul>
1471 <p>
1472 This is recommended convention and is not enforced.
1473 </p>
1474
1475 </CATEGORY>
1476 <CATEGORY title="Recommended Shortcuts">
1477
1478 <p>
1479 Use the following shortcuts:
1480 </p>
1481 <ul>
1482 <li>
1483 <code>catch</code> over <code>catch /.*/</code>
1484 </li>
1485 <li>
1486 <code>return</code> over <code>return 0</code> when the return value
1487 has no semantic purpose.
1488 </li>
1489 </ul>
1490
1491 </CATEGORY>
1492 <CATEGORY title="Errata">
1493 <p>
1494 This section plumbs some of the darker corners of vimscript, explaining
1495 the language pathologies that you wish you didn't have to know.
1496
1497 </p>
1498
1499 <STYLEPOINT title="Compatibility Mode">
1500 <SUMMARY>
1501 If you don't support vi-compatibility mode, fail gracefully.
1502 </SUMMARY>
1503 <BODY>
1504 <p>
1505 When <code>compatible</code> is set, many vim features are not
1506 available. The vim feature which most commonly affects vimscript
1507 authors is line continuations.
1508 </p>
1509 <p>
1510 If you want your plugin to work in vim with vi compatibility on, you
1511 will need to save the compatibility options at the beginning of each
1512 plugin file, clear them, and restore them at the end of each plugin
1513 file. See <code>:help use-cpo-save</code> for details.
1514 </p>
1515 <p>
1516 Plugins that depend on maktaba generally don't need to worry about
1517 compatible mode since maktaba currently just disables it, printing a
1518 warning.
1519 </p>
1520 </BODY>
1521 </STYLEPOINT>
1522 </CATEGORY>
1523
1524 <p align="right">
1525 Revision 1.1
1526 </p>
1527
1528
1529 <address>
1530 Nate Soares<br/>
1531 Joshua Hoak<br/>
1532 David Barnett<br/>
1533 </address>
1534</GUIDE>