Commits

Jean-Philippe Thierry  committed 5a5ef15

cleanup of unused files

  • Participants
  • Parent commits e381e23

Comments (0)

Files changed (5)

File .vim/doc/NERD_snippets.txt

-*NERD_snippets.txt*  Snippets for vim.
-*NERDSnippets*
-
-
-
-        lock up your daughters! its ...~
-
-        _   ____________  ____     _____       _                  __      ~
-       / | / / ____/ __ \/ __ \   / ___/____  (_)___  ____  ___  / /______~
-      /  |/ / __/ / /_/ / / / /   \__ \/ __ \/ / __ \/ __ \/ _ \/ __/ ___/~
-     / /|  / /___/ _, _/ /_/ /   ___/ / / / / / /_/ / /_/ /  __/ /_(__  ) ~
-    /_/ |_/_____/_/ |_/_____/   /____/_/ /_/_/ .___/ .___/\___/\__/____/  ~
-                                            /_/   /_/                     ~
-
-
-                              Reference Manual~
-
-==============================================================================
-CONTENTS                                               *nerdsnippets-contents*
-
- |nerdsnippets-introduction|           Introduction
- |nerdsnippets-defining-snippets|      Defining snippets
- |nerdsnippets-global-functions|           Global functions
- |nerdsnippets-global-snippets|            Global snippets
- |nerdsnippets-snippet-indentation|        Snippet indentation
- |nerdsnippets-snippet-magic|              Snippet escape sequences
- |nerdsnippets-snippet-setup-file|     The snippet setup file
- |nerdsnippets-example-snippets|       Example snippets
- |nerdsnippets-options|                Options
- |nerdsnippets-about|                  About
- |nerdsnippets-license|                License
-
-
-==============================================================================
-INTRODUCTION                                    *nerdsnippets-introduction*
-
-It is a proven scientific fact that typing the same code over and over again
-sucks balls. Therefore, this plugin provides a snippet engine to reduce the
-amount of mindless repitition vim users have to do. For science.
-
-Using this plugin you can create file based snippets. Once you have created a
-snippet you can insert it into a file by typing the snippet keyword then
-pressing <tab>. From there you can jump to the snippet "markers" by pressing
-<tab> again. There are more features detailed in this document.
-
-==============================================================================
-DEFINING SNIPPETS                             *nerdsnippets-defining-snippets*
-
-
-------------------------------------------------------------------------------
-THE GLOBAL FUNCTIONS                           *nerdsnippets-global-functions*
-
-The script provides the following functions for you to specify snippets.
-
-                                                         *NERDSnippetsReset()*
-NERDSnippetsReset()
-    Use this function to clear all snippets from memory. Put this at the top
-    of your snippet setup script so you can |:source| it again when you change
-    your snippets.
-
-        *NERDSnippetsFromDirectory()* *NERDSnippetsFromDirectoryForFiletype()*
-These two functions are used to extract snippets from a directory tree. Both
-functions recursively look for .snippet files and assume a certain directory
-structure from which the snippets filetype, keyword and possibly name are
-inferred.
-
-NERDSnippetsFromDirectory(dir)
-    Extracts snippets from the given directory.
-
-    Assumed file/directory naming scheme:
-
-    For single snippets >
-        a:dir/<filetype>/<keyword>.snippet
-<
-    eg >
-        ~/.vim/snippets/html/href.snippet
-<
-    For multiple snippets bound to a single keyword >
-        a:dir/<filetype>/<keyword>/<snippet-name>.snippet
-<
-    eg >
-        ~/.vim/snippets/html/table/simple-table.snippet
-        ~/.vim/snippets/html/table/table-with-class.snippet
-<
-
-NERDSnippetsFromDirectoryForFiletype(dir, filetype)
-    Extracts snippets from the given directory for the given filetype.
-
-    Assumed file/directory naming scheme:
-
-    For single snippets >
-        a:dir/<keyword>.snippet
-<
-    eg >
-        ~/.vim/snippets/html/href.snippet
-<
-    For multiple snippets bound to a single keyword >
-        a:dir/<keyword>/<snippet-name>.snippet
-<
-    eg >
-        ~/.vim/snippets/html/table/simple-table.snippet
-        ~/.vim/snippets/html/table/table-with-class.snippet
-<
-    The main purpose of this function is to allow you to manually associate a
-    collection of snippets with a filetype. For example, you probably want all
-    your html snippets to also be used for the xhtml filetype. So you could
-    call this in your setup file: >
-        NERDSnippetsFromDirectoryForFiletype('~/.vim/snippets/html', 'xhtml')
-<
-                              *NS_prompt()* *NS_camelcase()* *NS_underscore()*
-
-NS_prompt(variable_name, prompt, default_value)
-    This function is how NERD Snippets implements mirroring. It is essentially
-    a wrapper for the built in |input()| function. Use it to extract values
-    from the user which you can then use and manipulate at any point in the
-    snippet. See the example snippets section for more info.
-
-NS_camelcase(string), NS_underscore(string)
-    These two functions convert a string between the camelcase (FooBarBaz) and
-    the underscored (foo_bar_baz) versions. They are included in the script as
-    example helper functions and because they have turned out to be very
-    helpful in my snippets.
-
-------------------------------------------------------------------------------
-GLOBAL SNIPPETS                                 *nerdsnippets-global-snippets*
-Global snippets are snippets that are available for all filetypes.
-They are treated as though their filetype is _. For example: >
-    ~/.vim/snippets/_/aGlobalSnippet.snippet
-<
-
-------------------------------------------------------------------------------
-SNIPPET INDENTATION                         *nerdsnippets-snippet-indentation*
-
-Snippets are stored as sequences of keypresses and therefore do not contain
-any indentation. Indentation is done on-the-fly as you insert them into a
-file. They are indented according to your indent settings at the time of use.
-
-You should still define your snippets with indentation (for readability), but
-know that it is removed when they are processed.
-
-------------------------------------------------------------------------------
-SNIPPET MAGIC                                     *nerdsnippets-snippet-magic*
-
-There are two important escape sequences to know about when defining
-snippets.
-
-    \<C-R>=an_expression\<CR>
-    Will insert the value of an_expression into the snippet when it is used.
-
-    \<C-O>a_normal_mode_command\<CR>
-    Will execute a_normal_mode_command when the snippet is used.
-
-
-==============================================================================
-SNIPPET SETUP FILE                           *nerdsnippets-snippet-setup-file*
-
-Once you have created your snippets, you have to tell NERD snippets about
-them. The easiest way to do this is to create a snippet setup file here: >
-    ~/.vim/after/plugin/snippet_setup.vim
-<
-Call the file whatever you want, but its important to stick it in
-the after/plugin directory.
-
-A typical setup file would look something like this >
-
-    "remove all snippets from memory so we can source this script after
-    "modifying our snippets
-    call NERDSnippetsReset()
-
-    "slurp up all our snippets
-    call NERDSnippetsFromDirectory("~/.vim/snippets")
-
-    "use our html snippets for eruby and xhtml too
-    call NERDSnippetsFromDirectoryForFiletype('~/.vim/snippets/html', 'eruby')
-    call NERDSnippetsFromDirectoryForFiletype('~/.vim/snippets/html', 'xhtml')
-
-    "support functions that are called from our snippets
-    "---------------------------------------------------
-
-    function! Snippet_RubyClassNameFromFilename()
-        let name = expand("%:t:r")
-        return NS_camelcase(name)
-    endfunction
-
-    function! Snippet_MigrationNameFromFilename()
-        let name = substitute(expand("%:t:r"), '^.\{-}_', '', '')
-        return NS_camelcase(name)
-    endfunction
-<
-==============================================================================
-EXAMPLE SNIPPETS                               *nerdsnippets-example-snippets*
-
-Here are some example snippets to demonstrate the features of the script.
-Note that the examples assume that all snippets are located in
-~/.vim/snippets/ and that >
-    NERDSnippetsFromDirectory('~/.vim/snippets')
-<
-was called.
-
-For more example snippets see |nerdsnippets-about|.
-
-Example 1: a for loop for java~
-
-    Snippet location: ~/.vim/snippets/java/for.snippet
->
-    for(<+int i=0+>; <++>; <+i+++>){
-        <++>
-    }
-<
-    There are 4 markers:
-    1. <+int i=0+>
-    2. <++>
-    3. <+i+++>
-    4. <++>
-
-    1 and 3 have default values. When you tab to them, they will be
-    replaced with the text "int i=0" and "i++".
-
-    2 and 4 are empty markers, these markers are removed when the cursor
-    arrives on them.
-
-Example 2: validates_presence_of for rails~
-
-    Snippet location: ~/.vim/snippets/ruby/vpo.snippet
->
-    validates_presence_of :<+attribute+><+, :on => :<+create+>, :message => "<+can't be blank+>"+>
-<
-    Notice how the second marker:
->
-    <+, :on => :<+create+>, :message => "<+can't be blank+>"+>
-<
-    has 2 markers nested inside it. When you tab to this marker you can either
-    hit tab again to "tab into" it, or hit backspace/ctrl-h or enter to delete
-    it and move on. This way you can create "optional" parts to a snippet.
-
-
-Example 3: global modeline snippet~
-
-    Assumes this function is defined in the snippet setup file:
->
-    function! ModelineSnippet()
-      let start = substitute(&cms, '^\([^ ]*\)\s*%s\(.*\)$', '\1', '')
-      let end = substitute(&cms, '^.*%s\(.*\)$', '\1', '')
-      return start . " vim: set <+settings+>:" . end
-    endfunction
-<
-    Snippet location: ~/.vim/snippets/_/modeline.snippet
-    The snippet code:
->
-    \<C-R>=ModelineSnippet()\<CR>
-<
-    Here we have a snippet that uses some more complex logic, so we get a
-    function to generate the snippet code for us.
-
-Example 4: ruby class snippet~
-
-    Assumes this function is defined in the snippet setup file:
->
-    function! Snippet_RubyClassNameFromFilename()
-        let name = expand("%:t:r")
-        return NS_camelcase(name)
-    endfunction
-<
-
-    Snippet location: ~/.vim/snippets/ruby/class.snippet
-    The snippet code:
->
-    class <+\<c-r>=Snippet_RubyClassNameFromFilename()\<CR>+>
-        <++>
-    end
-<
-    Here if we are in a file called foo_bar.rb, the following code would be
-    inserted:
->
-    class FooBar
-        <++>
-    end
-<
-    "FooBar" would be selected and ready to type over if needed.
-
-Example 5: two snippets bound to a single keyword~
-
-    Here we have 2 snippets that are both bound to the same keyword (table)
-
-    Snippet locations: ~/.vim/snippets/html/table/simple.snippet
-                       ~/.vim/snippets/html/table/hardcore.snippet
-
-    simple.snippet:
->
-    <table class="<++>">
-      <++>
-    </table>
-<
-    hardcore.snippet:
->
-    <table<+ width="<+100%+>" border="<+0+>" cellspacing="<+0+>" cellpadding="<+5+>"<++>+>>
-        <tr>
-            <th><++></th>
-        </tr>
-
-        <tr>
-            <td></td>
-        </tr>
-    </table>
-<
-    When you type    table<tab>    the script will ask you which snippet to
-    insert.
-
-Example 6: the standard rails code for an update action with mirroring~
-
-    Snippet location: ~/.vim/snippets/ruby/defupdate.snippet
->
-    def update
-      @\<c-r>=NS_underscore(NS_prompt("snippet_classname", "Model ClassName", ""))\<cr> = \<c-r>=snippet_classname\<cr>.find(params[:id])
-
-      respond_to do |wants|
-        if @\<c-r>=NS_underscore(snippet_classname)\<cr>.update_attributes(params[:\<c-r>=NS_underscore(snippet_classname)\<cr>])
-          flash[:notice] = '\<c-r>=snippet_classname\<cr> was successfully updated.'
-          wants.html { redirect_to(@\<c-r>=NS_underscore(snippet_classname)\<cr>) }
-          wants.xml  { head :ok }
-        else
-          wants.html { render :action => "edit" }
-          wants.xml  { render :xml => @\<c-r>=NS_underscore(snippet_classname)\<cr>.errors, :status => :unprocessable_entity }
-        end
-      end
-    end
-<
-    When you type   defupdate<tab>   the script will prompt you for the value
-    of "Model ClassName". It saves this value as g:snippet_classname, then
-    uses it to populate other parts of the snippet. It uses both camelcase and
-    underscored versions of where appropriate.
-
-    For example, if i was to enter FooBarBaz as the value, the resulting code
-    would look like this:
->
-    def update
-      @foo_bar_baz = FooBarBaz.find(params[:id])
-
-      respond_to do |wants|
-        if @foo_bar_baz.update_attributes(params[:foo_bar_baz])
-          flash[:notice] = 'FooBarBaz was successfully updated.'
-          wants.html { redirect_to(@foo_bar_baz) }
-          wants.xml  { head :ok }
-        else
-          wants.html { render :action => "edit" }
-          wants.xml  { render :xml => @foo_bar_baz.errors, :status => :unprocessable_entity }
-        end
-      end
-    end
-<
-
-==============================================================================
-OPTIONS                                                 *nerdsnippets-options*
-
-Variables:
-  g:NERDSnippets_key                        default: <tab>
-      expands snippets and jumps to markers
-  g:NERDSnippets_marker_start               default: <+
-      start of marker tags
-  g:NERDSnippets_marker_end                 default: +>
-      end of marker tags
-
-==============================================================================
-ABOUT                                                     *nerdsnippets-about*
-
-The author can be reached at martin_grenfell at msn.com. Feel free to send him
-suggestions and/or comments about this plugin. He also hangs in the #vim on
-freenode as scrooloose.
-
-The latest dev versions are on github
-    http://github.com/scrooloose/nerdsnippets
-
-There is also a repository of snippets on github
-    http://github.com/scrooloose/snippets
-
-==============================================================================
-LICENSE                                              *nerdsnippets-license*
-
-NERD Snippets is released under the wtfpl.
-See http://sam.zoy.org/wtfpl/COPYING.
-
-/* vim: set ft=help:*/

