• 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 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
389        the <a href="https://github.com/MarcWeber/vim-addon-manager/blob/master/doc/vim-addon-manager-additional-documentation.txt">VAM documentation</a> for details).
390      </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
526          <a href="https://github.com/MarcWeber/vim-addon-manager/blob/master/doc/vim-addon-manager-additional-documentation.txt">VAM documentation</a>).
527        </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
1276          <a href="https://github.com/MarcWeber/vim-addon-manager/blob/master/doc/vim-addon-manager-additional-documentation.txt">VAM documentation</a> for details.
1277        </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>
1392            Use <code>matchadd()</code> to create a matchlevel unique to your
1393            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>
1535