Prechádzať zdrojové kódy

Remove vimperator/tridactyl, flatten vim plugins

Removed all git directories of vim plugins so that they can be checked
in to the repo. Can be restored with `PlugClean`, but we don't
anticipate doing this for quite a while.
Weiyi Lou 1 rok pred
rodič
commit
8b5142a3e9
100 zmenil súbory, kde vykonal 30070 pridanie a 82 odobranie
  1. 0 1
      .gitignore
  2. 3 15
      Makefile
  3. 0 16
      README.md
  4. 1 8
      install
  5. 0 42
      tridactyl/tridactylrc
  6. 24 0
      vim/plugged/VimCompletesMe/README
  7. 55 0
      vim/plugged/VimCompletesMe/README.markdown
  8. 168 0
      vim/plugged/VimCompletesMe/doc/VimCompletesMe.txt
  9. 9 0
      vim/plugged/VimCompletesMe/doc/tags
  10. 102 0
      vim/plugged/VimCompletesMe/plugin/VimCompletesMe.vim
  11. 22 0
      vim/plugged/airline-surarken/LICENSE
  12. 20 0
      vim/plugged/airline-surarken/README.md
  13. 8 0
      vim/plugged/airline-surarken/TODO
  14. 227 0
      vim/plugged/airline-surarken/autoload/airline/themes/surarken.vim
  15. 35 0
      vim/plugged/argtextobj.vim/README
  16. 304 0
      vim/plugged/argtextobj.vim/plugin/argtextobj.vim
  17. 30 0
      vim/plugged/ctrlp.vim/LICENSE
  18. 2903 0
      vim/plugged/ctrlp.vim/autoload/ctrlp.vim
  19. 173 0
      vim/plugged/ctrlp.vim/autoload/ctrlp/autoignore.vim
  20. 147 0
      vim/plugged/ctrlp.vim/autoload/ctrlp/bookmarkdir.vim
  21. 281 0
      vim/plugged/ctrlp.vim/autoload/ctrlp/buffertag.vim
  22. 98 0
      vim/plugged/ctrlp.vim/autoload/ctrlp/changes.vim
  23. 95 0
      vim/plugged/ctrlp.vim/autoload/ctrlp/dir.vim
  24. 81 0
      vim/plugged/ctrlp.vim/autoload/ctrlp/line.vim
  25. 88 0
      vim/plugged/ctrlp.vim/autoload/ctrlp/mixed.vim
  26. 158 0
      vim/plugged/ctrlp.vim/autoload/ctrlp/mrufiles.vim
  27. 59 0
      vim/plugged/ctrlp.vim/autoload/ctrlp/quickfix.vim
  28. 59 0
      vim/plugged/ctrlp.vim/autoload/ctrlp/rtscript.vim
  29. 150 0
      vim/plugged/ctrlp.vim/autoload/ctrlp/tag.vim
  30. 154 0
      vim/plugged/ctrlp.vim/autoload/ctrlp/undo.vim
  31. 119 0
      vim/plugged/ctrlp.vim/autoload/ctrlp/utils.vim
  32. 1605 0
      vim/plugged/ctrlp.vim/doc/ctrlp.cnx
  33. 1688 0
      vim/plugged/ctrlp.vim/doc/ctrlp.txt
  34. 113 0
      vim/plugged/ctrlp.vim/doc/tags
  35. 112 0
      vim/plugged/ctrlp.vim/doc/tags-cn
  36. 72 0
      vim/plugged/ctrlp.vim/plugin/ctrlp.vim
  37. 117 0
      vim/plugged/ctrlp.vim/readme.md
  38. 81 0
      vim/plugged/delimitMate/Makefile
  39. 6 0
      vim/plugged/delimitMate/README.md
  40. 656 0
      vim/plugged/delimitMate/autoload/delimitMate.vim
  41. 4 0
      vim/plugged/delimitMate/basic_vimrc
  42. 945 0
      vim/plugged/delimitMate/doc/delimitMate.txt
  43. 64 0
      vim/plugged/delimitMate/doc/tags
  44. 403 0
      vim/plugged/delimitMate/plugin/delimitMate.vim
  45. 9 0
      vim/plugged/delimitMate/test/Makefile
  46. 18 0
      vim/plugged/delimitMate/test/README.md
  47. 12 0
      vim/plugged/delimitMate/test/_setup.vim
  48. 51 0
      vim/plugged/delimitMate/test/autoclose_matchpairs.txt
  49. 42 0
      vim/plugged/delimitMate/test/autoclose_matchpairs.vim
  50. 73 0
      vim/plugged/delimitMate/test/autoclose_quotes.txt
  51. 47 0
      vim/plugged/delimitMate/test/autoclose_quotes.vim
  52. 44 0
      vim/plugged/delimitMate/test/eol_marker.vim
  53. 96 0
      vim/plugged/delimitMate/test/expand_cr.txt
  54. 55 0
      vim/plugged/delimitMate/test/expand_cr.vim
  55. 8 0
      vim/plugged/delimitMate/test/expand_space.txt
  56. 42 0
      vim/plugged/delimitMate/test/expand_space.vim
  57. 8 0
      vim/plugged/delimitMate/test/first_buffer_no_ft.vim
  58. 21 0
      vim/plugged/goyo.vim/LICENSE
  59. 184 0
      vim/plugged/goyo.vim/README.md
  60. 449 0
      vim/plugged/goyo.vim/autoload/goyo.vim
  61. 168 0
      vim/plugged/goyo.vim/doc/goyo.txt
  62. 16 0
      vim/plugged/goyo.vim/doc/tags
  63. 24 0
      vim/plugged/goyo.vim/plugin/goyo.vim
  64. 21 0
      vim/plugged/limelight.vim/LICENSE
  65. 91 0
      vim/plugged/limelight.vim/README.md
  66. 282 0
      vim/plugged/limelight.vim/autoload/limelight.vim
  67. 123 0
      vim/plugged/limelight.vim/doc/limelight.txt
  68. 19 0
      vim/plugged/limelight.vim/doc/tags
  69. 27 0
      vim/plugged/limelight.vim/plugin/limelight.vim
  70. 139 0
      vim/plugged/limelight.vim/test/limelight.vader
  71. 674 0
      vim/plugged/neonwave.vim/LICENSE
  72. 8 0
      vim/plugged/neonwave.vim/NOTE
  73. 20 0
      vim/plugged/neonwave.vim/README.md
  74. 22 0
      vim/plugged/neonwave.vim/TODO
  75. 133 0
      vim/plugged/neonwave.vim/colors/neonwave.vim
  76. 119 0
      vim/plugged/syntastic/CONTRIBUTING.md
  77. 13 0
      vim/plugged/syntastic/LICENCE
  78. 575 0
      vim/plugged/syntastic/README.markdown
  79. BIN
      vim/plugged/syntastic/_assets/screenshot_1.png
  80. 341 0
      vim/plugged/syntastic/autoload/syntastic/c.vim
  81. 222 0
      vim/plugged/syntastic/autoload/syntastic/log.vim
  82. 84 0
      vim/plugged/syntastic/autoload/syntastic/postprocess.vim
  83. 809 0
      vim/plugged/syntastic/autoload/syntastic/preprocess.vim
  84. 640 0
      vim/plugged/syntastic/autoload/syntastic/util.vim
  85. 8258 0
      vim/plugged/syntastic/doc/syntastic-checkers.txt
  86. 1214 0
      vim/plugged/syntastic/doc/syntastic.txt
  87. 650 0
      vim/plugged/syntastic/doc/tags
  88. 798 0
      vim/plugged/syntastic/plugin/syntastic.vim
  89. 55 0
      vim/plugged/syntastic/plugin/syntastic/autoloclist.vim
  90. 58 0
      vim/plugged/syntastic/plugin/syntastic/balloons.vim
  91. 282 0
      vim/plugged/syntastic/plugin/syntastic/checker.vim
  92. 138 0
      vim/plugged/syntastic/plugin/syntastic/cursor.vim
  93. 104 0
      vim/plugged/syntastic/plugin/syntastic/highlighting.vim
  94. 445 0
      vim/plugged/syntastic/plugin/syntastic/loclist.vim
  95. 118 0
      vim/plugged/syntastic/plugin/syntastic/modemap.vim
  96. 86 0
      vim/plugged/syntastic/plugin/syntastic/notifiers.vim
  97. 444 0
      vim/plugged/syntastic/plugin/syntastic/registry.vim
  98. 138 0
      vim/plugged/syntastic/plugin/syntastic/signs.vim
  99. 67 0
      vim/plugged/syntastic/syntax_checkers/actionscript/mxmlc.vim
  100. 47 0
      vim/plugged/syntastic/syntax_checkers/ada/gcc.vim

+ 0 - 1
.gitignore

@@ -2,7 +2,6 @@
 vim/.netrwhist
 vim/autoload/plug.vim.old
 vim/current-colour
-vim/plugged
 vim/plugins.vim.local
 vim/settings/*.vim.local
 vim/settings/local

+ 3 - 15
Makefile

@@ -2,8 +2,8 @@
 # dotfiles setup. Run `make install` to perform all setup tasks.
 
 # Groups of targets
-all = git bash zsh tmux ack vimperator tridactyl vim
-rm-all = rm-git rm-bash rm-zsh rm-tmux rm-ack rm-vimperator rm-tridactyl rm-vim
+all = git bash zsh tmux ack vim
+rm-all = rm-git rm-bash rm-zsh rm-tmux rm-ack rm-vim
 aux = help install uninstall upgrade show-versions xdg
 .PHONY: $(all) $(rm-all) $(aux)
 
@@ -68,24 +68,12 @@ ack:
 rm-ack:
 	rm ~/.ackrc
 
-vimperator:
-	@./bin/linkup ~/dotfiles/vimperator ~/.vimperator
-	@./bin/linkup ~/dotfiles/vimperator/vimperatorrc ~/.vimperatorrc
-rm-vimperator:
-	rm ~/.vimperator
-	rm ~/.vimperatorrc
-
-tridactyl:
-	@./bin/linkup ~/dotfiles/tridactyl/tridactylrc ~/.tridactylrc
-rm-tridactyl:
-	rm ~/.tridactylrc
-
 vim: xdg
 	@./bin/linkup ~/dotfiles/vim ~/.vim
 	@./bin/linkup ~/dotfiles/vim/vimrc ~/.vimrc
 	@./bin/linkup ~/dotfiles/vim $(XDG_CONFIG_HOME)/nvim
 	@# Use barebones config to avoid vimrc errors on fresh dotfiles installs.
-	@vim -N -u ~/dotfiles/vim/plugins.vim +PlugClean! +PlugUpdate! +quitall!
+	@#vim -N -u ~/dotfiles/vim/plugins.vim +PlugClean! +PlugUpdate! +quitall!
 rm-vim:
 	rm ~/.vim
 	rm ~/.vimrc

+ 0 - 16
README.md

@@ -4,7 +4,6 @@ Configuration files for:
 
 - Bash (3.2+) and Zsh (4.3.17+)
 - Vim (7+) and NeoVim
-- Vimperator (3.8+) and Tridactyl
 - Tmux (1.8+)
 - Other bits and pieces
 
@@ -72,21 +71,6 @@ Below is a non-exhaustive list of dotfiles features.
 - `<C-a><C-s>` swaps between sessions.
 - Mouse support works for selecting and resizing panes/windows.
 
-### Vimperator and Tridactyl
-
-Apart from the default Vimperator goodness e.g.
-
-- `/` searches like `vim`.
-- `f` and `F` follow links on this tab/in a new tab.
-- et cetera...
-
-These dotfiles provide a dark theme and the following binding changes:
-
-- `h` and `l` - change between tabs (left and right).
-- `j` and `k` - scroll by a half-page (down and up).
-- `H`, `J`, `K`, `L` - scroll slowly (left, down, up, right).
-- `<C-h>` and `<C-l>` - relocate a tab left and right.
-
 ## Recommended
 
 - Font: [Meslo for Powerline][] (works well with [Rainbarf][]).

+ 1 - 8
install

@@ -29,18 +29,11 @@ echo "Git config done."
 # Ack
 ~/dotfiles/bin/linkup ~/dotfiles/ack/ackrc ~/.ackrc
 
-# Vimperator
-~/dotfiles/bin/linkup ~/dotfiles/vimperator ~/.vimperator
-~/dotfiles/bin/linkup ~/dotfiles/vimperator/vimperatorrc ~/.vimperatorrc
-
-# Tridactyl
-~/dotfiles/bin/linkup ~/dotfiles/tridactyl/tridactylrc ~/.tridactylrc
-
 # Vim
 ~/dotfiles/bin/linkup ~/dotfiles/vim ~/.vim
 ~/dotfiles/bin/linkup ~/dotfiles/vim/vimrc ~/.vimrc
 ~/dotfiles/bin/linkup ~/dotfiles/vim $XDG_CONFIG_HOME/nvim
 # Use barebones config to avoid vimrc errors on fresh dotfiles installs.
-vim -N -u ~/dotfiles/vim/plugins.vim +PlugClean! +PlugUpdate! +quitall!
+#vim -N -u ~/dotfiles/vim/plugins.vim +PlugClean! +PlugUpdate! +quitall!
 
 echo "Install complete!"

+ 0 - 42
tridactyl/tridactylrc

@@ -1,42 +0,0 @@
-set theme dark
-
-" Move link-hover URL to not obscure the command line
-guiset_quiet hoverlink right
-
-set searchengine duckduckgo
-
-" Vimperator-style hints
-set hintfiltermode vimperator-reflow
-set hintnames numeric
-
-" Make Tridactyl work on more sites at the expense of some security
-set csp clobber
-fixamo_quiet
-
-" Sanity before custom bindings
-reset all
-
-" Change between tabs
-bind l tabnext_gt
-bind h tabprev
-
-" Scroll by half page
-bind j scrollpage 0.5
-bind k scrollpage -0.5
-
-" Scroll slowly
-bind H scrollpx -50
-bind J scrollline 5
-bind K scrollline -5
-bind L scrollpx 50
-
-" Relocate tabs
-bind <c-l> tabmove +1
-bind <c-h> tabmove -1
-
-" Go forwards and backwards through history
-bind <c-o> back
-bind <c-i> forward
-
-" Focus on an input
-bind i focusinput

+ 24 - 0
vim/plugged/VimCompletesMe/README

@@ -0,0 +1,24 @@
+This is a mirror of http://www.vim.org/scripts/script.php?script_id=4902
+
+A super simple, super minimal, super light-weight tab-completion plugin for Vim.
+
+Without configuration, the Tab key will:
+
+    Use Vim's local keyword completion (Ctrl-X_Ctrl-N).
+    Complete a file path (Ctrl-X_Ctrl-F)
+    Offer omni-completion after typing a period. (Ctrl-X_Ctrl-O)
+
+With a b:vcm_tab_complete variable, the Tab key will complete using:
+
+    Dictionary words (Ctrl-X_Ctrl-K)
+    User-defined completion (Ctrl-X_Ctrl-U)
+    Tags (Ctrl-X_Ctrl-])
+    Vim command line (Ctrl-X_Ctrl-V)
+
+You can set the b:vcm_tab_complete variable interactively, or in an autocommand:
+
+autocmd FileType text,markdown let b:vcm_tab_complete = 'dict'
+
+Striving for minimalism, this plugin weighs under 80 lines of code.
+
+Note: You can always get the latest version on github: https://github.com/ajh17/VimCompletesMe

+ 55 - 0
vim/plugged/VimCompletesMe/README.markdown

@@ -0,0 +1,55 @@
+# VimCompletesMe
+
+A super simple, super minimal, super light-weight tab-completion plugin for Vim.
+
+Without any configuration, the Tab key will, depending on the context, offer:
+
+* Vim's local keyword completion
+  ([Ctrl-X_Ctrl-N](http://vimhelp.appspot.com/insert.txt.html#i_CTRL-X_CTRL-N))
+* File path completion when typing a path
+  ([Ctrl-X_Ctrl-F](http://vimhelp.appspot.com/insert.txt.html#i_CTRL-X_CTRL-F))
+* Omni-completion after typing a period.
+  ([Ctrl-X_Ctrl-O](http://vimhelp.appspot.com/insert.txt.html#i_CTRL-X_CTRL-O))
+
+With a `b:vcm_tab_complete` variable, you can set the Tab key to use the
+following type of completions:
+
+* Dictionary words
+  ([Ctrl-X_Ctrl-K](http://vimhelp.appspot.com/insert.txt.html#i_CTRL-X_CTRL-K))
+* User-defined completion
+  ([Ctrl-X_Ctrl-U](http://vimhelp.appspot.com/insert.txt.html#i_CTRL-X_CTRL-U))
+* Tags
+  ([Ctrl-X_Ctrl-\]](http://vimhelp.appspot.com/insert.txt.html#i_CTRL-X_CTRL-]))
+* Vim command line
+  ([Ctrl-X_Ctrl-V](http://vimhelp.appspot.com/insert.txt.html#i_CTRL-X_CTRL-V))
+* Omni completion
+  ([Ctrl-X_Ctrl-O](http://vimhelp.appspot.com/insert.txt.html#i_CTRL-X_CTRL-O))
+
+If any of above types of completions fails to return any results, hitting Tab
+again will switch back to Vim's local keyword completion. VimCompletesMe will go
+back to trying the special completion for the next tab completion.
+
+You can set the `b:vcm_tab_complete` variable interactively, or in an
+autocommand:
+
+    autocmd FileType text,markdown let b:vcm_tab_complete = 'dict'
+
+Striving for minimalism, this plugin weighs under 80 lines of code.
+
+## Installation
+If you don't have a preferred installation method, I recommend installing
+[pathogen.vim](https://github.com/tpope/vim-pathogen), and then simply copy and
+paste:
+
+    cd ~/.vim/bundle && git clone git://github.com/ajh17/VimCompletesMe.git
+
+Once the helptags have been generated, see `:h VimCompletesMe` for usage.
+
+## Thanks
+* [bairui](https://github.com/dahu) for helping me with this plugin, and for
+  the kickass name.
+* You for using it!
+
+## License
+Copyright (c) Akshay Hegde. Distributed under the same terms as Vim itself. See
+`:help license`

+ 168 - 0
vim/plugged/VimCompletesMe/doc/VimCompletesMe.txt

@@ -0,0 +1,168 @@
+*VimCompletesMe.txt*    Minimalistic tab completion for Vim.
+
+
+                        VIM REFERENCE MANUAL    by Akshay Hegde
+
+
+Help on using VimCompletesMe                                   *VimCompletesMe*
+
+1. Introduction                         |VimCompletesMe-intro|
+2. Configuration                        |VimCompletesMe-configuration|
+3. Frequently Asked Questions           |VimCompletesMe-faq|
+
+==============================================================================
+ 1. INTRODUCTION                                         *VimCompletesMe-intro*
+
+VimCompletesMe is a tab completion plugin for Vim with minimalism in mind.
+
+It will use Vim's |ins-completion| to provide tab completion and you can
+configure VimCompletesMe to use a specific type of completions.
+
+==============================================================================
+2. CONFIGURATION                                 *VimCompletesMe-configuration*
+
+The following aspects of VimCompletesMe's behavior are configurable using the
+following options:
+
+|'b:vcm_tab_complete'|          Use a specific type of completion.
+|'g:vcm_direction'|             Controls the direction of the completion.
+|'g:vcm_s_tab_behavior'|        Controls the behavior of Shift-Tab.
+|'g:vcm_default_maps'|          Set up default maps (Tab + Shift Tab)
+
+------------------------------------------------------------------------------
+                                                         *'b:vcm_tab_complete'*
+Values: string                                                                ~
+Default: ''                                                                   ~
+
+Controls the type of completion to use. If empty, the |<Tab>| key will
+intelligently (depending on the context) use:
+
+1. Local keyword completion (|i_Ctrl-X_Ctrl-N|)
+2. File path completion     (|i_Ctrl-X_Ctrl-F|)
+3. Omni completion          (|i_Ctrl-X_Ctrl-F|)
+
+You can set |b:vcm_tab_complete| to one of the following to use a specific type
+of completion:
+
+1. "dict"   - Dictionary completion |i_Ctrl-X_Ctrl-K|
+2. "user"   - User-defined completion |i_Ctrl-X_Ctrl-U|
+3. "vim"    - Vim command line completion |i_Ctrl-X_Ctrl-V|
+4. "tags"   - Tag based completion |i_Ctrl-X_Ctrl-]|
+5. "omni"   - Omni completion |i_Ctrl-X_Ctrl-O|
+
+The b:vcm_tab_complete makes a great |:autocmd| as follows:
+>
+    autocmd FileType ruby let b:vcm_tab_complete = "tags"
+<
+
+When none of the special completions above get any results, you can press Tab
+again to have VimCompletesMe switch the context to keyword completion. In some
+situations (like after completing something and then trying the context switch
+again without leaving insert mode), you may need a Vim version greater than
+7.3.589 to get the best context switch behavior. The context will be
+automatically switched back to the completion set in the |b:vcm_tab_complete|
+variable.
+
+NOTE: The "dict" option requires the user to set |'dictionary'| in their
+|vimrc| file. In Unix, you can put the following in your ~/.vimrc:
+>
+    set dictionary=/usr/share/dict/words
+<
+NOTE: The "tags" option will use a tags file generated by |Exuberant_Ctags|
+
+------------------------------------------------------------------------------
+                                                            *'g:vcm_direction'*
+Values: string                                                                ~
+Default: 'n'                                                                  ~
+
+Controls the direction of tab completion. By default, if a popup menu is
+opened during completion, the |<Tab>| key will cycle forward through the list.
+
+You can change it to cycle backwards through the list by putting the following
+in your |vimrc|:
+>
+    let g:vcm_direction = 'p'
+<
+------------------------------------------------------------------------------
+                                                       *'g:vcm_s_tab_behavior'*
+Values: numeric                                                               ~
+Default: 0                                                                    ~
+
+Controls the shift-tab behavior used by VimCompletesMe.
+
+By default, pressing |<S-Tab>| after a space, or a tab will de-indent the
+current line.
+
+If you change this option to 1, |<S-Tab>| will work just like |<Tab>|.
+
+You can change this variable by putting the following in your |vimrc|:
+>
+    let g:vcm_s_tab_behavior = 1
+<
+------------------------------------------------------------------------------
+                                                         *'g:vcm_default_maps'*
+Values: numeric                                                               ~
+Default: 1                                                                    ~
+
+Set up mappings for Tab and Shift-Tab. If you would like to use your
+own mappings, unset this variable by putting the following in your |vimrc|:
+>
+    let g:vcm_default_maps = 0
+<
+==============================================================================
+ 3. FREQUENTLY ASKED QUESTIONS                             *VimCompletesMe-faq*
+
+1. When the popup menu is opened, how can I make the Enter key select the     ~
+   completion entry instead of creating a new line?                           ~
+
+Solution: Just make a mapping like the following, in your |vimrc|:
+>
+    inoremap <expr> <CR> pumvisible() ? "\<C-y>" : "\<C-g>u\<CR>"
+<
+
+2. When pressing the Tab key, why is the the last popup item selected?     ~
+
+This is because VimCompletesMe is invoking |i_Ctrl-P| by default for you.
+Pressing the Tab key will then cycle forwards the list, so some users are
+confused that it takes two Tab presses to jump to the first item in the list.
+
+However, this behavior is the default Vim behavior, and VimCompletesMe agrees
+with it. Invoking |i_Ctrl-P| instead of |i_Ctrl-N| is done because it is more
+likely that the keyword you are trying to complete is before the current
+cursor position. When the Tab key is pressed when the popup menu is open,
+VimCompletesMe simply uses Ctrl-N to advance to the next item in the popup
+menu. If you would like VimCompletesMe to invoke |i_Ctrl-N| instead, see the
+|'g:vcm_direction'| option.
+
+It is also useful to check out the "longest" attribute of the |'completeopt'|
+option. Setting the following in your |vimrc| will insert the longest matching
+string and then popup the completion item, so you will always start at the
+head of the popup menu list:
+>
+    set completeopt+=longest
+<
+
+3. How do I make VimCompletesMe work with various snippet engines?         ~
+
+A simple solution is to ensure that the Tab and Shift-Tab keys do not conflict
+with any other plugins. Thus, you can either disable VimCompletesMe's
+|vcm_default_maps| option or use a different forward and backward triggers for
+the snippet engines.
+
+For the first case, simply assign a different key to act as the Tab key for
+<Plug>vim_completes_me_forward, or the Shift-Tab key for
+<Plug>vim_completes_me_backward functions.
+
+For the second case, simply assign different keys to act as the snippet
+engines forward and backward triggers. A suggestion would be to map `<C-j>`
+and `<C-k>` in insert mode. Note that while |i_Ctrl-j| does nothing useful in
+insert mode, you might be using |i_Ctrl-k| for digraphs. These keybinds are
+merely suggestions.
+
+@sunaku from Github has a great solution to make VimCompletesMe work with
+Neosnippet. See
+https://github.com/ajh17/VimCompletesMe/issues/12#issuecomment-94115124
+------------------------------------------------------------------------------
+
+Template From: https://github.com/dahu/Area-41/
+vim:tw=78:et:ft=help:norl:

+ 9 - 0
vim/plugged/VimCompletesMe/doc/tags

@@ -0,0 +1,9 @@
+'b:vcm_tab_complete'	VimCompletesMe.txt	/*'b:vcm_tab_complete'*
+'g:vcm_default_maps'	VimCompletesMe.txt	/*'g:vcm_default_maps'*
+'g:vcm_direction'	VimCompletesMe.txt	/*'g:vcm_direction'*
+'g:vcm_s_tab_behavior'	VimCompletesMe.txt	/*'g:vcm_s_tab_behavior'*
+VimCompletesMe	VimCompletesMe.txt	/*VimCompletesMe*
+VimCompletesMe-configuration	VimCompletesMe.txt	/*VimCompletesMe-configuration*
+VimCompletesMe-faq	VimCompletesMe.txt	/*VimCompletesMe-faq*
+VimCompletesMe-intro	VimCompletesMe.txt	/*VimCompletesMe-intro*
+VimCompletesMe.txt	VimCompletesMe.txt	/*VimCompletesMe.txt*

+ 102 - 0
vim/plugged/VimCompletesMe/plugin/VimCompletesMe.vim

@@ -0,0 +1,102 @@
+" VimCompletesMe.vim - For super simple tab completion
+" Maintainer:          Akshay Hegde <http://github.com/ajh17>
+" Version:             1.2.1
+" Website:             <http://github.com/ajh17/VimCompletesMe>
+
+" Vimscript Setup: {{{1
+if exists("g:loaded_VimCompletesMe") || v:version < 703 || &compatible
+  finish
+endif
+let g:loaded_VimCompletesMe = 1
+
+" Options: {{{1
+if !exists('g:vcm_s_tab_behavior')
+  let g:vcm_s_tab_behavior = 0
+endif
+
+if !exists('g:vcm_direction')
+  let g:vcm_direction = 'n'
+endif
+
+if !exists('g:vcm_default_maps')
+  let g:vcm_default_maps = 1
+endif
+
+" Functions: {{{1
+function! s:vim_completes_me(shift_tab)
+  let dirs = ["\<c-p>", "\<c-n>"]
+  let dir = g:vcm_direction =~? '[nf]'
+  let map = exists('b:vcm_tab_complete') ? b:vcm_tab_complete : ''
+
+  if pumvisible()
+    if a:shift_tab
+      return dirs[!dir]
+    else
+      return dirs[dir]
+    endif
+  endif
+
+  " Figure out whether we should indent.
+  let pos = getpos('.')
+  let substr = matchstr(strpart(getline(pos[1]), 0, pos[2]-1), "[^ \t]*$")
+  if strlen(substr) == 0
+    return (a:shift_tab && !g:vcm_s_tab_behavior) ? "\<C-d>" : "\<Tab>"
+  endif
+
+  " Figure out if user has started typing a path or a period
+  let period = match(substr, '\.') != -1
+  let file_path = (has('win32') || has('win64')) ? '\\' : '\/'
+  let file_pattern = match(substr, file_path) != -1
+
+  if file_pattern
+    return "\<C-x>\<C-f>"
+  elseif period && (&omnifunc != '')
+    if get(b:, 'tab_complete_pos', []) == pos
+      let exp = "\<C-x>" . dirs[!dir]
+    else
+      let exp = "\<C-x>\<C-o>"
+    endif
+    let b:tab_complete_pos = pos
+    return exp
+  endif
+
+  " First fallback to keyword completion if special completion was already tried.
+  if exists('b:completion_tried') && b:completion_tried
+    let b:completion_tried = 0
+    return "\<C-e>" . dirs[!dir]
+  endif
+
+  " Fallback
+  let b:completion_tried = 1
+  if map ==? "user"
+    return "\<C-x>\<C-u>"
+  elseif map ==? "tags"
+    return "\<C-x>\<C-]>"
+  elseif map ==? "omni"
+    return "\<C-x>\<C-o>"
+  elseif map ==? "dict"
+    return "\<C-x>\<C-k>"
+  elseif map ==? "vim"
+    return "\<C-x>\<C-v>"
+  else
+    return "\<C-x>" . dirs[!dir]
+  endif
+endfunction
+
+inoremap <expr> <plug>vim_completes_me_forward  <sid>vim_completes_me(0)
+inoremap <expr> <plug>vim_completes_me_backward <sid>vim_completes_me(1)
+
+" Maps: {{{1
+if g:vcm_default_maps
+  imap <Tab>   <plug>vim_completes_me_forward
+  imap <S-Tab> <plug>vim_completes_me_backward
+endif
+
+" Autocmds {{{1
+augroup VCM
+  autocmd!
+  autocmd InsertEnter * let b:completion_tried = 0
+  if v:version > 703 || v:version == 703 && has('patch598')
+    autocmd CompleteDone * let b:completion_tried = 0
+  endif
+augroup END

+ 22 - 0
vim/plugged/airline-surarken/LICENSE

@@ -0,0 +1,22 @@
+The MIT License (MIT)
+
+Copyright (c) 2015 Sclarki
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+

+ 20 - 0
vim/plugged/airline-surarken/README.md

@@ -0,0 +1,20 @@
+# airline-surarken
+A vivid, bright, somewhat overbearing (pfft) Airline theme to match with Neonwave. :3
+
+## Installation with Vundle
+    cd ~/.vim/bundle
+    git clone https://github.com/Sclarki/airline-surarken.git
+
+######Add the following to your vimrc:
+
+    let g:airline_theme = 'surarken'
+
+## Don't have Vim Airline?
+Go [Here](https://github.com/bling/vim-airline)!
+
+
+## Preview
+![surarken-screenie](https://cloud.githubusercontent.com/assets/8389374/7218048/99b648c0-e61b-11e4-97ed-2e767af1041e.png)
+
+##License
+MIT License.

+ 8 - 0
vim/plugged/airline-surarken/TODO

@@ -0,0 +1,8 @@
+- refactor code (array/tables).
+- fix the colours for the tabs/buffer.
+- update screenshots.
+- UPDATE YOUR SCREENSHOTS.
+- SERIOUSLY.
+- defeat megan.
+- tidy up the formatting in the main theme file.
+- buy eggs.

+ 227 - 0
vim/plugged/airline-surarken/autoload/airline/themes/surarken.vim

@@ -0,0 +1,227 @@
+" define an array thing for the palette
+let g:airline#themes#surarken#palette = {}
+
+let gui_bae_blue        = "#00afff"
+let gui_bg              = "#1c1c1c"
+let gui_blurple         = "#5f5fff"
+let gui_cyan            = "#00ffff"
+let gui_bleu1           = "#00005f"
+let gui_bleu2           = "#005fd7"
+let gui_gray1           = "#262626"
+let gui_gray2           = "#303030"
+let gui_gray3           = "#444444"
+let gui_gray4           = "#8a8a8a"
+let gui_gray5           = "#b2b2b2"
+let gui_near_dark       = "#080808"
+let gui_pinkeon         = "#ff00ff"
+let gui_purple          = "#5f00af"
+let gui_sxbg            = "#005f87"
+let gui_sxfg            = "#00d7ff"
+let gui_scbg            = "#005f87"
+let gui_scfg            = "#00d7ff"
+let gui_pinkish         = "#af5fff"
+let gui_white1          = "#eeeeee"
+let gui_white2          = "#ffffff"
+
+
+let bae_blue            = 39
+let bg                  = 234
+let blurple             = 63
+let cyan                = 51
+let bleu1               = 17
+let bleu2               = 26
+let gray1               = 235
+let gray2               = 236
+let gray3               = 238
+let gray4               = 245
+let gray5               = 249
+let near_dark           = 232
+let pinkeon             = 201
+let purple              = 55
+let sxbg                = 24      " section X background
+let sxfg                = 45      " section X foreground
+let scbg                = sxbg    " section C background
+let scfg                = sxfg    " section C foreground
+let pinkish             = 135
+let white1              = 255
+let white2              = 231
+
+"""""""""""""""""""""""""""""""
+" Colour mapping and variables
+
+" define and create NORMAL mode colours
+let s:N1  =  [ gui_bleu1, gui_bae_blue , bleu1     , bae_blue , 'NONE' ]
+let s:N2  =  [ gui_cyan , gui_bleu2    , cyan      , bleu2    , 'NONE' ]
+let s:N3  =  [ gui_scfg , gui_scbg     , scfg      , scbg     , 'NONE' ]
+
+let g:airline#themes#surarken#palette.normal = 
+    \ airline#themes#generate_color_map(s:N1, s:N2, s:N3)
+
+
+" define and create INSERT mode colours
+let s:I1  =  [ gui_white2   , gui_pinkeon, white2    , pinkeon  , 'NONE' ]
+let s:I2  =  [ gui_cyan     , gui_purple , cyan      , purple   , 'NONE' ]
+let s:I3  =  [ gui_near_dark, gui_blurple, near_dark , blurple  , 'NONE' ]
+
+let g:airline#themes#surarken#palette.insert = 
+    \ airline#themes#generate_color_map(s:I1, s:I2, s:I3)
+
+
+" define and create VISUAL[LINE|BLOCK] colours
+let s:V1  =  [ gui_white2   , gui_pinkeon, white2    , pinkeon  , 'NONE' ]
+let s:V2  =  [ gui_cyan     , gui_purple , cyan      , purple   , 'NONE' ]
+let s:V3  =  [ gui_near_dark, gui_blurple, near_dark , blurple  , 'NONE' ]
+
+let g:airline#themes#surarken#palette.visual =
+    \ airline#themes#generate_color_map(s:V1, s:V2, s:V3)
+
+
+" define and create INACTIVE mode colours
+let s:IA1  =  [ gui_gray4, gui_bg   , gray4, bg   , 'NONE' ]
+let s:IA2  =  [ gui_gray4, gui_gray1, gray4, gray1, 'NONE' ]
+let s:IA3  =  [ gui_gray4, gui_gray2, gray4, gray2, 'NONE' ]
+
+let g:airline#themes#surarken#palette.inactive =
+    \ airline#themes#generate_color_map(s:IA1, s:IA2, s:IA3)
+
+
+
+""""""""""""""""""""""""
+" Normal settings
+
+
+" to work around Section X from defaulting to bold
+let g:airline#themes#surarken#palette.normal.airline_x =
+    \ [ gui_sxfg, gui_sxbg, sxfg, sxbg, 'NONE' ]
+
+
+" what should happen when the buffer is modified during normal mode?
+let g:airline#themes#surarken#palette.normal_modified =
+    \ { 
+    \   'airline_x': [ gui_white1, gui_pinkeon, white1, pinkeon, 'bold' ],
+    \   'airline_c': [ gui_white1, gui_pinkeon, white1, pinkeon, 'bold' ] 
+    \ }
+
+
+
+""""""""""""""""""""""""
+" Insert settings
+
+" what should happen when the buffer is modified during insert mode?
+let g:airline#themes#surarken#palette.insert_modified =
+    \ {
+    \   'airline_x': [ gui_white1, gui_pinkeon, white1, pinkeon, 'bold' ],
+    \   'airline_c': [ gui_white1, gui_pinkeon, white1, pinkeon, 'bold' ]
+    \ }
+
+let g:airline#themes#surarken#palette.insert_paste =
+    \ { 'airline_a': [ gui_white2, gui_pinkish, white2, pinkish, '' ] }
+
+
+
+""""""""""""""""""""""""
+" Replace settings
+
+" copy colours from INSERT mode to use for REPLACE
+let g:airline#themes#surarken#palette.replace = 
+    \ copy(g:airline#themes#surarken#palette.insert)
+
+" change Section A colour
+let g:airline#themes#surarken#palette.replace.airline_a = 
+    \ [ gui_cyan, gui_bae_blue, bleu1, bae_blue, '' ]
+
+
+" what should happen when the buffer is modified during replace mode?
+let g:airline#themes#surarken#palette.replace_modified = 
+    \ g:airline#themes#surarken#palette.insert_modified
+
+
+
+""""""""""""""""""""""""
+" Visual settings
+
+" what should happen when the buffer is modified during a visual mode?
+let g:airline#themes#surarken#palette.visual_modified =
+    \ { 
+    \   'airline_x': [ gui_white1, gui_pinkeon, white1, pinkeon, 'bold' ],
+    \   'airline_c': [ gui_gray2 , gui_pinkeon, gray2 , pinkeon, 'bold' ]
+    \ } 
+
+
+
+""""""""""""""""""""""""
+" Inactive settings
+
+" to work around it defaulting to bold O_o...?
+let g:airline#themes#surarken#palette.inactive.airline_c = 
+    \ [ gui_gray5 , gui_gray3, gray5, gray3, 'NONE' ]
+let g:airline#themes#surarken#palette.inactive.airline_x =
+    \ [ gui_gray5 , gui_gray3, gray5, gray3, 'NONE' ]
+let g:airline#themes#surarken#palette.inactive.airline_y =
+    \ [ gui_gray5 , gui_gray2, gray5, gray2, 'NONE' ]
+let g:airline#themes#surarken#palette.inactive.airline_z =
+    \ [ gui_gray5 , gui_bg, gray5, bg, 'NONE'  ]
+
+" what should happen when the buffer is modified during inactive mode?
+let g:airline#themes#surarken#palette.inactive_modified =
+    \ { 
+    \   'airline_c' : [ gui_white2 , '', white2, '', 'bold' ],
+    \   'airline_x' : [ gui_white2 , '', white2, '', 'bold' ],
+    \   'airline_y' : [ gui_white2 , '', white2, '', 'bold' ],
+    \   'airline_z' : [ gui_white2 , '', white2, '', 'bold' ]
+    \ }
+
+
+
+""""""""""""""""""""""""
+" Warning colours
+
+let warning_colour = [ gui_near_dark, gui_blurple, near_dark, blurple , '' ]
+
+let g:airline#themes#surarken#palette.normal.airline_warning =
+    \ warning_colour
+let g:airline#themes#surarken#palette.normal_modified.airline_warning =
+    \ warning_colour
+
+let g:airline#themes#surarken#palette.insert.airline_warning =
+    \ warning_colour
+let g:airline#themes#surarken#palette.insert_modified.airline_warning =
+    \ warning_colour
+
+let g:airline#themes#surarken#palette.visual.airline_warning =
+    \ warning_colour
+let g:airline#themes#surarken#palette.visual_modified.airline_warning =
+    \ warning_colour
+
+let g:airline#themes#surarken#palette.replace.airline_warning =
+    \ warning_colour
+let g:airline#themes#surarken#palette.replace_modified.airline_warning =
+    \ warning_colour
+
+
+
+""""""""""""""""""""""""
+" Airline tab settings
+
+
+" airline_tab     - unfocused tab
+" airline_tabsel  - focused tab
+" airline_tabtype - that pink shit in the corner
+" airline_tabfill - the unused filler portion
+" airline_tabmod  - modified buffer
+let g:airline#themes#surarken#palette.tabline =
+    \ {
+    \   'airline_tab'     : [ gui_cyan     , gui_gray2  ,  cyan     , gray2  , ''     ],
+    \   'airline_tabsel'  : [ gui_near_dark, gui_blurple,  near_dark, blurple, ''     ],
+    \   'airline_tabtype' : [ gui_near_dark, gui_blurple,  near_dark, blurple, 'bold' ],
+    \   'airline_tabfill' : [ gui_white1   , gui_gray2  ,  white1   , gray2  , ''     ],
+    \   'airline_tabmod'  : [ gui_white2   , gui_pinkeon,  white2   , pinkeon, 'bold' ]
+    \ }
+
+" !! in order for this to work with any other name,
+" one would need to change the readonly portion in init.vim to say cyan
+" rather than red.
+let g:airline#themes#surarken#palette.accents =
+    \ {
+    \   'red' : [ gui_cyan, '', cyan, '' ]
+    \ }

+ 35 - 0
vim/plugged/argtextobj.vim/README

@@ -0,0 +1,35 @@
+This is a mirror of http://www.vim.org/scripts/script.php?script_id=2699
+
+This plugin provides a text-object 'a' (argument). You can
+d(elete), c(hange), v(select)... an argument or inner argument in familiar ways.
+That is, such as 'daa'(delete-an-argument) 'cia'(change-inner-argument) 'via'(select-inner-argument).
+What this script does is more than just typing
+  F,dt,
+because it recognizes inclusion relationship of parentheses.
+
+There is an option to descide whether the motion should go out to toplevel function or not in nested function application.
+
+Examples:
+  case1) delete An argument
+      function(int arg1,    ch<press 'daa' here>ar* arg2="a,b,c(d,e)")
+      function(int arg1<cursor here; and if you press 'daa' again..>)
+      function(<cursor>)
+
+  case2) change Inner argument
+      function(int arg1,    ch<press 'cia' here>ar* arg2="a,b,c(d,e)")
+      function(int arg1,    <cursor here>)
+      
+  case 3) smart argument recognition (g:argumentobject_force_toplevel = 0)
+       function(1, (20<press 'cia' here>*30)+40, somefunc2(3, 4))
+       function(1, <cursor here>, somefunc2(3, 4))
+       
+       function(1, (20*30)+40, somefunc2(<press 'cia' here>3, 4))
+       function(1, (20*30)+40, somefunc2(<cursor here>4))
+
+  case 4) smart argument recognition (g:argumentobject_force_toplevel = 1)
+       function(1, (20<press 'cia' here>*30)+40, somefunc2(3, 4))
+       function(1, <cursor here>, somefunc2(3, 4)) " note that this result is the same of above.
+       
+       function(1, (20*30)+40, somefunc2(<press 'cia' here>3, 4))
+       function(1, (20*30)+40, <cursor here>) " sub-level function is deleted because it is a argument in terms of the outer function.
+

+ 304 - 0
vim/plugged/argtextobj.vim/plugin/argtextobj.vim

@@ -0,0 +1,304 @@
+"=============================================================================
+" argtextobj.vim - Text-Object like motion for arguments
+"=============================================================================
+"
+" Author:  Takahiro SUZUKI <takahiro.suzuki.ja@gmDELETEMEail.com>
+" Version: 1.1.1 (Vim 7.1)
+" Licence: MIT Licence
+"
+"=============================================================================
+" Document: {{{1
+"
+"-----------------------------------------------------------------------------
+" Description:
+"   This plugin installes a text-object like motion 'a' (argument). You can
+"   d(elete), c(hange), v(select)... an argument or inner argument in familiar
+"   ways, such as 'daa'(delete-an-argument), 'cia'(change-inner-argument)
+"   or 'via'(select-inner-argument).
+"
+"   What this script do is more than just typing
+"     F,dt,
+"   because it recognizes inclusion relationship of parentheses.
+"
+"   There is an option to descide whether the motion should go out to toplevel
+"   function or not in nested function application.
+
+"
+"-----------------------------------------------------------------------------
+" Installation:
+"   Place this file in /usr/share/vim/vim*/plugin or ~/.vim/plugin/
+"   Now text-object like argument motion 'ia' and 'aa' is enabled by default.
+"
+"-----------------------------------------------------------------------------
+" Options:
+"   Write below in your .vimrc if you want to apply motions to the toplevel
+"   function.
+"     let g:argumentobject_force_toplevel = 1
+"   By default, this options is set to 0, which means your operation affects
+"   to the most inner level
+"
+"-----------------------------------------------------------------------------
+" Examples:
+" case 1: delete an argument
+"     function(int arg1,    char* arg2="a,b,c(d,e)")
+"                              [N]  daa
+"     function(int arg1)
+"                     [N] daa
+"     function()
+"             [N]
+"
+" case 2: delete inner argument
+"     function(int arg1,    char* arg2="a,b,c(d,e)")
+"                              [N]  cia
+"     function(int arg1,    )
+"                          [I]
+"
+" case 3: smart argument recognition (g:argumentobject_force_toplevel = 0)
+"     function(1, (20*30)+40, somefunc2(3, 4))
+"                   [N]  cia
+"     function(1, , somefunc2(3, 4))
+"                [I]
+"     function(1, (20*30)+40, somefunc2(3, 4))
+"                                      [N]  caa
+"     function(1, (20*30)+40, somefunc2(4))
+"                                      [I]
+"
+" case 4: smart argument recognition (g:argumentobject_force_toplevel = 1)
+"     function(1, (20*30)+40, somefunc2(3, 4))
+"                   [N]  cia
+"     function(1, , somefunc2(3, 4))
+"                [I]
+"     function(1, (20*30)+40, somefunc2(3, 4))
+"                                      [N]  caa
+"     function(1, (20*30)+40)
+"                          [I]
+"
+"-----------------------------------------------------------------------------
+" ToDo:
+"   - do nothing on null parentheses '()'
+"
+"-----------------------------------------------------------------------------
+" ChangeLog:
+"   1.1.1:
+"     - debug (stop beeping on using text objects). Thanks to Nadav Samet.
+"
+"   1.1.unreleased:
+"     - support for commas in <..> (for cpp templates)
+"
+"   1.1:
+"     - support for commas in quoted string (".."), array ([..])
+"       do nothing outside a function declaration/call
+"
+"   1.0:
+"     - Initial release
+" }}}1
+"=============================================================================
+
+"if exists('loaded_argtextobj') || v:version < 701
+"  finish
+"endif
+"let loaded_argtextobj = 1
+
+function! s:GetOutOfDoubleQuote()
+  " get out of double quoteed string (one letter before the beginning)
+  let line = getline('.')
+  let pos_save = getpos('.')
+  let mark_b = getpos("'<")
+  let mark_e = getpos("'>")
+  let repl='_'
+  if getline('.')[getpos('.')[2]-1]=='_'
+    let repl='?'
+  endif
+
+  while 1
+    exe 'silent! normal ^va"'
+    normal :\<ESC>\<CR>
+    if getpos("'<")==getpos("'>")
+      break
+    endif
+    exe 'normal gvr' . repl
+  endwhile
+
+  call setpos('.', pos_save)
+  if getline('.')[getpos('.')[2]-1]==repl
+    " in double quote
+    call setline('.', line)
+    if getpos('.')==getpos("'<")
+      normal h
+    else
+      normal F"
+  endif
+  else
+    " not in double quote
+    call setline('.', line)
+  endif
+endfunction
+
+function! s:GetOuterFunctionParenthesis()
+  let pos_save = getpos('.')
+  let rightup_before = pos_save
+  silent! normal [(
+  let rightup_p = getpos('.')
+  while rightup_p != rightup_before
+    if ! g:argumentobject_force_toplevel && getline('.')[getpos('.')[2]-1-1] =~ '[a-zA-Z0-9_]'
+      " found a function
+      break
+    endif
+    let rightup_before = rightup_p
+    silent! normal [(
+    let rightup_p = getpos('.')
+  endwhile
+  call setpos('.', pos_save)
+  return rightup_p
+endfunction
+
+function! s:GetPair(pos)
+  let pos_save = getpos('.')
+  call setpos('.', a:pos)
+  normal %h
+  let pair_pos = getpos('.')
+  call setpos('.', pos_save)
+  return pair_pos
+endfunction
+
+function! s:GetInnerText(r1, r2)
+  let pos_save = getpos('.')
+  let reg_save = @@
+  call setpos('.', a:r1)
+  normal lv
+  call setpos('.', a:r2)
+  normal y
+  let val = @@
+  call setpos('.', pos_save)
+  let @@ = reg_save
+  return val
+endfunction
+
+function! s:GetPrevCommaOrBeginArgs(arglist, offset)
+  let commapos = strridx(a:arglist, ',', a:offset)
+  return max([commapos+1, 0])
+endfunction
+
+function! s:GetNextCommaOrEndArgs(arglist, offset)
+  let commapos = stridx(a:arglist, ',', a:offset)
+  if commapos == -1
+    return strlen(a:arglist)-1
+  endif
+  return commapos-1
+endfunction
+
+function! s:MoveToNextNonSpace()
+  let oldp = getpos('.')
+  let moved = 0
+  """echo 'move:' . getline('.')[getpos('.')[2]-1]
+  while getline('.')[getpos('.')[2]-1]==' '
+    normal l
+    if oldp == getpos('.')
+      break
+    endif
+    let oldp = getpos('.')
+    let moved += 1
+  endwhile
+  return moved
+endfunction
+
+function! s:MoveLeft(num)
+  if a:num>0
+    exe 'normal ' . a:num . 'h'
+  endif
+endfunction
+
+function! s:MoveRight(num)
+  if a:num>0
+    exe 'normal ' . a:num . 'l'
+  endif
+endfunction
+
+function! s:MotionArgument(inner, visual)
+  let current_c = getline('.')[getpos('.')[2]-1]
+  if current_c==',' || current_c=='('
+    normal l
+  endif
+
+  " get out of "double quoted string" because [( does not take effect in it
+  call <SID>GetOutOfDoubleQuote()
+
+  let rightup      = <SID>GetOuterFunctionParenthesis()       " on (
+  if getline('.')[rightup[2]-1]!='('
+    " not in a function declaration nor call
+    return
+  endif
+  let rightup_pair = <SID>GetPair(rightup)                    " before )
+  let arglist_str  = <SID>GetInnerText(rightup, rightup_pair) " inside ()
+  let arglist_sub  = arglist_str
+  " cursor offset from rightup
+  let offset  = getpos('.')[2] - rightup[2] - 1 " -1 for the removed parenthesis
+  " replace all parentheses and commas inside them to '_'
+  let arglist_sub = substitute(arglist_sub, "'".'\([^'."'".']\{-}\)'."'", '\="(".substitute(submatch(1), ".", "_", "g").")"', 'g') " replace '..' => (__)
+  let arglist_sub = substitute(arglist_sub, '\[\([^'."'".']\{-}\)\]', '\="(".substitute(submatch(1), ".", "_", "g").")"', 'g')     " replace [..] => (__)
+  let arglist_sub = substitute(arglist_sub, '<\([^'."'".']\{-}\)>', '\="(".substitute(submatch(1), ".", "_", "g").")"', 'g')       " replace <..> => (__)
+  let arglist_sub = substitute(arglist_sub, '"\([^'."'".']\{-}\)"', '(\1)', 'g') " replace ''..'' => (..)
+  """echo 'transl quotes: ' . arglist_sub
+  while stridx(arglist_sub, '(')>=0 && stridx(arglist_sub, ')')>=0
+    let arglist_sub = substitute(arglist_sub , '(\([^()]\{-}\))', '\="<".substitute(submatch(1), ",", "_", "g").">"', 'g')
+    """echo 'sub single quot: ' . arglist_sub
+  endwhile
+
+  " the beginning/end of this argument
+  let thisargbegin = <SID>GetPrevCommaOrBeginArgs(arglist_sub, offset)
+  let thisargend   = <SID>GetNextCommaOrEndArgs(arglist_sub, offset)
+
+  " function(..., the_nth_arg, ...)
+  "             [^left]    [^right]
+  let left  = offset - thisargbegin
+  let right = thisargend - thisargbegin
+
+  """echo 'on(='. rightup[2] . ' before)=' . rightup_pair[2]
+  """echo arglist_str
+  """echo arglist_sub
+  """echo offset
+  """echo 'argbegin='. thisargbegin . '  argend='. thisargend
+  """echo 'left=' . left . '  right='. right
+
+  let delete_trailing_space = 0
+  if a:inner
+    " ia
+    call <SID>MoveLeft(left)
+    let right -= <SID>MoveToNextNonSpace()
+  else
+    " aa
+    if thisargbegin==0 && thisargend==strlen(arglist_sub)-1
+      " only single argument
+      call <SID>MoveLeft(left)
+    elseif thisargbegin==0
+      " head of the list (do not delete '(')
+      call <SID>MoveLeft(left)
+      let right += 1
+      let delete_trailing_space = 1
+    else
+      " normal or tail of the list
+      call <SID>MoveLeft(left+1)
+      let right += 1
+    endif
+  endif
+
+  exe 'normal v'
+
+  call <SID>MoveRight(right)
+  if delete_trailing_space
+    exe 'normal l'
+    call <SID>MoveToNextNonSpace()
+    exe 'normal h'
+  endif
+endfunction
+
+" maping definition
+vnoremap <silent> ia <ESC>:call <SID>MotionArgument(1, 1)<CR>
+vnoremap <silent> aa <ESC>:call <SID>MotionArgument(0, 1)<CR>
+onoremap <silent> ia :call <SID>MotionArgument(1, 0)<CR>
+onoremap <silent> aa :call <SID>MotionArgument(0, 0)<CR>
+
+" option. turn 1 to search the most toplevel function
+let g:argumentobject_force_toplevel = 0
+
+" vim: set foldmethod=marker et ts=2 sts=2 sw=2:

+ 30 - 0
vim/plugged/ctrlp.vim/LICENSE

@@ -0,0 +1,30 @@
+VIM LICENSE
+
+I) There are no restrictions on distributing unmodified copies of Vim except that they must include this license text. You can also distribute unmodified parts of Vim, likewise unrestricted except that they must include this license text. You are also allowed to include executables that you made from the unmodified Vim sources, plus your own usage examples and Vim scripts.
+
+II) It is allowed to distribute a modified (or extended) version of Vim, including executables and/or source code, when the following four conditions are met:
+
+     1) This license text must be included unmodified.
+
+     2) The modified Vim must be distributed in one of the following five ways:
+
+          a) If you make changes to Vim yourself, you must clearly describe in the distribution how to contact you. When the maintainer asks you (in any way) for a copy of the modified Vim you distributed, you must make your changes, including source code, available to the maintainer without fee. The maintainer reserves the right to include your changes in the official version of Vim. What the maintainer will do with your changes and under what license they will be distributed is negotiable. If there has been no negotiation then this license, or a later version, also applies to your changes. The current maintainer is Bram Moolenaar <Bram@vim.org>. If this changes it will be announced in appropriate places (most likely vim.sf.net, www.vim.org and/or comp.editors). When it is completely impossible to contact the maintainer, the obligation to send him your changes ceases. Once the maintainer has confirmed that he has received your changes they will not have to be sent again.
+
+          b) If you have received a modified Vim that was distributed as mentioned under a) you are allowed to further distribute it unmodified, as mentioned at I). If you make additional changes the text under a) applies to those changes.
+
+          c) Provide all the changes, including source code, with every copy of the modified Vim you distribute. This may be done in the form of a context diff. You can choose what license to use for new code you add. The changes and their license must not restrict others from making their own changes to the official version of Vim.
+
+          d) When you have a modified Vim which includes changes as mentioned under c), you can distribute it without the source code for the changes if the following three conditions are met:
+          - The license that applies to the changes permits you to distribute the changes to the Vim maintainer without fee or restriction, and permits the Vim maintainer to include the changes in the official version of Vim without fee or restriction.
+          - You keep the changes for at least three years after last distributing the corresponding modified Vim. When the maintainer or someone who you distributed the modified Vim to asks you (in any way) for the changes within this period, you must make them available to him.
+          - You clearly describe in the distribution how to contact you. This contact information must remain valid for at least three years after last distributing the corresponding modified Vim, or as long as possible.
+
+          e) When the GNU General Public License (GPL) applies to the changes, you can distribute the modified Vim under the GNU GPL version 2 or any later version.
+
+     3) A message must be added, at least in the output of the ":version" command and in the intro screen, such that the user of the modified Vim is able to see that it was modified. When distributing as mentioned under 2)e) adding the message is only required for as far as this does not conflict with the license used for the changes.
+
+     4) The contact information as required under 2)a) and 2)d) must not be removed or changed, except that the person himself can make corrections.
+
+III) If you distribute a modified version of Vim, you are encouraged to use the Vim license for your changes and make them available to the maintainer, including the source code. The preferred way to do this is by e-mail or by uploading the files to a server and e-mailing the URL. If the number of changes is small (e.g., a modified Makefile) e-mailing a context diff will do. The e-mail address to be used is <maintainer@vim.org>
+
+IV) It is not allowed to remove this license from the distribution of the Vim sources, parts of it or from a modified version. You may use this license for previous Vim releases instead of the license that they came with, at your option.

+ 2903 - 0
vim/plugged/ctrlp.vim/autoload/ctrlp.vim

@@ -0,0 +1,2903 @@
+" =============================================================================
+" File:          autoload/ctrlp.vim
+" Description:   Fuzzy file, buffer, mru, tag, etc finder.
+" Author:        CtrlP Dev Team
+" Original:      Kien Nguyen <github.com/kien>
+" Version:       1.80
+" =============================================================================
+
+" ** Static variables {{{1
+" s:ignore() {{{2
+fu! s:ignore()
+	let igdirs = [
+		\ '\.git',
+		\ '\.hg',
+		\ '\.svn',
+		\ '_darcs',
+		\ '\.bzr',
+		\ '\.cdv',
+		\ '\~\.dep',
+		\ '\~\.dot',
+		\ '\~\.nib',
+		\ '\~\.plst',
+		\ '\.pc',
+		\ '_MTN',
+		\ 'blib',
+		\ 'CVS',
+		\ 'RCS',
+		\ 'SCCS',
+		\ '_sgbak',
+		\ 'autom4te\.cache',
+		\ 'cover_db',
+		\ '_build',
+		\ ]
+	let igfiles = [
+		\ '\~$',
+		\ '#.+#$',
+		\ '[._].*\.swp$',
+		\ 'core\.\d+$',
+		\ '\.exe$',
+		\ '\.so$',
+		\ '\.bak$',
+		\ '\.png$',
+		\ '\.jpg$',
+		\ '\.gif$',
+		\ '\.zip$',
+		\ '\.rar$',
+		\ '\.tar\.gz$',
+		\ ]
+	retu {
+		\ 'dir': '\v[\/]('.join(igdirs, '|').')$',
+		\ 'file': '\v'.join(igfiles, '|'),
+		\ }
+endf
+" Script local vars {{{2
+let [s:pref, s:bpref, s:opts, s:new_opts, s:lc_opts] =
+	\ ['g:ctrlp_', 'b:ctrlp_', {
+	\ 'abbrev':                ['s:abbrev', {}],
+	\ 'arg_map':               ['s:argmap', 0],
+	\ 'buffer_func':           ['s:buffunc', {}],
+	\ 'by_filename':           ['s:byfname', 0],
+	\ 'custom_ignore':         ['s:usrign', s:ignore()],
+	\ 'default_input':         ['s:deftxt', 0],
+	\ 'dont_split':            ['s:nosplit', 'netrw'],
+	\ 'dotfiles':              ['s:showhidden', 0],
+	\ 'extensions':            ['s:extensions', []],
+	\ 'follow_symlinks':       ['s:folsym', 0],
+	\ 'highlight_match':       ['s:mathi', [1, 'CtrlPMatch']],
+	\ 'jump_to_buffer':        ['s:jmptobuf', 'Et'],
+	\ 'key_loop':              ['s:keyloop', 0],
+	\ 'lazy_update':           ['s:lazy', 0],
+	\ 'match_func':            ['s:matcher', {}],
+	\ 'match_window':          ['s:mw', ''],
+	\ 'match_window_bottom':   ['s:mwbottom', 1],
+	\ 'match_window_reversed': ['s:mwreverse', 1],
+	\ 'max_depth':             ['s:maxdepth', 40],
+	\ 'max_files':             ['s:maxfiles', 10000],
+	\ 'max_height':            ['s:mxheight', 10],
+	\ 'max_history':           ['s:maxhst', exists('+hi') ? &hi : 20],
+	\ 'mruf_default_order':    ['s:mrudef', 0],
+	\ 'open_func':             ['s:openfunc', {}],
+	\ 'open_multi':            ['s:opmul', '1v'],
+	\ 'open_new_file':         ['s:newfop', 'v'],
+	\ 'prompt_mappings':       ['s:urprtmaps', 0],
+	\ 'regexp_search':         ['s:regexp', 0],
+	\ 'root_markers':          ['s:rmarkers', []],
+	\ 'split_window':          ['s:splitwin', 0],
+	\ 'status_func':           ['s:status', {}],
+	\ 'tabpage_position':      ['s:tabpage', 'ac'],
+	\ 'use_caching':           ['s:caching', 1],
+	\ 'user_command':          ['s:usrcmd', ''],
+	\ 'validate':              ['s:validate', ''],
+	\ 'working_path_mode':     ['s:pathmode', 'ra'],
+	\ 'line_prefix':           ['s:lineprefix', '> '],
+	\ 'open_single_match':     ['s:opensingle', []],
+	\ 'brief_prompt':          ['s:brfprt', 0],
+	\ 'match_current_file':    ['s:matchcrfile', 0],
+	\ 'match_natural_name':    ['s:matchnatural', 0],
+	\ 'compare_lim':           ['s:compare_lim', 0],
+	\ 'bufname_mod':           ['s:bufname_mod', ':t'],
+	\ 'bufpath_mod':           ['s:bufpath_mod', ':~:.:h'],
+	\ 'formatline_func':       ['s:flfunc', 's:formatline(v:val)'],
+	\ 'user_command_async':    ['s:usrcmdasync', 0],
+	\ }, {
+	\ 'open_multiple_files':   's:opmul',
+	\ 'regexp':                's:regexp',
+	\ 'reuse_window':          's:nosplit',
+	\ 'show_hidden':           's:showhidden',
+	\ 'switch_buffer':         's:jmptobuf',
+	\ }, {
+	\ 'root_markers':          's:rmarkers',
+	\ 'user_command':          's:usrcmd',
+	\ 'working_path_mode':     's:pathmode',
+	\ }]
+
+" Global options
+let s:glbs = { 'magic': 1, 'to': 1, 'tm': 0, 'sb': 1, 'hls': 0, 'im': 0,
+	\ 'report': 9999, 'sc': 0, 'ss': 0, 'siso': 0, 'mfd': 200, 'ttimeout': 0,
+	\ 'gcr': 'a:blinkon0', 'ic': 1, 'lmap': '', 'mousef': 0, 'imd': 1 }
+
+" Keymaps
+let [s:lcmap, s:prtmaps] = ['nn <buffer> <silent>', {
+	\ 'PrtBS()':              ['<bs>', '<c-]>'],
+	\ 'PrtDelete()':          ['<del>'],
+	\ 'PrtDeleteWord()':      ['<c-w>'],
+	\ 'PrtClear()':           ['<c-u>'],
+	\ 'PrtSelectMove("j")':   ['<c-j>', '<down>'],
+	\ 'PrtSelectMove("k")':   ['<c-k>', '<up>'],
+	\ 'PrtSelectMove("t")':   ['<Home>', '<kHome>'],
+	\ 'PrtSelectMove("b")':   ['<End>', '<kEnd>'],
+	\ 'PrtSelectMove("u")':   ['<PageUp>', '<kPageUp>'],
+	\ 'PrtSelectMove("d")':   ['<PageDown>', '<kPageDown>'],
+	\ 'PrtHistory(-1)':       ['<c-n>'],
+	\ 'PrtHistory(1)':        ['<c-p>'],
+	\ 'AcceptSelection("e")': ['<cr>', '<2-LeftMouse>'],
+	\ 'AcceptSelection("h")': ['<c-x>', '<c-cr>', '<c-s>'],
+	\ 'AcceptSelection("t")': ['<c-t>'],
+	\ 'AcceptSelection("v")': ['<c-v>', '<RightMouse>'],
+	\ 'ToggleFocus()':        ['<s-tab>'],
+	\ 'ToggleRegex()':        ['<c-r>'],
+	\ 'ToggleByFname()':      ['<c-d>'],
+	\ 'ToggleType(1)':        ['<c-f>', '<c-up>'],
+	\ 'ToggleType(-1)':       ['<c-b>', '<c-down>'],
+	\ 'PrtExpandDir()':       ['<tab>'],
+	\ 'PrtInsert("c")':       ['<MiddleMouse>', '<insert>'],
+	\ 'PrtInsert()':          ['<c-\>'],
+	\ 'PrtCurStart()':        ['<c-a>'],
+	\ 'PrtCurEnd()':          ['<c-e>'],
+	\ 'PrtCurLeft()':         ['<c-h>', '<left>', '<c-^>'],
+	\ 'PrtCurRight()':        ['<c-l>', '<right>'],
+	\ 'PrtClearCache()':      ['<F5>'],
+	\ 'PrtDeleteEnt()':       ['<F7>'],
+	\ 'CreateNewFile()':      ['<c-y>'],
+	\ 'MarkToOpen()':         ['<c-z>'],
+	\ 'OpenMulti()':          ['<c-o>'],
+	\ 'YankLine()':           [],
+	\ 'PrtExit()':            ['<esc>', '<c-c>', '<c-g>'],
+	\ }]
+
+if !has('gui_running')
+	cal add(s:prtmaps['PrtBS()'], remove(s:prtmaps['PrtCurLeft()'], 0))
+en
+
+let s:ficounts = {}
+
+let s:ccex = s:pref.'clear_cache_on_exit'
+
+" Regexp
+let s:fpats = {
+	\ '^\(\\|\)\|\(\\|\)$': '\\|',
+	\ '^\\\(zs\|ze\|<\|>\)': '^\\\(zs\|ze\|<\|>\)',
+	\ '^\S\*$': '\*',
+	\ '^\S\\?$': '\\?',
+	\ }
+
+let s:has_conceal = has('conceal')
+let s:bufnr_width = 3
+
+" Keypad
+let s:kprange = {
+	\ 'Plus': '+',
+	\ 'Minus': '-',
+	\ 'Divide': '/',
+	\ 'Multiply': '*',
+	\ 'Point': '.',
+	\ }
+
+" Highlight groups
+let s:hlgrps = {
+	\ 'NoEntries': 'Error',
+	\ 'Mode1': 'Character',
+	\ 'Mode2': 'LineNr',
+	\ 'Stats': 'Function',
+	\ 'Match': 'Identifier',
+	\ 'PrtBase': 'Comment',
+	\ 'PrtText': 'Normal',
+	\ 'PrtCursor': 'Constant',
+	\ 'BufferNr':      'Constant',
+	\ 'BufferInd':     'Normal',
+	\ 'BufferHid':     'Comment',
+	\ 'BufferHidMod':  'String',
+	\ 'BufferVis':     'Normal',
+	\ 'BufferVisMod':  'Identifier',
+	\ 'BufferCur':     'Question',
+	\ 'BufferCurMod':  'WarningMsg',
+	\ 'BufferPath':    'Comment',
+	\ }
+
+" lname, sname of the basic(non-extension) modes
+let s:types = ['fil', 'buf', 'mru']
+if !exists('g:ctrlp_types')
+	let g:ctrlp_types = s:types
+el
+	call filter(g:ctrlp_types, "index(['fil', 'buf', 'mru'], v:val)!=-1")
+en
+let g:ctrlp_builtins = len(g:ctrlp_types)-1
+
+let s:coretype_names = {
+	\ 'fil' : 'files',
+	\ 'buf' : 'buffers',
+	\ 'mru' : 'mru files',
+	\ }
+
+let s:coretypes = map(copy(g:ctrlp_types), '[s:coretype_names[v:val], v:val]')
+
+" Get the options {{{2
+fu! s:opts(...)
+	unl! s:usrign s:usrcmd s:urprtmaps
+	for each in ['byfname', 'regexp', 'extensions'] | if exists('s:'.each)
+		let {each} = s:{each}
+	en | endfo
+	for [ke, va] in items(s:opts)
+		let {va[0]} = exists(s:pref.ke) ? {s:pref.ke} : va[1]
+	endfo
+	unl va
+	for [ke, va] in items(s:new_opts)
+		let {va} = {exists(s:pref.ke) ? s:pref.ke : va}
+	endfo
+	unl va
+	for [ke, va] in items(s:lc_opts)
+		if exists(s:bpref.ke)
+			unl {va}
+			let {va} = {s:bpref.ke}
+		en
+	endfo
+	" Match window options
+	cal s:match_window_opts()
+	" One-time values
+	if a:0 && a:1 != {}
+		unl va
+		for [ke, va] in items(a:1)
+			let opke = substitute(ke, '\(\w:\)\?ctrlp_', '', '')
+			if has_key(s:lc_opts, opke)
+				let sva = s:lc_opts[opke]
+				unl {sva}
+				let {sva} = va
+			en
+		endfo
+	en
+	for each in ['byfname', 'regexp'] | if exists(each)
+		let s:{each} = {each}
+	en | endfo
+	if !exists('g:ctrlp_tilde_homedir') | let g:ctrlp_tilde_homedir = 0 | en
+	if !exists('g:ctrlp_newcache') | let g:ctrlp_newcache = 0 | en
+	let s:maxdepth = min([s:maxdepth, 100])
+	let s:glob = s:showhidden ? '.*\|*' : '*'
+	let s:igntype = empty(s:usrign) ? -1 : type(s:usrign)
+	let s:lash = ctrlp#utils#lash()
+	if s:keyloop
+		let [s:lazy, s:glbs['imd']] = [0, 0]
+	en
+	if s:lazy
+		cal extend(s:glbs, { 'ut': ( s:lazy > 1 ? s:lazy : 250 ) })
+	en
+	" Extensions
+	if !( exists('extensions') && extensions == s:extensions )
+		for each in s:extensions
+			exe 'ru autoload/ctrlp/'.each.'.vim'
+		endfo
+	en
+	" Keymaps
+	if type(s:urprtmaps) == 4
+		cal extend(s:prtmaps, s:urprtmaps)
+	en
+endf
+
+fu! s:match_window_opts()
+	let s:mw_pos =
+		\ s:mw =~ 'top\|bottom' ? matchstr(s:mw, 'top\|bottom') :
+		\ exists('g:ctrlp_match_window_bottom') ? ( s:mwbottom ? 'bottom' : 'top' )
+		\ : 'bottom'
+	let s:mw_order =
+		\ s:mw =~ 'order:[^,]\+' ? matchstr(s:mw, 'order:\zs[^,]\+') :
+		\ exists('g:ctrlp_match_window_reversed') ? ( s:mwreverse ? 'btt' : 'ttb' )
+		\ : 'btt'
+	let s:mw_max =
+		\ s:mw =~ 'max:[^,]\+' ? str2nr(matchstr(s:mw, 'max:\zs\d\+')) :
+		\ exists('g:ctrlp_max_height') ? s:mxheight
+		\ : 10
+	let s:mw_min =
+		\ s:mw =~ 'min:[^,]\+' ? str2nr(matchstr(s:mw, 'min:\zs\d\+')) : 1
+	let [s:mw_max, s:mw_min] = [max([s:mw_max, 1]), max([s:mw_min, 1])]
+	let s:mw_min = min([s:mw_min, s:mw_max])
+	let s:mw_res =
+		\ s:mw =~ 'results:[^,]\+' ? str2nr(matchstr(s:mw, 'results:\zs\d\+'))
+		\ : min([s:mw_max, &lines])
+endf
+"}}}1
+" * Open & Close {{{1
+fu! s:Open()
+	cal s:log(1)
+	cal s:getenv()
+	cal s:execextvar('enter')
+	sil! exe 'keepa' ( s:mw_pos == 'top' ? 'to' : 'bo' ) '1new ControlP'
+	cal s:buffunc(1)
+	let [s:bufnr, s:winw] = [bufnr('%'), winwidth(0)]
+	let [s:focus, s:prompt] = [1, ['', '', '']]
+	abc <buffer>
+	if !exists('s:hstry')
+		let hst = filereadable(s:gethistloc()[1]) ? s:gethistdata() : ['']
+		let s:hstry = empty(hst) || !s:maxhst ? [''] : hst
+	en
+	for [ke, va] in items(s:glbs) | if exists('+'.ke)
+		sil! exe 'let s:glb_'.ke.' = &'.ke.' | let &'.ke.' = '.string(va)
+	en | endfo
+	if s:opmul != '0' && has('signs')
+		sign define ctrlpmark text=+> texthl=CtrlPMark
+		hi def link CtrlPMark Search
+	en
+	cal s:setupblank()
+endf
+
+fu! s:Close()
+	if has('patch-9.0.0115') && exists('s:cmdheight')
+		let &cmdheight = s:cmdheight
+		unlet s:cmdheight
+	en
+	cal s:async_glob_abort(0)
+	cal s:buffunc(0)
+	if winnr('$') == 1
+		bw!
+	el
+		try | bun!
+		cat | clo! | endt
+		cal s:unmarksigns()
+	en
+	for key in keys(s:glbs) | if exists('+'.key)
+		sil! exe 'let &'.key.' = s:glb_'.key
+	en | endfo
+	if exists('s:glb_acd') | let &acd = s:glb_acd | en
+	let g:ctrlp_lines = []
+	if s:winres[1] >= &lines && s:winres[2] == winnr('$')
+		exe s:winres[0].s:winres[0]
+	en
+	unl! s:focus s:hisidx s:hstgot s:marked s:statypes s:init s:savestr
+		\ s:mrbs s:did_exp
+	cal ctrlp#recordhist()
+	cal s:execextvar('exit')
+	cal s:log(0)
+	let v:errmsg = s:ermsg
+	ec
+endf
+" * Clear caches {{{1
+fu! ctrlp#clr(...)
+	let [s:matches, g:ctrlp_new{ a:0 ? a:1 : 'cache' }] = [1, 1]
+endf
+
+fu! ctrlp#clra()
+	let cadir = ctrlp#utils#cachedir()
+	if isdirectory(cadir)
+		let cafiles = split(s:glbpath(s:fnesc(cadir, 'g', ','), '**', 1), "\n")
+		let eval = '!isdirectory(v:val) && v:val !~ ''\v[\/]cache[.a-z]+$|\.log$'''
+		sil! cal map(s:ifilter(cafiles, eval), 'delete(v:val)')
+	en
+	cal ctrlp#clr()
+endf
+
+fu! s:Reset(args)
+	let opts = has_key(a:args, 'opts') ? [a:args['opts']] : []
+	cal call('s:opts', opts)
+	cal s:autocmds()
+	cal ctrlp#utils#opts()
+	cal s:execextvar('opts')
+endf
+" * Files {{{1
+fu! ctrlp#files()
+	let cafile = ctrlp#utils#cachefile()
+	if g:ctrlp_newcache || !filereadable(cafile) || s:nocache(cafile)
+		let [lscmd, s:initcwd, g:ctrlp_allfiles] = [s:lsCmd(), s:dyncwd, []]
+		" Get the list of files
+		if empty(lscmd)
+			if !ctrlp#igncwd(s:dyncwd)
+				cal s:InitCustomFuncs()
+				cal s:GlobPath(s:fnesc(s:dyncwd, 'g', ','), 0)
+				cal s:CloseCustomFuncs()
+			en
+		el
+			sil! cal ctrlp#progress('Indexing...')
+			try | cal s:UserCmd(lscmd)
+			cat | retu [] | endt
+		en
+		" Remove base directory
+		cal ctrlp#rmbasedir(g:ctrlp_allfiles)
+		if !s:compare_lim || len(g:ctrlp_allfiles) <= s:compare_lim
+			cal sort(g:ctrlp_allfiles, 'ctrlp#complen')
+		en
+		cal s:writecache(cafile)
+		let catime = getftime(cafile)
+	el
+		let catime = getftime(cafile)
+		if !( exists('s:initcwd') && s:initcwd == s:dyncwd )
+			\ || get(s:ficounts, s:dyncwd, [0, catime])[1] != catime
+			let s:initcwd = s:dyncwd
+			let g:ctrlp_allfiles = ctrlp#utils#readfile(cafile)
+		en
+	en
+	cal extend(s:ficounts, { s:dyncwd : [len(g:ctrlp_allfiles), catime] })
+	retu g:ctrlp_allfiles
+endf
+
+fu! s:InitCustomFuncs()
+	if s:igntype == 4 && get(s:usrign, 'func-init', '') != ''
+		exe call(s:usrign['func-init'], [])
+	en
+endf
+
+fu! s:CloseCustomFuncs()
+	if s:igntype == 4 && get(s:usrign, 'func-close', '') != ''
+		exe call(s:usrign['func-close'], [])
+	en
+endf
+
+if has('patch-8.2-0995') && get(g:, 'ctrlp_use_readdir', 1)
+	fu! s:GlobPath(dirs, depth)
+		let entries = []
+		let dirs = substitute(a:dirs, '\\\([%# ]\)', '\1', 'g')
+		for e in split(dirs, ',')
+			try
+				let files = readdir(e, '1', {'sort': 'none'})
+				if !s:showhidden | cal filter(files, 'v:val[0] != "."') | en
+				let entries += map(files, 'e.s:lash.v:val')
+			cat
+			endt
+		endfo
+		let [dnf, depth] = [ctrlp#dirnfile(entries), a:depth + 1]
+		if &wig != '' | cal filter(dnf[1], 'glob(v:val) != ""') | en
+		let g:ctrlp_allfiles += dnf[1]
+		if !empty(dnf[0]) && !s:maxf(len(g:ctrlp_allfiles)) && depth <= s:maxdepth
+			sil! cal ctrlp#progress(len(g:ctrlp_allfiles), 1)
+			cal s:GlobPath(join(dnf[0], ','), depth)
+		en
+	endf
+el
+	fu! s:GlobPath(dirs, depth)
+		let entries = split(globpath(a:dirs, s:glob), "\n")
+		let [dnf, depth] = [ctrlp#dirnfile(entries), a:depth + 1]
+		let g:ctrlp_allfiles += dnf[1]
+		if !empty(dnf[0]) && !s:maxf(len(g:ctrlp_allfiles)) && depth <= s:maxdepth
+			sil! cal ctrlp#progress(len(g:ctrlp_allfiles), 1)
+			cal s:GlobPath(join(map(dnf[0], 's:fnesc(v:val, "g", ",")'), ','), depth)
+		en
+	endf
+en
+
+fu! s:async_glob_update_progress(timer)
+	let s:must_wait = 0
+	if exists('s:focus') && get(s:, 'setlines_post_ended', 0)
+		cal s:ForceUpdate()
+	en
+	if exists('s:timer')
+		sil! cal ctrlp#statusline()
+	en
+
+	if !exists('s:job')
+		call s:stop_timer_if_exists()
+	en
+endf
+
+fu! s:async_glob_on_stdout(job, data, ...)
+	if type(a:data) ==# type([])
+		let g:ctrlp_allfiles += filter(a:data, 'v:val !=# ""')
+	el
+		let g:ctrlp_allfiles += [a:data]
+	en
+endf
+
+fu! s:async_glob_on_exit(...)
+	let s:must_wait = 0
+	if exists('s:job')
+		unl s:job
+	en
+	cal s:stop_timer_if_exists()
+	if exists('s:focus') && get(s:, 'setlines_post_ended', 0)
+		sil! cal ctrlp#statusline()
+		cal s:ForceUpdate()
+	en
+endf
+
+fu! s:async_glob_abort(upd)
+	cal s:stop_job_if_exists()
+	cal s:stop_timer_if_exists()
+	if a:upd
+		cal s:ForceUpdate()
+	en
+endf
+
+fu! s:stop_timer_if_exists()
+	if exists('s:timer')
+		cal timer_stop(s:timer)
+		unl s:timer
+	en
+endf
+
+fu! s:stop_job_if_exists()
+	if exists('s:job')
+		if !has('nvim')
+			cal job_stop(s:job)
+		el
+			cal jobstop(s:job)
+		en
+		unl s:job
+	en
+endf
+
+fu! s:safe_printf(format, ...)
+	try
+		retu call('printf', [a:format] + a:000)
+	cat
+		retu a:format
+	endt
+endf
+
+fu! s:UserCmd(lscmd)
+	let [path, lscmd] = [s:dyncwd, a:lscmd]
+	let do_ign =
+		\ type(s:usrcmd) == 4 && get(s:usrcmd, 'ignore', 0)
+	if do_ign && ctrlp#igncwd(s:cwd) | retu | en
+	if exists('+ssl') && &ssl && &shell !~ 'sh'
+		let [ssl, &ssl, path] = [&ssl, 0, tr(path, '/', '\')]
+	en
+	if (has('win32') || has('win64')) && match(&shellcmdflag, "/") != -1
+		let lscmd = substitute(lscmd, '\v(^|\&\&\s*)\zscd (/d)@!', 'cd /d ', '')
+	en
+	let path = exists('*shellescape') ? shellescape(path) : path
+	if (has('win32') || has('win64')) && match(&shell, 'sh') != -1
+		let path = tr(path, '\', '/')
+	en
+	if s:usrcmdasync && (v:version >= 800 || has('nvim')) && (exists('*job_start') || exists('*jobstart'))
+		cal s:stop_job_if_exists()
+		let g:ctrlp_allfiles = []
+		let s:must_wait = 1
+		let argv = [&shell, &shellcmdflag, printf(lscmd, path)]
+		if !has('nvim')
+			let s:job = job_start(argv, {
+						\ 'out_cb': function('s:async_glob_on_stdout'), 
+						\ 'exit_cb': function('s:async_glob_on_exit')
+						\ })
+		el
+			let s:job = jobstart(argv, {
+						\ 'on_stdout': function('s:async_glob_on_stdout'),
+						\ 'on_exit': function('s:async_glob_on_exit')
+						\ })
+		en
+		let s:timer = timer_start(250, function('s:async_glob_update_progress'), {'repeat': -1})
+		while s:must_wait
+			sleep 50m
+		endwhile
+	elsei has('patch-7.4-597') && !(has('win32') || has('win64'))
+		let g:ctrlp_allfiles = systemlist(s:safe_printf(lscmd, path))
+	el
+		let g:ctrlp_allfiles = split(system(s:safe_printf(lscmd, path)), "\n")
+	en
+	if exists('+ssl') && exists('ssl')
+		let &ssl = ssl
+		cal map(g:ctrlp_allfiles, 'tr(v:val, "\\", "/")')
+	en
+	if exists('s:vcscmd') && s:vcscmd
+		cal map(g:ctrlp_allfiles, 'tr(v:val, "/", "\\")')
+	en
+	if do_ign
+		if !empty(s:usrign)
+			let g:ctrlp_allfiles = ctrlp#dirnfile(g:ctrlp_allfiles)[1]
+		en
+		if &wig != ''
+			cal filter(g:ctrlp_allfiles, 'glob(v:val) != ""')
+		en
+	en
+endf
+
+fu! s:lsCmd()
+	let cmd = s:usrcmd
+	if type(cmd) == 1
+		retu cmd
+	elsei type(cmd) == 3 && len(cmd) >= 2 && cmd[:1] != ['', '']
+		if s:findroot(s:dyncwd, cmd[0], 0, 1) == []
+			retu len(cmd) == 3 ? cmd[2] : ''
+		en
+		let s:vcscmd = s:lash == '\'
+		retu cmd[1]
+	elsei type(cmd) == 4 && ( has_key(cmd, 'types') || has_key(cmd, 'fallback') )
+		let fndroot = []
+		if get(cmd, 'types', {}) != {}
+			let [markrs, cmdtypes] = [[], values(cmd['types'])]
+			for pair in cmdtypes
+				cal add(markrs, pair[0])
+			endfo
+			let fndroot = s:findroot(s:dyncwd, markrs, 0, 1)
+		en
+		if fndroot == []
+			retu get(cmd, 'fallback', '')
+		en
+		for pair in cmdtypes
+			if pair[0] == fndroot[0] | brea | en
+		endfo
+		let s:vcscmd = s:lash == '\'
+		retu pair[1]
+	en
+endf
+" - Buffers {{{1
+fu! s:bufparts(bufnr)
+	let idc  = (a:bufnr == bufnr('#')      ? '#' : '')  " alternative
+	let idc .= (getbufvar(a:bufnr, '&mod') ? '+' : '')  " modified
+	let idc .= (getbufvar(a:bufnr, '&ma')  ? '' : '-')  " nomodifiable
+	let idc .= (getbufvar(a:bufnr, '&ro')  ? '=' : '')  " readonly
+
+	" flags for highlighting
+	let hiflags  = (bufwinnr(a:bufnr) != -1    ? '*' : '')  " visible
+	let hiflags .= (getbufvar(a:bufnr, '&mod') ? '+' : '')  " modified
+	let hiflags .= (a:bufnr == s:crbufnr       ? '!' : '')  " current
+
+	let bname = bufname(a:bufnr)
+	let bname = (bname == '' ? '[No Name]' : fnamemodify(bname, s:bufname_mod))
+
+	let bpath = empty(s:bufpath_mod) ? '' : fnamemodify(bufname(a:bufnr), s:bufpath_mod).s:lash()
+
+	retu [idc, hiflags, bname, bpath]
+endf
+fu! ctrlp#buffers(...)
+	let ids = sort(filter(range(1, bufnr('$')), '(empty(getbufvar(v:val, "&bt"))'
+		\ .' || s:isterminal(v:val)) && getbufvar(v:val, "&bl")'), 's:compmreb')
+	if a:0 && a:1 == 'id'
+		retu ids
+	el
+		let bufs = [[], []]
+		if s:matcher != {} && !s:matchcrfile
+			call filter(ids, 'v:val != s:crbufnr')
+		en
+		for id in ids
+			let bname = bufname(id)
+			let ebname = bname == ''
+			let fname = fnamemodify(ebname ? '['.id.'*No Name]' : bname, ':.')
+			cal add(bufs[ebname], fname)
+		endfo
+		retu bufs[0] + bufs[1]
+	en
+endf
+" * MatchedItems() {{{1
+fu! s:MatchIt(items, pat, limit, exc)
+	let [lines, id] = [[], 0]
+	let pat =
+		\ s:byfname() ? map(split(a:pat, '^[^;]\+\\\@<!\zs;', 1), 's:martcs.v:val')
+		\ : s:martcs.a:pat
+	for item in a:items
+		let id += 1
+		try
+			if (s:matchcrfile || !( s:ispath && item ==# a:exc )) &&
+						\call(s:mfunc, [item, pat]) >= 0
+				let lines += [item]
+			en
+		cat | brea | endt
+		if a:limit > 0 && len(lines) >= a:limit | brea | en
+	endfo
+	let s:mdata = [s:dyncwd, s:itemtype, s:regexp, s:sublist(a:items, id, -1)]
+	retu lines
+endf
+
+fu! s:MatchedItems(items, pat, limit)
+	let exc = exists('s:crfilerel') ? s:crfilerel : ''
+	let items = s:narrowable() ? s:matched + s:mdata[3] : a:items
+	let matcher = s:getextvar('matcher')
+	if empty(matcher) || type(matcher) != 4 || !has_key(matcher, 'match')
+		unl matcher
+		let matcher = s:matcher
+	en
+	if matcher != {}
+		let argms =
+			\ get(matcher, 'arg_type', '') == 'dict' ? [{
+			\ 'items':  items,
+			\ 'str':    a:pat,
+			\ 'limit':  a:limit,
+			\ 'mmode':  s:mmode(),
+			\ 'ispath': s:ispath,
+			\ 'crfile': exc,
+			\ 'regex':  s:regexp,
+			\ }] : [items, a:pat, a:limit, s:mmode(), s:ispath, exc, s:regexp]
+		let lines = call(matcher['match'], argms, matcher)
+	el
+		let lines = s:MatchIt(items, a:pat, a:limit, exc)
+	en
+	let s:matches = len(lines)
+	unl! s:did_exp
+	retu lines
+endf
+
+fu! s:SplitPattern(str)
+	let str = a:str
+	let s:savestr = str
+	if s:regexp
+		let pat = s:regexfilter(str)
+	el
+		let lst = split(str, '\zs')
+		if exists('+ssl') && !&ssl
+			cal map(lst, 'escape(v:val, ''\'')')
+		en
+		for each in ['^', '$', '.']
+			cal map(lst, 'escape(v:val, each)')
+		endfo
+	en
+	if exists('lst')
+		let pat = ''
+		if !empty(lst)
+			if s:byfname() && index(lst, ';') > 0
+				let fbar = index(lst, ';')
+				let lst_1 = s:sublist(lst, 0, fbar - 1)
+				let lst_2 = len(lst) - 1 > fbar ? s:sublist(lst, fbar + 1, -1) : ['']
+				let pat = s:buildpat(lst_1).';'.s:buildpat(lst_2)
+			el
+				let pat = s:buildpat(lst)
+			en
+		en
+	en
+	retu escape(pat, '~')
+endf
+" * BuildPrompt() {{{1
+fu! s:Render(lines, pat)
+	let [&ma, lines, s:res_count] = [1, a:lines, len(a:lines)]
+	let height = min([max([s:mw_min, s:res_count]), s:winmaxh])
+	let pat = s:byfname() ? split(a:pat, '^[^;]\+\\\@<!\zs;', 1)[0] : a:pat
+	let cur_cmd = 'keepj norm! '.( s:mw_order == 'btt' ? 'G' : 'gg' ).'1|'
+
+	" Setup the match window
+	sil! exe '%d _ | res' height
+	" Print the new items
+	if empty(lines)
+		let [s:matched, s:lines] = [[], []]
+		let lines = [' == NO ENTRIES ==']
+		cal setline(1, s:offset(lines, height - 1))
+		setl noma nocul
+		exe cur_cmd
+		cal s:unmarksigns()
+		if s:dohighlight() | cal clearmatches() | en
+		retu
+	en
+	let s:matched = copy(lines)
+	" Sorting
+	if !s:nosort()
+		let s:compat = s:martcs.pat
+		if has('patch-8.1-0')
+			cal sort(lines, function('s:mixedsort2', [s:curtype()]))
+		el
+			cal sort(lines, 's:mixedsort')
+		en
+		unl s:compat
+	en
+	if s:mw_order == 'btt' | cal reverse(lines) | en
+	let s:lines = copy(lines)
+	if s:nolim == 0 && len(lines) > height
+		let lines = lines[:height-1]
+	en
+	if has('patch-8.1-0') && s:flfunc ==# 's:formatline(v:val)'
+		cal map(lines, function('s:formatline2', [s:curtype()]))
+	el
+		cal map(lines, s:flfunc)
+	en
+	cal setline(1, s:offset(lines, height))
+	cal s:unmarksigns()
+	cal s:remarksigns()
+	" Highlighting
+	if s:dohighlight()
+		cal s:highlight(pat, s:mathi[1])
+	en
+	setl noma cul
+	exe cur_cmd
+endf
+
+fu! s:Update(str)
+	" Get the previous string if existed
+	let oldstr = exists('s:savestr') ? s:savestr : ''
+	" Get the new string sans tail
+	let str = s:sanstail(a:str)
+	" Stop if the string's unchanged
+	if str == oldstr && !empty(str) && !exists('s:force') | retu | en
+	" Optionally send the string to a custom validate function
+	if s:validate != '' | let str = call(s:validate, [str]) | en
+	let s:martcs = &scs && str =~ '\u' ? '\C' : ''
+	let pat = s:matcher == {} ? s:SplitPattern(str) : str
+	let lines = s:nolim == 1 && empty(str) ? copy(g:ctrlp_lines)
+		\ : s:MatchedItems(g:ctrlp_lines, pat, s:mw_res)
+	if empty(str) | cal clearmatches() | en
+	cal s:Render(lines, pat)
+	retu lines
+endf
+
+fu! s:ForceUpdate()
+	let pos = exists('*getcurpos') ? getcurpos() : getpos('.')
+	sil! cal s:Update(escape(s:getinput(), '\'))
+	cal setpos('.', pos)
+endf
+
+fu! s:BuildPrompt(upd)
+	let base = ( s:regexp ? 'r' : '>' ).( s:byfname() ? 'd' : '>' ).'> '
+	let str = escape(s:getinput(), '\')
+	let lazy = str == '' || exists('s:force') || !has('autocmd') ? 0 : s:lazy
+	if a:upd && !lazy && ( s:matches || s:regexp || exists('s:did_exp')
+		\ || str =~ '\(\\\(<\|>\)\|[*|]\)\|\(\\\:\([^:]\|\\:\)*$\)' )
+		sil! cal s:Update(str)
+	en
+	sil! cal ctrlp#statusline()
+	" Toggling
+	let [hiactive, hicursor, base] = s:focus
+		\ ? ['CtrlPPrtText', 'CtrlPPrtCursor', base]
+		\ : ['CtrlPPrtBase', 'CtrlPPrtBase', tr(base, '>', '-')]
+	let hibase = 'CtrlPPrtBase'
+	" Build it
+	redr
+	let prt = copy(s:prompt)
+	cal map(prt, 'escape(v:val, ''"\'')')
+	exe 'echoh' hibase '| echon "'.base.'"
+		\ | echoh' hiactive '| echon "'.prt[0].'"
+		\ | echoh' hicursor '| echon "'.prt[1].'"
+		\ | echoh' hiactive '| echon "'.prt[2].'" | echoh None'
+	" Append the cursor at the end
+	if empty(prt[1]) && s:focus
+		exe 'echoh' hibase '| echon "_" | echoh None'
+	en
+	if a:upd
+		cal s:NotifySearch()
+	en
+endf
+" - SetDefTxt() {{{1
+fu! s:SetDefTxt()
+	if s:deftxt == '0' || ( s:deftxt == 1 && !s:ispath ) | retu | en
+	let txt = s:deftxt
+	if !type(txt)
+		let path = s:crfpath.s:lash(s:crfpath)
+		let txt = txt && !stridx(path, s:dyncwd) ? ctrlp#rmbasedir([path])[0] : ''
+	en
+	let s:prompt[0] = txt
+endf
+" ** Prt Actions {{{1
+" Editing {{{2
+fu! s:PrtClear()
+	if !s:focus | retu | en
+	unl! s:hstgot
+	let [s:prompt, s:matches] = [['', '', ''], 1]
+	cal s:BuildPrompt(1)
+endf
+
+fu! s:PrtAdd(char)
+	unl! s:hstgot
+	let s:act_add = 1
+	let s:prompt[0] .= a:char
+	cal s:BuildPrompt(1)
+	unl s:act_add
+endf
+
+fu! s:PrtBS()
+	if !s:focus | retu | en
+	if empty(s:prompt[0]) && s:brfprt != 0
+		cal s:PrtExit()
+		retu
+	en
+	unl! s:hstgot
+	let [s:prompt[0], s:matches] = [substitute(s:prompt[0], '.$', '', ''), 1]
+	cal s:BuildPrompt(1)
+endf
+
+fu! s:PrtDelete()
+	if !s:focus | retu | en
+	unl! s:hstgot
+	let [prt, s:matches] = [s:prompt, 1]
+	let prt[1] = matchstr(prt[2], '^.')
+	let prt[2] = substitute(prt[2], '^.', '', '')
+	cal s:BuildPrompt(1)
+endf
+
+fu! s:PrtDeleteWord()
+	if !s:focus | retu | en
+	unl! s:hstgot
+	let [str, s:matches] = [s:prompt[0], 1]
+	let str = str =~ '\W\w\+$' ? matchstr(str, '^.\+\W\ze\w\+$')
+		\ : str =~ '\w\W\+$' ? matchstr(str, '^.\+\w\ze\W\+$')
+		\ : str =~ '\s\+$' ? matchstr(str, '^.*\S\ze\s\+$')
+		\ : str =~ '\v^(\S+|\s+)$' ? '' : str
+	let s:prompt[0] = str
+	cal s:BuildPrompt(1)
+endf
+
+fu! s:PrtInsert(...)
+	if !s:focus | retu | en
+	let type = !a:0 ? '' : a:1
+	if !a:0
+		let type = s:insertstr()
+		if type == 'cancel' | retu | en
+	en
+	if type ==# 'r'
+		let regcont = s:getregs()
+		if regcont < 0 | retu | en
+	en
+	unl! s:hstgot
+	let s:act_add = 1
+	let s:prompt[0] .= type ==# 'w' ? s:crword
+		\ : type ==# 'f' ? s:crgfile
+		\ : type ==# 's' ? s:regisfilter('/')
+		\ : type ==# 'v' ? s:crvisual
+		\ : type ==# 'c' ? s:regisfilter('+')
+		\ : type ==# 'r' ? regcont : ''
+	cal s:BuildPrompt(1)
+	unl s:act_add
+endf
+
+fu! s:PrtExpandDir()
+	if !s:focus | retu | en
+	let str = s:getinput('c')
+	if str =~ '\v^\@(cd|lc[hd]?|chd)\s.+' && s:spi
+		let hasat = split(str, '\v^\@(cd|lc[hd]?|chd)\s*\zs')
+		let str = get(hasat, 1, '')
+		if str =~# '\v^[~$]\i{-}[\/]?|^#(\<?\d+)?:(p|h|8|\~|\.|g?s+)'
+			let str = expand(s:fnesc(str, 'g'))
+		elsei str =~# '\v^(\%|\<c\h{4}\>):(p|h|8|\~|\.|g?s+)'
+			let spc = str =~# '^%' ? s:crfile
+				\ : str =~# '^<cfile>' ? s:crgfile
+				\ : str =~# '^<cword>' ? s:crword
+				\ : str =~# '^<cWORD>' ? s:crnbword : ''
+			let pat = '(:(p|h|8|\~|\.|g?s(.)[^\3]*\3[^\3]*\3))+'
+			let mdr = matchstr(str, '\v^[^:]+\zs'.pat)
+			let nmd = matchstr(str, '\v^[^:]+'.pat.'\zs.{-}$')
+			let str = fnamemodify(s:fnesc(spc, 'g'), mdr).nmd
+		en
+	en
+	if str == '' | retu | en
+	unl! s:hstgot
+	let s:act_add = 1
+	let [base, seed] = s:headntail(str)
+	if str =~# '^[\/]'
+		let base = expand('/').base
+	en
+	let dirs = s:dircompl(base, seed)
+	if len(dirs) == 1
+		let str = dirs[0]
+	elsei len(dirs) > 1
+		let str .= s:findcommon(dirs, str)
+	en
+	let s:prompt[0] = exists('hasat') ? hasat[0].str : str
+	cal s:BuildPrompt(1)
+	unl s:act_add
+endf
+" Movement {{{2
+fu! s:PrtCurLeft()
+	if !s:focus | retu | en
+	let prt = s:prompt
+	if !empty(prt[0])
+		let s:prompt = [substitute(prt[0], '.$', '', ''), matchstr(prt[0], '.$'),
+			\ prt[1] . prt[2]]
+	en
+	cal s:BuildPrompt(0)
+endf
+
+fu! s:PrtCurRight()
+	if !s:focus | retu | en
+	let prt = s:prompt
+	let s:prompt = [prt[0] . prt[1], matchstr(prt[2], '^.'),
+		\ substitute(prt[2], '^.', '', '')]
+	cal s:BuildPrompt(0)
+endf
+
+fu! s:PrtCurStart()
+	if !s:focus | retu | en
+	let str = join(s:prompt, '')
+	let s:prompt = ['', matchstr(str, '^.'), substitute(str, '^.', '', '')]
+	cal s:BuildPrompt(0)
+endf
+
+fu! s:PrtCurEnd()
+	if !s:focus | retu | en
+	let s:prompt = [join(s:prompt, ''), '', '']
+	cal s:BuildPrompt(0)
+endf
+
+fu! s:PrtSelectMove(dir)
+	let wht = winheight(0)
+	let dirs = {'t': 'gg','b': 'G','j': 'j','k': 'k','u': wht.'k','d': wht.'j'}
+	exe 'keepj norm!' dirs[a:dir]
+	let pos = exists('*getcurpos') ? getcurpos() : getpos('.')
+	cal s:BuildPrompt(0)
+	cal setpos('.', pos)
+endf
+
+fu! s:PrtSelectJump(char)
+	let lines = copy(s:lines)
+	if s:byfname()
+		cal map(lines, 'split(v:val, ''[\/]\ze[^\/]\+$'')[-1]')
+	en
+	" Cycle through matches, use s:jmpchr to store last jump
+	let chr = escape(matchstr(a:char, '^.'), '.~')
+	let smartcs = &scs && chr =~ '\u' ? '\C' : ''
+	if match(lines, smartcs.'^'.chr) >= 0
+		" If not exists or does but not for the same char
+		let pos = match(lines, smartcs.'^'.chr)
+		if !exists('s:jmpchr') || ( exists('s:jmpchr') && s:jmpchr[0] != chr )
+			let [jmpln, s:jmpchr] = [pos, [chr, pos]]
+		elsei exists('s:jmpchr') && s:jmpchr[0] == chr
+			" Start of lines
+			if s:jmpchr[1] == -1 | let s:jmpchr[1] = pos | en
+			let npos = match(lines, smartcs.'^'.chr, s:jmpchr[1] + 1)
+			let [jmpln, s:jmpchr] = [npos == -1 ? pos : npos, [chr, npos]]
+		en
+		exe 'keepj norm!' ( jmpln + 1 ).'G'
+		let pos = exists('*getcurpos') ? getcurpos() : getpos('.')
+		cal s:BuildPrompt(0)
+		cal setpos('.', pos)
+	en
+endf
+" Misc {{{2
+fu! s:PrtFocusMap(char)
+	cal call(( s:focus ? 's:PrtAdd' : 's:PrtSelectJump' ), [a:char])
+endf
+
+fu! s:PrtClearCache()
+	let ct = s:curtype()
+	if ct == 'fil'
+		cal ctrlp#clr()
+	elsei s:itemtype >= len(s:coretypes)
+		cal ctrlp#clr(s:statypes[s:itemtype][1])
+	en
+	if ct == 'mru'
+		let g:ctrlp_lines = ctrlp#mrufiles#refresh()
+	el
+		cal ctrlp#setlines()
+	en
+	let s:force = 1
+	cal s:BuildPrompt(1)
+	unl s:force
+endf
+
+fu! s:PrtDeleteEnt()
+	let ct = s:curtype()
+	if ct == 'mru'
+		cal s:PrtDeleteMRU()
+	elsei ct == 'buf'
+		cal s:delbuf()
+	elsei type(s:getextvar('wipe')) == 1
+		cal s:delent(s:getextvar('wipe'))
+	en
+endf
+
+fu! s:PrtDeleteMRU()
+	if s:curtype() == 'mru'
+		cal s:delent('ctrlp#mrufiles#remove')
+	en
+endf
+
+fu! s:PrtExit()
+	let bw = bufwinnr('%')
+	exe bufwinnr(s:bufnr).'winc w'
+	if bufnr('%') == s:bufnr && bufname('%') == 'ControlP'
+		noa cal s:Close()
+		noa winc p
+	els
+		exe bw.'winc w'
+	en
+endf
+
+fu! s:PrtHistory(...)
+	if !s:focus || !s:maxhst | retu | en
+	let [str, hst, s:matches] = [join(s:prompt, ''), s:hstry, 1]
+	" Save to history if not saved before
+	let [hst[0], hslen] = [exists('s:hstgot') ? hst[0] : str, len(hst)]
+	let idx = exists('s:hisidx') ? s:hisidx + a:1 : a:1
+	" Limit idx within 0 and hslen
+	let idx = idx < 0 ? 0 : idx >= hslen ? hslen > 1 ? hslen - 1 : 0 : idx
+	let s:prompt = [hst[idx], '', '']
+	let [s:hisidx, s:hstgot, s:force] = [idx, 1, 1]
+	cal s:BuildPrompt(1)
+	unl s:force
+endf
+"}}}1
+" * Mappings {{{1
+fu! s:MapNorms()
+	if exists('s:nmapped') && s:nmapped == s:bufnr | retu | en
+	let pcmd = "nn \<buffer> \<silent> \<k%s> :\<c-u>cal \<SID>%s(\"%s\")\<cr>"
+	let cmd = substitute(pcmd, 'k%s', 'char-%d', '')
+	let pfunc = 'PrtFocusMap'
+	let ranges = [32, 33, 125, 126] + range(35, 91) + range(93, 123)
+	for each in [34, 92, 124]
+		exe printf(cmd, each, pfunc, escape(nr2char(each), '"|\'))
+	endfo
+	for each in ranges
+		exe printf(cmd, each, pfunc, nr2char(each))
+	endfo
+	for each in range(0, 9)
+		exe printf(pcmd, each, pfunc, each)
+	endfo
+	for [ke, va] in items(s:kprange)
+		exe printf(pcmd, ke, pfunc, va)
+	endfo
+	let s:nmapped = s:bufnr
+endf
+
+fu! s:MapSpecs()
+	if !( exists('s:smapped') && s:smapped == s:bufnr )
+		" Correct arrow keys in terminal
+		if ( has('termresponse') && v:termresponse =~ "\<ESC>" )
+			\ || &term =~? '\vxterm|<k?vt|gnome|screen|linux|ansi|tmux|alacritty|st(-[-a-z0-9]*)?(\:tc)?$'
+			for each in ['\A <up>','\B <down>','\C <right>','\D <left>']
+				exe s:lcmap.' <esc>['.each
+			endfo
+		en
+	en
+	for [ke, va] in items(s:prtmaps) | for kp in va
+		exe s:lcmap kp ':<c-u>cal <SID>'.ke.'<cr>'
+	endfo | endfo
+	let s:smapped = s:bufnr
+endf
+
+fu! s:KeyLoop()
+	let [t_ve, guicursor] = [&t_ve, &guicursor]
+	wh exists('s:init') && s:keyloop
+		try
+			set t_ve=
+			if guicursor != ''
+				set guicursor=a:NONE
+			en
+			let nr = getchar()
+		fina
+			let &t_ve = t_ve
+			let &guicursor = guicursor
+		endt
+		let chr = !type(nr) ? nr2char(nr) : nr
+		if nr >=# 0x20
+			cal s:PrtFocusMap(chr)
+		el
+			let cmd = matchstr(maparg(chr), ':<C-U>\zs.\+\ze<CR>$')
+			try
+				exe ( cmd != '' ? cmd : 'norm '.chr )
+			cat
+			endt
+		en
+	endw
+endf
+" * Toggling {{{1
+fu! s:ToggleFocus()
+	let s:focus = !s:focus
+	cal s:BuildPrompt(0)
+endf
+
+fu! s:ToggleRegex()
+	let s:regexp = !s:regexp
+	cal s:PrtSwitcher()
+endf
+
+fu! s:ToggleByFname()
+	if s:ispath
+		let s:byfname = !s:byfname
+		let s:mfunc = s:mfunc()
+		cal s:PrtSwitcher()
+	en
+endf
+
+fu! s:ToggleType(dir)
+	cal s:async_glob_abort(1)
+	let max = len(g:ctrlp_ext_vars) + len(s:coretypes) - 1
+	let next = s:walker(max, s:itemtype, a:dir)
+	cal ctrlp#setlines(next)
+	cal ctrlp#syntax()
+	cal s:PrtSwitcher()
+endf
+
+fu! s:ToggleKeyLoop()
+	let s:keyloop = !s:keyloop
+	if exists('+imd')
+		let &imd = !s:keyloop
+	en
+	if s:keyloop
+		let [&ut, s:lazy] = [0, 0]
+		cal s:KeyLoop()
+	elsei has_key(s:glbs, 'ut')
+		let [&ut, s:lazy] = [s:glbs['ut'], 1]
+	en
+endf
+
+fu! s:ToggleMRURelative()
+	cal ctrlp#mrufiles#tgrel()
+	cal s:PrtClearCache()
+endf
+
+fu! s:PrtSwitcher()
+	let [s:force, s:matches] = [1, 1]
+	cal s:BuildPrompt(1)
+	unl s:force
+endf
+" - SetWD() {{{1
+fu! s:SetWD(args)
+	if has_key(a:args, 'args') && stridx(a:args['args'], '--dir') >= 0
+		\ && exists('s:dyncwd')
+		cal ctrlp#setdir(s:dyncwd) | retu
+	en
+	if get(a:args, 'dir', '') != ''
+		cal ctrlp#setdir(a:args['dir']) | retu
+	en
+	let pmodes = get(a:args, 'mode', s:pathmode)
+	let [s:crfilerel, s:dyncwd] = [fnamemodify(s:crfile, ':.'), getcwd()]
+	if (!type(pmodes))
+		let pmodes =
+			\ pmodes == 0 ? '' :
+			\ pmodes == 1 ? 'a' :
+			\ pmodes == 2 ? 'r' :
+			\ 'c'
+	en
+	let spath = pmodes =~ 'd' ? s:dyncwd : pmodes =~ 'w' ? s:cwd : s:crfpath
+	for pmode in split(pmodes, '\zs')
+		if ctrlp#setpathmode(pmode, spath) | retu | en
+	endfo
+endf
+" * AcceptSelection() {{{1
+fu! ctrlp#acceptfile(...)
+	let useb = 0
+	if a:0 == 1 && type(a:1) == 4
+		let [md, line] = [a:1['action'], a:1['line']]
+		let atl = get(a:1, 'tail', '')
+	el
+		let [md, line] = [a:1, a:2]
+		let atl = a:0 > 2 ? a:3 : ''
+	en
+	if !type(line)
+		let [filpath, bufnr, useb] = [line, line, 1]
+	el
+		let [bufnr, filpath] = s:bufnrfilpath(line)
+		if bufnr == filpath
+			let useb = 1
+		en
+	en
+	cal s:PrtExit()
+	let tail = s:tail()
+	let j2l = atl != '' ? atl : matchstr(tail, '^ +\zs\d\+$')
+	let openmyself = bufnr == bufnr('%')
+	if bufnr > 0 && ( !empty(s:jmptobuf) && s:jmptobuf =~ md )
+		\ && !( md == 'e' && openmyself )
+		let [jmpb, bufwinnr] = [1, bufwinnr(bufnr)]
+		let buftab = ( s:jmptobuf =~# '[tTVH]' || s:jmptobuf > 1 )
+			\ ? s:buftab(bufnr, md) : [0, 0]
+	en
+	" Switch to existing buffer or open new one
+	if exists('jmpb') && bufwinnr > 0
+		\ && !( md == 't' && ( s:jmptobuf !~# toupper(md) || buftab[0] ) )
+		exe bufwinnr.'winc w'
+		if j2l | cal ctrlp#j2l(j2l) | en
+	elsei exists('jmpb') && buftab[0]
+		\ && !( md =~ '[evh]' && s:jmptobuf !~# toupper(md) )
+		exe 'tabn' buftab[0]
+		exe buftab[1].'winc w'
+		if j2l | cal ctrlp#j2l(j2l) | en
+	el
+		" Determine the command to use
+		let useb = bufnr > 0 && ( buflisted(bufnr) || openmyself ) && ( empty(tail) || useb )
+		let cmd =
+			\ md == 't' || s:splitwin == 1 ? ( useb ? 'tab sb' : 'tabe' ) :
+			\ md == 'h' || s:splitwin == 2 ? ( useb ? 'sb' : 'new' ) :
+			\ md == 'v' || s:splitwin == 3 ? ( useb ? 'vert sb' : 'vne' ) :
+			\ &bt == 'help' && openmyself ? 'b' :
+			\ call('ctrlp#normcmd', useb ? ['b', 'bo vert sb'] : ['e'])
+		" Reset &switchbuf option
+		let [swb, &swb] = [&swb, '']
+		" Open new window/buffer
+		let [fid, tail] = [( useb ? bufnr : filpath ), ( atl != '' ? ' +'.atl : tail )]
+		let args = [cmd, fid, tail, 1, [useb, j2l]]
+		cal call('s:openfile', args)
+		let &swb = swb
+	en
+endf
+
+fu! s:SpecInputs(str)
+	if a:str =~ '\v^(\.\.([\/]\.\.)*[\/]?[.\/]*)$' && s:spi
+		let cwd = s:dyncwd
+		cal ctrlp#setdir(a:str =~ '^\.\.\.*$' ?
+			\ '../'.repeat('../', strlen(a:str) - 2) : a:str)
+		if cwd != s:dyncwd | cal ctrlp#setlines() | en
+		cal s:PrtClear()
+		retu 1
+	elsei a:str == s:lash && s:spi
+		cal s:SetWD({ 'mode': 'rd' })
+		cal ctrlp#setlines()
+		cal s:PrtClear()
+		retu 1
+	elsei a:str =~ '^@.\+' && s:spi
+		retu s:at(a:str)
+	elsei a:str == '?'
+		cal s:PrtExit()
+		let hlpwin = &columns > 159 ? '| vert res 80' : ''
+		sil! exe 'bo vert h ctrlp-mappings' hlpwin '| norm! 0'
+		retu 1
+	en
+	retu 0
+endf
+
+fu! s:AcceptSelection(action)
+	let [md, icr] = [a:action[0], match(a:action, 'r') >= 0]
+	let subm = icr || ( !icr && md == 'e' )
+	if !subm && s:OpenMulti(md) != -1 | retu | en
+	let str = s:getinput()
+	if subm | if s:SpecInputs(str) | retu | en | en
+	" Get the selected line
+	let line = ctrlp#getcline()
+	if !subm && s:curtype() != 'fil' && line == '' && line('.') > s:offset
+		\ && str !~ '\v^(\.\.([\/]\.\.)*[\/]?[.\/]*|/|\\|\?|\@.+)$'
+		cal s:CreateNewFile(md) | retu
+	en
+	if empty(line) | retu | en
+	" Do something with it
+	if s:openfunc != {} && has_key(s:openfunc, s:ctype)
+		let actfunc = s:openfunc[s:ctype]
+		let type = get(s:openfunc, 'arg_type', 'list')
+	el
+		if s:itemtype < len(s:coretypes)
+			let [actfunc, type] = ['ctrlp#acceptfile', 'dict']
+		el
+			let [actfunc, exttype] = [s:getextvar('accept'), s:getextvar('act_farg')]
+			let type = exttype == 'dict' ? exttype : 'list'
+		en
+	en
+	let actargs = type == 'dict' ? [{ 'action': md, 'line': line, 'icr': icr, 'input': str}]
+		\ : [md, line]
+	cal call(actfunc, actargs)
+endf
+" - CreateNewFile() {{{1
+fu! s:CreateNewFile(...)
+	let [md, str] = ['', s:getinput('n')]
+	if empty(str) | retu | en
+	if s:argmap && !a:0
+		" Get the extra argument
+		let md = s:argmaps(md, 1)
+		if md == 'cancel' | retu | en
+	en
+	let str = s:sanstail(str)
+	let [base, fname] = s:headntail(str)
+	if fname =~ '^[\/]$' | retu | en
+	if exists('s:marked') && len(s:marked)
+		" Use the first marked file's path
+		let path = fnamemodify(values(s:marked)[0], ':p:h')
+		let base = path.s:lash(path).base
+		let str = fnamemodify(base.s:lash.fname, ':.')
+	en
+	if base != '' | if isdirectory(ctrlp#utils#mkdir(base))
+		let optyp = str | en | el | let optyp = fname
+	en
+	if !exists('optyp') | retu | en
+	let [filpath, tail] = [fnamemodify(optyp, ':p'), s:tail()]
+	if !stridx(filpath, s:dyncwd) | cal s:insertcache(str) | en
+	cal s:PrtExit()
+	let cmd = md == 'r' ? ctrlp#normcmd('e') :
+		\ s:newfop =~ '1\|t' || ( a:0 && a:1 == 't' ) || md == 't' ? 'tabe' :
+		\ s:newfop =~ '2\|h' || ( a:0 && a:1 == 'h' ) || md == 'h' ? 'new' :
+		\ s:newfop =~ '3\|v' || ( a:0 && a:1 == 'v' ) || md == 'v' ? 'vne' :
+		\ ctrlp#normcmd('e')
+	cal s:openfile(cmd, filpath, tail, 1)
+endf
+" * OpenMulti() {{{1
+fu! s:MarkToOpen()
+	let ct = s:curtype()
+	if s:bufnr <= 0 || s:opmul == '0'
+		\ || ( s:itemtype >= len(s:coretypes) && s:getextvar('opmul') != 1 )
+		retu
+	en
+	let line = ctrlp#getcline()
+
+	" Do not allow to mark modified or current buffer
+	let bufnr = s:bufnrfilpath(line)[0]
+	if (ct == 'buf' && s:delbufcond(bufnr))
+		retu
+	en
+
+	if empty(line) | retu | en
+	let filpath = s:ispath ? fnamemodify(line, ':p') : line
+	if exists('s:marked') && s:dictindex(s:marked, filpath) > 0
+		" Unmark and remove the file from s:marked
+		let key = s:dictindex(s:marked, filpath)
+		cal remove(s:marked, key)
+		if empty(s:marked) | unl s:marked | en
+		if has('signs')
+			exe 'sign unplace' key 'buffer='.s:bufnr
+		en
+	el
+		" Add to s:marked and place a new sign
+		if exists('s:marked')
+			let vac = s:vacantdict(s:marked)
+			let key = empty(vac) ? len(s:marked) + 1 : vac[0]
+			cal extend(s:marked, { key : filpath })
+		el
+			let [key, s:marked] = [1, { 1 : filpath }]
+		en
+		if has('signs')
+			exe 'sign place' key 'line='.line('.').' name=ctrlpmark buffer='.s:bufnr
+		en
+	en
+	sil! cal ctrlp#statusline()
+	redr
+endf
+
+fu! s:OpenMulti(...)
+	let has_marked = exists('s:marked')
+	if ( !has_marked && a:0 ) || s:opmul == '0' || !s:ispath
+		\ || ( s:itemtype >= len(s:coretypes) && s:getextvar('opmul') != 1 )
+		retu -1
+	en
+	" Get the options
+	let [nr, md] = [matchstr(s:opmul, '\d\+'), matchstr(s:opmul, '[thvi]')]
+	let [ur, jf] = [s:opmul =~ 'r', s:opmul =~ 'j']
+	let md = a:0 ? a:1 : ( md == '' ? 'v' : md )
+	let nopt = exists('g:ctrlp_open_multiple_files')
+	if !has_marked
+		let line = ctrlp#getcline()
+		if line == '' | retu | en
+		let marked = { 1 : fnamemodify(line, ':p') }
+		let [nr, ur, jf, nopt] = ['1', 0, 0, 1]
+	en
+	if ( s:argmap || !has_marked ) && !a:0
+		let md = s:argmaps(md, !has_marked ? 2 : 0)
+		if md == 'c'
+			cal s:unmarksigns()
+			unl! s:marked
+			cal s:BuildPrompt(0)
+		elsei !has_marked && md =~ '[axd]'
+			retu s:OpenNoMarks(md, line)
+		en
+		if md =~ '\v^c(ancel)?$' | retu | en
+		let nr = nr == '0' ? ( nopt ? '' : '1' ) : nr
+		let ur = !has_marked && md == 'r' ? 1 : ur
+	en
+	let mkd = values(has_marked ? s:marked : marked)
+	cal s:sanstail(join(s:prompt, ''))
+	cal s:PrtExit()
+	if nr == '0' || md == 'i'
+		retu map(mkd, "s:openfile('bad', v:val, '', 0)")
+	en
+	let tail = s:tail()
+	let [emptytail, bufnr] = [empty(tail), bufnr('^'.mkd[0].'$')]
+	let useb = bufnr > 0 && buflisted(bufnr) && emptytail
+	" Move to a replaceable window
+	let ncmd = ( useb ? ['b', 'bo vert sb'] : ['e', 'bo vne'] )
+		\ + ( ur ? [] : ['ignruw'] )
+	let fst = call('ctrlp#normcmd', ncmd)
+	" Check if the current window has a replaceable buffer
+	let repabl = !( md == 't' && !ur ) && empty(bufname('%')) && empty(&l:ft)
+	" Commands for the rest of the files
+	let [ic, cmds] = [1, { 'v': ['vert sb', 'vne'], 'h': ['sb', 'new'],
+		\ 't': ['tab sb', 'tabe'] }]
+	let [swb, &swb] = [&swb, '']
+	if md == 't' && ctrlp#tabcount() < tabpagenr()
+		let s:tabct = ctrlp#tabcount()
+	en
+	" Open the files
+	for va in mkd
+		let bufnr = bufnr('^'.va.'$')
+		if bufnr < 0 && getftype(va) == '' | con | en
+		let useb = bufnr > 0 && buflisted(bufnr) && emptytail
+		let snd = md != '' && has_key(cmds, md) ?
+			\ ( useb ? cmds[md][0] : cmds[md][1] ) : ( useb ? 'vert sb' : 'vne' )
+		let cmd = ic == 1 && ( !( !ur && fst =~ '^[eb]$' ) || repabl ) ? fst : snd
+		let conds = [( nr != '' && nr > 1 && nr < ic ) || ( nr == '' && ic > 1 ),
+			\ nr != '' && nr < ic]
+		if conds[nopt]
+			if !buflisted(bufnr) | cal s:openfile('bad', va, '', 0) | en
+		el
+			cal s:openfile(cmd, useb ? bufnr : va, tail, ic == 1)
+			if jf | if ic == 1
+				let crpos = [tabpagenr(), winnr()]
+			el
+				let crpos[0] += tabpagenr() <= crpos[0]
+				let crpos[1] += winnr() <= crpos[1]
+			en | en
+			let ic += 1
+		en
+	endfo
+	if jf && exists('crpos') && ic > 2
+		exe ( md == 't' ? 'tabn '.crpos[0] : crpos[1].'winc w' )
+	en
+	let &swb = swb
+	unl! s:tabct
+endf
+
+fu! s:YankLine(...)
+	let @" = s:getinput()
+	let has_marked = exists('s:marked')
+	if !has_marked
+		let line = ctrlp#getcline()
+		if line == '' | retu | en
+		let marked = { 1 : fnamemodify(line, ':p') }
+	en
+	let @" = join(values(has_marked ? s:marked : marked), "\n")
+	cal s:PrtExit()
+endf
+
+fu! s:OpenNoMarks(md, line)
+	if a:md == 'a'
+		let [s:marked, key] = [{}, 1]
+		for line in s:lines
+			cal extend(s:marked, { key : fnamemodify(line, ':p') })
+			let key += 1
+		endfo
+		cal s:remarksigns()
+		cal s:BuildPrompt(0)
+	elsei a:md == 'x'
+		let type = get(s:openfunc, 'arg_type', 'dict')
+		let argms = type == 'dict' ? [{ 'action': a:md, 'line': a:line }]
+			\ : [a:md, a:line]
+		cal call(s:openfunc[s:ctype], argms, s:openfunc)
+	elsei a:md == 'd'
+		let dir = fnamemodify(a:line, ':h')
+		if isdirectory(dir)
+			cal ctrlp#setdir(dir)
+			cal ctrlp#switchtype(0)
+			cal ctrlp#recordhist()
+			cal s:PrtClear()
+		en
+	en
+endf
+" ** Helper functions {{{1
+" Sorting {{{2
+fu! ctrlp#complen(...)
+	" By length
+	let [len1, len2] = [strlen(a:1), strlen(a:2)]
+	retu len1 == len2 ? 0 : len1 > len2 ? 1 : -1
+endf
+
+fu! s:compmatlen(...)
+	" By match length
+	let mln1 = s:shortest(s:matchlens(a:1, s:compat))
+	let mln2 = s:shortest(s:matchlens(a:2, s:compat))
+	retu mln1 == mln2 ? 0 : mln1 > mln2 ? 1 : -1
+endf
+
+fu! s:comptime(...)
+	" By last modified time
+	let [time1, time2] = [getftime(a:1), getftime(a:2)]
+	retu time1 == time2 ? 0 : time1 < time2 ? 1 : -1
+endf
+
+fu! s:compmreb(...)
+	" By last entered time (bufnr)
+	let [id1, id2] = [index(s:mrbs, a:1), index(s:mrbs, a:2)]
+	if id1 == id2
+		retu 0
+	en
+	if id1 < 0
+		retu 1
+	en
+	if id2 < 0
+		retu -1
+	en
+	retu id1 > id2 ? 1 : -1
+endf
+
+fu! s:compmref(...)
+	" By last entered time (MRU)
+	let [id1, id2] = [index(g:ctrlp_lines, a:1), index(g:ctrlp_lines, a:2)]
+	retu id1 == id2 ? 0 : id1 > id2 ? 1 : -1
+endf
+
+fu! s:comparent(...)
+	" By same parent dir
+	if !stridx(s:crfpath, s:dyncwd)
+		let [as1, as2] = [s:dyncwd.s:lash().a:1, s:dyncwd.s:lash().a:2]
+		let [loc1, loc2] = [s:getparent(as1), s:getparent(as2)]
+		if loc1 == s:crfpath && loc2 != s:crfpath | retu -1 | en
+		if loc2 == s:crfpath && loc1 != s:crfpath | retu 1  | en
+		retu 0
+	en
+	retu 0
+endf
+
+fu! s:compfnlen(...)
+	" By filename length
+	let len1 = strlen(split(a:1, s:lash)[-1])
+	let len2 = strlen(split(a:2, s:lash)[-1])
+	retu len1 == len2 ? 0 : len1 > len2 ? 1 : -1
+endf
+
+fu! s:matchlens(str, pat, ...)
+	if empty(a:pat) || index(['^', '$'], a:pat) >= 0 | retu {} | en
+	let st   = a:0 ? a:1 : 0
+	let lens = a:0 >= 2 ? a:2 : {}
+	let nr   = a:0 >= 3 ? a:3 : 0
+	if nr > 20 | retu {} | en
+	if match(a:str, a:pat, st) >= 0
+		let [mst, mnd] = [matchstr(a:str, a:pat, st), matchend(a:str, a:pat, st)]
+		cal extend(lens, { nr : [strlen(mst), mst] })
+		let lens = s:matchlens(a:str, a:pat, mnd, lens, nr + 1)
+	en
+	retu lens
+endf
+
+fu! s:shortest(lens)
+	retu min(map(values(a:lens), 'v:val[0]'))
+endf
+
+fu! s:mixedsort2(ct, ...)
+	if a:ct == 'buf'
+		let pat = '[\/]\?\[\d\+\*No Name\]$'
+		if a:1 =~# pat && a:2 =~# pat | retu 0
+		elsei a:1 =~# pat | retu 1
+		elsei a:2 =~# pat | retu -1 | en
+	en
+	let [cln, cml] = [ctrlp#complen(a:1, a:2), s:compmatlen(a:1, a:2)]
+	if s:ispath
+		let ms = []
+		if s:res_count < 21
+			let ms += [s:compfnlen(a:1, a:2)]
+			if a:ct !~ '^\(buf\|mru\)$' | let ms += [s:comptime(a:1, a:2)] | en
+			if !s:itemtype | let ms += [s:comparent(a:1, a:2)] | en
+		en
+		if a:ct =~ '^\(buf\|mru\)$'
+			let ms += [s:compmref(a:1, a:2)]
+			let cln = cml ? cln : 0
+		en
+		let ms += [cml, 0, 0, 0]
+		let mp = call('s:multipliers', ms[:3])
+		retu cln + ms[0] * mp[0] + ms[1] * mp[1] + ms[2] * mp[2] + ms[3] * mp[3]
+	en
+	retu cln + cml * 2
+endf
+
+fu! s:mixedsort(...)
+	let ct = s:curtype()
+	if ct == 'buf'
+		let pat = '[\/]\?\[\d\+\*No Name\]$'
+		if a:1 =~# pat && a:2 =~# pat | retu 0
+		elsei a:1 =~# pat | retu 1
+		elsei a:2 =~# pat | retu -1 | en
+	en
+	let [cln, cml] = [ctrlp#complen(a:1, a:2), s:compmatlen(a:1, a:2)]
+	if s:ispath
+		let ms = []
+		if s:res_count < 21
+			let ms += [s:compfnlen(a:1, a:2)]
+			if ct !~ '^\(buf\|mru\)$' | let ms += [s:comptime(a:1, a:2)] | en
+			if !s:itemtype | let ms += [s:comparent(a:1, a:2)] | en
+		en
+		if ct =~ '^\(buf\|mru\)$'
+			let ms += [s:compmref(a:1, a:2)]
+			let cln = cml ? cln : 0
+		en
+		let ms += [cml, 0, 0, 0]
+		let mp = call('s:multipliers', ms[:3])
+		retu cln + ms[0] * mp[0] + ms[1] * mp[1] + ms[2] * mp[2] + ms[3] * mp[3]
+	en
+	retu cln + cml * 2
+endf
+
+fu! s:multipliers(...)
+	let mp0 = !a:1 ? 0 : 2
+	let mp1 = !a:2 ? 0 : 1 + ( !mp0 ? 1 : mp0 )
+	let mp2 = !a:3 ? 0 : 1 + ( !( mp0 + mp1 ) ? 1 : ( mp0 + mp1 ) )
+	let mp3 = !a:4 ? 0 : 1 + ( !( mp0 + mp1 + mp2 ) ? 1 : ( mp0 + mp1 + mp2 ) )
+	retu [mp0, mp1, mp2, mp3]
+endf
+
+fu! s:compval(...)
+	retu a:1 - a:2
+endf
+" Statusline {{{2
+fu! ctrlp#statusline()
+	if !exists('s:statypes')
+		let s:statypes = copy(s:coretypes)
+		if !empty(g:ctrlp_ext_vars)
+			cal map(copy(g:ctrlp_ext_vars),
+				\ 'add(s:statypes, [ v:val["lname"], v:val["sname"] ])')
+		en
+	en
+	let tps = s:statypes
+	let max = len(tps) - 1
+	let nxt = tps[s:walker(max, s:itemtype,  1)][1]
+	let prv = tps[s:walker(max, s:itemtype, -1)][1]
+	let s:ctype = tps[s:itemtype][0]
+	let focus   = s:focus ? 'prt'  : 'win'
+	let byfname = s:ispath ? s:byfname ? 'file' : 'path' : 'line'
+	let marked  = s:opmul != '0' ?
+		\ exists('s:marked') ? ' <'.s:dismrk().'>' : ' <->' : ''
+	if s:status != {}
+		let argms =
+			\ get(s:status, 'arg_type', '') == 'dict' ? [{
+			\ 'focus':   focus,
+			\ 'byfname': byfname,
+			\ 'regex':   s:regexp,
+			\ 'prev':    prv,
+			\ 'item':    s:ctype,
+			\ 'next':    nxt,
+			\ 'marked':  marked,
+			\ }] : [focus, byfname, s:regexp, prv, s:ctype, nxt, marked]
+		let &l:stl = call(s:status['main'], argms, s:status)
+	el
+		let item    = '%#CtrlPMode1# '.s:ctype.' %*'
+		let focus   = '%#CtrlPMode2# '.focus.' %*'
+		let byfname = '%#CtrlPMode1# '.byfname.' %*'
+		let regex   = s:regexp  ? '%#CtrlPMode2# regex %*' : ''
+		let slider  = ' <'.prv.'>={'.item.'}=<'.nxt.'>'
+		let dir     = ' %=%<%#CtrlPMode2# %{getcwd()} %*'
+		let &l:stl  = focus.byfname.regex.slider.marked.dir
+		if exists('s:timer')
+			let &l:stl = '%#CtrlPStats# '.len(g:ctrlp_allfiles).' '.&l:stl
+		en
+	en
+endf
+
+fu! s:dismrk()
+	retu has('signs') ? len(s:marked) :
+		\ '%<'.join(values(map(copy(s:marked), 'split(v:val, "[\\/]")[-1]')), ', ')
+endf
+
+fu! ctrlp#progress(enum, ...)
+	if has('macunix') || has('mac') | sl 1m | en
+	let txt = a:0 ? '(press ctrl-c to abort)' : ''
+	if s:status != {}
+		let argms = get(s:status, 'arg_type', '') == 'dict'
+			\ ? [{ 'str': a:enum }] : [a:enum]
+		let &l:stl = call(s:status['prog'], argms, s:status)
+	el
+		let &l:stl = '%#CtrlPStats# '.a:enum.' %* '.txt.'%=%<%#CtrlPMode2# %{getcwd()} %*'
+	en
+	redraws
+endf
+" *** Paths {{{2
+" Line formatting {{{3
+fu! s:formatline(str)
+	let str = a:str
+	let ct = s:curtype()
+	if ct == 'buf'
+		let bufnr = s:bufnrfilpath(str)[0]
+		let parts = s:bufparts(bufnr)
+		let str = printf('%'.s:bufnr_width.'s', bufnr)
+		if s:has_conceal && has('syntax_items')
+			let str .= printf(' %-13s %s%-36s',
+				\ '<bi>'.parts[0].'</bi>',
+				\ '<bn>'.parts[1], '{'.parts[2].'}</bn>')
+			if (!empty(s:bufpath_mod))
+				let str .= printf('  %s', '<bp>'.parts[3].'</bp>')
+			en
+		el
+			let str .= printf(' %-5s %-30s',
+				\ parts[0],
+				\ parts[2])
+			if (!empty(s:bufpath_mod))
+				let str .= printf('  %s', parts[3])
+			en
+		en
+	en
+	let cond = ct != 'buf' &&s:ispath && ( s:winw - 4 ) < s:strwidth(str)
+	retu s:lineprefix.( cond ? s:pathshorten(str) : str )
+endf
+
+fu! s:formatline2(ct, key, str)
+	let str = a:str
+	if a:ct == 'buf'
+		let bufnr = s:bufnrfilpath(str)[0]
+		let parts = s:bufparts(bufnr)
+		let str = printf('%'.s:bufnr_width.'s', bufnr)
+		if s:has_conceal && has('syntax_items')
+			let str .= printf(' %-13s %s%-36s',
+				\ '<bi>'.parts[0].'</bi>',
+				\ '<bn>'.parts[1], '{'.parts[2].'}</bn>')
+			if (!empty(s:bufpath_mod))
+				let str .= printf('  %s', '<bp>'.parts[3].'</bp>')
+			en
+		el
+			let str .= printf(' %-5s %-30s',
+				\ parts[0],
+				\ parts[2])
+			if (!empty(s:bufpath_mod))
+				let str .= printf('  %s', parts[3])
+			en
+		en
+		retu s:lineprefix.str
+	en
+	let cond = s:ispath && ( s:winw - 4 ) < strchars(str)
+	retu s:lineprefix.( cond ? s:pathshorten(str) : str )
+endf
+
+if exists('*strchars') && exists('*strcharpart')
+	fu! s:pathshorten(str)
+		retu strcharpart(a:str, 0, 9).'...'.strcharpart(a:str, strchars(a:str) - s:winw + 16)
+	endf
+el
+	fu! s:pathshorten(str)
+		retu matchstr(a:str, '^.\{9}').'...'
+			\ .matchstr(a:str, '.\{'.( s:winw - 16 ).'}$')
+	endf
+en
+
+fu! s:offset(lines, height)
+	let s:offset = s:mw_order == 'btt' ? ( a:height - s:res_count ) : 0
+	retu s:offset > 0 ? ( repeat([''], s:offset) + a:lines ) : a:lines
+endf
+" Directory completion {{{3
+fu! s:dircompl(be, sd)
+	if a:sd == '' | retu [] | en
+	if a:be == ''
+		let [be, sd] = [s:dyncwd, a:sd]
+	el
+		let be = a:be.s:lash(a:be)
+		let sd = be.a:sd
+	en
+	let dirs = split(globpath(s:fnesc(be, 'g', ','), a:sd.'*/'), "\n")
+	if a:be == ''
+		let dirs = ctrlp#rmbasedir(dirs)
+	en
+	cal filter(dirs, '!match(v:val, escape(sd, ''~$.\''))'
+		\ . ' && v:val !~ ''\v(^|[\/])\.{1,2}[\/]$''')
+	retu dirs
+endf
+
+fu! s:findcommon(items, seed)
+	let [items, id, cmn, ic] = [copy(a:items), strlen(a:seed), '', 0]
+	cal map(items, 'strpart(v:val, id)')
+	for char in split(items[0], '\zs')
+		for item in items[1:]
+			if item[ic] != char | let brk = 1 | brea | en
+		endfo
+		if exists('brk') | brea | en
+		let cmn .= char
+		let ic += 1
+	endfo
+	retu cmn
+endf
+" Misc {{{3
+fu! s:headntail(str)
+	let parts = split(a:str, '[\/]\ze[^\/]\+[\/:]\?$')
+	retu len(parts) == 1 ? ['', parts[0]] : len(parts) == 2 ? parts : []
+endf
+
+fu! s:lash(...)
+	retu ( a:0 ? a:1 : s:dyncwd ) !~ '[\/]$' ? s:lash : ''
+endf
+
+fu! s:ispathitem()
+	retu s:itemtype < len(s:coretypes) || s:getextvar('type') == 'path'
+endf
+
+fu! ctrlp#igncwd(cwd)
+	retu ctrlp#utils#glob(a:cwd, 0) == '' ||
+		\ ( s:igntype >= 0 && s:usrign(a:cwd, getftype(a:cwd)) )
+endf
+
+fu! ctrlp#dirnfile(entries)
+	let [items, cwd] = [[[], []], s:dyncwd.s:lash()]
+	for each in a:entries
+		let etype = getftype(each)
+		if s:igntype >= 0 && s:usrign(each, etype) | con | en
+		if etype == 'dir'
+			if s:showhidden | if each !~ '[\/]\.\{1,2}$'
+				let items[0] += [each]
+			en | el
+				let items[0] += [each]
+			en
+		elsei etype == 'link'
+			if s:folsym
+				let isfile = !isdirectory(each)
+				if s:folsym == 2 || !s:samerootsyml(each, isfile, cwd)
+					let items[isfile] += [each]
+				en
+			en
+		elsei etype == 'file'
+			let items[1] += [each]
+		en
+	endfo
+	retu items
+endf
+
+fu! s:usrign(item, type)
+	if s:igntype == 1 | retu a:item =~ s:usrign | en
+	if s:igntype == 2 | retu call(s:usrign, [a:item, a:type]) | en
+	if s:igntype == 4
+		if get(s:usrign, a:type, '') != ''
+			retu a:item =~ s:usrign[a:type]
+		elsei get(s:usrign, 'func', '') != ''
+			retu call(s:usrign['func'], [a:item, a:type])
+		en
+	en
+	retu 0
+endf
+
+fu! s:samerootsyml(each, isfile, cwd)
+	let resolve = fnamemodify(resolve(a:each), ':p:h')
+	let resolve .= s:lash(resolve)
+	retu !( stridx(resolve, a:cwd) && ( stridx(a:cwd, resolve) || a:isfile ) )
+endf
+
+fu! ctrlp#rmbasedir(items)
+	if a:items == []
+		retu a:items
+	en
+	let cwd = s:dyncwd.s:lash()
+	let first = a:items[0]
+	if has('win32') || has('win64')
+		let cwd = tr(cwd, '\', '/')
+		let first = tr(first, '\', '/')
+	en
+	if !stridx(first, cwd)
+		let idx = strlen(cwd)
+		retu map(a:items, 'strpart(v:val, idx)')
+	en
+	retu a:items
+endf
+" Working directory {{{3
+fu! s:getparent(item)
+	let parent = substitute(a:item, '[\/][^\/]\+[\/:]\?$', '', '')
+	if parent == '' || parent !~ '[\/]'
+		let parent .= s:lash
+	en
+	retu parent
+endf
+
+fu! s:findroot(curr, mark, depth, type)
+	let [depth, fnd] = [a:depth + 1, 0]
+	if type(a:mark) == 1
+		let fnd = s:glbpath(s:fnesc(a:curr, 'g', ','), a:mark, 1) != ''
+	elsei type(a:mark) == 3
+		for markr in a:mark
+			if s:glbpath(s:fnesc(a:curr, 'g', ','), markr, 1) != ''
+				let fnd = 1
+				brea
+			en
+		endfo
+	en
+	if fnd
+		if !a:type | cal ctrlp#setdir(a:curr) | en
+		retu [exists('markr') ? markr : a:mark, a:curr]
+	elsei depth > s:maxdepth
+		cal ctrlp#setdir(s:cwd)
+	el
+		let parent = s:getparent(a:curr)
+		if parent != a:curr
+			retu s:findroot(parent, a:mark, depth, a:type)
+		en
+	en
+	retu []
+endf
+
+fu! ctrlp#setpathmode(pmode, ...)
+	if a:pmode == 'c' || ( a:pmode == 'a' && stridx(s:crfpath, s:cwd) < 0 )
+		if exists('+acd') | let [s:glb_acd, &acd] = [&acd, 0] | en
+		cal ctrlp#setdir(s:crfpath)
+		retu 1
+	elsei a:pmode == 'r'
+		let spath = a:0 ? a:1 : s:crfpath
+		let markers = ['.git', '.hg', '.svn', '.bzr', '_darcs']
+		if type(s:rmarkers) == 3 && !empty(s:rmarkers)
+			if s:findroot(spath, s:rmarkers, 0, 0) != [] | retu 1 | en
+			cal filter(markers, 'index(s:rmarkers, v:val) < 0')
+			let markers = s:rmarkers + markers
+		en
+		if s:findroot(spath, markers, 0, 0) != [] | retu 1 | en
+	en
+	retu 0
+endf
+
+fu! ctrlp#setdir(path, ...)
+	let cmd = a:0 ? a:1 : 'lc!'
+	sil! exe cmd s:fnesc(a:path, 'c')
+	let [s:crfilerel, s:dyncwd] = [fnamemodify(s:crfile, ':.'), getcwd()]
+endf
+" Fallbacks {{{3
+fu! s:glbpath(...)
+	retu call('ctrlp#utils#globpath', a:000)
+endf
+
+fu! s:fnesc(...)
+	retu call('ctrlp#utils#fnesc', a:000)
+endf
+
+fu! ctrlp#setlcdir()
+	if exists('*haslocaldir')
+		cal ctrlp#setdir(getcwd(), haslocaldir() ? 'lc!' : 'cd!')
+	en
+endf
+" Highlighting {{{2
+fu! ctrlp#syntax()
+	if ctrlp#nosy() | retu | en
+	for [ke, va] in items(s:hlgrps) | cal ctrlp#hicheck('CtrlP'.ke, va) | endfo
+	let bgColor=synIDattr(synIDtrans(hlID('Normal')), 'bg')
+	if bgColor !~ '^-1$\|^$'
+		sil! exe 'hi CtrlPLinePre guifg='.bgColor.' ctermfg='.bgColor
+	en
+	sy match CtrlPNoEntries '^ == NO ENTRIES ==$'
+	if hlexists('CtrlPLinePre')
+		exe "sy match CtrlPLinePre '^".escape(get(g:, 'ctrlp_line_prefix', '>'),'^$.*~\')."'"
+	en
+
+	if s:curtype() == 'buf' && s:has_conceal
+		sy region CtrlPBufferNr     matchgroup=CtrlPLinePre start='^>\s\+' end='\s'
+		sy region CtrlPBufferInd    concealends matchgroup=Ignore start='<bi>' end='</bi>'
+		sy region CtrlPBufferRegion concealends matchgroup=Ignore start='<bn>' end='</bn>'
+			\ contains=CtrlPBufferHid,CtrlPBufferHidMod,CtrlPBufferVis,CtrlPBufferVisMod,CtrlPBufferCur,CtrlPBufferCurMod
+		sy region CtrlPBufferHid    concealends matchgroup=Ignore     start='\s*{' end='}' contained
+		sy region CtrlPBufferHidMod concealends matchgroup=Ignore    start='+\s*{' end='}' contained
+		sy region CtrlPBufferVis    concealends matchgroup=Ignore   start='\*\s*{' end='}' contained
+		sy region CtrlPBufferVisMod concealends matchgroup=Ignore  start='\*+\s*{' end='}' contained
+		sy region CtrlPBufferCur    concealends matchgroup=Ignore  start='\*!\s*{' end='}' contained
+		sy region CtrlPBufferCurMod concealends matchgroup=Ignore start='\*+!\s*{' end='}' contained
+		sy region CtrlPBufferPath   concealends matchgroup=Ignore start='<bp>' end='</bp>'
+	en
+endf
+
+fu! s:highlight(pat, grp)
+	if s:matcher != {} | retu | en
+	cal clearmatches()
+	if !empty(a:pat) && s:ispath
+		if s:regexp
+			let pat = substitute(a:pat, '\\\@<!\^', '^> \\zs', 'g')
+			cal matchadd(a:grp, ( s:martcs == '' ? '\c' : '\C' ).pat)
+		el
+			let pat = a:pat
+
+			" get original characters so we can rebuild pat
+			let chars = split(pat, '\[\^\\\?.\]\\{-}')
+
+			" Build a pattern like /a.*b.*c/ from abc (but with .\{-} non-greedy
+			" matchers instead)
+			let pat = join(chars, '.\{-}')
+			" Ensure we match the last version of our pattern
+			let ending = '\(.*'.pat.'\)\@!'
+			" Case sensitive?
+			let beginning = ( s:martcs == '' ? '\c' : '\C' ).'^.*'
+			if s:byfname()
+				" Make sure there are no slashes in our match
+				let beginning = beginning.'\([^\/]*$\)\@='
+			en
+
+			for i in range(len(chars))
+				" Surround our current target letter with \zs and \ze so it only
+				" actually matches that one letter, but has all preceding and trailing
+				" letters as well.
+				" \zsa.*b.*c
+				" a\(\zsb\|.*\zsb)\ze.*c
+				let charcopy = copy(chars)
+				if i == 0
+					let charcopy[i] = '\zs'.charcopy[i].'\ze'
+					let middle = join(charcopy, '.\{-}')
+				el
+					let before = join(charcopy[0:i-1], '.\{-}')
+					let after = join(charcopy[i+1:-1], '.\{-}')
+					let c = charcopy[i]
+					" for abc, match either ab.\{-}c or a.*b.\{-}c in that order
+					let cpat = '\(\zs'.c.'\|'.'.*\zs'.c.'\)\ze.*'
+					let middle = before.cpat.after
+				en
+
+				" Now we matchadd for each letter, the basic form being:
+				" ^.*\zsx\ze.*$, but with our pattern we built above for the letter,
+				" and a negative lookahead ensuring that we only highlight the last
+				" occurrence of our letters. We also ensure that our matcher is case
+				" insensitive or sensitive depending.
+				cal matchadd(a:grp, beginning.middle.ending)
+			endfo
+		en
+
+		cal matchadd('CtrlPLinePre', '^>')
+	elseif !empty(a:pat) && s:regexp &&
+				\ exists('g:ctrlp_regex_always_higlight') &&
+				\ g:ctrlp_regex_always_higlight
+		let pat = substitute(a:pat, '\\\@<!\^', '^> \\zs', 'g')
+		cal matchadd(a:grp, ( s:martcs == '' ? '\c' : '\C').pat)
+	en
+endf
+
+fu! s:dohighlight()
+	retu s:mathi[0] && exists('*clearmatches') && !ctrlp#nosy()
+endf
+" Prompt history {{{2
+fu! s:gethistloc()
+	let utilcadir = ctrlp#utils#cachedir()
+	let cache_dir = utilcadir.s:lash(utilcadir).'hist'
+	retu [cache_dir, cache_dir.s:lash(cache_dir).'cache.txt']
+endf
+
+fu! s:gethistdata()
+	retu ctrlp#utils#readfile(s:gethistloc()[1])
+endf
+
+fu! ctrlp#recordhist()
+	let str = join(s:prompt, '')
+	if empty(str) || !s:maxhst | retu | en
+	let hst = s:hstry
+	if len(hst) > 1 && hst[1] == str | retu | en
+	cal extend(hst, [str], 1)
+	if len(hst) > s:maxhst | cal remove(hst, s:maxhst, -1) | en
+	cal ctrlp#utils#writecache(hst, s:gethistloc()[0], s:gethistloc()[1])
+endf
+" Signs {{{2
+fu! s:unmarksigns()
+	if !s:dosigns() | retu | en
+	for key in keys(s:marked)
+		exe 'sign unplace' key 'buffer='.s:bufnr
+	endfo
+endf
+
+fu! s:remarksigns()
+	if !s:dosigns() | retu | en
+	for ic in range(1, len(s:lines))
+		let line = s:ispath ? fnamemodify(s:lines[ic - 1], ':p') : s:lines[ic - 1]
+		let key = s:dictindex(s:marked, line)
+		if key > 0
+			exe 'sign place' key 'line='.ic.' name=ctrlpmark buffer='.s:bufnr
+		en
+	endfo
+endf
+
+fu! s:dosigns()
+	retu exists('s:marked') && s:bufnr > 0 && s:opmul != '0' && has('signs')
+endf
+" Lists & Dictionaries {{{2
+fu! s:ifilter(list, str)
+	let [rlist, estr] = [[], substitute(a:str, 'v:val', 'each', 'g')]
+	for each in a:list
+		try
+			if eval(estr)
+				let rlist += [each]
+			en
+		cat | con | endt
+	endfo
+	retu rlist
+endf
+
+fu! s:dictindex(dict, expr)
+	for key in keys(a:dict)
+		if a:dict[key] ==# a:expr | retu key | en
+	endfo
+	retu -1
+endf
+
+fu! s:vacantdict(dict)
+	retu filter(range(1, max(keys(a:dict))), '!has_key(a:dict, v:val)')
+endf
+
+fu! s:sublist(l, s, e)
+	retu v:version > 701 ? a:l[(a:s):(a:e)] : s:sublist7071(a:l, a:s, a:e)
+endf
+
+fu! s:sublist7071(l, s, e)
+	let [newlist, id, ae] = [[], a:s, a:e == -1 ? len(a:l) - 1 : a:e]
+	wh id <= ae
+		let newlist += [get(a:l, id)]
+		let id += 1
+	endw
+	retu newlist
+endf
+" Buffers {{{2
+fu! s:buftab(bufnr, md)
+	for tabnr in range(1, tabpagenr('$'))
+		if tabpagenr() == tabnr && a:md == 't' | con | en
+		let buflist = tabpagebuflist(tabnr)
+		if index(buflist, a:bufnr) >= 0
+			for winnr in range(1, tabpagewinnr(tabnr, '$'))
+				if buflist[winnr - 1] == a:bufnr | retu [tabnr, winnr] | en
+			endfo
+		en
+	endfo
+	retu [0, 0]
+endf
+
+fu! s:bufwins(bufnr)
+	let winns = 0
+	for tabnr in range(1, tabpagenr('$'))
+		let winns += count(tabpagebuflist(tabnr), a:bufnr)
+	endfo
+	retu winns
+endf
+
+fu! s:isabs(path)
+	if (has('win32') || has('win64'))
+		retu a:path =~ '^\([a-zA-Z]:\)\{-}[/\\]'
+	el
+		retu a:path =~ '^[/\\]'
+	en
+endf
+
+fu! s:bufnrfilpath(line)
+	if s:isabs(a:line) || a:line =~ '^\~[/\\]' || a:line =~ '^\w\+:\/\/'
+		let filpath = a:line
+	el
+		let filpath = s:dyncwd.s:lash().a:line
+	en
+	let filpath = fnamemodify(filpath, ':p')
+	let bufnr = bufnr('^'.fnameescape(filpath).'$')
+	if (!filereadable(filpath) && bufnr < 1)
+		if (a:line =~ '[\/]\?\[\d\+\*No Name\]$')
+			let bufnr = str2nr(matchstr(a:line, '[\/]\?\[\zs\d\+\ze\*No Name\]$'))
+			let filpath = bufnr
+		els
+			let bufnr = bufnr(a:line)
+			retu [bufnr, a:line]
+		en
+	en
+	retu [bufnr, filpath]
+endf
+
+fu! ctrlp#normcmd(cmd, ...)
+	let buftypes = [ 'quickfix', 'help', 'nofile' ]
+	if a:0 < 2 && s:nosplit() | retu a:cmd | en
+	let norwins = filter(range(1, winnr('$')),
+		\ 'index(buftypes, getbufvar(winbufnr(v:val), "&bt")) == -1 || s:isterminal(winbufnr(v:val))')
+	for each in norwins
+		let bufnr = winbufnr(each)
+		if empty(bufname(bufnr)) && empty(getbufvar(bufnr, '&ft'))
+			let fstemp = each | brea
+		en
+	endfo
+	let norwin = empty(norwins) ? 0 : norwins[0]
+	if norwin
+		if index(norwins, winnr()) < 0
+			exe ( exists('fstemp') ? fstemp : norwin ).'winc w'
+		en
+		retu a:cmd
+	en
+	retu a:0 ? a:1 : 'bo vne'
+endf
+
+fu! ctrlp#modfilecond(w)
+	retu &mod && !&hid && &bh != 'hide' && s:bufwins(bufnr('%')) == 1 && !&cf &&
+		\ ( ( !&awa && a:w ) || filewritable(fnamemodify(bufname('%'), ':p')) != 1 )
+endf
+
+fu! s:nosplit()
+	retu !empty(s:nosplit) && match([bufname('%'), &l:ft, &l:bt], s:nosplit) >= 0
+endf
+
+fu! s:setupblank()
+	setl noswf nonu nobl nowrap nolist nospell nocuc wfh
+	setl fdc=0 fdl=99 tw=0 bt=nofile bh=unload
+	if v:version > 702
+		setl nornu noudf cc=0
+	en
+	if s:has_conceal
+		setl cole=2 cocu=nc
+	en
+endf
+
+fu! s:leavepre()
+	if exists('s:bufnr') && s:bufnr == bufnr('%') | bw! | en
+	if !( exists(s:ccex) && !{s:ccex} )
+		\ && !( has('clientserver') && len(split(serverlist(), "\n")) > 1 )
+		cal ctrlp#clra()
+	en
+endf
+
+fu! s:checkbuf()
+	if !exists('s:init') && exists('s:bufnr') && s:bufnr > 0
+		exe s:bufnr.'bw!'
+	en
+endf
+
+fu! s:iscmdwin()
+	let [ermsg, v:errmsg] = [v:errmsg, '']
+	sil! noa winc p
+	sil! noa winc p
+	let [v:errmsg, ermsg] = [ermsg, v:errmsg]
+	retu ermsg =~ '^E11:'
+endf
+" Arguments {{{2
+fu! s:at(str)
+	if a:str =~ '\v^\@(cd|lc[hd]?|chd).*'
+		let str = substitute(a:str, '\v^\@(cd|lc[hd]?|chd)\s*', '', '')
+		if str == '' | retu 1 | en
+		let str = str =~ '^%:.\+' ? fnamemodify(s:crfile, str[1:]) : str
+		let path = fnamemodify(expand(str, 1), ':p')
+		if isdirectory(path)
+			if path != s:dyncwd
+				cal ctrlp#setdir(path)
+				cal ctrlp#setlines()
+			en
+			cal ctrlp#recordhist()
+			cal s:PrtClear()
+		en
+		retu 1
+	en
+	retu 0
+endf
+
+fu! s:tail()
+	if exists('s:optail') && !empty('s:optail')
+		let tailpref = s:optail !~ '^\s*+' ? ' +' : ' '
+		retu tailpref.s:optail
+	en
+	retu ''
+endf
+
+fu! s:sanstail(str)
+	let str = s:spi ?
+		\ substitute(a:str, '^\(@.*$\|\\\\\ze@\|\.\.\zs[.\/]\+$\)', '', 'g') : a:str
+	let [str, pat] = [substitute(str, '\\\\', '\', 'g'), '\([^:]\|\\:\)*$']
+	unl! s:optail
+	if str =~ '\\\@<!:'.pat
+		let s:optail = matchstr(str, '\\\@<!:\zs'.pat)
+		let str = substitute(str, '\\\@<!:'.pat, '', '')
+	en
+	retu substitute(str, '\\\ze:', '', 'g')
+endf
+
+fu! s:argmaps(md, i)
+	let roh = [
+		\ ['Open Multiple Files', '/h[i]dden/[c]lear', ['i', 'c']],
+		\ ['Create a New File', '/[r]eplace', ['r']],
+		\ ['Open Selected', '/[r]eplace', ['r', 'd', 'a']],
+		\ ]
+	if a:i == 2
+		if !buflisted(bufnr('^'.fnamemodify(ctrlp#getcline(), ':p').'$'))
+			let roh[2][1] .= '/h[i]dden'
+			let roh[2][2] += ['i']
+		en
+		if s:openfunc != {} && has_key(s:openfunc, s:ctype)
+			let roh[2][1] .= '/e[x]ternal'
+			let roh[2][2] += ['x']
+		en
+	en
+	let str = roh[a:i][0].': [t]ab/[v]ertical/[h]orizontal'.roh[a:i][1].'? '
+	retu s:choices(str, ['t', 'v', 'h'] + roh[a:i][2], 's:argmaps', [a:md, a:i])
+endf
+
+fu! s:insertstr()
+	let str = 'Insert: c[w]ord/c[f]ile/[s]earch/[v]isual/[c]lipboard/[r]egister? '
+	retu s:choices(str, ['w', 'f', 's', 'v', 'c', 'r'], 's:insertstr', [])
+endf
+
+fu! s:textdialog(str)
+	redr | echoh MoreMsg | echon a:str | echoh None
+	retu nr2char(getchar())
+endf
+
+fu! s:choices(str, choices, func, args)
+	let char = s:textdialog(a:str)
+	if index(a:choices, char) >= 0
+		retu char
+	elsei char =~# "\\v\<Esc>|\<C-c>|\<C-g>|\<C-u>|\<C-w>|\<C-[>"
+		cal s:BuildPrompt(0)
+		retu 'cancel'
+	elsei char =~# "\<CR>" && a:args != []
+		retu a:args[0]
+	en
+	retu call(a:func, a:args)
+endf
+
+fu! s:getregs()
+	let char = s:textdialog('Insert from register: ')
+	if char =~# "\\v\<Esc>|\<C-c>|\<C-g>|\<C-u>|\<C-w>|\<C-[>"
+		cal s:BuildPrompt(0)
+		retu -1
+	elsei char =~# "\<CR>"
+		retu s:getregs()
+	en
+	retu s:regisfilter(char)
+endf
+
+fu! s:regisfilter(reg)
+	retu substitute(getreg(a:reg), "[\t\n]", ' ', 'g')
+endf
+" Misc {{{2
+fu! s:modevar()
+	let s:matchtype = s:mtype()
+	let s:ispath = s:ispathitem()
+	let s:mfunc = s:mfunc()
+	let s:nolim = s:getextvar('nolim')
+	let s:dosort = s:getextvar('sort')
+	let s:spi = !s:itemtype || s:getextvar('specinput') > 0
+endf
+
+fu! s:nosort()
+	let ct = s:curtype()
+	retu s:matcher != {} || s:nolim == 1 || ( ct == 'mru' && s:mrudef )
+		\ || ( ct =~ '^\(buf\|mru\)$' && s:prompt == ['', '', ''] ) || !s:dosort
+endf
+
+fu! s:byfname()
+	retu s:curtype() != 'buf' && s:ispath && s:byfname
+endf
+
+fu! s:narrowable()
+	retu exists('s:act_add') && exists('s:matched') && s:matched != []
+		\ && exists('s:mdata') && s:mdata[:2] == [s:dyncwd, s:itemtype, s:regexp]
+		\ && s:matcher == {} && !exists('s:did_exp')
+endf
+
+fu! s:getinput(...)
+	let [prt, spi] = [s:prompt, ( a:0 ? a:1 : '' )]
+	if s:abbrev != {}
+		let gmd = get(s:abbrev, 'gmode', '')
+		let str = ( gmd =~ 't' && !a:0 ) || spi == 'c' ? prt[0] : join(prt, '')
+		if gmd =~ 't' && gmd =~ 'k' && !a:0 && matchstr(str, '.$') =~ '\k'
+			retu join(prt, '')
+		en
+		let [pf, rz] = [( s:byfname() ? 'f' : 'p' ), ( s:regexp ? 'r' : 'z' )]
+		for dict in s:abbrev['abbrevs']
+			let dmd = get(dict, 'mode', '')
+			let pat = escape(dict['pattern'], '~')
+			if ( dmd == '' || ( dmd =~ pf && dmd =~ rz && !a:0 )
+				\ || dmd =~ '['.spi.']' ) && str =~ pat
+				let [str, s:did_exp] = [join(split(str, pat, 1), dict['expanded']), 1]
+			en
+		endfo
+		if gmd =~ 't' && !a:0
+			let prt[0] = str
+		el
+			retu str
+		en
+	en
+	retu spi == 'c' ? prt[0] : join(prt, '')
+endf
+
+if exists('*strdisplaywidth')
+	fu! s:strwidth(str)
+		retu strdisplaywidth(a:str)
+	endf
+el
+	fu! s:strwidth(str)
+		retu strlen(a:str)
+	endf
+en
+
+fu! ctrlp#j2l(nr)
+	exe 'norm!' a:nr.'G'
+	sil! norm! zvzz
+endf
+
+fu! s:maxf(len)
+	retu s:maxfiles && a:len > s:maxfiles
+endf
+
+fu! s:regexfilter(str)
+	let str = a:str
+	for key in keys(s:fpats) | if str =~ key
+		let str = substitute(str, s:fpats[key], '', 'g')
+	en | endfo
+	retu str
+endf
+
+fu! s:walker(m, p, d)
+	retu a:d >= 0 ? a:p < a:m ? a:p + a:d : 0 : a:p > 0 ? a:p + a:d : a:m
+endf
+
+fu! s:delent(rfunc)
+	if a:rfunc == '' | retu | en
+	let [s:force, tbrem] = [1, []]
+	if exists('s:marked')
+		let tbrem = values(s:marked)
+		cal s:unmarksigns()
+		unl s:marked
+	en
+	if tbrem == [] && ( has('dialog_gui') || has('dialog_con') ) &&
+		\ confirm("Wipe all entries?", "&OK\n&Cancel") != 1
+		unl s:force
+		cal s:BuildPrompt(0)
+		retu
+	en
+	let g:ctrlp_lines = call(a:rfunc, [tbrem])
+	cal s:BuildPrompt(1)
+	unl s:force
+endf
+
+fu! s:delbufcond(bufnr)
+	retu getbufvar(a:bufnr, "&mod") || a:bufnr == s:crbufnr
+endf
+
+fu! s:delbuf()
+	let lines = []
+	if exists('s:marked')
+		let lines = values(s:marked)
+		cal s:unmarksigns()
+		unl s:marked
+	el
+		let lines += [ctrlp#getcline()]
+	en
+	for line in lines
+		let bufnr = s:bufnrfilpath(line)[0]
+		if (s:delbufcond(bufnr))
+			con
+		en
+		exe 'bd '. bufnr
+	endfo
+	cal s:PrtClearCache()
+endf
+
+fu! s:isterminal(buf)
+	retu getbufvar(a:buf, "&bt") == "terminal"
+endf
+" Entering & Exiting {{{2
+fu! s:getenv()
+	let [s:cwd, s:winres] = [getcwd(), [winrestcmd(), &lines, winnr('$')]]
+	let [s:crword, s:crnbword] = [expand('<cword>', 1), expand('<cWORD>', 1)]
+	let [s:crgfile, s:crline] = [expand('<cfile>', 1), getline('.')]
+	let [s:winmaxh, s:crcursor] = [min([s:mw_max, &lines]), getpos('.')]
+	let [s:crbufnr, s:crvisual] = [bufnr('%'), s:lastvisual()]
+	let s:crfile = bufname('%') == ''
+		\ ? '['.s:crbufnr.'*No Name]' : expand('%:p', 1)
+	let s:crfpath = expand('%:p:h', 1)
+	let s:mrbs = ctrlp#mrufiles#bufs()
+endf
+
+fu! s:lastvisual()
+	let cview = winsaveview()
+	let [ovreg, ovtype] = [getreg('v'), getregtype('v')]
+	let [oureg, outype] = [getreg('"'), getregtype('"')]
+	sil! norm! gV"vy
+	let selected = s:regisfilter('v')
+	cal setreg('v', ovreg, ovtype)
+	cal setreg('"', oureg, outype)
+	cal winrestview(cview)
+	retu selected
+endf
+
+fu! s:log(m)
+	if exists('g:ctrlp_log') && g:ctrlp_log | if a:m
+		let cadir = ctrlp#utils#cachedir()
+		let apd = g:ctrlp_log > 1 ? '>' : ''
+		sil! exe 'redi! >'.apd cadir.s:lash(cadir).'ctrlp.log'
+	el
+		sil! redi END
+	en | en
+endf
+
+fu! s:buffunc(e)
+	if a:e && has_key(s:buffunc, 'enter')
+		cal call(s:buffunc['enter'], [], s:buffunc)
+	elsei !a:e && has_key(s:buffunc, 'exit')
+		cal call(s:buffunc['exit'], [], s:buffunc)
+	en
+endf
+
+fu! s:openfile(cmd, fid, tail, chkmod, ...)
+	let cmd = a:cmd
+	if a:chkmod && cmd =~ '^[eb]$' && ctrlp#modfilecond(!( cmd == 'b' && &aw ))
+		let cmd = cmd == 'b' ? 'sb' : 'sp'
+	en
+	let cmd = cmd =~ '^tab' ? ctrlp#tabcount().cmd : cmd
+	let j2l = a:0 && a:1[0] ? a:1[1] : 0
+	exe cmd.( a:0 && a:1[0] ? '' : a:tail ) s:fnesc(a:fid, 'f')
+	if j2l
+		cal ctrlp#j2l(j2l)
+	en
+	if !empty(a:tail)
+		sil! norm! zvzz
+	en
+	if cmd != 'bad'
+		cal ctrlp#setlcdir()
+	en
+endf
+
+fu! ctrlp#tabcount()
+	if exists('s:tabct')
+		let tabct = s:tabct
+		let s:tabct += 1
+	elsei !type(s:tabpage)
+		let tabct = s:tabpage
+	elsei type(s:tabpage) == 1
+		let tabpos =
+			\ s:tabpage =~ 'c' ? tabpagenr() :
+			\ s:tabpage =~ 'f' ? 1 :
+			\ s:tabpage =~ 'l' ? tabpagenr('$') :
+			\ tabpagenr()
+		let tabct =
+			\ s:tabpage =~ 'a' ? tabpos :
+			\ s:tabpage =~ 'b' ? tabpos - 1 :
+			\ tabpos
+	en
+	retu tabct < 0 ? 0 : tabct
+endf
+
+fu! s:settype(type)
+	retu a:type < 0 ? exists('s:itemtype') ? s:itemtype : 0 : a:type
+endf
+" Matching {{{2
+fu! s:matchfname(item, pat)
+	let parts = split(a:item, '[\/]\ze[^\/]\+$')
+	let mfn = match(parts[-1], a:pat[0])
+	retu len(a:pat) == 1 ? mfn : len(a:pat) == 2 ?
+		\ ( mfn >= 0 && ( len(parts) == 2 ? match(parts[0], a:pat[1]) : -1 ) >= 0
+		\ ? 0 : -1 ) : -1
+endf
+
+fu! s:matchbuf(item, pat)
+	let bufnr = s:bufnrfilpath(a:item)[0]
+	let parts = s:bufparts(bufnr)
+	let item = s:byfname ? parts[2] : bufnr.parts[0].parts[2].s:lash().parts[3]
+	retu match(item, a:pat)
+endf
+
+fu! s:matchtabs(item, pat)
+	retu match(split(a:item, '\t\+')[0], a:pat)
+endf
+
+fu! s:matchtabe(item, pat)
+	retu match(split(a:item, '\t\+[^\t]\+$')[0], a:pat)
+endf
+
+fu! s:buildpat(lst)
+	let pat = a:lst[0]
+	if s:matchnatural == 1
+		for item in range(1, len(a:lst) - 1)
+			let c = a:lst[item - 1]
+			let pat .= (c == '/' ? '[^/]\{-}' : '[^'.c.'/]\{-}').a:lst[item]
+		endfo
+	els
+		for item in range(1, len(a:lst) - 1)
+			let pat .= '[^'.a:lst[item - 1].']\{-}'.a:lst[item]
+		endfo
+	en
+	retu pat
+endf
+
+fu! s:curtype()
+	retu s:CurTypeName()[1]
+endf
+
+fu! s:mfunc()
+	let mfunc = 'match'
+	if s:byfname()
+		let mfunc = 's:matchfname'
+	elsei s:curtype() == 'buf'
+		let mfunc = 's:matchbuf'
+	elsei s:itemtype >= len(s:coretypes)
+		let matchtypes = { 'tabs': 's:matchtabs', 'tabe': 's:matchtabe' }
+		if has_key(matchtypes, s:matchtype)
+			let mfunc = matchtypes[s:matchtype]
+		en
+	en
+	retu mfunc
+endf
+
+fu! s:mmode()
+	let matchmodes = {
+		\ 'match': 'full-line',
+		\ 's:matchfname': 'filename-only',
+		\ 's:matchbuf': 'full-line',
+		\ 's:matchtabs': 'first-non-tab',
+		\ 's:matchtabe': 'until-last-tab',
+		\ }
+	retu matchmodes[s:mfunc]
+endf
+" Cache {{{2
+fu! s:writecache(cafile)
+	if ( g:ctrlp_newcache || !filereadable(a:cafile) ) && !s:nocache()
+		cal ctrlp#utils#writecache(g:ctrlp_allfiles)
+		let g:ctrlp_newcache = 0
+	en
+endf
+
+fu! s:nocache(...)
+	if !s:caching
+		retu 1
+	elsei s:caching > 1
+		if !( exists(s:ccex) && !{s:ccex} ) || has_key(s:ficounts, s:dyncwd)
+			retu get(s:ficounts, s:dyncwd, [0, 0])[0] < s:caching
+		elsei a:0 && filereadable(a:1)
+			retu len(ctrlp#utils#readfile(a:1)) < s:caching
+		en
+		retu 1
+	en
+	retu 0
+endf
+
+fu! s:insertcache(str)
+	let [data, g:ctrlp_newcache, str] = [g:ctrlp_allfiles, 1, a:str]
+	if data == [] || strlen(str) <= strlen(data[0])
+		let pos = 0
+	elsei strlen(str) >= strlen(data[-1])
+		let pos = len(data) - 1
+	el
+		let pos = 0
+		for each in data
+			if strlen(each) > strlen(str) | brea | en
+			let pos += 1
+		endfo
+	en
+	cal insert(data, str, pos)
+	cal s:writecache(ctrlp#utils#cachefile())
+endf
+" Extensions {{{2
+fu! s:mtype()
+	retu s:itemtype >= len(s:coretypes) ? s:getextvar('type') : 'path'
+endf
+
+fu! s:execextvar(key)
+	if !empty(g:ctrlp_ext_vars)
+		cal map(filter(copy(g:ctrlp_ext_vars),
+			\ 'has_key(v:val, a:key)'), 'eval(v:val[a:key])')
+	en
+endf
+
+fu! s:getextvar(key)
+	if s:itemtype >= len(s:coretypes) && len(g:ctrlp_ext_vars) > 0
+		let vars = g:ctrlp_ext_vars[s:itemtype - len(s:coretypes)]
+		if has_key(vars, a:key)
+			retu vars[a:key]
+		en
+	en
+	retu get(g:, 'ctrlp_' . s:matchtype . '_' . a:key, -1)
+endf
+
+fu! ctrlp#getcline()
+	let [linenr, offset] = [line('.'), ( s:offset > 0 ? s:offset : 0 )]
+	retu !empty(s:lines) && !( offset && linenr <= offset )
+		\ ? s:lines[linenr - 1 - offset] : ''
+endf
+
+fu! ctrlp#getmarkedlist()
+	retu exists('s:marked') ? values(s:marked) : []
+endf
+
+fu! ctrlp#clearmarkedlist()
+	let s:marked = {}
+endf
+
+fu! ctrlp#input()
+	retu s:getinput()
+endf
+
+fu! ctrlp#exit()
+	cal s:PrtExit()
+endf
+
+fu! ctrlp#prtclear()
+	cal s:PrtClear()
+endf
+
+fu! ctrlp#switchtype(id)
+	cal s:ToggleType(a:id - s:itemtype)
+endf
+
+fu! ctrlp#nosy()
+	retu !( has('syntax') && exists('g:syntax_on') )
+endf
+
+fu! s:hiupdate()
+	for [ke, va] in items(s:hlgrps)
+		let ke = 'CtrlP' . ke
+		if hlexists(ke)
+			exe 'hi link' ke va
+		en
+	endfo
+endf
+
+fu! ctrlp#hicheck(grp, defgrp)
+	if !hlexists(a:grp)
+		exe 'hi link' a:grp a:defgrp
+	en
+endf
+
+fu! ctrlp#call(func, ...)
+	retu call(a:func, a:000)
+endf
+
+fu! ctrlp#getvar(var)
+	retu {a:var}
+endf
+"}}}1
+" * Initialization {{{1
+fu! s:setlines_pre(...)
+	if a:0 | let s:itemtype = a:1 | en
+	cal s:modevar()
+	let s:setlines_post_ended = 0
+	let g:ctrlp_lines = []
+endf
+
+fu! s:setlines_post()
+	let inits = {'fil': 'ctrlp#files()', 'buf': 'ctrlp#buffers()', 'mru': 'ctrlp#mrufiles#list()'}
+	let types = map(copy(g:ctrlp_types), 'inits[v:val]')
+	if !empty(g:ctrlp_ext_vars)
+		cal map(copy(g:ctrlp_ext_vars), 'add(types, v:val["init"])')
+	en
+	let g:ctrlp_lines = eval(types[s:itemtype])
+	let s:setlines_post_ended = 1
+endf
+
+fu! ctrlp#setlines(...)
+	cal call('s:setlines_pre', a:000)
+	cal s:setlines_post()
+endf
+
+" Returns [lname, sname]
+fu! s:CurTypeName()
+	if s:itemtype < len(s:coretypes)
+		retu filter(copy(s:coretypes), 'v:val[1]==g:ctrlp_types[s:itemtype]')[0]
+	el
+		retu [s:getextvar("lname"), s:getextvar('sname')]
+	en
+endfu
+
+fu! s:ExitIfSingleCandidate()
+	if len(s:Update(s:prompt[0])) == 1
+		call s:AcceptSelection('e')
+		call ctrlp#exit()
+		retu 1
+	en
+	retu 0
+endfu
+
+fu! s:IsBuiltin()
+	let builtins = ['tag', 'dir', 'bft', 'rts', 'bkd', 'lns', 'chs', 'mix', 'udo', 'qfx']
+	let curtype = s:getextvar('sname')
+	retu s:itemtype < len(s:coretypes) || index(builtins, curtype) > -1
+endfu
+
+fu! s:DetectFileType(type, ft)
+	if s:IsBuiltin() || empty(a:ft) || a:ft ==# 'ctrlp'
+		retu 'ctrlp'
+	el
+		retu 'ctrlp.' . a:ft
+	en
+endfu
+
+fu! ctrlp#init(type, ...)
+	if exists('s:init') || s:iscmdwin() | retu | en
+	let [s:ermsg, v:errmsg] = [v:errmsg, '']
+	let [s:matches, s:init] = [1, 1]
+	cal s:Reset(a:0 ? a:1 : {})
+	noa cal s:Open()
+	cal s:SetWD(a:0 ? a:1 : {})
+	cal s:MapNorms()
+	cal s:MapSpecs()
+	if empty(g:ctrlp_types) && empty(g:ctrlp_ext_vars)
+		call ctrlp#exit()
+		retu
+	en
+	if type(a:type) == 0
+		let type = a:type
+	el
+		let type = index(g:ctrlp_types, a:type)
+		if type == -1
+			call ctrlp#exit()
+			retu
+		en
+	en
+	" Fixed issue ctrlpvim/ctrlp.vim#463 : Opening 'ctrlp' in certain modes
+	" (':CtrlPBufTag', ':CtrlPLine') seems to trigger a partially deffective
+	" intialisation (for example, syntax highlighting not working as expected).
+	" Fix: ctrlp#setlines() split in two, as the second part (now in
+	" s:setlines_post()) seems to need '&filetype', and s:DetectFileType() seems
+	" to need the first part of the old ctrlp#setlines() (now in
+	" s:setlines_pre()).
+	cal s:setlines_pre(s:settype(type))
+	let &filetype = s:DetectFileType(type, &filetype)
+	cal s:setlines_post()
+	cal ctrlp#syntax()
+	cal s:SetDefTxt()
+	let curName = s:CurTypeName()
+	let shouldExitSingle = index(s:opensingle, curName[0])>=0 || index(s:opensingle, curName[1])>=0
+	if shouldExitSingle && s:ExitIfSingleCandidate()
+		retu 0
+	en
+
+	if has('patch-9.0.0115') && &cmdheight == 0
+		let s:cmdheight = &cmdheight
+		set cmdheight=1
+	en
+	cal s:BuildPrompt(1)
+	if s:keyloop | cal s:KeyLoop() | en
+	retu 1
+endf
+
+" - Events {{{1
+fu! s:NotifySearch()
+	let l:cb = s:getextvar('search')
+	if l:cb != -1
+		cal eval(l:cb)
+	en
+endf
+
+fu! ctrlp#update(...)
+	cal s:ForceUpdate()
+	if a:0 | cal s:BuildPrompt(a:1) | en
+endf
+
+" - Autocmds {{{1
+if has('autocmd')
+	aug CtrlPAug
+		au!
+		au BufEnter ControlP cal s:checkbuf()
+		au BufLeave ControlP noa cal s:Close()
+		au VimLeavePre * cal s:leavepre()
+		au ColorScheme * cal s:hiupdate()
+	aug END
+en
+
+fu! s:autocmds()
+	if !has('autocmd') | retu | en
+	if exists('#CtrlPLazy')
+		au! CtrlPLazy
+	en
+	if s:lazy
+		aug CtrlPLazy
+			au!
+			au CursorHold ControlP cal s:ForceUpdate()
+		aug END
+	en
+endf
+"}}}
+
+" vim:fen:fdm=marker:fmr={{{,}}}:fdl=0:fdc=1:ts=2:sw=2:sts=2

+ 173 - 0
vim/plugged/ctrlp.vim/autoload/ctrlp/autoignore.vim

@@ -0,0 +1,173 @@
+" =============================================================================
+" File:          autoload/ctrlp/autoignore.vim
+" Description:   Auto-ignore Extension
+" Author:        Ludovic Chabant <github.com/ludovicchabant>
+" =============================================================================
+
+
+" Global Settings {{{
+
+if exists('g:ctrlp_autoignore_loaded') && g:ctrlp_autoignore_loaded
+		\ && !g:ctrlp_autoignore_debug
+	finish
+endif
+let g:ctrlp_autoignore_loaded = 1
+
+if !exists('g:ctrlp_autoignore_debug')
+	let g:ctrlp_autoignore_debug = 0
+endif
+
+if !exists('g:ctrlp_autoignore_trace')
+	let g:ctrlp_autoignore_trace = 0
+endif
+
+" }}}
+
+" Initialization {{{
+
+if !exists('g:ctrlp_custom_ignore')
+	let g:ctrlp_custom_ignore = {}
+endif
+let g:ctrlp_custom_ignore['func'] = 'ctrlp#autoignore#ignore'
+let g:ctrlp_custom_ignore['func-init'] = 'ctrlp#autoignore#ignore_init'
+let g:ctrlp_custom_ignore['func-close'] = 'ctrlp#autoignore#ignore_close'
+
+if !exists('g:ctrlp_root_markers')
+	let g:ctrlp_root_markers = []
+endif
+call add(g:ctrlp_root_markers, '.ctrlpignore')
+
+" }}}
+
+" Internals {{{
+
+function! s:trace(message) abort
+    if g:ctrlp_autoignore_trace
+        echom "ctrlp_autoignore: " . a:message
+    endif
+endfunction
+
+let s:proj_cache = {}
+let s:active_cwd = ''
+let s:active_cwd_len = 0
+let s:active_patterns = []
+let s:changed_wildignore = 0
+let s:prev_wildignore = ''
+
+function! s:load_project_patterns(root_dir) abort
+	let l:ign_path = a:root_dir . '/.ctrlpignore'
+	if !filereadable(l:ign_path)
+		call s:trace("No pattern file at: " . l:ign_path)
+		return []
+	endif
+	let l:cursyntax = 'regexp'
+	let l:knownsyntaxes = ['regexp', 'wildignore']
+	let l:patterns = []
+	let l:lines = readfile(l:ign_path)
+	for line in l:lines
+		" Comment line?
+		if match(line, '\v^\s*$') >= 0 || match(line, '\v^\s*#') >= 0
+			continue
+		endif
+		" Syntax change?
+		let l:matches = matchlist(line, '\v^syntax:\s?(\w+)\s*$')
+		if len(l:matches) > 0
+			let l:cursyntax = l:matches[1]
+			if index(l:knownsyntaxes, l:cursyntax) < 0
+				echoerr "ctrlp_autoignore: Unknown syntax '".l:cursyntax."' in: ".l:ign_path
+			endif
+			continue
+		endif
+		" Patterns!
+		let l:matches = matchlist(line, '\v^((dir|file|link)\:)?(.*)')
+		let l:mtype = l:matches[2]
+		let l:mpat = l:matches[3]
+		call add(l:patterns, {'syn': l:cursyntax, 'type': l:mtype, 'pat': l:mpat})
+	endfor
+	call s:trace("Loaded " . len(l:patterns) . " patterns from: " . l:ign_path)
+	return l:patterns
+endfunction
+
+function! s:get_project_patterns(root_dir) abort
+	let l:ign_path = a:root_dir . '/.ctrlpignore'
+	let l:ign_mtime = getftime(l:ign_path)
+	let l:patterns = get(s:proj_cache, a:root_dir)
+	if type(l:patterns) == type({})
+		" Check that these patterns are still valid.
+		if l:ign_mtime < 0
+			" File got deleted! :(
+			let l:patterns['pats'] = []
+			return l:patterns['pats']
+		elseif l:ign_mtime <= l:patterns['mtime']
+			" File hasn't changed! :)
+			return l:patterns['pats']
+		endif
+	endif
+
+	call s:trace("Loading patterns for project: " . a:root_dir)
+	let l:loaded = s:load_project_patterns(a:root_dir)
+	let s:proj_cache[a:root_dir] = {
+	\'mtime': localtime(),
+	\'pats': l:loaded}
+	return l:loaded
+endfunction
+
+" The custom ignore function that CtrlP will be using in addition to
+" normal pattern-based matching.
+function! ctrlp#autoignore#ignore(item, type) abort
+	let l:cnv_item = tr(strpart(a:item, s:active_cwd_len), "\\", "/")
+	for pat in s:active_patterns
+		if pat['syn'] != 'regexp'
+			continue
+		endif
+		if pat['type'] == '' || pat['type'] == a:type
+			if match(l:cnv_item, pat['pat']) >= 0
+				call s:trace("Ignoring ".l:cnv_item." because of ".pat['pat'])
+				return 1
+			endif
+		endif
+	endfor
+	return 0
+endfunction
+
+function! ctrlp#autoignore#ignore_init() abort
+	let l:root = getcwd()
+	let s:active_cwd = l:root
+	" len+1 is for including the next separator after the root.
+	let s:active_cwd_len = len(l:root) + 1
+	let s:active_patterns = s:get_project_patterns(l:root)
+	call s:trace("Got ".len(s:active_patterns)." patterns for ".l:root)
+
+	let s:changed_wildignore = 0
+	let s:prev_wildignore = &wildignore
+	for pat in s:active_patterns
+		if pat['syn'] == 'wildignore'
+			execute 'set wildignore+='.pat['pat']
+			let s:changed_wildignore = 1
+		endif
+	endfor
+	if s:changed_wildignore
+		call s:trace("Set wildignore to ".&wildignore)
+	endif
+endfunction
+
+function! ctrlp#autoignore#ignore_close() abort
+	if s:changed_wildignore
+		execute 'set wildignore='.s:prev_wildignore
+		let s:prev_wildignore = ''
+		call s:trace("Set wildignore back to ".&wildignore)
+	endif
+endfunction
+
+" List patterns for a given project's root.
+function! ctrlp#autoignore#get_patterns(root_dir) abort
+	let l:patterns = s:get_project_patterns(a:root_dir)
+	for pat in l:patterns
+		let l:prefix = pat['type'] == '' ? '(all)' : pat['type']
+		echom l:prefix . ':' . pat['pat']
+	endfor
+endfunction
+
+" }}}
+
+" vim:fen:fdm=marker:fmr={{{,}}}:fdl=0:fdc=1:ts=2:sw=2:sts=2

+ 147 - 0
vim/plugged/ctrlp.vim/autoload/ctrlp/bookmarkdir.vim

@@ -0,0 +1,147 @@
+" =============================================================================
+" File:          autoload/ctrlp/bookmarkdir.vim
+" Description:   Bookmarked directories extension
+" Author:        Kien Nguyen <github.com/kien>
+" =============================================================================
+
+" Init {{{1
+if exists('g:loaded_ctrlp_bookmarkdir') && g:loaded_ctrlp_bookmarkdir
+	fini
+en
+let g:loaded_ctrlp_bookmarkdir = 1
+
+cal add(g:ctrlp_ext_vars, {
+	\ 'init': 'ctrlp#bookmarkdir#init()',
+	\ 'accept': 'ctrlp#bookmarkdir#accept',
+	\ 'lname': 'bookmarked dirs',
+	\ 'sname': 'bkd',
+	\ 'type': 'tabs',
+	\ 'opmul': 1,
+	\ 'nolim': 1,
+	\ 'wipe': 'ctrlp#bookmarkdir#remove',
+	\ })
+
+let s:id = g:ctrlp_builtins + len(g:ctrlp_ext_vars)
+" Utilities {{{1
+fu! s:getinput(str, ...)
+	echoh Identifier
+	cal inputsave()
+	let input = call('input', a:0 ? [a:str] + a:000 : [a:str])
+	cal inputrestore()
+	echoh None
+	retu input
+endf
+
+fu! s:cachefile()
+	if !exists('s:cadir') || !exists('s:cafile')
+		let s:cadir = ctrlp#utils#cachedir().ctrlp#utils#lash().'bkd'
+		let s:cafile = s:cadir.ctrlp#utils#lash().'cache.txt'
+	en
+	retu s:cafile
+endf
+
+fu! s:writecache(lines)
+	cal ctrlp#utils#writecache(a:lines, s:cadir, s:cafile)
+endf
+
+fu! s:getbookmarks()
+	retu ctrlp#utils#readfile(s:cachefile())
+endf
+
+fu! s:savebookmark(name, cwd)
+	let cwds = exists('+ssl') ? [tr(a:cwd, '\', '/'), tr(a:cwd, '/', '\')] : [a:cwd]
+	let entries = filter(s:getbookmarks(), 'index(cwds, s:parts(v:val)[1]) < 0')
+	cal s:writecache(insert(entries, a:name.'	'.a:cwd))
+endf
+
+fu! s:setentries()
+	let time = getftime(s:cachefile())
+	if !( exists('s:bookmarks') && time == s:bookmarks[0] )
+		let s:bookmarks = [time, s:getbookmarks()]
+	en
+endf
+
+fu! s:parts(str)
+	let mlist = matchlist(a:str, '\v([^\t]+)\t(.*)$')
+	retu mlist != [] ? mlist[1:2] : ['', '']
+endf
+
+fu! s:process(entries, type)
+	retu map(a:entries, 's:modify(v:val, a:type)')
+endf
+
+fu! s:modify(entry, type)
+	let [name, dir] = s:parts(a:entry)
+	let dir = fnamemodify(dir, a:type)
+	retu name.'	'.( dir == '' ? '.' : dir )
+endf
+
+fu! s:msg(name, cwd)
+	redr
+	echoh Identifier | echon 'Bookmarked ' | echoh Constant
+	echon a:name.' ' | echoh Directory | echon a:cwd
+	echoh None
+endf
+
+fu! s:syntax()
+	if !ctrlp#nosy()
+		cal ctrlp#hicheck('CtrlPBookmark', 'Identifier')
+		cal ctrlp#hicheck('CtrlPTabExtra', 'Comment')
+		sy match CtrlPBookmark '^> [^\t]\+' contains=CtrlPLinePre
+		sy match CtrlPTabExtra '\zs\t.*\ze$'
+	en
+endf
+" Public {{{1
+fu! ctrlp#bookmarkdir#init()
+	cal s:setentries()
+	cal s:syntax()
+	retu s:process(copy(s:bookmarks[1]), ':.')
+endf
+
+fu! ctrlp#bookmarkdir#accept(mode, str)
+	let parts = s:parts(s:modify(a:str, ':p'))
+	cal call('s:savebookmark', parts)
+	if a:mode =~ 't\|v\|h'
+		cal ctrlp#exit()
+	en
+	cal ctrlp#setdir(parts[1], a:mode =~ 't\|h' ? 'chd!' : 'lc!')
+	if a:mode == 'e'
+		cal ctrlp#switchtype(0)
+		cal ctrlp#recordhist()
+		cal ctrlp#prtclear()
+	en
+endf
+
+fu! ctrlp#bookmarkdir#add(bang, dir, ...)
+	let ctrlp_tilde_homedir = get(g:, 'ctrlp_tilde_homedir', 0)
+	let cwd = fnamemodify(getcwd(), ctrlp_tilde_homedir ? ':p:~' : ':p')
+	let dir = fnamemodify(a:dir, ctrlp_tilde_homedir ? ':p:~' : ':p')
+	if a:bang == '!'
+		let cwd = dir != '' ? dir : cwd
+		let name = a:0 && a:1 != '' ? a:1 : cwd
+	el
+		let str = 'Directory to bookmark: '
+		let cwd = dir != '' ? dir : s:getinput(str, cwd, 'dir')
+		if cwd == '' | retu | en
+		let name = a:0 && a:1 != '' ? a:1 : s:getinput('Bookmark as: ', cwd)
+		if name == '' | retu | en
+	en
+	let name = tr(name, '	', ' ')
+	cal s:savebookmark(name, cwd)
+	cal s:msg(name, cwd)
+endf
+
+fu! ctrlp#bookmarkdir#remove(entries)
+	cal s:process(a:entries, ':p')
+	cal s:writecache(a:entries == [] ? [] :
+		\ filter(s:getbookmarks(), 'index(a:entries, v:val) < 0'))
+	cal s:setentries()
+	retu s:process(copy(s:bookmarks[1]), ':.')
+endf
+
+fu! ctrlp#bookmarkdir#id()
+	retu s:id
+endf
+"}}}
+
+" vim:fen:fdm=marker:fmr={{{,}}}:fdl=0:fdc=1:ts=2:sw=2:sts=2

+ 281 - 0
vim/plugged/ctrlp.vim/autoload/ctrlp/buffertag.vim

@@ -0,0 +1,281 @@
+" =============================================================================
+" File:          autoload/ctrlp/buffertag.vim
+" Description:   Buffer Tag extension
+" Maintainer:    Kien Nguyen <github.com/kien>
+" Credits:       Much of the code was taken from tagbar.vim by Jan Larres, plus
+"                a few lines from taglist.vim by Yegappan Lakshmanan and from
+"                buffertag.vim by Takeshi Nishida.
+" =============================================================================
+
+" Init {{{1
+if exists('g:loaded_ctrlp_buftag') && g:loaded_ctrlp_buftag
+	fini
+en
+let g:loaded_ctrlp_buftag = 1
+
+cal add(g:ctrlp_ext_vars, {
+	\ 'init': 'ctrlp#buffertag#init(s:crfile)',
+	\ 'accept': 'ctrlp#buffertag#accept',
+	\ 'lname': 'buffer tags',
+	\ 'sname': 'bft',
+	\ 'exit': 'ctrlp#buffertag#exit()',
+	\ 'type': 'tabs',
+	\ 'opts': 'ctrlp#buffertag#opts()',
+	\ })
+
+let s:id = g:ctrlp_builtins + len(g:ctrlp_ext_vars)
+
+let [s:pref, s:opts] = ['g:ctrlp_buftag_', {
+	\ 'systemenc': ['s:enc', &enc],
+	\ 'ctags_bin': ['s:bin', ''],
+	\ 'types': ['s:usr_types', {}],
+	\ }]
+
+let s:bins = [
+	\ 'ctags-exuberant',
+	\ 'exuberant-ctags',
+	\ 'exctags',
+	\ '/usr/local/bin/ctags',
+	\ '/opt/local/bin/ctags',
+	\ 'ctags',
+	\ 'ctags.exe',
+	\ 'tags',
+	\ ]
+
+let s:types = {
+	\ 'ant'    : '%sant%sant%spt',
+	\ 'asm'    : '%sasm%sasm%sdlmt',
+	\ 'aspperl': '%sasp%sasp%sfsv',
+	\ 'aspvbs' : '%sasp%sasp%sfsv',
+	\ 'awk'    : '%sawk%sawk%sf',
+	\ 'beta'   : '%sbeta%sbeta%sfsv',
+	\ 'c'      : '%sc%sc%sdgsutvf',
+	\ 'cpp'    : '%sc++%sc++%snvdtcgsuf',
+	\ 'cs'     : '%sc#%sc#%sdtncEgsipm',
+	\ 'cobol'  : '%scobol%scobol%sdfgpPs',
+	\ 'delphi' : '%spascal%spascal%sfp',
+	\ 'dosbatch': '%sdosbatch%sdosbatch%slv',
+	\ 'eiffel' : '%seiffel%seiffel%scf',
+	\ 'erlang' : '%serlang%serlang%sdrmf',
+	\ 'expect' : '%stcl%stcl%scfp',
+	\ 'fortran': '%sfortran%sfortran%spbceiklmntvfs',
+	\ 'go'     : '%sgo%sgo%sfctv',
+	\ 'html'   : '%shtml%shtml%saf',
+	\ 'java'   : '%sjava%sjava%spcifm',
+	\ 'javascript': '%sjavascript%sjavascript%sf',
+	\ 'lisp'   : '%slisp%slisp%sf',
+	\ 'lua'    : '%slua%slua%sf',
+	\ 'make'   : '%smake%smake%sm',
+	\ 'matlab' : '%smatlab%smatlab%sf',
+	\ 'ocaml'  : '%socaml%socaml%scmMvtfCre',
+	\ 'pascal' : '%spascal%spascal%sfp',
+	\ 'perl'   : '%sperl%sperl%sclps',
+	\ 'php'    : '%sphp%sphp%scdvf',
+	\ 'python' : '%spython%spython%scmf',
+	\ 'rexx'   : '%srexx%srexx%ss',
+	\ 'ruby'   : '%sruby%sruby%scfFm',
+	\ 'rust'   : '%srust%srust%sfTgsmctid',
+	\ 'scheme' : '%sscheme%sscheme%ssf',
+	\ 'sh'     : '%ssh%ssh%sf',
+	\ 'csh'    : '%ssh%ssh%sf',
+	\ 'zsh'    : '%ssh%ssh%sf',
+	\ 'scala'  : '%sscala%sscala%sctTmlp',
+	\ 'slang'  : '%sslang%sslang%snf',
+	\ 'sml'    : '%ssml%ssml%secsrtvf',
+	\ 'sql'    : '%ssql%ssql%scFPrstTvfp',
+	\ 'tex'    : '%stex%stex%sipcsubPGl',
+	\ 'tcl'    : '%stcl%stcl%scfmp',
+	\ 'vera'   : '%svera%svera%scdefgmpPtTvx',
+	\ 'verilog': '%sverilog%sverilog%smcPertwpvf',
+	\ 'vhdl'   : '%svhdl%svhdl%sPctTrefp',
+	\ 'vim'    : '%svim%svim%savf',
+	\ 'yacc'   : '%syacc%syacc%sl',
+	\ }
+
+cal map(s:types, 'printf(v:val, "--language-force=", " --", "-types=")')
+
+if executable('jsctags')
+	cal extend(s:types, { 'javascript': { 'args': '-f -', 'bin': 'jsctags' } })
+en
+
+fu! ctrlp#buffertag#opts()
+	for [ke, va] in items(s:opts)
+		let {va[0]} = exists(s:pref.ke) ? {s:pref.ke} : va[1]
+	endfo
+	" Ctags bin
+	if empty(s:bin)
+		for bin in s:bins | if executable(bin)
+			let s:bin = bin
+			brea
+		en | endfo
+	el
+		let s:bin = expand(s:bin, 1)
+	en
+	" Types
+	cal extend(s:types, s:usr_types)
+endf
+" Utilities {{{1
+fu! s:validfile(fname, ftype)
+	if ( !empty(a:fname) || !empty(a:ftype) ) && filereadable(a:fname)
+		\ && index(keys(s:types), a:ftype) >= 0 | retu 1 | en
+	retu 0
+endf
+
+fu! s:exectags(cmd)
+	if exists('+ssl')
+		let [ssl, &ssl] = [&ssl, 0]
+	en
+	if &sh =~ 'cmd\.exe'
+		let [sxq, &sxq, shcf, &shcf] = [&sxq, '"', &shcf, '/s /c']
+	en
+	let output = system(a:cmd)
+	if &sh =~ 'cmd\.exe'
+		let [&sxq, &shcf] = [sxq, shcf]
+	en
+	if exists('+ssl')
+		let &ssl = ssl
+	en
+	retu output
+endf
+
+fu! s:exectagsonfile(fname, ftype)
+	let [ags, ft] = ['-f - --sort=no --excmd=pattern --fields=nKs --extra= --file-scope=yes ', a:ftype]
+	if type(s:types[ft]) == 1
+		let ags .= s:types[ft]
+		let bin = s:bin
+	elsei type(s:types[ft]) == 4
+		let ags = s:types[ft]['args']
+		let bin = expand(s:types[ft]['bin'], 1)
+	en
+	if empty(bin) | retu '' | en
+	let cmd = s:esctagscmd(bin, ags, a:fname)
+	if empty(cmd) | retu '' | en
+	let output = s:exectags(cmd)
+	if v:shell_error || output =~ 'Warning: cannot open' | retu '' | en
+	retu output
+endf
+
+fu! s:esctagscmd(bin, args, ...)
+	if exists('+ssl')
+		let [ssl, &ssl] = [&ssl, 0]
+	en
+	let fname = a:0 ? shellescape(a:1) : ''
+	if  (has('win32') || has('win64'))
+		let cmd = a:bin.' '.a:args.' '.fname
+	else
+		let cmd = shellescape(a:bin).' '.a:args.' '.fname
+	endif
+	if &sh =~ 'cmd\.exe'
+		let cmd = substitute(cmd, '[&()@^<>|]', '^\0', 'g')
+	en
+	if exists('+ssl')
+		let &ssl = ssl
+	en
+	if has('iconv')
+		let last = s:enc != &enc ? s:enc : !empty( $LANG ) ? $LANG : &enc
+		let cmd = iconv(cmd, &enc, last)
+	en
+	retu cmd
+endf
+
+fu! s:process(fname, ftype)
+	if !s:validfile(a:fname, a:ftype) | retu [] | endif
+	let ftime = getftime(a:fname)
+	if has_key(g:ctrlp_buftags, a:fname)
+		\ && g:ctrlp_buftags[a:fname]['time'] >= ftime
+		let lines = g:ctrlp_buftags[a:fname]['lines']
+	el
+		let data = s:exectagsonfile(a:fname, a:ftype)
+		let [raw, lines] = [split(data, '\n\+'), []]
+		for line in raw
+			if line !~# '^!_TAG_' && len(split(line, ';"')) == 2
+				let parsed_line = s:parseline(line)
+				if parsed_line != ''
+					cal add(lines, parsed_line)
+				en
+			en
+		endfo
+		let cache = { a:fname : { 'time': ftime, 'lines': lines } }
+		cal extend(g:ctrlp_buftags, cache)
+	en
+	retu lines
+endf
+
+fu! s:parseline(line)
+	let vals = matchlist(a:line,
+		\ '\v^([^\t]+)\t(.+)\t[?/]\^?(.{-1,})\$?[?/]\;\"\t(.+)\tline(no)?\:(\d+)\t?([^\t]*)')
+	if vals == [] | retu '' | en
+	let [bufnr, bufname] = [bufnr('^'.vals[2].'$'), fnamemodify(vals[2], ':p:t')]
+	if len(vals) > 7 && vals[7] != ''
+		retu vals[1].'	'.vals[4].'|'.bufnr.':'.bufname.'|'.vals[6].'|'.vals[7].'| '.vals[3]
+	else
+		retu vals[1].'	'.vals[4].'|'.bufnr.':'.bufname.'|'.vals[6].'| '.vals[3]
+	en
+endf
+
+fu! s:syntax()
+	if !ctrlp#nosy()
+		cal ctrlp#hicheck('CtrlPTagKind', 'Title')
+		cal ctrlp#hicheck('CtrlPBufName', 'Directory')
+		cal ctrlp#hicheck('CtrlPTabExtra', 'Comment')
+		sy match CtrlPTagKind '\zs[^\t|]\+\ze|\d\+:[^|]\+|\d\+|'
+		sy match CtrlPBufName '|\d\+:\zs[^|]\+\ze|\d\+|'
+		sy match CtrlPTabExtra '\zs\t.*\ze$' contains=CtrlPBufName,CtrlPTagKind
+	en
+endf
+
+fu! s:chknearby(pat)
+	if match(getline('.'), a:pat) < 0
+		let [int, forw, maxl] = [1, 1, line('$')]
+		wh !search(a:pat, 'W'.( forw ? '' : 'b' ))
+			if !forw
+				if int > maxl | brea | en
+				let int += int
+			en
+			let forw = !forw
+		endw
+	en
+endf
+" Public {{{1
+fu! ctrlp#buffertag#init(fname)
+	let bufs = exists('s:btmode') && s:btmode
+		\ ? filter(ctrlp#buffers(), 'filereadable(v:val)')
+		\ : [exists('s:bufname') ? s:bufname : a:fname]
+	let lines = []
+	for each in bufs
+		let bname = fnamemodify(each, ':p')
+		let tftype = get(split(getbufvar('^'.bname.'$', '&ft'), '\.'), 0, '')
+		cal extend(lines, s:process(bname, tftype))
+	endfo
+	cal s:syntax()
+	retu lines
+endf
+
+fu! ctrlp#buffertag#accept(mode, str)
+	let vals = matchlist(a:str,
+		\ '\v^[^\t]+\t+[^\t|]+\|(\d+)\:[^\t|]+\|(\d+)%(\|[^\t|]+)?\|\s(.+)$')
+	let bufnr = str2nr(get(vals, 1))
+	if bufnr
+		cal ctrlp#acceptfile(a:mode, bufnr)
+		exe 'norm!' str2nr(get(vals, 2, line('.'))).'G'
+		cal s:chknearby('\V\C'.get(vals, 3, ''))
+		sil! norm! zvzz
+	en
+endf
+
+fu! ctrlp#buffertag#cmd(mode, ...)
+	let s:btmode = a:mode
+	if a:0 && !empty(a:1)
+		let s:btmode = 0
+		let bname = a:1 =~# '^%$\|^#\d*$' ? expand(a:1) : a:1
+		let s:bufname = fnamemodify(bname, ':p')
+	en
+	retu s:id
+endf
+
+fu! ctrlp#buffertag#exit()
+	unl! s:btmode s:bufname
+endf
+"}}}
+
+" vim:fen:fdm=marker:fmr={{{,}}}:fdl=0:fdc=1:ts=2:sw=2:sts=2

+ 98 - 0
vim/plugged/ctrlp.vim/autoload/ctrlp/changes.vim

@@ -0,0 +1,98 @@
+" =============================================================================
+" File:          autoload/ctrlp/changes.vim
+" Description:   Change list extension
+" Author:        Kien Nguyen <github.com/kien>
+" =============================================================================
+
+" Init {{{1
+if exists('g:loaded_ctrlp_changes') && g:loaded_ctrlp_changes
+	fini
+en
+let g:loaded_ctrlp_changes = 1
+
+cal add(g:ctrlp_ext_vars, {
+	\ 'init': 'ctrlp#changes#init(s:bufnr, s:crbufnr)',
+	\ 'accept': 'ctrlp#changes#accept',
+	\ 'lname': 'changes',
+	\ 'sname': 'chs',
+	\ 'exit': 'ctrlp#changes#exit()',
+	\ 'type': 'tabe',
+	\ 'sort': 0,
+	\ 'nolim': 1,
+	\ })
+
+let s:id = g:ctrlp_builtins + len(g:ctrlp_ext_vars)
+" Utilities {{{1
+fu! s:changelist(bufnr)
+	sil! exe 'noa hid b' a:bufnr
+	redi => result
+	sil! changes
+	redi END
+	retu map(split(result, "\n")[1:], 'tr(v:val, "	", " ")')
+endf
+
+fu! s:process(clines, ...)
+	let [clines, evas] = [[], []]
+	for each in a:clines
+		let parts = matchlist(each, '\v^.\s*\d+\s+(\d+)\s+(\d+)\s(.*)$')
+		if !empty(parts)
+			if parts[3] == '' | let parts[3] = ' ' | en
+			cal add(clines, parts[3].'	|'.a:1.':'.a:2.'|'.parts[1].':'.parts[2].'|')
+		en
+	endfo
+	retu reverse(filter(clines, 'count(clines, v:val) == 1'))
+endf
+
+fu! s:syntax()
+	if !ctrlp#nosy()
+		cal ctrlp#hicheck('CtrlPBufName', 'Directory')
+		cal ctrlp#hicheck('CtrlPTabExtra', 'Comment')
+		sy match CtrlPBufName '\t|\d\+:\zs[^|]\+\ze|\d\+:\d\+|$'
+		sy match CtrlPTabExtra '\zs\t.*\ze$' contains=CtrlPBufName
+	en
+endf
+" Public {{{1
+fu! ctrlp#changes#init(original_bufnr, bufnr)
+	let bufnr = exists('s:bufnr') ? s:bufnr : a:bufnr
+	let bufs = exists('s:clmode') && s:clmode ? ctrlp#buffers('id') : [bufnr]
+	cal filter(bufs, 'v:val > 0')
+	let [swb, &swb] = [&swb, '']
+	let lines = []
+	for each in bufs
+		let bname = bufname(each)
+		let fnamet = fnamemodify(bname == '' ? '[No Name]' : bname, ':t')
+		cal extend(lines, s:process(s:changelist(each), each, fnamet))
+	endfo
+	sil! exe 'noa hid b' a:original_bufnr
+	let &swb = swb
+	cal ctrlp#syntax()
+	cal s:syntax()
+	retu lines
+endf
+
+fu! ctrlp#changes#accept(mode, str)
+	let info = matchlist(a:str, '\t|\(\d\+\):[^|]\+|\(\d\+\):\(\d\+\)|$')
+	let bufnr = str2nr(get(info, 1))
+	if bufnr
+		cal ctrlp#acceptfile(a:mode, bufnr)
+		cal cursor(get(info, 2), get(info, 3))
+		sil! norm! zvzz
+	en
+endf
+
+fu! ctrlp#changes#cmd(mode, ...)
+	let s:clmode = a:mode
+	if a:0 && !empty(a:1)
+		let s:clmode = 0
+		let bname = a:1 =~# '^%$\|^#\d*$' ? expand(a:1) : a:1
+		let s:bufnr = bufnr('^'.fnamemodify(bname, ':p').'$')
+	en
+	retu s:id
+endf
+
+fu! ctrlp#changes#exit()
+	unl! s:clmode s:bufnr
+endf
+"}}}
+
+" vim:fen:fdm=marker:fmr={{{,}}}:fdl=0:fdc=1:ts=2:sw=2:sts=2

+ 95 - 0
vim/plugged/ctrlp.vim/autoload/ctrlp/dir.vim

@@ -0,0 +1,95 @@
+" =============================================================================
+" File:          autoload/ctrlp/dir.vim
+" Description:   Directory extension
+" Author:        Kien Nguyen <github.com/kien>
+" =============================================================================
+
+" Init {{{1
+if exists('g:loaded_ctrlp_dir') && g:loaded_ctrlp_dir
+	fini
+en
+let [g:loaded_ctrlp_dir, g:ctrlp_newdir] = [1, 0]
+
+let s:ars = ['s:maxdepth', 's:maxfiles', 's:compare_lim', 's:glob', 's:caching']
+
+cal add(g:ctrlp_ext_vars, {
+	\ 'init': 'ctrlp#dir#init('.join(s:ars, ', ').')',
+	\ 'accept': 'ctrlp#dir#accept',
+	\ 'lname': 'dirs',
+	\ 'sname': 'dir',
+	\ 'type': 'path',
+	\ 'specinput': 1,
+	\ })
+
+let s:id = g:ctrlp_builtins + len(g:ctrlp_ext_vars)
+
+let s:dircounts = {}
+" Utilities {{{1
+fu! s:globdirs(dirs, depth)
+	let entries = split(globpath(a:dirs, s:glob), "\n")
+	let [dirs, depth] = [ctrlp#dirnfile(entries)[0], a:depth + 1]
+	cal extend(g:ctrlp_alldirs, dirs)
+	let nr = len(g:ctrlp_alldirs)
+	if !empty(dirs) && !s:max(nr, s:maxfiles) && depth <= s:maxdepth
+		sil! cal ctrlp#progress(nr)
+		cal map(dirs, 'ctrlp#utils#fnesc(v:val, "g", ",")')
+		cal s:globdirs(join(dirs, ','), depth)
+	en
+endf
+
+fu! s:max(len, max)
+	retu a:max && a:len > a:max
+endf
+
+fu! s:nocache()
+	retu !s:caching || ( s:caching > 1 && get(s:dircounts, s:cwd) < s:caching )
+endf
+" Public {{{1
+fu! ctrlp#dir#init(...)
+	let s:cwd = getcwd()
+	for each in range(len(s:ars))
+		let {s:ars[each]} = a:{each + 1}
+	endfo
+	let cadir = ctrlp#utils#cachedir().ctrlp#utils#lash().'dir'
+	let cafile = cadir.ctrlp#utils#lash().ctrlp#utils#cachefile('dir')
+	if g:ctrlp_newdir || s:nocache() || !filereadable(cafile)
+		let [s:initcwd, g:ctrlp_alldirs] = [s:cwd, []]
+		if !ctrlp#igncwd(s:cwd)
+			cal s:globdirs(ctrlp#utils#fnesc(s:cwd, 'g', ','), 0)
+		en
+		cal ctrlp#rmbasedir(g:ctrlp_alldirs)
+		if len(g:ctrlp_alldirs) <= s:compare_lim
+			cal sort(g:ctrlp_alldirs, 'ctrlp#complen')
+		en
+		cal ctrlp#utils#writecache(g:ctrlp_alldirs, cadir, cafile)
+		let g:ctrlp_newdir = 0
+	el
+		if !( exists('s:initcwd') && s:initcwd == s:cwd )
+			let s:initcwd = s:cwd
+			let g:ctrlp_alldirs = ctrlp#utils#readfile(cafile)
+		en
+	en
+	cal extend(s:dircounts, { s:cwd : len(g:ctrlp_alldirs) })
+	retu g:ctrlp_alldirs
+endf
+
+fu! ctrlp#dir#accept(mode, str)
+	let path = a:mode == 'h' ? getcwd() : s:cwd.ctrlp#call('s:lash', s:cwd).a:str
+	if a:mode =~ 't\|v\|h'
+		cal ctrlp#exit()
+	en
+	cal ctrlp#setdir(path, a:mode =~ 't\|h' ? 'chd!' : 'lc!')
+	if a:mode == 'e'
+		sil! cal ctrlp#statusline()
+		cal ctrlp#setlines(s:id)
+		cal ctrlp#recordhist()
+		cal ctrlp#prtclear()
+	en
+endf
+
+fu! ctrlp#dir#id()
+	retu s:id
+endf
+"}}}
+
+" vim:fen:fdm=marker:fmr={{{,}}}:fdl=0:fdc=1:ts=2:sw=2:sts=2

+ 81 - 0
vim/plugged/ctrlp.vim/autoload/ctrlp/line.vim

@@ -0,0 +1,81 @@
+" =============================================================================
+" File:          autoload/ctrlp/line.vim
+" Description:   Line extension
+" Author:        Kien Nguyen <github.com/kien>
+" =============================================================================
+
+" Init {{{1
+if exists('g:loaded_ctrlp_line') && g:loaded_ctrlp_line
+	fini
+en
+let g:loaded_ctrlp_line = 1
+
+cal add(g:ctrlp_ext_vars, {
+	\ 'init': 'ctrlp#line#init(s:crbufnr)',
+	\ 'accept': 'ctrlp#line#accept',
+	\ 'act_farg' : 'dict',
+	\ 'lname': 'lines',
+	\ 'sname': 'lns',
+	\ 'type': 'tabe',
+	\ })
+
+let s:id = g:ctrlp_builtins + len(g:ctrlp_ext_vars)
+" Utilities {{{1
+fu! s:syntax()
+	if !ctrlp#nosy()
+		cal ctrlp#hicheck('CtrlPBufName', 'Directory')
+		cal ctrlp#hicheck('CtrlPTabExtra', 'Comment')
+		sy match CtrlPBufName '\t|\zs[^|]\+\ze|\d\+:\d\+|$'
+		sy match CtrlPTabExtra '\zs\t.*\ze$' contains=CtrlPBufName
+	en
+endf
+" Public {{{1
+fu! ctrlp#line#init(bufnr)
+	let [lines, bufnr] = [[], exists('s:bufnr') ? s:bufnr : a:bufnr]
+	let bufs = exists('s:lnmode') && !empty(s:lnmode) ? ctrlp#buffers('id') : [bufnr]
+	for bufnr in bufs
+		let [lfb, bufn] = [getbufline(bufnr, 1, '$'), bufname(bufnr)]
+		if lfb == [] && bufn != ''
+			let lfb = ctrlp#utils#readfile(fnamemodify(bufn, ':p'))
+		en
+		cal map(lfb, 'tr(v:val, ''	'', '' '')')
+		let [linenr, len_lfb] = [1, len(lfb)]
+		let buft = bufn == '' ? '[No Name]' : fnamemodify(bufn, ':t')
+		wh linenr <= len_lfb
+			let lfb[linenr - 1] .= '	|'.buft.'|'.bufnr.':'.linenr.'|'
+			let linenr += 1
+		endw
+		cal extend(lines, filter(lfb, 'v:val !~ ''^\s*\t|[^|]\+|\d\+:\d\+|$'''))
+	endfo
+	cal s:syntax()
+	retu lines
+endf
+
+fu! ctrlp#line#accept(dict)
+	let mode = a:dict['action']
+	let str = a:dict['line']
+	let input = a:dict['input']
+	let info = matchlist(str, '\t|[^|]\+|\(\d\+\):\(\d\+\)|$')
+	let bufnr = str2nr(get(info, 1))
+	if bufnr
+		cal ctrlp#acceptfile(mode, bufnr, get(info, 2))
+		if !empty(input)
+			let @/ = input
+			call search(input, 'c')
+			call histadd("search", input)
+		en
+	en
+endf
+
+fu! ctrlp#line#cmd(mode, ...)
+	let s:lnmode = a:mode
+	if a:0 && !empty(a:1)
+		let s:lnmode = 0
+		let bname = a:1 =~# '^%$\|^#\d*$' ? expand(a:1) : a:1
+		let s:bufnr = bufnr('^'.fnamemodify(bname, ':p').'$')
+	en
+	retu s:id
+endf
+"}}}
+
+" vim:fen:fdm=marker:fmr={{{,}}}:fdl=0:fdc=1:ts=2:sw=2:sts=2

+ 88 - 0
vim/plugged/ctrlp.vim/autoload/ctrlp/mixed.vim

@@ -0,0 +1,88 @@
+" =============================================================================
+" File:          autoload/ctrlp/mixed.vim
+" Description:   Mixing Files + MRU + Buffers
+" Author:        Kien Nguyen <github.com/kien>
+" =============================================================================
+
+" Init {{{1
+if exists('g:loaded_ctrlp_mixed') && g:loaded_ctrlp_mixed
+	fini
+en
+let [g:loaded_ctrlp_mixed, g:ctrlp_newmix] = [1, 0]
+
+cal add(g:ctrlp_ext_vars, {
+	\ 'init': 'ctrlp#mixed#init(s:compare_lim)',
+	\ 'accept': 'ctrlp#acceptfile',
+	\ 'lname': 'fil + mru + buf',
+	\ 'sname': 'mix',
+	\ 'type': 'path',
+	\ 'opmul': 1,
+	\ 'specinput': 1,
+	\ })
+
+let s:id = g:ctrlp_builtins + len(g:ctrlp_ext_vars)
+" Utilities {{{1
+fu! s:newcache(cwd)
+	if g:ctrlp_newmix || !has_key(g:ctrlp_allmixes, 'data') | retu 1 | en
+	retu g:ctrlp_allmixes['cwd'] != a:cwd
+		\ || g:ctrlp_allmixes['filtime'] < getftime(ctrlp#utils#cachefile())
+		\ || g:ctrlp_allmixes['mrutime'] < getftime(ctrlp#mrufiles#cachefile())
+		\ || g:ctrlp_allmixes['bufs'] < len(ctrlp#mrufiles#bufs())
+endf
+
+fu! s:getnewmix(cwd, clim)
+	if g:ctrlp_newmix
+		cal ctrlp#mrufiles#refresh('raw')
+		let g:ctrlp_newcache = 1
+	en
+	let g:ctrlp_lines = copy(ctrlp#files())
+	cal ctrlp#progress('Mixing...')
+	let mrufs = copy(ctrlp#mrufiles#list('raw'))
+	if exists('+ssl') && &ssl
+		cal map(mrufs, 'tr(v:val, "\\", "/")')
+	en
+	let allbufs = map(ctrlp#buffers(), 'fnamemodify(v:val, ":p")')
+	let [bufs, ubufs] = [[], []]
+	for each in allbufs
+		cal add(filereadable(each) ? bufs : ubufs, each)
+	endfo
+	let mrufs = bufs + filter(mrufs, 'index(bufs, v:val) < 0')
+	if len(mrufs) > len(g:ctrlp_lines)
+		cal filter(mrufs, 'stridx(v:val, a:cwd)')
+	el
+		let cwd_mrufs = filter(copy(mrufs), '!stridx(v:val, a:cwd)')
+		let cwd_mrufs = ctrlp#rmbasedir(cwd_mrufs)
+		for each in cwd_mrufs
+			let id = index(g:ctrlp_lines, each)
+			if id >= 0 | cal remove(g:ctrlp_lines, id) | en
+		endfo
+	en
+	let mrufs += ubufs
+	cal map(mrufs, 'fnamemodify(v:val, ":.")')
+	let g:ctrlp_lines = len(mrufs) > len(g:ctrlp_lines)
+		\ ? g:ctrlp_lines + mrufs : mrufs + g:ctrlp_lines
+	if len(g:ctrlp_lines) <= a:clim
+		cal sort(g:ctrlp_lines, 'ctrlp#complen')
+	en
+	let g:ctrlp_allmixes = { 'filtime': getftime(ctrlp#utils#cachefile()),
+		\ 'mrutime': getftime(ctrlp#mrufiles#cachefile()), 'cwd': a:cwd,
+		\ 'bufs': len(ctrlp#mrufiles#bufs()), 'data': g:ctrlp_lines }
+endf
+" Public {{{1
+fu! ctrlp#mixed#init(clim)
+	let cwd = getcwd()
+	if s:newcache(cwd)
+		cal s:getnewmix(cwd, a:clim)
+	el
+		let g:ctrlp_lines = g:ctrlp_allmixes['data']
+	en
+	let g:ctrlp_newmix = 0
+	retu g:ctrlp_lines
+endf
+
+fu! ctrlp#mixed#id()
+	retu s:id
+endf
+"}}}
+
+" vim:fen:fdm=marker:fmr={{{,}}}:fdl=0:fdc=1:ts=2:sw=2:sts=2

+ 158 - 0
vim/plugged/ctrlp.vim/autoload/ctrlp/mrufiles.vim

@@ -0,0 +1,158 @@
+" =============================================================================
+" File:          autoload/ctrlp/mrufiles.vim
+" Description:   Most Recently Used Files extension
+" Author:        Kien Nguyen <github.com/kien>
+" =============================================================================
+
+" Static variables {{{1
+let [s:mrbs, s:mrufs] = [[], []]
+let s:mruf_map_string = '!stridx(v:val, cwd) ? strpart(v:val, idx) : v:val'
+
+fu! ctrlp#mrufiles#opts()
+	let [pref, opts] = ['g:ctrlp_mruf_', {
+		\ 'max': ['s:max', 250],
+		\ 'include': ['s:in', ''],
+		\ 'exclude': ['s:ex', ''],
+		\ 'case_sensitive': ['s:cseno', 1],
+		\ 'relative': ['s:re', 0],
+		\ 'save_on_update': ['s:soup', 1],
+		\ 'map_string': ['g:ctrlp_mruf_map_string', s:mruf_map_string],
+		\ }]
+	for [ke, va] in items(opts)
+		let [{va[0]}, {pref.ke}] = [pref.ke, exists(pref.ke) ? {pref.ke} : va[1]]
+	endfo
+endf
+cal ctrlp#mrufiles#opts()
+" Utilities {{{1
+fu! s:excl(fn)
+	retu !empty({s:ex}) && a:fn =~# {s:ex}
+endf
+
+fu! s:mergelists()
+	let diskmrufs = ctrlp#utils#readfile(ctrlp#mrufiles#cachefile())
+	cal filter(diskmrufs, 'index(s:mrufs, v:val) < 0')
+	let mrufs = s:mrufs + diskmrufs
+	retu s:chop(mrufs)
+endf
+
+fu! s:chop(mrufs)
+	if len(a:mrufs) > {s:max} | cal remove(a:mrufs, {s:max}, -1) | en
+	retu a:mrufs
+endf
+
+fu! s:reformat(mrufs, ...)
+	let cwd = getcwd()
+	let cwd .= cwd !~ '[\/]$' ? ctrlp#utils#lash() : ''
+	if {s:re}
+		let cwd = exists('+ssl') ? tr(cwd, '/', '\') : cwd
+		cal filter(a:mrufs, '!stridx(v:val, cwd)')
+	en
+	if a:0 && a:1 == 'raw' | retu a:mrufs | en
+	let idx = strlen(cwd)
+	if exists('+ssl') && &ssl
+		let cwd = tr(cwd, '\', '/')
+		cal map(a:mrufs, 'tr(v:val, "\\", "/")')
+	en
+	retu map(a:mrufs, g:ctrlp_mruf_map_string)
+endf
+
+fu! s:record(bufnr)
+	if s:locked | retu | en
+	let bufnr = a:bufnr + 0
+	let bufname = bufname(bufnr)
+	if bufnr > 0 && !empty(bufname)
+		cal filter(s:mrbs, 'v:val != bufnr')
+		cal insert(s:mrbs, bufnr)
+		cal s:addtomrufs(bufname)
+	en
+endf
+
+fu! s:addtomrufs(fname)
+	let fn = fnamemodify(a:fname, get(g:, 'ctrlp_tilde_homedir', 0) ? ':p:~' : ':p')
+	let fn = exists('+ssl') ? tr(fn, '/', '\') : fn
+	let abs_fn = fnamemodify(fn,':p')
+	if ( !empty({s:in}) && fn !~# {s:in} ) || ( !empty({s:ex}) && fn =~# {s:ex} )
+		\ || !empty(getbufvar('^' . abs_fn . '$', '&bt')) || !filereadable(abs_fn)
+		retu
+	en
+	let idx = index(s:mrufs, fn, 0, !{s:cseno})
+	if idx
+		cal filter(s:mrufs, 'v:val !='.( {s:cseno} ? '#' : '?' ).' fn')
+		cal insert(s:mrufs, fn)
+		if {s:soup} && idx < 0
+			cal s:savetofile(s:mergelists())
+		en
+	en
+endf
+
+fu! s:savetofile(mrufs)
+	cal ctrlp#utils#writecache(a:mrufs, s:cadir, s:cafile)
+endf
+" Public {{{1
+fu! ctrlp#mrufiles#refresh(...)
+	let mrufs = s:mergelists()
+	cal filter(mrufs, '!empty(ctrlp#utils#glob(v:val, 1)) && !s:excl(v:val)')
+	if exists('+ssl')
+		cal map(mrufs, 'tr(v:val, "/", "\\")')
+		cal map(s:mrufs, 'tr(v:val, "/", "\\")')
+		let cond = 'count(mrufs, v:val, !{s:cseno}) == 1'
+		cal filter(mrufs, cond)
+		cal filter(s:mrufs, cond)
+	en
+	cal s:savetofile(mrufs)
+	retu a:0 && a:1 == 'raw' ? [] : s:reformat(mrufs)
+endf
+
+fu! ctrlp#mrufiles#remove(files)
+	let mrufs = []
+	if a:files != []
+		let mrufs = s:mergelists()
+		let cond = 'index(a:files, v:val, 0, !{s:cseno}) < 0'
+		cal filter(mrufs, cond)
+		cal filter(s:mrufs, cond)
+	en
+	cal s:savetofile(mrufs)
+	retu s:reformat(mrufs)
+endf
+
+fu! ctrlp#mrufiles#add(fn)
+	if !empty(a:fn)
+		cal s:addtomrufs(a:fn)
+	en
+endf
+
+fu! ctrlp#mrufiles#list(...)
+	retu a:0 ? a:1 == 'raw' ? s:reformat(s:mergelists(), a:1) : 0
+		\ : s:reformat(s:mergelists())
+endf
+
+fu! ctrlp#mrufiles#bufs()
+	retu s:mrbs
+endf
+
+fu! ctrlp#mrufiles#tgrel()
+	let {s:re} = !{s:re}
+endf
+
+fu! ctrlp#mrufiles#cachefile()
+	if !exists('s:cadir') || !exists('s:cafile')
+		let s:cadir = ctrlp#utils#cachedir().ctrlp#utils#lash().'mru'
+		let s:cafile = s:cadir.ctrlp#utils#lash().'cache.txt'
+	en
+	retu s:cafile
+endf
+
+fu! ctrlp#mrufiles#init()
+	if !has('autocmd') | retu | en
+	let s:locked = 0
+	aug CtrlPMRUF
+		au!
+		au BufWinEnter,BufWinLeave,BufWritePost * cal s:record(expand('<abuf>', 1))
+		au QuickFixCmdPre  *vimgrep* let s:locked = 1
+		au QuickFixCmdPost *vimgrep* let s:locked = 0
+		au VimLeavePre * cal s:savetofile(s:mergelists())
+	aug END
+endf
+"}}}
+
+" vim:fen:fdm=marker:fmr={{{,}}}:fdl=0:fdc=1:ts=2:sw=2:sts=2

+ 59 - 0
vim/plugged/ctrlp.vim/autoload/ctrlp/quickfix.vim

@@ -0,0 +1,59 @@
+" =============================================================================
+" File:          autoload/ctrlp/quickfix.vim
+" Description:   Quickfix extension
+" Author:        Kien Nguyen <github.com/kien>
+" =============================================================================
+
+" Init {{{1
+if exists('g:loaded_ctrlp_quickfix') && g:loaded_ctrlp_quickfix
+	fini
+en
+let g:loaded_ctrlp_quickfix = 1
+
+cal add(g:ctrlp_ext_vars, {
+	\ 'init': 'ctrlp#quickfix#init()',
+	\ 'accept': 'ctrlp#quickfix#accept',
+	\ 'lname': 'quickfix',
+	\ 'sname': 'qfx',
+	\ 'type': 'line',
+	\ 'sort': 0,
+	\ 'nolim': 1,
+	\ })
+
+let s:id = g:ctrlp_builtins + len(g:ctrlp_ext_vars)
+
+fu! s:lineout(dict)
+	retu printf('%s|%d:%d| %s', bufname(a:dict['bufnr']), a:dict['lnum'],
+		\ a:dict['col'], matchstr(a:dict['text'], '\s*\zs.*\S'))
+endf
+" Utilities {{{1
+fu! s:syntax()
+	if !ctrlp#nosy()
+		cal ctrlp#hicheck('CtrlPqfLineCol', 'Search')
+		sy match CtrlPqfLineCol '|\zs\d\+:\d\+\ze|'
+	en
+endf
+" Public {{{1
+fu! ctrlp#quickfix#init()
+	cal s:syntax()
+	retu map(getqflist(), 's:lineout(v:val)')
+endf
+
+fu! ctrlp#quickfix#accept(mode, str)
+	let vals = matchlist(a:str, '^\([^|]\+\ze\)|\(\d\+\):\(\d\+\)|')
+	if vals == [] || vals[1] == '' | retu | en
+	cal ctrlp#acceptfile(a:mode, vals[1])
+	let cur_pos = getpos('.')[1:2]
+	if cur_pos != [1, 1] && cur_pos != map(vals[2:3], 'str2nr(v:val)')
+		mark '
+	en
+	cal cursor(vals[2], vals[3])
+	sil! norm! zvzz
+endf
+
+fu! ctrlp#quickfix#id()
+	retu s:id
+endf
+"}}}
+
+" vim:fen:fdm=marker:fmr={{{,}}}:fdl=0:fdc=1:ts=2:sw=2:sts=2

+ 59 - 0
vim/plugged/ctrlp.vim/autoload/ctrlp/rtscript.vim

@@ -0,0 +1,59 @@
+" =============================================================================
+" File:          autoload/ctrlp/rtscript.vim
+" Description:   Runtime scripts extension
+" Author:        Kien Nguyen <github.com/kien>
+" =============================================================================
+
+" Init {{{1
+if exists('g:loaded_ctrlp_rtscript') && g:loaded_ctrlp_rtscript
+	fini
+en
+let [g:loaded_ctrlp_rtscript, g:ctrlp_newrts] = [1, 0]
+
+cal add(g:ctrlp_ext_vars, {
+	\ 'init': 'ctrlp#rtscript#init(s:caching)',
+	\ 'accept': 'ctrlp#acceptfile',
+	\ 'lname': 'runtime scripts',
+	\ 'sname': 'rts',
+	\ 'type': 'path',
+	\ 'opmul': 1,
+	\ })
+
+let s:id = g:ctrlp_builtins + len(g:ctrlp_ext_vars)
+
+let s:filecounts = {}
+" Utilities {{{1
+fu! s:nocache()
+	retu g:ctrlp_newrts ||
+		\ !s:caching || ( s:caching > 1 && get(s:filecounts, s:cwd) < s:caching )
+endf
+" Public {{{1
+fu! ctrlp#rtscript#init(caching)
+	let [s:caching, s:cwd] = [a:caching, getcwd()]
+	if s:nocache() ||
+		\ !( exists('g:ctrlp_rtscache') && g:ctrlp_rtscache[0] == &rtp )
+		sil! cal ctrlp#progress('Indexing...')
+		let entries = split(globpath(ctrlp#utils#fnesc(&rtp, 'g'), '**/*.*'), "\n")
+		cal filter(entries, 'count(entries, v:val) == 1')
+		let [entries, echoed] = [ctrlp#dirnfile(entries)[1], 1]
+	el
+		let [entries, results] = g:ctrlp_rtscache[2:3]
+	en
+	if s:nocache() ||
+		\ !( exists('g:ctrlp_rtscache') && g:ctrlp_rtscache[:1] == [&rtp, s:cwd] )
+		if !exists('echoed')
+			sil! cal ctrlp#progress('Processing...')
+		en
+		let results = map(copy(entries), 'fnamemodify(v:val, '':.'')')
+	en
+	let [g:ctrlp_rtscache, g:ctrlp_newrts] = [[&rtp, s:cwd, entries, results], 0]
+	cal extend(s:filecounts, { s:cwd : len(results) })
+	retu results
+endf
+
+fu! ctrlp#rtscript#id()
+	retu s:id
+endf
+"}}}
+
+" vim:fen:fdm=marker:fmr={{{,}}}:fdl=0:fdc=1:ts=2:sw=2:sts=2

+ 150 - 0
vim/plugged/ctrlp.vim/autoload/ctrlp/tag.vim

@@ -0,0 +1,150 @@
+" =============================================================================
+" File:          autoload/ctrlp/tag.vim
+" Description:   Tag file extension
+" Author:        Kien Nguyen <github.com/kien>
+" =============================================================================
+
+" Init {{{1
+if exists('g:loaded_ctrlp_tag') && g:loaded_ctrlp_tag
+	fini
+en
+let g:loaded_ctrlp_tag = 1
+
+cal add(g:ctrlp_ext_vars, {
+	\ 'init': 'ctrlp#tag#init()',
+	\ 'accept': 'ctrlp#tag#accept',
+	\ 'lname': 'tags',
+	\ 'sname': 'tag',
+	\ 'enter': 'ctrlp#tag#enter()',
+	\ 'type': 'tabs',
+	\ })
+
+let s:id = g:ctrlp_builtins + len(g:ctrlp_ext_vars)
+" Utilities {{{1
+fu! s:findcount(str, tgaddr)
+	let [tg, ofname] = split(a:str, '\t\+\ze[^\t]\+$')
+	let tgs = taglist('^'.tg.'$')
+	if len(tgs) < 2
+		retu [0, 0, 0, 0]
+	en
+	let bname = fnamemodify(bufname('%'), ':p')
+	let fname = expand(fnamemodify(simplify(ofname), ':s?^[.\/]\+??:p:.'), 1)
+	let [fnd, cnt, pos, ctgs, otgs] = [0, 0, 0, [], []]
+	for tgi in tgs
+		let lst = bname == fnamemodify(tgi["filename"], ':p') ? 'ctgs' : 'otgs'
+		cal call('add', [{lst}, tgi])
+	endfo
+	let ntgs = ctgs + otgs
+	for tgi in ntgs
+		let cnt += 1
+		let fulname = fnamemodify(tgi["filename"], ':p')
+		if stridx(fulname, fname) >= 0
+			\ && strlen(fname) + stridx(fulname, fname) == strlen(fulname)
+			let fnd += 1
+			let pos = cnt
+		en
+	endfo
+	let cnt = 0
+	for tgi in ntgs
+		let cnt += 1
+		if tgi["filename"] == ofname
+			if a:tgaddr != ""
+				if a:tgaddr == tgi["cmd"]
+					let [fnd, pos] = [0, cnt]
+				en
+			else
+				let [fnd, pos] = [0, cnt]
+			en
+		en
+	endfo
+	retu [1, fnd, pos, len(ctgs)]
+endf
+
+fu! s:filter(tags)
+	let nr = 0
+	wh 0 < 1
+		if a:tags == [] | brea | en
+		if a:tags[nr] =~ '^!' && a:tags[nr] !~# '^!_TAG_'
+			let nr += 1
+			con
+		en
+		if a:tags[nr] =~# '^!_TAG_' && len(a:tags) > nr
+			cal remove(a:tags, nr)
+		el
+			brea
+		en
+	endw
+	retu a:tags
+endf
+
+fu! s:syntax()
+	if !ctrlp#nosy()
+		cal ctrlp#hicheck('CtrlPTabExtra', 'Comment')
+		sy match CtrlPTabExtra '\zs\t.*\ze$'
+	en
+endf
+" Public {{{1
+fu! ctrlp#tag#init()
+	if empty(s:tagfiles) | retu [] | en
+	let g:ctrlp_alltags = []
+	let tagfiles = sort(filter(s:tagfiles, 'count(s:tagfiles, v:val) == 1'))
+	for each in tagfiles
+		let alltags = s:filter(ctrlp#utils#readfile(each))
+		cal extend(g:ctrlp_alltags, alltags)
+	endfo
+	cal s:syntax()
+	retu g:ctrlp_alltags
+endf
+
+fu! ctrlp#tag#accept(mode, str)
+	cal ctrlp#exit()
+	let tgaddr = matchstr(a:str, '^[^\t]\+\t\+[^\t]\+\t\zs[^\t]\{-1,}\ze\%(;"\)\?\t')
+	let str = matchstr(a:str, '^[^\t]\+\t\+[^\t]\+\ze\t')
+	let [tg, fdcnt] = [split(str, '^[^\t]\+\zs\t')[0], s:findcount(str, tgaddr)]
+	let cmds = {
+		\ 't': ['tab sp', 'tab stj'],
+		\ 'h': ['sp', 'stj'],
+		\ 'v': ['vs', 'vert stj'],
+		\ 'e': ['', 'tj'],
+		\ }
+	let utg = fdcnt[3] < 2 && fdcnt[0] == 1 && fdcnt[1] == 1
+	let cmd = !fdcnt[0] || utg ? cmds[a:mode][0] : cmds[a:mode][1]
+	let cmd = a:mode == 'e' && ctrlp#modfilecond(!&aw)
+		\ ? ( cmd == 'tj' ? 'stj' : 'sp' ) : cmd
+	let cmd = a:mode == 't' ? ctrlp#tabcount().cmd : cmd
+	if !fdcnt[0] || utg
+		if cmd != ''
+			exe cmd
+		en
+		if exists('&cst')
+			let save_cst = &cst
+			set cst&
+		en
+		cal feedkeys(":".( utg ? fdcnt[2] : "" )."ta ".tg."\r", 'nt')
+		if exists('&cst')
+			let &cst = save_cst
+		en
+	el
+		let ext = ""
+		if fdcnt[1] < 2 && fdcnt[2]
+			let [sav_more, &more] = [&more, 0]
+			let ext = fdcnt[2]."\r".":let &more = ".sav_more."\r"
+		en
+		cal feedkeys(":".cmd." ".tg."\r".ext, 'nt')
+	en
+	cal feedkeys('zvzz', 'nt')
+	cal ctrlp#setlcdir()
+endf
+
+fu! ctrlp#tag#id()
+	retu s:id
+endf
+
+fu! ctrlp#tag#enter()
+	let tfs = get(g:, 'ctrlp_custom_tag_files', tagfiles())
+	let s:tagfiles = type(tfs) == 3 && tfs != [] ? filter(map(tfs, 'fnamemodify(v:val, ":p")'),
+		\ 'filereadable(v:val)') : []
+endf
+"}}}
+
+" vim:fen:fdm=marker:fmr={{{,}}}:fdl=0:fdc=1:ts=2:sw=2:sts=2

+ 154 - 0
vim/plugged/ctrlp.vim/autoload/ctrlp/undo.vim

@@ -0,0 +1,154 @@
+" =============================================================================
+" File:          autoload/ctrlp/undo.vim
+" Description:   Undo extension
+" Author:        Kien Nguyen <github.com/kien>
+" =============================================================================
+
+" Init {{{1
+if ( exists('g:loaded_ctrlp_undo') && g:loaded_ctrlp_undo )
+	fini
+en
+let g:loaded_ctrlp_undo = 1
+
+cal add(g:ctrlp_ext_vars, {
+	\ 'init': 'ctrlp#undo#init()',
+	\ 'accept': 'ctrlp#undo#accept',
+	\ 'lname': 'undo',
+	\ 'sname': 'udo',
+	\ 'enter': 'ctrlp#undo#enter()',
+	\ 'exit': 'ctrlp#undo#exit()',
+	\ 'type': 'line',
+	\ 'sort': 0,
+	\ 'nolim': 1,
+	\ })
+
+let s:id = g:ctrlp_builtins + len(g:ctrlp_ext_vars)
+
+let s:text = map(['second', 'seconds', 'minutes', 'hours', 'days', 'weeks',
+	\ 'months', 'years'], '" ".v:val." ago"')
+" Utilities {{{1
+fu! s:getundo()
+	if exists('*undotree')
+		\ && ( v:version > 703 || ( v:version == 703 && has('patch005') ) )
+		retu [1, undotree()]
+	el
+		redi => result
+		sil! undol
+		redi END
+		retu [0, split(result, "\n")[1:]]
+	en
+endf
+
+fu! s:flatten(tree, cur)
+	let flatdict = {}
+	for each in a:tree
+		let saved = has_key(each, 'save') ? 'saved' : ''
+		let current = each['seq'] == a:cur ? 'current' : ''
+		cal extend(flatdict, { each['seq'] : [each['time'], saved, current] })
+		if has_key(each, 'alt')
+			cal extend(flatdict, s:flatten(each['alt'], a:cur))
+		en
+	endfo
+	retu flatdict
+endf
+
+fu! s:elapsed(nr)
+	let [text, time] = [s:text, localtime() - a:nr]
+	let mins = time / 60
+	let hrs  = time / 3600
+	let days = time / 86400
+	let wks  = time / 604800
+	let mons = time / 2592000
+	let yrs  = time / 31536000
+	if yrs > 1
+		retu yrs.text[7]
+	elsei mons > 1
+		retu mons.text[6]
+	elsei wks > 1
+		retu wks.text[5]
+	elsei days > 1
+		retu days.text[4]
+	elsei hrs > 1
+		retu hrs.text[3]
+	elsei mins > 1
+		retu mins.text[2]
+	elsei time == 1
+		retu time.text[0]
+	elsei time < 120
+		retu time.text[1]
+	en
+endf
+
+fu! s:syntax()
+	if ctrlp#nosy() | retu | en
+	for [ke, va] in items({'T': 'Directory', 'Br': 'Comment', 'Nr': 'String',
+		\ 'Sv': 'Comment', 'Po': 'Title'})
+		cal ctrlp#hicheck('CtrlPUndo'.ke, va)
+	endfo
+	sy match CtrlPUndoT '\v\d+ \zs[^ ]+\ze|\d+:\d+:\d+'
+	sy match CtrlPUndoBr '\[\|\]'
+	sy match CtrlPUndoNr '\[\d\+\]' contains=CtrlPUndoBr
+	sy match CtrlPUndoSv 'saved'
+	sy match CtrlPUndoPo 'current'
+endf
+
+fu! s:dict2list(dict)
+	for ke in keys(a:dict)
+		let a:dict[ke][0] = s:elapsed(a:dict[ke][0])
+	endfo
+	retu map(keys(a:dict), 'eval(''[v:val, a:dict[v:val]]'')')
+endf
+
+fu! s:compval(...)
+	retu a:2[0] - a:1[0]
+endf
+
+fu! s:format(...)
+	let saved = !empty(a:1[1][1]) ? ' '.a:1[1][1] : ''
+	let current = !empty(a:1[1][2]) ? ' '.a:1[1][2] : ''
+	retu a:1[1][0].' ['.a:1[0].']'.saved.current
+endf
+
+fu! s:formatul(...)
+	let parts = matchlist(a:1,
+		\ '\v^\s+(\d+)\s+\d+\s+([^ ]+\s?[^ ]+|\d+\s\w+\s\w+)(\s*\d*)$')
+	retu parts == [] ? '----'
+		\ : parts[2].' ['.parts[1].']'.( parts[3] != '' ? ' saved' : '' )
+endf
+" Public {{{1
+fu! ctrlp#undo#init()
+	let entries = s:undos[0] ? s:undos[1]['entries'] : s:undos[1]
+	if empty(entries) | retu [] | en
+	if !exists('s:lines')
+		if s:undos[0]
+			let entries = s:dict2list(s:flatten(entries, s:undos[1]['seq_cur']))
+			let s:lines = map(sort(entries, 's:compval'), 's:format(v:val)')
+		el
+			let s:lines = map(reverse(entries), 's:formatul(v:val)')
+		en
+	en
+	cal s:syntax()
+	retu s:lines
+endf
+
+fu! ctrlp#undo#accept(mode, str)
+	let undon = matchstr(a:str, '\[\zs\d\+\ze\]')
+	if empty(undon) | retu | en
+	cal ctrlp#exit()
+	exe 'u' undon
+endf
+
+fu! ctrlp#undo#id()
+	retu s:id
+endf
+
+fu! ctrlp#undo#enter()
+	let s:undos = s:getundo()
+endf
+
+fu! ctrlp#undo#exit()
+	unl! s:lines
+endf
+"}}}
+
+" vim:fen:fdm=marker:fmr={{{,}}}:fdl=0:fdc=1:ts=2:sw=2:sts=2

+ 119 - 0
vim/plugged/ctrlp.vim/autoload/ctrlp/utils.vim

@@ -0,0 +1,119 @@
+" =============================================================================
+" File:          autoload/ctrlp/utils.vim
+" Description:   Utilities
+" Author:        Kien Nguyen <github.com/kien>
+" =============================================================================
+
+" Static variables {{{1
+fu! ctrlp#utils#lash()
+	retu &ssl || !exists('+ssl') ? '/' : '\'
+endf
+
+fu! s:lash(...)
+	retu ( a:0 ? a:1 : getcwd() ) !~ '[\/]$' ? s:lash : ''
+endf
+
+fu! ctrlp#utils#opts()
+	let s:lash = ctrlp#utils#lash()
+	let usrhome = $HOME . s:lash( $HOME )
+	let cahome = exists('$XDG_CACHE_HOME') ? $XDG_CACHE_HOME : usrhome.'.cache'
+	let cadir = isdirectory(usrhome.'.ctrlp_cache')
+		\ ? usrhome.'.ctrlp_cache' : cahome.s:lash(cahome).'ctrlp'
+	if exists('g:ctrlp_cache_dir')
+		let cadir = expand(g:ctrlp_cache_dir, 1)
+		if isdirectory(cadir.s:lash(cadir).'.ctrlp_cache')
+			let cadir = cadir.s:lash(cadir).'.ctrlp_cache'
+		en
+	en
+	let s:cache_dir = cadir
+endf
+cal ctrlp#utils#opts()
+
+let s:wig_cond = v:version > 702 || ( v:version == 702 && has('patch051') )
+" Files and Directories {{{1
+fu! ctrlp#utils#cachedir()
+	retu s:cache_dir
+endf
+
+fu! ctrlp#utils#cachefile(...)
+	let [tail, dir] = [a:0 == 1 ? '.'.a:1 : '', a:0 == 2 ? a:1 : getcwd()]
+	let cache_file = substitute(dir, '\([\/]\|^\a\zs:\)', '%', 'g').tail.'.txt'
+	retu a:0 == 1 ? cache_file : s:cache_dir.s:lash(s:cache_dir).cache_file
+endf
+
+fu! ctrlp#utils#readfile(file)
+	if filereadable(a:file)
+		let data = readfile(a:file)
+		if empty(data) || type(data) != 3
+			unl data
+			let data = []
+		en
+		retu data
+	en
+	retu []
+endf
+
+fu! ctrlp#utils#mkdir(dir)
+	if exists('*mkdir') && !isdirectory(a:dir)
+		sil! cal mkdir(a:dir, 'p')
+	en
+	retu a:dir
+endf
+
+fu! ctrlp#utils#writecache(lines, ...)
+	if isdirectory(ctrlp#utils#mkdir(a:0 ? a:1 : s:cache_dir))
+		sil! cal writefile(a:lines, a:0 >= 2 ? a:2 : ctrlp#utils#cachefile())
+	en
+endf
+
+fu! ctrlp#utils#glob(...)
+	let path = ctrlp#utils#fnesc(a:1, 'g')
+	retu s:wig_cond ? glob(path, a:2) : glob(path)
+endf
+
+fu! ctrlp#utils#globpath(...)
+	retu call('globpath', s:wig_cond ? a:000 : a:000[:1])
+endf
+
+if exists('*fnameescape')
+	if exists('+ssl')
+		fu! ctrlp#utils#fnesc(path, type, ...)
+			if a:type == 'c'
+				let path = escape(a:path, '%#')
+			elsei a:type == 'f'
+				let path = fnameescape(a:path)
+			elsei a:type == 'g'
+				let path = escape(a:path, '?*')
+			en
+			let path = substitute(path, '[', '[[]', 'g')
+			retu a:0 ? escape(path, a:1) : path
+		endf
+	el
+		fu! ctrlp#utils#fnesc(path, type, ...)
+			let path = fnameescape(a:path)
+			retu a:0 ? escape(path, a:1) : path
+		endf
+	en
+el
+	if exists('+ssl')
+		fu! ctrlp#utils#fnesc(path, type, ...)
+			if a:type == 'c'
+				let path = escape(a:path, '%#')
+			elsei a:type == 'f'
+				let path = escape(a:path, " \t\n%#*?|<\"")
+			elsei a:type == 'g'
+				let path = escape(a:path, '?*')
+			en
+			let path = substitute(path, '[', '[[]', 'g')
+			retu a:0 ? escape(path, a:1) : path
+		endf
+	el
+		fu! ctrlp#utils#fnesc(path, type, ...)
+			let path = escape(a:path, " \t\n*?[{`$\\%#'\"|!<")
+			retu a:0 ? escape(path, a:1) : path
+		endf
+	en
+en
+"}}}
+
+" vim:fen:fdm=marker:fmr={{{,}}}:fdl=0:fdc=1:ts=2:sw=2:sts=2

+ 1605 - 0
vim/plugged/ctrlp.vim/doc/ctrlp.cnx

@@ -0,0 +1,1605 @@
+*ctrlp.txt*       支持模糊匹配的 文件, 缓冲区, 最近最多使用, 标签, ... 检索. v1.80
+*CtrlP* *ControlP* *'ctrlp'* *'ctrl-p'*
+===============================================================================
+#                                                                             #
+#          :::::::: ::::::::::: :::::::::  :::             :::::::::          #
+#         :+:    :+:    :+:     :+:    :+: :+:             :+:    :+:         #
+#         +:+           +:+     +:+    +:+ +:+             +:+    +:+         #
+#         +#+           +#+     +#++:++#:  +#+             +#++:++#+          #
+#         +#+           +#+     +#+    +#+ +#+             +#+                #
+#         #+#    #+#    #+#     #+#    #+# #+#             #+#                #
+#          ########     ###     ###    ### ##########      ###                #
+#                                                                             #
+===============================================================================
+名词对照(译注)
+
+  buffer:缓冲区                    mapping:按键绑定
+     mru:最近最多使用               prompt:提示符面板
+     tag:标签                          tab:页签
+     tab:制表符
+
+===============================================================================
+内容                                                            *ctrlp-content*
+
+    1. 介绍.............................................|ctrlp-intro|
+    2. 选项.............................................|ctrlp-options|
+    3. 命令.............................................|ctrlp-commands|
+    4. 按键绑定.........................................|ctrlp-mappings|
+    5. 输入格式.........................................|ctrlp-input-formats|
+    6. 扩展.............................................|ctrlp-extensions|
+
+===============================================================================
+介绍                                                              *ctrlp-intro*
+
+带有直观接口的全路径模糊文件, 缓冲区, 最近最多使用, 标签, ... 检索。
+使用纯净的Vimscript编写,可以运行在MacVim,gVim和版本号7.0以上的Vim中。
+全面支持Vim的正则表达式 |regexp| 作为搜索模式,内建最近最多使用文件监测,
+项目根目录定位和更多特性。
+
+开启可选的扩展(标记,目录,rtscript...),参考 |ctrlp-extensions| 。
+
+===============================================================================
+OPTIONS                                                         *ctrlp-options*
+
+总览:~
+
+  |loaded_ctrlp|................禁用插件。
+  |ctrlp_map|...................默认按键绑定。
+  |ctrlp_cmd|...................默认按键绑定调用的命令。
+  |ctrlp_by_filename|...........是否默认开启文件名模式。
+  |ctrlp_regexp|................是否默认开启正则表达式模式。
+  |ctrlp_match_window|..........匹配窗口的显示位置。
+  |ctrlp_switch_buffer|.........如果文件已在缓冲区中打开,跳转到该打开的缓冲区。
+  |ctrlp_reuse_window|..........重用特殊窗口(帮助、快速修复 |quickfix| ,等等)。
+  |ctrlp_tabpage_position|......新标签页出现的位置。
+  |ctrlp_working_path_mode|.....如何设置CtrlP的本地工作目录。
+  |ctrlp_root_markers|..........额外的,高优先级的根目录标识。
+  |ctrlp_use_caching|...........针对每个会话,设置是否开启缓存的。
+  |ctrlp_clear_cache_on_exit|...退出Vim后是否保留缓存。
+  |ctrlp_cache_dir|.............缓存目录的位置。
+  |ctrlp_show_hidden|...........是否显示隐藏文件和隐藏文件夹。
+  |ctrlp_custom_ignore|.........使用 |globpath()| 时自定义忽略的文件或目录。
+  |ctrlp_max_files|.............扫描文件的最大数目。
+  |ctrlp_max_depth|.............扫描目录的最大层数。
+  |ctrlp_user_command|..........使用外部的扫描工具。
+  |ctrlp_max_history|...........历史提示符面板中保留的最大条目数。
+  |ctrlp_open_new_file|.........由<c-y>创建的文件的打开方式。
+  |ctrlp_open_multiple_files|...由<c-z>选择的文件的打开方式。
+  |ctrlp_arg_map|...............是否拦截<c-y> 和 <c-o> 命令。
+  |ctrlp_follow_symlinks|.......是否跟随链接。
+  |ctrlp_lazy_update|...........停止输入时才更新。
+  |ctrlp_default_input|.........为提示符面板提供一个初始字符串。
+  |ctrlp_abbrev|................输入缩写。
+  |ctrlp_key_loop|..............为多字节输入开启输入事件循环。
+  |ctrlp_prompt_mappings|.......改变提示符面板内部的按键绑定。
+  |ctrlp_line_prefix|...........ctrlp 窗口中为每一行添加前缀。
+  |ctrlp_open_single_match|.....当只有一个候选时自动接受。
+  |ctrlp_brief_prompt|..........提示符为空的时候使用<bs>退出 CtrlP。
+  |ctrlp_match_current_file|....在匹配条目中包含当前文件。
+  |ctrlp_types|.................內建类型的名称。
+
+  最近最多使用模式:
+  |ctrlp_mruf_max|..............记录的最近最多使用的最大数据。
+  |ctrlp_mruf_exclude|..........需要被排除的文件。
+  |ctrlp_mruf_include|..........需要被记录的文件。
+  |ctrlp_mruf_relative|.........只显示在工作目录内的最近最多使用。
+  |ctrlp_tilde_homedir|.........保存 home 目录中的 MRU 的目录路径为波浪扩展的形式 ~/。
+  |ctrlp_mruf_default_order|....禁用排序。
+  |ctrlp_mruf_case_sensitive|...最近最多使用文件是否大小写敏感。
+  |ctrlp_mruf_save_on_update|...只要有一个新的条目添加,就保存到磁盘。
+
+  缓冲模式:
+  |ctrlp_bufname_mod|...........文件名部分修饰符。
+  |ctrlp_bufpath_mod|...........文件路径部分修饰符。
+
+  缓冲标签模式: (开启此模式,参考 |ctrlp-extensions| )
+  |g:ctrlp_buftag_ctags_bin|....兼容的ctags二进制程序的位置。
+  |g:ctrlp_buftag_systemenc|....ctags命令的编码。
+  |g:ctrlp_buftag_types|........添加新的文件类型和设置命令行参数。
+
+  高级选项:
+  |ctrlp_open_func|.............使用自定义的打开文件的函数。
+  |ctrlp_status_func|...........改变CtrlP的两个状态栏
+  |ctrlp_buffer_func|...........在CtrlP的缓冲区内调用自定义的函数。
+  |ctrlp_match_func|............替换内建的匹配算法。
+
+-------------------------------------------------------------------------------
+详细描述和默认值:~
+
+                                                                *'g:ctrlp_map'*
+使用该选项来改变普通模式 |Normal| 下调用CtrlP的按键绑定: >
+  let g:ctrlp_map = '<c-p>'
+<
+
+                                                                *'g:ctrlp_cmd'*
+
+设置当按下上面的按键绑定时,使用的默认打开命令: >
+  let g:ctrlp_cmd = 'CtrlP'
+<
+
+                                                             *'g:loaded_ctrlp'*
+使用该选项完全禁用插件: >
+  let g:loaded_ctrlp = 1
+<
+
+                                                        *'g:ctrlp_by_filename'*
+修改该选项为1,设置默认为按文件名搜索(否则为全路径): >
+  let g:ctrlp_by_filename = 0
+<
+在提示符面板内可以使用 <c-d> 来切换。
+
+                                                             *'g:ctrlp_regexp'*
+修改该选项为1,设置默认为使用正则表达式匹配。: >
+  let g:ctrlp_regexp = 0
+<
+在提示符面板内可以使用 <c-r> 来切换。
+
+                                                       *'g:ctrlp_match_window'*
+改变匹配窗口的位置,结果的排列顺序,最小和最大高度: >
+  let g:ctrlp_match_window = ''
+<
+例子: >
+  let g:ctrlp_match_window = 'bottom,order:btt,min:1,max:10,results:10'
+<
+位置: (默认:底部)
+  top - 在屏幕顶部显示匹配窗口。
+  bottom - 在屏幕底部显示匹配窗口。
+
+结果的排列顺序: (默认: btt)
+  order:ttb - 从顶部到底部。
+  order:btt - 从底部到顶部。
+
+最小和最大高度:
+  min:{n} - 最少显示 {n} 行 (默认: 1).
+  max:{n} - 最多显示 {n} 行 (默认: 10).
+
+结果集的最大数目:
+  results:{n} - 列出最多 {n} 条结果 (默认: 和最大高度同步).
+                0代表没有限制。
+
+注意: 当一个设置项没有被设置时,将会使用默认值。
+
+                                                      *'g:ctrlp_switch_buffer'*
+当尝试打开一个文件时,如果它已经在某个窗口被打开,CtrlP会尝试跳到那个窗口,而
+不是新打开一个实例。: >
+  let g:ctrlp_switch_buffer = 'Et'
+<
+  e - 当 <cr> 被按下时跳转,但是只跳转到当前页签内的窗口内。
+  t - 当 <c-t> 被按下时跳转, 但是只跳转到其它标签的窗口内。
+  v - 类似 "e", 但是当 <c-v> 被按下时跳转。
+  h - 类似 "e", 但是当 <c-x> 被按下时跳转。
+  E, T, V, H - 行为类似 "e", "t", "v", and "h", 但是跳转到任何地方的窗口中。
+  0 或者 <empty> - 禁用这项功能。
+
+                                                       *'g:ctrlp_reuse_window'*
+当使用 <cr> 打开新文件时,CtrlP避免在插件,帮助,快速修复创建的窗口中打开该文
+件。使用该选项来设置一些例外: >
+  let g:ctrlp_reuse_window = 'netrw'
+<
+接受的值可以为特殊缓冲区的名字的一部分,文件类型或者缓冲区类型使用正则表达式来
+指定匹配模式。
+例子: >
+  let g:ctrlp_reuse_window = 'netrw\|help\|quickfix'
+<
+
+                                                   *'g:ctrlp_tabpage_position'*
+新打开页签的位置: >
+  let g:ctrlp_tabpage_position = 'ac'
+<
+  a - 后面。
+  b - 前面。
+  c - 当前页签。
+  l - 最后一个页签。
+  f - 第一个页签。
+
+                                                  *'g:ctrlp_working_path_mode'*
+当启动时,CtrlP依据这个变量来设置它的工作目录: >
+  let g:ctrlp_working_path_mode = 'ra'
+<
+  c - 当前文件所在的目录。
+  a - 当前文件所在的目录,除非这个目录为当前工作目录的子目录
+  r - 包含下列文件或者目录的最近的祖先目录:
+      .git .hg .svn .bzr _darcs
+  w - 用来修饰r:使用当前工作目录而不是当前文件所在目录进行查找
+  0 或者 <empty> - 禁用这项功能。
+
+注意 #1: 如果 "a" 或者 "c" 和 "r"一起被包含,当无法找到根目录时使用 "a" 或者
+"c" 的行为(作为备选)。
+
+注意 #2: 你可以在每个缓冲区内使用 |b:var| 来设置该选项。
+
+                                                       *'g:ctrlp_root_markers'*
+使用该选项来设置自定义的根目录标记作为对默认标记(.hg, .svn, .bzr, and _darcs)
+的补充。自定义的标记具有优先权: >
+  let g:ctrlp_root_markers = ['']
+<
+注意: 你可以在每个缓冲区内使用 |b:var| 来设置该选项。
+
+                                                        *'g:ctrlp_use_caching'*
+启用/禁用每个会话的缓存: >
+  let g:ctrlp_use_caching = 1
+<
+  0 - 禁用缓存。
+  1 - 启用缓存。
+  n - 当大于1时,禁用缓存,使用该数值作为重新启用缓存的限制条件。
+
+注意: 当在CtrlP中时你可以使用 <F5> 来快速的清除缓存。
+
+                                                *'g:ctrlp_clear_cache_on_exit'*
+设置该选项为0通过退出Vim时不删除缓存文件来启用跨会话的缓存: >
+  let g:ctrlp_clear_cache_on_exit = 1
+<
+
+                                                          *'g:ctrlp_cache_dir'*
+设置存储缓存文件的目录: >
+  let g:ctrlp_cache_dir = $HOME.'/.cache/ctrlp'
+<
+
+                                                        *'g:ctrlp_show_hidden'*
+如果你想CtrlP扫描隐藏文件和目录,设置该选项为1: >
+  let g:ctrlp_show_hidden = 0
+<
+注意: 当命令使用 |g:ctrlp_user_command| 定义时该选项无效。
+
+                                                      *'g:ctrlp_custom_ignore'*
+除了 |g:ctrlp_show_hidden|,你可以用这个选项设置你想在CtrlP中隐藏的文件和目录。使用正
+则表达式来指定匹配模式: >
+  let g:ctrlp_custom_ignore = ''
+<
+例子: >
+  let g:ctrlp_custom_ignore = '\v[\/]\.(git|hg|svn)$'
+  let g:ctrlp_custom_ignore = {
+    \ 'dir':  '\v[\/]\.(git|hg|svn)$',
+    \ 'file': '\v\.(exe|so|dll)$',
+    \ 'link': 'SOME_BAD_SYMBOLIC_LINKS',
+    \ }
+  let g:ctrlp_custom_ignore = {
+    \ 'file': '\v(\.cpp|\.h|\.hh|\.cxx)@<!$'
+    \ }
+  let g:ctrlp_custom_ignore = {
+    \ 'func': 'some#custom#match_function'
+    \ }
+<
+注意 #1: |g:ctrlp_custom_ignore| 在已经使用 |g:ctrlp_user_command| 的时候不会生效。
+
+注意 #2: 当改变选项的变量类型时,记得先 |:unlet| ,或者重启Vim来避免这个错误:
+"E706: Variable type mismatch" 。
+
+注意 #3: 当使用函数来忽略类型时,你必须提供CtrlP可以调用的函数的全名。建议使用
+自动加载的函数。函数必须接受两个参数,要匹配的条目和接受的类型,类型可以是目
+录、文件和链接。如果条目被忽略,函数需要返回1,反之,返回0。
+
+注意 #4: 如果设置 |g:ctrlp_use_readdir| 为0,你可以使用 Vim 的 |'wildignore'|
+来将文件和目录排除出搜索结果。
+
+                                                          *'g:ctrlp_max_files'*
+扫描文件的最大数量,设置为0时不进行限制: >
+  let g:ctrlp_max_files = 10000
+<
+注意: 当命令使用 |g:ctrlp_user_command| 定义时该选项无效。
+
+                                                          *'g:ctrlp_max_depth'*
+目录树递归的最大层数: >
+  let g:ctrlp_max_depth = 40
+<
+注意: 当命令使用 |g:ctrlp_user_command| 定义时该选项无效。
+
+                                                       *'g:ctrlp_user_command'*
+指定用来代替Vim的 |globpath()| 的外部工具来列出文件,使用 %s 代表目标目录: >
+  let g:ctrlp_user_command = ''
+<
+例子: >
+  let g:ctrlp_user_command = 'find %s -type f'       " MacOSX/Linux
+  let g:ctrlp_user_command = 'dir %s /-n /b /s /a-d' " Windows
+<
+你也可以使用 'grep', 'findstr' 或者其它东西来过滤结果集。
+例子: >
+  let g:ctrlp_user_command =
+    \ 'find %s -type f | grep -v -P "\.jpg$|/tmp/"'          " MacOSX/Linux
+  let g:ctrlp_user_command =
+    \ 'dir %s /-n /b /s /a-d | findstr /v /l ".jpg \\tmp\\"' " Windows
+<
+在扫描一个大型项目时,在仓库目录中使用版本控制系统的列出命令会加快扫描速度: >
+  let g:ctrlp_user_command = [root_marker, listing_command, fallback_command]
+  let g:ctrlp_user_command = {
+    \ 'types': {
+      \ 1: [root_marker_1, listing_command_1],
+      \ n: [root_marker_n, listing_command_n],
+      \ },
+    \ 'fallback': fallback_command,
+    \ 'ignore': 0 or 1
+    \ }
+<
+一些例子: >
+  " 单个版本控制系统,列出命令不会列出没有被追踪的文件:
+  let g:ctrlp_user_command = ['.git', 'cd %s && git ls-files']
+  let g:ctrlp_user_command = ['.hg', 'hg --cwd %s locate -I .']
+
+  " 多个版本控制系统:
+  let g:ctrlp_user_command = {
+    \ 'types': {
+      \ 1: ['.git', 'cd %s && git ls-files'],
+      \ 2: ['.hg', 'hg --cwd %s locate -I .'],
+      \ },
+    \ 'fallback': 'find %s -type f'
+    \ }
+
+  " 单个版本控制系统,列出命令列出没有被追踪的文件(较慢):
+  let g:ctrlp_user_command =
+    \ ['.git', 'cd %s && git ls-files -co --exclude-standard']
+
+  let g:ctrlp_user_command =
+    \ ['.hg', 'hg --cwd %s status -numac -I . $(hg root)'] " MacOSX/Linux
+
+  let g:ctrlp_user_command = ['.hg', 'for /f "tokens=1" %%a in (''hg root'') '
+    \ . 'do hg --cwd %s status -numac -I . %%a']           " Windows
+<
+注意 #1: 在 |Dictionary| 格式, 'fallback' 和 'ignore' 是可选的,在 |List| 格式,
+备选命令是可选的。
+
+注意 #2: 如果备选命令是空的或者属性 'fallback' 没有定义,当扫描仓库之外目录时,
+|globpath()| 会被使用。
+
+注意 #3: 除非使用了 |Dictionary| 格式并且 'ignore' 被定义并且设置为1,当这些自
+定义的命令被使用时 |wildignore| 和 |g:ctrlp_custom_ignore| 选项不会生效。没有出现
+时,'ignore' 被默认设置为0来保留使用外部命令的性能优势。
+
+注意 #4: 当改变了选项的变量类型时,记得先 |:unlet| ,或者重启Vim来避免这个错误:
+"E706: Variable type mismatch" 。
+
+注意 #5: 你可以在每个缓冲区内使用 |b:var| 来设置该选项。
+
+                                                        *'g:ctrlp_max_history'*
+你希望CtrlP记录的用户输入历史的最大数目。默认值是Vim的全局选项 |'history'| : >
+  let g:ctrlp_max_history = &history
+<
+设置为0来禁用提示符面板的历史。使用 <c-n> 和 <c-p> 来浏览历史。
+
+                                                      *'g:ctrlp_open_new_file'*
+使用该选项指定当使用 <c-y> 打开新建的文件时,文件的打开方式: >
+  let g:ctrlp_open_new_file = 'v'
+<
+  t - 在新页签中。
+  h - 在新的水平分割窗口。
+  v - 在新的竖直分割窗口。
+  r - 在当前窗口。
+
+                                                *'g:ctrlp_open_multiple_files'*
+如果非0, 会启用使用 <c-z> 和 <c-o> 打开多个文件: >
+  let g:ctrlp_open_multiple_files = 'v'
+<
+例子: >
+  let g:ctrlp_open_multiple_files = '2vjr'
+<
+对于数字:
+  - 如果指定,会被用来作为打开文件时创建的窗口或者页签的最大数量(剩余的会在隐
+    藏的缓冲区中打开)。
+  - 如果没有指定,<c-o> 会打开所有文件,每个在一个新的窗口或者页签中。
+
+对于字母:
+  t - 每个文件在一个新页签中。
+  h - 每个文件在一个新的水平分割窗口中。
+  v - 每个文件在一个新的竖直分割窗口中。
+  i - 所有的文件在隐藏的缓冲区中。
+  j - 打开以后,跳转到第一个打开的页签或者窗口。
+  r - 在当前窗口打开第一个文件,其他文件根据同时出现的"h","v"和"t"中的一个,
+      在新的分割窗口或者页签中打开。
+
+                                                            *'g:ctrlp_arg_map'*
+当设置为1时, <c-o> 和 <c-y> 会接收一个额外的键值作为参数,来覆盖默认行为: >
+  let g:ctrlp_arg_map = 0
+<
+按下 <c-o> 或者 <c-y> 会提示一次按键。按键可以是:
+  t - 在新标签页中打开。
+  h - 每个文件在一个新的水平分割窗口中。
+  v - 每个文件在一个新的竖直分割窗口中。
+  i - 所有的文件在隐藏的缓冲区中(只有 <c-o> 生效)。
+  c - 清楚标记的文件(只有 <c-o> 生效)。
+  r - 在当前窗口中打开(只有 <c-y> 生效)。
+  <esc>, <c-c>, <c-u> - 取消并且回到提示符面板。
+  <cr> - 使用 |g:ctrlp_open_new_file| 和 |g:ctrlp_open_multiple_files| 指定的默
+         认行为。
+
+
+                                                    *'g:ctrlp_follow_symlinks'*
+如果非0,当列出文件时CtrlP会跟随链接: >
+  let g:ctrlp_follow_symlinks = 0
+<
+  0 - 不要跟随链接。
+  1 - 跟随但是忽略内部循环的链接,避免重复。
+  2 - 无差别的跟随所有链接。
+
+注意: 当命令使用 |g:ctrlp_user_command| 定义时该选项无效。
+
+                                                        *'g:ctrlp_lazy_update'*
+设置为1将或更大可开启延迟更新特性:只在输入停止一个确定的时间后才更新匹配窗口:
+>
+  let g:ctrlp_lazy_update = 0
+<
+如果设置为1,在250毫秒后更新該值作為默認值。如果大于1,数字会被作为延迟时间使
+用。
+
+                                                      *'g:ctrlp_default_input'*
+设置为1将为提示符面板提供当前文件的相对路径作为种子: >
+  let g:ctrlp_default_input = 0
+<
+如果不指定1或0,如果选项的值是字符串,会被用来作为默认输入: >
+  let g:ctrlp_default_input = 'anystring'
+<
+这个选项可以和 |g:ctrlp_open_single_match| 配合使用。
+
+
+                                                 *'g:ctrlp_match_current_file'*
+在匹配条目中包含当前文件: >
+  let g:ctrlp_match_current_file = 1
+
+默认情况下,当前文件不包含在列表中。
+
+注意: 当使用 |g:ctrlp_match_func| 时不会应用这个选项。
+
+                                                              *'g:ctrlp_types'*
+通过设置这个列表变量的值来定制核心类型: >
+  let g:ctrlp_types = ['mru', 'fil']
+
+类型默认为: >
+  let g:ctrlp_types = ['fil', 'buf', 'mru'].
+
+                                                             *'g:ctrlp_abbrev'*
+定义可以在提示面包内被扩展(内部的或者可见的)的输入缩写: >
+  let g:ctrlp_abbrev = {}
+<
+例子: >
+  let g:ctrlp_abbrev = {
+    \ 'gmode': 'i',
+    \ 'abbrevs': [
+      \ {
+        \ 'pattern': '^cd b',
+        \ 'expanded': '@cd ~/.vim/bundle',
+        \ 'mode': 'pfrz',
+      \ },
+      \ {
+        \ 'pattern': '\(^@.\+\|\\\@<!:.\+\)\@<! ',
+        \ 'expanded': '.\{-}',
+        \ 'mode': 'pfr',
+      \ },
+      \ {
+        \ 'pattern': '\\\@<!:.\+\zs\\\@<! ',
+        \ 'expanded': '\ ',
+        \ 'mode': 'pfz',
+      \ },
+      \ ]
+    \ }
+<
+字符串 'pattern' 是使用正则表达式来匹配输入的匹配模式。扩展后就像扩展后的字符串
+在提示符面板中被输入了一样。
+
+对于 'gmode' (可选的):
+  i - 内部扩展(默认)。
+  t - 插入扩展结果到提示符面板,就像你自己输入的一样。
+  k - 当非关键字的字符被输入时,插入扩展结果到提示符面板。只在"t"也出现时生效。
+
+对于 'mode' (对于每个条目,可选的):
+  f - 只应用于文件名模式。
+  p - 只应用于全路径模式。
+  r - 只应用于正则表达式模式。
+  z - 只应用于模糊模式。
+  n - 只应用于使用 <c-y> 创建新文件时(使用扩展后的字符串作为文件名)。
+  c - 当使用 <tab> 自动补全目录名时(在自动补全之前立即扩展模式)。
+  <empty> 或者未定义 - 总是启用。
+
+注意: 缩写条目按顺序求值,后求值的条目会覆盖先求值的条目;当 'gmode' 为"t"时,
+包括他自己。
+
+                                                           *'g:ctrlp_key_loop'*
+一个实验性的特性。设置该选项为1将为多字节字符开启输入事件循环: >
+  let g:ctrlp_key_loop = 0
+<
+注意 #1: 当设置时,该选项会重置 |g:ctrlp_lazy_update| 选项。
+
+注意 #2: 你可以在提示符面板使用自定义的按键绑定切换这个特性: >
+  let g:ctrlp_prompt_mappings = { 'ToggleKeyLoop()': ['<F3>'] }
+<
+
+                                                    *'g:ctrlp_prompt_mappings'*
+使用该选项来自定义CtrlP的提示窗口内的按键绑定为你喜欢的方式。你只需要保留你改
+变值(在[]内部)的行: >
+  let g:ctrlp_prompt_mappings = {
+    \ 'PrtBS()':              ['<bs>', '<c-]>'],
+    \ 'PrtDelete()':          ['<del>'],
+    \ 'PrtDeleteWord()':      ['<c-w>'],
+    \ 'PrtClear()':           ['<c-u>'],
+    \ 'PrtSelectMove("j")':   ['<c-j>', '<down>'],
+    \ 'PrtSelectMove("k")':   ['<c-k>', '<up>'],
+    \ 'PrtSelectMove("t")':   ['<Home>', '<kHome>'],
+    \ 'PrtSelectMove("b")':   ['<End>', '<kEnd>'],
+    \ 'PrtSelectMove("u")':   ['<PageUp>', '<kPageUp>'],
+    \ 'PrtSelectMove("d")':   ['<PageDown>', '<kPageDown>'],
+    \ 'PrtHistory(-1)':       ['<c-n>'],
+    \ 'PrtHistory(1)':        ['<c-p>'],
+    \ 'AcceptSelection("e")': ['<cr>', '<2-LeftMouse>'],
+    \ 'AcceptSelection("h")': ['<c-x>', '<c-cr>', '<c-s>'],
+    \ 'AcceptSelection("t")': ['<c-t>'],
+    \ 'AcceptSelection("v")': ['<c-v>', '<RightMouse>'],
+    \ 'ToggleFocus()':        ['<s-tab>'],
+    \ 'ToggleRegex()':        ['<c-r>'],
+    \ 'ToggleByFname()':      ['<c-d>'],
+    \ 'ToggleType(1)':        ['<c-f>', '<c-up>'],
+    \ 'ToggleType(-1)':       ['<c-b>', '<c-down>'],
+    \ 'PrtExpandDir()':       ['<tab>'],
+    \ 'PrtInsert("c")':       ['<MiddleMouse>', '<insert>'],
+    \ 'PrtInsert()':          ['<c-\>'],
+    \ 'PrtCurStart()':        ['<c-a>'],
+    \ 'PrtCurEnd()':          ['<c-e>'],
+    \ 'PrtCurLeft()':         ['<c-h>', '<left>', '<c-^>'],
+    \ 'PrtCurRight()':        ['<c-l>', '<right>'],
+    \ 'PrtClearCache()':      ['<F5>'],
+    \ 'PrtDeleteEnt()':       ['<F7>'],
+    \ 'CreateNewFile()':      ['<c-y>'],
+    \ 'MarkToOpen()':         ['<c-z>'],
+    \ 'OpenMulti()':          ['<c-o>'],
+    \ 'PrtExit()':            ['<esc>', '<c-c>', '<c-g>'],
+    \ }
+<
+注意: 如果按 <bs> 后光标向左移动一个字符而不是删除一个字符,在你的.vimrc中添加
+下面的设置来禁用插件默认的 <c-h> 绑定: >
+  let g:ctrlp_prompt_mappings = { 'PrtCurLeft()': ['<left>', '<c-^>'] }
+<
+
+                                                    *'g:ctrlp_line_prefix'*
+这个前缀会被加到ctrlp的条目列表中每一行的前面。
+默认值: >
+  let g:ctrlp_line_prefix = '> '
+<
+
+                                                    *'g:ctrlp_open_single_match'*
+当CtrlP处于列表中配置的模式中时,如果只有一个候选条目,CtrlP会直接接受该条目。
+例子: >
+  let g:ctrlp_open_single_match = ['buffer tags', 'buffer']
+<
+目前这个选项的作用是和 |g:ctrlp_default_input| 一起,使用类似下面的函数,在使用
+前设置,使用完后还原: >
+  fu! <SID>tagsUnderCursor()
+    try
+      let default_input_save = get(g:, 'ctrlp_default_input', '')
+      let g:ctrlp_default_input = expand('<cword>')
+      CtrlPBufTagAll
+    finally
+      if exists('default_input_save')
+        let g:ctrlp_default_input = default_input_save
+      endif
+    endtry
+  endfu
+>
+<
+----------------------------------------
+MRU mode options:~
+
+                                                           *'g:ctrlp_mruf_max'*
+指定你希望CtrlP记录的最近打开的文件历史的数目: >
+  let g:ctrlp_mruf_max = 250
+<
+
+                                                       *'g:ctrlp_mruf_exclude'*
+你不希望CtrlP记录的文件。使用正则表达式来指定模式: >
+  let g:ctrlp_mruf_exclude = ''
+<
+例子: >
+  let g:ctrlp_mruf_exclude = '/tmp/.*\|/temp/.*' " MacOSX/Linux
+  let g:ctrlp_mruf_exclude = '^C:\\dev\\tmp\\.*' " Windows
+<
+
+                                                       *'g:ctrlp_mruf_include'*
+如果你想让CtrlP只记录某些文件,在这里指定: >
+  let g:ctrlp_mruf_include = ''
+<
+例子: >
+  let g:ctrlp_mruf_include = '\.py$\|\.rb$'
+<
+                                                       *'g:ctrlp_tilde_homedir'*
+将这个选项设置为1来把所有的 MRU 文件路径中 $HOME 目录下的 $HOME/$filepath 保存
+为 ~/$filepath ,而不是 $HOME/$filepath : >
+  let g:ctrlp_tilde_homedir = 0
+<
+注意: 对所有通过 :CtrlPBookmarkDirAdd! 保存的也有效
+
+                                                      *'g:ctrlp_mruf_relative'*
+设置该选项为1将只显示在当前工作目录内的最近最多使用文件: >
+  let g:ctrlp_mruf_relative = 0
+<
+注意: 你可以在提示符面板使用自定义的按键绑定切换这个特性: >
+  let g:ctrlp_prompt_mappings = { 'ToggleMRURelative()': ['<F2>'] }
+<
+
+                                                 *'g:ctrlp_mruf_default_order'*
+设置该选项为1将在最近最多使用模式搜索时禁用排序: >
+  let g:ctrlp_mruf_default_order = 0
+<
+
+                                                *'g:ctrlp_mruf_case_sensitive'*
+将该选项和你的文件系统大小写敏感性保持一致来避免重复的最近最多使用条目: >
+  let g:ctrlp_mruf_case_sensitive = 1
+<
+
+                                                *'g:ctrlp_mruf_save_on_update'*
+设置该选项为 0 禁止 CtrlP 每当有一个新条目增加就把最近最多使用列表保存到磁盘
+文件,而是在退出Vim时才保存: >
+  let g:ctrlp_mruf_save_on_update = 1
+<
+                                                *'g:ctrlp_bufname_mod'*
+根据修饰符修改文件名部分。参见 |filename-modifiers| 。 >
+  let g:ctrlp_bufname_mod = ':t'
+<
+                                                *'g:ctrlp_bufpath_mod'*
+根据修饰符修改文件路径部分。参见 |filename-modifiers| 。 >
+  let g:ctrlp_bufpath_mod = ':~:.:h'
+<
+----------------------------------------
+高级选项:~
+
+                                                          *'g:ctrlp_open_func'*
+使用一个自定义函数来打开选定的文件: >
+  let g:ctrlp_open_func = {}
+<
+例子: >
+  let g:ctrlp_open_func = {
+    \ 'files'     : 'Function_Name_1',
+    \ 'buffers'   : 'Function_Name_2',
+    \ 'mru files' : 'Function_Name_3',
+    \ }
+<
+函数结构: >
+  function! Function_Name(action, line)
+    " 参数:
+    " |
+    " +- a:action : 打开的动作:
+    " |             + 'e' : 用户按下 <cr>  (默认)
+    " |             + 'h' : 用户按下 <c-x> (默认)
+    " |             + 'v' : 用户按下 <c-v> (默认)
+    " |             + 't' : 用户按下 <c-t> (默认)
+    " |             + 'x' : 用户使用 <c-o> 终端对话框 (默认) 选择"e[x]ternal"。
+    " |
+    " +- a:line   : 选择的文件。
+
+  endfunction
+<
+注意: 当使用<c-z> 和 <c-o>打开多个文件时无效。
+
+例子: 当 <c-t> 被按下时在默认浏览器中打开HTML文件,否则在Vim中打开 >
+  function! HTMLOpenFunc(action, line)
+    if a:action =~ '^[tx]$' && fnamemodify(a:line, ':e') =~? '^html\?$'
+
+      " 获取文件名
+      let filename = fnameescape(fnamemodify(a:line, ':p'))
+
+      " 关闭CtrlP
+      call ctrlp#exit()
+
+      " 打开文件
+      silent! execute '!xdg-open' filename
+
+    elseif a:action == 'x' && fnamemodify(a:line, ':e') !~? '^html\?$'
+
+      " 不是HTML文件,再次模拟 <c-o> 按键并且等待新的输入
+      call feedkeys("\<c-o>")
+
+    else
+
+      " 使用CtrlP的默认的打开文件的函数
+      call call('ctrlp#acceptfile', [a:action, a:line])
+
+    endif
+  endfunction
+
+  let g:ctrlp_open_func = { 'files': 'HTMLOpenFunc' }
+<
+
+                                                        *'g:ctrlp_status_func'*
+为CtrlP窗口使用自定义的状态栏: >
+  let g:ctrlp_status_func = {}
+<
+例子: >
+  let g:ctrlp_status_func = {
+    \ 'main': 'Function_Name_1',
+    \ 'prog': 'Function_Name_2',
+    \ }
+<
+函数结构: >
+  " 主状态栏
+  function! Function_Name_1(focus, byfname, regex, prev, item, next, marked)
+    " 参数:
+    " |
+    " +- a:focus   : 提示符面板的焦点: "prt" 或者 "win"。
+    " |
+    " +- a:byfname : 在文件名模式还是全路径模式: "file" 或者 "path"。
+    " |
+    " +- a:regex   : 是否在正则表达式模式: 1 or 0。
+    " |
+    " +- a:prev    : 前一个搜索模式。
+    " |
+    " +- a:item    : 当前的搜索模式。
+    " |
+    " +- a:next    : 下一个搜索模式。
+    " |
+    " +- a:marked  : 被标记文件的数目,或者一个逗号分隔的被标记的文件名列表。
+
+    return full_statusline
+  endfunction
+
+  " 状态栏进度条
+  function! Function_Name_2(str)
+    " a:str : 一个当前已扫描的文件数,或者一个当前扫描目录和用户命令的字符串。
+
+    return full_statusline
+  endfunction
+<
+一个可用的例子,参见 https://gist.github.com/1610859 。
+
+                                                        *'g:ctrlp_buffer_func'*
+指定一个会在启动或者退出CtrlP缓冲区时被调用的函数: >
+  let g:ctrlp_buffer_func = {}
+<
+例子: >
+  let g:ctrlp_buffer_func = {
+    \ 'enter': 'Function_Name_1',
+    \ 'exit':  'Function_Name_2',
+    \ }
+<
+
+                                                         *'g:ctrlp_match_func'*
+为CtrlP设置一个额外的模糊匹配函数: >
+  let g:ctrlp_match_func = {}
+<
+例子: >
+  let g:ctrlp_match_func = { 'match': 'Function_Name' }
+<
+函数结构: >
+  function! Function_Name(items, str, limit, mmode, ispath, crfile, regex)
+    " 参数:
+    " |
+    " +- a:items  : 搜索条目的全列表。
+    " |
+    " +- a:str    : 用户输入的字符串。
+    " |
+    " +- a:limit  : 匹配窗口的最大高度。可以用来限制返回的条目数量。
+    " |
+    " +- a:mmode  : 在匹配模式。可以是下列字符串之一:
+    " |             + "full-line": 匹配整行。
+    " |             + "filename-only": 只匹配文件名。
+    " |             + "first-non-tab": 匹配到第一个制表符。
+    " |             + "until-last-tab": 匹配到最后一个制表符。
+    " |
+    " +- a:ispath : 搜索文件,缓冲区,最近最多使用,混合,目录和rtscript模.
+    " |             式时为1。其它为0。
+    " |
+    " +- a:crfile : 当前窗口中的文件。当a:ispath为1时应该被搜索结果排除在外
+    " |
+    " +- a:regex  : 是否在正则表达式模式: 1 or 0.
+
+    return list_of_matched_items
+  endfunction
+<
+
+注意: 你可以通过 { 'arg_type': 'dict' } 扩展上面的任何选项,这样就可以通过
+一个字典类型的参数来传递所有的函数参数。使用参数名作为字典的键值。
+
+例子: >
+  let g:ctrlp_status_func = {
+    \ 'arg_type' : 'dict',
+    \ 'enter': 'Function_Name_1',
+    \ 'exit':  'Function_Name_2',
+    \ }
+
+  function! Function_Name_1(dict)
+    " where dict == {
+    " \ 'focus':   value,
+    " \ 'byfname': value,
+    " \ 'regex':   value,
+    " \ ...
+    " }
+  endfunction
+<
+                                                       *'g:ctrlp_brief_prompt'*
+当设置为 1 时, 提示符后为空时按 <bs> 会退出 CtrlP 。
+
+                                                          *ctrlp-default-value*
+另外,你可以使用下面的方式来改变默认值。
+例子: >
+  let g:ctrlp_path_nolim = 1
+
+这样可以让无限制模式匹配“路径”类型。
+===============================================================================
+命令                                                           *ctrlp-commands*
+
+                                                                       *:CtrlP*
+:CtrlP [起始目录]
+   用文件搜索模式打开CtrlP。
+
+   如果没有给定参数,|g:ctrlp_working_path_mode| 会被用来决定起始目录。临时覆盖
+   这个参数 的方法见 |:CtrlPCurFile| 和 |:CtrlPCurWD| 。
+
+   在输入时你可以使用 <tab> 自动补全[起始目录]。
+
+                                                                 *:CtrlPBuffer*
+:CtrlPBuffer
+   用缓冲区搜索模式打开CtrlP。
+
+                                                                *:CtrlPCurFile*
+:CtrlPCurFile
+    行为类似变量 |g:ctrlp_working_path_mode| = '' 时执行 |:CtrlP| ,忽略这个变量
+    现在的值。
+
+                                                                  *:CtrlPCurWD*
+:CtrlPCurWD
+    行为类似变量 |g:ctrlp_working_path_mode| = '' 时执行 |:CtrlP| ,忽略这个变量
+    现在的值。
+
+                                                                    *:CtrlPMRU*
+:CtrlPMRU
+   用最近最多使用模式打开CtrlP。
+
+                                                               *:CtrlPLastMode*
+:CtrlPLastMode [--dir]
+   用上一次使用的模式打开CtrlP。当提供了"--dir"参数,也重用上一次的工作目录。
+
+                                                                   *:CtrlPRoot*
+:CtrlPRoot
+    行为类似使用了 |g:ctrlp_working_path_mode| = 'r' 并且忽略了该变量的当前值的
+    |:CtrlP| 命令。
+
+                                                             *:CtrlPClearCache*
+:CtrlPClearCache
+   清除当前工作目录的缓存。和在CtrlP内按 <F5> 效果一样。
+   使用 |g:ctrlp_use_caching| 来启用或禁用缓存。
+
+                                                         *:CtrlPClearAllCaches*
+:CtrlPClearAllCaches
+   删除在 |g:ctrlp_cache_dir| 中定义的缓存目录中的所有缓存文件。
+
+-------------------------------------------------------------------------------
+由扩展提供的命令参见 |ctrlp-extensions| 。
+
+===============================================================================
+按键绑定                                                        *ctrlp-mappings*
+
+                                                                *'ctrlp-<c-p>'*
+<c-p>
+   普通模式 |Normal| 下默认以文件搜索模式打开CtrlP提示符面板。
+
+----------------------------------------
+已经在提示符面板中:~
+
+  <c-d>
+    在全路径搜索和文件名搜索间切换。
+    注意: 在文件名搜索模式,提示符面板的提示符是'>d>',而不是'>>>'
+
+  <c-r>                                                    *'ctrlp-fullregexp'*
+    在字符串搜索模式和正则表达式模式之间切换。
+    注意: 在全正则表达式模式,提示符面板的提示符是'r>>',而不是'>>>'
+
+    详细参见: |input-formats| (指引)和 |g:ctrlp_regexp_search| 选项。
+
+  <c-f>, 'forward' 前进
+  <c-up>
+    切换到序列里面的 'next' 后一个搜索模式。
+
+  <c-b>, 'backward' 后退
+  <c-down>
+    切换到序列里面的 'previous' 前一个搜索模式。
+
+  <tab>                                                *'ctrlp-autocompletion'*
+    自动补全在提示符面板的当前工作路径中的目录名。
+
+  <s-tab>
+    在匹配窗口和提示符面板之间切换焦点。
+
+  <esc>,
+  <c-c>,
+  <c-g>
+    退出CtrlP。
+
+移动:~
+
+  <c-j>,
+  <down>
+    向下移动。
+
+  <c-k>,
+  <up>
+    向上移动。
+
+  <c-a>
+    移动光标到提示符面板的 'start' 开头。
+
+  <c-e>
+    移动光标到提示符面板的 'end' 末尾。
+
+  <c-h>,
+  <left>,
+  <c-^>
+    向左 'left' 移动一个字符。
+
+  <c-l>,
+  <right>
+    向右 'right' 移动一个字符。
+
+编辑:~
+
+  <c-]>,
+  <bs>
+    删除前一个字符。
+
+  <del>
+    删除当前字符。
+
+  <c-w>
+    删除前一个单词。
+
+  <c-u>
+    清除输入。
+
+浏览输入历史:~
+
+  <c-n>
+    提示符面板历史里的下一个字符串。
+
+  <c-p>
+    提示符面板历史里的上一个字符串。
+
+打开/创建文件:~
+
+  <cr>
+    如果可能的话在 'current' 当前窗口打开选择的文件。
+
+  <c-t>
+    在 'tab' 新标签打开选择的文件。
+    Open the selected file in a new 'tab'.
+
+  <c-v>
+    在 'vertical' 竖直分割窗口打开选择的文件。
+
+  <c-x>,
+  <c-cr>,
+  <c-s>
+    在 'horizontal' 水平分割窗口打开选择的文件。
+
+  <c-y>
+    创建一个新文件和它的父目录。
+
+打开多个文件:~
+
+  <c-z>
+    - 标记/取消标记一个被 <c-o> 打开的文件。
+    - 标记/取消标记一个被 <c-y> 在它的目录被创建的文件。
+
+  <c-o>
+    - 打开被 <c-z> 标记的文件。
+    - 当没有文件被 <c-z> 标记时,使用下列选项打开一个终端对话框:
+
+      打开被选择的文件:
+        t - 在新标签页中打开。
+        v - 在一个竖直分割窗口中。
+        h - 在一个水平分割窗口中。
+        r - 在当前窗口中打开。
+        i - 在隐藏的缓冲区中。
+        x - (可选的)使用 |g:ctrlp_open_func| 中定义的函数。
+
+      其它选项 (未显示):
+        a - 标记匹配窗口中的所有文件。
+        d - 改变CtrlP的工作目录到被选择的文件的目录并切换到文件搜索模式。
+
+功能按键绑定:~
+
+  <F5>
+    - 刷新匹配窗口并且清除当前目录的缓存。
+    - 从最近最多使用中移除被删除的文件。
+
+  <F7>
+    最近最多使用模式:
+    - 清除最近最多使用列表。
+    - 删除被 <c-z> 标记的最近最多使用条目。
+    缓冲区模式:
+    - 删除光标下的条目或者删除被 <c-z> 标记的多个条目。
+
+粘贴:~
+
+  <Insert>,                                                   *'ctrlp-pasting'*
+  <MiddleMouse>
+    将剪贴板中的文本粘贴到提示符窗口中。
+
+  <c-\>
+    打开一个终端对话框来粘贴 <cword>, <cfile>,搜索寄存器的文本,上一次可视
+    化模式的选择,剪贴板或者任何寄存器到提示符面板中。
+
+使用 |g:ctrlp_prompt_mappings| 选择你自己的绑定。
+
+----------------------------------------
+当焦点在匹配窗口中时(使用 <s-tab> 来切换):~
+
+  a-z
+  0-9
+  ~^-=;`',.+!@#$%&_(){}[]
+    在匹配第一个字符的行中循环。
+
+===============================================================================
+输入格式                                                  *ctrlp-input-formats*
+
+提示符面板的输入格式:~
+
+a)  字符串。
+
+    例如: 'abc' 被内部理解为 'a[^a]\{-}b[^b]\{-}c'
+
+b)  在正则表达式模式,输入字符串被按照Vim的正则表达式模式 |pattern| 来对待,不
+    进行任何修改。
+
+    例如: 'abc\d*efg' 会被解读为 'abc\d*efg'。
+
+    如何启用正则表达式模式参见 |ctrlp-fullregexp| (按键绑定)和
+    |g:ctrlp_regexp_search| (选项)。
+
+c)  字符串末尾使用一个冒号':'跟随一个Vim命令来在打开那个文件后执行该命令。如果
+    你需要使用':'的字面意思,使用反斜杠转义'\:'。但打开多个文件时,命令会在每
+    个打开文件上执行。
+
+    例如: 使用':45'跳转到第45行。
+
+          使用':/any\:string'跳转到'any:string'第一次出现的地方。
+
+          使用':+setf\ myfiletype|50'来设置文件类型为 'myfiletype',然后跳转
+          到第50行。
+
+          使用':diffthis'当打开多个文件时在前四个文件上调用 |:diffthis| 。
+
+    参见: Vim的 |++opt| 和 |+cmd|.
+
+d)  提交两个点号 '..' 来进入上级目录。如果想进入向上多级目录,每多一级使用一个
+    额外的点号:
+>
+         输入         解释为
+         ..           ../
+         ...          ../../
+         ....         ../../../
+<
+    注意: 如果父目录很大并且没有被缓存,可能会很慢。
+
+    你可以使用'@cd path/'来改变CtrlP的工作目录为path/。使用'@cd %:h'来改变为当
+    前文件的目录。
+
+e)  类似的,提交'/'或者'\'来查找或者跳转到项目的根目录。
+
+    如果项目很大,使用版本控制系统的列出命令来寻找文件可能会加速初始化扫描。(
+    更多细节参见 |g:ctrlp_user_command| )。
+
+    注意: d) 和 e) 只在文件,目录和混合模式生效。
+
+f)  输入一个不存在的文件名并且按下 <c-y> 来创建文件。如果使用 <c-z> 标记了一个
+    文件,将会在被标记的文件的目录下创建这个新文件。
+
+    例如: 使用 'newdir/newfile.txt' 会创建一个名为'newdir'的目录和一个名为
+          'newfile.txt'的文件。
+
+          如果一个条目'some/old/dirs/oldfile.txt'被 <c-z> 标记,然后 'newdir'
+          和'newfile.txt'会在'some/old/dirs'下被创建。最终的路径会像下面这样
+          'some/old/dirs/newdir/newfile.txt'.
+
+    注意: 在Windows下使用 '\' 代替 '/' (如果 |'shellslash'| 选项没有设置)。
+
+g)  在文件名模式(使用 <c-d> 切换)下,你可以使用被逗号分隔的一个主要的模式和
+    一个改善的模式。两个模式在正则表达式模式下像(a)或(b)那样工作。
+
+h)  使用?打开帮助文件。
+
+===============================================================================
+扩展                                                         *ctrlp-extensions*
+
+扩展是可选的。把它的名字添加到变量g:ctrlp_extensions中来开启扩展: >
+  let g:ctrlp_extensions = ['tag', 'buffertag', 'quickfix', 'dir', 'rtscript',
+                          \ 'undo', 'line', 'changes', 'mixed', 'bookmarkdir']
+<
+扩展的名字在变量中出现的顺序会是在使用命令 <c-f>, <c-b> 切换时扩展在状态栏中出
+现的顺序。
+
+可用的扩展:~
+
+                                                                    *:CtrlPTag*
+  * 标记模式:~
+    - 名称: 'tag'
+    - 命令: ":CtrlPTag"
+    - 在一个生成的标记文件中搜索标签,跳转到标签定义。使用Vim的 |'tags'| 来指定
+      标签文件的位置和名称。
+      例如: set tags+=doc/tags
+
+                                                                 *:CtrlPBufTag*
+                                                              *:CtrlPBufTagAll*
+  * 缓冲区标签模式:~
+    - 名称: 'buffertag'
+    - 命令: ":CtrlPBufTag [缓冲区]",
+                ":CtrlPBufTagAll"。
+    - 在当前缓冲区或者所有列出的缓冲区中搜索标签并且跳转到定义。需要
+      |exuberant_ctags| 或者兼容的程序。
+
+                                                               *:CtrlPQuickfix*
+  * 快速修复模式:~
+    - 名称: 'quickfix'
+    - 命令: ":CtrlPQuickfix"
+    - 在当前的快速修复错误列表中搜索条目并且跳转过去。
+
+                                                                    *:CtrlPDir*
+  * 目录模式:~
+    - 名称: 'dir'
+    - 命令: ":CtrlPDir [起始muu]"
+    - 搜索目录并且将其作为工作目录。
+    - 按键绑定:
+      + <cr> 为CtrlP修改工作目录并且保持打开状态。
+      + <c-t> 修改全局的工作目录(退出)。
+      + <c-v> 为当前窗口修改工作目录(退出)。
+      + <c-x> 修改全局工作目录为CtrlP的当前工作目录(退出)。
+
+                                                                    *:CtrlPRTS*
+  * 运行时脚本模式:~
+    - 名称: 'rtscript'
+    - 命令: ":CtrlPRTS"
+    - 在运行时路径中寻找文件(vimscripts, docs, snippets...)。
+
+                                                                   *:CtrlPUndo*
+  * 撤销模式:~
+    - 名称: 'undo'
+    - 命令: ":CtrlPUndo"
+    - 浏览撤销历史。
+
+                                                                   *:CtrlPLine*
+  * 行模式:~
+    - 名称: 'line'
+    - 命令: ":CtrlPLine [缓冲区]"
+    - 在所有列出的缓冲区或者在指定的 [buffer] 缓冲区内搜索一行内容。
+
+                                                                 *:CtrlPChange*
+                                                              *:CtrlPChangeAll*
+  * 修改列表模式:~
+    - 名称: 'changes'
+    - 命令: ":CtrlPChange [缓冲区]",
+            ":CtrlPChangeAll".
+    - 在当前缓冲区或者在所有列出的缓冲区内搜索最近的修改并跳转。
+
+                                                                  *:CtrlPMixed*
+  * 混合模式:~
+    - 名称: 'mixed'
+    - 命令: ":CtrlPMixed"
+    - 同时在文件,缓冲区和最近最多修改中搜索。
+
+                                                            *:CtrlPBookmarkDir*
+                                                         *:CtrlPBookmarkDirAdd*
+  * 书签目录模式:~
+    - 名称: 'bookmarkdir'
+    - 命令: ":CtrlPBookmarkDir",
+            ":CtrlPBookmarkDirAdd [目录] [标题]".
+            ":CtrlPBookmarkDirAdd! [目录] [标题]".
+    - 搜索一个被书签标记的目录并将其作为工作目录。
+    - 以指定的[标题]添加[目录]到 CtrlPBookmarkDir 中,如果没有给出[标题]或
+      者[目录],会请求用户输入。
+    - 以指定的[标题]添加[目录]到 CtrlPBookmarkDir 中,如果没有给出目录,则
+      默认为当前目录( [CWD] ),如果没有给出[标题] ,会请求用户输入。
+
+      最新的用来添加所有最近使用过的目录到 CtrlPBookmarkDir 列表中的自动命令
+      如下
+      >
+      augroup CtrlPDirMRU
+        autocmd!
+        autocmd FileType * if &modifiable | execute 'silent CtrlPBookmarkDirAdd! %:p:h' | endif
+      augroup END
+<
+
+    - 按键绑定:
+      + <cr> 为CtrlP修改工作目录并且保持打开状态,并且切换到文件搜索模式。
+      + <c-x> 修改全局的工作目录(退出)。
+      + <c-v> 为当前窗口修改工作目录(退出)。
+      + <F7>
+        - 清除书签列表。
+        - 删除被 <c-z> 标记的书签条目。
+
+                                                 *ctrlp-autoignore-extension*
+  * 自动忽略模式:~
+    - 名称: 'autoignore'
+
+    - 这个扩展并不会添加新命令。它支持通过项目根目录中的 `.ctrlpignore` 文件为
+      每个项目设置忽略模式 (就像属于单个项目的 |ctrlp_custom_ignore|)。基本
+      上就像 CtrlP 的 `.gitignore` 或者 `.hgignore`。
+
+      注意: 当使用 |g:ctrlp_user_command| 自动忽略模式不起作用。
+
+      注意: `.ctrlpignore` 会被当做根目录的标识(参见 |g:ctrlp_root_markers|).
+
+    - 忽略文件的语法:
+      空行,以 `#` (注释)开头的行会被忽略。
+
+      其他行会被当做正则表达式。 匹配模式如何被使用参见 *string-match* 。
+      任意条目,只要匹配到任意匹配模式,就会从 CtrlP 中搜索结果中忽略。
+
+      例子:
+
+        \.tmp$
+        ^generated/
+        local\.cfg
+
+      注意: 即使在 Windows 上模式也应该使用反斜线。
+
+      你也可以像下面那样使用 glob 命令风格的语法:
+
+        syntax:wildignore
+        *.tar.gz
+        *.tmp
+
+      这样会在搜索文件时临时的把每一个匹配模式添加到 |'wildignore'|
+      中,结束时移除。
+
+      你也可以通过下面的方式切换回默认的正则表达式为基础的模式:
+
+        syntax:regexp
+
+      你也可以只为某一条目类型(文件、目录...)设置匹配模式:
+
+        dir:build
+        file:foo\.txt
+
+      这样只会忽略包含 "build" 的目录和包含 "foo.txt" 的文件。不会忽略带
+      有 "build" 的文件或者反过来。
+
+      注意: 如果为了忽略名为 "build" 的目录,而不是『任何』包含 "build"
+      的目录,你可以使用下面的正则: ^build$
+
+    - 常见问题:
+      问: 为什么 CtrlP 不能直接支持原生的 `.gitignore` or `.hgignore` ?
+
+      答: 这些文件初看起来好像已经包含了所有你想从 CtrlP 中排除的文件。但是
+      通常情况下,这些文件和你想在 CtrlP 中的配置会有一些不同。这些配置文件
+      列出了不能被包含到版本控制中的文件。这些不能被包含到版本控制中的文件
+      包括了你想忽略的,但是同时可能也包含了你不想忽略的:本地设置,外部包
+      和依赖,等等。作者觉得支持多种语法与只是简单的复制/粘贴几行忽略规则比
+      起来比较麻烦。如果你不这么觉得可以随时提交补丁 :)
+
+      问: 我开启了 |ctrlp-autoignore-extension|, 或者编辑了 `.ctrlpignore`
+      但是这些新模式并没有起作用。我哪里做错了?
+
+      答: 可能什么都没做错!CtrlP 可以为了快速的响应缓存搜索结果。你可以按
+      <F5> 强制刷新。如果 `.ctrlpignore` 改动过,这样也会使用新的匹配模式。
+
+----------------------------------------
+缓冲标签模式选项:~
+
+                                                   *'g:ctrlp_buftag_ctags_bin'*
+如果ctags没有在环境变量中配置,或者一个二进制ctags文件存在于
+/opt/local/bin 或 /usr/local/bin,使用该选项来指定它的位置: >
+  let g:ctrlp_buftag_ctags_bin = ''
+<
+
+                                                   *'g:ctrlp_buftag_systemenc'*
+将该选项与你的操作系统的编码(非Vim的)保持一致。默认值使用Vim的全局
+|'encoding'| 选项: >
+  let g:ctrlp_buftag_systemenc = &encoding
+<
+
+                                                       *'g:ctrlp_buftag_types'*
+使用该选项来在ctags, jsctags...中为指定的文件格式设置参数: >
+  let g:ctrlp_buftag_types = ''
+<
+例子: >
+  let g:ctrlp_buftag_types = {
+    \ 'erlang'     : '--language-force=erlang --erlang-types=drmf',
+    \ 'javascript' : {
+      \ 'bin': 'jsctags',
+      \ 'args': '-f -',
+      \ },
+    \ }
+<
+
+===============================================================================
+自定义                                                    *ctrlp-customization*
+
+高亮:~
+  * CtrlP缓冲区的设置:
+    CtrlPNoEntries : 当没有匹配被发现时的消息(错误)。
+    CtrlPMatch     : 匹配模式(标识)。
+    CtrlPLinePre   : 匹配窗口的行前缀'>'。
+    CtrlPPrtBase   : 提示符窗口的基础(注释)。
+    CtrlPPrtText   : 提示符窗口的文本 (|hl-Normal|)。
+    CtrlPPrtCursor : 提示符窗口的光标在文本上移动时(常量)。
+
+  * 缓冲区浏览模式:
+    CtrlPBufferNr     : 缓冲区编号
+    CtrlPBufferInd    : '+', '-', '=' 和 '#' 指示符 (参见 |:buffers|)
+    CtrlPBufferHid    : 隐藏缓冲区
+    CtrlPBufferHidMod : 隐藏和被编辑过的缓冲区
+    CtrlPBufferVis    : 可见的缓冲区
+    CtrlPBufferVisMod : 可见的和被编辑过的缓冲区
+    CtrlPBufferCur    : 当前缓冲区
+    CtrlPBufferCurMod : 当前和被编辑过的缓冲区
+    CtrlPBufferPath   : 缓冲区路径
+
+  * 在扩展中:
+    CtrlPTabExtra  : 每一行中不匹配的部分(注释)。
+    CtrlPBufName   : 条目所属的缓冲区名称(|hl-Directory|)。
+    CtrlPTagKind   : 缓冲区标签模式中标签的类型(|hl-Title|)。
+    CtrlPqfLineCol : 快速修复模式中行和列的序号(注释)。
+    CtrlPUndoT     : 撤销模式的流逝时间(|hl-Directory|)。
+    CtrlPUndoBr    : 撤销模式的方括号(注释)。
+    CtrlPUndoNr    : 撤销模式的方括号中的数字(字符串)。
+    CtrlPUndoSv    : 文件被保存的点(注释)。
+    CtrlPUndoPo    : 撤销树中的当前位置(|hl-Title|)。
+    CtrlPBookmark  : 书签的名称(标识)。
+
+状态栏:~
+  * 高亮组:
+    CtrlPMode1 : 'file' 或 'path' 或 'line',和当前模式(字符)。
+    CtrlPMode2 : 'prt' 或 'win', 'regex',工作目录 |hl-LineNr| 。
+    CtrlPStats : 扫描状态(函数)。
+
+  重新构建状态栏,参见 |g:ctrlp_status_func| 。
+
+===============================================================================
+其它选项                                          *ctrlp-miscellaneous-configs*
+
+* 为 |g:ctrlp_user_command| 使用 |wildignore| :
+>
+  function! s:wig2cmd()
+    " 修改wildignore为空格或者|分隔的组
+    " 例如: .aux .out .toc .jpg .bmp .gif
+    " 或者  .aux$\|.out$\|.toc$\|.jpg$\|.bmp$\|.gif$
+    let pats = ['[*\/]*\([?_.0-9A-Za-z]\+\)\([*\/]*\)\(\\\@<!,\|$\)','\\\@<!,']
+    let subs = has('win32') || has('win64') ? ['\1\3', ' '] : ['\1\2\3', '\\|']
+    let expr = substitute(&wig, pats[0], subs[0], 'g')
+    let expr = substitute(expr, pats[1], subs[1], 'g')
+    let expr = substitute(expr, '\\,', ',', 'g')
+
+    " 设置用户命令选项
+    let g:ctrlp_user_command = has('win32') || has('win64')
+      \ ? 'dir %s /-n /b /s /a-d | findstr /V /l "'.expr.'"'
+      \ : 'find %s -type f | grep -v "'.expr .'"'
+  endfunction
+
+  call s:wig2cmd()
+<
+(由 Rich Alesi <github.com/ralesi> 提交)
+
+* 一个独立的函数,设置项目的根目录为工作目录,如果没有找到根目录的话使用当前文
+* 件的父目录。
+>
+  function! s:setcwd()
+    let cph = expand('%:p:h', 1)
+    if cph =~ '^.\+://' | retu | en
+    for mkr in ['.git/', '.hg/', '.svn/', '.bzr/', '_darcs/', '.vimprojects']
+      let wd = call('find'.(mkr =~ '/$' ? 'dir' : 'file'), [mkr, cph.';'])
+      if wd != '' | let &acd = 0 | brea | en
+    endfo
+    exe 'lc!' fnameescape(wd == '' ? cph : substitute(wd, mkr.'$', '.', ''))
+  endfunction
+
+  autocmd BufEnter * call s:setcwd()
+<
+(需要 Vim 7.1.299+)
+
+* 使用 |count| 来使用同样的按键绑定调用不同的命令:
+>
+  let g:ctrlp_cmd = 'exe "CtrlP".get(["", "Buffer", "MRU"], v:count)'
+<
+
+===============================================================================
+开发人员                                                        *ctrlp-credits*
+
+最初由 Kien Nguyen <github.com/kien>开发。现在由 Github 上 ctrlpvim 组织的成员
+维护(https://github.com/orgs/ctrlpvim/people) 。在Vim的 |license| 下发行。
+
+项目主页:   http://ctrlpvim.github.com/ctrlp.vim
+Git 仓库:   https://github.com/ctrlpvim/ctrlp.vim
+
+-------------------------------------------------------------------------------
+感谢所有通过github,bitbucket或电子邮件提供想法,报告bug或者帮助debugging的人。
+
+特别感谢:~
+
+    * Woojong Koh <github.com/wjkoh>
+    * Simon Ruderich
+    * Yasuhiro Matsumoto <github.com/mattn>
+    * Ken Earley <github.com/kenearley>
+    * Kyo Nagashima <github.com/hail2u>
+    * Zak Johnson <github.com/zakj>
+    * Diego Viola <github.com/diegoviola>
+    * Piet Delport <github.com/pjdelport>
+    * Thibault Duplessis <github.com/ornicar>
+    * Kent Sibilev <github.com/datanoise>
+    * Tacahiroy <github.com/tacahiroy>
+    * Luca Pette <github.com/lucapette>
+    * Seth Fowler <github.com/sfowler>
+    * Lowe Thiderman <github.com/thiderman>
+    * Christopher Fredén <github.com/icetan>
+    * Zahary Karadjov <github.com/zah>
+    * Jo De Boeck <github.com/grimpy>
+    * Rudi Grinberg <github.com/rgrinberg>
+    * Timothy Mellor <github.com/mellort>
+    * Sergey Vlasov <github.com/noscript>
+
+===============================================================================
+更新日志                                                      *ctrlp-changelog*
+
+    * 新选项 |g:ctrlp_custom_tag_files| 用来指定自定义的标签文件。
+    * 设置 g:ctrlp_match_window 为0来不限制窗口大小
+
+Before 2016/11/28~
+
+    + 新命令: |YankLine()| 来复制整个文件。
+    + 新选项: |g:ctrlp_types| 来选择內建类型。
+    + 新特性: 异步在新线程中调用 |g:ctrlp_user_command| 。 设置
+              |g:ctrlp_user_command_async|  为1来启用。
+    + 为 delphi, rust 和 golang提供buffertag支持。
+    + 新选项: |g:ctrlp_brief_prompt|,
+              |g:match_current_file|,
+              |g:ctrlp_compare_lim|.
+    + 新功能: 自动忽略扩展。
+    + 为 ant, tex, dosbatch, matlab 和 vhdl提供buffertag支持。
+    + 新选项 |g:ctrlp_line_prefix| 来结合第三方插件。
+    + 新选项 |g:open_single_match| 在 matches 中打开单个文件。
+    + 添加启动方式 <plug>(ctrlp) 。
+    + 接受 bang for CtrlPBookmarkDirAdd 来避免确认。
+    + 处理像 "g:ctrlp_TYPE_MODE" 大小写混合的变量名。
+                   例如: let g:ctrlp_path_sort
+    + 新选项: |g:ctrlp_custom_ancestors|
+
+在2014/08/08之前~
+
+    + 新的支持高亮的缓冲区浏览模式 (建议 |+conceal|)
+    + 新选项: |g:ctrlp_bufname_mod|,
+              |g:ctrlp_bufpath_mod|
+    + 结合 *g:ctrlp_match_window_bottom* *g:ctrlp_match_window_reversed* 和
+      *g:ctrlp_max_height* 到 |g:ctrlp_match_window| 。
+    + 新选项: |g:ctrlp_match_window| 。
+
+在2012/11/30之前~
+
+    + 新选项: |g:ctrlp_abbrev|,
+              |g:ctrlp_key_loop|,
+              |g:ctrlp_open_func|,
+              |g:ctrlp_tabpage_position|,
+              |g:ctrlp_mruf_save_on_update|
+    + 重命名:
+        *g:ctrlp_dotfiles* -> |g:ctrlp_show_hidden| 。
+    + 修改 |g:ctrlp_switch_buffer| 和 |g:ctrlp_working_path_mode|的类型
+      (旧值仍然工作)。
+    + 当 |g:ctrlp_user_command| 是一个字典时,为其增加一个新的键: 'ignore'。
+
+在2012/06/15之前~
+
+    + |g:ctrlp_follow_symlinks| 的新值: 2。
+    + |g:ctrlp_open_multiple_files| 的新值: 'j'。
+    + 允许使用 <c-t>, <c-x>, <c-v> 打开被 <c-z> 标记的文件。
+    + 扩展 '..' (|ctrlp-input-formats| (d))
+    + 新的输入格式: '@cd' (|ctrlp-input-formats| (d))
+
+在2012/04/30之前~
+
+    + 新选项: |g:ctrlp_mruf_default_order|
+    + 新特性: 被书签标记的目录的扩展。
+    + 新命令: |:CtrlPBookmarkDir|
+              |:CtrlPBookmarkDirAdd|
+
+在2012/04/15之前~
+
+    + 新选项: |g:ctrlp_buffer_func|,CtrlP缓冲区的回调函数。
+    + 移除  : g:ctrlp_mruf_last_entered,使其作为最近最多使用的默认行为。
+    + 新命令: |:CtrlPLastMode|,以上一次使用的模式打开CtrlP。
+              |:CtrlPMixed|,在文件,缓冲区和最近最多使用中搜索。
+
+在2012/03/31之前~
+
+    + 新选项: |g:ctrlp_default_input|, 进入CtrlP后的默认输入。
+              |g:ctrlp_match_func|,允许使用自定义的模糊查找工具。
+    + 重命名:
+        *ClearCtrlPCache* -> |CtrlPClearCache|
+        *ClearAllCtrlPCaches* -> |CtrlPClearAllCaches|
+        *ResetCtrlP* -> |CtrlPReload|
+
+在2012/03/02之前~
+
+    + 重命名:
+        *g:ctrlp_regexp_search* -> |g:ctrlp_regexp|,
+        *g:ctrlp_dont_split* -> |g:ctrlp_reuse_window|,
+        *g:ctrlp_jump_to_buffer* -> |g:ctrlp_switch_buffer|。
+    + 重命名和微调:
+        *g:ctrlp_open_multi* -> |g:ctrlp_open_multiple_files|。
+    + 过时 *g:ctrlp_highlight_match*
+    + 扩展 |g:ctrlp_user_command| 支持多个命令。
+    + 新选项: |g:ctrlp_mruf_last_entered| 修改最近最多使用为最近进入。
+
+在2012/01/15之前~
+
+    + 新按键绑定: 交换 <tab> 和 <s-tab>. <tab> 现在用来补全在当前工作目录内的目
+                  录名。
+    + 新选项: |g:ctrlp_arg_map| 使 <c-y>, <c-o> 可以接收一个参数。
+              |g:ctrlp_status_func| 自定义状态栏。
+              |g:ctrlp_mruf_relative| 在当前工作目录内显示最近最多使用。
+    + 扩展 g:ctrlp_open_multi 增加新选项值: tr, hr, vr。
+    + 扩展 |g:ctrlp_custom_ignore| 指定过滤目录,文件和链接。
+
+在2012/01/05之前~
+
+    + 新特性: 缓冲区标记扩展。
+    + 新命令: |:CtrlPBufTag|, |:CtrlPBufTagAll|。
+    + 新选项: |g:ctrlp_cmd|,
+              |g:ctrlp_custom_ignore|
+
+在2011/11/30之前~
+
+    + 新特性: 标签,快速修复和目录扩展。
+    + 新命令: |:CtrlPTag|, |:CtrlPQuickfix|, |:CtrlPDir|。
+    + 新选项: |g:ctrlp_use_migemo|,
+              |g:ctrlp_lazy_update|,
+              |g:ctrlp_follow_symlinks|
+
+在2011/11/13之前~
+
+    + 新的特殊输入: '/' 和 '\' 查找根目录 (|ctrlp-input-formats| (e))
+    + 移除 ctrlp#SetWorkingPath()。
+    + 移除 *g:ctrlp_mru_files* ,使最近最多使用模式变为永久的。
+    + 扩展 g:ctrlp_open_multi,添加打开文件的新方式。
+    + 新选项: g:ctrlp_dont_split,
+              |g:ctrlp_mruf_case_sensitive|
+
+在2011/10/30之前~
+
+    + 新特性: 支持自定义扩展。
+              <F5> 也会从最近最多使用列表中移除不存在的文件。
+    + 新选项: g:ctrlp_jump_to_buffer
+
+在2011/10/12之前~
+
+    + 新特性: 打开多个文件。
+              传递Vim的 |++opt| 和 |+cmd| 到新打开的文件
+              (|ctrlp-input-formats| (c))
+              为 |:CtrlP| [起始目录]自动补全每个目录
+    + 新按键绑定: <c-z> 标记/取消标记一个被 <c-o> 打开的文件。
+                  <c-o> 打开所有被标记的文件。
+    + 新选项: g:ctrlp_open_multi
+    + 移除 *g:ctrlp_persistent_input* *g:ctrlp_live_update* and <c-^>。
+
+在2011/09/29之前~
+
+    + 新按键绑定: <c-n>, <c-p> 输入历史中的前一个/后一个字符串。
+                  <c-y> 创建一个新的文件和它的父目录。
+    + 新选项: |g:ctrlp_open_new_file|,
+                   |g:ctrlp_max_history|
+    + 添加一个新的在横向分割窗口打开的绑定:<c-x>
+
+在2011/09/19之前~
+
+    + 新命令: ResetCtrlP
+    + 新选项: |g:ctrlp_max_files|,
+              |g:ctrlp_max_depth|,
+              g:ctrlp_live_update
+    + 新按键绑定: <c-^>
+
+在2011/09/12之前~
+
+    + 添加在匹配窗口内循环匹配行的功能。
+    + 扩展 g:ctrlp_persistent_input的行为
+    + 扩展 |:CtrlP| 的行为
+    + 新选项: |g:ctrlp_dotfiles|,
+              |g:ctrlp_clear_cache_on_exit|,
+              g:ctrlp_highlight_match,
+              |g:ctrlp_user_command|
+    + 新的特殊输入: '..' (|ctrlp-input-formats| (d))
+    + 新按键绑定: <F5>。
+    + 新命令: |:CtrlPCurWD|,
+              |:CtrlPCurFile|,
+              |:CtrlPRoot|
+
+    + 新特性: 在最近最常使用的文件列表中搜索
+    + 新按键绑定: <c-b>。
+    + 扩展 <c-f> 的行为。
+    + 新选项: g:ctrlp_mru_files,
+              |g:ctrlp_mruf_max|,
+              |g:ctrlp_mruf_exclude|,
+              |g:ctrlp_mruf_include|
+    + 新命令: |:CtrlPMRU|
+
+第一版发布于: 2011/09/06~
+
+===============================================================================
+vim:ft=help:et:ts=2:sw=2:sts=2:norl

+ 1688 - 0
vim/plugged/ctrlp.vim/doc/ctrlp.txt

@@ -0,0 +1,1688 @@
+*ctrlp.txt*       Fuzzy file, buffer, mru, tag, ... finder. v1.80
+*CtrlP* *ControlP* *'ctrlp'* *'ctrl-p'*
+===============================================================================
+#                                                                             #
+#          :::::::: ::::::::::: :::::::::  :::             :::::::::          #
+#         :+:    :+:    :+:     :+:    :+: :+:             :+:    :+:         #
+#         +:+           +:+     +:+    +:+ +:+             +:+    +:+         #
+#         +#+           +#+     +#++:++#:  +#+             +#++:++#+          #
+#         +#+           +#+     +#+    +#+ +#+             +#+                #
+#         #+#    #+#    #+#     #+#    #+# #+#             #+#                #
+#          ########     ###     ###    ### ##########      ###                #
+#                                                                             #
+===============================================================================
+CONTENTS                                                       *ctrlp-contents*
+
+    1. Intro........................................|ctrlp-intro|
+    2. Options......................................|ctrlp-options|
+    3. Commands.....................................|ctrlp-commands|
+    4. Mappings.....................................|ctrlp-mappings|
+    5. Input Formats................................|ctrlp-input-formats|
+    6. Extensions...................................|ctrlp-extensions|
+
+===============================================================================
+INTRO                                                             *ctrlp-intro*
+
+Full path fuzzy file, buffer, mru, tag, ... finder with an intuitive interface.
+Written in pure Vimscript for MacVim, gVim and Vim version 7.0+. Has full
+support for Vim's |regexp| as search pattern, built-in MRU files monitoring,
+project's root finder, and more.
+
+To enable optional extensions (tag, dir, rtscript...), see |ctrlp-extensions|.
+
+===============================================================================
+OPTIONS                                                         *ctrlp-options*
+
+Overview:~
+
+  |loaded_ctrlp|................Disable the plugin.
+  |ctrlp_map|...................Default mapping.
+  |ctrlp_cmd|...................Default command used for the default mapping.
+  |ctrlp_by_filename|...........Default to filename mode or not.
+  |ctrlp_regexp|................Default to regexp mode or not.
+  |ctrlp_match_window|..........Order, height and position of the match window.
+  |ctrlp_switch_buffer|.........Jump to an open buffer if already opened.
+  |ctrlp_reuse_window|..........Reuse special windows (help, quickfix, etc).
+  |ctrlp_tabpage_position|......Where to put the new tab page.
+  |ctrlp_working_path_mode|.....How to set CtrlP's local working directory.
+  |ctrlp_root_markers|..........Additional, high priority root markers.
+  |ctrlp_use_caching|...........Use per-session caching or not.
+  |ctrlp_clear_cache_on_exit|...Keep cache after exiting Vim or not.
+  |ctrlp_cache_dir|.............Location of the cache directory.
+  |ctrlp_show_hidden|...........Ignore dotfiles and dotdirs or not.
+  |ctrlp_custom_ignore|.........Hide stuff when using |globpath()|.
+  |ctrlp_max_files|.............Number of files to scan initially.
+  |ctrlp_max_depth|.............Directory depth to recurse into when scanning.
+  |ctrlp_user_command|..........Use an external scanner.
+  |ctrlp_max_history|...........Number of entries saved in the prompt history.
+  |ctrlp_open_new_file|.........How to open a file created by <c-y>.
+  |ctrlp_open_multiple_files|...How to open files selected by <c-z>.
+  |ctrlp_arg_map|...............Intercept <c-y> and <c-o> or not.
+  |ctrlp_follow_symlinks|.......Follow symbolic links or not.
+  |ctrlp_lazy_update|...........Only update when typing has stopped.
+  |ctrlp_default_input|.........Seed the prompt with an initial string.
+  |ctrlp_abbrev|................Input abbreviations.
+  |ctrlp_key_loop|..............Use input looping for multi-byte input.
+  |ctrlp_prompt_mappings|.......Change the mappings inside the prompt.
+  |ctrlp_line_prefix|...........Prefix for each line in ctrlp window.
+  |ctrlp_open_single_match|.....Automatically accept when only one candidate.
+  |ctrlp_brief_prompt|..........Exit CtrlP on empty prompt by <bs>.
+  |ctrlp_match_current_file|....Include current file in match entries.
+  |ctrlp_types|.................Names of builtin types.
+
+  MRU mode:
+  |ctrlp_mruf_max|..............Max MRU entries to remember.
+  |ctrlp_mruf_exclude|..........Files that shouldn't be remembered.
+  |ctrlp_mruf_include|..........Files to be remembered.
+  |ctrlp_mruf_relative|.........Show only MRU files in the working directory.
+  |ctrlp_tilde_homedir|....Save MRU file paths in home dir as ~/.
+  |ctrlp_mruf_default_order|....Disable sorting.
+  |ctrlp_mruf_case_sensitive|...MRU files are case sensitive or not.
+  |ctrlp_mruf_save_on_update|...Save to disk whenever a new entry is added.
+
+  Buffer mode:
+  |ctrlp_bufname_mod|...........File name section modificator.
+  |ctrlp_bufpath_mod|...........File path section modificator.
+
+  BufferTag mode: (to enable, see |ctrlp-extensions|)
+  |g:ctrlp_buftag_ctags_bin|....The location of the ctags-compatible binary.
+  |g:ctrlp_buftag_systemenc|....The encoding used for the ctags command.
+  |g:ctrlp_buftag_types|........Add new filetypes and set the cmd arguments.
+
+  Advanced options:
+  |ctrlp_open_func|.............Use custom file opening functions.
+  |ctrlp_status_func|...........Change CtrlP's two statuslines.
+  |ctrlp_buffer_func|...........Call custom functions in the CtrlP buffer.
+  |ctrlp_match_func|............Replace the built-in matching algorithm.
+
+-------------------------------------------------------------------------------
+Detailed descriptions and default values:~
+
+                                                                *'g:ctrlp_map'*
+Use this option to change the mapping to invoke CtrlP in |Normal| mode: >
+  let g:ctrlp_map = '<c-p>'
+<
+
+                                                                *'g:ctrlp_cmd'*
+Set the default opening command to use when pressing the above mapping: >
+  let g:ctrlp_cmd = 'CtrlP'
+<
+
+                                                             *'g:loaded_ctrlp'*
+Use this to disable the plugin completely: >
+  let g:loaded_ctrlp = 1
+<
+
+                                                        *'g:ctrlp_by_filename'*
+Set this to 1 to set searching by filename (as opposed to full path) as the
+default: >
+  let g:ctrlp_by_filename = 0
+<
+Can be toggled on/off by pressing <c-d> inside the prompt.
+
+                                                             *'g:ctrlp_regexp'*
+Set this to 1 to set regexp search as the default: >
+  let g:ctrlp_regexp = 0
+<
+Can be toggled on/off by pressing <c-r> inside the prompt.
+
+                                                       *'g:ctrlp_match_window'*
+Change the position, the listing order of results, the minimum and the maximum
+heights of the match window: >
+  let g:ctrlp_match_window = ''
+<
+Example: >
+  let g:ctrlp_match_window = 'bottom,order:btt,min:1,max:10,results:10'
+<
+The position: (default: bottom)
+  top - show the match window at the top of the screen.
+  bottom - show the match window at the bottom of the screen.
+
+The listing order of results: (default: btt)
+  order:ttb - from top to bottom.
+  order:btt - from bottom to top.
+
+The minimum and maximum heights:
+  min:{n} - show minimum {n} lines (default: 1).
+  max:{n} - show maximum {n} lines (default: 10).
+
+The maximum number of results:
+  results:{n} - list maximum {n} results (default: sync with max height).
+                0 mean no-limit.
+
+Note: When a setting isn't set, its default value will be used.
+
+                                                      *'g:ctrlp_switch_buffer'*
+When opening a file, if it's already open in a window somewhere, CtrlP will try
+to jump to it instead of opening a new instance: >
+  let g:ctrlp_switch_buffer = 'Et'
+<
+  e - jump when <cr> is pressed, but only to windows in the current tab.
+  t - jump when <c-t> is pressed, but only to windows in another tab.
+  v - like "e", but jump when <c-v> is pressed.
+  h - like "e", but jump when <c-x> is pressed.
+  E, T, V, H - like "e", "t", "v", and "h", but jump to windows anywhere.
+  0 or <empty> - disable this feature.
+
+                                                       *'g:ctrlp_reuse_window'*
+When opening a file with <cr>, CtrlP avoids opening it in windows created by
+plugins, help and quickfix. Use this to setup some exceptions: >
+  let g:ctrlp_reuse_window = 'netrw'
+<
+Acceptable values are partial name, filetype or buftype of the special buffers.
+Use regexp to specify the pattern.
+Example: >
+  let g:ctrlp_reuse_window = 'netrw\|help\|quickfix'
+<
+
+                                                   *'g:ctrlp_tabpage_position'*
+Where to put the new tab page when opening one: >
+  let g:ctrlp_tabpage_position = 'ac'
+<
+  a - after.
+  b - before.
+  c - the current tab page.
+  l - the last tab page.
+  f - the first tab page.
+
+                                                  *'g:ctrlp_working_path_mode'*
+When starting up, CtrlP sets its local working directory according to this
+variable: >
+  let g:ctrlp_working_path_mode = 'ra'
+<
+  c - the directory of the current file.
+  a - the directory of the current file, unless it is a subdirectory of the cwd
+  r - the nearest ancestor of the current file that contains one of these
+      directories or files:
+      .git .hg .svn .bzr _darcs
+  w - modifier to "r": start search from the cwd instead of the current file's
+      directory
+  0 or <empty> - disable this feature.
+
+Note #1: if "a" or "c" is included with "r", use the behavior of "a" or "c" (as
+a fallback) when a root can't be found.
+
+Note #2: you can use a |b:var| to set this option on a per buffer basis.
+
+                                                       *'g:ctrlp_root_markers'*
+Use this to set your own root markers in addition to the default ones (.git,
+.hg, .svn, .bzr, and _darcs). Your markers will take precedence: >
+  let g:ctrlp_root_markers = ['']
+<
+Note: you can use a |b:var| to set this option on a per buffer basis.
+
+                                                        *'g:ctrlp_use_caching'*
+Enable/Disable per-session caching: >
+  let g:ctrlp_use_caching = 1
+<
+  0 - Disable caching.
+  1 - Enable caching.
+  n - When bigger than 1, disable caching and use the number as the limit to
+      enable caching again.
+
+Note: you can quickly purge the cache by pressing <F5> while inside CtrlP.
+
+                                                *'g:ctrlp_clear_cache_on_exit'*
+Set this to 0 to enable cross-session caching by not deleting the cache files
+upon exiting Vim: >
+  let g:ctrlp_clear_cache_on_exit = 1
+<
+
+                                                          *'g:ctrlp_cache_dir'*
+Set the directory to store the cache files: >
+  let g:ctrlp_cache_dir = $HOME.'/.cache/ctrlp'
+<
+
+                                                        *'g:ctrlp_show_hidden'*
+Set this to 1 if you want CtrlP to scan for dotfiles and dotdirs: >
+  let g:ctrlp_show_hidden = 0
+<
+Note: does not apply when a command defined with |g:ctrlp_user_command| is
+being used.
+
+                                                      *'g:ctrlp_custom_ignore'*
+In addition to |g:ctrlp_show_hidden|, use this for files
+and directories you want only CtrlP to not show. Use regexp to specify the
+patterns: >
+  let g:ctrlp_custom_ignore = ''
+<
+Examples: >
+  let g:ctrlp_custom_ignore = '\v[\/]\.(git|hg|svn)$'
+  let g:ctrlp_custom_ignore = {
+    \ 'dir':  '\v[\/]\.(git|hg|svn)$',
+    \ 'file': '\v\.(exe|so|dll)$',
+    \ 'link': 'SOME_BAD_SYMBOLIC_LINKS',
+    \ }
+  let g:ctrlp_custom_ignore = {
+    \ 'file': '\v(\.cpp|\.h|\.hh|\.cxx)@<!$'
+    \ }
+  let g:ctrlp_custom_ignore = {
+    \ 'func': 'some#custom#match_function'
+    \ }
+<
+Note #1: |g:ctrlp_custom_ignore| does not apply when a
+command defined with |g:ctrlp_user_command| is being used.
+
+Note #2: when changing the option's variable type, remember to |:unlet| it
+first or restart Vim to avoid the "E706: Variable type mismatch" error.
+
+Note #3: when using the "func" ignore type, you must provide the full name of
+a function that can be called from CtrlP. An |autoload| function name is
+recommended here. The function must take 2 parameters, the item to match and
+its type. The type will be "dir", "file", or "link". The function must return
+1 if the item should be ignored, 0 otherwise.
+
+Note #4: when |g:ctrlp_use_readdir| is set to 0, you can also use Vim's |'wildignore'| 
+to exclude files and directories.
+
+                                                          *'g:ctrlp_max_files'*
+The maximum number of files to scan, set to 0 for no limit: >
+  let g:ctrlp_max_files = 10000
+<
+Note: does not apply when a command defined with |g:ctrlp_user_command| is
+being used.
+
+                                                          *'g:ctrlp_max_depth'*
+The maximum depth of a directory tree to recurse into: >
+  let g:ctrlp_max_depth = 40
+<
+Note: does not apply when a command defined with |g:ctrlp_user_command| is
+being used.
+
+                                                       *'g:ctrlp_user_command'*
+Specify an external tool to use for listing files instead of using Vim's
+|globpath()|. Use %s in place of the target directory: >
+  let g:ctrlp_user_command = ''
+<
+Examples: >
+  let g:ctrlp_user_command = 'find %s -type f'       " MacOSX/Linux
+  let g:ctrlp_user_command = 'dir %s /-n /b /s /a-d' " Windows
+<
+You can also use 'grep', 'findstr' or something else to filter the results.
+Examples: >
+  let g:ctrlp_user_command =
+    \ 'find %s -type f | grep -v -P "\.jpg$|/tmp/"'          " MacOSX/Linux
+  let g:ctrlp_user_command =
+    \ 'dir %s /-n /b /s /a-d | findstr /v /l ".jpg \\tmp\\"' " Windows
+<
+Use a version control listing command when inside a repository, this is faster
+when scanning large projects: >
+  let g:ctrlp_user_command = [root_marker, listing_command, fallback_command]
+  let g:ctrlp_user_command = {
+    \ 'types': {
+      \ 1: [root_marker_1, listing_command_1],
+      \ n: [root_marker_n, listing_command_n],
+      \ },
+    \ 'fallback': fallback_command,
+    \ 'ignore': 0 or 1
+    \ }
+<
+Some examples: >
+  " Single VCS, listing command does not list untracked files:
+  let g:ctrlp_user_command = ['.git', 'cd %s && git ls-files']
+  let g:ctrlp_user_command = ['.hg', 'hg --cwd %s locate -I .']
+
+  " Multiple VCS's:
+  let g:ctrlp_user_command = {
+    \ 'types': {
+      \ 1: ['.git', 'cd %s && git ls-files'],
+      \ 2: ['.hg', 'hg --cwd %s locate -I .'],
+      \ },
+    \ 'fallback': 'find %s -type f'
+    \ }
+
+  " Single VCS, listing command lists untracked files (slower):
+  let g:ctrlp_user_command =
+    \ ['.git', 'cd %s && git ls-files -co --exclude-standard']
+
+  let g:ctrlp_user_command =
+    \ ['.hg', 'hg --cwd %s status -numac -I . $(hg root)'] " MacOSX/Linux
+
+  let g:ctrlp_user_command = ['.hg', 'for /f "tokens=1" %%a in (''hg root'') '
+    \ . 'do hg --cwd %s status -numac -I . %%a']           " Windows
+<
+Note #1: in the |Dictionary| format, 'fallback' and 'ignore' are optional. In
+the |List| format, fallback_command is optional.
+
+Note #2: if the fallback_command is empty or the 'fallback' key is not defined,
+|globpath()| will then be used when scanning outside of a repository.
+
+Note #3: unless the |Dictionary| format is used and 'ignore' is defined and set
+to 1, the |wildignore| and |g:ctrlp_custom_ignore| options do not apply when
+these custom commands are being used. When not present, 'ignore' is set to 0 by
+default to retain the performance advantage of using external commands.
+
+Note #4: when changing the option's variable type, remember to |:unlet| it
+first or restart Vim to avoid the "E706: Variable type mismatch" error.
+
+Note #5: you can use a |b:var| to set this option on a per buffer basis.
+
+                                                        *'g:ctrlp_max_history'*
+The maximum number of input strings you want CtrlP to remember. The default
+value mirrors Vim's global |'history'| option: >
+  let g:ctrlp_max_history = &history
+<
+Set to 0 to disable prompt's history. Browse the history with <c-n> and <c-p>.
+
+                                                      *'g:ctrlp_open_new_file'*
+Use this option to specify how the newly created file is to be opened when
+pressing <c-y>: >
+  let g:ctrlp_open_new_file = 'v'
+<
+  t - in a new tab.
+  h - in a new horizontal split.
+  v - in a new vertical split.
+  r - in the current window.
+
+                                                *'g:ctrlp_open_multiple_files'*
+If non-zero, this will enable opening multiple files with <c-z> and <c-o>: >
+  let g:ctrlp_open_multiple_files = 'v'
+<
+Example: >
+  let g:ctrlp_open_multiple_files = '2vjr'
+<
+For the number:
+  - If given, it'll be used as the maximum number of windows or tabs to create
+    when opening the files (the rest will be opened as hidden buffers).
+  - If not given, <c-o> will open all files, each in a new window or new tab.
+
+For the letters:
+  t - each file in a new tab.
+  h - each file in a new horizontal split.
+  v - each file in a new vertical split.
+  i - all files as hidden buffers.
+  j - after opening, jump to the first opened tab or window.
+  r - open the first file in the current window, then the remaining files in
+      new splits or new tabs depending on which of "h", "v" and "t" is also
+      present.
+
+                                                            *'g:ctrlp_arg_map'*
+When this is set to 1, the <c-o> and <c-y> mappings will accept one extra key
+as an argument to override their default behavior: >
+  let g:ctrlp_arg_map = 0
+<
+Pressing <c-o> or <c-y> will then prompt for a keypress. The key can be:
+  t - open in tab(s)
+  h - open in horizontal split(s)
+  v - open in vertical split(s)
+  i - open as hidden buffers (for <c-o> only)
+  c - clear the marked files (for <c-o> only)
+  r - open in the current window (for <c-y> only)
+  <esc>, <c-c>, <c-u> - cancel and go back to the prompt.
+  <cr> - use the default behavior specified with |g:ctrlp_open_new_file| and
+  |g:ctrlp_open_multiple_files|.
+
+                                                    *'g:ctrlp_follow_symlinks'*
+If non-zero, CtrlP will follow symbolic links when listing files: >
+  let g:ctrlp_follow_symlinks = 0
+<
+  0 - don't follow symbolic links.
+  1 - follow but ignore looped internal symlinks to avoid duplicates.
+  2 - follow all symlinks indiscriminately.
+
+Note: does not apply when a command defined with |g:ctrlp_user_command| is
+being used.
+
+                                                        *'g:ctrlp_lazy_update'*
+Set this to 1 or bigger to enable the lazy-update feature: only update the
+match window after typing's been stopped for a certain amount of time: >
+  let g:ctrlp_lazy_update = 0
+<
+If is 1, update after 250ms that value as default tuned. If bigger than 1, the
+number will be used as the delay time in milliseconds.
+
+                                                      *'g:ctrlp_default_input'*
+Set this to 1 to enable seeding the prompt with the current file's relative
+path: >
+  let g:ctrlp_default_input = 0
+<
+Instead of 1 or 0, if the value of the option is a string, it'll be used as-is
+as the default input: >
+  let g:ctrlp_default_input = 'anystring'
+<
+This option works well together with |g:ctrlp_open_single_match|
+
+
+                                                 *'g:ctrlp_match_current_file'*
+Includes the current file in the match entries: >
+  let g:ctrlp_match_current_file = 1
+
+By default, the current file is excluded from the list.
+
+Note: With the exception of |:CtrlPMRU|, does not apply when
+|g:ctrlp_match_func| is used.
+
+                                                              *'g:ctrlp_types'*
+Set this to list of names to customize core types: >
+  let g:ctrlp_types = ['mru', 'fil']
+
+By default, the types are: >
+  let g:ctrlp_types = ['fil', 'buf', 'mru']
+
+                                                             *'g:ctrlp_abbrev'*
+Define input abbreviations that can be expanded (either internally or visibly)
+in the prompt: >
+  let g:ctrlp_abbrev = {}
+<
+Examples: >
+  let g:ctrlp_abbrev = {
+    \ 'gmode': 'i',
+    \ 'abbrevs': [
+      \ {
+        \ 'pattern': '^cd b',
+        \ 'expanded': '@cd ~/.vim/bundle',
+        \ 'mode': 'pfrz',
+      \ },
+      \ {
+        \ 'pattern': '\(^@.\+\|\\\@<!:.\+\)\@<! ',
+        \ 'expanded': '.\{-}',
+        \ 'mode': 'pfr',
+      \ },
+      \ {
+        \ 'pattern': '\\\@<!:.\+\zs\\\@<! ',
+        \ 'expanded': '\ ',
+        \ 'mode': 'pfz',
+      \ },
+      \ ]
+    \ }
+<
+The 'pattern' string is regexp matched against the entered input. The expansion
+is as if the 'expanded' string was typed into the prompt.
+
+For 'gmode' (optional):
+  i - expand internally (default).
+  t - insert the expanded results into the prompt as you type.
+  k - insert the expanded results when a non-keyword character is typed. Only
+      applies when "t" is also present.
+
+For 'mode' (of each entry; optional):
+  f - only in filename mode.
+  p - only in full path mode.
+  r - only in regexp mode.
+  z - only in fuzzy mode.
+  n - only when creating a new file with <c-y> (use the expanded string in the
+      new filename).
+  c - only when auto-completing directory names with <tab> (expand the pattern
+      immediately before doing the auto-completion).
+  <empty> or not defined - always enable.
+
+Note: the abbrev entries are evaluated in sequence, so a later entry can be
+evaluated against the expanded result of a previous entry; this includes itself
+when 'gmode' is "t".
+
+                                                           *'g:ctrlp_key_loop'*
+An experimental feature. Set this to 1 to enable input looping for the typing
+of multi-byte characters: >
+  let g:ctrlp_key_loop = 0
+<
+Note #1: when set, this option resets the |g:ctrlp_lazy_update| option.
+
+Note #2: you can toggle this feature inside the prompt with a custom mapping: >
+  let g:ctrlp_prompt_mappings = { 'ToggleKeyLoop()': ['<F3>'] }
+<
+
+                                                    *'g:ctrlp_prompt_mappings'*
+Use this to customize the mappings inside CtrlP's prompt to your liking. You
+only need to keep the lines that you've changed the values (inside []): >
+  let g:ctrlp_prompt_mappings = {
+    \ 'PrtBS()':              ['<bs>', '<c-]>'],
+    \ 'PrtDelete()':          ['<del>'],
+    \ 'PrtDeleteWord()':      ['<c-w>'],
+    \ 'PrtClear()':           ['<c-u>'],
+    \ 'PrtSelectMove("j")':   ['<c-j>', '<down>'],
+    \ 'PrtSelectMove("k")':   ['<c-k>', '<up>'],
+    \ 'PrtSelectMove("t")':   ['<Home>', '<kHome>'],
+    \ 'PrtSelectMove("b")':   ['<End>', '<kEnd>'],
+    \ 'PrtSelectMove("u")':   ['<PageUp>', '<kPageUp>'],
+    \ 'PrtSelectMove("d")':   ['<PageDown>', '<kPageDown>'],
+    \ 'PrtHistory(-1)':       ['<c-n>'],
+    \ 'PrtHistory(1)':        ['<c-p>'],
+    \ 'AcceptSelection("e")': ['<cr>', '<2-LeftMouse>'],
+    \ 'AcceptSelection("h")': ['<c-x>', '<c-cr>', '<c-s>'],
+    \ 'AcceptSelection("t")': ['<c-t>'],
+    \ 'AcceptSelection("v")': ['<c-v>', '<RightMouse>'],
+    \ 'ToggleFocus()':        ['<s-tab>'],
+    \ 'ToggleRegex()':        ['<c-r>'],
+    \ 'ToggleByFname()':      ['<c-d>'],
+    \ 'ToggleType(1)':        ['<c-f>', '<c-up>'],
+    \ 'ToggleType(-1)':       ['<c-b>', '<c-down>'],
+    \ 'PrtExpandDir()':       ['<tab>'],
+    \ 'PrtInsert("c")':       ['<MiddleMouse>', '<insert>'],
+    \ 'PrtInsert()':          ['<c-\>'],
+    \ 'PrtCurStart()':        ['<c-a>'],
+    \ 'PrtCurEnd()':          ['<c-e>'],
+    \ 'PrtCurLeft()':         ['<c-h>', '<left>', '<c-^>'],
+    \ 'PrtCurRight()':        ['<c-l>', '<right>'],
+    \ 'PrtClearCache()':      ['<F5>'],
+    \ 'PrtDeleteEnt()':       ['<F7>'],
+    \ 'CreateNewFile()':      ['<c-y>'],
+    \ 'MarkToOpen()':         ['<c-z>'],
+    \ 'OpenMulti()':          ['<c-o>'],
+    \ 'PrtExit()':            ['<esc>', '<c-c>', '<c-g>'],
+    \ }
+<
+Note: if pressing <bs> moves the cursor one character to the left instead of
+deleting a character for you, add this to your |.vimrc| to disable the plugin's
+default <c-h> mapping: >
+  let g:ctrlp_prompt_mappings = { 'PrtCurLeft()': ['<left>', '<c-^>'] }
+<
+
+                                                    *'g:ctrlp_line_prefix'*
+This prefix will be prepended to each line in ctrlp's item listing.
+default: >
+  let g:ctrlp_line_prefix = '> '
+<
+
+                                                    *'g:ctrlp_open_single_match'*
+List of CtrlP modes for which CtrlP should accept an entry directly, if only
+one candidate exists.
+Example: >
+  let g:ctrlp_open_single_match = ['buffer tags', 'buffer']
+<
+This is currently only really useful together with |g:ctrlp_default_input|
+set before launching, and cleared afterwards, with a function such as
+following: >
+  fu! <SID>tagsUnderCursor()
+    try
+      let default_input_save = get(g:, 'ctrlp_default_input', '')
+      let g:ctrlp_default_input = expand('<cword>')
+      CtrlPBufTagAll
+    finally
+      if exists('default_input_save')
+        let g:ctrlp_default_input = default_input_save
+      endif
+    endtry
+  endfu
+>
+<
+----------------------------------------
+MRU mode options:~
+
+                                                           *'g:ctrlp_mruf_max'*
+Specify the number of recently opened files you want CtrlP to remember: >
+  let g:ctrlp_mruf_max = 250
+<
+
+                                                       *'g:ctrlp_mruf_exclude'*
+Files you don't want CtrlP to remember. Use regexp to specify the patterns: >
+  let g:ctrlp_mruf_exclude = ''
+<
+Examples: >
+  let g:ctrlp_mruf_exclude = '/tmp/.*\|/temp/.*' " MacOSX/Linux
+  let g:ctrlp_mruf_exclude = '^C:\\dev\\tmp\\.*' " Windows
+<
+
+                                                       *'g:ctrlp_mruf_include'*
+And if you want CtrlP to only remember some files, specify them here: >
+  let g:ctrlp_mruf_include = ''
+<
+Example: >
+  let g:ctrlp_mruf_include = '\.py$\|\.rb$'
+<
+
+                                                 *'g:ctrlp_tilde_homedir'*
+Set this to 1 to save every MRU file path $HOME/$filepath in the $HOME dir
+  as ~/$filepath instead of $HOME/$filepath : >
+  let g:ctrlp_tilde_homedir = 0
+<
+Note: This applies also to all dir paths stored by :CtrlPBookmarkDirAdd!
+
+                                                      *'g:ctrlp_mruf_relative'*
+Set this to 1 to show only MRU files in the current working directory: >
+  let g:ctrlp_mruf_relative = 0
+<
+Note: you can use a custom mapping to toggle this option inside the prompt: >
+  let g:ctrlp_prompt_mappings = { 'ToggleMRURelative()': ['<F2>'] }
+<
+                                                 *'g:ctrlp_mruf_default_order'*
+Set this to 1 to disable sorting when searching in MRU mode: >
+  let g:ctrlp_mruf_default_order = 0
+<
+
+                                                *'g:ctrlp_mruf_case_sensitive'*
+Match this with your file system case-sensitivity setting to avoid duplicate
+MRU entries: >
+  let g:ctrlp_mruf_case_sensitive = 1
+<
+
+                                                *'g:ctrlp_mruf_save_on_update'*
+Set this to 0 to disable saving of the MRU list to hard drive whenever a new
+entry is added, saving will then only occur when exiting Vim: >
+  let g:ctrlp_mruf_save_on_update = 1
+<
+                                                *'g:ctrlp_bufname_mod'*
+Modify file name section according to modificator string. See |filename-modifiers|. >
+  let g:ctrlp_bufname_mod = ':t'
+<
+                                                *'g:ctrlp_bufpath_mod'*
+Modify file path section according to modificator string. See |filename-modifiers|. >
+  let g:ctrlp_bufpath_mod = ':~:.:h'
+<
+----------------------------------------
+Advanced options:~
+
+                                                          *'g:ctrlp_open_func'*
+Define a custom function to open the selected file: >
+  let g:ctrlp_open_func = {}
+<
+Example: >
+  let g:ctrlp_open_func = {
+    \ 'files'     : 'Function_Name_1',
+    \ 'buffers'   : 'Function_Name_2',
+    \ 'mru files' : 'Function_Name_3',
+    \ }
+<
+Structure of the functions: >
+  function! Function_Name(action, line)
+    " Arguments:
+    " |
+    " +- a:action : The opening action:
+    " |             + 'e' : user pressed <cr>  (default)
+    " |             + 'h' : user pressed <c-x> (default)
+    " |             + 'v' : user pressed <c-v> (default)
+    " |             + 't' : user pressed <c-t> (default)
+    " |             + 'x' : user used the <c-o> console dialog (default) and
+    " |                     chose "e[x]ternal".
+    " |
+    " +- a:line   : The selected line.
+
+  endfunction
+<
+Note: does not apply when opening multiple files with <c-z> and <c-o>.
+
+Example: open HTML files in the default web browser when <c-t> is pressed and
+in Vim otherwise >
+  function! HTMLOpenFunc(action, line)
+    if a:action =~ '^[tx]$' && fnamemodify(a:line, ':e') =~? '^html\?$'
+
+      " Get the filename
+      let filename = fnameescape(fnamemodify(a:line, ':p'))
+
+      " Close CtrlP
+      call ctrlp#exit()
+
+      " Open the file
+      silent! execute '!xdg-open' filename
+
+    elseif a:action == 'x' && fnamemodify(a:line, ':e') !~? '^html\?$'
+
+      " Not a HTML file, simulate pressing <c-o> again and wait for new input
+      call feedkeys("\<c-o>")
+
+    else
+
+      " Use CtrlP's default file opening function
+      call call('ctrlp#acceptfile', [a:action, a:line])
+
+    endif
+  endfunction
+
+  let g:ctrlp_open_func = { 'files': 'HTMLOpenFunc' }
+<
+
+                                                        *'g:ctrlp_status_func'*
+Use this to customize the statuslines for the CtrlP window: >
+  let g:ctrlp_status_func = {}
+<
+Example: >
+  let g:ctrlp_status_func = {
+    \ 'main': 'Function_Name_1',
+    \ 'prog': 'Function_Name_2',
+    \ }
+<
+Structure of the functions: >
+  " Main statusline
+  function! Function_Name_1(focus, byfname, regex, prev, item, next, marked)
+    " Arguments:
+    " |
+    " +- a:focus   : The focus of the prompt: "prt" or "win".
+    " |
+    " +- a:byfname : In filename mode or in full path mode: "file" or "path".
+    " |
+    " +- a:regex   : In regex mode: 1 or 0.
+    " |
+    " +- a:prev    : The previous search mode.
+    " |
+    " +- a:item    : The current search mode.
+    " |
+    " +- a:next    : The next search mode.
+    " |
+    " +- a:marked  : The number of marked files, or a comma separated list of
+    "                the marked filenames.
+
+    return full_statusline
+  endfunction
+
+  " Progress statusline
+  function! Function_Name_2(str)
+    " a:str : Either the number of files scanned so far, or a string indicating
+    "         the current directory is being scanned with a user_command.
+
+    return full_statusline
+  endfunction
+<
+See https://gist.github.com/1610859 for a working example.
+
+                                                        *'g:ctrlp_buffer_func'*
+Specify the functions that will be called after entering and before exiting the
+CtrlP buffer: >
+  let g:ctrlp_buffer_func = {}
+<
+Example: >
+  let g:ctrlp_buffer_func = {
+    \ 'enter': 'Function_Name_1',
+    \ 'exit':  'Function_Name_2',
+    \ }
+<
+
+                                                         *'g:ctrlp_match_func'*
+Set an external fuzzy matching function for CtrlP to use: >
+  let g:ctrlp_match_func = {}
+<
+Example: >
+  let g:ctrlp_match_func = { 'match': 'Function_Name' }
+<
+Structure of the function: >
+  function! Function_Name(items, str, limit, mmode, ispath, crfile, regex)
+    " Arguments:
+    " |
+    " +- a:items  : The full list of items to search in.
+    " |
+    " +- a:str    : The string entered by the user.
+    " |
+    " +- a:limit  : The max height of the match window. Can be used to limit
+    " |             the number of items to return.
+    " |
+    " +- a:mmode  : The match mode. Can be one of these strings:
+    " |             + "full-line": match the entire line.
+    " |             + "filename-only": match only the filename.
+    " |             + "first-non-tab": match until the first tab char.
+    " |             + "until-last-tab": match until the last tab char.
+    " |
+    " +- a:ispath : Is 1 when searching in file, buffer, mru, mixed, dir, and
+    " |             rtscript modes. Is 0 otherwise.
+    " |
+    " +- a:crfile : The file in the current window. Should be excluded from the
+    " |             results when a:ispath == 1.
+    " |
+    " +- a:regex  : In regex mode: 1 or 0.
+
+    return list_of_matched_items
+  endfunction
+<
+
+Note: you can extend any of the above options with { 'arg_type': 'dict' } to
+enable passing all the function arguments in a single Dictionary argument. Use
+the existing argument names as keys in this Dictionary.
+
+Example: >
+  let g:ctrlp_status_func = {
+    \ 'arg_type' : 'dict',
+    \ 'enter': 'Function_Name_1',
+    \ 'exit':  'Function_Name_2',
+    \ }
+
+  function! Function_Name_1(dict)
+    " where dict == {
+    " \ 'focus':   value,
+    " \ 'byfname': value,
+    " \ 'regex':   value,
+    " \ ...
+    " }
+  endfunction
+<
+                                                       *'g:ctrlp_brief_prompt'*
+When this is set to 1, the <bs> on empty prompt exit CtrlP.
+
+                                                        *'g:ctrlp_use_readdir'*
+Unlike kien/ctrlp.vim, ctrlpvim/ctrlp.vim uses readdir() instead of globpath()
+for speed. Set this option to 0 if you want to revert to the original
+behavior.
+Example: >
+  let g:ctrlp_use_readdir = 0
+<
+                                                          *ctrlp-default-value*
+Otherwise, you can use below to change default value.
+Example: >
+  let g:ctrlp_path_nolim = 1
+
+This is possible to change no-limit mode for match type "path".
+
+                                                          *ctrlp_compare_lim*
+If your search directory has more number of files than this limit, no sorting
+will be performed for the first readout. You can improve CtrlP performance by
+setting this to a proper value, but no sorting on the first readout can reduce
+the quality of fuzzy finding results.
+Example:
+  let g:ctrlp_compare_lim = 100
+
+Set the value to 0 for unlimited sorting. Default is 0.  
+
+
+===============================================================================
+COMMANDS                                                       *ctrlp-commands*
+
+                                                                       *:CtrlP*
+:CtrlP [starting-directory]
+   Open CtrlP in find file mode.
+
+   If no argument is given, the value of |g:ctrlp_working_path_mode| will be
+   used to determine the starting directory.  See |:CtrlPCurFile| and
+   |:CtrlPCurWD| to temporarily override the setting.
+
+   You can use <tab> to auto-complete the [starting-directory] when typing it.
+
+                                                                 *:CtrlPBuffer*
+:CtrlPBuffer
+   Open CtrlP in find buffer mode.
+
+                                                                *:CtrlPCurFile*
+:CtrlPCurFile
+    This acts like |:CtrlP| with |g:ctrlp_working_path_mode| = 'c' and ignores
+    the variable's current value.
+
+                                                                  *:CtrlPCurWD*
+:CtrlPCurWD
+    This acts like |:CtrlP| with |g:ctrlp_working_path_mode| = 'd' and ignores
+    the variable's current value.
+
+                                                                    *:CtrlPMRU*
+:CtrlPMRU
+   Open CtrlP in find Most-Recently-Used file mode.
+
+                                                               *:CtrlPLastMode*
+:CtrlPLastMode [--dir]
+   Open CtrlP in the last mode used. When having the "--dir" argument, also
+   reuse the last working directory.
+
+                                                                   *:CtrlPRoot*
+:CtrlPRoot
+    This acts like |:CtrlP| with |g:ctrlp_working_path_mode| = 'r' and ignores
+    the variable's current value.
+
+                                                             *:CtrlPClearCache*
+:CtrlPClearCache
+   Flush the cache for the current working directory. The same as pressing <F5>
+   inside CtrlP.
+   To enable or disable caching, use the |g:ctrlp_use_caching| option.
+
+                                                         *:CtrlPClearAllCaches*
+:CtrlPClearAllCaches
+   Delete all the cache files saved in |g:ctrlp_cache_dir| location.
+
+-------------------------------------------------------------------------------
+For commands provided by bundled extensions, see |ctrlp-extensions|.
+
+===============================================================================
+MAPPINGS                                                       *ctrlp-mappings*
+
+                                                                *'ctrlp-<c-p>'*
+<c-p>
+   Default |Normal| mode mapping to open the CtrlP prompt in find file mode.
+
+----------------------------------------
+Once inside the prompt:~
+
+  <c-d>
+    Toggle between full-path search and filename only search.
+    Note: in filename mode, the prompt's base is '>d>' instead of '>>>'
+
+  <c-r>                                                    *'ctrlp-fullregexp'*
+    Toggle between the string mode and full regexp mode.
+    Note: in full regexp mode, the prompt's base is 'r>>' instead of '>>>'
+
+    See also: |input-formats| (guide) and |g:ctrlp_regexp_search| (option).
+
+  <c-f>, 'forward'
+  <c-up>
+    Scroll to the 'next' search mode in the sequence.
+
+  <c-b>, 'backward'
+  <c-down>
+    Scroll to the 'previous' search mode in the sequence.
+
+  <tab>                                                *'ctrlp-autocompletion'*
+    Auto-complete directory names under the current working directory inside
+    the prompt.
+
+  <s-tab>
+    Toggle the focus between the match window and the prompt.
+
+  <esc>,
+  <c-c>,
+  <c-g>
+    Exit CtrlP.
+
+Moving:~
+
+  <c-j>,
+  <down>
+    Move selection down.
+
+  <c-k>,
+  <up>
+    Move selection up.
+
+  <c-a>
+    Move the cursor to the 'start' of the prompt.
+
+  <c-e>
+    Move the cursor to the 'end' of the prompt.
+
+  <c-h>,
+  <left>,
+  <c-^>
+    Move the cursor one character to the 'left'.
+
+  <c-l>,
+  <right>
+    Move the cursor one character to the 'right'.
+
+Editing:~
+
+  <c-]>,
+  <bs>
+    Delete the preceding character.
+
+  <del>
+    Delete the current character.
+
+  <c-w>
+    Delete a preceding inner word.
+
+  <c-u>
+    Clear the input field.
+
+Browsing input history:~
+
+  <c-n>
+    Next string in the prompt's history.
+
+  <c-p>
+    Previous string in the prompt's history.
+
+Opening/Creating a file:~
+
+  <cr>
+    Open the selected file in the 'current' window if possible.
+
+  <c-t>
+    Open the selected file in a new 'tab'.
+
+  <c-v>
+    Open the selected file in a 'vertical' split.
+
+  <c-x>,
+  <c-cr>,
+  <c-s>
+    Open the selected file in a 'horizontal' split.
+
+  <c-y>
+    Create a new file and its parent directories.
+
+Opening multiple files:~
+
+  <c-z>
+    - Mark/unmark a file to be opened with <c-o>.
+    - Mark/unmark a file to create a new file in its directory using <c-y>.
+
+  <c-o>
+    - Open files marked by <c-z>.
+    - When no file has been marked by <c-z>, open a console dialog with the
+      following options:
+
+      Open the selected file:
+        t - in a tab page.
+        v - in a vertical split.
+        h - in a horizontal split.
+        r - in the current window.
+        i - as a hidden buffer.
+        x - (optional) with the function defined in |g:ctrlp_open_func|.
+
+      Other options (not shown):
+        a - mark all files in the match window.
+        d - change CtrlP's local working directory to the selected file's
+            directory and switch to find file mode.
+
+Function keys:~
+
+  <F5>
+    - Refresh the match window and purge the cache for the current directory.
+    - Remove deleted files from the MRU list.
+
+  <F7>
+    MRU mode:
+    - Wipe the list.
+    - Delete entries marked by <c-z>.
+    Buffer mode:
+    - Delete entry under the cursor or delete multiple entries marked by <c-z>.
+
+
+Pasting:~
+
+  <Insert>,                                                   *'ctrlp-pasting'*
+  <MiddleMouse>
+    Paste the clipboard content into the prompt.
+
+  <c-\>
+    Open a console dialog to paste <cword>, <cfile>, the content of the search
+    register, the last visual selection, the clipboard or any register into the
+    prompt.
+
+Choose your own mappings with |g:ctrlp_prompt_mappings|.
+
+----------------------------------------
+When inside the match window (press <s-tab> to switch):~
+
+  a-z
+  0-9
+  ~^-=;`',.+!@#$%&_(){}[]
+    Cycle through the lines which have the matching first character.
+
+===============================================================================
+INPUT FORMATS                                             *ctrlp-input-formats*
+
+Formats for inputting in the prompt:~
+
+a)  Simple string.
+
+    E.g. 'abc' is understood internally as 'a[^a]\{-}b[^b]\{-}c'
+
+b)  When in regexp mode, the input string's treated as a Vim's regexp |pattern|
+    without any modification.
+
+    E.g. 'abc\d*efg' will be read as 'abc\d*efg'.
+
+    See |ctrlp-fullregexp| (keymap) and |g:ctrlp_regexp_search| (option) for
+    how to enable regexp mode.
+
+c)  End the string with a colon ':' followed by a Vim command to execute that
+    command after opening the file. If you need to use ':' literally, escape it
+    with a backslash: '\:'. When opening multiple files, the command will be
+    executed on each opening file.
+
+    E.g. Use ':45' to jump to line 45.
+
+         Use ':/any\:string' to jump to the first instance of 'any:string'.
+
+         Use ':+setf\ myfiletype|50' to set the filetype to 'myfiletype', then
+         jump to line 50.
+
+         Use ':diffthis' when opening multiple files to run |:diffthis| on the
+         first 4 files.
+
+    See also: Vim's |++opt| and |+cmd|.
+
+d)  Input two dots '..' and then hit the <Enter> key to go upward the directory tree by 1 level. To go up
+    multiple levels, use one extra dot for each extra level:
+>
+         Raw input    Interpreted as
+         ..<Cr>           ../
+         ...<Cr>          ../../
+         ....<Cr>         ../../../
+<
+    Note: if the parent directories are large and uncached, this can be slow.
+
+    You can also use '@cd path/' to change CtrlP's local working directory.
+    Use '@cd %:h' to change to the directory of the current file.
+
+e)  Similarly, submit '/' or '\' to find and go to the project's root.
+
+    If the project is large, using a VCS listing command to look for files
+    might help speeding up the initial scan (see |g:ctrlp_user_command| for more
+    details).
+
+    Note: d) and e) only work in file, directory and mixed modes.
+
+f)  Type the name of a non-existent file and press <c-y> to create it. Mark a
+    file with <c-z> to create the new file in the same directory as the marked
+    file.
+
+    E.g. Using 'newdir/newfile.txt' will create a directory named 'newdir' as
+         well as a file named 'newfile.txt'.
+
+         If an entry 'some/old/dirs/oldfile.txt' is marked with <c-z>, then
+         'newdir' and 'newfile.txt' will be created under 'some/old/dirs'. The
+         final path will then be 'some/old/dirs/newdir/newfile.txt'.
+
+    Note: use '\' in place of '/' on Windows (if |'shellslash'| is not set).
+
+g)  In filename mode (toggle with <c-d>), you can use one primary pattern and
+    one refining pattern separated by a semicolon. Both patterns work like (a),
+    or (b) when in regexp mode.
+
+h)  Submit ? to open this help file.
+
+===============================================================================
+EXTENSIONS                                                   *ctrlp-extensions*
+
+Extensions are optional. To enable an extension, add its name to the variable
+g:ctrlp_extensions: >
+  let g:ctrlp_extensions = ['tag', 'buffertag', 'quickfix', 'dir', 'rtscript',
+                          \ 'undo', 'line', 'changes', 'mixed', 'bookmarkdir']
+<
+The order of the items will be the order they appear on the statusline and when
+using <c-f>, <c-b>.
+
+Available extensions:~
+
+                                                                    *:CtrlPTag*
+  * Tag mode:~
+    - Name: 'tag'
+    - Command: ":CtrlPTag"
+    - Search for a tag within a generated central tags file, and jump to the
+      definition. Use the Vim's option |'tags'| to specify the names and the
+      locations of the tags file(s).
+      E.g. set tags+=doc/tags
+
+                                                                 *:CtrlPBufTag*
+                                                              *:CtrlPBufTagAll*
+  * Buffer Tag mode:~
+    - Name: 'buffertag'
+    - Commands: ":CtrlPBufTag [buffer]",
+                ":CtrlPBufTagAll".
+    - Search for a tag within the current buffer or all listed buffers and jump
+      to the definition. Requires |exuberant_ctags| or compatible programs.
+
+                                                               *:CtrlPQuickfix*
+  * Quickfix mode:~
+    - Name: 'quickfix'
+    - Command: ":CtrlPQuickfix"
+    - Search for an entry in the current quickfix errors and jump to it.
+
+                                                                    *:CtrlPDir*
+  * Directory mode:~
+    - Name: 'dir'
+    - Command: ":CtrlPDir [starting-directory]"
+    - Search for a directory and change the working directory to it.
+    - Mappings:
+      + <cr> change the local working directory for CtrlP and keep it open.
+      + <c-t> change the global working directory (exit).
+      + <c-v> change the local working directory for the current window (exit).
+      + <c-x> change the global working directory to CtrlP's current local
+        working directory (exit).
+
+                                                                    *:CtrlPRTS*
+  * Runtime script mode:~
+    - Name: 'rtscript'
+    - Command: ":CtrlPRTS"
+    - Search for files (vimscripts, docs, snippets...) in runtimepath.
+
+                                                                   *:CtrlPUndo*
+  * Undo mode:~
+    - Name: 'undo'
+    - Command: ":CtrlPUndo"
+    - Browse undo history.
+
+                                                                   *:CtrlPLine*
+  * Line mode:~
+    - Name: 'line'
+    - Command: ":CtrlPLine [buffer]"
+    - Search for a line in all listed buffers or in the specified [buffer].
+
+                                                                 *:CtrlPChange*
+                                                              *:CtrlPChangeAll*
+  * Change list mode:~
+    - Name: 'changes'
+    - Commands: ":CtrlPChange [buffer]",
+                ":CtrlPChangeAll".
+    - Search for and jump to a recent change in the current buffer or in all
+      listed buffers.
+
+                                                                  *:CtrlPMixed*
+  * Mixed mode:~
+    - Name: 'mixed'
+    - Command: ":CtrlPMixed"
+    - Search in files, buffers and MRU files at the same time.
+
+                                                            *:CtrlPBookmarkDir*
+                                                         *:CtrlPBookmarkDirAdd*
+  * BookmarkDir mode:~
+    - Name: 'bookmarkdir'
+    - Commands: ":CtrlPBookmarkDir",
+                ":CtrlPBookmarkDirAdd  [directory] [TITLE]".
+                ":CtrlPBookmarkDirAdd! [directory] [TITLE]".
+
+    - Search for a bookmarked directory and change the working directory to it.
+    - Add either the dir [directory], if supplied, or otherwise ask for it,
+      under the title given by either [TITLE], if supplied, or otherwise ask for
+      it, to the CtrlPBookmarkDir list.
+    - Add either the dir [directory], if supplied, or otherwise the current
+      work dir ( [CWD] ) under the title given by either [TITLE], if supplied,
+      or otherwise [CWD] to the CtrlPBookmarkDir list.
+
+    The last command can be used to add all recently used work dirs to the
+    CtrlPBookmarkDir list by an autocommand like
+
+    >
+    augroup CtrlPDirMRU
+      autocmd!
+      autocmd FileType * if &modifiable | execute 'silent CtrlPBookmarkDirAdd! %:p:h' | endif
+    augroup END
+<
+
+    - Mappings:
+      + <cr> change the local working directory for CtrlP, keep it open and
+        switch to find file mode.
+      + <c-x> change the global working directory (exit).
+      + <c-v> change the local working directory for the current window (exit).
+      + <F7>
+        - Wipe bookmark list.
+        - Delete entries marked by <c-z>.
+
+                                                 *ctrlp-autoignore-extension*
+  * Autoignore mode:~
+    - Name: 'autoignore'
+
+    - This extension doesn't add new commands. It adds support for per-project
+      ignore patterns (as per |ctrlp_custom_ignore|) via a `.ctrlpignore` file
+      at the root of the project. It's basically like a `.gitignore` or
+      `.hgignore` for CtrlP.
+
+      Note: auto-ignore won't work when |g:ctrlp_user_command| is used.
+
+      Note: `.ctrlpignore` will be added to the root markers (see
+      |g:ctrlp_root_markers|).
+
+    - Ignore file syntax:
+      Empty lines, and lines starting with `#` (comments) are ignored.
+
+      Other lines are treated like regular expression patterns. See *string-match*
+      for how patterns are used. Anything that matches any of the patterns will be
+      ignored from CtrlP's search results.
+
+      Example:
+
+        \.tmp$
+        ^generated/
+        local\.cfg
+
+      Note: patterns should use forward slashes, even on Windows.
+
+      You can also switch to a glob-like syntax like this:
+
+        syntax:wildignore
+        *.tar.gz
+        *.tmp
+
+      This will temporarily add each pattern to |'wildignore'| for the
+      duration of the file scan, and remove them at the end.
+
+      You can switch back to the default regular-expression-based patterns by
+      writing:
+
+        syntax:regexp
+
+      You can also specify a match on only a given type of item:
+
+        dir:build
+        file:foo\.txt
+
+      This will only ignore directories with "build" in them, and files with
+      "foo.txt" in them. Not files with "build" in them or vice-versa.
+
+      Note: to ignore a root directory "build", and not _any_ directory with
+      "build" in it, you can root the regex: ^build$
+
+    - FAQ:
+      Q: Why can't CtrlP support `.gitignore` or `.hgignore` natively?
+
+      A: Those files look at first like they may contain all the patterns
+      you'd want to exclude from CtrlP already. However, more often than not,
+      there are some differences. Those files list patterns that should not be
+      included in source-control. This includes things you want to ignore, but
+      also things you may not want to: local settings, external packages and
+      dependencies, etc. The author felt the trouble of supporting various
+      syntaxes was too much compared to just copy/pasting a few lines. Feel
+      free to contribute a patch if you disagree :)
+
+      Q: I enabled |ctrlp-autoignore-extension|, or edited `.ctrlpignore`, but
+      none of the new patterns are working. What did I do wrong?
+
+      A: Probably nothing! CtrlP can cache search results for faster response
+      times. You can hit <F5> to force it to refresh. This will use the newer
+      ignore patterns if the `.ctrlpignore` file has changed, too.
+
+
+----------------------------------------
+Buffer Tag mode options:~
+
+                                                   *'g:ctrlp_buftag_ctags_bin'*
+If ctags isn't in your $PATH, or a ctags binary exists in either
+/opt/local/bin or /usr/local/bin, use this to set its location: >
+  let g:ctrlp_buftag_ctags_bin = ''
+<
+
+                                                   *'g:ctrlp_buftag_systemenc'*
+Match this with your OS's encoding (not Vim's). The default value mirrors Vim's
+global |'encoding'| option: >
+  let g:ctrlp_buftag_systemenc = &encoding
+<
+
+                                                       *'g:ctrlp_buftag_types'*
+Use this to set the arguments for ctags, jsctags... for a given filetype: >
+  let g:ctrlp_buftag_types = ''
+<
+Examples: >
+  let g:ctrlp_buftag_types = {
+    \ 'erlang'     : '--language-force=erlang --erlang-types=drmf',
+    \ 'javascript' : {
+      \ 'bin': 'jsctags',
+      \ 'args': '-f -',
+      \ },
+    \ }
+<
+
+===============================================================================
+CUSTOMIZATION                                             *ctrlp-customization*
+
+Highlighting:~
+  * For the CtrlP buffer:
+    CtrlPNoEntries : the message when no match is found (Error)
+    CtrlPMatch     : the matched pattern (Identifier)
+    CtrlPLinePre   : the line prefix '>' in the match window
+    CtrlPPrtBase   : the prompt's base (Comment)
+    CtrlPPrtText   : the prompt's text (|hl-Normal|)
+    CtrlPPrtCursor : the prompt's cursor when moving over the text (Constant)
+
+  * Buffer explorer mode:
+    CtrlPBufferNr     : buffer number
+    CtrlPBufferInd    : '+', '-', '=' and '#' indicators (see |:buffers|)
+    CtrlPBufferHid    : hidden buffer
+    CtrlPBufferHidMod : hidden and modified buffer
+    CtrlPBufferVis    : visible buffer
+    CtrlPBufferVisMod : visible and modified buffer
+    CtrlPBufferCur    : current buffer
+    CtrlPBufferCurMod : current and modified buffer
+    CtrlPBufferPath   : buffer path
+
+  * In extensions:
+    CtrlPTabExtra  : the part of each line that's not matched against (Comment)
+    CtrlPBufName   : the buffer name an entry belongs to (|hl-Directory|)
+    CtrlPTagKind   : the kind of the tag in buffer-tag mode (|hl-Title|)
+    CtrlPqfLineCol : the line and column numbers in quickfix mode (Comment)
+    CtrlPUndoT     : the elapsed time in undo mode (|hl-Directory|)
+    CtrlPUndoBr    : the square brackets [] in undo mode (Comment)
+    CtrlPUndoNr    : the undo number inside [] in undo mode (String)
+    CtrlPUndoSv    : the point where the file was saved (Comment)
+    CtrlPUndoPo    : the current position in the undo tree (|hl-Title|)
+    CtrlPBookmark  : the name of the bookmark (Identifier)
+
+Statuslines:~
+  * Highlight groups:
+    CtrlPMode1 : 'file' or 'path' or 'line', and the current mode (Character)
+    CtrlPMode2 : 'prt' or 'win', 'regex', the working directory (|hl-LineNr|)
+    CtrlPStats : the scanning status (Function)
+
+  For rebuilding the statuslines, see |g:ctrlp_status_func|.
+
+===============================================================================
+MISCELLANEOUS CONFIGS                             *ctrlp-miscellaneous-configs*
+
+* Using |wildignore| for |g:ctrlp_user_command|:
+>
+  function! s:wig2cmd()
+    " Change wildignore into space or | separated groups
+    " e.g. .aux .out .toc .jpg .bmp .gif
+    " or   .aux$\|.out$\|.toc$\|.jpg$\|.bmp$\|.gif$
+    let pats = ['[*\/]*\([?_.0-9A-Za-z]\+\)\([*\/]*\)\(\\\@<!,\|$\)','\\\@<!,']
+    let subs = has('win32') || has('win64') ? ['\1\3', ' '] : ['\1\2\3', '\\|']
+    let expr = substitute(&wig, pats[0], subs[0], 'g')
+    let expr = substitute(expr, pats[1], subs[1], 'g')
+    let expr = substitute(expr, '\\,', ',', 'g')
+
+    " Set the user_command option
+    let g:ctrlp_user_command = has('win32') || has('win64')
+      \ ? 'dir %s /-n /b /s /a-d | findstr /V /l "'.expr.'"'
+      \ : 'find %s -type f | grep -v "'.expr .'"'
+  endfunction
+
+  call s:wig2cmd()
+<
+(submitted by Rich Alesi <github.com/ralesi>)
+
+* A standalone function to set the working directory to the project's root, or
+  to the parent directory of the current file if a root can't be found:
+>
+  function! s:setcwd()
+    let cph = expand('%:p:h', 1)
+    if cph =~ '^.\+://' | retu | en
+    for mkr in ['.git/', '.hg/', '.svn/', '.bzr/', '_darcs/', '.vimprojects']
+      let wd = call('find'.(mkr =~ '/$' ? 'dir' : 'file'), [mkr, cph.';'])
+      if wd != '' | let &acd = 0 | brea | en
+    endfo
+    exe 'lc!' fnameescape(wd == '' ? cph : substitute(wd, mkr.'$', '.', ''))
+  endfunction
+
+  autocmd BufEnter * call s:setcwd()
+<
+(requires Vim 7.1.299+)
+
+* Using a |count| to invoke different commands using the same mapping:
+>
+  let g:ctrlp_cmd = 'exe "CtrlP".get(["", "Buffer", "MRU"], v:count)'
+<
+
+===============================================================================
+CREDITS                                                         *ctrlp-credits*
+
+Originally developed by Kien Nguyen <github.com/kien>.  Now maintained by the
+members of the ctrlpvim Github organisation
+(https://github.com/orgs/ctrlpvim/people).  Distributed under Vim's |license|.
+
+Project's homepage:   http://ctrlpvim.github.com/ctrlp.vim
+Git repository:       https://github.com/ctrlpvim/ctrlp.vim
+
+-------------------------------------------------------------------------------
+Thanks to everyone that has submitted ideas, bug reports or helped debugging on
+gibhub, bitbucket, and through email.
+
+Special thanks:~
+
+    * Woojong Koh <github.com/wjkoh>
+    * Simon Ruderich
+    * Yasuhiro Matsumoto <github.com/mattn>
+    * Ken Earley <github.com/kenearley>
+    * Kyo Nagashima <github.com/hail2u>
+    * Zak Johnson <github.com/zakj>
+    * Diego Viola <github.com/diegoviola>
+    * Piet Delport <github.com/pjdelport>
+    * Thibault Duplessis <github.com/ornicar>
+    * Kent Sibilev <github.com/datanoise>
+    * Tacahiroy <github.com/tacahiroy>
+    * Luca Pette <github.com/lucapette>
+    * Seth Fowler <github.com/sfowler>
+    * Lowe Thiderman <github.com/thiderman>
+    * Christopher Fredén <github.com/icetan>
+    * Zahary Karadjov <github.com/zah>
+    * Jo De Boeck <github.com/grimpy>
+    * Rudi Grinberg <github.com/rgrinberg>
+    * Timothy Mellor <github.com/mellort>
+    * Sergey Vlasov <github.com/noscript>
+
+===============================================================================
+CHANGELOG                                                     *ctrlp-changelog*
+
+    * New option |g:ctrlp_custom_tag_files| to specify custom tag files.
+    * Accept 0 for g:ctrlp_match_window no-limited window size.
+
+Before 2016/11/28~
+
+    + New command: |YankLine()| to yank current line.
+    + New option: |g:ctrlp_types| to select builtin modes.
+    + New feature: asynchronized spawn of |g:ctrlp_user_command|. This enable
+                  with set |g:ctrlp_user_command_async| to 1.
+    + Support buffertag for delphi, rust and golang.
+    + New option: |g:ctrlp_brief_prompt|,
+                  |g:match_current_file|,
+                  |g:ctrlp_compare_lim|.
+    + New feature: Auto-ignore extension.
+    + Support buffertag for ant, tex, dosbatch, matlab and vhdl.
+    + New option |g:ctrlp_line_prefix| for integrating third party plugins.
+    + New option |g:open_single_match| to open single file in matches.
+    + Add <plug>(ctrlp) for launch CtrlP.
+    + Accept bang for CtrlPBookmarkDirAdd to avoid confirm.
+    + Handle variable like "g:ctrlp_TYPE_MODE".
+                   ex: let g:ctrlp_path_sort
+    + New option: |g:ctrlp_custom_ancestors|
+
+Before 2014/08/08~
+
+    + New buffer explorer mode with highlighting (|+conceal| recommended)
+    + New options: |g:ctrlp_bufname_mod|,
+                   |g:ctrlp_bufpath_mod|
+    + Combine *g:ctrlp_match_window_bottom* *g:ctrlp_match_window_reversed* and
+      *g:ctrlp_max_height* into |g:ctrlp_match_window|.
+    + New option: |g:ctrlp_match_window|.
+
+Before 2012/11/30~
+
+    + New options: |g:ctrlp_abbrev|,
+                   |g:ctrlp_key_loop|,
+                   |g:ctrlp_open_func|,
+                   |g:ctrlp_tabpage_position|,
+                   |g:ctrlp_mruf_save_on_update|
+    + Rename:
+        *g:ctrlp_dotfiles* -> |g:ctrlp_show_hidden|.
+    + Change |g:ctrlp_switch_buffer|'s and |g:ctrlp_working_path_mode|'s type
+      (old values still work).
+    + New key for |g:ctrlp_user_command| when it's a Dictionary: 'ignore'.
+
+Before 2012/06/15~
+
+    + New value for |g:ctrlp_follow_symlinks|: 2.
+    + New value for |g:ctrlp_open_multiple_files|: 'j'.
+    + Allow using <c-t>, <c-x>, <c-v> to open files marked by <c-z>.
+    + Extend '..' (|ctrlp-input-formats| (d))
+    + New input format: '@cd' (|ctrlp-input-formats| (d))
+
+Before 2012/04/30~
+
+    + New option: |g:ctrlp_mruf_default_order|
+    + New feature: Bookmarked directories extension.
+    + New commands: |:CtrlPBookmarkDir|
+                    |:CtrlPBookmarkDirAdd|
+
+Before 2012/04/15~
+
+    + New option: |g:ctrlp_buffer_func|, callback functions for CtrlP buffer.
+    + Remove: g:ctrlp_mruf_last_entered, make it a default for MRU mode.
+    + New commands: |:CtrlPLastMode|, open CtrlP in the last mode used.
+                    |:CtrlPMixed|, search in files, buffers and MRU files.
+
+Before 2012/03/31~
+
+    + New options: |g:ctrlp_default_input|, default input when entering CtrlP.
+                   |g:ctrlp_match_func|, allow using a custom fuzzy matcher.
+    + Rename:
+        *ClearCtrlPCache* -> |CtrlPClearCache|
+        *ClearAllCtrlPCaches* -> |CtrlPClearAllCaches|
+        *ResetCtrlP* -> |CtrlPReload|
+
+Before 2012/03/02~
+
+    + Rename:
+        *g:ctrlp_regexp_search* -> |g:ctrlp_regexp|,
+        *g:ctrlp_dont_split* -> |g:ctrlp_reuse_window|,
+        *g:ctrlp_jump_to_buffer* -> |g:ctrlp_switch_buffer|.
+    + Rename and tweak:
+        *g:ctrlp_open_multi* -> |g:ctrlp_open_multiple_files|.
+    + Deprecate *g:ctrlp_highlight_match*
+    + Extend |g:ctrlp_user_command| to support multiple commands.
+    + New option: |g:ctrlp_mruf_last_entered| change MRU to Recently-Entered.
+
+Before 2012/01/15~
+
+    + New mapping: Switch <tab> and <s-tab>. <tab> is now used for completion
+                   of directory names under the current working directory.
+    + New options: |g:ctrlp_arg_map| for <c-y>, <c-o> to accept an argument.
+                   |g:ctrlp_status_func| custom statusline.
+                   |g:ctrlp_mruf_relative| show only MRU files inside cwd.
+    + Extend g:ctrlp_open_multi with new optional values: tr, hr, vr.
+    + Extend |g:ctrlp_custom_ignore| to specifically filter dir, file and link.
+
+Before 2012/01/05~
+
+    + New feature: Buffer Tag extension.
+    + New commands: |:CtrlPBufTag|, |:CtrlPBufTagAll|.
+    + New options: |g:ctrlp_cmd|,
+                   |g:ctrlp_custom_ignore|
+
+Before 2011/11/30~
+
+    + New features: Tag, Quickfix and Directory extensions.
+    + New commands: |:CtrlPTag|, |:CtrlPQuickfix|, |:CtrlPDir|.
+    + New options: |g:ctrlp_use_migemo|,
+                   |g:ctrlp_lazy_update|,
+                   |g:ctrlp_follow_symlinks|
+
+Before 2011/11/13~
+
+    + New special input: '/' and '\' find root (|ctrlp-input-formats| (e))
+    + Remove ctrlp#SetWorkingPath().
+    + Remove *g:ctrlp_mru_files* and make MRU mode permanent.
+    + Extend g:ctrlp_open_multi, add new ways to open files.
+    + New option: g:ctrlp_dont_split,
+                  |g:ctrlp_mruf_case_sensitive|
+
+Before 2011/10/30~
+
+    + New feature: Support for custom extensions.
+                   <F5> also removes non-existent files from MRU list.
+    + New option: g:ctrlp_jump_to_buffer
+
+Before 2011/10/12~
+
+    + New features: Open multiple files.
+                    Pass Vim's |++opt| and |+cmd| to the opening file
+                    (|ctrlp-input-formats| (c))
+                    Auto-complete each dir for |:CtrlP| [starting-directory]
+    + New mappings: <c-z> mark/unmark a file to be opened with <c-o>.
+                    <c-o> open all marked files.
+    + New option: g:ctrlp_open_multi
+    + Remove *g:ctrlp_persistent_input* *g:ctrlp_live_update* and <c-^>.
+
+Before 2011/09/29~
+
+    + New mappings: <c-n>, <c-p> next/prev string in the input history.
+                    <c-y> create a new file and its parent dirs.
+    + New options: |g:ctrlp_open_new_file|,
+                   |g:ctrlp_max_history|
+    + Added a new open-in-horizontal-split mapping: <c-x>
+
+Before 2011/09/19~
+
+    + New command: ResetCtrlP
+    + New options: |g:ctrlp_max_files|,
+                   |g:ctrlp_max_depth|,
+                   g:ctrlp_live_update
+    + New mapping: <c-^>
+
+Before 2011/09/12~
+
+    + Ability to cycle through matched lines in the match window.
+    + Extend the behavior of g:ctrlp_persistent_input
+    + Extend the behavior of |:CtrlP|
+    + New options: |g:ctrlp_dotfiles|,
+                   |g:ctrlp_clear_cache_on_exit|,
+                   g:ctrlp_highlight_match,
+                   |g:ctrlp_user_command|
+    + New special input: '..' (|ctrlp-input-formats| (d))
+    + New mapping: <F5>.
+    + New commands: |:CtrlPCurWD|,
+                    |:CtrlPCurFile|,
+                    |:CtrlPRoot|
+
+    + New feature: Search in most recently used (MRU) files
+    + New mapping: <c-b>.
+    + Extended the behavior of <c-f>.
+    + New options: g:ctrlp_mru_files,
+                   |g:ctrlp_mruf_max|,
+                   |g:ctrlp_mruf_exclude|,
+                   |g:ctrlp_mruf_include|
+    + New command: |:CtrlPMRU|
+
+First public release: 2011/09/06~
+
+===============================================================================
+vim:ft=help:et:ts=2:sw=2:sts=2:norl

+ 113 - 0
vim/plugged/ctrlp.vim/doc/tags

@@ -0,0 +1,113 @@
+'ctrl-p'	ctrlp.txt	/*'ctrl-p'*
+'ctrlp'	ctrlp.txt	/*'ctrlp'*
+'ctrlp-<c-p>'	ctrlp.txt	/*'ctrlp-<c-p>'*
+'ctrlp-autocompletion'	ctrlp.txt	/*'ctrlp-autocompletion'*
+'ctrlp-fullregexp'	ctrlp.txt	/*'ctrlp-fullregexp'*
+'ctrlp-pasting'	ctrlp.txt	/*'ctrlp-pasting'*
+'g:ctrlp_abbrev'	ctrlp.txt	/*'g:ctrlp_abbrev'*
+'g:ctrlp_arg_map'	ctrlp.txt	/*'g:ctrlp_arg_map'*
+'g:ctrlp_brief_prompt'	ctrlp.txt	/*'g:ctrlp_brief_prompt'*
+'g:ctrlp_buffer_func'	ctrlp.txt	/*'g:ctrlp_buffer_func'*
+'g:ctrlp_bufname_mod'	ctrlp.txt	/*'g:ctrlp_bufname_mod'*
+'g:ctrlp_bufpath_mod'	ctrlp.txt	/*'g:ctrlp_bufpath_mod'*
+'g:ctrlp_buftag_ctags_bin'	ctrlp.txt	/*'g:ctrlp_buftag_ctags_bin'*
+'g:ctrlp_buftag_systemenc'	ctrlp.txt	/*'g:ctrlp_buftag_systemenc'*
+'g:ctrlp_buftag_types'	ctrlp.txt	/*'g:ctrlp_buftag_types'*
+'g:ctrlp_by_filename'	ctrlp.txt	/*'g:ctrlp_by_filename'*
+'g:ctrlp_cache_dir'	ctrlp.txt	/*'g:ctrlp_cache_dir'*
+'g:ctrlp_clear_cache_on_exit'	ctrlp.txt	/*'g:ctrlp_clear_cache_on_exit'*
+'g:ctrlp_cmd'	ctrlp.txt	/*'g:ctrlp_cmd'*
+'g:ctrlp_custom_ignore'	ctrlp.txt	/*'g:ctrlp_custom_ignore'*
+'g:ctrlp_default_input'	ctrlp.txt	/*'g:ctrlp_default_input'*
+'g:ctrlp_follow_symlinks'	ctrlp.txt	/*'g:ctrlp_follow_symlinks'*
+'g:ctrlp_key_loop'	ctrlp.txt	/*'g:ctrlp_key_loop'*
+'g:ctrlp_lazy_update'	ctrlp.txt	/*'g:ctrlp_lazy_update'*
+'g:ctrlp_line_prefix'	ctrlp.txt	/*'g:ctrlp_line_prefix'*
+'g:ctrlp_map'	ctrlp.txt	/*'g:ctrlp_map'*
+'g:ctrlp_match_current_file'	ctrlp.txt	/*'g:ctrlp_match_current_file'*
+'g:ctrlp_match_func'	ctrlp.txt	/*'g:ctrlp_match_func'*
+'g:ctrlp_match_window'	ctrlp.txt	/*'g:ctrlp_match_window'*
+'g:ctrlp_max_depth'	ctrlp.txt	/*'g:ctrlp_max_depth'*
+'g:ctrlp_max_files'	ctrlp.txt	/*'g:ctrlp_max_files'*
+'g:ctrlp_max_history'	ctrlp.txt	/*'g:ctrlp_max_history'*
+'g:ctrlp_mruf_case_sensitive'	ctrlp.txt	/*'g:ctrlp_mruf_case_sensitive'*
+'g:ctrlp_mruf_default_order'	ctrlp.txt	/*'g:ctrlp_mruf_default_order'*
+'g:ctrlp_mruf_exclude'	ctrlp.txt	/*'g:ctrlp_mruf_exclude'*
+'g:ctrlp_mruf_include'	ctrlp.txt	/*'g:ctrlp_mruf_include'*
+'g:ctrlp_mruf_max'	ctrlp.txt	/*'g:ctrlp_mruf_max'*
+'g:ctrlp_mruf_relative'	ctrlp.txt	/*'g:ctrlp_mruf_relative'*
+'g:ctrlp_mruf_save_on_update'	ctrlp.txt	/*'g:ctrlp_mruf_save_on_update'*
+'g:ctrlp_open_func'	ctrlp.txt	/*'g:ctrlp_open_func'*
+'g:ctrlp_open_multiple_files'	ctrlp.txt	/*'g:ctrlp_open_multiple_files'*
+'g:ctrlp_open_new_file'	ctrlp.txt	/*'g:ctrlp_open_new_file'*
+'g:ctrlp_open_single_match'	ctrlp.txt	/*'g:ctrlp_open_single_match'*
+'g:ctrlp_prompt_mappings'	ctrlp.txt	/*'g:ctrlp_prompt_mappings'*
+'g:ctrlp_regexp'	ctrlp.txt	/*'g:ctrlp_regexp'*
+'g:ctrlp_reuse_window'	ctrlp.txt	/*'g:ctrlp_reuse_window'*
+'g:ctrlp_root_markers'	ctrlp.txt	/*'g:ctrlp_root_markers'*
+'g:ctrlp_show_hidden'	ctrlp.txt	/*'g:ctrlp_show_hidden'*
+'g:ctrlp_status_func'	ctrlp.txt	/*'g:ctrlp_status_func'*
+'g:ctrlp_switch_buffer'	ctrlp.txt	/*'g:ctrlp_switch_buffer'*
+'g:ctrlp_tabpage_position'	ctrlp.txt	/*'g:ctrlp_tabpage_position'*
+'g:ctrlp_tilde_homedir'	ctrlp.txt	/*'g:ctrlp_tilde_homedir'*
+'g:ctrlp_types'	ctrlp.txt	/*'g:ctrlp_types'*
+'g:ctrlp_use_caching'	ctrlp.txt	/*'g:ctrlp_use_caching'*
+'g:ctrlp_use_readdir'	ctrlp.txt	/*'g:ctrlp_use_readdir'*
+'g:ctrlp_user_command'	ctrlp.txt	/*'g:ctrlp_user_command'*
+'g:ctrlp_working_path_mode'	ctrlp.txt	/*'g:ctrlp_working_path_mode'*
+'g:loaded_ctrlp'	ctrlp.txt	/*'g:loaded_ctrlp'*
+:CtrlP	ctrlp.txt	/*:CtrlP*
+:CtrlPBookmarkDir	ctrlp.txt	/*:CtrlPBookmarkDir*
+:CtrlPBookmarkDirAdd	ctrlp.txt	/*:CtrlPBookmarkDirAdd*
+:CtrlPBufTag	ctrlp.txt	/*:CtrlPBufTag*
+:CtrlPBufTagAll	ctrlp.txt	/*:CtrlPBufTagAll*
+:CtrlPBuffer	ctrlp.txt	/*:CtrlPBuffer*
+:CtrlPChange	ctrlp.txt	/*:CtrlPChange*
+:CtrlPChangeAll	ctrlp.txt	/*:CtrlPChangeAll*
+:CtrlPClearAllCaches	ctrlp.txt	/*:CtrlPClearAllCaches*
+:CtrlPClearCache	ctrlp.txt	/*:CtrlPClearCache*
+:CtrlPCurFile	ctrlp.txt	/*:CtrlPCurFile*
+:CtrlPCurWD	ctrlp.txt	/*:CtrlPCurWD*
+:CtrlPDir	ctrlp.txt	/*:CtrlPDir*
+:CtrlPLastMode	ctrlp.txt	/*:CtrlPLastMode*
+:CtrlPLine	ctrlp.txt	/*:CtrlPLine*
+:CtrlPMRU	ctrlp.txt	/*:CtrlPMRU*
+:CtrlPMixed	ctrlp.txt	/*:CtrlPMixed*
+:CtrlPQuickfix	ctrlp.txt	/*:CtrlPQuickfix*
+:CtrlPRTS	ctrlp.txt	/*:CtrlPRTS*
+:CtrlPRoot	ctrlp.txt	/*:CtrlPRoot*
+:CtrlPTag	ctrlp.txt	/*:CtrlPTag*
+:CtrlPUndo	ctrlp.txt	/*:CtrlPUndo*
+ClearAllCtrlPCaches	ctrlp.txt	/*ClearAllCtrlPCaches*
+ClearCtrlPCache	ctrlp.txt	/*ClearCtrlPCache*
+ControlP	ctrlp.txt	/*ControlP*
+CtrlP	ctrlp.txt	/*CtrlP*
+ResetCtrlP	ctrlp.txt	/*ResetCtrlP*
+ctrlp-autoignore-extension	ctrlp.txt	/*ctrlp-autoignore-extension*
+ctrlp-changelog	ctrlp.txt	/*ctrlp-changelog*
+ctrlp-commands	ctrlp.txt	/*ctrlp-commands*
+ctrlp-contents	ctrlp.txt	/*ctrlp-contents*
+ctrlp-credits	ctrlp.txt	/*ctrlp-credits*
+ctrlp-customization	ctrlp.txt	/*ctrlp-customization*
+ctrlp-default-value	ctrlp.txt	/*ctrlp-default-value*
+ctrlp-extensions	ctrlp.txt	/*ctrlp-extensions*
+ctrlp-input-formats	ctrlp.txt	/*ctrlp-input-formats*
+ctrlp-intro	ctrlp.txt	/*ctrlp-intro*
+ctrlp-mappings	ctrlp.txt	/*ctrlp-mappings*
+ctrlp-miscellaneous-configs	ctrlp.txt	/*ctrlp-miscellaneous-configs*
+ctrlp-options	ctrlp.txt	/*ctrlp-options*
+ctrlp.txt	ctrlp.txt	/*ctrlp.txt*
+ctrlp_compare_lim	ctrlp.txt	/*ctrlp_compare_lim*
+g:ctrlp_dont_split	ctrlp.txt	/*g:ctrlp_dont_split*
+g:ctrlp_dotfiles	ctrlp.txt	/*g:ctrlp_dotfiles*
+g:ctrlp_highlight_match	ctrlp.txt	/*g:ctrlp_highlight_match*
+g:ctrlp_jump_to_buffer	ctrlp.txt	/*g:ctrlp_jump_to_buffer*
+g:ctrlp_live_update	ctrlp.txt	/*g:ctrlp_live_update*
+g:ctrlp_match_window_bottom	ctrlp.txt	/*g:ctrlp_match_window_bottom*
+g:ctrlp_match_window_reversed	ctrlp.txt	/*g:ctrlp_match_window_reversed*
+g:ctrlp_max_height	ctrlp.txt	/*g:ctrlp_max_height*
+g:ctrlp_mru_files	ctrlp.txt	/*g:ctrlp_mru_files*
+g:ctrlp_open_multi	ctrlp.txt	/*g:ctrlp_open_multi*
+g:ctrlp_persistent_input	ctrlp.txt	/*g:ctrlp_persistent_input*
+g:ctrlp_regexp_search	ctrlp.txt	/*g:ctrlp_regexp_search*
+string-match	ctrlp.txt	/*string-match*

+ 112 - 0
vim/plugged/ctrlp.vim/doc/tags-cn

@@ -0,0 +1,112 @@
+!_TAG_FILE_ENCODING	utf-8	//
+'ctrl-p'	ctrlp.cnx	/*'ctrl-p'*
+'ctrlp'	ctrlp.cnx	/*'ctrlp'*
+'ctrlp-<c-p>'	ctrlp.cnx	/*'ctrlp-<c-p>'*
+'ctrlp-autocompletion'	ctrlp.cnx	/*'ctrlp-autocompletion'*
+'ctrlp-fullregexp'	ctrlp.cnx	/*'ctrlp-fullregexp'*
+'ctrlp-pasting'	ctrlp.cnx	/*'ctrlp-pasting'*
+'g:ctrlp_abbrev'	ctrlp.cnx	/*'g:ctrlp_abbrev'*
+'g:ctrlp_arg_map'	ctrlp.cnx	/*'g:ctrlp_arg_map'*
+'g:ctrlp_brief_prompt'	ctrlp.cnx	/*'g:ctrlp_brief_prompt'*
+'g:ctrlp_buffer_func'	ctrlp.cnx	/*'g:ctrlp_buffer_func'*
+'g:ctrlp_bufname_mod'	ctrlp.cnx	/*'g:ctrlp_bufname_mod'*
+'g:ctrlp_bufpath_mod'	ctrlp.cnx	/*'g:ctrlp_bufpath_mod'*
+'g:ctrlp_buftag_ctags_bin'	ctrlp.cnx	/*'g:ctrlp_buftag_ctags_bin'*
+'g:ctrlp_buftag_systemenc'	ctrlp.cnx	/*'g:ctrlp_buftag_systemenc'*
+'g:ctrlp_buftag_types'	ctrlp.cnx	/*'g:ctrlp_buftag_types'*
+'g:ctrlp_by_filename'	ctrlp.cnx	/*'g:ctrlp_by_filename'*
+'g:ctrlp_cache_dir'	ctrlp.cnx	/*'g:ctrlp_cache_dir'*
+'g:ctrlp_clear_cache_on_exit'	ctrlp.cnx	/*'g:ctrlp_clear_cache_on_exit'*
+'g:ctrlp_cmd'	ctrlp.cnx	/*'g:ctrlp_cmd'*
+'g:ctrlp_custom_ignore'	ctrlp.cnx	/*'g:ctrlp_custom_ignore'*
+'g:ctrlp_default_input'	ctrlp.cnx	/*'g:ctrlp_default_input'*
+'g:ctrlp_follow_symlinks'	ctrlp.cnx	/*'g:ctrlp_follow_symlinks'*
+'g:ctrlp_key_loop'	ctrlp.cnx	/*'g:ctrlp_key_loop'*
+'g:ctrlp_lazy_update'	ctrlp.cnx	/*'g:ctrlp_lazy_update'*
+'g:ctrlp_line_prefix'	ctrlp.cnx	/*'g:ctrlp_line_prefix'*
+'g:ctrlp_map'	ctrlp.cnx	/*'g:ctrlp_map'*
+'g:ctrlp_match_current_file'	ctrlp.cnx	/*'g:ctrlp_match_current_file'*
+'g:ctrlp_match_func'	ctrlp.cnx	/*'g:ctrlp_match_func'*
+'g:ctrlp_match_window'	ctrlp.cnx	/*'g:ctrlp_match_window'*
+'g:ctrlp_max_depth'	ctrlp.cnx	/*'g:ctrlp_max_depth'*
+'g:ctrlp_max_files'	ctrlp.cnx	/*'g:ctrlp_max_files'*
+'g:ctrlp_max_history'	ctrlp.cnx	/*'g:ctrlp_max_history'*
+'g:ctrlp_mruf_case_sensitive'	ctrlp.cnx	/*'g:ctrlp_mruf_case_sensitive'*
+'g:ctrlp_mruf_default_order'	ctrlp.cnx	/*'g:ctrlp_mruf_default_order'*
+'g:ctrlp_mruf_exclude'	ctrlp.cnx	/*'g:ctrlp_mruf_exclude'*
+'g:ctrlp_mruf_include'	ctrlp.cnx	/*'g:ctrlp_mruf_include'*
+'g:ctrlp_mruf_max'	ctrlp.cnx	/*'g:ctrlp_mruf_max'*
+'g:ctrlp_mruf_relative'	ctrlp.cnx	/*'g:ctrlp_mruf_relative'*
+'g:ctrlp_mruf_save_on_update'	ctrlp.cnx	/*'g:ctrlp_mruf_save_on_update'*
+'g:ctrlp_open_func'	ctrlp.cnx	/*'g:ctrlp_open_func'*
+'g:ctrlp_open_multiple_files'	ctrlp.cnx	/*'g:ctrlp_open_multiple_files'*
+'g:ctrlp_open_new_file'	ctrlp.cnx	/*'g:ctrlp_open_new_file'*
+'g:ctrlp_open_single_match'	ctrlp.cnx	/*'g:ctrlp_open_single_match'*
+'g:ctrlp_prompt_mappings'	ctrlp.cnx	/*'g:ctrlp_prompt_mappings'*
+'g:ctrlp_regexp'	ctrlp.cnx	/*'g:ctrlp_regexp'*
+'g:ctrlp_reuse_window'	ctrlp.cnx	/*'g:ctrlp_reuse_window'*
+'g:ctrlp_root_markers'	ctrlp.cnx	/*'g:ctrlp_root_markers'*
+'g:ctrlp_show_hidden'	ctrlp.cnx	/*'g:ctrlp_show_hidden'*
+'g:ctrlp_status_func'	ctrlp.cnx	/*'g:ctrlp_status_func'*
+'g:ctrlp_switch_buffer'	ctrlp.cnx	/*'g:ctrlp_switch_buffer'*
+'g:ctrlp_tabpage_position'	ctrlp.cnx	/*'g:ctrlp_tabpage_position'*
+'g:ctrlp_tilde_homedir'	ctrlp.cnx	/*'g:ctrlp_tilde_homedir'*
+'g:ctrlp_types'	ctrlp.cnx	/*'g:ctrlp_types'*
+'g:ctrlp_use_caching'	ctrlp.cnx	/*'g:ctrlp_use_caching'*
+'g:ctrlp_user_command'	ctrlp.cnx	/*'g:ctrlp_user_command'*
+'g:ctrlp_working_path_mode'	ctrlp.cnx	/*'g:ctrlp_working_path_mode'*
+'g:loaded_ctrlp'	ctrlp.cnx	/*'g:loaded_ctrlp'*
+:CtrlP	ctrlp.cnx	/*:CtrlP*
+:CtrlPBookmarkDir	ctrlp.cnx	/*:CtrlPBookmarkDir*
+:CtrlPBookmarkDirAdd	ctrlp.cnx	/*:CtrlPBookmarkDirAdd*
+:CtrlPBufTag	ctrlp.cnx	/*:CtrlPBufTag*
+:CtrlPBufTagAll	ctrlp.cnx	/*:CtrlPBufTagAll*
+:CtrlPBuffer	ctrlp.cnx	/*:CtrlPBuffer*
+:CtrlPChange	ctrlp.cnx	/*:CtrlPChange*
+:CtrlPChangeAll	ctrlp.cnx	/*:CtrlPChangeAll*
+:CtrlPClearAllCaches	ctrlp.cnx	/*:CtrlPClearAllCaches*
+:CtrlPClearCache	ctrlp.cnx	/*:CtrlPClearCache*
+:CtrlPCurFile	ctrlp.cnx	/*:CtrlPCurFile*
+:CtrlPCurWD	ctrlp.cnx	/*:CtrlPCurWD*
+:CtrlPDir	ctrlp.cnx	/*:CtrlPDir*
+:CtrlPLastMode	ctrlp.cnx	/*:CtrlPLastMode*
+:CtrlPLine	ctrlp.cnx	/*:CtrlPLine*
+:CtrlPMRU	ctrlp.cnx	/*:CtrlPMRU*
+:CtrlPMixed	ctrlp.cnx	/*:CtrlPMixed*
+:CtrlPQuickfix	ctrlp.cnx	/*:CtrlPQuickfix*
+:CtrlPRTS	ctrlp.cnx	/*:CtrlPRTS*
+:CtrlPRoot	ctrlp.cnx	/*:CtrlPRoot*
+:CtrlPTag	ctrlp.cnx	/*:CtrlPTag*
+:CtrlPUndo	ctrlp.cnx	/*:CtrlPUndo*
+ClearAllCtrlPCaches	ctrlp.cnx	/*ClearAllCtrlPCaches*
+ClearCtrlPCache	ctrlp.cnx	/*ClearCtrlPCache*
+ControlP	ctrlp.cnx	/*ControlP*
+CtrlP	ctrlp.cnx	/*CtrlP*
+ResetCtrlP	ctrlp.cnx	/*ResetCtrlP*
+ctrlp-autoignore-extension	ctrlp.cnx	/*ctrlp-autoignore-extension*
+ctrlp-changelog	ctrlp.cnx	/*ctrlp-changelog*
+ctrlp-commands	ctrlp.cnx	/*ctrlp-commands*
+ctrlp-content	ctrlp.cnx	/*ctrlp-content*
+ctrlp-credits	ctrlp.cnx	/*ctrlp-credits*
+ctrlp-customization	ctrlp.cnx	/*ctrlp-customization*
+ctrlp-default-value	ctrlp.cnx	/*ctrlp-default-value*
+ctrlp-extensions	ctrlp.cnx	/*ctrlp-extensions*
+ctrlp-input-formats	ctrlp.cnx	/*ctrlp-input-formats*
+ctrlp-intro	ctrlp.cnx	/*ctrlp-intro*
+ctrlp-mappings	ctrlp.cnx	/*ctrlp-mappings*
+ctrlp-miscellaneous-configs	ctrlp.cnx	/*ctrlp-miscellaneous-configs*
+ctrlp-options	ctrlp.cnx	/*ctrlp-options*
+ctrlp.txt	ctrlp.cnx	/*ctrlp.txt*
+g:ctrlp_dont_split	ctrlp.cnx	/*g:ctrlp_dont_split*
+g:ctrlp_dotfiles	ctrlp.cnx	/*g:ctrlp_dotfiles*
+g:ctrlp_highlight_match	ctrlp.cnx	/*g:ctrlp_highlight_match*
+g:ctrlp_jump_to_buffer	ctrlp.cnx	/*g:ctrlp_jump_to_buffer*
+g:ctrlp_live_update	ctrlp.cnx	/*g:ctrlp_live_update*
+g:ctrlp_match_window_bottom	ctrlp.cnx	/*g:ctrlp_match_window_bottom*
+g:ctrlp_match_window_reversed	ctrlp.cnx	/*g:ctrlp_match_window_reversed*
+g:ctrlp_max_height	ctrlp.cnx	/*g:ctrlp_max_height*
+g:ctrlp_mru_files	ctrlp.cnx	/*g:ctrlp_mru_files*
+g:ctrlp_open_multi	ctrlp.cnx	/*g:ctrlp_open_multi*
+g:ctrlp_persistent_input	ctrlp.cnx	/*g:ctrlp_persistent_input*
+g:ctrlp_regexp_search	ctrlp.cnx	/*g:ctrlp_regexp_search*
+string-match	ctrlp.cnx	/*string-match*

+ 72 - 0
vim/plugged/ctrlp.vim/plugin/ctrlp.vim

@@ -0,0 +1,72 @@
+" =============================================================================
+" File:          plugin/ctrlp.vim
+" Description:   Fuzzy file, buffer, mru, tag, etc finder.
+" Author:        Kien Nguyen <github.com/kien>
+" =============================================================================
+" GetLatestVimScripts: 3736 1 :AutoInstall: ctrlp.zip
+
+if ( exists('g:loaded_ctrlp') && g:loaded_ctrlp ) || v:version < 700 || &cp
+	fini
+en
+let g:loaded_ctrlp = 1
+
+let [g:ctrlp_lines, g:ctrlp_allfiles, g:ctrlp_alltags, g:ctrlp_alldirs,
+	\ g:ctrlp_allmixes, g:ctrlp_buftags, g:ctrlp_ext_vars, g:ctrlp_builtins]
+	\ = [[], [], [], [], {}, {}, [], 2]
+
+if !exists('g:ctrlp_map') | let g:ctrlp_map = '<c-p>' | en
+if !exists('g:ctrlp_cmd') | let g:ctrlp_cmd = 'CtrlP' | en
+
+com! -n=? -com=dir CtrlP         cal ctrlp#init(0, { 'dir': <q-args> })
+com! -n=? -com=dir CtrlPMRUFiles cal ctrlp#init('mru', { 'dir': <q-args> })
+
+com! -bar CtrlPBuffer   cal ctrlp#init('buf')
+com! -n=? CtrlPLastMode cal ctrlp#init(-1, { 'args': <q-args> })
+
+com! -bar CtrlPClearCache     cal ctrlp#clr()
+com! -bar CtrlPClearAllCaches cal ctrlp#clra()
+
+com! -bar ClearCtrlPCache     cal ctrlp#clr()
+com! -bar ClearAllCtrlPCaches cal ctrlp#clra()
+
+com! -bar CtrlPCurWD   cal ctrlp#init('fil', { 'mode': '' })
+com! -bar CtrlPCurFile cal ctrlp#init('fil', { 'mode': 'c' })
+com! -bar CtrlPRoot    cal ctrlp#init('fil', { 'mode': 'r' })
+
+exe 'nn <silent> <plug>(ctrlp) :<c-u>'.g:ctrlp_cmd.'<cr>'
+
+if g:ctrlp_map != '' && !hasmapto('<plug>(ctrlp)')
+	exe 'map' g:ctrlp_map '<plug>(ctrlp)'
+en
+
+if !exists('g:ctrlp_types') || index(g:ctrlp_types, 'mru') >= 0
+	cal ctrlp#mrufiles#init()
+en
+
+com! -bar CtrlPTag      cal ctrlp#init(ctrlp#tag#id())
+com! -bar CtrlPQuickfix cal ctrlp#init(ctrlp#quickfix#id())
+
+com! -n=? -com=dir CtrlPDir
+	\ cal ctrlp#init(ctrlp#dir#id(), { 'dir': <q-args> })
+
+com! -n=? -com=buffer CtrlPBufTag
+	\ cal ctrlp#init(ctrlp#buffertag#cmd(0, <q-args>))
+
+com! -bar CtrlPBufTagAll cal ctrlp#init(ctrlp#buffertag#cmd(1))
+com! -bar CtrlPRTS       cal ctrlp#init(ctrlp#rtscript#id())
+com! -bar CtrlPUndo      cal ctrlp#init(ctrlp#undo#id())
+
+com! -n=? -com=buffer CtrlPLine
+	\ cal ctrlp#init(ctrlp#line#cmd('buf', <q-args>))
+
+com! -n=? -com=buffer CtrlPChange
+	\ cal ctrlp#init(ctrlp#changes#cmd('fil', <q-args>))
+
+com! -bar CtrlPChangeAll   cal ctrlp#init(ctrlp#changes#cmd(1))
+com! -bar CtrlPMixed       cal ctrlp#init(ctrlp#mixed#id())
+com! -bar CtrlPBookmarkDir cal ctrlp#init(ctrlp#bookmarkdir#id())
+
+com! -n=? -com=dir -bang CtrlPBookmarkDirAdd
+	\ cal ctrlp#call('ctrlp#bookmarkdir#add', '<bang>', <q-args>)
+
+" vim:ts=2:sw=2:sts=2

+ 117 - 0
vim/plugged/ctrlp.vim/readme.md

@@ -0,0 +1,117 @@
+# ctrlp.vim
+Full path fuzzy __file__, __buffer__, __mru__, __tag__, __...__ finder for Vim.
+
+* Written in pure Vimscript for MacVim, gVim and Vim 7.0+.
+* Full support for Vim's regexp as search patterns.
+* Built-in Most Recently Used (MRU) files monitoring.
+* Built-in project's root finder.
+* Open multiple files at once.
+* Create new files and directories.
+* [Extensible][2].
+
+![ctrlp][1]
+
+## Install
+
+vim 8+ manages packages all on its own. Installing `ctrlp` is this simple:
+
+```bash
+mkdir -p ~/.vim/pack/plugins/start
+git clone --depth=1 https://github.com/ctrlpvim/ctrlp.vim.git ~/.vim/pack/plugins/start/ctrlp
+```
+
+Of course you can use your favorite plugin manager or check the [quick installation guide][3] for a primitive installation method.
+
+## Basic Usage
+* Run `:CtrlP` or `:CtrlP [starting-directory]` to invoke CtrlP in find file mode.
+* Run `:CtrlPBuffer` or `:CtrlPMRU` to invoke CtrlP in find buffer or find MRU file mode.
+* Run `:CtrlPMixed` to search in Files, Buffers and MRU files at the same time.
+
+Check `:help ctrlp-commands` and `:help ctrlp-extensions` for other commands.
+
+##### Once CtrlP is open:
+* Press `<F5>` to purge the cache for the current directory to get new files, remove deleted files and apply new ignore options.
+* Press `<c-f>` and `<c-b>` to cycle between modes.
+* Press `<c-d>` to switch to filename only search instead of full path.
+* Press `<c-r>` to switch to regexp mode.
+* Use `<c-j>`, `<c-k>` or the arrow keys to navigate the result list.
+* Use `<c-t>` or `<c-v>`, `<c-x>` to open the selected entry in a new tab or in a new split.
+* Use `<c-n>`, `<c-p>` to select the next/previous string in the prompt's history.
+* Use `<c-y>` to create a new file and its parent directories.
+* Use `<c-z>` to mark/unmark multiple files and `<c-o>` to open them.
+
+Run `:help ctrlp-mappings` or submit `?` in CtrlP for more mapping help.
+
+* Submit two or more dots `..` to go up the directory tree by one or multiple levels.
+* End the input string with a colon `:` followed by a command to execute it on the opening file(s):
+Use `:25` to jump to line 25.
+Use `:diffthis` when opening multiple files to run `:diffthis` on the first 4 files.
+
+## Basic Options
+* Change the default mapping and the default command to invoke CtrlP:
+
+    ```vim
+    let g:ctrlp_map = '<c-p>'
+    let g:ctrlp_cmd = 'CtrlP'
+    ```
+
+* When invoked without an explicit starting directory, CtrlP will set its local working directory according to this variable:
+
+    ```vim
+    let g:ctrlp_working_path_mode = 'ra'
+    ```
+
+    `'c'` - the directory of the current file.  
+    `'a'` - the directory of the current file, unless it is a subdirectory of the cwd  
+    `'r'` - the nearest ancestor of the current file that contains one of these directories or files: `.git` `.hg` `.svn` `.bzr` `_darcs`  
+    `'w'` - modifier to "r": start search from the cwd instead of the current file's directory  
+    `0` or `''` (empty string) - disable this feature.
+
+    If none of the default markers (`.git` `.hg` `.svn` `.bzr` `_darcs`) are present in a project, you can define additional ones with `g:ctrlp_root_markers`:
+
+    ```vim
+    let g:ctrlp_root_markers = ['pom.xml', '.p4ignore']
+    ```
+
+    If more than one mode is specified, they will be tried in order until a directory is located.
+
+* If a file is already open, open it again in a new pane instead of switching to the existing pane
+
+    `let g:ctrlp_switch_buffer = 'et'`
+
+* Exclude files and directories using Vim's `wildignore` and CtrlP's own `g:ctrlp_custom_ignore`. If a custom listing command is being used, exclusions are ignored:
+
+    ```vim
+    set wildignore+=*/tmp/*,*.so,*.swp,*.zip     " MacOSX/Linux
+    set wildignore+=*\\tmp\\*,*.swp,*.zip,*.exe  " Windows
+
+    let g:ctrlp_custom_ignore = '\v[\/]\.(git|hg|svn)$'
+    let g:ctrlp_custom_ignore = {
+      \ 'dir':  '\v[\/]\.(git|hg|svn)$',
+      \ 'file': '\v\.(exe|so|dll)$',
+      \ 'link': 'some_bad_symbolic_links',
+      \ }
+    ```
+
+* Use a custom file listing command:
+
+    ```vim
+    let g:ctrlp_user_command = 'find %s -type f'        " MacOSX/Linux
+    let g:ctrlp_user_command = 'dir %s /-n /b /s /a-d'  " Windows
+    ```
+
+* Ignore files in `.gitignore`
+    
+    ```vim
+      let g:ctrlp_user_command = ['.git', 'cd %s && git ls-files -co --exclude-standard']
+    ```
+
+Check `:help ctrlp-options` for other options.
+
+## License
+CtrlP is distributed under Vim's [license][4].
+
+[1]: https://i.imgur.com/aOcwHwt.png
+[2]: https://github.com/ctrlpvim/ctrlp.vim/tree/extensions
+[3]: https://ctrlpvim.github.io/ctrlp.vim#installation
+[4]: http://vimdoc.sourceforge.net/htmldoc/uganda.html

+ 81 - 0
vim/plugged/delimitMate/Makefile

@@ -0,0 +1,81 @@
+PLUGIN   =  $(wildcard plugin/*.vim)
+SOURCES  =  $(PLUGIN)
+LIB      =  $(wildcard autoload/*.vim)
+SOURCES  += $(LIB)
+DOC      =  $(wildcard doc/*.txt)
+SOURCES  += $(DOC)
+NAME     =  delimitMate
+VERSION  =  $(shell $(SED) -n -e '/Current \+release/{s/^ \+\([0-9.]\+\).*/\1/;p;}' $(firstword $(DOC)))
+FILENAME =  $(NAME)-$(VERSION)
+DESTDIR  =  $(HOME)/.vim
+VIM      =  vim
+SED      =  $(shell command -v gsed || command -v sed)
+PERL     =  perl
+comma    := ,
+empty    :=
+space    := $(empty) $(empty)
+
+.PHONY: version clean distclean undo release test install uninstall
+
+all: zip gzip
+dist: version all
+vimball: $(FILENAME).vmb
+zip: $(FILENAME).zip $(FILENAME).vmb.zip
+gzip: $(FILENAME).tar.gz $(FILENAME).vmb.gz
+
+clean:
+	rm -f */*.orig *.~* .VimballRecord *.zip *.gz *.vmb
+
+distclean: clean
+	-zsh -c 'setopt extendedglob; rm -f ^(README.md|Makefile|basic_vimrc)(.)'
+	-zsh -c 'setopt extendedglob; rm -f .^(git|README.md|Makefile|basic_vimrc)*'
+
+undo:
+	for i in */*.orig; do mv -f "$$i" "$${i%.*}"; done
+
+version:
+	$(PERL) -i.orig -pne 'if (/^"\sVersion:/) {s/(\d+\.\S+)/$(VERSION)/}' $(PLUGIN) $(LIB)
+	$(PERL) -i.orig -pne \
+	  'if (/let\sdelimitMate_version/) {s/"(\d+\.\S+)"/"$(VERSION)"/}' $(PLUGIN)
+	$(PERL) -i.orig -pne 'if (/beasts/) {s/(v\d+\.\S+)/v$(VERSION)/}' $(DOC)
+	$(PERL) -i.orig -MPOSIX -pne \
+	  'if (/^"\sModified:/) {$$now_string = strftime "%F", localtime; s/(\d+-\d+-\d+)/$$now_string/e}' \
+	  $(PLUGIN) $(LIB)
+	$(PERL) -i.orig -MPOSIX -pne \
+	  'if (/^\s+$(VERSION)\s+\d+-\d+-\d+\s+\*/) {$$now_string = strftime "%F", localtime; s/(\d+-\d+-\d+)/$$now_string/}' \
+	  $(DOC)
+
+test:
+	$(MAKE) -C test
+
+install: $(SOURCES)
+	for dir in $(^D);\
+  do install -d -m 0755 $(DESTDIR)$(PREFIX)/$$dir;\
+done;\
+for file in $^;\
+  do install -m 0644 $$file $(DESTDIR)$(PREFIX)/$$file;\
+done;
+
+uninstall:
+	for file in $(SOURCES);\
+  do rm -f $(DESTDIR)$(PREFIX)/$$file;\
+done;
+
+%.vmb: $(SOURCES)
+	$(VIM) -N -es -u NORC \
+  -c 'call setline(1,["$(subst $(space),"$(comma)",$^)"])'\
+  -c "%MkVimball! $(basename $@) ." -c 'q!'
+
+%.vmb.zip: vimball
+	zip $@ $(basename $@)
+
+%.zip: $(SOURCES)
+	zip $@ $^
+
+%.vmb.gz: vimball
+	gzip -f < $(basename $@) > $@
+
+%.tar.gz: $(SOURCES)
+	tar -cvzf $@ $^
+
+# vim:ts=2:sw=2

+ 6 - 0
vim/plugged/delimitMate/README.md

@@ -0,0 +1,6 @@
+This plug-in provides automatic closing of quotes, parenthesis, brackets, etc., besides some other related features that
+should make your time in insert mode a little bit easier, like syntax awareness (will not insert the closing delimiter
+in comments and other configurable regions), <CR> and <Space> expansions (off by default), and some more.
+
+Most of the features can be modified or disabled permanently, using global variables, or on a FileType basis, using
+:autocmd.

+ 656 - 0
vim/plugged/delimitMate/autoload/delimitMate.vim

@@ -0,0 +1,656 @@
+" File:        autoload/delimitMate.vim
+" Version:     2.7
+" Modified:    2013-07-15
+" Description: This plugin provides auto-completion for quotes, parens, etc.
+" Maintainer:  Israel Chauca F. <israelchauca@gmail.com>
+" Manual:      Read ":help delimitMate".
+" ============================================================================
+
+"let delimitMate_loaded = 1
+
+if !exists('s:options')
+  let s:options = {}
+endif
+
+function! s:set(name, value) "{{{
+  let bufnr = bufnr('%')
+  if !has_key(s:options, bufnr)
+    let s:options[bufnr] = {}
+  endif
+  let s:options[bufnr][a:name] = a:value
+endfunction "}}}
+
+function! s:get(...) "{{{
+  let options = deepcopy(eval('s:options.' . bufnr('%')))
+  if a:0
+    return options[a:1]
+  endif
+  return options
+endfunction "}}}
+
+function! s:exists(name, ...) "{{{
+  let scope = a:0 ? a:1 : 's'
+  if scope == 's'
+    let bufnr = bufnr('%')
+    let name = 'options.' . bufnr . '.' . a:name
+  else
+    let name = 'delimitMate_' . a:name
+  endif
+  return exists(scope . ':' . name)
+endfunction "}}}
+
+function! s:is_jump(...) "{{{
+  " Returns 1 if the next character is a closing delimiter.
+  let char = s:get_char(0)
+  let list = s:get('right_delims') + s:get('quotes_list')
+
+  " Closing delimiter on the right.
+  if (!a:0 && index(list, char) > -1)
+        \ || (a:0 && char == a:1)
+    return 1
+  endif
+
+  " Closing delimiter with space expansion.
+  let nchar = s:get_char(1)
+  if !a:0 && s:get('expand_space') && char == " "
+    if index(list, nchar) > -1
+      return 2
+    endif
+  elseif a:0 && s:get('expand_space') && nchar == a:1 && char == ' '
+    return 3
+  endif
+
+  if !s:get('jump_expansion')
+    return 0
+  endif
+
+  " Closing delimiter with CR expansion.
+  let uchar = matchstr(getline(line('.') + 1), '^\s*\zs\S')
+  if !a:0 && s:get('expand_cr') && char == ""
+    if index(list, uchar) > -1
+      return 4
+    endif
+  elseif a:0 && s:get('expand_cr') && uchar == a:1
+    return 5
+  endif
+  return 0
+endfunction "}}}
+
+function! s:rquote(char) "{{{
+  let pos = matchstr(getline('.')[col('.') : ], escape(a:char, '[]*.^$\'), 1)
+  let i = 0
+  while s:get_char(i) ==# a:char
+    let i += 1
+  endwhile
+  return i
+endfunction "}}}
+
+function! s:lquote(char) "{{{
+  let i = 0
+  while s:get_char(i - 1) ==# a:char
+    let i -= 1
+  endwhile
+  return i * -1
+endfunction "}}}
+
+function! s:get_char(...) "{{{
+  let idx = col('.') - 1
+  if !a:0 || (a:0 && a:1 >= 0)
+    " Get char from cursor.
+    let line = getline('.')[idx :]
+    let pos = a:0 ? a:1 : 0
+    return matchstr(line, '^'.repeat('.', pos).'\zs.')
+  endif
+  " Get char behind cursor.
+  let line = getline('.')[: idx - 1]
+  let pos = 0 - (1 + a:1)
+  return matchstr(line, '.\ze'.repeat('.', pos).'$')
+endfunction "s:get_char }}}
+
+function! s:is_cr_expansion(...) " {{{
+  let nchar = getline(line('.')-1)[-1:]
+  let schar = matchstr(getline(line('.')+1), '^\s*\zs\S')
+  let isEmpty = a:0 ? getline('.') =~ '^\s*$' : empty(getline('.'))
+  if index(s:get('left_delims'), nchar) > -1
+        \ && index(s:get('left_delims'), nchar)
+        \    == index(s:get('right_delims'), schar)
+        \ && isEmpty
+    return 1
+  elseif index(s:get('quotes_list'), nchar) > -1
+        \ && index(s:get('quotes_list'), nchar)
+        \    == index(s:get('quotes_list'), schar)
+        \ && isEmpty
+    return 1
+  else
+    return 0
+  endif
+endfunction " }}} s:is_cr_expansion()
+
+function! s:is_space_expansion() " {{{
+  if col('.') > 2
+    let pchar = s:get_char(-2)
+    let nchar = s:get_char(1)
+    let isSpaces =
+          \ (s:get_char(-1)
+          \   == s:get_char(0)
+          \ && s:get_char(-1) == " ")
+
+    if index(s:get('left_delims'), pchar) > -1 &&
+        \ index(s:get('left_delims'), pchar)
+        \   == index(s:get('right_delims'), nchar) &&
+        \ isSpaces
+      return 1
+    elseif index(s:get('quotes_list'), pchar) > -1 &&
+        \ index(s:get('quotes_list'), pchar)
+        \   == index(s:get('quotes_list'), nchar) &&
+        \ isSpaces
+      return 1
+    endif
+  endif
+  return 0
+endfunction " }}} IsSpaceExpansion()
+
+function! s:is_empty_matchpair() "{{{
+  " get char before the cursor.
+  let open = s:get_char(-1)
+  let idx = index(s:get('left_delims'), open)
+  if idx == -1
+    return 0
+  endif
+  let close = get(s:get('right_delims'), idx, '')
+  return close ==# s:get_char(0)
+endfunction "}}}
+
+function! s:is_empty_quotes() "{{{
+  " get char before the cursor.
+  let quote = s:get_char(-1)
+  let idx = index(s:get('quotes_list'), quote)
+  if idx == -1
+    return 0
+  endif
+  return quote ==# s:get_char(0)
+endfunction "}}}
+
+function! s:cursor_idx() "{{{
+  let idx = len(split(getline('.')[: col('.') - 1], '\zs')) - 1
+  return idx
+endfunction "delimitMate#CursorCol }}}
+
+function! s:get_syn_name() "{{{
+  let col = col('.')
+  if  col == col('$')
+    let col = col - 1
+  endif
+  return synIDattr(synIDtrans(synID(line('.'), col, 1)), 'name')
+endfunction " }}}
+
+function! s:is_excluded_ft(ft) "{{{
+  if !exists("g:delimitMate_excluded_ft")
+    return 0
+  endif
+  return index(split(g:delimitMate_excluded_ft, ','), a:ft, 0, 1) >= 0
+endfunction "}}}
+
+function! s:is_forbidden(char) "{{{
+  if s:is_excluded_ft(&filetype)
+    return 1
+  endif
+  if !s:get('excluded_regions_enabled')
+    return 0
+  endif
+  let region = s:get_syn_name()
+  return index(s:get('excluded_regions_list'), region) >= 0
+endfunction "}}}
+
+function! s:balance_matchpairs(char) "{{{
+  " Returns:
+  " = 0 => Parens balanced.
+  " > 0 => More opening parens.
+  " < 0 => More closing parens.
+
+  let line = getline('.')
+  let col = s:cursor_idx() - 1
+  let col = col >= 0 ? col : 0
+  let list = split(line, '\zs')
+  let left = s:get('left_delims')[index(s:get('right_delims'), a:char)]
+  let right = a:char
+  let opening = 0
+  let closing = 0
+
+  " If the cursor is not at the beginning, count what's behind it.
+  if col > 0
+      " Find the first opening paren:
+      let start = index(list, left)
+      " Must be before cursor:
+      let start = start < col ? start : col - 1
+      " Now count from the first opening until the cursor, this will prevent
+      " extra closing parens from being counted.
+      let opening = count(list[start : col - 1], left)
+      let closing = count(list[start : col - 1], right)
+      " I don't care if there are more closing parens than opening parens.
+      let closing = closing > opening ? opening : closing
+  endif
+
+  " Evaluate parens from the cursor to the end:
+  let opening += count(list[col :], left)
+  let closing += count(list[col :], right)
+
+  " Return the found balance:
+  return opening - closing
+endfunction "}}}
+
+function! s:is_smart_quote(char) "{{{
+  " TODO: Allow using a:char in the pattern.
+  let tmp = s:get('smart_quotes')
+  if empty(tmp)
+    return 0
+  endif
+  let regex = matchstr(tmp, '^!\?\zs.*')
+  " Flip matched value if regex starts with !
+  let mod = tmp =~ '^!' ? [1, 0] : [0, 1]
+  let matched = search(regex, 'ncb', line('.')) > 0
+  let noescaped = substitute(getline('.'), '\\.', '', 'g')
+  let odd =  (count(split(noescaped, '\zs'), a:char) % 2)
+  let result = mod[matched] || odd
+  return result
+endfunction "delimitMate#SmartQuote }}}
+
+function! delimitMate#Set(...) "{{{
+  return call('s:set', a:000)
+endfunction "}}}
+
+function! delimitMate#Get(...) "{{{
+  return call('s:get', a:000)
+endfunction "}}}
+
+function! delimitMate#ShouldJump(...) "{{{
+  return call('s:is_jump', a:000)
+endfunction "}}}
+
+function! delimitMate#IsEmptyPair(str) "{{{
+  if strlen(substitute(a:str, ".", "x", "g")) != 2
+    return 0
+  endif
+  let idx = index(s:get('left_delims'), matchstr(a:str, '^.'))
+  if idx > -1 &&
+        \ s:get('right_delims')[idx] == matchstr(a:str, '.$')
+    return 1
+  endif
+  let idx = index(s:get('quotes_list'), matchstr(a:str, '^.'))
+  if idx > -1 &&
+        \ s:get('quotes_list')[idx] == matchstr(a:str, '.$')
+    return 1
+  endif
+  return 0
+endfunction "}}}
+
+function! delimitMate#WithinEmptyPair() "{{{
+  " if cursor is at column 1 return 0
+  if col('.') == 1
+    return 0
+  endif
+  " get char before the cursor.
+  let char1 = s:get_char(-1)
+  " get char under the cursor.
+  let char2 = s:get_char(0)
+  return delimitMate#IsEmptyPair( char1.char2 )
+endfunction "}}}
+
+function! delimitMate#SkipDelim(char) "{{{
+  if s:is_forbidden(a:char)
+    return a:char
+  endif
+  let col = col('.') - 1
+  let line = getline('.')
+  if col > 0
+    let cur = s:get_char(0)
+    let pre = s:get_char(-1)
+  else
+    let cur = s:get_char(0)
+    let pre = ""
+  endif
+  if pre == "\\"
+    " Escaped character
+    return a:char
+  elseif cur == a:char
+    " Exit pair
+    return a:char . "\<Del>"
+  elseif delimitMate#IsEmptyPair( pre . a:char )
+    " Add closing delimiter and jump back to the middle.
+    return a:char . s:joinUndo() . "\<Left>"
+  else
+    " Nothing special here, return the same character.
+    return a:char
+  endif
+endfunction "}}}
+
+function! delimitMate#ParenDelim(right) " {{{
+  let left = s:get('left_delims')[index(s:get('right_delims'),a:right)]
+  if s:is_forbidden(a:right)
+    return left
+  endif
+  " Try to balance matchpairs
+  if s:get('balance_matchpairs') &&
+        \ s:balance_matchpairs(a:right) < 0
+    return left
+  endif
+  let line = getline('.')
+  let col = col('.')-2
+  if s:get('smart_matchpairs') != ''
+    let smart_matchpairs = substitute(s:get('smart_matchpairs'), '\\!', left, 'g')
+    let smart_matchpairs = substitute(smart_matchpairs, '\\#', a:right, 'g')
+    if line[col+1:] =~ smart_matchpairs
+      return left
+    endif
+  endif
+  if len(line) == (col + 1) && s:get('insert_eol_marker') == 1
+    let tail = s:get('eol_marker')
+  else
+    let tail = ''
+  endif
+  return left . a:right . tail . repeat(s:joinUndo() . "\<Left>", len(split(tail, '\zs')) + 1)
+endfunction " }}}
+
+function! delimitMate#QuoteDelim(char) "{{{
+  if s:is_forbidden(a:char)
+    return a:char
+  endif
+  let char_at = s:get_char(0)
+  let char_before = s:get_char(-1)
+  let nesting_on = index(s:get('nesting_quotes'), a:char) > -1
+  let left_q = nesting_on ? s:lquote(a:char) : 0
+  if nesting_on && left_q > 1
+    " Nesting quotes.
+    let right_q =  s:rquote(a:char)
+    let quotes = right_q > left_q + 1 ? 0 : left_q - right_q + 2
+    let lefts = quotes - 1
+    return repeat(a:char, quotes) . repeat(s:joinUndo() . "\<Left>", lefts)
+  elseif char_at == a:char
+    " Inside an empty pair, jump out
+    return a:char . "\<Del>"
+  elseif a:char == '"' && index(split(&ft, '\.'), "vim") != -1 && getline('.') =~ '^\s*$'
+    " If we are in a vim file and it looks like we're starting a comment, do
+    " not add a closing char.
+    return a:char
+  elseif s:is_smart_quote(a:char)
+    " Seems like a smart quote, insert a single char.
+    return a:char
+  elseif (char_before == a:char && char_at != a:char)
+        \ && !empty(s:get('smart_quotes'))
+    " Seems like we have an unbalanced quote, insert one quotation
+    " mark and jump to the middle.
+    return a:char . s:joinUndo() . "\<Left>"
+  else
+    " Insert a pair and jump to the middle.
+    let sufix = ''
+    if !empty(s:get('eol_marker')) && col('.') - 1 == len(getline('.'))
+      let idx = len(s:get('eol_marker')) * -1
+      let marker = getline('.')[idx : ]
+      let has_marker = marker == s:get('eol_marker')
+      let sufix = !has_marker ? s:get('eol_marker') : ''
+    endif
+    return a:char . a:char . s:joinUndo() . "\<Left>"
+  endif
+endfunction "}}}
+
+function! delimitMate#JumpOut(char) "{{{
+  if s:is_forbidden(a:char)
+    return a:char
+  endif
+  let jump = s:is_jump(a:char)
+  if jump == 1
+    " HACK: Instead of <Right>, we remove the char to be jumped over and
+    " insert it again. This will trigger re-indenting via 'indentkeys'.
+    " Ref: https://github.com/Raimondi/delimitMate/issues/168
+    return "\<Del>".a:char
+  elseif jump == 3
+    return s:joinUndo() . "\<Right>" . s:joinUndo() . "\<Right>"
+  elseif jump == 5
+    return "\<Down>\<C-O>I" . s:joinUndo() . "\<Right>"
+  else
+    return a:char
+  endif
+endfunction " }}}
+
+function! delimitMate#JumpAny(...) " {{{
+  if s:is_forbidden('')
+    return ''
+  endif
+  if !s:is_jump()
+    return ''
+  endif
+  " Let's get the character on the right.
+  let char = s:get_char(0)
+  if char == " "
+    " Space expansion.
+    return s:joinUndo() . "\<Right>" . s:joinUndo() . "\<Right>"
+  elseif char == ""
+    " CR expansion.
+    return "\<CR>" . getline(line('.') + 1)[0] . "\<Del>\<Del>"
+  else
+    return s:joinUndo() . "\<Right>"
+  endif
+endfunction " delimitMate#JumpAny() }}}
+
+function! delimitMate#JumpMany() " {{{
+  let line = split(getline('.')[col('.') - 1 : ], '\zs')
+  let rights = ""
+  let found = 0
+  for char in line
+    if index(s:get('quotes_list'), char) >= 0 ||
+          \ index(s:get('right_delims'), char) >= 0
+      let rights .= s:joinUndo() . "\<Right>"
+      let found = 1
+    elseif found == 0
+      let rights .= s:joinUndo() . "\<Right>"
+    else
+      break
+    endif
+  endfor
+  if found == 1
+    return rights
+  else
+    return ''
+  endif
+endfunction " delimitMate#JumpMany() }}}
+
+function! delimitMate#ExpandReturn() "{{{
+  if s:is_forbidden("")
+    return "\<CR>"
+  endif
+  let escaped = s:cursor_idx() >= 2
+        \ && s:get_char(-2) == '\'
+  let expand_right_matchpair = s:get('expand_cr') == 2
+        \     && index(s:get('right_delims'), s:get_char(0)) > -1
+  let expand_inside_quotes = s:get('expand_inside_quotes')
+          \     && s:is_empty_quotes()
+          \     && !escaped
+  let is_empty_matchpair = s:is_empty_matchpair()
+  if !pumvisible(  )
+        \ && (   is_empty_matchpair
+        \     || expand_right_matchpair
+        \     || expand_inside_quotes)
+    let val = "\<Esc>a"
+    if is_empty_matchpair && s:get('insert_eol_marker') == 2
+          \ && !search(escape(s:get('eol_marker'), '[]\.*^$').'$', 'cnW', '.')
+      let tail = getline('.')[col('.') - 1 : ]
+      let times = len(split(tail, '\zs'))
+      let val .= repeat(s:joinUndo() . "\<Right>", times) . s:get('eol_marker') . repeat(s:joinUndo() . "\<Left>", times + 1)
+    endif
+    let val .= "\<CR>"
+    if &smartindent && !&cindent && !&indentexpr
+          \ && s:get_char(0) == '}'
+      " indentation is controlled by 'smartindent', and the first character on
+      " the new line is '}'. If this were typed manually it would reindent to
+      " match the current line. Let's reproduce that behavior.
+      let sw = &sw == 0 ? &ts : &sw
+      let shifts = indent('.') / sw
+      let spaces = indent('.') - (shifts * sw)
+      let val .= "^\<C-D>".repeat("\<C-T>", shifts).repeat(' ', spaces)
+    endif
+    " Expand:
+    " XXX zv prevents breaking expansion with syntax folding enabled by
+    " InsertLeave.
+    let val .= "\<Esc>zvO"
+    return val
+  else
+    return "\<CR>"
+  endif
+endfunction "}}}
+
+function! delimitMate#ExpandSpace() "{{{
+  if s:is_forbidden("\<Space>")
+    return "\<Space>"
+  endif
+  let escaped = s:cursor_idx() >= 2
+        \ && s:get_char(-2) == '\'
+  let expand_inside_quotes = s:get('expand_inside_quotes')
+          \     && s:is_empty_quotes()
+          \     && !escaped
+  if s:is_empty_matchpair() || expand_inside_quotes
+    " Expand:
+    return "\<Space>\<Space>" . s:joinUndo() . "\<Left>"
+  else
+    return "\<Space>"
+  endif
+endfunction "}}}
+
+function! delimitMate#BS() " {{{
+  if s:is_forbidden("")
+    let extra = ''
+  elseif &bs !~ 'start\|2'
+    let extra = ''
+  elseif delimitMate#WithinEmptyPair()
+    let extra = "\<Del>"
+  elseif s:is_space_expansion()
+    let extra = "\<Del>"
+  elseif s:is_cr_expansion()
+    let extra = repeat("\<Del>",
+          \ len(matchstr(getline(line('.') + 1), '^\s*\S')))
+  else
+    let extra = ''
+  endif
+  return "\<BS>" . extra
+endfunction " }}} delimitMate#BS()
+
+function! delimitMate#Test() "{{{
+  %d _
+  " Check for script options:
+  let result = [
+        \ 'delimitMate Report',
+        \ '==================',
+        \ '',
+        \ '* Options: ( ) default, (g) global, (b) buffer',
+        \ '']
+  for option in sort(keys(s:options[bufnr('%')]))
+    if s:exists(option, 'b')
+      let scope = '(b)'
+    elseif s:exists(option, 'g')
+      let scope = '(g)'
+    else
+      let scope = '( )'
+    endif
+    call add(result,
+          \ scope . ' delimitMate_' . option
+          \ . ' = '
+          \ . string(s:get(option)))
+  endfor
+  call add(result, '')
+
+  let option = 'delimitMate_excluded_ft'
+  call add(result,
+        \(exists('g:'.option) ? '(g) ' : '( ) g:') . option . ' = '
+        \. string(get(g:, option, '')))
+
+  call add(result, '--------------------')
+  call add(result, '')
+
+  " Check if mappings were set.
+  let left_delims = s:get('autoclose') ? s:get('left_delims') : []
+  let special_keys = ['<BS>', '<S-BS>', '<S-Tab>', '<C-G>g']
+  if s:get('expand_cr')
+    call add(special_keys, '<CR>')
+  endif
+  if s:get('expand_space')
+    call add(special_keys, '<Space>')
+  endif
+  let maps =
+        \ s:get('right_delims')
+        \ + left_delims
+        \ + s:get('quotes_list')
+        \ + s:get('apostrophes_list')
+        \ + special_keys
+
+  call add(result, '* Mappings:')
+  call add(result, '')
+  for map in maps
+    let output = ''
+    if map == '|'
+      let map = '<Bar>'
+    endif
+    redir => output | execute "verbose imap ".map | redir END
+    call extend(result, split(output, '\n'))
+  endfor
+
+  call add(result, '--------------------')
+  call add(result, '')
+  call add(result, '* Showcase:')
+  call add(result, '')
+  call setline(1, result)
+  call s:test_mappings(s:get('left_delims'), 1)
+  call s:test_mappings(s:get('quotes_list'), 0)
+
+  let result = []
+  redir => setoptions
+  echo " * Vim configuration:\<NL>"
+  filetype
+  echo ""
+  set
+  version
+  redir END
+  call extend(result, split(setoptions,"\n"))
+  call add(result, '--------------------')
+  setlocal nowrap
+  call append('$', result)
+  call feedkeys("\<Esc>\<Esc>", 'n')
+endfunction "}}}
+
+function! s:test_mappings(list, is_matchpair) "{{{
+  let prefix = "normal Go0\<C-D>"
+  let last = "|"
+  let open = s:get('autoclose') ? 'Open: ' : 'Open & close: '
+  for s in a:list
+    if a:is_matchpair
+      let pair = s:get('right_delims')[index(s:get('left_delims'), s)]
+    else
+      let pair = s
+    endif
+    if !s:get('autoclose')
+      let s .= pair
+    endif
+    exec prefix . open . s . last
+    exec prefix . "Delete: " . s . "\<BS>" . last
+    exec prefix . "Exit: " . s . pair . last
+    if s:get('expand_space')
+          \ && (a:is_matchpair || s:get('expand_inside_quotes'))
+      exec prefix . "Space: " . s . " " . last
+      exec prefix . "Delete space: " . s . " \<BS>" . last
+    endif
+    if s:get('expand_cr')
+          \ && (a:is_matchpair || s:get('expand_inside_quotes'))
+      exec prefix . "Car return: " . s . "\<CR>" . last
+      exec prefix . "Delete car return: " . s . "\<CR>0\<C-D>\<BS>" . last
+    endif
+    call append('$', '')
+  endfor
+endfunction "}}}
+
+function! s:joinUndo() "{{{
+  if v:version < 704
+        \ || ( v:version == 704 && !has('patch849') )
+    return ''
+  endif
+  return "\<C-G>U"
+endfunction "}}}
+
+" vim:foldmethod=marker:foldcolumn=4:ts=2:sw=2

+ 4 - 0
vim/plugged/delimitMate/basic_vimrc

@@ -0,0 +1,4 @@
+so ./test/_setup.vim
+let delimitMate_expand_cr = 1
+filetype indent plugin on
+

+ 945 - 0
vim/plugged/delimitMate/doc/delimitMate.txt

@@ -0,0 +1,945 @@
+*delimitMate.txt*   Trying to keep those beasts at bay! v2.7     *delimitMate*
+
+
+
+  MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
+  MMMM  MMMMMMMMM  MMMMMMMMMMMMMMMMMMMMMMMMMM  MMMMM  MMMMMMMMMMMMMMMMMMMMM  ~
+  MMMM  MMMMMMMMM  MMMMMMMMMMMMMMMMMMMMMMMMMM   MMM   MMMMMMMMMMMMMMMMMMMMM
+  MMMM  MMMMMMMMM  MMMMMMMMMMMMMMMMMMMMM  MMM  M   M  MMMMMMMMMM  MMMMMMMMM  ~
+  MMMM  MMM   MMM  MM  MM  M  M MMM  MM    MM  MM MM  MMM   MMM    MMM   MM
+  MM    MM  M  MM  MMMMMM        MMMMMMM  MMM  MMMMM  MM  M  MMM  MMM  M  M  ~
+  M  M  MM     MM  MM  MM  M  M  MM  MMM  MMM  MMMMM  MMMMM  MMM  MMM     M
+  M  M  MM  MMMMM  MM  MM  M  M  MM  MMM  MMM  MMMMM  MMM    MMM  MMM  MMMM  ~
+  M  M  MM  M  MM  MM  MM  M  M  MM  MMM  MMM  MMMMM  MM  M  MMM  MMM  M  M
+  MM    MMM   MMM  MM  MM  M  M  MM  MMM   MM  MMMMM  MMM    MMM   MMM   MM  ~
+  MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
+
+
+
+==============================================================================
+ 0.- CONTENTS                                           *delimitMate-contents*
+
+    1. Introduction____________________________|delimitMateIntro|
+    2. Customization___________________________|delimitMateOptions|
+        2.1 Options summary____________________|delimitMateOptionSummary|
+        2.2 Options details____________________|delimitMateOptionDetails|
+    3. Functionality___________________________|delimitMateFunctionality|
+        3.1 Automatic closing & exiting________|delimitMateAutoClose|
+        3.2 Expansion of space and CR__________|delimitMateExpansion|
+        3.3 Backspace__________________________|delimitMateBackspace|
+        3.4 Smart Quotes_______________________|delimitMateSmartQuotes|
+        3.5 Balancing matching pairs___________|delimitMateBalance|
+        3.6 FileType based configuration_______|delimitMateFileType|
+        3.7 Syntax awareness___________________|delimitMateSyntax|
+    4. Commands________________________________|delimitMateCommands|
+    5. Mappings________________________________|delimitMateMappings|
+    6. Functions_______________________________|delimitMateFunctions|
+    7. Autocommands____________________________|delimitMateAutocmds|
+    8. TODO list_______________________________|delimitMateTodo|
+    9. Maintainer______________________________|delimitMateMaintainer|
+   10. Credits_________________________________|delimitMateCredits|
+   11. History_________________________________|delimitMateHistory|
+
+==============================================================================
+ 1.- INTRODUCTION                                           *delimitMateIntro*
+
+This plug-in provides automatic closing of quotes, parenthesis, brackets,
+etc.; besides some other related features that should make your time in insert
+mode a little bit easier.
+
+Most of the features can be modified or disabled permanently, using global
+variables, or on a FileType basis, using autocommands.
+
+NOTE 1: If you have any trouble with this plugin, please run |:DelimitMateTest|
+in a new buffer to see what is not working.
+
+NOTE 2: Abbreviations set with |:iabbrev| will not be expanded by delimiters
+used on delimitMate, you should use <C-]> (read |i_CTRL-]|) to expand them on
+the go.
+
+==============================================================================
+ 2. CUSTOMIZATION                                         *delimitMateOptions*
+
+You can create your own mappings for some features using the global functions.
+Read |delimitMateFunctions| for more info.
+
+------------------------------------------------------------------------------
+   2.1 OPTIONS SUMMARY                              *delimitMateOptionSummary*
+
+The behaviour of this script can be customized setting the following options
+in your vimrc file. You can use local options to set the configuration for
+specific file types, see |delimitMateOptionDetails| for examples.
+
+|'loaded_delimitMate'|            Turns off the script.
+
+|'delimitMate_autoclose'|         Tells delimitMate whether to automagically
+                                insert the closing delimiter.
+
+|'delimitMate_matchpairs'|        Tells delimitMate which characters are
+                                matching pairs.
+
+|'delimitMate_quotes'|            Tells delimitMate which quotes should be
+                                used.
+
+|'delimitMate_nesting_quotes'|    Tells delimitMate which quotes should be
+                                allowed to be nested.
+
+|'delimitMate_expand_cr'|         Turns on/off the expansion of <CR>.
+
+|'delimitMate_expand_space'|      Turns on/off the expansion of <Space>.
+
+|'delimitMate_jump_expansion'|    Turns on/off jumping over expansions.
+
+|'delimitMate_smart_quotes'|      Turns on/off the "smart quotes" feature.
+
+|'delimitMate_smart_matchpairs'|  Turns on/off the "smart matchpairs" feature.
+
+|'delimitMate_balance_matchpairs'|Turns on/off the "balance matching pairs"
+                                feature.
+
+|'delimitMate_excluded_regions'|  Turns off the script for the given regions or
+                                syntax group names.
+
+|'delimitMate_excluded_ft'|       Turns off the script for the given file types.
+
+|'delimitMate_eol_marker'|        Determines what to insert after the closing
+                                matchpair when typing an opening matchpair on
+                                the end of the line.
+
+|'delimitMate_apostrophes'|       Tells delimitMate how it should "fix"
+                                balancing of single quotes when used as
+                                apostrophes. NOTE: Not needed any more, kept
+                                for compatibility with older versions.
+
+------------------------------------------------------------------------------
+   2.2 OPTIONS DETAILS                              *delimitMateOptionDetails*
+
+Add the shown lines to your vimrc file in order to set the below options.
+Buffer variables take precedence over global ones and can be used along with
+autocmd to modify delimitMate's behavior for specific file types, read more in
+|delimitMateFileType|.
+
+Note: Use buffer variables only to set options for specific file types using
+:autocmd, use global variables to set options for all buffers. Read more in
+|g:var| and |b:var|.
+
+------------------------------------------------------------------------------
+                                                        *'loaded_delimitMate'*
+                                                      *'b:loaded_delimitMate'*
+This option prevents delimitMate from loading.
+e.g.: >
+        let loaded_delimitMate = 1
+        au FileType mail let b:loaded_delimitMate = 1
+<
+------------------------------------------------------------------------------
+                                                  *'delimitMate_offByDefault'*
+Values: 0 or 1.~
+Default: 0~
+
+If this option is set to 1, delimitMate will load, but will not take
+effect in any buffer unless |:DelimitMateSwitch| is called in that
+buffer.
+
+------------------------------------------------------------------------------
+                                                     *'delimitMate_autoclose'*
+                                                   *'b:delimitMate_autoclose'*
+Values: 0 or 1.                                                              ~
+Default: 1                                                                   ~
+
+If this option is set to 0, delimitMate will not add a closing delimiter
+automagically. See |delimitMateAutoClose| for details.
+e.g.: >
+        let delimitMate_autoclose = 0
+        au FileType mail let b:delimitMate_autoclose = 0
+<
+------------------------------------------------------------------------------
+                                                    *'delimitMate_matchpairs'*
+                                                  *'b:delimitMate_matchpairs'*
+Values: A string with |'matchpairs'| syntax, plus support for multi-byte~
+        characters.~
+Default: &matchpairs                                                         ~
+
+Use this option to tell delimitMate which characters should be considered
+matching pairs. Read |delimitMateAutoClose| for details.
+e.g: >
+        let delimitMate_matchpairs = "(:),[:],{:},<:>"
+        au FileType vim,html let b:delimitMate_matchpairs = "(:),[:],{:},<:>"
+<
+------------------------------------------------------------------------------
+                                                        *'delimitMate_quotes'*
+                                                      *'b:delimitMate_quotes'*
+Values: A string of characters separated by spaces.                          ~
+Default: "\" ' `"                                                            ~
+
+Use this option to tell delimitMate which characters should be considered as
+quotes. Read |delimitMateAutoClose| for details.
+e.g.: >
+        let delimitMate_quotes = "\" ' ` *"
+        au FileType html let b:delimitMate_quotes = "\" '"
+<
+------------------------------------------------------------------------------
+                                                *'delimitMate_nesting_quotes'*
+                                              *'b:delimitMate_nesting_quotes'*
+Values: A list of quotes.                                                    ~
+Default: []                                                                  ~
+
+When adding a third quote listed in this option is inserted, three quotes will
+be inserted to the right of the cursor and the cursor will stay in the middle.
+If more quotes are inserted the number of quotes on both sides of the cursor
+will stay balanced.
+e.g.: >
+        let delimitMate_nesting_quotes = ['"','`']
+        au FileType python let b:delimitMate_nesting_quotes = ['"']
+<
+For Python this is set by default by the plugin.
+
+------------------------------------------------------------------------------
+                                                     *'delimitMate_expand_cr'*
+                                                   *'b:delimitMate_expand_cr'*
+Values: 0, 1 or 2                                                             ~
+Default: 0                                                                   ~
+
+This option turns on/off the expansion of <CR>. Read |delimitMateExpansion|
+for details. NOTE This feature requires that 'backspace' is either set to 2 or
+has "eol" and "start" as part of its value.
+e.g.: >
+        let delimitMate_expand_cr = 1
+        au FileType mail let b:delimitMate_expand_cr = 1
+<
+------------------------------------------------------------------------------
+                                                  *'delimitMate_expand_space'*
+                                                *'b:delimitMate_expand_space'*
+Values: 1 or 0                                                               ~
+Default: 0                                                                   ~
+This option turns on/off the expansion of <Space>. Read |delimitMateExpansion|
+for details.
+e.g.: >
+        let delimitMate_expand_space = 1
+        au FileType tcl let b:delimitMate_expand_space = 1
+<
+------------------------------------------------------------------------------
+                                          *'delimitMate_expand_inside_quotes'*
+                                        *'b:delimitMate_expand_inside_quotes'*
+Values: 1 or 0                                                                ~
+Default: 0                                                                   ~
+When this option is set to 1 the expansion of space and cr will also be
+applied to quotes. Read |delimitMateExpansion| for details.
+
+e.g.: >
+        let delimitMate_expand_inside_quotes = 1
+        au FileType mail let b:delimitMate_expand_inside_quotes = 1
+<
+------------------------------------------------------------------------------
+                                                *'delimitMate_jump_expansion'*
+                                              *'b:delimitMate_jump_expansion'*
+Values: 1 or 0                                                               ~
+Default: 0                                                                   ~
+This option turns on/off the jumping over <CR> and <Space> expansions when
+inserting closing matchpairs. Read |delimitMateExpansion| for details.
+e.g.: >
+        let delimitMate_jump_expansion = 1
+        au FileType tcl let b:delimitMate_jump_expansion = 1
+<
+------------------------------------------------------------------------------
+                                                  *'delimitMate_smart_quotes'*
+                                                *'b:delimitMate_smart_quotes'*
+Values: String with an optional !  at the beginning followed by a regexp     ~
+Default:~
+'\%(\w\|[^[:punct:][:space:]]\|\%(\\\\\)*\\\)\%#\|\%#\%(\w\|[^[:space:][:punct:]]\)'                  ~
+
+A bang (!) at the beginning is removed and used to "negate" the pattern. The
+remaining text is used as a regexp to be matched on the current line. A single
+quote is inserted when the pattern matches and a bang is not present. The bang
+changes that, so a single quote is inserted only if the regexp does not match.
+
+This feature is disabled when the variable is set to an empty string, with the
+exception of apostrophes.
+
+Note that you need to use '\%#' to match the position of the cursor.  Keep in
+mind that '\%#' matches with zero width, so if you need to match the char
+under the cursor (which would be the one to the right on insert mode) use
+something like '\%#.'.
+
+e.g.: >
+        let delimitMate_smart_quotes = '\w\%#'
+        au FileType tcl let b:delimitMate_smart_quotes = '!\s\%#\w'
+<
+------------------------------------------------------------------------------
+                                              *'delimitMate_smart_matchpairs'*
+                                            *'b:delimitMate_smart_matchpairs'*
+Values: Regexp                                                               ~
+Default: '^\%(\w\|\!\|[£$]\|[^[:space:][:punct:]]\)'                                ~
+
+This regex is matched against the text to the right of cursor, if it's not
+empty and there is a match delimitMate will not autoclose the pair. At the
+moment to match the text, an escaped bang (\!) in the regex will be replaced
+by the character being inserted, while an escaped number symbol (\#) will be
+replaced by the closing pair.
+e.g.: >
+        let delimitMate_smart_matchpairs = ''
+        au FileType tcl let b:delimitMate_smart_matchpairs = '^\%(\w\|\$\)'
+<
+------------------------------------------------------------------------------
+                                            *'delimitMate_balance_matchpairs'*
+                                          *'b:delimitMate_balance_matchpairs'*
+Values: 1 or 0                                                               ~
+Default: 0                                                                   ~
+
+This option turns on/off the balancing of matching pairs. Read
+|delimitMateBalance| for details.
+e.g.: >
+        let delimitMate_balance_matchpairs = 1
+        au FileType tcl let b:delimitMate_balance_matchpairs = 1
+<
+------------------------------------------------------------------------------
+                                              *'delimitMate_excluded_regions'*
+Values: A string of syntax group names names separated by single commas.     ~
+Default: Comment                                                             ~
+
+This options turns delimitMate off for the listed regions, read |group-name|
+for more info about what is a region.
+e.g.: >
+        let delimitMate_excluded_regions = "Comment,String"
+<
+------------------------------------------------------------------------------
+                                                   *'delimitMate_excluded_ft'*
+Values: A string of file type names separated by single commas.              ~
+Default: Empty.                                                              ~
+
+This options turns delimitMate off for the listed file types, use this option
+only if you don't want any of the features it provides on those file types.
+e.g.: >
+        let delimitMate_excluded_ft = "mail,txt"
+<
+------------------------------------------------------------------------------
+                                             *'delimitMate_insert_eol_marker'*
+Values: Integer                                                              ~
+Default: 1                                                              ~
+
+Whether to insert the eol marker (EM) or not. The EM is inserted following
+rules:
+
+0 -> never
+1 -> when inserting any matchpair
+2 -> when expanding car return in matchpair
+
+e.g.: >
+        au FileType c,perl let b:delimitMate_insert_eol_marker = 2
+<
+------------------------------------------------------------------------------
+                                                    *'delimitMate_eol_marker'*
+Values: String.                                                              ~
+Default: Empty.                                                              ~
+
+The contents of this string will be inserted after the closing matchpair or
+quote when the respective opening matchpair or quote is inserted at the end
+of the line.
+e.g.: >
+        au FileType c,perl let b:delimitMate_eol_marker = ";"
+<
+------------------------------------------------------------------------------
+                                                   *'delimitMate_apostrophes'*
+Values: Strings separated by ":".                                            ~
+Default: No longer used.                                                     ~
+
+NOTE: This feature is turned off by default, it's been kept for compatibility
+with older version, read |delimitMateSmartQuotes| for details.
+If auto-close is enabled, this option tells delimitMate how to try to fix the
+balancing of single quotes when used as apostrophes. The values of this option
+are strings of text where a single quote would be used as an apostrophe (e.g.:
+the "n't" of wouldn't or can't) separated by ":". Set it to an empty string to
+disable this feature.
+e.g.: >
+        let delimitMate_apostrophes = ""
+        au FileType tcl let delimitMate_apostrophes = ""
+<
+==============================================================================
+ 3. FUNCTIONALITY                                   *delimitMateFunctionality*
+
+------------------------------------------------------------------------------
+   3.1 AUTOMATIC CLOSING AND EXITING                    *delimitMateAutoClose*
+
+With automatic closing enabled, if an opening delimiter is inserted the plugin
+inserts the closing delimiter and places the cursor between the pair. With
+automatic closing disabled, no closing delimiters is inserted by delimitMate,
+but when a pair of delimiters is typed, the cursor is placed in the middle.
+
+When the cursor is inside an empty pair or located next to the left of a
+closing delimiter, the cursor is placed outside the pair to the right of the
+closing delimiter.
+
+When |'delimitMate_smart_matchpairs'| is not empty and it matches the text to
+the right of the cursor, delimitMate will not automatically insert the closing
+pair.
+
+Unless |'delimitMate_matchpairs'| or |'delimitMate_quotes'| are set, this
+script uses the values in '&matchpairs' to identify the pairs, and ", ' and `
+for quotes respectively.
+
+<S-Tab> will jump over a single closing delimiter or quote, <C-G>g will jump
+over contiguous delimiters and/or quotes.
+
+The following table shows the behaviour, this applies to quotes too (the final
+position of the cursor is represented by a "|"):
+
+With auto-close: >
+                          Type     |  You get
+                        =======================
+                           (       |    (|)
+                        -----------|-----------
+                           ()      |    ()|
+                        -----------|-----------
+                        (<S-Tab>   |    ()|
+                        -----------|-----------
+                        {("<C-G>g  |  {("")}|
+<
+Without auto-close: >
+
+                          Type        |  You get
+                        =========================
+                           ()         |    (|)
+                        --------------|----------
+                           ())        |    ()|
+                        --------------|----------
+                        ()<S-Tab>     |    ()|
+                        --------------|----------
+                        {}()""<C-G>g  |  {("")}|
+<
+NOTE: Abbreviations will not be expanded by delimiters used on delimitMate,
+you should use <C-]> (read |i_CTRL-]|) to expand them on the go.
+
+------------------------------------------------------------------------------
+   3.2 EXPANSION OF SPACE AND CAR RETURN                *delimitMateExpansion*
+
+When the cursor is inside an empty pair of any matchpair, <Space> and <CR> can be
+expanded, see |'delimitMate_expand_space'| and
+|'delimitMate_expand_cr'|:
+
+Expand <Space> to: >
+
+                    You start with  |  You get
+                  ==============================
+                        (|)         |    ( | )
+<
+Expand <CR> to: >
+
+                   You start with   |  You get
+                  ==============================
+                        (|)         |    (
+                                    |      |
+                                    |    )
+<
+
+When you have |'delimitMate_jump_expansion'| enabled, if there is an existing
+closing paren/bracket/etc. on the next line, delimitMate will make the cursor
+jump over any whitespace/<CR> and place it after the existing closing
+delimiter instead of inserting a new one.
+
+When |'delimitMate_expand_cr'| is set to 2, the following will also happen: >
+
+                    You start with  |  You get
+                  ==============================
+                       (foo|)       |    (foo
+                                    |      |
+                                    |    )
+<
+
+Since <Space> and <CR> are used everywhere, I have made the functions involved
+in expansions global, so they can be used to make custom mappings. Read
+|delimitMateFunctions| for more details.
+
+------------------------------------------------------------------------------
+   3.3 BACKSPACE                                        *delimitMateBackspace*
+
+If you press backspace inside an empty pair, both delimiters are deleted. When
+expansions are enabled, <BS> will also delete the expansions.
+
+If you type <S-BS> (shift + backspace) instead, only the closing delimiter
+will be deleted. NOTE that this will not usually work when using Vim from the
+terminal, see 'delimitMate#JumpAny()' below to see how to fix it.
+
+e.g. typing at the "|": >
+
+                  What  |      Before       |      After
+               ==============================================
+                  <BS>  |  call expand(|)   |  call expand|
+               ---------|-------------------|-----------------
+                  <BS>  |  call expand( | ) |  call expand(|)
+               ---------|-------------------|-----------------
+                  <BS>  |  call expand(     |  call expand(|)
+                        |  |                |
+                        |  )                |
+               ---------|-------------------|-----------------
+                 <S-BS> |  call expand(|)   |  call expand(|
+<
+
+------------------------------------------------------------------------------
+   3.4 SMART QUOTES                                   *delimitMateSmartQuotes*
+
+Only one quote will be inserted following a quote, a "\", following or
+preceding a keyword character, or when the number of quotes in the current
+line is odd. This should cover closing quotes after a string, opening quotes
+before a string, escaped quotes and apostrophes. See more details about
+customizing this feature on |'delimitMate_smart_quotes'|.
+
+e.g. typing at the "|": >
+
+                     What |    Before    |     After
+                  =======================================
+                      "   |  Text |      |  Text "|"
+                      "   |  "String|    |  "String"|
+                      "   |  let i = "|  |  let i = "|"
+                      'm  |  I|          |  I'm|
+<
+------------------------------------------------------------------------------
+   3.4 SMART MATCHPAIRS                           *delimitMateSmartMatchpairs*
+
+This is similar to "smart quotes", but applied to the characters in
+|'delimitMate_matchpairs'|. The difference is that delimitMate will not
+auto-close the pair when the regex matches the text on the right of the
+cursor. See |'delimitMate_smart_matchpairs'| for more details.
+
+
+e.g. typing at the "|": >
+
+                     What |    Before    |     After
+                  =======================================
+                      (   |  function|   |  function(|)
+                      (   |  |var        |  (|var
+<
+------------------------------------------------------------------------------
+   3.5 BALANCING MATCHING PAIRS                           *delimitMateBalance*
+
+When inserting an opening paren and |'delimitMate_balance_matchpairs'| is
+enabled, delimitMate will try to balance the closing pairs in the current
+line.
+
+e.g. typing at the "|": >
+
+                     What |    Before    |     After
+                  =======================================
+                      (   |      |       |     (|)
+                      (   |      |)      |     (|)
+                      ((  |      |)      |    ((|))
+<
+------------------------------------------------------------------------------
+   3.6 FILE TYPE BASED CONFIGURATION                     *delimitMateFileType*
+
+delimitMate options can be set globally for all buffers using global
+("regular") variables in your |vimrc| file. But |:autocmd| can be used to set
+options for specific file types (see |'filetype'|) using buffer variables in
+the following way: >
+
+   au FileType mail,text let b:delimitMate_autoclose = 0
+         ^       ^           ^            ^            ^
+         |       |           |            |            |
+         |       |           |            |            - Option value.
+         |       |           |            - Option name.
+         |       |           - Buffer variable.
+         |       - File types for which the option will be set.
+         - Don't forget to put this event.
+<
+NOTE that you should use buffer variables (|b:var|) only to set options with
+|:autocmd|, for global options use regular variables (|g:var|) in your vimrc.
+
+------------------------------------------------------------------------------
+   3.7 SYNTAX AWARENESS                                    *delimitMateSyntax*
+
+The features of this plug-in might not be always helpful, comments and strings
+usualy don't need auto-completion. delimitMate monitors which region is being
+edited and if it detects that the cursor is in a comment it'll turn itself off
+until the cursor leaves the comment. The excluded regions can be set using the
+option |'delimitMate_excluded_regions'|. Read |group-name| for a list of
+regions or syntax group names.
+
+NOTE that this feature relies on a proper syntax file for the current file
+type, if the appropiate syntax file doesn't define a region, delimitMate won't
+know about it.
+
+==============================================================================
+ 4. COMMANDS                                             *delimitMateCommands*
+
+------------------------------------------------------------------------------
+:DelimitMateReload                                        *:DelimitMateReload*
+
+Re-sets all the mappings used for this script, use it if any option has been
+changed or if the filetype option hasn't been set yet.
+
+------------------------------------------------------------------------------
+:DelimitMateOn                                                *:DelimitMateOn*
+
+Enable delimitMate mappings.
+
+------------------------------------------------------------------------------
+:DelimitMateOff                                              *:DelimitMateOff*
+
+Disable delimitMate mappings.
+
+------------------------------------------------------------------------------
+:DelimitMateSwitch                                        *:DelimitMateSwitch*
+
+Switches the plug-in on and off.
+
+------------------------------------------------------------------------------
+:DelimitMateTest                                            *:DelimitMateTest*
+
+This command tests every mapping set-up for this script, useful for testing
+custom configurations.
+
+The following output corresponds to the default values, it will be different
+depending on your configuration. "Open & close:" represents the final result
+when the closing delimiter has been inserted, either manually or
+automatically, see |delimitMateExpansion|. "Delete:" typing backspace in an
+empty pair, see |delimitMateBackspace|. "Exit:" typing a closing delimiter
+inside a pair of delimiters, see |delimitMateAutoclose|. "Space:" the
+expansion, if any, of space, see |delimitMateExpansion|. "Visual-L",
+"Visual-R" and "Visual" shows visual wrapping, see
+|delimitMateVisualWrapping|. "Car return:" the expansion of car return, see
+|delimitMateExpansion|. The cursor's position at the end of every test is
+represented by an "|": >
+
+            * AUTOCLOSE:
+            Open & close: (|)
+            Delete: |
+            Exit: ()|
+            Space: ( |)
+            Visual-L: (v)
+            Visual-R: (v)
+            Car return: (
+            |)
+
+            Open & close: {|}
+            Delete: |
+            Exit: {}|
+            Space: { |}
+            Visual-L: {v}
+            Visual-R: {v}
+            Car return: {
+            |}
+
+            Open & close: [|]
+            Delete: |
+            Exit: []|
+            Space: [ |]
+            Visual-L: [v]
+            Visual-R: [v]
+            Car return: [
+            |]
+
+            Open & close: "|"
+            Delete: |
+            Exit: ""|
+            Space: " |"
+            Visual: "v"
+            Car return: "
+            |"
+
+            Open & close: '|'
+            Delete: |
+            Exit: ''|
+            Space: ' |'
+            Visual: 'v'
+            Car return: '
+            |'
+
+            Open & close: `|`
+            Delete: |
+            Exit: ``|
+            Space: ` |`
+            Visual: `v`
+            Car return: `
+            |`
+<
+
+==============================================================================
+ 5. MAPPINGS                                             *delimitMateMappings*
+
+delimitMate doesn't override any existing map, so you may encounter that it
+doesn't work as expected because a mapping is missing. In that case, the
+conflicting mappings should be resolved by either disabling the conflicting
+mapping or creating a custom mappings.
+
+In order to make custom mappings easier and prevent overwritting existing
+ones, delimitMate uses the |<Plug>| + |hasmapto()| (|usr_41.txt|) construct
+for its mappings.
+
+These are the default mappings for the extra features:
+
+<BS>         is mapped to <Plug>delimitMateBS
+<S-BS>       is mapped to <Plug>delimitMateS-BS
+<S-Tab>      is mapped to <Plug>delimitMateS-Tab
+<C-G>g       is mapped to <Plug>delimitMateJumpMany
+
+The rest of the mappings correspond to parens, quotes, CR, Space, etc. and they
+depend on the values of the delimitMate options, they have the following form:
+
+<Plug>delimitMate + char
+
+e.g.: for "(":
+
+( is mapped to <Plug>delimitMate(
+
+e.g.: If you have <CR> expansion enabled, you might want to skip it on pop-up
+menus:
+
+    imap <expr> <CR> pumvisible()
+                     \ ? "\<C-Y>"
+                     \ : "<Plug>delimitMateCR"
+
+
+==============================================================================
+ 6. FUNCTIONS                                           *delimitMateFunctions*
+
+------------------------------------------------------------------------------
+delimitMate#WithinEmptyPair()                  *delimitMate#WithinEmptyPair()*
+
+Returns 1 if the cursor is inside an empty pair, 0 otherwise.
+e.g.: >
+
+    inoremap <expr> <CR> delimitMate#WithinEmptyPair() ?
+             \ "<Plug>delimitMateCR" :
+             \ "external_mapping"
+<
+
+------------------------------------------------------------------------------
+delimitMate#ShouldJump()                            *delimitMate#ShouldJump()*
+
+Returns 1 if there is a closing delimiter or a quote to the right of the
+cursor, 0 otherwise.
+
+------------------------------------------------------------------------------
+delimitMate#JumpAny()                               *delimitMate#JumpAny()*
+
+This function returns a mapping that will make the cursor jump to the right
+when delimitMate#ShouldJump() returns 1, returns the argument "key" otherwise.
+e.g.: You can use this to create your own mapping to jump over any delimiter.
+>
+   inoremap <expr> <C-Tab> delimitMate#JumpAny()
+<
+==============================================================================
+ 7. AUTOCOMMANDS                                         *delimitMateAutocmds*
+
+delimitMate emits 2 |User| autocommands to make it easier for users to
+leverage delimitMate's support for per-filetype customization.
+
+------------------------------------------------------------------------------
+delimitMate_map                                              *delimitMate_map*
+
+This |User| event is emittted just prior to delimitMate defining its
+buffer-local key mappings. You can use this command to define your own
+mappings that are disabled when delimitMate is turned off or excludes the
+current filetype.
+>
+    au User delimitMate_map call s:delimitMate_map()
+    function s:delimitMate_map()
+        imap <buffer><expr> <C-Tab> delimitMate#JumpAny()
+    endfunction
+<
+------------------------------------------------------------------------------
+delimitMate_unmap                                          *delimitMate_unmap*
+
+This |User| event is emitted just after delimitMate clears its buffer-local
+key mappings. You can use this command to clear your own mappings that you set
+in response to |delimitMate_map|.
+>
+    au User delimitMate_unmap call s:delimitMate_unmap()
+    function s:delimitMate_unmap()
+        silent! iunmap <buffer> <C-Tab>
+    endfunction
+<
+Note: This event may be emitted before |delimitMate_map|, and may be emitted
+multiple times in a row without any intervening |delimitMate_map| events.
+
+==============================================================================
+ 8. TODO LIST                                                *delimitMateTodo*
+
+- Automatic set-up by file type.
+- Make block-wise visual wrapping work on un-even regions.
+
+==============================================================================
+ 9. MAINTAINER                                         *delimitMateMaintainer*
+
+Hi there! My name is Israel Chauca F. and I can be reached at:
+    mailto:israelchauca@gmail.com
+
+Feel free to send me any suggestions and/or comments about this plugin, I'll
+be very pleased to read them.
+
+==============================================================================
+ 10. CREDITS                                              *delimitMateCredits*
+
+Contributors: ~
+
+  - Kim Silkebækken                                                         ~
+    Fixed mappings being echoed in the terminal.
+
+  - Eric Van Dewoestine                                                     ~
+    Implemented smart matchpairs.
+
+Some of the code that makes this script was modified or just shamelessly
+copied from the following sources:
+
+  - Ian McCracken                                                          ~
+    Post titled: Vim, Part II: Matching Pairs:
+    http://concisionandconcinnity.blogspot.com/
+
+  - Aristotle Pagaltzis                                                    ~
+    From the comments on the previous blog post and from:
+    http://gist.github.com/144619
+
+  - Karl Guertin                                                           ~
+    AutoClose:
+    http://www.vim.org/scripts/script.php?script_id=1849
+
+  - Thiago Alves                                                           ~
+    AutoClose:
+    http://www.vim.org/scripts/script.php?script_id=2009
+
+  - Edoardo Vacchi                                                         ~
+    ClosePairs:
+    http://www.vim.org/scripts/script.php?script_id=2373
+
+This script was inspired by the auto-completion of delimiters on TextMate.
+
+==============================================================================
+ 11. HISTORY                                               *delimitMateHistory*
+
+  Version      Date      Release notes                                       ~
+|---------|------------|-----------------------------------------------------|
+    2.8     2013-07-15 * Current release:
+                         - Add :DelimitMateOn & :DelimitMateOff.
+|---------|------------|-----------------------------------------------------|
+    2.7     2013-07-15 * - Lots of bug fixes.
+                         - Add delimitMate_offByDefault.
+                         - Add delimitMate_eol_marker.
+                         - Reduce the number of mappings.
+                         - Stop using setline().
+                         - Better handling of nested quotes.
+                         - Allow a custom pattern for smart_quotes.
+|---------|------------|-----------------------------------------------------|
+    2.6     2011-01-14 * - Add smart_matchpairs feature.
+                         - Add mapping to jump over contiguous delimiters.
+                         - Fix behaviour of b:loaded_delimitMate.
+|---------|------------|-----------------------------------------------------|
+    2.5.1   2010-09-30 * - Remove visual wrapping. Surround.vim offers a much
+                           better implementation.
+                         - Minor mods to DelimitMateTest.
+|---------|------------|-----------------------------------------------------|
+    2.5     2010-09-22 * - Better handling of mappings.
+                         - Add report for mappings in |:DelimitMateTest|.
+                         - Allow the use of "|" and multi-byte characters in
+                           |'delimitMate_quotes'| and |'delimitMate_matchpairs'|.
+                         - Allow commands to be concatenated using |.
+|---------|------------|-----------------------------------------------------|
+    2.4.1   2010-07-31 * - Fix problem with <Home> and <End>.
+                         - Add missing doc on |'delimitMate_smart_quotes'|,
+                           |delimitMateBalance| and
+                           |'delimitMate_balance_matchpairs'|.
+|---------|------------|-----------------------------------------------------|
+    2.4     2010-07-29 * - Unbalanced parens: see :help delimitMateBalance.
+                         - Visual wrapping now works on block-wise visual
+                           with some limitations.
+                         - Arrow keys didn't work on terminal.
+                         - Added option to allow nested quotes.
+                         - Expand Smart Quotes to look for a string on the
+                           right of the cursor.
+
+|---------|------------|-----------------------------------------------------|
+    2.3.1   2010-06-06 * - Fix: an extra <Space> is inserted after <Space>
+                           expansion.
+
+|---------|------------|-----------------------------------------------------|
+    2.3     2010-06-06 * - Syntax aware: Will turn off when editing comments
+                           or other regions, customizable.
+                         - Changed format of most mappings.
+                         - Fix: <CR> expansion doesn't break automatic
+                           indentation adjustments anymore.
+                         - Fix: Arrow keys would insert A, B, C or D instead
+                           of moving the cursor when using Vim on a terminal.
+
+|---------|------------|-----------------------------------------------------|
+    2.2     2010-05-16 * - Added command to switch the plug-in on and off.
+                         - Fix: some problems with <Left>, <Right> and <CR>.
+                         - Fix: A small problem when inserting a delimiter at
+                           the beginning of the line.
+
+|---------|------------|-----------------------------------------------------|
+    2.1     2010-05-10 * - Most of the functions have been moved to an
+                           autoload script to avoid loading unnecessary ones.
+                         - Fixed a problem with the redo command.
+                         - Many small fixes.
+
+|---------|------------|-----------------------------------------------------|
+    2.0     2010-04-01 * New features:
+                         - All features are redo/undo-wise safe.
+                         - A single quote typed after an alphanumeric
+                           character is considered an apostrophe and one
+                           single quote is inserted.
+                         - A quote typed after another quote inserts a single
+                           quote and the cursor jumps to the middle.
+                         - <S-Tab> jumps out of any empty pair.
+                         - <CR> and <Space> expansions are fixed, but the
+                           functions used for it are global and can be used in
+                           custom mappings. The previous system is still
+                           active if you have any of the expansion options
+                           set.
+                         - <S-Backspace> deletes the closing delimiter.
+                         * Fixed bug:
+                         - s:vars were being used to store buffer options.
+
+|---------|------------|-----------------------------------------------------|
+    1.6     2009-10-10 * Now delimitMate tries to fix the balancing of single
+                         quotes when used as apostrophes. You can read
+                         |delimitMate_apostrophes| for details.
+                         Fixed an error when |b:delimitMate_expand_space|
+                         wasn't set but |delimitMate_expand_space| wasn't.
+
+|---------|------------|-----------------------------------------------------|
+    1.5     2009-10-05 * Fix: delimitMate should work correctly for files
+                         passed as arguments to Vim. Thanks to Ben Beuchler
+                         for helping to nail this bug.
+
+|---------|------------|-----------------------------------------------------|
+    1.4     2009-09-27 * Fix: delimitMate is now enabled on new buffers even
+                         if they don't have set the file type option or were
+                         opened directly from the terminal.
+
+|---------|------------|-----------------------------------------------------|
+    1.3     2009-09-24 * Now local options can be used along with autocmd
+                         for specific file type configurations.
+                         Fixes:
+                         - Unnamed register content is not lost on visual
+                         mode.
+                         - Use noremap where appropiate.
+                         - Wrapping a single empty line works as expected.
+
+|---------|------------|-----------------------------------------------------|
+    1.2     2009-09-07 * Fixes:
+                         - When inside nested empty pairs, deleting the
+                         innermost left delimiter would delete all right
+                         contiguous delimiters.
+                         - When inside an empty pair, inserting a left
+                         delimiter wouldn't insert the right one, instead
+                         the cursor would jump to the right.
+                         - New buffer inside the current window wouldn't
+                         have the mappings set.
+
+|---------|------------|-----------------------------------------------------|
+    1.1     2009-08-25 * Fixed an error that ocurred when mapleader wasn't
+                         set and added support for GetLatestScripts
+                         auto-detection.
+
+|---------|------------|-----------------------------------------------------|
+    1.0     2009-08-23 * Initial upload.
+
+|---------|------------|-----------------------------------------------------|
+
+
+  `\|||/´         MMM           \|/            www            __^__          ~
+   (o o)         (o o)          @ @           (O-O)          /(o o)\\        ~
+ooO_(_)_Ooo__ ooO_(_)_Ooo___oOO_(_)_OOo___oOO__(_)__OOo___oOO__(_)__OOo_____ ~
+_____|_____|_____|_____|_____|_____|_____|_____|_____|_____|_____|_____|____ ~
+__|_____|_____|_____|_____|_____|_____|_____|_____|_____|_____|_____|_____|_ ~
+_____|_____|_____|_____|_____|_____|_____|_____|_____|_____|_____|_____|____ ~
+
+vim:tw=78:et:ts=8:sw=2:ft=help:norl:formatoptions+=tcroqn:autoindent:

+ 64 - 0
vim/plugged/delimitMate/doc/tags

@@ -0,0 +1,64 @@
+'b:delimitMate_autoclose'	delimitMate.txt	/*'b:delimitMate_autoclose'*
+'b:delimitMate_balance_matchpairs'	delimitMate.txt	/*'b:delimitMate_balance_matchpairs'*
+'b:delimitMate_expand_cr'	delimitMate.txt	/*'b:delimitMate_expand_cr'*
+'b:delimitMate_expand_inside_quotes'	delimitMate.txt	/*'b:delimitMate_expand_inside_quotes'*
+'b:delimitMate_expand_space'	delimitMate.txt	/*'b:delimitMate_expand_space'*
+'b:delimitMate_jump_expansion'	delimitMate.txt	/*'b:delimitMate_jump_expansion'*
+'b:delimitMate_matchpairs'	delimitMate.txt	/*'b:delimitMate_matchpairs'*
+'b:delimitMate_nesting_quotes'	delimitMate.txt	/*'b:delimitMate_nesting_quotes'*
+'b:delimitMate_quotes'	delimitMate.txt	/*'b:delimitMate_quotes'*
+'b:delimitMate_smart_matchpairs'	delimitMate.txt	/*'b:delimitMate_smart_matchpairs'*
+'b:delimitMate_smart_quotes'	delimitMate.txt	/*'b:delimitMate_smart_quotes'*
+'b:loaded_delimitMate'	delimitMate.txt	/*'b:loaded_delimitMate'*
+'delimitMate_apostrophes'	delimitMate.txt	/*'delimitMate_apostrophes'*
+'delimitMate_autoclose'	delimitMate.txt	/*'delimitMate_autoclose'*
+'delimitMate_balance_matchpairs'	delimitMate.txt	/*'delimitMate_balance_matchpairs'*
+'delimitMate_eol_marker'	delimitMate.txt	/*'delimitMate_eol_marker'*
+'delimitMate_excluded_ft'	delimitMate.txt	/*'delimitMate_excluded_ft'*
+'delimitMate_excluded_regions'	delimitMate.txt	/*'delimitMate_excluded_regions'*
+'delimitMate_expand_cr'	delimitMate.txt	/*'delimitMate_expand_cr'*
+'delimitMate_expand_inside_quotes'	delimitMate.txt	/*'delimitMate_expand_inside_quotes'*
+'delimitMate_expand_space'	delimitMate.txt	/*'delimitMate_expand_space'*
+'delimitMate_insert_eol_marker'	delimitMate.txt	/*'delimitMate_insert_eol_marker'*
+'delimitMate_jump_expansion'	delimitMate.txt	/*'delimitMate_jump_expansion'*
+'delimitMate_matchpairs'	delimitMate.txt	/*'delimitMate_matchpairs'*
+'delimitMate_nesting_quotes'	delimitMate.txt	/*'delimitMate_nesting_quotes'*
+'delimitMate_offByDefault'	delimitMate.txt	/*'delimitMate_offByDefault'*
+'delimitMate_quotes'	delimitMate.txt	/*'delimitMate_quotes'*
+'delimitMate_smart_matchpairs'	delimitMate.txt	/*'delimitMate_smart_matchpairs'*
+'delimitMate_smart_quotes'	delimitMate.txt	/*'delimitMate_smart_quotes'*
+'loaded_delimitMate'	delimitMate.txt	/*'loaded_delimitMate'*
+:DelimitMateOff	delimitMate.txt	/*:DelimitMateOff*
+:DelimitMateOn	delimitMate.txt	/*:DelimitMateOn*
+:DelimitMateReload	delimitMate.txt	/*:DelimitMateReload*
+:DelimitMateSwitch	delimitMate.txt	/*:DelimitMateSwitch*
+:DelimitMateTest	delimitMate.txt	/*:DelimitMateTest*
+delimitMate	delimitMate.txt	/*delimitMate*
+delimitMate#JumpAny()	delimitMate.txt	/*delimitMate#JumpAny()*
+delimitMate#ShouldJump()	delimitMate.txt	/*delimitMate#ShouldJump()*
+delimitMate#WithinEmptyPair()	delimitMate.txt	/*delimitMate#WithinEmptyPair()*
+delimitMate-contents	delimitMate.txt	/*delimitMate-contents*
+delimitMate.txt	delimitMate.txt	/*delimitMate.txt*
+delimitMateAutoClose	delimitMate.txt	/*delimitMateAutoClose*
+delimitMateAutocmds	delimitMate.txt	/*delimitMateAutocmds*
+delimitMateBackspace	delimitMate.txt	/*delimitMateBackspace*
+delimitMateBalance	delimitMate.txt	/*delimitMateBalance*
+delimitMateCommands	delimitMate.txt	/*delimitMateCommands*
+delimitMateCredits	delimitMate.txt	/*delimitMateCredits*
+delimitMateExpansion	delimitMate.txt	/*delimitMateExpansion*
+delimitMateFileType	delimitMate.txt	/*delimitMateFileType*
+delimitMateFunctionality	delimitMate.txt	/*delimitMateFunctionality*
+delimitMateFunctions	delimitMate.txt	/*delimitMateFunctions*
+delimitMateHistory	delimitMate.txt	/*delimitMateHistory*
+delimitMateIntro	delimitMate.txt	/*delimitMateIntro*
+delimitMateMaintainer	delimitMate.txt	/*delimitMateMaintainer*
+delimitMateMappings	delimitMate.txt	/*delimitMateMappings*
+delimitMateOptionDetails	delimitMate.txt	/*delimitMateOptionDetails*
+delimitMateOptionSummary	delimitMate.txt	/*delimitMateOptionSummary*
+delimitMateOptions	delimitMate.txt	/*delimitMateOptions*
+delimitMateSmartMatchpairs	delimitMate.txt	/*delimitMateSmartMatchpairs*
+delimitMateSmartQuotes	delimitMate.txt	/*delimitMateSmartQuotes*
+delimitMateSyntax	delimitMate.txt	/*delimitMateSyntax*
+delimitMateTodo	delimitMate.txt	/*delimitMateTodo*
+delimitMate_map	delimitMate.txt	/*delimitMate_map*
+delimitMate_unmap	delimitMate.txt	/*delimitMate_unmap*

+ 403 - 0
vim/plugged/delimitMate/plugin/delimitMate.vim

@@ -0,0 +1,403 @@
+" File:        plugin/delimitMate.vim
+" Version:     2.7
+" Modified:    2013-07-15
+" Description: This plugin provides auto-completion for quotes, parens, etc.
+" Maintainer:  Israel Chauca F. <israelchauca@gmail.com>
+" Manual:      Read ":help delimitMate".
+" ============================================================================
+
+" Initialization: {{{
+
+if exists("g:loaded_delimitMate") || &cp
+  " User doesn't want this plugin or compatible is set, let's get out!
+  finish
+endif
+let g:loaded_delimitMate = 1
+let save_cpo = &cpo
+set cpo&vim
+
+if v:version < 700
+  echoerr "delimitMate: this plugin requires vim >= 7!"
+  finish
+endif
+
+let s:loaded_delimitMate = 1
+let delimitMate_version = "2.8"
+
+"}}}
+
+" Functions: {{{
+
+function! s:option_init(name, default) "{{{
+  let opt_name = "delimitMate_" . a:name
+  " Find value to use.
+  if !has_key(b:, opt_name) && !has_key(g:, opt_name)
+    let value = a:default
+  elseif has_key(b:, opt_name)
+    let value = b:[opt_name]
+  else
+    let value = g:[opt_name]
+  endif
+  call s:set(a:name, value)
+endfunction "}}}
+
+function! s:init() "{{{
+" Initialize variables:
+  " autoclose
+  call s:option_init("autoclose", 1)
+  " matchpairs
+  call s:option_init("matchpairs", string(&matchpairs)[1:-2])
+  call s:option_init("matchpairs_list", map(split(s:get('matchpairs', ''), '.:.\zs,\ze.:.'), 'split(v:val, ''^.\zs:\ze.$'')'))
+  let pairs = s:get('matchpairs_list', [])
+  if len(filter(pairs, 'v:val[0] ==# v:val[1]'))
+    echohl ErrorMsg
+    echom 'delimitMate: each member of a pair in delimitMate_matchpairs must be different from each other.'
+    echom 'delimitMate: invalid pairs: ' . join(map(pairs, 'join(v:val, ":")'), ', ')
+    echohl Normal
+    return 0
+  endif
+  call s:option_init("left_delims", map(copy(s:get('matchpairs_list', [])), 'v:val[0]'))
+  call s:option_init("right_delims", map(copy(s:get('matchpairs_list', [])), 'v:val[1]'))
+  " quotes
+  call s:option_init("quotes", "\" ' `")
+  call s:option_init("quotes_list",split(s:get('quotes', ''), '\s\+'))
+  " nesting_quotes
+  call s:option_init("nesting_quotes", [])
+  " excluded_regions
+  call s:option_init("excluded_regions", "Comment")
+  call s:option_init("excluded_regions_list", split(s:get('excluded_regions', ''), ',\s*'))
+  let enabled = len(s:get('excluded_regions_list', [])) > 0
+  call s:option_init("excluded_regions_enabled", enabled)
+  " expand_space
+  if exists("b:delimitMate_expand_space") && type(b:delimitMate_expand_space) == type("")
+    echom "b:delimitMate_expand_space is '".b:delimitMate_expand_space."' but it must be either 1 or 0!"
+    echom "Read :help 'delimitMate_expand_space' for more details."
+    unlet b:delimitMate_expand_space
+    let b:delimitMate_expand_space = 1
+  endif
+  if exists("g:delimitMate_expand_space") && type(g:delimitMate_expand_space) == type("")
+    echom "delimitMate_expand_space is '".g:delimitMate_expand_space."' but it must be either 1 or 0!"
+    echom "Read :help 'delimitMate_expand_space' for more details."
+    unlet g:delimitMate_expand_space
+    let g:delimitMate_expand_space = 1
+  endif
+  call s:option_init("expand_space", 0)
+  " expand_cr
+  if exists("b:delimitMate_expand_cr") && type(b:delimitMate_expand_cr) == type("")
+    echom "b:delimitMate_expand_cr is '".b:delimitMate_expand_cr."' but it must be either 1 or 0!"
+    echom "Read :help 'delimitMate_expand_cr' for more details."
+    unlet b:delimitMate_expand_cr
+    let b:delimitMate_expand_cr = 1
+  endif
+  if exists("g:delimitMate_expand_cr") && type(g:delimitMate_expand_cr) == type("")
+    echom "delimitMate_expand_cr is '".g:delimitMate_expand_cr."' but it must be either 1 or 0!"
+    echom "Read :help 'delimitMate_expand_cr' for more details."
+    unlet g:delimitMate_expand_cr
+    let g:delimitMate_expand_cr = 1
+  endif
+  if ((&backspace !~ 'eol' || &backspace !~ 'start') && &backspace != 2) &&
+        \ ((exists('b:delimitMate_expand_cr') && b:delimitMate_expand_cr == 1) ||
+        \ (exists('g:delimitMate_expand_cr') && g:delimitMate_expand_cr == 1))
+    echom "delimitMate: There seems to be some incompatibility with your settings that may interfer with the expansion of <CR>. See :help 'delimitMate_expand_cr' for details."
+  endif
+  call s:option_init("expand_cr", 0)
+  " expand_in_quotes
+  call s:option_init('expand_inside_quotes', 0)
+  " jump_expansion
+  call s:option_init("jump_expansion", 0)
+  " smart_matchpairs
+  call s:option_init("smart_matchpairs", '^\%(\w\|\!\|[£$]\|[^[:punct:][:space:]]\)')
+  " smart_quotes
+  " XXX: backward compatibility. Ugly, should go the way of the dodo soon.
+  let quotes = escape(join(s:get('quotes_list', []), ''), '\-^[]')
+  let default_smart_quotes = '\%(\w\|[^[:punct:][:space:]' . quotes . ']\|\%(\\\\\)*\\\)\%#\|\%#\%(\w\|[^[:space:][:punct:]' . quotes . ']\)'
+  if exists('g:delimitMate_smart_quotes') && type(g:delimitMate_smart_quotes) == type(0)
+    if g:delimitMate_smart_quotes
+      unlet g:delimitMate_smart_quotes
+    else
+      unlet g:delimitMate_smart_quotes
+      let g:delimitMate_smart_quotes = ''
+    endif
+  endif
+  if exists('b:delimitMate_smart_quotes') && type(b:delimitMate_smart_quotes) == type(0)
+    if b:delimitMate_smart_quotes
+      unlet b:delimitMate_smart_quotes
+      if exists('g:delimitMate_smart_quotes') && type(g:delimitMate_smart_quotes) && g:delimitMate_smart_quotes
+        let b:delimitMate_smart_quotes = default_smart_quotes
+      endif
+    else
+      unlet b:delimitMate_smart_quotes
+      let b:delimitMate_smart_quotes = ''
+    endif
+  endif
+  call s:option_init("smart_quotes", default_smart_quotes)
+  " apostrophes
+  call s:option_init("apostrophes", "")
+  call s:option_init("apostrophes_list", split(s:get('apostrophes', ''), ":\s*"))
+  " tab2exit
+  call s:option_init("tab2exit", 1)
+  " balance_matchpairs
+  call s:option_init("balance_matchpairs", 0)
+  " eol marker
+  call s:option_init("insert_eol_marker", 1)
+  call s:option_init("eol_marker", "")
+  " Everything is fine.
+  return 1
+endfunction "}}} Init()
+
+function! s:get(name, default) "{{{
+  let bufoptions = delimitMate#Get()
+  return get(bufoptions, a:name, a:default)
+endfunction "}}}
+
+function! s:set(...) " {{{
+  return call('delimitMate#Set', a:000)
+endfunction " }}}
+
+function! s:Map() "{{{
+  " Set mappings:
+  try
+    let save_keymap = &keymap
+    let save_iminsert = &iminsert
+    let save_imsearch = &imsearch
+    let save_cpo = &cpo
+    set keymap=
+    set cpo&vim
+    silent! doautocmd <nomodeline> User delimitMate_map
+    if s:get('autoclose', 1)
+      call s:AutoClose()
+    else
+      call s:NoAutoClose()
+    endif
+    call s:ExtraMappings()
+  finally
+    let &cpo = save_cpo
+    let &keymap = save_keymap
+    let &iminsert = save_iminsert
+    let &imsearch = save_imsearch
+  endtry
+
+  let b:delimitMate_enabled = 1
+endfunction "}}} Map()
+
+function! s:Unmap() " {{{
+  let imaps =
+        \ s:get('right_delims', []) +
+        \ s:get('left_delims', []) +
+        \ s:get('quotes_list', []) +
+        \ s:get('apostrophes_list', []) +
+        \ ['<BS>', '<C-h>', '<S-BS>', '<Del>', '<CR>', '<Space>', '<S-Tab>', '<Esc>'] +
+        \ ['<Up>', '<Down>', '<Left>', '<Right>', '<LeftMouse>', '<RightMouse>'] +
+        \ ['<C-Left>', '<C-Right>'] +
+        \ ['<Home>', '<End>', '<PageUp>', '<PageDown>', '<S-Down>', '<S-Up>', '<C-G>g']
+
+  for map in imaps
+    if maparg(map, "i") =~# '^<Plug>delimitMate'
+      if map == '|'
+        let map = '<Bar>'
+      endif
+      exec 'silent! iunmap <buffer> ' . map
+    endif
+  endfor
+  silent! doautocmd <nomodeline> User delimitMate_unmap
+  let b:delimitMate_enabled = 0
+endfunction " }}} s:Unmap()
+
+function! s:test() "{{{
+  if &modified
+    let confirm = input("Modified buffer, type \"yes\" to write and proceed "
+          \ . "with test: ") ==? 'yes'
+    if !confirm
+      return
+    endif
+  endif
+  call delimitMate#Test()
+  g/\%^$/d
+  0
+endfunction "}}}
+
+function! s:setup(...) "{{{
+  let swap = a:0 && a:1 == 2
+  let enable = a:0 && a:1
+  let disable = a:0 && !a:1
+  " First, remove all magic, if needed:
+  if get(b:, 'delimitMate_enabled', 0)
+    call s:Unmap()
+    " Switch
+    if swap
+      echo "delimitMate is disabled."
+      return
+    endif
+  endif
+  if disable
+    " Just disable the mappings.
+    return
+  endif
+  if !a:0
+    " Check if this file type is excluded:
+    if exists("g:delimitMate_excluded_ft") &&
+          \ index(split(g:delimitMate_excluded_ft, ','), &filetype, 0, 1) >= 0
+      " Finish here:
+      return 1
+    endif
+    " Check if user tried to disable using b:loaded_delimitMate
+    if exists("b:loaded_delimitMate")
+      return 1
+    endif
+  endif
+  " Initialize settings:
+  if ! s:init()
+    " Something went wrong.
+    return
+  endif
+  if enable || swap || !get(g:, 'delimitMate_offByDefault', 0)
+    " Now, add magic:
+    call s:Map()
+    if a:0
+      echo "delimitMate is enabled."
+    endif
+  endif
+endfunction "}}}
+
+function! s:TriggerAbb() "{{{
+  if v:version < 703
+        \ || ( v:version == 703 && !has('patch489') )
+        \ || pumvisible()
+    return ''
+  endif
+  return "\<C-]>"
+endfunction "}}}
+
+function! s:NoAutoClose() "{{{
+  " inoremap <buffer> ) <C-R>=delimitMate#SkipDelim('\)')<CR>
+  for delim in s:get('right_delims', []) + s:get('quotes_list', [])
+    if delim == '|'
+      let delim = '<Bar>'
+    endif
+    exec 'inoremap <silent> <Plug>delimitMate' . delim . ' <C-R>=<SID>TriggerAbb().delimitMate#SkipDelim("' . escape(delim,'"') . '")<CR>'
+    exec 'silent! imap <unique> <buffer> '.delim.' <Plug>delimitMate'.delim
+  endfor
+endfunction "}}}
+
+function! s:AutoClose() "{{{
+  " Add matching pair and jump to the midle:
+  " inoremap <silent> <buffer> ( ()<Left>
+  let i = 0
+  while i < len(s:get('matchpairs_list', []))
+    let ld = s:get('left_delims', [])[i] == '|' ? '<bar>' : s:get('left_delims', [])[i]
+    let rd = s:get('right_delims', [])[i] == '|' ? '<bar>' : s:get('right_delims', [])[i]
+    exec 'inoremap <expr><silent> <Plug>delimitMate' . ld
+                \. ' <SID>TriggerAbb().delimitMate#ParenDelim("' . escape(rd, '|') . '")'
+    exec 'silent! imap <unique> <buffer> '.ld
+                \.' <Plug>delimitMate'.ld
+    let i += 1
+  endwhile
+
+  " Exit from inside the matching pair:
+  for delim in s:get('right_delims', [])
+    let delim = delim == '|' ? '<bar>' : delim
+    exec 'inoremap <expr><silent> <Plug>delimitMate' . delim
+                \. ' <SID>TriggerAbb().delimitMate#JumpOut("\' . delim . '")'
+    exec 'silent! imap <unique> <buffer> ' . delim
+                \. ' <Plug>delimitMate'. delim
+  endfor
+
+  " Add matching quote and jump to the midle, or exit if inside a pair of matching quotes:
+  " inoremap <silent> <buffer> " <C-R>=delimitMate#QuoteDelim("\"")<CR>
+  for delim in s:get('quotes_list', [])
+    if delim == '|'
+      let delim = '<Bar>'
+    endif
+    exec 'inoremap <expr><silent> <Plug>delimitMate' . delim
+                \. ' <SID>TriggerAbb()."<C-R>=delimitMate#QuoteDelim(\"\\\' . delim . '\")<CR>"'
+    exec 'silent! imap <unique> <buffer> ' . delim
+                \. ' <Plug>delimitMate' . delim
+  endfor
+
+  " Try to fix the use of apostrophes (kept for backward compatibility):
+  " inoremap <silent> <buffer> n't n't
+  for map in s:get('apostrophes_list', [])
+    exec "inoremap <silent> " . map . " " . map
+    exec 'silent! imap <unique> <buffer> ' . map . ' <Plug>delimitMate' . map
+  endfor
+endfunction "}}}
+
+function! s:ExtraMappings() "{{{
+  " If pair is empty, delete both delimiters:
+  inoremap <silent> <Plug>delimitMateBS <C-R>=delimitMate#BS()<CR>
+  if !hasmapto('<Plug>delimitMateBS','i')
+    if empty(maparg('<BS>', 'i'))
+      silent! imap <unique> <buffer> <BS> <Plug>delimitMateBS
+    endif
+    if empty(maparg('<C-H>', 'i'))
+      silent! imap <unique> <buffer> <C-h> <Plug>delimitMateBS
+    endif
+  endif
+  " If pair is empty, delete closing delimiter:
+  inoremap <silent> <expr> <Plug>delimitMateS-BS delimitMate#WithinEmptyPair() ? "\<Del>" : "\<S-BS>"
+  if !hasmapto('<Plug>delimitMateS-BS','i') && maparg('<S-BS>', 'i') == ''
+    silent! imap <unique> <buffer> <S-BS> <Plug>delimitMateS-BS
+  endif
+  " Expand return if inside an empty pair:
+  inoremap <expr><silent> <Plug>delimitMateCR <SID>TriggerAbb()."\<C-R>=delimitMate#ExpandReturn()\<CR>"
+  if s:get('expand_cr', 0) && !hasmapto('<Plug>delimitMateCR', 'i') && maparg('<CR>', 'i') == ''
+    silent! imap <unique> <buffer> <CR> <Plug>delimitMateCR
+  endif
+  " Expand space if inside an empty pair:
+  inoremap <expr><silent> <Plug>delimitMateSpace <SID>TriggerAbb()."\<C-R>=delimitMate#ExpandSpace()\<CR>"
+  if s:get('expand_space', 0) && !hasmapto('<Plug>delimitMateSpace', 'i') && maparg('<Space>', 'i') == ''
+    silent! imap <unique> <buffer> <Space> <Plug>delimitMateSpace
+  endif
+  " Jump over any delimiter:
+  inoremap <expr><silent> <Plug>delimitMateS-Tab <SID>TriggerAbb()."\<C-R>=delimitMate#JumpAny()\<CR>"
+  if s:get('tab2exit', 0) && !hasmapto('<Plug>delimitMateS-Tab', 'i') && maparg('<S-Tab>', 'i') == ''
+    silent! imap <unique> <buffer> <S-Tab> <Plug>delimitMateS-Tab
+  endif
+  " Jump over next delimiters
+  inoremap <expr><buffer> <Plug>delimitMateJumpMany <SID>TriggerAbb()."\<C-R>=delimitMate#JumpMany()\<CR>"
+  if !hasmapto('<Plug>delimitMateJumpMany', 'i') && maparg("<C-G>g", 'i') == ''
+    imap <silent> <buffer> <C-G>g <Plug>delimitMateJumpMany
+  endif
+endfunction "}}}
+
+"}}}
+
+" Commands: {{{
+
+" Let me refresh without re-loading the buffer:
+command! -bar DelimitMateReload call s:setup(1)
+" Quick test:
+command! -bar DelimitMateTest call s:test()
+" Switch On/Off:
+command! -bar DelimitMateSwitch call s:setup(2)
+" Enable mappings:
+command! -bar DelimitMateOn call s:setup(1)
+" Disable mappings:
+command! -bar DelimitMateOff call s:setup(0)
+
+"}}}
+
+" Autocommands: {{{
+
+augroup delimitMate
+  au!
+  " Run on file type change.
+  au FileType * call <SID>setup()
+  au FileType python let b:delimitMate_nesting_quotes = ['"', "'"]
+
+  " Run on new buffers.
+  au BufNewFile,BufRead,BufEnter,CmdwinEnter *
+        \ if !exists('b:delimitMate_was_here') |
+        \   call <SID>setup() |
+        \   let b:delimitMate_was_here = 1 |
+        \ endif
+augroup END
+
+"}}}
+
+" This is for the default buffer when it does not have a filetype.
+call s:setup()
+
+let &cpo = save_cpo
+" GetLatestVimScripts: 2754 1 :AutoInstall: delimitMate.vim
+" vim:foldmethod=marker:foldcolumn=4:ts=2:sw=2

+ 9 - 0
vim/plugged/delimitMate/test/Makefile

@@ -0,0 +1,9 @@
+all: build/runVimTests
+	build/runVimTests/bin/runVimTests.sh -0 .
+
+build/runVimTests: build/VimTAP
+	git clone https://github.com/inkarkat/runVimTests $@
+
+# Use VimTAP as directory name, as used with runVimTestsSetup.vim.
+build/VimTAP:
+	git clone https://github.com/inkarkat/vimtap $@

+ 18 - 0
vim/plugged/delimitMate/test/README.md

@@ -0,0 +1,18 @@
+# Automatic test setup
+You can use `make` (or `make test` from the top level directory) to run the
+tests.
+
+# Manual test setup instructions
+The plugins [runVimTests](http://www.vim.org/scripts/script.php?script_id=2565)
+and [VimTAP](http://www.vim.org/scripts/script.php?script_id=2213) are needed
+to run these tests.
+
+Besides the `_setup.vim` configuration file present in this repo you need to
+create a global one and place it in the same dir where the runVimTests
+executable is located. Assuming the executable is at '~/bin/runVimTests' this
+global configuration file should be '~/bin/runVimTestsSetup.vim' and should
+have something like the following lines inside of it:
+
+    " Prepend tests repos to &rtp
+    let &runtimepath = '/path/to/runVimTests_dir,' . &rtp
+    let &runtimepath = '/path/to/vimTAP_dir,' . &rtp

+ 12 - 0
vim/plugged/delimitMate/test/_setup.vim

@@ -0,0 +1,12 @@
+let &rtp = expand('<sfile>:p:h:h') . ',' . &rtp . ',' . expand('<sfile>:p:h:h') . '/after'
+set bs=2
+ru plugin/delimitMate.vim
+let runVimTests = expand('<sfile>:p:h').'/build/runVimTests'
+if isdirectory(runVimTests)
+  let &rtp = runVimTests . ',' . &rtp
+endif
+let vimTAP = expand('<sfile>:p:h').'/build/VimTAP'
+if isdirectory(vimTAP)
+  let &rtp = vimTAP . ',' . &rtp
+endif
+

+ 51 - 0
vim/plugged/delimitMate/test/autoclose_matchpairs.txt

@@ -0,0 +1,51 @@
+let g:delimitMate_autoclose = 1
+"(x" "(x)"
+"(\<BS>x" "x"
+"()x" "()x"
+"((\<C-G>gx" "(())x"
+"(x\<Esc>u" ""
+"@(x" "@(x)"
+"@#\<Left>(x" "@(x)#"
+"(\<S-Tab>x" "()x"
+let g:delimitMate_autoclose = 0
+"(x" "(x"
+"()x" "(x)"
+"())x" "()x"
+"()\<BS>x" "x"
+"@()x" "@(x)"
+"@#\<Left>()x" "@(x)#"
+let g:delimitMate_expand_space = 1
+let g:delimitMate_autoclose = 1
+"(\<Space>x" "( x )"
+"(\<Space>\<BS>x" "(x)"
+let g:delimitMate_autoclose = 0
+"()\<Space>\<BS>x" "(x)"
+let g:delimitMate_autoclose = 1
+# Handle backspace gracefully.
+set backspace=
+"(\<Esc>a\<BS>x" "(x)"
+set bs=2
+# closing parens removes characters. #133
+"(a\<Esc>i)" "()a)"
+
+# Add semicolon next to the closing paren. Issue #77.
+new
+let b:delimitMate_eol_marker = ';'
+"abc(x" "abc(x);"
+%d
+# BS should behave accordingly.
+"abc(\<BS>" "abc;"
+# Expand iabbreviations
+unlet b:delimitMate_eol_marker
+iabb def ghi
+"def(" "ghi()"
+iunabb def
+
+"abc а\<Left>(" "abc (а"
+"abc ñ\<Left>(" "abc (ñ"
+"abc $\<Left>(" "abc ($"
+"abc £\<Left>(" "abc (£"
+"abc d\<Left>(" "abc (d"
+"abc \<C-V>(\<Left>(" "abc (("
+"abc .\<Left>(" "abc ()."
+"abc  \<Left>(" "abc () "

+ 42 - 0
vim/plugged/delimitMate/test/autoclose_matchpairs.vim

@@ -0,0 +1,42 @@
+let g:delimitMate_matchpairs = '(:),{:},[:],<:>,¿:?,¡:!,,::'
+let lines = readfile(expand('<sfile>:t:r').'.txt')
+call vimtest#StartTap()
+let testsnumber = len(filter(copy(lines), 'v:val =~ ''^"'''))
+let itemsnumber = len(split(g:delimitMate_matchpairs, '.:.\zs,\ze.:.'))
+call vimtap#Plan(testsnumber * itemsnumber)
+let tcount = 1
+let reload = 1
+for item in lines
+  if item =~ '^#\|^\s*$'
+    " A comment or empty line.
+    continue
+  endif
+  if item !~ '^"'
+    " A command.
+    exec item
+    call vimtap#Diag(item)
+    let reload = 1
+    continue
+  endif
+  if reload
+    DelimitMateReload
+    call vimtap#Diag('DelimitMateReload')
+    let reload = 0
+  endif
+  let [input, output] = split(item, '"\%(\\.\|[^\\"]\)*"\zs\s*\ze"\%(\\.\|[^\\"]\)*"')
+  for [s:l,s:r] in map(split(g:delimitMate_matchpairs, '.:.\zs,\ze.:.'), 'split(v:val, ''.\zs:\ze.'')')
+    let input2 = substitute(input, '(', s:l, 'g')
+    let input2 = substitute(input2, ')', s:r, 'g')
+    let output2 = substitute(output, '(', s:l, 'g')
+    let output2 = substitute(output2, ')', s:r, 'g')
+    %d
+    exec 'normal i'.eval(input2)."\<Esc>"
+    let line = getline('.')
+    let passed = line == eval(output2)
+    call vimtap#Is(line, eval(output2), input2)
+    ", input2 . ' => ' . string(line) .
+    "      \ (passed ? ' =' : ' !') . '= ' . string(eval(output2)))
+    let tcount += 1
+  endfor
+endfor
+call vimtest#Quit()

+ 73 - 0
vim/plugged/delimitMate/test/autoclose_quotes.txt

@@ -0,0 +1,73 @@
+let g:delimitMate_autoclose = 1
+"'x" "'x'"
+"'x\<Esc>u" ""
+"''x" "''x"
+"'\<BS>x" "x"
+"'\<C-G>gx" "''x"
+# This will fail for double quote.
+"'\"x" "'\"x\"'"
+"@'x" "@'x'"
+"@#\<Left>'x" "@'x'#"
+"'\<S-Tab>x" "''x"
+"abc'" "abc'"
+"abc\\'x" "abc\\'x"
+"u'Привет'" "u'Привет'"
+"u'string'" "u'string'"
+let g:delimitMate_autoclose = 0
+"'x" "'x"
+"''x" "'x'"
+"'''x" "''x"
+"''\<BS>x" "x"
+"@''x" "@'x'"
+"@#\<Left>''x" "@'x'#"
+let g:delimitMate_expand_space = 1
+let g:delimitMate_autoclose = 1
+"'\<Space>x" "' x'"
+let g:delimitMate_expand_inside_quotes = 1
+"'\<Space>x" "' x '"
+"'\<Space>\<BS>x" "'x'"
+"abc\\''\<Space>x" "abc\\' x'"
+let g:delimitMate_autoclose = 0
+"''\<Space>\<BS>x" "'x'"
+let g:delimitMate_autoclose = 1
+# Handle backspace gracefully.
+set backspace=
+"'\<Esc>a\<BS>x" "'x'"
+set backspace=2
+set cpo=ces$
+"'x" "'x'"
+# Make sure smart quote works beyond first column.
+" 'x" " 'x'"
+# smart quote, check fo char on the right.
+"a\<space>b\<left>'" "a 'b"
+# Make sure we jump over a quote on the right. #89.
+"('test'x" "('test'x)"
+# Duplicate whole line when inserting quote at bol #105
+"}\<Home>'" "''}"
+"'\<Del>abc  '" "'abc  '"
+"''abc '" "''abc ''"
+# Nesting quotes:
+let g:delimitMate_nesting_quotes = split(g:delimitMate_quotes, '\s\+')
+"'''x" "'''x'''"
+"''''x" "''''x''''"
+"''x" "''x"
+"'x" "'x'"
+unlet g:delimitMate_nesting_quotes
+# expand iabbreviations
+iabb def ghi
+"def'" "ghi'"
+let g:delimitMate_smart_quotes = '\w\%#\_.'
+"xyz'x" "xyz'x"
+"xyz 'x" "xyz 'x'"
+let g:delimitMate_smart_quotes = '\s\%#\_.'
+"abc'x" "abc'x'"
+"abc 'x" "abc 'x"
+# let's try the negated form
+let g:delimitMate_smart_quotes = '!\w\%#\_.'
+"cba'x" "cba'x'"
+"cba 'x" "cba 'x"
+let g:delimitMate_smart_quotes = '!\s\%#\_.'
+"zyx'x" "zyx'x"
+"zyx 'x" "zyx 'x'"
+unlet g:delimitMate_smart_quotes
+"'\<CR>\<BS>" "''"

+ 47 - 0
vim/plugged/delimitMate/test/autoclose_quotes.vim

@@ -0,0 +1,47 @@
+"let g:delimitMate_quotes = '" '' ` ” « |'
+let g:delimitMate_quotes = '" '' ` « |'
+let lines = readfile(expand('<sfile>:t:r').'.txt')
+call vimtest#StartTap()
+let testsnumber = len(filter(copy(lines), 'v:val =~ ''^"'''))
+let itemsnumber = len(split(g:delimitMate_quotes, ' '))
+call vimtap#Plan(testsnumber * itemsnumber)
+let reload = 1
+let tcount = 1
+let linenr = 0
+for item in lines
+  let linenr += 1
+  if item =~ '^#\|^\s*$'
+    " A comment or empty line.
+    continue
+  endif
+  if item !~ '^"'
+    " A command.
+    exec item
+    call vimtap#Diag(item)
+    let reload = 1
+    continue
+  endif
+  if reload
+    DelimitMateReload
+    call vimtap#Diag('DelimitMateReload')
+    let reload = 0
+  endif
+  let quotes = split(g:delimitMate_quotes, '\s')
+  for quote in quotes
+    if vimtap#Skip(1, tcount != 26, "This test is invalid for double quote.")
+      let tcount += 1
+      continue
+    endif
+    let [input, output] = split(item, '"\%(\\.\|[^\\"]\)*"\zs\s*\ze"\%(\\.\|[^\\"]\)*"')
+    let input_q = substitute(input,"'" , escape(escape(quote, '"'), '\'), 'g')
+    let output_q = substitute(output,"'" , escape(escape(quote, '"'), '\'), 'g')
+    %d
+    exec 'normal i'.eval(input_q)."\<Esc>"
+    if quote == '”'
+      call vimtap#Todo(1)
+    endif
+    call vimtap#Is(getline('.'), eval(output_q), 'Line '.linenr.': '.eval(substitute(input_q, '\\<', '<','g')))
+    let tcount += 1
+  endfor
+endfor
+call vimtest#Quit()

+ 44 - 0
vim/plugged/delimitMate/test/eol_marker.vim

@@ -0,0 +1,44 @@
+let g:delimitMate_expand_cr = 1
+let g:delimitMate_eol_marker = ';'
+call vimtest#StartTap()
+call vimtap#Plan(8)
+" NOTE: Do not forget to update the plan ^
+let g:delimitMate_insert_eol_marker = 0
+DelimitMateReload
+normal i(
+call vimtap#Is(getline(1), '()', 'value = 1, case 1')
+%d _
+exec "normal i(\<CR>x"
+call vimtap#Like(join(getline(1,line('$')), "\<NL>"),
+      \ '^(\n\s*x\n)$', ' "normal i(\<CR>x", Value = 2, case 2')
+let g:delimitMate_insert_eol_marker = 1
+DelimitMateReload
+%d _
+normal i(
+call vimtap#Is(getline(1), '();', '"normal i(", value = 1, case 1')
+%d _
+exec "normal i(\<CR>x"
+call vimtap#Like(join(getline(1,line('$')), "\<NL>"),
+      \ '^(\n\s*x\n);$', '"normal i(\<CR>x", Value = 2, case 2')
+%d _
+let g:delimitMate_insert_eol_marker = 2
+DelimitMateReload
+normal i(
+call vimtap#Is(getline(1), '()', '"normal i(", Value = 2, case 1')
+%d _
+exec "normal i(\<CR>x"
+call vimtap#Like(join(getline(1,line('$')), "\<NL>"),
+      \ '^(\n\s*x\n);$', '"normal i(\<CR>x", Value = 2, case 2')
+
+%d _
+exec "normal i{(\<CR>x"
+call vimtap#Like(join(getline(1,line('$')), "\<NL>"),
+      \ '^{(\n\s*x\n)};$', ' "normal i{(\<CR>x", Value = 2, case 3')
+
+%d _
+exec "normal i;\<Esc>I{(\<CR>x"
+call vimtap#Like(join(getline(1,line('$')), "\<NL>"),
+      \ '^{(\n\s*x\n)};$', ' "normal i{(\<CR>x", Value = 2, case 4')
+
+" End: quit vim.
+call vimtest#Quit()

+ 96 - 0
vim/plugged/delimitMate/test/expand_cr.txt

@@ -0,0 +1,96 @@
+# 
+%d
+filetype indent on
+set bs=2 et sts=4 sw=4 ft=javascript
+call setline(1, '$(document).ready(function() {})')
+DelimitMateReload
+exec "normal 31|i\<CR>x\<Esc>"
+================================================================================
+$(document).ready(function() {
+    x
+})
+--------------------------------------------------------------------------------
+# Issue #95
+new
+let b:delimitMate_jump_expansion = 1
+DelimitMateReload
+exec "normal i(\<CR>test)x"
+================================================================================
+(
+test
+)x
+--------------------------------------------------------------------------------
+# Remove CR expansion on BS
+%d
+exec "normal i(\<CR>\<BS>x"
+================================================================================
+(x)
+--------------------------------------------------------------------------------
+# Consider indentation with BS inside an empty CR expansion.
+%d
+exec "normal i(  \<CR>\<BS>\<BS>x"
+================================================================================
+(x)
+--------------------------------------------------------------------------------
+# Conflict with indentation settings (cindent). Issue #95
+se cindent
+call setline(1, ['sub foo {','    while (1) {', '        ', '    }', '}'])
+call cursor(3, 8)
+normal a}x
+================================================================================
+sub foo {
+    while (1) {
+        
+    }x
+}
+--------------------------------------------------------------------------------
+%d
+call setline(1, '"{bracketed}')
+normal A"x
+================================================================================
+"{bracketed}"x
+--------------------------------------------------------------------------------
+# Syntax folding enabled by autocmd breaks expansion. But ti can't be tested
+# with :normal
+new
+autocmd InsertEnter * let w:fdm=&foldmethod | setl foldmethod=manual
+autocmd InsertLeave * let &foldmethod = w:fdm
+set foldmethod=marker
+set foldmarker={,}
+set foldlevel=0
+set backspace=2
+exec "normal iabc {\<CR>x"
+================================================================================
+abc {
+    x
+}
+--------------------------------------------------------------------------------
+# expand_cr != 2
+%d_
+call setline(1, 'abc(def)')
+exec "normal $i\<CR>x"
+================================================================================
+abc(def
+        x)
+--------------------------------------------------------------------------------
+# expand_cr == 2
+%d_
+let delimitMate_expand_cr = 2
+DelimitMateReload
+call setline(1, 'abc(def)')
+exec "normal $i\<CR>x"
+================================================================================
+abc(def
+        x
+        )
+--------------------------------------------------------------------------------
+# Play nice with smartindent
+%d_
+set all&
+set smartindent
+exec "normal $i{\<CR>x"
+================================================================================
+{
+	x
+}
+--------------------------------------------------------------------------------

+ 55 - 0
vim/plugged/delimitMate/test/expand_cr.vim

@@ -0,0 +1,55 @@
+let g:delimitMate_expand_cr = 1
+"DelimitMateReload
+let lines = readfile(expand('<sfile>:t:r').'.txt')
+call vimtest#StartTap()
+let testsnumber = len(filter(copy(lines), 'v:val =~ ''^=\{80}$'''))
+call vimtap#Plan(testsnumber)
+let tcount = 1
+let expect = 0
+let evaluate = 0
+let commands = []
+let header = ''
+for item in lines
+  if item =~ '^=\{80}$'
+    let expect = 1
+    let expected = []
+    continue
+  endif
+
+  if item =~ '^#' && expect == 0
+    " A comment.
+    let header = empty(header) ? item[1:] : 'Lines should match.'
+    continue
+  endif
+  if item =~ '^\s*$' && expect == 0
+    " An empty line.
+    continue
+  endif
+  if ! expect
+    " A command.
+    call add(commands, item)
+    exec item
+    "call vimtap#Diag(item)
+    continue
+  endif
+  if item =~ '^-\{80}$'
+    let expect = 0
+  endif
+  if expect
+    call add(expected, item)
+    continue
+  endif
+  let lines = getline(1, line('$'))
+  let passed = lines == expected
+  echom string(lines)
+  echom string(expected)
+  call vimtap#Is(lines, expected, header)
+  echom string(commands)
+  for cmd in commands
+    call vimtap#Diag(cmd)
+  endfor
+  let commands = []
+  let header = ''
+  let tcount += 1
+endfor
+call vimtest#Quit()

+ 8 - 0
vim/plugged/delimitMate/test/expand_space.txt

@@ -0,0 +1,8 @@
+# Issue #95
+new
+let b:delimitMate_jump_expansion = 1
+DelimitMateReload
+exec "normal i( test)x"
+================================================================================
+( test )x
+--------------------------------------------------------------------------------

+ 42 - 0
vim/plugged/delimitMate/test/expand_space.vim

@@ -0,0 +1,42 @@
+let g:delimitMate_expand_space = 1
+"DelimitMateReload
+let lines = readfile(expand('<sfile>:t:r').'.txt')
+call vimtest#StartTap()
+let testsnumber = len(filter(copy(lines), 'v:val =~ ''^=\{80}$'''))
+call vimtap#Plan(testsnumber)
+let tcount = 1
+let expect = 0
+let evaluate = 0
+for item in lines
+  if item =~ '^=\{80}$'
+    let expect = 1
+    let expected = []
+    continue
+  endif
+
+  if item =~ '^#\|^\s*$' && expect == 0
+    " A comment or empty line.
+    continue
+  endif
+  if ! expect
+    " A command.
+    exec item
+    call vimtap#Diag(item)
+    continue
+  endif
+  if item =~ '^-\{80}$'
+    let expect = 0
+  endif
+  if expect
+    call add(expected, item)
+    continue
+  endif
+  let lines = getline(1, line('$'))
+  let passed = lines == expected
+  echom string(lines)
+  echom string(expected)
+  call vimtap#Ok(passed, string(expected) .
+        \ (passed ? ' =' : ' !') . '= ' . string(lines))
+  let tcount += 1
+endfor
+call vimtest#Quit()

+ 8 - 0
vim/plugged/delimitMate/test/first_buffer_no_ft.vim

@@ -0,0 +1,8 @@
+let g:delimitMate_expand_cr = 1
+let g:delimitMate_eol_marker = ';'
+call vimtest#StartTap()
+call vimtap#Plan(1)
+call vimtap#Like(maparg('(', 'i'), '<Plug>delimitMate(', 'Mappings defined for the first buffer without filetype set.')
+call vimtest#Quit()
+
+

+ 21 - 0
vim/plugged/goyo.vim/LICENSE

@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2013-2021 Junegunn Choi
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.

+ 184 - 0
vim/plugged/goyo.vim/README.md

@@ -0,0 +1,184 @@
+goyo.vim ([고요](http://en.wiktionary.org/wiki/고요하다))
+=========================================================
+
+Distraction-free writing in Vim.
+
+![](https://raw.github.com/junegunn/i/master/goyo.png)
+
+(Color scheme: [seoul256](https://github.com/junegunn/seoul256.vim))
+
+Best served with [limelight.vim](https://github.com/junegunn/limelight.vim).
+
+Installation
+------------
+
+Use your favorite plugin manager.
+
+- [vim-plug](https://github.com/junegunn/vim-plug)
+  1. Add `Plug 'junegunn/goyo.vim'` to .vimrc
+  2. Run `:PlugInstall`
+
+Usage
+-----
+
+- `:Goyo`
+    - Toggle Goyo
+- `:Goyo [dimension]`
+    - Turn on or resize Goyo
+- `:Goyo!`
+    - Turn Goyo off
+
+The window can be resized with the usual `[count]<CTRL-W>` + `>`, `<`, `+`,
+`-` keys, and `<CTRL-W>` + `=` will resize it back to the initial size.
+
+### Dimension expression
+
+The expected format of a dimension expression is
+`[WIDTH][XOFFSET][x[HEIGHT][YOFFSET]]`. `XOFFSET` and `YOFFSET` should be
+prefixed by `+` or `-`. Each component can be given in percentage.
+
+```vim
+" Width
+Goyo 120
+
+" Height
+Goyo x30
+
+" Both
+Goyo 120x30
+
+" In percentage
+Goyo 120x50%
+
+" With offsets
+Goyo 50%+25%x50%-25%
+```
+
+Configuration
+-------------
+
+- `g:goyo_width` (default: 80)
+- `g:goyo_height` (default: 85%)
+- `g:goyo_linenr` (default: 0)
+
+### Callbacks
+
+By default, [vim-airline](https://github.com/bling/vim-airline),
+[vim-powerline](https://github.com/Lokaltog/vim-powerline),
+[powerline](https://github.com/Lokaltog/powerline),
+[lightline.vim](https://github.com/itchyny/lightline.vim),
+[vim-signify](https://github.com/mhinz/vim-signify),
+and [vim-gitgutter](https://github.com/airblade/vim-gitgutter) are temporarily
+disabled while in Goyo mode.
+
+If you have other plugins that you want to disable/enable, or if you want to
+change the default settings of Goyo window, you can set up custom routines
+to be triggered on `GoyoEnter` and `GoyoLeave` events.
+
+```vim
+function! s:goyo_enter()
+  if executable('tmux') && strlen($TMUX)
+    silent !tmux set status off
+    silent !tmux list-panes -F '\#F' | grep -q Z || tmux resize-pane -Z
+  endif
+  set noshowmode
+  set noshowcmd
+  set scrolloff=999
+  Limelight
+  " ...
+endfunction
+
+function! s:goyo_leave()
+  if executable('tmux') && strlen($TMUX)
+    silent !tmux set status on
+    silent !tmux list-panes -F '\#F' | grep -q Z && tmux resize-pane -Z
+  endif
+  set showmode
+  set showcmd
+  set scrolloff=5
+  Limelight!
+  " ...
+endfunction
+
+autocmd! User GoyoEnter nested call <SID>goyo_enter()
+autocmd! User GoyoLeave nested call <SID>goyo_leave()
+```
+
+More examples can be found here:
+[Customization](https://github.com/junegunn/goyo.vim/wiki/Customization)
+
+FAQ
+---
+
+> _"My custom colors are lost when I exit Goyo!"_
+
+That's because Goyo restores the base color scheme using `:colorscheme
+CURRENT_COLOR_SCHEME` command on exit, and it resets your tweaks. Goyo can try
+to remember all your customizations and restore them on exit, but it doesn't,
+because there is a better, more robust way to address the issue.
+
+The real problem here is that you will lose all your changes when you switch
+between color schemes, even when you're not using Goyo.
+
+```vim
+" In your Vim configuration file
+" - Base color scheme
+colorscheme molokai
+
+" - Your color customizations
+hi LineNr ctermfg=red guifg=red
+```
+
+It works, only when you stick to a single color scheme. When you switch
+between color schemes,
+
+```vim
+" Switch to another color scheme
+colorscheme Tomorrow-Night
+
+" Switch back to the original one
+colorscheme molokai
+```
+
+And all the customizations you have made are lost.
+
+What you should to do is to customize the colors on `autocmd ColorScheme`,
+which is automatically triggered whenever you change color schemes.
+
+```vim
+function! s:tweak_molokai_colors()
+  " Your molokai customizations
+  hi LineNr ...
+  hi FoldColumn ...
+endfunction
+
+autocmd! ColorScheme molokai call s:tweak_molokai_colors()
+
+colorscheme molokai
+```
+
+Inspiration
+-----------
+
+- [LiteDFM](https://github.com/bilalq/lite-dfm)
+- [VimRoom](http://projects.mikewest.org/vimroom/)
+
+Pros.
+-----
+
+1. Works well with splits. Doesn't mess up with the current window arrangement
+1. Works well with popular statusline plugins
+1. Prevents accessing the empty windows around the central buffer
+1. Can be closed with any of `:q[uit]`, `:clo[se]`, `:tabc[lose]`, or `:Goyo`
+1. Can dynamically change the width of the window
+1. Adjusts its colors when color scheme is changed
+1. Realigns the window when the terminal (or window) is resized or when the size
+   of the font is changed
+1. Correctly hides colorcolumns and Emojis in statusline
+1. Highly customizable with callbacks
+
+License
+-------
+
+MIT
+

+ 449 - 0
vim/plugged/goyo.vim/autoload/goyo.vim

@@ -0,0 +1,449 @@
+" Copyright (c) 2015 Junegunn Choi
+"
+" MIT License
+"
+" Permission is hereby granted, free of charge, to any person obtaining
+" a copy of this software and associated documentation files (the
+" "Software"), to deal in the Software without restriction, including
+" without limitation the rights to use, copy, modify, merge, publish,
+" distribute, sublicense, and/or sell copies of the Software, and to
+" permit persons to whom the Software is furnished to do so, subject to
+" the following conditions:
+"
+" The above copyright notice and this permission notice shall be
+" included in all copies or substantial portions of the Software.
+"
+" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+" EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+" NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+" LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+" OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+" WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+function! s:const(val, min, max)
+  return min([max([a:val, a:min]), a:max])
+endfunction
+
+function! s:get_color(group, attr)
+  return synIDattr(synIDtrans(hlID(a:group)), a:attr)
+endfunction
+
+function! s:set_color(group, attr, color)
+  let gui = has('gui_running') || has('termguicolors') && &termguicolors
+  execute printf('hi %s %s%s=%s', a:group, gui ? 'gui' : 'cterm', a:attr, a:color)
+endfunction
+
+nnoremap <silent> <Plug>(goyo-off) :call <sid>goyo_off()<cr>
+
+function! s:blank(repel)
+  if bufwinnr(t:goyo_pads.r) <= bufwinnr(t:goyo_pads.l) + 1
+    \ || bufwinnr(t:goyo_pads.b) <= bufwinnr(t:goyo_pads.t) + 3
+    call feedkeys("\<Plug>(goyo-off)")
+  endif
+  execute 'noautocmd wincmd' a:repel
+endfunction
+
+function! s:init_pad(command)
+  execute a:command
+
+  setlocal buftype=nofile bufhidden=wipe nomodifiable nobuflisted noswapfile
+      \ nonu nocursorline nocursorcolumn winfixwidth winfixheight statusline=\ 
+  if exists('&rnu')
+    setlocal nornu
+  endif
+  if exists('&colorcolumn')
+    setlocal colorcolumn=
+  endif
+  let bufnr = winbufnr(0)
+
+  execute winnr('#') . 'wincmd w'
+  return bufnr
+endfunction
+
+function! s:setup_pad(bufnr, vert, size, repel)
+  let win = bufwinnr(a:bufnr)
+  execute win . 'wincmd w'
+  execute (a:vert ? 'vertical ' : '') . 'resize ' . max([0, a:size])
+  augroup goyop
+    execute 'autocmd WinEnter,CursorMoved <buffer> nested call s:blank("'.a:repel.'")'
+    autocmd WinLeave <buffer> call s:hide_statusline()
+  augroup END
+
+  " To hide scrollbars of pad windows in GVim
+  let diff = winheight(0) - line('$') - (has('gui_running') ? 2 : 0)
+  if diff > 0
+    setlocal modifiable
+    call append(0, map(range(1, diff), '""'))
+    normal! gg
+    setlocal nomodifiable
+  endif
+  execute winnr('#') . 'wincmd w'
+endfunction
+
+function! s:resize_pads()
+  augroup goyop
+    autocmd!
+  augroup END
+
+  let t:goyo_dim.width = s:const(t:goyo_dim.width, 2, &columns)
+  let t:goyo_dim.height = s:const(t:goyo_dim.height, 2, &lines)
+
+  let vmargin = max([0, (&lines - t:goyo_dim.height) / 2 - 1])
+  let yoff = s:const(t:goyo_dim.yoff, - vmargin, vmargin)
+  let top = vmargin + yoff
+  let bot = vmargin - yoff - 1
+  call s:setup_pad(t:goyo_pads.t, 0, top, 'j')
+  call s:setup_pad(t:goyo_pads.b, 0, bot, 'k')
+
+  let nwidth  = max([len(string(line('$'))) + 1, &numberwidth])
+  let width   = t:goyo_dim.width + (&number ? nwidth : 0)
+  let hmargin = max([0, (&columns - width) / 2 - 1])
+  let xoff    = s:const(t:goyo_dim.xoff, - hmargin, hmargin)
+  call s:setup_pad(t:goyo_pads.l, 1, hmargin + xoff, 'l')
+  call s:setup_pad(t:goyo_pads.r, 1, hmargin - xoff, 'h')
+endfunction
+
+function! s:tranquilize()
+  let bg = s:get_color('Normal', 'bg#')
+  for grp in ['NonText', 'FoldColumn', 'ColorColumn', 'VertSplit',
+            \ 'StatusLine', 'StatusLineNC', 'SignColumn']
+    " -1 on Vim / '' on GVim
+    if bg == -1 || empty(bg)
+      call s:set_color(grp, 'fg', get(g:, 'goyo_bg', 'black'))
+      call s:set_color(grp, 'bg', 'NONE')
+    else
+      call s:set_color(grp, 'fg', bg)
+      call s:set_color(grp, 'bg', bg)
+    endif
+    call s:set_color(grp, '', 'NONE')
+  endfor
+endfunction
+
+function! s:hide_statusline()
+  setlocal statusline=\ 
+endfunction
+
+function! s:hide_linenr()
+  if !get(g:, 'goyo_linenr', 0)
+    setlocal nonu
+    if exists('&rnu')
+      setlocal nornu
+    endif
+  endif
+  if exists('&colorcolumn')
+    setlocal colorcolumn=
+  endif
+endfunction
+
+function! s:maps_nop()
+  let mapped = filter(['R', 'H', 'J', 'K', 'L', '|', '_'],
+                    \ "empty(maparg(\"\<c-w>\".v:val, 'n'))")
+  for c in mapped
+    execute 'nnoremap <c-w>'.escape(c, '|').' <nop>'
+  endfor
+  return mapped
+endfunction
+
+function! s:maps_resize()
+  let commands = {
+  \ '=': ':<c-u>let t:goyo_dim = <sid>parse_arg(t:goyo_dim_expr) <bar> call <sid>resize_pads()<cr>',
+  \ '>': ':<c-u>let t:goyo_dim.width = winwidth(0) + 2 * v:count1 <bar> call <sid>resize_pads()<cr>',
+  \ '<': ':<c-u>let t:goyo_dim.width = winwidth(0) - 2 * v:count1 <bar> call <sid>resize_pads()<cr>',
+  \ '+': ':<c-u>let t:goyo_dim.height += 2 * v:count1 <bar> call <sid>resize_pads()<cr>',
+  \ '-': ':<c-u>let t:goyo_dim.height -= 2 * v:count1 <bar> call <sid>resize_pads()<cr>'
+  \ }
+  let mapped = filter(keys(commands), "empty(maparg(\"\<c-w>\".v:val, 'n'))")
+  for c in mapped
+    execute 'nnoremap <silent> <c-w>'.c.' '.commands[c]
+  endfor
+  return mapped
+endfunction
+
+nnoremap <silent> <plug>(goyo-resize) :<c-u>call <sid>resize_pads()<cr>
+
+function! s:goyo_on(dim)
+  let dim = s:parse_arg(a:dim)
+  if empty(dim)
+    return
+  endif
+
+  let s:orig_tab = tabpagenr()
+  let settings =
+    \ { 'laststatus':    &laststatus,
+    \   'showtabline':   &showtabline,
+    \   'fillchars':     &fillchars,
+    \   'winminwidth':   &winminwidth,
+    \   'winwidth':      &winwidth,
+    \   'winminheight':  &winminheight,
+    \   'winheight':     &winheight,
+    \   'ruler':         &ruler,
+    \   'sidescroll':    &sidescroll,
+    \   'sidescrolloff': &sidescrolloff
+    \ }
+
+  " New tab
+  tab split
+
+  let t:goyo_master = winbufnr(0)
+  let t:goyo_dim = dim
+  let t:goyo_dim_expr = a:dim
+  let t:goyo_pads = {}
+  let t:goyo_revert = settings
+  let t:goyo_maps = extend(s:maps_nop(), s:maps_resize())
+  if has('gui_running')
+    let t:goyo_revert.guioptions = &guioptions
+  endif
+
+  " vim-gitgutter
+  let t:goyo_disabled_gitgutter = get(g:, 'gitgutter_enabled', 0)
+  if t:goyo_disabled_gitgutter
+    silent! GitGutterDisable
+  endif
+
+  " vim-signify
+  let t:goyo_disabled_signify = !empty(getbufvar(bufnr(''), 'sy'))
+  if t:goyo_disabled_signify
+    SignifyToggle
+  endif
+
+  " vim-airline
+  let t:goyo_disabled_airline = exists('#airline')
+  if t:goyo_disabled_airline
+    AirlineToggle
+  endif
+
+  " vim-powerline
+  let t:goyo_disabled_powerline = exists('#PowerlineMain')
+  if t:goyo_disabled_powerline
+    augroup PowerlineMain
+      autocmd!
+    augroup END
+    augroup! PowerlineMain
+  endif
+
+  " lightline.vim
+  let t:goyo_disabled_lightline = exists('#lightline')
+  if t:goyo_disabled_lightline
+    silent! call lightline#disable()
+  endif
+
+  call s:hide_linenr()
+  " Global options
+  let &winheight = max([&winminheight, 1])
+  set winminheight=1
+  set winheight=1
+  set winminwidth=1 winwidth=1
+  set laststatus=0
+  set showtabline=0
+  set noruler
+  set fillchars+=vert:\ 
+  set fillchars+=stl:\ 
+  set fillchars+=stlnc:\ 
+  set sidescroll=1
+  set sidescrolloff=0
+
+  " Hide left-hand scrollbars
+  if has('gui_running')
+    set guioptions-=l
+    set guioptions-=L
+  endif
+
+  let t:goyo_pads.l = s:init_pad('vertical topleft new')
+  let t:goyo_pads.r = s:init_pad('vertical botright new')
+  let t:goyo_pads.t = s:init_pad('topleft new')
+  let t:goyo_pads.b = s:init_pad('botright new')
+
+  call s:resize_pads()
+  call s:tranquilize()
+
+  augroup goyo
+    autocmd!
+    autocmd TabLeave    * nested call s:goyo_off()
+    autocmd VimResized  *        call s:resize_pads()
+    autocmd ColorScheme *        call s:tranquilize()
+    autocmd BufWinEnter *        call s:hide_linenr() | call s:hide_statusline()
+    autocmd WinEnter,WinLeave *  call s:hide_statusline()
+    if has('nvim')
+      autocmd TermClose * call feedkeys("\<plug>(goyo-resize)")
+    endif
+  augroup END
+
+  call s:hide_statusline()
+  if exists('g:goyo_callbacks[0]')
+    call g:goyo_callbacks[0]()
+  endif
+  if exists('#User#GoyoEnter')
+    doautocmd User GoyoEnter
+  endif
+endfunction
+
+function! s:goyo_off()
+  if !exists('#goyo')
+    return
+  endif
+
+  " Oops, not this tab
+  if !exists('t:goyo_revert')
+    return
+  endif
+
+  " Clear auto commands
+  augroup goyo
+    autocmd!
+  augroup END
+  augroup! goyo
+  augroup goyop
+    autocmd!
+  augroup END
+  augroup! goyop
+
+  for c in t:goyo_maps
+    execute 'nunmap <c-w>'.escape(c, '|')
+  endfor
+
+  let goyo_revert             = t:goyo_revert
+  let goyo_disabled_gitgutter = t:goyo_disabled_gitgutter
+  let goyo_disabled_signify   = t:goyo_disabled_signify
+  let goyo_disabled_airline   = t:goyo_disabled_airline
+  let goyo_disabled_powerline = t:goyo_disabled_powerline
+  let goyo_disabled_lightline = t:goyo_disabled_lightline
+  let goyo_orig_buffer        = t:goyo_master
+  let [line, col]             = [line('.'), col('.')]
+
+  if tabpagenr() == 1
+    tabnew
+    normal! gt
+    bd
+  endif
+  tabclose
+  execute 'normal! '.s:orig_tab.'gt'
+  if winbufnr(0) == goyo_orig_buffer
+    " Doesn't work if window closed with `q`
+    execute printf('normal! %dG%d|', line, col)
+  endif
+
+  let wmw = remove(goyo_revert, 'winminwidth')
+  let ww  = remove(goyo_revert, 'winwidth')
+  let &winwidth     = ww
+  let &winminwidth  = wmw
+  let wmh = remove(goyo_revert, 'winminheight')
+  let wh  = remove(goyo_revert, 'winheight')
+  let &winheight    = max([wmh, 1])
+  let &winminheight = wmh
+  let &winheight    = wh
+
+  for [k, v] in items(goyo_revert)
+    execute printf('let &%s = %s', k, string(v))
+  endfor
+  execute 'colo '. get(g:, 'colors_name', 'default')
+
+  if goyo_disabled_gitgutter
+    silent! GitGutterEnable
+  endif
+
+  if goyo_disabled_signify
+    silent! if !b:sy.active
+      SignifyToggle
+    endif
+  endif
+
+  if goyo_disabled_airline && !exists('#airline')
+    AirlineToggle
+    " For some reason, Airline requires two refreshes to avoid display
+    " artifacts
+    silent! AirlineRefresh
+    silent! AirlineRefresh
+  endif
+
+  if goyo_disabled_powerline && !exists('#PowerlineMain')
+    doautocmd PowerlineStartup VimEnter
+    silent! PowerlineReloadColorscheme
+  endif
+
+  if goyo_disabled_lightline
+    silent! call lightline#enable()
+  endif
+
+  if exists('#Powerline')
+    doautocmd Powerline ColorScheme
+  endif
+
+  if exists('g:goyo_callbacks[1]')
+    call g:goyo_callbacks[1]()
+  endif
+  if exists('#User#GoyoLeave')
+    doautocmd User GoyoLeave
+  endif
+endfunction
+
+function! s:relsz(expr, limit)
+  if a:expr !~ '%$'
+    return str2nr(a:expr)
+  endif
+  return a:limit * str2nr(a:expr[:-2]) / 100
+endfunction
+
+function! s:parse_arg(arg)
+  if exists('g:goyo_height') || !exists('g:goyo_margin_top') && !exists('g:goyo_margin_bottom')
+    let height = s:relsz(get(g:, 'goyo_height', '85%'), &lines)
+    let yoff = 0
+  else
+    let top = max([0, s:relsz(get(g:, 'goyo_margin_top', 4), &lines)])
+    let bot = max([0, s:relsz(get(g:, 'goyo_margin_bottom', 4), &lines)])
+    let height = &lines - top - bot
+    let yoff = top - bot
+  endif
+
+  let dim = { 'width':  s:relsz(get(g:, 'goyo_width', 80), &columns),
+            \ 'height': height,
+            \ 'xoff':   0,
+            \ 'yoff':   yoff }
+  if empty(a:arg)
+    return dim
+  endif
+  let parts = matchlist(a:arg, '^\s*\([0-9]\+%\?\)\?\([+-][0-9]\+%\?\)\?\%(x\([0-9]\+%\?\)\?\([+-][0-9]\+%\?\)\?\)\?\s*$')
+  if empty(parts)
+    echohl WarningMsg
+    echo 'Invalid dimension expression: '.a:arg
+    echohl None
+    return {}
+  endif
+  if !empty(parts[1]) | let dim.width  = s:relsz(parts[1], &columns) | endif
+  if !empty(parts[2]) | let dim.xoff   = s:relsz(parts[2], &columns) | endif
+  if !empty(parts[3]) | let dim.height = s:relsz(parts[3], &lines)   | endif
+  if !empty(parts[4]) | let dim.yoff   = s:relsz(parts[4], &lines)   | endif
+  return dim
+endfunction
+
+function! goyo#execute(bang, dim)
+  if a:bang
+    if exists('#goyo')
+      call s:goyo_off()
+    endif
+  else
+    if exists('#goyo') == 0
+      call s:goyo_on(a:dim)
+    elseif !empty(a:dim)
+      if winnr('$') < 5
+        call s:goyo_off()
+        return goyo#execute(a:bang, a:dim)
+      endif
+      let dim = s:parse_arg(a:dim)
+      if !empty(dim)
+        let t:goyo_dim = dim
+        let t:goyo_dim_expr = a:dim
+        call s:resize_pads()
+      endif
+    else
+      call s:goyo_off()
+    end
+  end
+endfunction
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+

+ 168 - 0
vim/plugged/goyo.vim/doc/goyo.txt

@@ -0,0 +1,168 @@
+*goyo.txt*	goyo	Last change: April 2 2017
+GOYO - TABLE OF CONTENTS                                         *goyo* *goyo-toc*
+==============================================================================
+
+  goyo.vim (고요)
+    Installation
+    Usage
+      Dimension expression
+    Configuration
+      Callbacks
+    Inspiration
+    Pros.
+    License
+
+GOYO.VIM (고요)                                                         *goyo-vim*
+==============================================================================
+
+Distraction-free writing in Vim.
+
+https://raw.github.com/junegunn/i/master/goyo.png
+
+(Color scheme: {seoul256}{1})
+
+Best served with {limelight.vim}{2}.
+
+                                 {1} https://github.com/junegunn/seoul256.vim
+                                 {2} https://github.com/junegunn/limelight.vim
+
+
+INSTALLATION                                                 *goyo-installation*
+==============================================================================
+
+Use your favorite plugin manager.
+
+ - {vim-plug}{3}
+   1. Add `Plug 'junegunn/goyo.vim'` to .vimrc
+   2. Run `:PlugInstall`
+
+                                      {3} https://github.com/junegunn/vim-plug
+
+
+USAGE                                                               *goyo-usage*
+==============================================================================
+
+                                                                         *:Goyo*
+
+ - `:Goyo`
+   - Toggle Goyo
+ - `:Goyo [dimension]`
+   - Turn on or resize Goyo
+ - `:Goyo!`
+   - Turn Goyo off
+
+The window can be resized with the usual [count]`CTRL-W` + `>`, `<`, `+`, `-` keys,
+and `CTRL-W` + `=` will resize it back to the initial size.
+
+
+< Dimension expression >______________________________________________________~
+                                                     *goyo-dimension-expression*
+
+The expected format of a dimension expression is
+`[WIDTH][XOFFSET][x[HEIGHT][YOFFSET]]`. `XOFFSET` and `YOFFSET` should be
+prefixed by `+` or `-`. Each component can be given in percentage.
+>
+    " Width
+    Goyo 120
+
+    " Height
+    Goyo x30
+
+    " Both
+    Goyo 120x30
+
+    " In percentage
+    Goyo 120x50%
+
+    " With offsets
+    Goyo 50%+25%x50%-25%
+<
+
+CONFIGURATION                                               *goyo-configuration*
+==============================================================================
+
+                                      *g:goyo_width* *g:goyo_height* *g:goyo_linenr*
+
+ - `g:goyo_width` (default: 80)
+ - `g:goyo_height` (default: 85%)
+ - `g:goyo_linenr` (default: 0)
+
+
+< Callbacks >_________________________________________________________________~
+                                                                *goyo-callbacks*
+
+By default, {vim-airline}{4}, {vim-powerline}{5}, {powerline}{6},
+{lightline.vim}{7}, {vim-signify}{8}, and {vim-gitgutter}{9} are temporarily
+disabled while in Goyo mode.
+
+If you have other plugins that you want to disable/enable, or if you want to
+change the default settings of Goyo window, you can set up custom routines to
+be triggered on `GoyoEnter` and `GoyoLeave` events.
+>
+    function! s:goyo_enter()
+      silent !tmux set status off
+      silent !tmux list-panes -F '\#F' | grep -q Z || tmux resize-pane -Z
+      set noshowmode
+      set noshowcmd
+      set scrolloff=999
+      Limelight
+      " ...
+    endfunction
+
+    function! s:goyo_leave()
+      silent !tmux set status on
+      silent !tmux list-panes -F '\#F' | grep -q Z && tmux resize-pane -Z
+      set showmode
+      set showcmd
+      set scrolloff=5
+      Limelight!
+      " ...
+    endfunction
+
+    autocmd! User GoyoEnter nested call <SID>goyo_enter()
+    autocmd! User GoyoLeave nested call <SID>goyo_leave()
+<
+More examples can be found here: {Customization}{10}
+
+                  {4} https://github.com/bling/vim-airline
+                  {5} https://github.com/Lokaltog/vim-powerline
+                  {6} https://github.com/Lokaltog/powerline
+                  {7} https://github.com/itchyny/lightline.vim
+                  {8} https://github.com/mhinz/vim-signify
+                  {9} https://github.com/airblade/vim-gitgutter
+                  {10} https://github.com/junegunn/goyo.vim/wiki/Customization
+
+
+INSPIRATION                                                   *goyo-inspiration*
+==============================================================================
+
+ - {LiteDFM}{11}
+ - {VimRoom}{12}
+
+                                    {11} https://github.com/bilalq/lite-dfm
+                                    {12} http://projects.mikewest.org/vimroom/
+
+
+PROS.                                                                *goyo-pros*
+==============================================================================
+
+ 1. Works well with splits. Doesn't mess up with the current window arrangement
+ 2. Works well with popular statusline plugins
+ 3. Prevents accessing the empty windows around the central buffer
+ 4. Can be closed with any of `:q[uit]`, `:clo[se]`, `:tabc[lose]`, or `:Goyo`
+ 5. Can dynamically change the width of the window
+ 6. Adjusts its colors when color scheme is changed
+ 7. Realigns the window when the terminal (or window) is resized or when the size
+    of the font is changed
+ 8. Correctly hides colorcolumns and Emojis in statusline
+ 9. Highly customizable with callbacks
+
+
+LICENSE                                                           *goyo-license*
+==============================================================================
+
+MIT
+
+
+==============================================================================
+vim:tw=78:sw=2:ts=2:ft=help:norl:nowrap:

+ 16 - 0
vim/plugged/goyo.vim/doc/tags

@@ -0,0 +1,16 @@
+:Goyo	goyo.txt	/*:Goyo*
+g:goyo_height	goyo.txt	/*g:goyo_height*
+g:goyo_linenr	goyo.txt	/*g:goyo_linenr*
+g:goyo_width	goyo.txt	/*g:goyo_width*
+goyo	goyo.txt	/*goyo*
+goyo-callbacks	goyo.txt	/*goyo-callbacks*
+goyo-configuration	goyo.txt	/*goyo-configuration*
+goyo-dimension-expression	goyo.txt	/*goyo-dimension-expression*
+goyo-inspiration	goyo.txt	/*goyo-inspiration*
+goyo-installation	goyo.txt	/*goyo-installation*
+goyo-license	goyo.txt	/*goyo-license*
+goyo-pros	goyo.txt	/*goyo-pros*
+goyo-toc	goyo.txt	/*goyo-toc*
+goyo-usage	goyo.txt	/*goyo-usage*
+goyo-vim	goyo.txt	/*goyo-vim*
+goyo.txt	goyo.txt	/*goyo.txt*

+ 24 - 0
vim/plugged/goyo.vim/plugin/goyo.vim

@@ -0,0 +1,24 @@
+" Copyright (c) 2015 Junegunn Choi
+"
+" MIT License
+"
+" Permission is hereby granted, free of charge, to any person obtaining
+" a copy of this software and associated documentation files (the
+" "Software"), to deal in the Software without restriction, including
+" without limitation the rights to use, copy, modify, merge, publish,
+" distribute, sublicense, and/or sell copies of the Software, and to
+" permit persons to whom the Software is furnished to do so, subject to
+" the following conditions:
+"
+" The above copyright notice and this permission notice shall be
+" included in all copies or substantial portions of the Software.
+"
+" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+" EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+" NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+" LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+" OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+" WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+command! -nargs=? -bar -bang Goyo call goyo#execute(<bang>0, <q-args>)

+ 21 - 0
vim/plugged/limelight.vim/LICENSE

@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2013-2021 Junegunn Choi
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.

+ 91 - 0
vim/plugged/limelight.vim/README.md

@@ -0,0 +1,91 @@
+limelight.vim ![GitHub Actions](https://img.shields.io/github/actions/workflow/status/junegunn/limelight.vim/test.yml?branch=master)
+=============
+
+
+Hyperfocus-writing in Vim.
+
+![](https://raw.github.com/junegunn/i/master/limelight.gif)
+
+Best served with [Goyo.vim](https://github.com/junegunn/goyo.vim).
+Works on 256-color terminal or on GVim.
+
+Installation
+------------
+
+Use your favorite plugin manager.
+
+- [vim-plug](https://github.com/junegunn/vim-plug)
+    1. Add `Plug 'junegunn/limelight.vim'` to your Vim configuration file
+    2. Run `:source %`
+    3. Run `:PlugInstall`
+
+Usage
+-----
+
+- `Limelight [0.0 ~ 1.0]`
+    - Turn Limelight on
+- `Limelight!`
+    - Turn Limelight off
+- `Limelight!! [0.0 ~ 1.0]`
+    - Toggle Limelight
+
+### Limelight for a selected range
+
+You can invoke `:Limelight` for a visual range. There are also `<Plug>`
+mappings for normal and visual mode for the purpose.
+
+```vim
+nmap <Leader>l <Plug>(Limelight)
+xmap <Leader>l <Plug>(Limelight)
+```
+
+### Options
+
+For some color schemes, Limelight may not be able to calculate the color for
+dimming down the surrounding paragraphs. In that case, you need to define
+`g:limelight_conceal_ctermfg` or `g:limelight_conceal_guifg`.
+
+```vim
+" Color name (:help cterm-colors) or ANSI code
+let g:limelight_conceal_ctermfg = 'gray'
+let g:limelight_conceal_ctermfg = 240
+
+" Color name (:help gui-colors) or RGB color
+let g:limelight_conceal_guifg = 'DarkGray'
+let g:limelight_conceal_guifg = '#777777'
+
+" Default: 0.5
+let g:limelight_default_coefficient = 0.7
+
+" Number of preceding/following paragraphs to include (default: 0)
+let g:limelight_paragraph_span = 1
+
+" Beginning/end of paragraph
+"   When there's no empty line between the paragraphs
+"   and each paragraph starts with indentation
+let g:limelight_bop = '^\s'
+let g:limelight_eop = '\ze\n^\s'
+
+" Highlighting priority (default: 10)
+"   Set it to -1 not to overrule hlsearch
+let g:limelight_priority = -1
+```
+
+Goyo.vim integration
+--------------------
+
+```vim
+autocmd! User GoyoEnter Limelight
+autocmd! User GoyoLeave Limelight!
+```
+
+Acknowledgement
+---------------
+
+Thanks to [@Cutuchiqueno](https://github.com/Cutuchiqueno) for [suggesting
+the idea](https://github.com/junegunn/goyo.vim/issues/34).
+
+License
+-------
+
+MIT

+ 282 - 0
vim/plugged/limelight.vim/autoload/limelight.vim

@@ -0,0 +1,282 @@
+" Copyright (c) 2015 Junegunn Choi
+"
+" MIT License
+"
+" Permission is hereby granted, free of charge, to any person obtaining
+" a copy of this software and associated documentation files (the
+" "Software"), to deal in the Software without restriction, including
+" without limitation the rights to use, copy, modify, merge, publish,
+" distribute, sublicense, and/or sell copies of the Software, and to
+" permit persons to whom the Software is furnished to do so, subject to
+" the following conditions:
+"
+" The above copyright notice and this permission notice shall be
+" included in all copies or substantial portions of the Software.
+"
+" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+" EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+" NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+" LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+" OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+" WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+if exists('g:loaded_limelight')
+  finish
+endif
+let g:loaded_limelight = 1
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+let s:default_coeff = str2float('0.5')
+let s:invalid_coefficient = 'Invalid coefficient. Expected: 0.0 ~ 1.0'
+
+function! s:unsupported()
+  let var = 'g:limelight_conceal_'.(has('gui_running') ? 'gui' : 'cterm').'fg'
+
+  if exists(var)
+    return 'Cannot calculate background color.'
+  else
+    return 'Unsupported color scheme. '.var.' required.'
+  endif
+endfunction
+
+function! s:getpos()
+  let bop = get(g:, 'limelight_bop', '^\s*$\n\zs')
+  let eop = get(g:, 'limelight_eop', '^\s*$')
+  let span = max([0, get(g:, 'limelight_paragraph_span', 0) - s:empty(getline('.'))])
+  let pos = exists('*getcurpos')? getcurpos() : getpos('.')
+  for i in range(0, span)
+    let start = searchpos(bop, i == 0 ? 'cbW' : 'bW')[0]
+  endfor
+  call setpos('.', pos)
+  for _ in range(0, span)
+    let end = searchpos(eop, 'W')[0]
+  endfor
+  call setpos('.', pos)
+  return [start, end]
+endfunction
+
+function! s:empty(line)
+  return (a:line =~# '^\s*$')
+endfunction
+
+function! s:limelight()
+  if !empty(get(w:, 'limelight_range', []))
+    return
+  endif
+  if !exists('w:limelight_prev')
+    let w:limelight_prev = [0, 0, 0, 0]
+  endif
+
+  let curr = [line('.'), line('$')]
+  if curr ==# w:limelight_prev[0 : 1]
+    return
+  endif
+
+  let paragraph = s:getpos()
+  if paragraph ==# w:limelight_prev[2 : 3]
+    return
+  endif
+
+  call s:clear_hl()
+  call call('s:hl', paragraph)
+  let w:limelight_prev = extend(curr, paragraph)
+endfunction
+
+function! s:hl(startline, endline)
+  let w:limelight_match_ids = get(w:, 'limelight_match_ids', [])
+  let priority = get(g:, 'limelight_priority', 10)
+  call add(w:limelight_match_ids, matchadd('LimelightDim', '\%<'.a:startline.'l', priority))
+  if a:endline > 0
+    call add(w:limelight_match_ids, matchadd('LimelightDim', '\%>'.a:endline.'l', priority))
+  endif
+endfunction
+
+function! s:clear_hl()
+  while exists('w:limelight_match_ids') && !empty(w:limelight_match_ids)
+    silent! call matchdelete(remove(w:limelight_match_ids, -1))
+  endwhile
+endfunction
+
+function! s:hex2rgb(str)
+  let str = substitute(a:str, '^#', '', '')
+  return [eval('0x'.str[0:1]), eval('0x'.str[2:3]), eval('0x'.str[4:5])]
+endfunction
+
+let s:gray_converter = {
+\ 0:   231,
+\ 7:   254,
+\ 15:  256,
+\ 16:  231,
+\ 231: 256
+\ }
+
+function! s:gray_contiguous(col)
+  let val = get(s:gray_converter, a:col, a:col)
+  if val < 231 || val > 256
+    throw s:unsupported()
+  endif
+  return val
+endfunction
+
+function! s:gray_ansi(col)
+  return a:col == 231 ? 0 : (a:col == 256 ? 231 : a:col)
+endfunction
+
+function! s:coeff(coeff)
+  let coeff = a:coeff < 0 ?
+        \ get(g:, 'limelight_default_coefficient', s:default_coeff) : a:coeff
+  if coeff < 0 || coeff > 1
+    throw 'Invalid g:limelight_default_coefficient. Expected: 0.0 ~ 1.0'
+  endif
+  return coeff
+endfunction
+
+function! s:dim(coeff)
+  let synid = synIDtrans(hlID('Normal'))
+  let fg = synIDattr(synid, 'fg#')
+  let bg = synIDattr(synid, 'bg#')
+
+  if has('gui_running') || has('termguicolors') && &termguicolors || has('nvim') && $NVIM_TUI_ENABLE_TRUE_COLOR
+    if a:coeff < 0 && exists('g:limelight_conceal_guifg')
+      let dim = g:limelight_conceal_guifg
+    elseif empty(fg) || empty(bg)
+      throw s:unsupported()
+    else
+      let coeff = s:coeff(a:coeff)
+      let fg_rgb = s:hex2rgb(fg)
+      let bg_rgb = s:hex2rgb(bg)
+      let dim_rgb = [
+            \ bg_rgb[0] * coeff + fg_rgb[0] * (1 - coeff),
+            \ bg_rgb[1] * coeff + fg_rgb[1] * (1 - coeff),
+            \ bg_rgb[2] * coeff + fg_rgb[2] * (1 - coeff)]
+      let dim = '#'.join(map(dim_rgb, 'printf("%x", float2nr(v:val))'), '')
+    endif
+    execute printf('hi LimelightDim guifg=%s guisp=bg', dim)
+  elseif &t_Co == 256
+    if a:coeff < 0 && exists('g:limelight_conceal_ctermfg')
+      let dim = g:limelight_conceal_ctermfg
+    elseif fg <= -1 || bg <= -1
+      throw s:unsupported()
+    else
+      let coeff = s:coeff(a:coeff)
+      let fg = s:gray_contiguous(fg)
+      let bg = s:gray_contiguous(bg)
+      let dim = s:gray_ansi(float2nr(bg * coeff + fg * (1 - coeff)))
+    endif
+    if type(dim) == 1
+      execute printf('hi LimelightDim ctermfg=%s', dim)
+    else
+      execute printf('hi LimelightDim ctermfg=%d', dim)
+    endif
+  else
+    throw 'Unsupported terminal. Sorry.'
+  endif
+endfunction
+
+function! s:error(msg)
+  echohl ErrorMsg
+  echo a:msg
+  echohl None
+endfunction
+
+function! s:parse_coeff(coeff)
+  let t = type(a:coeff)
+  if t == 1
+    if a:coeff =~ '^ *[0-9.]\+ *$'
+      let c = str2float(a:coeff)
+    else
+      throw s:invalid_coefficient
+    endif
+  elseif index([0, 5], t) >= 0
+    let c = t
+  else
+    throw s:invalid_coefficient
+  endif
+  return c
+endfunction
+
+function! s:on(range, ...)
+  try
+    let s:limelight_coeff = a:0 > 0 ? s:parse_coeff(a:1) : -1
+    call s:dim(s:limelight_coeff)
+  catch
+    return s:error(v:exception)
+  endtry
+
+  let w:limelight_range = a:range
+  if !empty(a:range)
+    call s:clear_hl()
+    call call('s:hl', a:range)
+  endif
+
+  augroup limelight
+    let was_on = exists('#limelight#CursorMoved')
+    autocmd!
+    if empty(a:range) || was_on
+      autocmd CursorMoved,CursorMovedI * call s:limelight()
+    endif
+    autocmd ColorScheme * try
+                       \|   call s:dim(s:limelight_coeff)
+                       \| catch
+                       \|   call s:off()
+                       \|   throw v:exception
+                       \| endtry
+  augroup END
+
+  " FIXME: We cannot safely remove this group once Limelight started
+  augroup limelight_cleanup
+    autocmd!
+    autocmd WinEnter * call s:cleanup()
+  augroup END
+
+  doautocmd CursorMoved
+endfunction
+
+function! s:off()
+  call s:clear_hl()
+  augroup limelight
+    autocmd!
+  augroup END
+  augroup! limelight
+  unlet! w:limelight_prev w:limelight_match_ids w:limelight_range
+endfunction
+
+function! s:is_on()
+  return exists('#limelight')
+endfunction
+
+function! s:cleanup()
+  if !s:is_on()
+    call s:clear_hl()
+  end
+endfunction
+
+function! limelight#execute(bang, visual, line1, line2, ...)
+  let range = a:visual ? [a:line1, a:line2] : []
+  if a:bang
+    if a:0 > 0 && a:1 =~ '^!' && !s:is_on()
+      if len(a:1) > 1
+        call s:on(range, a:1[1:-1])
+      else
+        call s:on(range)
+      endif
+    else
+      call s:off()
+    endif
+  elseif a:0 > 0
+    call s:on(range, a:1)
+  else
+    call s:on(range)
+  endif
+endfunction
+
+function! limelight#operator(...)
+  call limelight#execute(0, 1, line("'["), line("']"))
+endfunction
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+

+ 123 - 0
vim/plugged/limelight.vim/doc/limelight.txt

@@ -0,0 +1,123 @@
+limelight-vim.txt	limelight-vim	Last change: September 12 2024
+LIMELIGHT-VIM - TABLE OF CONTENTS              *limelight-vim* *limelight-vim-toc*
+==============================================================================
+
+  limelight.vim                       |limelight-vim|
+    Installation                      |limelight-vim-installation|
+    Usage                             |limelight-vim-usage|
+      Limelight for a selected range  |limelight-vim-limelight-for-a-selected-range|
+      Options                         |limelight-vim-options|
+    Goyo.vim integration              |limelight-vim-goyo-vim-integration|
+    Acknowledgement                   |limelight-vim-acknowledgement|
+    License                           |limelight-vim-license|
+
+LIMELIGHT.VIM
+==============================================================================
+
+Hyperfocus-writing in Vim.
+
+Best served with {Goyo.vim}{1}. Works on 256-color terminal or on GVim.
+
+                                      {1} https://github.com/junegunn/goyo.vim
+
+
+INSTALLATION                                        *limelight-vim-installation*
+==============================================================================
+
+Use your favorite plugin manager.
+
+                                                                  *:PlugInstall*
+
+ - {vim-plug}{2}
+   1. Add `Plug 'junegunn/limelight.vim'` to your Vim configuration file
+   2. Run `:source %`
+   3. Run `:PlugInstall`
+
+                                      {2} https://github.com/junegunn/vim-plug
+
+
+USAGE                                                      *limelight-vim-usage*
+==============================================================================
+
+ - `Limelight [0.0 ~ 1.0]`
+   - Turn Limelight on
+ - `Limelight!`
+   - Turn Limelight off
+ - `Limelight!! [0.0 ~ 1.0]`
+   - Toggle Limelight
+
+
+< Limelight for a selected range >____________________________________________~
+                                  *limelight-vim-limelight-for-a-selected-range*
+
+                                                                    *:Limelight*
+
+You can invoke `:Limelight` for a visual range. There are also <Plug> mappings
+for normal and visual mode for the purpose.
+
+                                                             *<Plug>(Limelight)*
+>
+    nmap <Leader>l <Plug>(Limelight)
+    xmap <Leader>l <Plug>(Limelight)
+<
+
+< Options >___________________________________________________________________~
+                                                         *limelight-vim-options*
+
+                         *g:limelight_conceal_ctermfg* *g:limelight_conceal_guifg*
+
+For some color schemes, Limelight may not be able to calculate the color for
+dimming down the surrounding paragraphs. In that case, you need to define
+`g:limelight_conceal_ctermfg` or `g:limelight_conceal_guifg`.
+
+                          *g:limelight_priority* *g:limelight_eop* *g:limelight_bop*
+                    *g:limelight_paragraph_span* *g:limelight_default_coefficient*
+>
+    " Color name (:help cterm-colors) or ANSI code
+    let g:limelight_conceal_ctermfg = 'gray'
+    let g:limelight_conceal_ctermfg = 240
+
+    " Color name (:help gui-colors) or RGB color
+    let g:limelight_conceal_guifg = 'DarkGray'
+    let g:limelight_conceal_guifg = '#777777'
+
+    " Default: 0.5
+    let g:limelight_default_coefficient = 0.7
+
+    " Number of preceding/following paragraphs to include (default: 0)
+    let g:limelight_paragraph_span = 1
+
+    " Beginning/end of paragraph
+    "   When there's no empty line between the paragraphs
+    "   and each paragraph starts with indentation
+    let g:limelight_bop = '^\s'
+    let g:limelight_eop = '\ze\n^\s'
+
+    " Highlighting priority (default: 10)
+    "   Set it to -1 not to overrule hlsearch
+    let g:limelight_priority = -1
+<
+
+GOYO.VIM INTEGRATION                        *limelight-vim-goyo-vim-integration*
+==============================================================================
+>
+    autocmd! User GoyoEnter Limelight
+    autocmd! User GoyoLeave Limelight!
+<
+
+ACKNOWLEDGEMENT                                  *limelight-vim-acknowledgement*
+==============================================================================
+
+Thanks to {@Cutuchiqueno}{3} for {suggesting the idea}{4}.
+
+                            {3} https://github.com/Cutuchiqueno
+                            {4} https://github.com/junegunn/goyo.vim/issues/34
+
+
+LICENSE                                                  *limelight-vim-license*
+==============================================================================
+
+MIT
+
+==============================================================================
+vim:tw=78:sw=2:ts=2:ft=help:norl:nowrap:

+ 19 - 0
vim/plugged/limelight.vim/doc/tags

@@ -0,0 +1,19 @@
+:Limelight	limelight.txt	/*:Limelight*
+:PlugInstall	limelight.txt	/*:PlugInstall*
+<Plug>(Limelight)	limelight.txt	/*<Plug>(Limelight)*
+g:limelight_bop	limelight.txt	/*g:limelight_bop*
+g:limelight_conceal_ctermfg	limelight.txt	/*g:limelight_conceal_ctermfg*
+g:limelight_conceal_guifg	limelight.txt	/*g:limelight_conceal_guifg*
+g:limelight_default_coefficient	limelight.txt	/*g:limelight_default_coefficient*
+g:limelight_eop	limelight.txt	/*g:limelight_eop*
+g:limelight_paragraph_span	limelight.txt	/*g:limelight_paragraph_span*
+g:limelight_priority	limelight.txt	/*g:limelight_priority*
+limelight-vim	limelight.txt	/*limelight-vim*
+limelight-vim-acknowledgement	limelight.txt	/*limelight-vim-acknowledgement*
+limelight-vim-goyo-vim-integration	limelight.txt	/*limelight-vim-goyo-vim-integration*
+limelight-vim-installation	limelight.txt	/*limelight-vim-installation*
+limelight-vim-license	limelight.txt	/*limelight-vim-license*
+limelight-vim-limelight-for-a-selected-range	limelight.txt	/*limelight-vim-limelight-for-a-selected-range*
+limelight-vim-options	limelight.txt	/*limelight-vim-options*
+limelight-vim-toc	limelight.txt	/*limelight-vim-toc*
+limelight-vim-usage	limelight.txt	/*limelight-vim-usage*

+ 27 - 0
vim/plugged/limelight.vim/plugin/limelight.vim

@@ -0,0 +1,27 @@
+" Copyright (c) 2015 Junegunn Choi
+"
+" MIT License
+"
+" Permission is hereby granted, free of charge, to any person obtaining
+" a copy of this software and associated documentation files (the
+" "Software"), to deal in the Software without restriction, including
+" without limitation the rights to use, copy, modify, merge, publish,
+" distribute, sublicense, and/or sell copies of the Software, and to
+" permit persons to whom the Software is furnished to do so, subject to
+" the following conditions:
+"
+" The above copyright notice and this permission notice shall be
+" included in all copies or substantial portions of the Software.
+"
+" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+" EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+" NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+" LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+" OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+" WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+command! -nargs=? -bar -bang -range Limelight call limelight#execute(<bang>0, <count> > 0, <line1>, <line2>, <f-args>)
+
+nnoremap <silent> <Plug>(Limelight) :set opfunc=limelight#operator<CR>g@
+xnoremap <silent> <Plug>(Limelight) :Limelight<CR>

+ 139 - 0
vim/plugged/limelight.vim/test/limelight.vader

@@ -0,0 +1,139 @@
+Execute (Setup):
+  Save g:colors_name, &background
+  colo seoul256
+
+  function! s:assert_on()
+    Assert exists('#limelight'), 'limelight should be on'
+  endfunction
+  function! s:assert_off()
+    Assert !exists('#limelight'), 'limelight should be off'
+  endfunction
+  command! AssertOn  call s:assert_on()
+  command! AssertOff call s:assert_off()
+
+Before:
+  unlet! g:limelight_default_coefficient
+       \ g:limelight_conceal_guifg g:limelight_conceal_ctermfg
+
+Execute (Invalid argument type):
+  Limelight 'hello'
+  AssertOff
+
+  Limelight {}
+  AssertOff
+
+  Limelight []
+  AssertOff
+
+Execute (Invalid argument range):
+  Limelight 1.2
+  AssertOff
+
+  Limelight 2
+  AssertOff
+
+  Limelight -0.2
+  AssertOff
+
+  Limelight -1
+  AssertOff
+
+Execute (Limelight / Limelight!):
+  Limelight
+  AssertOn
+
+  Limelight
+  AssertOn
+
+  Limelight!
+  AssertOff
+
+  Limelight!
+  AssertOff
+
+  Limelight 0.5
+  AssertOn
+
+  Limelight!
+  AssertOff
+
+Execute (Limelight!!):
+  Limelight!!
+  AssertOn
+
+  Limelight!!
+  AssertOff
+
+  Limelight!! 2.0
+  AssertOff
+
+  Limelight!! 0.9
+  AssertOn
+
+  Limelight!! 0.9
+  AssertOff
+
+Execute (g:limelight_default_coefficient):
+  let g:limelight_default_coefficient = 2.0
+  Limelight
+  AssertOff
+
+  let g:limelight_default_coefficient = -1.0
+  Limelight
+  AssertOff
+
+Execute (Unsupported terminal):
+  colo default
+  let &t_Co = 16
+
+  Limelight
+  AssertOff
+
+Execute (Unsupported. but g:limelight_conceal_???fg defined):
+  if has('gui_running')
+    colo default
+    let g:limelight_conceal_guifg = '#cccccc'
+    Limelight
+    AssertOn
+    Limelight!
+    AssertOff
+  else
+    if exists('&termguicolors')
+      set notermguicolors
+    endif
+    colo default
+    let &t_Co = 256
+
+    " Cannot enable it without g:limelight_conceal_ctermfg
+    Limelight
+    AssertOff
+
+    let g:limelight_conceal_ctermfg = 240
+    Limelight
+    AssertOn
+    Limelight!
+    AssertOff
+
+    let g:limelight_conceal_ctermfg = 'red'
+    Limelight
+    AssertOn
+    Limelight!
+    AssertOff
+  endif
+
+  " However, you're still not allowed to pass argument to Limelight command
+  redir => msg
+  Limelight 0.5
+  redir END
+  AssertOff
+  Assert msg !~ 'g:limelight_conceal_', 'Invalid message: '.msg
+
+Execute (TODO: Color interpolation):
+  Assert 0, 'TODO'
+
+Execute (Cleanup):
+  delc AssertOn
+  delc AssertOff
+  unlet! msg
+  Restore
+  silent! execute 'colo '.g:colors_name

+ 674 - 0
vim/plugged/neonwave.vim/LICENSE

@@ -0,0 +1,674 @@
+                    GNU GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Use with the GNU Affero General Public License.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+    <program>  Copyright (C) <year>  <name of author>
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+  The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.

+ 8 - 0
vim/plugged/neonwave.vim/NOTE

@@ -0,0 +1,8 @@
+Using the default 'light' works fine for this theme. Using 'dark' seems to f*ck up everything.
+I know it's supposed to (I think), but I don't know exactly why.
+
+That said, if -- for whatever reason -- you, the glorious user, decide to use background=dark,
+then just stick it at the end of the highlight file. Who knows; maybe it will lead to inspiration for something else :3
+
+
+Perhaps world domination...

+ 20 - 0
vim/plugged/neonwave.vim/README.md

@@ -0,0 +1,20 @@
+-----
+#### Currently in minor hiatus
+
+For future users or commiters of and to this theme, I am not actively working on this project. I still review pull requests from others when they are made, but I may not find the time right away. The current - and possibly outdated - list of things that I know need to be done are in the [TODO](https://github.com/Sclarki/neonwave.vim/blob/master/TODO) list.
+
+-----
+
+# ne͟͠o̷͘̕ņ̸̕͟͡w̴a̷v̙͖̗͓̕e͏̗̞.̷͏͙͔̥͉̖̗̳͇͙̠̠͓̝̲ͅ活力
+Have you ever been engaged in 飲料の消費 and thought to yourself, "The 燃費 here is far too irregular"? Well, look no further to reinforce your failing power converter! Sclarkis Ltd. sports a *very* ~~retro~~ modern-styled defusing system that lets you get every quantum bit out of your energy purchase! *~~As a side-effect of this technological breakthrough in engine conversion, your computer consoles may experience 断̴続͏̢̡͞的̴̢́な̴̷̧̕͞妨҉̸̀害̴̵~~*
+
+
+Our recommendation is to use [justinmk's vim-syntax-extra](https://github.com/justinmk/vim-syntax-extra)! The wonderful 強化 made by this C-style parser and directed energy monitor will certainly help you diagnose even the most elusive of hardware bugs during those long hours between commerce drags!
+
+
+## ギャラリー
+![screen](https://cloud.githubusercontent.com/assets/8389374/6989674/3b515d5e-da24-11e4-8b71-681ab6fadbdd.png)
+![screenshot_fri-apr-3_17-20-29-cdt-2015](https://cloud.githubusercontent.com/assets/8389374/6989776/ce026796-da25-11e4-9d0f-0c535f1e7c40.png)
+
+## Installation
+You may install this with [Vundle](https://github.com/gmarik/Vundle.vim) as you would any other plugin. If you don't use Vundle, you may instead just stick the ```neonwave.vim``` file in your colors directory and set your highlight to it in your vimrc with ```colorscheme neonwave```.

+ 22 - 0
vim/plugged/neonwave.vim/TODO

@@ -0,0 +1,22 @@
+Everything that needs doing at some point is listed here.
+
+* Determine accuracy of Japanese text translations in the README
+* Organise the file of colour specs to be less (or more) crazy
+* Adjust the GUI colours so they look appropriate for full colour support and not a bad mock-up
+
+
+Add colours for:
+
+* DiffAdd
+* DiffChange
+* DiffDelete
+* DiffText
+* Ignore
+* SpellCap     # YCM says this is also for YcmWarningSection,
+               # but I do not extensively use YCM to notice where this lies.
+* SpellRare
+* SpellLocal
+* WildMenu
+* VisualNOS
+* 
+* MatchParen   # This one exists, however I'm not *quite* sure how I want it.

+ 133 - 0
vim/plugged/neonwave.vim/colors/neonwave.vim

@@ -0,0 +1,133 @@
+" Vim color file
+
+
+" Name:               NeonWave
+" Author:             Sclarki
+
+" Just as a side note, themes like these are generally what happens
+" when you go off on Vaporwave binges >.>
+
+
+" Huge, HUGE thank you to ByteFluent for the creation of Vivify!!
+" Without this site it would have been far more troublesome to
+" get a working theme going, as well as the inertia to get going.
+" That is to say, without having seen the names associated with the
+" highlights.
+
+" http://bytefluent.com/vivify
+
+
+
+" I'm sure this will work for *most* (or all?) Vim versions below 7.0,
+" or even 7.3; I just have 7.0 as the lowest possible version.
+" I can't be sure. I am by no means a v[i]teran x3
+if v:version >= 700
+	if exists("syntax_on")
+		" Originally, I left this commented out for simplicity's sake
+		" as it is not vital, but apparently "t_Co" is automatically set
+		" to 8 if you open through the GUI.
+		" Meaning, Vim is set as your default editor. Or through a keyboard
+		" shortcut like ./x-terminal-emulator --command=vim
+		" (Oh, the irony.)
+
+		" If you do not need it then do with it as you wish.
+		set t_Co=256
+		syntax reset
+		hi clear
+		let g:colors_name = "neonwave"
+	else
+		finish
+	endif
+endif
+
+
+hi Boolean           ctermfg=45    ctermbg=NONE  gui=NONE       cterm=NONE      guifg=#00d7ff  guibg=NONE
+hi Cursor            ctermfg=66    ctermbg=15    gui=NONE       cterm=NONE      guifg=#080808  guibg=#6c6c6c
+hi Constant          ctermfg=33    ctermbg=NONE  gui=bold       cterm=bold      guifg=#0087ff  guibg=NONE
+hi Character         ctermfg=207   ctermbg=NONE  gui=NONE       cterm=NONE      guifg=#ff5fff  guibg=NONE
+hi Conditional       ctermfg=201   ctermbg=NONE  gui=bold       cterm=bold      guifg=#ff00ff  guibg=NONE
+hi Comment           ctermfg=244   ctermbg=NONE  gui=NONE       cterm=NONE      guifg=#808080  guibg=NONE
+hi ColorColumn       ctermfg=NONE  ctermbg=235   gui=NONE       cterm=NONE      guifg=NONE     guibg=#262626
+hi CursorLine        ctermfg=NONE  ctermbg=235   gui=NONE       cterm=NONE      guifg=NONE     guibg=#262626
+hi CursorColumn      ctermfg=NONE  ctermbg=235   gui=NONE       cterm=NONE      guifg=NONE     guibg=#262626
+hi CursorLineNr      ctermfg=45    ctermbg=235   gui=bold       cterm=bold      guifg=#00d7ff  guibg=#262626
+hi Define            ctermfg=61    ctermbg=NONE  gui=NONE       cterm=NONE      guifg=#5f5faf  guibg=NONE
+hi DefinedName       ctermfg=200   ctermbg=NONE  gui=NONE       cterm=NONE      guifg=#ff00d7  guibg=NONE
+hi Delimiter         ctermfg=207   ctermbg=NONE  gui=NONE       cterm=NONE      guifg=#ff5fff  guibg=NONE
+hi Directory         ctermfg=45    ctermbg=NONE  gui=bold       cterm=bold      guifg=#00d7ff  guibg=NONE
+hi Error             ctermfg=196   ctermbg=232   gui=bold       cterm=bold      guifg=#ff0000  guibg=#080808
+hi ErrorMsg          ctermfg=196   ctermbg=232   gui=bold       cterm=bold      guifg=#ff0000  guibg=#080808
+hi Exception         ctermfg=201   ctermbg=NONE  gui=bold       cterm=bold      guifg=#ff00ff  guibg=NONE
+hi Float             ctermfg=37    ctermbg=NONE  gui=NONE       cterm=NONE      guifg=#00afaf  guibg=NONE
+hi FoldColumn        ctermfg=33    ctermbg=233   gui=NONE       cterm=NONE      guifg=#0087ff  guibg=#121212
+hi Folded            ctermfg=33    ctermbg=NONE  gui=NONE       cterm=NONE      guifg=#0087ff  guibg=NONE
+hi Function          ctermfg=38    ctermbg=NONE  gui=NONE       cterm=NONE      guifg=#00afd7  guibg=NONE
+hi Identifier        ctermfg=201   ctermbg=NONE  gui=NONE       cterm=NONE      guifg=#ff00ff  guibg=NONE
+hi Include           ctermfg=69    ctermbg=NONE  gui=bold       cterm=bold      guifg=#5f87ff  guibg=NONE
+hi IncSearch         ctermfg=232   ctermbg=33    gui=NONE       cterm=NONE      guifg=#080808  guibg=#0087ff
+hi jsonKeyword       ctermfg=45    ctermbg=NONE  gui=bold       cterm=bold      guifg=#00d7ff  guibg=NONE
+hi Keyword           ctermfg=201   ctermbg=NONE  gui=bold       cterm=bold      guifg=#ff00ff  guibg=NONE
+hi Label             ctermfg=201   ctermbg=NONE  gui=bold       cterm=bold      guifg=#ff00ff  guibg=NONE
+hi LineNr            ctermfg=36    ctermbg=233   gui=NONE       cterm=NONE      guifg=#00af87  guibg=#121212
+hi Macro             ctermfg=69    ctermbg=NONE  gui=bold       cterm=bold      guifg=#5f87ff  guibg=NONE
+hi MatchParen        ctermfg=50    ctermbg=39    gui=NONE       cterm=NONE      guifg=#00ffd7  guibg=#00afff
+hi ModeMsg           ctermfg=39    ctermbg=232   gui=bold       cterm=bold      guifg=#00afff  guibg=#080808
+hi MoreMsg           ctermfg=46    ctermbg=NONE  gui=bold       cterm=bold      guifg=#00ff00  guibg=NONE
+hi NonText           ctermfg=201   ctermbg=NONE  gui=NONE       cterm=NONE      guifg=#ff00ff  guibg=NONE
+hi Normal            ctermfg=105   ctermbg=234   gui=NONE       cterm=NONE      guifg=#8787ff  guibg=#1c1c1c
+hi Number            ctermfg=31    ctermbg=NONE  gui=NONE       cterm=NONE      guifg=#0087af  guibg=NONE
+hi Operator          ctermfg=39    ctermbg=NONE  gui=NONE       cterm=NONE      guifg=#00afff  guibg=NONE
+
+
+" For matching over X length of chars; non-essential.
+" That is, if you have a match property in your vimrc.
+hi OverLength        ctermfg=46    ctermbg=234   gui=bold       cterm=bold      guifg=#00ff00  guibg=#1c1c1c
+hi perlIdentifier    ctermfg=39    ctermbg=NONE  gui=NONE       cterm=NONE      guifg=#00afff  guibg=NONE
+hi perlNumber        ctermfg=30    ctermbg=NONE  gui=NONE       cterm=NONE      guifg=#008787  guibg=NONE
+hi perlOperator      ctermfg=45    ctermbg=NONE  gui=NONE       cterm=NONE      guifg=#00d7ff  guibg=NONE
+hi PMenu             ctermfg=36    ctermbg=233   gui=NONE       cterm=NONE      guifg=#00af87  guibg=#121212
+hi PMenuSel          ctermfg=75    ctermbg=235   gui=NONE       cterm=NONE      guifg=#5fafff  guibg=#262626
+hi PMenuSbar         ctermfg=NONE  ctermbg=232   gui=NONE       cterm=NONE      guifg=NONE     guibg=#080808
+hi PMenuThumb        ctermfg=NONE  ctermbg=237   gui=NONE       cterm=NONE      guifg=NONE     guibg=#3a3a3a
+hi PreCondit         ctermfg=201   ctermbg=NONE  gui=NONE       cterm=NONE      guifg=#ff00ff  guibg=NONE
+hi PreProc           ctermfg=63    ctermbg=NONE  gui=NONE       cterm=NONE      guifg=#5f5fff  guibg=NONE
+hi pythonFunction    ctermfg=38    ctermbg=NONE  gui=NONE       cterm=NONE      guifg=#00afd7  guibg=NONE
+hi pythonException   ctermfg=196   ctermbg=232   gui=NONE       cterm=NONE      guifg=#ff0000  guibg=#080808
+hi pythonEscape      ctermfg=201   ctermbg=NONE  gui=NONE       cterm=NONE      guifg=#ff00ff  guibg=NONE
+hi pythonStatement   ctermfg=45    ctermbg=NONE  gui=bold       cterm=bold      guifg=#00d7ff  guibg=NONE
+hi Question          ctermfg=46    ctermbg=232   gui=bold       cterm=bold      guifg=#00ff00  guibg=#080808
+hi Repeat            ctermfg=201   ctermbg=NONE  gui=bold       cterm=bold      guifg=#ff00ff  guibg=NONE
+hi Search            ctermfg=232   ctermbg=33    gui=NONE       cterm=NONE      guifg=#080808  guibg=#0087ff
+hi shDeref           ctermfg=69    ctermbg=NONE  gui=NONE       cterm=NONE      guifg=#5f87ff  guibg=NONE
+hi shDerefDelim      ctermfg=171   ctermbg=NONE  gui=NONE       cterm=NONE      guifg=#d75fff  guibg=NONE
+hi shDerefOp         ctermfg=207   ctermbg=NONE  gui=NONE       cterm=NONE      guifg=#ff5fff  guibg=NONE
+hi shDerefVar        ctermfg=69    ctermbg=NONE  gui=NONE       cterm=NONE      guifg=#5f87ff  guibg=NONE
+hi shHereDoc         ctermfg=205   ctermbg=NONE  gui=NONE       cterm=NONE      guifg=#ff5faf  guibg=NONE
+hi shOperator        ctermfg=171   ctermbg=NONE  gui=NONE       cterm=NONE      guifg=#d75fff  guibg=NONE
+hi shShellVariables  ctermfg=207   ctermbg=NONE  gui=NONE       cterm=NONE      guifg=#ff5fff  guibg=NONE
+hi shSnglCase        ctermfg=201   ctermbg=NONE  gui=NONE       cterm=NONE      guifg=#ff00ff  guibg=NONE
+hi shTestOpr         ctermfg=39    ctermbg=NONE  gui=NONE       cterm=NONE      guifg=#00afff  guibg=NONE
+hi shVariable        ctermfg=45    ctermbg=NONE  gui=bold       cterm=bold      guifg=#00d7ff  guibg=NONE
+hi SignColumn        ctermfg=46    ctermbg=234   gui=NONE       cterm=NONE      guifg=#00ff00  guibg=#1c1c1c
+hi Special           ctermfg=13    ctermbg=NONE  gui=NONE       cterm=NONE      guifg=#ff00ff  guibg=NONE
+hi SpecialChar       ctermfg=165   ctermbg=NONE  gui=NONE       cterm=NONE      guifg=#d700ff  guibg=NONE
+hi SpecialComment    ctermfg=231   ctermbg=NONE  gui=NONE       cterm=NONE      guifg=#ffffff  guibg=NONE
+hi SpecialKey        ctermfg=105   ctermbg=NONE  gui=NONE       cterm=NONE      guifg=#8787ff  guibg=NONE
+hi SpellBad          ctermfg=196   ctermbg=232   gui=bold       cterm=bold      guifg=#ff0000  guibg=#080808
+hi StatusLine        ctermfg=32    ctermbg=232   gui=bold       cterm=bold      guifg=#0087d7  guibg=#080808
+hi StatusLineNC      ctermfg=105   ctermbg=236   gui=bold       cterm=bold      guifg=#8787ff  guibg=#303030
+hi Statement         ctermfg=201   ctermbg=NONE  gui=bold       cterm=bold      guifg=#ff00ff  guibg=NONE
+hi StorageClass      ctermfg=45    ctermbg=NONE  gui=bold       cterm=bold      guifg=#00d7ff  guibg=NONE
+hi String            ctermfg=171   ctermbg=NONE  gui=NONE       cterm=NONE      guifg=#d75fff  guibg=NONE
+hi Structure         ctermfg=45    ctermbg=NONE  gui=bold       cterm=bold      guifg=#00d7ff  guibg=NONE
+hi TabLine           ctermfg=105   ctermbg=234   gui=NONE       cterm=NONE      guifg=#8787ff  guibg=#1c1c1c
+hi TabLineFill       ctermfg=105   ctermbg=236   gui=NONE       cterm=NONE      guifg=#8787ff  guibg=#303030
+hi TabLineSel        ctermfg=32    ctermbg=233   gui=bold       cterm=bold      guifg=#0087d7  guibg=#121212
+hi Title             ctermfg=201   ctermbg=NONE  gui=NONE       cterm=NONE      guifg=#ff00ff  guibg=NONE
+hi Todo              ctermfg=231   ctermbg=201   gui=bold       cterm=bold      guifg=#ffffff  guibg=#ff00ff
+hi Type              ctermfg=45    ctermbg=NONE  gui=bold       cterm=bold      guifg=#00d7ff  guibg=NONE
+hi Typedef           ctermfg=45    ctermbg=NONE  gui=bold       cterm=bold      guifg=#00d7ff  guibg=NONE
+hi Underlined        ctermfg=69    ctermbg=NONE  gui=underline  cterm=underline guifg=#5f87ff  guibg=NONE
+hi VertSplit         ctermfg=105   ctermbg=236   gui=NONE       cterm=NONE      guifg=#8787ff  guibg=#303030
+hi Visual            ctermfg=111   ctermbg=237   gui=NONE       cterm=NONE      guifg=#87afff  guibg=#3a3a3a
+hi WarningMsg        ctermfg=254   ctermbg=1     gui=NONE       cterm=NONE      guifg=#e4e4e4  guibg=#800000

+ 119 - 0
vim/plugged/syntastic/CONTRIBUTING.md

@@ -0,0 +1,119 @@
+# CONTRIBUTING
+- - -
+1\. [Deprecation note](#deprecation)  
+2\. [Bug reports / GitHub issues](#bugreps)  
+3\. [Submitting a patch](#patches)  
+4\. [General style notes](#generalstyle)  
+5\. [Syntax checker notes](#checkerstyle)  
+- - -
+
+<a name="deprecation"></a>
+
+## 1. Deprecation note
+
+This project is no longer maintained.  If you need a syntax checking plugin
+for [Vim][vim] you might be interested in Syntastic's spiritual succesor,
+[ALE][ale].  Although it shares no code with syntastic and it takes a very
+different approach to design, [ALE][ale] can be considered a natural evolution
+of syntastic in terms of goals and functionality.  Check it out, you probably
+won't be disappointed.
+
+<a name="bugreps"></a>
+
+## 2. Bug reports / GitHub issues
+
+Please note that the preferred channel for posting bug reports is the
+[issue tracker at GitHub][bug_tracker]. Reports posted elsewhere are less likely
+to be seen by the core team.
+
+When reporting a bug make sure you search the existing GitHub issues
+for the same/similar issues. If you find one, feel free to add a `+1`
+comment with any additional information that may help us solve the
+issue.
+
+When creating a new issue be sure to state the following:
+
+* steps to reproduce the bug;
+* the version of Vim you are using (run `:ver` to find out);
+* the version of syntastic you are using (see `:SyntasticInfo`).
+
+For syntax checker bugs also state the version of the checker executable
+that you are using. Adding debugging information is typically useful
+too:
+
+* open a file handled by your checker;
+* set `g:syntastic_debug` to 1 or 3;
+* run the checker;
+* copy the output of `:mes`.
+
+<a name="patches"></a>
+
+## 3. Submitting a patch
+
+Before you consider adding features to syntastic, _please_ spend a few minutes
+(re-)reading the latest version of the [manual][manual]. Syntastic is changing
+rapidly at times, and it's possible that some features you want to add exist
+already.
+
+To submit a patch:
+
+* fork the [repo][github] on GitHub;
+* make a [topic branch][branches] and start hacking;
+* submit a pull request based off your topic branch.
+
+Small, focused patches are preferred.
+
+Large changes to the code should be discussed with the core team first.
+Create an issue and explain your plan and see what we say.
+
+Also, make sure to update the manual whenever applicable. Nobody can use
+features that aren't documented.
+
+<a name="generalstyle"></a>
+
+## 4. General style notes
+
+Follow the coding conventions/styles used in the syntastic core:
+
+* use 4 space indents;
+* don't use abbreviated keywords - e.g. use `endfunction`, not `endfun`
+(there's always room for more fun!);
+* don't use `l:` prefixes for variables unless actually required (i.e.
+almost never);
+* code for maintainability; we would rather a function be a couple of
+lines longer and have (for example) some [explaining variables][variables] to
+aid readability.
+
+<a name="checkerstyle"></a>
+
+## 5. Syntax checker notes
+
+Make sure to read the [guide][guide] if you plan to add new syntax checkers.
+
+Use the existing checkers as templates, rather than writing everything
+from scratch.
+
+The preferred style for error format strings is one "clause" per line.
+E.g. (from the `coffee` checker):
+
+```vim
+let errorformat =
+    \ '%E%f:%l:%c: %trror: %m,' .
+    \ 'Syntax%trror: In %f\, %m on line %l,' .
+    \ '%EError: In %f\, Parse error on line %l: %m,' .
+    \ '%EError: In %f\, %m on line %l,' .
+    \ '%W%f(%l): lint warning: %m,' .
+    \ '%W%f(%l): warning: %m,' .
+    \ '%E%f(%l): SyntaxError: %m,' .
+    \ '%-Z%p^,' .
+    \ '%-G%.%#'
+```
+
+[ale]:              https://github.com/dense-analysis/ale
+[bug_tracker]:      https://github.com/vim-syntastic/syntastic/issues
+[manual]:           https://github.com/vim-syntastic/syntastic/blob/master/doc/syntastic.txt
+[github]:           https://github.com/vim-syntastic/syntastic
+[branches]:         https://github.com/dchelimsky/rspec/wiki/Topic-Branches#using-topic-branches-when-contributing-patches
+[variables]:        http://www.refactoring.com/catalog/extractVariable.html
+[guide]:            https://github.com/vim-syntastic/syntastic/wiki/Syntax-Checker-Guide
+[vim]:              http://www.vim.org/

+ 13 - 0
vim/plugged/syntastic/LICENCE

@@ -0,0 +1,13 @@
+           DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
+                   Version 2, December 2004
+
+Copyright (C) 2004 Sam Hocevar <sam@hocevar.net>
+
+Everyone is permitted to copy and distribute verbatim or modified
+copies of this license document, and changing it is allowed as long
+as the name is changed.
+
+           DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
+  TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. You just DO WHAT THE FUCK YOU WANT TO.

+ 575 - 0
vim/plugged/syntastic/README.markdown

@@ -0,0 +1,575 @@
+                   ,
+                  / \,,_  .'|
+               ,{{| /}}}}/_.'            _____________________________________________
+              }}}}` '{{'  '.            /                                             \
+            {{{{{    _   ;, \          /            Ladies and Gentlemen,              \
+         ,}}}}}}    /o`\  ` ;)        |                                                |
+        {{{{{{   /           (        |                 this is ...                    |
+        }}}}}}   |            \       |                                                |
+       {{{{{{{{   \            \      |                                                |
+       }}}}}}}}}   '.__      _  |     |    _____             __             __  _      |
+       {{{{{{{{       /`._  (_\ /     |   / ___/__  ______  / /_____ ______/ /_(_)____ |
+        }}}}}}'      |    //___/   --=:   \__ \/ / / / __ \/ __/ __ `/ ___/ __/ / ___/ |
+    jgs `{{{{`       |     '--'       |  ___/ / /_/ / / / / /_/ /_/ (__  ) /_/ / /__   |
+         }}}`                         | /____/\__, /_/ /_/\__/\__,_/____/\__/_/\___/   |
+                                      |      /____/                                    |
+                                      |                                               /
+                                       \_____________________________________________/
+
+
+- - -
+1. [Deprecation note](#deprecation)  
+2. [Introduction](#introduction)  
+3. [Installation](#installation)  
+3.1. [Requirements](#requirements)  
+3.2. [Installing syntastic with Pathogen](#installpathogen)  
+4. [Recommended settings](#settings)  
+5. [FAQ](#faq)  
+5.1. [I installed syntastic but it isn't reporting any errors...](#faqinfo)  
+5.2. [Syntastic supports several checkers for my filetype, how do I tell it which one(s) to use?](#faqcheckers)  
+5.3. [How can I run checkers for "foreign" filetypes against the current file?](#faqforeign)  
+5.4. [I have enabled multiple checkers for the current filetype. How can I display all errors from all checkers together?](#faqaggregate)  
+5.5. [How can I pass additional arguments to a checker?](#faqargs)  
+5.6. [I run a checker and the location list is not updated...](#faqloclist)  
+5.6. [I run`:lopen` or `:lwindow` and the error window is empty...](#faqloclist)  
+5.7. [How can I jump between the different errors without using the location list at the bottom of the window?](#faqlnext)  
+5.8. [The error window is closed automatically when I `:quit` the current buffer but not when I `:bdelete` it?](#faqbdelete)  
+5.9. [My favourite checker needs to load a configuration file from the project's root rather than the current directory...](#faqconfig)  
+5.10. [What is the difference between syntax checkers and style checkers?](#faqstyle)  
+5.11. [How can I check scripts written for different versions of Python?](#faqpython)  
+5.12. [How can I check scripts written for different versions of Ruby?](#faqruby)  
+5.13. [The `perl` checker has stopped working...](#faqperl)  
+5.14. [What happened to the `rustc` checker?](#faqrust)  
+5.15. [What happened to the `tsc` checker?](#faqtsc)  
+5.16. [What happened to the `xcrun` checker?](#faqxcrun)  
+5.17. [What happened to the `valac` checker?](#faqvalac)  
+5.18. [What happened to the Julia `lint` checker?](#faqjulialint)  
+6. [Resources](#otherresources)  
+
+- - -
+
+<a name="deprecation"></a>
+
+## 1\. Deprecation note
+
+This project is no longer maintained.  If you need a syntax checking plugin
+for [Vim][vim] you might be interested in Syntastic's spiritual succesor,
+[ALE][ale].  Although it shares no code with syntastic and it takes a very
+different approach to design, [ALE][ale] can be considered a natural evolution
+of syntastic in terms of goals and functionality.  Check it out, you probably
+won't be disappointed.
+
+<a name="introduction"></a>
+
+## 2\. Introduction
+
+Syntastic is a syntax checking plugin for [Vim][vim] created by
+[Martin Grenfell][scrooloose]. It runs files through external syntax checkers
+and displays any resulting errors to the user. This can be done on demand, or
+automatically as files are saved. If syntax errors are detected, the user is
+notified and is happy because they didn't have to compile their code or execute
+their script to find them.
+
+At the time of this writing, syntastic has checking plugins for ACPI
+Source Language, ActionScript, Ada, Ansible configurations, API Blueprint,
+AppleScript, AsciiDoc, Assembly languages, BEMHTML, Bro, Bourne shell, C, C++,
+C#, Cabal, Chef, CMake, CoffeeScript, Coco, Coq, CSS, Cucumber, CUDA, D, Dart,
+DocBook, Dockerfile, Dust, Elixir, Erlang, eRuby, Fortran, Gentoo metadata,
+GLSL, Go, Haml, Haskell, Haxe, Handlebars, HSS, HTML, Java, JavaScript, JSON,
+JSX, LESS, Lex, Limbo, LISP, LLVM intermediate language, Lua, Markdown,
+MATLAB, Mercury, NASM, Nix, Objective-C, Objective-C++, OCaml, Perl, Perl
+POD, PHP, gettext Portable Object, Raku, OS X and iOS property lists, Pug
+(formerly Jade), Puppet, Python, QML, R, Racket, RDF TriG, RDF Turtle, Relax
+NG, reStructuredText, RPM spec, Ruby, SASS/SCSS, Scala, Slim, SML, Solidity,
+Sphinx, SQL, Stylus, Tcl, TeX, Texinfo, Twig, TypeScript, Verilog, VHDL, Vim
+help, VimL, Vue.js, xHtml, XML, XSLT, XQuery, YACC, YAML, YANG data models,
+YARA rules, z80, Zope page templates, and Zsh. See the [manual][checkers] for
+details about the corresponding supported checkers (`:help syntastic-checkers`
+in Vim).
+
+A number of third-party Vim plugins also provide checkers for syntastic, for
+example: [merlin][merlin], [omnisharp-vim][omnisharp], [rust.vim][rust],
+[syntastic-extras][myint], [syntastic-more][roktas], [tsuquyomi][tsuquyomi],
+[vim-crystal][crystal], [vim-eastwood][eastwood], and [vim-swift][swift].
+
+Below is a screenshot showing the methods that Syntastic uses to display syntax
+errors. Note that, in practise, you will only have a subset of these methods
+enabled.
+
+![Screenshot 1][screenshot]
+
+1. Errors are loaded into the location list for the corresponding window.
+2. When the cursor is on a line containing an error, the error message is echoed in the command window.
+3. Signs are placed beside lines with errors - note that warnings are displayed in a different color.
+4. There is a configurable statusline flag you can include in your statusline config.
+5. Hover the mouse over a line containing an error and the error message is displayed as a balloon.
+6. (not shown) Highlighting errors with syntax highlighting. Erroneous parts of lines can be highlighted.
+
+<a name="installation"></a>
+
+## 3\. Installation
+
+<a name="requirements"></a>
+
+### 3.1\. Requirements
+
+Syntastic itself has rather relaxed requirements: it doesn't have any external
+dependencies, and it needs a version of [Vim][vim] compiled with a few common
+features: `autocmd`, `eval`, `file_in_path`, `modify_fname`, `quickfix`,
+`reltime`, `statusline`, and `user_commands`. Not all possible combinations of
+features that include the ones above make equal sense on all operating systems,
+but Vim version 7 or later with the "normal", "big", or "huge" feature sets
+should be fine.
+
+Syntastic should work with any modern plugin managers for Vim, such as
+[NeoBundle][neobundle], [Pathogen][pathogen], [Vim-Addon-Manager][vam],
+[Vim-Plug][plug], or [Vundle][vundle]. Instructions for installing syntastic
+with [Pathogen][pathogen] are included below for completeness.
+
+Starting with Vim version 7.4.1486 you can also load syntastic using the
+standard mechanism of packages, without the help of third-party plugin managers
+(see `:help packages` in Vim for details). Beware however that, while support
+for packages has been added in Vim 7.4.1384, the functionality needed by
+syntastic is present only in versions 7.4.1486 and later.
+
+Last but not least: syntastic doesn't know how to do any syntax checks by
+itself. In order to get meaningful results you need to install external
+checkers corresponding to the types of files you use. Please consult the
+[manual][checkers] (`:help syntastic-checkers` in Vim) for a list of supported
+checkers.
+
+<a name="installpathogen"></a>
+
+### 3.2\. Installing syntastic with Pathogen
+
+If you already have [Pathogen][pathogen] working then skip [Step 1](#step1) and go to
+[Step 2](#step2).
+
+<a name="step1"></a>
+
+#### 3.2.1\. Step 1: Install pathogen.vim
+
+First I'll show you how to install Tim Pope's [Pathogen][pathogen] so that it's easy to
+install syntastic. Do this in your terminal so that you get the `pathogen.vim`
+file and the directories it needs:
+```sh
+mkdir -p ~/.vim/autoload ~/.vim/bundle && \
+curl -LSso ~/.vim/autoload/pathogen.vim https://tpo.pe/pathogen.vim
+```
+Next you *need* to add this to your `~/.vimrc`:
+```vim
+execute pathogen#infect()
+```
+
+<a name="step2"></a>
+
+#### 3.2.2\. Step 2: Install syntastic as a Pathogen bundle
+
+You now have pathogen installed and can put syntastic into `~/.vim/bundle` like
+this:
+```sh
+cd ~/.vim/bundle && \
+git clone --depth=1 https://github.com/vim-syntastic/syntastic.git
+```
+Quit vim and start it back up to reload it, then type:
+```vim
+:Helptags
+```
+If you get an error when you do this, then you probably didn't install
+[Pathogen][pathogen] right. Go back to [Step 1](#step1) and make sure you did the
+following:
+
+1. Created both the `~/.vim/autoload` and `~/.vim/bundle` directories.
+2. Added the `execute pathogen#infect()` line to your `~/.vimrc` file
+3. Did the `git clone` of syntastic inside `~/.vim/bundle`
+4. Have permissions to access all of these directories.
+
+<a name="settings"></a>
+
+## 4\. Recommended settings
+
+Syntastic has numerous options that can be configured, and the defaults
+are not particularly well suitable for new users. It is recommended
+that you start by adding the following lines to your `vimrc` file, and
+return to them after reading the manual (see `:help syntastic` in Vim):
+```vim
+set statusline+=%#warningmsg#
+set statusline+=%{SyntasticStatuslineFlag()}
+set statusline+=%*
+
+let g:syntastic_always_populate_loc_list = 1
+let g:syntastic_auto_loc_list = 1
+let g:syntastic_check_on_open = 1
+let g:syntastic_check_on_wq = 0
+```
+
+<a name="faq"></a>
+
+## 5\. FAQ
+
+<a name="faqinfo"></a>
+
+__5.1. Q. I installed syntastic but it isn't reporting any errors...__
+
+A. The most likely reason is that none of the syntax checkers that it requires
+are installed. For example: by default, python requires either `flake8` or
+`pylint` to be installed and in your `$PATH`. Read the [manual][checkers]
+(`:help syntastic-checkers` in Vim) to find out what executables are
+supported. Note that aliases do not work; the actual executables must be
+available in your `$PATH`. Symbolic links are okay though.  You can see
+syntastic's idea of available checkers by running `:SyntasticInfo`.
+
+A second probable reason is that none of the available checkers are
+enabled. Syntastic comes preconfigured with a default list of enabled checkers
+per filetype, but this list is kept short in order to prevent slowing down Vim
+or trying to run conflicting checks. The command `:SyntasticInfo` will show you
+which checkers are enabled. You can tell syntastic which checkers (among the
+available ones) you want to run by setting `g:syntastic_<filetype>_checkers` in
+your `vimrc` (see [below](#faqcheckers)).
+
+A third possible reason is that the `$PATH` seen by syntastic might not be same
+as the `$PATH` in your login shell. Syntastic runs checkers using the shell
+pointed to by Vim's `shell` (or by `g:syntastic_shell`, if set), and that's the
+shell you need to configure to set the proper `$PATH` and environment variables
+for your checkers. You can see syntastic's idea of `$PATH` by running
+```vim
+:echo syntastic#util#system('echo "$PATH"')
+```
+on UNIX and Mac OS-X systems, or
+```vim
+:echo syntastic#util#system('echo %PATH%')
+```
+on Windows.
+
+Finally, another reason it could fail is that either the command line options
+or the error output for a syntax checker may have changed. In this case, make
+sure you have the latest version of the syntax checker installed. If it still
+fails then post an [issue][bug_tracker] - or better yet, create a pull request.
+
+<a name="faqcheckers"></a>
+
+__5.2. Q. Syntastic supports several checkers for my filetype, how do I tell it
+which one(s) to use?__
+
+A. Add a line like this to your `vimrc`:
+```vim
+let g:syntastic_<filetype>_checkers = ['<checker-name>']
+```
+
+To see the list of supported checkers for your filetype read the
+[manual][checkers] (`:help syntastic-checkers` in Vim).
+
+For example, Python has the following checkers, among others: `flake8`,
+`pyflakes`, `pylint` and a native `python` checker.  To tell syntastic to use
+`pylint`, you would use this setting:
+```vim
+let g:syntastic_python_checkers = ['pylint']
+```
+
+Checkers can be chained together like this:
+```vim
+let g:syntastic_php_checkers = ['php', 'phpcs', 'phpmd']
+```
+
+This is telling syntastic to run the `php` checker first, and if no errors are
+found, run `phpcs`, and then `phpmd`.
+
+You can also run checkers explicitly by calling `:SyntasticCheck <checker>`.
+For example to run `phpcs` and `phpmd`:
+```vim
+:SyntasticCheck phpcs phpmd
+```
+
+This works for any checkers available for the current filetype, even if they
+aren't listed in `g:syntastic_<filetype>_checkers`.
+
+<a name="faqforeign"></a>
+
+__5.3. Q. How can I run checkers for "foreign" filetypes against the current
+file?__
+
+A. You need to qualify the name of the "foreign" checker with the name
+of its filetype. For example to check `tex` files with the checker
+`language_check` (which normally acts only on files of type `text`), you can
+add `text/language_check` to the list fo checkers for `tex`:
+```vim
+let g:syntastic_tex_checkers = ['lacheck', 'text/language_check']
+```
+
+This also works with `:SyntasticCheck`, e.g. the following command runs
+`text/language_check` against the current file regardless of the current
+filetype:
+```vim
+:SyntasticCheck text/language_check
+```
+
+Of course, the checkers specified this way need to be known to syntastic, and
+they need to be shown as available when you run `:SyntasticInfo`. You can't
+just make up a combination of a filetype and a program name and expect it to
+work as a checker.
+
+<a name="faqaggregate"></a>
+
+__5.4. Q. I have enabled multiple checkers for the current filetype. How can I
+display all errors from all checkers together?__
+
+A. Set `g:syntastic_aggregate_errors` to 1 in your `vimrc`:
+```vim
+let g:syntastic_aggregate_errors = 1
+```
+
+See `:help syntastic-aggregating-errors` for more details.
+
+<a name="faqargs"></a>
+
+__5.5. Q. How can I pass additional arguments to a checker?__
+
+A. In most cases a command line is constructed using an internal function
+named `makeprgBuild()`, which provides a number of options that allow you to
+customise every part of the command that gets run. You can set these options
+using global variables.
+
+The general form of the global `args` variable is
+`syntastic_<filetype>_<checker>_args`. Thus if you wanted to pass
+`--my --args --here` to the Ruby `mri` checker you would add this line to your
+`vimrc`:
+```vim
+let g:syntastic_ruby_mri_args = "--my --args --here"
+```
+
+See `:help syntastic-checker-options` for more information.
+
+A number of checkers don't use the `makeprgBuild()` function mentioned above,
+or have additional options that can be configured. For these checkers the exact
+list of options should be included in the [manual][checkers]
+(`:help syntastic-checkers` in Vim).
+
+<a name="faqloclist"></a>
+
+__5.6. Q. I run a checker and the location list is not updated...__  
+__5.6. Q. I run`:lopen` or `:lwindow` and the error window is empty...__
+
+A. By default the location list is changed only when you run the `:Errors`
+command, in order to minimise conflicts with other plugins. If you want the
+location list to always be updated when you run the checkers, add this line to
+your `vimrc`:
+```vim
+let g:syntastic_always_populate_loc_list = 1
+```
+
+<a name="faqlnext"></a>
+
+__5.7. Q. How can I jump between the different errors without using the location
+list at the bottom of the window?__
+
+A. Vim provides several built-in commands for this. See `:help :lnext` and
+`:help :lprevious`.
+
+If you use these commands a lot then you may want to add shortcut mappings to
+your `vimrc`, or install something like [unimpaired][unimpaired], which provides such
+mappings (among other things).
+
+<a name="faqbdelete"></a>
+
+__5.8. Q. The error window is closed automatically when I `:quit` the current buffer
+but not when I `:bdelete` it?__
+
+A. There is no safe way to handle that situation automatically, but you can
+work around it:
+```vim
+nnoremap <silent> <C-d> :lclose<CR>:bdelete<CR>
+cabbrev <silent> bd <C-r>=(getcmdtype()==#':' && getcmdpos()==1 ? 'lclose\|bdelete' : 'bd')<CR>
+```
+
+<a name="faqconfig"></a>
+
+__5.9. My favourite checker needs to load a configuration file from the
+project's root rather than the current directory...__
+
+A. You can set up an `autocmd` to search for the configuration file in the
+current directory and upwards, and add it to the checker's options when found.
+For example for `jscs`:
+
+```vim
+function! FindConfig(prefix, what, where)
+    let cfg = findfile(a:what, escape(a:where, ' ') . ';')
+    return cfg !=# '' ? ' ' . a:prefix . ' ' . shellescape(cfg) : ''
+endfunction
+
+autocmd FileType javascript let b:syntastic_javascript_jscs_args =
+    \ get(g:, 'syntastic_javascript_jscs_args', '') .
+    \ FindConfig('-c', '.jscsrc', expand('<afile>:p:h', 1))
+```
+
+<a name="faqstyle"></a>
+
+__5.10. Q. What is the difference between syntax checkers and style checkers?__
+
+A. The errors and warnings they produce are highlighted differently and can
+be filtered by different rules, but otherwise the distinction is pretty much
+arbitrary. There is an ongoing effort to keep things consistent, so you can
+_generally_ expect messages produced by syntax checkers to be _mostly_ related
+to syntax, and messages produced by style checkers to be _mostly_ about style.
+But there can be no formal guarantee that, say, a style checker that runs into
+a syntax error wouldn't die with a fatal message, nor that a syntax checker
+wouldn't give you warnings against using some constructs as being bad practice.
+There is also no guarantee that messages marked as `style` are less severe than
+the ones marked as `syntax` (whatever that might mean). And there are even a
+few Frankenstein checkers (for example `flake8` and `pylama`) that, by their
+nature, produce both kinds of messages. Syntastic is not smart enough to be
+able to sort out these things by itself.
+
+Generally it's more useful to look at this from the perspective of filtering
+unwanted messages, rather than as an indicator of severity levels. The
+distinction between syntax and style is orthogonal to the distinction between
+errors and warnings, and thus you can turn off messages based on level, on
+type, or both.
+
+e.g. To disable all style messages:
+```vim
+let g:syntastic_quiet_messages = { "type": "style" }
+```
+See `:help syntastic_quiet_messages` for more information.
+
+<a name="faqpython"></a>
+
+__5.11. Q. How can I check scripts written for different versions of Python?__
+
+A. Install a Python version manager such as [virtualenv][virtualenv]
+or [pyenv][pyenv], activate the environment for the relevant version
+of Python, and install in it the checkers you want to use.  Set
+`g:syntastic_python_checkers` accordingly in your `vimrc`, and run [Vim][vim]
+from the virtual environment.
+
+If you're starting Vim from a desktop manager rather than from a terminal you
+might need to write wrapper scripts around your checkers, to activate the
+virtual environment before running the actual checks.  Then you'll need to
+point the relevant `g:syntastic_python_<checker>_exec` variables to the wrapper
+scripts.
+
+<a name="faqruby"></a>
+
+__5.12. Q. How can I check scripts written for different versions of Ruby?__
+
+A. Install a Ruby version manager such as [rvm][rvm] or [rbenv][rbenv],
+activate the relevant version of Ruby, and install in it the checkers you want
+to use.  Set `g:syntastic_ruby_checkers` accordingly in your `vimrc`, and run
+[Vim][vim] under the relevant Ruby version.
+
+If you're starting Vim from a desktop manager rather than from a terminal
+and depending on the version manager you use you might need to write wrapper
+scripts around your checkers, to activate the relevant version of Ruby
+before running the actual checks.  Then you'll need to point the relevant
+`g:syntastic_ruby_<checker>_exec` variables to the wrapper scripts.
+
+<a name="faqperl"></a>
+
+__5.13. Q. The `perl` checker has stopped working...__
+
+A. The `perl` checker runs `perl -c` against your file, which in turn
+__executes__ any `BEGIN`, `UNITCHECK`, and `CHECK` blocks, and any `use`
+statements in your file (cf. [perlrun][perlrun]). This is probably fine if you
+wrote the file yourself, but it's a security problem if you're checking
+third-party files. Since there is currently no way to disable this behaviour
+while still producing useful results, the checker is now disabled by default.
+To (re-)enable it, make sure the `g:syntastic_perl_checkers` list includes
+`perl`, and set `g:syntastic_enable_perl_checker` to 1 in your `vimrc`:
+```vim
+let g:syntastic_enable_perl_checker = 1
+```
+
+<a name="faqrust"></a>
+
+__5.14. Q. What happened to the `rustc` checker?__
+
+A. It is now part of the [rust.vim][rust] plugin. If you install this plugin the
+checker should be picked up automatically by syntastic.
+
+<a name="faqtsc"></a>
+
+__5.15. Q. What happened to the `tsc` checker?__
+
+A. It didn't meet people's expectations and it has been removed. The plugin
+[tsuquyomi][tsuquyomi] comes packaged with a checker for TypeScript. If you
+install this plugin the checker should be picked up automatically by syntastic.
+
+<a name="faqxcrun"></a>
+
+__5.16. Q. What happened to the `xcrun` checker?__
+
+A. The `xcrun` checker used to have a security problem and it has been removed.
+A better checker for __Swift__ is part of the [vim-swift][swift] plugin. If you
+install this plugin the checker should be picked up automatically by syntastic.
+
+<a name="faqvalac"></a>
+
+__5.17. Q. What happened to the `valac` checker?__
+
+A. It is now part of the [vala.vim][vala] plugin. If you install this plugin the
+checker should be picked up automatically by syntastic.
+
+<a name="julialint"></a>
+
+__5.18. Q. What happened to the Julia `lint` checker?__
+
+A. It was removed, since the `Lint.jl` package [has been deprecated][julialint]
+and no longer works with recent Julia versions.
+
+<a name="otherresources"></a>
+
+## 6\. Resources
+
+The preferred place for posting suggestions, reporting bugs, and general
+discussions related to syntastic is the [issue tracker at GitHub][bug_tracker].
+A guide for writing syntax checkers can be found in the [wiki][guide].
+There are also a dedicated [google group][google_group], and a
+[syntastic tag at StackOverflow][stack_overflow].
+
+Syntastic aims to provide a common interface to syntax checkers for as many
+languages as possible. For particular languages, there are, of course, other
+plugins that provide more functionality than syntastic. You might want to take
+a look at [ghcmod-vim][ghcmod], [jedi-vim][jedi], [python-mode][python_mode], [vim-go][vimgo], or
+[YouCompleteMe][ycm].
+
+[scrooloose]:       https://github.com/scrooloose
+[screenshot]:       https://github.com/vim-syntastic/syntastic/raw/master/_assets/screenshot_1.png
+
+[ale]:              https://github.com/dense-analysis/ale
+
+[bug_tracker]:      https://github.com/vim-syntastic/syntastic/issues
+[checkers]:         https://github.com/vim-syntastic/syntastic/blob/master/doc/syntastic-checkers.txt
+[crystal]:          https://github.com/rhysd/vim-crystal
+[eastwood]:         https://github.com/venantius/vim-eastwood
+[ghcmod]:           https://github.com/eagletmt/ghcmod-vim
+[google_group]:     https://groups.google.com/group/vim-syntastic
+[guide]:            https://github.com/vim-syntastic/syntastic/wiki/Syntax-Checker-Guide
+[jedi]:             https://github.com/davidhalter/jedi-vim
+[julialint]:        https://github.com/tonyhffong/Lint.jl/issues/269
+[merlin]:           https://github.com/the-lambda-church/merlin
+[myint]:            https://github.com/myint/syntastic-extras
+[neobundle]:        https://github.com/Shougo/neobundle.vim
+[omnisharp]:        https://github.com/OmniSharp/omnisharp-vim
+[pathogen]:         https://github.com/tpope/vim-pathogen
+[perlrun]:          http://perldoc.perl.org/perlrun.html#*-c*
+[plug]:             https://github.com/junegunn/vim-plug/
+[pyenv]:            https://github.com/yyuu/pyenv
+[python_mode]:      https://github.com/klen/python-mode
+[rbenv]:            https://github.com/rbenv/rbenv
+[roktas]:           https://github.com/roktas/syntastic-more
+[rust]:             https://github.com/rust-lang/rust.vim
+[rvm]:              https://rvm.io/
+[stack_overflow]:   http://stackoverflow.com/questions/tagged/syntastic
+[swift]:            https://github.com/kballard/vim-swift
+[tsuquyomi]:        https://github.com/Quramy/tsuquyomi/
+[unimpaired]:       https://github.com/tpope/vim-unimpaired
+[vala]:             https://github.com/arrufat/vala.vim
+[vam]:              https://github.com/MarcWeber/vim-addon-manager
+[vim]:              http://www.vim.org/
+[vimgo]:            https://github.com/fatih/vim-go
+[virtualenv]:       https://virtualenv.pypa.io/en/stable/
+[vundle]:           https://github.com/gmarik/Vundle.vim
+[ycm]:              https://github.com/ycm-core/YouCompleteMe
+
+<!--
+vim:tw=79:sw=4:
+-->

BIN
vim/plugged/syntastic/_assets/screenshot_1.png


+ 341 - 0
vim/plugged/syntastic/autoload/syntastic/c.vim

@@ -0,0 +1,341 @@
+if exists('g:loaded_syntastic_c_autoload') || !exists('g:loaded_syntastic_plugin')
+    finish
+endif
+let g:loaded_syntastic_c_autoload = 1
+
+let s:save_cpo = &cpo
+set cpo&vim
+
+" Public functions {{{1
+
+" convenience function to determine the 'null device' parameter
+" based on the current operating system
+function! syntastic#c#NullOutput() abort " {{{2
+    let known_os = has('unix') || has('mac') || syntastic#util#isRunningWindows()
+    return known_os ? '-o ' . syntastic#util#DevNull() : ''
+endfunction " }}}2
+
+" read additional compiler flags from the given configuration file
+" the file format and its parsing mechanism is inspired by clang_complete
+function! syntastic#c#ReadConfig(file) abort " {{{2
+    call syntastic#log#debug(g:_SYNTASTIC_DEBUG_CHECKERS, 'ReadConfig: looking for', a:file)
+
+    " search upwards from the current file's directory
+    let config = syntastic#util#findFileInParent(a:file, expand('%:p:h', 1))
+    if config ==# ''
+        call syntastic#log#debug(g:_SYNTASTIC_DEBUG_CHECKERS, 'ReadConfig: file not found')
+        return ''
+    endif
+    call syntastic#log#debug(g:_SYNTASTIC_DEBUG_CHECKERS, 'ReadConfig: config file:', config)
+    if !filereadable(config)
+        call syntastic#log#debug(g:_SYNTASTIC_DEBUG_CHECKERS, 'ReadConfig: file unreadable')
+        return ''
+    endif
+
+    " convert filename into absolute path
+    let filepath = fnamemodify(config, ':p:h')
+
+    " try to read config file
+    try
+        let lines = readfile(config)
+    catch /\m^Vim\%((\a\+)\)\=:E48[45]/
+        call syntastic#log#debug(g:_SYNTASTIC_DEBUG_CHECKERS, 'ReadConfig: error reading file')
+        return ''
+    endtry
+
+    " filter out empty lines and comments
+    call filter(lines, 'v:val !~# ''\v^(\s*#|$)''')
+
+    " remove leading and trailing spaces
+    call map(lines, 'substitute(v:val, ''\m^\s\+'', "", "")')
+    call map(lines, 'substitute(v:val, ''\m\s\+$'', "", "")')
+
+    let parameters = []
+    for line in lines
+        let matches = matchstr(line, '\m\C^\s*-I\s*\zs.\+')
+        if matches !=# ''
+            " this one looks like an absolute path
+            if match(matches, '\m^\%(/\|\a:\)') != -1
+                call add(parameters, '-I' . matches)
+            else
+                call add(parameters, '-I' . filepath . syntastic#util#Slash() . matches)
+            endif
+        else
+            call add(parameters, line)
+        endif
+    endfor
+
+    return join(map(parameters, 'syntastic#util#shescape(v:val)'))
+endfunction " }}}2
+
+" GetLocList() for C-like compilers
+function! syntastic#c#GetLocList(filetype, subchecker, options) abort " {{{2
+    try
+        let flags = s:_get_cflags(a:filetype, a:subchecker, a:options)
+    catch /\m\C^Syntastic: skip checks$/
+        return []
+    endtry
+
+    let makeprg = syntastic#util#shexpand(g:syntastic_{a:filetype}_compiler) .
+        \ ' ' . flags . ' ' . syntastic#util#shexpand('%')
+
+    let errorformat = s:_get_checker_var('g', a:filetype, a:subchecker, 'errorformat', a:options['errorformat'])
+
+    let postprocess = s:_get_checker_var('g', a:filetype, a:subchecker, 'remove_include_errors', 0) ?
+        \ ['filterForeignErrors'] : []
+
+    " process makeprg
+    return SyntasticMake({
+        \ 'makeprg': makeprg,
+        \ 'errorformat': errorformat,
+        \ 'postprocess': postprocess })
+endfunction " }}}2
+
+" }}}1
+
+" Private functions {{{1
+
+" initialize c/cpp syntax checker handlers
+function! s:_init() abort " {{{2
+    let s:handlers = []
+    let s:cflags = {}
+
+    call s:_registerHandler('\m\<cairo',       's:_checkPackage', ['cairo', 'cairo'])
+    call s:_registerHandler('\m\<freetype',    's:_checkPackage', ['freetype', 'freetype2', 'freetype'])
+    call s:_registerHandler('\m\<glade',       's:_checkPackage', ['glade', 'libglade-2.0', 'libglade'])
+    call s:_registerHandler('\m\<glib',        's:_checkPackage', ['glib', 'glib-2.0', 'glib'])
+    call s:_registerHandler('\m\<gtk',         's:_checkPackage', ['gtk', 'gtk+-2.0', 'gtk+', 'glib-2.0', 'glib'])
+    call s:_registerHandler('\m\<libsoup',     's:_checkPackage', ['libsoup', 'libsoup-2.4', 'libsoup-2.2'])
+    call s:_registerHandler('\m\<libxml',      's:_checkPackage', ['libxml', 'libxml-2.0', 'libxml'])
+    call s:_registerHandler('\m\<pango',       's:_checkPackage', ['pango', 'pango'])
+    call s:_registerHandler('\m\<SDL',         's:_checkPackage', ['sdl', 'sdl'])
+    call s:_registerHandler('\m\<opengl',      's:_checkPackage', ['opengl', 'gl'])
+    call s:_registerHandler('\m\<webkit',      's:_checkPackage', ['webkit', 'webkit-1.0'])
+
+    call s:_registerHandler('\m\<php\.h\>',    's:_checkPhp',    [])
+    call s:_registerHandler('\m\<Python\.h\>', 's:_checkPython', [])
+    call s:_registerHandler('\m\<ruby',        's:_checkRuby',   [])
+endfunction " }}}2
+
+" register a handler dictionary object
+function! s:_registerHandler(regex, function, args) abort " {{{2
+    let handler = {}
+    let handler['regex'] = a:regex
+    let handler['func'] = function(a:function)
+    let handler['args'] = a:args
+    call add(s:handlers, handler)
+endfunction " }}}2
+
+" try to find library with 'pkg-config'
+" search possible libraries from first to last given
+" argument until one is found
+function! s:_checkPackage(name, ...) abort " {{{2
+    if executable('pkg-config')
+        if !has_key(s:cflags, a:name)
+            for pkg in a:000
+                let pkg_flags = syntastic#util#system('pkg-config --cflags ' . pkg)
+                " since we cannot necessarily trust the pkg-config exit code
+                " we have to check for an error output as well
+                if v:shell_error == 0 && pkg_flags !~? 'not found'
+                    let pkg_flags = ' ' . substitute(pkg_flags, "\n", '', '')
+                    let s:cflags[a:name] = pkg_flags
+                    return pkg_flags
+                endif
+            endfor
+        else
+            return s:cflags[a:name]
+        endif
+    endif
+    return ''
+endfunction " }}}2
+
+" try to find PHP includes with 'php-config'
+function! s:_checkPhp() abort " {{{2
+    if executable('php-config')
+        if !has_key(s:cflags, 'php')
+            let s:cflags['php'] = syntastic#util#system('php-config --includes')
+            let s:cflags['php'] = ' ' . substitute(s:cflags['php'], "\n", '', '')
+        endif
+        return s:cflags['php']
+    endif
+    return ''
+endfunction " }}}2
+
+" try to find the python headers with distutils
+function! s:_checkPython() abort " {{{2
+    if executable('python')
+        if !has_key(s:cflags, 'python')
+            let s:cflags['python'] = syntastic#util#system('python -c ''from distutils import ' .
+                \ 'sysconfig; import sys; sys.stdout.write(sysconfig.get_python_inc())''')
+            let s:cflags['python'] = substitute(s:cflags['python'], "\n", '', '')
+            let s:cflags['python'] = ' -I' . s:cflags['python']
+        endif
+        return s:cflags['python']
+    endif
+    return ''
+endfunction " }}}2
+
+" try to find the ruby headers with 'rbconfig'
+function! s:_checkRuby() abort " {{{2
+    if executable('ruby')
+        if !has_key(s:cflags, 'ruby')
+            let s:cflags['ruby'] = syntastic#util#system('ruby -r rbconfig -e ' .
+                \ '''puts RbConfig::CONFIG["rubyhdrdir"] || RbConfig::CONFIG["archdir"]''')
+            let s:cflags['ruby'] = substitute(s:cflags['ruby'], "\n", '', '')
+            let s:cflags['ruby'] = ' -I' . s:cflags['ruby']
+        endif
+        return s:cflags['ruby']
+    endif
+    return ''
+endfunction " }}}2
+
+" }}}1
+
+" Utilities {{{1
+
+" resolve checker-related user variables
+function! s:_get_checker_var(scope, filetype, subchecker, name, default) abort " {{{2
+    let prefix = a:scope . ':' . 'syntastic_'
+    if exists(prefix . a:filetype . '_' . a:subchecker . '_' . a:name)
+        return {a:scope}:syntastic_{a:filetype}_{a:subchecker}_{a:name}
+    elseif exists(prefix . a:filetype . '_' . a:name)
+        return {a:scope}:syntastic_{a:filetype}_{a:name}
+    else
+        return a:default
+    endif
+endfunction " }}}2
+
+" resolve user CFLAGS
+function! s:_get_cflags(ft, ck, opts) abort " {{{2
+    " determine whether to parse header files as well
+    if has_key(a:opts, 'header_names') && expand('%', 1) =~? a:opts['header_names']
+        if s:_get_checker_var('g', a:ft, a:ck, 'check_header', 0)
+            let flags = get(a:opts, 'header_flags', '') . ' -c ' . syntastic#c#NullOutput()
+        else
+            " checking headers when check_header is unset: bail out
+            throw 'Syntastic: skip checks'
+        endif
+    else
+        let flags = get(a:opts, 'main_flags', '')
+    endif
+
+    let flags .= ' ' . s:_get_checker_var('g', a:ft, a:ck, 'compiler_options', '') . ' ' . s:_get_include_dirs(a:ft)
+
+    " check if the user manually set some cflags
+    let b_cflags = s:_get_checker_var('b', a:ft, a:ck, 'cflags', '')
+    if b_cflags !=# ''
+        let flags .= ' ' . b_cflags
+    endif
+
+    " add optional config file parameters
+    let config_file = s:_get_checker_var('b', a:ft, a:ck, 'config_file', s:_get_checker_var('g', a:ft, a:ck, 'config_file', ''))
+    let flags .= ' ' . syntastic#c#ReadConfig(config_file)
+
+    if b_cflags ==# '' && (a:ft ==# 'c' || a:ft ==# 'cpp') && !s:_get_checker_var('g', a:ft, a:ck, 'no_include_search', 0)
+        " refresh the include file search if desired
+        if s:_get_checker_var('g', a:ft, a:ck, 'auto_refresh_includes', 0)
+            let flags .= ' ' . s:_search_headers()
+        else
+            " search for header includes if not cached already
+            if !exists('b:syntastic_' . a:ft . '_includes')
+                let b:syntastic_{a:ft}_includes = s:_search_headers()
+            endif
+            let flags .= ' ' . b:syntastic_{a:ft}_includes
+        endif
+    endif
+
+    return flags
+endfunction " }}}2
+
+" get the gcc include directory argument depending on the default
+" includes and the optional user-defined 'g:syntastic_c_include_dirs'
+function! s:_get_include_dirs(filetype) abort " {{{2
+    let include_dirs = []
+
+    if a:filetype =~# '\v^%(c|cpp|objc|objcpp)$' &&
+                \ (!exists('g:syntastic_'.a:filetype.'_no_default_include_dirs') ||
+                \ !g:syntastic_{a:filetype}_no_default_include_dirs)
+        let include_dirs = copy(s:default_includes)
+    endif
+
+    if exists('g:syntastic_'.a:filetype.'_include_dirs')
+        call extend(include_dirs, g:syntastic_{a:filetype}_include_dirs)
+    endif
+
+    return join(map(syntastic#util#unique(include_dirs), 'syntastic#util#shescape("-I" . v:val)'))
+endfunction " }}}2
+
+" search the first 100 lines for include statements that are
+" given in the handlers dictionary
+function! s:_search_headers() abort " {{{2
+    let includes = ''
+    let files = []
+    let found = []
+    let lines = filter(getline(1, 100), 'v:val =~# ''\m^\s*#\s*include''')
+
+    " search current buffer
+    for line in lines
+        let file = matchstr(line, '\m"\zs\S\+\ze"')
+        if file !=# ''
+            call add(files, file)
+            continue
+        endif
+
+        for handler in s:handlers
+            if line =~# handler['regex']
+                let includes .= call(handler['func'], handler['args'])
+                call add(found, handler['regex'])
+                break
+            endif
+        endfor
+    endfor
+
+    " search included headers
+    for hfile in files
+        if hfile !=# ''
+            let filename = expand('%:p:h', 1) . syntastic#util#Slash() . hfile
+
+            try
+                let lines = readfile(filename, '', 100)
+            catch /\m^Vim\%((\a\+)\)\=:E484/
+                continue
+            endtry
+
+            call filter(lines, 'v:val =~# ''\m^\s*#\s*include''')
+
+            for handler in s:handlers
+                if index(found, handler['regex']) != -1
+                    continue
+                endif
+
+                for line in lines
+                    if line =~# handler['regex']
+                        let includes .= call(handler['func'], handler['args'])
+                        call add(found, handler['regex'])
+                        break
+                    endif
+                endfor
+            endfor
+        endif
+    endfor
+
+    return includes
+endfunction " }}}2
+
+" }}}1
+
+" default include directories
+let s:default_includes = [
+    \ '.',
+    \ '..',
+    \ 'include',
+    \ 'includes',
+    \ '..' . syntastic#util#Slash() . 'include',
+    \ '..' . syntastic#util#Slash() . 'includes' ]
+
+call s:_init()
+
+let &cpo = s:save_cpo
+unlet s:save_cpo
+
+" vim: set sw=4 sts=4 et fdm=marker:

+ 222 - 0
vim/plugged/syntastic/autoload/syntastic/log.vim

@@ -0,0 +1,222 @@
+if exists('g:loaded_syntastic_log_autoload') || !exists('g:loaded_syntastic_plugin')
+    finish
+endif
+let g:loaded_syntastic_log_autoload = 1
+
+let s:save_cpo = &cpo
+set cpo&vim
+
+let s:one_time_notices_issued = []
+
+" Public functions {{{1
+
+function! syntastic#log#info(msg) abort " {{{2
+    echomsg 'syntastic: info: ' . a:msg
+endfunction " }}}2
+
+function! syntastic#log#warn(msg) abort " {{{2
+    echohl WarningMsg
+    echomsg 'syntastic: warning: ' . a:msg
+    echohl None
+endfunction " }}}2
+
+function! syntastic#log#error(msg) abort " {{{2
+    execute 'normal! \<Esc>'
+    echohl ErrorMsg
+    echomsg 'syntastic: error: ' . a:msg
+    echohl None
+endfunction " }}}2
+
+function! syntastic#log#oneTimeWarn(msg) abort " {{{2
+    if index(s:one_time_notices_issued, a:msg) >= 0
+        return
+    endif
+
+    call add(s:one_time_notices_issued, a:msg)
+    call syntastic#log#warn(a:msg)
+endfunction " }}}2
+
+" @vimlint(EVL102, 1, l:OLD_VAR)
+function! syntastic#log#deprecationWarn(old, new, ...) abort " {{{2
+    if exists('g:syntastic_' . a:old) && !exists('g:syntastic_' . a:new)
+        let msg = 'variable g:syntastic_' . a:old . ' is deprecated, please use '
+
+        if a:0
+            let OLD_VAR = g:syntastic_{a:old}
+            try
+                let NEW_VAR = eval(a:1)
+                let msg .= 'in its stead: let g:syntastic_' . a:new . ' = ' . string(NEW_VAR)
+                let g:syntastic_{a:new} = NEW_VAR
+            catch
+                let msg .= 'g:syntastic_' . a:new . ' instead'
+            endtry
+        else
+            let msg .= 'g:syntastic_' . a:new . ' instead'
+            let g:syntastic_{a:new} = g:syntastic_{a:old}
+        endif
+
+        call syntastic#log#oneTimeWarn(msg)
+    endif
+endfunction " }}}2
+" @vimlint(EVL102, 0, l:OLD_VAR)
+
+function! syntastic#log#debug(level, msg, ...) abort " {{{2
+    if !s:_isDebugEnabled(a:level)
+        return
+    endif
+
+    let leader = s:_log_timestamp()
+    call s:_logRedirect(1)
+
+    if a:0
+        " filter out dictionary functions
+        echomsg leader . a:msg . ' ' .
+            \ strtrans(string(type(a:1) == type({}) || type(a:1) == type([]) ?
+            \ filter(copy(a:1), 'type(v:val) != type(function("tr"))') : a:1))
+    else
+        echomsg leader . a:msg
+    endif
+
+    call s:_logRedirect(0)
+endfunction " }}}2
+
+function! syntastic#log#debugShowOptions(level, names) abort " {{{2
+    if !s:_isDebugEnabled(a:level)
+        return
+    endif
+
+    let leader = s:_log_timestamp()
+    call s:_logRedirect(1)
+
+    let vlist = copy(type(a:names) == type('') ? [a:names] : a:names)
+    let add_shell = index(vlist, 'shell') >= 0 && &shell !=# syntastic#util#var('shell')
+    if !empty(vlist)
+        call map(vlist, "'&' . v:val . ' = ' . strtrans(string(eval('&' . v:val))) . (s:_is_modified(v:val) ? ' (!)' : '')")
+        if add_shell
+            call add(vlist, 'u:shell = ' . strtrans(string(syntastic#util#var('shell'))) . ' (!)')
+        endif
+        echomsg leader . join(vlist, ', ')
+    endif
+    call s:_logRedirect(0)
+endfunction " }}}2
+
+function! syntastic#log#debugShowVariables(level, names) abort " {{{2
+    if !s:_isDebugEnabled(a:level)
+        return
+    endif
+
+    let leader = s:_log_timestamp()
+    call s:_logRedirect(1)
+
+    let vlist = type(a:names) == type('') ? [a:names] : a:names
+    for name in vlist
+        let msg = s:_format_variable(name)
+        if msg !=# ''
+            echomsg leader . msg
+        endif
+    endfor
+
+    call s:_logRedirect(0)
+endfunction " }}}2
+
+function! syntastic#log#debugDump(level) abort " {{{2
+    if !s:_isDebugEnabled(a:level)
+        return
+    endif
+
+    call syntastic#log#debugShowVariables( a:level, sort(keys(g:_SYNTASTIC_DEFAULTS)) )
+endfunction " }}}2
+
+function! syntastic#log#ndebug(level, title, messages) abort " {{{2
+    if s:_isDebugEnabled(a:level)
+        return
+    endif
+
+    call syntastic#log#error(a:title)
+    if type(a:messages) == type([])
+        for msg in a:messages
+            echomsg msg
+        endfor
+    else
+        echomsg a:messages
+    endif
+endfunction " }}}2
+
+" }}}1
+
+" Private functions {{{1
+
+function! s:_isDebugEnabled_smart(level) abort " {{{2
+    return and(g:syntastic_debug, a:level)
+endfunction " }}}2
+
+function! s:_isDebugEnabled_dumb(level) abort " {{{2
+    " poor man's bit test for bit N, assuming a:level == 2**N
+    return (g:syntastic_debug / a:level) % 2
+endfunction " }}}2
+
+let s:_isDebugEnabled = function(exists('*and') ? 's:_isDebugEnabled_smart' : 's:_isDebugEnabled_dumb')
+lockvar s:_isDebugEnabled
+
+function! s:_logRedirect(on) abort " {{{2
+    if exists('g:syntastic_debug_file')
+        if a:on
+            try
+                execute 'redir >> ' . fnameescape(expand(g:syntastic_debug_file, 1))
+            catch /\m^Vim\%((\a\+)\)\=:/
+                silent! redir END
+                unlet g:syntastic_debug_file
+            endtry
+        else
+            silent! redir END
+        endif
+    endif
+endfunction " }}}2
+
+" }}}1
+
+" Utilities {{{1
+
+function! s:_log_timestamp_smart() abort " {{{2
+    return printf('syntastic: %f: ', reltimefloat(reltime(g:_SYNTASTIC_START)))
+endfunction " }}}2
+
+function! s:_log_timestamp_dumb() abort " {{{2
+    return 'syntastic: ' . split(reltimestr(reltime(g:_SYNTASTIC_START)))[0] . ': '
+endfunction " }}}2
+
+let s:_log_timestamp = function(has('float') && exists('*reltimefloat') ? 's:_log_timestamp_smart' : 's:_log_timestamp_dumb')
+lockvar s:_log_timestamp
+
+function! s:_format_variable(name) abort " {{{2
+    let vals = []
+    if exists('g:syntastic_' . a:name)
+        call add(vals, 'g:syntastic_' . a:name . ' = ' . strtrans(string(g:syntastic_{a:name})))
+    endif
+    if exists('b:syntastic_' . a:name)
+        call add(vals, 'b:syntastic_' . a:name . ' = ' . strtrans(string(b:syntastic_{a:name})))
+    endif
+
+    return join(vals, ', ')
+endfunction " }}}2
+
+function! s:_is_modified(name) abort " {{{2
+    if !exists('s:option_defaults')
+        let s:option_defaults = {}
+    endif
+    if !has_key(s:option_defaults, a:name)
+        let opt_save = eval('&' . a:name)
+        execute 'set ' . a:name . '&'
+        let s:option_defaults[a:name] = eval('&' . a:name)
+        execute 'let &' . a:name . ' = ' . string(opt_save)
+    endif
+
+    return s:option_defaults[a:name] !=# eval('&' . a:name)
+endfunction " }}}2
+
+" }}}1
+
+let &cpo = s:save_cpo
+unlet s:save_cpo
+
+" vim: set sw=4 sts=4 et fdm=marker:

+ 84 - 0
vim/plugged/syntastic/autoload/syntastic/postprocess.vim

@@ -0,0 +1,84 @@
+if exists('g:loaded_syntastic_postprocess_autoload') || !exists('g:loaded_syntastic_plugin')
+    finish
+endif
+let g:loaded_syntastic_postprocess_autoload = 1
+
+let s:save_cpo = &cpo
+set cpo&vim
+
+" Public functions {{{1
+
+" merge consecutive blanks
+function! syntastic#postprocess#compressWhitespace(errors) abort " {{{2
+    for e in a:errors
+        let e['text'] = substitute(e['text'], "\001", '', 'g')
+        let e['text'] = substitute(e['text'], '\n', ' ', 'g')
+        let e['text'] = substitute(e['text'], '\m\s\{2,}', ' ', 'g')
+        let e['text'] = substitute(e['text'], '\m^\s\+', '', '')
+        let e['text'] = substitute(e['text'], '\m\s\+$', '', '')
+    endfor
+
+    return a:errors
+endfunction " }}}2
+
+" remove spurious CR under Cygwin
+function! syntastic#postprocess#cygwinRemoveCR(errors) abort " {{{2
+    if has('win32unix')
+        for e in a:errors
+            let e['text'] = substitute(e['text'], '\r', '', 'g')
+        endfor
+    endif
+
+    return a:errors
+endfunction " }}}2
+
+" decode XML entities
+function! syntastic#postprocess#decodeXMLEntities(errors) abort " {{{2
+    for e in a:errors
+        let e['text'] = syntastic#util#decodeXMLEntities(e['text'])
+    endfor
+
+    return a:errors
+endfunction " }}}2
+
+" filter out errors referencing other files
+function! syntastic#postprocess#filterForeignErrors(errors) abort " {{{2
+    return filter(copy(a:errors), 'get(v:val, "bufnr") == ' . bufnr(''))
+endfunction " }}}2
+
+" make sure line numbers are not past end of buffers
+" XXX: this loads all referenced buffers in memory
+function! syntastic#postprocess#guards(errors) abort " {{{2
+    let buffers = syntastic#util#unique(map(filter(copy(a:errors), 'v:val["valid"]'), 'str2nr(v:val["bufnr"])'))
+
+    let guards = {}
+    for b in buffers
+        let guards[b] = len(getbufline(b, 1, '$'))
+    endfor
+
+    for e in a:errors
+        if e['valid'] && e['lnum'] > guards[e['bufnr']]
+            let e['lnum'] = guards[e['bufnr']]
+        endif
+    endfor
+
+    return a:errors
+endfunction " }}}2
+
+" convert error messages from UTF-8 to the current encoding
+function! syntastic#postprocess#iconv(errors) abort " {{{2
+    if has('iconv') && &encoding !=# '' && &encoding !=# 'utf-8'
+        for e in a:errors
+            let e['text'] = iconv(e['text'], "utf-8", &encoding)
+        endfor
+    endif
+
+    return a:errors
+endfunction " }}}2
+
+" }}}1
+
+let &cpo = s:save_cpo
+unlet s:save_cpo
+
+" vim: set sw=4 sts=4 et fdm=marker:

+ 809 - 0
vim/plugged/syntastic/autoload/syntastic/preprocess.vim

@@ -0,0 +1,809 @@
+if exists('g:loaded_syntastic_preprocess_autoload') || !exists('g:loaded_syntastic_plugin')
+    finish
+endif
+let g:loaded_syntastic_preprocess_autoload = 1
+
+let s:save_cpo = &cpo
+set cpo&vim
+
+" Public functions {{{1
+
+function! syntastic#preprocess#bandit(errors) abort " {{{2
+    let out = []
+    let json = s:_decode_JSON(join(a:errors, ''))
+
+    if type(json) == type({}) && has_key(json, 'results') && type(json['results']) == type([])
+        for issue in json['results']
+            if type(issue) == type({})
+                try
+                    call add(out,
+                        \ issue['filename'] . ':' .
+                        \ issue['line_number'] . ':' .
+                        \ { 'LOW': 'I', 'MEDIUM': 'W', 'HIGH': 'E' }[issue['issue_severity']] . ':' .
+                        \ issue['test_id'][1:] . ':' .
+                        \ issue['issue_text'] .
+                        \ ' [' . issue['test_name'] .  '] (confidence: ' . issue['issue_confidence'] . ')')
+                catch /\m^Vim\%((\a\+)\)\=:E716/
+                    call syntastic#log#warn('checker python/bandit: unrecognized error item ' . string(issue))
+                    let out = []
+                    break
+                endtry
+            else
+                call syntastic#log#warn('checker python/bandit: unrecognized error item ' . string(issue))
+            endif
+        endfor
+    else
+        call syntastic#log#warn('checker python/bandit: unrecognized error format (crashed checker?)')
+    endif
+
+    return out
+endfunction " }}}2
+
+function! syntastic#preprocess#cabal(errors) abort " {{{2
+    let out = []
+    let star = 0
+    for err in a:errors
+        if star
+            if err ==# ''
+                let star = 0
+            else
+                let out[-1] .= ' ' . err
+            endif
+        else
+            call add(out, err)
+            if err =~# '\m^*\s'
+                let star = 1
+            endif
+        endif
+    endfor
+    return out
+endfunction " }}}2
+
+function! syntastic#preprocess#checkstyle(errors) abort " {{{2
+    let out = []
+    let fname = expand('%', 1)
+    for err in a:errors
+        if match(err, '\m<error\>') > -1
+            let line = str2nr(matchstr(err, '\m\<line="\zs\d\+\ze"'))
+            if line == 0
+                continue
+            endif
+
+            let col = str2nr(matchstr(err, '\m\<column="\zs\d\+\ze"'))
+
+            let type = matchstr(err, '\m\<severity="\zs.\ze')
+            if type !~? '^[EW]'
+                let type = 'E'
+            endif
+
+            let message = syntastic#util#decodeXMLEntities(matchstr(err, '\m\<message="\zs[^"]\+\ze"'))
+
+            call add(out, join([fname, type, line, col, message], ':'))
+        elseif match(err, '\m<file name="') > -1
+            let fname = syntastic#util#decodeXMLEntities(matchstr(err, '\v\<file name\="\zs[^"]+\ze"'))
+        endif
+    endfor
+    return out
+endfunction " }}}2
+
+function! syntastic#preprocess#cppcheck(errors) abort " {{{2
+    return map(copy(a:errors), 'substitute(v:val, ''\v^\[[^]]+\]\zs( -\> \[[^]]+\])+\ze:'', "", "")')
+endfunction " }}}2
+
+function! syntastic#preprocess#dockerfile_lint(errors) abort " {{{2
+    let out = []
+    let json = s:_decode_JSON(join(a:errors, ''))
+
+    if type(json) == type({})
+        try
+            let data = json['error']['data'] + json['warn']['data'] + json['info']['data']
+            for e in data
+                let type = toupper(e['level'][0])
+                if type ==# 'I'
+                    let type = 'W'
+                    let style = 1
+                else
+                    let style = 0
+                endif
+
+                let line = get(e, 'line', 1)
+                let message = e['message']
+                if has_key(e, 'description') && e['description'] !=# 'None'
+                    let message = message . '. ' . e['description']
+                endif
+
+                let msg =
+                    \ type . ':' .
+                    \ style . ':' .
+                    \ line . ':' .
+                    \ message
+                call add(out, msg)
+            endfor
+        catch /\m^Vim\%((\a\+)\)\=:E716/
+            call syntastic#log#warn('checker dockerfile/dockerfile_lint: unrecognized error format (crashed checker?)')
+            let out = []
+        endtry
+    else
+        call syntastic#log#warn('checker dockerfile/dockerfile_lint: unrecognized error format (crashed checker?)')
+    endif
+    return out
+endfunction " }}}2
+
+function! syntastic#preprocess#dscanner(errors) abort " {{{2
+    let idx = 0
+    while idx < len(a:errors) && a:errors[idx][0] !=# '{'
+        let idx += 1
+    endwhile
+    let errs = s:_decode_JSON(join(a:errors[idx :], ''))
+
+    let out = []
+    if type(errs) == type({}) && has_key(errs, 'issues') && type(errs['issues']) == type([])
+        for issue in errs['issues']
+            try
+                call add(out,
+                    \ issue['fileName'] . ':' .
+                    \ issue['line'] . ':' .
+                    \ issue['column'] . ':' .
+                    \ issue['message'] . ' [' . issue['key'] . ']')
+            catch /\m^Vim\%((\a\+)\)\=:E716/
+                call syntastic#log#warn('checker d/dscanner: unrecognized error item ' . string(issue))
+                let out = []
+                break
+            endtry
+        endfor
+    else
+        call syntastic#log#warn('checker d/dscanner: unrecognized error format (crashed checker?)')
+    endif
+
+    return out
+endfunction " }}}2
+
+function! syntastic#preprocess#flow(errors) abort " {{{2
+    let idx = 0
+    while idx < len(a:errors) && a:errors[idx][0] !=# '{'
+        let idx += 1
+    endwhile
+    let errs = s:_decode_JSON(join(a:errors[idx :], ''))
+
+    let out = []
+    if type(errs) == type({}) && has_key(errs, 'errors') && type(errs['errors']) == type([])
+        for e in errs['errors']
+            if type(e) == type({}) && has_key(e, 'message') && type(e['message']) == type([]) && len(e['message'])
+                let m = e['message'][0]
+                let t = e['message'][1:]
+
+                try
+                    let msg =
+                        \ m['path'] . ':' .
+                        \ m['line'] . ':' .
+                        \ m['start'] . ':' .
+                        \ (m['line'] ==# m['endline'] && str2nr(m['end']) > 0 ? m['end'] . ':' : '') .
+                        \ ' ' . m['descr']
+
+                    if len(t)
+                        let msg .= ' ' . join(map(t,
+                            \ 'v:val["descr"] . " (" . v:val["path"] . ":" . v:val["line"] . ":" . v:val["start"] . ' .
+                            \ '"," . (v:val["line"] !=# v:val["endline"] ? v:val["endline"] . ":" : "") . ' .
+                            \ 'v:val["end"] . ")"'))
+                    endif
+
+                    let msg = substitute(msg, '\r', '', 'g')
+                    let msg = substitute(msg, '\n', ' ', 'g')
+
+                    call add(out, msg)
+                catch /\m^Vim\%((\a\+)\)\=:E716/
+                    call syntastic#log#warn('checker javascript/flow: unrecognized error format (crashed checker?)')
+                    let out = []
+                    break
+                endtry
+            else
+                call syntastic#log#warn('checker javascript/flow: unrecognized error format (crashed checker?)')
+                let out = []
+                break
+            endif
+        endfor
+    else
+        call syntastic#log#warn('checker javascript/flow: unrecognized error format (crashed checker?)')
+    endif
+
+    return out
+endfunction " }}}2
+
+function! syntastic#preprocess#iconv(errors) abort " {{{2
+    return
+        \ has('iconv') && &encoding !=# '' && &encoding !=# 'utf-8' ?
+        \       map(a:errors, 'iconv(v:val, "utf-8", &encoding)') :
+        \       a:errors
+endfunction " }}}2
+
+function! syntastic#preprocess#jscs(errors) abort " {{{2
+    let errs = join(a:errors, '')
+    if errs ==# ''
+        return []
+    endif
+
+    let json = s:_decode_JSON(errs)
+
+    let out = []
+    if type(json) == type({})
+        for fname in keys(json)
+            if type(json[fname]) == type([])
+                for e in json[fname]
+                    try
+                        let e['message'] = substitute(e['message'], "\n", ' ', 'g')
+                        cal add(out, fname . ':' . e['line'] . ':' . e['column'] . ':' . e['message'])
+                    catch /\m^Vim\%((\a\+)\)\=:E716/
+                        call syntastic#log#warn('checker javascript/jscs: unrecognized error item ' . string(e))
+                        let out = []
+                    endtry
+                endfor
+            else
+                call syntastic#log#warn('checker javascript/jscs: unrecognized error format (crashed checker?)')
+            endif
+        endfor
+    else
+        call syntastic#log#warn('checker javascript/jscs: unrecognized error format (crashed checker?)')
+    endif
+    return out
+endfunction " }}}2
+
+function! syntastic#preprocess#killEmpty(errors) abort " {{{2
+    return filter(copy(a:errors), 'v:val !=# ""')
+endfunction " }}}2
+
+function! syntastic#preprocess#lynt(errors) abort " {{{2
+    let errs = join(a:errors, '')
+    if errs ==# ''
+        return []
+    endif
+
+    let json = s:_decode_JSON(errs)
+
+    let out = []
+    if type(json) == type([])
+        for err in json
+            if type(err) == type({}) && type(get(err, 'filePath')) == type('') && type(get(err, 'errors')) == type([])
+                let fname = get(err, 'filePath')
+
+                for e in get(err, 'errors')
+                    if type(e) == type({})
+                        try
+                            let line = e['line']
+                            let col  = e['column']
+                            let ecol = line == get(e, 'endLine') ? get(e, 'endColumn') : 0
+                            let msg  = e['message'] . ' [' . e['ruleName'] . ']'
+
+                            cal add(out, join([fname, line, col, ecol, msg], ':'))
+                        catch /\m^Vim\%((\a\+)\)\=:E716/
+                            call syntastic#log#warn('checker javascript/lynt: unrecognized error item ' . string(e))
+                        endtry
+                    else
+                        call syntastic#log#warn('checker javascript/lynt unrecognized error item ' . string(e))
+                    endif
+                endfor
+            endif
+        endfor
+    else
+        call syntastic#log#warn('checker javascript/lynt unrecognized error format (crashed checker?)')
+    endif
+    return out
+endfunction " }}}2
+
+function! syntastic#preprocess#perl(errors) abort " {{{2
+    let out = []
+
+    for e in a:errors
+        let parts = matchlist(e, '\v^(.*)\sat\s(.{-})\sline\s(\d+)(.*)$')
+        if !empty(parts)
+            call add(out, parts[2] . ':' . parts[3] . ':' . parts[1] . parts[4])
+        endif
+    endfor
+
+    return syntastic#util#unique(out)
+endfunction " }}}2
+
+function! syntastic#preprocess#prospector(errors) abort " {{{2
+    let errs = join(a:errors, '')
+    if errs ==# ''
+        return []
+    endif
+
+    let json = s:_decode_JSON(errs)
+
+    let out = []
+    if type(json) == type({}) && has_key(json, 'messages')
+        if type(json['messages']) == type([])
+            for e in json['messages']
+                if type(e) == type({})
+                    try
+                        if e['source'] ==# 'pylint'
+                            let e['location']['character'] += 1
+                        endif
+
+                        let msg =
+                            \ e['location']['path'] . ':' .
+                            \ e['location']['line'] . ':' .
+                            \ e['location']['character'] . ': ' .
+                            \ e['code'] . ' ' .
+                            \ e['message'] . ' ' .
+                            \ '[' . e['source'] . ']'
+
+                        call add(out, msg)
+                    catch /\m^Vim\%((\a\+)\)\=:E716/
+                        call syntastic#log#warn('checker python/prospector: unrecognized error item ' . string(e))
+                        let out = []
+                        break
+                    endtry
+                else
+                    call syntastic#log#warn('checker python/prospector: unrecognized error item ' . string(e))
+                    let out = []
+                    break
+                endif
+            endfor
+        else
+            call syntastic#log#warn('checker python/prospector: unrecognized error format (crashed checker?)')
+        endif
+    else
+        call syntastic#log#warn('checker python/prospector: unrecognized error format (crashed checker?)')
+    endif
+
+    return out
+endfunction " }}}2
+
+function! syntastic#preprocess#rparse(errors) abort " {{{2
+    let errlist = copy(a:errors)
+
+    " remove uninteresting lines and handle continuations
+    let i = 0
+    while i < len(errlist)
+        if i > 0 && errlist[i][:1] ==# '  ' && errlist[i] !~# '\m\s\+\^$'
+            let errlist[i-1] .= errlist[i][1:]
+            call remove(errlist, i)
+        elseif errlist[i] !~# '\m^\(Lint:\|Lint checking:\|Error in\) '
+            call remove(errlist, i)
+        else
+            let i += 1
+        endif
+    endwhile
+
+    let out = []
+    let fname = ''
+    for e in errlist
+        if match(e, '\m^Lint: ') == 0
+            let parts = matchlist(e, '\m^Lint: \(.*\): found on lines \([0-9, ]\+\)\(+\(\d\+\) more\)\=')
+            if len(parts) >= 3
+                for line in split(parts[2], '\m,\s*')
+                    call add(out, 'E:' . fname . ':' . line . ': ' . parts[1])
+                endfor
+            endif
+            if len(parts) >= 5 && parts[4] !=# ''
+                call add(out, 'E:' . fname . ':0: ' . parts[1] . ' - ' . parts[4] . ' messages not shown')
+            endif
+        elseif match(e, '\m^Lint checking: ') == 0
+            let fname = matchstr(e, '\m^Lint checking: \zs.*')
+        elseif match(e, '\m^Error in ') == 0
+            call add(out, substitute(e, '\m^Error in .\+ : .\+\ze:\d\+:\d\+: ', 'E:' . fname, ''))
+        endif
+    endfor
+
+    return out
+endfunction " }}}2
+
+function! syntastic#preprocess#raku(errors) abort " {{{2
+    if a:errors[0] ==# 'Syntax OK'
+        return []
+    endif
+
+    let errs = s:_decode_JSON(join(a:errors, ''))
+
+    let out = []
+    if type(errs) == type({})
+        try
+            for val in values(errs)
+                let line = get(val, 'line', 0)
+                let pos = get(val, 'pos', 0)
+                if pos && has('byte_offset')
+                    let line_pos = byte2line(pos + 1)
+                    let column = line_pos > 0 ? pos - line2byte(line_pos) + 2 : 0
+                else
+                    let column = 0
+                endif
+
+                call add(out, join([
+                    \ get(val, 'filename', ''),
+                    \ line,
+                    \ column,
+                    \ get(val, 'message', '') ], ':'))
+            endfor
+        catch /\m^Vim\%((\a\+)\)\=:E716/
+            call syntastic#log#warn('checker raku/raku: unrecognized error item ' . string(val))
+            let out = []
+        endtry
+    else
+        call syntastic#log#warn('checker raku/raku: unrecognized error format')
+    endif
+
+    return out
+endfunction " }}}2
+
+function! syntastic#preprocess#remark_lint(errors) abort " {{{2
+    let out = []
+    let fname = expand('%', 1)
+
+    for err in a:errors
+        if err =~# '\m^\f\+$'
+            let fname = err
+
+        elseif err =~# '\v^\s+\d+:\d+\s+%(warning|error)\s.*remark-lint$'
+            let parts = matchlist(err, '\v^\s+(\d+):(\d+)\s+([ew])\S+\s+(.{-})\s+(\S+)\s+remark-lint$')
+            if len(parts) >6
+                let line    = str2nr(parts[1])
+                let col     = str2nr(parts[2])
+                let type    = parts[3]
+                let message = parts[4] . ' [' . parts[5] . ']'
+                call add(out, join([fname, type, line, col, message], ':'))
+            else
+                call syntastic#log#warn('checker markdown/remark_lint: unrecognized error item ' . string(err))
+            endif
+
+        elseif err =~# '\v^\s+\d+:\d+-\d+:\d+\s+%(warning|error)\s.*remark-lint$'
+            let parts = matchlist(err, '\v^\s+(\d+):(\d+)-(\d+):(\d+)\s+([ew])\S+\s+(.{-})\s+(\S+)\s+remark-lint$')
+            if len(parts) >8
+                let line1   = str2nr(parts[1])
+                let col1    = str2nr(parts[2])
+                let line2   = str2nr(parts[3])
+                let col2    = str2nr(parts[4]) - 1
+                let type    = parts[5]
+                let message = parts[6] . ' [' . parts[7] . ']'
+                if line1 == line2
+                    call add(out, join([fname, type, line1, col1, col2, message], ':'))
+                else
+                    call add(out, join([fname, type, line1, col1, message], ':'))
+                endif
+            else
+                call syntastic#log#warn('checker markdown/remark_lint: unrecognized error item ' . string(err))
+            endif
+        endif
+    endfor
+
+    return out
+endfunction " }}}2
+
+function! syntastic#preprocess#scss_lint(errors) abort " {{{2
+    let errs = join(a:errors, '')
+    if errs ==# ''
+        return []
+    endif
+
+    let json = s:_decode_JSON(errs)
+
+    let out = []
+    if type(json) == type({})
+        for fname in keys(json)
+            if type(json[fname]) == type([])
+                for e in json[fname]
+                    try
+                        cal add(out, fname . ':' .
+                            \ e['severity'][0] . ':' .
+                            \ e['line'] . ':' .
+                            \ e['column'] . ':' .
+                            \ e['length'] . ':' .
+                            \ ( has_key(e, 'linter') ? e['linter'] . ': ' : '' ) .
+                            \ e['reason'])
+                    catch /\m^Vim\%((\a\+)\)\=:E716/
+                        call syntastic#log#warn('checker scss/scss_lint: unrecognized error item ' . string(e))
+                        let out = []
+                    endtry
+                endfor
+            else
+                call syntastic#log#warn('checker scss/scss_lint: unrecognized error format (crashed checker?)')
+            endif
+        endfor
+    else
+        call syntastic#log#warn('checker scss/scss_lint: unrecognized error format (crashed checker?)')
+    endif
+    return out
+endfunction " }}}2
+
+function! syntastic#preprocess#stylelint(errors) abort " {{{2
+    let out = []
+
+    " CssSyntaxError: /path/to/file.css:2:11: Missed semicolon
+    let parts = matchlist(a:errors[0], '\v^CssSyntaxError: (.{-1,}):(\d+):(\d+): (.+)')
+    if len(parts) > 4
+        call add(out, 'E:' . join(parts[1:4], ':'))
+    else
+        let errs = s:_decode_JSON(join(a:errors, ''))
+
+        let out = []
+        if type(errs) == type([]) && len(errs) == 1 && type(errs[0]) == type({}) &&
+            \ has_key(errs[0], 'source') && has_key(errs[0], 'warnings') && type(errs[0]['warnings']) == type([])
+
+            for e in errs[0]['warnings']
+                try
+                    let severity = type(e['severity']) == type(0) ? ['W', 'E'][e['severity']-1] : e['severity'][0]
+                    let msg =
+                        \ severity . ':' .
+                        \ errs[0]['source'] . ':' .
+                        \ e['line'] . ':' .
+                        \ e['column'] . ':' .
+                        \ e['text']
+                    call add(out, msg)
+                catch /\m^Vim\%((\a\+)\)\=:E716/
+                    call syntastic#log#warn('checker css/stylelint: unrecognized error item ' . string(e))
+                    let out = []
+                    break
+                endtry
+            endfor
+        else
+            call syntastic#log#warn('checker css/stylelint: unrecognized error format (crashed checker?)')
+        endif
+    endif
+    return out
+endfunction " }}}2
+
+function! syntastic#preprocess#tern_lint(errors) abort " {{{2
+    let errs = join(a:errors, '')
+    let json = s:_decode_JSON(errs)
+
+echomsg string(json)
+    let out = []
+    if type(json) == type({}) && has_key(json, 'messages') && type(json['messages']) == type([])
+        for e in json['messages']
+            try
+                let line_from = byte2line(e['from'] + 1)
+                if line_from > 0
+                    let line = line_from
+                    let column = e['from'] - line2byte(line_from) + 2
+                    let line_to = byte2line(e['from'] + 1)
+                    let hl = line_to == line ? e['to'] - line2byte(line_to) + 1 : 0
+                else
+                    let line = 0
+                    let column = 0
+                    let hl = 0
+                endif
+
+                if column < 0
+                    let column = 0
+                endif
+                if hl < 0
+                    let hl = 0
+                endif
+
+                call add(out,
+                    \ e['file'] . ':' .
+                    \ e['severity'][0] . ':' .
+                    \ line . ':' .
+                    \ column . ':' .
+                    \ hl . ':' .
+                    \ e['message'])
+            catch /\m^Vim\%((\a\+)\)\=:E716/
+                call syntastic#log#warn('checker javascript/tern_lint: unrecognized error item ' . string(e))
+                let out = []
+            endtry
+        endfor
+    else
+        call syntastic#log#warn('checker javascript/tern_lint: unrecognized error format (crashed checker?)')
+    endif
+
+echomsg string(out)
+    return out
+endfunction " }}}2
+
+function! syntastic#preprocess#tslint(errors) abort " {{{2
+    return map(copy(a:errors), 'substitute(v:val, ''\v^((ERROR|WARNING): )?\zs(\([^)]+\))\s(.+)$'', ''\4 \3'', "")')
+endfunction " }}}2
+
+function! syntastic#preprocess#validator(errors) abort " {{{2
+    let out = []
+    for e in a:errors
+        let parts = matchlist(e, '\v^"([^"]+)"(.+)')
+        if len(parts) >= 3
+            " URL decode, except leave alone any "+"
+            let parts[1] = substitute(parts[1], '\m%\(\x\x\)', '\=nr2char("0x".submatch(1))', 'g')
+            let parts[1] = substitute(parts[1], '\m\\"', '"', 'g')
+            let parts[1] = substitute(parts[1], '\m\\\\', '\\', 'g')
+            call add(out, '"' . parts[1] . '"' . parts[2])
+        endif
+    endfor
+    return out
+endfunction " }}}2
+
+function! syntastic#preprocess#vint(errors) abort " {{{2
+    let errs = s:_decode_JSON(join(a:errors, ''))
+
+    let out = []
+    if type(errs) == type([])
+        for e in errs
+            if type(e) == type({})
+                try
+                    let msg =
+                        \ e['file_path'] . ':' .
+                        \ e['line_number'] . ':' .
+                        \ e['column_number'] . ':' .
+                        \ e['severity'][0] . ': ' .
+                        \ e['description'] . ' (' .
+                        \ e['policy_name'] . ')'
+
+                    call add(out, msg)
+                catch /\m^Vim\%((\a\+)\)\=:E716/
+                    call syntastic#log#warn('checker vim/vint: unrecognized error item ' . string(e))
+                    let out = []
+                    break
+                endtry
+            else
+                call syntastic#log#warn('checker vim/vint: unrecognized error item ' . string(e))
+                let out = []
+                break
+            endif
+        endfor
+    else
+        call syntastic#log#warn('checker vim/vint: unrecognized error format (crashed checker?)')
+    endif
+
+    return out
+endfunction " }}}2
+
+" }}}1
+
+" Workarounds {{{1
+
+" In errorformat, \ or % following %f make it depend on isfname.  The default
+" setting of isfname is crafted to work with completion, rather than general
+" filename matching.  The result for syntastic is that filenames containing
+" spaces (or a few other special characters) can't be matched.
+"
+" Fixing isfname to address this problem would depend on the set of legal
+" characters for filenames on the filesystem the project's files lives on.
+" Inferring the kind of filesystem a file lives on, in advance to parsing the
+" file's name, is an interesting problem (think f.i. a file loaded from a VFAT
+" partition, mounted on Linux).  A problem syntastic is not prepared to solve.
+"
+" As a result, the functions below exist for the only reason to avoid using
+" things like %f\, in errorformat.
+"
+" References:
+" https://groups.google.com/forum/#!topic/vim_dev/pTKmZmouhio
+" https://vimhelp.appspot.com/quickfix.txt.html#error-file-format
+
+function! syntastic#preprocess#basex(errors) abort " {{{2
+    let out = []
+    let idx = 0
+    while idx < len(a:errors)
+        let parts = matchlist(a:errors[idx], '\v^\[\S+\] Stopped at (.+), (\d+)/(\d+):')
+        if len(parts) > 3
+            let err = parts[1] . ':' . parts[2] . ':' . parts[3] . ':'
+            let parts = matchlist(a:errors[idx+1], '\v^\[(.)\D+(\d+)\] (.+)')
+            if len(parts) > 3
+                let err .= (parts[1] ==? 'W' || parts[1] ==? 'E' ? parts[1] : 'E') . ':' . parts[2] . ':' . parts[3]
+                call add(out, err)
+                let idx +=1
+            endif
+        elseif a:errors[idx] =~# '\m^\['
+            " unparseable errors
+            call add(out, a:errors[idx])
+        endif
+        let idx +=1
+    endwhile
+    return out
+endfunction " }}}2
+
+function! syntastic#preprocess#bro(errors) abort " {{{2
+    let out = []
+    for e in a:errors
+        let parts = matchlist(e, '\v^%(fatal )?(error|warning) in (.{-1,}), line (\d+): (.+)')
+        if len(parts) > 4
+            let parts[1] = parts[1][0]
+            call add(out, join(parts[1:4], ':'))
+        endif
+    endfor
+    return out
+endfunction " }}}2
+
+function! syntastic#preprocess#coffeelint(errors) abort " {{{2
+    let out = []
+    for e in a:errors
+        let parts = matchlist(e, '\v^(.{-1,}),(\d+)%(,\d*)?,(error|warn),(.+)')
+        if len(parts) > 4
+            let parts[3] = parts[3][0]
+            call add(out, join(parts[1:4], ':'))
+        endif
+    endfor
+    return out
+endfunction " }}}2
+
+function! syntastic#preprocess#mypy(errors) abort " {{{2
+    let out = []
+    for e in a:errors
+        " column numbers
+        let parts = matchlist(e, '\v^(.{-1,}):(\d+):(\d+): ([ew])%(rror|arning): (.+)')
+        if len(parts) > 5
+            let parts[3] += 1
+            call add(out, join(parts[1:5], ':'))
+            continue
+        endif
+
+        " no column numbers
+        let parts = matchlist(e, '\v^(.{-1,}):(\d+): ([ew])%(rror|arning): (.+)')
+        if len(parts) > 4
+            call add(out, join(parts[1:4], ':'))
+            continue
+        endif
+
+        " obsolete format
+        let parts = matchlist(e, '\v^(.{-1,}), line (\d+): (.+)')
+        if len(parts) > 3
+            let parts[4] = parts[3]
+            let parts[3] = 'e'
+            call add(out, join(parts[1:4], ':'))
+        endif
+    endfor
+    return out
+endfunction " }}}2
+
+function! syntastic#preprocess#nix(errors) abort " {{{2
+    let out = []
+    for e in a:errors
+        let parts = matchlist(e, '\v^(.{-1,}), at (.{-1,}):(\d+):(\d+)$')
+        if len(parts) > 4
+            call add(out, join(parts[2:4], ':') . ':' . parts[1])
+            continue
+        endif
+
+        let parts = matchlist(e, '\v^(.{-1,}) at (.{-1,}), line (\d+):')
+        if len(parts) > 3
+            call add(out, parts[2] . ':' . parts[3] . ':' . parts[1])
+            continue
+        endif
+
+        let parts = matchlist(e, '\v^error: (.{-1,}), in (.{-1,})$')
+        if len(parts) > 2
+            call add(out, parts[2] . ':' . parts[1])
+        endif
+    endfor
+    return out
+endfunction " }}}2
+
+" }}}1
+
+" Private functions {{{1
+
+" @vimlint(EVL102, 1, l:true)
+" @vimlint(EVL102, 1, l:false)
+" @vimlint(EVL102, 1, l:null)
+function! s:_decode_JSON(json) abort " {{{2
+    if a:json ==# ''
+        return []
+    endif
+
+    " The following is inspired by https://github.com/MarcWeber/vim-addon-manager and
+    " http://stackoverflow.com/questions/17751186/iterating-over-a-string-in-vimscript-or-parse-a-json-file/19105763#19105763
+    " A hat tip to Marc Weber for this trick
+    if substitute(a:json, '\v\"%(\\.|[^"\\])*\"|true|false|null|[+-]?\d+%(\.\d+%([Ee][+-]?\d+)?)?', '', 'g') !~# "[^,:{}[\\] \t]"
+        " JSON artifacts
+        let true = 1
+        let false = 0
+        let null = ''
+
+        try
+            let object = eval(a:json)
+        catch
+            " malformed JSON
+            let object = ''
+        endtry
+    else
+        let object = ''
+    endif
+
+    return object
+endfunction " }}}2
+" @vimlint(EVL102, 0, l:true)
+" @vimlint(EVL102, 0, l:false)
+" @vimlint(EVL102, 0, l:null)
+
+" }}}1
+
+let &cpo = s:save_cpo
+unlet s:save_cpo
+
+" vim: set sw=4 sts=4 et fdm=marker:

+ 640 - 0
vim/plugged/syntastic/autoload/syntastic/util.vim

@@ -0,0 +1,640 @@
+if exists('g:loaded_syntastic_util_autoload') || !exists('g:loaded_syntastic_plugin')
+    finish
+endif
+let g:loaded_syntastic_util_autoload = 1
+
+let s:save_cpo = &cpo
+set cpo&vim
+
+" Public functions {{{1
+
+function! syntastic#util#isRunningWindows() abort " {{{2
+    return has('win16') || has('win32') || has('win64')
+endfunction " }}}2
+
+function! syntastic#util#DevNull() abort " {{{2
+    if syntastic#util#isRunningWindows()
+        return 'NUL'
+    endif
+    return '/dev/null'
+endfunction " }}}2
+
+" Get directory separator
+function! syntastic#util#Slash() abort " {{{2
+    return (!exists('+shellslash') || &shellslash) ? '/' : '\'
+endfunction " }}}2
+
+function! syntastic#util#CygwinPath(path) abort " {{{2
+    return substitute(syntastic#util#system('cygpath -m ' . syntastic#util#shescape(a:path)), "\n", '', 'g')
+endfunction " }}}2
+
+function! syntastic#util#system(command) abort " {{{2
+    let old_shell = &shell
+    let old_lc_messages = $LC_MESSAGES
+    let old_lc_all = $LC_ALL
+
+    let &shell = syntastic#util#var('shell')
+    let $LC_MESSAGES = 'C'
+    let $LC_ALL = ''
+
+    let crashed = 0
+    let cmd_start = reltime()
+    try
+        let out = system(a:command)
+    catch
+        if v:exception =~# '\m^Vim\%((\a\+)\)\=:\%(E145\|E484\|E684\)'
+            " XXX re-throwing unmodified v:exception triggers E608
+            throw substitute(v:exception, '.*:\(E145\|E484\|E684\).*', '\1', '')
+        endif
+
+        let crashed = 1
+        call syntastic#log#error('exception running system(' . string(a:command) . '): ' . v:exception)
+        if syntastic#util#isRunningWindows()
+            call syntastic#log#debug(g:_SYNTASTIC_DEBUG_CHECKERS, '$TMP = ' . string($TMP) . ', $TEMP = ' . string($TEMP))
+        else
+            call syntastic#log#debug(g:_SYNTASTIC_DEBUG_CHECKERS, '$TERM = ' . string($TERM))
+            call syntastic#log#debug(g:_SYNTASTIC_DEBUG_CHECKERS, '$TMPDIR = ' . string($TMPDIR))
+        endif
+        call syntastic#log#debug(g:_SYNTASTIC_DEBUG_TRACE, '$PATH = ' . string($PATH))
+        call syntastic#log#debug(g:_SYNTASTIC_DEBUG_TRACE, 'getcwd() = ' . string(getcwd()))
+        call syntastic#log#debugShowOptions(g:_SYNTASTIC_DEBUG_TRACE, g:_SYNTASTIC_SHELL_OPTIONS)
+        let out = ''
+    endtry
+    let cmd_time = split(reltimestr(reltime(cmd_start)))[0]
+
+    let $LC_ALL = old_lc_all
+    let $LC_MESSAGES = old_lc_messages
+
+    let &shell = old_shell
+
+    if !crashed && exists('g:_SYNTASTIC_DEBUG_TRACE')
+        call syntastic#log#debug(g:_SYNTASTIC_DEBUG_TRACE, 'system: command run in ' . cmd_time . 's')
+    endif
+
+    return out
+endfunction " }}}2
+
+" Create a temporary directory
+function! syntastic#util#tmpdir() abort " {{{2
+    let tempdir = ''
+
+    if (has('unix') || has('mac')) && executable('mktemp') && !has('win32unix')
+        " TODO: option "-t" to mktemp(1) is not portable
+        let tmp = $TMPDIR !=# '' ? $TMPDIR : $TMP !=# '' ? $TMP : '/tmp'
+        let out = split(syntastic#util#system('mktemp -q -d ' . tmp . '/vim-syntastic-' . s:_fuzz() . '-XXXXXXXX'), "\n")
+        if v:shell_error == 0 && len(out) == 1
+            let tempdir = out[0]
+        endif
+    endif
+
+    if tempdir ==# ''
+        if has('win32') || has('win64')
+            let tempdir = $TEMP . syntastic#util#Slash() . 'vim-syntastic-' . s:_fuzz()
+        elseif has('win32unix')
+            let tempdir = syntastic#util#CygwinPath('/tmp/vim-syntastic-'  . s:_fuzz())
+        elseif $TMPDIR !=# ''
+            let tempdir = $TMPDIR . '/vim-syntastic-' . s:_fuzz()
+        else
+            let tempdir = '/tmp/vim-syntastic-' . s:_fuzz()
+        endif
+
+        try
+            call mkdir(tempdir, 'p', 0700)
+        catch /\m^Vim\%((\a\+)\)\=:E739/
+            call syntastic#log#error(v:exception)
+            let tempdir = '.'
+        endtry
+    endif
+
+    return tempdir
+endfunction " }}}2
+
+" Recursively remove a directory
+function! syntastic#util#rmrf(what) abort " {{{2
+    " try to make sure we don't delete directories we didn't create
+    if a:what !~? 'vim-syntastic-'
+        return
+    endif
+
+    if  getftype(a:what) ==# 'dir'
+        call s:_delete(a:what, 'rf')
+    else
+        silent! call delete(a:what)
+    endif
+endfunction " }}}2
+
+function! syntastic#util#getbufvar(buf, name, ...) abort " {{{2
+    return a:0 ? s:_getbufvar(a:buf, a:name, a:1) : getbufvar(a:buf, a:name)
+endfunction " }}}2
+
+" Search the first 5 lines of the file for a magic number and return a map
+" containing the args and the executable
+"
+" e.g.
+"
+" #!/usr/bin/perl -f -bar
+"
+" returns
+"
+" {'exe': '/usr/bin/perl', 'args': ['-f', '-bar']}
+function! syntastic#util#parseShebang(buf) abort " {{{2
+    for lnum in range(1, 5)
+        let line = get(getbufline(a:buf, lnum), 0, '')
+        if line =~# '^#!'
+            let line = substitute(line, '\v^#!\s*(\S+/env(\s+-\S+)*\s+)?', '', '')
+            let exe = matchstr(line, '\m^\S*\ze')
+            let args = split(matchstr(line, '\m^\S*\zs.*'))
+            return { 'exe': exe, 'args': args }
+        endif
+    endfor
+
+    return { 'exe': '', 'args': [] }
+endfunction " }}}2
+
+" Get the value of a Vim variable.  Allow buffer variables to override global ones.
+function! syntastic#util#bufRawVar(buf, name, ...) abort " {{{2
+    return s:_getbufvar(a:buf, a:name, get(g:, a:name, a:0 ? a:1 : ''))
+endfunction "}}}2
+
+" Get the value of a syntastic variable.  Allow buffer variables to override global ones.
+function! syntastic#util#bufVar(buf, name, ...) abort " {{{2
+    return call('syntastic#util#bufRawVar', [a:buf, 'syntastic_' . a:name] + a:000)
+endfunction "}}}2
+
+" Get the value of a Vim variable.  Allow local variables to override global ones.
+function! syntastic#util#rawVar(name, ...) abort " {{{2
+    return get(b:, a:name, get(g:, a:name, a:0 ? a:1 : ''))
+endfunction " }}}2
+
+" Get the value of a syntastic variable.  Allow local variables to override global ones.
+function! syntastic#util#var(name, ...) abort " {{{2
+    return call('syntastic#util#rawVar', ['syntastic_' . a:name] + a:000)
+endfunction " }}}2
+
+" Parse a version string.  Return an array of version components.
+function! syntastic#util#parseVersion(version, ...) abort " {{{2
+    return map(split(matchstr( a:version, a:0 ? a:1 : '\v^\D*\zs\d+(\.\d+)+\ze' ), '\m\.'), 'str2nr(v:val)')
+endfunction " }}}2
+
+" Verify that the 'installed' version is at least the 'required' version.
+"
+" 'installed' and 'required' must be arrays. If they have different lengths,
+" the "missing" elements will be assumed to be 0 for the purposes of checking.
+"
+" See http://semver.org for info about version numbers.
+function! syntastic#util#versionIsAtLeast(installed, required) abort " {{{2
+    return syntastic#util#compareLexi(a:installed, a:required) >= 0
+endfunction " }}}2
+
+" Almost lexicographic comparison of two lists of integers. :) If lists
+" have different lengths, the "missing" elements are assumed to be 0.
+function! syntastic#util#compareLexi(a, b) abort " {{{2
+    for idx in range(max([len(a:a), len(a:b)]))
+        let a_element = str2nr(get(a:a, idx, 0))
+        let b_element = str2nr(get(a:b, idx, 0))
+        if a_element != b_element
+            return a_element > b_element ? 1 : -1
+        endif
+    endfor
+    " still here, thus everything matched
+    return 0
+endfunction " }}}2
+
+function! syntastic#util#screenWidth(str, tabstop) abort " {{{2
+    let chunks = split(a:str, "\t", 1)
+    let width = s:_width(chunks[-1])
+    for c in chunks[:-2]
+        let cwidth = s:_width(c)
+        let width += cwidth + a:tabstop - cwidth % a:tabstop
+    endfor
+    return width
+endfunction " }}}2
+
+" Print as much of a:msg as possible without "Press Enter" prompt appearing
+function! syntastic#util#wideMsg(msg) abort " {{{2
+    let old_ruler = &ruler
+    let old_showcmd = &showcmd
+
+    "This is here because it is possible for some error messages to
+    "begin with \n which will cause a "press enter" prompt.
+    let msg = substitute(a:msg, "\n", '', 'g')
+
+    "convert tabs to spaces so that the tabs count towards the window
+    "width as the proper amount of characters
+    let chunks = split(msg, "\t", 1)
+    let msg = join(map(chunks[:-2], 'v:val . repeat(" ", &tabstop - s:_width(v:val) % &tabstop)'), '') . chunks[-1]
+    let msg = strpart(msg, 0, &columns - 1)
+
+    set noruler noshowcmd
+    call syntastic#util#redraw(0)
+
+    echo msg
+
+    let &ruler = old_ruler
+    let &showcmd = old_showcmd
+endfunction " }}}2
+
+" Check whether a buffer is loaded, listed, and not hidden
+function! syntastic#util#bufIsActive(buffer) abort " {{{2
+    " convert to number, or hell breaks loose
+    let buf = str2nr(a:buffer)
+
+    if !bufloaded(buf) || !buflisted(buf)
+        return 0
+    endif
+
+    " get rid of hidden buffers
+    for tab in range(1, tabpagenr('$'))
+        if index(tabpagebuflist(tab), buf) >= 0
+            return 1
+        endif
+    endfor
+
+    return 0
+endfunction " }}}2
+
+" Start in directory a:where and walk up the parent folders until it finds a
+" file named a:what; return path to that file
+function! syntastic#util#findFileInParent(what, where) abort " {{{2
+    let old_suffixesadd = &suffixesadd
+    let &suffixesadd = ''
+    let file = findfile(a:what, escape(a:where, ' ,') . ';')
+    let &suffixesadd = old_suffixesadd
+    return file
+endfunction " }}}2
+
+" Start in directory a:where and walk up the parent folders until it finds a
+" file matching a:what; return path to that file
+function! syntastic#util#findGlobInParent(what, where) abort " {{{2
+    let here = fnamemodify(a:where, ':p')
+
+    let root = syntastic#util#Slash()
+    if syntastic#util#isRunningWindows() && here[1] ==# ':'
+        " The drive letter is an ever-green source of fun.  That's because
+        " we don't care about running syntastic on Amiga these days. ;)
+        let root = fnamemodify(root, ':p')
+        let root = here[0] . root[1:]
+    endif
+
+    let old = ''
+    while here !=# ''
+        try
+            " Vim 7.4.279 and later
+            let p = globpath(here, a:what, 1, 1)
+        catch /\m^Vim\%((\a\+)\)\=:E118/
+            let p = split(globpath(here, a:what, 1), "\n")
+        endtry
+
+        if !empty(p)
+            return fnamemodify(p[0], ':p')
+        elseif here ==? root || here ==? old
+            break
+        endif
+
+        let old = here
+
+        " we use ':h:h' rather than ':h' since ':p' adds a trailing '/'
+        " if 'here' is a directory
+        let here = fnamemodify(here, ':p:h:h')
+    endwhile
+
+    return ''
+endfunction " }}}2
+
+" Returns the buffer number of a filename
+" @vimlint(EVL104, 1, l:old_shellslash)
+function! syntastic#util#fname2buf(fname) abort " {{{2
+    if exists('+shellslash')
+        " bufnr() can't cope with backslashes
+        let old_shellslash = &shellslash
+        let &shellslash = 1
+    endif
+
+    " this is a best-effort attempt to escape file patterns (cf. :h file-pattern)
+    " XXX it fails for filenames containing something like \{2,3}
+    let buf = -1
+    for md in [':~:.', ':~', ':p']
+        try
+            " Older versions of Vim can throw E94 here
+            let buf = bufnr('^' . escape(fnamemodify(a:fname, md), '\*?,{}[') . '$')
+        catch
+            " catch everything
+        endtry
+        if buf != -1
+            break
+        endif
+    endfor
+    if buf == -1
+        " XXX definitely wrong, but hope is the last thing to die :)
+        let buf = bufnr(fnamemodify(a:fname, ':p'))
+    endif
+
+    if exists('+shellslash')
+        let &shellslash = old_shellslash
+    endif
+
+    return buf
+endfunction " }}}2
+" @vimlint(EVL104, 0, l:old_shellslash)
+
+" Returns unique elements in a list
+function! syntastic#util#unique(list) abort " {{{2
+    let seen = {}
+    let uniques = []
+    for e in a:list
+        let k = string(e)
+        if !has_key(seen, k)
+            let seen[k] = 1
+            call add(uniques, e)
+        endif
+    endfor
+    return uniques
+endfunction " }}}2
+
+" A less noisy shellescape()
+function! syntastic#util#shescape(string) abort " {{{2
+    return a:string =~# '\m^[A-Za-z0-9_/.-]\+$' ? a:string : shellescape(a:string)
+endfunction " }}}2
+
+" A less noisy shellescape(expand())
+function! syntastic#util#shexpand(string, ...) abort " {{{2
+    return syntastic#util#shescape(a:0 ? expand(a:string, a:1) : expand(a:string, 1))
+endfunction " }}}2
+
+" Escape arguments
+function! syntastic#util#argsescape(opt) abort " {{{2
+    if type(a:opt) == type('') && a:opt !=# ''
+        return [a:opt]
+    elseif type(a:opt) == type([])
+        return map(copy(a:opt), 'syntastic#util#shescape(v:val)')
+    endif
+
+    return []
+endfunction " }}}2
+
+" Decode XML entities
+function! syntastic#util#decodeXMLEntities(string) abort " {{{2
+    let str = a:string
+    let str = substitute(str, '\m&lt;', '<', 'g')
+    let str = substitute(str, '\m&gt;', '>', 'g')
+    let str = substitute(str, '\m&quot;', '"', 'g')
+    let str = substitute(str, '\m&apos;', "'", 'g')
+    let str = substitute(str, '\m&amp;', '\&', 'g')
+    return str
+endfunction " }}}2
+
+function! syntastic#util#redraw(full) abort " {{{2
+    if a:full
+        redraw!
+    else
+        redraw
+    endif
+endfunction " }}}2
+
+function! syntastic#util#dictFilter(errors, filter) abort " {{{2
+    let rules = s:_translateFilter(a:filter)
+    " call syntastic#log#debug(g:_SYNTASTIC_DEBUG_TRACE, "applying filter:", rules)
+    try
+        call filter(a:errors, rules)
+    catch /\m^Vim\%((\a\+)\)\=:E/
+        let msg = matchstr(v:exception, '\m^Vim\%((\a\+)\)\=:\zs.*')
+        call syntastic#log#error('quiet_messages: ' . msg)
+    endtry
+endfunction " }}}2
+
+" Return a [seconds, fractions] list of strings, representing the
+" (hopefully high resolution) time since program start
+function! syntastic#util#stamp() abort " {{{2
+    return split( split(reltimestr(reltime(g:_SYNTASTIC_START)))[0], '\.' )
+endfunction " }}}2
+
+function! syntastic#util#setLastTick(buf) abort " {{{2
+    call setbufvar(a:buf, 'syntastic_lasttick', getbufvar(a:buf, 'changedtick'))
+endfunction " }}}2
+
+" Add unique IDs to windows
+function! syntastic#util#setWids() abort " {{{2
+    for tab in range(1, tabpagenr('$'))
+        for win in range(1, tabpagewinnr(tab, '$'))
+            if gettabwinvar(tab, win, 'syntastic_wid') ==# ''
+                call settabwinvar(tab, win, 'syntastic_wid', s:_wid_base . s:_wid_pool)
+                let s:_wid_pool += 1
+            endif
+        endfor
+    endfor
+endfunction " }}}2
+
+function! syntastic#util#str2float(val) abort " {{{2
+    return s:_str2float(a:val)
+endfunction " }}}2
+
+function! syntastic#util#float2str(val) abort " {{{2
+    return s:_float2str(a:val)
+endfunction " }}}2
+
+" Crude printf()-like width formatter.  Handles wide characters.
+function! syntastic#util#wformat(format, str) abort " {{{2
+    if a:format ==# ''
+        return a:str
+    endif
+
+ echomsg string(a:format) . ', ' . string(a:str)
+    let specs = matchlist(a:format, '\v^(-?)(0?)(%([1-9]\d*))?%(\.(\d+))?$')
+    if len(specs) < 5
+        return a:str
+    endif
+
+    let flushleft = specs[1] ==# '-'
+    let lpad = specs[2] ==# '0' ? '0' : ' '
+    let minlen = str2nr(specs[3])
+    let maxlen = str2nr(specs[4])
+    let out = substitute(a:str, "\t", ' ', 'g')
+
+    if maxlen && s:_width(out) > maxlen
+        let chars = filter(split(out, '\zs\ze', 1), 'v:val !=# ""')
+        let out = ''
+
+        if flushleft
+            for c in chars
+                if s:_width(out . c) < maxlen
+                    let out .= c
+                else
+                    let out .= &encoding ==# 'utf-8' && &termencoding ==# 'utf-8' ? "\u2026" : '>'
+                    break
+                endif
+            endfor
+        else
+            call reverse(chars)
+            for c in chars
+                if s:_width(c . out) < maxlen
+                    let out = c . out
+                else
+                    let out = (&encoding ==# 'utf-8' && &termencoding ==# 'utf-8' ? "\u2026" : '<') . out
+                    break
+                endif
+            endfor
+        endif
+    endif
+
+    if minlen && s:_width(out) < minlen
+        if flushleft
+            let out .= repeat(' ', minlen - s:_width(out))
+        else
+            let out = repeat(lpad, minlen - s:_width(out)) . out
+        endif
+    endif
+
+    return out
+endfunction " }}}2
+
+" }}}1
+
+" Private functions {{{1
+
+function! s:_translateFilter(filters) abort " {{{2
+    let conditions = []
+    for k in keys(a:filters)
+        if type(a:filters[k]) == type([])
+            call extend(conditions, map(copy(a:filters[k]), 's:_translateElement(k, v:val)'))
+        else
+            call add(conditions, s:_translateElement(k, a:filters[k]))
+        endif
+    endfor
+
+    if conditions == []
+        let conditions = ['1']
+    endif
+    return len(conditions) == 1 ? conditions[0] : join(map(conditions, '"(" . v:val . ")"'), ' && ')
+endfunction " }}}2
+
+function! s:_translateElement(key, term) abort " {{{2
+    let fkey = a:key
+    if fkey[0] ==# '!'
+        let fkey = fkey[1:]
+        let not = 1
+    else
+        let not = 0
+    endif
+
+    if fkey ==? 'level'
+        let op = not ? ' ==? ' : ' !=? '
+        let ret = 'v:val["type"]' . op . string(a:term[0])
+    elseif fkey ==? 'type'
+        if a:term ==? 'style'
+            let op = not ? ' ==? ' : ' !=? '
+            let ret = 'get(v:val, "subtype", "")' . op . '"style"'
+        else
+            let op = not ? '!' : ''
+            let ret = op . 'has_key(v:val, "subtype")'
+        endif
+    elseif fkey ==? 'regex'
+        let op = not ? ' =~? ' : ' !~? '
+        let ret = 'v:val["text"]' . op . string(a:term)
+    elseif fkey ==? 'file' || fkey[:4] ==? 'file:'
+        let op = not ? ' =~# ' : ' !~# '
+        let ret = 'bufname(str2nr(v:val["bufnr"]))'
+        let mod = fkey[4:]
+        if mod !=# ''
+            let ret = 'fnamemodify(' . ret . ', ' . string(mod) . ')'
+        endif
+        let ret .= op . string(a:term)
+    else
+        call syntastic#log#warn('quiet_messages: ignoring invalid key ' . strtrans(string(fkey)))
+        let ret = '1'
+    endif
+    return ret
+endfunction " }}}2
+
+" strwidth() was added in Vim 7.3; if it doesn't exist, we use strlen()
+" and hope for the best :)
+let s:_width = function(exists('*strwidth') ? 'strwidth' : 'strlen')
+lockvar s:_width
+
+" @vimlint(EVL103, 1, a:flags)
+function! s:_delete_dumb(what, flags) abort " {{{2
+    if !exists('s:rmrf')
+        let s:rmrf =
+            \ has('unix') || has('mac') ? 'rm -rf' :
+            \ has('win32') || has('win64') ? 'rmdir /S /Q' :
+            \ has('win16') || has('win95') || has('dos16') || has('dos32') ? 'deltree /Y' : ''
+    endif
+
+    if s:rmrf !=# ''
+        silent! call syntastic#util#system(s:rmrf . ' ' . syntastic#util#shescape(a:what))
+    else
+        call s:_rmrf(a:what)
+    endif
+endfunction " }}}2
+" @vimlint(EVL103, 0, a:flags)
+
+" delete(dir, 'rf') was added in Vim 7.4.1107, but it didn't become usable until 7.4.1128
+let s:_delete = function(v:version > 704 || (v:version == 704 && has('patch1128')) ? 'delete' : 's:_delete_dumb')
+lockvar s:_delete
+
+function! s:_rmrf(what) abort " {{{2
+    if !exists('s:rmdir')
+        let s:rmdir = syntastic#util#shescape(get(g:, 'netrw_localrmdir', 'rmdir'))
+    endif
+
+    if getftype(a:what) ==# 'dir'
+        if filewritable(a:what) != 2
+            return
+        endif
+
+        try
+            " Vim 7.4.279 and later
+            let entries = globpath(a:what, '*', 1, 1)
+        catch /\m^Vim\%((\a\+)\)\=:E118/
+            let entries = split(globpath(a:what, '*', 1), "\n")
+        endtry
+        for f in entries
+            call s:_rmrf(f)
+        endfor
+        silent! call syntastic#util#system(s:rmdir . ' ' . syntastic#util#shescape(a:what))
+    else
+        silent! call delete(a:what)
+    endif
+endfunction " }}}2
+
+let s:_str2float = function(exists('*str2float') ? 'str2float' : 'str2nr')
+lockvar s:_str2float
+
+function! s:_float2str_smart(val) abort " {{{2
+    return printf('%.1f', a:val)
+endfunction " }}}2
+
+function! s:_float2str_dumb(val) abort " {{{2
+    return a:val
+endfunction " }}}2
+
+let s:_float2str = function(has('float') ? 's:_float2str_smart' : 's:_float2str_dumb')
+lockvar s:_float2str
+
+function! s:_getbufvar_dumb(buf, name, ...) abort " {{{2
+    let ret = getbufvar(a:buf, a:name)
+    if a:0 && type(ret) == type('') && ret ==# ''
+        unlet! ret
+        let ret = a:1
+    endif
+    return ret
+endfunction "}}}2
+
+let s:_getbufvar = function(v:version > 703 || (v:version == 703 && has('patch831')) ? 'getbufvar' : 's:_getbufvar_dumb')
+lockvar s:_getbufvar
+
+function! s:_fuzz_dumb() abort " {{{2
+    return 'tmp'
+endfunction " }}}2
+
+let s:_fuzz = function(exists('*getpid') ? 'getpid' : 's:_fuzz_dumb')
+lockvar s:_fuzz
+
+" }}}1
+
+let s:_wid_base = 'syntastic_' . s:_fuzz() . '_' . reltimestr(g:_SYNTASTIC_START) . '_'
+let s:_wid_pool = 0
+
+let &cpo = s:save_cpo
+unlet s:save_cpo
+
+" vim: set sw=4 sts=4 et fdm=marker:

+ 8258 - 0
vim/plugged/syntastic/doc/syntastic-checkers.txt

@@ -0,0 +1,8258 @@
+*syntastic-checkers.txt*	Syntastic checkers
+*syntastic-checkers*
+
+==============================================================================
+SYNTAX CHECKERS BY LANGUAGE                          *syntastic-checkers-lang*
+
+|syntastic| comes with checkers for the following languages:
+
+    ACPI Source Language.....................|syntastic-checkers-asl|
+    ActionScript.............................|syntastic-checkers-actionscript|
+    Ada......................................|syntastic-checkers-ada|
+    Ansible..................................|syntastic-checkers-ansible|
+    API Blueprint............................|syntastic-checkers-apiblueprint|
+    AppleScript..............................|syntastic-checkers-applescript|
+    AsciiDoc.................................|syntastic-checkers-asciidoc|
+    Assembly Languages.......................|syntastic-checkers-asm|
+
+    BEMHTML..................................|syntastic-checkers-bemhtml|
+    Bro......................................|syntastic-checkers-bro|
+
+    C........................................|syntastic-checkers-c|
+    C#.......................................|syntastic-checkers-cs|
+    C++......................................|syntastic-checkers-cpp|
+    Cabal....................................|syntastic-checkers-cabal|
+    Chef.....................................|syntastic-checkers-chef|
+    CMake....................................|syntastic-checkers-cmake|
+    COBOL....................................|syntastic-checkers-cobol|
+    Coco.....................................|syntastic-checkers-co|
+    CoffeeScript.............................|syntastic-checkers-coffee|
+    Coq......................................|syntastic-checkers-coq|
+    CSS......................................|syntastic-checkers-css|
+    Cucumber.................................|syntastic-checkers-cucumber|
+    CUDA.....................................|syntastic-checkers-cuda|
+
+    D........................................|syntastic-checkers-d|
+    Dart.....................................|syntastic-checkers-dart|
+    DocBook..................................|syntastic-checkers-docbk|
+    Dockerfile...............................|syntastic-checkers-dockerfile|
+    Dust.....................................|syntastic-checkers-dustjs|
+
+    Elixir...................................|syntastic-checkers-elixir|
+    Erlang...................................|syntastic-checkers-erlang|
+    eRuby....................................|syntastic-checkers-eruby|
+
+    Fortran..................................|syntastic-checkers-fortran|
+
+    Gentoo Metadata..........................|syntastic-checkers-gentoo|
+    Gettext PO...............................|syntastic-checkers-po|
+    GLSL.....................................|syntastic-checkers-glsl|
+    Go.......................................|syntastic-checkers-go|
+
+    Haml.....................................|syntastic-checkers-haml|
+    Handlebars...............................|syntastic-checkers-handlebars|
+    Haskell..................................|syntastic-checkers-haskell|
+    Haxe.....................................|syntastic-checkers-haxe|
+    HSS......................................|syntastic-checkers-hss|
+    HTML.....................................|syntastic-checkers-html|
+
+    Java.....................................|syntastic-checkers-java|
+    JavaScript...............................|syntastic-checkers-javascript|
+    JSON.....................................|syntastic-checkers-json|
+
+    LESS.....................................|syntastic-checkers-less|
+    Lex......................................|syntastic-checkers-lex|
+    Limbo....................................|syntastic-checkers-limbo|
+    LISP.....................................|syntastic-checkers-lisp|
+    LLVM.....................................|syntastic-checkers-llvm|
+    Lua......................................|syntastic-checkers-lua|
+
+    Markdown.................................|syntastic-checkers-markdown|
+    MATLAB...................................|syntastic-checkers-matlab|
+    Mercury..................................|syntastic-checkers-mercury|
+
+    NASM.....................................|syntastic-checkers-nasm|
+    Nix......................................|syntastic-checkers-nix|
+    nroff....................................|syntastic-checkers-nroff|
+
+    Objective-C..............................|syntastic-checkers-objc|
+    Objective-C++............................|syntastic-checkers-objcpp|
+    OCaml....................................|syntastic-checkers-ocaml|
+
+    Perl.....................................|syntastic-checkers-perl|
+    PHP......................................|syntastic-checkers-php|
+    POD......................................|syntastic-checkers-pod|
+    Pug (formerly Jade)......................|syntastic-checkers-pug|
+    Puppet...................................|syntastic-checkers-puppet|
+    Python...................................|syntastic-checkers-python|
+
+    QML......................................|syntastic-checkers-qml|
+
+    R........................................|syntastic-checkers-r|
+    R Markdown...............................|syntastic-checkers-rmd|
+    Racket...................................|syntastic-checkers-racket|
+    Raku.....................................|syntastic-checkers-raku|
+    Relax NG.................................|syntastic-checkers-rnc|
+    reStructuredText.........................|syntastic-checkers-rst|
+    RPM spec.................................|syntastic-checkers-spec|
+    Ruby.....................................|syntastic-checkers-ruby|
+
+    SASS.....................................|syntastic-checkers-sass|
+    Scala....................................|syntastic-checkers-scala|
+    SCSS.....................................|syntastic-checkers-scss|
+    Sh.......................................|syntastic-checkers-sh|
+    Slim.....................................|syntastic-checkers-slim|
+    SML......................................|syntastic-checkers-sml|
+    Solidity.................................|syntastic-checkers-solidity|
+    SQL......................................|syntastic-checkers-sql|
+    Stylus...................................|syntastic-checkers-stylus|
+    SVG......................................|syntastic-checkers-svg|
+
+    Tcl......................................|syntastic-checkers-tcl|
+    TeX......................................|syntastic-checkers-tex|
+    Texinfo..................................|syntastic-checkers-texinfo|
+    Text.....................................|syntastic-checkers-text|
+    Turtle...................................|syntastic-checkers-turtle|
+    TriG.....................................|syntastic-checkers-trig|
+    Twig.....................................|syntastic-checkers-twig|
+    TypeScript...............................|syntastic-checkers-typescript|
+
+    Verilog..................................|syntastic-checkers-verilog|
+    VHDL.....................................|syntastic-checkers-vhdl|
+    Vim help.................................|syntastic-checkers-help|
+    VimL.....................................|syntastic-checkers-vim|
+    Vue.js...................................|syntastic-checkers-vue|
+
+    xHTML....................................|syntastic-checkers-xhtml|
+    XML......................................|syntastic-checkers-xml|
+    XQuery...................................|syntastic-checkers-xquery|
+    XSLT.....................................|syntastic-checkers-xslt|
+
+    YACC.....................................|syntastic-checkers-yacc|
+    YAML.....................................|syntastic-checkers-yaml|
+    YANG.....................................|syntastic-checkers-yang|
+    YARA.....................................|syntastic-checkers-yara|
+
+    Z80......................................|syntastic-checkers-z80|
+    Zope Page Templates......................|syntastic-checkers-zpt|
+    Zsh......................................|syntastic-checkers-zsh|
+
+Third-party checkers are available for additional languages.
+
+==============================================================================
+SYNTAX CHECKERS FOR ACPI SOURCE LANGUAGE              *syntastic-checkers-asl*
+
+The following checkers are available for the ACPI Source Language (filetype
+"asl"):
+
+    1. iasl.....................|syntastic-asl-iasl|
+
+------------------------------------------------------------------------------
+1. iasl                                                   *syntastic-asl-iasl*
+
+Name:        iasl
+Maintainer:  Peter Wu <peter@lekensteyn.nl>
+
+"iasl" is a compiler/decompiler for ACPI Source Language (ASL) and ACPI
+Machine Language (AML). See the project's page for details:
+
+    https://acpica.org/
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+Note~
+
+You probably also need a plugin to set |filetype| for ASL files, such as
+"vim-acpi-asl":
+
+    https://github.com/martinlroth/vim-acpi-asl
+
+==============================================================================
+SYNTAX CHECKERS FOR ACTIONSCRIPT             *syntastic-checkers-actionscript*
+
+The following checkers are available for ActionScript (filetype
+"actionscript"):
+
+    1. mxmlc....................|syntastic-actionscript-mxmlc|
+
+------------------------------------------------------------------------------
+1. mxmlc                                        *syntastic-actionscript-mxmlc*
+
+Name:        mxmlc
+Maintainer:  Andy Earnshaw <andyearnshaw@gmail.com>
+
+"mxmlc" is a compiler for ActionScript. See Apache Flex for details:
+
+    http://flex.apache.org/
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+==============================================================================
+SYNTAX CHECKERS FOR ADA                               *syntastic-checkers-ada*
+
+The following checkers are available for Ada (filetype "ada"):
+
+    1. GCC......................|syntastic-ada-gcc|
+
+------------------------------------------------------------------------------
+1. GCC                                                     *syntastic-ada-gcc*
+
+Name:        gcc
+Maintainer:  Alfredo Di Napoli <alfredo.dinapoli@gmail.com>
+
+Checker options~
+                                                  *'g:syntastic_ada_compiler'*
+Type: string
+Default: "gcc"
+Compiler executable.
+
+                                               *'g:syntastic_ada_errorformat'*
+Type: string
+Default: unset
+Override for the default |'errorformat'|.
+
+                                     *'g:syntastic_ada_remove_include_errors'*
+Type: boolean
+Default: 0
+By default, errors in files included from the file being checked are shown.
+Set this variable to 1 to remove messages about errors in included files.
+Please note that this means syntastic will silently abort checks if there are
+fatal errors in one of the included files.
+
+                                          *'g:syntastic_ada_compiler_options'*
+Type: string
+Default: unset
+Compilation flags (such as defines or include directories) to be passed to the
+linter.
+
+                                               *'g:syntastic_ada_config_file'*
+Type: string
+Default: unset
+File containing additional compilation flags to be passed to the linter, one
+option per line (cf. |syntastic-config-files|).
+
+                                              *'g:syntastic_ada_include_dirs'*
+Type: array of strings
+Default: []
+Include directories to be passed to the linter, in addition to the above
+compilation flags. You can set it like this: >
+    let g:syntastic_ada_include_dirs = ["includes", "headers"]
+<
+and the corresponding "-Iincludes -Iheaders" will be added to the compilation
+flags.
+
+                                                    *'b:syntastic_ada_cflags'*
+Type: string
+Default: unset
+Buffer-local variable. Additional compilation flags specific to the current
+buffer.
+
+                                              *'g:syntastic_ada_check_header'*
+Type: boolean
+Default: 0
+If the current file is a header (namely if its extension is "ads"), all checks
+are silently skipped. You can force syntastic to check header files by
+setting the above variable to 1.
+
+Note~
+
+This checker doesn't call the "makeprgBuild()" function, and thus it ignores
+the usual 'g:syntastic_ada_gcc_<option>' variables. The only exception is
+'g:syntastic_ada_gcc_exec', which can still be used to override the linter's
+executable.
+
+==============================================================================
+SYNTAX CHECKERS FOR ANSIBLE                       *syntastic-checkers-ansible*
+
+The following checkers are available for Ansible (filetype "ansible"):
+
+    1. Ansible-lint.............|syntastic-ansible-ansible_lint|
+
+------------------------------------------------------------------------------
+1. Ansible-lint                               *syntastic-ansible-ansible_lint*
+
+Name:        ansible_lint
+Maintainer:  Erik Zaadi <erik.zaadi@gmail.com>
+
+"Ansible-lint" is a style linter for Ansible playbooks. See the project's
+page at GitHub for details:
+
+    https://github.com/willthames/ansible-lint
+
+Syntastic requires "Ansible-lint" version 2.0.4 or later.
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+Note~
+
+You probably also need a plugin to set |filetype| for Ansible playbooks, such
+as "ansible-vim":
+
+    https://github.com/pearofducks/ansible-vim
+
+==============================================================================
+SYNTAX CHECKERS FOR API BLUEPRINT            *syntastic-checkers-apiblueprint*
+
+The following checkers are available for API Blueprint (filetype "apiblueprint"):
+
+    1. Drafter..................|syntastic-apiblueprint-drafter|
+
+------------------------------------------------------------------------------
+1. Drafter                                    *syntastic-apiblueprint-drafter*
+
+Name:        drafter
+Maintainer:  LCD 47 <lcd047@gmail.com>
+
+"Drafter" is a parser for Apiary's "API Blueprint" (http://apiblueprint.org/).
+See the project's page at GitHub for details:
+
+    https://github.com/apiaryio/drafter
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+Note~
+
+You probably also need a plugin to set |filetype| for API Blueprint files, such
+as "apiblueprint.vim":
+
+    https://github.com/kylef/apiblueprint.vim
+
+==============================================================================
+SYNTAX CHECKERS FOR APPLESCRIPT               *syntastic-checkers-applescript*
+
+The following checkers are available for AppleScript (filetype "applescript"):
+
+    1. osacompile...............|syntastic-applescript-osacompile|
+
+------------------------------------------------------------------------------
+1. osacompile                               *syntastic-applescript-osacompile*
+
+Name:        osacompile
+Author: Zhao Cai <caizhaoff@gmail.com>
+
+"osacompile" is a compiler for "AppleScript". See the program's manual for
+details:
+
+    https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man1/osacompile.1.html
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+==============================================================================
+SYNTAX CHECKERS FOR ASCIIDOC                     *syntastic-checkers-asciidoc*
+
+The following checkers are available for AsciiDoc (filetype "asciidoc"):
+
+    1. Asciidoc.................|syntastic-asciidoc-asciidoc|
+    2. proselint................|syntastic-asciidoc-proselint|
+
+------------------------------------------------------------------------------
+1. Asciidoc                                      *syntastic-asciidoc-asciidoc*
+
+Name:        asciidoc
+Maintainer:  LCD 47 <lcd047@gmail.com>
+
+"Asciidoc" is a translator for AsciiDoc documents (http://asciidoc.org/).
+
+Note~
+
+If you would prefer to use Asciidoctor (http://asciidoctor.org/)
+as a linter instead of "Asciidoc", you can do that by pointing
+'g:syntastic_asciidoc_asciidoc_exec' to it: >
+    let g:syntastic_asciidoc_asciidoc_exec = "asciidoctor"
+<
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+------------------------------------------------------------------------------
+2. proselint                                    *syntastic-asciidoc-proselint*
+
+Name:        proselint
+Maintainer:  LCD 47 <lcd047@gmail.com>
+
+"proselint" is a linter for prose. See the page for details:
+
+    http://proselint.com/
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+See also: |syntastic-help-proselint|, |syntastic-html-proselint|,
+|syntastic-markdown-proselint|, |syntastic-nroff-proselint|,
+|syntastic-pod-proselint|, |syntastic-rst-proselint|,
+|syntastic-tex-proselint|, |syntastic-texinfo-proselint|,
+|syntastic-text-proselint|, |syntastic-xhtml-proselint|.
+
+==============================================================================
+SYNTAX CHECKERS FOR ASSEMBLY LANGUAGES                *syntastic-checkers-asm*
+
+The following checkers are available for assembly languages (filetype "asm"):
+
+    1. GCC......................|syntastic-asm-gcc|
+
+------------------------------------------------------------------------------
+1. GCC                                                     *syntastic-asm-gcc*
+
+Name:        gcc
+Maintainer:  Joshua Rahm <joshuarahm@gmail.com>
+
+This plugin supports both the AT&T and Intel dialects.
+
+Checker Options~
+                                                  *'g:syntastic_asm_compiler'*
+Type: string
+Default: "gcc"
+Compiler executable. Set it to something like "mipsel-linux-gcc": >
+    let g:syntastic_asm_compiler = "mipsel-linux-gcc"
+<
+                                               *'g:syntastic_asm_errorformat'*
+Type: string
+Default: unset
+Override for the default |'errorformat'|.
+
+                                                   *'g:syntastic_asm_dialect'*
+Type: string
+Default: unset
+Normally the assembler will select the dialect to use for checking based on
+the file extension (AT&T for ".s", Intel for ".asm"). If you want to override
+the automatic choice set this variable to either "att" or "intel".
+
+                                     *'g:syntastic_asm_remove_include_errors'*
+Type: boolean
+Default: 0
+By default, errors in files included from the file being checked are shown.
+Set this variable to 1 to remove messages about errors in included files.
+Please note that this means syntastic will silently abort checks if there are
+fatal errors in one of the included files.
+
+                                          *'g:syntastic_asm_compiler_options'*
+Type: string
+Default: unset
+Compilation flags (such as defines or include directories) to be passed to the
+assembler. Set it to something like "-mtune=native": >
+    let g:syntastic_asm_compiler_options = "-mtune=native"
+<
+                                               *'g:syntastic_asm_config_file'*
+Type: string
+Default: unset
+File containing additional compilation flags to be passed to the assembler,
+one option per line (see |syntastic-config-files|).
+
+                                              *'g:syntastic_asm_include_dirs'*
+Type: array of strings
+Default: []
+Include directories to be passed to the assembler, in addition to the
+above compilation flags. You can set it like this: >
+    let g:syntastic_asm_include_dirs = ["inc", "asm/src/include"]
+<
+and the corresponding "-Iinc -Iasm/src/include" will be added to the
+compilation flags.
+
+                                                    *'b:syntastic_asm_cflags'*
+Type: string
+Default: unset
+Buffer-local variable. Additional compilation flags specific to the current
+buffer.
+
+Note~
+
+This checker doesn't call the "makeprgBuild()" function, and thus it ignores
+the usual 'g:syntastic_asm_gcc_<option>' variables. The only exception is
+'g:syntastic_asm_gcc_exec', which can still be used to override the linter's
+executable.
+
+==============================================================================
+SYNTAX CHECKERS FOR BEMHTML                       *syntastic-checkers-bemhtml*
+
+The following checkers are available for BEMHTML (filetype "bemhtml"):
+
+    1. bemhtml-lint.............|syntastic-bemhtml-bemhtmllint|
+
+------------------------------------------------------------------------------
+1. bemhtml-lint                                *syntastic-bemhtml-bemhtmllint*
+
+Name:        bemhtmllint
+Maintainer:  Sergej Tatarincev
+
+BEMHTML is a template engine intended for using with the BEM methodology
+(http://bem.info/method/). See the project's page at GitHub for details:
+
+    https://github.com/SevInf/bemhtml-lint
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+==============================================================================
+SYNTAX CHECKERS FOR BRO                               *syntastic-checkers-bro*
+
+The following checkers are available for Bro (filetype "bro"):
+
+    1. Bro......................|syntastic-bro-bro|
+
+------------------------------------------------------------------------------
+1. Bro                                                     *syntastic-bro-bro*
+
+Name:        bro
+Maintainer:  Justin Azoff <justin.azoff@gmail.com>
+
+"Bro" is a network security monitor. See the project's page for details:
+
+    https://www.bro.org/
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+==============================================================================
+SYNTAX CHECKERS FOR C                                   *syntastic-checkers-c*
+
+The following checkers are available for C (filetype "c"):
+
+    1. AVR-GCC..................|syntastic-c-avrgcc|
+    2. Checkpatch...............|syntastic-c-checkpatch|
+    3. ClangCheck...............|syntastic-c-clang_check|
+    4. Clang-Tidy...............|syntastic-c-clang_tidy|
+    5. Cppcheck.................|syntastic-c-cppcheck|
+    6. cppclean.................|syntastic-c-cppclean|
+    7. Flawfinder...............|syntastic-c-flawfinder|
+    8. GCC......................|syntastic-c-gcc|
+    9. make.....................|syntastic-c-make|
+    10. OClint..................|syntastic-c-oclint|
+    11. PC-Lint.................|syntastic-c-pc_lint|
+    12. Sparse..................|syntastic-c-sparse|
+    13. Splint..................|syntastic-c-splint|
+
+------------------------------------------------------------------------------
+1. AVR-GCC                                                *syntastic-c-avrgcc*
+
+Name:        avrgcc
+Maintainer:  Karel <karelishere@gmail.com>
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+Additionally:
+
+                                            *'g:syntastic_avrgcc_config_file'*
+Type: string
+Default: unset
+File containing compilation flags (such as defines or include directories),
+one option per line (cf. |syntastic-config-files|).
+
+------------------------------------------------------------------------------
+2. Checkpatch                                         *syntastic-c-checkpatch*
+
+Name:        checkpatch
+Maintainer:  Daniel Walker <dwalker@fifo99.com>
+
+"Checkpatch" is a style linter for the Linux kernel sources. It's
+distributed along with the Linux kernel sources:
+
+    https://github.com/torvalds/linux/blob/master/scripts/checkpatch.pl
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+------------------------------------------------------------------------------
+3. ClangCheck                                        *syntastic-c-clang_check*
+
+Name:        clang_check
+Maintainer:  Benjamin Bannier <bbannier@gmail.com>
+
+"ClangCheck" is a wrapper around Clang's "LibTooling"
+(http://clang.llvm.org/docs/LibTooling.html). See the official page for
+details:
+
+    http://clang.llvm.org/docs/ClangCheck.html
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+Additionally:
+
+                                       *'g:syntastic_clang_check_config_file'*
+Type: string
+Default: unset
+File containing compilation flags (such as defines or include directories),
+one option per line (cf. |syntastic-config-files|).
+
+Note~
+
+By default you can set "ClangCheck" parameters in
+'g:syntastic_c_clang_check_args', and compilation parameters
+(defines, optimisation flags, etc.) in the configuration file.
+
+However, if you want "ClangCheck" to use compilation databases
+(http://clang.llvm.org/docs/JSONCompilationDatabase.html) -- perhaps
+generated by "CMake" (https://github.com/rizsotto/Bear) or "Build EAR"
+(https://github.com/rizsotto/Bear) -- rather than pass compilation flags
+explicitly, set 'g:syntastic_c_clang_check_post_args' to an empty string: >
+    let g:syntastic_c_clang_check_post_args = ""
+<
+Configuration files pointed to by 'g:syntastic_clang_check_config_file' are
+then ignored.
+
+See also: |syntastic-cpp-clang_check|.
+
+------------------------------------------------------------------------------
+4. Clang-Tidy                                         *syntastic-c-clang_tidy*
+
+Name:        clang_tidy
+Maintainer:  Benjamin Bannier <bbannier@gmail.com>
+
+"Clang-Tidy" is a lint tool based on "Clang" (http://clang.llvm.org/). See
+the project's page for details:
+
+    http://clang.llvm.org/extra/clang-tidy.html
+
+Installation~
+
+"Clang-Tidy" is part of the "Clang" (http://clang.llvm.org/) project, but it
+isn't built by default. You need to enable compilation of the "Extra Clang
+Tools" (http://clang.llvm.org/docs/ClangTools.html#extra-clang-tools) to get
+it. See the build tutorial for details:
+
+    http://clang.llvm.org/docs/LibASTMatchersTutorial.html
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+Additionally:
+
+                                        *'g:syntastic_clang_tidy_config_file'*
+Type: string
+Default: unset
+File containing compilation flags (such as defines or include directories),
+one option per line (cf. |syntastic-config-files|).
+
+Note~
+
+By default you can set "ClangTidy" parameters in
+'g:syntastic_c_clang_tidy_args', and compilation parameters
+(defines, optimisation flags, etc.) in the configuration file.
+
+If you want "ClangTidy" to use compilation databases
+(http://clang.llvm.org/docs/JSONCompilationDatabase.html) --
+perhaps generated by "CMake" (http://cmake.org/) or "Build EAR"
+(https://github.com/rizsotto/Bear) -- rather than pass compilation flags
+explicitly, set 'g:syntastic_c_clang_tidy_post_args' to an empty string: >
+    let g:syntastic_c_clang_tidy_post_args = ""
+<
+Configuration files pointed to by 'g:syntastic_clang_tidy_config_file' are
+then ignored.
+
+See also: |syntastic-cpp-clang_tidy|.
+
+------------------------------------------------------------------------------
+5. Cppcheck                                             *syntastic-c-cppcheck*
+
+Name:        cppcheck
+Maintainer:  LCD 47 <lcd047@gmail.com>
+
+"Cppcheck" is a static analysis tool for C/C++ code. See the project's page
+for details:
+
+    http://cppcheck.sourceforge.net/
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+Additionally:
+
+                                          *'g:syntastic_cppcheck_config_file'*
+Type: string
+Default: unset
+File containing compilation flags (such as defines or include directories),
+one option per line (cf. |syntastic-config-files|).
+
+See also: |syntastic-cpp-cppcheck|.
+
+------------------------------------------------------------------------------
+6. cppclean                                             *syntastic-c-cppclean*
+
+Name:        cppclean
+Maintainer:  LCD 47 <lcd047@gmail.com>
+
+"cppclean" attempts to find problems in C++ source that slow development in
+large code bases, for example various forms of unused code. See the project's
+page at GitHub for more information:
+
+    https://github.com/myint/cppclean
+
+Installation~
+
+Install it with "pip": >
+    pip install cppclean
+<
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+See also: |syntastic-cpp-cppclean|.
+
+------------------------------------------------------------------------------
+7. Flawfinder                                         *syntastic-c-flawfinder*
+
+Name:        flawfinder
+Maintainer:  LCD 47 <lcd047@gmail.com>
+
+"Flawfinder" scans C/C++ source code for possible security weaknesses. See the
+project's page for more information:
+
+    https://www.dwheeler.com/flawfinder
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+Additionally:
+
+                                            *'g:syntastic_c_flawfinder_thres'*
+Type: integer
+Default: 3
+Error threshold. Policy violations with a severity above this value are
+highlighted as errors, the others are considered warnings by syntastic.
+
+See also: |syntastic-cpp-flawfinder|.
+
+------------------------------------------------------------------------------
+8. GCC                                                       *syntastic-c-gcc*
+
+Name:        gcc
+Maintainer:  Gregor Uhlenheuer <kongo2002@gmail.com>
+
+Checker options~
+                                                    *'g:syntastic_c_compiler'*
+Type: string
+Default: "gcc", or "clang" if GCC is not found
+Compiler executable.
+
+                                                 *'g:syntastic_c_errorformat'*
+Type: string
+Default: unset
+Override for the default |'errorformat'|.
+
+                                       *'g:syntastic_c_remove_include_errors'*
+Type: boolean
+Default: 0
+By default, errors in files included from the file being checked are shown.
+Set this variable to 1 to remove messages about errors in included files.
+Please note that this means syntastic will silently abort checks if there are
+fatal errors in one of the included files.
+
+                                            *'g:syntastic_c_compiler_options'*
+Type: string
+Default: "-std=gnu99"
+Compilation flags (such as defines or include directories) to be passed to the
+linter.
+
+                                                 *'g:syntastic_c_config_file'*
+Type: string
+Default: unset
+File containing additional compilation flags to be passed to the linter, one
+option per line (cf. |syntastic-config-files|).
+
+                                                *'g:syntastic_c_include_dirs'*
+Type: array of strings
+Default: []
+Include directories to be passed to the linter, in addition to the above
+compilation flags. You can set it to something like this: >
+    let g:syntastic_c_include_dirs = ["includes", "headers"]
+<
+and the corresponding "-Iincludes -Iheaders" will be added to the compilation
+flags.
+
+                                     *'g:syntastic_c_no_default_include_dirs'*
+Type: boolean
+Default: 0
+By default syntastic adds a number of common include directories to the
+compilation flags, namely: >
+    -I. -I.. -Iinclude -Iincludes -I../include -I../includes
+<
+You can disable this behaviour by setting the above variable to 1.
+
+                                           *'g:syntastic_c_no_include_search'*
+Type: boolean
+Default: 0
+By default syntastic looks at the first 100 lines of the file being checked,
+and tries to determine if it needs to include headers for some common
+libraries, such as "GLib" or "Gtk". It then tries to add the corresponding
+include directories to the compilation flags. You can disable this behaviour
+by setting the above variable to 1.
+
+                                       *'g:syntastic_c_auto_refresh_includes'*
+Type: boolean
+Default: 0
+Used only if "g:syntastic_c_no_include_search" is set to a false value. By
+default syntastic searches for common libraries only the first time the
+current file is checked. Setting the above variable to 1 instructs syntastic
+to refresh the list of common libraries every time the current file is
+checked. You can also force a refresh even when the above variable is 0, by
+`:unlet`-ing the buffer variable 'b:syntastic_c_includes'.
+
+                                                      *'b:syntastic_c_cflags'*
+Type: string
+Default: unset
+Buffer-local variable. When set, no search for common libraries is performed,
+and the contents of the variable are added to the compilation flags.
+
+                                                *'g:syntastic_c_check_header'*
+Type: boolean
+Default: 0
+If the current file is a header (namely if its extension is "h"), all checks
+are silently skipped. You can force syntastic to check header files by
+setting the above variable to 1.
+
+Note~
+
+This checker doesn't call the "makeprgBuild()" function, and thus it ignores
+the usual 'g:syntastic_c_gcc_<option>' variables. The only exception is
+'g:syntastic_c_gcc_exec', which can still be used to override the linter's
+executable.
+
+See also: |syntastic-cpp-gcc|.
+
+------------------------------------------------------------------------------
+9. make                                                     *syntastic-c-make*
+
+Name:        make
+Maintainer:  Gregor Uhlenheuer <kongo2002@gmail.com>
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+------------------------------------------------------------------------------
+10. OClint                                                *syntastic-c-oclint*
+
+Name:        oclint
+Maintainer:  "UnCO" Lin <undercooled@lavabit.com>
+
+"OClint" is a static code analysis tool. See the project's page for details:
+
+    http://oclint.org/
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+Additionally:
+
+                                            'g:syntastic_oclint_config_file'
+Type: string
+Default: unset
+File containing compilation flags (such as defines or include directories),
+one option per line (cf. |syntastic-config-files|).
+
+Notes~
+
+By default you can set "OClint" parameters in 'g:syntastic_c_oclint_args', and
+compilation parameters (defines, optimisation flags, etc.) in the config file.
+
+If you want "OClint" to use "Clang"-style compilation databases
+(http://clang.llvm.org/docs/JSONCompilationDatabase.html) --
+perhaps generated by "CMake" (http://cmake.org/) or "Build EAR"
+(https://github.com/rizsotto/Bear) -- rather than pass compilation flags
+explicitly, set 'g:syntastic_c_oclint_post_args' to an empty string: >
+    let g:syntastic_c_oclint_post_args = ""
+<
+Config files pointed to by 'g:syntastic_oclint_config_file' are then ignored.
+
+See also: |syntastic-cpp-oclint|.
+
+------------------------------------------------------------------------------
+11. PC-Lint                                              *syntastic-c-pc_lint*
+
+Name:        pc_lint
+Maintainer:  Steve Bragg <steve@empresseffects.com>
+
+"PC-Lint" is a commercial static code analysis tool for Windows, produced
+by "Gimpel Software" (http://www.gimpel.com/). See the project's page for
+details:
+
+    http://www.gimpel.com/html/pcl.htm
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+Additionally:
+
+                                           *'g:syntastic_pc_lint_config_file'*
+Type: string
+Default: unset
+Name of an indirect (.lnt) file. A file with that name is looked up in the
+current directory and in parent directories; first such file found is used.
+
+See also: |syntastic-cpp-pc_lint|.
+
+------------------------------------------------------------------------------
+12. Sparse                                                *syntastic-c-sparse*
+
+Name:        sparse
+Maintainer:  Daniel Walker <dwalker@fifo99.com>
+
+"Sparse" is a semantic parser for C, see the official wiki for details:
+
+    https://sparse.wiki.kernel.org/index.php/Main_Page
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+Additionally:
+
+                                            *'g:syntastic_sparse_config_file'*
+Type: string
+Default: unset
+File containing compilation flags (such as defines or include directories),
+one option per line (cf. |syntastic-config-files|).
+
+Notes~
+
+If you use "Sparse" with "GCC" you probably want to add something like this to
+your vimrc: >
+    let g:syntastic_c_sparse_post_args="-gcc-base-dir " .
+        \ system("gcc -v 2>&1 | sed -n '/^Reading specs/ { s#.* /#/#; s#/[^/]*$##; p; }'")
+<
+This allows "Sparse" to read "GCC"'s private include files.
+
+------------------------------------------------------------------------------
+13. Splint                                                *syntastic-c-splint*
+
+Name:        splint
+Maintainer:  LCD 47 <lcd047@gmail.com>
+
+"Splint" is a tool for statically checking C programs for security
+vulnerabilities, see the project's page for details:
+
+    http://www.splint.org/
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+Additionally:
+
+                                            *'g:syntastic_splint_config_file'*
+Type: string
+Default: unset
+File containing project-specific options to be passed to "Splint"
+(such as defines or include directories), one option per line (cf.
+|syntastic-config-files|).
+
+==============================================================================
+SYNTAX CHECKERS FOR C#                                 *syntastic-checkers-cs*
+
+The following checkers are available for C# (filetype "cs"):
+
+    1. mcs......................|syntastic-cs-mcs|
+
+------------------------------------------------------------------------------
+1. mcs                                                      *syntastic-cs-mcs*
+
+Name:        mcs
+Maintainer:  Daniel Walker <dwalker@fifo99.com>
+
+"mcs" is a compiler for C# from the "Mono" project
+(http://www.mono-project.com/Main_Page). See the program's manual for details:
+
+    http://mono.wikia.com/wiki/Man_mcs
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+==============================================================================
+SYNTAX CHECKERS FOR C++                               *syntastic-checkers-cpp*
+
+The following checkers are available for C++ (filetype "cpp"):
+
+    1. AVR-GCC..................|syntastic-cpp-avrgcc|
+    2. ClangCheck...............|syntastic-cpp-clang_check|
+    3. Clang-Tidy...............|syntastic-cpp-clang_tidy|
+    4. Cppcheck.................|syntastic-cpp-cppcheck|
+    5. cppclean.................|syntastic-cpp-cppclean|
+    6. Cpplint..................|syntastic-cpp-cpplint|
+    7. Flawfinder...............|syntastic-cpp-flawfinder|
+    8. GCC......................|syntastic-cpp-gcc|
+    9. OClint...................|syntastic-cpp-oclint|
+    10. PC-Lint.................|syntastic-cpp-pc_lint|
+    11. Vera++..................|syntastic-cpp-verapp|
+
+------------------------------------------------------------------------------
+1. AVR-GCC                                              *syntastic-cpp-avrgcc*
+
+Name:        avrgcc
+Maintainer:  Sławek Piotrowski <sentinel@atteo.com>
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+Additionally:
+
+                                            'g:syntastic_avrgcc_config_file'
+Type: string
+Default: unset
+File containing compilation flags (such as defines or include directories),
+one option per line (cf. |syntastic-config-files|).
+
+See also: |syntastic-c-avrgcc|.
+
+------------------------------------------------------------------------------
+2. ClangCheck                                      *syntastic-cpp-clang_check*
+
+Name:        clang_check
+Maintainer:  Benjamin Bannier <bbannier@gmail.com>
+
+"ClangCheck" is a wrapper around Clang's "LibTooling"
+(http://clang.llvm.org/docs/LibTooling.html). See the official page for
+details:
+
+    http://clang.llvm.org/docs/ClangCheck.html
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+Additionally:
+
+                                       'g:syntastic_clang_check_config_file'
+Type: string
+Default: unset
+file containing compilation flags (such as defines or include directories),
+one option per line (cf. |syntastic-config-files|).
+
+Note~
+
+By default you can set "ClangCheck" parameters in
+'g:syntastic_cpp_clang_check_args', and compilation parameters (defines,
+optimisation flags, etc.) in the configuration file.
+
+However, if you want "ClangCheck" to use compilation databases
+(http://clang.llvm.org/docs/JSONCompilationDatabase.html) -- perhaps
+generated by "CMake" (https://github.com/rizsotto/Bear) or "Build EAR"
+(https://github.com/rizsotto/Bear) -- rather than pass compilation flags
+explicitly, set 'g:syntastic_cpp_clang_check_post_args' to an empty string: >
+    let g:syntastic_cpp_clang_check_post_args = ""
+<
+Configuration files pointed to by 'g:syntastic_clang_check_config_file' are
+then ignored.
+
+See also: |syntastic-c-clang_check|.
+
+------------------------------------------------------------------------------
+3. Clang-Tidy                                       *syntastic-cpp-clang_tidy*
+
+Name:        clang_tidy
+Maintainer:  Benjamin Bannier <bbannier@gmail.com>
+
+"Clang-Tidy" is a lint tool based on "Clang" (http://clang.llvm.org/). See
+the project's page for details:
+
+    http://clang.llvm.org/extra/clang-tidy.html
+
+Installation~
+
+"Clang-Tidy" is part of the "Clang" (http://clang.llvm.org/) project, but it
+isn't built by default. You need to enable compilation of the "Extra Clang
+Tools" (http://clang.llvm.org/docs/ClangTools.html#extra-clang-tools) to get
+it. See the build tutorial for details:
+
+    http://clang.llvm.org/docs/LibASTMatchersTutorial.html
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+Additionally:
+
+                                        'g:syntastic_clang_tidy_config_file'
+Type: string
+Default: unset
+File containing compilation flags (such as defines or include directories),
+one option per line (cf. |syntastic-config-files|).
+
+Note~
+
+By default you can set "ClangTidy" parameters in
+'g:syntastic_cpp_clang_tidy_args', and compilation parameters (defines,
+optimisation flags, etc.) in the configuration file.
+
+If you want "ClangTidy" to use compilation databases
+(http://clang.llvm.org/docs/JSONCompilationDatabase.html) --
+perhaps generated by "CMake" (http://cmake.org/) or "Build EAR"
+(https://github.com/rizsotto/Bear) -- rather than pass compilation flags
+explicitly, set 'g:syntastic_cpp_clang_tidy_post_args' to an empty string: >
+    let g:syntastic_cpp_clang_tidy_post_args = ""
+<
+Configuration files pointed to by 'g:syntastic_clang_tidy_config_file' are
+then ignored.
+
+See also: |syntastic-c-clang_tidy|.
+
+------------------------------------------------------------------------------
+4. Cppcheck                                           *syntastic-cpp-cppcheck*
+
+Name:        cppcheck
+Maintainer:  LCD 47 <lcd047@gmail.com>
+
+"Cppcheck" is a static analysis tool for C/C++ code. See the project's page
+for details:
+
+    http://cppcheck.sourceforge.net/
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+Additionally:
+
+                                          'g:syntastic_cppcheck_config_file'
+Type: string
+Default: unset
+File containing compilation flags (such as defines or include directories),
+one option per line (cf. |syntastic-config-files|).
+
+See also: |syntastic-c-cppcheck|.
+
+------------------------------------------------------------------------------
+5. cppclean                                           *syntastic-cpp-cppclean*
+
+Name:        cppclean
+Maintainer:  LCD 47 <lcd047@gmail.com>
+
+"cppclean" attempts to find problems in C++ source that slow development in
+large code bases, for example various forms of unused code. See the project's
+page at GitHub for more information:
+
+    https://github.com/myint/cppclean
+
+Installation~
+
+Install it with "pip": >
+    pip install cppclean
+<
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+See also: |syntastic-c-cppclean|.
+
+------------------------------------------------------------------------------
+6. Cpplint                                             *syntastic-cpp-cpplint*
+
+Name:        cpplint
+Maintainer:  LCD 47 <lcd047@gmail.com>
+
+For details about "Cpplint" see the project's page:
+
+    https://github.com/google/styleguide/
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+Additionally:
+
+                                             *'g:syntastic_cpp_cpplint_thres'*
+Type: integer
+Default: 5
+Error threshold. Policy violations with a severity above this value are
+highlighted as errors, the others are considered warnings by syntastic.
+
+                                              *'g:syntastic_cpp_cpplint_args'*
+Type: string
+Default: "--verbose=3"
+Command line options to pass to "Cpplint"
+
+Note~
+
+By default syntastic expects the "cpplint" script to be named "cpplint.py".
+However, if your "cpplint" was installed with "pip", the script's name is
+"cpplint", and you need to set 'g:syntastic_cpp_cpplint_exec' accordingly:
+>
+    let g:syntastic_cpp_cpplint_exec = "cpplint"
+<
+------------------------------------------------------------------------------
+7. Flawfinder                                       *syntastic-cpp-flawfinder*
+
+Name:        flawfinder
+Maintainer:  LCD 47 <lcd047@gmail.com>
+
+"Flawfinder" scans C/C++ source code for possible security weaknesses. See the
+project's page for more information:
+
+    https://www.dwheeler.com/flawfinder
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+Additionally:
+
+                                          *'g:syntastic_cpp_flawfinder_thres'*
+Type: integer
+Default: 3
+Error threshold. Policy violations with a severity above this value are
+highlighted as errors, the others are considered warnings by syntastic.
+
+See also: |syntastic-c-flawfinder|.
+
+------------------------------------------------------------------------------
+8. GCC                                                     *syntastic-cpp-gcc*
+
+Name:        gcc
+Maintainer:  Gregor Uhlenheuer <kongo2002@gmail.com>
+
+Checker options~
+                                                  *'g:syntastic_cpp_compiler'*
+Type: string
+Default: "g++", or "clang++" if GCC is not found
+Compiler executable.
+
+                                               *'g:syntastic_cpp_errorformat'*
+Type: string
+Default: unset
+Override for the default |'errorformat'|.
+
+                                     *'g:syntastic_cpp_remove_include_errors'*
+Type: boolean
+Default: 0
+By default, errors in files included from the file being checked are shown.
+Set this variable to 1 to remove messages about errors in included files.
+Please note that this means syntastic will silently abort checks if there are
+fatal errors in one of the included files.
+
+                                          *'g:syntastic_cpp_compiler_options'*
+Type: string
+Default: unset
+Compilation flags (such as defines or include directories) to be passed to the
+linter.
+
+                                               *'g:syntastic_cpp_config_file'*
+Type: string
+Default: unset
+File containing additional compilation flags to be passed to the linter, one
+option per line (cf. |syntastic-config-files|).
+
+                                              *'g:syntastic_cpp_include_dirs'*
+Type: array of strings
+Default: []
+Include directories to be passed to the linter, in addition to the above
+compilation flags. You can set it to something like this: >
+    let g:syntastic_cpp_include_dirs = ["includes", "headers"]
+>
+and the corresponding "-Iincludes -Iheaders" will be added to the compilation
+flags.
+
+                                   *'g:syntastic_cpp_no_default_include_dirs'*
+Type: boolean
+Default: 0
+By default syntastic adds a number of common include directories to the
+compilation flags, namely: >
+    -I. -I.. -Iinclude -Iincludes -I../include -I../includes
+<
+You can disable this behaviour by setting the above variable to 1.
+
+                                         *'g:syntastic_cpp_no_include_search'*
+Type: boolean
+Default: 0
+By default syntastic looks at the first 100 lines of the file being checked,
+and tries to determine if it needs to include headers for some common
+libraries, such as "GLib" or "Gtk". It then tries to add the corresponding
+include directories to the compilation flags. You can disable this behaviour
+by setting the above variable to 1.
+
+                                     *'g:syntastic_cpp_auto_refresh_includes'*
+Type: boolean
+Default: 0
+Used only if "g:syntastic_cpp_no_include_search" is set to a false value.
+By default syntastic searches for common libraries only the first time the
+current file is checked. Setting the above variable to 1 instructs syntastic
+to refresh the list of common libraries every time the current file is
+checked. You can also force a refresh even when the above variable is 0, by
+`:unlet`-ing the buffer variable 'b:syntastic_cpp_includes'.
+
+                                                    *'b:syntastic_cpp_cflags'*
+Type: string
+Default: unset
+Buffer-local variable. When set, no search for common libraries is performed,
+and the contents of the variable are added to the compilation flags.
+
+                                              *'g:syntastic_cpp_check_header'*
+Type: boolean
+Default: 0
+If the current file is a header (namely if its extension is "h", "hpp", or
+"hh"), all checks are silently skipped. You can force syntastic to check
+header files by setting the above variable to 1.
+
+Note~
+
+This checker doesn't call the "makeprgBuild()" function, and thus it ignores
+the usual 'g:syntastic_cpp_gcc_<option>' variables. The only exception is
+'g:syntastic_cpp_gcc_exec', which can still be used to override the linter's
+executable.
+
+See also: |syntastic-c-gcc|.
+
+------------------------------------------------------------------------------
+9. OClint                                               *syntastic-cpp-oclint*
+
+Name:        oclint
+Maintainer:  "UnCO" Lin <undercooled@lavabit.com>
+
+"OClint" is a static code analysis tool. See the project's page for details:
+
+    http://oclint.org/
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+Additionally:
+
+                                            'g:syntastic_oclint_config_file'
+Type: string
+Default: unset
+File containing compilation flags (such as defines or include directories),
+one option per line (cf. |syntastic-config-files|).
+
+Notes~
+
+By default you can set "OClint" parameters in 'g:syntastic_cpp_oclint_args',
+and compilation parameters (defines, optimisation flags, etc.) in the config
+file.
+
+If you want "OClint" to use "Clang"-style compilation databases
+(http://clang.llvm.org/docs/JSONCompilationDatabase.html) --
+perhaps generated by "CMake" (http://cmake.org/) or "Build EAR"
+(https://github.com/rizsotto/Bear) -- rather than pass compilation flags
+explicitly, set 'g:syntastic_c_oclint_post_args' to an empty string: >
+    let g:syntastic_cpp_oclint_post_args = ""
+<
+Config files pointed to by 'g:syntastic_oclint_config_file' are then ignored.
+
+See also: |syntastic-c-oclint|.
+
+------------------------------------------------------------------------------
+10. PC-Lint                                            *syntastic-cpp-pc_lint*
+
+Name:        pc_lint
+Maintainer:  Steve Bragg <steve@empresseffects.com>
+
+"PC-Lint" is a commercial static code analysis tool for Windows, produced
+by "Gimpel Software" (http://www.gimpel.com/). See the project's page for
+details:
+
+    http://www.gimpel.com/html/pcl.htm
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+Additionally:
+
+                                           'g:syntastic_pc_lint_config_file'
+Type: string
+Default: unset
+Name of an indirect (.lnt) file. A file with that name is looked up in the
+current directory and in parent directories; first such file found is used.
+
+See also: |syntastic-c-pc_lint|.
+
+------------------------------------------------------------------------------
+11. Vera++                                              *syntastic-cpp-verapp*
+
+Name:        verapp
+Maintainer:  Lucas Verney <phyks@phyks.me>
+
+"Vera++" is a programmable tool for verification, analysis and transformation
+of C++ source code. See the project's page for details:
+
+    https://bitbucket.org/verateam/vera/wiki/Home
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+Additionally:
+
+                                            *'g:syntastic_verapp_config_file'*
+Type: string
+Default: unset
+File containing additional compilation flags to be passed to the linter, one
+option per line (cf. |syntastic-config-files|).
+
+==============================================================================
+SYNTAX CHECKERS FOR CABAL                           *syntastic-checkers-cabal*
+
+The following checkers are available for Cabal (filetype "cabal"):
+
+    1. Cabal....................|syntastic-cabal-cabal|
+
+------------------------------------------------------------------------------
+1. Cabal                                               *syntastic-cabal-cabal*
+
+Name:        cabal
+Maintainer:  Ian D. Bollinger <ian.bollinger@gmail.com>
+
+This checker runs "cabal check" against Haskell Cabal package descriptions.
+See the project's page for more information:
+
+    http://www.haskell.org/cabal/
+
+Note~
+
+This checker doesn't call the "makeprgBuild()" function, and thus it ignores
+the usual 'g:syntastic_cabal_cabal_<option>' variables. The only exception
+is 'g:syntastic_cabal_cabal_exec', which can still be used to override the
+linter's executable.
+
+==============================================================================
+SYNTAX CHECKERS FOR CHEF                             *syntastic-checkers-chef*
+
+The following checkers are available for Chef (filetype "chef"):
+
+    1. Foodcritic...............|syntastic-chef-foodcritic|
+
+------------------------------------------------------------------------------
+1. Foodcritic                                      *syntastic-chef-foodcritic*
+
+Name:        foodcritic
+Maintainer:  Doug Ireton
+
+"Foodcritic" is a linter for "Chef" cookbooks (http://www.opscode.com/chef/).
+See the project's page for more information:
+
+    http://www.foodcritic.io/
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+Note~
+
+You probably also need a plugin to set |filetype| for Chef files, such as
+"vim-chef":
+
+    https://github.com/dougireton/vim-chef
+
+==============================================================================
+SYNTAX CHECKERS FOR CMAKE                           *syntastic-checkers-cmake*
+
+The following checkers are available for CMake (filetype "cmake"):
+
+    1. cmakelint................|syntastic-cmake-cmakelint|
+
+------------------------------------------------------------------------------
+1. cmakelint                                       *syntastic-cmake-cmakelint*
+
+Name:        cmakelint
+Maintainer:  LCD 47 <lcd047@gmail.com>
+
+"cmakelint" is a style linter for "CMake" files (https://cmake.org/).
+See the project's page at GitHub more information:
+
+    https://github.com/richq/cmake-lint
+
+Installation~
+
+Install it with "pip": >
+    pip install cmakelint
+<
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+==============================================================================
+SYNTAX CHECKERS FOR COBOL                           *syntastic-checkers-cobol*
+
+The following checkers are available for COBOL (filetype "cobol"):
+
+    1. OpenCOBOL................|syntastic-cobol-cobc|
+
+------------------------------------------------------------------------------
+1. OpenCOBOL                                            *syntastic-cobol-cobc*
+
+Name:        cobc
+Maintainer:  LCD 47 <lcd047@gmail.com>
+
+"OpenCOBOL" is a compiler for COBOL. See the project's page for more
+information:
+
+    http://www.opencobol.org/
+
+Checker options~
+                                                *'g:syntastic_cobol_compiler'*
+Type: string
+Default: "cobc"
+Compiler executable.
+
+                                             *'g:syntastic_cobol_errorformat'*
+Type: string
+Default: unset
+Override for the default |'errorformat'|.
+
+                                   *'g:syntastic_cobol_remove_include_errors'*
+Type: boolean
+Default: 0
+By default, errors in files included from the file being checked are shown.
+Set this variable to 1 to remove messages about errors in included files.
+Please note that this means syntastic will silently abort checks if there are
+fatal errors in one of the included files.
+
+                                        *'g:syntastic_cobol_compiler_options'*
+Type: string
+Default: unset
+Compilation flags (such as "-std=cobol2002") to be passed to the linter.
+
+                                             *'g:syntastic_cobol_config_file'*
+Type: string
+Default: unset
+File containing additional compilation flags to be passed to the linter, one
+option per line (cf. |syntastic-config-files|).
+
+                                            *'g:syntastic_cobol_include_dirs'*
+Type: array of strings
+Default: []
+Include directories to be passed to the linter, in addition to the above
+compilation flags. You can set it to something like this: >
+    let g:syntastic_cobol_include_dirs = ["includes", "headers"]
+<
+and the corresponding "-Iincludes -Iheaders" will be added to the compilation
+flags.
+
+                                                  *'b:syntastic_cobol_cflags'*
+Type: string
+Default: unset
+Buffer-local variable. Additional compilation flags specific to the current
+buffer.
+
+Note~
+
+This checker doesn't call the "makeprgBuild()" function, and thus it ignores
+the usual 'g:syntastic_cobol_cobc_<option>' variables. The only exception
+is 'g:syntastic_cobol_cobc_exec', which can still be used to override the
+linter's executable.
+
+==============================================================================
+SYNTAX CHECKERS FOR COCO                               *syntastic-checkers-co*
+
+The following checkers are available for Coco (filetype "co"):
+
+    1. Coco.....................|syntastic-co-coco|
+
+------------------------------------------------------------------------------
+1. Coco                                                    *syntastic-co-coco*
+
+Name:        coco
+Maintainer:  Andrew Kelley <superjoe30@gmail.com>
+
+For details about "Coco" see the project's page:
+
+    https://github.com/satyr/coco/
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+==============================================================================
+SYNTAX CHECKERS FOR COFFEESCRIPT                   *syntastic-checkers-coffee*
+
+The following checkers are available for CoffeeScript (filetype "coffee"):
+
+    1. Coffee...................|syntastic-coffee-coffee|
+    2. Coffee->JSHint...........|syntastic-coffee-coffee_jshint|
+    3. CoffeeLint...............|syntastic-coffee-coffeelint|
+
+------------------------------------------------------------------------------
+1. Coffee                                            *syntastic-coffee-coffee*
+
+Name:        coffee
+Maintainer:  Lincoln Stoll <l@lds.li>
+
+"Coffee" is a compiler for CoffeeScript. See the project's page for details:
+
+    http://coffeescript.org/
+
+Syntastic requires "Coffee" version 1.6.2 or later.
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+------------------------------------------------------------------------------
+2. Coffee->JSHint                             *syntastic-coffee-coffee_jshint*
+
+Name:        coffee_jshint
+Maintainer:  John Krauss <john@johnkrauss.com>
+
+"Coffee->JSHint" is a JSHint validator for CoffeeScript. See the project's
+page at GitHub for details:
+
+    https://github.com/marviq/coffee-jshint
+
+Installation~
+
+Install it with "npm": >
+    npm install -g coffee-jshint
+<
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+Accepts the standard options described at |syntastic-config-makeprg|.
+
+------------------------------------------------------------------------------
+3. CoffeeLint                                    *syntastic-coffee-coffeelint*
+
+Name:        coffeelint
+Maintainer:  Lincoln Stoll <l@lds.li>
+
+"CoffeeLint" is a style linter for CoffeeScript. See the project's page for
+details:
+
+    http://www.coffeelint.org/
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+==============================================================================
+SYNTAX CHECKERS FOR COQ                               *syntastic-checkers-coq*
+
+The following checkers are available for Coq (filetype "coq"):
+
+    1. Coqtop...................|syntastic-coq-coqtop|
+
+------------------------------------------------------------------------------
+1. Coqtop                                               *syntastic-coq-coqtop*
+
+Name:        coqtop
+Maintainer:  Matvey Aksenov <matvey.aksenov@gmail.com>
+
+"Coqtop" is the top level interface for Coq. See the project's page for
+details:
+
+    http://coq.inria.fr/
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+==============================================================================
+SYNTAX CHECKERS FOR CSS                               *syntastic-checkers-css*
+
+The following checkers are available for CSS (filetype "css"):
+
+    1. CSSLint..................|syntastic-css-csslint|
+    2. mixedindentlint..........|syntastic-css-mixedindentlint|
+    3. PHP_CodeSniffer..........|syntastic-css-phpcs|
+    4. PrettyCSS................|syntastic-css-prettycss|
+    5. RECESS...................|syntastic-css-recess|
+    6. stylelint................|syntastic-css-stylelint|
+
+------------------------------------------------------------------------------
+1. CSSLint                                             *syntastic-css-csslint*
+
+Name:        csslint
+Maintainer:  Ory Band <oryband@gmail.com>
+
+"CSSLint" is a lint tool for Cascading Stylesheets. See the project's page
+for details:
+
+    http://csslint.net/
+
+Installation~
+
+Install it with "npm": >
+    npm install -g csslint
+<
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+------------------------------------------------------------------------------
+2. mixedindentlint                             *syntastic-css-mixedindentlint*
+
+Name:        mixedindentlint
+Maintainer:  Payton Swick <payton@foolord.com>
+
+"mixedindentlint" is a general-purpose indentation linter. See the project's
+page at GitHub for more information:
+
+    https://github.com/sirbrillig/mixedindentlint
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+See also: |syntastic-javascript-mixedindentlint|, |syntastic-scss-mixedindentlint|.
+
+------------------------------------------------------------------------------
+3. PHP_CodeSniffer                                       *syntastic-css-phpcs*
+
+Name:        phpcs
+Maintainer:  LCD 47 <lcd047@gmail.com>
+
+"PHP_CodeSniffer" is a style linter for PHP and CSS. See the project's page
+at GitHub for details:
+
+    https://github.com/squizlabs/PHP_CodeSniffer/
+
+Installation~
+
+Install it with: >
+    pear install PHP_CodeSniffer
+<
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+Note~
+
+If you're checking files containing tab characters then "PHP_CodeSniffer"'s
+idea of tabstop must match Vim's 'tabstop', otherwise syntastic will highlight
+the errors at shifted positions. By default syntastic does that by adding
+an option "--tab-width=&tabstop" to "PHP_CodeSniffer", but that option
+also instructs "PHP_CodeSniffer" to expand tabs, and some code sniffers
+(f.i. "CakePHP", see https://github.com/cakephp/cakephp-codesniffer) insist on
+indenting lines with tabs. To work around the resulting mess if you're using
+one of these sniffers, set "--tab-width=0" and 'tabstop' to 8: >
+    let g:syntastic_php_phpcs_args = "--tab-width=0"
+    set tabstop=8
+<
+See also: |syntastic-php-phpcs|.
+
+------------------------------------------------------------------------------
+4. PrettyCSS                                         *syntastic-css-prettycss*
+
+Name:        prettycss
+Maintainer:  LCD 47 <lcd047@gmail.com>
+
+"PrettyCSS" is a beautifier, lint checker, and validator for Cascading
+Stylesheets. For more details see:
+
+PrettyCSS Demo:
+
+    http://fidian.github.io/PrettyCSS/
+
+The project's page at GitHub:
+
+    https://github.com/fidian/PrettyCSS/
+
+Installation~
+
+Install it with: >
+    npm install -g PrettyCSS
+<
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+------------------------------------------------------------------------------
+5. RECESS                                               *syntastic-css-recess*
+
+Name:        recess
+Maintainer:  Tim Carry <tim@pixelastic.com>
+
+"RECESS" is a code quality tool for CSS built on top of LESS. See the
+project's page for details:
+
+    http://twitter.github.io/recess/
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+See also: |syntastic-less-recess|.
+
+------------------------------------------------------------------------------
+6. stylelint                                         *syntastic-css-stylelint*
+
+Name:        stylelint
+Maintainer:  Tim Carry <tim@pixelastic.com>
+
+"stylelint" is a style linter for Cascading Stylesheets. See the project's
+page for more information:
+
+    http://stylelint.io/
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+See also: |syntastic-html-stylelint|, |syntastic-vue-stylelint|.
+
+==============================================================================
+SYNTAX CHECKERS FOR CUCUMBER                     *syntastic-checkers-cucumber*
+
+The following checkers are available for Cucumber (filetype "cucumber"):
+
+    1. Cucumber.................|syntastic-cucumber-cucumber|
+
+------------------------------------------------------------------------------
+1. Cucumber                                      *syntastic-cucumber-cucumber*
+
+Name:        cucumber
+Maintainer:  Martin Grenfell <martin.grenfell@gmail.com>
+
+"Cucumber" is a tool that executes plain-text functional descriptions as
+automated tests. See the project's page for more information:
+
+    http://cukes.info/
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+==============================================================================
+SYNTAX CHECKERS FOR CUDA                             *syntastic-checkers-cuda*
+
+The following checkers are available for CUDA (filetype "cuda"):
+
+    1. NVCC.....................|syntastic-cuda-nvcc|
+
+------------------------------------------------------------------------------
+1. NVCC                                                  *syntastic-cuda-nvcc*
+
+Name:        nvcc
+Author: Hannes Schulz <schulz@ais.uni-bonn.de>
+
+"NVCC" is a CUDA Compiler from nVidia. See the project's page for details:
+
+    https://developer.nvidia.com/cuda-llvm-compiler
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+Additionally:
+
+                                             *'g:syntastic_cuda_check_header'*
+Type: boolean
+Default: 0
+Turn this on to check header files.  The checker then creates an empty file
+".syntastic_dummy.cu" in the base directory of the file being checked.
+Example: >
+    let g:syntastic_cuda_check_header = 1
+<
+                                              *'g:syntastic_cuda_config_file'*
+Type: string
+Default: unset
+File containing additional compilation flags to be passed to the linter, one
+option per line (cf. |syntastic-config-files|).
+
+==============================================================================
+SYNTAX CHECKERS FOR D                                   *syntastic-checkers-d*
+
+The following checkers are available for D (filetype "d"):
+
+    1. DMD......................|syntastic-d-dmd|
+    2. D-Scanner................|syntastic-d-dscanner|
+
+------------------------------------------------------------------------------
+1. DMD                                                       *syntastic-d-dmd*
+
+Name:        dmd
+Maintainer:  Alfredo Di Napoli <alfredo.dinapoli@gmail.com>
+
+Checker options~
+                                                    *'g:syntastic_d_compiler'*
+Type: string
+Default: "dmd"
+Compiler executable.
+
+                                                 *'g:syntastic_d_errorformat'*
+Type: string
+Default: unset
+Override for the default |'errorformat'|.
+
+                                       *'g:syntastic_d_remove_include_errors'*
+Type: boolean
+Default: 0
+By default, errors in files included from the file being checked are shown.
+Set this variable to 1 to remove messages about errors in included files.
+Please note that this means syntastic will silently abort checks if there are
+fatal errors in one of the included files.
+
+                                            *'g:syntastic_d_compiler_options'*
+Type: string
+Default: unset
+Compilation flags (such as defines or include directories) to be passed to the
+linter.
+
+                                                 *'g:syntastic_d_config_file'*
+Type: string
+Default: unset
+File containing additional compilation flags to be passed to the linter, one
+option per line (cf. |syntastic-config-files|).
+
+                                                *'g:syntastic_d_include_dirs'*
+Type: array of strings
+Default: inferred from ".dub/packages"
+Include directories to be passed to the linter, in addition to the above
+compilation flags. You can set it like this: >
+    let g:syntastic_d_include_dirs = ["includes", "headers"]
+<
+and the corresponding "-Iincludes -Iheaders" will be added to the compilation
+flags.
+
+                                                     *'g:syntastic_d_use_dub'*
+Type: boolean
+Default: 1
+Whether to use "dub" to find include directories. This requires "dub" version
+0.9.24 or later.
+
+                                                    *'g:syntastic_d_dub_exec'*
+Type: string
+Default: "dub"
+Path to the "dub" executable. Ignored if |'g:syntastic_d_use_dub'| is unset.
+
+                                                      *'b:syntastic_d_cflags'*
+Type: string
+Default: unset
+Buffer-local variable. Additional compilation flags specific to the current
+buffer.
+
+                                                *'g:syntastic_d_check_header'*
+Type: boolean
+Default: 0
+If the current file is a header (namely if its extension is "di"), all checks
+are silently skipped. You can force syntastic to check header files by setting
+the above variable to 1.
+
+Note~
+
+This checker doesn't call the "makeprgBuild()" function, and thus it ignores
+the usual 'g:syntastic_d_dmd_<option>' variables. The only exception is
+'g:syntastic_d_dmd_exec', which can still be used to override the linter's
+executable.
+
+------------------------------------------------------------------------------
+2. D-Scanner                                            *syntastic-d-dscanner*
+
+Name:        dscanner
+Maintainer:  ANtlord
+
+"D-Scanner" is a tool for analyzing D source code (https://dlang.org/). See
+the project's page at GitHub for more information:
+
+    https://github.com/Hackerpilot/Dscanner
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+==============================================================================
+SYNTAX CHECKERS FOR DART                             *syntastic-checkers-dart*
+
+The following checkers are available for Dart (filetype "dart"):
+
+    1. Analyzer.................|syntastic-dart-dartanalyzer|
+
+------------------------------------------------------------------------------
+1. Analyzer                                      *syntastic-dart-dartanalyzer*
+
+Name:        dartanalyzer
+Maintainer:  Maksim Ryzhikov <rv.maksim@gmail.com>
+
+"Analyzer" is a static analysis tool for Dart (https://www.dartlang.org/).
+See the manual for more information:
+
+    https://www.dartlang.org/tools/analyzer/
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+==============================================================================
+SYNTAX CHECKERS FOR DOCBOOK                         *syntastic-checkers-docbk*
+
+The following checkers are available for DocBook (filetype "docbk"):
+
+    1. Igor.....................|syntastic-docbk-igor|
+    2. xmllint..................|syntastic-docbk-xmllint|
+
+------------------------------------------------------------------------------
+1. Igor                                                 *syntastic-docbk-igor*
+
+Name:        igor
+Maintainer:  LCD 47 <lcd047@gmail.com>
+
+"Igor" is a proofreader for DocBook SGML, man pages, and text files used by
+the FreeBSD project (https://www.freebsd.org/). See the author's presentation
+for details:
+
+    http://www.youtube.com/watch?v=sczHqUPygZY
+
+The latest version can be obtained from Glen Barber's repository:
+
+    http://docscripts.glenbarber.us/tags/igor/
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+See also: |syntastic-nroff-igor|, |syntastic-text-igor|.
+
+------------------------------------------------------------------------------
+2. xmllint                                           *syntastic-docbk-xmllint*
+
+Name:        xmllint
+Maintainer:  Martin Grenfell <martin.grenfell@gmail.com>
+
+"xmllint" is a linter and transformer tool for XML files, distributed with
+the "libxml" package (http://www.xmlsoft.org/). See the tool's manual for more
+information:
+
+    http://xmlsoft.org/xmllint.html
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+Note~
+
+You can use a local installation of DTDs to significantly speed up validation
+and allow you to validate XML data without network access. See the
+"xmlcatalog" manual, and the catalog documentation for more information:
+
+    http://www.xmlsoft.org/xmlcatalog_man.html
+    http://www.xmlsoft.org/catalog.html
+
+For an example of a DTD catalog see f.i. "XMLCatalog":
+
+    https://github.com/darcyparker/XMLCatalog
+
+In order to use it with syntastic you'll have to clone it to a local
+directory, and point the environment variable "XML_CATALOG_FILES" to the file
+"catalog.xml" in the said directory: >
+    XML_CATALOG_FILES=/some/path/XMLCatalog/catalog.xml
+    export XML_CATALOG_FILES
+<
+Otherwise "xmllint" will try to load XML catalogs from "/etc/xml/catalog".
+
+See also: |syntastic-xml-xmllint|, |syntastic-xslt-xmllint|.
+
+==============================================================================
+SYNTAX CHECKERS FOR DOCKERFILE                 *syntastic-checkers-dockerfile*
+
+The following checkers are available for Dockerfile (filetype "dockerfile"):
+
+    1. dockerfile-lint..........|syntastic-dockerfile-dockerfile_lint|
+    2. Hadolint.................|syntastic-dockerfile-hadolint|
+
+------------------------------------------------------------------------------
+1. dockerfile-lint                      *syntastic-dockerfile-dockerfile_lint*
+
+Name:        dockerfile_lint
+Maintainer:  Tim Carry <tim@pixelastic.com>
+
+"dockerfile-lint" is a linter for Dockerfiles
+(http://docs.docker.com/engine/reference/builder). See the project's page at
+GitHub for details:
+
+    https://github.com/projectatomic/dockerfile_lint
+
+Installation~
+
+Install it with: >
+    npm install -g dockerfile_lint
+<
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+------------------------------------------------------------------------------
+2. Hadolint                                    *syntastic-dockerfile-hadolint*
+
+Name:        hadolint
+Maintainer:  Jesper B. Rosenkilde <jbr@humppa.dk>
+
+"Hadolint" is a dockerfile linter written in Haskell. See the project's page
+at GitHub for details:
+
+    https://github.com/lukasmartinelli/hadolint
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+==============================================================================
+SYNTAX CHECKERS FOR DUST                           *syntastic-checkers-dustjs*
+
+The following checkers are available for Dust (filetype "dustjs"):
+
+    1. Swiffer..................|syntastic-dustjs-swiffer|
+
+------------------------------------------------------------------------------
+1. Swiffer                                          *syntastic-dustjs-swiffer*
+
+Name:        swiffer
+Maintainer:  Steven Foote <smfoote@gmail.com>
+
+"Swiffer" is a command line lint tool for Dust. See the project's page for
+details:
+
+    https://github.com/smfoote/Swiffer.js
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+Note~
+
+To enable Dust syntax checking, you must set the filetype of your Dust
+template files to "dustjs". An easy way to do this is by installing the dustjs
+syntax highlighter:
+
+    https://github.com/jimmyhchan/dustjs.vim
+
+==============================================================================
+SYNTAX CHECKERS FOR ELIXIR                         *syntastic-checkers-elixir*
+
+The following checkers are available for Elixir (filetype "elixir"):
+
+    1. elixir...................|syntastic-elixir-elixir|
+
+------------------------------------------------------------------------------
+1. elixir                                            *syntastic-elixir-elixir*
+
+Name:        elixir
+Maintainer:  Richard Ramsden <rramsden@gmail.com>
+
+See the project's page for details:
+
+    http://elixir-lang.org/
+
+Security~
+
+This checker executes the code in the files it checks:
+
+    https://github.com/vim-syntastic/syntastic/issues/1141
+
+This is probably fine if you wrote the files yourself, but it can be a problem
+if you're trying to check third party files. If you are 100% willing to let
+Vim run the code in your files, set 'g:syntastic_enable_elixir_checker' to 1
+in your vimrc to enable this checker: >
+    let g:syntastic_enable_elixir_checker = 1
+<
+There is also a buffer-local version of this variable, that takes precedence
+over a global one in the buffers where it is defined.
+
+Please note that setting this variable doesn't automatically enable the
+checker, you still need to add "elixir" to 'g:syntastic_elixir_checkers' if
+you plan to use it.
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+==============================================================================
+SYNTAX CHECKERS FOR ERLANG                         *syntastic-checkers-erlang*
+
+The following checkers are available for Erlang (filetype "erlang"):
+
+    1. escript..................|syntastic-erlang-escript|
+    2. SyntaxErl................|syntastic-erlang-syntaxerl|
+
+------------------------------------------------------------------------------
+1. escript                                          *syntastic-erlang-escript*
+
+Name:        escript
+Maintainer:  Pawel Salata <rockplayer.pl@gmail.com>
+
+"escript" is an interpreter for Erlang programs. See the tool's manual for
+more information:
+
+    http://www.erlang.org/doc/man/escript.html
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+Note~
+
+If you get warning: "behaviour X undefined" with your customize behaviour, add
+the following line in your vimrc: >
+    let g:syntastic_erlc_include_path = "ebin"
+<
+
+------------------------------------------------------------------------------
+2. SyntaxErl                                      *syntastic-erlang-syntaxerl*
+
+Name:        syntaxerl
+Maintainer:  locojay
+
+"SyntaxErl" is a syntax linter for Erlang. It uses "rebar"
+(https://github.com/basho/rebar) to determine correct dependencies and library
+paths. See the project's page for more information:
+
+    https://github.com/ten0s/syntaxerl
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+==============================================================================
+SYNTAX CHECKERS FOR ERUBY                           *syntastic-checkers-eruby*
+
+The following checkers are available for eRuby (filetype "eruby"):
+
+    1. Ruby.....................|syntastic-eruby-ruby|
+
+------------------------------------------------------------------------------
+1. Ruby                                                 *syntastic-eruby-ruby*
+
+Name:        ruby
+Maintainer:  Martin Grenfell <martin.grenfell@gmail.com>
+
+Checker options~
+                                                     'g:syntastic_ruby_exec'
+Type: string
+Default: "ruby"
+The Ruby executable to use.
+
+Note~
+
+The variable 'g:syntastic_ruby_exec' is also used by the Ruby
+"MRI" checker (cf. |syntastic-ruby-mri|), and it can be overriden
+by 'g:syntastic_eruby_ruby_exec'. However, this checker doesn't
+call the "makeprgBuild()" function, and thus it ignores all other
+'g:syntastic_eruby_ruby_<option>' variables.
+
+==============================================================================
+SYNTAX CHECKERS FOR FORTRAN                       *syntastic-checkers-fortran*
+
+The following checkers are available for Fortran (filetype "fortran"):
+
+    1. GNU Fortran..............|syntastic-fortran-gfortran|
+
+------------------------------------------------------------------------------
+1. GNU Fortran                                    *syntastic-fortran-gfortran*
+
+Name:        gfortran
+Maintainer:  Karl Yngve Lervåg <karl.yngve@lervag.net>
+
+"GNU Fortran" is a checker for Fortran files using either GNU
+Fortran (https://gcc.gnu.org/fortran/) or Intel Fortran Compilers
+(https://software.intel.com/en-us/fortran-compilers).
+
+Checker options~
+                                              *'g:syntastic_fortran_compiler'*
+Type: string
+Default: "gfortran"
+Compiler executable. Set this to either "gfortran" (to use GNU Fortran), or to
+"ifort" (for Intel Fortran).
+
+                                           *'g:syntastic_fortran_errorformat'*
+Type: string
+Default: unset
+Override for the default |'errorformat'|.
+
+                                 *'g:syntastic_fortran_remove_include_errors'*
+Type: boolean
+Default: 0
+By default, errors in files included from the file being checked are shown.
+Set this variable to 1 to remove messages about errors in included files.
+Please note that this means syntastic will silently abort checks if there are
+fatal errors in one of the included files.
+
+                                      *'g:syntastic_fortran_compiler_options'*
+Type: string
+Default: unset
+Compilation flags (such as "-std=f95") to be passed to the linter.
+
+                                           *'g:syntastic_fortran_config_file'*
+Type: string
+Default: unset
+File containing additional compilation flags to be passed to the linter, one
+option per line (cf. |syntastic-config-files|).
+
+                                          *'g:syntastic_fortran_include_dirs'*
+Type: array of strings
+Default: []
+Include directories to be passed to the linter, in addition to the above
+compilation flags. You can set it like this: >
+    let g:syntastic_fortran_include_dirs = ["includes", "headers"]"
+<
+and the corresponding "-Iincludes -Iheaders" will be added to the compilation
+flags.
+
+                                                *'b:syntastic_fortran_cflags'*
+Type: string
+Default: unset
+Buffer-local variable. Additional compilation flags specific to the current
+buffer.
+
+Note~
+
+This checker doesn't call the "makeprgBuild()" function, and thus it ignores
+the usual 'g:syntastic_fortran_gfortran_<option>' variables. The only
+exception is 'g:syntastic_fortran_gfortran_exec', which can still be used to
+override the linter's executable.
+
+==============================================================================
+SYNTAX CHECKERS FOR GENTOO METADATA                *syntastic-checkers-gentoo*
+
+The following checkers are available for Gentoo Metadata (filetype "gentoo"):
+
+    1. xmllint..................|syntastic-gentoo-xmllint|
+
+------------------------------------------------------------------------------
+1. xmllint                                          *syntastic-gentoo-xmllint*
+
+Name:        xmllint
+Maintainer:  James Rowe <jnrowe@gmail.com>
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+Note~
+
+The DTDs required to validate "metadata.xml" files are available in
+"$PORTDIR/metadata/dtd", and these local files can be used to significantly
+speed up validation. You can create a catalog file with: >
+    xmlcatalog --create --add rewriteURI http://www.gentoo.org/dtd/ \
+        ${PORTDIR:-/usr/portage}/metadata/dtd/ /etc/xml/gentoo
+<
+See "xmlcatalog" for more information:
+
+    http://www.xmlsoft.org/catalog.html
+
+==============================================================================
+SYNTAX CHECKERS FOR GETTEXT PO                         *syntastic-checkers-po*
+
+The following checkers are available for gettext .po files (filetype "po"):
+
+    1. Dennis...................|syntastic-po-dennis|
+    2. msgfmt...................|syntastic-po-msgfmt|
+
+------------------------------------------------------------------------------
+1. Dennis                                                *syntastic-po-dennis*
+
+Name:        dennis
+Maintainer:  LCD 47 <lcd047@gmail.com>
+
+"Dennis" is a set of utilities for working with gettext Portable Object
+(http://www.gnu.org/software/gettext/manual/html_node/PO-Files.html)
+translation files:
+
+    https://github.com/willkg/dennis/
+
+See the program's manual for further details:
+
+    http://dennis.readthedocs.io/en/latest/linting.html
+
+Installation~
+
+Install it with "pip": >
+    pip install dennis
+<
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+------------------------------------------------------------------------------
+2. msgfmt                                                *syntastic-po-msgfmt*
+
+Name:        msgfmt
+Maintainer:  Ryo Okubo <syucream1031@gmail.com>
+
+"msgfmt" is a compiler for gettext Portable Object
+(http://www.gnu.org/software/gettext/manual/html_node/PO-Files.html)
+translation files.  See the program's manual for details:
+
+    http://www.gnu.org/software/gettext/manual/html_node/msgfmt-Invocation.html#msgfmt-Invocation
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+==============================================================================
+SYNTAX CHECKERS FOR GLSL                             *syntastic-checkers-glsl*
+
+The following checkers are available for GLSL (filetype "glsl"):
+
+    1. cgc......................|syntastic-glsl-cgc|
+
+------------------------------------------------------------------------------
+1. cgc                                                    *syntastic-glsl-cgc*
+
+Name:        cgc
+Maintainer:  Joshua Rahm <joshuarahm@gmail.com>
+
+"cgc" is a compiler that translates Cg or GLSL programs into OpenGL or DirectX
+code. See the manual for more details:
+
+    http://http.developer.nvidia.com/Cg/cgc.html
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+Additionally:
+
+                                               *'g:syntastic_glsl_extensions'*
+Type: dictionary
+Default: unset
+
+You can control the profiles used by "cgc" with magic comments: put the magic
+comment "// profile:" followed by the profile for "cgc" to use.  For example
+use >
+    // profile: glslf
+<
+to force the fragment shader profile.
+
+If the magic comment does not exist, then the dictionary
+'g:syntastic_glsl_extensions' is used to infer the appropriate profile from
+the current file's extension. If this dictionary does not exist either, a
+default dictionary is used instead. Finally, if the current file's extension
+cannot be found in these dictionaries, the checker assumes a vertex shader
+profile.
+
+                                                  *'g:syntastic_glsl_options'*
+Type: string
+Default: unset
+Additional arguments to pass to "cgc".
+
+Note~
+
+You probably also need a plugin to set |filetype| for OpenGL files, such as
+"vim-glsl":
+
+    https://github.com/tikhomirov/vim-glsl
+
+==============================================================================
+SYNTAX CHECKERS FOR GO                                 *syntastic-checkers-go*
+
+The following checkers are available for Go (filetype "go"):
+
+    1. go.......................|syntastic-go-go|
+    2. gofmt....................|syntastic-go-gofmt|
+    3. GolangCI-Lint............|syntastic-go-golangci_lint|
+    4. Golint...................|syntastic-go-golint|
+    5. Go Meta Linter...........|syntastic-go-gometalinter|
+    6. gotype...................|syntastic-go-gotype|
+    7. vet......................|syntastic-go-govet|
+
+------------------------------------------------------------------------------
+1. go                                                        *syntastic-go-go*
+
+Name:        go
+Maintainer:  Kamil Kisiel <kamil@kamilkisiel.net>
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+Additionally:
+
+                                              *'g:syntastic_go_go_build_args'*
+Type: string
+Default: "-buildmode=archive"
+arguments passed to "go build"
+
+                                               *'g:syntastic_go_go_test_args'*
+Type: string
+Default: "-buildmode=archive"
+arguments passed to "go test".
+
+Note~
+
+This syntax checker does not reformat your source code.  Use a |BufWritePre|
+autocommand towards that end: >
+    autocmd FileType go autocmd BufWritePre <buffer> Fmt
+<
+------------------------------------------------------------------------------
+2. gofmt                                                  *syntastic-go-gofmt*
+
+Name:        gofmt
+Maintainer:  Brandon Thomson <bt@brandonthomson.com>
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+Note~
+
+This syntax checker does not reformat your source code.  Use a |BufWritePre|
+autocommand towards that end: >
+    autocmd FileType go autocmd BufWritePre <buffer> Fmt
+<
+------------------------------------------------------------------------------
+3. GolangCI-Lint                                  *syntastic-go-golangci_lint*
+
+Name:        golangci_lint
+Maintainer:  Elvis Macak <elvis@lnmpy.com>
+
+GolangCI-Lint is a linters aggregator. See the project's page for details:
+
+    https://github.com/golangci/golangci-lint
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+------------------------------------------------------------------------------
+4. Golint                                                *syntastic-go-golint*
+
+Name:        golint
+Maintainer: Hiroshi Ioka <hirochachacha@gmail.com>
+
+"Golint" is a linter for Go. See the project's page for details:
+
+    https://github.com/golang/lint
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+------------------------------------------------------------------------------
+5. Go Meta Linter                                  *syntastic-go-gometalinter*
+
+Name:        gometalinter
+Maintainer: Joshua Rubin <joshua@rubixconsulting.com>
+
+"Go Meta Linter" is a linter for Go. It runs a number of other linters
+against your files, and normalises their output to a standard format.
+See the project's page at GitHub for details:
+
+    https://github.com/alecthomas/gometalinter
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+------------------------------------------------------------------------------
+6. gotype                                                *syntastic-go-gotype*
+
+Name:        gotype
+Maintainer:  luz <ne.tetewi@gmail.com>
+
+See the tool's documentation for details:
+
+    https://godoc.org/golang.org/x/tools/cmd/gotype
+
+------------------------------------------------------------------------------
+7. vet                                                    *syntastic-go-govet*
+
+Name:        govet
+Maintainer:  Kamil Kisiel <kamil@kamilkisiel.net>
+
+See the tool's documentation for details:
+
+    https://godoc.org/cmd/vet
+
+Note~
+
+This checker doesn't call the "makeprgBuild()" function, and thus it ignores
+the usual 'g:syntastic_go_govet_<option>' variables.
+
+==============================================================================
+SYNTAX CHECKERS FOR HAML                             *syntastic-checkers-haml*
+
+The following checkers are available for Haml (filetype "haml"):
+
+    1. Haml.....................|syntastic-haml-haml|
+    2. HAML-Lint................|syntastic-haml-haml_lint|
+
+------------------------------------------------------------------------------
+1. Haml                                                  *syntastic-haml-haml*
+
+Name:        haml
+Maintainer:  Martin Grenfell <martin.grenfell@gmail.com>
+
+See the project's page for details:
+
+    http://haml.info/
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+------------------------------------------------------------------------------
+2. HAML-Lint                                        *syntastic-haml-haml_lint*
+
+Name:        haml_lint
+Maintainer:  Shane da Silva <shane@dasilva.io>
+
+"HAML-Lint" is a linter for HAML files. See the project's page for details:
+
+    https://github.com/causes/haml-lint
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+==============================================================================
+SYNTAX CHECKERS FOR HANDLEBARS                 *syntastic-checkers-handlebars*
+
+The following checkers are available for Handlebars (filetype "handlebars"):
+
+    1. Handlebars...............|syntastic-handlebars-handlebars|
+
+------------------------------------------------------------------------------
+1. Handlebars                                *syntastic-handlebars-handlebars*
+
+Name:        handlebars
+Maintainer:  Jeremy Mack
+
+"Handlebars" is a JavaScript library for building semantic templates. See the
+project's page for details:
+
+    http://handlebarsjs.com/
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+Note~
+
+You probably also need a plugin to set |filetype| for Handlebars files, such as
+"vim-mustache-handlebars":
+
+    https://github.com/mustache/vim-mustache-handlebars
+
+==============================================================================
+SYNTAX CHECKERS FOR HASKELL                       *syntastic-checkers-haskell*
+
+The following checkers are available for Haskell (filetype "haskell"):
+
+    1. hdevtools................|syntastic-haskell-hdevtools|
+    2. HLint....................|syntastic-haskell-hlint|
+    3. Style scanner............|syntastic-haskell-scan|
+
+------------------------------------------------------------------------------
+1. hdevtools                                     *syntastic-haskell-hdevtools*
+
+Name:        hdevtools
+Maintainer:  Anthony Carapetis <anthony.carapetis@gmail.com>
+
+"hdevtools" is a backend for text editor plugins. See the project's page at
+GitHub for details:
+
+    https://github.com/bitc/hdevtools/
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+Note~
+
+If you're checking files containing tab characters, then Vim's 'tabstop'
+must match "hdevtools"'s idea of tabstop, otherwise column numbers will be
+shifted. At the time of this writing, "hdevtools"'s tabstop is hardcoded to 8,
+so you should probably add something like this to your vimrc: >
+    set tabstop=8
+<
+------------------------------------------------------------------------------
+2. HLint                                             *syntastic-haskell-hlint*
+
+Name:        hlint
+Maintainer:  Nicolas Wu <nicolas.wu@gmail.com>
+
+"HLint" is a linter and style checker for Haskell. See the project's page for
+details:
+
+    http://community.haskell.org/~ndm/hlint/
+
+Syntastic requires "hlint" version 1.9.4 or later.
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+Note~
+
+If you're checking files containing tab characters, Vim's 'tabstop' must
+match "HLint"'s idea of tabstop, otherwise column numbers will be shifted. At
+the time of this writing "HLint"'s tabstop is hardcoded to 8, so you should
+probably add something like this to your vimrc: >
+    set tabstop=8
+<
+------------------------------------------------------------------------------
+3. Style scanner                                      *syntastic-haskell-scan*
+
+Name:        scan
+Maintainer:  LCD 47 <lcd047@gmail.com>
+
+"Style scanner" is a style linter for Haskell. See the project's page for
+details:
+
+    http://projects.haskell.org/style-scanner/
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+Note~
+
+If you're checking files containing tab characters, Vim's 'tabstop' must
+match "Style scanner"'s idea of tabstop, otherwise column numbers will be
+shifted. At the time of this writing "Style scanner"'s tabstop is hardcoded to
+8, so you should probably add something like this to your vimrc: >
+    set tabstop=8
+<
+==============================================================================
+SYNTAX CHECKERS FOR HAXE                             *syntastic-checkers-haxe*
+
+The following checkers are available for Haxe (filetype "haxe"):
+
+    1. Haxe.....................|syntastic-haxe-haxe|
+
+------------------------------------------------------------------------------
+1. Haxe                                                  *syntastic-haxe-haxe*
+
+Name:        haxe
+Maintainer:  David Bernard <david.bernard.31@gmail.com>
+
+"Haxe" is a programming language and compiler that can produce applications
+and source code for multiple different platforms from a single code-base. See
+the project's page for details:
+
+    http://haxe.org/
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+Additionally:
+
+                                                               *'g:vaxe_hxml'*
+                                                               *'b:vaxe_hxml'*
+Type: string
+Default: unset
+By default the checker will search parent folders for "hxml" files, and
+use the first one it finds. You can override that behaviour by pointing
+'g:vaxe_hxml' or 'b:vaxe_hxml' to a specific build file. Those variables can
+also be set by Vaxe:
+
+    https://github.com/jdonaldson/vaxe
+
+==============================================================================
+SYNTAX CHECKERS FOR HSS                               *syntastic-checkers-hss*
+
+The following checkers are available for HSS (filetype "hss"):
+
+    1. HSS......................|syntastic-hss-hss|
+
+------------------------------------------------------------------------------
+1. HSS                                                     *syntastic-hss-hss*
+
+Name:        hss
+Maintainer:  Justin Donaldson <jdonaldson@gmail.com>
+
+"HSS" is a tool that extends the CSS syntax with features such as variables
+and nested blocks. See the project's page for details:
+
+    http://ncannasse.fr/projects/hss
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+==============================================================================
+SYNTAX CHECKERS FOR HTML                             *syntastic-checkers-html*
+
+The following checkers are available for HTML (filetype "html"):
+
+    1. ESLint...................|syntastic-html-eslint|
+    2. gjslint..................|syntastic-html-gjslint|
+    3. HTML tidy................|syntastic-html-tidy|
+    4. HTMLHint.................|syntastic-html-htmlhint|
+    5. JSHint...................|syntastic-html-jshint|
+    6. proselint................|syntastic-html-proselint|
+    7. stylelint................|syntastic-html-stylelint|
+    8. textlint.................|syntastic-html-textlint|
+    9. Validator................|syntastic-html-validator|
+    10. W3......................|syntastic-html-w3|
+
+------------------------------------------------------------------------------
+1. ESLint                                              *syntastic-html-eslint*
+
+Name:        eslint
+Maintainer:  LCD 47 <lcd047@gmail.com>
+
+"ESLint" is a tool for identifying and reporting on patterns found in
+ECMAScript/JavaScript code. It can also detect problems in JavaScript code
+embedded in HTML files. See the project's page for details:
+
+    https://github.com/nzakas/eslint
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+Notes~
+
+Automatically fixing errors (option "--fix") is not supported.
+
+You can also use "eslint_d" (https://github.com/mantoni/eslint_d.js), version
+2.1.0 or later, instead of "ESLint". Just point 'g:syntastic_html_eslint_exec'
+to it:
+
+    https://github.com/mantoni/eslint_d.js#editor-integration
+
+See also: |syntastic-javascript-eslint|, |syntastic-typescript-eslint|,
+|syntastic-vue-eslint|.
+
+------------------------------------------------------------------------------
+2. gjslint                                            *syntastic-html-gjslint*
+
+Name:        gjslint
+Maintainer:  Martin Grenfell <martin.grenfell@gmail.com>
+
+"Closure Linter", or "gjslint", is a style linter for JavaScript. It can also
+detect problems in HTML files. See the project's page for more information:
+
+    https://developers.google.com/closure/utilities/
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+See also: |syntastic-javascript-gjslint|.
+
+------------------------------------------------------------------------------
+3. HTML tidy                                             *syntastic-html-tidy*
+
+Name:        tidy
+Maintainer:  Martin Grenfell <martin.grenfell@gmail.com>
+
+"HTML Tidy" is a syntax linter and formatter for HTML. See the project's page
+for more information:
+
+    http://www.html-tidy.org/
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+Additionally:
+
+                                       *'g:syntastic_html_tidy_ignore_errors'*
+Type: array of strings
+Default: []
+List of errors to ignore. Case-sensitive patterns matched as substrings
+(not regular expressions) against the error messages. See also
+|'syntastic_quiet_messages'|.
+
+                                     *'g:syntastic_html_tidy_blocklevel_tags'*
+Type: array of strings
+Default: []
+List of additional blocklevel tags to be added to "--new-blocklevel-tags".
+
+                                         *'g:syntastic_html_tidy_inline_tags'*
+Type: array of strings
+Default: []
+List of additional inline tags to be added to "--new-inline-tags".
+
+                                          *'g:syntastic_html_tidy_empty_tags'*
+Type: array of strings
+Default: []
+List of additional empty tags, to be added to "--new-empty-tags".
+
+See also: |syntastic-xhtml-tidy|.
+
+------------------------------------------------------------------------------
+4. HTMLHint                                          *syntastic-html-htmlhint*
+
+Name:        HTMLHint
+Maintainer:  LCD 47 <lcd047@gmail.com>
+
+"HTMLHint" is a static code analysis tool for HTML. See the project's page for
+details:
+
+    http://htmlhint.com/
+
+Syntastic requires "HTMLHint" version 0.9.13 or later.
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+------------------------------------------------------------------------------
+5. jshint                                              *syntastic-html-jshint*
+
+Name:        JSHint
+Maintainer:  LCD 47 <lcd047@gmail.com>
+
+"JSHint" can detect JavaScript errors and potential problems in HTML
+files. See the project's page for details:
+
+    http://jshint.com/
+
+Syntastic requires "JSHint" version 2.4.0 or later.
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+Note~
+
+If you're checking files containing tab characters then "JSHint"'s idea of
+tabstop must match Vim's 'tabstop', otherwise syntastic will highlight the
+errors at shifted positions. By default "JSHint"'s tabstop is 4, while Vim's
+default 'tabstop' is 8.
+
+In order to change "JSHint"'s tabstop you have to change its "indent" config
+option (cf. http://jshint.com/docs/options/#indent). One way to do that is
+to put it in a file named ".jshintrc" in the current directory, the parent
+directories, or your home directory. The file is supposed to be in JSON
+format. For example: >
+    {
+        "indent": 8
+    }
+<
+See JSHint documentation for more details:
+
+    http://jshint.com/docs/
+
+Please note however that setting "indent" also triggers the indentation checks
+in "JSHint". If that is undesirable, your only other option is to leave
+"JSHint"'s tabstop alone, and change Vim's 'tabstop' to 4. To change Vim's
+'tabstop', you can add this to your vimrc: >
+    set tabstop=4
+<
+See also: |syntastic-javascript-jshint|, |syntastic-xhtml-jshint|.
+
+------------------------------------------------------------------------------
+6. proselint                                        *syntastic-html-proselint*
+
+Name:        proselint
+Maintainer:  LCD 47 <lcd047@gmail.com>
+
+"proselint" is a linter for prose. See the page for details:
+
+    http://proselint.com/
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+See also: |syntastic-asciidoc-proselint|, |syntastic-help-proselint|,
+|syntastic-markdown-proselint|, |syntastic-nroff-proselint|,
+|syntastic-pod-proselint|, |syntastic-rst-proselint|,
+|syntastic-tex-proselint|, |syntastic-texinfo-proselint|,
+|syntastic-text-proselint|, |syntastic-xhtml-proselint|.
+
+------------------------------------------------------------------------------
+7. stylelint                                        *syntastic-html-stylelint*
+
+Name:        stylelint
+Maintainer:  Tim Carry <tim@pixelastic.com>
+
+"stylelint" is a style linter for Cascading Stylesheets. See the project's
+page for more information:
+
+    http://stylelint.io/
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+See also: |syntastic-css-stylelint|, |syntastic-vue-stylelint|.
+
+------------------------------------------------------------------------------
+8. textlint                                          *syntastic-html-textlint*
+
+Name:        textlint
+Maintainer:  LCD 47 <lcd047@gmail.com>
+
+"textlint" is a natural language linter for text, Markdown, and HTML files.
+See the project's page for details:
+
+    https://textlint.github.io/
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+Note~
+
+You need to install both "textlint" and the "textlint HTML" plugin for this to
+work:
+
+    https://github.com/textlint/textlint-plugin-html
+
+See also: |syntastic-markdown-textlint|, |syntastic-text-textlint|.
+
+------------------------------------------------------------------------------
+9. Validator                                        *syntastic-html-validator*
+
+Name:        validator
+Maintainer:  LCD 47 <lcd047@gmail.com>
+
+"Validator" is a non-DTD-based HTML linter.  See the project's page for
+details:
+
+    http://validator.github.io/validator/
+
+As a syntastic linter, you can validate your files against the online service
+(see https://validator.nu/), or you can install "vnu.jar":
+
+    https://github.com/validator/validator/releases/latest
+
+then run it as a HTTP server: >
+    $ java -Xss512k -cp /path/to/vnu.jar nu.validator.servlet.Main 8888
+<
+Requirement~
+
+This checker uses cURL:
+
+    http://curl.haxx.se/
+
+Checker options~
+
+                                            *'g:syntastic_html_validator_api'*
+Type: string
+Default: "http://validator.nu/"
+URL of the service to use for checking. Leave it to the default to run the
+checks against "https://validator.nu/", or set it to "http://localhost:8888/"
+if you have "vnu.jar" installed, and you're running it as a standalone HTTP
+server. See:
+
+    http://validator.github.io/validator/#standalone
+
+                                         *'g:syntastic_html_validator_parser'*
+Type: string
+Default: empty
+Parser to use. Legal values are: "xml", "xmldtd", "html", "html5", "html4",
+and "html4tr". Set it to "html5" to check HTML5 files. References:
+
+    https://wiki.whatwg.org/wiki/Validator.nu_Common_Input_Parameters#parser
+
+                                       *'g:syntastic_html_validator_nsfilter'*
+Type: string
+Default: empty
+Sets the "nsfilter" for the parser. See:
+
+    https://wiki.whatwg.org/wiki/Validator.nu_Common_Input_Parameters#nsfilter
+
+                                         *'g:syntastic_html_validator_schema'*
+Type: string
+Default: empty
+Sets the "schema" for the parser. See:
+
+    https://wiki.whatwg.org/wiki/Validator.nu_Common_Input_Parameters#schema
+
+                                           *'g:syntastic_html_validator_exec'*
+Type: string
+Default: "curl"
+Path to the "cURL" executable. Override it with a full path if your "cURL" is
+not installed in a standard location.
+
+This checker doesn't call the "makeprgBuild()" function, and thus it ignores
+the usual 'g:syntastic_html_validator_<option>' variables. The only exception
+is 'g:syntastic_html_validator_exec', which can be used to override the path
+to the "cURL" executable.
+
+Note~
+
+Non-zero exit codes from "cURL" are typically network errors, and are signaled
+by syntastic with messages such as: >
+    syntastic: error: checker html/validator returned abnormal status 26
+<
+You can lookup the meaning of these codes in cURL's manual:
+    
+    http://curl.haxx.se/docs/manpage.html#EXIT
+
+See also: |syntastic-svg-validator|, |syntastic-xhtml-validator|.
+
+------------------------------------------------------------------------------
+10. W3                                                     *syntastic-html-w3*
+
+Name:        w3
+Maintainer:  Martin Grenfell <martin.grenfell@gmail.com>
+
+"W3" is the W3C Markup Validator for HTML.  See the project's page for
+details:
+
+    https://validator.w3.org/source/
+
+As a syntastic linter, you can validate your files against the online service
+(see https://validator.w3.org/), or you can install it from sources and run it
+as a local service:
+
+    https://github.com/w3c/markup-validator/
+
+Requirement~
+
+This checker uses cURL:
+
+    https://curl.haxx.se/
+
+Checker options~
+
+                                                   *'g:syntastic_html_w3_api'*
+Type: string
+Default: "https://validator.w3.org/check"
+URL of the service to use for checking. Leave it to the default to
+run the checks against "https://validator.w3.org/", or set it to
+"http://localhost/w3c-validator/check" if you're running a local service.
+
+                                               *'g:syntastic_html_w3_doctype'*
+Type: string
+Default: "HTML5"
+Name of the document type definition to use for checking.  If unspecified, the
+type is detected from the file content.  Currently supported values for HTML:
+
+  - HTML5
+  - HTML 4.01 Strict
+  - HTML 4.01 Transitional
+  - HTML 4.01 Frameset
+  - HTML 4.01 + RDFa 1.1
+  - HTML 3.2
+  - HTML 2.0
+  - ISO/IEC 15445:2000 ("ISO HTML")
+
+References:
+
+    https://github.com/w3c/markup-validator/blob/master/htdocs/doctype-select.html
+    https://github.com/w3c/markup-validator/blob/master/htdocs/config/types.conf
+
+                                                  *'g:syntastic_html_w3_exec'*
+Type: string
+Default: "curl"
+Path to the "cURL" executable. Override it with a full path if your "cURL" is
+not installed in a standard location.
+
+This checker doesn't call the "makeprgBuild()" function, and thus it ignores
+the usual 'g:syntastic_html_w3_<option>' variables. The only exception is
+'g:syntastic_html_w3_exec', which can be used to override the path to the
+"cURL" executable.
+
+Note~
+
+Non-zero exit codes from "cURL" are typically network errors, and are signaled
+by syntastic with messages such as: >
+    syntastic: error: checker html/w3 returned abnormal status 26
+<
+You can lookup the meaning of these codes in cURL's manual:
+    
+    https://curl.haxx.se/docs/manpage.html#EXIT
+
+See also: |syntastic-svg-w3|, |syntastic-xhtml-w3|.
+
+==============================================================================
+SYNTAX CHECKERS FOR JAVA                             *syntastic-checkers-java*
+
+The following checkers are available for Java (filetype "java"):
+
+    1. checkstyle...............|syntastic-java-checkstyle|
+    2. javac....................|syntastic-java-javac|
+
+------------------------------------------------------------------------------
+1. checkstyle                                      *syntastic-java-checkstyle*
+
+Name:        checkstyle
+Maintainer:  Dmitry Geurkov <d.geurkov@gmail.com>
+
+"Checkstyle" is a style linter for Java.  See the project's page for details:
+
+    http://checkstyle.sourceforge.net/
+
+You need a working installation of Java Runtime Environment to run
+"Checkstyle".
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+Additionally:
+
+                                     *'g:syntastic_java_checkstyle_classpath'*
+Type: string
+Default: "checkstyle-6.10.1-all.jar"
+Classpath to use. Multiple files are allowed.
+
+                                     *'g:syntastic_java_checkstyle_conf_file'*
+Type: string
+Default: "sun_checks.xml"
+Path to the configuration file for the "-c" option (cf.
+http://checkstyle.sourceforge.net/cmdline.html#Command_line_usage).
+
+                                          *'g:syntastic_java_checkstyle_exec'*
+Type: string
+Default: "java"
+Path to the "java" executable.
+
+Notes~
+
+1. The checker was tested with "checkstyle" version 5.5. If you're using
+it with version 5.6 or later you should remove DoubleCheckedLocking from
+your configuration file:
+
+    http://stackoverflow.com/a/12798807/1658042
+
+2. At the time of this writing, the "checkstyle" checker doesn't distinguish
+between error severity levels. All messages are treated as errors, regardless
+of their severity defined in the "checkstyle" config file.
+
+3. You can specify a property file: >
+    let g:syntastic_java_checkstyle_post_args =
+        \ ["-p", "/path/to/checkstyle.properties"]
+<
+4. You probably want to download the "fat jar" "checkstyle-*-all.jar" and
+point |'g:syntastic_java_checkstyle_classpath'| to it:
+
+    http://iweb.dl.sourceforge.net/project/checkstyle/checkstyle/
+    http://checkstyle.sourceforge.net/cmdline.html#Usage_by_Classpath_update
+
+Current builds at Maven Central do not package "checkstyle" with its
+dependencies:
+
+    http://search.maven.org/#search|gav|1|g%3A%22com.puppycrawl.tools%22%20AND%20a%3A%22checkstyle%22
+
+However, |'g:syntastic_java_checkstyle_classpath'| accepts multiple files if
+you want to include the "checkstyle" jar and all of its dependencies.
+
+------------------------------------------------------------------------------
+2. javac                                                *syntastic-java-javac*
+
+Name:        javac
+Maintainers: Jochen Keil <jochen.keil@gmail.com>
+             Dmitry Geurkov <d.geurkov@gmail.com>
+
+Note~
+
+This checker is not suitable for use with large Java projects. The design
+of "javac" makes this checker prone to running into various limitations of
+your shell, Vim, and your Java compiler. You are strongly advised to use
+something like Eclim (http://eclim.org/) instead of syntastic for projects of
+any substantial size or complexity.
+
+Commands~
+
+The following commands are available:
+
+                                                *:SyntasticJavacEditClasspath*
+This opens a new window where you can specify a classpath. Individual paths
+may be specified one per line, or separated by colons ":" on UNIX, or by
+semicolons ";" on Windows.
+
+                                                   *:SyntasticJavacEditConfig*
+This command relevant only if |'g:syntastic_java_javac_config_file_enabled'|
+is set. It opens a buffer where you can specify project-specific options from
+the list below. These options will be saved in a file pointed to by
+|'g:syntastic_java_javac_config_file'| (".syntastic_javac_config" by default).
+Set |'g:syntastic_java_javac_config_file'| to a full path to use a
+project-wide configuration file, rather than a file in the current directory.
+The settings have to be specified as Vim commands.
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+Additionally:
+
+                                         *'g:syntastic_java_javac_executable'*
+Type: string
+Default: "javac"
+Compiler executable used for checking files.
+
+                                         *'g:syntastic_java_maven_executable'*
+Type: string
+Default: "mvn"
+Maven executable used for loading classpath for "maven" projects.
+
+                                            *'g:syntastic_java_javac_options'*
+Type: string
+Default: "-Xlint"
+Options for "javac".
+
+                                          *'g:syntastic_java_javac_classpath'*
+Type: string
+Default: ""
+Classpath. It can be changed by running the `:SyntasticJavacEditClasspath`
+command.
+
+                                      *'g:syntastic_java_javac_delete_output'*
+Type: boolean
+Default: 1
+When set the checker will delete the ".class" files created by "javac".
+
+                           *'g:syntastic_java_javac_autoload_maven_classpath'*
+Type: boolean
+Default: 1
+If enabled and a file "pom.xml" is found in the current working directory,
+"maven" is used to load classpath.
+
+                                        *'g:syntastic_java_javac_config_file'*
+Type: string
+Default: ".syntastic_javac_config"
+Path to the configuration file used by "javac". As usual, if a filename is
+specified rather than a full path, the file is created and looked for in the
+current directory.
+
+                                *'g:syntastic_java_javac_config_file_enabled'*
+Type: boolean
+Default: 0
+When enabled, the classpath is written to the file pointed to by
+|'g:syntastic_java_javac_config_file'|. The file is created as needed.
+You can edit this file with the `:SyntasticJavacEditClasspath` command.
+The change will take effect next time you run the checker.
+
+                           *'g:syntastic_java_javac_custom_classpath_command'*
+Type: string
+Default: ""
+Custom command to run in order to get the classpath. The command classpath
+output can be in traditional Java form, or specified on separate lines.
+"%file_path%", "%FILE_NAME%", and "%FILE_DIR%" are expanded to the current
+file's full path, filename, and base directory respectively, all of them
+escaped for use in a shell command.
+
+Using Ant~
+
+When using "ant" (http://ant.apache.org/) you can have a custom build target
+(named for example "path") that will output your project's classpath. You can
+then use `:SyntasticJavacEditConfig` and add the following line to use it with
+"javac" linter: >
+    let g:syntastic_java_javac_custom_classpath_command =
+        \ "ant -q path | grep echo | cut -f2- -d] | tr -d ' ' | tr ':' '\n'"
+<
+Using Gradle~
+
+For "Gradle" projects (http://gradle.org/) you might consider using
+"gradle-syntastic-plugin":
+
+    https://github.com/Scuilion/gradle-syntastic-plugin
+
+This will write the relevant classpath to a file ".syntastic_javac_config".
+
+==============================================================================
+SYNTAX CHECKERS FOR JAVASCRIPT                 *syntastic-checkers-javascript*
+
+The following checkers are available for JavaScript (filetype "javascript"):
+
+    1. Closure Compiler.........|syntastic-javascript-closurecompiler|
+    2. ESLint...................|syntastic-javascript-eslint|
+    3. Flow.....................|syntastic-javascript-flow|
+    4. gjslint..................|syntastic-javascript-gjslint|
+    5. JavaScript Lint..........|syntastic-javascript-jsl|
+    6. JSCS.....................|syntastic-javascript-jscs|
+    7. JSHint...................|syntastic-javascript-jshint|
+    8. JSLint...................|syntastic-javascript-jslint|
+    9. JSXHint..................|syntastic-javascript-jsxhint|
+    10. Lynt....................|syntastic-javascript-lynt|
+    11. mixedindentlint.........|syntastic-javascript-mixedindentlint|
+    12. standard................|syntastic-javascript-standard|
+    13. tern-lint...............|syntastic-javascript-tern_lint|
+
+------------------------------------------------------------------------------
+1. Closure Compiler                     *syntastic-javascript-closurecompiler*
+
+Name:        closurecompiler
+Maintainer:  Motohiro Takayama <mootoh@gmail.com>
+
+"Closure Compiler" is a compiler for JavaScript maintained by Google. See the
+project's page for details:
+
+    https://developers.google.com/closure/compiler/
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+Additionally:
+
+                               *'g:syntastic_javascript_closurecompiler_path'*
+Type: string
+Default: unset
+Path to "google-closure-compiler.jar"
+
+                             *'g:syntastic_javascript_closurecompiler_script'*
+Type: string
+Default: unset
+Path to a "closurecompiler" executable script.
+
+Note~
+
+In order to enable the checker you have to set exactly one of the options
+above. If you have a package manager (such as "Homebrew") that installs a
+shell script that runs "Closure Compiler", point
+|'g:syntastic_javascript_closurecompiler_script'| to that script. Otherwise
+set |'g:syntastic_javascript_closurecompiler_path'| to point to the "Closure
+Compiler" jar file.
+
+------------------------------------------------------------------------------
+2. ESLint                                        *syntastic-javascript-eslint*
+
+Name:        eslint
+Maintainer:  Maksim Ryzhikov <rv.maksim@gmail.com>
+
+"ESLint" is a tool for identifying and reporting on patterns found in
+ECMAScript/JavaScript code. See the project's page for details:
+
+    https://github.com/nzakas/eslint
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+Note~
+
+You can also use "eslint_d" (https://github.com/mantoni/eslint_d.js),
+version 2.1.0 or later, instead of "ESLint". Just point
+'g:syntastic_javascript_eslint_exec' to it:
+
+    https://github.com/mantoni/eslint_d.js#editor-integration
+
+See also: |syntastic-html-eslint|, |syntastic-typescript-eslint|,
+|syntastic-vue-eslint|.
+
+------------------------------------------------------------------------------
+3. Flow                                            *syntastic-javascript-flow*
+
+Name:        flow
+Maintainer:  Michael Robinson <mike@pagesofinterest.net>
+
+"Flow" is a static type linter for JavaScript, written by Facebook. See the
+project's page for details:
+
+    http://flowtype.org/
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+Notes~
+
+Syntastic requires "Flow" version 0.34.0 or later.
+
+To use "Flow" with your projects, you must:
+
+a. Install it:
+
+    https://github.com/flowtype/flow-bin
+
+b. Configure your project:
+>
+    cd /path/to/your/project
+    flow init
+<
+c. Read the docs to find out more. It won't work out of the box.
+
+    http://flowtype.org/docs/existing.html
+
+------------------------------------------------------------------------------
+4. gjslint                                      *syntastic-javascript-gjslint*
+
+Name:        gjslint
+Maintainer:  Martin Grenfell <martin.grenfell@gmail.com>
+
+"Closure Linter", or "gjslint", is a style linter for JavaScript. See the
+project's page for more information:
+
+    https://developers.google.com/closure/utilities/
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+See also: |syntastic-html-gjslint|.
+
+------------------------------------------------------------------------------
+5. JavaScript Lint                                  *syntastic-javascript-jsl*
+
+Name:        jsl
+Maintainer:  Martin Grenfell <martin.grenfell@gmail.com>
+
+For details about "JavaScript Lint" see the project's page:
+
+    http://www.javascriptlint.com/
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+------------------------------------------------------------------------------
+6. JSCS                                            *syntastic-javascript-jscs*
+
+Name:        jscs
+Maintainer:  LCD 47 <lcd047@gmail.com>
+
+"JSCS" is a code style linter for JavaScript. See the project's page for
+more information:
+
+    https://github.com/mdevils/node-jscs
+
+Syntastic requires "JSCS" version 0.2.0 or later.
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+------------------------------------------------------------------------------
+7. JSHint                                        *syntastic-javascript-jshint*
+
+Name:        jshint
+Maintainer:  Martin Grenfell <martin.grenfell@gmail.com>
+
+"JSHint" is a tool to detect errors and potential problems in JavaScript
+files. See the project's page for details:
+
+    http://jshint.com/
+
+Syntastic requires "JSHint" version 1.0.0 or later.
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+Notes~
+
+If you're checking files containing tab characters then "JSHint"'s idea of
+tabstop must match Vim's 'tabstop', otherwise syntastic will highlight the
+errors at shifted positions. By default "JSHint"'s tabstop is 4, while Vim's
+default 'tabstop' is 8.
+
+In order to change "JSHint"'s tabstop you have to change its "indent" config
+option (cf. http://jshint.com/docs/options/#indent). One way to do that is
+to put it in a file named ".jshintrc" in the current directory, the parent
+directories, or your home directory. The file is supposed to be in JSON
+format. For example: >
+    {
+        "indent": 8
+    }
+<
+See JSHint documentation for more details:
+
+    http://jshint.com/docs/
+
+Please note however that setting "indent" also triggers the indentation checks
+in "JSHint". If that is undesirable, your only other option is to leave
+"JSHint"'s tabstop alone, and change Vim's 'tabstop' to 4. To change Vim's
+'tabstop', you can add this to your vimrc: >
+    set tabstop=4
+<
+See also: |syntastic-html-jshint|, |syntastic-xhtml-jshint|.
+
+------------------------------------------------------------------------------
+8. JSLint                                        *syntastic-javascript-jslint*
+
+Name:        jslint
+Maintainer:  Martin Grenfell <martin.grenfell@gmail.com>
+
+"JSLint" is a code quality linter for JavaScript. See the program's page for
+details:
+
+    http://www.jslint.com/
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+Note~
+
+By default the checker calls "JSLint" with these options: >
+    --white --nomen --regexp --plusplus --bitwise --newcap --sloppy --vars
+<
+This can be changed by setting 'g:syntastic_javascript_jslint_args' in your
+vimrc to your own list of options, for example: >
+    let g:syntastic_javascript_jslint_args = 
+        \ "--nomen --regexp --browser --devel --windows --sloppy --vars"
+<
+Setting this variable to the empty string "" is allowed, and instructs
+syntastic to call "JSLint" with no options.
+
+------------------------------------------------------------------------------
+9. JSXHint                                      *syntastic-javascript-jsxhint*
+
+Name:        jsxhint
+Maintainer:  Thomas Boyt <me@thomasboyt.com>
+
+"JSXHint" is a wrapper around JSHint (http://jshint.com/) for
+linting JSX syntax, which is inline markup-in-JS used by React
+(http://facebook.github.io/react/docs/getting-started.html).
+
+See the project's page for details:
+
+    https://github.com/strml/jsxhint
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+Installation~
+
+Install it with "npm": >
+    npm install -g jsxhint
+<
+Syntastic requires "JSXHint" version v0.4.1 or later. You also need "JSHint"
+v1.1.0 or later.
+
+Note~
+
+Since "JSXHint" is a wrapper around JSHint, the following note relevant to
+the latter still applies:
+
+If you're checking files containing tab characters then JSHint's idea of
+tabstop must match Vim's 'tabstop', otherwise syntastic will highlight the
+errors at shifted positions. By default JSHint's tabstop is 4, while Vim's
+default 'tabstop' is 8.
+
+In order to change "JSHint"'s tabstop you have to change its "indent" config
+option (http://jshint.com/docs/options/#indent). One way to do that is to
+put it in a file named ".jshintrc" in the current directory, the parent
+directories, or your home directory. The file is supposed to be in JSON
+format. For example: >
+    {
+        "indent": 8
+    }
+<
+See JSHint documentation for more details:
+
+    http://jshint.com/docs/
+
+Please note however that setting "indent" also triggers the indentation checks
+in JSHint. If that is undesirable, your only other option is to leave JSHint's
+tabstop alone, and change Vim's 'tabstop' to 4. To change Vim's 'tabstop', you
+can add this to your 'vimrc': >
+    set tabstop=4
+<
+Alternative~
+
+"JSXHint" will not show JSX-related errors in syntastic, because failed JSX
+compiles will result in the uncompiled data being passed to JSHint:
+
+    https://github.com/STRML/JSXHint/issues/45
+
+To get around this, "Syntastic-React" can be used as a replacement for
+"JSXHint":
+
+    https://github.com/jaxbot/syntastic-react
+
+------------------------------------------------------------------------------
+10. Lynt                                           *syntastic-javascript-lynt*
+
+Name:        lynt
+Maintainer:  LCD 47 <lcd047@gmail.com>
+
+"Lynt" is a JavaScript linter with support for TypeScript, Flow, and React.
+See the project's page for more information:
+
+    https://github.com/saadq/lynt
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+Note~
+
+Automatically fixing errors (option "--fix") is not supported.
+
+See also: |syntastic-typescript-lynt|.
+
+------------------------------------------------------------------------------
+11. mixedindentlint                     *syntastic-javascript-mixedindentlint*
+
+Name:        mixedindentlint
+Maintainer:  Payton Swick <payton@foolord.com>
+
+"mixedindentlint" is a general-purpose indentation linter. See the project's
+page at GitHub for more information:
+
+    https://github.com/sirbrillig/mixedindentlint
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+See also: |syntastic-css-mixedindentlint|, |syntastic-scss-mixedindentlint|.
+
+------------------------------------------------------------------------------
+12. standard                                   *syntastic-javascript-standard*
+
+Name:        standard
+Maintainer:  LCD 47 <lcd047@gmail.com>
+
+"Standard" is a code style linter for JavaScript.  See the project's page for
+more information:
+
+    https://github.com/feross/standard
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+Additionally:
+
+                                   *'g:syntastic_javascript_standard_generic'*
+Type: boolean
+Default: 0
+Flag that can be used to disable version checks for "standard".
+
+Note~
+
+Most forks of "standard" can also be used with syntastic. Just
+set 'g:syntastic_javascript_standard_generic' to 1, and point
+'g:syntastic_javascript_standard_exec' to the fork's executable.  For
+example to use happiness (https://github.com/JedWatson/happiness) instead of
+"standard": >
+    let g:syntastic_javascript_checkers = ["standard"]
+    let g:syntastic_javascript_standard_exec = "happiness"
+    let g:syntastic_javascript_standard_generic = 1
+<
+------------------------------------------------------------------------------
+13. tern-lint                                 *syntastic-javascript-tern_lint*
+
+Name:        tern_lint
+Maintainer:  LCD 47 <lcd047@gmail.com>
+
+"tern-lint" is a static type linter for JavaScript.  See the project's page
+for more information:
+
+    https://github.com/angelozerr/tern-lint
+
+Syntastic requires a version of Vim compiled with the |+byte_offset| feature
+to use this checker.
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+Note~
+
+"tern-lint" recursively scans files starting from (Vim's idea of) the current
+directory, regardless of the current file.
+
+==============================================================================
+SYNTAX CHECKERS FOR JSON                             *syntastic-checkers-json*
+
+The following checkers are available for JSON (filetype "json"):
+
+    1. JSONLint.................|syntastic-json-jsonlint|
+    2. jsonval..................|syntastic-json-jsonval|
+
+------------------------------------------------------------------------------
+1. JSONLint                                          *syntastic-json-jsonlint*
+
+Name:        jsonlint
+Maintainer:  Miller Medeiros <contact@millermedeiros.com>
+
+"JSONLint" is a validator for JSON. See the project's page for details:
+
+    http://jsonlint.com/
+
+Installation~
+
+Install it with: >
+    npm install -g jsonlint
+<
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+------------------------------------------------------------------------------
+2. jsonval                                            *syntastic-json-jsonval*
+
+Name:        jsonval
+Maintainer:  Miller Medeiros <contact@millermedeiros.com>
+
+"jsonval" is a validator for JSON. See the project's page at GitHub for
+details:
+
+    https://github.com/dangerousben/jsonval
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+==============================================================================
+SYNTAX CHECKERS FOR LESS                             *syntastic-checkers-less*
+
+The following checkers are available for LESS (filetype "less"):
+
+    1. lessc....................|syntastic-less-lessc|
+    2. RECESS...................|syntastic-less-recess|
+
+------------------------------------------------------------------------------
+1. lessc                                                *syntastic-less-lessc*
+
+Name:        lessc
+Maintainer:  Julien Blanchard <julien@sideburns.eu>
+
+"lessc" is a compiler for LESS. See the project's page for details:
+
+    http://lesscss.org/
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+Additionally:
+                                            *'g:syntastic_less_use_less_lint'*
+Type: boolean
+Default: 0
+Flag that can be set to instruct syntastic to run "less-lint" instead of
+"less".
+
+------------------------------------------------------------------------------
+2. RECESS                                              *syntastic-less-recess*
+
+Name:        recess
+Maintainer:  Tim Carry <tim@pixelastic.com>
+
+"RECESS" is a code quality tool for CSS built on top of LESS. See the
+project's page for details:
+
+    http://twitter.github.io/recess/
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+See also: |syntastic-css-recess|.
+
+==============================================================================
+SYNTAX CHECKERS FOR LEX                               *syntastic-checkers-lex*
+
+The following checkers are available for Lex (filetype "lex"):
+
+    1. flex.....................|syntastic-lex-flex|
+
+------------------------------------------------------------------------------
+1. flex                                                   *syntastic-lex-flex*
+
+Name:        flex
+Maintainer:  LCD 47 <lcd047@gmail.com>
+
+"Flex" is the GNU implementation of the standard UNIX lexical analyzer "lex"
+(http://en.wikipedia.org/wiki/Lex_programming_tool). See the project's page
+for more information:
+
+    http://flex.sourceforge.net/
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+==============================================================================
+SYNTAX CHECKERS FOR LIMBO                           *syntastic-checkers-limbo*
+
+The following checkers are available for Limbo (filetype "limbo"):
+
+    1. Limbo....................|syntastic-limbo-limbo|
+
+------------------------------------------------------------------------------
+1. Limbo                                               *syntastic-limbo-limbo*
+
+Name:        limbo
+Maintainer:  Alex Efros <powerman-asdf@ya.ru>
+
+"Limbo" is a compiler for the Limbo language
+(http://doc.cat-v.org/inferno/4th_edition/limbo_language/), the
+language used to write applications for the "Inferno" operating system
+(http://doc.cat-v.org/inferno/). See the "Inferno" project's page for
+a reference implementation:
+
+    http://code.google.com/p/inferno-os/
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+==============================================================================
+SYNTAX CHECKERS FOR LISP                             *syntastic-checkers-lisp*
+
+The following checkers are available for LISP (filetype "lisp"):
+
+    1. CLISP....................|syntastic-lisp-clisp|
+
+------------------------------------------------------------------------------
+1. CLISP                                                *syntastic-lisp-clisp*
+
+Name:        clisp
+Maintainer:  Karl Yngve Lervåg <karl.yngve@lervag.net>
+
+"CLISP" is an interpreter for LISP programs. See the project's page for
+details:
+
+    http://www.clisp.org/
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+==============================================================================
+SYNTAX CHECKERS FOR LLVM                             *syntastic-checkers-llvm*
+
+The following checkers are available for LLVM (filetype "llvm"):
+
+    1. LLVM.....................|syntastic-llvm-llvm|
+
+------------------------------------------------------------------------------
+1. LLVM                                                  *syntastic-llvm-llvm*
+
+Name:        llvm
+Maintainer:  Andrew Kelley <superjoe30@gmail.com>
+
+"LLVM" is the intermediate language for the LLVM compilers (http://llvm.org/).
+See the reference manual for details:
+
+    http://llvm.org/docs/LangRef.html
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+==============================================================================
+SYNTAX CHECKERS FOR LUA                               *syntastic-checkers-lua*
+
+The following checkers are available for Lua (filetype "lua"):
+
+    1. luac.....................|syntastic-lua-luac|
+    2. luacheck.................|syntastic-lua-luacheck|
+
+------------------------------------------------------------------------------
+1. luac                                                   *syntastic-lua-luac*
+
+Name:        luac
+Maintainer:  Gregor Uhlenheuer <kongo2002@gmail.com>
+
+"luac" is a compiler for Lua. See the tool's manual for details:
+
+    http://www.lua.org/manual/
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+Note~
+
+"luac" truncates filenames when the full path of the files involved is longer
+than a certain fixed amount. Syntastic can't detect this situation, and will
+silently ignore error messages with truncated filenames.
+
+------------------------------------------------------------------------------
+2. luacheck                                           *syntastic-lua-luacheck*
+
+Name:        luacheck
+Maintainer:  Thiago Bastos <tbastos@tbastos.com>
+
+"Luacheck" is a tool for static analysis of Lua code. See the project's page
+for details:
+
+    https://github.com/mpeterv/luacheck
+
+In contrast to "luac" (see |syntastic-lua-luac|) which only flags syntax
+errors, this checker detects code smells, so you probably want to enable both
+when available.
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+Note~
+
+A sensible set of options for LUA projects might be something like this: >
+    let g:syntastic_check_on_open = 1
+    let g:syntastic_lua_checkers = ["luac", "luacheck"]
+    let g:syntastic_lua_luacheck_args = "--no-unused-args" 
+<
+==============================================================================
+SYNTAX CHECKERS FOR MARKDOWN                     *syntastic-checkers-markdown*
+
+The following checkers are available for Markdown (filetype "markdown"):
+
+    1. Markdown lint tool.......|syntastic-markdown-mdl|
+    2. proselint................|syntastic-markdown-proselint|
+    3. remark-lint..............|syntastic-markdown-remark_lint|
+    4. textlint.................|syntastic-markdown-textlint|
+
+------------------------------------------------------------------------------
+1. Markdown lint tool                                 *syntastic-markdown-mdl*
+
+Name:        mdl
+Maintainer:  Charles Beynon <etothepiipower@gmail.com>
+
+"Markdown lint tool" is a style linter for Markdown files. See the project's
+page at GitHub for details:
+
+    https://github.com/mivok/markdownlint
+
+Installation~
+
+Install it with: >
+    gem install mdl
+<
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+Note~
+
+You can also use the "Node.js"-based "markdownlint-cli" as a linter instead
+of "mdl":
+
+    https://github.com/igorshubovych/markdownlint-cli
+
+To do that, you have to point 'g:syntastic_markdown_mdl_exec' to
+"markdownlint", and set 'g:syntastic_markdown_mdl_args' to an empty string (or
+to a set of valid "markdownlint-cli" options): >
+    let g:syntastic_markdown_mdl_exec = "markdownlint"
+    let g:syntastic_markdown_mdl_args = ""
+<
+------------------------------------------------------------------------------
+2. proselint                                    *syntastic-markdown-proselint*
+
+Name:        proselint
+Maintainer:  LCD 47 <lcd047@gmail.com>
+
+"proselint" is a linter for prose. See the page for details:
+
+    http://proselint.com/
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+See also: |syntastic-asciidoc-proselint|, |syntastic-help-proselint|,
+|syntastic-html-proselint|, |syntastic-nroff-proselint|,
+|syntastic-pod-proselint|, |syntastic-rst-proselint|,
+|syntastic-tex-proselint|, |syntastic-texinfo-proselint|,
+|syntastic-text-proselint|, |syntastic-xhtml-proselint|.
+
+------------------------------------------------------------------------------
+3. remark-lint                                *syntastic-markdown-remark_lint*
+
+Name:        remark_lint
+Maintainer:  Tim Carry <tim@pixelastic.com>
+
+"remark-lint" is a code style linter for Markdown files.  See the project's
+page at GitHub for details:
+
+     https://github.com/remarkjs/remark-lint
+
+Note~
+
+Syntastic can't check whether "remark-lint" is installed properly beyond the
+existence of an executable named "remark". Please make sure "remark-lint" is
+installed and working properly before attempting to use it with syntastic.
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+------------------------------------------------------------------------------
+4. textlint                                      *syntastic-markdown-textlint*
+
+Name:        textlint
+Maintainer:  LCD 47 <lcd047@gmail.com>
+
+"textlint" is a natural language linter for text, Markdown, and HTML files.
+See the project's page for details:
+
+    https://textlint.github.io/
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+See also: |syntastic-html-textlint|, |syntastic-text-textlint|.
+
+==============================================================================
+SYNTAX CHECKERS FOR MATLAB                         *syntastic-checkers-matlab*
+
+The following checkers are available for MATLAB (filetype "matlab"):
+
+    1. mlint....................|syntastic-matlab-mlint|
+
+------------------------------------------------------------------------------
+1. mlint                                              *syntastic-matlab-mlint*
+
+Name:        mlint
+Maintainer:  Jason Graham <jason@the-graham.com>
+
+"mlint" is a code linter for MATLAB. The "mlint" binary is distributed with
+the "MATLAB" package:
+
+    http://www.mathworks.com/help/matlab/
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+==============================================================================
+SYNTAX CHECKERS FOR MERCURY                       *syntastic-checkers-mercury*
+
+The following checkers are available for Mercury (filetype "mercury"):
+
+    1. mmc......................|syntastic-mercury-mmc|
+
+------------------------------------------------------------------------------
+1. mmc                                                 *syntastic-mercury-mmc*
+
+Name:        mmc
+Maintainer:  Joshua Rahm <joshuarahm@gmail.com>
+
+"mmc" is a compiler for Mercury. See Mercury's page for more details:
+
+    http://www.mercurylang.org/
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+==============================================================================
+SYNTAX CHECKERS FOR NASM                             *syntastic-checkers-nasm*
+
+The following checkers are available for NASM (filetype "nasm"):
+
+    1. nasm.....................|syntastic-nasm-nasm|
+
+------------------------------------------------------------------------------
+1. nasm                                                  *syntastic-nasm-nasm*
+
+Name:        nasm
+Maintainer:  HĂĽvard Pettersson <haavard.pettersson@gmail.com>
+
+"NASM" is an assembler and disassembler for the Intel x86 architecture. See
+the project's page for details:
+
+    http://www.nasm.us/
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+==============================================================================
+SYNTAX CHECKERS FOR NIX                               *syntastic-checkers-nix*
+
+The following checkers are available for Nix (filetype "nix"):
+
+    1. Nix......................|syntastic-nix-nix|
+
+------------------------------------------------------------------------------
+1. Nix                                                     *syntastic-nix-nix*
+
+Name:        nix
+Maintainer:  Tim Cuthbertson <tim@gfxmonk.net>
+
+"Nix" is a linter for language "Nix" using "nix-instantiate". See the
+project's page for details:
+
+    http://nixos.org/
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+==============================================================================
+SYNTAX CHECKERS FOR NROFF                           *syntastic-checkers-nroff*
+
+The following checkers are available for nroff (filetype "nroff"):
+
+    1. Igor.....................|syntastic-nroff-igor|
+    2. mandoc...................|syntastic-nroff-mandoc|
+    3. proselint................|syntastic-nroff-proselint|
+
+------------------------------------------------------------------------------
+1. Igor                                                 *syntastic-nroff-igor*
+
+Name:        igor
+Maintainer:  LCD 47 <lcd047@gmail.com>
+
+"Igor" is a proofreader for DocBook SGML, man pages, and text files used by
+the FreeBSD project (https://www.freebsd.org/). See the author's presentation
+for details:
+
+    http://www.youtube.com/watch?v=sczHqUPygZY
+
+The latest version can be obtained from Glen Barber's repository:
+
+    http://docscripts.glenbarber.us/tags/igor/
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+See also: |syntastic-docbk-igor|, |syntastic-text-igor|.
+
+------------------------------------------------------------------------------
+2. mandoc                                             *syntastic-nroff-mandoc*
+
+Name:        mandoc
+Maintainer:  LCD 47 <lcd047@gmail.com>
+
+See the project's page for details:
+
+    http://mdocml.bsd.lv/
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+------------------------------------------------------------------------------
+3. proselint                                       *syntastic-nroff-proselint*
+
+Name:        proselint
+Maintainer:  LCD 47 <lcd047@gmail.com>
+
+"proselint" is a linter for prose. See the page for details:
+
+    http://proselint.com/
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+See also: |syntastic-asciidoc-proselint|, |syntastic-help-proselint|,
+|syntastic-html-proselint|, |syntastic-markdown-proselint|,
+|syntastic-pod-proselint|, |syntastic-rst-proselint|,
+|syntastic-tex-proselint|, |syntastic-texinfo-proselint|,
+|syntastic-text-proselint|, |syntastic-xhtml-proselint|.
+
+==============================================================================
+SYNTAX CHECKERS FOR OBJECTIVE-C                      *syntastic-checkers-objc*
+
+The following checkers are available for Objective-C (filetype "objc"):
+
+    1. GCC......................|syntastic-objc-gcc|
+    2. OClint...................|syntastic-objc-oclint|
+
+------------------------------------------------------------------------------
+1. GCC                                                    *syntastic-objc-gcc*
+
+Name:        gcc
+Maintainer:  Gregor Uhlenheuer <kongo2002@gmail.com>
+
+Checker options~
+                                                 *'g:syntastic_objc_compiler'*
+Type: string
+Default: "gcc", or "clang" if GCC is not found
+Compiler executable.
+
+                                              *'g:syntastic_objc_errorformat'*
+Type: string
+Default: unset
+Override for the default |'errorformat'|.
+
+                                    *'g:syntastic_objc_remove_include_errors'*
+Type: boolean
+Default: 0
+By default, errors in files included from the file being checked are shown.
+Set this variable to 1 to remove messages about errors in included files.
+Please note that this means syntastic will silently abort checks if there are
+fatal errors in one of the included files.
+
+                                         *'g:syntastic_objc_compiler_options'*
+Type: string
+Default: unset
+Compilation flags (such as defines or include directories) to be passed to the
+linter.
+
+                                              *'g:syntastic_objc_config_file'*
+Type: string
+Default: unset
+File containing additional compilation flags to be passed to the linter, one
+option per line (cf. |syntastic-config-files|).
+
+                                             *'g:syntastic_objc_include_dirs'*
+Type: array of strings
+Default: []
+Include directories to be passed to the linter, in addition to the above
+compilation flags. You can set it like this: >
+    let g:syntastic_objc_include_dirs = ["includes", "headers"]
+<
+and the corresponding "-Iincludes -Iheaders" will be added to the compilation
+flags.
+
+                                  *'g:syntastic_objc_no_default_include_dirs'*
+Type: boolean
+Default: 0
+By default syntastic adds a number of common include directories to the
+compilation flags, namely: >
+    -I. -I.. -Iinclude -Iincludes -I../include -I../includes
+<
+You can disable this behaviour by setting the above variable to 1.
+
+                                                   *'b:syntastic_objc_cflags'*
+Type: string
+Default: unset
+Buffer-local variable. Additional compilation flags specific to the current
+buffer.
+
+                                             *'g:syntastic_objc_check_header'*
+Type: boolean
+Default: 0
+If the current file is a header (namely if its extension is "h"), all checks
+are silently skipped. You can force syntastic to check header files by
+setting the above variable to 1.
+
+Note~
+
+This checker doesn't call the "makeprgBuild()" function, and thus it ignores
+the usual 'g:syntastic_objc_gcc_<option>' variables. The only exception is
+'g:syntastic_objc_gcc_exec', which can still be used to override the linter's
+executable.
+
+See also: |syntastic-objcpp-gcc|.
+
+------------------------------------------------------------------------------
+2. OClint                                              *syntastic-objc-oclint*
+
+Name:        oclint
+Maintainer:  "UnCO" Lin <undercooled@lavabit.com>
+
+"OClint" is a static code analysis tool. See the project's page for details:
+
+    http://oclint.org/
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+Additionally:
+
+                                            'g:syntastic_oclint_config_file'
+Type: string
+Default: unset
+File containing compilation flags (such as defines or include directories),
+one option per line (cf. |syntastic-config-files|).
+
+See also: |syntastic-objcpp-oclint|.
+
+==============================================================================
+SYNTAX CHECKERS FOR OBJECTIVE-C++                  *syntastic-checkers-objcpp*
+
+The following checkers are available for Objective-C++ (filetype "objcpp"):
+
+    1. GCC......................|syntastic-objcpp-gcc|
+    2. OClint...................|syntastic-objcpp-oclint|
+
+------------------------------------------------------------------------------
+1. GCC                                                  *syntastic-objcpp-gcc*
+
+Name:        gcc
+Maintainer:  Gregor Uhlenheuer <kongo2002@gmail.com>
+
+Checker options~
+                                               *'g:syntastic_objcpp_compiler'*
+Type: string
+Default: "gcc", or "clang" if GCC is not found
+Compiler executable.
+
+                                            *'g:syntastic_objcpp_errorformat'*
+Type: string
+Default: unset
+Override for the default |'errorformat'|.
+
+                                  *'g:syntastic_objcpp_remove_include_errors'*
+Type: boolean
+Default: 0
+By default, errors in files included from the file being checked are shown.
+Set this variable to 1 to remove messages about errors in included files.
+Please note that this means syntastic will silently abort checks if there are
+fatal errors in one of the included files.
+
+                                       *'g:syntastic_objcpp_compiler_options'*
+Type: string
+Default: unset
+Compilation flags (such as defines or include directories) to be passed to the
+linter.
+
+                                            *'g:syntastic_objcpp_config_file'*
+Type: string
+Default: unset
+File containing additional compilation flags to be passed to the linter, one
+option per line (cf. |syntastic-config-files|).
+
+                                           *'g:syntastic_objcpp_include_dirs'*
+Type: array of strings
+Default: []
+Include directories to be passed to the linter, in addition to the above
+compilation flags. You can set it like this: >
+    let g:syntastic_objcpp_include_dirs = ["includes", "headers"]
+<
+and the corresponding "-Iincludes -Iheaders" will be added to the compilation
+flags.
+
+                                *'g:syntastic_objcpp_no_default_include_dirs'*
+Type: boolean
+Default: 0
+By default syntastic adds a number of common include directories to the
+compilation flags, namely: >
+    -I. -I.. -Iinclude -Iincludes -I../include -I../includes
+<
+You can disable this behaviour by setting the above variable to 1.
+
+                                                 *'b:syntastic_objcpp_cflags'*
+Type: string
+Default: unset
+Buffer-local variable. Additional compilation flags specific to the current
+buffer.
+
+                                           *'g:syntastic_objcpp_check_header'*
+Type: boolean
+Default: 0
+If the current file is a header (namely if its extension is "h"), all checks
+are silently skipped. You can force syntastic to check header files by
+setting the above variable to 1.
+
+Note~
+
+This checker doesn't call the "makeprgBuild()" function, and thus it ignores
+the usual 'g:syntastic_objcpp_gcc_<option>' variables. The only exception
+is 'g:syntastic_objcpp_gcc_exec', which can still be used to override the
+linter's executable.
+
+See also: |syntastic-objc-gcc|.
+
+------------------------------------------------------------------------------
+2. OClint                                            *syntastic-objcpp-oclint*
+
+Name:        oclint
+Maintainer:  "UnCO" Lin <undercooled@lavabit.com>
+
+"OClint" is a static code analysis tool. See the project's page for details:
+
+    http://oclint.org/
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+Additionally:
+
+                                            'g:syntastic_oclint_config_file'
+Type: string
+Default: unset
+File containing compilation flags (such as defines or include directories),
+one option per line (cf. |syntastic-config-files|).
+
+See also: |syntastic-objc-oclint|.
+
+==============================================================================
+SYNTAX CHECKERS FOR OCAML                           *syntastic-checkers-ocaml*
+
+The following checkers are available for OCaml (filetype "ocaml"):
+
+    1. camlp4o..................|syntastic-ocaml-camlp4o|
+
+------------------------------------------------------------------------------
+1. camlp4o                                           *syntastic-ocaml-camlp4o*
+
+Name:        camlp4o
+Maintainer:  Tőrők Edwin <edwintorok@gmail.com>
+
+"ocamlc" is a compiler for Caml. See the project's page for details:
+
+    http://caml.inria.fr/
+
+Checker options~
+                                              *'g:syntastic_ocaml_use_ocamlc'*
+Type: boolean
+Default: 0
+Enable this variable to use "ocamlc".
+
+                                     *'g:syntastic_ocaml_use_janestreet_core'*
+Type: boolean
+Default: 0
+It's possible to use "ocamlc" in conjunction with Jane Street's "core". In
+order to do that you have to set the above variable.
+
+                                     *'g:syntastic_ocaml_janestreet_core_dir'*
+Type: string
+Default: "."
+Path to Jane Street's "core".
+
+                                                 *'g:syntastic_ocaml_camlp4r'*
+Type: boolean                                                                 
+Default: 0
+By default, .ml and .mli files are checked with the "camlp4o" preprocessor,
+.mll with "ocamllex", and .mly with "menhir". If your source code requires
+"camlp4r" you can set this variable.
+
+                                          *'g:syntastic_ocaml_use_ocamlbuild'*
+Type: boolean                                                                 
+Default: 0
+Whether to enable typechecking and syntax extensions. This tells syntastic to
+run "ocamlbuild <name>.inferred.mli". It writes object files to the "_build"
+directory, and possibly rebuilds your "myocamlbuild.ml" plugin.  If you are
+using syntax extensions / external libraries and have a properly set up
+"_tags" (and "myocamlbuild.ml" file), setting this flag should just work.  For
+best results your current directory should be the project root (same situation
+if you want useful output from `:make`).
+
+This checker doesn't call the "makeprgBuild()" function, and thus it ignores
+the usual 'g:syntastic_ocaml_camlp4o_<option>' variables.
+
+Note~
+
+You might consider using the linters packaged with Merlin instead of this
+one. They provide type errors and let you use packages outside core:
+
+    https://github.com/the-lambda-church/merlin
+
+==============================================================================
+SYNTAX CHECKERS FOR PERL                             *syntastic-checkers-perl*
+
+The following checkers are available for Perl (filetype "perl"):
+
+    1. perl.....................|syntastic-perl-perl|
+    2. Perl::Critic.............|syntastic-perl-perlcritic|
+    3. Pod::Checker.............|syntastic-perl-podchecker|
+
+------------------------------------------------------------------------------
+1. perl                                                  *syntastic-perl-perl*
+
+Name:        perl
+Maintainers: Anthony Carapetis <anthony.carapetis@gmail.com>
+             Eric Harmon
+
+Security~
+
+This checker runs "perl -c" against your files, which in turn executes any
+"BEGIN", "UNITCHECK", and "CHECK" blocks, and any "use" statements in your
+files (cf. http://perldoc.perl.org/perlrun.html#*-c*). This is probably fine
+if you wrote the file yourself, but it can be a problem if you're trying to
+check third party files. If you are 100% willing to let Vim run the code in
+your files, set 'g:syntastic_enable_perl_checker' to 1 in your vimrc to enable
+this checker: >
+    let g:syntastic_enable_perl_checker = 1
+<
+There is also a buffer-local version of this variable, that takes precedence
+over it in the buffers where it is defined.
+
+Please note that setting this variable doesn't automatically enable the
+checker, you still need to add it to 'g:syntastic_perl_checkers' if you plan
+to use it.
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+Additionally:
+
+                                              *'g:syntastic_perl_interpreter'*
+Type: string
+Default: "perl"
+The perl interpreter to use.
+
+                                                 *'g:syntastic_perl_lib_path'*
+Type: list of strings
+Default: []
+List of include directories to be added to the perl command line. Example: >
+    let g:syntastic_perl_lib_path = [ "./lib", "./lib/auto" ]
+<
+Note~
+
+The variable |'g:syntastic_perl_interpreter'| is shared with the YAML::XS
+checker (cf. |syntastic-yaml-yamlxs|). If for some reasons you don't want to
+use the same interpreter for both checkers, you can override it locally by
+setting 'g:syntastic_perl_perl_exec'.
+
+------------------------------------------------------------------------------
+2. Perl::Critic                                    *syntastic-perl-perlcritic*
+
+Name:        perlcritic
+Maintainer:  LCD 47 <lcd047@gmail.com>
+
+"Perl::Critic" is a static analyzer for Perl. See the project's page for
+details:
+
+    http://perlcritic.com/
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+Additionally:
+
+                                         *'g:syntastic_perl_perlcritic_thres'*
+Type: integer
+Default: 5
+Error threshold: policy violations with a severity above this value are
+highlighted as errors, the others are warnings.
+
+Note~
+
+You can override the format of "perlcritic" messages, for example: >
+    let g:syntastic_perl_perlcritic_post_args =
+        \ '--verbose "\%s:\%f:\%l:\%c: \%p: \%m\n"'
+<
+Just make sure to leave alone the leading "\%s:\%f:\%l:\%c:".
+
+------------------------------------------------------------------------------
+3. Pod::Checker                                    *syntastic-perl-podchecker*
+
+Name:        podchecker
+Maintainer:  LCD 47 <lcd047@gmail.com>
+
+"Pod::Checker" is a checker for pod documents. See the module's manual for
+details:
+
+    http://perldoc.perl.org/Pod/Checker.html
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+See also: |syntastic-pod-podchecker|.
+
+==============================================================================
+SYNTAX CHECKERS FOR PHP                               *syntastic-checkers-php*
+
+The following checkers are available for PHP (filetype "php"):
+
+    1. PHP......................|syntastic-php-php|
+    2. PHP_CodeSniffer..........|syntastic-php-phpcs|
+    3. PHPLint..................|syntastic-php-phplint|
+    4. PHP Mess Detector........|syntastic-php-phpmd|
+    5. PHPStan..................|syntastic-php-phpstan|
+
+------------------------------------------------------------------------------
+1. PHP                                                     *syntastic-php-php*
+
+Name:        php
+Maintainer:  Martin Grenfell <martin.grenfell@gmail.com>
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+------------------------------------------------------------------------------
+2. PHP_CodeSniffer                                       *syntastic-php-phpcs*
+
+Name:        phpcs
+Maintainer:  Martin Grenfell <martin.grenfell@gmail.com>
+
+"PHP_CodeSniffer" is a style linter for PHP and CSS. See the project's page
+at GitHub for details:
+
+    https://github.com/squizlabs/PHP_CodeSniffer/
+
+Installation~
+
+Install it with: >
+    pear install PHP_CodeSniffer
+<
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+Note~
+
+If you're checking files containing tab characters then "PHP_CodeSniffer"'s
+idea of tabstop must match Vim's 'tabstop', otherwise syntastic will highlight
+the errors at shifted positions. By default syntastic does that by adding
+an option "--tab-width=&tabstop" to "PHP_CodeSniffer", but that option
+also instructs "PHP_CodeSniffer" to expand tabs, and some code sniffers
+(f.i. "CakePHP", see https://github.com/cakephp/cakephp-codesniffer) insist on
+indenting lines with tabs. To work around the resulting mess if you're using
+one of these sniffers, set "--tab-width=0" and 'tabstop' to 8: >
+    let g:syntastic_php_phpcs_args = "--tab-width=0"
+    set tabstop=8
+<
+See also: |syntastic-css-phpcs|.
+
+------------------------------------------------------------------------------
+3. PHPLint                                             *syntastic-php-phplint*
+
+Name:        phplint
+Maintainer:  LCD 47 <lcd047@gmail.com>
+
+"PHPLint" is a style linter for PHP. See the project's page for details:
+
+    http://www.icosaedro.it/phplint/
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+------------------------------------------------------------------------------
+4. PHP Mess Detector                                     *syntastic-php-phpmd*
+
+Name:        phpmd
+Maintainer:  Martin Grenfell <martin.grenfell@gmail.com>
+
+"PHP Mess Detector" is a code analyzer for PHP. See the project's page for
+details:
+
+    http://phpmd.org
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+------------------------------------------------------------------------------
+5. PHP Static Analysis Tool                            *syntastic-php-phpstan*
+
+Name:        phpstan
+Maintainer:  Przepompownia <przepompownia@users.noreply.github.com>
+
+"PHPStan" focuses on finding errors in your code without actually running it.
+See the project's page at GitHub for details:
+
+    https://github.com/phpstan/phpstan
+
+Syntastic supports "PHPStan" versions 0.8.5 and later.
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+==============================================================================
+SYNTAX CHECKERS FOR POD                               *syntastic-checkers-pod*
+
+The following checkers are available for POD (filetype "pod"):
+
+    1. Pod::Checker.............|syntastic-pod-podchecker|
+    2. proselint................|syntastic-pod-proselint|
+
+------------------------------------------------------------------------------
+1. Pod::Checker                                     *syntastic-pod-podchecker*
+
+Name:        podchecker
+Maintainer:  LCD 47 <lcd047@gmail.com>
+
+"Pod::Checker" is a checker for pod documents.  See the module's manual for
+details:
+
+    http://perldoc.perl.org/Pod/Checker.html
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+See also: |syntastic-perl-podchecker|.
+
+------------------------------------------------------------------------------
+2. proselint                                         *syntastic-pod-proselint*
+
+Name:        proselint
+Maintainer:  LCD 47 <lcd047@gmail.com>
+
+"proselint" is a linter for prose. See the page for details:
+
+    http://proselint.com/
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+See also: |syntastic-asciidoc-proselint|, |syntastic-help-proselint|,
+|syntastic-html-proselint|, |syntastic-markdown-proselint|,
+|syntastic-nroff-proselint|, |syntastic-rst-proselint|,
+|syntastic-tex-proselint|, |syntastic-texinfo-proselint|,
+|syntastic-text-proselint|, |syntastic-xhtml-proselint|.
+
+==============================================================================
+SYNTAX CHECKERS FOR PUG (FORMERLY JADE)               *syntastic-checkers-pug*
+
+The following checkers are available for Pug (formerly Jade; filetype "pug"):
+
+    1. pug_lint.................|syntastic-pug-pug_lint|
+
+------------------------------------------------------------------------------
+1. pug_lint                                           *syntastic-pug-pug_lint*
+
+Name:        pug_lint
+Maintainer:  Ben Parnell <benjaminparnell.94@gmail.com>
+
+"pug-lint" is a linter and style linter for Pug (formerly known as "Jade";
+http://jade-lang.com/). See the project's page at GitHub for details:
+
+    https://github.com/pugjs/pug-lint
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+==============================================================================
+SYNTAX CHECKERS FOR PUPPET                         *syntastic-checkers-puppet*
+
+The following checkers are available for Puppet (filetype "puppet"):
+
+    1. puppet...................|syntastic-puppet-puppet|
+    2. puppet-lint..............|syntastic-puppet-puppetlint|
+
+------------------------------------------------------------------------------
+1. puppet                                            *syntastic-puppet-puppet*
+
+Name:        puppet
+Maintainer:  Eivind Uggedal <eivind@uggedal.com>
+
+"Puppet" is an automated administrative engine for UNIX systems.  See the
+project's page for details:
+
+    http://projects.puppetlabs.com/projects/puppet
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+Note~
+
+You probably also need a plugin to set |filetype| for Puppet files, such as
+"vim-puppet":
+
+    https://github.com/rodjek/vim-puppet
+
+------------------------------------------------------------------------------
+2. puppet-lint                                   *syntastic-puppet-puppetlint*
+
+Name:        puppetlint
+Maintainer:  Eivind Uggedal <eivind@uggedal.com>
+
+"puppet-lint" is a style linter for puppet manifests
+(http://projects.puppetlabs.com/projects/puppet).  See the project's page for
+details:
+
+    http://puppet-lint.com/
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+Note~
+
+You probably also need a plugin to set |filetype| for Puppet files, such as
+"vim-puppet":
+
+    https://github.com/rodjek/vim-puppet
+
+==============================================================================
+SYNTAX CHECKERS FOR PYTHON                         *syntastic-checkers-python*
+
+The following checkers are available for Python (filetype "python"):
+
+    1. Bandit...................|syntastic-python-bandit|
+    2. flake8...................|syntastic-python-flake8|
+    3. Frosted..................|syntastic-python-frosted|
+    4. mypy.....................|syntastic-python-mypy|
+    5. Prospector...............|syntastic-python-prospector|
+    6. py3kwarn.................|syntastic-python-py3kwarn|
+    7. pycodestyle..............|syntastic-python-pycodestyle|
+    8. pydocstyle...............|syntastic-python-pydocstyle|
+    9. Pyflakes.................|syntastic-python-pyflakes|
+    10. Pylama..................|syntastic-python-pylama|
+    11. Pylint..................|syntastic-python-pylint|
+    12. python..................|syntastic-python-python|
+
+------------------------------------------------------------------------------
+1. Bandit                                            *syntastic-python-bandit*
+
+Name:        bandit
+Maintainer:  LCD 47 <lcd047@gmail.com>
+
+"Bandit" is an AST-based static analyzer for Python from OpenStack Security
+Group (http://openstack.org). See the project's official documentation for
+details:
+
+    https://wiki.openstack.org/wiki/Security/Projects/Bandit
+
+Installation~
+
+Install it with "pip": >
+    pip install bandit
+<
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+Note~
+
+In order to check all files in a project, rather than the current file: >
+    let g:syntastic_python_bandit_fname = ['/path/to/project']
+    let g:syntastic_python_bandit_args = '-r'
+<
+------------------------------------------------------------------------------
+2. flake8                                            *syntastic-python-flake8*
+
+Name:        flake8
+Maintainers: Sylvain Soliman <Sylvain.Soliman+git@gmail.com>
+             kstep <me@kstep.me>
+
+"Flake8" is a wrapper around PyFlakes (https://launchpad.net/pyflakes), pep8
+(https://github.com/jcrocholl/pep8), and Ned Batchelder's McCabe script
+(http://nedbatchelder.com/blog/200803/python_code_complexity_microtool.html). 
+See the project's page and the official docs for details:
+
+    https://gitlab.com/pycqa/flake8
+    http://flake8.readthedocs.org/
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+------------------------------------------------------------------------------
+3. Frosted                                          *syntastic-python-frosted*
+
+Name:        frosted
+Maintainer:  LCD 47 <lcd047@gmail.com>
+
+"Frosted" is a fork of pyflakes (https://launchpad.net/pyflakes). See the
+project's page for details:
+
+    https://github.com/timothycrosley/frosted
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+------------------------------------------------------------------------------
+4. mypy                                                *syntastic-python-mypy*
+
+Name:        mypy
+Maintainer:  Russ Hewgill <Russ.Hewgill@gmail.com>
+
+"mypy" is a static type linter for Python. See the project's page for
+details:
+
+    http://www.mypy-lang.org/
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+------------------------------------------------------------------------------
+5. Prospector                                    *syntastic-python-prospector*
+
+Name:        prospector
+Maintainer:  LCD 47 <lcd047@gmail.com>
+
+"Prospector" is a static analysis tool for Python. It brings
+together the functionality of other tools such as pylint
+(http://www.pylint.org/), pyflakes (https://launchpad.net/pyflakes),
+pep8 (https://github.com/jcrocholl/pep8), pydocstyle (formerly
+"pep257"; https://github.com/PyCQA/pydocstyle), and McCabe complexity
+(http://nedbatchelder.com/blog/200803/python_code_complexity_microtool.html).
+See the project's official documentation for details:
+
+    http://prospector.readthedocs.org/en/latest/
+
+Syntastic supports "Prospector" versions 0.7 and later.
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+------------------------------------------------------------------------------
+6. py3kwarn                                        *syntastic-python-py3kwarn*
+
+Name:        py3kwarn
+Author: Liam Curry <liam@curry.name>
+
+"Py3kwarn" is a code linter for Python that detects incompatibilities with
+Python 3. See the project's page for details:
+
+    https://github.com/liamcurry/py3kwarn
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+------------------------------------------------------------------------------
+7. pycodestyle                                  *syntastic-python-pycodestyle*
+
+Name:        pycodestyle
+Maintainer:  LCD 47 <lcd047@gmail.com>
+
+"pycodestyle" (formerly "pep8") is a style linter for Python, derived from
+the conventions in PEP 8 (http://www.python.org/dev/peps/pep-0008/). See the
+project's page for details:
+
+    https://github.com/PyCQA/pycodestyle
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+------------------------------------------------------------------------------
+8. pydocstyle                                    *syntastic-python-pydocstyle*
+
+Name:        pydocstyle
+Maintainer:  LCD 47 <lcd047@gmail.com>
+
+"pydocstyle" (formerly "pep257") is a docstring style linter
+for Python, derived from the conventions established in PEP 257
+(http://www.python.org/dev/peps/pep-0257/). See the project's page for
+details:
+
+    https://github.com/PyCQA/pydocstyle
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+------------------------------------------------------------------------------
+9. Pyflakes                                        *syntastic-python-pyflakes*
+
+Name:        pyflakes
+Authors:     Martin Grenfell <martin.grenfell@gmail.com>
+             kstep <me@kstep.me>
+             Parantapa Bhattacharya <parantapa@gmail.com>
+
+"Pyflakes" is a simple code linter for Python.  See the project's page for
+more information:
+
+    https://launchpad.net/pyflakes
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+------------------------------------------------------------------------------
+10. Pylama                                           *syntastic-python-pylama*
+
+Name:        pylama
+Maintainer:  LCD 47 <lcd047@gmail.com>
+
+"Pylama" is a wrapper around pep8 (https://github.com/jcrocholl/pep8),
+pydocstyle (formerly "pep257"; https://github.com/PyCQA/pydocstyle),
+Pyflakes (https://launchpad.net/pyflakes),
+Pylint (http://www.pylint.org/), and Ned Batchelder's McCabe script
+(http://nedbatchelder.com/blog/200803/python_code_complexity_microtool.html).
+See the project's page for details:
+
+    https://github.com/klen/pylama
+
+Note~
+
+The Pylint backend requires you to install "pylama_pylint":
+
+    https://github.com/klen/pylama_pylint
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+------------------------------------------------------------------------------
+11. Pylint                                           *syntastic-python-pylint*
+
+Name:        pylint
+Author: Parantapa Bhattacharya <parantapa@gmail.com>
+
+"Pylint" is a code linter for Python. See the project's page for details:
+
+    http://www.pylint.org/
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+Notes~
+
+On OS X you need to set the environment variable "LC_CTYPE" to "UTF-8"
+before running Vim: >
+    LC_CTYPE=en_US.UTF-8
+    export LC_CTYPE
+<
+Several people have expressed interest in showing the old message IDs
+along with the error messages. You can override the message format in
+'g:syntastic_python_pylint_post_args'. Please note that the new format must
+start with "{path}:{line}:{column}:{C}: ", otherwise syntastic will not
+recognise any messages. Example: >
+    let g:syntastic_python_pylint_post_args =
+        \ '--msg-template="{path}:{line}:{column}:{C}: [{symbol} {msg_id}] {msg}"'
+<
+------------------------------------------------------------------------------
+12. python                                           *syntastic-python-python*
+
+Name:        python
+Maintainer:  LCD 47 <lcd047@gmail.com>
+
+This checker uses Python's builtin "compile()" function for detecting syntax
+errors.
+
+Syntastic requires Python version 2.6 or later.
+
+Codecs~
+
+In Python you have the ability to specify a particular codec at the top of
+the file with a special comment that looks something like this: >
+    # coding: spec
+<
+Further references:
+
+    https://docs.python.org/reference/lexical_analysis.html#encoding-declarations
+
+Python will see this comment at import time and use the corresponding codec to
+transform the file before using it. The "python" checker has an option
+|'g:syntastic_python_python_use_codec'| that will make syntastic aware of such
+comments before running compiler checks on the file.
+
+Please note that transforming a file like this affects line numbers and
+column numbers, and syntastic has no way to make the necessary adjustments.
+Consequently, errors might appear on surprising lines if you enable this
+feature and the transformed file has code on different lines than the raw
+file. For this reason the use of these transformations should be limited
+to codecs that preserve line numbers, such as the "spec" codec provided by
+"NoseOfYeti":
+
+    https://noseofyeti.readthedocs.org/en/latest/
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+Additionally:
+
+                                       *'g:syntastic_python_python_use_codec'*
+Type: boolean
+Default: 0
+Enables handling of "# coding: spec" comments.
+
+==============================================================================
+SYNTAX CHECKERS FOR QML                               *syntastic-checkers-qml*
+
+The following checkers are available for QML (filetype "qml"):
+
+    1. qmllint..................|syntastic-qml-qmllint|
+
+------------------------------------------------------------------------------
+1. qmllint                                             *syntastic-qml-qmllint*
+
+Name:        qmllint
+Maintainer:  Peter Wu <peter@lekensteyn.nl>
+
+"qmllint" is a QML syntax verifier. It was introduced with Qt 5.4 (cf.
+https://www.kdab.com/kdab-contributions-qt-5-4-qmllint/) as part of Qt
+Declarative:
+
+    https://code.qt.io/cgit/qt/qtdeclarative.git/tree/tools/qmllint
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+==============================================================================
+SYNTAX CHECKERS FOR R                                   *syntastic-checkers-r*
+
+The following checkers are available for R (filetype "r"):
+
+    1. lintr....................|syntastic-r-lintr|
+    2. svtools..................|syntastic-r-svtools|
+
+------------------------------------------------------------------------------
+1. lintr                                                   *syntastic-r-lintr*
+
+Name:        lintr
+Maintainer:  Jim Hester <james.f.hester@gmail.com>
+
+"lintr" is a static code analysis tool for R files. See the project's page at
+GitHub for details:
+
+    https://github.com/jimhester/lintr
+
+Security~
+
+This checker executes parts of the files it checks. This is probably fine if
+you wrote the file yourself, but it can be a problem if you're trying to check
+third party files. If you are 100% willing to let Vim run the code in your
+file, set 'g:syntastic_enable_r_lintr_checker' to 1 in your vimrc to enable
+this checker: >
+    let g:syntastic_enable_r_lintr_checker = 1
+<
+There is also a buffer-local version of this variable, that takes precedence
+over it in the buffers where it is defined.
+
+Please note that setting this variable doesn't automatically enable the
+checker, you still need to add "lintr" to 'g:syntastic_r_checkers' if you plan
+to use it.
+
+Checker Options~
+                                               *'g:syntastic_r_lintr_linters'*
+Type: string
+Default: "default_linters"
+Which "lintr" linters to apply to your code.
+
+                                                 *'g:syntastic_r_lintr_cache'*
+Type: string
+Default: "FALSE"
+Whether to use the lintr cache. This speeds up linting time, but can introduce
+false positives in some cases.
+
+Note~
+
+This checker doesn't call the "makeprgBuild()" function, and thus it ignores
+the usual 'g:syntastic_r_lintr_<option>' variables. The only exception is
+'g:syntastic_r_lintr_exec', which can still be used to override the "R"
+executable.
+
+See also: |syntastic-rmd-lintr|.
+
+------------------------------------------------------------------------------
+2. svtools                                               *syntastic-r-svtools*
+
+Name:        svtools
+Maintainer:  LCD 47 <lcd047@gmail.com>
+
+This is a linter for R files, using the R package "svTools":
+
+    http://cran.r-project.org/web/packages/svTools/
+
+In turn, this package delegates most of the work to the "checkUsage()"
+function in the "codetools" package:
+
+    http://cran.r-project.org/web/packages/codetools/
+
+Security~
+
+This checker executes parts of the files it checks. This is probably fine if
+you wrote the file yourself, but it can be a problem if you're trying to check
+third party files. If you are 100% willing to let Vim run the code in your
+file, set 'g:syntastic_enable_r_svtools_checker' to 1 in your vimrc to enable
+this checker: >
+    let g:syntastic_enable_r_svtools_checker = 1
+<
+There is also a buffer-local version of this variable, that takes precedence
+over it in the buffers where it is defined.
+
+Please note that setting this variable doesn't automatically enable the
+checker, you still need to add "svtools" to 'g:syntastic_r_checkers' if you
+plan to use it.
+
+Note~
+
+This checker doesn't call the "makeprgBuild()" function, and thus it ignores
+the usual 'g:syntastic_r_svtools_<option>' variables. The only exception is
+'g:syntastic_r_svtools_exec', which can still be used to override the "R"
+executable.
+
+Limitations~
+
+"svTools" version 0.9-4 (current at the time of this writing) has a number
+of problems that prevents it from checking most sources. You might consider
+applying this patch as a workaround:
+
+    https://gist.github.com/lcd047/9988687#file-svtools-patch
+
+At the time of this writing "svTools" doesn't produce meaningful column
+numbers (the column numbers are always set to 1). The patch mentioned above
+enables "svTools" to produce more useful column numbers, but only for syntax
+errors. If you apply the said patch and you're checking files containing
+tab characters Vim's 'tabstop' must match "R"'s idea of tabstop, otherwise
+column numbers will be shifted. At the time of this writing "R"'s tabstop is
+hardcoded to 8, so you should probably add something like this to your vimrc: >
+    set tabstop=8
+<
+==============================================================================
+SYNTAX CHECKERS FOR R MARKDOWN                        *syntastic-checkers-rmd*
+
+The following checkers are available for R Markdown (filetype "rmd"):
+
+    1. lintr....................|syntastic-rmd-lintr|
+
+------------------------------------------------------------------------------
+1. lintr                                                 *syntastic-rmd-lintr*
+
+Name:        lintr
+Maintainer:  Jim Hester <james.f.hester@gmail.com>
+
+"lintr" is a static code analysis tool for R files.  See the project's page at
+GitHub for details:
+
+    https://github.com/jimhester/lintr
+
+Security~
+
+This checker executes parts of the files it checks. This is probably fine if
+you wrote the file yourself, but it can be a problem if you're trying to check
+third party files. If you are 100% willing to let Vim run the code in your
+file, set 'g:syntastic_enable_r_lintr_checker' to 1 in your vimrc to enable
+this checker: >
+    let g:syntastic_enable_r_lintr_checker = 1
+<
+There is also a buffer-local version of this variable, that takes precedence
+over it in the buffers where it is defined.
+
+Please note that setting this variable doesn't automatically enable the
+checker, you still need to add "lintr" to 'g:syntastic_rmd_checkers' if you
+plan to use it.
+
+Checker Options~
+                                               'g:syntastic_r_lintr_linters'
+Type: string
+Default: "default_linters"
+Which "lintr" linters to apply to your code.
+
+                                                 'g:syntastic_r_lintr_cache'
+Type: string
+Default: "FALSE"
+Whether to use the lintr cache. This speeds up linting time, but can introduce
+false positives in some cases.
+
+Note~
+
+This checker doesn't call the "makeprgBuild()" function, and thus it ignores
+the usual 'g:syntastic_rmd_lintr_<option>' variables. The only exception is
+'g:syntastic_rmd_lintr_exec', which can still be used to override the "R"
+executable.
+
+See also: |syntastic-r-lintr|.
+
+==============================================================================
+SYNTAX CHECKERS FOR RACKET                         *syntastic-checkers-racket*
+
+The following checkers are available for Racket (filetype "racket"):
+
+    1. code-ayatollah...........|syntastic-racket-code-ayatollah|
+    2. racket...................|syntastic-racket-racket|
+
+------------------------------------------------------------------------------
+1. code-ayatollah                            *syntastic-racket-code-ayatollah*
+
+Name:        code_ayatollah
+Maintainer:  LCD 47 <lcd047@gmail.com>
+
+Installation~
+
+Download "code-ayatollah.rkt" (http://tmp.barzilay.org/code-ayatollah.rkt)
+and point 'g:syntastic_racket_code_ayatollah_script' to it: >
+    let g:syntastic_racket_code_ayatollah_script = "/path/to/code-ayatollah.rkt"
+<
+Of course, you also need "racket" (http://racket-lang.org/).
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+------------------------------------------------------------------------------
+2. racket                                            *syntastic-racket-racket*
+
+Name:        racket
+Maintainer:  Steve Bragg <steve@empresseffects.com>
+
+Security~
+
+This checker executes the code in the files it checks:
+
+    https://github.com/vim-syntastic/syntastic/issues/1773
+
+This is probably fine if you wrote the files yourself, but it can be a problem
+if you're trying to check third party files. If you are 100% willing to let
+Vim run the code in your files, set 'g:syntastic_enable_racket_racket_checker'
+to 1 in your vimrc to enable this checker: >
+    let g:syntastic_enable_racket_racket_checker = 1
+<
+There is also a buffer-local version of this variable, that takes precedence
+over a global one in the buffers where it is defined.
+
+Please note that setting this variable doesn't automatically enable the
+checker, you still need to add "racket" to 'g:syntastic_racket_checkers' if
+you plan to use it.
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+==============================================================================
+SYNTAX CHECKERS FOR RAKU                             *syntastic-checkers-raku*
+
+The following checkers are available for Raku (filetype "raku"):
+
+    1. Raku.....................|syntastic-raku-raku|
+
+------------------------------------------------------------------------------
+1. Raku                                                  *syntastic-raku-raku*
+
+Name:        raku
+Maintainers: Claudio Ramirez <pub.claudio@gmail.com>
+
+"raku" is a checker for Raku files using the "Rakudo" compiler. See the
+project's page for details:
+
+    http://rakudo.org/
+
+Syntastic requires Rakudo Star release 2018.08 or later. Syntastic can't
+enforce this, since it can't reliably compare Rakudo Star versions.
+
+Security~
+
+This checker runs "raku -c" against your files, which executes any "BEGIN" and
+"CHECK" blocks (cf. https://docs.raku.org/programs/03-environment-variables).
+This is probably fine if you wrote the files yourself, but it can be a problem
+if you're trying to check third party files. If you are 100% willing to let
+Vim run the code in your files, set 'g:syntastic_enable_raku_checker' to 1 in
+your vimrc to enable this checker: >
+    let g:syntastic_enable_raku_checker = 1
+<
+There is also a buffer-local version of this variable, that takes precedence
+over it in the buffers where it is defined.
+
+Please note that setting this variable doesn't automatically enable the
+checker, you still need to add it to 'g:syntastic_raku_checkers' if you plan
+to use it.
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at syntastic-config-makeprg.
+
+Additionally:
+
+                                                 *'g:syntastic_raku_lib_path'*
+Type: list of strings
+Default: []
+List of include directories to be added to the raku command line. Example: >
+    let g:syntastic_raku_lib_path = [ "./lib", "./lib/auto" ]
+<
+You can also set the "RAKULIB" environment variable to a colon-separated
+list of add-hoc include paths. These paths will then be added to the ones
+prescribed by |'g:syntastic_raku_lib_path'|.
+
+==============================================================================
+SYNTAX CHECKERS FOR RELAX NG                          *syntastic-checkers-rnc*
+
+The following checkers are available for Relax NG (filetype "rnc"):
+
+    1. rnv......................|syntastic-rnc-rnv|
+
+------------------------------------------------------------------------------
+1. rnv                                                     *syntastic-rnc-rnv*
+
+Name:        rnv
+Maintainer:  Remko Tronçon <remko@el-tramo.be>
+
+"RNV" is an implementation of Relax NG Compact Syntax validator (cf.
+http://relaxng.org/compact-20021121.html). See the project's page for
+details:
+
+    http://www.davidashen.net/rnv.html
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+==============================================================================
+SYNTAX CHECKERS FOR RESTRUCTUREDTEXT                  *syntastic-checkers-rst*
+
+The following checkers are available for reStructuredText (filetype "rst"):
+
+    1. proselint................|syntastic-rst-proselint|
+    2. rst2pseudoxml............|syntastic-rst-rst2pseudoxml|
+    3. rstcheck.................|syntastic-rst-rstcheck|
+    4. Sphinx...................|syntastic-rst-sphinx|
+
+------------------------------------------------------------------------------
+1. proselint                                         *syntastic-rst-proselint*
+
+Name:        proselint
+Maintainer:  LCD 47 <lcd047@gmail.com>
+
+"proselint" is a linter for prose. See the page for details:
+
+    http://proselint.com/
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+See also: |syntastic-asciidoc-proselint|, |syntastic-help-proselint|,
+|syntastic-html-proselint|, |syntastic-markdown-proselint|,
+|syntastic-nroff-proselint|, |syntastic-pod-proselint|,
+|syntastic-tex-proselint|, |syntastic-texinfo-proselint|,
+|syntastic-text-proselint|, |syntastic-xhtml-proselint|.
+
+------------------------------------------------------------------------------
+2. rst2pseudoxml                                 *syntastic-rst-rst2pseudoxml*
+
+Name:        rst2pseudoxml
+Maintainer:  James Rowe <jnrowe@gmail.com>
+
+"rst2pseudoxml" is part of the Python package Docutils:
+
+    http://docutils.sourceforge.net/
+
+We use "rst2pseudoxml", as it is ever so marginally faster than the other
+"rst2${x}" tools in docutils.
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+------------------------------------------------------------------------------
+3. rstcheck                                           *syntastic-rst-rstcheck*
+
+Name:        rstcheck
+Maintainer:  Steven Myint <git@stevenmyint.com>
+
+"rstcheck" is a linter for reStructuredText files. See the project's page at
+GitHub for details:
+
+    https://github.com/myint/rstcheck
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+------------------------------------------------------------------------------
+4. Sphinx                                               *syntastic-rst-sphinx*
+
+Name:        sphinx
+Maintainer:  Buck Evan <buck@yelp.com>
+
+"Sphinx" is a linter for documentation files written in the Sphinx dialect
+of reStructuredText, using the "pseudoxml" builder of "sphinx-build". See the
+project's page for details:
+
+    http://sphinx-doc.org/
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+Additionally:
+
+                                         *'g:syntastic_rst_sphinx_source_dir'*
+Type: string
+Default: unset
+Base directory of the project being checked.
+
+                                         *'g:syntastic_rst_sphinx_config_dir'*
+Type: string
+Default: unset
+Directory containing the "conf.py" file.
+
+Notes~
+
+The checker needs to know two paths to run: the source directory where the
+project's files are located, and the directory where the configuration file
+"conf.py" is located. By default it looks for "conf.py" in the base directory
+of the current file, then upwards in parent directories. If a configuration
+file is found and the file is readable, its base directory is assumed to be
+both the source directory and the configuration directory of the project.
+
+If syntastic can't determine the source directory or the configuration
+directory, or if you want to override the autodetected paths, options
+|'g:syntastic_rst_sphinx_source_dir'| and |'g:syntastic_rst_sphinx_config_dir'|
+take precedence over the detected values.
+
+Please note also that the checker creates output files in a temporary directory
+that is created upon the first run in the current session, and is removed when
+Vim exits. If you need to change the location of this directory you can do
+so by exporting the environment variables "TMPDIR" or "TMP" (on UNIX and Mac
+OS-X), or "TEMP" (on Windows) before running Vim. Various index files are also
+cached in this directory, so it might be advantageous to avoid quitting Vim
+between checker runs.
+
+==============================================================================
+SYNTAX CHECKERS FOR RPM SPEC                         *syntastic-checkers-spec*
+
+The following checkers are available for Linux RPM packages (filetype "spec"):
+
+    1. rpmlint..................|syntastic-spec-rpmlint|
+
+------------------------------------------------------------------------------
+1. rpmlint                                            *syntastic-spec-rpmlint*
+
+Name:        rpmlint
+Maintainer:  LCD 47 <lcd047@gmail.com>
+
+"rpmlint" is a tool for checking Linux RPM packages. See the project's page
+for details:
+
+    http://sourceforge.net/projects/rpmlint/
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+==============================================================================
+SYNTAX CHECKERS FOR RUBY                             *syntastic-checkers-ruby*
+
+The following checkers are available for Ruby (filetype "ruby"):
+
+    1. Flog.....................|syntastic-ruby-flog|
+    2. JRuby....................|syntastic-ruby-jruby|
+    3. MacRuby..................|syntastic-ruby-macruby|
+    4. MRI......................|syntastic-ruby-mri|
+    5. reek.....................|syntastic-ruby-reek|
+    6. RuboCop..................|syntastic-ruby-rubocop|
+    7. Ruby-lint................|syntastic-ruby-rubylint|
+    8. Sorbet...................|syntastic-ruby-sorbet|
+
+------------------------------------------------------------------------------
+1. Flog                                                  *syntastic-ruby-flog*
+
+Name:        flog
+Maintainer:  Tim Carry <tim@pixelastic.com>
+
+"Flog" is a complexity linter for Ruby files. See the project's page for
+details:
+
+    http://ruby.sadi.st/Flog.html
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+Additionally:
+
+                                   *'g:syntastic_ruby_flog_threshold_warning'*
+Type: number
+Default: 45
+Threshold for warnings. Functions with complexity below this number are not
+flagged as either errors or warnings.
+
+                                     *'g:syntastic_ruby_flog_threshold_error'*
+Type: number
+Default: 90
+Threshold for errors. Functions with complexity above this number are flagged
+as errors.
+
+
+Note~
+
+"Flog" reports complexity values as floating point numbers. If your Vim is
+not compiled with the "+float" feature, both the numbers reported by flog and
+the two options above are rounded by syntastic towards zero (that is, "39.9"
+is taken as "39").
+
+------------------------------------------------------------------------------
+2. JRuby                                                *syntastic-ruby-jruby*
+
+Name:        jruby
+Maintainer:  Leonid Shevtsov <leonid@shevtsov.me>
+
+"JRuby" is a Java implementation of the Ruby programming language. See the
+project's page for details:
+
+    http://jruby.org/
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+------------------------------------------------------------------------------
+3. MacRuby                                            *syntastic-ruby-macruby*
+
+Name:        macruby
+Maintainer:  Martin Grenfell <martin.grenfell@gmail.com>
+
+"MacRuby" is an implementation of Ruby for Mac OS X. See the project's
+page for details:
+
+    http://www.macruby.org/
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+------------------------------------------------------------------------------
+4. MRI                                                    *syntastic-ruby-mri*
+
+Name:        mri
+Maintainer:  Martin Grenfell <martin.grenfell@gmail.com>
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+Additionally:
+
+                                                     *'g:syntastic_ruby_exec'*
+Type: string
+Default: unset
+Ruby executable. This is a convenience variable shared with the eRuby checker
+"Ruby" (cf. |syntastic-eruby-ruby|). Used only if 'g:syntastic_ruby_mri_exec'
+is unset.
+
+------------------------------------------------------------------------------
+5. Reek                                                  *syntastic-ruby-reek*
+
+Name:        reek
+Maintainer:  Mindaugas Mozūras
+
+"Reek" is a code smell detection tool for Ruby. See the project's page at
+GitHub for details:
+
+    https://github.com/troessner/reek
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+------------------------------------------------------------------------------
+6. RuboCop                                            *syntastic-ruby-rubocop*
+
+Name:        rubocop
+Maintainer:  Recai Oktaş <roktas@bil.omu.edu.tr>
+
+"RuboCop" is a style linter for Ruby. See the project's page for details:
+
+    https://github.com/bbatsov/rubocop
+
+Syntastic requires "RuboCop" version 0.12.0 or later.
+
+Running "RuboCop" under development versions of "Ruby" is explicitly NOT
+supported.
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+Notes~
+
+Most issues returned by "rubocop" are warnings, so for best results your
+|'syntastic_quiet_messages'| should not filter out warnings.
+
+If the "RuboCop" checker is not enabled automatically by syntastic try
+running "rubocop --version" from the shell. If it complains about "Parser"
+(see https://github.com/whitequark/parser) expecting a different version of
+"Ruby" than you are running, your configuration is not directly supported by
+syntastic.
+
+While passing around the blame for this does have a certain entertaining
+value (cf. https://github.com/bbatsov/rubocop/issues/1819), the problem
+is real, since "Ruby" syntax did change between versions. The solution
+is to run a version manager such as "rbenv" (http://rbenv.org/) or "rvm"
+(https://rvm.io/), that allows you to run multiple versions of "Ruby" without
+conflicts: >
+    $ rbenv version
+    2.1.3 (set by /usr/local/var/rbenv/version)
+    
+    $ rubocop --version
+    warning: parser/current is loading parser/ruby21, which recognizes
+    warning: 2.1.2-compliant syntax, but you are running 2.1.3.
+    0.26.1
+    
+    $ rbenv shell 2.1.2
+    
+    $ rubocop --version
+    0.26.1
+<
+Alternatively, if you absolutely must do it the wrong way, you can
+also install a wrapper script that kills the version warning and point
+'g:syntastic_ruby_rubocop_exec' to it:
+
+    https://gist.github.com/lcd047/96138909015f2f8d2d36
+
+------------------------------------------------------------------------------
+7. Ruby-lint                                         *syntastic-ruby-rubylint*
+
+Name:        rubylint
+Maintainer:  Yorick Peterse <yorickpeterse@gmail.com>
+
+"Ruby-lint" is a linter and static code analysis tool for Ruby. See the
+project's page for details:
+
+    https://github.com/YorickPeterse/ruby-lint
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+Note~
+
+If the "rubylint" checker is not enabled automatically by syntastic, try
+running "ruby-lint --version" from the shell. If it complains about "Parser"
+(see https://github.com/whitequark/parser) expecting a different version of
+"Ruby" than you are running, your configuration is not directly supported by
+syntastic.
+
+While passing around the blame for this does have a certain entertaining
+value (cf. https://github.com/bbatsov/rubocop/issues/1819), the problem
+is real, since "Ruby" syntax did change between versions. The solution
+is to run a version manager such as "rbenv" (http://rbenv.org/) or "rvm"
+(https://rvm.io/), that allows you to run multiple versions of "Ruby" without
+conflicts: >
+    $ rbenv version
+    2.1.3 (set by /usr/local/var/rbenv/version)
+    
+    $ ruby-lint --version
+    warning: parser/current is loading parser/ruby21, which recognizes
+    warning: 2.1.2-compliant syntax, but you are running 2.1.3.
+    ruby-lint v2.0.4 on ruby 2.1.3 [i486-linux]
+    
+    $ rbenv shell 2.1.2
+    
+    $ ruby-lint --version
+    ruby-lint v2.0.4 on ruby 2.1.2 [i486-linux]
+<
+Alternatively, if you absolutely must do it the wrong way, you can
+also install a wrapper script that kills the version warning and point
+'g:syntastic_ruby_rubylint_exec' to it:
+
+    https://gist.github.com/lcd047/492245d9923af45fb964
+
+------------------------------------------------------------------------------
+8. Sorbet                                              *syntastic-ruby-sorbet*
+
+Name:        sorbet
+Maintainer:  Tom Morton
+
+Sorbet is a static analysis and gradual typing tool for Ruby. See the
+project's page at GitHub for details:
+
+    https://github.com/sorbet/sorbet
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+==============================================================================
+SYNTAX CHECKERS FOR SASS                             *syntastic-checkers-sass*
+
+The following checkers are available for SASS (filetype "sass"):
+
+    1. Sass.....................|syntastic-sass-sass|
+    2. Sass Lint................|syntastic-sass-sass_lint|
+    3. SassC....................|syntastic-sass-sassc|
+
+------------------------------------------------------------------------------
+1. Sass                                                  *syntastic-sass-sass*
+
+Name:        sass
+Maintainer:  Martin Grenfell <martin.grenfell@gmail.com>
+
+"Sass" is a translator for SASS. See the project's page for details:
+
+    http://sass-lang.com/
+
+Installation~
+
+Install it with "gem": >
+    gem install sass
+<
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+See also: |syntastic-scss-sass|.
+
+------------------------------------------------------------------------------
+2. Sass Lint                                        *syntastic-sass-sass_lint*
+
+Name:        sass_lint
+Maintainer:  LCD 47 <lcd047@gmail.com>
+
+"Sass Lint" is a linter for SASS and SCSS files. See the project's page for
+details:
+
+    https://github.com/sasstools/sass-lint
+
+Syntastic requires "Sass Lint" version 1.5.0 or later.
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+See also: |syntastic-scss-sass_lint|.
+
+------------------------------------------------------------------------------
+3. SassC                                                *syntastic-sass-sassc*
+
+Name:        sassc
+Maintainer:  LCD 47 <lcd047@gmail.com>
+
+"SassC" is a linter for SASS and SCSS files, based on the "libsass" library
+(https://github.com/hcatlin/libsass). See the project's page for details:
+
+    https://github.com/hcatlin/sassc
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+See also: |syntastic-scss-sassc|.
+
+==============================================================================
+SYNTAX CHECKERS FOR SCALA                           *syntastic-checkers-scala*
+
+The following checkers are available for Scala (filetype "scala"):
+
+    1. fsc......................|syntastic-scala-fsc|
+    2. scalac...................|syntastic-scala-scalac|
+    3. Scalastyle...............|syntastic-scala-scalastyle|
+
+------------------------------------------------------------------------------
+1. fsc                                                   *syntastic-scala-fsc*
+
+Name:        fsc
+Maintainer:  Gregor Uhlenheuer <kongo2002@gmail.com>
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+------------------------------------------------------------------------------
+2. scalac                                             *syntastic-scala-scalac*
+
+Name:        scalac
+Maintainer:  Rickey Visinski <rickeyvisinski@gmail.com>
+
+"scalac" is a compiler for Scala. See the project's page for more information:
+
+    http://docs.scala-lang.org
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+------------------------------------------------------------------------------
+3. Scalastyle                                     *syntastic-scala-scalastyle*
+
+Name:        scalastyle
+Maintainer:  LCD 47 <lcd047@gmail.com>
+
+"Scalastyle" is a style linter for Scala. See the project's page for
+details:
+
+    http://www.scalastyle.org/
+
+Syntastic uses the command line version of "Scalastyle":
+
+    http://www.scalastyle.org/command-line.html
+
+You need a working installation of Java Runtime Environment to run
+"Scalastyle".
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+Additionally:
+
+                                          *'g:syntastic_scala_scalastyle_jar'*
+Type: string
+Default: "scalastyle-batch_2.10.jar"
+Path to the "scalastyle-batch" jar file. You might want to set this to a full
+path.
+
+                                  *'g:syntastic_scala_scalastyle_config_file'*
+Type: string
+Default: "scalastyle_config.xml"
+Path to the configuration file to use. You might want to also set this to a
+full path.
+
+                                         *'g:syntastic_scala_scalastyle_exec'*
+Type: string
+Default: "java"
+Path to the "java" executable.
+
+==============================================================================
+SYNTAX CHECKERS FOR SCSS                             *syntastic-checkers-scss*
+
+The following checkers are available for SCSS (filetype "scss"):
+
+    1. mixedindentlint..........|syntastic-scss-mixedindentlint|
+    2. Sass.....................|syntastic-scss-sass|
+    3. Sass Lint................|syntastic-scss-sass_lint|
+    4. SassC....................|syntastic-scss-sassc|
+    5. SCSS-lint................|syntastic-scss-scss_lint|
+
+------------------------------------------------------------------------------
+1. mixedindentlint                            *syntastic-scss-mixedindentlint*
+
+Name:        mixedindentlint
+Maintainer:  Payton Swick <payton@foolord.com>
+
+"mixedindentlint" is a general-purpose indentation linter. See the project's
+page at GitHub for more information:
+
+    https://github.com/sirbrillig/mixedindentlint
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+See also: |syntastic-css-mixedindentlint|, |syntastic-javascript-mixedindentlint|.
+
+------------------------------------------------------------------------------
+2. Sass                                                  *syntastic-scss-sass*
+
+Name:        sass
+Maintainer:  Martin Grenfell <martin.grenfell@gmail.com>
+
+"Sass" is a translator for SASS. See the project's page for details:
+
+    http://sass-lang.com/
+
+Installation~
+
+Install it with "gem": >
+    gem install sass
+<
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+See also: |syntastic-sass-sass|.
+
+------------------------------------------------------------------------------
+3. Sass Lint                                        *syntastic-scss-sass_lint*
+
+Name:        sass_lint
+Maintainer:  LCD 47 <lcd047@gmail.com>
+
+"Sass Lint" is a linter for SASS and SCSS files. See the project's page for
+details:
+
+    https://github.com/sasstools/sass-lint
+
+Syntastic requires "Sass Lint" version 1.5.0 or later.
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+See also: |syntastic-sass-sass_lint|.
+
+------------------------------------------------------------------------------
+4. SassC                                                *syntastic-scss-sassc*
+
+Name:        sassc
+Maintainer:  LCD 47 <lcd047@gmail.com>
+
+
+"SassC" is a linter for SASS and SCSS files, based on the "libsass" library
+(https://github.com/hcatlin/libsass). See the project's page for details:
+
+    https://github.com/hcatlin/sassc
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+See also: |syntastic-sass-sassc|.
+
+------------------------------------------------------------------------------
+5. SCSS-lint                                        *syntastic-scss-scss_lint*
+
+Name:        scss_lint
+Maintainer:  Shane da Silva <shane@dasilva.io>
+
+"SCSS-Lint" is a lint tool for SCSS. See the project's page for details:
+
+    https://github.com/brigade/scss-lint
+
+Syntastic requires "SCSS-Lint" version 0.29.0 or later.
+
+Installation~
+
+Install it with "gem": >
+    gem install scss_lint
+<
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+==============================================================================
+SYNTAX CHECKERS FOR SH                                 *syntastic-checkers-sh*
+
+The following checkers are available for Sh (filetype "sh"):
+
+    1. Bashate..................|syntastic-sh-bashate|
+    2. checkbashisms............|syntastic-sh-checkbashisms|
+    3. sh.......................|syntastic-sh-sh|
+    4. ShellCheck...............|syntastic-sh-shellcheck|
+    5. shfmt....................|syntastic-sh-shfmt|
+
+------------------------------------------------------------------------------
+1. Bashate                                              *syntastic-sh-bashate*
+
+Name:        bashate
+Maintainer:  aswna
+
+"Bashate" is a style linter for bash scripts used by the OpenStack
+(http://www.openstack.org/). See the project's page at GitHub for details:
+
+    https://github.com/openstack-dev/bashate
+
+Installation~
+
+Install it with "pip": >
+    pip install bashate
+<
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+------------------------------------------------------------------------------
+2. checkbashisms                                  *syntastic-sh-checkbashisms*
+
+Name:        checkbashisms
+Maintainer:  LCD 47 <lcd047@gmail.com>
+
+"checkbashisms" is part of the Linux "devscripts" package. It can be obtained
+from the Debian source archive:
+
+    http://packages.qa.debian.org/d/devscripts.html
+
+For FreeBSD and OpenBSD you can also install the "devel/checkbashisms" port.
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+------------------------------------------------------------------------------
+3. sh                                                        *syntastic-sh-sh*
+
+Name:        sh
+Maintainer:  Gregor Uhlenheuer <kongo2002@gmail.com>
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+------------------------------------------------------------------------------
+4. ShellCheck                                        *syntastic-sh-shellcheck*
+
+Name:        shellcheck
+Maintainer:  LCD 47 <lcd047@gmail.com>
+
+"ShellCheck" is a static analysis tool for Bourne shell scripts. See the
+project's page for details:
+
+    http://www.shellcheck.net/about.html
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+------------------------------------------------------------------------------
+5. shfmt                                                  *syntastic-sh-shfmt*
+
+Name:        shfmt
+Maintainer:  LCD 47 <lcd047@gmail.com>
+
+"shfmt" is a parser, formatter, and interpreter for sh/bash/mksh. See the
+project's page at GitHub for details:
+
+    https://github.com/mvdan/sh
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+Note~
+
+Automatically formatting (option "-w") is not supported.
+
+==============================================================================
+SYNTAX CHECKERS FOR SLIM                             *syntastic-checkers-slim*
+
+The following checkers are available for Slim (filetype "slim"):
+
+    1. Slim-Lint................|syntastic-slim-slim_lint|
+    2. Slimrb...................|syntastic-slim-slimrb|
+
+------------------------------------------------------------------------------
+1. Slim-Lint                                        *syntastic-slim-slim_lint*
+
+Name:        slim_lint
+Maintainer:  Vasily Kolesnikov <re.vkolesnikov@gmail.com>
+
+"Slim-Lint" is a style linter for Slim files (http://slim-lang.com/).  See
+the project's page at GitHub for details:
+
+    https://github.com/sds/slim-lint
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+Installation~
+
+You can install "Slim-Lint" with "gem": >
+    gem install slim_lint
+<
+Note~
+
+You probably also need a plugin to set |filetype| for Slim files, such as
+"vim-slim":
+
+     https://github.com/slim-template/vim-slim
+
+------------------------------------------------------------------------------
+2. Slimrb                                              *syntastic-slim-slimrb*
+
+Name:        slimrb
+Maintainer:  Martin Grenfell <martin.grenfell@gmail.com>
+
+"Slimrb" is a processor for the template language Slim
+(http://slim-lang.com/). See the project's page for details:
+
+    https://github.com/slim-template/slim
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+Note~
+
+You probably also need a plugin to set |filetype| for Slim files, such as
+"vim-slim":
+
+     https://github.com/slim-template/vim-slim
+
+==============================================================================
+SYNTAX CHECKERS FOR SML                               *syntastic-checkers-sml*
+
+The following checkers are available for SML (filetype "sml"):
+
+    1. smlnj....................|syntastic-sml-smlnj|
+
+------------------------------------------------------------------------------
+1. smlnj                                                 *syntastic-sml-smlnj*
+
+Name:        smlnj
+Maintainer:  LCD 47 <lcd047@gmail.com>
+
+"smlnj" is a compiler for Standard ML '97. See the project's page for details:
+
+    http://www.smlnj.org/
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+==============================================================================
+SYNTAX CHECKERS FOR SOLIDITY                     *syntastic-checkers-solidity*
+
+The following checkers are available for Solidity (filetype "solidity"):
+
+    1. solc.....................|syntastic-solidity-solc|
+    2. Solhint..................|syntastic-solidity-solhint|
+    3. Solium...................|syntastic-solidity-solium|
+
+------------------------------------------------------------------------------
+1. solc                                              *syntastic-solidity-solc*
+
+Name:        solc 
+Maintainer:  Jacob Cholewa <jacob@cholewa.dk>
+
+"solc" is a compiler for Ethereum's smart-contract language "Solidity"
+(https://solidity.readthedocs.io/). See the project's page for details:
+
+    https://github.com/ethereum/solidity
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+Note~
+
+You probably also need a plugin to set |filetype| for Solidity files, such as
+"vim-solidity":
+
+    https://github.com/tomlion/vim-solidity
+
+------------------------------------------------------------------------------
+2. Solhint                                        *syntastic-solidity-solhint*
+
+Name:        solhint
+Maintainer:  Brett Sun <qisheng.brett.sun@gmail.com>
+
+"Solhint" is a style linter for "Solidity" files. See the project's page for
+details:
+
+    https://github.com/protofire/solhint
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+Note~
+
+You probably also need a plugin to set |filetype| for Solidity files, such as
+"vim-solidity":
+
+    https://github.com/tomlion/vim-solidity
+
+------------------------------------------------------------------------------
+3. Solium                                          *syntastic-solidity-solium*
+
+Name:        solium
+Maintainer:  Matthijs van den Bos <matthijs@vandenbos.org>
+
+"Solium" is a linter for "Solidity" files. See the project's page for details:
+
+    https://github.com/duaraghav8/Solium
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+Note~
+
+You probably also need a plugin to set |filetype| for Solidity files, such as
+"vim-solidity":
+
+    https://github.com/tomlion/vim-solidity
+
+==============================================================================
+SYNTAX CHECKERS FOR SQL                               *syntastic-checkers-sql*
+
+The following checkers are available for SQL (filetype "sql"):
+
+    1. sqlint...................|syntastic-sql-sqlint|
+    2. tsqllint.................|syntastic-sql-tsqllint|
+
+------------------------------------------------------------------------------
+1. sqlint                                               *syntastic-sql-sqlint*
+
+Name:        sqlint
+Maintainer:  Steve Purcell <steve@sanityinc.com>
+
+"sqlint" is a lint checker for ANSI SQL. See the project's page at GitHub for
+details:
+
+    https://github.com/purcell/sqlint
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+------------------------------------------------------------------------------
+2. tsqllint                                           *syntastic-sql-tsqllint*
+
+Name:        tsqllint
+Maintainer:  Daniel Walker <dwalker@fifo99.com>
+
+"tsqllint" is a lint checker for Transact-SQL scripts. See the project's page
+at GitHub for details:
+
+    https://github.com/tsqllint/tsqllint
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+==============================================================================
+SYNTAX CHECKERS FOR STYLUS                         *syntastic-checkers-stylus*
+
+The following checkers are available for Stylus (filetype "stylus"):
+
+    1. Stylint..................|syntastic-stylus-stylint|
+
+------------------------------------------------------------------------------
+1. Stylint                                          *syntastic-stylus-stylint*
+
+Name:        stylint
+Maintainer:  LCD 47 <lcd047@gmail.com>
+
+"Stylint" is a linter for Stylus (http://learnboost.github.io/stylus). See
+the project's page at GitHub for details:
+
+    https://github.com/SimenB/stylint
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+Note~
+
+You might also find useful the "vim-stylus" plugin:
+
+    https://github.com/wavded/vim-stylus
+
+==============================================================================
+SYNTAX CHECKERS FOR SVG                               *syntastic-checkers-svg*
+
+The following checkers are available for SVG (filetype "svg"):
+
+    1. Validator................|syntastic-svg-validator|
+    2. W3.......................|syntastic-svg-w3|
+
+------------------------------------------------------------------------------
+1. Validator                                         *syntastic-svg-validator*
+
+Name:        validator
+Maintainer:  LCD 47 <lcd047@gmail.com>
+
+"Validator" is a non-DTD-based HTML linter.  See the project's page for
+details:
+
+    http://validator.github.io/validator/
+
+As a syntastic linter, you can validate your files against the online service
+(see https://validator.nu/), or you can install "vnu.jar":
+
+    https://github.com/validator/validator/releases/latest
+
+then run it as a HTTP server: >
+    $ java -Xss512k -cp /path/to/vnu.jar nu.validator.servlet.Main 8888
+<
+Requirement~
+
+This checker uses cURL:
+
+    http://curl.haxx.se/
+
+Checker options~
+
+                                             *'g:syntastic_svg_validator_api'*
+Type: string
+Default: "http://validator.nu/"
+URL of the service to use for checking. Leave it to the default to run the
+checks against "https://validator.nu/", or set it to "http://localhost:8888/"
+if you have "vnu.jar" installed, and you're running it as a standalone HTTP
+server. See:
+
+    http://validator.github.io/validator/#standalone
+
+                                          *'g:syntastic_svg_validator_parser'*
+Type: string
+Default: empty
+Parser to use. Legal values are: "xml", "xmldtd", "html", "html5", "html4",
+and "html4tr". References:
+
+    https://wiki.whatwg.org/wiki/Validator.nu_Common_Input_Parameters#parser
+
+                                        *'g:syntastic_svg_validator_nsfilter'*
+Type: string
+Default: empty
+Sets the "nsfilter" for the parser. See:
+
+    https://wiki.whatwg.org/wiki/Validator.nu_Common_Input_Parameters#nsfilter
+
+                                          *'g:syntastic_svg_validator_schema'*
+Type: string
+Default: empty
+Sets the "schema" for the parser. See:
+
+    https://wiki.whatwg.org/wiki/Validator.nu_Common_Input_Parameters#schema
+
+                                            *'g:syntastic_svg_validator_exec'*
+Type: string
+Default: "curl"
+Path to the "cURL" executable. Override it with a full path if your "cURL" is
+not installed in a standard location.
+
+This checker doesn't call the "makeprgBuild()" function, and thus it ignores
+the usual 'g:syntastic_svg_validator_<option>' variables. The only exception
+is 'g:syntastic_svg_validator_exec', which can be used to override the path
+to the "cURL" executable.
+
+Note~
+
+Non-zero exit codes from "cURL" are typically network errors, and are signaled
+by syntastic with messages such as: >
+    syntastic: error: checker svg/validator returned abnormal status 26
+<
+You can lookup the meaning of these codes in cURL's manual:
+    
+    http://curl.haxx.se/docs/manpage.html#EXIT
+
+Example~
+>
+    let g:syntastic_svg_validator_parser = 'xml'
+    let g:syntastic_svg_validator_schema = 
+        \ 'http://s.validator.nu/svg-xhtml5-rdf-mathml.rnc ' .
+        \ 'http://s.validator.nu/html5/assertions.sch ' .
+        \ 'http://c.validator.nu/all/'
+<
+See also: |syntastic-html-validator|, |syntastic-xhtml-validator|.
+
+------------------------------------------------------------------------------
+2. W3                                                      *syntastic-svg-w3*
+
+Name:        w3
+Maintainer:  Kevin Locke <kevin@kevinlocke.name>
+
+"W3" is the W3C Markup Validator for SVG.  See the project's page for
+details:
+
+    https://validator.w3.org/source/
+
+As a syntastic linter, you can validate your files against the online service
+(see https://validator.w3.org/), or you can install it from sources and run it
+as a local service:
+
+    https://github.com/w3c/markup-validator/
+
+Requirement~
+
+This checker uses cURL:
+
+    http://curl.haxx.se/
+
+Checker options~
+
+                                                   *'g:syntastic_svg_w3_api'*
+Type: string
+Default: "https://validator.w3.org/check"
+URL of the service to use for checking. Leave it to the default to
+run the checks against "https://validator.w3.org/", or set it to
+"http://localhost/w3c-validator/check" if you're running a local service.
+
+                                                *'g:syntastic_svg_w3_doctype'*
+Type: string
+Default: "SVG 1.1"
+Name of the document type definition to use for checking. Currently supported
+values for SVG:
+
+  - SVG 1.0
+  - SVG 1.1
+  - SVG 1.1 Tiny
+  - SVG 1.1 Basic
+
+References:
+
+    https://github.com/w3c/markup-validator/blob/master/htdocs/doctype-select.html
+    https://github.com/w3c/markup-validator/blob/master/htdocs/config/types.conf
+
+                                                  *'g:syntastic_svg_w3_exec'*
+Type: string
+Default: "curl"
+Path to the "cURL" executable. Override it with a full path if your "cURL" is
+not installed in a standard location.
+
+This checker doesn't call the "makeprgBuild()" function, and thus it ignores
+the usual 'g:syntastic_svg_w3_<option>' variables. The only exception is
+'g:syntastic_svg_w3_exec', which can be used to override the path to the
+"cURL" executable.
+
+Note~
+
+Non-zero exit codes from "cURL" are typically network errors, and are signaled
+by syntastic with messages such as: >
+    syntastic: error: checker svg/w3 returned abnormal status 26
+<
+You can lookup the meaning of these codes in cURL's manual:
+    
+    http://curl.haxx.se/docs/manpage.svg#EXIT
+
+See also: |syntastic-html-w3|, |syntastic-xhtml-w3|.
+
+==============================================================================
+SYNTAX CHECKERS FOR TCL                               *syntastic-checkers-tcl*
+
+The following checkers are available for Tcl (filetype "tcl"):
+
+    1. nagelfar.................|syntastic-tcl-nagelfar|
+
+------------------------------------------------------------------------------
+1. nagelfar                                           *syntastic-tcl-nagelfar*
+
+Name:        nagelfar
+Maintainer:  James Pickard <james.pickard@gmail.com>
+
+"Nagelfar" is a syntax linter for Tcl. See the project's page for details:
+
+    http://nagelfar.sourceforge.net/
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+==============================================================================
+SYNTAX CHECKERS FOR TEX                               *syntastic-checkers-tex*
+
+The following checkers are available for TeX (filetype "tex"):
+
+    1. ChkTeX...................|syntastic-tex-chktex|
+    2. lacheck..................|syntastic-tex-lacheck|
+    3. proselint................|syntastic-tex-proselint|
+
+------------------------------------------------------------------------------
+1. ChkTeX                                               *syntastic-tex-chktex*
+
+Name:        chktex
+Maintainer:  LCD 47 <lcd047@gmail.com>
+
+"ChkTeX" is a linter for TeX and LaTeX. See the project's page for details:
+
+    http://baruch.ev-en.org/proj/chktex/
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+Additionally:
+
+                                           *'g:syntastic_tex_chktex_showmsgs'*
+Type: boolean
+Default: 1
+Whether to show informational messages ("chktex" option "-m"). By default
+informational messages are shown as warnings.
+
+Notes~
+
+If you're checking files containing tab characters, then Vim's 'tabstop'
+must match "ChkTeX"'s idea of tabstop, otherwise column numbers will be
+shifted. At the time of this writing, "ChkTeX"'s tabstop is hardcoded to 8,
+so you should probably add something like this to your vimrc: >
+    set tabstop=8
+<
+Note also that because of the way "ChkTeX" handles error formats column
+numbers are not available on Windows when running under "cmd.exe".
+
+------------------------------------------------------------------------------
+2. lacheck                                             *syntastic-tex-lacheck*
+
+Name:        lacheck
+Maintainer:  Martin Grenfell <martin.grenfell@gmail.com>
+
+"lacheck" is a style linter for LaTeX documents. See the project's page for
+details:
+
+    http://www.ctan.org/tex-archive/support/lacheck
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+Limitations~
+
+At the time of this writing "lacheck" can't expand "\def" commands. As a
+result, most "\input" commands using macros are signaled as errors.
+
+------------------------------------------------------------------------------
+3. proselint                                         *syntastic-tex-proselint*
+
+Name:        proselint
+Maintainer:  LCD 47 <lcd047@gmail.com>
+
+"proselint" is a linter for prose. See the page for details:
+
+    http://proselint.com/
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+See also: |syntastic-asciidoc-proselint|, |syntastic-help-proselint|,
+|syntastic-html-proselint|, |syntastic-markdown-proselint|,
+|syntastic-nroff-proselint|, |syntastic-pod-proselint|,
+|syntastic-rst-proselint|, |syntastic-texinfo-proselint|,
+|syntastic-text-proselint|, |syntastic-xhtml-proselint|.
+
+==============================================================================
+SYNTAX CHECKERS FOR TEXINFO                       *syntastic-checkers-texinfo*
+
+The following checkers are available for Texinfo (filetype "texinfo"):
+
+    1. Makeinfo.................|syntastic-texinfo-makeinfo|
+    2. proselint................|syntastic-texinfo-proselint|
+
+------------------------------------------------------------------------------
+1. Makeinfo                                       *syntastic-texinfo-makeinfo*
+
+Name:        makeinfo
+Maintainer:  LCD 47 <lcd047@gmail.com>
+
+"Makeinfo" is a converter for Texinfo files. It is distributed together with
+the GNU package "texinfo":
+
+    http://www.gnu.org/software/texinfo/
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+------------------------------------------------------------------------------
+2. proselint                                     *syntastic-texinfo-proselint*
+
+Name:        proselint
+Maintainer:  LCD 47 <lcd047@gmail.com>
+
+"proselint" is a linter for prose. See the page for details:
+
+    http://proselint.com/
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+See also: |syntastic-asciidoc-proselint|, |syntastic-help-proselint|,
+|syntastic-html-proselint|, |syntastic-markdown-proselint|,
+|syntastic-nroff-proselint|, |syntastic-pod-proselint|,
+|syntastic-rst-proselint|, |syntastic-tex-proselint|,
+|syntastic-text-proselint|, |syntastic-xhtml-proselint|.
+
+==============================================================================
+SYNTAX CHECKERS FOR TEXT                             *syntastic-checkers-text*
+
+The following checkers are available for plain text (filetype "text"):
+
+    1. atdtool..................|syntastic-text-atdtool|
+    2. Igor.....................|syntastic-text-igor|
+    3. language-check...........|syntastic-text-language_check|
+    4. proselint................|syntastic-text-proselint|
+    5. textlint.................|syntastic-text-textlint|
+
+------------------------------------------------------------------------------
+1. atdtool                                            *syntastic-text-atdtool*
+
+Name:        atdtool
+Maintainer:  LCD 47 <lcd047@gmail.com>
+
+"atdtool" is a script that runs a text file through the "After the Deadline"
+language service (http://www.afterthedeadline.com/) and returns a list of
+spelling, style, and grammar errors. See the project's page for details:
+
+    https://github.com/lpenz/atdtool
+
+See also the list of features of "After the Deadline":
+
+    http://www.afterthedeadline.com/features.slp
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+------------------------------------------------------------------------------
+2. Igor                                                  *syntastic-text-igor*
+
+Name:        igor
+Maintainer:  LCD 47 <lcd047@gmail.com>
+
+"Igor" is a proofreader for DocBook SGML, man pages, and text files used by
+the FreeBSD (https://www.freebsd.org/). See the author's presentation for
+details:
+
+    http://www.youtube.com/watch?v=sczHqUPygZY
+
+The latest version can be obtained from Glen Barber's repository:
+
+    http://docscripts.glenbarber.us/tags/igor/
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+See also: |syntastic-docbk-igor|, |syntastic-nroff-igor|.
+
+------------------------------------------------------------------------------
+3. language-check                              *syntastic-text-language_check*
+
+Name:        language_check
+Maintainer:  Steven Myint <git@stevenmyint.com>
+
+"language-check" is a wrapper for the LanguageTool grammar linter
+(https://www.languagetool.org/). See the project's page for details:
+
+    https://github.com/myint/language-check
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+------------------------------------------------------------------------------
+4. proselint                                        *syntastic-text-proselint*
+
+Name:        proselint
+Maintainer:  LCD 47 <lcd047@gmail.com>
+
+"proselint" is a linter for prose. See the page for details:
+
+    http://proselint.com/
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+See also: |syntastic-asciidoc-proselint|, |syntastic-help-proselint|,
+|syntastic-html-proselint|, |syntastic-markdown-proselint|,
+|syntastic-nroff-proselint|, |syntastic-pod-proselint|,
+|syntastic-rst-proselint|, |syntastic-tex-proselint|,
+|syntastic-texinfo-proselint|, |syntastic-xhtml-proselint|.
+
+------------------------------------------------------------------------------
+5. textlint                                          *syntastic-text-textlint*
+
+Name:        textlint
+Maintainer:  LCD 47 <lcd047@gmail.com>
+
+"textlint" is a natural language linter for text, Markdown, and HTML files.
+See the project's page for details:
+
+    https://textlint.github.io/
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+See also: |syntastic-html-textlint|, |syntastic-markdown-textlint|.
+
+==============================================================================
+SYNTAX CHECKERS FOR TRIG                             *syntastic-checkers-trig*
+
+The following checkers are available for TriG (filetype "trig"):
+
+    1. rapper...................|syntastic-trig-rapper|
+
+------------------------------------------------------------------------------
+1. rapper                                              *syntastic-trig-rapper*
+
+Name:        rapper
+Maintainer:  Sebastian Tramp <mail@sebastian.tramp.name>
+
+"rapper" is an RDF parsing and serializing utility. See the project's page for
+details:
+
+    http://librdf.org/raptor/rapper.html
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+Note~
+
+You probably also need a plugin to set |filetype| for TriG files, such as
+"Vim-RDF":
+
+    https://github.com/niklasl/vim-rdf
+
+See also: |syntastic-turtle-rapper|.
+
+==============================================================================
+SYNTAX CHECKERS FOR TURTLE                         *syntastic-checkers-turtle*
+
+The following checkers are available for Turtle (filetype "turtle"):
+
+    1. rapper...................|syntastic-turtle-rapper|
+    2. ttl......................|syntastic-turtle-ttl|
+
+------------------------------------------------------------------------------
+1. rapper                                            *syntastic-turtle-rapper*
+
+Name:        rapper
+Maintainer:  Sebastian Tramp <mail@sebastian.tramp.name>
+
+"rapper" is an RDF parsing and serializing utility. See the project's page
+for details:
+
+    http://librdf.org/raptor/rapper.html
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+Note~
+
+You probably also need a plugin to set |filetype| for Turtle files, such as
+"Vim-RDF":
+
+    https://github.com/niklasl/vim-rdf
+
+See also: |syntastic-trig-rapper|.
+
+------------------------------------------------------------------------------
+2. ttl                                                  *syntastic-turtle-ttl*
+
+Name:        ttl
+Maintainer:  Antoine Reilles <tonio@NetBSD.org>
+
+"ttl" is an RDF validator. See the project's page at GitHub for details:
+
+    https://github.com/mmlab/TurtleValidator
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+Note~
+
+You probably also need a plugin to set |filetype| for Turtle files, such as
+"Vim-RDF":
+
+    https://github.com/niklasl/vim-rdf
+
+==============================================================================
+SYNTAX CHECKERS FOR TWIG                             *syntastic-checkers-twig*
+
+The following checkers are available for Twig (filetype "twig"):
+
+    1. twig-lint................|syntastic-twig-twiglint|
+    2. twigcs...................|syntastic-twig-twigcs|
+
+------------------------------------------------------------------------------
+1. twig-lint                                         *syntastic-twig-twiglint*
+
+Name:        twiglint
+Maintainer:  Alexander <iam.asm89@gmail.com>
+
+"twig-lint" is a lint tool for Twig templates. See the project's page at
+GitHub for details:
+
+    https://github.com/asm89/twig-lint
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+Notes~
+
+For the standalone executable, add the following to your vimrc file: >
+    let g:syntastic_twig_twiglint_exec = "php"
+    let g:syntastic_twig_twiglint_exe = "php /path/to/twig-lint.phar"
+<
+For the "Composer" (https://getcomposer.org/) dependency "twig-lint" must be
+in your "$PATH". No further configuration is needed.
+
+------------------------------------------------------------------------------
+2. twigcs                                              *syntastic-twig-twigcs*
+
+Name:        twigcs
+Maintainer:  Ciloe <escrichjimmy@yahoo.fr>
+
+"twigcs" is a lint tool for Twig templates. See the project's page at
+GitHub for details:
+
+    https://github.com/friendsoftwig/twigcs
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+==============================================================================
+SYNTAX CHECKERS FOR TYPESCRIPT                 *syntastic-checkers-typescript*
+
+The following checkers are available for TypeScript (filetype "typescript"):
+
+    1. ESLint...................|syntastic-typescript-eslint|
+    2. Lynt.....................|syntastic-typescript-lynt|
+    3. TSLint...................|syntastic-typescript-tslint|
+
+------------------------------------------------------------------------------
+1. ESLint                                        *syntastic-typescript-eslint*
+
+Name:        eslint
+Maintainer:  LCD 47 <lcd047@gmail.com>
+
+"ESLint" is a tool for identifying and reporting on patterns found
+in ECMAScript/JavaScript code. With the "babel-eslint" plugin
+(https://github.com/babel/babel-eslint) "ESLint" can also be
+used to check TypeScript files. See the project's page for details:
+
+    https://github.com/nzakas/eslint
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+Note~
+
+You probably also need a plugin to set |filetype| for TypeScript files, such
+as "typescript-vim":
+
+    https://github.com/leafgarland/typescript-vim
+
+See also: |syntastic-html-eslint|, |syntastic-javascript-eslint|,
+|syntastic-vue-eslint|.
+
+------------------------------------------------------------------------------
+2. Lynt                                            *syntastic-typescript-lynt*
+
+Name:        lynt
+Maintainer:  LCD 47 <lcd047@gmail.com>
+
+"Lynt" is a JavaScript linter with support for TypeScript, Flow, and React.
+See the project's page for more information:
+
+    https://github.com/saadq/lynt
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+Note~
+
+Automatically fixing errors (option "--fix") is not supported.
+
+See also: |syntastic-javascript-lynt|.
+
+------------------------------------------------------------------------------
+3. TSLint                                        *syntastic-typescript-tslint*
+
+Name:        tslint
+Maintainer:  Seon-Wook Park <seon.wook@swook.net>
+
+"TSLint" is a lint checker for TypeScript. See the project's page for
+details:
+
+    https://github.com/palantir/tslint
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+Note~
+
+You probably also need a plugin to set |filetype| for TypeScript files, such
+as "typescript-vim":
+
+    https://github.com/leafgarland/typescript-vim
+
+==============================================================================
+SYNTAX CHECKERS FOR VERILOG                       *syntastic-checkers-verilog*
+
+The following checkers are available for Verilog (filetype "verilog"):
+
+    1. Icarus Verilog...........|syntastic-verilog-iverilog|
+    2. Verilator................|syntastic-verilog-verilator|
+
+------------------------------------------------------------------------------
+1. Icarus Verilog                                 *syntastic-verilog-iverilog*
+
+Name:        iverilog
+Maintainer:  Psidium <psiidium@gmail.com>
+
+"Icarus Verilog" is a Verilog simulation and synthesis tool. See the
+project's page for details:
+
+    http://iverilog.icarus.com/
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+------------------------------------------------------------------------------
+2. Verilator                                     *syntastic-verilog-verilator*
+
+Name:        verilator
+Maintainer:  Kocha <kocha.lsifrontend@gmail.com>
+
+Checker options~
+
+                                              *'g:syntastic_verilog_compiler'*
+Type: string
+Default: "verilator"
+Compiler executable.
+
+                                           *'g:syntastic_verilog_errorformat'*
+Type: string
+Default: unset
+Override for the default |'errorformat'|.
+
+                                 *'g:syntastic_verilog_remove_include_errors'*
+Type: boolean
+Default: 0
+By default, errors in files included from the file being checked are shown.
+Set this variable to 1 to remove messages about errors in included files.
+Please note that this means syntastic will silently abort checks if there are
+fatal errors in one of the included files.
+
+                                      *'g:syntastic_verilog_compiler_options'*
+Type: string
+Default: unset
+Compilation flags (such as defines or include directories) to be passed to the
+linter.
+
+                                           *'g:syntastic_verilog_config_file'*
+Type: string
+Default: unset
+File containing additional compilation flags to be passed to the linter, one
+option per line (cf. |syntastic-config-files|).
+
+                                          *'g:syntastic_verilog_include_dirs'*
+Type: array of strings
+Default: []
+Include directories to be passed to the linter, in addition to the
+above compilation flags. You can set it like this: >
+    let g:syntastic_verilog_include_dirs = ["includes", "headers"]
+<
+and the corresponding "-Iincludes -Iheaders" will be added to the compilation
+flags.
+
+                                                *'b:syntastic_verilog_cflags'*
+Type: string
+Default: unset
+Buffer-local variable. Additional compilation flags specific to the current
+buffer.
+
+Note~
+
+This checker doesn't call the "makeprgBuild()" function, and thus it ignores
+the usual 'g:syntastic_verilog_verilator_<option>' variables. The only
+exception is 'g:syntastic_verilog_verilator_exec', which can still be used to
+override the linter's executable.
+
+==============================================================================
+SYNTAX CHECKERS FOR VHDL                             *syntastic-checkers-vhdl*
+
+The following checkers are available for VHDL (filetype "vhdl"):
+
+    1. GHDL.....................|syntastic-vhdl-ghdl|
+    2. vcom.....................|syntastic-vhdl-vcom|
+
+------------------------------------------------------------------------------
+1. GHDL                                                  *syntastic-vhdl-ghdl*
+
+Name:        ghdl
+Maintainer:  Jan Wagner <jaydyou@janidom.de>
+
+"GHDL" is a VHDL simulator. See the project's page for details:
+
+    http://gna.org/projects/ghdl/
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+------------------------------------------------------------------------------
+2. vcom                                                  *syntastic-vhdl-vcom*
+
+Name:        vcom
+Maintainer:  Jim Vogel <jim.e.vogel@gmail.com>
+
+"vcom" is compiler for VHDL files distributed with the "ModelSim" HDL
+simulation environment:
+
+    https://www.mentor.com/products/fpga/model/
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+==============================================================================
+SYNTAX CHECKERS FOR VIM HELP                         *syntastic-checkers-help*
+
+The following checkers are available for Vim help (filetype "help"):
+
+    1. proselint................|syntastic-help-proselint|
+
+------------------------------------------------------------------------------
+1. proselint                                        *syntastic-help-proselint*
+
+Name:        proselint
+Maintainer:  LCD 47 <lcd047@gmail.com>
+
+"proselint" is a linter for prose. See the page for details:
+
+    http://proselint.com/
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+See also: |syntastic-asciidoc-proselint|, |syntastic-html-proselint|,
+|syntastic-markdown-proselint|, |syntastic-nroff-proselint|,
+|syntastic-pod-proselint|, |syntastic-rst-proselint|,
+|syntastic-tex-proselint|, |syntastic-texinfo-proselint|,
+|syntastic-text-proselint|, |syntastic-xhtml-proselint|.
+
+==============================================================================
+SYNTAX CHECKERS FOR VIML                              *syntastic-checkers-vim*
+
+The following checkers are available for VimL (filetype "vim"):
+
+    1. Vimlint..................|syntastic-vim-vimlint|
+    2. Vint.....................|syntastic-vim-vint|
+
+------------------------------------------------------------------------------
+1. Vimlint                                             *syntastic-vim-vimlint*
+
+Name:        vimlint
+Maintainer:  LCD 47 <lcd047@gmail.com>
+
+"Vimlint" is a lint checker for VimL written in pure VimL, based on Yukihiro
+Nakadaira's "vimlparser" (https://github.com/ynkdir/vim-vimlparser/). See the
+project's page for details:
+
+    https://github.com/syngan/vim-vimlint/
+
+Installation~
+
+You need to install the Vim plugins "vim-vimlint" and "vim-vimlparser"
+mentioned above.
+
+Checker Options~
+
+                                               *'g:syntastic_vimlint_options'*
+Type: dictionary
+Default: |EVL102|, |EVL103|, |EVL104|, |EVL105|, |EVL106|, |EVL201|, |EVL204|, and |EVL205|
+    are warnings.
+Dictionary of "Vimlint" options, with the same syntax as |g:vimlint#config|.
+See |g:vimlint#config| and |vimlint-errorcode| for more details.
+
+"Vimlint" does not call the "makeprgBuild()" function, and thus ignores the
+usual 'g:syntastic_vim_vimlint_<option>' variables.
+
+Note~
+
+The values of |'g:syntastic_vimlint_options'| useful for syntastic are those
+that ignore or change the severity of some "EVLxxx" messages.  For example
+to ignore warnings about unused arguments: >
+    let g:syntastic_vimlint_options = { "EVL103": 1 }
+<
+Limitation~
+
+Certain error messages can't be turned off by |'g:syntastic_vimlint_options'|.
+This is a misfeature of "Vimlint" rather than a limitation of syntastic. You
+can still ignore these messages using the standard mechanism of
+|'syntastic_quiet_messages'|: >
+    let g:syntastic_vim_vimlint_quiet_messages = { "regex": '\v\[EVL%(105|205)\]' }
+<
+At the time of this writing the messages that can't be turned off by setting
+|'g:syntastic_vimlint_options'| are:
+
+    |EVL105| - global variable defined without 'g:'
+    |EVL202| - missing call
+    |EVL203| - parse error in command
+    |EVL205| - missing 'scriptencoding'
+    |EVL901| - unknown type
+    |EVL902| - assert error.
+
+------------------------------------------------------------------------------
+2. Vint                                                   *syntastic-vim-vint*
+
+Name:        vint
+Maintainer:  LCD 47 <lcd047@gmail.com>
+
+"Vint" is a lint checker for VimL. See the project's page at GitHub for
+details:
+
+    https://github.com/Kuniwak/vint
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+==============================================================================
+SYNTAX CHECKERS FOR VUE.JS                            *syntastic-checkers-vue*
+
+The following checkers are available for Vue.js (filetype "vue"):
+
+    1. ESLint...................|syntastic-vue-eslint|
+    2. pug_lint_vue.............|syntastic-vue-pug_lint_vue|
+    3. stylelint................|syntastic-vue-stylelint|
+
+------------------------------------------------------------------------------
+1. ESLint                                               *syntastic-vue-eslint*
+
+Name:        eslint
+Maintainer:  LCD 47 <lcd047@gmail.com>
+
+"ESLint" is a tool for identifying and reporting on patterns found in
+ECMAScript/JavaScript code. It can also detect problems in JavaScript
+components of Vue.js files. See the project's page for details:
+
+    https://github.com/nzakas/eslint
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+Notes~
+
+Automatically fixing errors (option "--fix") is not supported.
+
+You can also use "eslint_d" (https://github.com/mantoni/eslint_d.js), version
+2.1.0 or later, instead of "ESLint". Just point 'g:syntastic_vue_eslint_exec'
+to it:
+
+    https://github.com/mantoni/eslint_d.js#editor-integration
+
+See also: |syntastic-html-eslint|, |syntastic-javascript-eslint|,
+|syntastic-typescript-eslint|.
+
+------------------------------------------------------------------------------
+2. pug_lint_vue                                   *syntastic-vue-pug_lint_vue*
+
+Name:        pug_lint_vue
+Maintainer:  Tim Carry <tim@pixelastic.com>
+
+"pug-lint-vue" is a linter for Pug templates inside of Vue.js components. See
+the project's page at GitHub for details:
+
+    https://github.com/sourceboat/pug-lint-vue
+
+Installation~
+
+Install it with: >
+    npm install -g pug-lint-vue
+<
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+Note~
+
+You probably also need a plugin to set |filetype| for Vue.js files, such as
+"vim-vue":
+
+    https://github.com/posva/vim-vue
+
+------------------------------------------------------------------------------
+3. stylelint                                         *syntastic-vue-stylelint*
+
+Name:        stylelint
+Maintainer:  Tim Carry <tim@pixelastic.com>
+
+"stylelint" is a style linter for Cascading Stylesheets. See the project's
+page for more information:
+
+    http://stylelint.io/
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+See also: |syntastic-css-stylelint|, |syntastic-html-stylelint|.
+
+==============================================================================
+SYNTAX CHECKERS FOR XHTML                           *syntastic-checkers-xhtml*
+
+The following checkers are available for xHTML (filetype "xhtml"):
+
+    1. HTML Tidy................|syntastic-xhtml-tidy|
+    2. jshint...................|syntastic-xhtml-jshint|
+    3. proselint................|syntastic-xhtml-proselint|
+    4. Validator................|syntastic-xhtml-validator|
+    5. W3.......................|syntastic-xhtml-w3|
+
+------------------------------------------------------------------------------
+1. HTML tidy                                            *syntastic-xhtml-tidy*
+
+Name:        tidy
+Maintainer:  Martin Grenfell <martin.grenfell@gmail.com>
+
+"HTML Tidy" is a syntax linter and formatter for HTML. See the HTML Tidy
+Library Project for more information:
+
+    http://tidy.sourceforge.net/
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+Additionally:
+
+                                      *'g:syntastic_xhtml_tidy_ignore_errors'*
+Type: array of strings
+Default: []
+List of errors to ignore. Case-sensitive patterns matched as substrings
+(not regular expressions) against the error messages. See also
+|'syntastic_quiet_messages'|.
+
+See also: |syntastic-html-tidy|.
+
+------------------------------------------------------------------------------
+2. jshint                                             *syntastic-xhtml-jshint*
+
+Name:        JSHint
+Maintainer:  LCD 47 <lcd047@gmail.com>
+
+"JSHint" can detect JavaScript errors and potential problems in HTML
+files. See the project's page for details:
+
+    http://jshint.com/
+
+Syntastic requires "JSHint" version 2.4.0 or later.
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+Note~
+
+If you're checking files containing tab characters then "JSHint"'s idea of
+tabstop must match Vim's 'tabstop', otherwise syntastic will highlight the
+errors at shifted positions. By default "JSHint"'s tabstop is 4, while Vim's
+default 'tabstop' is 8.
+
+In order to change "JSHint"'s tabstop you have to change its "indent" config
+option (cf. http://jshint.com/docs/options/#indent). One way to do that is
+to put it in a file named ".jshintrc" in the current directory, the parent
+directories, or your home directory. The file is supposed to be in JSON
+format. For example: >
+    {
+        "indent": 8
+    }
+<
+See JSHint documentation for more details:
+
+    http://jshint.com/docs/
+
+Please note however that setting "indent" also triggers the indentation checks
+in "JSHint". If that is undesirable, your only other option is to leave
+"JSHint"'s tabstop alone, and change Vim's 'tabstop' to 4. To change Vim's
+'tabstop', you can add this to your vimrc: >
+    set tabstop=4
+<
+See also: |syntastic-html-jshint|, |syntastic-javascript-jshint|.
+
+------------------------------------------------------------------------------
+3. proselint                                       *syntastic-xhtml-proselint*
+
+Name:        proselint
+Maintainer:  LCD 47 <lcd047@gmail.com>
+
+"proselint" is a linter for prose. See the page for details:
+
+    http://proselint.com/
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+See also: |syntastic-asciidoc-proselint|, |syntastic-help-proselint|,
+|syntastic-html-proselint|, |syntastic-markdown-proselint|,
+|syntastic-nroff-proselint|, |syntastic-pod-proselint|,
+|syntastic-rst-proselint|, |syntastic-tex-proselint|,
+|syntastic-texinfo-proselint|, |syntastic-text-proselint|.
+
+------------------------------------------------------------------------------
+4. Validator                                       *syntastic-xhtml-validator*
+
+Name:        validator
+Maintainer:  LCD 47 <lcd047@gmail.com>
+
+"Validator" is a non-DTD-based HTML linter.  See the project's page for
+details:
+
+    http://validator.github.io/validator/
+
+As a syntastic linter, you can validate your files against the online service
+(see https://validator.nu/), or you can install "vnu.jar":
+
+    https://github.com/validator/validator/releases/latest
+
+then run it as a HTTP server: >
+    $ java -Xss512k -cp /path/to/vnu.jar nu.validator.servlet.Main 8888
+<
+Requirement~
+
+This checker uses cURL:
+
+    http://curl.haxx.se/
+
+Checker options~
+
+                                           *'g:syntastic_xhtml_validator_api'*
+Type: string
+Default: "http://validator.nu/"
+URL of the service to use for checking. Leave it to the default to run the
+checks against "https://validator.nu/", or set it to "http://localhost:8888/"
+if you have "vnu.jar" installed, and you're running it as a standalone HTTP
+server. See:
+
+    http://validator.github.io/validator/#standalone
+
+                                        *'g:syntastic_xhtml_validator_parser'*
+Type: string
+Default: empty
+Parser to use. Legal values are: "xml", "xmldtd", "html", "html5", "html4",
+and "html4tr". References:
+
+    https://wiki.whatwg.org/wiki/Validator.nu_Common_Input_Parameters#parser
+
+                                      *'g:syntastic_xhtml_validator_nsfilter'*
+Type: string
+Default: empty
+Sets the "nsfilter" for the parser. See:
+
+    https://wiki.whatwg.org/wiki/Validator.nu_Common_Input_Parameters#nsfilter
+
+                                        *'g:syntastic_xhtml_validator_schema'*
+Type: string
+Default: empty
+Sets the "schema" for the parser. See:
+
+    https://wiki.whatwg.org/wiki/Validator.nu_Common_Input_Parameters#schema
+
+                                          *'g:syntastic_xhtml_validator_exec'*
+Type: string
+Default: "curl"
+Path to the "cURL" executable. Override it with a full path if your "cURL" is
+not installed in a standard location.
+
+This checker doesn't call the "makeprgBuild()" function, and thus it ignores
+the usual 'g:syntastic_xhtml_validator_<option>' variables. The only exception
+is 'g:syntastic_xhtml_validator_exec', which can be used to override the path
+to the "cURL" executable.
+
+Note~
+
+Non-zero exit codes from "cURL" are typically network errors, and are signaled
+by syntastic with messages such as: >
+    syntastic: error: checker xhtml/validator returned abnormal status 26
+<
+You can lookup the meaning of these codes in cURL's manual:
+    
+    http://curl.haxx.se/docs/manpage.html#EXIT
+
+Example~
+>
+    let g:syntastic_xhtml_validator_parser = 'xmldtd'
+    let g:syntastic_xhtml_validator_schema = 
+        \ 'http://s.validator.nu/xhtml5.rnc ' .
+        \ 'http://s.validator.nu/html5/assertions.sch ' .
+        \ 'http://c.validator.nu/all/
+<
+See also: |syntastic-html-validator|, |syntastic-svg-validator|.
+
+------------------------------------------------------------------------------
+5. W3                                                     *syntastic-xhtml-w3*
+
+Name:        w3
+Maintainer:  Kevin Locke <kevin@kevinlocke.name>
+
+"W3" is the W3C Markup Validator for XHTML.  See the project's page for
+details:
+
+    https://validator.w3.org/source/
+
+As a syntastic linter, you can validate your files against the online service
+(see https://validator.w3.org/), or you can install it from sources and run it
+as a local service:
+
+    https://github.com/w3c/markup-validator/
+
+Requirement~
+
+This checker uses cURL:
+
+    https://curl.haxx.se/
+
+Checker options~
+
+                                                   *'g:syntastic_xhtml_w3_api'*
+Type: string
+Default: "https://validator.w3.org/check"
+URL of the service to use for checking. Leave it to the default to
+run the checks against "https://validator.w3.org/", or set it to
+"http://localhost/w3c-validator/check" if you're running a local service.
+
+                                              *'g:syntastic_xhtml_w3_doctype'*
+Type: string
+Default: "XHTML 1.1"
+Name of the document type definition to use for checking.  If unspecified, the
+type is detected from the file content.  Currently supported values for XHTML:
+
+  - XHTML 1.0 Strict
+  - XHTML 1.0 Transitional
+  - XHTML 1.0 Frameset
+  - XHTML 1.1
+  - XHTML + RDFa
+  - XHTML Basic 1.0
+  - XHTML Basic 1.1
+  - XHTML Mobile Profile 1.2
+  - XHTML-Print 1.0
+  - XHTML 1.1 plus MathML 2.0
+  - XHTML 1.1 plus MathML 2.0 plus SVG 1.1
+
+References:
+
+    https://github.com/w3c/markup-validator/blob/master/htdocs/doctype-select.html
+    https://github.com/w3c/markup-validator/blob/master/htdocs/config/types.conf
+
+                                                  *'g:syntastic_xhtml_w3_exec'*
+Type: string
+Default: "curl"
+Path to the "cURL" executable. Override it with a full path if your "cURL" is
+not installed in a standard location.
+
+This checker doesn't call the "makeprgBuild()" function, and thus it ignores
+the usual 'g:syntastic_xhtml_w3_<option>' variables. The only exception is
+'g:syntastic_xhtml_w3_exec', which can be used to override the path to the
+"cURL" executable.
+
+Note~
+
+Non-zero exit codes from "cURL" are typically network errors, and are signaled
+by syntastic with messages such as: >
+    syntastic: error: checker xhtml/w3 returned abnormal status 26
+<
+You can lookup the meaning of these codes in cURL's manual:
+    
+    https://curl.haxx.se/docs/manpage.xhtml#EXIT
+
+See also: |syntastic-html-w3|, |syntastic-svg-w3|.
+
+==============================================================================
+SYNTAX CHECKERS FOR XML                               *syntastic-checkers-xml*
+
+The following checkers are available for XML (filetype "xml"):
+
+    1. plutil...................|syntastic-xml-plutil|
+    2. xmllint..................|syntastic-xml-xmllint|
+
+------------------------------------------------------------------------------
+1. plutil                                               *syntastic-xml-plutil*
+
+Name:        plutil
+Maintainer:  LCD 47 <lcd047@gmail.com>
+
+"plutil" is a linter for OS X and iOS property list files. See the "plist(5)"
+and "plutil(1)" manual pages for details:
+
+    https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man5/plist.5.html
+    https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man1/plutil.1.html
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+------------------------------------------------------------------------------
+2. xmllint                                             *syntastic-xml-xmllint*
+
+Name:        xmllint
+Maintainer:  Sebastian Kusnier <sebastian@kusnier.net>
+
+"xmllint" is a linter and transformer tool for XML files, distributed with
+the "libxml" package (http://www.xmlsoft.org/). See the tool's manual for more
+information:
+
+    http://xmlsoft.org/xmllint.html
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+Note~
+
+You can use a local installation of DTDs to significantly speed up validation
+and allow you to validate XML data without network access. See the
+"xmlcatalog" manual, and the catalog documentation for more information:
+
+    http://www.xmlsoft.org/xmlcatalog_man.html
+    http://www.xmlsoft.org/catalog.html
+
+For an example of a DTD catalog see f.i. "XMLCatalog":
+
+    https://github.com/darcyparker/XMLCatalog
+
+In order to use it with syntastic you'll have to clone it to a local
+directory, and point the environment variable "XML_CATALOG_FILES" to the file
+"catalog.xml" in the said directory: >
+    XML_CATALOG_FILES=/some/path/XMLCatalog/catalog.xml
+    export XML_CATALOG_FILES
+<
+Otherwise "xmllint" will try to load XML catalogs from "/etc/xml/catalog".
+
+See also: |syntastic-docbk-xmllint|, |syntastic-xslt-xmllint|.
+
+==============================================================================
+SYNTAX CHECKERS FOR XQUERY                         *syntastic-checkers-xquery*
+
+The following checkers are available for XQuery (filetype "xquery"):
+
+    1. BaseX....................|syntastic-xquery-basex|
+
+------------------------------------------------------------------------------
+1. BaseX                                              *syntastic-xquery-basex*
+
+Name:        basex
+Maintainer:  James Wright <james.jw@hotmail.com>
+
+"BaseX" is an XML database engine and XPath`/`XQuery processor. See the
+project's page for details:
+
+    http://basex.org/
+
+Installation~
+
+1. Install "BaseX"
+2. Add the "basex/bin" folder to your "$PATH".
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+==============================================================================
+SYNTAX CHECKERS FOR XSLT                             *syntastic-checkers-xslt*
+
+The following checkers are available for XSLT (filetype "xslt"):
+
+    1. xmllint..................|syntastic-xslt-xmllint|
+
+------------------------------------------------------------------------------
+1. xmllint                                            *syntastic-xslt-xmllint*
+
+Name:        xmllint
+Maintainer:  Sebastian Kusnier <sebastian@kusnier.net>
+
+"xmllint" is a linter and transformer tool for XML files, distributed with
+the "libxml" package (http://www.xmlsoft.org/). See the tool's manual for more
+information:
+
+    http://xmlsoft.org/xmllint.html
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+See also: |syntastic-docbk-xmllint|, |syntastic-xml-xmllint|.
+
+==============================================================================
+SYNTAX CHECKERS FOR YACC                             *syntastic-checkers-yacc*
+
+The following checkers are available for YACC (filetype "yacc"):
+
+    1. Bison....................|syntastic-yacc-bison|
+
+------------------------------------------------------------------------------
+1. Bison                                                *syntastic-yacc-bison*
+
+Name:        bison
+Maintainer:  LCD 47 <lcd047@gmail.com>
+
+"Bison" is the GNU implementation of the standard UNIX parser generator
+"yacc" (http://en.wikipedia.org/wiki/Yacc). See the project's page for more
+information:
+
+    http://www.gnu.org/software/bison/
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+==============================================================================
+SYNTAX CHECKERS FOR YAML                             *syntastic-checkers-yaml*
+
+The following checkers are available for YAML (filetype "yaml"):
+
+    1. JavaScript YAML..........|syntastic-yaml-jsyaml|
+    2. yamllint.................|syntastic-yaml-yamllint|
+    3. YAML::XS.................|syntastic-yaml-yamlxs|
+
+------------------------------------------------------------------------------
+1. JavaScript YAML                                     *syntastic-yaml-jsyaml*
+
+Name:        jsyaml
+Maintainer:  Martin Grenfell <martin.grenfell@gmail.com>
+
+"JavaScript YAML" is a parser for YAML. See the project's page at GitHub for
+details:
+
+    https://github.com/nodeca/js-yaml
+
+Installation~
+
+Install it with "npm": >
+    npm install -g js-yaml
+<
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+------------------------------------------------------------------------------
+2. yamllint                                          *syntastic-yaml-yamllint*
+
+Name:        yamllint
+Maintainer:  Adrien VergĂŠ
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+"yamllint" is a linter and style checker for YAML.
+See the project's page at GitHub for details:
+
+    https://github.com/adrienverge/yamllint
+
+Installation~
+
+Install it with "pip": >
+    pip install yamllint
+<
+------------------------------------------------------------------------------
+3. YAML::XS                                            *syntastic-yaml-yamlxs*
+
+Name:        yamlxs
+Maintainer:  LCD 47 <lcd047@gmail.com>
+
+This is a syntax checker for YAML 1.1 using the Perl module "YAML::XS":
+
+    https://metacpan.org/pod/YAML::XS
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+Additionally:
+
+                                              'g:syntastic_perl_interpreter'
+Type: string
+Default: "perl"
+The perl interpreter to use.
+
+                                                 'g:syntastic_perl_lib_path'
+Type: list
+Default: []
+List of include directories to be added to the perl command line. Example: >
+    let g:syntastic_perl_lib_path = [ "/usr/local/lib/perl5/auto" ]
+<
+Note~
+
+The variable |'g:syntastic_perl_interpreter'| is shared with the "perl" checker
+(cf. |syntastic-perl-perl|). If for some reasons you don't want to use the same
+interpreter for both checkers, you can override it locally by setting
+'g:syntastic_yaml_yamlxs_exec'.
+
+==============================================================================
+SYNTAX CHECKERS FOR YANG                             *syntastic-checkers-yang*
+
+The following checkers are available for YANG data models (filetype "yang"):
+
+    1. pyang....................|syntastic-yang-pyang|
+
+------------------------------------------------------------------------------
+1. pyang                                                *syntastic-yang-pyang*
+
+Name:        pyang
+Maintainer:  Joshua Downer <joshua.downer@gmail.com>
+
+"pyang" is a validator for YANG data models (http://www.yang-central.org/).
+See the project's page at GitHub for more information:
+
+    https://github.com/mbj4668/pyang
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+Note~
+
+You probably also need a plugin to set |filetype| for YANG files, such as
+"yang.vim":
+
+    https://github.com/nathanalderson/yang.vim
+
+==============================================================================
+SYNTAX CHECKERS FOR YARA                             *syntastic-checkers-yara*
+
+The following checkers are available for YARA rule files (filetype "yara"):
+
+    1. yarac....................|syntastic-yara-yarac|
+
+------------------------------------------------------------------------------
+1. yarac                                                *syntastic-yara-yarac*
+
+Name:        yarac
+Maintainer:  Albert Song <albb@teamt5.org>
+
+"yarac" is the official compiler for YARA rule files. See the project's page
+at GitHub for more information:
+
+    https://github.com/VirusTotal/yara
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+Note~
+
+You probably also need a plugin to set |filetype| for YARA rule files, such as
+"vim-yara":
+
+    https://github.com/yaunj/vim-yara
+
+==============================================================================
+SYNTAX CHECKERS FOR Z80                               *syntastic-checkers-z80*
+
+The following checkers are available for Z80 (filetype "z80"):
+
+    1. Z80syntaxchecker.........|syntastic-z80-z80syntaxchecker|
+
+------------------------------------------------------------------------------
+1. Z80syntaxchecker                           *syntastic-z80-z80syntaxchecker*
+
+Name:        z80syntaxchecker
+Maintainer:  Romain Giot <giot.romain@gmail.com>
+
+"Z80syntaxchecker" is a syntax linter for Z80 assembly files.
+
+Installation~
+
+To install "Z80syntaxchecker" either install "pycpcdemotools"
+(https://github.com/cpcsdk/pycpcdemotools), or copy the following script to a
+directory in your "$PATH":
+
+    https://raw.githubusercontent.com/rgiot/pycpcdemotools/master/cpcdemotools/source_checker/z80_syntax_checker.py
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+==============================================================================
+SYNTAX CHECKERS FOR ZOPE PAGE TEMPLATES               *syntastic-checkers-zpt*
+
+The following checkers are available for Zope Page Templates (filetype "zpt"):
+
+    1. zptlint..................|syntastic-zpt-zptlint|
+
+------------------------------------------------------------------------------
+1. zptlint                                             *syntastic-zpt-zptlint*
+
+Name:        zptlint
+Maintainer:  claytron <robots@claytron.com>
+
+"zptlint" is a linter for Zope Page Templates. See the project's README for
+more information:
+
+    https://trac.bubblenet.be/browser/bubblenet/pythoncode/zptlint/trunk/README.txt?format=txt
+
+Installation~
+
+Install it with "pip": >
+    pip install zptlint
+<
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+Note~
+
+You probably also need to set |filetype| for Zope Page Templates to "zpt".
+You can do that with an `:autocmd`: >
+    autocmd BufNewFile,BufRead *.pt,*.cpt,*.zpt set filetype=zpt syntax=xml
+<
+==============================================================================
+SYNTAX CHECKERS FOR ZSH                               *syntastic-checkers-zsh*
+
+The following checkers are available for Zsh (filetype "zsh"):
+
+    1. zsh......................|syntastic-zsh-zsh|
+
+------------------------------------------------------------------------------
+1. zsh                                                     *syntastic-zsh-zsh*
+
+Name:        zsh
+Maintainer:  Martin Grenfell <martin.grenfell@gmail.com>
+
+Checker options~
+
+This checker is initialised using the "makeprgBuild()" function and thus it
+accepts the standard options described at |syntastic-config-makeprg|.
+
+==============================================================================
+CONFIGURATION FILES                                   *syntastic-config-files*
+
+    Supported checkers..........|syntastic-config-checkers|
+    Naming......................|syntastic-config-naming|
+    Location....................|syntastic-config-location|
+    Format......................|syntastic-config-format|
+
+                                                   *syntastic-config-checkers*
+Currently, the following checkers can read some of their options from
+syntastic-specific configuration files:
+
+    ADA~
+        GCC (|syntastic-ada-gcc|)
+
+    Assembly Languages~
+        GCC (|syntastic-asm-gcc|)
+
+    C~
+        AVR-GCC (|syntastic-c-avrgcc|)
+        ClangCheck (|syntastic-c-clang_check|)
+        Clang-Tidy (|syntastic-c-clang_tidy|)
+        Cppcheck (|syntastic-c-cppcheck|)
+        GCC (|syntastic-c-gcc|)
+        OCLint (|syntastic-c-oclint|)
+        Sparse (|syntastic-c-sparse|)
+        Splint (|syntastic-c-splint|)
+
+    COBOL~
+        OpenCOBOL (|syntastic-cobol-cobc|)
+
+    C++~
+        AVR-GCC (|syntastic-cpp-avrgcc|)
+        ClangCheck (|syntastic-cpp-clang_check|)
+        Clang-Tidy (|syntastic-cpp-clang_tidy|)
+        Cppcheck (|syntastic-cpp-cppcheck|)
+        GCC (|syntastic-cpp-gcc|)
+        OCLint (|syntastic-cpp-oclint|)
+        Vera++ (|syntastic-cpp-verapp|)
+
+    D~
+        DMD (|syntastic-d-dmd|)
+
+    Fortran~
+        GNU Fortran (|syntastic-fortran-gfortran|)
+
+    Objective-C~
+        GCC (|syntastic-objc-gcc|)
+        OCLint (|syntastic-objc-oclint|)
+
+    Objective-C++~
+        GCC (|syntastic-objcpp-gcc|)
+        OCLint (|syntastic-objcpp-oclint|)
+
+    Verilog~
+        Verilator (|syntastic-verilog-verilator|)
+
+                                                     *syntastic-config-naming*
+Naming~
+
+Depending on checker, the filename of the corresponding configuration file
+can be specified by setting either 'g:syntastic_<filetype>_config_file' or
+'g:syntastic_<checker>_config_file'. Refer to the docs for the particular
+checkers above for the exact names.
+                                                   *syntastic-config-location*
+Location~
+
+A configuration file is looked up in the directory of the file being checked,
+then upwards in parent directories.  The search stops either when a file with
+the right name is found, or when the root of the filesystem is reached.
+
+Consequently, you would normally put a configuration file in the top directory
+of your project, and you would override it when needed with other configuration
+files placed in subdirectories.
+                                                     *syntastic-config-format*
+Format~
+
+The file is expected to contain one option per line.  Empty lines and lines
+starting with `#` are removed.  On each line, leading and trailing spaces are
+also removed.  Each option is then escaped, so you don't have to worry about
+special characters.
+
+Lines starting with `-I` are assumed to be include paths, and are handled
+specially.  If the path following an `-I` is relative, it's treated as
+being relative to the current configuration file, and is replaced by the
+corresponding absolute path.  If the path is absolute to begin with, it is
+left unchanged.
+
+Please note that, aside from `-I`, syntastic doesn't try to keep track of
+options with arguments.  If you need to pass f.i. `-aux-info filename` to your
+compiler you have to write `-aux-info` and `filename` on separate lines in the
+configuration file, otherwise syntastic will quote the space and merge them in
+a single string, which is probably not what you mean: >
+    -aux-info
+    filename
+<
+In the same vein, `=` in options not special in any way.  As stated
+above, everything on a line (except lines starting with `-I`, as noted)
+is considered an "option" and escaped.
+
+ vim:tw=78:sw=4:ft=help:norl:

+ 1214 - 0
vim/plugged/syntastic/doc/syntastic.txt

@@ -0,0 +1,1214 @@
+*syntastic.txt*   Syntax checking on the fly has never been so pimp.
+*syntastic*
+
+
+                    It's a bird! It's a plane! ZOMG It's ... ~
+
+                   _____             __             __  _      ~
+                  / ___/__  ______  / /_____ ______/ /_(_)____ ~
+                  \__ \/ / / / __ \/ __/ __ `/ ___/ __/ / ___/ ~
+                 ___/ / /_/ / / / / /_/ /_/ (__  ) /_/ / /__   ~
+                /____/\__, /_/ /_/\__/\__,_/____/\__/_/\___/   ~
+                     /____/                                    ~
+
+
+
+                              Reference Manual~
+
+
+==============================================================================
+CONTENTS                                                  *syntastic-contents*
+
+    1.Intro........................................|syntastic-intro|
+        1.1.Quick start............................|syntastic-quickstart|
+        1.2.Recommended settings...................|syntastic-recommended|
+    2.Functionality provided.......................|syntastic-functionality|
+        2.1.The statusline flag....................|syntastic-statusline-flag|
+        2.2.Error signs............................|syntastic-error-signs|
+        2.3.Error window...........................|syntastic-error-window|
+        2.4.Error highlighting.....................|syntastic-highlighting|
+        2.5.Aggregating errors.....................|syntastic-aggregating-errors|
+        2.6.Filtering errors.......................|syntastic-filtering-errors|
+    3.Commands.....................................|syntastic-commands|
+    4.Global Options...............................|syntastic-global-options|
+    5.Checker Options..............................|syntastic-checker-options|
+        5.1.Choosing which checkers to use.........|syntastic-filetype-checkers|
+        5.2.Choosing the executable................|syntastic-config-exec|
+        5.3.Configuring specific checkers..........|syntastic-config-makeprg|
+        5.4.Sorting errors.........................|syntastic-config-sort|
+        5.5.Filtering errors.......................|syntastic-config-filtering|
+        5.6.Debugging..............................|syntastic-config-debug|
+        5.7.Profiling..............................|syntastic-profiling|
+    6.Notes........................................|syntastic-notes|
+        6.1.Handling of composite filetypes........|syntastic-composite|
+        6.2.Editing files over network.............|syntastic-netrw|
+        6.3.The 'shellslash' option................|syntastic-shellslash|
+        6.4.Saving Vim sessions....................|syntastic-sessions|
+        6.5.The location list callback.............|syntastic-loclist-callback|
+    7.Compatibility with other software............|syntastic-compatibility|
+        7.1.airline................................|syntastic-airline|
+        7.2.The csh and tcsh shells................|syntastic-csh|
+        7.3.EasyGrep...............................|syntastic-easygrep|
+        7.4.Eclim..................................|syntastic-eclim|
+        7.5.ferret.................................|syntastic-ferret|
+        7.6.The fish shell.........................|syntastic-fish|
+        7.7.The fizsh shell........................|syntastic-fizsh|
+        7.8.flagship...............................|syntastic-flagship|
+        7.9.powerline..............................|syntastic-powerline|
+        7.10.The PowerShell shell..................|syntastic-powershell|
+        7.11.python-mode...........................|syntastic-pymode|
+        7.12.vim-auto-save.........................|syntastic-vim-auto-save|
+        7.13.vim-go................................|syntastic-vim-go|
+        7.14.vim-virtualenv........................|syntastic-vim-virtualenv|
+        7.15.YouCompleteMe.........................|syntastic-ycm|
+        7.16.The zsh shell and MacVim..............|syntastic-zsh|
+    8.About........................................|syntastic-about|
+    9.License......................................|syntastic-license|
+
+
+==============================================================================
+1. Intro                                                     *syntastic-intro*
+
+Syntastic is a syntax checking plugin that runs files through external syntax
+linters. This can be done on demand, or automatically as files are saved
+and opened. If syntax errors are detected, the user is notified and is happy
+because they didn't have to compile their code or execute their script to find
+them.
+
+Syntastic comes in two parts: the syntax checker plugins, and the core. The
+syntax checker plugins are defined on a per-filetype basis where each one wraps
+up an external syntax checking program. The core script delegates off to these
+plugins and uses their output to provide the syntastic functionality.
+
+Take a look at the list of supported filetypes and checkers: |syntastic-checkers|.
+
+Note: This doc only deals with using syntastic. To learn how to write syntax
+checker integrations see the guide on the GitHub wiki:
+
+    https://github.com/vim-syntastic/syntastic/wiki/Syntax-Checker-Guide
+
+------------------------------------------------------------------------------
+1.1. Quick start                                        *syntastic-quickstart*
+
+Syntastic comes preconfigured with a default list of enabled checkers per
+|filetype|. This list is kept reasonably short to prevent slowing down Vim or
+trying to use conflicting checkers.
+
+You can see the list of checkers available for the current filetype with the
+`:SyntasticInfo` command.
+
+You probably want to override the configured list of checkers for the
+filetypes you use, and also change the arguments passed to specific linters
+to suit your needs. See |syntastic-checker-options| below for details.
+
+Use `:SyntasticCheck` to manually check right now. Use `:Errors` to open the
+|location-list| window, and `:lclose` to close it. You can clear the error
+list with `:SyntasticReset`, and you can use `:SyntasticToggleMode` to switch
+between active (checking on writing the buffer) and passive (manual) checking.
+
+You don't have to switch focus to the |location-list| window to jump to the
+different errors. Vim provides several built-in commands for this, for
+example `:lnext` and `:lprevious`. You may want to add shortcut mappings for
+these commands, or perhaps install a plugin such as Tim Pope's "unimpaired"
+(see https://github.com/tpope/vim-unimpaired) that provides such mappings.
+
+------------------------------------------------------------------------------
+1.2. Recommended settings                              *syntastic-recommended*
+
+Syntastic has numerous options that can be configured, and the defaults are
+not particularly well suitable for new users. It is recommended that you start
+by adding the following lines to your vimrc, and return to them later as
+needed: >
+    set statusline+=%#warningmsg#
+    set statusline+=%{SyntasticStatuslineFlag()}
+    set statusline+=%*
+
+    let g:syntastic_always_populate_loc_list = 1
+    let g:syntastic_auto_loc_list = 1
+    let g:syntastic_check_on_open = 1
+    let g:syntastic_check_on_wq = 0
+<
+==============================================================================
+2. Functionality provided                            *syntastic-functionality*
+
+Syntax checking can be done automatically or on demand (see
+|'syntastic_mode_map'| and `:SyntasticToggleMode` for configuring this).
+
+When syntax checking is done, the features below can be used to notify the
+user of errors. See |syntastic-global-options| for how to configure and
+activate/deactivate these features.
+
+    * A statusline flag
+    * Signs beside lines with errors
+    * The |location-list| can be populated with the errors for the associated
+      buffer
+    * Erroneous parts of lines can be highlighted (this functionality is only
+      provided by some checkers)
+    * Balloons (if the |+balloon_eval| feature is compiled in) can be used to
+      display error messages for erroneous lines when hovering the mouse over
+      them
+    * Error messages from multiple checkers can be aggregated in a single list
+
+------------------------------------------------------------------------------
+2.1. The statusline flag                           *syntastic-statusline-flag*
+
+To use the statusline flag, this must appear in your |'statusline'| setting >
+    %{SyntasticStatuslineFlag()}
+<
+Something like this could be more useful: >
+    set statusline+=%#warningmsg#
+    set statusline+=%{SyntasticStatuslineFlag()}
+    set statusline+=%*
+<
+When syntax errors are detected a flag will be shown. The content of the flag
+is derived from the |'syntastic_stl_format'| option.
+
+Please note that these settings might conflict with other Vim plugins that
+change the way 'statusline' works. Refer to the |syntastic-compatibility| notes
+below and to the respective plugins' documentation for possible solutions.
+
+In particular see |syntastic-airline| below if you're using the "airline" Vim
+plugin (https://github.com/vim-airline/vim-airline). See |syntastic-flagship|
+if you're using "flagship" (https://github.com/tpope/vim-flagship). See also
+|syntastic-powerline| if you're using the "powerline" Vim plugin
+(https://github.com/powerline/powerline).
+
+------------------------------------------------------------------------------
+2.2. Error signs                                       *syntastic-error-signs*
+
+Syntastic uses the `:sign` commands (provided that the |+signs| feature is
+compiled in) to mark lines with errors and warnings in the sign column. To
+enable this feature, use the |'syntastic_enable_signs'| option.
+
+Signs are colored using the Error and Todo syntax highlight groups by default
+(see |group-name|). If you wish to customize the colors for the signs, you
+can use the following groups:
+    SyntasticErrorSign - For syntax errors, links to "error" by default
+    SyntasticWarningSign - For syntax warnings, links to "todo" by default
+    SyntasticStyleErrorSign - For style errors, links to "SyntasticErrorSign"
+                              by default
+    SyntasticStyleWarningSign - For style warnings, links to
+                                "SyntasticWarningSign" by default
+
+Example: >
+    highlight SyntasticErrorSign guifg=white guibg=red
+<
+To set up highlighting for the line where a sign resides, you can use the
+following highlight groups:
+    SyntasticErrorLine
+    SyntasticWarningLine
+    SyntasticStyleErrorLine - Links to "SyntasticErrorLine" by default
+    SyntasticStyleWarningLine - Links to "SyntasticWarningLine" by default
+
+Example: >
+    highlight SyntasticErrorLine guibg=#2f0000
+<
+With Vim 8.0 or later you can ask Vim not to turn off the sign column when no
+errors are found, by setting 'signcolumn' to "yes": >
+    set signcolumn=yes
+<
+------------------------------------------------------------------------------
+2.3. The error window                                   *syntastic-error-window*
+
+You can use the `:Errors` command to display the errors for the current buffer
+in the |location-list|.
+
+By default syntastic doesn't fill the |location-list| with the errors found by
+the checkers, in order to reduce clashes with other plugins. Consequently, if
+you run `:lopen` or `:lwindow` rather than `:Errors` to open the error window
+you wouldn't see syntastic's list of errors. If you insist on using `:lopen`
+or `:lwindow` you should either run `:SyntasticSetLoclist` after running the
+checks, or set |'syntastic_always_populate_loc_list'| which tells syntastic to
+update the |location-list| automatically.
+
+------------------------------------------------------------------------------
+2.4. Error highlighting                               *syntastic-highlighting*
+
+Some linters provide enough information for syntastic to be able to highlight
+errors. By default the SpellBad syntax highlight group is used to color errors,
+and the SpellCap group is used for warnings. If you wish to customize the
+colors for highlighting you can use the following groups:
+    SyntasticError - Links to "SpellBad" by default (see |hl-SpellBad|)
+    SyntasticWarning - Links to "SpellCap" by default (see |hl-SpellCap|)
+    SyntasticStyleError - Links to "SyntasticError" by default
+    SyntasticStyleWarning - Links to "SyntasticWarning" by default
+
+Example: >
+    highlight SyntasticError guibg=#2f0000
+<
+------------------------------------------------------------------------------
+2.5. Aggregating errors                         *syntastic-aggregating-errors*
+
+By default, namely if |'syntastic_aggregate_errors'| is unset, syntastic runs
+in turn the checkers corresponding to the filetype of the current file (see
+|syntastic-filetype-checkers|), and stops as soon as a checker reports any
+errors. It then notifies you of the errors using the notification mechanisms
+above. In this mode error lists are always produced by a single checker, and,
+if you open the error window, the name of the checker that generated the errors
+is shown on the statusline of the error window.
+
+If |'syntastic_aggregate_errors'| is set, syntastic runs all checkers that
+apply (still cf. |syntastic-filetype-checkers|), then aggregates errors found
+by all checkers in a single list, and notifies you. In this mode each error
+message is labeled with the name of the checker that generated it, but you can
+disable generation of these labels by turning off |'syntastic_id_checkers'|.
+
+If |'syntastic_sort_aggregated_errors'| is set (which is the default), messages
+in the aggregated list are grouped by file, then sorted by line number, then
+type, then column number. Otherwise messages produced by the same checker are
+grouped together, and sorting within each group is decided by the variables
+|'syntastic_<filetype>_<checker>_sort'|.
+
+------------------------------------------------------------------------------
+2.6. Filtering errors                             *syntastic-filtering-errors*
+
+You can selectively disable some of the errors found by checkers either
+using |'syntastic_quiet_messages'|, or by specifying a list of patterns in
+|'syntastic_ignore_files'|.
+
+See also: |'syntastic_<filetype>_<checker>_quiet_messages'| and
+|'b:syntastic_skip_checks'|.
+
+==============================================================================
+3. Commands                                               *syntastic-commands*
+
+:Errors                                                              *:Errors*
+
+When errors have been detected, use this command to pop up the |location-list|
+and display the error messages.
+
+Please note that the `:Errors` command overwrites the current location list with
+syntastic's own location list.
+
+:SyntasticToggleMode                                    *:SyntasticToggleMode*
+
+Toggles syntastic between active and passive mode. See |'syntastic_mode_map'|
+for more info.
+
+:SyntasticCheck                                              *:SyntasticCheck*
+
+Manually cause a syntax check to be done. By default the checkers in the
+|'g:syntastic_<filetype>_checkers'| or |'b:syntastic_checkers'| lists are run,
+cf. |syntastic-filetype-checkers|. If |'syntastic_aggregate_errors'| is unset
+(which is the default), checking stops the first time a checker reports any
+errors; if |'syntastic_aggregate_errors'| is set, all checkers that apply are
+run in turn, and all errors found are aggregated in a single list.
+
+The command may be followed by a (space separated) list of checkers. In this
+case |'g:syntastic_<filetype>_checkers'| and |'b:syntastic_checkers'| are
+ignored, and the checkers named by the command's arguments are run instead, in
+the order specified. The set by |'syntastic_aggregate_errors'| still apply.
+
+Example: >
+    :SyntasticCheck flake8 pylint
+<
+You can also run checkers for filetypes different from the current filetype
+by qualifying their names with their respective filetypes, like this:
+"<filetype>/<checker>".
+
+Example: >
+    :SyntasticCheck lacheck text/language_check
+<
+:SyntasticInfo                                                *:SyntasticInfo*
+
+The command takes an optional argument, and outputs information about the
+checkers available for the filetype named by said argument, or for the current
+filetype if no argument was provided.
+
+Example: >
+    :SyntasticInfo python
+<
+:SyntasticReset                                              *:SyntasticReset*
+
+Resets the list of errors and turns off all error notifiers.
+
+:SyntasticSetLoclist                                    *:SyntasticSetLoclist*
+
+If |'syntastic_always_populate_loc_list'| is not set, the |location-list| is
+not filled in automatically with the list of errors detected by the checkers.
+This is useful if you run syntastic along with other plugins that use location
+lists. The `:SyntasticSetLoclist` command allows you to stick the errors into
+the location list explicitly.
+
+==============================================================================
+4. Global Options                                   *syntastic-global-options*
+
+                                                   *'syntastic_check_on_open'*
+Type: boolean
+Default: 0
+If this variable is enabled, syntastic in active mode will run syntax checks
+when buffers are first loaded, as well as on saving: >
+    let g:syntastic_check_on_open = 1
+<
+                                                     *'syntastic_check_on_wq'*
+Type: boolean
+Default: 1
+In active mode syntax checks are normally run whenever buffers are written to
+disk, even when the writes happen just before quitting Vim. If you want to
+skip checks when you issue `:wq`, `:x`, and `:ZZ`, set this variable to 0: >
+    let g:syntastic_check_on_wq = 0
+<
+                                                *'syntastic_aggregate_errors'*
+Type: boolean
+Default: 0
+When enabled, syntastic runs all checkers that apply to the current filetype,
+then aggregates errors found by all checkers and displays them. When disabled,
+syntastic runs each checker in turn, and stops to display the results the first
+time a checker finds any errors. >
+    let g:syntastic_aggregate_errors = 1
+<
+                                                     *'syntastic_id_checkers'*
+Type: boolean
+Default: 1
+When results from multiple checkers are aggregated in a single error list
+(that is either when |'syntastic_aggregate_errors'| is enabled, or when
+checking a file with a composite filetype, cf. |syntastic-composite|), it
+might not be immediately obvious which checker has produced a given error
+message. This variable instructs syntastic to label error messages with the
+names of the checkers that created them. >
+    let g:syntastic_id_checkers = 0
+<
+                                          *'syntastic_sort_aggregated_errors'*
+Type: boolean
+Default: 1
+By default, when results from multiple checkers are aggregated in a single
+error list (that is either when |'syntastic_aggregate_errors'| is enabled, or
+when checking a file with a composite filetype, cf. |syntastic-composite|),
+errors are grouped by file, then sorted by line number, then grouped by type
+(namely errors take precedence over warnings), then they are sorted by column
+number. If you want to leave messages grouped by checker output, set this
+variable to 0: >
+    let g:syntastic_sort_aggregated_errors = 0
+<
+                                              *'syntastic_echo_current_error'*
+Type: boolean
+Default: 1
+If enabled, syntastic will echo current error to the command window. If
+multiple errors are found on the same line, |'syntastic_cursor_columns'| is
+used to decide which one is shown. >
+    let g:syntastic_echo_current_error = 1
+<
+                                                  *'syntastic_cursor_columns'*
+Type: boolean
+Default: 1
+This option controls which errors are echoed to the command window if
+|'syntastic_echo_current_error'| is set and multiple errors are found on the
+same line. When the option is enabled, the first error corresponding to the
+current column is shown. Otherwise, the first error on the current line is
+echoed, regardless of the cursor position on the current line.
+
+When dealing with very large lists of errors, disabling this option can speed
+up navigation significantly: >
+    let g:syntastic_cursor_column = 0
+<
+                                                    *'syntastic_enable_signs'*
+Type: boolean
+Default: 1
+Use this option to tell syntastic whether to use the `:sign` interface to mark
+syntax errors: >
+    let g:syntastic_enable_signs = 1
+<
+                     *'syntastic_error_symbol'* *'syntastic_style_error_symbol'*
+                 *'syntastic_warning_symbol'* *'syntastic_style_warning_symbol'*
+Type: string
+Use these options to control what the syntastic `:sign` text contains. Several
+error symbols can be customized:
+    syntastic_error_symbol - For syntax errors, defaults to ">>"
+    syntastic_style_error_symbol - For style errors, defaults to "S>"
+    syntastic_warning_symbol - For syntax warnings, defaults to ">>"
+    syntastic_style_warning_symbol - For style warnings, defaults to "S>"
+
+Example: >
+    let g:syntastic_error_symbol = "\u2717"
+    let g:syntastic_warning_symbol = "\u26A0"
+<
+                                                 *'syntastic_enable_balloons'*
+Type: boolean
+Default: 1
+Use this option to tell syntastic whether to display error messages in balloons
+when the mouse is hovered over erroneous lines: >
+    let g:syntastic_enable_balloons = 1
+<
+Note that Vim must be compiled with |+balloon_eval|.
+
+                                             *'syntastic_enable_highlighting'*
+Type: boolean
+Default: 1
+Use this option to tell syntastic whether to use syntax highlighting to mark
+errors (where possible). Highlighting can be turned off with the following >
+    let g:syntastic_enable_highlighting = 0
+<
+                                        *'syntastic_always_populate_loc_list'*
+Type: boolean
+Default: 0
+By default syntastic doesn't fill the |location-list| with the errors found
+by the checkers, in order to reduce clashes with other plugins. Enable this
+option to tell syntastic to always stick any detected errors into the
+|location-list|: >
+    let g:syntastic_always_populate_loc_list = 1
+<
+Please note that if |'syntastic_auto_jump'| is set to a non-zero value the
+location list is overwritten with Syntastic's own list when taking a jump,
+regardless of the value of |'syntastic_always_populate_loc_list'|. The
+location list is also overwritten when running the `:Errors` command.
+
+                                                       *'syntastic_auto_jump'*
+Type: integer
+Default: 0
+Enable this option if you want the cursor to jump to the first detected issue
+when saving or opening a file.
+
+When set to 0 the cursor won't jump automatically. >
+    let g:syntastic_auto_jump = 0
+<
+When set to 1 the cursor will always jump to the first issue detected,
+regardless of type. >
+    let g:syntastic_auto_jump = 1
+<
+When set to 2 the cursor will jump to the first issue detected, but only if
+this issue is an error. >
+    let g:syntastic_auto_jump = 2
+<
+When set to 3 the cursor will jump to the first error detected, if any. If
+all issues detected are warnings, the cursor won't jump. >
+    let g:syntastic_auto_jump = 3
+<
+Please note that in either situation taking the jump also has the side effect
+of the location list being overwritten with Syntastic's own location list,
+regardless of the value of |'syntastic_always_populate_loc_list'|.
+
+                                                   *'syntastic_auto_loc_list'*
+Type: integer
+Default: 2
+Use this option to tell syntastic to automatically open and/or close the
+|location-list| (see |syntastic-error-window|).
+
+When set to 0 the error window will be neither opened nor closed
+automatically. >
+    let g:syntastic_auto_loc_list = 0
+<
+When set to 1 the error window will be automatically opened when errors are
+detected, and closed when none are detected. >
+    let g:syntastic_auto_loc_list = 1
+<
+When set to 2 the error window will be automatically closed when no errors are
+detected, but not opened automatically. >
+    let g:syntastic_auto_loc_list = 2
+<
+When set to 3 the error window will be automatically opened when errors are
+detected, but not closed automatically. >
+    let g:syntastic_auto_loc_list = 3
+<
+                                                 *'syntastic_loc_list_height'*
+Type: integer
+Default: 10
+Use this option to specify the height of the location lists that syntastic
+opens. >
+    let g:syntastic_loc_list_height = 5
+<
+                                                    *'syntastic_ignore_files'*
+Type: list of strings
+Default: []
+Use this option to specify files that syntastic should never check. It's a
+list of |regular-expression| patterns. The full paths of files (see |::p|) are
+matched against these patterns, and the matches are case-sensitive. Use |\c|
+to specify case-insensitive patterns. Example: >
+    let g:syntastic_ignore_files = ['\m^/usr/include/', '\m\c\.h$']
+<
+                                                    *'syntastic_filetype_map'*
+Type: dictionary
+Default: {}
+Use this option to map non-standard filetypes to standard ones.  Corresponding
+checkers are mapped accordingly, which allows syntastic to check files with
+non-standard filetypes: >
+    let g:syntastic_filetype_map = {
+        \ "plaintex": "tex",
+        \ "gentoo-metadata": "xml" }
+<
+Composite filetypes (cf. |syntastic-composite|) can also be mapped to simple
+types, which disables the default behaviour of running both checkers against
+the input file: >
+    let g:syntastic_filetype_map = { "handlebars.html": "handlebars" }
+<
+                                                        *'syntastic_mode_map'*
+Type: dictionary
+Default: { "mode": "active",
+           "active_filetypes": [],
+           "passive_filetypes": [] }
+Use this option to fine tune when automatic syntax checking is done (or not
+done).
+
+The option should be set to something like: >
+    let g:syntastic_mode_map = {
+        \ "mode": "active",
+        \ "active_filetypes": ["ruby", "php"],
+        \ "passive_filetypes": ["puppet"] }
+<
+"mode" can be mapped to one of two values - "active" or "passive". When set
+to "active", syntastic does automatic checking whenever a buffer is saved or
+initially opened. When set to "passive" syntastic only checks when the user
+calls `:SyntasticCheck`.
+
+The exceptions to these rules are defined with "active_filetypes" and
+"passive_filetypes". In passive mode, automatic checks are still done for
+filetypes in the "active_filetypes" array (and "passive_filetypes" is
+ignored). In active mode, automatic checks are not done for any filetypes in
+the "passive_filetypes" array ("active_filetypes" is ignored).
+
+If any of "mode", "active_filetypes", or "passive_filetypes" are left
+unspecified, they default to values above.
+
+If local variable |'b:syntastic_mode'| is defined its value takes precedence
+over all calculations involving |'syntastic_mode_map'| for the corresponding
+buffer.
+
+At runtime, the `:SyntasticToggleMode` command can be used to switch between
+active and passive modes.
+
+                                                          *'b:syntastic_mode'*
+Type: string
+Default: unset
+Only the local form |'b:syntastic_mode'| is used. When set to either "active"
+or "passive", it takes precedence over |'syntastic_mode_map'| when deciding
+whether the corresponding buffer should be checked automatically.
+
+                                                  *'syntastic_quiet_messages'*
+Type: dictionary
+Default: {}
+Use this option to filter out some of the messages produced by checkers. The
+option should be set to something like: >
+    let g:syntastic_quiet_messages = {
+        \ "!level":  "errors",
+        \ "type":    "style",
+        \ "regex":   '\m\[C03\d\d\]',
+        \ "file:p":  ['\m^/usr/include/', '\m\c\.h$'] }
+<
+Each element turns off messages matching the patterns specified by the
+corresponding value. Values are lists, but if a list consists of a single
+element you may omit the brackets (e.g. you may write "style" instead of
+["style"]). Elements with values [] or "" are ignored (this is useful for
+overriding filters, cf. |filter-overrides|).
+
+    "level" - takes one of two values, "warnings" or "errors"
+    "type"  - can be either "syntax" or "style"
+    "regex" - each item in list is matched against the messages' text as a
+              case-insensitive |regular-expression|
+    "file"  - each item in list is matched against the filenames the messages
+              refer to, as a case-sensitive |regular-expression|.
+
+If a key is prefixed by an exclamation mark "!", the corresponding filter is
+negated (i.e. the above example silences all messages that are NOT errors).
+
+The "file" key may be followed by one or more filename modifiers (see
+|filename-modifiers|). The modifiers are applied to the filenames the messages
+refer to before matching against the value (i.e. in the above example the full
+path of the issues are matched against '\m^/usr/include/' and '\m\c\.h$').
+
+If |'syntastic_id_checkers'| is set, filters are applied before error messages
+are labeled with the names of the checkers that created them.
+
+There are also checker-specific variants of this option, providing finer
+control. They are named |'syntastic_<filetype>_<checker>_quiet_messages'|.
+
+For a particular checker, if both a |'syntastic_quiet_messages'| filter and
+a checker-specific filter are present, they are both applied to the list of
+errors produced by the said checker. In case of conflicting values for the
+same keys, the values of the checker-specific filters take precedence.
+
+                                                            *filter-overrides*
+Since filter elements with values [] or "" are ignored, you can disable global
+filters for particular checkers, by setting the values of the corresponding
+elements in |'syntastic_<filetype>_<checker>_quiet_messages'| to [] or "". For
+example, the following setting will silence all warnings, except for the
+ones produced by "pylint": >
+    let g:syntastic_quiet_messages = { "level": "warnings" }
+    let g:syntastic_python_pylint_quiet_messages = { "level" : [] }
+<
+                                                      *'syntastic_stl_format'*
+Type: string
+Default: "[Syntax: line:%F (%t)]"
+Use this option to control what the syntastic statusline text contains. Several
+magic flags are available to insert information:
+    %e  - number of errors
+    %w  - number of warnings
+    %t  - total number of warnings and errors
+    %ne - filename of file containing first error
+    %nw - filename of file containing first warning
+    %N  - filename of file containing first warning or error
+    %pe - filename with path of file containing first error
+    %pw - filename with path of file containing first warning
+    %P  - filename with path of file containing first warning or error
+    %fe - line number of first error
+    %fw - line number of first warning
+    %F  - line number of first warning or error
+
+These flags accept width and alignment controls similar to the ones used by
+|'statusline'| flags:
+    %-0{minwid}.{maxwid}{flag}
+
+All fields except {flag} are optional. A single percent sign can be given as
+"%%".
+
+Several additional flags are available to hide text under certain conditions:
+    %E{...} - hide the text in the brackets unless there are errors
+    %W{...} - hide the text in the brackets unless there are warnings
+    %B{...} - hide the text in the brackets unless there are both warnings AND
+              errors
+These flags can't be nested.
+
+Example: >
+    let g:syntastic_stl_format = "[%E{Err: %fe #%e}%B{, }%W{Warn: %fw #%w}]"
+<
+If this format is used and the current buffer has 5 errors and 1 warning
+starting on lines 20 and 10 respectively then this would appear on the
+statusline: >
+    [Err: 20 #5, Warn: 10 #1]
+<
+If the buffer had 2 warnings, starting on line 5 then this would appear: >
+    [Warn: 5 #2]
+<
+                                                   *'b:syntastic_skip_checks'*
+Type: boolean
+Default: unset
+Only the local form |'b:syntastic_skip_checks'| is used. When set to a true
+value, no checks are run against the corresponding buffer. Example: >
+    let b:syntastic_skip_checks = 1
+<
+                                                    *'syntastic_full_redraws'*
+Type: boolean
+Default: 0 in GUI Vim and MacVim, 1 otherwise
+Controls whether syntastic calls `:redraw` or `:redraw!` for screen redraws.
+Changing it can in principle make screen redraws smoother, but it can also
+cause screen to flicker, or cause ghost characters. Leaving it to the default
+should be safe.
+
+                                                     *'syntastic_exit_checks'*
+Type: boolean
+Default: 0 when running under "cmd.exe" on Windows, 1 otherwise
+Syntastic attempts to catch abnormal termination conditions from linters by
+looking at their exit codes. The "cmd.exe" shell on Windows make these checks
+meaningless, by returning 1 to Vim when the linters exit with non-zero codes.
+The above variable can be used to disable exit code checks in syntastic.
+
+                                                           *'syntastic_shell'*
+Type: string
+Default: Vim's 'shell'
+This is the (full path to) the shell syntastic will use to run the linters.
+On UNIX and Mac OS-X this shell must accept Bourne-compatible syntax for
+file "stdout" and "stderr" redirections ">file" and "2>file". Examples of
+compatible shells are "zsh", "bash", "ksh", and of course the original Bourne
+"sh".
+
+This shell is independent of Vim's 'shell', and it isn't used for interactive
+operations. It must take care to initialize all environment variables needed
+by the linters you're using. Example: >
+    let g:syntastic_shell = "/bin/sh"
+<
+                                             *'syntastic_nested_autocommands'*
+Type: boolean
+Default: 0
+Controls whether syntastic's autocommands |BufReadPost| and |BufWritePost|
+are called from other |BufReadPost| and |BufWritePost| autocommands (see
+|autocmd-nested|). This is known to trigger interoperability problems with
+other plugins, so only enable it if you actually need that functionality.
+
+                                                           *'syntastic_debug'*
+Type: integer
+Default: 0
+Set this to the sum of one or more of the following flags to enable
+debugging:
+
+     1 - trace general workflow
+     2 - dump location lists
+     4 - trace notifiers
+     8 - trace autocommands
+    16 - dump options
+    32 - trace running of specific checkers
+
+Example: >
+    let g:syntastic_debug = 1
+<
+Syntastic will then add debugging messages to Vim's |message-history|. You can
+examine these messages with `:mes`.
+
+                                                      *'syntastic_debug_file'*
+Type: string
+Default: unset
+When set, debugging messages are written to the file named by its value, in
+addition to being added to Vim's |message-history|: >
+    let g:syntastic_debug_file = "~/syntastic.log"
+<
+                                                 *'syntastic_extra_filetypes'*
+Type: list of strings
+Default: []
+List of filetypes handled by checkers external to syntastic. If you have a Vim
+plugin that adds a checker for syntastic, and if the said checker deals with a
+filetype that is unknown to syntastic, you might consider adding that filetype
+to this list: >
+    let g:syntastic_extra_filetypes = [ "make", "gitcommit" ]
+<
+This will allow `:SyntasticInfo` to do proper tab completion for the new
+filetypes.
+
+==============================================================================
+5. Checker Options                                 *syntastic-checker-options*
+
+------------------------------------------------------------------------------
+5.1. Choosing which checkers to use              *syntastic-filetype-checkers*
+
+                                           *'g:syntastic_<filetype>_checkers'*
+You can tell syntastic which checkers to run for a given filetype by setting a
+variable 'g:syntastic_<filetype>_checkers' to a list of checkers, e.g. >
+    let g:syntastic_php_checkers = ["php", "phpcs", "phpmd"]
+<
+                                                      *'b:syntastic_checkers'*
+There is also a per-buffer version of this setting, |'b:syntastic_checkers'|.
+When set, it takes precedence over |'g:syntastic_<filetype>_checkers'|. You can
+use this in an autocmd to configure specific checkers for particular paths: >
+    autocmd FileType python if stridx(expand("%:p"), "/some/path/") == 0 |
+        \ let b:syntastic_checkers = ["pylint"] | endif
+<
+If neither |'g:syntastic_<filetype>_checkers'| nor |'b:syntastic_checkers'|
+is set a default list of checkers is used. Beware however that this list is
+deliberately kept minimal, for performance reasons.
+
+You can specify checkers for other filetypes anywhere in these lists, by
+qualifying their names with their respective filetypes: >
+    let g:syntastic_tex_checkers = ["lacheck", "text/language_check"]
+<
+Take a look elsewhere in this manual to find out what checkers and filetypes
+are supported by syntastic: |syntastic-checkers|.
+
+Use `:SyntasticInfo` to see which checkers are available for a given filetype.
+
+------------------------------------------------------------------------------
+5.2. Choosing the executable                           *syntastic-config-exec*
+
+                                       *'syntastic_<filetype>_<checker>_exec'*
+The executable run by a checker is normally defined automatically, when the
+checker is registered. You can however override it, by setting the variable
+'g:syntastic_<filetype>_<checker>_exec': >
+    let g:syntastic_ruby_mri_exec = "~/bin/ruby2"
+<
+This variable has a local version, 'b:syntastic_<filetype>_<checker>_exec',
+which takes precedence over the global one in the corresponding buffer.
+
+                                                *'b:syntastic_<checker>_exec'*
+There is also a local variable named 'b:syntastic_<checker>_exec', which
+takes precedence over both 'b:syntastic_<filetype>_<checker>_exec' and
+'g:syntastic_<filetype>_<checker>_exec' in the buffers where it is defined.
+
+------------------------------------------------------------------------------
+5.3. Configuring specific checkers                  *syntastic-config-makeprg*
+
+Linters are run by constructing a command line and by passing it to a shell
+(see |'shell'| and |'syntastic_shell'|). In most cases this command line is
+built using an internal function named "makeprgBuild()", which provides a
+number of options that allow you to customise every part of the command that
+gets called.
+
+                                   *'syntastic_<filetype>_<checker>_<option>'*
+Checkers that use "makeprgBuild()" construct the corresponding command line
+like this: >
+    let makeprg = self.makeprgBuild({
+                \ "exe": self.getExec(),
+                \ "args": "-a -b -c",
+                \ "fname": shellescape(expand("%", 1)),
+                \ "post_args": "--more --args",
+                \ "tail": "2>/dev/null" })
+<
+The result is a command line of the form: >
+    <exe> <args> <fname> <post_args> <tail>
+<
+All fields above are optional, and can be overridden by setting global
+variables 'g:syntastic_<filetype>_<checker-name>_<option-name>' - even
+parameters not specified in the call to "makeprgBuild()". For example to
+override the arguments and the tail: >
+    let g:syntastic_c_pc_lint_args = "-w5 -Iz:/usr/include/linux"
+    let g:syntastic_c_pc_lint_tail = "2>/dev/null"
+<
+These variables also have buffer-local versions named
+'b:syntastic_<filetype>_<checker-name>_<option-name>', which takes precedence
+over the global ones in the corresponding buffers.
+
+You can see the final outcome of setting these variables in the debug logs
+(cf. |syntastic-config-debug|).
+
+Special characters need to be escaped, so that they can survive shell
+expansions. Vim function |shellescape()| can help you with escaping: >
+    let g:syntastic_c_cppcheck_args =
+        \ "-DBUILD_BASENAME=my-module " . shellescape("-DBUILD_STR(s)=#s")
+<
+Alternatively, you can tell syntastic to escape special characters by turning
+the value into a list: >
+    let g:syntastic_c_cppcheck_args =
+        \ ["-DBUILD_BASENAME=my-module", "-DBUILD_STR(s)=#s"]
+<
+Each element of this list is then escaped as needed, and turned into a
+separate argument for the shell.
+
+                                                      *syntastic-config-empty*
+If one of the above variables has a non-empty default and you want it to be
+empty, you can set it to an empty string, e.g.: >
+    let g:syntastic_javascript_jslint_args = ""
+<
+                                        *'syntastic_<filetype>_<checker>_exe'*
+The 'exe' option is special. Normally it is the same as the 'exec' attribute
+described above, but you can use it to add environment variables to the
+command line, or to change the way the linter is run. For example this setup
+allows you to run PC-Lint on Linux, under Wine emulation: >
+    let  g:syntastic_c_pc_lint_exec = "wine"
+    let  g:syntastic_c_pc_lint_exe = "wine c:/path/to/lint-nt.exe"
+<
+                                      *'syntastic_<filetype>_<checker>_fname'*
+
+The 'fname' option is also special. Normally it is automatically set by
+syntastic to the name of the current file, but you can change that as needed.
+For example you can tell the SML/NJ compiler to use Compilation Manager by
+omitting the filename from the command line: >
+    let g:syntastic_sml_smlnj_fname = ""
+<
+                                            *syntastic-config-no-makeprgbuild*
+For checkers that do not use the "makeprgBuild()" function any specific
+options that can be set should be documented in this manual (see
+|syntastic-checkers|).
+
+------------------------------------------------------------------------------
+5.4. Sorting errors                                    *syntastic-config-sort*
+
+                                       *'syntastic_<filetype>_<checker>_sort'*
+Syntastic may decide to group the errors produced by some checkers by file,
+then sort them by line number, then by type, then by column number. If you'd
+prefer to see the errors in the order in which they are output by the external
+checker you can set the variable |'g:syntastic_<filetype>_<checker>_sort'| to 0.
+
+Alternatively, if syntastic doesn't reorder the errors produced by a checker
+but you'd like it to sort them, you can set the same variable to 1.
+
+There is also a local version |'b:syntastic_<filetype>_<checker>_sort'| of
+this variable, that takes precedence over it in the buffers where it is
+defined.
+
+For aggregated lists (see |syntastic-aggregating-errors|) these variables are
+ignored if |'syntastic_sort_aggregated_errors'| is set (which is the default).
+
+------------------------------------------------------------------------------
+5.5. Filtering errors                             *syntastic-config-filtering*
+
+                             *'syntastic_<filetype>_<checker>_quiet_messages'*
+Finally, variables 'g:syntastic_<filetype>_<checker-name>_quiet_messages' can
+be used to filter out some of the messages produced by specific checkers. The
+effect is identical to that of |syntastic_quiet_messages|, except only messages
+from the corresponding checkers are filtered. Example: >
+    let g:syntastic_python_pylama_quiet_messages = {
+        \ "type":  "style",
+        \ "regex": '\m\[C03\d\d\]' }
+<
+The syntax is of course identical to that of |syntastic_quiet_messages|.
+
+------------------------------------------------------------------------------
+5.6. Debugging                                        *syntastic-config-debug*
+                                                             *syntastic-debug*
+
+Syntastic can log a trace of its working to Vim's |message-history|. To verify
+the command line constructed by syntastic to run a linter, set the variable
+|'syntastic_debug'| to a non-zero value, run the checker, then run `:mes` to
+display the messages, and look for "makeprg" in the output.
+
+From a user's perspective, the useful values for |'syntastic_debug'| are 1, 3,
+and 33:
+
+     1 - logs syntastic's workflow
+     3 - logs workflow, linter's output, and |location-list| manipulations
+    33 - logs workflow and checker-specific details (such as version checks).
+
+Debug logs can be saved to a file; see |'syntastic_debug_file'| for details.
+
+Setting |'syntastic_debug'| to 0 turns off logging.
+
+------------------------------------------------------------------------------
+5.7. Profiling                                           *syntastic-profiling*
+
+A very useful tool for debugging performance problems is Vim's built-in
+|profiler|. In order to enable profiling for syntastic you need to add two lines
+to your vimrc (not to gvimrc): >
+    profile start syntastic.log
+    profile! file */syntastic/*
+<
+(assuming your copy of syntastic lives in a directory creatively named
+"syntastic"). These lines must be executed before syntastic is loaded, so you
+need to put them before package managers such as "pathogen" or "Vundle", and
+(in newer Vim versions) before any commands related to |packages|.
+
+A log file is created in the current directory, and is updated when you quit
+Vim.
+
+==============================================================================
+6. Notes                                                     *syntastic-notes*
+
+------------------------------------------------------------------------------
+6.1. Handling of composite filetypes                     *syntastic-composite*
+
+Some Vim plugins use composite filetypes, such as "django.python" or
+"handlebars.html". Normally syntastic deals with this situation by splitting
+the filetype in its simple components, and calling all checkers that apply.
+If this behaviour is not desirable, you can disable it by mapping the
+composite filetypes to simple ones using |'syntastic_filetype_map'|, e.g.: >
+    let g:syntastic_filetype_map = { "handlebars.html": "handlebars" }
+<
+------------------------------------------------------------------------------
+6.2. Editing files over network                              *syntastic-netrw*
+
+The standard plugin |netrw| allows Vim to transparently edit files over
+network and inside archives. Currently syntastic doesn't support this mode
+of operation. It can only check files that can be accessed directly by local
+linters, without any translation or conversion.
+
+------------------------------------------------------------------------------
+6.3. The 'shellslash' option                            *syntastic-shellslash*
+
+The 'shellslash' option is relevant only on Windows systems. This option
+determines (among other things) the rules for quoting command lines, and there
+is no easy way for syntastic to make sure its state is appropriate for your
+shell. It should be turned off if your 'shell' (or |'syntastic_shell'|) is
+"cmd.exe", and on for shells that expect an UNIX-like syntax, such as Cygwin's
+"sh". Most checkers will stop working if 'shellslash' is set to the wrong
+value.
+
+------------------------------------------------------------------------------
+6.4. Saving Vim sessions                                  *syntastic-sessions*
+
+If you use `:mksession` to save Vim sessions you should probably make sure to
+remove option "blank" from 'sessionoptions': >
+    set sessionoptions-=blank
+<
+This will prevent `:mksession` from saving |syntastic-error-window| as empty
+quickfix windows.
+
+------------------------------------------------------------------------------
+6.5. The location list callback                   *syntastic-loclist-callback*
+
+                                                        *SyntasticCheckHook()*
+Syntastic also gives you direct access to the list of errors.  A function
+named |SyntasticCheckHook()| is called by syntastic (if it exists) right
+before populating the |location-list| and enabling the notifiers. The function
+takes exactly one argument, the list of errors in |location-list| format (see
+|getqflist()| for details). format. You can do essentially anything with this
+list, as long as you don't change its format, and you don't add or remove
+elements.
+
+For example the following function will make the error window smaller if fewer
+than 10 errors are found: >
+    function! SyntasticCheckHook(errors)
+        if !empty(a:errors)
+            let g:syntastic_loc_list_height = min([len(a:errors), 10])
+        endif
+    endfunction
+<
+(Please keep in mind however that Vim options |winheight| and |winminheight|
+also affect window sizes.)
+
+==============================================================================
+7. Compatibility with other software                 *syntastic-compatibility*
+
+------------------------------------------------------------------------------
+7.1. airline                                               *syntastic-airline*
+
+The "airline" Vim plugin (https://github.com/vim-airline/vim-airline) comes
+with an extension for showing syntastic-related flags on the |'statusline'|.
+
+"airline" versions v0.8 and earlier use |'syntastic_stl_format'| to format the
+|'statusline'| flags. Newer versions ignore |'syntastic_stl_format'|, and require
+you to set variables 'airline#extensions#syntastic#stl_format_err' and
+'airline#extensions#syntastic#stl_format_warn' separately for errors and
+warnings (with the same syntax as |'syntastic_stl_format'|) if you want to
+change the flags from the defaults.
+
+When using "airline" you should NOT follow the recommendation outlined in
+the |syntastic-statusline-flag| section above to modify your |'statusline'|.
+"airline" shall make all necessary changes automatically.
+
+------------------------------------------------------------------------------
+7.2. The csh and tcsh shells                                   *syntastic-csh*
+
+The "csh" and "tcsh" shells are mostly compatible with syntastic. However,
+some checkers assume Bourne shell syntax for redirecting "stderr". For this
+reason, you should point |'syntastic_shell'| to a Bourne-compatible shell,
+such as "zsh", "bash", "ksh", or even the original Bourne "sh": >
+    let g:syntastic_shell = "/bin/sh"
+<
+------------------------------------------------------------------------------
+7.3. EasyGrep                                             *syntastic-easygrep*
+
+The "EasyGrep" Vim plugin (https://github.com/dkprice/vim-easygrep) can use
+either |quickfix| lists, or location lists (see |location-list|). Syntastic can
+be run along with "EasyGrep" provided that the latter is configured to use
+|quickfix| lists (which is the default at the time of this writing): >
+    let g:EasyGrepWindow = 0
+<
+------------------------------------------------------------------------------
+7.4. Eclim                                                   *syntastic-eclim*
+
+Syntastic can be used together with "Eclim" (see http://eclim.org/). However,
+by default Eclim disables syntastic's checks for the filetypes it supports, in
+order to run its own validation. If you'd prefer to use Eclim but still run
+syntastic's checks, set |g:EclimFileTypeValidate| to 0: >
+    let g:EclimFileTypeValidate = 0
+<
+It is also possible to re-enable syntastic checks only for some filetypes, and
+run Eclim's validation for others. Please consult Eclim's documentation for
+details.
+
+------------------------------------------------------------------------------
+7.5. ferret                                                 *syntastic-ferret*
+
+At the time of this writing syntastic conflicts with the "ferret" Vim plugin
+(https://github.com/wincent/ferret). The "ferret" plugin assumes control over
+loclist windows even when configured to use |quickfix| lists. This interferes
+with syntastic's functioning.
+
+------------------------------------------------------------------------------
+7.6. The fish shell                                           *syntastic-fish*
+
+At the time of this writing the "fish" shell (see http://fishshell.com/)
+doesn't support the standard UNIX syntax for file redirections, and thus it
+can't be used together with syntastic. You can however set |'syntastic_shell'|
+to a more traditional shell, such as "zsh", "bash", "ksh", or even the
+original Bourne "sh": >
+    let g:syntastic_shell = "/bin/sh"
+<
+------------------------------------------------------------------------------
+7.7. The fizsh shell                                         *syntastic-fizsh*
+
+Using syntastic with the "fizsh" shell (see https://github.com/zsh-users/fizsh)
+is possible, but potentially problematic. In order to do it you'll need to set
+'shellredir' like this: >
+    set shellredir=>%s\ 2>&1
+<
+Please keep in mind however that Vim can't take advantage of any of the
+interactive features of "fizsh". Using a more traditional shell such as "zsh",
+"bash", "ksh", or the original Bourne "sh" might be a better choice: >
+    let g:syntastic_shell = "/bin/sh"
+<
+------------------------------------------------------------------------------
+7.8. flagship                                             *syntastic-flagship*
+
+The "flagship" Vim plugin (https://github.com/tpope/vim-flagship) has its
+own mechanism of showing flags on the |'statusline'|. To allow "flagship"
+to manage syntastic's statusline flag add the following |autocommand| to
+your vimrc, rather than explicitly adding the flag to your |'statusline'| as
+described in the |syntastic-statusline-flag| section above: >
+    autocmd User Flags call Hoist("window", "SyntasticStatuslineFlag")
+<
+------------------------------------------------------------------------------
+7.9. powerline                                           *syntastic-powerline*
+
+The "powerline" Vim plugin (https://github.com/powerline/powerline) comes
+packaged with a syntastic segment. To customize this segment create a file
+"~/.config/powerline/themes/vim/default.json", with a content like this: >
+    {
+        "segment_data" : {
+            "powerline.segments.vim.plugin.syntastic.syntastic" : {
+                "args" : {
+                    "err_format" : "Err: {first_line} #{num} ",
+                    "warn_format" : "Warn: {first_line} #{num} "
+                }
+            }
+        }
+    }
+<
+------------------------------------------------------------------------------
+7.10. The PowerShell shell                              *syntastic-powershell*
+
+At the time of this writing syntastic is not compatible with using
+"PowerShell" (https://msdn.microsoft.com/en-us/powershell) as Vim's 'shell'.
+You may still run Vim from "PowerShell", but you do have to point Vim's
+'shell' to a more traditional program, such as "cmd.exe" on Windows, or
+"/bin/sh" on UNIX: >
+    set shell=c:\Windows\system32\cmd.exe
+    set shell=/bin/sh
+<
+------------------------------------------------------------------------------
+7.11. python-mode                                           *syntastic-pymode*
+
+Syntastic can be used along with the "python-mode" Vim plugin (see
+https://github.com/klen/python-mode). However, they both run syntax checks by
+default when you save buffers to disk, and this is probably not what you want.
+To avoid both plugins opening error windows, you can either set passive mode
+for python in syntastic (see |'syntastic_mode_map'|), or disable lint checks in
+"python-mode", by setting |pymode_lint_on_write| to 0. E.g.: >
+    let g:pymode_lint_on_write = 0
+<
+------------------------------------------------------------------------------
+7.12. vim-auto-save                                  *syntastic-vim-auto-save*
+
+Syntastic can be used together with the "vim-auto-save" Vim plugin (see
+https://github.com/907th/vim-auto-save). However, syntastic checks in active
+mode only work with "vim-auto-save" version 0.1.7 or later.
+
+------------------------------------------------------------------------------
+7.13. vim-go                                                *syntastic-vim-go*
+
+Syntastic can be used along with the "vim-go" Vim plugin (see
+https://github.com/fatih/vim-go). However, both "vim-go" and syntastic run
+syntax checks by default when you save buffers to disk. To avoid conflicts,
+you have to either set passive mode in syntastic for the "go" filetype (see
+|syntastic_mode_map|), or prevent "vim-go" from showing a quickfix window when
+|g:go_fmt_command| fails, by setting |g:go_fmt_fail_silently| to 1. E.g.: >
+    let g:go_fmt_fail_silently = 1
+<
+"vim-go" version 1.4 and earlier always uses |quickfix| lists. Starting with
+version 1.5, "vim-go" can also use location lists (see |location-list|). To
+avoid conflicts with syntastic, you probably want to configure "vim-go" to
+stick with |quickfix| lists: >
+    let g:go_list_type = "quickfix"
+<
+------------------------------------------------------------------------------
+7.14. vim-virtualenv                                *syntastic-vim-virtualenv*
+
+At the time of this writing, syntastic can't run linters installed
+in Python virtual environments activated by "vim-virtualenv" (see
+https://github.com/jmcantrell/vim-virtualenv). This is a limitation of
+"vim-virtualenv".
+
+------------------------------------------------------------------------------
+7.15. YouCompleteMe                                            *syntastic-ycm*
+
+Syntastic can be used together with the "YouCompleteMe" Vim plugin (see
+https://github.com/ycm-core/YouCompleteMe). However, by default "YouCompleteMe"
+disables syntastic's checkers for the "c", "cpp", "objc", and "objcpp"
+filetypes, in order to allow its own checkers to run. If you want to use YCM's
+identifier completer but still run syntastic's checkers for those filetypes you
+have to set |g:ycm_show_diagnostics_ui| to 0. E.g.: >
+    let g:ycm_show_diagnostics_ui = 0
+<
+------------------------------------------------------------------------------
+7.16. The zsh shell and MacVim                                 *syntastic-zsh*
+
+If you're running MacVim together with the "zsh" shell (http://www.zsh.org/)
+you need to be aware that MacVim does not source your .zshrc file, but will
+source a .zshenv file. Consequently you have to move any setup steps relevant
+to the linters you're using from .zshrc to .zshenv, otherwise your linters
+will misbehave when run by syntastic. This is particularly important for
+programs such as "rvm" (https://rvm.io/) or "rbenv" (http://rbenv.org/), that
+rely on setting environment variables.
+
+==============================================================================
+8. About                                                     *syntastic-about*
+
+The core maintainers of syntastic are:
+    Martin Grenfell (GitHub: scrooloose)
+    Gregor Uhlenheuer (GitHub: kongo2002)
+    LCD 047 (GitHub: lcd047)
+
+Find the latest version of syntastic at:
+
+    http://github.com/vim-syntastic/syntastic
+
+==============================================================================
+9. License                                                 *syntastic-license*
+
+Syntastic is released under the WTFPL.
+See http://sam.zoy.org/wtfpl/COPYING.
+
+ vim:tw=78:sw=4:ft=help:norl:

+ 650 - 0
vim/plugged/syntastic/doc/tags

@@ -0,0 +1,650 @@
+'b:syntastic_<checker>_exec'	syntastic.txt	/*'b:syntastic_<checker>_exec'*
+'b:syntastic_ada_cflags'	syntastic-checkers.txt	/*'b:syntastic_ada_cflags'*
+'b:syntastic_asm_cflags'	syntastic-checkers.txt	/*'b:syntastic_asm_cflags'*
+'b:syntastic_c_cflags'	syntastic-checkers.txt	/*'b:syntastic_c_cflags'*
+'b:syntastic_checkers'	syntastic.txt	/*'b:syntastic_checkers'*
+'b:syntastic_cobol_cflags'	syntastic-checkers.txt	/*'b:syntastic_cobol_cflags'*
+'b:syntastic_cpp_cflags'	syntastic-checkers.txt	/*'b:syntastic_cpp_cflags'*
+'b:syntastic_d_cflags'	syntastic-checkers.txt	/*'b:syntastic_d_cflags'*
+'b:syntastic_fortran_cflags'	syntastic-checkers.txt	/*'b:syntastic_fortran_cflags'*
+'b:syntastic_mode'	syntastic.txt	/*'b:syntastic_mode'*
+'b:syntastic_objc_cflags'	syntastic-checkers.txt	/*'b:syntastic_objc_cflags'*
+'b:syntastic_objcpp_cflags'	syntastic-checkers.txt	/*'b:syntastic_objcpp_cflags'*
+'b:syntastic_skip_checks'	syntastic.txt	/*'b:syntastic_skip_checks'*
+'b:syntastic_verilog_cflags'	syntastic-checkers.txt	/*'b:syntastic_verilog_cflags'*
+'b:vaxe_hxml'	syntastic-checkers.txt	/*'b:vaxe_hxml'*
+'g:syntastic_<filetype>_checkers'	syntastic.txt	/*'g:syntastic_<filetype>_checkers'*
+'g:syntastic_ada_check_header'	syntastic-checkers.txt	/*'g:syntastic_ada_check_header'*
+'g:syntastic_ada_compiler'	syntastic-checkers.txt	/*'g:syntastic_ada_compiler'*
+'g:syntastic_ada_compiler_options'	syntastic-checkers.txt	/*'g:syntastic_ada_compiler_options'*
+'g:syntastic_ada_config_file'	syntastic-checkers.txt	/*'g:syntastic_ada_config_file'*
+'g:syntastic_ada_errorformat'	syntastic-checkers.txt	/*'g:syntastic_ada_errorformat'*
+'g:syntastic_ada_include_dirs'	syntastic-checkers.txt	/*'g:syntastic_ada_include_dirs'*
+'g:syntastic_ada_remove_include_errors'	syntastic-checkers.txt	/*'g:syntastic_ada_remove_include_errors'*
+'g:syntastic_asm_compiler'	syntastic-checkers.txt	/*'g:syntastic_asm_compiler'*
+'g:syntastic_asm_compiler_options'	syntastic-checkers.txt	/*'g:syntastic_asm_compiler_options'*
+'g:syntastic_asm_config_file'	syntastic-checkers.txt	/*'g:syntastic_asm_config_file'*
+'g:syntastic_asm_dialect'	syntastic-checkers.txt	/*'g:syntastic_asm_dialect'*
+'g:syntastic_asm_errorformat'	syntastic-checkers.txt	/*'g:syntastic_asm_errorformat'*
+'g:syntastic_asm_include_dirs'	syntastic-checkers.txt	/*'g:syntastic_asm_include_dirs'*
+'g:syntastic_asm_remove_include_errors'	syntastic-checkers.txt	/*'g:syntastic_asm_remove_include_errors'*
+'g:syntastic_avrgcc_config_file'	syntastic-checkers.txt	/*'g:syntastic_avrgcc_config_file'*
+'g:syntastic_c_auto_refresh_includes'	syntastic-checkers.txt	/*'g:syntastic_c_auto_refresh_includes'*
+'g:syntastic_c_check_header'	syntastic-checkers.txt	/*'g:syntastic_c_check_header'*
+'g:syntastic_c_compiler'	syntastic-checkers.txt	/*'g:syntastic_c_compiler'*
+'g:syntastic_c_compiler_options'	syntastic-checkers.txt	/*'g:syntastic_c_compiler_options'*
+'g:syntastic_c_config_file'	syntastic-checkers.txt	/*'g:syntastic_c_config_file'*
+'g:syntastic_c_errorformat'	syntastic-checkers.txt	/*'g:syntastic_c_errorformat'*
+'g:syntastic_c_flawfinder_thres'	syntastic-checkers.txt	/*'g:syntastic_c_flawfinder_thres'*
+'g:syntastic_c_include_dirs'	syntastic-checkers.txt	/*'g:syntastic_c_include_dirs'*
+'g:syntastic_c_no_default_include_dirs'	syntastic-checkers.txt	/*'g:syntastic_c_no_default_include_dirs'*
+'g:syntastic_c_no_include_search'	syntastic-checkers.txt	/*'g:syntastic_c_no_include_search'*
+'g:syntastic_c_remove_include_errors'	syntastic-checkers.txt	/*'g:syntastic_c_remove_include_errors'*
+'g:syntastic_clang_check_config_file'	syntastic-checkers.txt	/*'g:syntastic_clang_check_config_file'*
+'g:syntastic_clang_tidy_config_file'	syntastic-checkers.txt	/*'g:syntastic_clang_tidy_config_file'*
+'g:syntastic_cobol_compiler'	syntastic-checkers.txt	/*'g:syntastic_cobol_compiler'*
+'g:syntastic_cobol_compiler_options'	syntastic-checkers.txt	/*'g:syntastic_cobol_compiler_options'*
+'g:syntastic_cobol_config_file'	syntastic-checkers.txt	/*'g:syntastic_cobol_config_file'*
+'g:syntastic_cobol_errorformat'	syntastic-checkers.txt	/*'g:syntastic_cobol_errorformat'*
+'g:syntastic_cobol_include_dirs'	syntastic-checkers.txt	/*'g:syntastic_cobol_include_dirs'*
+'g:syntastic_cobol_remove_include_errors'	syntastic-checkers.txt	/*'g:syntastic_cobol_remove_include_errors'*
+'g:syntastic_cpp_auto_refresh_includes'	syntastic-checkers.txt	/*'g:syntastic_cpp_auto_refresh_includes'*
+'g:syntastic_cpp_check_header'	syntastic-checkers.txt	/*'g:syntastic_cpp_check_header'*
+'g:syntastic_cpp_compiler'	syntastic-checkers.txt	/*'g:syntastic_cpp_compiler'*
+'g:syntastic_cpp_compiler_options'	syntastic-checkers.txt	/*'g:syntastic_cpp_compiler_options'*
+'g:syntastic_cpp_config_file'	syntastic-checkers.txt	/*'g:syntastic_cpp_config_file'*
+'g:syntastic_cpp_cpplint_args'	syntastic-checkers.txt	/*'g:syntastic_cpp_cpplint_args'*
+'g:syntastic_cpp_cpplint_thres'	syntastic-checkers.txt	/*'g:syntastic_cpp_cpplint_thres'*
+'g:syntastic_cpp_errorformat'	syntastic-checkers.txt	/*'g:syntastic_cpp_errorformat'*
+'g:syntastic_cpp_flawfinder_thres'	syntastic-checkers.txt	/*'g:syntastic_cpp_flawfinder_thres'*
+'g:syntastic_cpp_include_dirs'	syntastic-checkers.txt	/*'g:syntastic_cpp_include_dirs'*
+'g:syntastic_cpp_no_default_include_dirs'	syntastic-checkers.txt	/*'g:syntastic_cpp_no_default_include_dirs'*
+'g:syntastic_cpp_no_include_search'	syntastic-checkers.txt	/*'g:syntastic_cpp_no_include_search'*
+'g:syntastic_cpp_remove_include_errors'	syntastic-checkers.txt	/*'g:syntastic_cpp_remove_include_errors'*
+'g:syntastic_cppcheck_config_file'	syntastic-checkers.txt	/*'g:syntastic_cppcheck_config_file'*
+'g:syntastic_cuda_check_header'	syntastic-checkers.txt	/*'g:syntastic_cuda_check_header'*
+'g:syntastic_cuda_config_file'	syntastic-checkers.txt	/*'g:syntastic_cuda_config_file'*
+'g:syntastic_d_check_header'	syntastic-checkers.txt	/*'g:syntastic_d_check_header'*
+'g:syntastic_d_compiler'	syntastic-checkers.txt	/*'g:syntastic_d_compiler'*
+'g:syntastic_d_compiler_options'	syntastic-checkers.txt	/*'g:syntastic_d_compiler_options'*
+'g:syntastic_d_config_file'	syntastic-checkers.txt	/*'g:syntastic_d_config_file'*
+'g:syntastic_d_dub_exec'	syntastic-checkers.txt	/*'g:syntastic_d_dub_exec'*
+'g:syntastic_d_errorformat'	syntastic-checkers.txt	/*'g:syntastic_d_errorformat'*
+'g:syntastic_d_include_dirs'	syntastic-checkers.txt	/*'g:syntastic_d_include_dirs'*
+'g:syntastic_d_remove_include_errors'	syntastic-checkers.txt	/*'g:syntastic_d_remove_include_errors'*
+'g:syntastic_d_use_dub'	syntastic-checkers.txt	/*'g:syntastic_d_use_dub'*
+'g:syntastic_fortran_compiler'	syntastic-checkers.txt	/*'g:syntastic_fortran_compiler'*
+'g:syntastic_fortran_compiler_options'	syntastic-checkers.txt	/*'g:syntastic_fortran_compiler_options'*
+'g:syntastic_fortran_config_file'	syntastic-checkers.txt	/*'g:syntastic_fortran_config_file'*
+'g:syntastic_fortran_errorformat'	syntastic-checkers.txt	/*'g:syntastic_fortran_errorformat'*
+'g:syntastic_fortran_include_dirs'	syntastic-checkers.txt	/*'g:syntastic_fortran_include_dirs'*
+'g:syntastic_fortran_remove_include_errors'	syntastic-checkers.txt	/*'g:syntastic_fortran_remove_include_errors'*
+'g:syntastic_glsl_extensions'	syntastic-checkers.txt	/*'g:syntastic_glsl_extensions'*
+'g:syntastic_glsl_options'	syntastic-checkers.txt	/*'g:syntastic_glsl_options'*
+'g:syntastic_go_go_build_args'	syntastic-checkers.txt	/*'g:syntastic_go_go_build_args'*
+'g:syntastic_go_go_test_args'	syntastic-checkers.txt	/*'g:syntastic_go_go_test_args'*
+'g:syntastic_html_tidy_blocklevel_tags'	syntastic-checkers.txt	/*'g:syntastic_html_tidy_blocklevel_tags'*
+'g:syntastic_html_tidy_empty_tags'	syntastic-checkers.txt	/*'g:syntastic_html_tidy_empty_tags'*
+'g:syntastic_html_tidy_ignore_errors'	syntastic-checkers.txt	/*'g:syntastic_html_tidy_ignore_errors'*
+'g:syntastic_html_tidy_inline_tags'	syntastic-checkers.txt	/*'g:syntastic_html_tidy_inline_tags'*
+'g:syntastic_html_validator_api'	syntastic-checkers.txt	/*'g:syntastic_html_validator_api'*
+'g:syntastic_html_validator_exec'	syntastic-checkers.txt	/*'g:syntastic_html_validator_exec'*
+'g:syntastic_html_validator_nsfilter'	syntastic-checkers.txt	/*'g:syntastic_html_validator_nsfilter'*
+'g:syntastic_html_validator_parser'	syntastic-checkers.txt	/*'g:syntastic_html_validator_parser'*
+'g:syntastic_html_validator_schema'	syntastic-checkers.txt	/*'g:syntastic_html_validator_schema'*
+'g:syntastic_html_w3_api'	syntastic-checkers.txt	/*'g:syntastic_html_w3_api'*
+'g:syntastic_html_w3_doctype'	syntastic-checkers.txt	/*'g:syntastic_html_w3_doctype'*
+'g:syntastic_html_w3_exec'	syntastic-checkers.txt	/*'g:syntastic_html_w3_exec'*
+'g:syntastic_java_checkstyle_classpath'	syntastic-checkers.txt	/*'g:syntastic_java_checkstyle_classpath'*
+'g:syntastic_java_checkstyle_conf_file'	syntastic-checkers.txt	/*'g:syntastic_java_checkstyle_conf_file'*
+'g:syntastic_java_checkstyle_exec'	syntastic-checkers.txt	/*'g:syntastic_java_checkstyle_exec'*
+'g:syntastic_java_javac_autoload_maven_classpath'	syntastic-checkers.txt	/*'g:syntastic_java_javac_autoload_maven_classpath'*
+'g:syntastic_java_javac_classpath'	syntastic-checkers.txt	/*'g:syntastic_java_javac_classpath'*
+'g:syntastic_java_javac_config_file'	syntastic-checkers.txt	/*'g:syntastic_java_javac_config_file'*
+'g:syntastic_java_javac_config_file_enabled'	syntastic-checkers.txt	/*'g:syntastic_java_javac_config_file_enabled'*
+'g:syntastic_java_javac_custom_classpath_command'	syntastic-checkers.txt	/*'g:syntastic_java_javac_custom_classpath_command'*
+'g:syntastic_java_javac_delete_output'	syntastic-checkers.txt	/*'g:syntastic_java_javac_delete_output'*
+'g:syntastic_java_javac_executable'	syntastic-checkers.txt	/*'g:syntastic_java_javac_executable'*
+'g:syntastic_java_javac_options'	syntastic-checkers.txt	/*'g:syntastic_java_javac_options'*
+'g:syntastic_java_maven_executable'	syntastic-checkers.txt	/*'g:syntastic_java_maven_executable'*
+'g:syntastic_javascript_closurecompiler_path'	syntastic-checkers.txt	/*'g:syntastic_javascript_closurecompiler_path'*
+'g:syntastic_javascript_closurecompiler_script'	syntastic-checkers.txt	/*'g:syntastic_javascript_closurecompiler_script'*
+'g:syntastic_javascript_standard_generic'	syntastic-checkers.txt	/*'g:syntastic_javascript_standard_generic'*
+'g:syntastic_less_use_less_lint'	syntastic-checkers.txt	/*'g:syntastic_less_use_less_lint'*
+'g:syntastic_objc_check_header'	syntastic-checkers.txt	/*'g:syntastic_objc_check_header'*
+'g:syntastic_objc_compiler'	syntastic-checkers.txt	/*'g:syntastic_objc_compiler'*
+'g:syntastic_objc_compiler_options'	syntastic-checkers.txt	/*'g:syntastic_objc_compiler_options'*
+'g:syntastic_objc_config_file'	syntastic-checkers.txt	/*'g:syntastic_objc_config_file'*
+'g:syntastic_objc_errorformat'	syntastic-checkers.txt	/*'g:syntastic_objc_errorformat'*
+'g:syntastic_objc_include_dirs'	syntastic-checkers.txt	/*'g:syntastic_objc_include_dirs'*
+'g:syntastic_objc_no_default_include_dirs'	syntastic-checkers.txt	/*'g:syntastic_objc_no_default_include_dirs'*
+'g:syntastic_objc_remove_include_errors'	syntastic-checkers.txt	/*'g:syntastic_objc_remove_include_errors'*
+'g:syntastic_objcpp_check_header'	syntastic-checkers.txt	/*'g:syntastic_objcpp_check_header'*
+'g:syntastic_objcpp_compiler'	syntastic-checkers.txt	/*'g:syntastic_objcpp_compiler'*
+'g:syntastic_objcpp_compiler_options'	syntastic-checkers.txt	/*'g:syntastic_objcpp_compiler_options'*
+'g:syntastic_objcpp_config_file'	syntastic-checkers.txt	/*'g:syntastic_objcpp_config_file'*
+'g:syntastic_objcpp_errorformat'	syntastic-checkers.txt	/*'g:syntastic_objcpp_errorformat'*
+'g:syntastic_objcpp_include_dirs'	syntastic-checkers.txt	/*'g:syntastic_objcpp_include_dirs'*
+'g:syntastic_objcpp_no_default_include_dirs'	syntastic-checkers.txt	/*'g:syntastic_objcpp_no_default_include_dirs'*
+'g:syntastic_objcpp_remove_include_errors'	syntastic-checkers.txt	/*'g:syntastic_objcpp_remove_include_errors'*
+'g:syntastic_ocaml_camlp4r'	syntastic-checkers.txt	/*'g:syntastic_ocaml_camlp4r'*
+'g:syntastic_ocaml_janestreet_core_dir'	syntastic-checkers.txt	/*'g:syntastic_ocaml_janestreet_core_dir'*
+'g:syntastic_ocaml_use_janestreet_core'	syntastic-checkers.txt	/*'g:syntastic_ocaml_use_janestreet_core'*
+'g:syntastic_ocaml_use_ocamlbuild'	syntastic-checkers.txt	/*'g:syntastic_ocaml_use_ocamlbuild'*
+'g:syntastic_ocaml_use_ocamlc'	syntastic-checkers.txt	/*'g:syntastic_ocaml_use_ocamlc'*
+'g:syntastic_pc_lint_config_file'	syntastic-checkers.txt	/*'g:syntastic_pc_lint_config_file'*
+'g:syntastic_perl_interpreter'	syntastic-checkers.txt	/*'g:syntastic_perl_interpreter'*
+'g:syntastic_perl_lib_path'	syntastic-checkers.txt	/*'g:syntastic_perl_lib_path'*
+'g:syntastic_perl_perlcritic_thres'	syntastic-checkers.txt	/*'g:syntastic_perl_perlcritic_thres'*
+'g:syntastic_python_python_use_codec'	syntastic-checkers.txt	/*'g:syntastic_python_python_use_codec'*
+'g:syntastic_r_lintr_cache'	syntastic-checkers.txt	/*'g:syntastic_r_lintr_cache'*
+'g:syntastic_r_lintr_linters'	syntastic-checkers.txt	/*'g:syntastic_r_lintr_linters'*
+'g:syntastic_raku_lib_path'	syntastic-checkers.txt	/*'g:syntastic_raku_lib_path'*
+'g:syntastic_rst_sphinx_config_dir'	syntastic-checkers.txt	/*'g:syntastic_rst_sphinx_config_dir'*
+'g:syntastic_rst_sphinx_source_dir'	syntastic-checkers.txt	/*'g:syntastic_rst_sphinx_source_dir'*
+'g:syntastic_ruby_exec'	syntastic-checkers.txt	/*'g:syntastic_ruby_exec'*
+'g:syntastic_ruby_flog_threshold_error'	syntastic-checkers.txt	/*'g:syntastic_ruby_flog_threshold_error'*
+'g:syntastic_ruby_flog_threshold_warning'	syntastic-checkers.txt	/*'g:syntastic_ruby_flog_threshold_warning'*
+'g:syntastic_scala_scalastyle_config_file'	syntastic-checkers.txt	/*'g:syntastic_scala_scalastyle_config_file'*
+'g:syntastic_scala_scalastyle_exec'	syntastic-checkers.txt	/*'g:syntastic_scala_scalastyle_exec'*
+'g:syntastic_scala_scalastyle_jar'	syntastic-checkers.txt	/*'g:syntastic_scala_scalastyle_jar'*
+'g:syntastic_sparse_config_file'	syntastic-checkers.txt	/*'g:syntastic_sparse_config_file'*
+'g:syntastic_splint_config_file'	syntastic-checkers.txt	/*'g:syntastic_splint_config_file'*
+'g:syntastic_svg_validator_api'	syntastic-checkers.txt	/*'g:syntastic_svg_validator_api'*
+'g:syntastic_svg_validator_exec'	syntastic-checkers.txt	/*'g:syntastic_svg_validator_exec'*
+'g:syntastic_svg_validator_nsfilter'	syntastic-checkers.txt	/*'g:syntastic_svg_validator_nsfilter'*
+'g:syntastic_svg_validator_parser'	syntastic-checkers.txt	/*'g:syntastic_svg_validator_parser'*
+'g:syntastic_svg_validator_schema'	syntastic-checkers.txt	/*'g:syntastic_svg_validator_schema'*
+'g:syntastic_svg_w3_api'	syntastic-checkers.txt	/*'g:syntastic_svg_w3_api'*
+'g:syntastic_svg_w3_doctype'	syntastic-checkers.txt	/*'g:syntastic_svg_w3_doctype'*
+'g:syntastic_svg_w3_exec'	syntastic-checkers.txt	/*'g:syntastic_svg_w3_exec'*
+'g:syntastic_tex_chktex_showmsgs'	syntastic-checkers.txt	/*'g:syntastic_tex_chktex_showmsgs'*
+'g:syntastic_verapp_config_file'	syntastic-checkers.txt	/*'g:syntastic_verapp_config_file'*
+'g:syntastic_verilog_compiler'	syntastic-checkers.txt	/*'g:syntastic_verilog_compiler'*
+'g:syntastic_verilog_compiler_options'	syntastic-checkers.txt	/*'g:syntastic_verilog_compiler_options'*
+'g:syntastic_verilog_config_file'	syntastic-checkers.txt	/*'g:syntastic_verilog_config_file'*
+'g:syntastic_verilog_errorformat'	syntastic-checkers.txt	/*'g:syntastic_verilog_errorformat'*
+'g:syntastic_verilog_include_dirs'	syntastic-checkers.txt	/*'g:syntastic_verilog_include_dirs'*
+'g:syntastic_verilog_remove_include_errors'	syntastic-checkers.txt	/*'g:syntastic_verilog_remove_include_errors'*
+'g:syntastic_vimlint_options'	syntastic-checkers.txt	/*'g:syntastic_vimlint_options'*
+'g:syntastic_xhtml_tidy_ignore_errors'	syntastic-checkers.txt	/*'g:syntastic_xhtml_tidy_ignore_errors'*
+'g:syntastic_xhtml_validator_api'	syntastic-checkers.txt	/*'g:syntastic_xhtml_validator_api'*
+'g:syntastic_xhtml_validator_exec'	syntastic-checkers.txt	/*'g:syntastic_xhtml_validator_exec'*
+'g:syntastic_xhtml_validator_nsfilter'	syntastic-checkers.txt	/*'g:syntastic_xhtml_validator_nsfilter'*
+'g:syntastic_xhtml_validator_parser'	syntastic-checkers.txt	/*'g:syntastic_xhtml_validator_parser'*
+'g:syntastic_xhtml_validator_schema'	syntastic-checkers.txt	/*'g:syntastic_xhtml_validator_schema'*
+'g:syntastic_xhtml_w3_api'	syntastic-checkers.txt	/*'g:syntastic_xhtml_w3_api'*
+'g:syntastic_xhtml_w3_doctype'	syntastic-checkers.txt	/*'g:syntastic_xhtml_w3_doctype'*
+'g:syntastic_xhtml_w3_exec'	syntastic-checkers.txt	/*'g:syntastic_xhtml_w3_exec'*
+'g:vaxe_hxml'	syntastic-checkers.txt	/*'g:vaxe_hxml'*
+'syntastic_<filetype>_<checker>_<option>'	syntastic.txt	/*'syntastic_<filetype>_<checker>_<option>'*
+'syntastic_<filetype>_<checker>_exe'	syntastic.txt	/*'syntastic_<filetype>_<checker>_exe'*
+'syntastic_<filetype>_<checker>_exec'	syntastic.txt	/*'syntastic_<filetype>_<checker>_exec'*
+'syntastic_<filetype>_<checker>_fname'	syntastic.txt	/*'syntastic_<filetype>_<checker>_fname'*
+'syntastic_<filetype>_<checker>_quiet_messages'	syntastic.txt	/*'syntastic_<filetype>_<checker>_quiet_messages'*
+'syntastic_<filetype>_<checker>_sort'	syntastic.txt	/*'syntastic_<filetype>_<checker>_sort'*
+'syntastic_aggregate_errors'	syntastic.txt	/*'syntastic_aggregate_errors'*
+'syntastic_always_populate_loc_list'	syntastic.txt	/*'syntastic_always_populate_loc_list'*
+'syntastic_auto_jump'	syntastic.txt	/*'syntastic_auto_jump'*
+'syntastic_auto_loc_list'	syntastic.txt	/*'syntastic_auto_loc_list'*
+'syntastic_check_on_open'	syntastic.txt	/*'syntastic_check_on_open'*
+'syntastic_check_on_wq'	syntastic.txt	/*'syntastic_check_on_wq'*
+'syntastic_cursor_columns'	syntastic.txt	/*'syntastic_cursor_columns'*
+'syntastic_debug'	syntastic.txt	/*'syntastic_debug'*
+'syntastic_debug_file'	syntastic.txt	/*'syntastic_debug_file'*
+'syntastic_echo_current_error'	syntastic.txt	/*'syntastic_echo_current_error'*
+'syntastic_enable_balloons'	syntastic.txt	/*'syntastic_enable_balloons'*
+'syntastic_enable_highlighting'	syntastic.txt	/*'syntastic_enable_highlighting'*
+'syntastic_enable_signs'	syntastic.txt	/*'syntastic_enable_signs'*
+'syntastic_error_symbol'	syntastic.txt	/*'syntastic_error_symbol'*
+'syntastic_exit_checks'	syntastic.txt	/*'syntastic_exit_checks'*
+'syntastic_extra_filetypes'	syntastic.txt	/*'syntastic_extra_filetypes'*
+'syntastic_filetype_map'	syntastic.txt	/*'syntastic_filetype_map'*
+'syntastic_full_redraws'	syntastic.txt	/*'syntastic_full_redraws'*
+'syntastic_id_checkers'	syntastic.txt	/*'syntastic_id_checkers'*
+'syntastic_ignore_files'	syntastic.txt	/*'syntastic_ignore_files'*
+'syntastic_loc_list_height'	syntastic.txt	/*'syntastic_loc_list_height'*
+'syntastic_mode_map'	syntastic.txt	/*'syntastic_mode_map'*
+'syntastic_nested_autocommands'	syntastic.txt	/*'syntastic_nested_autocommands'*
+'syntastic_quiet_messages'	syntastic.txt	/*'syntastic_quiet_messages'*
+'syntastic_shell'	syntastic.txt	/*'syntastic_shell'*
+'syntastic_sort_aggregated_errors'	syntastic.txt	/*'syntastic_sort_aggregated_errors'*
+'syntastic_stl_format'	syntastic.txt	/*'syntastic_stl_format'*
+'syntastic_style_error_symbol'	syntastic.txt	/*'syntastic_style_error_symbol'*
+'syntastic_style_warning_symbol'	syntastic.txt	/*'syntastic_style_warning_symbol'*
+'syntastic_warning_symbol'	syntastic.txt	/*'syntastic_warning_symbol'*
+/syntastic/	syntastic.txt	/*\/syntastic\/*
+:Errors	syntastic.txt	/*:Errors*
+:SyntasticCheck	syntastic.txt	/*:SyntasticCheck*
+:SyntasticInfo	syntastic.txt	/*:SyntasticInfo*
+:SyntasticJavacEditClasspath	syntastic-checkers.txt	/*:SyntasticJavacEditClasspath*
+:SyntasticJavacEditConfig	syntastic-checkers.txt	/*:SyntasticJavacEditConfig*
+:SyntasticReset	syntastic.txt	/*:SyntasticReset*
+:SyntasticSetLoclist	syntastic.txt	/*:SyntasticSetLoclist*
+:SyntasticToggleMode	syntastic.txt	/*:SyntasticToggleMode*
+SyntasticCheckHook()	syntastic.txt	/*SyntasticCheckHook()*
+filter-overrides	syntastic.txt	/*filter-overrides*
+syntastic	syntastic.txt	/*syntastic*
+syntastic-about	syntastic.txt	/*syntastic-about*
+syntastic-actionscript-mxmlc	syntastic-checkers.txt	/*syntastic-actionscript-mxmlc*
+syntastic-ada-gcc	syntastic-checkers.txt	/*syntastic-ada-gcc*
+syntastic-aggregating-errors	syntastic.txt	/*syntastic-aggregating-errors*
+syntastic-airline	syntastic.txt	/*syntastic-airline*
+syntastic-ansible-ansible_lint	syntastic-checkers.txt	/*syntastic-ansible-ansible_lint*
+syntastic-apiblueprint-drafter	syntastic-checkers.txt	/*syntastic-apiblueprint-drafter*
+syntastic-applescript-osacompile	syntastic-checkers.txt	/*syntastic-applescript-osacompile*
+syntastic-asciidoc-asciidoc	syntastic-checkers.txt	/*syntastic-asciidoc-asciidoc*
+syntastic-asciidoc-proselint	syntastic-checkers.txt	/*syntastic-asciidoc-proselint*
+syntastic-asl-iasl	syntastic-checkers.txt	/*syntastic-asl-iasl*
+syntastic-asm-gcc	syntastic-checkers.txt	/*syntastic-asm-gcc*
+syntastic-bemhtml-bemhtmllint	syntastic-checkers.txt	/*syntastic-bemhtml-bemhtmllint*
+syntastic-bro-bro	syntastic-checkers.txt	/*syntastic-bro-bro*
+syntastic-c-avrgcc	syntastic-checkers.txt	/*syntastic-c-avrgcc*
+syntastic-c-checkpatch	syntastic-checkers.txt	/*syntastic-c-checkpatch*
+syntastic-c-clang_check	syntastic-checkers.txt	/*syntastic-c-clang_check*
+syntastic-c-clang_tidy	syntastic-checkers.txt	/*syntastic-c-clang_tidy*
+syntastic-c-cppcheck	syntastic-checkers.txt	/*syntastic-c-cppcheck*
+syntastic-c-cppclean	syntastic-checkers.txt	/*syntastic-c-cppclean*
+syntastic-c-flawfinder	syntastic-checkers.txt	/*syntastic-c-flawfinder*
+syntastic-c-gcc	syntastic-checkers.txt	/*syntastic-c-gcc*
+syntastic-c-make	syntastic-checkers.txt	/*syntastic-c-make*
+syntastic-c-oclint	syntastic-checkers.txt	/*syntastic-c-oclint*
+syntastic-c-pc_lint	syntastic-checkers.txt	/*syntastic-c-pc_lint*
+syntastic-c-sparse	syntastic-checkers.txt	/*syntastic-c-sparse*
+syntastic-c-splint	syntastic-checkers.txt	/*syntastic-c-splint*
+syntastic-cabal-cabal	syntastic-checkers.txt	/*syntastic-cabal-cabal*
+syntastic-checker-options	syntastic.txt	/*syntastic-checker-options*
+syntastic-checkers	syntastic-checkers.txt	/*syntastic-checkers*
+syntastic-checkers-actionscript	syntastic-checkers.txt	/*syntastic-checkers-actionscript*
+syntastic-checkers-ada	syntastic-checkers.txt	/*syntastic-checkers-ada*
+syntastic-checkers-ansible	syntastic-checkers.txt	/*syntastic-checkers-ansible*
+syntastic-checkers-apiblueprint	syntastic-checkers.txt	/*syntastic-checkers-apiblueprint*
+syntastic-checkers-applescript	syntastic-checkers.txt	/*syntastic-checkers-applescript*
+syntastic-checkers-asciidoc	syntastic-checkers.txt	/*syntastic-checkers-asciidoc*
+syntastic-checkers-asl	syntastic-checkers.txt	/*syntastic-checkers-asl*
+syntastic-checkers-asm	syntastic-checkers.txt	/*syntastic-checkers-asm*
+syntastic-checkers-bemhtml	syntastic-checkers.txt	/*syntastic-checkers-bemhtml*
+syntastic-checkers-bro	syntastic-checkers.txt	/*syntastic-checkers-bro*
+syntastic-checkers-c	syntastic-checkers.txt	/*syntastic-checkers-c*
+syntastic-checkers-cabal	syntastic-checkers.txt	/*syntastic-checkers-cabal*
+syntastic-checkers-chef	syntastic-checkers.txt	/*syntastic-checkers-chef*
+syntastic-checkers-cmake	syntastic-checkers.txt	/*syntastic-checkers-cmake*
+syntastic-checkers-co	syntastic-checkers.txt	/*syntastic-checkers-co*
+syntastic-checkers-cobol	syntastic-checkers.txt	/*syntastic-checkers-cobol*
+syntastic-checkers-coffee	syntastic-checkers.txt	/*syntastic-checkers-coffee*
+syntastic-checkers-coq	syntastic-checkers.txt	/*syntastic-checkers-coq*
+syntastic-checkers-cpp	syntastic-checkers.txt	/*syntastic-checkers-cpp*
+syntastic-checkers-cs	syntastic-checkers.txt	/*syntastic-checkers-cs*
+syntastic-checkers-css	syntastic-checkers.txt	/*syntastic-checkers-css*
+syntastic-checkers-cucumber	syntastic-checkers.txt	/*syntastic-checkers-cucumber*
+syntastic-checkers-cuda	syntastic-checkers.txt	/*syntastic-checkers-cuda*
+syntastic-checkers-d	syntastic-checkers.txt	/*syntastic-checkers-d*
+syntastic-checkers-dart	syntastic-checkers.txt	/*syntastic-checkers-dart*
+syntastic-checkers-docbk	syntastic-checkers.txt	/*syntastic-checkers-docbk*
+syntastic-checkers-dockerfile	syntastic-checkers.txt	/*syntastic-checkers-dockerfile*
+syntastic-checkers-dustjs	syntastic-checkers.txt	/*syntastic-checkers-dustjs*
+syntastic-checkers-elixir	syntastic-checkers.txt	/*syntastic-checkers-elixir*
+syntastic-checkers-erlang	syntastic-checkers.txt	/*syntastic-checkers-erlang*
+syntastic-checkers-eruby	syntastic-checkers.txt	/*syntastic-checkers-eruby*
+syntastic-checkers-fortran	syntastic-checkers.txt	/*syntastic-checkers-fortran*
+syntastic-checkers-gentoo	syntastic-checkers.txt	/*syntastic-checkers-gentoo*
+syntastic-checkers-glsl	syntastic-checkers.txt	/*syntastic-checkers-glsl*
+syntastic-checkers-go	syntastic-checkers.txt	/*syntastic-checkers-go*
+syntastic-checkers-haml	syntastic-checkers.txt	/*syntastic-checkers-haml*
+syntastic-checkers-handlebars	syntastic-checkers.txt	/*syntastic-checkers-handlebars*
+syntastic-checkers-haskell	syntastic-checkers.txt	/*syntastic-checkers-haskell*
+syntastic-checkers-haxe	syntastic-checkers.txt	/*syntastic-checkers-haxe*
+syntastic-checkers-help	syntastic-checkers.txt	/*syntastic-checkers-help*
+syntastic-checkers-hss	syntastic-checkers.txt	/*syntastic-checkers-hss*
+syntastic-checkers-html	syntastic-checkers.txt	/*syntastic-checkers-html*
+syntastic-checkers-java	syntastic-checkers.txt	/*syntastic-checkers-java*
+syntastic-checkers-javascript	syntastic-checkers.txt	/*syntastic-checkers-javascript*
+syntastic-checkers-json	syntastic-checkers.txt	/*syntastic-checkers-json*
+syntastic-checkers-lang	syntastic-checkers.txt	/*syntastic-checkers-lang*
+syntastic-checkers-less	syntastic-checkers.txt	/*syntastic-checkers-less*
+syntastic-checkers-lex	syntastic-checkers.txt	/*syntastic-checkers-lex*
+syntastic-checkers-limbo	syntastic-checkers.txt	/*syntastic-checkers-limbo*
+syntastic-checkers-lisp	syntastic-checkers.txt	/*syntastic-checkers-lisp*
+syntastic-checkers-llvm	syntastic-checkers.txt	/*syntastic-checkers-llvm*
+syntastic-checkers-lua	syntastic-checkers.txt	/*syntastic-checkers-lua*
+syntastic-checkers-markdown	syntastic-checkers.txt	/*syntastic-checkers-markdown*
+syntastic-checkers-matlab	syntastic-checkers.txt	/*syntastic-checkers-matlab*
+syntastic-checkers-mercury	syntastic-checkers.txt	/*syntastic-checkers-mercury*
+syntastic-checkers-nasm	syntastic-checkers.txt	/*syntastic-checkers-nasm*
+syntastic-checkers-nix	syntastic-checkers.txt	/*syntastic-checkers-nix*
+syntastic-checkers-nroff	syntastic-checkers.txt	/*syntastic-checkers-nroff*
+syntastic-checkers-objc	syntastic-checkers.txt	/*syntastic-checkers-objc*
+syntastic-checkers-objcpp	syntastic-checkers.txt	/*syntastic-checkers-objcpp*
+syntastic-checkers-ocaml	syntastic-checkers.txt	/*syntastic-checkers-ocaml*
+syntastic-checkers-perl	syntastic-checkers.txt	/*syntastic-checkers-perl*
+syntastic-checkers-php	syntastic-checkers.txt	/*syntastic-checkers-php*
+syntastic-checkers-po	syntastic-checkers.txt	/*syntastic-checkers-po*
+syntastic-checkers-pod	syntastic-checkers.txt	/*syntastic-checkers-pod*
+syntastic-checkers-pug	syntastic-checkers.txt	/*syntastic-checkers-pug*
+syntastic-checkers-puppet	syntastic-checkers.txt	/*syntastic-checkers-puppet*
+syntastic-checkers-python	syntastic-checkers.txt	/*syntastic-checkers-python*
+syntastic-checkers-qml	syntastic-checkers.txt	/*syntastic-checkers-qml*
+syntastic-checkers-r	syntastic-checkers.txt	/*syntastic-checkers-r*
+syntastic-checkers-racket	syntastic-checkers.txt	/*syntastic-checkers-racket*
+syntastic-checkers-raku	syntastic-checkers.txt	/*syntastic-checkers-raku*
+syntastic-checkers-rmd	syntastic-checkers.txt	/*syntastic-checkers-rmd*
+syntastic-checkers-rnc	syntastic-checkers.txt	/*syntastic-checkers-rnc*
+syntastic-checkers-rst	syntastic-checkers.txt	/*syntastic-checkers-rst*
+syntastic-checkers-ruby	syntastic-checkers.txt	/*syntastic-checkers-ruby*
+syntastic-checkers-sass	syntastic-checkers.txt	/*syntastic-checkers-sass*
+syntastic-checkers-scala	syntastic-checkers.txt	/*syntastic-checkers-scala*
+syntastic-checkers-scss	syntastic-checkers.txt	/*syntastic-checkers-scss*
+syntastic-checkers-sh	syntastic-checkers.txt	/*syntastic-checkers-sh*
+syntastic-checkers-slim	syntastic-checkers.txt	/*syntastic-checkers-slim*
+syntastic-checkers-sml	syntastic-checkers.txt	/*syntastic-checkers-sml*
+syntastic-checkers-solidity	syntastic-checkers.txt	/*syntastic-checkers-solidity*
+syntastic-checkers-spec	syntastic-checkers.txt	/*syntastic-checkers-spec*
+syntastic-checkers-sql	syntastic-checkers.txt	/*syntastic-checkers-sql*
+syntastic-checkers-stylus	syntastic-checkers.txt	/*syntastic-checkers-stylus*
+syntastic-checkers-svg	syntastic-checkers.txt	/*syntastic-checkers-svg*
+syntastic-checkers-tcl	syntastic-checkers.txt	/*syntastic-checkers-tcl*
+syntastic-checkers-tex	syntastic-checkers.txt	/*syntastic-checkers-tex*
+syntastic-checkers-texinfo	syntastic-checkers.txt	/*syntastic-checkers-texinfo*
+syntastic-checkers-text	syntastic-checkers.txt	/*syntastic-checkers-text*
+syntastic-checkers-trig	syntastic-checkers.txt	/*syntastic-checkers-trig*
+syntastic-checkers-turtle	syntastic-checkers.txt	/*syntastic-checkers-turtle*
+syntastic-checkers-twig	syntastic-checkers.txt	/*syntastic-checkers-twig*
+syntastic-checkers-typescript	syntastic-checkers.txt	/*syntastic-checkers-typescript*
+syntastic-checkers-verilog	syntastic-checkers.txt	/*syntastic-checkers-verilog*
+syntastic-checkers-vhdl	syntastic-checkers.txt	/*syntastic-checkers-vhdl*
+syntastic-checkers-vim	syntastic-checkers.txt	/*syntastic-checkers-vim*
+syntastic-checkers-vue	syntastic-checkers.txt	/*syntastic-checkers-vue*
+syntastic-checkers-xhtml	syntastic-checkers.txt	/*syntastic-checkers-xhtml*
+syntastic-checkers-xml	syntastic-checkers.txt	/*syntastic-checkers-xml*
+syntastic-checkers-xquery	syntastic-checkers.txt	/*syntastic-checkers-xquery*
+syntastic-checkers-xslt	syntastic-checkers.txt	/*syntastic-checkers-xslt*
+syntastic-checkers-yacc	syntastic-checkers.txt	/*syntastic-checkers-yacc*
+syntastic-checkers-yaml	syntastic-checkers.txt	/*syntastic-checkers-yaml*
+syntastic-checkers-yang	syntastic-checkers.txt	/*syntastic-checkers-yang*
+syntastic-checkers-yara	syntastic-checkers.txt	/*syntastic-checkers-yara*
+syntastic-checkers-z80	syntastic-checkers.txt	/*syntastic-checkers-z80*
+syntastic-checkers-zpt	syntastic-checkers.txt	/*syntastic-checkers-zpt*
+syntastic-checkers-zsh	syntastic-checkers.txt	/*syntastic-checkers-zsh*
+syntastic-checkers.txt	syntastic-checkers.txt	/*syntastic-checkers.txt*
+syntastic-chef-foodcritic	syntastic-checkers.txt	/*syntastic-chef-foodcritic*
+syntastic-cmake-cmakelint	syntastic-checkers.txt	/*syntastic-cmake-cmakelint*
+syntastic-co-coco	syntastic-checkers.txt	/*syntastic-co-coco*
+syntastic-cobol-cobc	syntastic-checkers.txt	/*syntastic-cobol-cobc*
+syntastic-coffee-coffee	syntastic-checkers.txt	/*syntastic-coffee-coffee*
+syntastic-coffee-coffee_jshint	syntastic-checkers.txt	/*syntastic-coffee-coffee_jshint*
+syntastic-coffee-coffeelint	syntastic-checkers.txt	/*syntastic-coffee-coffeelint*
+syntastic-commands	syntastic.txt	/*syntastic-commands*
+syntastic-compatibility	syntastic.txt	/*syntastic-compatibility*
+syntastic-composite	syntastic.txt	/*syntastic-composite*
+syntastic-config-checkers	syntastic-checkers.txt	/*syntastic-config-checkers*
+syntastic-config-debug	syntastic.txt	/*syntastic-config-debug*
+syntastic-config-empty	syntastic.txt	/*syntastic-config-empty*
+syntastic-config-exec	syntastic.txt	/*syntastic-config-exec*
+syntastic-config-files	syntastic-checkers.txt	/*syntastic-config-files*
+syntastic-config-filtering	syntastic.txt	/*syntastic-config-filtering*
+syntastic-config-format	syntastic-checkers.txt	/*syntastic-config-format*
+syntastic-config-location	syntastic-checkers.txt	/*syntastic-config-location*
+syntastic-config-makeprg	syntastic.txt	/*syntastic-config-makeprg*
+syntastic-config-naming	syntastic-checkers.txt	/*syntastic-config-naming*
+syntastic-config-no-makeprgbuild	syntastic.txt	/*syntastic-config-no-makeprgbuild*
+syntastic-config-sort	syntastic.txt	/*syntastic-config-sort*
+syntastic-contents	syntastic.txt	/*syntastic-contents*
+syntastic-coq-coqtop	syntastic-checkers.txt	/*syntastic-coq-coqtop*
+syntastic-cpp-avrgcc	syntastic-checkers.txt	/*syntastic-cpp-avrgcc*
+syntastic-cpp-clang_check	syntastic-checkers.txt	/*syntastic-cpp-clang_check*
+syntastic-cpp-clang_tidy	syntastic-checkers.txt	/*syntastic-cpp-clang_tidy*
+syntastic-cpp-cppcheck	syntastic-checkers.txt	/*syntastic-cpp-cppcheck*
+syntastic-cpp-cppclean	syntastic-checkers.txt	/*syntastic-cpp-cppclean*
+syntastic-cpp-cpplint	syntastic-checkers.txt	/*syntastic-cpp-cpplint*
+syntastic-cpp-flawfinder	syntastic-checkers.txt	/*syntastic-cpp-flawfinder*
+syntastic-cpp-gcc	syntastic-checkers.txt	/*syntastic-cpp-gcc*
+syntastic-cpp-oclint	syntastic-checkers.txt	/*syntastic-cpp-oclint*
+syntastic-cpp-pc_lint	syntastic-checkers.txt	/*syntastic-cpp-pc_lint*
+syntastic-cpp-verapp	syntastic-checkers.txt	/*syntastic-cpp-verapp*
+syntastic-cs-mcs	syntastic-checkers.txt	/*syntastic-cs-mcs*
+syntastic-csh	syntastic.txt	/*syntastic-csh*
+syntastic-css-csslint	syntastic-checkers.txt	/*syntastic-css-csslint*
+syntastic-css-mixedindentlint	syntastic-checkers.txt	/*syntastic-css-mixedindentlint*
+syntastic-css-phpcs	syntastic-checkers.txt	/*syntastic-css-phpcs*
+syntastic-css-prettycss	syntastic-checkers.txt	/*syntastic-css-prettycss*
+syntastic-css-recess	syntastic-checkers.txt	/*syntastic-css-recess*
+syntastic-css-stylelint	syntastic-checkers.txt	/*syntastic-css-stylelint*
+syntastic-cucumber-cucumber	syntastic-checkers.txt	/*syntastic-cucumber-cucumber*
+syntastic-cuda-nvcc	syntastic-checkers.txt	/*syntastic-cuda-nvcc*
+syntastic-d-dmd	syntastic-checkers.txt	/*syntastic-d-dmd*
+syntastic-d-dscanner	syntastic-checkers.txt	/*syntastic-d-dscanner*
+syntastic-dart-dartanalyzer	syntastic-checkers.txt	/*syntastic-dart-dartanalyzer*
+syntastic-debug	syntastic.txt	/*syntastic-debug*
+syntastic-docbk-igor	syntastic-checkers.txt	/*syntastic-docbk-igor*
+syntastic-docbk-xmllint	syntastic-checkers.txt	/*syntastic-docbk-xmllint*
+syntastic-dockerfile-dockerfile_lint	syntastic-checkers.txt	/*syntastic-dockerfile-dockerfile_lint*
+syntastic-dockerfile-hadolint	syntastic-checkers.txt	/*syntastic-dockerfile-hadolint*
+syntastic-dustjs-swiffer	syntastic-checkers.txt	/*syntastic-dustjs-swiffer*
+syntastic-easygrep	syntastic.txt	/*syntastic-easygrep*
+syntastic-eclim	syntastic.txt	/*syntastic-eclim*
+syntastic-elixir-elixir	syntastic-checkers.txt	/*syntastic-elixir-elixir*
+syntastic-erlang-escript	syntastic-checkers.txt	/*syntastic-erlang-escript*
+syntastic-erlang-syntaxerl	syntastic-checkers.txt	/*syntastic-erlang-syntaxerl*
+syntastic-error-signs	syntastic.txt	/*syntastic-error-signs*
+syntastic-error-window	syntastic.txt	/*syntastic-error-window*
+syntastic-eruby-ruby	syntastic-checkers.txt	/*syntastic-eruby-ruby*
+syntastic-ferret	syntastic.txt	/*syntastic-ferret*
+syntastic-filetype-checkers	syntastic.txt	/*syntastic-filetype-checkers*
+syntastic-filtering-errors	syntastic.txt	/*syntastic-filtering-errors*
+syntastic-fish	syntastic.txt	/*syntastic-fish*
+syntastic-fizsh	syntastic.txt	/*syntastic-fizsh*
+syntastic-flagship	syntastic.txt	/*syntastic-flagship*
+syntastic-fortran-gfortran	syntastic-checkers.txt	/*syntastic-fortran-gfortran*
+syntastic-functionality	syntastic.txt	/*syntastic-functionality*
+syntastic-gentoo-xmllint	syntastic-checkers.txt	/*syntastic-gentoo-xmllint*
+syntastic-global-options	syntastic.txt	/*syntastic-global-options*
+syntastic-glsl-cgc	syntastic-checkers.txt	/*syntastic-glsl-cgc*
+syntastic-go-go	syntastic-checkers.txt	/*syntastic-go-go*
+syntastic-go-gofmt	syntastic-checkers.txt	/*syntastic-go-gofmt*
+syntastic-go-golangci_lint	syntastic-checkers.txt	/*syntastic-go-golangci_lint*
+syntastic-go-golint	syntastic-checkers.txt	/*syntastic-go-golint*
+syntastic-go-gometalinter	syntastic-checkers.txt	/*syntastic-go-gometalinter*
+syntastic-go-gotype	syntastic-checkers.txt	/*syntastic-go-gotype*
+syntastic-go-govet	syntastic-checkers.txt	/*syntastic-go-govet*
+syntastic-haml-haml	syntastic-checkers.txt	/*syntastic-haml-haml*
+syntastic-haml-haml_lint	syntastic-checkers.txt	/*syntastic-haml-haml_lint*
+syntastic-handlebars-handlebars	syntastic-checkers.txt	/*syntastic-handlebars-handlebars*
+syntastic-haskell-hdevtools	syntastic-checkers.txt	/*syntastic-haskell-hdevtools*
+syntastic-haskell-hlint	syntastic-checkers.txt	/*syntastic-haskell-hlint*
+syntastic-haskell-scan	syntastic-checkers.txt	/*syntastic-haskell-scan*
+syntastic-haxe-haxe	syntastic-checkers.txt	/*syntastic-haxe-haxe*
+syntastic-help-proselint	syntastic-checkers.txt	/*syntastic-help-proselint*
+syntastic-highlighting	syntastic.txt	/*syntastic-highlighting*
+syntastic-hss-hss	syntastic-checkers.txt	/*syntastic-hss-hss*
+syntastic-html-eslint	syntastic-checkers.txt	/*syntastic-html-eslint*
+syntastic-html-gjslint	syntastic-checkers.txt	/*syntastic-html-gjslint*
+syntastic-html-htmlhint	syntastic-checkers.txt	/*syntastic-html-htmlhint*
+syntastic-html-jshint	syntastic-checkers.txt	/*syntastic-html-jshint*
+syntastic-html-proselint	syntastic-checkers.txt	/*syntastic-html-proselint*
+syntastic-html-stylelint	syntastic-checkers.txt	/*syntastic-html-stylelint*
+syntastic-html-textlint	syntastic-checkers.txt	/*syntastic-html-textlint*
+syntastic-html-tidy	syntastic-checkers.txt	/*syntastic-html-tidy*
+syntastic-html-validator	syntastic-checkers.txt	/*syntastic-html-validator*
+syntastic-html-w3	syntastic-checkers.txt	/*syntastic-html-w3*
+syntastic-intro	syntastic.txt	/*syntastic-intro*
+syntastic-java-checkstyle	syntastic-checkers.txt	/*syntastic-java-checkstyle*
+syntastic-java-javac	syntastic-checkers.txt	/*syntastic-java-javac*
+syntastic-javascript-closurecompiler	syntastic-checkers.txt	/*syntastic-javascript-closurecompiler*
+syntastic-javascript-eslint	syntastic-checkers.txt	/*syntastic-javascript-eslint*
+syntastic-javascript-flow	syntastic-checkers.txt	/*syntastic-javascript-flow*
+syntastic-javascript-gjslint	syntastic-checkers.txt	/*syntastic-javascript-gjslint*
+syntastic-javascript-jscs	syntastic-checkers.txt	/*syntastic-javascript-jscs*
+syntastic-javascript-jshint	syntastic-checkers.txt	/*syntastic-javascript-jshint*
+syntastic-javascript-jsl	syntastic-checkers.txt	/*syntastic-javascript-jsl*
+syntastic-javascript-jslint	syntastic-checkers.txt	/*syntastic-javascript-jslint*
+syntastic-javascript-jsxhint	syntastic-checkers.txt	/*syntastic-javascript-jsxhint*
+syntastic-javascript-lynt	syntastic-checkers.txt	/*syntastic-javascript-lynt*
+syntastic-javascript-mixedindentlint	syntastic-checkers.txt	/*syntastic-javascript-mixedindentlint*
+syntastic-javascript-standard	syntastic-checkers.txt	/*syntastic-javascript-standard*
+syntastic-javascript-tern_lint	syntastic-checkers.txt	/*syntastic-javascript-tern_lint*
+syntastic-json-jsonlint	syntastic-checkers.txt	/*syntastic-json-jsonlint*
+syntastic-json-jsonval	syntastic-checkers.txt	/*syntastic-json-jsonval*
+syntastic-less-lessc	syntastic-checkers.txt	/*syntastic-less-lessc*
+syntastic-less-recess	syntastic-checkers.txt	/*syntastic-less-recess*
+syntastic-lex-flex	syntastic-checkers.txt	/*syntastic-lex-flex*
+syntastic-license	syntastic.txt	/*syntastic-license*
+syntastic-limbo-limbo	syntastic-checkers.txt	/*syntastic-limbo-limbo*
+syntastic-lisp-clisp	syntastic-checkers.txt	/*syntastic-lisp-clisp*
+syntastic-llvm-llvm	syntastic-checkers.txt	/*syntastic-llvm-llvm*
+syntastic-loclist-callback	syntastic.txt	/*syntastic-loclist-callback*
+syntastic-lua-luac	syntastic-checkers.txt	/*syntastic-lua-luac*
+syntastic-lua-luacheck	syntastic-checkers.txt	/*syntastic-lua-luacheck*
+syntastic-markdown-mdl	syntastic-checkers.txt	/*syntastic-markdown-mdl*
+syntastic-markdown-proselint	syntastic-checkers.txt	/*syntastic-markdown-proselint*
+syntastic-markdown-remark_lint	syntastic-checkers.txt	/*syntastic-markdown-remark_lint*
+syntastic-markdown-textlint	syntastic-checkers.txt	/*syntastic-markdown-textlint*
+syntastic-matlab-mlint	syntastic-checkers.txt	/*syntastic-matlab-mlint*
+syntastic-mercury-mmc	syntastic-checkers.txt	/*syntastic-mercury-mmc*
+syntastic-nasm-nasm	syntastic-checkers.txt	/*syntastic-nasm-nasm*
+syntastic-netrw	syntastic.txt	/*syntastic-netrw*
+syntastic-nix-nix	syntastic-checkers.txt	/*syntastic-nix-nix*
+syntastic-notes	syntastic.txt	/*syntastic-notes*
+syntastic-nroff-igor	syntastic-checkers.txt	/*syntastic-nroff-igor*
+syntastic-nroff-mandoc	syntastic-checkers.txt	/*syntastic-nroff-mandoc*
+syntastic-nroff-proselint	syntastic-checkers.txt	/*syntastic-nroff-proselint*
+syntastic-objc-gcc	syntastic-checkers.txt	/*syntastic-objc-gcc*
+syntastic-objc-oclint	syntastic-checkers.txt	/*syntastic-objc-oclint*
+syntastic-objcpp-gcc	syntastic-checkers.txt	/*syntastic-objcpp-gcc*
+syntastic-objcpp-oclint	syntastic-checkers.txt	/*syntastic-objcpp-oclint*
+syntastic-ocaml-camlp4o	syntastic-checkers.txt	/*syntastic-ocaml-camlp4o*
+syntastic-perl-perl	syntastic-checkers.txt	/*syntastic-perl-perl*
+syntastic-perl-perlcritic	syntastic-checkers.txt	/*syntastic-perl-perlcritic*
+syntastic-perl-podchecker	syntastic-checkers.txt	/*syntastic-perl-podchecker*
+syntastic-php-php	syntastic-checkers.txt	/*syntastic-php-php*
+syntastic-php-phpcs	syntastic-checkers.txt	/*syntastic-php-phpcs*
+syntastic-php-phplint	syntastic-checkers.txt	/*syntastic-php-phplint*
+syntastic-php-phpmd	syntastic-checkers.txt	/*syntastic-php-phpmd*
+syntastic-php-phpstan	syntastic-checkers.txt	/*syntastic-php-phpstan*
+syntastic-po-dennis	syntastic-checkers.txt	/*syntastic-po-dennis*
+syntastic-po-msgfmt	syntastic-checkers.txt	/*syntastic-po-msgfmt*
+syntastic-pod-podchecker	syntastic-checkers.txt	/*syntastic-pod-podchecker*
+syntastic-pod-proselint	syntastic-checkers.txt	/*syntastic-pod-proselint*
+syntastic-powerline	syntastic.txt	/*syntastic-powerline*
+syntastic-powershell	syntastic.txt	/*syntastic-powershell*
+syntastic-profiling	syntastic.txt	/*syntastic-profiling*
+syntastic-pug-pug_lint	syntastic-checkers.txt	/*syntastic-pug-pug_lint*
+syntastic-puppet-puppet	syntastic-checkers.txt	/*syntastic-puppet-puppet*
+syntastic-puppet-puppetlint	syntastic-checkers.txt	/*syntastic-puppet-puppetlint*
+syntastic-pymode	syntastic.txt	/*syntastic-pymode*
+syntastic-python-bandit	syntastic-checkers.txt	/*syntastic-python-bandit*
+syntastic-python-flake8	syntastic-checkers.txt	/*syntastic-python-flake8*
+syntastic-python-frosted	syntastic-checkers.txt	/*syntastic-python-frosted*
+syntastic-python-mypy	syntastic-checkers.txt	/*syntastic-python-mypy*
+syntastic-python-prospector	syntastic-checkers.txt	/*syntastic-python-prospector*
+syntastic-python-py3kwarn	syntastic-checkers.txt	/*syntastic-python-py3kwarn*
+syntastic-python-pycodestyle	syntastic-checkers.txt	/*syntastic-python-pycodestyle*
+syntastic-python-pydocstyle	syntastic-checkers.txt	/*syntastic-python-pydocstyle*
+syntastic-python-pyflakes	syntastic-checkers.txt	/*syntastic-python-pyflakes*
+syntastic-python-pylama	syntastic-checkers.txt	/*syntastic-python-pylama*
+syntastic-python-pylint	syntastic-checkers.txt	/*syntastic-python-pylint*
+syntastic-python-python	syntastic-checkers.txt	/*syntastic-python-python*
+syntastic-qml-qmllint	syntastic-checkers.txt	/*syntastic-qml-qmllint*
+syntastic-quickstart	syntastic.txt	/*syntastic-quickstart*
+syntastic-r-lintr	syntastic-checkers.txt	/*syntastic-r-lintr*
+syntastic-r-svtools	syntastic-checkers.txt	/*syntastic-r-svtools*
+syntastic-racket-code-ayatollah	syntastic-checkers.txt	/*syntastic-racket-code-ayatollah*
+syntastic-racket-racket	syntastic-checkers.txt	/*syntastic-racket-racket*
+syntastic-raku-raku	syntastic-checkers.txt	/*syntastic-raku-raku*
+syntastic-recommended	syntastic.txt	/*syntastic-recommended*
+syntastic-rmd-lintr	syntastic-checkers.txt	/*syntastic-rmd-lintr*
+syntastic-rnc-rnv	syntastic-checkers.txt	/*syntastic-rnc-rnv*
+syntastic-rst-proselint	syntastic-checkers.txt	/*syntastic-rst-proselint*
+syntastic-rst-rst2pseudoxml	syntastic-checkers.txt	/*syntastic-rst-rst2pseudoxml*
+syntastic-rst-rstcheck	syntastic-checkers.txt	/*syntastic-rst-rstcheck*
+syntastic-rst-sphinx	syntastic-checkers.txt	/*syntastic-rst-sphinx*
+syntastic-ruby-flog	syntastic-checkers.txt	/*syntastic-ruby-flog*
+syntastic-ruby-jruby	syntastic-checkers.txt	/*syntastic-ruby-jruby*
+syntastic-ruby-macruby	syntastic-checkers.txt	/*syntastic-ruby-macruby*
+syntastic-ruby-mri	syntastic-checkers.txt	/*syntastic-ruby-mri*
+syntastic-ruby-reek	syntastic-checkers.txt	/*syntastic-ruby-reek*
+syntastic-ruby-rubocop	syntastic-checkers.txt	/*syntastic-ruby-rubocop*
+syntastic-ruby-rubylint	syntastic-checkers.txt	/*syntastic-ruby-rubylint*
+syntastic-ruby-sorbet	syntastic-checkers.txt	/*syntastic-ruby-sorbet*
+syntastic-sass-sass	syntastic-checkers.txt	/*syntastic-sass-sass*
+syntastic-sass-sass_lint	syntastic-checkers.txt	/*syntastic-sass-sass_lint*
+syntastic-sass-sassc	syntastic-checkers.txt	/*syntastic-sass-sassc*
+syntastic-scala-fsc	syntastic-checkers.txt	/*syntastic-scala-fsc*
+syntastic-scala-scalac	syntastic-checkers.txt	/*syntastic-scala-scalac*
+syntastic-scala-scalastyle	syntastic-checkers.txt	/*syntastic-scala-scalastyle*
+syntastic-scss-mixedindentlint	syntastic-checkers.txt	/*syntastic-scss-mixedindentlint*
+syntastic-scss-sass	syntastic-checkers.txt	/*syntastic-scss-sass*
+syntastic-scss-sass_lint	syntastic-checkers.txt	/*syntastic-scss-sass_lint*
+syntastic-scss-sassc	syntastic-checkers.txt	/*syntastic-scss-sassc*
+syntastic-scss-scss_lint	syntastic-checkers.txt	/*syntastic-scss-scss_lint*
+syntastic-sessions	syntastic.txt	/*syntastic-sessions*
+syntastic-sh-bashate	syntastic-checkers.txt	/*syntastic-sh-bashate*
+syntastic-sh-checkbashisms	syntastic-checkers.txt	/*syntastic-sh-checkbashisms*
+syntastic-sh-sh	syntastic-checkers.txt	/*syntastic-sh-sh*
+syntastic-sh-shellcheck	syntastic-checkers.txt	/*syntastic-sh-shellcheck*
+syntastic-sh-shfmt	syntastic-checkers.txt	/*syntastic-sh-shfmt*
+syntastic-shellslash	syntastic.txt	/*syntastic-shellslash*
+syntastic-slim-slim_lint	syntastic-checkers.txt	/*syntastic-slim-slim_lint*
+syntastic-slim-slimrb	syntastic-checkers.txt	/*syntastic-slim-slimrb*
+syntastic-sml-smlnj	syntastic-checkers.txt	/*syntastic-sml-smlnj*
+syntastic-solidity-solc	syntastic-checkers.txt	/*syntastic-solidity-solc*
+syntastic-solidity-solhint	syntastic-checkers.txt	/*syntastic-solidity-solhint*
+syntastic-solidity-solium	syntastic-checkers.txt	/*syntastic-solidity-solium*
+syntastic-spec-rpmlint	syntastic-checkers.txt	/*syntastic-spec-rpmlint*
+syntastic-sql-sqlint	syntastic-checkers.txt	/*syntastic-sql-sqlint*
+syntastic-sql-tsqllint	syntastic-checkers.txt	/*syntastic-sql-tsqllint*
+syntastic-statusline-flag	syntastic.txt	/*syntastic-statusline-flag*
+syntastic-stylus-stylint	syntastic-checkers.txt	/*syntastic-stylus-stylint*
+syntastic-svg-validator	syntastic-checkers.txt	/*syntastic-svg-validator*
+syntastic-svg-w3	syntastic-checkers.txt	/*syntastic-svg-w3*
+syntastic-tcl-nagelfar	syntastic-checkers.txt	/*syntastic-tcl-nagelfar*
+syntastic-tex-chktex	syntastic-checkers.txt	/*syntastic-tex-chktex*
+syntastic-tex-lacheck	syntastic-checkers.txt	/*syntastic-tex-lacheck*
+syntastic-tex-proselint	syntastic-checkers.txt	/*syntastic-tex-proselint*
+syntastic-texinfo-makeinfo	syntastic-checkers.txt	/*syntastic-texinfo-makeinfo*
+syntastic-texinfo-proselint	syntastic-checkers.txt	/*syntastic-texinfo-proselint*
+syntastic-text-atdtool	syntastic-checkers.txt	/*syntastic-text-atdtool*
+syntastic-text-igor	syntastic-checkers.txt	/*syntastic-text-igor*
+syntastic-text-language_check	syntastic-checkers.txt	/*syntastic-text-language_check*
+syntastic-text-proselint	syntastic-checkers.txt	/*syntastic-text-proselint*
+syntastic-text-textlint	syntastic-checkers.txt	/*syntastic-text-textlint*
+syntastic-trig-rapper	syntastic-checkers.txt	/*syntastic-trig-rapper*
+syntastic-turtle-rapper	syntastic-checkers.txt	/*syntastic-turtle-rapper*
+syntastic-turtle-ttl	syntastic-checkers.txt	/*syntastic-turtle-ttl*
+syntastic-twig-twigcs	syntastic-checkers.txt	/*syntastic-twig-twigcs*
+syntastic-twig-twiglint	syntastic-checkers.txt	/*syntastic-twig-twiglint*
+syntastic-typescript-eslint	syntastic-checkers.txt	/*syntastic-typescript-eslint*
+syntastic-typescript-lynt	syntastic-checkers.txt	/*syntastic-typescript-lynt*
+syntastic-typescript-tslint	syntastic-checkers.txt	/*syntastic-typescript-tslint*
+syntastic-verilog-iverilog	syntastic-checkers.txt	/*syntastic-verilog-iverilog*
+syntastic-verilog-verilator	syntastic-checkers.txt	/*syntastic-verilog-verilator*
+syntastic-vhdl-ghdl	syntastic-checkers.txt	/*syntastic-vhdl-ghdl*
+syntastic-vhdl-vcom	syntastic-checkers.txt	/*syntastic-vhdl-vcom*
+syntastic-vim-auto-save	syntastic.txt	/*syntastic-vim-auto-save*
+syntastic-vim-go	syntastic.txt	/*syntastic-vim-go*
+syntastic-vim-vimlint	syntastic-checkers.txt	/*syntastic-vim-vimlint*
+syntastic-vim-vint	syntastic-checkers.txt	/*syntastic-vim-vint*
+syntastic-vim-virtualenv	syntastic.txt	/*syntastic-vim-virtualenv*
+syntastic-vue-eslint	syntastic-checkers.txt	/*syntastic-vue-eslint*
+syntastic-vue-pug_lint_vue	syntastic-checkers.txt	/*syntastic-vue-pug_lint_vue*
+syntastic-vue-stylelint	syntastic-checkers.txt	/*syntastic-vue-stylelint*
+syntastic-xhtml-jshint	syntastic-checkers.txt	/*syntastic-xhtml-jshint*
+syntastic-xhtml-proselint	syntastic-checkers.txt	/*syntastic-xhtml-proselint*
+syntastic-xhtml-tidy	syntastic-checkers.txt	/*syntastic-xhtml-tidy*
+syntastic-xhtml-validator	syntastic-checkers.txt	/*syntastic-xhtml-validator*
+syntastic-xhtml-w3	syntastic-checkers.txt	/*syntastic-xhtml-w3*
+syntastic-xml-plutil	syntastic-checkers.txt	/*syntastic-xml-plutil*
+syntastic-xml-xmllint	syntastic-checkers.txt	/*syntastic-xml-xmllint*
+syntastic-xquery-basex	syntastic-checkers.txt	/*syntastic-xquery-basex*
+syntastic-xslt-xmllint	syntastic-checkers.txt	/*syntastic-xslt-xmllint*
+syntastic-yacc-bison	syntastic-checkers.txt	/*syntastic-yacc-bison*
+syntastic-yaml-jsyaml	syntastic-checkers.txt	/*syntastic-yaml-jsyaml*
+syntastic-yaml-yamllint	syntastic-checkers.txt	/*syntastic-yaml-yamllint*
+syntastic-yaml-yamlxs	syntastic-checkers.txt	/*syntastic-yaml-yamlxs*
+syntastic-yang-pyang	syntastic-checkers.txt	/*syntastic-yang-pyang*
+syntastic-yara-yarac	syntastic-checkers.txt	/*syntastic-yara-yarac*
+syntastic-ycm	syntastic.txt	/*syntastic-ycm*
+syntastic-z80-z80syntaxchecker	syntastic-checkers.txt	/*syntastic-z80-z80syntaxchecker*
+syntastic-zpt-zptlint	syntastic-checkers.txt	/*syntastic-zpt-zptlint*
+syntastic-zsh	syntastic.txt	/*syntastic-zsh*
+syntastic-zsh-zsh	syntastic-checkers.txt	/*syntastic-zsh-zsh*
+syntastic.txt	syntastic.txt	/*syntastic.txt*

+ 798 - 0
vim/plugged/syntastic/plugin/syntastic.vim

@@ -0,0 +1,798 @@
+"============================================================================
+"File:        syntastic.vim
+"Description: Vim plugin for on the fly syntax checking.
+"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 exists('g:loaded_syntastic_plugin') || &compatible
+    finish
+endif
+let g:loaded_syntastic_plugin = 1
+
+if has('reltime')
+    let g:_SYNTASTIC_START = reltime()
+    lockvar! g:_SYNTASTIC_START
+endif
+
+let g:_SYNTASTIC_VERSION = '3.10.0-36'
+lockvar g:_SYNTASTIC_VERSION
+
+" Sanity checks {{{1
+
+if v:version < 700 || (v:version == 700 && !has('patch175'))
+    call syntastic#log#error('need Vim version 7.0.175 or later')
+    finish
+endif
+
+for s:feature in [
+            \ 'autocmd',
+            \ 'eval',
+            \ 'file_in_path',
+            \ 'modify_fname',
+            \ 'quickfix',
+            \ 'reltime',
+            \ 'statusline',
+            \ 'user_commands',
+        \ ]
+    if !has(s:feature)
+        call syntastic#log#error('need Vim compiled with feature ' . s:feature)
+        finish
+    endif
+endfor
+
+let s:_running_windows = syntastic#util#isRunningWindows()
+lockvar s:_running_windows
+
+if !exists('g:syntastic_shell')
+    let g:syntastic_shell = &shell
+endif
+
+if s:_running_windows
+    let g:_SYNTASTIC_UNAME = 'Windows'
+elseif executable('uname')
+    try
+        let g:_SYNTASTIC_UNAME = split(syntastic#util#system('uname'), "\n")[0]
+    catch /\m^E145$/
+        call syntastic#log#error("can't run in rvim")
+        finish
+    catch /\m^E484$/
+        call syntastic#log#error("can't run external programs (misconfigured shell options?)")
+        finish
+    catch /\m^E684$/
+        let g:_SYNTASTIC_UNAME = 'Unknown'
+    endtry
+else
+    let g:_SYNTASTIC_UNAME = 'Unknown'
+endif
+lockvar g:_SYNTASTIC_UNAME
+
+" XXX Ugly hack to make g:_SYNTASTIC_UNAME available to :SyntasticInfo without
+" polluting session namespaces
+let g:syntastic_version =
+    \ g:_SYNTASTIC_VERSION .
+    \ ' (Vim ' . v:version . (has('nvim') ? ', Neovim' : '') . ', ' .
+    \ g:_SYNTASTIC_UNAME .
+    \ (has('gui') ? ', GUI' : '') . ')'
+lockvar g:syntastic_version
+
+" }}}1
+
+" Defaults {{{1
+
+let g:_SYNTASTIC_DEFAULTS = {
+        \ 'aggregate_errors':         0,
+        \ 'always_populate_loc_list': 0,
+        \ 'auto_jump':                0,
+        \ 'auto_loc_list':            2,
+        \ 'check_on_open':            0,
+        \ 'check_on_wq':              1,
+        \ 'cursor_columns':           1,
+        \ 'debug':                    0,
+        \ 'echo_current_error':       1,
+        \ 'enable_balloons':          1,
+        \ 'enable_highlighting':      1,
+        \ 'enable_signs':             1,
+        \ 'error_symbol':             '>>',
+        \ 'exit_checks':              !(s:_running_windows && syntastic#util#var('shell', &shell) =~? '\m\<cmd\.exe$'),
+        \ 'filetype_map':             {},
+        \ 'full_redraws':             !(has('gui_running') || has('gui_macvim')),
+        \ 'id_checkers':              1,
+        \ 'ignore_extensions':        '\c\v^([gx]?z|lzma|bz2)$',
+        \ 'ignore_files':             [],
+        \ 'loc_list_height':          10,
+        \ 'nested_autocommands':      0,
+        \ 'quiet_messages':           {},
+        \ 'reuse_loc_lists':          1,
+        \ 'shell':                    &shell,
+        \ 'sort_aggregated_errors':   1,
+        \ 'stl_format':               '[Syntax: line:%F (%t)]',
+        \ 'style_error_symbol':       'S>',
+        \ 'style_warning_symbol':     'S>',
+        \ 'warning_symbol':           '>>'
+    \ }
+lockvar! g:_SYNTASTIC_DEFAULTS
+
+for s:key in keys(g:_SYNTASTIC_DEFAULTS)
+    if !exists('g:syntastic_' . s:key)
+        let g:syntastic_{s:key} = copy(g:_SYNTASTIC_DEFAULTS[s:key])
+    endif
+endfor
+
+if exists('g:syntastic_quiet_warnings')
+    call syntastic#log#oneTimeWarn("variable g:syntastic_quiet_warnings is deprecated, please use let g:syntastic_quiet_messages = {'level': 'warnings'} instead")
+    if g:syntastic_quiet_warnings
+        let s:quiet_warnings = get(g:syntastic_quiet_messages, 'type', [])
+        if type(s:quiet_warnings) != type([])
+            let s:quiet_warnings = [s:quiet_warnings]
+        endif
+        call add(s:quiet_warnings, 'warnings')
+        let g:syntastic_quiet_messages['type'] = s:quiet_warnings
+    endif
+endif
+
+" }}}1
+
+" Debug {{{1
+
+let g:_SYNTASTIC_SHELL_OPTIONS = [
+        \ 'shell',
+        \ 'shellcmdflag',
+        \ 'shellpipe',
+        \ 'shellquote',
+        \ 'shellredir',
+        \ 'shelltemp',
+        \ 'shellxquote'
+    \ ]
+for s:feature in [
+        \ 'autochdir',
+        \ 'shellslash',
+        \ 'shellxescape',
+    \ ]
+
+    if exists('+' . s:feature)
+        call add(g:_SYNTASTIC_SHELL_OPTIONS, s:feature)
+    endif
+endfor
+lockvar! g:_SYNTASTIC_SHELL_OPTIONS
+
+" debug constants
+let     g:_SYNTASTIC_DEBUG_TRACE         = 1
+lockvar g:_SYNTASTIC_DEBUG_TRACE
+let     g:_SYNTASTIC_DEBUG_LOCLIST       = 2
+lockvar g:_SYNTASTIC_DEBUG_LOCLIST
+let     g:_SYNTASTIC_DEBUG_NOTIFICATIONS = 4
+lockvar g:_SYNTASTIC_DEBUG_NOTIFICATIONS
+let     g:_SYNTASTIC_DEBUG_AUTOCOMMANDS  = 8
+lockvar g:_SYNTASTIC_DEBUG_AUTOCOMMANDS
+let     g:_SYNTASTIC_DEBUG_VARIABLES     = 16
+lockvar g:_SYNTASTIC_DEBUG_VARIABLES
+let     g:_SYNTASTIC_DEBUG_CHECKERS      = 32
+lockvar g:_SYNTASTIC_DEBUG_CHECKERS
+
+" }}}1
+
+runtime! plugin/syntastic/*.vim
+
+let s:registry = g:SyntasticRegistry.Instance()
+let s:notifiers = g:SyntasticNotifiers.Instance()
+let s:modemap = g:SyntasticModeMap.Instance()
+
+let s:_check_stack = []
+let s:_quit_pre = []
+
+" Commands {{{1
+
+" @vimlint(EVL103, 1, a:cursorPos)
+" @vimlint(EVL103, 1, a:cmdLine)
+" @vimlint(EVL103, 1, a:argLead)
+function! s:CompleteCheckerName(argLead, cmdLine, cursorPos) abort " {{{2
+    let names = []
+
+    let sep_idx = stridx(a:argLead, '/')
+    if sep_idx >= 1
+        let ft = a:argLead[: sep_idx-1]
+        call extend(names, map( s:registry.getNamesOfAvailableCheckers(ft), 'ft . "/" . v:val' ))
+    else
+        for ft in s:registry.resolveFiletypes(&filetype)
+            call extend(names, s:registry.getNamesOfAvailableCheckers(ft))
+        endfor
+        call extend(names, map( copy(s:registry.getKnownFiletypes()), 'v:val . "/"' ))
+    endif
+
+    return join(names, "\n")
+endfunction " }}}2
+" @vimlint(EVL103, 0, a:cursorPos)
+" @vimlint(EVL103, 0, a:cmdLine)
+" @vimlint(EVL103, 0, a:argLead)
+
+
+" @vimlint(EVL103, 1, a:cursorPos)
+" @vimlint(EVL103, 1, a:cmdLine)
+" @vimlint(EVL103, 1, a:argLead)
+function! s:CompleteFiletypes(argLead, cmdLine, cursorPos) abort " {{{2
+    return join(s:registry.getKnownFiletypes(), "\n")
+endfunction " }}}2
+" @vimlint(EVL103, 0, a:cursorPos)
+" @vimlint(EVL103, 0, a:cmdLine)
+" @vimlint(EVL103, 0, a:argLead)
+
+command! -bar -nargs=* -complete=custom,s:CompleteCheckerName SyntasticCheck call SyntasticCheck(<f-args>)
+command! -bar -nargs=? -complete=custom,s:CompleteFiletypes   SyntasticInfo  call SyntasticInfo(<f-args>)
+command! -bar Errors              call SyntasticErrors()
+command! -bar SyntasticReset      call SyntasticReset()
+command! -bar SyntasticToggleMode call SyntasticToggleMode()
+command! -bar SyntasticSetLoclist call SyntasticSetLoclist()
+
+command! SyntasticJavacEditClasspath runtime! syntax_checkers/java/*.vim | SyntasticJavacEditClasspath
+command! SyntasticJavacEditConfig    runtime! syntax_checkers/java/*.vim | SyntasticJavacEditConfig
+
+" }}}1
+
+" Public API {{{1
+
+function! SyntasticCheck(...) abort " {{{2
+    call s:UpdateErrors(bufnr(''), 0, a:000)
+    call syntastic#util#redraw(g:syntastic_full_redraws)
+endfunction " }}}2
+
+function! SyntasticInfo(...) abort " {{{2
+    call s:modemap.modeInfo(a:000)
+    call s:registry.echoInfoFor(a:000)
+    call s:_explain_skip(a:000)
+    call syntastic#log#debugShowOptions(g:_SYNTASTIC_DEBUG_TRACE, g:_SYNTASTIC_SHELL_OPTIONS)
+    call syntastic#log#debugDump(g:_SYNTASTIC_DEBUG_VARIABLES)
+endfunction " }}}2
+
+function! SyntasticErrors() abort " {{{2
+    call g:SyntasticLoclist.current().show()
+endfunction " }}}2
+
+function! SyntasticReset() abort " {{{2
+    call s:ClearCache(bufnr(''))
+    call s:notifiers.refresh(g:SyntasticLoclist.New([]))
+endfunction " }}}2
+
+function! SyntasticToggleMode() abort " {{{2
+    call s:modemap.toggleMode()
+    call s:ClearCache(bufnr(''))
+    call s:notifiers.refresh(g:SyntasticLoclist.New([]))
+    call s:modemap.echoMode()
+endfunction " }}}2
+
+function! SyntasticSetLoclist() abort " {{{2
+    call g:SyntasticLoclist.current().setloclist(0)
+endfunction " }}}2
+
+" }}}1
+
+" Autocommands {{{1
+
+augroup syntastic
+    autocmd!
+    autocmd VimEnter    * call s:VimEnterHook()
+    autocmd BufEnter    * call s:BufEnterHook(expand('<afile>', 1))
+    autocmd BufWinEnter * call s:BufWinEnterHook(expand('<afile>', 1))
+augroup END
+
+if g:syntastic_nested_autocommands
+    augroup syntastic
+        autocmd BufReadPost  * nested call s:BufReadPostHook(expand('<afile>', 1))
+        autocmd BufWritePost * nested call s:BufWritePostHook(expand('<afile>', 1))
+    augroup END
+else
+    augroup syntastic
+        autocmd BufReadPost  * call s:BufReadPostHook(expand('<afile>', 1))
+        autocmd BufWritePost * call s:BufWritePostHook(expand('<afile>', 1))
+    augroup END
+endif
+
+if exists('##QuitPre')
+    " QuitPre was added in Vim 7.3.544
+    augroup syntastic
+        autocmd QuitPre * call s:QuitPreHook(expand('<afile>', 1))
+    augroup END
+endif
+
+function! s:BufReadPostHook(fname) abort " {{{2
+    let buf = syntastic#util#fname2buf(a:fname)
+    if g:syntastic_check_on_open && buf > 0
+        call syntastic#log#debug(g:_SYNTASTIC_DEBUG_AUTOCOMMANDS,
+            \ 'autocmd: BufReadPost, buffer ' . buf . ' = ' . string(a:fname))
+        if index(s:_check_stack, buf) == -1
+            call add(s:_check_stack, buf)
+        endif
+    endif
+endfunction " }}}2
+
+function! s:BufWritePostHook(fname) abort " {{{2
+    let buf = syntastic#util#fname2buf(a:fname)
+    call syntastic#log#debug(g:_SYNTASTIC_DEBUG_AUTOCOMMANDS,
+        \ 'autocmd: BufWritePost, buffer ' . buf . ' = ' . string(a:fname))
+    call s:UpdateErrors(buf, 1, [])
+endfunction " }}}2
+
+function! s:BufEnterHook(fname) abort " {{{2
+    let buf = syntastic#util#fname2buf(a:fname)
+    call syntastic#log#debug(g:_SYNTASTIC_DEBUG_AUTOCOMMANDS,
+        \ 'autocmd: BufEnter, buffer ' . buf . ' = ' . string(a:fname) . ', &buftype = ' . string(&buftype))
+    if buf > 0 && getbufvar(buf, '&buftype') ==# ''
+        let idx = index(reverse(copy(s:_check_stack)), buf)
+        if idx >= 0
+            if !has('vim_starting')
+                call remove(s:_check_stack, -idx - 1)
+                call s:UpdateErrors(buf, 1, [])
+            endif
+        elseif &buftype ==# ''
+            call s:notifiers.refresh(g:SyntasticLoclist.current())
+        endif
+    elseif &buftype ==# 'quickfix'
+        " TODO: this is needed because in recent versions of Vim lclose
+        " can no longer be called from BufWinLeave
+        " TODO: at this point there is no b:syntastic_loclist
+        let loclist = filter(copy(getloclist(0)), 'v:val["valid"]')
+        let owner = str2nr(getbufvar(buf, 'syntastic_owner_buffer'))
+        let buffers = syntastic#util#unique(map(loclist, 'v:val["bufnr"]') + (owner ? [owner] : []))
+        if !empty(get(w:, 'syntastic_loclist_set', [])) && !empty(loclist) && empty(filter( buffers, 'syntastic#util#bufIsActive(v:val)' ))
+            call SyntasticLoclistHide()
+        endif
+    endif
+endfunction " }}}2
+
+function! s:BufWinEnterHook(fname) abort " {{{2
+    let buf = syntastic#util#fname2buf(a:fname)
+    call syntastic#log#debug(g:_SYNTASTIC_DEBUG_AUTOCOMMANDS,
+        \ 'autocmd: BufWinEnter, buffer ' . buf . ' = ' . string(a:fname) . ', &buftype = ' . string(&buftype))
+    if buf > 0 && getbufvar(buf, '&buftype') ==# ''
+        let idx = index(reverse(copy(s:_check_stack)), buf)
+        if idx >= 0 && !has('vim_starting')
+            call remove(s:_check_stack, -idx - 1)
+            call s:UpdateErrors(buf, 1, [])
+        endif
+    endif
+endfunction " }}}2
+
+function! s:VimEnterHook() abort " {{{2
+    let buf = bufnr('')
+    call syntastic#log#debug(g:_SYNTASTIC_DEBUG_AUTOCOMMANDS,
+        \ 'autocmd: VimEnter, buffer ' . buf . ' = ' . string(bufname(buf)) . ', &buftype = ' . string(&buftype))
+    let idx = index(reverse(copy(s:_check_stack)), buf)
+    if idx >= 0 && getbufvar(buf, '&buftype') ==# ''
+        call remove(s:_check_stack, -idx - 1)
+        call s:UpdateErrors(buf, 1, [])
+    endif
+endfunction " }}}2
+
+function! s:QuitPreHook(fname) abort " {{{2
+    let buf = syntastic#util#fname2buf(a:fname)
+    call syntastic#log#debug(g:_SYNTASTIC_DEBUG_AUTOCOMMANDS, 'autocmd: QuitPre, buffer ' . buf . ' = ' . string(a:fname))
+
+    if !syntastic#util#var('check_on_wq')
+        call syntastic#util#setWids()
+        call add(s:_quit_pre, buf . '_' . getbufvar(buf, 'changetick') . '_' . w:syntastic_wid)
+    endif
+
+    if !empty(get(w:, 'syntastic_loclist_set', []))
+        call SyntasticLoclistHide()
+    endif
+endfunction " }}}2
+
+" }}}1
+
+" Main {{{1
+
+"refresh and redraw all the error info for this buf when saving or reading
+function! s:UpdateErrors(buf, auto_invoked, checker_names) abort " {{{2
+    call syntastic#log#debugShowVariables(g:_SYNTASTIC_DEBUG_TRACE, 'version')
+    call syntastic#log#debugShowOptions(g:_SYNTASTIC_DEBUG_TRACE, g:_SYNTASTIC_SHELL_OPTIONS)
+    call syntastic#log#debugDump(g:_SYNTASTIC_DEBUG_VARIABLES)
+    call syntastic#log#debug(g:_SYNTASTIC_DEBUG_TRACE, 'UpdateErrors' . (a:auto_invoked ? ' (auto)' : '') .
+        \ ': ' . (len(a:checker_names) ? join(a:checker_names) : 'default checkers'))
+
+    call s:modemap.synch()
+
+    if s:_skip_file(a:buf)
+        return
+    endif
+
+    let run_checks = !a:auto_invoked || s:modemap.doAutoChecking(a:buf)
+    if run_checks
+        call s:CacheErrors(a:buf, a:checker_names)
+        call syntastic#util#setLastTick(a:buf)
+    elseif a:auto_invoked
+        return
+    endif
+
+    let loclist = g:SyntasticLoclist.current(a:buf)
+
+    if exists('*SyntasticCheckHook')
+        call SyntasticCheckHook(loclist.getRaw())
+    endif
+
+    " populate loclist and jump {{{3
+    let do_jump = syntastic#util#var('auto_jump') + 0
+    if do_jump == 2
+        let do_jump = loclist.getFirstError(1)
+    elseif do_jump == 3
+        let do_jump = loclist.getFirstError()
+    elseif 0 > do_jump || do_jump > 3
+        let do_jump = 0
+    endif
+
+    if syntastic#util#var('always_populate_loc_list') || do_jump
+        call loclist.setloclist(1)
+        if run_checks && do_jump && !loclist.isEmpty()
+            call syntastic#log#debug(g:_SYNTASTIC_DEBUG_NOTIFICATIONS, 'loclist: jump')
+            execute 'silent! lrewind ' . do_jump
+
+            " XXX: Vim doesn't call autocmd commands in a predictible
+            " order, which can lead to missing filetype when jumping
+            " to a new file; the following is a workaround for the
+            " resulting brain damage
+            if &filetype ==# ''
+                silent! filetype detect
+            endif
+        endif
+    endif
+    " }}}3
+
+    call s:notifiers.refresh(loclist)
+endfunction " }}}2
+
+"clear the loc list for the buffer
+function! s:ClearCache(buf) abort " {{{2
+    let loclist = g:SyntasticLoclist.current(a:buf)
+    call s:notifiers.reset(loclist)
+    call loclist.destroy()
+endfunction " }}}2
+
+"detect and cache all syntax errors in this buffer
+function! s:CacheErrors(buf, checker_names) abort " {{{2
+    call syntastic#log#debug(g:_SYNTASTIC_DEBUG_TRACE, 'CacheErrors: ' .
+        \ (len(a:checker_names) ? join(a:checker_names) : 'default checkers'))
+    call s:ClearCache(a:buf)
+    let newLoclist = g:SyntasticLoclist.New([])
+    call newLoclist.setOwner(a:buf)
+
+    if !s:_skip_file(a:buf)
+        " debug logging {{{3
+        call syntastic#log#debugShowVariables(g:_SYNTASTIC_DEBUG_TRACE, 'aggregate_errors')
+        if syntastic#util#isRunningWindows()
+            call syntastic#log#debug(g:_SYNTASTIC_DEBUG_CHECKERS, '$TMP = ' . string($TMP) . ', $TEMP = ' . string($TEMP))
+        else
+            call syntastic#log#debug(g:_SYNTASTIC_DEBUG_CHECKERS, '$TERM = ' . string($TERM))
+            call syntastic#log#debug(g:_SYNTASTIC_DEBUG_CHECKERS, '$TMPDIR = ' . string($TMPDIR))
+        endif
+        call syntastic#log#debug(g:_SYNTASTIC_DEBUG_CHECKERS, '$PATH = ' . string($PATH))
+        call syntastic#log#debug(g:_SYNTASTIC_DEBUG_TRACE, 'getcwd() = ' . string(getcwd()))
+        " }}}3
+
+        let clist = s:registry.getCheckers(getbufvar(a:buf, '&filetype'), a:checker_names)
+
+        let aggregate_errors =
+            \ syntastic#util#var('aggregate_errors') || len(syntastic#util#unique(map(copy(clist), 'v:val.getFiletype()'))) > 1
+        let decorate_errors = aggregate_errors && syntastic#util#var('id_checkers')
+        let sort_aggregated_errors = aggregate_errors && syntastic#util#var('sort_aggregated_errors')
+
+        let names = []
+        let unavailable_checkers = 0
+        for checker in clist
+            let cname = checker.getCName()
+            if !checker.isAvailable()
+                call syntastic#log#debug(g:_SYNTASTIC_DEBUG_TRACE, 'CacheErrors: Checker ' . cname . ' is not available')
+                let unavailable_checkers += 1
+                continue
+            endif
+
+            call syntastic#log#debug(g:_SYNTASTIC_DEBUG_TRACE, 'CacheErrors: Invoking checker: ' . cname)
+
+            let loclist = checker.getLocList()
+
+            if !loclist.isEmpty()
+                if decorate_errors
+                    call loclist.decorate(cname)
+                endif
+                call add(names, cname)
+                if checker.wantSort() && !sort_aggregated_errors
+                    call loclist.sort()
+                    call syntastic#log#debug(g:_SYNTASTIC_DEBUG_LOCLIST, 'sorted:', loclist)
+                endif
+
+                call newLoclist.extend(loclist)
+
+                if !aggregate_errors
+                    break
+                endif
+            endif
+        endfor
+
+        " set names {{{3
+        if !empty(names)
+            if len(syntastic#util#unique(map( copy(names), 'substitute(v:val, "\\m/.*", "", "")' ))) == 1
+                let type = substitute(names[0], '\m/.*', '', '')
+                let name = join(map( names, 'substitute(v:val, "\\m.\\{-}/", "", "")' ), ', ')
+                call newLoclist.setName( name . ' ('. type . ')' )
+            else
+                " checkers from mixed types
+                call newLoclist.setName(join(names, ', '))
+            endif
+        endif
+        " }}}3
+
+        " issue warning about no active checkers {{{3
+        if len(clist) == unavailable_checkers
+            if !empty(a:checker_names)
+                if len(a:checker_names) == 1
+                    call syntastic#log#warn('checker ' . a:checker_names[0] . ' is not available')
+                else
+                    call syntastic#log#warn('checkers ' . join(a:checker_names, ', ') . ' are not available')
+                endif
+            else
+                call syntastic#log#debug(g:_SYNTASTIC_DEBUG_TRACE, 'CacheErrors: no checkers available for ' . &filetype)
+            endif
+        endif
+        " }}}3
+
+        call syntastic#log#debug(g:_SYNTASTIC_DEBUG_LOCLIST, 'aggregated:', newLoclist)
+        if sort_aggregated_errors
+            call newLoclist.sort()
+            call syntastic#log#debug(g:_SYNTASTIC_DEBUG_LOCLIST, 'sorted:', newLoclist)
+        endif
+    endif
+
+    call newLoclist.deploy()
+endfunction " }}}2
+
+"Emulates the :lmake command. Sets up the make environment according to the
+"options given, runs make, resets the environment, returns the location list
+"
+"a:options can contain the following keys:
+"    'makeprg'
+"    'errorformat'
+"
+"The corresponding options are set for the duration of the function call. They
+"are set with :let, so dont escape spaces.
+"
+"a:options may also contain:
+"   'defaults' - a dict containing default values for the returned errors
+"   'subtype' - all errors will be assigned the given subtype
+"   'preprocess' - a function to be applied to the error file before parsing errors
+"   'postprocess' - a list of functions to be applied to the error list
+"   'cwd' - change directory to the given path before running the checker
+"   'env' - environment variables to set before running the checker
+"   'returns' - a list of valid exit codes for the checker
+" @vimlint(EVL102, 1, l:env_save)
+function! SyntasticMake(options) abort " {{{2
+    call syntastic#log#debug(g:_SYNTASTIC_DEBUG_TRACE, 'SyntasticMake: called with options:', a:options)
+
+    " save options and locale env variables {{{3
+    let old_local_errorformat = &l:errorformat
+    let old_errorformat = &errorformat
+    let old_cwd = getcwd()
+    " }}}3
+
+    if has_key(a:options, 'errorformat')
+        let &errorformat = a:options['errorformat']
+        set errorformat<
+    endif
+
+    if has_key(a:options, 'cwd')
+        execute 'lcd ' . fnameescape(a:options['cwd'])
+    endif
+
+    " set environment variables {{{3
+    let env_save = {}
+    if has_key(a:options, 'env') && len(a:options['env'])
+        for key in keys(a:options['env'])
+            if key =~? '\m^[a-z_][a-z0-9_]*$'
+                execute 'let env_save[' . string(key) . '] = $' . key
+                execute 'let $' . key . ' = ' . string(a:options['env'][key])
+            endif
+        endfor
+    endif
+    " }}}3
+
+    let err_lines = split(syntastic#util#system(a:options['makeprg']), "\n", 1)
+
+    " restore environment variables {{{3
+    if len(env_save)
+        for key in keys(env_save)
+            execute 'let $' . key . ' = ' . string(env_save[key])
+        endfor
+    endif
+    " }}}3
+
+    call syntastic#log#debug(g:_SYNTASTIC_DEBUG_LOCLIST, 'checker output:', err_lines)
+
+    " Does it still make sense to go on?
+    let bailout =
+        \ syntastic#util#var('exit_checks') &&
+        \ has_key(a:options, 'returns') &&
+        \ index(a:options['returns'], v:shell_error) == -1
+
+    if !bailout
+        if has_key(a:options, 'Preprocess')
+            let err_lines = call(a:options['Preprocess'], [err_lines])
+            call syntastic#log#debug(g:_SYNTASTIC_DEBUG_LOCLIST, 'preprocess (external):', err_lines)
+        elseif has_key(a:options, 'preprocess')
+            let err_lines = call('syntastic#preprocess#' . a:options['preprocess'], [err_lines])
+            call syntastic#log#debug(g:_SYNTASTIC_DEBUG_LOCLIST, 'preprocess:', err_lines)
+        endif
+        noautocmd lgetexpr err_lines
+
+        let errors = deepcopy(getloclist(0))
+
+        if has_key(a:options, 'cwd')
+            execute 'lcd ' . fnameescape(old_cwd)
+        endif
+
+        try
+            silent lolder
+        catch /\m^Vim\%((\a\+)\)\=:E380/
+            " E380: At bottom of quickfix stack
+            call setloclist(0, [], 'r')
+            try
+                " Vim 7.4.2200 or later
+                call setloclist(0, [], 'r', { 'title': '' })
+            catch /\m^Vim\%((\a\+)\)\=:E\%(118\|731\)/
+                " do nothing
+            endtry
+        catch /\m^Vim\%((\a\+)\)\=:E776/
+            " E776: No location list
+            " do nothing
+        endtry
+    else
+        let errors = []
+    endif
+
+    " restore options {{{3
+    let &errorformat = old_errorformat
+    let &l:errorformat = old_local_errorformat
+    " }}}3
+
+    if !s:_running_windows && (s:_os_name() =~? 'FreeBSD' || s:_os_name() =~? 'OpenBSD')
+        call syntastic#util#redraw(g:syntastic_full_redraws)
+    endif
+
+    if bailout
+        call syntastic#log#ndebug(g:_SYNTASTIC_DEBUG_LOCLIST, 'checker output:', err_lines)
+        throw 'Syntastic: checker error'
+    endif
+
+    call syntastic#log#debug(g:_SYNTASTIC_DEBUG_LOCLIST, 'raw loclist:', errors)
+
+    if has_key(a:options, 'defaults')
+        call s:_add_to_errors(errors, a:options['defaults'])
+    endif
+
+    " Add subtype info if present.
+    if has_key(a:options, 'subtype')
+        call s:_add_to_errors(errors, { 'subtype': a:options['subtype'] })
+    endif
+
+    if has_key(a:options, 'Postprocess') && !empty(a:options['Postprocess'])
+        for rule in a:options['Postprocess']
+            let errors = call(rule, [errors])
+        endfor
+        call syntastic#log#debug(g:_SYNTASTIC_DEBUG_LOCLIST, 'postprocess (external):', errors)
+    elseif has_key(a:options, 'postprocess') && !empty(a:options['postprocess'])
+        for rule in a:options['postprocess']
+            let errors = call('syntastic#postprocess#' . rule, [errors])
+        endfor
+        call syntastic#log#debug(g:_SYNTASTIC_DEBUG_LOCLIST, 'postprocess:', errors)
+    endif
+
+    return errors
+endfunction " }}}2
+" @vimlint(EVL102, 0, l:env_save)
+
+"return a string representing the state of buffer according to
+"g:syntastic_stl_format
+"
+"return '' if no errors are cached for the buffer
+function! SyntasticStatuslineFlag() abort " {{{2
+    return g:SyntasticLoclist.current().getStatuslineFlag()
+endfunction " }}}2
+
+" }}}1
+
+" Utilities {{{1
+
+function! s:_ignore_file(filename) abort " {{{2
+    let fname = fnamemodify(a:filename, ':p')
+    for pattern in g:syntastic_ignore_files
+        if fname =~# pattern
+            return 1
+        endif
+    endfor
+    return 0
+endfunction " }}}2
+
+function! s:_is_quitting(buf) abort " {{{2
+    let quitting = 0
+    if exists('w:syntastic_wid')
+        let key = a:buf . '_' . getbufvar(a:buf, 'changetick') . '_' . w:syntastic_wid
+        let idx = index(s:_quit_pre, key)
+        if idx >= 0
+            call remove(s:_quit_pre, idx)
+            let quitting = 1
+        endif
+    endif
+
+    return quitting
+endfunction " }}}2
+
+" Skip running in special buffers
+function! s:_skip_file(buf) abort " {{{2
+    let fname = bufname(a:buf)
+    let skip = s:_is_quitting(a:buf) || getbufvar(a:buf, 'syntastic_skip_checks') ||
+        \ (getbufvar(a:buf, '&buftype') !=# '') || !filereadable(fname) || getwinvar(0, '&diff') ||
+        \ getwinvar(0, '&previewwindow') || s:_ignore_file(fname) ||
+        \ fnamemodify(fname, ':e') =~? g:syntastic_ignore_extensions
+    if skip
+        call syntastic#log#debug(g:_SYNTASTIC_DEBUG_TRACE, '_skip_file: skipping checks')
+    endif
+    return skip
+endfunction " }}}2
+
+" Explain why checks will be skipped for the current file
+function! s:_explain_skip(filetypes) abort " {{{2
+    let buf = bufnr('')
+    if empty(a:filetypes) && s:_skip_file(buf)
+        let why = []
+        let fname = bufname(buf)
+        let bt = getbufvar(buf, '&buftype')
+
+        if s:_is_quitting(buf)
+            call add(why, 'quitting buffer')
+        endif
+        if getbufvar(buf, 'syntastic_skip_checks')
+            call add(why, 'b:syntastic_skip_checks set')
+        endif
+        if bt !=# ''
+            call add(why, 'buftype = ' . string(&buftype))
+        endif
+        if !filereadable(fname)
+            call add(why, 'file not readable / not local')
+        endif
+        if getwinvar(0, '&diff')
+            call add(why, 'diff mode')
+        endif
+        if getwinvar(0, '&previewwindow')
+            call add(why, 'preview window')
+        endif
+        if s:_ignore_file(fname)
+            call add(why, 'filename matching g:syntastic_ignore_files')
+        endif
+        if fnamemodify(fname, ':e') =~? g:syntastic_ignore_extensions
+            call add(why, 'extension matching g:syntastic_ignore_extensions')
+        endif
+
+        echomsg 'The current file will not be checked (' . join(why, ', ') . ')'
+    endif
+endfunction " }}}2
+
+" Take a list of errors and add default values to them from a:options
+function! s:_add_to_errors(errors, options) abort " {{{2
+    for err in a:errors
+        for key in keys(a:options)
+            if !has_key(err, key) || empty(err[key])
+                let err[key] = a:options[key]
+            endif
+        endfor
+    endfor
+
+    return a:errors
+endfunction " }}}2
+
+function! s:_os_name() abort " {{{2
+    return g:_SYNTASTIC_UNAME
+endfunction " }}}2
+
+" }}}1
+
+" vim: set sw=4 sts=4 et fdm=marker:

+ 55 - 0
vim/plugged/syntastic/plugin/syntastic/autoloclist.vim

@@ -0,0 +1,55 @@
+if exists('g:loaded_syntastic_notifier_autoloclist') || !exists('g:loaded_syntastic_plugin')
+    finish
+endif
+let g:loaded_syntastic_notifier_autoloclist = 1
+
+let g:SyntasticAutoloclistNotifier = {}
+
+" Public methods {{{1
+"
+function! g:SyntasticAutoloclistNotifier.New() abort " {{{2
+    let newObj = copy(self)
+    return newObj
+endfunction " }}}2
+
+function! g:SyntasticAutoloclistNotifier.refresh(loclist) abort " {{{2
+    call syntastic#log#debug(g:_SYNTASTIC_DEBUG_NOTIFICATIONS, 'autoloclist: refresh')
+    call g:SyntasticAutoloclistNotifier.AutoToggle(a:loclist)
+endfunction " }}}2
+
+function! g:SyntasticAutoloclistNotifier.AutoToggle(loclist) abort " {{{2
+    call syntastic#log#debug(g:_SYNTASTIC_DEBUG_NOTIFICATIONS, 'autoloclist: toggle')
+    let auto_loc_list = syntastic#util#var('auto_loc_list')
+    if !a:loclist.isEmpty()
+        if auto_loc_list == 1 || auto_loc_list == 3
+            call a:loclist.show()
+        endif
+    else
+        if (auto_loc_list == 1 || auto_loc_list == 2) && !empty(get(w:, 'syntastic_loclist_set', []))
+            try
+                " Vim 7.4.2200 or later
+                let title = get(getloclist(0, { 'title': 1 }), 'title', ':SyntasticCheck ')
+            catch /\m^Vim\%((\a\+)\)\=:E\%(118\|731\)/
+                let title = ':SyntasticCheck '
+            endtry
+
+            if strpart(title, 0, 16) ==# ':SyntasticCheck '
+                " TODO: this will close the loc list window if one was opened
+                " by something other than syntastic
+                call SyntasticLoclistHide()
+
+                try
+                    " Vim 7.4.2200 or later
+                    call setloclist(0, [], 'r', { 'title': '' })
+                catch /\m^Vim\%((\a\+)\)\=:E\%(118\|731\)/
+                    " do nothing
+                endtry
+                let w:syntastic_loclist_set = []
+            endif
+        endif
+    endif
+endfunction " }}}2
+
+" }}}1
+
+" vim: set sw=4 sts=4 et fdm=marker:

+ 58 - 0
vim/plugged/syntastic/plugin/syntastic/balloons.vim

@@ -0,0 +1,58 @@
+if exists('g:loaded_syntastic_notifier_balloons') || !exists('g:loaded_syntastic_plugin')
+    finish
+endif
+let g:loaded_syntastic_notifier_balloons = 1
+
+if !has('balloon_eval')
+    let g:syntastic_enable_balloons = 0
+endif
+
+let g:SyntasticBalloonsNotifier = {}
+
+" Public methods {{{1
+
+function! g:SyntasticBalloonsNotifier.New() abort " {{{2
+    let newObj = copy(self)
+    return newObj
+endfunction " }}}2
+
+function! g:SyntasticBalloonsNotifier.enabled() abort " {{{2
+    return has('balloon_eval') && syntastic#util#var('enable_balloons')
+endfunction " }}}2
+
+" Update the error balloons
+function! g:SyntasticBalloonsNotifier.refresh(loclist) abort " {{{2
+    unlet! b:syntastic_private_balloons
+    if self.enabled() && !a:loclist.isEmpty()
+        let b:syntastic_private_balloons = a:loclist.balloons()
+        if !empty(b:syntastic_private_balloons)
+            set ballooneval balloonexpr=SyntasticBalloonsExprNotifier()
+        endif
+    endif
+endfunction " }}}2
+
+" Reset the error balloons
+" @vimlint(EVL103, 1, a:loclist)
+function! g:SyntasticBalloonsNotifier.reset(loclist) abort " {{{2
+    if has('balloon_eval') && !empty(get(b:, 'syntastic_private_balloons', {}))
+        call syntastic#log#debug(g:_SYNTASTIC_DEBUG_NOTIFICATIONS, 'balloons: reset')
+        set noballooneval
+    endif
+    unlet! b:syntastic_private_balloons
+endfunction " }}}2
+" @vimlint(EVL103, 0, a:loclist)
+
+" }}}1
+
+" Private functions {{{1
+
+function! SyntasticBalloonsExprNotifier() abort " {{{2
+    if !exists('b:syntastic_private_balloons')
+        return ''
+    endif
+    return get(b:syntastic_private_balloons, v:beval_lnum, '')
+endfunction " }}}2
+
+" }}}1
+
+" vim: set sw=4 sts=4 et fdm=marker:

+ 282 - 0
vim/plugged/syntastic/plugin/syntastic/checker.vim

@@ -0,0 +1,282 @@
+if exists('g:loaded_syntastic_checker') || !exists('g:loaded_syntastic_plugin')
+    finish
+endif
+let g:loaded_syntastic_checker = 1
+
+let g:SyntasticChecker = {}
+
+" Public methods {{{1
+
+function! g:SyntasticChecker.New(args, ...) abort " {{{2
+    let newObj = copy(self)
+
+    let newObj._filetype = a:args['filetype']
+    let newObj._name = a:args['name']
+
+    if a:0
+        " redirected checker
+        let newObj._exec_default = get(a:args, 'exec', a:1['_exec_default'])
+
+        let filetype = a:1['_filetype']
+        let name = a:1['_name']
+        let prefix = 'SyntaxCheckers_' . filetype . '_' . name . '_'
+
+        if exists('g:syntastic_' . filetype . '_' . name . '_sort') && !exists('g:syntastic_' . newObj._filetype . '_' . newObj._name . '_sort')
+            let g:syntastic_{newObj._filetype}_{newObj._name}_sort = g:syntastic_{filetype}_{name}_sort
+        endif
+
+        if has_key(a:args, 'enable')
+            let newObj._enable = a:args['enable']
+        elseif has_key(a:1, '_enable')
+            let newObj._enable = a:1['_enable']
+        endif
+    else
+        let newObj._exec_default = get(a:args, 'exec', newObj._name)
+        if newObj._exec_default ==# ''
+            let newObj._exec_default = '<dummy>'
+        endif
+        let prefix = 'SyntaxCheckers_' . newObj._filetype . '_' . newObj._name . '_'
+
+        if has_key(a:args, 'enable')
+            let newObj._enable = a:args['enable']
+        endif
+    endif
+
+    let newObj._locListFunc = function(prefix . 'GetLocList')
+
+    if exists('*' . prefix . 'IsAvailable')
+        let newObj._isAvailableFunc = function(prefix . 'IsAvailable')
+    else
+        let newObj._isAvailableFunc = function('s:_isAvailableDefault')
+    endif
+
+    if exists('*' . prefix . 'GetHighlightRegex')
+        let newObj._highlightRegexFunc = function(prefix . 'GetHighlightRegex')
+    endif
+
+    return newObj
+endfunction " }}}2
+
+function! g:SyntasticChecker.getFiletype() abort " {{{2
+    return self._filetype
+endfunction " }}}2
+
+function! g:SyntasticChecker.getName() abort " {{{2
+    return self._name
+endfunction " }}}2
+
+function! g:SyntasticChecker.getCName() abort " {{{2
+    return self._filetype . '/' . self._name
+endfunction " }}}2
+
+" Synchronise _exec with user's setting.  Force re-validation if needed.
+"
+" XXX: This function must be called at least once before calling either
+" getExec() or getExecEscaped().  Normally isAvailable() does that for you
+" automatically, but you should keep still this in mind if you change the
+" current checker workflow.
+function! g:SyntasticChecker.syncExec(...) abort " {{{2
+    if a:0
+        let self._exec = a:1
+    else
+        let suffix = self._name . '_exec'
+        let self._exec = expand(
+            \ syntastic#util#var(self._filetype . '_' . suffix,
+            \ syntastic#util#var(suffix, self._exec_default)), 1 )
+    endif
+endfunction " }}}2
+
+function! g:SyntasticChecker.getExec() abort " {{{2
+    return self._exec
+endfunction " }}}2
+
+function! g:SyntasticChecker.getExecEscaped() abort " {{{2
+    return syntastic#util#shescape(self._exec)
+endfunction " }}}2
+
+function! g:SyntasticChecker.getLocListRaw() abort " {{{2
+    let checker_start = reltime()
+    let name = self.getCName()
+
+    if has_key(self, '_enable')
+        let status = syntastic#util#var(self._enable, -1)
+        if type(status) != type(0)
+            call syntastic#log#error('checker ' . name . ': invalid value ' . strtrans(string(status)) .
+                \ ' for g:syntastic_' . self._enable . '; try 0 or 1 instead')
+            return []
+        endif
+        if status < 0
+            call syntastic#log#error('checker ' . name . ': checks disabled for security reasons; ' .
+                \ 'set g:syntastic_' . self._enable . ' to 1 to override')
+        endif
+        if status <= 0
+            call syntastic#log#debug(g:_SYNTASTIC_DEBUG_TRACE, 'getLocList: checker ' . name . ' enabled but not forced')
+            return []
+        else
+            call syntastic#log#debug(g:_SYNTASTIC_DEBUG_TRACE, 'getLocList: checker ' . name . ' forced')
+        endif
+    endif
+
+    try
+        let list = self._locListFunc()
+        if self._exec !=# ''
+            call syntastic#log#debug(g:_SYNTASTIC_DEBUG_TRACE, 'getLocList: checker ' . name . ' returned ' . v:shell_error)
+        endif
+    catch /\m\C^Syntastic: checker error$/
+        let list = []
+        if self._exec !=# ''
+            call syntastic#log#error('checker ' . name . ' returned abnormal status ' . v:shell_error)
+        else
+            call syntastic#log#error('checker ' . name . ' aborted')
+        endif
+    endtry
+    call self._populateHighlightRegexes(list)
+    call syntastic#log#debug(g:_SYNTASTIC_DEBUG_LOCLIST, name . ' raw:', list)
+    call self._quietMessages(list)
+    call syntastic#log#debug(g:_SYNTASTIC_DEBUG_TRACE,
+        \ 'getLocList: checker ' . name . ' run in ' . split(reltimestr(reltime(checker_start)))[0] . 's')
+    return list
+endfunction " }}}2
+
+function! g:SyntasticChecker.getLocList() abort " {{{2
+    return g:SyntasticLoclist.New(self.getLocListRaw())
+endfunction " }}}2
+
+function! g:SyntasticChecker.getVersion(...) abort " {{{2
+    if !exists('self._version')
+        let command = a:0 ? a:1 : self.getExecEscaped() . ' --version'
+        let version_output = syntastic#util#system(command)
+        call self.log('getVersion: ' . string(command) . ': ' .
+            \ string(split(version_output, "\n", 1)) .
+            \ (v:shell_error ? ' (exit code ' . v:shell_error . ')' : '') )
+        let parsed_ver = syntastic#util#parseVersion(version_output)
+        if len(parsed_ver)
+            call self.setVersion(parsed_ver)
+        else
+            call syntastic#log#ndebug(g:_SYNTASTIC_DEBUG_LOCLIST, 'checker output:', split(version_output, "\n", 1))
+            call syntastic#log#error("checker " . self.getCName() . ": can't parse version string (abnormal termination?)")
+        endif
+    endif
+    return get(self, '_version', [])
+endfunction " }}}2
+
+function! g:SyntasticChecker.setVersion(version) abort " {{{2
+    if len(a:version)
+        let self._version = copy(a:version)
+        call self.log(self.getExec() . ' version =', a:version)
+    endif
+endfunction " }}}2
+
+function! g:SyntasticChecker.log(msg, ...) abort " {{{2
+    let leader = self.getCName() . ': '
+    if a:0
+        call syntastic#log#debug(g:_SYNTASTIC_DEBUG_CHECKERS, leader . a:msg, a:1)
+    else
+        call syntastic#log#debug(g:_SYNTASTIC_DEBUG_CHECKERS, leader . a:msg)
+    endif
+endfunction " }}}2
+
+function! g:SyntasticChecker.makeprgBuild(opts) abort " {{{2
+    let basename = self._filetype . '_' . self._name . '_'
+
+    let parts = []
+    call extend(parts, self._getOpt(a:opts, basename, 'exe', self.getExecEscaped()))
+    call extend(parts, self._getOpt(a:opts, basename, 'args', ''))
+    call extend(parts, self._getOpt(a:opts, basename, 'fname', syntastic#util#shexpand('%')))
+    call extend(parts, self._getOpt(a:opts, basename, 'post_args', ''))
+    call extend(parts, self._getOpt(a:opts, basename, 'tail', ''))
+
+    return join(parts)
+endfunction " }}}2
+
+function! g:SyntasticChecker.isAvailable() abort " {{{2
+    call self.syncExec()
+
+    if !has_key(self, '_available')
+        let self._available = {}
+    endif
+    if !has_key(self._available, self._exec)
+        let self._available[self._exec] = self._isAvailableFunc()
+    endif
+
+    return self._available[self._exec]
+endfunction " }}}2
+
+function! g:SyntasticChecker.isDisabled() abort " {{{2
+    return has_key(self, '_enable') && syntastic#util#var(self._enable, -1) <= 0
+endfunction " }}}2
+
+function! g:SyntasticChecker.wantSort() abort " {{{2
+    return syntastic#util#var(self._filetype . '_' . self._name . '_sort', 0)
+endfunction " }}}2
+
+" This method is no longer used by syntastic.  It's here only to maintain
+" backwards compatibility with external checkers which might depend on it.
+function! g:SyntasticChecker.setWantSort(val) abort " {{{2
+    if !exists('g:syntastic_' . self._filetype . '_' . self._name . '_sort')
+        let g:syntastic_{self._filetype}_{self._name}_sort = a:val
+    endif
+endfunction " }}}2
+
+" }}}1
+
+" Private methods {{{1
+
+function! g:SyntasticChecker._quietMessages(errors) abort " {{{2
+    " wildcard quiet_messages
+    let quiet_filters = copy(syntastic#util#var('quiet_messages', {}))
+    if type(quiet_filters) != type({})
+        call syntastic#log#warn('ignoring invalid syntastic_quiet_messages')
+        unlet quiet_filters
+        let quiet_filters = {}
+    endif
+
+    " per checker quiet_messages
+    let name = self._filetype . '_' . self._name
+    try
+        call extend( quiet_filters, copy(syntastic#util#var(name . '_quiet_messages', {})), 'force' )
+    catch /\m^Vim\%((\a\+)\)\=:E712/
+        call syntastic#log#warn('ignoring invalid syntastic_' . name . '_quiet_messages')
+    endtry
+
+    call syntastic#log#debug(g:_SYNTASTIC_DEBUG_LOCLIST, 'quiet_messages filter:', quiet_filters)
+
+    if !empty(quiet_filters)
+        call syntastic#util#dictFilter(a:errors, quiet_filters)
+        call syntastic#log#debug(g:_SYNTASTIC_DEBUG_LOCLIST, 'filtered by quiet_messages:', a:errors)
+    endif
+endfunction " }}}2
+
+function! g:SyntasticChecker._populateHighlightRegexes(errors) abort " {{{2
+    if has_key(self, '_highlightRegexFunc')
+        for e in a:errors
+            if e['valid']
+                let term = self._highlightRegexFunc(e)
+                if term !=# ''
+                    let e['hl'] = term
+                endif
+            endif
+        endfor
+    endif
+endfunction " }}}2
+
+function! g:SyntasticChecker._getOpt(opts, basename, name, default) abort " {{{2
+    let ret = []
+    call extend( ret, syntastic#util#argsescape(get(a:opts, a:name . '_before', '')) )
+    call extend( ret, syntastic#util#argsescape(syntastic#util#var( a:basename . a:name, get(a:opts, a:name, a:default) )) )
+    call extend( ret, syntastic#util#argsescape(get(a:opts, a:name . '_after', '')) )
+
+    return ret
+endfunction " }}}2
+
+" }}}1
+
+" Private functions {{{1
+
+function! s:_isAvailableDefault() dict " {{{2
+    return executable(self.getExec())
+endfunction " }}}2
+
+" }}}1
+
+" vim: set sw=4 sts=4 et fdm=marker:

+ 138 - 0
vim/plugged/syntastic/plugin/syntastic/cursor.vim

@@ -0,0 +1,138 @@
+if exists('g:loaded_syntastic_notifier_cursor') || !exists('g:loaded_syntastic_plugin')
+    finish
+endif
+let g:loaded_syntastic_notifier_cursor = 1
+
+let g:SyntasticCursorNotifier = {}
+
+" Public methods {{{1
+
+function! g:SyntasticCursorNotifier.New() abort " {{{2
+    let newObj = copy(self)
+    return newObj
+endfunction " }}}2
+
+function! g:SyntasticCursorNotifier.enabled() abort " {{{2
+    return syntastic#util#var('echo_current_error')
+endfunction " }}}2
+
+function! g:SyntasticCursorNotifier.refresh(loclist) abort " {{{2
+    if self.enabled() && !a:loclist.isEmpty()
+        call syntastic#log#debug(g:_SYNTASTIC_DEBUG_NOTIFICATIONS, 'cursor: refresh')
+        let b:syntastic_private_messages = copy(a:loclist.messages(bufnr('')))
+        let b:syntastic_private_line = -1
+        let b:syntastic_cursor_columns = a:loclist.getCursorColumns()
+        autocmd! syntastic CursorMoved
+        autocmd syntastic CursorMoved * call SyntasticRefreshCursor()
+    endif
+endfunction " }}}2
+
+" @vimlint(EVL103, 1, a:loclist)
+function! g:SyntasticCursorNotifier.reset(loclist) abort " {{{2
+    call syntastic#log#debug(g:_SYNTASTIC_DEBUG_NOTIFICATIONS, 'cursor: reset')
+    autocmd! syntastic CursorMoved
+    unlet! b:syntastic_private_messages
+    let b:syntastic_private_line = -1
+endfunction " }}}2
+" @vimlint(EVL103, 0, a:loclist)
+
+" }}}1
+
+" Private functions {{{1
+
+function! SyntasticRefreshCursor() abort " {{{2
+    if !exists('b:syntastic_private_messages') || empty(b:syntastic_private_messages)
+        " file not checked
+        return
+    endif
+
+    if !exists('b:syntastic_private_line')
+        let b:syntastic_private_line = -1
+    endif
+    let l = line('.')
+    let current_messages = get(b:syntastic_private_messages, l, {})
+
+    if !exists('b:syntastic_cursor_columns')
+        let b:syntastic_cursor_columns = g:syntastic_cursor_columns
+    endif
+
+    if b:syntastic_cursor_columns
+        let c = virtcol('.')
+        if !exists('b:syntastic_private_idx')
+            let b:syntastic_private_idx = -1
+        endif
+
+        if s:_is_same_index(l, b:syntastic_private_line, c, b:syntastic_private_idx, current_messages)
+            return
+        else
+            let b:syntastic_private_line = l
+        endif
+
+        if !empty(current_messages)
+            let b:syntastic_private_idx = s:_find_index(c, current_messages)
+            call syntastic#util#wideMsg(current_messages[b:syntastic_private_idx].text)
+        else
+            let b:syntastic_private_idx = -1
+            echo
+        endif
+    else
+        if l == b:syntastic_private_line
+            return
+        endif
+        let b:syntastic_private_line = l
+
+        if !empty(current_messages)
+            call syntastic#util#wideMsg(current_messages[0].text)
+        else
+            echo
+        endif
+    endif
+endfunction " }}}2
+
+" }}}1
+
+" Utilities {{{1
+
+function! s:_is_same_index(line, old_line, column, idx, messages) abort " {{{2
+    if a:old_line >= 0 && a:line == a:old_line && a:idx >= 0
+        if len(a:messages) <= 1
+            return 1
+        endif
+
+        if a:messages[a:idx].scol <= a:column || a:idx == 0
+            if a:idx == len(a:messages) - 1 || a:column < a:messages[a:idx + 1].scol
+                return 1
+            else
+                return 0
+            endif
+        else
+            return 0
+        endif
+    else
+        return 0
+    endif
+endfunction " }}}2
+
+function! s:_find_index(column, messages) abort " {{{2
+    let max = len(a:messages) - 1
+    if max == 0
+        return 0
+    endif
+    let min = 0
+
+    " modified binary search: assign index 0 to columns to the left of the first error
+    while min < max - 1
+        let mid = (min + max) / 2
+        if a:column < a:messages[mid].scol
+            let max = mid
+        else
+            let min = mid
+        endif
+    endwhile
+
+    return a:column < a:messages[max].scol ? min : max
+endfunction " }}}2
+
+" }}}1
+
+" vim: set sw=4 sts=4 et fdm=marker:

+ 104 - 0
vim/plugged/syntastic/plugin/syntastic/highlighting.vim

@@ -0,0 +1,104 @@
+if exists('g:loaded_syntastic_notifier_highlighting') || !exists('g:loaded_syntastic_plugin')
+    finish
+endif
+let g:loaded_syntastic_notifier_highlighting = 1
+
+" Highlighting requires getmatches introduced in 7.1.040
+let s:has_highlighting = v:version > 701 || (v:version == 701 && has('patch040'))
+lockvar s:has_highlighting
+
+let g:SyntasticHighlightingNotifier = {}
+
+let s:setup_done = 0
+
+" Public methods {{{1
+
+function! g:SyntasticHighlightingNotifier.New() abort " {{{2
+    let newObj = copy(self)
+
+    if !s:setup_done
+        call self._setup()
+        let s:setup_done = 1
+        lockvar s:setup_done
+    endif
+
+    return newObj
+endfunction " }}}2
+
+function! g:SyntasticHighlightingNotifier.enabled() abort " {{{2
+    return s:has_highlighting && syntastic#util#var('enable_highlighting')
+endfunction " }}}2
+
+" Sets error highlights in the current window
+function! g:SyntasticHighlightingNotifier.refresh(loclist) abort " {{{2
+    if self.enabled()
+        call syntastic#log#debug(g:_SYNTASTIC_DEBUG_NOTIFICATIONS, 'highlighting: refresh')
+        call self._reset()
+        let buf = bufnr('')
+        let issues = filter(a:loclist.copyRaw(), 'v:val["bufnr"] == buf')
+        for item in issues
+            let group = 'Syntastic' . get(item, 'subtype', '') . ( item['type'] ==? 'E' ? 'Error' : 'Warning' )
+
+            " The function `Syntastic_{filetype}_{checker}_GetHighlightRegex` is
+            " used to override default highlighting.
+            if has_key(item, 'hl')
+                call matchadd(group, '\%' . item['lnum'] . 'l' . item['hl'])
+            elseif get(item, 'col', 0)
+                if get(item, 'vcol', 0)
+                    let lastcol = virtcol([item['lnum'], '$'])
+                    let coltype = 'v'
+                else
+                    let lastcol = col([item['lnum'], '$'])
+                    let coltype = 'c'
+                endif
+                let lcol = min([lastcol, item['col']])
+
+                call matchadd(group, '\%' . item['lnum'] . 'l\%' . lcol . coltype)
+            endif
+        endfor
+    endif
+endfunction " }}}2
+
+" Remove all error highlights from the window
+" @vimlint(EVL103, 1, a:loclist)
+function! g:SyntasticHighlightingNotifier.reset(loclist) abort " {{{2
+    if s:has_highlighting
+        call syntastic#log#debug(g:_SYNTASTIC_DEBUG_NOTIFICATIONS, 'highlighting: reset')
+        call self._reset()
+    endif
+endfunction " }}}2
+" @vimlint(EVL103, 0, a:loclist)
+
+" }}}1
+
+" Private methods {{{1
+
+" One time setup: define our own highlighting
+function! g:SyntasticHighlightingNotifier._setup() abort " {{{2
+    if s:has_highlighting
+        if !hlexists('SyntasticError')
+            highlight link SyntasticError SpellBad
+        endif
+        if !hlexists('SyntasticWarning')
+            highlight link SyntasticWarning SpellCap
+        endif
+        if !hlexists('SyntasticStyleError')
+            highlight link SyntasticStyleError SyntasticError
+        endif
+        if !hlexists('SyntasticStyleWarning')
+            highlight link SyntasticStyleWarning SyntasticWarning
+        endif
+    endif
+endfunction " }}}2
+
+function! g:SyntasticHighlightingNotifier._reset() abort " {{{2
+    for match in getmatches()
+        if stridx(match['group'], 'Syntastic') == 0
+            call matchdelete(match['id'])
+        endif
+    endfor
+endfunction " }}}2
+
+" }}}1
+
+" vim: set sw=4 sts=4 et fdm=marker:

+ 445 - 0
vim/plugged/syntastic/plugin/syntastic/loclist.vim

@@ -0,0 +1,445 @@
+if exists('g:loaded_syntastic_loclist') || !exists('g:loaded_syntastic_plugin')
+    finish
+endif
+let g:loaded_syntastic_loclist = 1
+
+let g:SyntasticLoclist = {}
+
+" Public methods {{{1
+
+function! g:SyntasticLoclist.New(rawLoclist) abort " {{{2
+    let newObj = copy(self)
+
+    let llist = filter(copy(a:rawLoclist), 'v:val["valid"]')
+
+    for e in llist
+        if get(e, 'type', '') ==# ''
+            let e['type'] = 'E'
+        endif
+    endfor
+
+    let newObj._rawLoclist = llist
+    let newObj._name = ''
+    let newObj._owner = bufnr('')
+    let newObj._sorted = 0
+    let newObj._columns = g:syntastic_cursor_columns
+
+    return newObj
+endfunction " }}}2
+
+function! g:SyntasticLoclist.current(...) abort " {{{2
+    let buf = a:0 ? a:1 : bufnr('')
+    let loclist = syntastic#util#getbufvar(buf, 'syntastic_loclist', {})
+    if type(loclist) != type({}) || empty(loclist)
+        unlet! loclist
+        let loclist = g:SyntasticLoclist.New([])
+    endif
+    return loclist
+endfunction " }}}2
+
+function! g:SyntasticLoclist.extend(other) abort " {{{2
+    call extend(self._rawLoclist, a:other.copyRaw())
+endfunction " }}}2
+
+function! g:SyntasticLoclist.sort() abort " {{{2
+    if !self._sorted
+        for e in self._rawLoclist
+            call s:_set_screen_column(e)
+        endfor
+
+        call sort(self._rawLoclist, self._columns ? 's:_compare_error_items_by_columns' : 's:_compare_error_items_by_lines')
+
+        let self._sorted = 1
+    endif
+endfunction " }}}2
+
+function! g:SyntasticLoclist.isEmpty() abort " {{{2
+    return empty(self._rawLoclist)
+endfunction " }}}2
+
+function! g:SyntasticLoclist.isNewerThan(stamp) abort " {{{2
+    if !exists('self._stamp')
+        let self._stamp = []
+        return 0
+    endif
+    return syntastic#util#compareLexi(self._stamp, a:stamp) > 0
+endfunction " }}}2
+
+function! g:SyntasticLoclist.copyRaw() abort " {{{2
+    return copy(self._rawLoclist)
+endfunction " }}}2
+
+function! g:SyntasticLoclist.getRaw() abort " {{{2
+    return self._rawLoclist
+endfunction " }}}2
+
+function! g:SyntasticLoclist.getBuffers() abort " {{{2
+    return syntastic#util#unique(map(copy(self._rawLoclist), 'str2nr(v:val["bufnr"])') + [self._owner])
+endfunction " }}}2
+
+function! g:SyntasticLoclist.getCursorColumns() abort " {{{2
+    return self._columns
+endfunction " }}}2
+
+function! g:SyntasticLoclist.getStatuslineFlag() abort " {{{2
+    if !exists('self._stl_format')
+        let self._stl_format = ''
+    endif
+    if !exists('self._stl_flag')
+        let self._stl_flag = ''
+    endif
+
+    if g:syntastic_stl_format !=# self._stl_format
+        let self._stl_format = g:syntastic_stl_format
+
+        if !empty(self._rawLoclist)
+            let errors = self.errors()
+            let warnings = self.warnings()
+
+            let num_errors = len(errors)
+            let num_warnings = len(warnings)
+            let num_issues = len(self._rawLoclist)
+
+            let output = self._stl_format
+
+            "hide stuff wrapped in %E(...) unless there are errors
+            let output = substitute(output, '\m\C%E{\([^}]*\)}', num_errors ? '\1' : '' , 'g')
+
+            "hide stuff wrapped in %W(...) unless there are warnings
+            let output = substitute(output, '\m\C%W{\([^}]*\)}', num_warnings ? '\1' : '' , 'g')
+
+            "hide stuff wrapped in %B(...) unless there are both errors and warnings
+            let output = substitute(output, '\m\C%B{\([^}]*\)}', (num_warnings && num_errors) ? '\1' : '' , 'g')
+
+            let flags = {
+                \ '%':  '%',
+                \ 't':  num_issues,
+                \ 'e':  num_errors,
+                \ 'w':  num_warnings,
+                \ 'N':  (num_issues ? fnamemodify( bufname(self._rawLoclist[0]['bufnr']), ':t') : ''),
+                \ 'P':  (num_issues ? fnamemodify( bufname(self._rawLoclist[0]['bufnr']), ':p:~:.') : ''),
+                \ 'F':  (num_issues ? self._rawLoclist[0]['lnum'] : ''),
+                \ 'ne': (num_errors ? fnamemodify( bufname(errors[0]['bufnr']), ':t') : ''),
+                \ 'pe': (num_errors ? fnamemodify( bufname(errors[0]['bufnr']), ':p:~:.') : ''),
+                \ 'fe': (num_errors ? errors[0]['lnum'] : ''),
+                \ 'nw': (num_warnings ? fnamemodify( bufname(warnings[0]['bufnr']), ':t') : ''),
+                \ 'pw': (num_warnings ? fnamemodify( bufname(warnings[0]['bufnr']), ':p:~:.') : ''),
+                \ 'fw': (num_warnings ? warnings[0]['lnum'] : '') }
+            let output = substitute(output, '\v\C\%(-?\d*%(\.\d+)?)([npf][ew]|[NPFtew%])', '\=syntastic#util#wformat(submatch(1), flags[submatch(2)])', 'g')
+
+            let self._stl_flag = output
+        else
+            let self._stl_flag = ''
+        endif
+    endif
+
+    return self._stl_flag
+endfunction " }}}2
+
+function! g:SyntasticLoclist.getFirstError(...) abort " {{{2
+    let max_issues = len(self._rawLoclist)
+    if a:0 && a:1 < max_issues
+        let max_issues = a:1
+    endif
+
+    for idx in range(max_issues)
+        if get(self._rawLoclist[idx], 'type', '') ==? 'E'
+            return idx + 1
+        endif
+    endfor
+
+    return 0
+endfunction " }}}2
+
+function! g:SyntasticLoclist.getName() abort " {{{2
+    return len(self._name)
+endfunction " }}}2
+
+function! g:SyntasticLoclist.setName(name) abort " {{{2
+    let self._name = a:name
+endfunction " }}}2
+
+function! g:SyntasticLoclist.getOwner() abort " {{{2
+    return self._owner
+endfunction " }}}2
+
+function! g:SyntasticLoclist.setOwner(buffer) abort " {{{2
+    let self._owner = type(a:buffer) == type(0) ? a:buffer : str2nr(a:buffer)
+endfunction " }}}2
+
+function! g:SyntasticLoclist.deploy() abort " {{{2
+    let self._stamp = syntastic#util#stamp()
+    for buf in self.getBuffers()
+        call setbufvar(buf, 'syntastic_loclist', self)
+    endfor
+endfunction " }}}2
+
+function! g:SyntasticLoclist.destroy() abort " {{{2
+    for buf in self.getBuffers()
+        call setbufvar(buf, 'syntastic_loclist', {})
+    endfor
+endfunction " }}}2
+
+function! g:SyntasticLoclist.decorate(tag) abort " {{{2
+    for e in self._rawLoclist
+        let e['text'] .= ' [' . a:tag . ']'
+    endfor
+endfunction " }}}2
+
+function! g:SyntasticLoclist.balloons() abort " {{{2
+    if !exists('self._cachedBalloons')
+        let sep = has('balloon_multiline') ? "\n" : ' | '
+
+        let self._cachedBalloons = {}
+        for e in self._rawLoclist
+            let buf = e['bufnr']
+
+            if !has_key(self._cachedBalloons, buf)
+                let self._cachedBalloons[buf] = {}
+            endif
+
+            if has_key(self._cachedBalloons[buf], e['lnum'])
+                let self._cachedBalloons[buf][e['lnum']] .= sep . e['text']
+            else
+                let self._cachedBalloons[buf][e['lnum']] = e['text']
+            endif
+        endfor
+    endif
+
+    return get(self._cachedBalloons, bufnr(''), {})
+endfunction " }}}2
+
+function! g:SyntasticLoclist.errors() abort " {{{2
+    if !exists('self._cachedErrors')
+        let self._cachedErrors = self.filter({'type': 'E'})
+    endif
+    return self._cachedErrors
+endfunction " }}}2
+
+function! g:SyntasticLoclist.warnings() abort " {{{2
+    if !exists('self._cachedWarnings')
+        let self._cachedWarnings = self.filter({'type': 'W'})
+    endif
+    return self._cachedWarnings
+endfunction " }}}2
+
+" Legacy function.  Syntastic no longer calls it, but we keep it
+" around because other plugins (f.i. powerline) depend on it.
+function! g:SyntasticLoclist.hasErrorsOrWarningsToDisplay() abort " {{{2
+    return !self.isEmpty()
+endfunction " }}}2
+
+" cache used by EchoCurrentError()
+function! g:SyntasticLoclist.messages(buf) abort " {{{2
+    if !exists('self._cachedMessages')
+        let self._cachedMessages = {}
+
+        let errors = self.errors() + self.warnings()
+        for e in errors
+            let b = e['bufnr']
+            let l = e['lnum']
+
+            if !has_key(self._cachedMessages, b)
+                let self._cachedMessages[b] = {}
+            endif
+
+            if !has_key(self._cachedMessages[b], l)
+                let self._cachedMessages[b][l] = [e]
+            elseif self._columns
+                call add(self._cachedMessages[b][l], e)
+            endif
+        endfor
+
+        if self._columns
+            if !self._sorted
+                for b in keys(self._cachedMessages)
+                    for l in keys(self._cachedMessages[b])
+                        if len(self._cachedMessages[b][l]) > 1
+                            for e in self._cachedMessages[b][l]
+                                call s:_set_screen_column(e)
+                            endfor
+                            call sort(self._cachedMessages[b][l], 's:_compare_error_items_by_columns')
+                        endif
+                    endfor
+                endfor
+            endif
+
+            for b in keys(self._cachedMessages)
+                for l in keys(self._cachedMessages[b])
+                    call s:_remove_shadowed_items(self._cachedMessages[b][l])
+                endfor
+            endfor
+        endif
+    endif
+
+    return get(self._cachedMessages, a:buf, {})
+endfunction " }}}2
+
+"Filter the list and return new native loclist
+"e.g.
+"  .filter({'bufnr': 10, 'type': 'e'})
+"
+"would return all errors for buffer 10.
+"
+"Note that all string comparisons are done with ==?
+function! g:SyntasticLoclist.filter(filters) abort " {{{2
+    let conditions = values(map(copy(a:filters), 's:_translate(v:key, v:val)'))
+    let filter = len(conditions) == 1 ?
+        \ conditions[0] : join(map(conditions, '"(" . v:val . ")"'), ' && ')
+    return filter(copy(self._rawLoclist), filter)
+endfunction " }}}2
+
+function! g:SyntasticLoclist.setloclist(new) abort " {{{2
+    if !exists('w:syntastic_loclist_set')
+        let w:syntastic_loclist_set = []
+    endif
+    if a:new || empty(w:syntastic_loclist_set) || w:syntastic_loclist_set != [self._owner, getbufvar(self._owner, 'changedtick')]
+        let replace = !a:new && g:syntastic_reuse_loc_lists && !empty(w:syntastic_loclist_set)
+        call syntastic#log#debug(g:_SYNTASTIC_DEBUG_NOTIFICATIONS, 'loclist: setloclist ' . (replace ? '(replace)' : '(new)'))
+        call setloclist(0, self.getRaw(), replace ? 'r' : ' ')
+        try
+            " Vim 7.4.2200 or later
+            call setloclist(0, [], 'r', { 'title': ':SyntasticCheck ' . self._name })
+        catch /\m^Vim\%((\a\+)\)\=:E\%(118\|731\)/
+            " do nothing
+        endtry
+        call syntastic#util#setLastTick(self._owner)
+        let w:syntastic_loclist_set = [self._owner, getbufvar(self._owner, 'syntastic_lasttick')]
+    endif
+endfunction " }}}2
+
+"display the cached errors for this buf in the location list
+function! g:SyntasticLoclist.show() abort " {{{2
+    call syntastic#log#debug(g:_SYNTASTIC_DEBUG_NOTIFICATIONS, 'loclist: show')
+    call self.setloclist(0)
+
+    if !&previewwindow && !self.isEmpty()
+        let num = winnr()
+        execute 'lopen ' . syntastic#util#var('loc_list_height')
+        if num != winnr()
+            execute num . 'wincmd w'
+        endif
+
+        " try to find the loclist window and set w:quickfix_title
+        let errors = getloclist(0)
+        for buf in tabpagebuflist()
+            if buflisted(buf) && bufloaded(buf) && getbufvar(buf, '&buftype') ==# 'quickfix'
+                let win = bufwinnr(buf)
+                let title = getwinvar(win, 'quickfix_title')
+
+                " TODO: try to make sure we actually own this window; sadly,
+                " errors == getloclist(0) is the only somewhat safe way to
+                " achieve that
+                if strpart(title, 0, 16) ==# ':SyntasticCheck ' ||
+                            \ ( (title ==# '' || title ==# ':setloclist()') && errors == getloclist(0) )
+                    call setwinvar(win, 'quickfix_title', ':SyntasticCheck ' . self._name)
+                    call setbufvar(buf, 'syntastic_owner_buffer', self._owner)
+                endif
+            endif
+        endfor
+    endif
+endfunction " }}}2
+
+" }}}1
+
+" Public functions {{{1
+
+function! SyntasticLoclistHide() abort " {{{2
+    call syntastic#log#debug(g:_SYNTASTIC_DEBUG_NOTIFICATIONS, 'loclist: hide')
+    silent! lclose
+endfunction " }}}2
+
+" }}}1
+
+" Utilities {{{1
+
+function! s:_translate(key, val) abort " {{{2
+    return 'get(v:val, ' . string(a:key) . ', "") ==? ' . string(a:val)
+endfunction " }}}2
+
+function! s:_set_screen_column(item) abort " {{{2
+    if !has_key(a:item, 'scol')
+        let col = get(a:item, 'col', 0)
+        if col != 0 && get(a:item, 'vcol', 0) == 0
+            let buf = str2nr(a:item['bufnr'])
+            try
+                let line = getbufline(buf, a:item['lnum'])[0]
+            catch  /\m^Vim\%((\a\+)\)\=:E684/
+                let line = ''
+            endtry
+            let a:item['scol'] = syntastic#util#screenWidth(strpart(line, 0, col), getbufvar(buf, '&tabstop'))
+        else
+            let a:item['scol'] = col
+        endif
+    endif
+endfunction " }}}2
+
+function! s:_remove_shadowed_items(errors) abort " {{{2
+    " keep only the first message at a given column
+    let i = 0
+    while i < len(a:errors) - 1
+        let j = i + 1
+        let dupes = 0
+        while j < len(a:errors) && a:errors[j].scol == a:errors[i].scol
+            let dupes = 1
+            let j += 1
+        endwhile
+        if dupes
+            call remove(a:errors, i + 1, j - 1)
+        endif
+        let i += 1
+    endwhile
+
+    " merge messages with the same text
+    let i = 0
+    while i < len(a:errors) - 1
+        let j = i + 1
+        let dupes = 0
+        while j < len(a:errors) && a:errors[j].text == a:errors[i].text
+            let dupes = 1
+            let j += 1
+        endwhile
+        if dupes
+            call remove(a:errors, i + 1, j - 1)
+        endif
+        let i += 1
+    endwhile
+endfunction " }}}2
+
+function! s:_compare_error_items_by_columns(a, b) abort " {{{2
+    if a:a['bufnr'] != a:b['bufnr']
+        " group by file
+        return a:a['bufnr'] - a:b['bufnr']
+    elseif a:a['lnum'] != a:b['lnum']
+        " sort by line
+        return a:a['lnum'] - a:b['lnum']
+    elseif a:a['scol'] != a:b['scol']
+        " sort by screen column
+        return a:a['scol'] - a:b['scol']
+    elseif a:a['type'] !=? a:b['type']
+        " errors take precedence over warnings
+        return a:a['type'] ==? 'E' ? -1 : 1
+    else
+        return 0
+    endif
+endfunction " }}}2
+
+function! s:_compare_error_items_by_lines(a, b) abort " {{{2
+    if a:a['bufnr'] != a:b['bufnr']
+        " group by file
+        return a:a['bufnr'] - a:b['bufnr']
+    elseif a:a['lnum'] != a:b['lnum']
+        " sort by line
+        return a:a['lnum'] - a:b['lnum']
+    elseif a:a['type'] !=? a:b['type']
+        " errors take precedence over warnings
+        return a:a['type'] ==? 'E' ? -1 : 1
+    else
+        " sort by screen column
+        return a:a['scol'] - a:b['scol']
+    endif
+endfunction " }}}2
+
+" }}}1
+
+" vim: set sw=4 sts=4 et fdm=marker:

+ 118 - 0
vim/plugged/syntastic/plugin/syntastic/modemap.vim

@@ -0,0 +1,118 @@
+if exists('g:loaded_syntastic_modemap') || !exists('g:loaded_syntastic_plugin')
+    finish
+endif
+let g:loaded_syntastic_modemap = 1
+
+let g:SyntasticModeMap = {}
+
+" Public methods {{{1
+
+function! g:SyntasticModeMap.Instance() abort " {{{2
+    if !exists('s:SyntasticModeMapInstance')
+        let s:SyntasticModeMapInstance = copy(self)
+        call s:SyntasticModeMapInstance.synch()
+    endif
+
+    return s:SyntasticModeMapInstance
+endfunction " }}}2
+
+function! g:SyntasticModeMap.synch() abort " {{{2
+    if exists('g:syntastic_mode_map')
+        let self._mode = get(g:syntastic_mode_map, 'mode', 'active')
+        let self._activeFiletypes = copy(get(g:syntastic_mode_map, 'active_filetypes', []))
+        let self._passiveFiletypes = copy(get(g:syntastic_mode_map, 'passive_filetypes', []))
+    else
+        let self._mode = 'active'
+        let self._activeFiletypes = []
+        let self._passiveFiletypes = []
+    endif
+endfunction " }}}2
+
+function! g:SyntasticModeMap.allowsAutoChecking(filetype) abort " {{{2
+    let registry = g:SyntasticRegistry.Instance()
+    let fts = registry.resolveFiletypes(a:filetype)
+
+    if self.isPassive()
+        return self._isOneFiletypeActive(fts)
+    else
+        return self._noFiletypesArePassive(fts)
+    endif
+endfunction " }}}2
+
+function! g:SyntasticModeMap.doAutoChecking(buf) abort " {{{2
+    let local_mode = getbufvar(a:buf, 'syntastic_mode')
+    if local_mode ==# 'active' || local_mode ==# 'passive'
+        return local_mode ==# 'active'
+    endif
+
+    return self.allowsAutoChecking(getbufvar(a:buf, '&filetype'))
+endfunction " }}}2
+
+function! g:SyntasticModeMap.isPassive() abort " {{{2
+    return self._mode ==# 'passive'
+endfunction " }}}2
+
+function! g:SyntasticModeMap.toggleMode() abort " {{{2
+    call self.synch()
+
+    if self._mode ==# 'active'
+        let self._mode = 'passive'
+    else
+        let self._mode = 'active'
+    endif
+
+    "XXX Changing a global variable.  Tsk, tsk...
+    if !exists('g:syntastic_mode_map')
+        let g:syntastic_mode_map = {}
+    endif
+    let g:syntastic_mode_map['mode'] = self._mode
+endfunction " }}}2
+
+function! g:SyntasticModeMap.echoMode() abort " {{{2
+    echo 'Syntastic: ' . self._mode . ' mode enabled'
+endfunction " }}}2
+
+function! g:SyntasticModeMap.modeInfo(filetypes) abort " {{{2
+    echomsg 'Syntastic version: ' . g:syntastic_version
+    let type = len(a:filetypes) ? a:filetypes[0] : &filetype
+    echomsg 'Info for filetype: ' . type
+
+    call self.synch()
+    echomsg 'Global mode: ' . self._mode
+    if self._mode ==# 'active'
+        if len(self._passiveFiletypes)
+            let plural = len(self._passiveFiletypes) != 1 ? 's' : ''
+            echomsg 'Passive filetype' . plural . ': ' . join(sort(copy(self._passiveFiletypes)))
+        endif
+    else
+        if len(self._activeFiletypes)
+            let plural = len(self._activeFiletypes) != 1 ? 's' : ''
+            echomsg 'Active filetype' . plural . ': ' . join(sort(copy(self._activeFiletypes)))
+        endif
+    endif
+    echomsg 'Filetype ' . type . ' is ' . (self.allowsAutoChecking(type) ? 'active' : 'passive')
+
+    if !len(a:filetypes)
+        if exists('b:syntastic_mode') && (b:syntastic_mode ==# 'active' || b:syntastic_mode ==# 'passive')
+            echomsg 'Local mode: ' . b:syntastic_mode
+        endif
+
+        echomsg 'The current file will ' . (self.doAutoChecking(bufnr('')) ? '' : 'not ') . 'be checked automatically'
+    endif
+endfunction " }}}2
+
+" }}}1
+
+" Private methods {{{1
+
+function! g:SyntasticModeMap._isOneFiletypeActive(filetypes) abort " {{{2
+    return !empty(filter(copy(a:filetypes), 'index(self._activeFiletypes, v:val) != -1'))
+endfunction " }}}2
+
+function! g:SyntasticModeMap._noFiletypesArePassive(filetypes) abort " {{{2
+    return empty(filter(copy(a:filetypes), 'index(self._passiveFiletypes, v:val) != -1'))
+endfunction " }}}2
+
+" }}}1
+
+" vim: set sw=4 sts=4 et fdm=marker:

+ 86 - 0
vim/plugged/syntastic/plugin/syntastic/notifiers.vim

@@ -0,0 +1,86 @@
+if exists('g:loaded_syntastic_notifiers') || !exists('g:loaded_syntastic_plugin')
+    finish
+endif
+let g:loaded_syntastic_notifiers = 1
+
+let g:SyntasticNotifiers = {}
+
+let s:_NOTIFIER_TYPES = ['signs', 'balloons', 'highlighting', 'cursor', 'autoloclist']
+lockvar! s:_NOTIFIER_TYPES
+
+let s:_PERSISTENT_NOTIFIERS = ['signs', 'balloons']
+lockvar! s:_PERSISTENT_NOTIFIERS
+
+" Public methods {{{1
+
+function! g:SyntasticNotifiers.Instance() abort " {{{2
+    if !exists('s:SyntasticNotifiersInstance')
+        let s:SyntasticNotifiersInstance = copy(self)
+        call s:SyntasticNotifiersInstance._initNotifiers()
+    endif
+
+    return s:SyntasticNotifiersInstance
+endfunction " }}}2
+
+function! g:SyntasticNotifiers.refresh(loclist) abort " {{{2
+    if !syntastic#util#bufIsActive(bufnr('')) || (!a:loclist.isEmpty() && !a:loclist.isNewerThan([]))
+        " loclist not fully constructed yet
+        return
+    endif
+
+    call syntastic#log#debug(g:_SYNTASTIC_DEBUG_NOTIFICATIONS, 'notifiers: refresh')
+    for type in self._enabled_types
+        let class = substitute(type, '\m.*', 'Syntastic\u&Notifier', '')
+        if !has_key(g:{class}, 'enabled') || self._notifier[type].enabled()
+            if index(s:_PERSISTENT_NOTIFIERS, type) > -1
+                " refresh only if loclist has changed since last call
+                if !exists('b:syntastic_private_' . type . '_stamp')
+                    let b:syntastic_private_{type}_stamp = []
+                endif
+                if a:loclist.isNewerThan(b:syntastic_private_{type}_stamp) || a:loclist.isEmpty()
+                    call self._notifier[type].refresh(a:loclist)
+                    let b:syntastic_private_{type}_stamp = syntastic#util#stamp()
+                endif
+            else
+                call self._notifier[type].refresh(a:loclist)
+            endif
+        endif
+    endfor
+endfunction " }}}2
+
+function! g:SyntasticNotifiers.reset(loclist) abort " {{{2
+    call syntastic#log#debug(g:_SYNTASTIC_DEBUG_NOTIFICATIONS, 'notifiers: reset')
+    for type in self._enabled_types
+        let class = substitute(type, '\m.*', 'Syntastic\u&Notifier', '')
+
+        " reset notifiers regardless if they are enabled or not, since
+        " the user might have disabled them since the last refresh();
+        " notifiers MUST be prepared to deal with reset() when disabled
+        if has_key(g:{class}, 'reset')
+            call self._notifier[type].reset(a:loclist)
+        endif
+
+        " also reset stamps
+        if index(s:_PERSISTENT_NOTIFIERS, type) > -1
+            let b:syntastic_private_{type}_stamp = []
+        endif
+    endfor
+endfunction " }}}2
+
+" }}}1
+
+" Private methods {{{1
+
+function! g:SyntasticNotifiers._initNotifiers() abort " {{{2
+    let self._notifier = {}
+    for type in s:_NOTIFIER_TYPES
+        let class = substitute(type, '\m.*', 'Syntastic\u&Notifier', '')
+        let self._notifier[type] = g:{class}.New()
+    endfor
+
+    let self._enabled_types = copy(s:_NOTIFIER_TYPES)
+endfunction " }}}2
+
+" }}}1
+
+" vim: set sw=4 sts=4 et fdm=marker:

+ 444 - 0
vim/plugged/syntastic/plugin/syntastic/registry.vim

@@ -0,0 +1,444 @@
+if exists('g:loaded_syntastic_registry') || !exists('g:loaded_syntastic_plugin')
+    finish
+endif
+let g:loaded_syntastic_registry = 1
+
+" Initialisation {{{1
+
+let s:_DEFAULT_CHECKERS = {
+        \ 'actionscript':  ['mxmlc'],
+        \ 'ada':           ['gcc'],
+        \ 'ansible':       ['ansible_lint'],
+        \ 'apiblueprint':  ['drafter'],
+        \ 'applescript':   ['osacompile'],
+        \ 'asciidoc':      ['asciidoc'],
+        \ 'asl':           ['iasl'],
+        \ 'asm':           ['gcc'],
+        \ 'bro':           ['bro'],
+        \ 'bemhtml':       ['bemhtmllint'],
+        \ 'c':             ['gcc'],
+        \ 'cabal':         ['cabal'],
+        \ 'chef':          ['foodcritic'],
+        \ 'cmake':         ['cmakelint'],
+        \ 'co':            ['coco'],
+        \ 'cobol':         ['cobc'],
+        \ 'coffee':        ['coffee', 'coffeelint'],
+        \ 'coq':           ['coqtop'],
+        \ 'cpp':           ['gcc'],
+        \ 'cs':            ['mcs'],
+        \ 'css':           ['csslint'],
+        \ 'cucumber':      ['cucumber'],
+        \ 'cuda':          ['nvcc'],
+        \ 'd':             ['dmd'],
+        \ 'dart':          ['dartanalyzer'],
+        \ 'docbk':         ['xmllint'],
+        \ 'dockerfile':    ['dockerfile_lint'],
+        \ 'dustjs':        ['swiffer'],
+        \ 'elixir':        [],
+        \ 'erlang':        ['escript'],
+        \ 'eruby':         ['ruby'],
+        \ 'fortran':       ['gfortran'],
+        \ 'glsl':          ['cgc'],
+        \ 'go':            [],
+        \ 'haml':          ['haml'],
+        \ 'handlebars':    ['handlebars'],
+        \ 'haskell':       ['hdevtools', 'hlint'],
+        \ 'haxe':          ['haxe'],
+        \ 'help':          [],
+        \ 'hss':           ['hss'],
+        \ 'html':          ['tidy'],
+        \ 'jade':          ['jade_lint'],
+        \ 'java':          ['javac'],
+        \ 'javascript':    ['jshint', 'jslint'],
+        \ 'json':          ['jsonlint', 'jsonval'],
+        \ 'less':          ['lessc'],
+        \ 'lex':           ['flex'],
+        \ 'limbo':         ['limbo'],
+        \ 'lisp':          ['clisp'],
+        \ 'llvm':          ['llvm'],
+        \ 'lua':           ['luac'],
+        \ 'markdown':      ['mdl'],
+        \ 'matlab':        ['mlint'],
+        \ 'mercury':       ['mmc'],
+        \ 'nasm':          ['nasm'],
+        \ 'nix':           ['nix'],
+        \ 'nroff':         ['mandoc'],
+        \ 'objc':          ['gcc'],
+        \ 'objcpp':        ['gcc'],
+        \ 'ocaml':         ['camlp4o'],
+        \ 'perl':          ['perlcritic'],
+        \ 'perl6':         [],
+        \ 'php':           ['php', 'phpcs', 'phpmd'],
+        \ 'po':            ['msgfmt'],
+        \ 'pod':           ['podchecker'],
+        \ 'puppet':        ['puppet', 'puppetlint'],
+        \ 'pug':           ['pug_lint'],
+        \ 'python':        ['python', 'flake8', 'pylint'],
+        \ 'qml':           ['qmllint'],
+        \ 'r':             [],
+        \ 'rmd':           [],
+        \ 'racket':        ['racket'],
+        \ 'raku':          [],
+        \ 'rnc':           ['rnv'],
+        \ 'rst':           ['rst2pseudoxml'],
+        \ 'ruby':          ['mri'],
+        \ 'sass':          ['sass'],
+        \ 'scala':         ['fsc', 'scalac'],
+        \ 'scss':          ['sass', 'scss_lint'],
+        \ 'sh':            ['sh', 'shellcheck'],
+        \ 'slim':          ['slimrb'],
+        \ 'sml':           ['smlnj'],
+        \ 'spec':          ['rpmlint'],
+        \ 'solidity':      ['solc'],
+        \ 'sql':           ['sqlint'],
+        \ 'stylus':        ['stylint'],
+        \ 'svg':           [],
+        \ 'tcl':           ['nagelfar'],
+        \ 'tex':           ['lacheck', 'chktex'],
+        \ 'texinfo':       ['makeinfo'],
+        \ 'text':          [],
+        \ 'trig':          ['rapper'],
+        \ 'turtle':        ['rapper'],
+        \ 'twig':          ['twiglint'],
+        \ 'typescript':    [],
+        \ 'verilog':       ['verilator'],
+        \ 'vhdl':          ['ghdl'],
+        \ 'vim':           ['vimlint'],
+        \ 'vue':           ['pug_lint_vue', 'eslint'],
+        \ 'xhtml':         ['tidy'],
+        \ 'xml':           ['xmllint'],
+        \ 'xslt':          ['xmllint'],
+        \ 'xquery':        ['basex'],
+        \ 'yacc':          ['bison'],
+        \ 'yaml':          ['jsyaml'],
+        \ 'yang':          ['pyang'],
+        \ 'yara':          ['yarac'],
+        \ 'z80':           ['z80syntaxchecker'],
+        \ 'zpt':           ['zptlint'],
+        \ 'zsh':           ['zsh'],
+    \ }
+lockvar! s:_DEFAULT_CHECKERS
+
+let s:_DEFAULT_FILETYPE_MAP = {
+        \ 'gentoo-metadata': 'xml',
+        \ 'groff': 'nroff',
+        \ 'lhaskell': 'haskell',
+        \ 'litcoffee': 'coffee',
+        \ 'mail': 'text',
+        \ 'mkd': 'markdown',
+        \ 'pe-puppet': 'puppet',
+        \ 'sgml': 'docbk',
+        \ 'sgmllnx': 'docbk',
+    \ }
+lockvar! s:_DEFAULT_FILETYPE_MAP
+
+let s:_ECLIM_TYPES = [
+        \ 'c',
+        \ 'cpp',
+        \ 'html',
+        \ 'java',
+        \ 'php',
+        \ 'python',
+        \ 'ruby',
+    \ ]
+lockvar! s:_ECLIM_TYPES
+
+let s:_YCM_TYPES = [
+        \ 'c',
+        \ 'cpp',
+        \ 'objc',
+        \ 'objcpp',
+    \ ]
+lockvar! s:_YCM_TYPES
+
+let g:SyntasticRegistry = {}
+
+" }}}1
+
+" Public methods {{{1
+
+" Note: Handling of filetype aliases: all public methods take aliases as
+" parameters, all private methods take normalized filetypes.  Public methods
+" are thus supposed to normalize filetypes before calling private methods.
+
+function! g:SyntasticRegistry.Instance() abort " {{{2
+    if !exists('s:SyntasticRegistryInstance')
+        let s:SyntasticRegistryInstance = copy(self)
+        let s:SyntasticRegistryInstance._checkerMap = {}
+    endif
+
+    return s:SyntasticRegistryInstance
+endfunction " }}}2
+
+function! g:SyntasticRegistry.CreateAndRegisterChecker(args) abort " {{{2
+    let registry = g:SyntasticRegistry.Instance()
+
+    if has_key(a:args, 'redirect')
+        let [ft, name] = split(a:args['redirect'], '/')
+        call registry._loadCheckersFor(ft, 1)
+
+        let clone = get(registry._checkerMap[ft], name, {})
+        if empty(clone)
+            throw 'Syntastic: Checker ' . a:args['redirect'] . ' redirects to unregistered checker ' . ft . '/' . name
+        endif
+
+        let checker = g:SyntasticChecker.New(a:args, clone)
+    else
+        let checker = g:SyntasticChecker.New(a:args)
+    endif
+    call registry._registerChecker(checker)
+endfunction " }}}2
+
+" Given a list of checker names hints_list, return a map name --> checker.
+" If hints_list is empty, user settings are are used instead. Checkers are
+" not checked for availability (that is, the corresponding IsAvailable() are
+" not run).
+function! g:SyntasticRegistry.getCheckers(ftalias, hints_list) abort " {{{2
+    let ftlist = self.resolveFiletypes(a:ftalias)
+
+    let names =
+        \ !empty(a:hints_list) ? a:hints_list :
+        \ exists('b:syntastic_checkers') ? b:syntastic_checkers : []
+
+    let cnames = []
+    if !empty(names)
+        for name in names
+            if name !~# '/'
+                for ft in ftlist
+                    call add(cnames, ft . '/' . name)
+                endfor
+            else
+                call add(cnames, name)
+            endif
+        endfor
+    else
+        for ft in ftlist
+            call self._sanityCheck(ft)
+            let defs =
+                \ exists('g:syntastic_' . ft . '_checkers') ? g:syntastic_{ft}_checkers :
+                \ get(s:_DEFAULT_CHECKERS, ft, [])
+            call extend(cnames, map(copy(defs), 'stridx(v:val, "/") < 0 ? ft . "/" . v:val : v:val' ))
+        endfor
+    endif
+    let cnames = syntastic#util#unique(cnames)
+
+    for ft in syntastic#util#unique(map( copy(cnames), 'v:val[: stridx(v:val, "/")-1]' ))
+        call self._loadCheckersFor(ft, 0)
+    endfor
+
+    return self._filterCheckersByName(cnames)
+endfunction " }}}2
+
+" Same as getCheckers(), but keep only the available checkers.  This runs the
+" corresponding IsAvailable() functions for all checkers.
+function! g:SyntasticRegistry.getCheckersAvailable(ftalias, hints_list) abort " {{{2
+    return filter(self.getCheckers(a:ftalias, a:hints_list), 'v:val.isAvailable()')
+endfunction " }}}2
+
+" Same as getCheckers(), but keep only the checkers that are available and
+" disabled.  This runs the corresponding IsAvailable() functions for all checkers.
+function! g:SyntasticRegistry.getCheckersDisabled(ftalias, hints_list) abort " {{{2
+    return filter(self.getCheckers(a:ftalias, a:hints_list), 'v:val.isDisabled() && v:val.isAvailable()')
+endfunction " }}}2
+
+function! g:SyntasticRegistry.getKnownFiletypes() abort " {{{2
+    let types = keys(s:_DEFAULT_CHECKERS)
+
+    call extend(types, keys(s:_DEFAULT_FILETYPE_MAP))
+
+    if exists('g:syntastic_filetype_map')
+        call extend(types, keys(g:syntastic_filetype_map))
+    endif
+
+    if exists('g:syntastic_extra_filetypes') && type(g:syntastic_extra_filetypes) == type([])
+        call extend(types, g:syntastic_extra_filetypes)
+    endif
+
+    return syntastic#util#unique(types)
+endfunction " }}}2
+
+function! g:SyntasticRegistry.getNamesOfAvailableCheckers(ftalias) abort " {{{2
+    let ft = s:_normalise_filetype(a:ftalias)
+    call self._loadCheckersFor(ft, 0)
+    return keys(filter( copy(self._checkerMap[ft]), 'v:val.isAvailable()' ))
+endfunction " }}}2
+
+function! g:SyntasticRegistry.resolveFiletypes(ftalias) abort " {{{2
+    return map(split( get(g:syntastic_filetype_map, a:ftalias, a:ftalias), '\m\.' ), 's:_normalise_filetype(v:val)')
+endfunction " }}}2
+
+function! g:SyntasticRegistry.echoInfoFor(ftalias_list) abort " {{{2
+    let ft_list = syntastic#util#unique(self.resolveFiletypes(empty(a:ftalias_list) ? &filetype : a:ftalias_list[0]))
+    if len(ft_list) != 1
+        let available = []
+        let active = []
+        let disabled = []
+
+        for ft in ft_list
+            call extend(available, map( self.getNamesOfAvailableCheckers(ft), 'ft . "/" . v:val' ))
+            call extend(active, map( self.getCheckersAvailable(ft, []), 'ft . "/" . v:val.getName()' ))
+            call extend(disabled, map( self.getCheckersDisabled(ft, []), 'ft . "/" . v:val.getName()' ))
+        endfor
+    else
+        let ft = ft_list[0]
+        let available = self.getNamesOfAvailableCheckers(ft)
+        let active = map(self.getCheckersAvailable(ft, []), 'ft ==# v:val.getFiletype() ? v:val.getName() : v:val.getCName()')
+        let disabled = map(self.getCheckersDisabled(ft, []), 'ft ==# v:val.getFiletype() ? v:val.getName() : v:val.getCName()')
+    endif
+
+    let cnt = len(available)
+    let plural = cnt != 1 ? 's' : ''
+    let cklist = cnt ? join(sort(available)) : '-'
+    echomsg 'Available checker' . plural . ': ' . cklist
+
+    let cnt = len(active)
+    let plural = cnt != 1 ? 's' : ''
+    let cklist = cnt ? join(active) : '-'
+    echomsg 'Currently enabled checker' . plural . ': ' . cklist
+
+    let cnt = len(disabled)
+    let plural = cnt != 1 ? 's' : ''
+    if len(disabled)
+        let cklist = join(sort(disabled, 's:_compare_checker_names'))
+        echomsg 'Checker' . plural . ' disabled for security reasons: ' . cklist
+    endif
+
+    " Eclim feels entitled to mess with syntastic's variables {{{3
+    if exists(':EclimValidate') && get(g:, 'EclimFileTypeValidate', 1)
+        let disabled = filter(copy(ft_list), 's:_disabled_by_eclim(v:val)')
+        let cnt = len(disabled)
+        if cnt
+            let plural = cnt != 1 ? 's' : ''
+            let cklist = join(disabled, ', ')
+            echomsg 'Checkers for filetype' . plural . ' ' . cklist . ' possibly disabled by Eclim'
+        endif
+    endif
+    " }}}3
+
+    " So does YouCompleteMe {{{3
+    if exists('g:loaded_youcompleteme') && get(g:, 'ycm_show_diagnostics_ui', get(g:, 'ycm_register_as_syntastic_checker', 1))
+        let disabled = filter(copy(ft_list), 's:_disabled_by_ycm(v:val)')
+        let cnt = len(disabled)
+        if cnt
+            let plural = cnt != 1 ? 's' : ''
+            let cklist = join(disabled, ', ')
+            echomsg 'Checkers for filetype' . plural . ' ' . cklist . ' possibly disabled by YouCompleteMe'
+        endif
+    endif
+    " }}}3
+endfunction " }}}2
+
+" }}}1
+
+" Private methods {{{1
+
+function! g:SyntasticRegistry._registerChecker(checker) abort " {{{2
+    let ft = a:checker.getFiletype()
+    if !has_key(self._checkerMap, ft)
+        let self._checkerMap[ft] = {}
+    endif
+
+    let name = a:checker.getName()
+    if has_key(self._checkerMap[ft], name)
+        throw 'Syntastic: Duplicate syntax checker name: ' . ft . '/' . name
+    endif
+
+    let self._checkerMap[ft][name] = a:checker
+endfunction " }}}2
+
+function! g:SyntasticRegistry._findChecker(cname) abort " {{{2
+    let sep_idx = stridx(a:cname, '/')
+    if sep_idx > 0
+        let ft = a:cname[: sep_idx-1]
+        let name = a:cname[sep_idx+1 :]
+    else
+        let ft = &filetype
+        let name = a:cname
+    endif
+    return get(self._checkerMap[ft], name, {})
+endfunction "}}}2
+
+function! g:SyntasticRegistry._filterCheckersByName(cnames) abort " {{{2
+    return filter( map(copy(a:cnames), 'self._findChecker(v:val)'), '!empty(v:val)' )
+endfunction " }}}2
+
+function! g:SyntasticRegistry._loadCheckersFor(filetype, force) abort " {{{2
+    if !a:force && has_key(self._checkerMap, a:filetype)
+        return
+    endif
+
+    execute 'runtime! syntax_checkers/' . a:filetype . '/*.vim'
+
+    if !has_key(self._checkerMap, a:filetype)
+        let self._checkerMap[a:filetype] = {}
+    endif
+endfunction " }}}2
+
+" Check for obsolete variable g:syntastic_<filetype>_checker
+function! g:SyntasticRegistry._sanityCheck(filetype) abort " {{{2
+    if exists('g:syntastic_' . a:filetype . '_checkers') &&
+        \ type(g:syntastic_{a:filetype}_checkers) != type([])
+
+        unlet! g:syntastic_{a:filetype}_checkers
+        call syntastic#log#error('variable g:syntastic_' . a:filetype . '_checkers has to be a list of strings')
+    endif
+
+    if exists('g:syntastic_' . a:filetype . '_checker') &&
+        \ !exists('g:syntastic_' . a:filetype . '_checkers') &&
+        \ type(g:syntastic_{a:filetype}_checker) == type('')
+
+        let g:syntastic_{a:filetype}_checkers = [g:syntastic_{a:filetype}_checker]
+        call syntastic#log#oneTimeWarn('variable g:syntastic_' . a:filetype . '_checker is deprecated')
+    endif
+endfunction " }}}2
+
+" }}}1
+
+" Utilities {{{1
+
+"resolve filetype aliases, and replace - with _ otherwise we cant name
+"syntax checker functions legally for filetypes like "gentoo-metadata"
+function! s:_normalise_filetype(ftalias) abort " {{{2
+    let ft = get(s:_DEFAULT_FILETYPE_MAP, a:ftalias, a:ftalias)
+    let ft = get(g:syntastic_filetype_map, ft, ft)
+    let ft = substitute(ft, '\m-', '_', 'g')
+    return ft
+endfunction " }}}2
+
+function! s:_disabled_by_eclim(filetype) abort " {{{2
+    if index(s:_ECLIM_TYPES, a:filetype) >= 0
+        let lang = toupper(a:filetype[0]) . a:filetype[1:]
+        let ft = a:filetype !=# 'cpp' ? lang : 'C'
+        return get(g:, 'Eclim' . lang . 'Validate', 1) && !get(g:, 'Eclim' . ft . 'SyntasticEnabled', 0)
+    endif
+
+    return 0
+endfunction " }}}2
+
+function! s:_disabled_by_ycm(filetype) abort " {{{2
+    return index(s:_YCM_TYPES, a:filetype) >= 0
+endfunction " }}}2
+
+function! s:_compare_checker_names(a, b) abort " {{{2
+    if a:a ==# a:b
+        return 0
+    endif
+
+    if stridx(a:a, '/') < 0
+        if stridx(a:b, '/') < 0
+            return a:a < a:b ? -1 : 1
+        else
+            return -1
+        endif
+    else
+        if stridx(a:b, '/') < 0
+            return 1
+        else
+            return a:a < a:b ? -1 : 1
+        endif
+    endif
+endfunction " }}}2
+
+" }}}1
+
+" vim: set sw=4 sts=4 et fdm=marker:

+ 138 - 0
vim/plugged/syntastic/plugin/syntastic/signs.vim

@@ -0,0 +1,138 @@
+if exists('g:loaded_syntastic_notifier_signs') || !exists('g:loaded_syntastic_plugin')
+    finish
+endif
+let g:loaded_syntastic_notifier_signs = 1
+
+" Initialisation {{{1
+
+" start counting sign ids at 5000, start here to hopefully avoid conflicting
+" with any other code that places signs (not sure if this precaution is
+" actually needed)
+let s:first_sign_id = 5000
+let s:next_sign_id = s:first_sign_id
+
+let g:SyntasticSignsNotifier = {}
+
+let s:setup_done = 0
+
+" }}}1
+
+" Public methods {{{1
+
+function! g:SyntasticSignsNotifier.New() abort " {{{2
+    let newObj = copy(self)
+    return newObj
+endfunction " }}}2
+
+function! g:SyntasticSignsNotifier.enabled() abort " {{{2
+    return has('signs') && syntastic#util#var('enable_signs')
+endfunction " }}}2
+
+function! g:SyntasticSignsNotifier.refresh(loclist) abort " {{{2
+    call syntastic#log#debug(g:_SYNTASTIC_DEBUG_NOTIFICATIONS, 'signs: refresh')
+
+    let old_signs = copy(self._bufSignIds())
+    if self.enabled()
+        if !s:setup_done
+            call self._setup()
+            let s:setup_done = 1
+            lockvar s:setup_done
+        endif
+
+        call self._signErrors(a:loclist)
+    endif
+    call self._removeSigns(old_signs)
+endfunction " }}}2
+
+" }}}1
+
+" Private methods {{{1
+
+" One time setup: define our own sign types and highlighting
+function! g:SyntasticSignsNotifier._setup() abort " {{{2
+    if has('signs')
+        if !hlexists('SyntasticErrorSign')
+            highlight link SyntasticErrorSign error
+        endif
+        if !hlexists('SyntasticWarningSign')
+            highlight link SyntasticWarningSign todo
+        endif
+        if !hlexists('SyntasticStyleErrorSign')
+            highlight link SyntasticStyleErrorSign SyntasticErrorSign
+        endif
+        if !hlexists('SyntasticStyleWarningSign')
+            highlight link SyntasticStyleWarningSign SyntasticWarningSign
+        endif
+        if !hlexists('SyntasticStyleErrorLine')
+            highlight link SyntasticStyleErrorLine SyntasticErrorLine
+        endif
+        if !hlexists('SyntasticStyleWarningLine')
+            highlight link SyntasticStyleWarningLine SyntasticWarningLine
+        endif
+
+        " define the signs used to display syntax and style errors/warns
+        execute 'sign define SyntasticError text=' . g:syntastic_error_symbol .
+            \ ' texthl=SyntasticErrorSign linehl=SyntasticErrorLine'
+        execute 'sign define SyntasticWarning text=' . g:syntastic_warning_symbol .
+            \ ' texthl=SyntasticWarningSign linehl=SyntasticWarningLine'
+        execute 'sign define SyntasticStyleError text=' . g:syntastic_style_error_symbol .
+            \ ' texthl=SyntasticStyleErrorSign linehl=SyntasticStyleErrorLine'
+        execute 'sign define SyntasticStyleWarning text=' . g:syntastic_style_warning_symbol .
+            \ ' texthl=SyntasticStyleWarningSign linehl=SyntasticStyleWarningLine'
+    endif
+endfunction " }}}2
+
+" Place signs by all syntax errors in the buffer
+function! g:SyntasticSignsNotifier._signErrors(loclist) abort " {{{2
+    let loclist = a:loclist
+    if !loclist.isEmpty()
+
+        let buf = bufnr('')
+        if !bufloaded(buf)
+            " signs can be placed only in loaded buffers
+            return
+        endif
+
+        " errors come first, so that they are not masked by warnings
+        let issues = copy(loclist.errors())
+        call extend(issues, loclist.warnings())
+        call filter(issues, 'v:val["bufnr"] == buf')
+        let seen = {}
+
+        for i in issues
+            if i['lnum'] > 0 && !has_key(seen, i['lnum'])
+                let seen[i['lnum']] = 1
+
+                let sign_severity = i['type'] ==? 'W' ? 'Warning' : 'Error'
+                let sign_subtype = get(i, 'subtype', '')
+                let sign_type = 'Syntastic' . sign_subtype . sign_severity
+
+                execute 'sign place ' . s:next_sign_id . ' line=' . i['lnum'] . ' name=' . sign_type . ' buffer=' . i['bufnr']
+                call add(self._bufSignIds(), s:next_sign_id)
+                let s:next_sign_id += 1
+            endif
+        endfor
+    endif
+endfunction " }}}2
+
+" Remove the signs with the given ids from this buffer
+function! g:SyntasticSignsNotifier._removeSigns(ids) abort " {{{2
+    if has('signs')
+        for s in reverse(copy(a:ids))
+            execute 'sign unplace ' . s
+            call remove(self._bufSignIds(), index(self._bufSignIds(), s))
+        endfor
+    endif
+endfunction " }}}2
+
+" Get all the ids of the SyntaxError signs in the buffer
+function! g:SyntasticSignsNotifier._bufSignIds() abort " {{{2
+    if !exists('b:syntastic_private_sign_ids')
+        let b:syntastic_private_sign_ids = []
+    endif
+    return b:syntastic_private_sign_ids
+endfunction " }}}2
+
+" }}}1
+
+" vim: set sw=4 sts=4 et fdm=marker:

+ 67 - 0
vim/plugged/syntastic/syntax_checkers/actionscript/mxmlc.vim

@@ -0,0 +1,67 @@
+"============================================================================
+"File:        mxmlc.vim
+"Description: ActionScript syntax checker - using mxmlc
+"Maintainer:  Andy Earnshaw <andyearnshaw@gmail.com>
+"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 exists('g:loaded_syntastic_actionscript_mxmlc_checker')
+    finish
+endif
+let g:loaded_syntastic_actionscript_mxmlc_checker = 1
+
+let s:save_cpo = &cpo
+set cpo&vim
+
+function! SyntaxCheckers_actionscript_mxmlc_GetHighlightRegex(item)
+    let term = ''
+
+    if match(a:item['text'], '\mvariable ''') > -1
+        let term = matchstr(a:item['text'], '\m''\zs[^'']\+\ze''')
+
+    elseif match(a:item['text'], 'expected a definition keyword') > -1
+        let term = matchstr(a:item['text'], '\mnot \zs[^.]\+\ze\.')
+
+    elseif match(a:item['text'], '\mundefined \%(property\|method\)') > -1
+        let term = matchstr(a:item['text'], '\mundefined \%(property\|method\) \zs[^. ]\+\ze')
+
+    elseif match(a:item['text'], 'could not be found') > -1
+        let term = matchstr(a:item['text'], '\m \zs\S\+\ze could not be found')
+
+    elseif match(a:item['text'], 'Type was not found') > -1
+        let term = matchstr(a:item['text'], '\m: \zs[^.]\+\zs\.')
+
+    endif
+
+    return term !=# '' ? '\V\<' . escape(term, '\') . '\>' : ''
+endfunction
+
+function! SyntaxCheckers_actionscript_mxmlc_GetLocList() dict
+    call syntastic#log#deprecationWarn('actionscript_mxmlc_conf', 'actionscript_mxmlc_args',
+        \ "'-load-config+=' . syntastic#util#shexpand(OLD_VAR)")
+
+    let makeprg = self.makeprgBuild({ 'args_after': '-output=' . syntastic#util#DevNull() })
+
+    let errorformat =
+        \ '%f(%l): col: %c %trror: %m,' .
+        \ '%f(%l): col: %c %tarning: %m,' .
+        \ '%f: %trror: %m,' .
+        \ '%-G%.%#'
+
+    return SyntasticMake({
+        \ 'makeprg': makeprg,
+        \ 'errorformat': errorformat })
+endfunction
+
+call g:SyntasticRegistry.CreateAndRegisterChecker({
+    \ 'filetype': 'actionscript',
+    \ 'name': 'mxmlc'})
+
+let &cpo = s:save_cpo
+unlet s:save_cpo
+
+" vim: set sw=4 sts=4 et fdm=marker:

+ 47 - 0
vim/plugged/syntastic/syntax_checkers/ada/gcc.vim

@@ -0,0 +1,47 @@
+"============================================================================
+"File:        ada.vim
+"Description: Syntax checking plugin for syntastic
+"Maintainer:  Alfredo Di Napoli <alfredo.dinapoli@gmail.com>
+"License:     This program is free software. It comes without any warranty,
+"             to the extent permitted by applicable law.
+"
+"============================================================================
+
+if exists('g:loaded_syntastic_ada_gcc_checker')
+    finish
+endif
+let g:loaded_syntastic_ada_gcc_checker = 1
+
+if !exists('g:syntastic_ada_compiler_options')
+    let g:syntastic_ada_compiler_options = ''
+endif
+
+let s:save_cpo = &cpo
+set cpo&vim
+
+function! SyntaxCheckers_ada_gcc_IsAvailable() dict
+    if !exists('g:syntastic_ada_compiler')
+        let g:syntastic_ada_compiler = self.getExec()
+    endif
+    return executable(expand(g:syntastic_ada_compiler, 1))
+endfunction
+
+function! SyntaxCheckers_ada_gcc_GetLocList() dict
+    return syntastic#c#GetLocList('ada', 'gcc', {
+        \ 'errorformat':
+        \     '%-G%f:%s:,' .
+        \     '%f:%l:%c: %m,' .
+        \     '%f:%l: %m',
+        \ 'main_flags': '-c -x ada -gnats -gnatef',
+        \ 'header_flags': '-S -x ada -gnats -gnatef',
+        \ 'header_names': '\.ads$' })
+endfunction
+
+call g:SyntasticRegistry.CreateAndRegisterChecker({
+    \ 'filetype': 'ada',
+    \ 'name': 'gcc' })
+
+let &cpo = s:save_cpo
+unlet s:save_cpo
+
+" vim: set sw=4 sts=4 et fdm=marker:

Niektoré súbory nie sú zobrazené, pretože je v týchto rozdielových dátach zmenené mnoho súborov