File .vim/doc/fugitive.txt

-*fugitive.txt*  a Git wrapper so awesome, it should be illegal
-
-Author:  Tim Pope <vimNOSPAM@tpope.info>        *fugitive-author*
-License: Same terms as Vim itself (see |license|)
-
-This plugin is only available if 'compatible' is not set.
-
-==============================================================================
-INTRODUCTION                                    *fugitive*
-
-Install in ~/.vim, or in ~\vimfiles if you're on Windows and feeling lucky.
-Vim 7.2 is recommended as it ships with syntax highlighting for many Git file
-types.
-
-If you're in a hurry to get started, here are some things to try:
-
-In any file in your repository, run |:Gedit| HEAD.  Press <CR> to jump to the
-current branch.  Press <CR> again to jump to the top most commit.  Keep using
-<CR> to explore parent commits, trees, and blobs.  Use C in a tree or blob to
-get back to the commit.
-
-Edit a file in the work tree and make some changes.  Use |:Gdiff| to open up
-the indexed version.  Use |do| and |dp| on various hunks to bring the files in
-sync, or use |:Gread!| to pull in all changes.  Write the indexed version to
-stage the file.
-
-Run |:Gblame| in a work tree file to see a blame in a vertical split.  Press
-<CR> on any line to reopen and reblame that file as it stood in that commit.
-Press o or O on any line to inspect that commit in a split or a tab.
-
-Run |:Ggrep| to search the work tree or history.  Run |:Gmove| to rename a
-file.  Run |:Gremove| to delete a file.
-
-==============================================================================
-COMMANDS                                        *fugitive-commands*
-
-These commands are local to the buffers in which they work (generally, buffers
-that are part of Git repositories).
-
-                                                *fugitive-:Git*
-:Git [args]             Run an arbitrary git command. Similar to :!git [args]
-                        but chdir to the repository tree first.
-
-                                                *fugitive-:Gcd*
-:Gcd [directory]        |:cd| relative to the repository.
-
-                                                *fugitive-:Glcd*
-:Glcd [directory]       |:lcd| relative to the repository.
-
-                                                *fugitive-:Ggrep*
-:Ggrep [args]           |:grep| with git-grep as 'grepprg'.
-
-                                                *fugitive-:Glog*
-:Glog                   Load all commits that touched the current file into
-                        the quickfix list.
-
-                                        *fugitive-:Gedit* *fugitive-:Ge*
-:Gedit [revision]       |:edit| a |fugitive-revision|.
-
-                                                *fugitive-:Gsplit*
-:Gsplit [revision]      |:split| a |fugitive-revision|.
-
-                                                *fugitive-:Gvsplit*
-:Gvsplit [revision]     |:vsplit| a |fugitive-revision|.
-
-                                                *fugitive-:Gtabedit*
-:Gtabedit [revision]    |:tabedit| a |fugitive-revision|
-
-                                                *fugitive-:Gpedit*
-:Gpedit [revision]      |:pedit| a |fugitive-revision|
-
-                                                *fugitive-:Gread*
-:Gread [revision]       |:read| a |fugitive-revision|
-
-                                                *fugitive-:Gread!*
-:Gread! [revision]      Empty the buffer and |:read| a |fugitive-revision|.
-                        This is similar to git checkout on a work tree file or
-                        git add on a stage file, but without writing anything
-                        to disk.
-
-                                                *fugitive-:Gdiff*
-:Gdiff [revision]       Perform a |vimdiff| the current file against the index
-                        or the given revision.  Use |do| and |dp| and write to
-                        the index file to simulate git add -p.
-
-                                                *fugitive-:Gmove*
-:Gmove {destination}    Wrapper around git-mv that renames the buffer
-                        afterward.  The destination is relative to the current
-                        directory except when started with a /, in which case
-                        it is relative to the work tree.  Add a ! to pass -f.
-
-                                                *fugitive-:Gremove*
-:Gremove                Wrapper around git-rm that deletes the buffer
-                        afterward.  When invoked in an index file, --cached is
-                        passed.  Add a ! to pass -f and forcefully discard the
-                        buffer.
-
-                                                *fugitive-:Gblame*
-:Gblame                 Run git-blame on the file and open the results in a
-                        scroll bound vertical split.  Press enter on a line to
-                        reblame the file as it was in that commit.
-
-:[range]Gblame          Run git-blame on the given range.
-
-==============================================================================
-MAPPINGS                                        *fugitive-mappings*
-
-These maps are available in Git objects.
-
-                                                *fugitive-<CR>*
-<CR>                    Jump to the revision under the cursor.
-
-                                                *fugitive-o*
-o                       Jump to the revision under the cursor in a new split.
-
-                                                *fugitive-O*
-O                       Jump to the revision under the cursor in a new tab.
-
-                                                *fugitive-~*
-~                       Go to the current file in the [count]th first
-                        ancestor.
-
-                                                *fugitive-P*
-P                       Go to the current file in the [count]th parent.
-
-                                                *fugitive-C*
-C                       Go to the commit containing the current file.
-
-                                                *fugitive-a*
-a                       Show the current tag, commit, or tree in an alternate
-                        format.
-
-==============================================================================
-SPECIFYING REVISIONS                            *fugitive-revision*
-
-Fugitive revisions are similar to Git revisions as defined in the "SPECIFYING
-REVISIONS" section in the git-rev-parse man page.  For commands that accept an
-optional revision, the default is the file in the index for work tree files
-and the work tree file for everything else.  Example revisions follow.
-
-Revision        Meaning ~
-HEAD            .git/HEAD
-master          .git/refs/heads/master
-HEAD^{}         The commit referenced by HEAD
-HEAD^           The parent of the commit referenced by HEAD
-HEAD:           The tree referenced by HEAD
-/HEAD           The file named HEAD in the work tree
-Makefile        The file named Makefile in the work tree
-HEAD^:Makefile  The file named Makefile in the parent of HEAD
-:Makefile       The file named Makefile in the index (writable)
--               The current file in HEAD
-^               The current file in the previous commit
-~3              The current file 3 commits ago
-:               A list of files in the index
-:0              The current file in the index
-:1              The current file's common ancestor during a conflict
-:2              The current file in the target branch during a conflict
-:3              The current file in the merged branch during a conflict
-:/foo           The most recent commit with "foo" in the message
-
-==============================================================================
-ABOUT                                           *fugitive-about*
-
-Grab the latest version or report a bug on Github:
-
-http://github.com/tpope/vim-fugitive
-
-==============================================================================
- vim:tw=78:et:ft=help:norl:

