Xml文件  |  413行  |  13.89 KB

<?xml version = '1.0'?>
<?xml-stylesheet type="text/xsl" href="styleguide.xsl"?>
<GUIDE title="Google Vimscript Style Guide">
  <p class="revision">

    Revision 1.1
  </p>

  
  <address>
    Nate Soares<br/>
    Joshua Hoak<br/>
    David Barnett<br/>
  </address>

  <OVERVIEW>
    <CATEGORY title="Background">
      <p>
        This is a casual version of the vimscript style guide, because
        vimscript is a casual language. When submitting vim plugin code, you
        must adhere to these rules. For clarifications, justifications, and
        explanations about the finer points of vimscript, please refer to the
        <a href="vimscriptfull.xml">heavy guide</a>.
      </p>
    </CATEGORY>
  </OVERVIEW>

  <CATEGORY title="Portability">
    <p>
      It's hard to get vimscript right. Many commands depend upon the user's
      settings. By following these guidelines, you can hope to make your
      scripts portable.
    </p>
    <STYLEPOINT title="Strings">
      <SUMMARY>Prefer single quoted strings</SUMMARY>
      <BODY>
        <p>
          Double quoted strings are semantically different in vimscript, and
          you probably don't want them (they break regexes).
        </p>
        <p>
          Use double quoted strings when you need an escape sequence (such as
          <code>"\n"</code>) or if you know it doesn't matter and you need to
          embed single quotes.
        </p>
      </BODY>
    </STYLEPOINT>
    <STYLEPOINT title="Matching Strings">
      <SUMMARY>
        Use the <code>=~#</code> or <code>=~?</code> operator families over the
        <code>=~</code> family.
      </SUMMARY>
      <BODY>
        <p>
          The matching behavior depends upon the user's ignorecase and smartcase
          settings and on whether you compare them with the <code>=~</code>,
          <code>=~#</code>, or <code>=~?</code> family of operators. Use the
          <code>=~#</code> and <code>=~?</code> operator families explicitly
          when comparing strings unless you explicitly need to honor the user's
          case sensitivity settings.
        </p>
      </BODY>
    </STYLEPOINT>
    <STYLEPOINT title="Regular Expressions">
      <SUMMARY>Prefix all regexes with <code>\m\C</code>.</SUMMARY>
      <BODY>
        <p>
          In addition to the case sensitivity settings, regex behavior depends
          upon the user's nomagic setting. To make regexes act like nomagic and
          noignorecase are set, prepend all regexes with <code>\m\C</code>.
        </p>
        <p>
          You are welcome to use other magic levels (<code>\v</code>) and case
          sensitivities (<code>\c</code>) so long as they are intentional and
          explicit.
        </p>
      </BODY>
    </STYLEPOINT>
    <STYLEPOINT title="Dangerous commands">
      <SUMMARY>Avoid commands with unintended side effects.</SUMMARY>
      <BODY>
        <p>
          Avoid using <code>:s[ubstitute]</code> as it moves the cursor and
          prints error messages. Prefer functions (such as
          <code>search()</code>) better suited to scripts.
        </p>
        <p>
          For many vim commands, functions exist that do the same thing with
          fewer side effects. See <code>:help functions()</code> for a list of
          built-in functions.
        </p>
      </BODY>
    </STYLEPOINT>
    <STYLEPOINT title="Fragile commands">
      <SUMMARY>Avoid commands that rely on user settings.</SUMMARY>
      <BODY>
        <p>
          Always use <code>normal!</code> instead of <code>normal</code>. The
          latter depends upon the user's key mappings and could do anything.
        </p>
        <p>
          Avoid <code>:s[ubstitute]</code>, as its behavior depends upon a
          number of local settings.
        </p>
        <p>
          The same applies to other commands not listed here.
        </p>
      </BODY>
    </STYLEPOINT>
    <STYLEPOINT title="Catching Exceptions">
      <SUMMARY>Match error codes, not error text.</SUMMARY>
      <BODY>
        <p>Error text may be locale dependant.</p>
      </BODY>
    </STYLEPOINT>
  </CATEGORY>

  <CATEGORY title="General Guidelines">
    
    
    <STYLEPOINT title="Messaging">
      <SUMMARY>Message the user infrequently.</SUMMARY>
      <BODY>
        <p>
          Loud scripts are annoying. Message the user only when:
          <ul>
            <li>A long-running process has kicked off.</li>
            <li>An error has occurred.</li>
          </ul>
        </p>
      </BODY>
    </STYLEPOINT>
    <STYLEPOINT title="Type checking">
      <SUMMARY>Use strict and explicit checks where possible.</SUMMARY>
      <BODY>
        <p>
          Vimscript has unsafe, unintuitive behavior when dealing with some
          types. For instance, <code>0 == 'foo'</code> evaluates to true.
        </p>
        <p>
          Use strict comparison operators where possible. When comparing against
          a string literal, use the <code>is#</code> operator. Otherwise, prefer
          <code>maktaba#value#IsEqual</code> or check <code>type()</code>
          explicitly.
        </p>
        <p>
          Check variable types explicitly before using them. Use functions from
          <code>maktaba#ensure</code>, or check <code>maktaba#value</code> or
          <code>type()</code> and throw your own errors.
        </p>
        <p>
          Use <code>:unlet</code> for variables that may change types,
          particularly those assigned inside loops.
        </p>
      </BODY>
    </STYLEPOINT>
    <STYLEPOINT title="Python">
      <SUMMARY>Use sparingly.</SUMMARY>
      <BODY>
        <p>
          Use python only when it provides critical functionality, for example
          when writing threaded code.
        </p>
      </BODY>
    </STYLEPOINT>
    <STYLEPOINT title="Other Languages">
      <SUMMARY>Use vimscript instead.</SUMMARY>
      <BODY>
        <p>
          Avoid using other scripting languages such as ruby and lua. We can
          not guarantee that the end user's vim has been compiled with support
          for non-vimscript languages.
        </p>
      </BODY>
    </STYLEPOINT>
    <STYLEPOINT title="Boilerplate">
      <SUMMARY>
        Use <a href="https://github.com/google/maktaba">maktaba</a>.
      </SUMMARY>
      <BODY>
        <p>
          maktaba removes boilerplate, including:
          <ul>
            <li>Plugin creation</li>
            <li>Error handling</li>
            <li>Dependency checking</li>
          </ul>
        </p>
      </BODY>
    </STYLEPOINT>
    <STYLEPOINT title="Plugin layout">
      <SUMMARY>Organize functionality into modular plugins</SUMMARY>
      <BODY>
        <p>
          Group your functionality as a plugin, unified in one directory (or
          code repository) which shares your plugin's name (with a "vim-" prefix
          or ".vim" suffix if desired). It should be split into plugin/,
          autoload/, etc. subdirectories as necessary, and it should declare
          metadata in the addon-info.json format (see the
          <a href="https://github.com/MarcWeber/vim-addon-manager/blob/master/doc/vim-addon-manager-additional-documentation.txt">VAM documentation</a> for details).
        </p>
      </BODY>
    </STYLEPOINT>
    <STYLEPOINT title="Functions">
      <SUMMARY>
        In the autoload/ directory, defined with <code>[!]</code> and
        <code>[abort]</code>.
      </SUMMARY>
      <BODY>
        <p>
          Autoloading allows functions to be loaded on demand, which makes
          startuptime faster and enforces function namespacing.
        </p>
        <p>
          Script-local functions are welcome, but should also live in autoload/
          and be called by autoloaded functions.
        </p>
        <p>
          Non-library plugins should expose commands instead of functions.
          Command logic should be extracted into functions and autoloaded.
        </p>
        <p>
          <code>[!]</code> allows developers to reload their functions
          without complaint.
        </p>
        <p>
          <code>[abort]</code> forces the function to halt when it encounters
          an error.
        </p>
      </BODY>
    </STYLEPOINT>
    <STYLEPOINT title="Commands">
      <SUMMARY>
        In the plugin/commands.vim or under the ftplugin/ directory, defined
        without <code>[!]</code>.
      </SUMMARY>
      <BODY>
        <p>
          General commands go in <code>plugin/commands.vim</code>.
          Filetype-specific commands go in <code>ftplugin/</code>.
        </p>
        <p>
          Excluding <code>[!]</code> prevents your plugin from silently
          clobbering existing commands.  Command conflicts should be resolved by
          the user.
        </p>
      </BODY>
    </STYLEPOINT>
    <STYLEPOINT title="Autocommands">
      <SUMMARY>
        Place them in plugin/autocmds.vim, within augroups.
      </SUMMARY>
      <BODY>
        <p>
          Place all autocommands in augroups.
        </p>
        <p>
          The augroup name should be unique. It should either be, or be prefixed
          with, the plugin name.
        </p>
        <p>
          Clear the augroup with <code>autocmd!</code> before defining new
          autocommands in the augroup. This makes your plugin re-entrable.
        </p>
      </BODY>
    </STYLEPOINT>
    <STYLEPOINT title="Mappings">
      <SUMMARY>
        Place them in <code>plugin/mappings.vim</code>, using
        <code>maktaba#plugin#MapPrefix</code> to get a prefix.
      </SUMMARY>
      <BODY>
        <p>
          All key mappings should be defined in
          <code>plugin/mappings.vim</code>.
        </p>
        <p>
          Partial mappings (see :help using-&lt;Plug&gt;.) should be defined in
          <code>plugin/plugs.vim</code>.
        </p>
      </BODY>
    </STYLEPOINT>
    <STYLEPOINT title="Settings">
      <SUMMARY>Change settings locally</SUMMARY>
      <BODY>
        <p>
          Use <code>:setlocal</code> and <code>&amp;l:</code> instead of
          <code>:set</code> and <code>&amp;</code> unless you have explicit
          reason to do otherwise.
        </p>
      </BODY>
    </STYLEPOINT>
  </CATEGORY>

  <CATEGORY title="Style">
    <p>
      Follow google style conventions. When in doubt, treat vimscript style
      like python style.
    </p>

    <STYLEPOINT title="Whitespace">
      <SUMMARY>
        Similar to python.
        
        <br/>
        <br/>
      </SUMMARY>
      <BODY>
        <ul>
          <li>Use two spaces for indents</li>
          <li>Do not use tabs</li>
          <li>Use spaces around operators
            <p>This does not apply to arguments to commands.</p>
            <CODE_SNIPPET>
              let s:variable = "concatenated " . "strings"
              command -range=% MyCommand
            </CODE_SNIPPET>
          </li>
          <li>Do not introduce trailing whitespace
            <p>You need not go out of your way to remove it.</p>
            <p>
              Trailing whitespace is allowed in mappings which prep commands
              for user input, such as
              "<code>noremap &lt;leader&gt;gf :grep -f </code>".
            </p>
          </li>
          <li>Restrict lines to 80 columns wide</li>
          <li>Indent continued lines by four spaces</li>
          <li>Do not align arguments of commands
            <BAD_CODE_SNIPPET>
              command -bang MyCommand  call myplugin#foo()
              command       MyCommand2 call myplugin#bar()
            </BAD_CODE_SNIPPET>
            <CODE_SNIPPET>
              command -bang MyCommand call myplugin#foo()
              command MyCommand2 call myplugin#bar()
            </CODE_SNIPPET>
          </li>
        </ul>
      </BODY>
    </STYLEPOINT>

    <STYLEPOINT title="Naming">
      <SUMMARY>
        <p>
          In general, use
          <code>plugin-names-like-this</code>,
          <code>FunctionNamesLikeThis</code>,
          <code>CommandNamesLikeThis</code>,
          <code>augroup_names_like_this</code>,
          <code>variable_names_like_this</code>.
        </p>
        <p>Always prefix variables with their scope.</p>
      </SUMMARY>
      <BODY>
        <SUBSECTION title="plugin-names-like-this">
          <p>Keep them short and sweet.</p>
          
        </SUBSECTION>
        <SUBSECTION title="FunctionNamesLikeThis">
          <p>Prefix script-local functions with <code>s:</code></p>
          <p>Autoloaded functions may not have a scope prefix.</p>
          <p>
            Do not create global functions. Use autoloaded functions
            instead.
          </p>
        </SUBSECTION>
        <SUBSECTION title="CommandNamesLikeThis">
          <p>Prefer succinct command names over common command prefixes.</p>
        </SUBSECTION>
        <SUBSECTION title="variable_names_like_this">
          <p>Augroup names count as variables for naming purposes.</p>
        </SUBSECTION>
        <SUBSECTION title="Prefix all variables with their scope.">
          <ul>
            <li>Global variables with <code>g:</code></li>
            <li>Script-local variables with <code>s:</code></li>
            <li>Function arguments with <code>a:</code></li>
            <li>Function-local variables with <code>l:</code></li>
            <li>Vim-predefined variables with <code>v:</code></li>
            <li>Buffer-local variables with <code>b:</code></li>
          </ul>
          <p>
            <code>g:</code>, <code>s:</code>, and <code>a:</code> must always
            be used.
          </p>
          <p>
            <code>b:</code> changes the variable semantics; use it when you
            want buffer-local semantics.
          </p>
          <p>
            <code>l:</code> and <code>v:</code> should be used for consistency,
            future proofing, and to avoid subtle bugs. They are not strictly
            required. Add them in new code but don’t go out of your way to add
            them elsewhere.
          </p>
        </SUBSECTION>
      </BODY>
    </STYLEPOINT>
  </CATEGORY>

  <p align="right">
    Revision 1.1
  </p>

  
  <address>
    Nate Soares<br/>
    Joshua Hoak<br/>
    David Barnett<br/>
  </address>
</GUIDE>