File .vim/doc/snippets_emu.txt

-*snippets_emu.txt*  For Vim version 7.0. Last change: 2006 Dec 26
-
-
-		  VIM REFERENCE MANUAL    by Panos Laganakos and Felix Ingram
-
-
-1. SnippetsEmu Features                         |snippets_emu-features|
-        Basic Snippets                              |basic-snippet|
-        Named Tags                                  |named-tags|
-        Tag Commands                                |snippet-commands|
-        Buffer Specific Snippets                    |snip-buffer-specific|
-        Filetype Specific Snippets                  |snip-ftplugin|
-        Snippets menu                               |snip-menu|
-2. SnippetsEmu Options                          |snippets_emu-options|
-        Start and End Tags                          |snip-start-end-tags|
-        Element Delimiter                           |snip-start-end-tags|
-        Remapping the default jump key              |snip-remap-key|
-3. Detailed Explanations                        |snip-detailed-explanations|
-        Valid Tag Names                             |snip-tag-name-syntax|
-        Advanced Tag Command Examples               |snip-advanced-tag-commands|
-4. SnippetsEmu Contact Details                  |snip-contact-details|
-5. Contributors                                 |snip-contributors|
-6. SnippetsEmu Known Bugs                       |snippets_emu-bugs|
-7. Troubleshooting                              |snippets_emu-troubleshooting|
-
-{Vi does not have any of these features}
-
-==============================================================================
-SNIPPETSEMU FEATURES					*snippets_emu-features*
-
-SnippetsEmu attempts to emulate several of the snippets features of the OS X
-editor TextMate, in particular the variable bouncing and replacement behaviour.
-Simple usage is built up around the following functionality:
-
-	Basic Snippet					|basic-snippet|
-	Named Tags					|named-tags|
-	Executable Snippet				|snippet-commands|
-        Buffer Specific Snippets                        |snip-buffer-specific|
-
-                                                               *basic-snippet*
-                                                               *:Snippet*
-Basic Snippet ~
-
-A basic snippet can save you a lot of typing. Define a word trigger and on
-insertion it will be expanded to the full snippet. SnippetsEmu allows the
-user to define markers within the larger piece of text which will be used
-to place the cursor upon expansion.
-
-The command used to define a snippet is 'Snippet'.
-
-Basic Syntax: >
-
-	:Snippet trigger_name The cursor will be placed here: <{}> Trailing text
-
-In insert mode typing 'trigger_name<Tab>' will remove 'trigger_name' and
-replace it with the text: 'The cursor will be placed here:  Trailing text'.
-The cursor will be placed between the two spaces before the word 'Trailing'
-
-NOTE: All text should be entered on the same command line. The formatting of
-this document may mean that examples are wrapped but they should all be
-entered on a single line.
-
-                                                                  *named-tags*
-Named tags ~
-
-Instead of the simple '<{}>' tags used for cursor placement a user can define
-named tags. When the value of a named tag is changed then all other tags with
-that name will be changed to the same value.
-
-E.g. >
-
-    :Snippet trigger My name is <{forename}> <{surname}>. Call me <{forename}>.
-
-In insert mode typing 'trigger<Tab>' will place the cursor inside the
-'<{forename}>' tag. Whatever is entered inside the tag will replace the other
-similarly named tag at the end of the line after the user presses 'Tab'.
-
-If no value is entered for a named tag then the tag's name will be used
-instead. This is one way of defining default values.
-
-Using the above example, entering 'trigger<Tab>' and pressing 'Tab' twice
-will result in the following text: >
-
-    My name is forename surname. Please call me forename.
-
-The rules for what constitutes a valid tag name are explained below. See
-|snip-tag-name-syntax|.
-                                                            *snippet-commands*
-Tag commands ~
-
-Tags can contain commands. Commands can be any Vim function, including user
-defined functions.
-
-A common example is performing substitutions.
-
-E.g. >
-
-    :Snippet trigger My name is <{name}>.  I SAID: MY NAME IS
-    <{name:substitute(@z,'.','\u&','g')}>!
-
-The value entered in the <{name}> tag will be passed to the command in the
-second <{name}> tag in the @z register (any value already in @z will be
-preserved and restored). The substitute command will change the entered value
-to be in upper case. I.e. Entering 'trigger<Tab>' and typing 'Tycho<Tab>'
-will result in the following text: >
-    
-    My name is Tycho. I SAID: MY NAME IS TYCHO!
-~
-                                                           *snip-special-vars*
-There is a set of special variables which can be included in snippets. These
-will be replaced before the snippet's text is inserted into the buffer. The
-list of available variables is detailed below:
-
- * SNIP_FILE_NAME - The current file name (from 'expand("%")')
- * SNIP_ISO_DATE - The current date in YYYY-MM-DD format.
-
-                                                       *snip-snippet-commands*
-In addition to tag commands it is also possible to define commands which will
-be executed before the snippet is inserted into the buffer. These are defined
-within double backticks. 
-
-E.g.
->
-    :Snippet date The current date is ``strftime("%c")``
-
-Commands are standard Vim commands and will be 'exec'uted and the command
-output substituted into the text.
-
-                                                        *snip-buffer-specific*
-Buffer Specific Snippets ~
-
-The Snippet command defines buffer specific snippets. This is the recommended
-option when using filetype specific snippets. It is possible to define
-'global' snippets which will act across all buffers. These can be defined
-using the legacy 'Iabbr' command (note the capital 'I'). 
-
-E.g. >
-    Iabbr for for <{var}> in <{list}>:<CR><{}>
-~
-                                                               *snip-ftplugin*
-The preferred practice for defining filetype specific snippets is to include 
-them in files named <filetype>_snippets.vim and for these files to be placed in the
-~/.vim/after/ftplugin directory (or vimfiles\after\ftplugin under Windows).
-When a file of a specific type is loaded so will all of the defined snippets.
-The 'after' directory is used to ensure that the plugin has been loaded. It is
-also recommended that the following is included at the top of the file: >
-    
-    if !exists('loaded_snippet') || &cp
-        finish
-    endif
-
-This will stop errors being generated if the plugin has not loaded for any
-reason.
-
-Users wishing to add their own filetype snippets should add them to a separate
-file to ensure they are not lost when upgrading the plugin. Naming the files
-<filetype>_mysnippets.vim or similar is the preferred practice.
-
-                                                                   *snip-menu*
-When loading the plugin will search for all files named '*_snippets.vim'.
-These will be added to the 'Snippets' menu which is available in Normal mode.
-Selecting options from the menu will source the file and hence load any
-snippets defined within it.
-
-                                           *creating-snippets* *CreateSnippet*
-[range]CreateSnippet
-               The CreateSnippet command allows the simple creation of
-               snippets for use within your own file. Without a range the
-               current line will be used. When passed a range then all the
-               lines in the range will be converted for use in a command.
-
-               Snippets created by the command will be added to a scratch
-               buffer called 'Snippets'. The current value of an empty tag
-               (snip_start_tag.snip_end_tag, '<{}>' by default) will be added
-               to the unnamed register and so can be inserted with appropriate
-               paste commands.
-
-                                                         *CreateBundleSnippet*
-[range]CreateBundleSnippet
-               CreateBundleSnippet works exactly like CreateSnippet but the
-               resulting text will be suitable for including in one of the
-               included bundles. The unnamed register will include the text
-               '"st.et."' so start and end tag agnostic empty tags can be
-               included.
-
-===============================================================================
-SNIPPETSEMU OPTIONS                                     *snippets_emu-options*
-                                                         *snip-start-end-tags*
-Start and End Tags ~
-
-By default the start and end tags are set to be '<{' and '}>'. These can be
-changed by setting the following variables in vimrc: >
-
-    g:snip_start_tag
-    g:snip_end_tag
-
-They can be also changed for a specific buffer by setting the following: >
-
-    b:snip_start_tag
-    b:snip_end_tag
-~
-                                                         *snip-elem-delimiter*
-Element Delimiter ~
-
-The value of snip_elem_delim is used to separate a tag's name and its command.
-By default it is set to ':' but can be set as above either globally or for a
-specific buffer using the following variables: >
-    
-    g:snip_elem_delim
-    b:snip_elem_delim
-~
-                                                              *snip-remap-key*
-Remapping the default jump key ~
-
-The trigger key is mapped to Tab by default. Some people may wish to remap
-this if it causes conflicts with other plugins. The key can be set in your
-<.vimrc> by setting the 'g:snippetsEmu_key' variable.
-An example
->
-    let g:snippetsEmu_key = "<S-Tab>"
-
-Snippets will now be triggered by Shift-Tab rather than just Tab. NB, this
-example may not work in all terminals as some trap Shift-Tab before it gets
-to Vim.
-
-~
-==============================================================================
-DETAILED EXPLANATIONS                             *snip-detailed-explanations*
-                                                        *snip-tag-name-syntax*
-Valid Tag Names ~
-
-Tag names cannot contain whitespace unless they are enclosed in quotes.
-
-Valid Examples: >
-    <{validName}>
-    <{"valid name"}>
-    <{tagName:command}>
-    <{"Tag Name":command}>
-
-Invalid Examples: >
-    <{invalid name}>
-    <{Tag Name:command}>
-    <{:command}>
-
-~
-                                                  *snip-advanced-tag-commands*
-Advanced Tag Command Examples ~
-
-Commands in tags can be as complex as desired. Readability is the main
-limitation as the command will be placed in the document before execution.
-
-The preferred method for defining complex commands is to hide the
-functionality in a user function.
-
-Example:
->
-    
-    function! Count(haystack, needle)
-        let counter = 0
-        let index = match(a:haystack, a:needle)
-        while index > -1
-            let counter = counter + 1
-            let index = match(a:haystack, a:needle, index+1)
-        endwhile
-        return counter
-    endfunction
-
-    function! PyArgList(count)
-        if a:count == 0
-            return "(,)"
-        else
-            return '('.repeat('<{}>, ', a:count).')'
-        endif
-    endfunction
-
-    Snippet pf print "<{s}>" % <{s:PyArgList(Count(@z, '%[^%]'))}><CR><{}>
-
-The above snippet will expand 'pf' to 'print "<{s}>" ...'. The user then
-enters a format string. Once the string is entered the Count and PyArgList
-functions are used to generate a number of empty tags.
-
-                                                            *snip-limitations*
-The above represents once of the limitations of the plugin. Due to the way
-tags are identified it is not possible to include empty tags in another tag's
-command. The only way to generate empty tags is to return them from a function
-as in the above example. For other examples see the included bundles.
-
-                                                                *snip-bundles*
-The included bundles are not defined in the 'preferred style'. In order to
-accommodate users who wish to redefine the default tags all snippet
-definitions are 'executed' with the 'exec' command.
-
-E.g.
->
-    exec "Snippet test This isn't the right way to ".st.et." define snippets"
-
-Executing the command allows 'st' and 'et' to be used in place of start and
-end tags. 'st' and 'et' are defined elsewhere in the bundle file.
-
-==============================================================================
-SNIPPETSEMU CONTACT DETAILS                             *snip-contact-details*
-
-To contact the author please email:
-
-F <dot> Ingram <dot> lists <at> gmail <dot> com
-
-The author welcomes corrections to this documentation, example snippets and
-bug reports.
-
-The plugin is also currently hosted at Google Code:
-    http://code.google.com/p/snippetsemu
-
-Bug reports can also be posted on the hosting site:
-    http://code.google.com/p/snippetsemu/issues/list
-
-                                                           *snip-contributors*
-Contributors to SnippetsEmu ~
-
-Patches:
-Ori Avtalion - Improvements to Snippet command
-Freddy Vulto - Improved behaviour
-Andy Block - Bug with commands on same line. This is why I should do better
-test suites.
-bzklrm - Removal of some normal commands
-Priit Tamboom - Sorting out left and right mappings
-
-Documentation:
-Panos Laganakos - Greek translation (coming soon)
-
-Bundles:
-Panos Laganakos - Python snippets
-Alex Pounds - Django snippets
-Chris Lasher - Python snippets
-knipknap - Python snippets
-James Widman - C snippets
-
-==============================================================================
-SNIPPETSEMU KNOWN BUGS                  		   *snippets_emu-bugs*
-
-Bugs are currently tracked on Google Code. Please post any you find on the
-issue tracker:
-    http://code.google.com/p/snippetsemu/issues/list
-
-==============================================================================
-SNIPPETSEMU TROUBLESHOOTING                     *snippets_emu-troubleshooting*
-
-Problem:    Bundles are not loading.
-Answer:     Ensure that you have filetype plugins turned on. Include the
-            following in your vimrc: >
-
-                filetype plugin on
-
-
-vim:tw=78:sw=4:ts=8:ft=help:norl:

File .vim/plugin/NERD_snippets.vim

-" ============================================================================
-" File:        NERDSnippets.vim
-" Description: vim global plugin for snippets that own hard
-" Maintainer:  Martin Grenfell <martin_grenfell at msn dot com>
-" Last Change: 18 October, 2008
-" License:     This program is free software. It comes without any warranty,
-"              to the extent permitted by applicable law. You can redistribute
-"              it and/or modify it under the terms of the Do What The Fuck You
-"              Want To Public License, Version 2, as published by Sam Hocevar.
-"              See http://sam.zoy.org/wtfpl/COPYING for more details.
-"
-
-if v:version < 700
-    finish
-endif
-
-if exists("loaded_nerd_snippets_plugin")
-    finish
-endif
-let loaded_nerd_snippets_plugin = 1
-
-" Variable Definations: {{{1
-" options, define them as you like in vimrc:
-if !exists("g:NERDSnippets_key")
-    let g:NERDSnippets_key = "<tab>"
-endif
-
-if !exists("g:NERDSnippets_marker_start")
-    let g:NERDSnippets_marker_start = '<+'
-endif
-let s:start = g:NERDSnippets_marker_start
-
-if !exists("g:NERDSnippets_marker_end")
-    let g:NERDSnippets_marker_end = '+>'
-endif
-let s:end = g:NERDSnippets_marker_end
-
-let s:in_windows = has("win16") ||  has("win32") || has("win64")
-
-let s:topOfSnippet = -1
-let s:appendTab = 1
-let s:snippets = {}
-let s:snippets['_'] = {}
-
-function! s:enableMaps()
-    exec "inoremap ".g:NERDSnippets_key." <c-o>:call NERDSnippets_PreExpand()<cr><c-r>=NERDSnippets_ExpandSnippet()<cr><c-o>:call NERDSnippets_PostExpand()<cr><c-g>u<c-r>=NERDSnippets_SwitchRegion(1)<cr>"
-    exec "nnoremap ".g:NERDSnippets_key." i<c-g>u<c-r>=NERDSnippets_SwitchRegion(0)<cr>"
-    exec "snoremap ".g:NERDSnippets_key." <esc>i<c-g>u<c-r>=NERDSnippets_SwitchRegion(0)<cr>"
-endfunction
-command! -nargs=0 NERDSnippetsEnable call <SID>enableMaps()
-call s:enableMaps()
-
-function! s:disableMaps()
-    exec "iunmap ".g:NERDSnippets_key
-    exec "nunmap ".g:NERDSnippets_key
-    exec "sunmap ".g:NERDSnippets_key
-endfunction
-command! -nargs=0 NERDSnippetsDisable call <SID>disableMaps()
-
-" Snippet class {{{1
-let s:Snippet = {}
-
-function! s:Snippet.New(expansion, ...)
-    let newSnippet = copy(self)
-    let newSnippet.expansion = a:expansion
-    if a:0
-        let newSnippet.name = a:1
-    else
-        let newSnippet.name = ''
-    endif
-    return newSnippet
-endfunction
-
-function! s:Snippet.stringForPrompt()
-    if self.name != ''
-        return self.name
-    else
-        return substitute(self.expansion, "\r", '<CR>', 'g')
-    endif
-endfunction
-"}}}1
-
-function! NERDSnippets_ExpandSnippet()
-    let snippet_name = substitute(getline('.')[:(col('.')-2)],'\zs.*\W\ze\w*$','','g')
-    let snippet = s:snippetFor(snippet_name)
-    if snippet != ''
-        let s:appendTab = 0
-        let s:topOfSnippet = line('.')
-        let snippet = "\<c-o>ciw" . snippet
-    else
-        let s:appendTab = 1
-    endif
-    return snippet
-endfunction
-
-function! NERDSnippets_PreExpand()
-    let b:NERDSnippets_old_format_options = &fo
-    setl fo-=t
-    setl fo-=c
-    setl fo-=r
-    setl fo-=a
-    setl fo-=n
-endfunction
-
-function! NERDSnippets_PostExpand()
-    let &l:fo = b:NERDSnippets_old_format_options
-endfunction
-
-"jump to the next marker, remove the delimiters and select the text inside in
-"select mode
-"
-"if no markers are found, a <tab> may be inserted into the text
-function! NERDSnippets_SwitchRegion(allowAppend)
-    if s:topOfSnippet != -1
-        call cursor(s:topOfSnippet,1)
-        let s:topOfSnippet = -1
-    endif
-
-    try
-        let markerPos = s:nextMarker()
-        let markersEmpty = stridx(getline("."), s:start.s:end) == markerPos[0]-1
-
-        let removedMarkers = 0
-        if s:removeMarkers()
-            let markerPos[1] -= (strlen(s:start) + strlen(s:end))
-            let removedMarkers = 1
-        endif
-
-        call cursor(line("."), markerPos[0])
-        normal! v
-        call cursor(line("."), markerPos[1] + strlen(s:end) - 1 + (&selection == "exclusive"))
-
-        if removedMarkers && markersEmpty
-            return "\<right>"
-        else
-            return "\<c-\>\<c-n>gvo\<c-g>"
-        endif
-
-    catch /NERDSnippets.NoMarkersFoundError/
-        if s:appendTab && a:allowAppend
-            if g:NERDSnippets_key == "<tab>"
-                return "\<tab>"
-            endif
-        endif
-        "we were called from normal mode so return to normal and move the
-        "cursor forward again
-        return "\<ESC>l"
-    endtry
-endfunction
-
-"jump the cursor to the start of the next marker and return an array of the
-"for [start_column, end_column], where start_column points to the start of
-"<+ and end_column points to the start of +>
-function! s:nextMarker()
-    let start = searchpos('\V'.s:start.'\.\{-\}'.s:end, 'c')[1]
-    if start == 0
-        throw "NERDSnippets.NoMarkersFoundError"
-    endif
-
-    let l = getline(".")
-    let balance = 0
-    let i = start-1
-    while i < strlen(l)
-        if strpart(l, i, strlen(s:start)) == s:start
-            let balance += 1
-        elseif strpart(l, i, strlen(s:end)) == s:end
-            let balance -= 1
-        endif
-
-        if balance == 0
-            "add 1 for 'string index' => 'column number' conversion
-            return [start,i+1]
-        endif
-
-        let i += 1
-
-    endwhile
-    throw "NERDSnippets.MalformedMarkersError"
-endfunction
-
-"asks the user to select a snippet from the given list
-"
-"returns the body of the chosen snippet
-function! s:chooseSnippet(snippets)
-    "build the dialog/choice list
-    let prompt = ""
-    let i = 0
-    while i < len(a:snippets)
-        let prompt .= i+1 . ". " . a:snippets[i].stringForPrompt() . "\n"
-        let i += 1
-    endwhile
-    let prompt .= "\nSelect a snippet:"
-
-    "input(save|restore) needed because this function is called during a
-    "mapping
-    redraw!
-    call inputsave()
-    if len(a:snippets) < 10
-        echon prompt
-        let choice = nr2char(getchar())
-    else
-        let choice = input(prompt)
-    endif
-    call inputrestore()
-    redraw!
-
-    if choice !~ '^\d*$' || choice < 1 || choice > len(a:snippets)
-        return ""
-    endif
-
-    return a:snippets[choice-1].expansion
-endfunction
-
-"get a snippet for the given keyword, if multiple snippets are found then prompt
-"the user to choose.
-"
-"if no snippets are found, return ''
-function! s:snippetFor(keyword)
-    let snippets = []
-    if has_key(s:snippets,&ft)
-        if has_key(s:snippets[&ft],a:keyword)
-            let snippets = extend(snippets, s:snippets[&ft][a:keyword])
-        endif
-    endif
-    if has_key(s:snippets['_'],a:keyword)
-        let snippets = extend(snippets, s:snippets['_'][a:keyword])
-    endif
-
-    if len(snippets)
-        if len(snippets) == 1
-            return snippets[0].expansion
-        else
-            return s:chooseSnippet(snippets)
-        endif
-    endif
-
-    return ''
-endfunction
-
-"removes a set of markers from the current cursor postion
-"
-"i.e. turn this
-"   foo <+foobar+> foo
-
-"into this
-"
-"  foo foobar foo
-function! s:removeMarkers()
-    try
-        let marker = s:nextMarker()
-        if strpart(getline('.'), marker[0]-1, strlen(s:start)) == s:start
-
-            "remove them
-            let line = getline(".")
-            let start = marker[0] - 1
-            let startOfBody = start + strlen(s:start)
-            let end = marker[1] - 1
-            let line = strpart(line, 0, start) .
-                        \ strpart(line, startOfBody, end - startOfBody) .
-                        \ strpart(line, end+strlen(s:end))
-            call setline(line("."), line)
-            return 1
-        endif
-    catch /NERDSnippets.NoMarkersFoundError/
-    endtry
-endfunction
-
-"add a new snippet for the given filetype and keyword
-function! s:addSnippet(filetype, keyword, expansion, ...)
-    if !has_key(s:snippets, a:filetype)
-        let s:snippets[a:filetype] = {}
-    endif
-
-    if !has_key(s:snippets[a:filetype], a:keyword)
-        let s:snippets[a:filetype][a:keyword] = []
-    endif
-
-    let snippetName = ''
-    if a:0
-        let snippetName = a:1
-    endif
-
-    let newSnippet = s:Snippet.New(a:expansion, snippetName)
-
-    call add(s:snippets[a:filetype][a:keyword], newSnippet)
-endfunction
-
-"remove all snippets
-function! NERDSnippetsReset()
-    let s:snippets = {}
-    let s:snippets['_'] = {}
-endfunction
-
-
-"Extract snippets from the given directory. The snippet filetype, keyword, and
-"possibly name, are all inferred from the path of the .snippet files relative
-"to a:dir.
-function! NERDSnippetsFromDirectory(dir)
-    let snippetFiles = split(globpath(expand(a:dir), '**/*.snippet'), '\n')
-    for fullpath in snippetFiles
-        let tail = strpart(fullpath, strlen(expand(a:dir)))
-
-        if s:in_windows
-            let tail = substitute(tail, '\\', '/', 'g')
-        endif
-
-        let filetype = substitute(tail, '^/\([^/]*\).*', '\1', '')
-        let keyword = substitute(tail, '^/[^/]*\(.*\)', '\1', '')
-        call s:extractSnippetFor(fullpath, filetype, keyword)
-    endfor
-endfunction
-
-"Extract snippets from the given directory for the given filetype.
-"
-"The snippet keywords (and possibly names) are interred from the path of the
-".snippet files relative to a:dir
-function! NERDSnippetsFromDirectoryForFiletype(dir, filetype)
-    let snippetFiles = split(globpath(expand(a:dir), '**/*.snippet'), '\n')
-    for i in snippetFiles
-        let base = expand(a:dir)
-        let fullpath = expand(i)
-        let tail = strpart(fullpath, strlen(base))
-
-        if s:in_windows
-            let tail = substitute(tail, '\\', '/', 'g')
-        endif
-
-        call s:extractSnippetFor(fullpath, a:filetype, tail)
-    endfor
-endfunction
-
-"create a snippet from the given file
-"
-"Args:
-"fullpath: full path to snippet file
-"filetype: the filetype for the new snippet
-"tail: the last part of the path containing the keyword and possibly name. eg
-" '/class.snippet'   or  '/class/with_constructor.snippet'
-function! s:extractSnippetFor(fullpath, filetype, tail)
-    let keyword = ""
-    let name = ""
-
-    let slashes = strlen(substitute(a:tail, '[^/]', '', 'g'))
-    if slashes == 1
-        let keyword = substitute(a:tail, '^/\(.*\)\.snippet', '\1', '')
-    elseif slashes == 2
-        let keyword = substitute(a:tail, '^/\([^/]*\)/.*$', '\1', '')
-        let name = substitute(a:tail, '^/[^/]*/\(.*\)\.snippet', '\1', '')
-    else
-        throw 'NERDSnippets.ScrewedSnippetPathError ' . a:fullpath
-    endif
-
-    let snippetContent = s:parseSnippetFile(a:fullpath)
-
-    call s:addSnippet(a:filetype, keyword, snippetContent, name)
-endfunction
-
-
-"Extract and munge the body of the snippet from the given file.
-function! s:parseSnippetFile(path)
-    try
-        let lines = readfile(a:path)
-    catch /E484/
-        throw "NERDSnippet.ScrewedSnippetPathError " . a:path
-    endtry
-
-    let i = 0
-    while i < len(lines)
-        "add \<CR> to the end of the lines, but not the last line
-        if i < len(lines)-1
-            let lines[i] = substitute(lines[i], '$', '\1' . "\<CR>", "")
-        endif
-
-        "remove leading whitespace
-        let lines[i] = substitute(lines[i], '^\s*', '', '')
-
-        "make \<C-R>= function in the templates
-        let lines[i] = substitute(lines[i], '\c\\<c-r>=', "\<c-r>=", "g")
-
-        "make \<C-O>= function in the templates
-        let lines[i] = substitute(lines[i], '\c\\<c-o>', "\<c-o>", "g")
-
-        "make \<CR> function in templates
-        let lines[i] = substitute(lines[i], '\c\\<cr>', "\<cr>", "g")
-
-        let i += 1
-    endwhile
-
-    return join(lines, '')
-endfunction
-
-"some global functions that are handy inside snippet files {{{1
-function! NS_prompt(varname, prompt, default)
-    "input(save|restore) needed because this function is called during a
-    "mapping
-    call inputsave()
-    let input = input(a:prompt . ':', a:default)
-    exec "let g:" . a:varname . "='" . escape(input, "'") . "'"
-    call inputrestore()
-    redraw!
-    return input
-endfunction
-
-function! NS_camelcase(s)
-    "upcase the first letter
-    let toReturn = substitute(a:s, '^\(.\)', '\=toupper(submatch(1))', '')
-    "turn all '_x' into 'X'
-    return substitute(toReturn, '_\(.\)', '\=toupper(submatch(1))', 'g')
-endfunction
-
-function! NS_underscore(s)
-    "down the first letter
-    let toReturn = substitute(a:s, '^\(.\)', '\=tolower(submatch(1))', '')
-    "turn all 'X' into '_x'
-    return substitute(toReturn, '\([A-Z]\)', '\=tolower("_".submatch(1))', 'g')
-endfunction
-"}}}
-
-" vim: set ft=vim ff=unix fdm=marker :

File .vim/plugin/fugitive.vim

-" fugitive.vim - Fugitive
-" Maintainer:   Tim Pope <vimNOSPAM@tpope.info>
-
-if (exists("g:loaded_fugitive") && g:loaded_fugitive) || &cp
-  finish
-endif
-let g:loaded_fugitive = 1
-
-if !exists('g:fugitive_git_executable')
-  let g:fugitive_git_executable = 'git'
-endif
-
-" Utility {{{1
-
-function! s:function(name) abort
-  return function(substitute(a:name,'^s:',matchstr(expand('<sfile>'), '<SNR>\d\+_'),''))
-endfunction
-
-function! s:sub(str,pat,rep) abort
-  return substitute(a:str,'\v\C'.a:pat,a:rep,'')
-endfunction
-
-function! s:gsub(str,pat,rep) abort
-  return substitute(a:str,'\v\C'.a:pat,a:rep,'g')
-endfunction
-
-function! s:shellesc(arg) abort
-  if a:arg =~ '^[A-Za-z0-9_/.-]\+$'
-    return a:arg
-  else
-    return shellescape(a:arg)
-  endif
-endfunction
-
-function! s:fnameescape(file) abort
-  if exists('*fnameescape')
-    return fnameescape(a:file)
-  else
-    return escape(a:file," \t\n*?[{`$\\%#'\"|!<")
-  endif
-endfunction
-
-function! s:throw(string) abort
-  let v:errmsg = 'fugitive: '.a:string
-  throw v:errmsg
-endfunction
-
-function! s:add_methods(namespace, method_names) abort
-  for name in a:method_names
-    let s:{a:namespace}_prototype[name] = s:function('s:'.a:namespace.'_'.name)
-  endfor
-endfunction
-
-let s:commands = []
-function! s:command(definition) abort
-  let s:commands += [a:definition]
-endfunction
-
-function! s:define_commands()
-  for command in s:commands
-    exe 'command! -buffer '.command
-  endfor
-endfunction
-
-augroup fugitive_commands
-  autocmd!
-  autocmd User Fugitive call s:define_commands()
-augroup END
-
-let s:abstract_prototype = {}
-
-" }}}1
-" Initialization {{{1
-
-function! s:ExtractGitDir(path) abort
-  if a:path =~? '^fugitive://.*//'
-    return matchstr(a:path,'fugitive://\zs.\{-\}\ze//')
-  endif
-  let fn = fnamemodify(a:path,':s?[\/]$??')
-  let ofn = ""
-  let nfn = fn
-  while fn != ofn
-    if isdirectory(fn . '/.git')
-      return s:sub(simplify(fnamemodify(fn . '/.git',':p')),'/$','')
-    elseif fn =~ '\.git$' && filereadable(fn . '/HEAD')
-      return s:sub(simplify(fnamemodify(fn,':p')),'/$','')
-    endif
-    let ofn = fn
-    let fn = fnamemodify(ofn,':h')
-  endwhile
-  return ''
-endfunction
-
-function! s:Detect()
-  if !exists('b:git_dir')
-    let dir = s:ExtractGitDir(expand('%:p'))
-    if dir != ''
-      let b:git_dir = dir
-    endif
-  endif
-  if exists('b:git_dir')
-    silent doautocmd User Fugitive
-    cnoremap <expr> <buffer> <C-R><C-G> fugitive#buffer().rev()
-  endif
-endfunction
-
-augroup fugitive
-  autocmd!
-  autocmd BufNewFile,BufReadPost * call s:Detect()
-  autocmd BufUnload * execute getbufvar(+expand('<abuf>'), 'fugitive_restore')
-augroup END
-
-" }}}1
-" Repository {{{1
-
-let s:repo_prototype = {}
-let s:repos = {}
-
-function! s:repo(...) abort
-  let dir = a:0 ? a:1 : (exists('b:git_dir') ? b:git_dir : s:ExtractGitDir(expand('%:p')))
-  if dir == ''
-    call s:throw('not a git repository: '.expand('%:p'))
-  else
-    if has_key(s:repos,dir)
-      let repo = get(s:repos,dir)
-    else
-      let repo = {'git_dir': dir}
-      let s:repos[dir] = repo
-    endif
-    return extend(extend(repo,s:repo_prototype,'keep'),s:abstract_prototype,'keep')
-  endif
-endfunction
-
-function! s:repo_dir(...) dict abort
-  return join([self.git_dir]+a:000,'/')
-endfunction
-
-function! s:repo_tree(...) dict abort
-  if self.bare()
-    call s:throw('no work tree')
-  else
-    let dir = fnamemodify(self.git_dir,':h')
-    return join([dir]+a:000,'/')
-  endif
-endfunction
-
-function! s:repo_bare() dict abort
-  return self.dir() !~# '/\.git$'
-endfunction
-
-function! s:repo_translate(spec) dict abort
-  if a:spec ==# '.' || a:spec ==# '/.'
-    return self.bare() ? self.dir() : self.tree()
-  elseif a:spec =~# '^/'
-    return fnamemodify(self.dir(),':h').a:spec
-  elseif a:spec =~# '^:[0-3]:'
-    return 'fugitive://'.self.dir().'//'.a:spec[1].'/'.a:spec[3:-1]
-  elseif a:spec ==# ':'
-    return self.dir('index')
-  elseif a:spec =~# '^:/'
-    let ref = self.rev_parse(matchstr(a:spec,'.[^:]*'))
-    return 'fugitive://'.self.dir().'//'.ref
-  elseif a:spec =~# '^:'
-    return 'fugitive://'.self.dir().'//0/'.a:spec[1:-1]
-  elseif a:spec =~# 'HEAD\|^refs/' && a:spec !~ ':' && filereadable(self.dir(a:spec))
-    return self.dir(a:spec)
-  elseif filereadable(s:repo().dir('refs/'.a:spec))
-    return self.dir('refs/'.a:spec)
-  elseif filereadable(s:repo().dir('refs/tags/'.a:spec))
-    return self.dir('refs/tags/'.a:spec)
-  elseif filereadable(s:repo().dir('refs/heads/'.a:spec))
-    return self.dir('refs/heads/'.a:spec)
-  elseif filereadable(s:repo().dir('refs/remotes/'.a:spec))
-    return self.dir('refs/remotes/'.a:spec)
-  elseif filereadable(s:repo().dir('refs/remotes/'.a:spec.'/HEAD'))
-    return self.dir('refs/remotes/'.a:spec,'/HEAD')
-  else
-    try
-      let ref = self.rev_parse(matchstr(a:spec,'[^:]*'))
-      let path = s:sub(matchstr(a:spec,':.*'),'^:','/')
-      return 'fugitive://'.self.dir().'//'.ref.path
-    catch /^fugitive:/
-      return self.tree(a:spec)
-    endtry
-  endif
-endfunction
-
-call s:add_methods('repo',['dir','tree','bare','translate'])
-
-function! s:repo_git_command(...) dict abort
-  let git = g:fugitive_git_executable . ' --git-dir='.s:shellesc(self.git_dir)
-  return git.join(map(copy(a:000),'" ".s:shellesc(v:val)'),'')
-endfunction
-
-function! s:repo_git_chomp(...) dict abort
-  return s:sub(system(call(self.git_command,a:000,self)),'\n$','')
-endfunction
-
-function! s:repo_git_chomp_in_tree(...) dict abort
-  let cd = exists('*haslocaldir') && haslocaldir() ? 'lcd ' : 'cd '
-  let dir = getcwd()
-  try
-    execute cd.' `=s:repo().tree()`'
-    return call(s:repo().git_chomp, a:000, s:repo())
-  finally
-    execute cd.' `=dir`'
-  endtry
-endfunction
-
-function! s:repo_rev_parse(rev) dict abort
-  let hash = self.git_chomp('rev-parse','--verify',a:rev)
-  if hash =~ '^\x\{40\}$'
-    return hash
-  else
-    call s:throw('rev-parse '.a:rev.': '.hash)
-  endif
-endfunction
-
-call s:add_methods('repo',['git_command','git_chomp','git_chomp_in_tree','rev_parse'])
-
-function! s:repo_dirglob(base) dict abort
-  let base = s:sub(a:base,'^/','')
-  let matches = split(glob(self.tree(s:gsub(base,'/','*&').'*/')),"\n")
-  call map(matches,'v:val[ strlen(self.tree())+(a:base !~ "^/") : -1 ]')
-  return matches
-endfunction
-
-function! s:repo_superglob(base) dict abort
-  if a:base =~# '^/' || a:base !~# ':'
-    let results = []
-    if a:base !~# '^/'
-      let heads = ["HEAD","ORIG_HEAD","FETCH_HEAD","MERGE_HEAD"]
-      let heads += sort(split(s:repo().git_chomp("rev-parse","--symbolic","--branches","--tags","--remotes"),"\n"))
-      call filter(heads,'v:val[ 0 : strlen(a:base)-1 ] ==# a:base')
-      let results += heads
-    endif
-    if !self.bare()
-      let base = s:sub(a:base,'^/','')
-      let matches = split(glob(self.tree(s:gsub(base,'/','*&').'*')),"\n")
-      call map(matches,'v:val !~ "/$" && isdirectory(v:val) ? v:val."/" : v:val')
-      call map(matches,'v:val[ strlen(self.tree())+(a:base !~ "^/") : -1 ]')
-      let results += matches
-    endif
-    return results
-
-  elseif a:base =~# '^:'
-    let entries = split(self.git_chomp('ls-files','--stage'),"\n")
-    call map(entries,'s:sub(v:val,".*(\\d)\\t(.*)",":\\1:\\2")')
-    if a:base !~# '^:[0-3]\%(:\|$\)'
-      call filter(entries,'v:val[1] == "0"')
-      call map(entries,'v:val[2:-1]')
-    endif
-    call filter(entries,'v:val[ 0 : strlen(a:base)-1 ] ==# a:base')
-    return entries
-
-  else
-    let tree = matchstr(a:base,'.*[:/]')
-    let entries = split(self.git_chomp('ls-tree',tree),"\n")
-    call map(entries,'s:sub(v:val,"^04.*\\zs$","/")')
-    call map(entries,'tree.s:sub(v:val,".*\t","")')
-    return filter(entries,'v:val[ 0 : strlen(a:base)-1 ] ==# a:base')
-  endif
-endfunction
-
-call s:add_methods('repo',['dirglob','superglob'])
-
-function! s:repo_keywordprg() dict abort
-  let args = ' --git-dir='.escape(self.dir(),"\\\"' ").' show'
-  if has("gui_running")
-    return g:fugitive_git_executable . ' --no-pager' . args
-  else
-    return g:fugitive_git_executable . args
-  endif
-endfunction
-
-call s:add_methods('repo',['keywordprg'])
-
-" }}}1
-" Buffer {{{1
-
-let s:buffer_prototype = {}
-
-function! s:buffer(...) abort
-  let buffer = {'#': bufnr(a:0 ? a:1 : '%')}
-  call extend(extend(buffer,s:buffer_prototype,'keep'),s:abstract_prototype,'keep')
-  if buffer.getvar('git_dir') == ''
-    call s:throw('not a git repository: '.expand('%:p'))
-  endif
-  return buffer
-endfunction
-
-function! fugitive#buffer(...) abort
-  return s:buffer(a:0 ? a:1 : '%')
-endfunction
-
-function! s:buffer_getvar(var) dict abort
-  return getbufvar(self['#'],a:var)
-endfunction
-
-function! s:buffer_getline(lnum) dict abort
-  return getbufline(self['#'],a:lnum)[0]
-endfunction
-
-function! s:buffer_repo() dict abort
-  return s:repo(self.getvar('git_dir'))
-endfunction
-
-function! s:buffer_type(...) dict abort
-  if self.getvar('fugitive_type') != ''
-    let type = self.getvar('fugitive_type')
-  elseif fnamemodify(self.name(),':p') =~# '.\git/refs/\|\.git/\w*HEAD$'
-    let type = 'head'
-  elseif self.getline(1) =~ '^tree \x\{40\}$' && self.getline(2) == ''
-    let type = 'tree'
-  elseif self.getline(1) =~ '^\d\{6\} \w\{4\} \x\{40\}\>\t'
-    let type = 'tree'
-  elseif self.getline(1) =~ '^\d\{6\} \x\{40\}\> \d\t'
-    let type = 'index'
-  elseif isdirectory(self.name())
-    let type = 'directory'
-  elseif filereadable(self.name())
-    let type = 'file'
-  else
-    let type = ''
-  endif
-  if a:0
-    return !empty(filter(copy(a:000),'v:val ==# type'))
-  else
-    return type
-  endif
-endfunction
-
-function! s:buffer_name() dict abort
-  return fnamemodify(bufname(self['#']),':p')
-endfunction
-
-function! s:buffer_commit() dict abort
-  return matchstr(self.name(),'^fugitive://.\{-\}//\zs\w*')
-endfunction
-
-function! s:buffer_path(...) dict abort
-  let rev = matchstr(self.name(),'^fugitive://.\{-\}//\zs.*')
-  if rev != ''
-    let rev = s:sub(rev,'\w*','')
-  elseif self.name() =~ '\.git/refs/\|\.git/.*HEAD$'
-    let rev = ''
-  else
-    let rev = self.name()[strlen(self.repo().tree()) : -1]
-  endif
-  return s:sub(rev,'^/',a:0 ? a:1 : '')
-endfunction
-
-function! s:buffer_rev() dict abort
-  let rev = matchstr(self.name(),'^fugitive://.\{-\}//\zs.*')
-  if rev =~ '^\x/'
-    return ':'.rev[0].':'.rev[2:-1]
-  elseif rev =~ '.'
-    return s:sub(rev,'/',':')
-  elseif self.name() =~ '\.git/index$'
-    return ':'
-  elseif self.name() =~ '\.git/refs/\|\.git/.*HEAD$'
-    return self.name()[strlen(self.repo().dir())+1 : -1]
-  else
-    return self.path()
-  endif
-endfunction
-
-function! s:buffer_sha1() dict abort
-  if self.name() =~ '^fugitive://' || self.name() =~ '\.git/refs/\|\.git/.*HEAD$'
-    return self.repo().rev_parse(self.rev())
-  else
-    return ''
-  endif
-endfunction
-
-function! s:buffer_expand(rev) dict abort
-  if a:rev =~# '^:[0-3]$'
-    let file = a:rev.self.path(':')
-  elseif a:rev =~# '^-'
-    let file = 'HEAD^{}'.a:rev[1:-1].self.path(':')
-  elseif a:rev =~# '^@{'
-    let file = 'HEAD'.a:rev.self.path(':')
-  elseif a:rev =~# '^[~^]'
-    let commit = s:sub(self.commit(),'^\d=$','HEAD')
-    let file = commit.a:rev.self.path(':')
-  else
-    let file = a:rev
-  endif
-  return s:sub(file,'\%$',self.path())
-endfunction
-
-function! s:buffer_containing_commit() dict abort
-  if self.commit() =~# '\x\{40\}'
-    return self.commit()
-  elseif self.commit() =~# '.'
-    return ':'
-  else
-    return 'HEAD'
-  endif
-endfunction
-
-call s:add_methods('buffer',['getvar','getline','repo','type','name','commit','path','rev','sha1','expand','containing_commit'])
-
-" }}}1
-" Git {{{1
-
-call s:command("-bar -bang -nargs=? -complete=customlist,s:GitComplete Git :call s:Git(<bang>0,<f-args>)")
-
-function! s:ExecuteInTree(cmd) abort
-  let cd = exists('*haslocaldir') && haslocaldir() ? 'lcd ' : 'cd '
-  let dir = getcwd()
-  try
-    execute cd.' `=s:repo().tree()`'
-    execute a:cmd
-  finally
-    execute cd.' `=dir`'
-  endtry
-endfunction
-
-function! s:Git(bang,cmd) abort
-  let git = s:repo().git_command()
-  if has('gui_running')
-    let git .= ' --no-pager'
-  endif
-  call s:ExecuteInTree('!'.git.' '.a:cmd)
-endfunction
-
-function! s:GitComplete(A,L,P) abort
-  if !exists('s:exec_path')
-    let s:exec_path = s:sub(system(g:fugitive_git_executable.' --exec-path'),'\n$','')
-  endif
-  let cmds = map(split(glob(s:exec_path.'/git-*'),"\n"),'v:val[strlen(s:exec_path)+5 : -1]')
-  if a:L =~ ' [[:alnum:]-]\+ '
-    return s:repo().superglob(a:A)
-  elseif a:A == ''
-    return cmds
-  else
-    return filter(cmds,'v:val[0 : strlen(a:A)-1] ==# a:A')
-  endif
-endfunction
-
-" }}}1
-" Gcd, Glcd {{{1
-
-function! s:DirComplete(A,L,P) abort
-  let matches = s:repo().dirglob(a:A)
-  return matches
-endfunction
-
-call s:command("-bar -bang -nargs=? -complete=customlist,s:DirComplete Gcd  :cd<bang>  `=s:repo().bare() ? s:repo().dir(<q-args>) : s:repo().tree(<q-args>)`")
-call s:command("-bar -bang -nargs=? -complete=customlist,s:DirComplete Glcd :lcd<bang> `=s:repo().bare() ? s:repo().dir(<q-args>) : s:repo().tree(<q-args>)`")
-
-" }}}1
-" Ggrep, Glog {{{1
-
-call s:command("-bar -bang -nargs=? -complete=customlist,s:EditComplete Ggrep :call s:Grep(<bang>0,<q-args>)")
-call s:command("-bar -bang Glog :execute s:Log('grep<bang>')")
-
-function! s:Grep(bang,arg) abort
-  let grepprg = &grepprg
-  let grepformat = &grepformat
-  let cd = exists('*haslocaldir') && haslocaldir() ? 'lcd ' : 'cd '
-  let cd .= s:fnameescape(getcwd())
-  try
-    cd `=s:repo().tree()`
-    let &grepprg = s:repo().git_command('--no-pager', 'grep', '-n')
-    let &grepformat = '%f:%l:%m'
-    exe 'grep! '.a:arg
-    let list = getqflist()
-    for entry in list
-      if bufname(entry.bufnr) =~ ':'
-        let entry.filename = s:repo().translate(bufname(entry.bufnr))
-        unlet! entry.bufnr
-      elseif a:arg =~# '\%(^\| \)--cached\>'
-        let entry.filename = s:repo().translate(':0:'.bufname(entry.bufnr))
-        unlet! entry.bufnr
-      endif
-    endfor
-    call setqflist(list,'r')
-    if !a:bang && !empty(list)
-      cfirst
-    endif
-  finally
-    let &grepprg = grepprg
-    let &grepformat = grepformat
-    exe cd
-  endtry
-endfunction
-
-function! s:Log(cmd)
-  let cmd = ['--no-pager', 'log', '--no-color', '--pretty=format:fugitive://'.s:repo().dir().'//%H'.s:buffer().path('/').'::%s']
-  if s:buffer().commit() =~# '\x\{40\}'
-    let cmd += [s:buffer().commit().'^']
-  endif
-  let cmd += ['--']
-  if s:buffer().path() != ''
-    let cmd += [s:buffer().path()]
-  endif
-  let grepformat = &grepformat
-  let grepprg = &grepprg
-  try
-    let &grepprg = escape(call(s:repo().git_command,cmd,s:repo()),'%')
-    let &grepformat = '%f::%m'
-    exe a:cmd
-  finally
-    let &grepformat = grepformat
-    let &grepprg = grepprg
-  endtry
-endfunction
-
-" }}}1
-" Gedit, Gpedit, Gsplit, Gvsplit, Gtabedit, Gread {{{1
-
-function! s:Edit(cmd,...) abort
-  if a:0 && a:1 == ''
-    return ''
-  elseif a:0
-    let file = s:buffer().expand(a:1)
-  elseif s:buffer().commit() ==# ''
-    let file = s:buffer().path(':')
-  else
-    let file = s:buffer().path('/')
-  endif
-  let file = s:repo().translate(file)
-  if a:cmd =~# 'read!$'
-    return '%delete|read '.s:fnameescape(file).'|1delete_|diffupdate|'.line('.')
-  else
-    return a:cmd.' '.s:fnameescape(file)
-  endif
-endfunction
-
-function! s:EditComplete(A,L,P) abort
-  return s:repo().superglob(a:A)
-endfunction
-
-call s:command("-bar -bang -nargs=? -complete=customlist,s:EditComplete Ge       :execute s:Edit('edit<bang>',<f-args>)")
-call s:command("-bar -bang -nargs=? -complete=customlist,s:EditComplete Gedit    :execute s:Edit('edit<bang>',<f-args>)")
-call s:command("-bar -bang -nargs=? -complete=customlist,s:EditComplete Gpedit   :execute s:Edit('pedit<bang>',<f-args>)")
-call s:command("-bar -bang -nargs=? -complete=customlist,s:EditComplete Gsplit   :execute s:Edit('split<bang>',<f-args>)")
-call s:command("-bar -bang -nargs=? -complete=customlist,s:EditComplete Gvsplit  :execute s:Edit('vsplit<bang>',<f-args>)")
-call s:command("-bar -bang -nargs=? -complete=customlist,s:EditComplete Gtabedit :execute s:Edit('tabedit<bang>',<f-args>)")
-call s:command("-bar -bang -nargs=? -range -complete=customlist,s:EditComplete Gread :execute s:Edit('<line1>,<line2>read<bang>',<f-args>)")
-
-" }}}1
-" Gdiff {{{1
-
-call s:command("-bar -nargs=? -complete=customlist,s:EditComplete Gdiff :execute s:Diff(<f-args>)")
-
-function! s:Diff(...) abort
-  if exists(':DiffGitCached')
-    return 'DiffGitCached'
-  elseif a:0
-    if a:1 ==# ''
-      return ''
-    elseif a:1 == ':' || a:1 == '/'
-      let file = s:buffer().path(a:1)
-    else
-      let file = s:buffer().expand(a:1)
-    endif
-    if file !~ ':' && file !~ '^/'
-      let file = file.s:buffer.path(':')
-    endif
-  else
-    let file = s:buffer().path(s:buffer().commit() == '' ? ':' : '/')
-  endif
-  try
-    vsplit `=fugitive#buffer().repo().translate(file)`
-    let b:fugitive_restore = 'diffoff!'
-    diffthis
-    wincmd p
-    let b:fugitive_restore = 'diffoff!'
-    diffthis
-    return ''
-  catch /^fugitive:/
-    return 'echoerr v:errmsg'
-  endtry
-endfunction
-
-" }}}1
-" Gmove, Gremove {{{1
-
-function! s:Move(force,destination)
-  if a:destination =~# '^/'
-    let destination = a:destination[1:-1]
-  else
-    let destination = fnamemodify(s:sub(a:destination,'[%#]%(:\w)*','\=expand(submatch(0))'),':p')
-    if destination[0:strlen(s:repo().tree())] == s:repo().tree('')
-      let destination = destination[strlen(s:repo().tree('')):-1]
-    endif
-  endif
-  let message = call(s:repo().git_chomp_in_tree,['mv']+(a:force ? ['-f'] : [])+['--', s:buffer().path(), destination], s:repo())
-  if v:shell_error
-    let v:errmsg = 'fugitive: '.message
-    return 'echoerr v:errmsg'
-  endif
-  let destination = s:repo().tree(destination)
-  if isdirectory(destination)
-    let destination = fnamemodify(s:sub(destination,'/$','').'/'.expand('%:t'),':.')
-  endif
-  if s:buffer().commit() == ''
-    return 'saveas! '.s:fnameescape(destination)
-  else
-    return 'file '.s:fnameescape(s:repo.translate(':0:'.destination)
-  endif
-endfunction
-
-function! s:MoveComplete(A,L,P)
-  if a:A =~ '^/'
-    return s:repo().superglob(a:A)
-  else
-    return split(glob(a:A.'*'),"\n")
-  endif
-endfunction
-
-function! s:Remove(force)
-  if s:buffer().commit() ==# ''
-    let cmd = ['rm']
-  elseif s:buffer().commit() ==# '0'
-    let cmd = ['rm','--cached']
-  else
-    let v:errmsg = 'fugitive: rm not supported here'
-    return 'echoerr v:errmsg'
-  endif
-  if a:force
-    let cmd += ['--force']
-  endif
-  let message = call(s:repo().git_chomp_in_tree,cmd+['--',s:buffer().path()],s:repo())
-  if v:shell_error
-    let v:errmsg = 'fugitive: '.s:sub(message,'error:.*\zs\n\(.*-f.*',' (add ! to force)')
-    return 'echoerr '.string(v:errmsg)
-  else
-    return 'bdelete'.(a:force ? '!' : '')
-  endif
-endfunction
-
-augroup fugitive_remove
-  autocmd!
-  autocmd User Fugitive if s:buffer().commit() =~# '^0\=$' |
-        \ exe "command! -buffer -bar -bang -nargs=1 -complete=customlist,s:MoveComplete Gmove :execute s:Move(<bang>0,<q-args>)" |
-        \ exe "command! -buffer -bar -bang Gremove :execute s:Remove(<bang>0)" |
-        \ endif
-augroup END
-
-" }}}1
-" Gblame {{{1
-
-augroup fugitive_blame
-  autocmd!
-  autocmd BufReadPost *.fugitiveblame setfiletype fugitiveblame
-  autocmd FileType fugitiveblame setlocal nomodeline | if exists('b:git_dir') | let &l:keywordprg = s:repo().keywordprg() | endif
-  autocmd Syntax fugitiveblame call s:BlameSyntax()
-  autocmd User Fugitive if s:buffer().type('file', 'blob') | exe "command! -buffer -bar -bang -range=0 Gblame :execute s:Blame(<bang>0,<line1>,<line2>,<count>,<f-args>)" | endif
-augroup END
-
-function! s:Blame(bang,line1,line2,count) abort
-  try
-    if s:buffer().path() == ''
-      call s:throw('file or blob required')
-    endif
-    let git_dir = s:repo().dir()
-    let cmd = ['--no-pager', 'blame', '--show-number']
-    if strlen(s:buffer().commit()) == 40
-      let cmd += [s:buffer().commit()]
-    else
-      let cmd = ['--work-tree='.s:repo().tree()] + cmd + ['--contents', '-']
-    endif
-    let basecmd = call(s:repo().git_command,cmd+['--',s:buffer().path()],s:repo())
-    if a:count
-      return 'write !'.substitute(basecmd,' blame ',' blame -L '.a:line1.','.a:line2.' ','g')
-    else
-      let temp = tempname().'.fugitiveblame'
-      silent! exe '%write !'.basecmd.' > '.temp.' 2> '.temp
-      if v:shell_error
-        call s:throw(join(readfile(temp),"\n"))
-      endif
-      let bufnr = bufnr('')
-      let restore = 'call setbufvar('.bufnr.',"&scrollbind",0)'
-      if &l:wrap
-        let restore .= '|call setbufvar('.bufnr.',"&wrap",1)'
-      endif
-      if &l:foldenable
-        let restore .= '|call setbufvar('.bufnr.',"&foldenable",1)'
-      endif
-      let winnr = winnr()
-      windo set noscrollbind
-      exe winnr.'wincmd w'
-      setlocal scrollbind nowrap nofoldenable
-      let top = line('w0') + &scrolloff
-      let current = line('.')
-      exe 'leftabove vsplit '.temp
-      let b:git_dir = git_dir
-      let b:fugitive_type = 'blame'
-      let b:fugitive_blamed_bufnr = bufnr
-      let b:fugitive_restore = restore
-      call s:Detect()
-      execute top
-      normal! zt
-      execute current
-      execute "vertical resize ".(match(getline('.'),'\s\+\d\+)')+1)
-      setlocal nomodified nomodifiable nonumber scrollbind nowrap foldcolumn=0 nofoldenable filetype=fugitiveblame
-      nnoremap <buffer> <silent> q    :bdelete<CR>
-      nnoremap <buffer> <silent> <CR> :exe <SID>BlameJump()<CR>
-      nnoremap <buffer> <silent> o    :<C-U>exe <SID>Edit((&splitbelow ? "botright" : "topleft")." split", matchstr(getline('.'),'\x\+'))<CR>
-      nnoremap <buffer> <silent> O    :<C-U>exe <SID>Edit("tabedit", matchstr(getline('.'),'\x\+'))<CR>
-      syncbind
-    endif
-    return ''
-  catch /^fugitive:/
-    return 'echoerr v:errmsg'
-  endtry
-endfunction
-
-function! s:BlameJump() abort
-  let commit = matchstr(getline('.'),'^\^\=\zs\x\+')
-  if commit =~# '^0\+$'
-    let commit = ':0'
-  endif
-  let lnum = matchstr(getline('.'),'\d\+\ze (')
-  let path = matchstr(getline('.'),'^\^\=\zs\x\+\s\+\zs.\{-\}\ze\s*\d\+ (')
-  if path ==# ''
-    let path = s:buffer(b:fugitive_blamed_bufnr).path()
-  endif
-  let offset = line('.') - line('w0')
-  let bufnr = bufnr('%')
-  let winnr = bufwinnr(b:fugitive_blamed_bufnr)
-  if winnr > 0
-    exe winnr.'wincmd w'
-  endif
-  execute s:Edit('edit',commit.':'.path)
-  if winnr > 0
-    exe bufnr.'bdelete'
-  endif
-  Gblame
-  execute lnum
-  let delta = line('.') - line('w0') - offset
-  if delta > 0
-    execute 'norm! 'delta."\<C-E>"
-  elseif delta < 0
-    execute 'norm! '(-delta)."\<C-Y>"
-  endif
-  syncbind
-  return ''
-endfunction
-
-function! s:BlameSyntax() abort
-  let b:current_syntax = 'fugitiveblame'
-  syn match FugitiveblameBoundary "^\^"
-  syn match FugitiveblameHash       "\%(^\^\=\)\@<=\x\{7,40\}\>" nextgroup=FugitiveblameAnnotation,fugitiveblameOriginalFile,FugitiveblameOriginalLineNumber skipwhite
-  syn match FugitiveblameUncommitted "\%(^\^\=\)\@<=0\{7,40\}\>" nextgroup=FugitiveblameAnnotation,FugitiveblameOriginalLineNumber,fugitiveblameOriginalFile skipwhite
-  syn region FugitiveblameAnnotation matchgroup=FugitiveblameDelimiter start="(" end="\%( \d\+\)\@<=)" contained keepend oneline
-  syn match FugitiveblameTime "[0-9:/+-][0-9:/+ -]*[0-9:/+-]\%( \+\d\+)\)\@=" contained containedin=FugitiveblameAnnotation
-  syn match FugitiveblameLineNumber         " \@<=\d\+)\@=" contained containedin=FugitiveblameAnnotation
-  syn match FugitiveblameOriginalFile       " \%(\f\+\D\@<=\|\D\@=\f\+\)\%(\%(\s\+\d\+\)\= (\)\@=" contained nextgroup=FugitiveblameOriginalLineNumber,FugitiveblameAnnotation skipwhite
-  syn match FugitiveblameOriginalLineNumber " \@<=\d\+\%( (\)\@=" contained nextgroup=FugitiveblameAnnotation skipwhite
-  syn match FugitiveblameNotCommittedYet "(\@<=Not Committed Yet\>" contained containedin=FugitiveblameAnnotation
-  hi def link FugitiveblameBoundary           Keyword
-  hi def link FugitiveblameHash               Identifier
-  hi def link FugitiveblameUncommitted        Function
-  hi def link FugitiveblameTime               PreProc
-  hi def link FugitiveblameLineNumber         Number
-  hi def link FugitiveblameOriginalFile       String
-  hi def link FugitiveblameOriginalLineNumber Float
-  hi def link FugitiveblameDelimiter          Delimiter