From 0a8ca3c28bffe1743014eb093133d075b97a175f Mon Sep 17 00:00:00 2001 From: Nicolas Djambazian Date: Sat, 20 May 2017 11:33:48 +0200 Subject: [PATCH 01/12] Allow to install custom plugins --- .gitignore | 1 + my_plugins/.gitkeep | 0 vimrcs/plugins_config.vim | 1 + 3 files changed, 2 insertions(+) create mode 100644 my_plugins/.gitkeep diff --git a/.gitignore b/.gitignore index 56dee29f..55273366 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,7 @@ temp_dirs/yankring_history_v2.txt sources_forked/yankring/doc/tags sources_non_forked/tlib/doc/tags sources_non_forked/ctrlp.vim/doc/tags* +my_plugins/ my_configs.vim tags .DS_Store diff --git a/my_plugins/.gitkeep b/my_plugins/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/vimrcs/plugins_config.vim b/vimrcs/plugins_config.vim index e67e5a07..05be1e6d 100644 --- a/vimrcs/plugins_config.vim +++ b/vimrcs/plugins_config.vim @@ -11,6 +11,7 @@ let s:vim_runtime = expand(':p:h')."/.." call pathogen#infect(s:vim_runtime.'/sources_forked/{}') call pathogen#infect(s:vim_runtime.'/sources_non_forked/{}') +call pathogen#infect(s:vim_runtime.'/my_plugins/{}') call pathogen#helptags() """""""""""""""""""""""""""""" From ecc5e2b0cf723ab99d9ff7695a1a8f5a4d001d32 Mon Sep 17 00:00:00 2001 From: redg3ar Date: Wed, 31 May 2017 09:29:07 -0400 Subject: [PATCH 02/12] Speed up download ~4x --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 52efaaaa..85a87914 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,7 @@ I would, of course, recommend using the awesome version. ## How to install the Awesome version? The awesome version includes a lot of great plugins, configurations and color schemes that make Vim a lot better. To install it simply do following from your terminal: - git clone https://github.com/amix/vimrc.git ~/.vim_runtime + git clone --depth=1 https://github.com/amix/vimrc.git ~/.vim_runtime sh ~/.vim_runtime/install_awesome_vimrc.sh I also recommend using [the Hack font](http://sourcefoundry.org/hack/) (it's a free and awesome font designed for source code). The Awesome vimrc is already setup to try to use it. @@ -24,7 +24,7 @@ The basic version is just one file and no plugins. Just copy [basic.vim](https:/ The basic version is useful to install on remote servers where you don't need many plugins, and you don't do many edits. - git clone git://github.com/amix/vimrc.git ~/.vim_runtime + git clone --depth=1 git://github.com/amix/vimrc.git ~/.vim_runtime sh ~/.vim_runtime/install_basic_vimrc.sh From a0996d8224af4d666c39507b498d77d613092b94 Mon Sep 17 00:00:00 2001 From: amix Date: Sun, 16 Jul 2017 14:28:30 +0200 Subject: [PATCH 03/12] Updated plugins --- sources_non_forked/nerdtree/README.markdown | 2 +- .../nerdtree/autoload/nerdtree/ui_glue.vim | 22 +++- .../doc/{NERD_tree.txt => NERDTree.txt} | 2 +- .../nerdtree/lib/nerdtree/tree_dir_node.vim | 114 ++++++++++-------- .../syntastic/doc/syntastic-checkers.txt | 4 +- .../syntastic/plugin/syntastic.vim | 2 +- .../vim-fugitive/plugin/fugitive.vim | 2 +- sources_non_forked/vim-go/.gitignore | 1 + sources_non_forked/vim-go/CHANGELOG.md | 3 + sources_non_forked/vim-go/autoload/go/fmt.vim | 2 +- .../vim-go/autoload/go/textobj.vim | 14 +++ sources_non_forked/vim-go/doc/vim-go.txt | 13 +- sources_non_forked/vim-go/scripts/test.sh | 11 ++ sources_non_forked/vim-go/syntax/go.vim | 2 +- .../javascript/javascript-jasmine.snippets | 2 +- 15 files changed, 130 insertions(+), 66 deletions(-) rename sources_non_forked/nerdtree/doc/{NERD_tree.txt => NERDTree.txt} (99%) diff --git a/sources_non_forked/nerdtree/README.markdown b/sources_non_forked/nerdtree/README.markdown index 19b841bc..48d216b9 100644 --- a/sources_non_forked/nerdtree/README.markdown +++ b/sources_non_forked/nerdtree/README.markdown @@ -59,7 +59,7 @@ Installation git clone https://github.com/scrooloose/nerdtree.git ~/.vim/bundle/nerdtree -Then reload vim, run `:helptags ~/.vim/bundle/nerdtree/doc/`, and check out `:help NERD_tree.txt`. +Then reload Vim, run `:helptags ~/.vim/bundle/nerdtree/doc/`, and check out `:help NERDTree.txt`. #### [apt-vim](https://github.com/egalpin/apt-vim) diff --git a/sources_non_forked/nerdtree/autoload/nerdtree/ui_glue.vim b/sources_non_forked/nerdtree/autoload/nerdtree/ui_glue.vim index 90ce872c..2d94fd9a 100644 --- a/sources_non_forked/nerdtree/autoload/nerdtree/ui_glue.vim +++ b/sources_non_forked/nerdtree/autoload/nerdtree/ui_glue.vim @@ -404,13 +404,27 @@ function! s:jumpToLastChild(node) endfunction " FUNCTION: s:jumpToParent(node) {{{1 -" moves the cursor to the parent of the current node +" Move the cursor to the parent of the specified node. For a cascade, move to +" the parent of the cascade's highest node. At the root, do nothing. function! s:jumpToParent(node) - if !empty(a:node.parent) - call a:node.parent.putCursorHere(1, 0) + let l:parent = a:node.parent + + " If "a:node" represents a directory, back out of its cascade. + if a:node.path.isDirectory + while !empty(l:parent) && !l:parent.isRoot() + if index(l:parent.getCascade(), a:node) >= 0 + let l:parent = l:parent.parent + else + break + endif + endwhile + endif + + if !empty(l:parent) + call l:parent.putCursorHere(1, 0) call b:NERDTree.ui.centerView() else - call nerdtree#echo("cannot jump to parent") + call nerdtree#echo('could not jump to parent node') endif endfunction diff --git a/sources_non_forked/nerdtree/doc/NERD_tree.txt b/sources_non_forked/nerdtree/doc/NERDTree.txt similarity index 99% rename from sources_non_forked/nerdtree/doc/NERD_tree.txt rename to sources_non_forked/nerdtree/doc/NERDTree.txt index 427e90c7..f68880cd 100644 --- a/sources_non_forked/nerdtree/doc/NERD_tree.txt +++ b/sources_non_forked/nerdtree/doc/NERDTree.txt @@ -1,4 +1,4 @@ -*NERD_tree.txt* A tree explorer plugin that owns your momma! +*NERDTree.txt* A tree explorer plugin that owns your momma! diff --git a/sources_non_forked/nerdtree/lib/nerdtree/tree_dir_node.vim b/sources_non_forked/nerdtree/lib/nerdtree/tree_dir_node.vim index 61f72e4a..5ca94d4f 100644 --- a/sources_non_forked/nerdtree/lib/nerdtree/tree_dir_node.vim +++ b/sources_non_forked/nerdtree/lib/nerdtree/tree_dir_node.vim @@ -45,9 +45,14 @@ function! s:TreeDirNode.addChild(treenode, inOrder) endfunction " FUNCTION: TreeDirNode.close() {{{1 -" Closes this directory +" Mark this TreeDirNode as closed. function! s:TreeDirNode.close() - let self.isOpen = 0 + + " Close all directories in this directory node's cascade. This is + " necessary to ensure consistency when cascades are rendered. + for l:dirNode in self.getCascade() + let l:dirNode.isOpen = 0 + endfor endfunction " FUNCTION: TreeDirNode.closeChildren() {{{1 @@ -78,19 +83,29 @@ function! s:TreeDirNode.createChild(path, inOrder) endfunction " FUNCTION: TreeDirNode.displayString() {{{1 -unlet s:TreeDirNode.displayString +" Assemble and return a string that can represent this TreeDirNode object in +" the NERDTree window. function! s:TreeDirNode.displayString() - let cascade = self.getCascade() - let rv = "" - for node in cascade - let rv = rv . node.path.displayString() + let l:result = '' + + " Build a label that identifies this TreeDirNode. + let l:label = '' + let l:cascade = self.getCascade() + for l:dirNode in l:cascade + let l:label .= l:dirNode.path.displayString() endfor - let sym = cascade[-1].isOpen ? g:NERDTreeDirArrowCollapsible : g:NERDTreeDirArrowExpandable + " Select the appropriate open/closed status indicator symbol. + if l:cascade[-1].isOpen + let l:symbol = g:NERDTreeDirArrowCollapsible + else + let l:symbol = g:NERDTreeDirArrowExpandable + endif - let flags = cascade[-1].path.flagSet.renderToString() + let l:flags = l:cascade[-1].path.flagSet.renderToString() - return sym . ' ' . flags . rv + let l:result = l:symbol . ' ' . l:flags . l:label + return l:result endfunction " FUNCTION: TreeDirNode.findNode(path) {{{1 @@ -400,25 +415,39 @@ function! s:TreeDirNode.New(path, nerdtree) return newTreeNode endfunction -" FUNCTION: TreeDirNode.open([opts]) {{{1 -" Open the dir in the current tree or in a new tree elsewhere. -" -" If opening in the current tree, return the number of cached nodes. -unlet s:TreeDirNode.open +" FUNCTION: TreeDirNode.open([options]) {{{1 +" Open this directory node in the current tree or elsewhere if special options +" are provided. Return 0 if options were processed. Otherwise, return the +" number of new cached nodes. function! s:TreeDirNode.open(...) - let opts = a:0 ? a:1 : {} + let l:options = a:0 ? a:1 : {} - if has_key(opts, 'where') && !empty(opts['where']) - let opener = g:NERDTreeOpener.New(self.path, opts) - call opener.open(self) - else - let self.isOpen = 1 - if self.children ==# [] - return self._initChildren(0) - else - return 0 - endif + " If special options were specified, process them and return. + if has_key(l:options, 'where') && !empty(l:options['where']) + let l:opener = g:NERDTreeOpener.New(self.path, l:options) + call l:opener.open(self) + return 0 endif + + " Open any ancestors of this node that render within the same cascade. + let l:parent = self.parent + while !empty(l:parent) && !l:parent.isRoot() + if index(l:parent.getCascade(), self) >= 0 + let l:parent.isOpen = 1 + let l:parent = l:parent.parent + else + break + endif + endwhile + + let self.isOpen = 1 + + let l:numChildrenCached = 0 + if empty(self.children) + let l:numChildrenCached = self._initChildren(0) + endif + + return l:numChildrenCached endfunction " FUNCTION: TreeDirNode.openAlong([opts]) {{{1 @@ -463,35 +492,16 @@ function! s:TreeDirNode._openInNewTab() endfunction " FUNCTION: TreeDirNode.openRecursively() {{{1 -" Opens this treenode and all of its children whose paths arent 'ignored' -" because of the file filters. -" -" This method is actually a wrapper for the OpenRecursively2 method which does -" the work. +" Open this directory node and any descendant directory nodes whose pathnames +" are not ignored. function! s:TreeDirNode.openRecursively() - call self._openRecursively2(1) -endfunction + silent call self.open() -" FUNCTION: TreeDirNode._openRecursively2() {{{1 -" Opens this all children of this treenode recursively if either: -" *they arent filtered by file filters -" *a:forceOpen is 1 -" -" Args: -" forceOpen: 1 if this node should be opened regardless of file filters -function! s:TreeDirNode._openRecursively2(forceOpen) - if self.path.ignore(self.getNerdtree()) ==# 0 || a:forceOpen - let self.isOpen = 1 - if self.children ==# [] - call self._initChildren(1) + for l:child in self.children + if l:child.path.isDirectory && !l:child.path.ignore(l:child.getNerdtree()) + call l:child.openRecursively() endif - - for i in self.children - if i.path.isDirectory ==# 1 - call i._openRecursively2(0) - endif - endfor - endif + endfor endfunction " FUNCTION: TreeDirNode.refresh() {{{1 diff --git a/sources_non_forked/syntastic/doc/syntastic-checkers.txt b/sources_non_forked/syntastic/doc/syntastic-checkers.txt index e4d7b15e..c8fac05e 100644 --- a/sources_non_forked/syntastic/doc/syntastic-checkers.txt +++ b/sources_non_forked/syntastic/doc/syntastic-checkers.txt @@ -2857,7 +2857,9 @@ Checker options~ This checker is initialised using the "makeprgBuild()" function and thus it accepts the standard options described at |syntastic-config-makeprg|. -Note~ +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' diff --git a/sources_non_forked/syntastic/plugin/syntastic.vim b/sources_non_forked/syntastic/plugin/syntastic.vim index 67dc0d93..5c1b1e74 100644 --- a/sources_non_forked/syntastic/plugin/syntastic.vim +++ b/sources_non_forked/syntastic/plugin/syntastic.vim @@ -19,7 +19,7 @@ if has('reltime') lockvar! g:_SYNTASTIC_START endif -let g:_SYNTASTIC_VERSION = '3.8.0-60' +let g:_SYNTASTIC_VERSION = '3.8.0-63' lockvar g:_SYNTASTIC_VERSION " Sanity checks {{{1 diff --git a/sources_non_forked/vim-fugitive/plugin/fugitive.vim b/sources_non_forked/vim-fugitive/plugin/fugitive.vim index fba368dd..de10198b 100644 --- a/sources_non_forked/vim-fugitive/plugin/fugitive.vim +++ b/sources_non_forked/vim-fugitive/plugin/fugitive.vim @@ -724,7 +724,7 @@ function! s:Git(bang, args) abort let git .= ' --no-pager' endif let args = matchstr(a:args,'\v\C.{-}%($|\\@ :GoAddTags json,omitempty < @@ -981,6 +981,8 @@ af "a function", select contents from a function definition to the closing bracket. If |'g:go_textobj_include_function_doc'| is enabled it also includes the comment doc for a function declaration. This text-object also supports literal functions. + If |'g:go_textobj_include_variable'| is enabled it also + includes the variable of an function assignment *go-v_if* *go-if* if "inside a function", select contents of a function, @@ -1348,6 +1350,13 @@ Consider the comment above a function to be part of the function when using the `af` text object and `[[` motion. By default it's enabled. > let g:go_textobj_include_function_doc = 1 +< + *'g:go_textobj_include_variable'* + +Consider the variable of an function assignment to be part of the anonymous +function when using the `af` text object. By default it's enabled. > + + let g:go_textobj_include_variable = 1 < *'g:go_metalinter_autosave'* diff --git a/sources_non_forked/vim-go/scripts/test.sh b/sources_non_forked/vim-go/scripts/test.sh index 7c913ab8..ccd1b6ba 100644 --- a/sources_non_forked/vim-go/scripts/test.sh +++ b/sources_non_forked/vim-go/scripts/test.sh @@ -32,3 +32,14 @@ if [ -f "FAILED" ]; then exit 1 fi echo 2>&1 "PASS" + +# Run vimhelplint +[ -d vim-vimhelplint ] || git clone https://github.com/machakann/vim-vimhelplint +echo "Running vimhelplint" +lint=$(vim -esN --cmd 'set rtp+=./vim-vimhelplint' -c 'filetype plugin on' \ + -c 'e ../doc/vim-go.txt' -c 'verb VimhelpLintEcho' -c q 2>&1) +if [ -n "$lint" ]; then + exit 1 +else + exit 0 +fi diff --git a/sources_non_forked/vim-go/syntax/go.vim b/sources_non_forked/vim-go/syntax/go.vim index 83f6e8ff..187ba67c 100644 --- a/sources_non_forked/vim-go/syntax/go.vim +++ b/sources_non_forked/vim-go/syntax/go.vim @@ -321,7 +321,7 @@ hi def link goField Identifier " Structs & Interfaces; if g:go_highlight_types != 0 - syn match goTypeConstructor /\<\w\+{/he=e-1 + syn match goTypeConstructor /\<\w\+{\@=/he=e-1 syn match goTypeDecl /\/ nextgroup=goTypeName skipwhite skipnl syn match goTypeName /\w\+/ contained nextgroup=goDeclType skipwhite skipnl syn match goDeclType /\<\(interface\|struct\)\>/ skipwhite skipnl diff --git a/sources_non_forked/vim-snippets/snippets/javascript/javascript-jasmine.snippets b/sources_non_forked/vim-snippets/snippets/javascript/javascript-jasmine.snippets index 7045c5f7..8cae81a3 100644 --- a/sources_non_forked/vim-snippets/snippets/javascript/javascript-jasmine.snippets +++ b/sources_non_forked/vim-snippets/snippets/javascript/javascript-jasmine.snippets @@ -80,7 +80,7 @@ snippet et "expect to be truthy (js)" snippet ef "expect to be falsy (js)" expect(${1:target}).toBeFalsy(); -snippet ed "expect to be defined (js)" +snippet etbd "expect to be defined (js)" expect(${1:target}).toBeDefined(); snippet eud "expect to be defined (js)" From 2ef74326f064c17f2309e1e2b5930e67c0fefc3c Mon Sep 17 00:00:00 2001 From: amix Date: Sun, 16 Jul 2017 14:33:43 +0200 Subject: [PATCH 04/12] Fixed https://github.com/tpope/tpope-vim-abolish --- .../tpope-vim-abolish/.gitignore | 1 + .../tpope-vim-abolish/CONTRIBUTING.markdown | 1 + .../tpope-vim-abolish/README.markdown | 150 +++++ .../tpope-vim-abolish/doc/abolish.txt | 181 +++++ .../tpope-vim-abolish/plugin/abolish.vim | 631 ++++++++++++++++++ update_plugins.py | 1 + 6 files changed, 965 insertions(+) create mode 100644 sources_non_forked/tpope-vim-abolish/.gitignore create mode 100644 sources_non_forked/tpope-vim-abolish/CONTRIBUTING.markdown create mode 100644 sources_non_forked/tpope-vim-abolish/README.markdown create mode 100644 sources_non_forked/tpope-vim-abolish/doc/abolish.txt create mode 100644 sources_non_forked/tpope-vim-abolish/plugin/abolish.vim diff --git a/sources_non_forked/tpope-vim-abolish/.gitignore b/sources_non_forked/tpope-vim-abolish/.gitignore new file mode 100644 index 00000000..0a56e3fc --- /dev/null +++ b/sources_non_forked/tpope-vim-abolish/.gitignore @@ -0,0 +1 @@ +/doc/tags diff --git a/sources_non_forked/tpope-vim-abolish/CONTRIBUTING.markdown b/sources_non_forked/tpope-vim-abolish/CONTRIBUTING.markdown new file mode 100644 index 00000000..b3f00951 --- /dev/null +++ b/sources_non_forked/tpope-vim-abolish/CONTRIBUTING.markdown @@ -0,0 +1 @@ +See the [contribution guidelines for pathogen.vim](https://github.com/tpope/vim-pathogen/blob/master/CONTRIBUTING.markdown). diff --git a/sources_non_forked/tpope-vim-abolish/README.markdown b/sources_non_forked/tpope-vim-abolish/README.markdown new file mode 100644 index 00000000..beb696cb --- /dev/null +++ b/sources_non_forked/tpope-vim-abolish/README.markdown @@ -0,0 +1,150 @@ +# abolish.vim + +I sat on this plugin for 3 years before releasing it, primarily +because it's so gosh darn hard to explain. It's three superficially +unrelated plugins in one that share a common theme: working with +variants of a word. + +## Abbreviation + +I know how to spell "separate". I know how to spell "desperate". My +fingers, however, have trouble distinguishing between the two, and I +invariably have a 50 percent chance of typing "seperate" or "desparate" +each time one of these comes up. At first, I tried abbreviations: + + :iabbrev seperate separate + :iabbrev desparate desperate + +But this falls short at the beginning of a sentence. + + :iabbrev Seperate Separate + :iabbrev Desparate Desperate + +To be really thorough, we need uppercase too! + + :iabbrev SEPERATE SEPARATE + :iabbrev DESPARATE DESPERATE + +Oh, but consider the noun form, and the adverb form! + + :iabbrev seperation separation + :iabbrev desparation desperation + :iabbrev seperately separately + :iabbrev desparately desperately + :iabbrev Seperation separation + :iabbrev Desparation Desperation + :iabbrev Seperately Separately + :iabbrev Desparately Desperately + :iabbrev SEPERATION SEPARATION + :iabbrev DESPARATION DESPERATION + :iabbrev SEPERATELY SEPARATELY + :iabbrev DESPARATELY DESPERATELY + +Wait, there's also "separates", "separated", "separating", +"separations", "separator"... + +Abolish.vim provides a simpler way. The following one command produces +48 abbreviations including all of the above. + + :Abolish {despa,sepe}rat{e,es,ed,ing,ely,ion,ions,or} {despe,sepa}rat{} + +My current configuration has 25 Abolish commands that create hundreds of +corrections my fingers refuse to learn. + +## Substitution + +One time I had an application with a domain model called +"facility" that needed to be renamed to "building". So, a simple +search and replace, right? + + :%s/facility/building/g + +Oh, but the case variants! + + :%s/Facility/Building/g + :%s/FACILITY/BUILDING/g + +Wait, the plural is more than "s" so we need to get that too! + + :%s/facilities/buildings/g + :%s/Facilities/Buildings/g + :%s/FACILITIES/BUILDINGS/g + +Abolish.vim has your back. One command to do all six, and you can +repeat it with `&` too! + + :%Subvert/facilit{y,ies}/building{,s}/g + +From a conceptual level, one way to think about how this substitution +works is to imagine that in the braces you are declaring the +requirements for turning that word from singular to plural. In +the facility example, the same base letters in both the singular +and plural form of the word are `facilit` To turn "facility" to a +plural word you must change the `y` to `ies` so you specify +`{y,ies}` in the braces. + +To convert the word "building" from singular to plural, again +look at the common letters between the singular and plural forms: +`building`. In this case you do not need to remove any letter +from building to turn it into plural form and you need to +add an `s` so the braces should be `{,s}`. + +A few more examples: + +Address to Reference + + :Subvert/address{,es}/reference{,s}/g + +Blog to Post (you can just do this with a regular :s also) + + :Subvert/blog{,s}/post{,s}/g + +Child to Adult + + :Subvert/child{,ren}/adult{,s}/g + +Be amazed as it correctly turns the word children into the word adults! + +Die to Spinner + + :Subvert/di{e,ce}/spinner{,s}/g + +You can abbreviate it as `:S`, and it accepts the full range of flags +including things like `c` (confirm). + +There's also a variant for searching and a variant for grepping. + +## Coercion + +Want to turn `fooBar` into `foo_bar`? Press `crs` (coerce to +snake\_case). MixedCase (`crm`), camelCase (`crc`), snake\_case +(`crs`), UPPER\_CASE (`cru`), dash-case (`cr-`), dot.case (`cr.`), +space case (`cr`), and Title Case (`crt`) are all just 3 +keystrokes away. These commands support +[repeat.vim](https://github.com/tpope/vim-repeat). + +## 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/tpope/vim-abolish.git + +Once help tags have been generated, you can view the manual with +`:help abolish`. + +## Self-Promotion + +Like abolish.vim? Follow the repository on +[GitHub](https://github.com/tpope/vim-abolish) and vote for it on +[vim.org](http://www.vim.org/scripts/script.php?script_id=1545). And if +you're feeling especially charitable, follow [tpope](http://tpo.pe/) on +[Twitter](http://twitter.com/tpope) and +[GitHub](https://github.com/tpope). + +## License + +Copyright (c) Tim Pope. Distributed under the same terms as Vim itself. +See `:help license`. diff --git a/sources_non_forked/tpope-vim-abolish/doc/abolish.txt b/sources_non_forked/tpope-vim-abolish/doc/abolish.txt new file mode 100644 index 00000000..91f24da9 --- /dev/null +++ b/sources_non_forked/tpope-vim-abolish/doc/abolish.txt @@ -0,0 +1,181 @@ +*abolish.txt* Language friendly searches, substitutions, and abbreviations + +Author: Tim Pope +License: Same terms as Vim itself (see |license|) + +This plugin is only available if 'compatible' is not set. + +INTRODUCTION *abolish* *:Abolish* *:Subvert* + +Abolish lets you quickly find, substitute, and abbreviate several variations +of a word at once. By default, three case variants (foo, Foo, and FOO) are +operated on by every command. + +Two commands are provided. :Abolish is the most general interface. +:Subvert provides an alternative, more concise syntax for searching and +substituting. +> + :Abolish [options] {abbreviation} {replacement} + :Abolish -delete [options] {abbreviation} + + :Abolish -search [options] {pattern} + :Subvert/{pattern}[/flags] + :Abolish!-search [options] {pattern} + :Subvert?{pattern}[?flags] + + :Abolish -search [options] {pattern} {grep-arguments} + :Subvert /{pattern}/[flags] {grep-options} + :Abolish!-search [options] {pattern} {grep-arguments} + :Subvert!/{pattern}/[flags] {grep-options} + + :[range]Abolish -substitute [options] {pattern} {replacement} + :[range]Subvert/{pattern}/{replacement}[/flags] +< + *:S* +In addition to the :Subvert command, a :S synonym is provided if not +already defined. This will be used in examples below. + +PATTERNS *abolish-patterns* + +Patterns can include brace pairs that contain comma separated alternatives: + + box{,es} => box, boxes, Box, Boxes, BOX, BOXES + +For commands with a replacement, corresponding brace pairs are used in both +halves. If the replacement should be identical to the pattern, an empty +brace pair may be used. If fewer replacements are given than were given in +the pattern, they are looped. That is, {a,b} on the replacement side is the +same as {a,b,a,b,a,b,...} repeated indefinitely. + +The following replaces several different misspellings of "necessary": +> + :%S/{,un}nec{ce,ces,e}sar{y,ily}/{}nec{es}sar{}/g +< +ABBREVIATING *abolish-abbrev* + +By default :Abolish creates abbreviations, which replace words automatically +as you type. This is good for words you frequently misspell, or as +shortcuts for longer words. Since these are just Vim abbreviations, only +whole words will match. +> + :Abolish anomol{y,ies} anomal{} + :Abolish {,in}consistant{,ly} {}consistent{} + :Abolish Tqbf The quick, brown fox jumps over the lazy dog +< +Accepts the following options: + + -buffer: buffer local + -cmdline: work in command line in addition to insert mode + +A good place to define abbreviations is "after/plugin/abolish.vim", +relative to ~\vimfiles on Windows and ~/.vim everywhere else. + +With a bang (:Abolish!) the abbreviation is also appended to the file in +g:abolish_save_file. The default is "after/plugin/abolish.vim", relative +to the install directory. + +Abbreviations can be removed with :Abolish -delete: +> + Abolish -delete -buffer -cmdline anomol{y,ies} +< +SEARCHING *abolish-search* + +The -search command does a search in a manner similar to / key. +search. After searching, you can use |n| and |N| as you would with a normal +search. + +The following will search for box, Box, and BOX: +> + :Abolish -search box +< +When given a single word to operate on, :Subvert defaults to doing a +search as well: +> + :S/box/ +< +This one searches for box, boxes, boxed, boxing, Box, Boxes, Boxed, Boxing, +BOX, BOXES, BOXED, and BOXING: +> + :S/box{,es,ed,ing}/ +< +The following syntaxes search in reverse. +> + :Abolish! -search box + :S?box? +< +Flags can be given with the -flags= option to :Abolish, or by appending them +after the separator to :Subvert. The flags trigger the following behaviors: + + I: Disable case variations (box, Box, BOX) + v: Match inside variable names (match my_box, myBox, but not mybox) + w: Match whole words (like surrounding with \< and \>) + +A |search-offset| may follow the flags. +> + :Abolish -search -flags=avs+1 box + :S?box{,es,ed,ing}?we +< +GREPPING *abolish-grep* + +Grepping works similar to searching, and is invoked when additional options +are given. These options are passed directly to the :grep command. +> + :Abolish -search box{,es} + :S /box{,es}/ * + :S /box/aw *.txt *.html +< +The slash delimiters must both be present if used with :Subvert. They may +both be omitted if no flags are used. + +Both an external grepprg and vimgrep (via grepprg=internal) are supported. +With an external grep, the "v" flag behaves less intelligently, due to the +lack of look ahead and look behind support in grep regexps. + +SUBSTITUTING *abolish-substitute* + +Giving a range switches :Subvert into substitute mode. This command will +change box -> bag, boxes -> bags, Box -> Bag, Boxes -> Bags, BOX -> BAG, +BOXES -> BAGS across the entire document: +> + :%Abolish -substitute -flags=g box{,es} bag{,s} + :%S/box{,es}/bag{,s}/g +< +The "c", "e", "g", and "n" flags can be used from the substitute command +|:s_flags|, along with the "a", "I", "v", and "w" flags from searching. + +COERCION *abolish-coercion* *cr* + +Abolish's case mutating algorithms can be applied to the word under the cursor +using the cr mapping (mnemonic: CoeRce) followed by one of the following +characters: + + c: camelCase + m: MixedCase + _: snake_case + s: snake_case + u: SNAKE_UPPERCASE + U: SNAKE_UPPERCASE + -: dash-case (not usually reversible; see |abolish-coercion-reversible|) + k: kebab-case (not usually reversible; see |abolish-coercion-reversible|) + .: dot.case (not usually reversible; see |abolish-coercion-reversible|) + : space case (not usually reversible; see |abolish-coercion-reversible|) + t: Title Case (not usually reversible; see |abolish-coercion-reversible|) + +For example, cru on a lowercase word is a slightly easier to type equivalent +to gUiw. + +COERCION REVERSIBILITY *abolish-coercion-reversible* + +Some separators, such as "-" and ".", are listed as "not usually reversible". +The reason is that these are not "keyword characters", so vim (and +abolish.vim) will treat them as breaking a word. + +For example: "key_word" is a single keyword. The dash-case version, +"key-word", is treated as two keywords, "key" and "word". + +This behaviour is governed by the 'iskeyword' option. If a separator appears +in 'iskeyword', the corresponding coercion will be reversible. For instance, +dash-case is reversible in 'lisp' files, and dot-case is reversible in R +files. + + vim:tw=78:ts=8:ft=help:norl: diff --git a/sources_non_forked/tpope-vim-abolish/plugin/abolish.vim b/sources_non_forked/tpope-vim-abolish/plugin/abolish.vim new file mode 100644 index 00000000..e2486c11 --- /dev/null +++ b/sources_non_forked/tpope-vim-abolish/plugin/abolish.vim @@ -0,0 +1,631 @@ +" abolish.vim - Language friendly searches, substitutions, and abbreviations +" Maintainer: Tim Pope +" Version: 1.1 +" GetLatestVimScripts: 1545 1 :AutoInstall: abolish.vim + +" Initialization {{{1 + +if exists("g:loaded_abolish") || &cp || v:version < 700 + finish +endif +let g:loaded_abolish = 1 + +if !exists("g:abolish_save_file") + if isdirectory(expand("~/.vim")) + let g:abolish_save_file = expand("~/.vim/after/plugin/abolish.vim") + elseif isdirectory(expand("~/vimfiles")) || has("win32") + let g:abolish_save_file = expand("~/vimfiles/after/plugin/abolish.vim") + else + let g:abolish_save_file = expand("~/.vim/after/plugin/abolish.vim") + endif +endif + +" }}}1 +" Utility functions {{{1 + +function! s:function(name) + return function(substitute(a:name,'^s:',matchstr(expand(''), '\d\+_'),'')) +endfunction + +function! s:send(self,func,...) + if type(a:func) == type('') || type(a:func) == type(0) + let Func = get(a:self,a:func,'') + else + let Func = a:func + endif + let s = type(a:self) == type({}) ? a:self : {} + if type(Func) == type(function('tr')) + return call(Func,a:000,s) + elseif type(Func) == type({}) && has_key(Func,'apply') + return call(Func.apply,a:000,Func) + elseif type(Func) == type({}) && has_key(Func,'call') + return call(Func.call,a:000,s) + elseif type(Func) == type('') && Func == '' && has_key(s,'function missing') + return call('s:send',[s,'function missing',a:func] + a:000) + else + return Func + endif +endfunction + +let s:object = {} +function! s:object.clone(...) + let sub = deepcopy(self) + return a:0 ? extend(sub,a:1) : sub +endfunction + +if !exists("g:Abolish") + let Abolish = {} +endif +call extend(Abolish, s:object, 'force') +call extend(Abolish, {'Coercions': {}}, 'keep') + +function! s:throw(msg) + let v:errmsg = a:msg + throw "Abolish: ".a:msg +endfunction + +function! s:words() + let words = [] + let lnum = line('w0') + while lnum <= line('w$') + let line = getline(lnum) + let col = 0 + while match(line,'\<\k\k\+\>',col) != -1 + let words += [matchstr(line,'\<\k\k\+\>',col)] + let col = matchend(line,'\<\k\k\+\>',col) + endwhile + let lnum += 1 + endwhile + return words +endfunction + +function! s:extractopts(list,opts) + let i = 0 + while i < len(a:list) + if a:list[i] =~ '^-[^=]' && has_key(a:opts,matchstr(a:list[i],'-\zs[^=]*')) + let key = matchstr(a:list[i],'-\zs[^=]*') + let value = matchstr(a:list[i],'=\zs.*') + if type(get(a:opts,key)) == type([]) + let a:opts[key] += [value] + elseif type(get(a:opts,key)) == type(0) + let a:opts[key] = 1 + else + let a:opts[key] = value + endif + else + let i += 1 + continue + endif + call remove(a:list,i) + endwhile + return a:opts +endfunction + +" }}}1 +" Dictionary creation {{{1 + +function! s:mixedcase(word) + return substitute(s:camelcase(a:word),'^.','\u&','') +endfunction + +function! s:camelcase(word) + let word = substitute(a:word, '-', '_', 'g') + if word !~# '_' && word =~# '\l' + return substitute(word,'^.','\l&','') + else + return substitute(word,'\C\(_\)\=\(.\)','\=submatch(1)==""?tolower(submatch(2)) : toupper(submatch(2))','g') + endif +endfunction + +function! s:snakecase(word) + let word = substitute(a:word,'::','/','g') + let word = substitute(word,'\(\u\+\)\(\u\l\)','\1_\2','g') + let word = substitute(word,'\(\l\|\d\)\(\u\)','\1_\2','g') + let word = substitute(word,'[.-]','_','g') + let word = tolower(word) + return word +endfunction + +function! s:uppercase(word) + return toupper(s:snakecase(a:word)) +endfunction + +function! s:dashcase(word) + return substitute(s:snakecase(a:word),'_','-','g') +endfunction + +function! s:spacecase(word) + return substitute(s:snakecase(a:word),'_',' ','g') +endfunction + +function! s:dotcase(word) + return substitute(s:snakecase(a:word),'_','.','g') +endfunction + +function! s:titlecase(word) + return substitute(s:spacecase(a:word), '\(\<\w\)','\=toupper(submatch(1))','g') +endfunction + +call extend(Abolish, { + \ 'camelcase': s:function('s:camelcase'), + \ 'mixedcase': s:function('s:mixedcase'), + \ 'snakecase': s:function('s:snakecase'), + \ 'uppercase': s:function('s:uppercase'), + \ 'dashcase': s:function('s:dashcase'), + \ 'dotcase': s:function('s:dotcase'), + \ 'spacecase': s:function('s:spacecase'), + \ 'titlecase': s:function('s:titlecase') + \ }, 'keep') + +function! s:create_dictionary(lhs,rhs,opts) + let dictionary = {} + let i = 0 + let expanded = s:expand_braces({a:lhs : a:rhs}) + for [lhs,rhs] in items(expanded) + if get(a:opts,'case',1) + let dictionary[s:mixedcase(lhs)] = s:mixedcase(rhs) + let dictionary[tolower(lhs)] = tolower(rhs) + let dictionary[toupper(lhs)] = toupper(rhs) + endif + let dictionary[lhs] = rhs + endfor + let i += 1 + return dictionary +endfunction + +function! s:expand_braces(dict) + let new_dict = {} + for [key,val] in items(a:dict) + if key =~ '{.*}' + let redo = 1 + let [all,kbefore,kmiddle,kafter;crap] = matchlist(key,'\(.\{-\}\){\(.\{-\}\)}\(.*\)') + let [all,vbefore,vmiddle,vafter;crap] = matchlist(val,'\(.\{-\}\){\(.\{-\}\)}\(.*\)') + ["","","",""] + if all == "" + let [vbefore,vmiddle,vafter] = [val, ",", ""] + endif + let targets = split(kmiddle,',',1) + let replacements = split(vmiddle,',',1) + if replacements == [""] + let replacements = targets + endif + for i in range(0,len(targets)-1) + let new_dict[kbefore.targets[i].kafter] = vbefore.replacements[i%len(replacements)].vafter + endfor + else + let new_dict[key] = val + endif + endfor + if exists("redo") + return s:expand_braces(new_dict) + else + return new_dict + endif +endfunction + +" }}}1 +" Abolish Dispatcher {{{1 + +function! s:SubComplete(A,L,P) + if a:A =~ '^[/?]\k\+$' + let char = strpart(a:A,0,1) + return join(map(s:words(),'char . v:val'),"\n") + elseif a:A =~# '^\k\+$' + return join(s:words(),"\n") + endif +endfunction + +function! s:Complete(A,L,P) + let g:L = a:L + " Vim bug: :Abolish - calls this function with a:A equal to 0 + if a:A =~# '^[^/?-]' && type(a:A) != type(0) + return join(s:words(),"\n") + elseif a:L =~# '^\w\+\s\+\%(-\w*\)\=$' + return "-search\n-substitute\n-delete\n-buffer\n-cmdline\n" + elseif a:L =~# ' -\%(search\|substitute\)\>' + return "-flags=" + else + return "-buffer\n-cmdline" + endif +endfunction + +let s:commands = {} +let s:commands.abstract = s:object.clone() + +function! s:commands.abstract.dispatch(bang,line1,line2,count,args) + return self.clone().go(a:bang,a:line1,a:line2,a:count,a:args) +endfunction + +function! s:commands.abstract.go(bang,line1,line2,count,args) + let self.bang = a:bang + let self.line1 = a:line1 + let self.line2 = a:line2 + let self.count = a:count + return self.process(a:bang,a:line1,a:line2,a:count,a:args) +endfunction + +function! s:dispatcher(bang,line1,line2,count,args) + let i = 0 + let args = copy(a:args) + let command = s:commands.abbrev + while i < len(args) + if args[i] =~# '^-\w\+$' && has_key(s:commands,matchstr(args[i],'-\zs.*')) + let command = s:commands[matchstr(args[i],'-\zs.*')] + call remove(args,i) + break + endif + let i += 1 + endwhile + try + return command.dispatch(a:bang,a:line1,a:line2,a:count,args) + catch /^Abolish: / + echohl ErrorMsg + echo v:errmsg + echohl NONE + return "" + endtry +endfunction + +" }}}1 +" Subvert Dispatcher {{{1 + +function! s:subvert_dispatcher(bang,line1,line2,count,args) + try + return s:parse_subvert(a:bang,a:line1,a:line2,a:count,a:args) + catch /^Subvert: / + echohl ErrorMsg + echo v:errmsg + echohl NONE + return "" + endtry +endfunction + +function! s:parse_subvert(bang,line1,line2,count,args) + if a:args =~ '^\%(\w\|$\)' + let args = (a:bang ? "!" : "").a:args + else + let args = a:args + endif + let separator = matchstr(args,'^.') + let split = split(args,separator,1)[1:] + if a:count || split == [""] + return s:parse_substitute(a:bang,a:line1,a:line2,a:count,split) + elseif len(split) == 1 + return s:find_command(separator,"",split[0]) + elseif len(split) == 2 && split[1] =~# '^[A-Za-z]*n[A-Za-z]*$' + return s:parse_substitute(a:bang,a:line1,a:line2,a:count,[split[0],"",split[1]]) + elseif len(split) == 2 && split[1] =~# '^[A-Za-z]*\%([+-]\d\+\)\=$' + return s:find_command(separator,split[1],split[0]) + elseif len(split) >= 2 && split[1] =~# '^[A-Za-z]* ' + let flags = matchstr(split[1],'^[A-Za-z]*') + let rest = matchstr(join(split[1:],separator),' \zs.*') + return s:grep_command(rest,a:bang,flags,split[0]) + elseif len(split) >= 2 && separator == ' ' + return s:grep_command(join(split[1:],' '),a:bang,"",split[0]) + else + return s:parse_substitute(a:bang,a:line1,a:line2,a:count,split) + endif +endfunction + +function! s:normalize_options(flags) + if type(a:flags) == type({}) + let opts = a:flags + let flags = get(a:flags,"flags","") + else + let opts = {} + let flags = a:flags + endif + let g:op1 = copy(opts) + if flags =~# 'w' + let opts.boundaries = 2 + elseif flags =~# 'v' + let opts.boundaries = 1 + elseif !has_key(opts,'boundaries') + let opts.boundaries = 0 + endif + let opts.case = (flags !~# 'I' ? get(opts,'case',1) : 0) + let opts.flags = substitute(flags,'\C[avIiw]','','g') + let g:op2 = copy(opts) + return opts +endfunction + +" }}}1 +" Searching {{{1 + +function! s:subesc(pattern) + return substitute(a:pattern,'[][\\/.*+?~%()&]','\\&','g') +endfunction + +function! s:sort(a,b) + if a:a ==? a:b + return a:a == a:b ? 0 : a:a > a:b ? 1 : -1 + elseif strlen(a:a) == strlen(a:b) + return a:a >? a:b ? 1 : -1 + else + return strlen(a:a) < strlen(a:b) ? 1 : -1 + endif +endfunction + +function! s:pattern(dict,boundaries) + if a:boundaries == 2 + let a = '<' + let b = '>' + elseif a:boundaries + let a = '%(<|_@<=|[[:lower:]]@<=[[:upper:]]@=)' + let b = '%(>|_@=|[[:lower:]]@<=[[:upper:]]@=)' + else + let a = '' + let b = '' + endif + return '\v\C'.a.'%('.join(map(sort(keys(a:dict),function('s:sort')),'s:subesc(v:val)'),'|').')'.b +endfunction + +function! s:egrep_pattern(dict,boundaries) + if a:boundaries == 2 + let a = '\<' + let b = '\>' + elseif a:boundaries + let a = '(\<\|_)' + let b = '(\>\|_\|[[:upper:]][[:lower:]])' + else + let a = '' + let b = '' + endif + return a.'('.join(map(sort(keys(a:dict),function('s:sort')),'s:subesc(v:val)'),'\|').')'.b +endfunction + +function! s:c() + call histdel('search',-1) + return "" +endfunction + +function! s:find_command(cmd,flags,word) + let opts = s:normalize_options(a:flags) + let dict = s:create_dictionary(a:word,"",opts) + " This is tricky. If we use :/pattern, the search drops us at the + " beginning of the line, and we can't use position flags (e.g., /foo/e). + " If we use :norm /pattern, we leave ourselves vulnerable to "press enter" + " prompts (even with :silent). + let cmd = (a:cmd =~ '[?!]' ? '?' : '/') + let @/ = s:pattern(dict,opts.boundaries) + if opts.flags == "" || !search(@/,'n') + return "norm! ".cmd."\" + elseif opts.flags =~ ';[/?]\@!' + call s:throw("E386: Expected '?' or '/' after ';'") + else + return "exe 'norm! ".cmd.cmd.opts.flags."\'|call histdel('search',-1)" + return "" + endif +endfunction + +function! s:grep_command(args,bang,flags,word) + let opts = s:normalize_options(a:flags) + let dict = s:create_dictionary(a:word,"",opts) + if &grepprg == "internal" + let lhs = "'".s:pattern(dict,opts.boundaries)."'" + else + let lhs = "-E '".s:egrep_pattern(dict,opts.boundaries)."'" + endif + return "grep".(a:bang ? "!" : "")." ".lhs." ".a:args +endfunction + +let s:commands.search = s:commands.abstract.clone() +let s:commands.search.options = {"word": 0, "variable": 0, "flags": ""} + +function! s:commands.search.process(bang,line1,line2,count,args) + call s:extractopts(a:args,self.options) + if self.options.word + let self.options.flags .= "w" + elseif self.options.variable + let self.options.flags .= "v" + endif + let opts = s:normalize_options(self.options) + if len(a:args) > 1 + return s:grep_command(join(a:args[1:]," "),a:bang,opts,a:args[0]) + elseif len(a:args) == 1 + return s:find_command(a:bang ? "!" : " ",opts,a:args[0]) + else + call s:throw("E471: Argument required") + endif +endfunction + +" }}}1 +" Substitution {{{1 + +function! Abolished() + return get(g:abolish_last_dict,submatch(0),submatch(0)) +endfunction + +function! s:substitute_command(cmd,bad,good,flags) + let opts = s:normalize_options(a:flags) + let dict = s:create_dictionary(a:bad,a:good,opts) + let lhs = s:pattern(dict,opts.boundaries) + let g:abolish_last_dict = dict + return a:cmd.'/'.lhs.'/\=Abolished()'."/".opts.flags +endfunction + +function! s:parse_substitute(bang,line1,line2,count,args) + if get(a:args,0,'') =~ '^[/?'']' + let separator = matchstr(a:args[0],'^.') + let args = split(join(a:args,' '),separator,1) + call remove(args,0) + else + let args = a:args + endif + if len(args) < 2 + call s:throw("E471: Argument required") + elseif len(args) > 3 + call s:throw("E488: Trailing characters") + endif + let [bad,good,flags] = (args + [""])[0:2] + if a:count == 0 + let cmd = "substitute" + else + let cmd = a:line1.",".a:line2."substitute" + endif + return s:substitute_command(cmd,bad,good,flags) +endfunction + +let s:commands.substitute = s:commands.abstract.clone() +let s:commands.substitute.options = {"word": 0, "variable": 0, "flags": "g"} + +function! s:commands.substitute.process(bang,line1,line2,count,args) + call s:extractopts(a:args,self.options) + if self.options.word + let self.options.flags .= "w" + elseif self.options.variable + let self.options.flags .= "v" + endif + let opts = s:normalize_options(self.options) + if len(a:args) <= 1 + call s:throw("E471: Argument required") + else + let good = join(a:args[1:],"") + let cmd = a:bang ? "." : "%" + return s:substitute_command(cmd,a:args[0],good,self.options) + endif +endfunction + +" }}}1 +" Abbreviations {{{1 + +function! s:badgood(args) + let words = filter(copy(a:args),'v:val !~ "^-"') + call filter(a:args,'v:val =~ "^-"') + if empty(words) + call s:throw("E471: Argument required") + elseif !empty(a:args) + call s:throw("Unknown argument: ".a:args[0]) + endif + let [bad; words] = words + return [bad, join(words," ")] +endfunction + +function! s:abbreviate_from_dict(cmd,dict) + for [lhs,rhs] in items(a:dict) + exe a:cmd lhs rhs + endfor +endfunction + +let s:commands.abbrev = s:commands.abstract.clone() +let s:commands.abbrev.options = {"buffer":0,"cmdline":0,"delete":0} +function! s:commands.abbrev.process(bang,line1,line2,count,args) + let args = copy(a:args) + call s:extractopts(a:args,self.options) + if self.options.delete + let cmd = "unabbrev" + let good = "" + else + let cmd = "noreabbrev" + endif + if !self.options.cmdline + let cmd = "i" . cmd + endif + if self.options.delete + let cmd = "silent! ".cmd + endif + if self.options.buffer + let cmd = cmd . " " + endif + let [bad, good] = s:badgood(a:args) + if substitute(bad,'{.\{-\}.}','','g') !~ '^\k\+$' + call s:throw("E474: Invalid argument (not a keyword: ".string(bad).")") + endif + if !self.options.delete && good == "" + call s:throw("E471: Argument required".a:args[0]) + endif + let dict = s:create_dictionary(bad,good,self.options) + call s:abbreviate_from_dict(cmd,dict) + if a:bang + let i = 0 + let str = "Abolish ".join(args," ") + let file = g:abolish_save_file + if !isdirectory(fnamemodify(file,':h')) + call mkdir(fnamemodify(file,':h'),'p') + endif + + if filereadable(file) + let old = readfile(file) + else + let old = ["\" Exit if :Abolish isn't available.","if !exists(':Abolish')"," finish","endif",""] + endif + call writefile(old + [str],file) + endif + return "" +endfunction + +let s:commands.delete = s:commands.abbrev.clone() +let s:commands.delete.options.delete = 1 + +" }}}1 +" Maps {{{1 + +function! s:unknown_coercion(letter,word) + return a:word +endfunction + +call extend(Abolish.Coercions, { + \ 'c': Abolish.camelcase, + \ 'm': Abolish.mixedcase, + \ 's': Abolish.snakecase, + \ '_': Abolish.snakecase, + \ 'u': Abolish.uppercase, + \ 'U': Abolish.uppercase, + \ '-': Abolish.dashcase, + \ 'k': Abolish.dashcase, + \ '.': Abolish.dotcase, + \ ' ': Abolish.spacecase, + \ 't': Abolish.titlecase, + \ "function missing": s:function("s:unknown_coercion") + \}, "keep") + +function! s:coerce(transformation) + let clipboard = &clipboard + try + set clipboard= + let regbody = getreg('"') + let regtype = getregtype('"') + let c = v:count1 + while c > 0 + let c -= 1 + norm! yiw + let word = @@ + let @@ = s:send(g:Abolish.Coercions,a:transformation,word) + if !exists('begin') + let begin = getpos("'[") + endif + if word !=# @@ + let changed = 1 + norm! viwpw + else + norm! w + endif + endwhile + call setreg('"',regbody,regtype) + call setpos("'[",begin) + call setpos(".",begin) + if exists("changed") + silent! call repeat#set("\Coerce".a:transformation) + endif + finally + let &clipboard = clipboard + endtry +endfunction + +nnoremap Coerce :call coerce(nr2char(getchar())) + +" }}}1 + +if !exists("g:abolish_no_mappings") || ! g:abolish_no_mappings + nmap cr Coerce +endif + +command! -nargs=+ -bang -bar -range=0 -complete=custom,s:Complete Abolish + \ :exec s:dispatcher(0,,,,[]) +command! -nargs=1 -bang -bar -range=0 -complete=custom,s:SubComplete Subvert + \ :exec s:subvert_dispatcher(0,,,,) +if exists(':S') != 2 + command -nargs=1 -bang -bar -range=0 -complete=custom,s:SubComplete S + \ :exec s:subvert_dispatcher(0,,,,) +endif + +" vim:set ft=vim sw=2 sts=2: diff --git a/update_plugins.py b/update_plugins.py index 00c3ec03..e5a40849 100644 --- a/update_plugins.py +++ b/update_plugins.py @@ -51,6 +51,7 @@ vim-flake8 https://github.com/nvie/vim-flake8 vim-pug https://github.com/digitaltoad/vim-pug vim-yankstack https://github.com/maxbrunsfeld/vim-yankstack lightline.vim https://github.com/itchyny/lightline.vim +tpope-vim-abolish https://github.com/tpope/tpope-vim-abolish """.strip() GITHUB_ZIP = '%s/archive/master.zip' From 71ca6d0ec8259ba87e6015344efda891f8da7e98 Mon Sep 17 00:00:00 2001 From: amix Date: Sun, 16 Jul 2017 14:38:57 +0200 Subject: [PATCH 05/12] Fixed https://github.com/amix/vimrc/issues/325 --- .../mru => sources_non_forked/mru.vim}/README | 40 ++++- .../mru.vim}/plugin/mru.vim | 158 ++++++++++++------ update_plugins.py | 1 + 3 files changed, 138 insertions(+), 61 deletions(-) rename {sources_forked/mru => sources_non_forked/mru.vim}/README (82%) rename {sources_forked/mru => sources_non_forked/mru.vim}/plugin/mru.vim (87%) diff --git a/sources_forked/mru/README b/sources_non_forked/mru.vim/README similarity index 82% rename from sources_forked/mru/README rename to sources_non_forked/mru.vim/README index 4d8b9b0b..04c3a748 100644 --- a/sources_forked/mru/README +++ b/sources_non_forked/mru.vim/README @@ -14,6 +14,10 @@ Vim, then you should use an older version of the MRU plugin. The recently used filenames are stored in a file specified by the Vim MRU_File variable. +The Github repository for the MRU plugin is available at: + + http://github.com/yegappan/mru + Usage To list and edit files from the MRU list, you can use the ":MRU" command. @@ -36,7 +40,8 @@ previous window has a modified buffer or is the preview window or is used by some other plugin, then the file is opened in a new window. You can press the 'o' key to open the file name under the cursor in the -MRU window in a new window. +MRU window in a new window. You can also press instead of 'o' +to open the file in a new window. To open a file from the MRU window in read-only mode (view), press the 'v' key. @@ -46,19 +51,20 @@ file is already opened in a window in the current or in another tab, then the cursor is moved to that tab. Otherwise, a new tab is opened. You can open multiple files from the MRU window by specifying a count before -pressing '' or 'v' or 'o' or 't'. You can also visually select -multiple filenames and invoke the commands to open the files. Each selected -file will be opened in a separate window or tab. +pressing '' or 'v' or 'o' or 't'. You can also visually (using +linewise visual mode) select multiple filenames and invoke the commands to +open the files. Each selected file will be opened in a separate window or +tab. You can press the 'u' key in the MRU window to update the file list. This is useful if you keep the MRU window open always. -You can close the MRU window by pressing the 'q' key or using one of the Vim -window commands. +You can close the MRU window by pressing the 'q' key or the key or +using one of the Vim window commands. To display only files matching a pattern from the MRU list in the MRU window, you can specify a pattern to the ":MRU" command. For example, to -display only file names containing "vim" in them, you can use the following +display only file names matching "vim" in them, you can use the following command ":MRU vim". When you specify a partial file name and only one matching filename is found, then the ":MRU" command will edit that file. @@ -79,6 +85,16 @@ Whenever the MRU list changes, the MRU file is updated with the latest MRU list. When you have multiple instances of Vim running at the same time, the latest MRU list will show up in all the instances of Vim. +The MRUFilename syntax group is used to highlight the file names in the MRU +window. By default, this syntax group is linked to the Identifier highlight +group. You can change the highlight group by adding the following line in +your .vimrc: + + highlight link MRUFileName LineNr + +The MRU buffer uses the 'mru file type. You can use this file type to add +custom auto commands, syntax highlighting, etc. + Configuration By changing the following variables you can configure the behavior of this @@ -164,3 +180,13 @@ number of file names displayed in a single sub-menu: let MRU_Max_Submenu_Entries = 15 +In the MRU window, the filenames are displayed in two parts. The first part +contains the file name without the path and the second part contains the +full path to the file in parenthesis. This format is controlled by the +MRU_Filename_Format variable. If you prefer to change this to some other +format, then you can modify the MRU_Filename_Format variable. For example, +to display the full path without splitting it, you can set this variable +as shown below: + + let MRU_Filename_Format={'formatter':'v:val', 'parser':'.*'} + diff --git a/sources_forked/mru/plugin/mru.vim b/sources_non_forked/mru.vim/plugin/mru.vim similarity index 87% rename from sources_forked/mru/plugin/mru.vim rename to sources_non_forked/mru.vim/plugin/mru.vim index 3bcd5007..5cf7015d 100644 --- a/sources_forked/mru/plugin/mru.vim +++ b/sources_non_forked/mru.vim/plugin/mru.vim @@ -1,14 +1,14 @@ " File: mru.vim " Author: Yegappan Lakshmanan (yegappan AT yahoo DOT com) -" Version: 3.4 -" Last Modified: April 13, 2012 -" Copyright: Copyright (C) 2003-2012 Yegappan Lakshmanan -" Permission is hereby granted to use and distribute this code, +" Version: 3.9 +" Last Modified: Feb 3, 2015 +" Copyright: Copyright (C) 2003-2015 Yegappan Lakshmanan +" License: Permission is hereby granted to use and distribute this code, " with or without modifications, provided that this copyright " notice is copied with it. Like anything else that's free, " mru.vim is provided *as is* and comes with no warranty of any " kind, either expressed or implied. In no event will the copyright -" holder be liable for any damamges resulting from the use of this +" holder be liable for any damages resulting from the use of this " software. " " Overview @@ -25,27 +25,19 @@ " The recently used filenames are stored in a file specified by the Vim " MRU_File variable. " +" The Github repository for the MRU plugin is available at: +" +" http://github.com/yegappan/mru +" " Installation " ------------ " 1. Copy the mru.vim file to one of the following directories: -" " $HOME/.vim/plugin - Unix like systems " $HOME/vimfiles/plugin - MS-Windows " $VIM:vimfiles:plugin - Macintosh " $VIM/vimfiles/plugin - All -" -" Refer to the following Vim help topics for more information about Vim -" plugins: -" -" :help add-plugin -" :help add-global-plugin -" :help runtimepath -" -" 2. Set the MRU_File Vim variable in the .vimrc file to the location of a -" file to store the most recently edited file names. This step is needed -" only if you want to change the default MRU filename. -" 3. Restart Vim. -" 4. You can use the ":MRU" command to list and edit the recently used files. +" 2. Restart Vim. +" 3. You can use the ":MRU" command to list and edit the recently used files. " In GUI Vim, you can use the 'File->Recent Files' menu to access the " recently used files. " @@ -75,7 +67,8 @@ " some other plugin, then the file is opened in a new window. " " You can press the 'o' key to open the file name under the cursor in the -" MRU window in a new window. +" MRU window in a new window. You can also press instead of 'o' +" to open the file in a new window. " " To open a file from the MRU window in read-only mode (view), press the 'v' " key. @@ -85,15 +78,16 @@ " the cursor is moved to that tab. Otherwise, a new tab is opened. " " You can open multiple files from the MRU window by specifying a count before -" pressing '' or 'v' or 'o' or 't'. You can also visually select -" multiple filenames and invoke the commands to open the files. Each selected -" file will be opened in a separate window or tab. +" pressing '' or 'v' or 'o' or 't'. You can also visually (using +" linewise visual mode) select multiple filenames and invoke the commands to +" open the files. Each selected file will be opened in a separate window or +" tab. " " You can press the 'u' key in the MRU window to update the file list. This is " useful if you keep the MRU window open always. " -" You can close the MRU window by pressing the 'q' key or using one of the Vim -" window commands. +" You can close the MRU window by pressing the 'q' key or the key or +" using one of the Vim window commands. " " To display only files matching a pattern from the MRU list in the MRU " window, you can specify a pattern to the ":MRU" command. For example, to @@ -118,6 +112,16 @@ " list. When you have multiple instances of Vim running at the same time, the " latest MRU list will show up in all the instances of Vim. " +" The MRUFilename syntax group is used to highlight the file names in the MRU +" window. By default, this syntax group is linked to the Identifier highlight +" group. You can change the highlight group by adding the following line in +" your .vimrc: +" +" highlight link MRUFileName LineNr +" +" The MRU buffer uses the 'mru file type. You can use this file type to add +" custom auto commands, syntax highlighting, etc. +" " Configuration " ------------- " By changing the following variables you can configure the behavior of this @@ -203,6 +207,17 @@ " " let MRU_Max_Submenu_Entries = 15 " +" In the MRU window, the filenames are displayed in two parts. The first part +" contains the file name without the path and the second part contains the +" full path to the file in parenthesis. This format is controlled by the +" MRU_Filename_Format variable. If you prefer to change this to some other +" format, then you can modify the MRU_Filename_Format variable. For example, +" to display the full path without splitting it, you can set this variable +" as shown below: +" +" let MRU_Filename_Format = +" \ {'formatter':'v:val', 'parser':'.*', 'syntax': '[^/\\]\+$'} +" " ****************** Do not modify after this line ************************ if exists('loaded_mru') finish @@ -296,6 +311,21 @@ if !exists('MRU_Open_File_Use_Tabs') let MRU_Open_File_Use_Tabs = 0 endif +" Format of the file names displayed in the MRU window. +" The default is to display the filename followed by the complete path to the +" file in parenthesis. This variable controls the expressions used to format +" and parse the path. This can be changed to display the filenames in a +" different format. The 'formatter' specifies how to split/format the filename +" and 'parser' specifies how to read the filename back; 'syntax' matches the +" part to be highlighted. +if !exists('MRU_Filename_Format') + let MRU_Filename_Format = { + \ 'formatter': 'fnamemodify(v:val, ":t") . " (" . v:val . ")"', + \ 'parser': '(\zs.*\ze)', + \ 'syntax': '^.\{-}\ze(' + \} +endif + " Control to temporarily lock the MRU list. Used to prevent files from " getting added to the MRU list when the ':vimgrep' command is executed. let s:mru_list_locked = 0 @@ -419,7 +449,11 @@ endfunction " that should be escaped (for security reasons) let s:esc_filename_chars = ' *?[{`$%#"|!<>();&' . "'\t\n" function! s:MRU_escape_filename(fname) - return escape(a:fname, s:esc_filename_chars) + if exists("*fnameescape") + return fnameescape(a:fname) + else + return escape(a:fname, s:esc_filename_chars) + endif endfunction " MRU_Edit_File {{{1 @@ -449,11 +483,13 @@ function! s:MRU_Edit_File(filename, sanitized) exe winnum . 'wincmd w' endif else - if &modified || &buftype != '' || &previewwindow + if !&hidden && (&modified || &buftype != '' || &previewwindow) " Current buffer has unsaved changes or is a special buffer or is - " the preview window. So open the file in a new window + " the preview window. The 'hidden' option is also not set. + " So open the file in a new window. exe 'split ' . esc_fname else + " The current file can be replaced with the selected file. exe 'edit ' . esc_fname endif endif @@ -484,7 +520,7 @@ function! s:MRU_Open_File_In_Tab(fname, esc_fname) exe 'tabnext ' . i else " Open a new tab as the last tab page - exe '999tabnew ' . a:esc_fname + exe '$tabnew ' . a:esc_fname endif endif @@ -503,8 +539,7 @@ endfunction " 'edit' - Edit the file as a regular file " multi : Specifies whether a single file or multiple files need to be " opened. -" open_type : Specifies where to open the file. Can be one of 'useopen' or -" 'newwin' or 'newtab'. +" open_type : Specifies where to open the file. " useopen - If the file is already present in a window, then " jump to that window. Otherwise, open the file in " the previous window. @@ -512,21 +547,25 @@ endfunction " newwin_vert - Open the file in a new vertical window. " newtab - Open the file in a new tab. If the file is already " opened in a tab, then jump to that tab. +" preview - Open the file in the preview window function! s:MRU_Window_Edit_File(fname, multi, edit_type, open_type) let esc_fname = s:MRU_escape_filename(a:fname) - if a:open_type == 'newwin_horiz' + if a:open_type ==# 'newwin_horiz' " Edit the file in a new horizontally split window above the previous " window wincmd p exe 'belowright new ' . esc_fname - elseif a:open_type == 'newwin_vert' + elseif a:open_type ==# 'newwin_vert' " Edit the file in a new vertically split window above the previous " window wincmd p exe 'belowright vnew ' . esc_fname - elseif a:open_type == 'newtab' || g:MRU_Open_File_Use_Tabs + elseif a:open_type ==# 'newtab' || g:MRU_Open_File_Use_Tabs call s:MRU_Open_File_In_Tab(a:fname, esc_fname) + elseif a:open_type ==# 'preview' + " Edit the file in the preview window + exe 'topleft pedit ' . esc_fname else " If the selected file is already open in one of the windows, " jump to it @@ -553,7 +592,7 @@ function! s:MRU_Window_Edit_File(fname, multi, edit_type, open_type) let split_window = 0 - if &modified || &previewwindow || a:multi + if (!&hidden && (&modified || &previewwindow)) || a:multi " Current buffer has unsaved changes or is the preview window " or the user is opening multiple files " So open the file in a new window @@ -572,13 +611,13 @@ function! s:MRU_Window_Edit_File(fname, multi, edit_type, open_type) if split_window " Current buffer has unsaved changes or is a special buffer or " is the preview window. So open the file in a new window - if a:edit_type == 'edit' + if a:edit_type ==# 'edit' exe 'split ' . esc_fname else exe 'sview ' . esc_fname endif else - if a:edit_type == 'edit' + if a:edit_type ==# 'edit' exe 'edit ' . esc_fname else exe 'view ' . esc_fname @@ -619,7 +658,7 @@ function! s:MRU_Select_File_Cmd(opt) range endif " The text in the MRU window contains the filename in parenthesis - let file = matchstr(f, '(\zs.*\ze)') + let file = matchstr(f, g:MRU_Filename_Format.parser) call s:MRU_Window_Edit_File(file, multi, edit_type, open_type) @@ -707,17 +746,20 @@ function! s:MRU_Open_Window(...) endif endif + setlocal modifiable + " Mark the buffer as scratch setlocal buftype=nofile setlocal bufhidden=delete setlocal noswapfile setlocal nowrap setlocal nobuflisted + " Set the 'filetype' to 'mru'. This allows the user to apply custom + " syntax highlighting or other changes to the MRU bufer. + setlocal filetype=mru " Use fixed height for the MRU window setlocal winfixheight - call MRU_SetupSyntax() - " Setup the cpoptions properly for the maps to work let old_cpoptions = &cpoptions set cpoptions&vim @@ -731,6 +773,10 @@ function! s:MRU_Open_Window(...) \ :call MRU_Select_File_Cmd('edit,newwin_horiz') vnoremap o \ :call MRU_Select_File_Cmd('edit,newwin_horiz') + nnoremap + \ :call MRU_Select_File_Cmd('edit,newwin_horiz') + vnoremap + \ :call MRU_Select_File_Cmd('edit,newwin_horiz') nnoremap O \ :call MRU_Select_File_Cmd('edit,newwin_vert') vnoremap O @@ -741,6 +787,14 @@ function! s:MRU_Open_Window(...) \ :call MRU_Select_File_Cmd('edit,newtab') nnoremap v \ :call MRU_Select_File_Cmd('view,useopen') + nnoremap p + \ :call MRU_Select_File_Cmd('view,preview') + vnoremap p + \ :if line("'<") == line("'>") + \ call MRU_Select_File_Cmd('open,preview') + \ else + \ echoerr "Only a single file can be previewed" + \ endif nnoremap u :MRU nnoremap <2-LeftMouse> \ :call MRU_Select_File_Cmd('edit,useopen') @@ -764,16 +818,22 @@ function! s:MRU_Open_Window(...) endif " Get the tail part of the file name (without the directory) and display - " it along with the full path - let output = map(m, 'fnamemodify(v:val, ":t") . " (" . v:val . ")"') + " it along with the full path in parenthesis. + let output = map(m, g:MRU_Filename_Format.formatter) silent! 0put =output " Delete the empty line at the end of the buffer - $delete + silent! $delete _ " Move the cursor to the beginning of the file normal! gg + " Add syntax highlighting for the file names + if has_key(g:MRU_Filename_Format, 'syntax') + exe "syntax match MRUFileName '" . g:MRU_Filename_Format.syntax . "'" + highlight default link MRUFileName Identifier + endif + setlocal nomodifiable endfunction @@ -921,7 +981,7 @@ function! s:MRU_Refresh_Menu() let entry_cnt = len(s:MRU_files) if entry_cnt > g:MRU_Max_Menu_Entries " Show only MRU_Max_Menu_Entries file names in the menu - let mru_list = s:MRU_files[1 : g:MRU_Max_Menu_Entries] + let mru_list = s:MRU_files[0 : g:MRU_Max_Menu_Entries - 1] let entry_cnt = g:MRU_Max_Menu_Entries else let mru_list = s:MRU_files @@ -949,16 +1009,6 @@ function! s:MRU_Refresh_Menu() let &cpoptions = old_cpoptions endfunction -" Setup syntax highlight -function! MRU_SetupSyntax() - if has("syntax") - syn match mruName /.\+\s/ - syn match mruDir /(.\+)/ - hi def link mruDir Folded - hi def link mruName String - endif -endfunction - " Load the MRU list on plugin startup call s:MRU_LoadList() diff --git a/update_plugins.py b/update_plugins.py index e5a40849..eae08ce1 100644 --- a/update_plugins.py +++ b/update_plugins.py @@ -52,6 +52,7 @@ vim-pug https://github.com/digitaltoad/vim-pug vim-yankstack https://github.com/maxbrunsfeld/vim-yankstack lightline.vim https://github.com/itchyny/lightline.vim tpope-vim-abolish https://github.com/tpope/tpope-vim-abolish +mru.vim https://github.com/vim-scripts/mru.vim """.strip() GITHUB_ZIP = '%s/archive/master.zip' From 866fbde30aa07e76a252039f94a5e3621693c68a Mon Sep 17 00:00:00 2001 From: amix Date: Sun, 16 Jul 2017 14:42:14 +0200 Subject: [PATCH 06/12] Fixed https://github.com/amix/vimrc/issues/321 --- vimrcs/basic.vim | 23 +++++++++++++++++++++++ vimrcs/extended.vim | 25 ------------------------- 2 files changed, 23 insertions(+), 25 deletions(-) diff --git a/vimrcs/basic.vim b/vimrcs/basic.vim index c45c3bce..6c3d6dd3 100644 --- a/vimrcs/basic.vim +++ b/vimrcs/basic.vim @@ -373,3 +373,26 @@ function! BufcloseCloseIt() execute("bdelete! ".l:currentBufNum) endif endfunction + +function! CmdLine(str) + exe "menu Foo.Bar :" . a:str + emenu Foo.Bar + unmenu Foo +endfunction + +function! VisualSelection(direction, extra_filter) range + let l:saved_reg = @" + execute "normal! vgvy" + + let l:pattern = escape(@", "\\/.*'$^~[]") + let l:pattern = substitute(l:pattern, "\n$", "", "") + + if a:direction == 'gv' + call CmdLine("Ack '" . l:pattern . "' " ) + elseif a:direction == 'replace' + call CmdLine("%s" . '/'. l:pattern . '/') + endif + + let @/ = l:pattern + let @" = l:saved_reg +endfunction diff --git a/vimrcs/extended.vim b/vimrcs/extended.vim index f6b5cfb0..e86d6296 100644 --- a/vimrcs/extended.vim +++ b/vimrcs/extended.vim @@ -170,28 +170,3 @@ endfunc func! CurrentFileDir(cmd) return a:cmd . " " . expand("%:p:h") . "/" endfunc - -function! CmdLine(str) - exe "menu Foo.Bar :" . a:str - emenu Foo.Bar - unmenu Foo -endfunction - -function! VisualSelection(direction, extra_filter) range - let l:saved_reg = @" - execute "normal! vgvy" - - let l:pattern = escape(@", "\\/.*'$^~[]") - let l:pattern = substitute(l:pattern, "\n$", "", "") - - if a:direction == 'gv' - call CmdLine("Ack '" . l:pattern . "' " ) - elseif a:direction == 'replace' - call CmdLine("%s" . '/'. l:pattern . '/') - endif - - let @/ = l:pattern - let @" = l:saved_reg -endfunction - - From 3be3af28e54ddc206b04f8cd739dd285cb9b37f5 Mon Sep 17 00:00:00 2001 From: amix Date: Wed, 16 Aug 2017 11:16:53 +0200 Subject: [PATCH 07/12] Fixed a conflict between yankstack and surround It's related to re-mapping of the vmap --- vimrcs/plugins_config.vim | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/vimrcs/plugins_config.vim b/vimrcs/plugins_config.vim index e8faea19..9af44a59 100644 --- a/vimrcs/plugins_config.vim +++ b/vimrcs/plugins_config.vim @@ -34,6 +34,8 @@ map f :MRU """""""""""""""""""""""""""""" " => YankStack """""""""""""""""""""""""""""" +let g:yankstack_yank_keys = ['y', 'd'] + nmap yankstack_substitute_older_paste nmap yankstack_substitute_newer_paste @@ -92,7 +94,7 @@ let g:multi_cursor_next_key="\" """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" " => surround.vim config -" Annotate strings with gettext http://amix.dk/blog/post/19678 +" Annotate strings with gettext """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" vmap Si S(i_f) au FileType mako vmap Si S"i${ _(2f"a) } From 7fc202ec8895c564c10940a21af357d6c0665368 Mon Sep 17 00:00:00 2001 From: amix Date: Sat, 2 Sep 2017 12:43:18 +0200 Subject: [PATCH 08/12] Updated plugins --- .../ctrlp.vim/autoload/ctrlp.vim | 8 +- sources_non_forked/ctrlp.vim/doc/ctrlp.txt | 5 +- sources_non_forked/gruvbox/README.md | 11 +- .../autoload/airline/themes/gruvbox.vim | 8 +- .../lightline/colorscheme/gruvbox.vim | 6 +- sources_non_forked/gruvbox/colors/gruvbox.vim | 190 +++++++- sources_non_forked/gruvbox/package.json | 10 + .../lightline.vim/autoload/lightline.vim | 13 +- .../lightline.vim/doc/lightline.txt | 13 +- .../lightline.vim/test/expand.vim | 26 + sources_non_forked/nerdtree/README.markdown | 64 +-- .../nerdtree/lib/nerdtree/bookmark.vim | 17 +- .../nerdtree/lib/nerdtree/opener.vim | 117 ++--- .../nerdtree/lib/nerdtree/path.vim | 326 +++++++------ .../nerdtree/lib/nerdtree/tree_dir_node.vim | 19 +- .../nerdtree/lib/nerdtree/ui.vim | 2 +- .../nerdtree/nerdtree_plugin/fs_menu.vim | 38 +- sources_non_forked/nerdtree/screenshot.png | Bin 0 -> 87896 bytes .../nerdtree/syntax/nerdtree.vim | 6 +- sources_non_forked/syntastic/README.markdown | 22 +- .../syntastic/doc/syntastic-checkers.txt | 108 ++++- .../syntastic/doc/syntastic.txt | 17 +- .../syntastic/plugin/syntastic.vim | 2 +- .../syntastic/plugin/syntastic/registry.vim | 1 + .../syntax_checkers/python/flake8.vim | 7 +- .../syntastic/syntax_checkers/tex/chktex.vim | 8 +- .../syntastic/syntax_checkers/vue/eslint.vim | 23 + .../syntax_checkers/vue/pug_lint_vue.vim | 42 ++ sources_non_forked/vim-bundle-mako/README | 19 - sources_non_forked/vim-bundle-mako/README.md | 22 + .../vim-bundle-mako/ftdetect/mako.vim | 10 + .../vim-bundle-mako/syntax/mako.vim | 25 +- .../vim-fugitive/README.markdown | 2 +- sources_non_forked/vim-gitgutter/README.mkd | 12 +- .../vim-gitgutter/plugin/gitgutter.vim | 10 + .../vim-go/.github/CONTRIBUTING.md | 2 +- sources_non_forked/vim-go/CHANGELOG.md | 447 +++++++++++++++++- sources_non_forked/vim-go/README.md | 5 + sources_non_forked/vim-go/autoload/go/def.vim | 10 +- sources_non_forked/vim-go/autoload/go/doc.vim | 10 +- sources_non_forked/vim-go/autoload/go/fmt.vim | 29 +- .../vim-go/autoload/go/impl.vim | 2 +- sources_non_forked/vim-go/autoload/go/job.vim | 8 +- .../vim-go/autoload/go/keyify.vim | 3 +- .../vim-go/autoload/go/lint.vim | 9 +- .../vim-go/autoload/go/list.vim | 17 +- .../vim-go/autoload/go/path.vim | 37 +- .../vim-go/autoload/go/tags.vim | 58 +-- .../vim-go/autoload/go/template.vim | 5 +- .../vim-go/autoload/go/tool.vim | 45 +- .../vim-go/autoload/go/util.vim | 10 +- sources_non_forked/vim-go/doc/vim-go.txt | 73 ++- .../vim-go/ftplugin/go/commands.vim | 2 +- sources_non_forked/vim-go/syntax/go.vim | 57 ++- .../autoload/multiple_cursors.vim | 41 +- .../spec/multiple_cursors_spec.rb | 17 + sources_non_forked/vim-pyte/colors/pyte.vim | 12 +- .../vim-snippets/UltiSnips/django.snippets | 10 +- .../vim-snippets/UltiSnips/elm.snippets | 9 + .../UltiSnips/javascript.snippets | 8 + .../vim-snippets/UltiSnips/markdown.snippets | 5 +- .../vim-snippets/UltiSnips/ruby.snippets | 14 +- .../vim-snippets/snippets/elm.snippets | 11 +- .../vim-snippets/snippets/haskell.snippets | 19 +- 64 files changed, 1659 insertions(+), 525 deletions(-) create mode 100644 sources_non_forked/gruvbox/package.json create mode 100644 sources_non_forked/nerdtree/screenshot.png create mode 100644 sources_non_forked/syntastic/syntax_checkers/vue/eslint.vim create mode 100644 sources_non_forked/syntastic/syntax_checkers/vue/pug_lint_vue.vim delete mode 100644 sources_non_forked/vim-bundle-mako/README create mode 100644 sources_non_forked/vim-bundle-mako/README.md create mode 100644 sources_non_forked/vim-snippets/UltiSnips/elm.snippets diff --git a/sources_non_forked/ctrlp.vim/autoload/ctrlp.vim b/sources_non_forked/ctrlp.vim/autoload/ctrlp.vim index de60d77a..2a8ae888 100644 --- a/sources_non_forked/ctrlp.vim/autoload/ctrlp.vim +++ b/sources_non_forked/ctrlp.vim/autoload/ctrlp.vim @@ -1006,7 +1006,9 @@ fu! s:KeyLoop() wh exists('s:init') && s:keyloop try set t_ve= - set guicursor=a:NONE + if guicursor != '' + set guicursor=a:NONE + en let nr = getchar() fina let &t_ve = t_ve @@ -2009,7 +2011,7 @@ fu! s:bufnrfilpath(line) if (a:line =~ '[\/]\?\[\d\+\*No Name\]$') let bufnr = str2nr(matchstr(a:line, '[\/]\?\[\zs\d\+\ze\*No Name\]$')) let filpath = bufnr - else + els let bufnr = bufnr(a:line) retu [bufnr, a:line] en @@ -2414,7 +2416,7 @@ fu! s:buildpat(lst) let c = a:lst[item - 1] let pat .= (c == '/' ? '[^/]\{-}' : '[^'.c.'/]\{-}').a:lst[item] endfo - else + els for item in range(1, len(a:lst) - 1) let pat .= '[^'.a:lst[item - 1].']\{-}'.a:lst[item] endfo diff --git a/sources_non_forked/ctrlp.vim/doc/ctrlp.txt b/sources_non_forked/ctrlp.vim/doc/ctrlp.txt index 455e368c..4dc2e4ec 100644 --- a/sources_non_forked/ctrlp.vim/doc/ctrlp.txt +++ b/sources_non_forked/ctrlp.vim/doc/ctrlp.txt @@ -638,7 +638,6 @@ Set this to 1 to save every MRU file path $HOME/$filepath in the $HOME dir 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: > @@ -873,12 +872,12 @@ COMMANDS *ctrlp-commands* *:CtrlPCurFile* :CtrlPCurFile - This acts like |:CtrlP| with |g:ctrlp_working_path_mode| = '' and ignores + 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| = '' and ignores + This acts like |:CtrlP| with |g:ctrlp_working_path_mode| = 'd' and ignores the variable's current value. *:CtrlPMRU* diff --git a/sources_non_forked/gruvbox/README.md b/sources_non_forked/gruvbox/README.md index 917abdb9..d36c02a3 100644 --- a/sources_non_forked/gruvbox/README.md +++ b/sources_non_forked/gruvbox/README.md @@ -65,8 +65,8 @@ Features -------- * Lots of style-customization options (contrast, color invertion, italics usage etc.) -* Extended filetype highlighting: Html, Xml, Vim (and ES6 with [yajs.vim](https://github.com/othree/yajs.vim)), Clojure, C, Python, JavaScript, CoffeeScript, Ruby, Objective-C, Go, Lua, MoonScript, Java, Markdown, Haskell -* Supported plugins: [EasyMotion][], [vim-sneak][], [Indent Guides][], [indentLine][], [Rainbow Parentheses][], [Airline][], [Lightline][], [GitGutter][], [Signify][], [ShowMarks][], [Signature][], [Syntastic][], [CtrlP][], [Startify][] +* Extended filetype highlighting: Html, Xml, Vim, Clojure, C, Python, JavaScript, TypeScript, PureScript, CoffeeScript, Ruby, Objective-C, Go, Lua, MoonScript, Java, Markdown, Haskell, Elixir +* Supported plugins: [EasyMotion][], [vim-sneak][], [Indent Guides][], [indentLine][], [Rainbow Parentheses][], [Airline][], [Lightline][], [GitGutter][], [Signify][], [ShowMarks][], [Signature][], [Syntastic][], [Ale][], [CtrlP][], [Startify][], [NERDTree][], [Dirvish][] [EasyMotion]: https://github.com/Lokaltog/vim-easymotion [vim-sneak]: https://github.com/justinmk/vim-sneak @@ -80,8 +80,11 @@ Features [ShowMarks]: http://www.vim.org/scripts/script.php?script_id=152 [Signature]: https://github.com/kshenoy/vim-signature [Syntastic]: https://github.com/scrooloose/syntastic + [Ale]: https://github.com/w0rp/ale [CtrlP]: https://github.com/kien/ctrlp.vim [Startify]: https://github.com/mhinz/vim-startify + [NERDTree]: https://github.com/scrooloose/nerdtree + [Dirvish]: https://github.com/justinmk/vim-dirvish Contributions ------------- @@ -93,8 +96,8 @@ See [gruvbox-contrib][] repo for contributions, ports and extras. ToDo ---- -* Filetype syntax highlighting (R, TeX, Swift, Erlang, Purescript and I'm still dissatisfied with CSS) -* Plugin support (MiniBufExplorer, Tagbar, Netrw, VimPLug) +* Filetype syntax highlighting (R, TeX, Swift, Erlang) +* Plugin support (Tagbar, VimPlug) Self-Promotion -------------- diff --git a/sources_non_forked/gruvbox/autoload/airline/themes/gruvbox.vim b/sources_non_forked/gruvbox/autoload/airline/themes/gruvbox.vim index 84793190..6862a818 100644 --- a/sources_non_forked/gruvbox/autoload/airline/themes/gruvbox.vim +++ b/sources_non_forked/gruvbox/autoload/airline/themes/gruvbox.vim @@ -3,7 +3,7 @@ " Description: Retro groove color scheme for Airline " Author: morhetz " Source: https://github.com/morhetz/gruvbox -" Last Modified: 22 Aug 2014 +" Last Modified: 12 Aug 2017 " ----------------------------------------------------------------------------- let g:airline#themes#gruvbox#palette = {} @@ -17,7 +17,7 @@ function! airline#themes#gruvbox#refresh() let error_group = airline#themes#get_highlight2(['Normal', 'bg'], ['WarningMsg', 'fg']) let s:N1 = airline#themes#get_highlight2(['Normal', 'bg'], ['StatusLineNC', 'bg']) - let s:N2 = airline#themes#get_highlight2(['StatusLineNC', 'bg'], ['StatusLineNC', 'fg']) + let s:N2 = airline#themes#get_highlight2(['StatusLineNC', 'bg'], ['Pmenu', 'bg']) let s:N3 = airline#themes#get_highlight2(['StatusLineNC', 'bg'], ['CursorLine', 'bg']) let g:airline#themes#gruvbox#palette.normal = airline#themes#generate_color_map(s:N1, s:N2, s:N3) let g:airline#themes#gruvbox#palette.normal_modified = { 'airline_c': modified_group } @@ -28,7 +28,7 @@ function! airline#themes#gruvbox#refresh() let s:I1 = airline#themes#get_highlight2(['Normal', 'bg'], ['Identifier', 'fg']) let s:I2 = s:N2 - let s:I3 = airline#themes#get_highlight2(['Normal', 'fg'], ['StatusLineNC', 'fg']) + let s:I3 = airline#themes#get_highlight2(['Normal', 'fg'], ['Pmenu', 'bg']) let g:airline#themes#gruvbox#palette.insert = airline#themes#generate_color_map(s:I1, s:I2, s:I3) let g:airline#themes#gruvbox#palette.insert_modified = g:airline#themes#gruvbox#palette.normal_modified let g:airline#themes#gruvbox#palette.insert.airline_warning = g:airline#themes#gruvbox#palette.normal.airline_warning @@ -46,7 +46,7 @@ function! airline#themes#gruvbox#refresh() let g:airline#themes#gruvbox#palette.replace.airline_error = g:airline#themes#gruvbox#palette.normal.airline_error let g:airline#themes#gruvbox#palette.replace_modified.airline_error = g:airline#themes#gruvbox#palette.normal_modified.airline_error - let s:V1 = airline#themes#get_highlight2(['Normal', 'bg'], ['ModeMsg', 'fg']) + let s:V1 = airline#themes#get_highlight2(['Normal', 'bg'], ['Question', 'fg']) let s:V2 = s:N2 let s:V3 = airline#themes#get_highlight2(['Normal', 'bg'], ['TabLine', 'fg']) let g:airline#themes#gruvbox#palette.visual = airline#themes#generate_color_map(s:V1, s:V2, s:V3) diff --git a/sources_non_forked/gruvbox/autoload/lightline/colorscheme/gruvbox.vim b/sources_non_forked/gruvbox/autoload/lightline/colorscheme/gruvbox.vim index 78babce5..632390c5 100644 --- a/sources_non_forked/gruvbox/autoload/lightline/colorscheme/gruvbox.vim +++ b/sources_non_forked/gruvbox/autoload/lightline/colorscheme/gruvbox.vim @@ -25,8 +25,9 @@ if exists('g:lightline') let s:blue = s:getGruvColor('GruvboxBlue') let s:aqua = s:getGruvColor('GruvboxAqua') let s:orange = s:getGruvColor('GruvboxOrange') + let s:green = s:getGruvColor('GruvboxGreen') - let s:p = {'normal':{}, 'inactive':{}, 'insert':{}, 'replace':{}, 'visual':{}, 'tabline':{}} + let s:p = {'normal':{}, 'inactive':{}, 'insert':{}, 'replace':{}, 'visual':{}, 'tabline':{}, 'terminal':{}} let s:p.normal.left = [ [ s:bg0, s:fg4 ], [ s:fg4, s:bg2 ] ] let s:p.normal.right = [ [ s:bg0, s:fg4 ], [ s:fg4, s:bg2 ] ] let s:p.normal.middle = [ [ s:fg4, s:bg1 ] ] @@ -36,6 +37,9 @@ if exists('g:lightline') let s:p.insert.left = [ [ s:bg0, s:blue ], [ s:fg1, s:bg2 ] ] let s:p.insert.right = [ [ s:bg0, s:blue ], [ s:fg1, s:bg2 ] ] let s:p.insert.middle = [ [ s:fg4, s:bg2 ] ] + let s:p.terminal.left = [ [ s:bg0, s:green ], [ s:fg1, s:bg2 ] ] + let s:p.terminal.right = [ [ s:bg0, s:green ], [ s:fg1, s:bg2 ] ] + let s:p.terminal.middle = [ [ s:fg4, s:bg2 ] ] let s:p.replace.left = [ [ s:bg0, s:aqua ], [ s:fg1, s:bg2 ] ] let s:p.replace.right = [ [ s:bg0, s:aqua ], [ s:fg1, s:bg2 ] ] let s:p.replace.middle = [ [ s:fg4, s:bg2 ] ] diff --git a/sources_non_forked/gruvbox/colors/gruvbox.vim b/sources_non_forked/gruvbox/colors/gruvbox.vim index ebc9efff..33e5763d 100644 --- a/sources_non_forked/gruvbox/colors/gruvbox.vim +++ b/sources_non_forked/gruvbox/colors/gruvbox.vim @@ -3,7 +3,7 @@ " Description: Retro groove color scheme for Vim " Author: morhetz " Source: https://github.com/morhetz/gruvbox -" Last Modified: 04 Sep 2015 +" Last Modified: 12 Aug 2017 " ----------------------------------------------------------------------------- " Supporting code ------------------------------------------------------------- @@ -18,7 +18,7 @@ endif let g:colors_name='gruvbox' -if !has('gui_running') && &t_Co != 256 +if !(has('termguicolors') && &termguicolors) && !has('gui_running') && &t_Co != 256 finish endif @@ -269,7 +269,35 @@ let s:gb.aqua = s:aqua let s:gb.orange = s:orange " }}} +" Setup Terminal Colors For Neovim: {{{ +if has('nvim') + let g:terminal_color_0 = s:bg0[0] + let g:terminal_color_8 = s:gray[0] + + let g:terminal_color_1 = s:gb.neutral_red[0] + let g:terminal_color_9 = s:red[0] + + let g:terminal_color_2 = s:gb.neutral_green[0] + let g:terminal_color_10 = s:green[0] + + let g:terminal_color_3 = s:gb.neutral_yellow[0] + let g:terminal_color_11 = s:yellow[0] + + let g:terminal_color_4 = s:gb.neutral_blue[0] + let g:terminal_color_12 = s:blue[0] + + let g:terminal_color_5 = s:gb.neutral_purple[0] + let g:terminal_color_13 = s:purple[0] + + let g:terminal_color_6 = s:gb.neutral_aqua[0] + let g:terminal_color_14 = s:aqua[0] + + let g:terminal_color_7 = s:fg4[0] + let g:terminal_color_15 = s:fg1[0] +endif + +" }}} " Overload Setting: {{{ let s:hls_cursor = s:orange @@ -300,7 +328,7 @@ if exists('g:gruvbox_color_column') let s:color_column = get(s:gb, g:gruvbox_color_column) endif -let s:vert_split = s:bg2 +let s:vert_split = s:bg0 if exists('g:gruvbox_vert_split') let s:vert_split = get(s:gb, g:gruvbox_vert_split) endif @@ -451,9 +479,9 @@ if version >= 700 hi! link CursorColumn CursorLine " Tab pages line filler - call s:HL('TabLineFill', s:bg4, s:vim_bg, s:invert_tabline) + call s:HL('TabLineFill', s:bg4, s:bg1, s:invert_tabline) " Active tab page label - call s:HL('TabLineSel', s:vim_bg, s:bg4, s:bold . s:invert_tabline) + call s:HL('TabLineSel', s:green, s:bg1, s:invert_tabline) " Not active tab page label hi! link TabLine TabLineFill @@ -483,11 +511,11 @@ call s:HL('IncSearch', s:hls_cursor, s:bg0, s:inverse) call s:HL('Underlined', s:blue, s:none, s:underline) -call s:HL('StatusLine', s:bg4, s:bg0, s:bold . s:inverse) -call s:HL('StatusLineNC', s:bg2, s:fg4, s:bold . s:inverse) +call s:HL('StatusLine', s:bg2, s:fg1, s:inverse) +call s:HL('StatusLineNC', s:bg1, s:fg4, s:inverse) " The column separating vertically split windows -call s:HL('VertSplit', s:fg4, s:vert_split) +call s:HL('VertSplit', s:bg3, s:vert_split) " Current match in wildmenu completion call s:HL('WildMenu', s:blue, s:bg2, s:bold) @@ -541,7 +569,7 @@ hi! link lCursor Cursor if g:gruvbox_improved_strings == 0 hi! link Special GruvboxOrange else - call s:HL('Special', s:bg1, s:orange, s:italic) + call s:HL('Special', s:orange, s:bg1, s:italicize_strings) endif call s:HL('Comment', s:gray, s:none, s:italicize_comments) @@ -587,7 +615,7 @@ hi! link Character GruvboxPurple if g:gruvbox_improved_strings == 0 call s:HL('String', s:green, s:none, s:italicize_strings) else - call s:HL('String', s:bg1, s:fg1, s:italicize_strings) + call s:HL('String', s:fg1, s:bg1, s:italicize_strings) endif " Boolean constant: TRUE, false hi! link Boolean GruvboxPurple @@ -660,10 +688,8 @@ hi! link EasyMotionShade Comment " }}} " Sneak: {{{ -hi! link SneakPluginTarget Search -hi! link SneakStreakTarget Search -call s:HL('SneakStreakMask', s:yellow, s:yellow) -hi! link SneakStreakStatusLine Search +autocmd ColorScheme gruvbox hi! link Sneak Search +autocmd ColorScheme gruvbox hi! link SneakLabel Search " }}} " Indent Guides: {{{ @@ -779,7 +805,7 @@ call s:HL('CtrlPStats', s:fg4, s:bg2, s:bold) " Startify: {{{ hi! link StartifyBracket GruvboxFg3 -hi! link StartifyFile GruvboxFg0 +hi! link StartifyFile GruvboxFg1 hi! link StartifyNumber GruvboxBlue hi! link StartifyPath GruvboxGray hi! link StartifySlash GruvboxGray @@ -806,6 +832,62 @@ call s:HL('BufTabLineActive', s:fg4, s:bg2) call s:HL('BufTabLineHidden', s:bg4, s:bg1) call s:HL('BufTabLineFill', s:bg0, s:bg0) +" }}} +" Asynchronous Lint Engine: {{{ + +call s:HL('ALEError', s:none, s:none, s:undercurl, s:red) +call s:HL('ALEWarning', s:none, s:none, s:undercurl, s:yellow) +call s:HL('ALEInfo', s:none, s:none, s:undercurl, s:blue) + +hi! link ALEErrorSign GruvboxRedSign +hi! link ALEWarningSign GruvboxYellowSign +hi! link ALEInfoSign GruvboxBlueSign + +" }}} +" Dirvish: {{{ + +hi! link DirvishPathTail GruvboxAqua +hi! link DirvishArg GruvboxYellow + +" }}} +" Netrw: {{{ + +hi! link netrwDir GruvboxAqua +hi! link netrwClassify GruvboxAqua +hi! link netrwLink GruvboxGray +hi! link netrwSymLink GruvboxFg1 +hi! link netrwExe GruvboxYellow +hi! link netrwComment GruvboxGray +hi! link netrwList GruvboxBlue +hi! link netrwHelpCmd GruvboxAqua +hi! link netrwCmdSep GruvboxFg3 +hi! link netrwVersion GruvboxGreen + +" }}} +" NERDTree: {{{ + +hi! link NERDTreeDir GruvboxAqua +hi! link NERDTreeDirSlash GruvboxAqua + +hi! link NERDTreeOpenable GruvboxOrange +hi! link NERDTreeClosable GruvboxOrange + +hi! link NERDTreeFile GruvboxFg1 +hi! link NERDTreeExecFile GruvboxYellow + +hi! link NERDTreeUp GruvboxGray +hi! link NERDTreeCWD GruvboxGreen +hi! link NERDTreeHelp GruvboxFg1 + +hi! link NERDTreeToggleOn GruvboxGreen +hi! link NERDTreeToggleOff GruvboxRed + +" }}} +" Vim Multiple Cursors: {{{ + +call s:HL('multiple_cursors_cursor', s:none, s:none, s:inverse) +call s:HL('multiple_cursors_visual', s:none, s:bg2) + " }}} " Filetype specific ----------------------------------------------------------- @@ -932,9 +1014,13 @@ hi! link pythonImport GruvboxBlue hi! link pythonRun GruvboxBlue hi! link pythonCoding GruvboxBlue hi! link pythonOperator GruvboxRed +hi! link pythonException GruvboxRed hi! link pythonExceptions GruvboxPurple hi! link pythonBoolean GruvboxPurple hi! link pythonDot GruvboxFg3 +hi! link pythonConditional GruvboxRed +hi! link pythonRepeat GruvboxRed +hi! link pythonDottedName GruvboxGreenBold " }}} " CSS: {{{ @@ -999,9 +1085,24 @@ hi! link javascriptEndColons GruvboxFg1 hi! link javascriptFuncArg GruvboxFg1 hi! link javascriptGlobalMethod GruvboxFg1 hi! link javascriptNodeGlobal GruvboxFg1 +hi! link javascriptBOMWindowProp GruvboxFg1 +hi! link javascriptArrayMethod GruvboxFg1 +hi! link javascriptArrayStaticMethod GruvboxFg1 +hi! link javascriptCacheMethod GruvboxFg1 +hi! link javascriptDateMethod GruvboxFg1 +hi! link javascriptMathStaticMethod GruvboxFg1 -" hi! link javascriptVariable GruvboxOrange -hi! link javascriptVariable GruvboxRed +" hi! link javascriptProp GruvboxFg1 +hi! link javascriptURLUtilsProp GruvboxFg1 +hi! link javascriptBOMNavigatorProp GruvboxFg1 +hi! link javascriptDOMDocMethod GruvboxFg1 +hi! link javascriptDOMDocProp GruvboxFg1 +hi! link javascriptBOMLocationMethod GruvboxFg1 +hi! link javascriptBOMWindowMethod GruvboxFg1 +hi! link javascriptStringMethod GruvboxFg1 + +hi! link javascriptVariable GruvboxOrange +" hi! link javascriptVariable GruvboxRed " hi! link javascriptIdentifier GruvboxOrange " hi! link javascriptClassSuper GruvboxOrange hi! link javascriptIdentifier GruvboxOrange @@ -1030,7 +1131,7 @@ hi! link javascriptObjectLabel GruvboxFg1 hi! link javascriptPropertyName GruvboxFg1 hi! link javascriptLogicSymbols GruvboxFg1 -hi! link javascriptArrowFunc GruvboxFg1 +hi! link javascriptArrowFunc GruvboxYellow hi! link javascriptDocParamName GruvboxFg4 hi! link javascriptDocTags GruvboxFg4 @@ -1038,11 +1139,38 @@ hi! link javascriptDocNotation GruvboxFg4 hi! link javascriptDocParamType GruvboxFg4 hi! link javascriptDocNamedParamType GruvboxFg4 +hi! link javascriptBrackets GruvboxFg1 +hi! link javascriptDOMElemAttrs GruvboxFg1 +hi! link javascriptDOMEventMethod GruvboxFg1 +hi! link javascriptDOMNodeMethod GruvboxFg1 +hi! link javascriptDOMStorageMethod GruvboxFg1 +hi! link javascriptHeadersMethod GruvboxFg1 + +hi! link javascriptAsyncFuncKeyword GruvboxRed +hi! link javascriptAwaitFuncKeyword GruvboxRed + +" }}} +" PanglossJS: {{{ + +hi! link jsClassKeyword GruvboxAqua +hi! link jsExtendsKeyword GruvboxAqua +hi! link jsExportDefault GruvboxAqua +hi! link jsTemplateBraces GruvboxAqua +hi! link jsGlobalNodeObjects GruvboxFg1 +hi! link jsGlobalObjects GruvboxFg1 +hi! link jsFunction GruvboxAqua +hi! link jsFuncParens GruvboxFg3 +hi! link jsParens GruvboxFg3 +hi! link jsNull GruvboxPurple +hi! link jsUndefined GruvboxPurple +hi! link jsClassDefinition GruvboxYellow + " }}} " TypeScript: {{{ hi! link typeScriptReserved GruvboxAqua hi! link typeScriptLabel GruvboxAqua +hi! link typeScriptFuncKeyword GruvboxAqua hi! link typeScriptIdentifier GruvboxOrange hi! link typeScriptBraces GruvboxFg1 hi! link typeScriptEndColons GruvboxFg1 @@ -1052,6 +1180,32 @@ hi! link typeScriptLogicSymbols GruvboxFg1 hi! link typeScriptDocSeeTag Comment hi! link typeScriptDocParam Comment hi! link typeScriptDocTags vimCommentTitle +hi! link typeScriptGlobalObjects GruvboxFg1 +hi! link typeScriptParens GruvboxFg3 +hi! link typeScriptOpSymbols GruvboxFg3 +hi! link typeScriptHtmlElemProperties GruvboxFg1 +hi! link typeScriptNull GruvboxPurple +hi! link typeScriptInterpolationDelimiter GruvboxAqua + +" }}} +" PureScript: {{{ + +hi! link purescriptModuleKeyword GruvboxAqua +hi! link purescriptModuleName GruvboxFg1 +hi! link purescriptWhere GruvboxAqua +hi! link purescriptDelimiter GruvboxFg4 +hi! link purescriptType GruvboxFg1 +hi! link purescriptImportKeyword GruvboxAqua +hi! link purescriptHidingKeyword GruvboxAqua +hi! link purescriptAsKeyword GruvboxAqua +hi! link purescriptStructure GruvboxAqua +hi! link purescriptOperator GruvboxBlue + +hi! link purescriptTypeVar GruvboxFg1 +hi! link purescriptConstructor GruvboxFg1 +hi! link purescriptFunction GruvboxFg1 +hi! link purescriptConditional GruvboxOrange +hi! link purescriptBacktick GruvboxOrange " }}} " CoffeeScript: {{{ diff --git a/sources_non_forked/gruvbox/package.json b/sources_non_forked/gruvbox/package.json new file mode 100644 index 00000000..355c1808 --- /dev/null +++ b/sources_non_forked/gruvbox/package.json @@ -0,0 +1,10 @@ +{ + "name": "gruvbox", + "version": "2.0.0", + "repository": "git@github.com:morhetz/gruvbox.git", + "author": "Pavel Pertsev ", + "license": "MIT", + "vim": { + "opt": true + } +} diff --git a/sources_non_forked/lightline.vim/autoload/lightline.vim b/sources_non_forked/lightline.vim/autoload/lightline.vim index 6bcc09b4..9004efd4 100644 --- a/sources_non_forked/lightline.vim/autoload/lightline.vim +++ b/sources_non_forked/lightline.vim/autoload/lightline.vim @@ -2,7 +2,7 @@ " Filename: autoload/lightline.vim " Author: itchyny " License: MIT License -" Last Change: 2016/12/03 12:08:08. +" Last Change: 2017/08/21 08:19:52. " ============================================================================= let s:save_cpo = &cpo @@ -118,6 +118,7 @@ let s:_lightline = { \ 'component_type': { \ 'tabs': 'tabsel', 'close': 'raw' \ }, + \ 'component_raw': {}, \ 'tab_component': {}, \ 'tab_component_function': { \ 'filename': 'lightline#tab#filename', 'modified': 'lightline#tab#modified', @@ -338,7 +339,9 @@ endfunction function! s:convert(name, index) abort if has_key(s:lightline.component_expand, a:name) let type = get(s:lightline.component_type, a:name, a:index) - return filter(s:map(s:evaluate_expand(s:lightline.component_expand[a:name]), '[v:val, 1, v:key == 1 ? "' . type . '" : "' . a:index . '"]'), 'v:val[0] != []') + let is_raw = get(s:lightline.component_raw, a:name) || type ==# 'raw' + return filter(s:map(s:evaluate_expand(s:lightline.component_expand[a:name]), + \ '[v:val, 1 + ' . is_raw . ', v:key == 1 && ' . (type !=# 'raw') . ' ? "' . type . '" : "' . a:index . '"]'), 'v:val[0] != []') else return [[[a:name], 0, a:index]] endif @@ -393,7 +396,7 @@ function! s:line(tabline, inactive) abort endif let [l, r] = a:tabline ? [s:lightline.tab_llen, s:lightline.tab_rlen] : [s:lightline.llen, s:lightline.rlen] let [p, s] = a:tabline ? [s:lightline.tabline_separator, s:lightline.tabline_subseparator] : [s:lightline.separator, s:lightline.subseparator] - let [c, f, t] = [s:lightline.component, s:lightline.component_function, s:lightline.component_type] + let [c, f, t, w] = [s:lightline.component, s:lightline.component_function, s:lightline.component_type, s:lightline.component_raw] let mode = a:tabline ? 'tabline' : a:inactive ? 'inactive' : 'active' let l_ = has_key(s:lightline, mode) ? s:lightline[mode].left : s:lightline.active.left let [lt, lc, ll] = s:expand(copy(l_)) @@ -403,7 +406,7 @@ function! s:line(tabline, inactive) abort let _ .= '%#LightlineLeft_' . mode . '_' . ll[i] . '#' for j in range(len(lt[i])) let x = lc[i][j] ? lt[i][j] : has_key(f, lt[i][j]) ? (exists('*' . f[lt[i][j]]) ? '%{' . f[lt[i][j]] . '()}' : '%{exists("*' . f[lt[i][j]] . '")?' . f[lt[i][j]] . '():""}') : get(c, lt[i][j], '') - let _ .= has_key(t, lt[i][j]) && t[lt[i][j]] ==# 'raw' || x ==# '' ? x : '%( ' . x . ' %)' + let _ .= has_key(t, lt[i][j]) && t[lt[i][j]] ==# 'raw' || get(w, lt[i][j]) || lc[i][j] ==# 2 || x ==# '' ? x : '%( ' . x . ' %)' if j < len(lt[i]) - 1 && s.left !=# '' let _ .= s:subseparator(lt[i][(j):], s.left, lc[i][(j):]) endif @@ -418,7 +421,7 @@ function! s:line(tabline, inactive) abort let _ .= '%#LightlineRight_' . mode . '_' . rl[i] . '#' for j in range(len(rt[i])) let x = rc[i][j] ? rt[i][j] : has_key(f, rt[i][j]) ? (exists('*' . f[rt[i][j]]) ? '%{' . f[rt[i][j]] . '()}' : '%{exists("*' . f[rt[i][j]] . '")?' . f[rt[i][j]] . '():""}') : get(c, rt[i][j], '') - let _ .= has_key(t, rt[i][j]) && t[rt[i][j]] ==# 'raw' || x ==# '' ? x : '%( ' . x . ' %)' + let _ .= has_key(t, rt[i][j]) && t[rt[i][j]] ==# 'raw' || get(w, rt[i][j]) || rc[i][j] ==# 2 || x ==# '' ? x : '%( ' . x . ' %)' if j < len(rt[i]) - 1 && s.right !=# '' let _ .= s:subseparator(rt[i][(j):], s.right, rc[i][(j):]) endif diff --git a/sources_non_forked/lightline.vim/doc/lightline.txt b/sources_non_forked/lightline.vim/doc/lightline.txt index 0b41c12a..f68be38f 100644 --- a/sources_non_forked/lightline.vim/doc/lightline.txt +++ b/sources_non_forked/lightline.vim/doc/lightline.txt @@ -4,7 +4,7 @@ Version: 0.1 Author: itchyny (https://github.com/itchyny) License: MIT License Repository: https://github.com/itchyny/lightline.vim -Last Change: 2017/05/28 01:07:02. +Last Change: 2017/08/21 08:33:12. CONTENTS *lightline-contents* @@ -188,11 +188,22 @@ OPTIONS *lightline-option* |g:lightline.component_expand|. The types are used to specify the color. Specifically, the type raw is used to specify a component which should not be wrapped by item group: %(...%). + If you want to specify the type of a raw component, please use + |g:lightline.component_raw|. The default value is: > let g:lightline.component_type = { \ 'tabs': 'tabsel', \ 'close': 'raw' } +< + g:lightline.component_raw *g:lightline.component_raw* + A dictionary to specify the raw type components. When you + register a component to this dictionary (like > + let g:lightline.component_raw = { 'example': 1 } +< ), the example component is not wrapped by item group: %(...%). + The default value is: > + + let g:lightline.component_raw = {} < g:lightline.tab_component *g:lightline.tab_component* A dictionary for components in one tab. diff --git a/sources_non_forked/lightline.vim/test/expand.vim b/sources_non_forked/lightline.vim/test/expand.vim index 37804eed..a9c85774 100644 --- a/sources_non_forked/lightline.vim/test/expand.vim +++ b/sources_non_forked/lightline.vim/test/expand.vim @@ -45,6 +45,32 @@ function! s:suite.custom_type() delfunction Custom endfunction +function! s:suite.raw_type() + function! Custom() + return [ ['left'], ['middle'], ['right'] ] + endfunction + let g:lightline = { 'component_expand': { 'custom': 'Custom' }, 'component_type': { 'custom': 'raw' } } + call lightline#init() + call s:assert.equals(s:expand([['readonly', 'filename'], ['custom'], ['modified']]), + \ [[['readonly', 'filename'], ['left', 'middle', 'right'], ['modified']], [[0, 0], [2, 2, 2], [0]], ['0', '1', '2', '3']]) + call s:assert.equals(s:expand([['readonly', 'filename', 'custom', 'modified']]), + \ [[['readonly', 'filename', 'left', 'middle', 'right', 'modified']], [[0, 0, 2, 2, 2, 0]], ['0', '1']]) + delfunction Custom +endfunction + +function! s:suite.component_raw() + function! Custom() + return [ ['left'], ['middle'], ['right'] ] + endfunction + let g:lightline = { 'component_expand': { 'custom': 'Custom' }, 'component_type': { 'custom': 'custom' }, 'component_raw': { 'custom': 1 } } + call lightline#init() + call s:assert.equals(s:expand([['readonly', 'filename'], ['custom'], ['modified']]), + \ [[['readonly', 'filename'], ['left'], ['middle'], ['right'], ['modified']], [[0, 0], [2], [2], [2], [0]], ['0', '1', 'custom', '1', '2', '3']]) + call s:assert.equals(s:expand([['readonly', 'filename', 'custom', 'modified']]), + \ [[['readonly', 'filename', 'left'], ['middle'], ['right', 'modified']], [[0, 0, 2], [2], [2, 0]], ['0', 'custom', '0', '1']]) + delfunction Custom +endfunction + function! s:suite.multiple() function! Custom() return [ ['x0', 'x1', 'x2'], ['y0', 'y1', 'y2'], ['z0', 'z1', 'z2'] ] diff --git a/sources_non_forked/nerdtree/README.markdown b/sources_non_forked/nerdtree/README.markdown index 48d216b9..879d96d4 100644 --- a/sources_non_forked/nerdtree/README.markdown +++ b/sources_non_forked/nerdtree/README.markdown @@ -1,56 +1,18 @@ -The NERD Tree +The NERDTree ============= -Intro ------ +Introduction +------------ -The NERD tree allows you to explore your filesystem and to open files and -directories. It presents the filesystem to you in the form of a tree which you -manipulate with the keyboard and/or mouse. It also allows you to perform -simple filesystem operations. +The NERDTree is a file system explorer for the Vim editor. Using this plugin, +users can visually browse complex directory hierarchies, quickly open files for +reading or editing, and perform basic file system operations. -The following features and functionality are provided by the NERD tree: +This plugin can also be extended with custom mappings using a special API. The +details of this API and of other NERDTree features are described in the +included documentation. - * Files and directories are displayed in a hierarchical tree structure - * Different highlighting is provided for the following types of nodes: - * files - * directories - * sym-links - * windows .lnk files - * read-only files - * executable files - * Many (customisable) mappings are provided to manipulate the tree: - * Mappings to open/close/explore directory nodes - * Mappings to open files in new/existing windows/tabs - * Mappings to change the current root of the tree - * Mappings to navigate around the tree - * ... - * Directories and files can be bookmarked. - * Most NERD tree navigation can also be done with the mouse - * Filtering of tree content (can be toggled at runtime) - * custom file filters to prevent e.g. vim backup files being displayed - * optional displaying of hidden files (. files) - * files can be "turned off" so that only directories are displayed - * The position and size of the NERD tree window can be customised - * The order in which the nodes in the tree are listed can be customised. - * A model of your filesystem is created/maintained as you explore it. This - has several advantages: - * All filesystem information is cached and is only re-read on demand - * If you revisit a part of the tree that you left earlier in your - session, the directory nodes will be opened/closed as you left them - * The script remembers the cursor position and window position in the NERD - tree so you can toggle it off (or just close the tree window) and then - reopen it (with NERDTreeToggle) the NERD tree window will appear exactly - as you left it - * You can have a separate NERD tree for each tab, share trees across tabs, - or a mix of both. - * By default the script overrides the default file browser (netrw), so if - you :edit a directory a (slightly modified) NERD tree will appear in the - current window - * A programmable menu system is provided (simulates right clicking on a node) - * one default menu plugin is provided to perform basic filesystem - operations (create/delete/move/copy files/directories) - * There's an API for adding your own keymappings +![NERDTree Screenshot](https://github.com/scrooloose/nerdtree/raw/master/screenshot.png) Installation ------------ @@ -66,10 +28,8 @@ Then reload Vim, run `:helptags ~/.vim/bundle/nerdtree/doc/`, and check out `:he apt-vim install -y https://github.com/scrooloose/nerdtree.git - - -Faq ---- +F.A.Q. +------ > Is there any support for `git` flags? diff --git a/sources_non_forked/nerdtree/lib/nerdtree/bookmark.vim b/sources_non_forked/nerdtree/lib/nerdtree/bookmark.vim index f8606ee6..45f9950e 100644 --- a/sources_non_forked/nerdtree/lib/nerdtree/bookmark.vim +++ b/sources_non_forked/nerdtree/lib/nerdtree/bookmark.vim @@ -293,23 +293,26 @@ function! s:Bookmark.str() endfunction " FUNCTION: Bookmark.toRoot(nerdtree) {{{1 -" Make the node for this bookmark the new tree root +" Set the root of the given NERDTree to the node for this Bookmark. If a node +" for this Bookmark does not exist, a new one is initialized. function! s:Bookmark.toRoot(nerdtree) if self.validate() try - let targetNode = self.getNode(a:nerdtree, 1) + let l:targetNode = self.getNode(a:nerdtree, 1) + call l:targetNode.closeChildren() catch /^NERDTree.BookmarkedNodeNotFoundError/ - let targetNode = g:NERDTreeFileNode.New(s:Bookmark.BookmarkFor(self.name).path, a:nerdtree) + let l:targetNode = g:NERDTreeFileNode.New(s:Bookmark.BookmarkFor(self.name).path, a:nerdtree) endtry - call a:nerdtree.changeRoot(targetNode) + call a:nerdtree.changeRoot(l:targetNode) endif endfunction " FUNCTION: Bookmark.ToRoot(name, nerdtree) {{{1 -" Make the node for this bookmark the new tree root +" Class method that makes the Bookmark with the given name the root of +" specified NERDTree. function! s:Bookmark.ToRoot(name, nerdtree) - let bookmark = s:Bookmark.BookmarkFor(a:name) - call bookmark.toRoot(a:nerdtree) + let l:bookmark = s:Bookmark.BookmarkFor(a:name) + call l:bookmark.toRoot(a:nerdtree) endfunction " FUNCTION: Bookmark.validate() {{{1 diff --git a/sources_non_forked/nerdtree/lib/nerdtree/opener.vim b/sources_non_forked/nerdtree/lib/nerdtree/opener.vim index ac0f92eb..fd32e643 100644 --- a/sources_non_forked/nerdtree/lib/nerdtree/opener.vim +++ b/sources_non_forked/nerdtree/lib/nerdtree/opener.vim @@ -1,15 +1,20 @@ -"CLASS: Opener -"============================================================ +" ============================================================================ +" CLASS: Opener +" +" The Opener class defines an API for "opening" operations. +" ============================================================================ + + let s:Opener = {} let g:NERDTreeOpener = s:Opener -"FUNCTION: s:Opener._bufInWindows(bnum){{{1 -"[[STOLEN FROM VTREEEXPLORER.VIM]] -"Determine the number of windows open to this buffer number. -"Care of Yegappan Lakshman. Thanks! +" FUNCTION: s:Opener._bufInWindows(bnum) {{{1 +" [[STOLEN FROM VTREEEXPLORER.VIM]] +" Determine the number of windows open to this buffer number. +" Care of Yegappan Lakshman. Thanks! " -"Args: -"bnum: the subject buffers buffer number +" Args: +" bnum: the subject buffers buffer number function! s:Opener._bufInWindows(bnum) let cnt = 0 let winnum = 1 @@ -26,14 +31,15 @@ function! s:Opener._bufInWindows(bnum) return cnt endfunction -"FUNCTION: Opener._checkToCloseTree(newtab) {{{1 -"Check the class options and global options (i.e. NERDTreeQuitOnOpen) to see -"if the tree should be closed now. + +" FUNCTION: Opener._checkToCloseTree(newtab) {{{1 +" Check the class options and global options (i.e. NERDTreeQuitOnOpen) to see +" if the tree should be closed now. " -"Args: -"a:newtab - boolean. If set, only close the tree now if we are opening the -"target in a new tab. This is needed because we have to close tree before we -"leave the tab +" Args: +" a:newtab - boolean. If set, only close the tree now if we are opening the +" target in a new tab. This is needed because we have to close tree before we +" leave the tab function! s:Opener._checkToCloseTree(newtab) if self._keepopen return @@ -44,9 +50,8 @@ function! s:Opener._checkToCloseTree(newtab) endif endfunction - -"FUNCTION: s:Opener._firstUsableWindow(){{{1 -"find the window number of the first normal window +" FUNCTION: s:Opener._firstUsableWindow() {{{1 +" find the window number of the first normal window function! s:Opener._firstUsableWindow() let i = 1 while i <= winnr("$") @@ -62,7 +67,7 @@ function! s:Opener._firstUsableWindow() return -1 endfunction -"FUNCTION: Opener._gotoTargetWin() {{{1 +" FUNCTION: Opener._gotoTargetWin() {{{1 function! s:Opener._gotoTargetWin() if b:NERDTree.isWinTree() if self._where == 'v' @@ -89,12 +94,12 @@ function! s:Opener._gotoTargetWin() endif endfunction -"FUNCTION: s:Opener._isWindowUsable(winnumber) {{{1 -"Returns 0 if opening a file from the tree in the given window requires it to -"be split, 1 otherwise +" FUNCTION: s:Opener._isWindowUsable(winnumber) {{{1 +" Returns 0 if opening a file from the tree in the given window requires it to +" be split, 1 otherwise " -"Args: -"winnumber: the number of the window in question +" Args: +" winnumber: the number of the window in question function! s:Opener._isWindowUsable(winnumber) "gotta split if theres only one window (i.e. the NERD tree) if winnr("$") ==# 1 @@ -120,21 +125,21 @@ function! s:Opener._isWindowUsable(winnumber) return !modified || self._bufInWindows(winbufnr(a:winnumber)) >= 2 endfunction -"FUNCTION: Opener.New(path, opts) {{{1 -"Args: +" FUNCTION: Opener.New(path, opts) {{{1 +" Args: " -"a:path: The path object that is to be opened. +" a:path: The path object that is to be opened. " -"a:opts: +" a:opts: " -"A dictionary containing the following keys (all optional): -" 'where': Specifies whether the node should be opened in new split/tab or in -" the previous window. Can be either 'v' or 'h' or 't' (for open in -" new tab) -" 'reuse': if a window is displaying the file then jump the cursor there. Can -" 'all', 'currenttab' or empty to not reuse. -" 'keepopen': dont close the tree window -" 'stay': open the file, but keep the cursor in the tree win +" A dictionary containing the following keys (all optional): +" 'where': Specifies whether the node should be opened in new split/tab or in +" the previous window. Can be either 'v' or 'h' or 't' (for open in +" new tab) +" 'reuse': if a window is displaying the file then jump the cursor there. Can +" 'all', 'currenttab' or empty to not reuse. +" 'keepopen': dont close the tree window +" 'stay': open the file, but keep the cursor in the tree win function! s:Opener.New(path, opts) let newObj = copy(self) @@ -155,7 +160,7 @@ function! s:Opener.New(path, opts) return newObj endfunction -"FUNCTION: Opener._newSplit() {{{1 +" FUNCTION: Opener._newSplit() {{{1 function! s:Opener._newSplit() " Save the user's settings for splitbelow and splitright let savesplitbelow=&splitbelow @@ -215,23 +220,27 @@ function! s:Opener._newSplit() let &splitright=savesplitright endfunction -"FUNCTION: Opener._newVSplit() {{{1 +" FUNCTION: Opener._newVSplit() {{{1 function! s:Opener._newVSplit() - let winwidth = winwidth(".") - if winnr("$")==#1 - let winwidth = g:NERDTreeWinSize + let l:winwidth = winwidth('.') + + if winnr('$') == 1 + let l:winwidth = g:NERDTreeWinSize endif - call nerdtree#exec("wincmd p") + call nerdtree#exec('wincmd p') vnew - "resize the nerd tree back to the original size + let l:currentWindowNumber = winnr() + + " Restore the NERDTree to its original width. call g:NERDTree.CursorToTreeWin() - exec("silent vertical resize ". winwidth) - call nerdtree#exec('wincmd p') + execute 'silent vertical resize ' . l:winwidth + + call nerdtree#exec(l:currentWindowNumber . 'wincmd w') endfunction -"FUNCTION: Opener.open(target) {{{1 +" FUNCTION: Opener.open(target) {{{1 function! s:Opener.open(target) if self._path.isDirectory call self._openDirectory(a:target) @@ -240,7 +249,7 @@ function! s:Opener.open(target) endif endfunction -"FUNCTION: Opener._openFile() {{{1 +" FUNCTION: Opener._openFile() {{{1 function! s:Opener._openFile() if self._reuseWindow() return @@ -253,7 +262,7 @@ function! s:Opener._openFile() endif endfunction -"FUNCTION: Opener._openDirectory(node) {{{1 +" FUNCTION: Opener._openDirectory(node) {{{1 function! s:Opener._openDirectory(node) if self._nerdtree.isWinTree() call self._gotoTargetWin() @@ -274,7 +283,7 @@ function! s:Opener._openDirectory(node) endif endfunction -"FUNCTION: Opener._previousWindow() {{{1 +" FUNCTION: Opener._previousWindow() {{{1 function! s:Opener._previousWindow() if !self._isWindowUsable(winnr("#")) && self._firstUsableWindow() ==# -1 call self._newSplit() @@ -294,16 +303,16 @@ function! s:Opener._previousWindow() endif endfunction -"FUNCTION: Opener._restoreCursorPos(){{{1 +" FUNCTION: Opener._restoreCursorPos() {{{1 function! s:Opener._restoreCursorPos() call nerdtree#exec('normal ' . self._tabnr . 'gt') call nerdtree#exec(bufwinnr(self._bufnr) . 'wincmd w') endfunction -"FUNCTION: Opener._reuseWindow(){{{1 -"put the cursor in the first window we find for this file +" FUNCTION: Opener._reuseWindow() {{{1 +" put the cursor in the first window we find for this file " -"return 1 if we were successful +" return 1 if we were successful function! s:Opener._reuseWindow() if empty(self._reuse) return 0 @@ -334,7 +343,7 @@ function! s:Opener._reuseWindow() return 0 endfunction -"FUNCTION: Opener._saveCursorPos(){{{1 +" FUNCTION: Opener._saveCursorPos() {{{1 function! s:Opener._saveCursorPos() let self._bufnr = bufnr("") let self._tabnr = tabpagenr() diff --git a/sources_non_forked/nerdtree/lib/nerdtree/path.vim b/sources_non_forked/nerdtree/lib/nerdtree/path.vim index b884ec60..3e7c9133 100644 --- a/sources_non_forked/nerdtree/lib/nerdtree/path.vim +++ b/sources_non_forked/nerdtree/lib/nerdtree/path.vim @@ -1,13 +1,20 @@ -"we need to use this number many times for sorting... so we calculate it only -"once here -let s:NERDTreeSortStarIndex = index(g:NERDTreeSortOrder, '*') +" ============================================================================ +" CLASS: Path +" +" The Path class provides an abstracted representation of a file system +" pathname. Various operations on pathnames are provided and a number of +" representations of a given path name can be accessed here. +" ============================================================================ + + +" This constant is used throughout this script for sorting purposes. +let s:NERDTreeSortStarIndex = index(g:NERDTreeSortOrder, '*') +lockvar s:NERDTreeSortStarIndex -"CLASS: Path -"============================================================ let s:Path = {} let g:NERDTreePath = s:Path -"FUNCTION: Path.AbsolutePathFor(str) {{{1 +" FUNCTION: Path.AbsolutePathFor(str) {{{1 function! s:Path.AbsolutePathFor(str) let prependCWD = 0 if nerdtree#runningWindows() @@ -24,7 +31,7 @@ function! s:Path.AbsolutePathFor(str) return toReturn endfunction -"FUNCTION: Path.bookmarkNames() {{{1 +" FUNCTION: Path.bookmarkNames() {{{1 function! s:Path.bookmarkNames() if !exists("self._bookmarkNames") call self.cacheDisplayString() @@ -32,7 +39,7 @@ function! s:Path.bookmarkNames() return self._bookmarkNames endfunction -"FUNCTION: Path.cacheDisplayString() {{{1 +" FUNCTION: Path.cacheDisplayString() {{{1 function! s:Path.cacheDisplayString() abort let self.cachedDisplayString = self.getLastPathComponent(1) @@ -59,7 +66,7 @@ function! s:Path.cacheDisplayString() abort endif endfunction -"FUNCTION: Path.changeToDir() {{{1 +" FUNCTION: Path.changeToDir() {{{1 function! s:Path.changeToDir() let dir = self.str({'format': 'Cd'}) if self.isDirectory ==# 0 @@ -74,16 +81,16 @@ function! s:Path.changeToDir() endtry endfunction -"FUNCTION: Path.compareTo() {{{1 +" FUNCTION: Path.compareTo() {{{1 " -"Compares this Path to the given path and returns 0 if they are equal, -1 if -"this Path is "less than" the given path, or 1 if it is "greater". +" Compares this Path to the given path and returns 0 if they are equal, -1 if +" this Path is "less than" the given path, or 1 if it is "greater". " -"Args: -"path: the path object to compare this to +" Args: +" path: the path object to compare this to " -"Return: -"1, -1 or 0 +" Return: +" 1, -1 or 0 function! s:Path.compareTo(path) let thisPath = self.getLastPathComponent(1) let thatPath = a:path.getLastPathComponent(1) @@ -118,16 +125,16 @@ function! s:Path.compareTo(path) endif endfunction -"FUNCTION: Path.Create(fullpath) {{{1 +" FUNCTION: Path.Create(fullpath) {{{1 " -"Factory method. +" Factory method. " -"Creates a path object with the given path. The path is also created on the -"filesystem. If the path already exists, a NERDTree.Path.Exists exception is -"thrown. If any other errors occur, a NERDTree.Path exception is thrown. +" Creates a path object with the given path. The path is also created on the +" filesystem. If the path already exists, a NERDTree.Path.Exists exception is +" thrown. If any other errors occur, a NERDTree.Path exception is thrown. " -"Args: -"fullpath: the full filesystem path to the file/dir to create +" Args: +" fullpath: the full filesystem path to the file/dir to create function! s:Path.Create(fullpath) "bail if the a:fullpath already exists if isdirectory(a:fullpath) || filereadable(a:fullpath) @@ -155,12 +162,12 @@ function! s:Path.Create(fullpath) return s:Path.New(a:fullpath) endfunction -"FUNCTION: Path.copy(dest) {{{1 +" FUNCTION: Path.copy(dest) {{{1 " -"Copies the file/dir represented by this Path to the given location +" Copies the file/dir represented by this Path to the given location " -"Args: -"dest: the location to copy this dir/file to +" Args: +" dest: the location to copy this dir/file to function! s:Path.copy(dest) if !s:Path.CopyingSupported() throw "NERDTree.CopyingNotSupportedError: Copying is not supported on this OS" @@ -181,20 +188,20 @@ function! s:Path.copy(dest) endif endfunction -"FUNCTION: Path.CopyingSupported() {{{1 +" FUNCTION: Path.CopyingSupported() {{{1 " -"returns 1 if copying is supported for this OS +" returns 1 if copying is supported for this OS function! s:Path.CopyingSupported() return exists('g:NERDTreeCopyCmd') || (exists('g:NERDTreeCopyDirCmd') && exists('g:NERDTreeCopyFileCmd')) endfunction -"FUNCTION: Path.copyingWillOverwrite(dest) {{{1 +" FUNCTION: Path.copyingWillOverwrite(dest) {{{1 " -"returns 1 if copy this path to the given location will cause files to -"overwritten +" returns 1 if copy this path to the given location will cause files to +" overwritten " -"Args: -"dest: the location this path will be copied to +" Args: +" dest: the location this path will be copied to function! s:Path.copyingWillOverwrite(dest) if filereadable(a:dest) return 1 @@ -208,13 +215,13 @@ function! s:Path.copyingWillOverwrite(dest) endif endfunction -"FUNCTION: Path.createParentDirectories(path) {{{1 +" FUNCTION: Path.createParentDirectories(path) {{{1 " -"create parent directories for this path if needed -"without throwing any errors if those directories already exist +" create parent directories for this path if needed +" without throwing any errors if those directories already exist " -"Args: -"path: full path of the node whose parent directories may need to be created +" Args: +" path: full path of the node whose parent directories may need to be created function! s:Path.createParentDirectories(path) let dir_path = fnamemodify(a:path, ':h') if !isdirectory(dir_path) @@ -222,11 +229,11 @@ function! s:Path.createParentDirectories(path) endif endfunction -"FUNCTION: Path.delete() {{{1 +" FUNCTION: Path.delete() {{{1 " -"Deletes the file or directory represented by this path. +" Deletes the file or directory represented by this path. " -"Throws NERDTree.Path.Deletion exceptions +" Throws NERDTree.Path.Deletion exceptions function! s:Path.delete() if self.isDirectory @@ -250,10 +257,10 @@ function! s:Path.delete() endfor endfunction -"FUNCTION: Path.displayString() {{{1 +" FUNCTION: Path.displayString() {{{1 " -"Returns a string that specifies how the path should be represented as a -"string +" Returns a string that specifies how the path should be represented as a +" string function! s:Path.displayString() if self.cachedDisplayString ==# "" call self.cacheDisplayString() @@ -262,14 +269,14 @@ function! s:Path.displayString() return self.cachedDisplayString endfunction -"FUNCTION: Path.edit() {{{1 +" FUNCTION: Path.edit() {{{1 function! s:Path.edit() exec "edit " . self.str({'format': 'Edit'}) endfunction -"FUNCTION: Path.extractDriveLetter(fullpath) {{{1 +" FUNCTION: Path.extractDriveLetter(fullpath) {{{1 " -"If running windows, cache the drive letter for this path +" If running windows, cache the drive letter for this path function! s:Path.extractDriveLetter(fullpath) if nerdtree#runningWindows() if a:fullpath =~ '^\(\\\\\|\/\/\)' @@ -285,14 +292,14 @@ function! s:Path.extractDriveLetter(fullpath) endfunction -"FUNCTION: Path.exists() {{{1 -"return 1 if this path points to a location that is readable or is a directory +" FUNCTION: Path.exists() {{{1 +" return 1 if this path points to a location that is readable or is a directory function! s:Path.exists() let p = self.str() return filereadable(p) || isdirectory(p) endfunction -"FUNCTION: Path._escChars() {{{1 +" FUNCTION: Path._escChars() {{{1 function! s:Path._escChars() if nerdtree#runningWindows() return " `\|\"#%&,?()\*^<>$" @@ -301,12 +308,12 @@ function! s:Path._escChars() return " \\`\|\"#%&,?()\*^<>[]$" endfunction -"FUNCTION: Path.getDir() {{{1 +" FUNCTION: Path.getDir() {{{1 " -"Returns this path if it is a directory, else this paths parent. +" Returns this path if it is a directory, else this paths parent. " -"Return: -"a Path object +" Return: +" a Path object function! s:Path.getDir() if self.isDirectory return self @@ -315,12 +322,12 @@ function! s:Path.getDir() endif endfunction -"FUNCTION: Path.getParent() {{{1 +" FUNCTION: Path.getParent() {{{1 " -"Returns a new path object for this paths parent +" Returns a new path object for this paths parent " -"Return: -"a new Path object +" Return: +" a new Path object function! s:Path.getParent() if nerdtree#runningWindows() let path = self.drive . '\' . join(self.pathSegments[0:-2], '\') @@ -331,13 +338,13 @@ function! s:Path.getParent() return s:Path.New(path) endfunction -"FUNCTION: Path.getLastPathComponent(dirSlash) {{{1 +" FUNCTION: Path.getLastPathComponent(dirSlash) {{{1 " -"Gets the last part of this path. +" Gets the last part of this path. " -"Args: -"dirSlash: if 1 then a trailing slash will be added to the returned value for -"directory nodes. +" Args: +" dirSlash: if 1 then a trailing slash will be added to the returned value for +" directory nodes. function! s:Path.getLastPathComponent(dirSlash) if empty(self.pathSegments) return '' @@ -349,8 +356,8 @@ function! s:Path.getLastPathComponent(dirSlash) return toReturn endfunction -"FUNCTION: Path.getSortOrderIndex() {{{1 -"returns the index of the pattern in g:NERDTreeSortOrder that this path matches +" FUNCTION: Path.getSortOrderIndex() {{{1 +" returns the index of the pattern in g:NERDTreeSortOrder that this path matches function! s:Path.getSortOrderIndex() let i = 0 while i < len(g:NERDTreeSortOrder) @@ -362,8 +369,8 @@ function! s:Path.getSortOrderIndex() return s:NERDTreeSortStarIndex endfunction -"FUNCTION: Path._splitChunks(path) {{{1 -"returns a list of path chunks +" FUNCTION: Path._splitChunks(path) {{{1 +" returns a list of path chunks function! s:Path._splitChunks(path) let chunks = split(a:path, '\(\D\+\|\d\+\)\zs') let i = 0 @@ -377,8 +384,8 @@ function! s:Path._splitChunks(path) return chunks endfunction -"FUNCTION: Path.getSortKey() {{{1 -"returns a key used in compare function for sorting +" FUNCTION: Path.getSortKey() {{{1 +" returns a key used in compare function for sorting function! s:Path.getSortKey() if !exists("self._sortKey") let path = self.getLastPathComponent(1) @@ -399,14 +406,14 @@ function! s:Path.getSortKey() endfunction -"FUNCTION: Path.isUnixHiddenFile() {{{1 -"check for unix hidden files +" FUNCTION: Path.isUnixHiddenFile() {{{1 +" check for unix hidden files function! s:Path.isUnixHiddenFile() return self.getLastPathComponent(0) =~# '^\.' endfunction -"FUNCTION: Path.isUnixHiddenPath() {{{1 -"check for unix path with hidden components +" FUNCTION: Path.isUnixHiddenPath() {{{1 +" check for unix path with hidden components function! s:Path.isUnixHiddenPath() if self.getLastPathComponent(0) =~# '^\.' return 1 @@ -420,8 +427,8 @@ function! s:Path.isUnixHiddenPath() endif endfunction -"FUNCTION: Path.ignore(nerdtree) {{{1 -"returns true if this path should be ignored +" FUNCTION: Path.ignore(nerdtree) {{{1 +" returns true if this path should be ignored function! s:Path.ignore(nerdtree) "filter out the user specified paths to ignore if a:nerdtree.ui.isIgnoreFilterEnabled() @@ -450,8 +457,8 @@ function! s:Path.ignore(nerdtree) return 0 endfunction -"FUNCTION: Path._ignorePatternMatches(pattern) {{{1 -"returns true if this path matches the given ignore pattern +" FUNCTION: Path._ignorePatternMatches(pattern) {{{1 +" returns true if this path matches the given ignore pattern function! s:Path._ignorePatternMatches(pattern) let pat = a:pattern if strpart(pat,len(pat)-7) == '[[dir]]' @@ -469,10 +476,10 @@ function! s:Path._ignorePatternMatches(pattern) return self.getLastPathComponent(0) =~# pat endfunction -"FUNCTION: Path.isAncestor(path) {{{1 -"return 1 if this path is somewhere above the given path in the filesystem. +" FUNCTION: Path.isAncestor(path) {{{1 +" return 1 if this path is somewhere above the given path in the filesystem. " -"a:path should be a dir +" a:path should be a dir function! s:Path.isAncestor(path) if !self.isDirectory return 0 @@ -483,8 +490,8 @@ function! s:Path.isAncestor(path) return stridx(that, this) == 0 endfunction -"FUNCTION: Path.isUnder(path) {{{1 -"return 1 if this path is somewhere under the given path in the filesystem. +" FUNCTION: Path.isUnder(path) {{{1 +" return 1 if this path is somewhere under the given path in the filesystem. function! s:Path.isUnder(path) if a:path.isDirectory == 0 return 0 @@ -495,7 +502,7 @@ function! s:Path.isUnder(path) return stridx(this, that . s:Path.Slash()) == 0 endfunction -"FUNCTION: Path.JoinPathStrings(...) {{{1 +" FUNCTION: Path.JoinPathStrings(...) {{{1 function! s:Path.JoinPathStrings(...) let components = [] for i in a:000 @@ -504,19 +511,19 @@ function! s:Path.JoinPathStrings(...) return '/' . join(components, '/') endfunction -"FUNCTION: Path.equals() {{{1 +" FUNCTION: Path.equals() {{{1 " -"Determines whether 2 path objects are "equal". -"They are equal if the paths they represent are the same +" Determines whether 2 path objects are "equal". +" They are equal if the paths they represent are the same " -"Args: -"path: the other path obj to compare this with +" Args: +" path: the other path obj to compare this with function! s:Path.equals(path) return self.str() ==# a:path.str() endfunction -"FUNCTION: Path.New() {{{1 -"The Constructor for the Path object +" FUNCTION: Path.New() {{{1 +" The Constructor for the Path object function! s:Path.New(path) let newPath = copy(self) @@ -528,26 +535,37 @@ function! s:Path.New(path) return newPath endfunction -"FUNCTION: Path.Slash() {{{1 -"return the slash to use for the current OS +" FUNCTION: Path.Slash() {{{1 +" Return the path separator used by the underlying file system. Special +" consideration is taken for the use of the 'shellslash' option on Windows +" systems. function! s:Path.Slash() - return nerdtree#runningWindows() ? '\' : '/' + + if nerdtree#runningWindows() + if exists('+shellslash') && &shellslash + return '/' + endif + + return '\' + endif + + return '/' endfunction -"FUNCTION: Path.Resolve() {{{1 -"Invoke the vim resolve() function and return the result -"This is necessary because in some versions of vim resolve() removes trailing -"slashes while in other versions it doesn't. This always removes the trailing -"slash +" FUNCTION: Path.Resolve() {{{1 +" Invoke the vim resolve() function and return the result +" This is necessary because in some versions of vim resolve() removes trailing +" slashes while in other versions it doesn't. This always removes the trailing +" slash function! s:Path.Resolve(path) let tmp = resolve(a:path) return tmp =~# '.\+/$' ? substitute(tmp, '/$', '', '') : tmp endfunction -"FUNCTION: Path.readInfoFromDisk(fullpath) {{{1 +" FUNCTION: Path.readInfoFromDisk(fullpath) {{{1 " " -"Throws NERDTree.Path.InvalidArguments exception. +" Throws NERDTree.Path.InvalidArguments exception. function! s:Path.readInfoFromDisk(fullpath) call self.extractDriveLetter(a:fullpath) @@ -598,22 +616,22 @@ function! s:Path.readInfoFromDisk(fullpath) endif endfunction -"FUNCTION: Path.refresh(nerdtree) {{{1 +" FUNCTION: Path.refresh(nerdtree) {{{1 function! s:Path.refresh(nerdtree) call self.readInfoFromDisk(self.str()) call g:NERDTreePathNotifier.NotifyListeners('refresh', self, a:nerdtree, {}) call self.cacheDisplayString() endfunction -"FUNCTION: Path.refreshFlags(nerdtree) {{{1 +" FUNCTION: Path.refreshFlags(nerdtree) {{{1 function! s:Path.refreshFlags(nerdtree) call g:NERDTreePathNotifier.NotifyListeners('refreshFlags', self, a:nerdtree, {}) call self.cacheDisplayString() endfunction -"FUNCTION: Path.rename() {{{1 +" FUNCTION: Path.rename() {{{1 " -"Renames this node on the filesystem +" Renames this node on the filesystem function! s:Path.rename(newPath) if a:newPath ==# '' throw "NERDTree.InvalidArgumentsError: Invalid newPath for renaming = ". a:newPath @@ -632,28 +650,28 @@ function! s:Path.rename(newPath) call g:NERDTreeBookmark.Write() endfunction -"FUNCTION: Path.str() {{{1 +" FUNCTION: Path.str() {{{1 +" Return a string representation of this Path object. " -"Returns a string representation of this Path +" Args: +" This function takes a single dictionary (optional) with keys and values that +" specify how the returned pathname should be formatted. " -"Takes an optional dictionary param to specify how the output should be -"formatted. -" -"The dict may have the following keys: +" The dictionary may have the following keys: " 'format' " 'escape' " 'truncateTo' " -"The 'format' key may have a value of: -" 'Cd' - a string to be used with the :cd command -" 'Edit' - a string to be used with :e :sp :new :tabedit etc -" 'UI' - a string used in the NERD tree UI +" The 'format' key may have a value of: +" 'Cd' - a string to be used with ":cd" and similar commands +" 'Edit' - a string to be used with ":edit" and similar commands +" 'UI' - a string to be displayed in the NERDTree user interface " -"The 'escape' key, if specified will cause the output to be escaped with -"shellescape() +" The 'escape' key, if specified, will cause the output to be escaped with +" Vim's internal "shellescape()" function. " -"The 'truncateTo' key causes the resulting string to be truncated to the value -"'truncateTo' maps to. A '<' char will be prepended. +" The 'truncateTo' key shortens the length of the path to that given by the +" value associated with 'truncateTo'. A '<' is prepended. function! s:Path.str(...) let options = a:0 ? a:1 : {} let toReturn = "" @@ -688,7 +706,7 @@ function! s:Path.str(...) return toReturn endfunction -"FUNCTION: Path._strForUI() {{{1 +" FUNCTION: Path._strForUI() {{{1 function! s:Path._strForUI() let toReturn = '/' . join(self.pathSegments, '/') if self.isDirectory && toReturn != '/' @@ -697,37 +715,37 @@ function! s:Path._strForUI() return toReturn endfunction -"FUNCTION: Path._strForCd() {{{1 -" -" returns a string that can be used with :cd +" FUNCTION: Path._strForCd() {{{1 +" Return a string representation of this Path that is suitable for use as an +" argument to Vim's internal ":cd" command. function! s:Path._strForCd() - return escape(self.str(), self._escChars()) + return fnameescape(self.str()) endfunction -"FUNCTION: Path._strForEdit() {{{1 -" -"Return: the string for this path that is suitable to be used with the :edit -"command +" FUNCTION: Path._strForEdit() {{{1 +" Return a string representation of this Path that is suitable for use as an +" argument to Vim's internal ":edit" command. function! s:Path._strForEdit() - let p = escape(self.str(), self._escChars()) - "make it relative - let p = fnamemodify(p, ':.') + " Make the path relative to the current working directory, if possible. + let l:result = fnamemodify(self.str(), ':.') - "handle the edge case where the file begins with a + (vim interprets - "the +foo in `:e +foo` as an option to :edit) - if p[0] == "+" - let p = '\' . p + " On Windows, the drive letter may be removed by "fnamemodify()". Add it + " back, if necessary. + if nerdtree#runningWindows() && l:result[0] == s:Path.Slash() + let l:result = self.drive . l:result endif - if p ==# '' - let p = '.' + let l:result = fnameescape(l:result) + + if empty(l:result) + let l:result = '.' endif - return p + return l:result endfunction -"FUNCTION: Path._strForGlob() {{{1 +" FUNCTION: Path._strForGlob() {{{1 function! s:Path._strForGlob() let lead = s:Path.Slash() @@ -744,24 +762,22 @@ function! s:Path._strForGlob() return toReturn endfunction -"FUNCTION: Path._str() {{{1 -" -"Gets the string path for this path object that is appropriate for the OS. -"EG, in windows c:\foo\bar -" in *nix /foo/bar +" FUNCTION: Path._str() {{{1 +" Return the absolute pathname associated with this Path object. The pathname +" returned is appropriate for the underlying file system. function! s:Path._str() - let lead = s:Path.Slash() + let l:separator = s:Path.Slash() + let l:leader = l:separator - "if we are running windows then slap a drive letter on the front if nerdtree#runningWindows() - let lead = self.drive . '\' + let l:leader = self.drive . l:separator endif - return lead . join(self.pathSegments, s:Path.Slash()) + return l:leader . join(self.pathSegments, l:separator) endfunction -"FUNCTION: Path.strTrunk() {{{1 -"Gets the path without the last segment on the end. +" FUNCTION: Path.strTrunk() {{{1 +" Gets the path without the last segment on the end. function! s:Path.strTrunk() return self.drive . '/' . join(self.pathSegments[0:-2], '/') endfunction @@ -782,13 +798,13 @@ function! s:Path.tabnr() return 0 endfunction -"FUNCTION: Path.WinToUnixPath(pathstr){{{1 -"Takes in a windows path and returns the unix equiv +" FUNCTION: Path.WinToUnixPath(pathstr){{{1 +" Takes in a windows path and returns the unix equiv " -"A class level method +" A class level method " -"Args: -"pathstr: the windows path to convert +" Args: +" pathstr: the windows path to convert function! s:Path.WinToUnixPath(pathstr) if !nerdtree#runningWindows() return a:pathstr diff --git a/sources_non_forked/nerdtree/lib/nerdtree/tree_dir_node.vim b/sources_non_forked/nerdtree/lib/nerdtree/tree_dir_node.vim index 5ca94d4f..62bcf882 100644 --- a/sources_non_forked/nerdtree/lib/nerdtree/tree_dir_node.vim +++ b/sources_non_forked/nerdtree/lib/nerdtree/tree_dir_node.vim @@ -56,12 +56,12 @@ function! s:TreeDirNode.close() endfunction " FUNCTION: TreeDirNode.closeChildren() {{{1 -" Closes all the child dir nodes of this node +" Recursively close any directory nodes that are descendants of this node. function! s:TreeDirNode.closeChildren() - for i in self.children - if i.path.isDirectory - call i.close() - call i.closeChildren() + for l:child in self.children + if l:child.path.isDirectory + call l:child.close() + call l:child.closeChildren() endif endfor endfunction @@ -220,13 +220,6 @@ function! s:TreeDirNode.getChildIndex(path) return -1 endfunction -" FUNCTION: TreeDirNode.getDirChildren() {{{1 -" Return a list of all child nodes from "self.children" that are of type -" TreeDirNode. -function! s:TreeDirNode.getDirChildren() - return filter(self.children, 'v:val.path.isDirectory == 1') -endfunction - " FUNCTION: TreeDirNode._glob(pattern, all) {{{1 " Return a list of strings naming the descendants of the directory in this " TreeDirNode object that match the specified glob pattern. @@ -250,7 +243,7 @@ function! s:TreeDirNode._glob(pattern, all) let l:pathSpec = fnamemodify(self.path.str({'format': 'Glob'}), ':.') " On Windows, the drive letter may be removed by "fnamemodify()". - if nerdtree#runningWindows() && l:pathSpec[0] == '\' + if nerdtree#runningWindows() && l:pathSpec[0] == g:NERDTreePath.Slash() let l:pathSpec = self.path.drive . l:pathSpec endif endif diff --git a/sources_non_forked/nerdtree/lib/nerdtree/ui.vim b/sources_non_forked/nerdtree/lib/nerdtree/ui.vim index e169dbbf..03f11b84 100644 --- a/sources_non_forked/nerdtree/lib/nerdtree/ui.vim +++ b/sources_non_forked/nerdtree/lib/nerdtree/ui.vim @@ -21,7 +21,7 @@ endfunction "prints out the quick help function! s:UI._dumpHelp() if self.getShowHelp() - let help = "\" NERD tree (" . nerdtree#version() . ") quickhelp~\n" + let help = "\" NERDTree (" . nerdtree#version() . ") quickhelp~\n" let help .= "\" ============================\n" let help .= "\" File node mappings~\n" let help .= "\" ". (g:NERDTreeMouseMode ==# 3 ? "single" : "double") ."-click,\n" diff --git a/sources_non_forked/nerdtree/nerdtree_plugin/fs_menu.vim b/sources_non_forked/nerdtree/nerdtree_plugin/fs_menu.vim index e563a947..bdb638ec 100644 --- a/sources_non_forked/nerdtree/nerdtree_plugin/fs_menu.vim +++ b/sources_non_forked/nerdtree/nerdtree_plugin/fs_menu.vim @@ -212,14 +212,40 @@ endfunction " FUNCTION: NERDTreeListNodeWin32() {{{1 function! NERDTreeListNodeWin32() - let treenode = g:NERDTreeFileNode.GetSelected() - if treenode != {} - let metadata = split(system('DIR /Q ' . shellescape(treenode.path.str()) . ' | FINDSTR "^[012][0-9]/[0-3][0-9]/[12][0-9][0-9][0-9]"'), '\n') - call nerdtree#echo(metadata[0]) - else - call nerdtree#echo("No information avaialable") + let l:node = g:NERDTreeFileNode.GetSelected() + + if !empty(l:node) + + let l:save_shell = &shell + set shell& + + if exists('+shellslash') + let l:save_shellslash = &shellslash + set noshellslash + endif + + let l:command = 'DIR /Q ' + \ . shellescape(l:node.path.str()) + \ . ' | FINDSTR "^[012][0-9]/[0-3][0-9]/[12][0-9][0-9][0-9]"' + + let l:metadata = split(system(l:command), "\n") + + if v:shell_error == 0 + call nerdtree#echo(l:metadata[0]) + else + call nerdtree#echoError('shell command failed') + endif + + let &shell = l:save_shell + + if exists('l:save_shellslash') + let &shellslash = l:save_shellslash + endif + + return endif + call nerdtree#echo('node not recognized') endfunction " FUNCTION: NERDTreeCopyNode() {{{1 diff --git a/sources_non_forked/nerdtree/screenshot.png b/sources_non_forked/nerdtree/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..c410c5dbb648c394dc74b90393939aa0ea252bb2 GIT binary patch literal 87896 zcmZ6xby$;c_&%(3cc%!WQxPPmbVy5%93UtS5)wnCOFE<`N{C3e#H70$2^kyFjeRVOE5A-Q+&9=WE5is8L`c;D~c!xbXJ zxp(h=%Ge4Q_KW*IhU!Z9D#zG%u@`tw&vl;PyH}G$in7DUUK4w2nETwjN74Q7b-&-^ zo5Q_(cg312&tC>uAE4Jf*wi!sChotgx#eral@xcjeZbgeUD2OTWI*L+mR`J0M5EEv zNAp~BMP*t?ggjitq9nq+&@DbkVmp$ccESFachV%2{qF3lB;Ng%6UGmO6|27qBKj;3 zA`|8pT+oEvpKpV7<*8HnPSuS~YT^b36*=+J__*~{UKzjIG)iFxUZR2fchPp=!V9{9 z=v}?r%fmDPvs$WAz~%s7Eo!qY3j3+_Dc>EnW)8r#57Qlr(p!xyO(qiyB=Ptmd@01H zAU`G^lYCp?_Dw!AT5lYh4N8A-xv0vC3nDWIPk-=nXV1+jj#&Q4d_#X?JS+{Xt&Mpg zVOC2=p*|2YF0~`zD&ua`b*K3FF`6KO7O8%t<3~cMA|L7S?1YX&LC&9KoTDpr%eN`m ze=7Q+I{I#|OJzU79H44O5?z222)-jH@9M1KU+8Kl@33&SJHE;;urt(Go z(299$jE7&)^}O5g>A6E`wU}|tL;1+?sAA8Z#aJU}Xdn=(=xoZ|$az{Sj`6Mm+BM?p zuB+RH9_p=km5l^kO(Ea@H13)k?>iC&NL-C=C4!T6U=R-!m zJPCYgCmbV@L6z1`MOf7S4r2Mxk(s?Z-MB6CW5K{<@MCpe_&v_paX{xD#lL4^LyYo+ zt9lq42{tv~@4+!pZ8B8Ad0Ei4oHcu9Y9t)#Q9|kLU2Z%ekggo3e&OoEK>*g$6G3T9 zC(``e{H@Xn>y{R%IQsj`_v4fS%E@bZ+8(ce+3P(gGp7e75FIdutAEvq)BuSskyc}2 ztL#bQf=OPi`}bZxQdti}2cM5ai-^KVe^_bdu02K2Em4cf(s20mw?L(24#*iAmjezZ zzDnWzI2-tdU2l52Qp-!~hv2VyR$k>+vqDShN-y^S@}U>SX0265qkNfC#h#eO>FCvE z0^!K;5-b9>rEa`Q%&VN0F?4;PZ^9dlj4-*_-91skKXfMO%#`1Mw+T_BwA!t53$@em zlw_jNF){@}vAC(vGvb(Y6B2HIpPGfvdr5t%#)h>2Ks_g*GB`}%pVMO$z;vep`d-YN;H&S}4uym77tGH{fgc_IC&PRMn ze-eAuE~%D#HHZi|Z97)$1=jHQv#St?L>ggiEX7L2O<9)eMva(AKeY={kz#S!ZS)T= zc1OAm`FnUVrPU$bq^N+wuvZL?KIS#+`2WKSkPvmk4K-8OxAU0~)DH3zJC@8ytS%PZ zLrHw9c)eTWgXlyXt&=y>vjbk5Dk&!`==K{TyXKQFgX;LqNC-#ARy6iuWxuSrK2YD{ zgZQ;~cf?cEQF)!*OsL8f=;LaD#^{R=ObF?ZKjwmEjcz~$dT$hg$qHpDat?W%T4Q-X zhRnmbViMEnj*F=Sv<7;Q@&BcFnS7*SoBm%OmB4TIJw|3rG9p(#eY%rTExOMnJ&iH| z@-?U}oBb)4AQJ4R@P(3W1&*V07I>dVo`U*5Vj{X2vwE8tiWIRsx!Q1pqrLta%NIK~ zoa+K?l7Lcu=TL^$8v|@~{-csfqZpgLF2sX~ko4{;Bjit3X}u3NS+j{Utt|b6aolbz zZ+$xZI_qqIeZ<|eGmaT_Ow+;VF=X>@WwQQ9wnIh>Rh&%1=3j}-Bbi^edVygu}AQbP1*dr_tdC)G}TE!A+pBMU^eN)Of;6S z1b~snNfUwPuQqiHE5O^$Es#!-W4e3Bz-8Gb&Z0p2G%w%o;xu^;RKdEJSh?u^9McD3 zyBWOFGvthyyfH2 z0f#c`O_ao@qV}lx39A6JBsTRa_5KH*|DqE}!W<=ia7)Yl>Kuih3%h_G+zxs`;JSO$ zdOfR6dYF&RA`Xm*+qF9mg5fpKIx*AsHQfOP8`~Yz|CI82SmB)y%!Sv~gaI({U3g`` zU9$$^`N-YEGnXeugsaIk3W9&_zJ+JYEVB+a!$dvU>~LbeY&aJ1YJK{2uvj!o$ozUD zX_wT`=WLtH5qbw?^4?B5XD@)QmxP`9Q;4W`d+v&hD+cm3X?GDqQ{Dx@MKU1p_vQX$fmy+8Z9G>NDJ-dI~LH zkRebNc^qk5e{USEK8;xze@(IdwDcPF_XhuM+gQVa4|_>zvQ{uvi}d8#)m93kf0_`g z$BCNUC$#H%kZT*0o7f|m$*JQAsu73^z!a4bbJw;&8YGcAh1x+0ExThO=P7B7ZcJXj zdYw1jo^@3hQ6H_iU`Ftyta$%gsQ9)tFwJrN1Vzp=#~GEoiE6*gFkyNt?qcc_6ScOi z@Ch@zD4K8N#QVyfphC8eXQ^a;=Nz9&zjo(6GBVa{AUCk!%7W=Eg(*u*VV%1?RpsF0 zHRTiKve4d-ysa(!gU7S*)w75ud27jghKo4n>csn z%fRK%bt_71dGSmjWZGd(8a+BX z{-t7lYK^y?ciC!ci;^PA1MPZnXC166SmIY6!Fn~FedX>_E%B8JyOL(jF&kkJI*={n z4*jU)>x4Y;i0{s9>BjXYJZZj3G3`P5G-q&Q$7^fajt1Ux_#adD01nCZX}?R(cUnU> zN1qn`oX>9Yw-a1xLopqY`n$#;{A_zUF-|-ThD~zuTKVZ+j+7nE23i`W85yRtLNjht zgT~t>4M(H9PNkiP#-SR2J|&7hh%no$n{ZRO8#(!UraM;F?xn3{Nk1lRm0_b7(92>9 zswk47eV~!i2;u9=2qo>(L7U7} zVkymMN|G%TI+46A{LAq7+$r?~Y~?i7KfCqshPCM{0Pb$jo;`Bg-tMRD zs&1_=wmg_>Z$ey|ylJwyy+f`;gM8`-pg=dC`y0EA?G2x*H;2}~?wZ;LLq1{@;LCy49csIxMZw_UAz=IX`4M54)WZ4=?zjzfas8}`5Q~J_aoStj zKFqIo)ywPZIxA#4@#4Uf#pTZ8U3v2GpB>){e&%hg}_xf#`>48= zR|!+R^3Z`~LBV008&sM4x6tsC8x(!fmuSMmr=d=IqZhq4g(nz0N zcY#*E__Y|>M63DxmxE9ak7I(0P*?4mSfxnUC957$@zwZKq^K?jj)`MSP9t2)RD!>- z=c)Z`t;R~-c!iIMBa_m)me`uvDt@D;rxGbFs&%NV z_;0k`#@mzn)V}?1_fEIQK@=5Tq<4N5?`1ZA zsa7YwZKZ@o8#}^pSD9X8;qTXs@kAd2&rHfM#*ZB@i5?$pACE}GmZk;Go`xQ|FV@(p z=nRFz-YezC{ygLvInGg7uoWQux18G!-O{}Q=7qP2kA8{jus4k6SMOfso|d}tMohTk z$P9n9#6alfMpd;0{P|DA% z@zx~Hzi$|QITGQhd<82jYvpTP@5T;Ez89udyC=wB1;d_BT~6)Nt>v3fI%>b z2WI1%Ff-yHkaCf0^aqvE2o2zPh1;oZMfW7)ci*oPxGmFK2-3;0JB|DKi?*g=L8+Gf z1Vt=|)Q;Zr?P_>qIOH$zMKk3mKpVt`qsNTTwXJ)P8ByNUtbK>tZ?xN(Jk=6V$+48W zX?)*;qB=8ybDRW;z|iB+Eg@oW1MOtv9*?wTv=PZNH(x*imEdKQ8ondFdyygrHTa1Y zZwB@}4Hg=Az=ga>ch5EIS%W$;?q6~}w3^htn@GkvpUcD9K0YWMf{Huj{^RuxXei{J z4xiXZ;I!}JD`fN%9(o#MH>N+KTlS>9qI0ZbCH4L6Jfm-t`nXMB(f40fx-T1m(_yJ^ zPbKCdn(_^9h8otvl7a;>35s*ioa?Hrh_LE!^bX^#Cl|zhbxS+?lyNTAFWZn8{1x`F zb{2#W=gq|}8Kkd`D3p&h;2~ws!I{U{`f*`Xp|ub*fe0p>Cmxo#+4iW{9D`O|UTn4V zkF6zUTu)(g9d7?y@HjNRalz<%D06P2oTKxtYFp^i>9%YY(w!1=;xZ+axC^bqPd!Y@ zgYluiJvM`1gJdc$u11l++e6kWc7IS5I7LK#JSJVd?k0aM3e6V4qv9_7&G}^gO1lG% zCyV1AB>}VRnQb=C6hGi)lJXXtUO=avN9I2b<@?J(3BBxoLu%*@Uely=PV|a`A0@-9 z_uLx;9B79>F_CVkbqFuevEzX_)#d&88u1pXd2c;`qj@`nNf)bA*fQy0c{IgUZh4V}wFmWTJ^;+J(jhol!}rGl_k#Fuo{#r>|hPWL=YfjDO$ISi&y&E`E+?X9hV&W{K0cq;Kg=Oll^8DV09D|tK+HM?5~^U)u@kj zNw`IxD(hu}y0dKqg?q~$}q$;Yuq@A%IA4jB3{ zLQ=&9C-nCB+R^W(<8De|&-atGwdSo3D4UG8N`hX&-WvhnVkt%FO&YIfEYV`T2Jxv0 zGwcq1eD|*@0|6wbKcnlqY@t%RAqtJ8nc}g)K{yAkn_W_&BHqD|*Vf+#YI^!fXd1JK zfA$uoyNXN>dNKa1dKkA7Bp?v58{J4sD%vNyB3E>fGp_YHv0Wl7)P-+LWk`=LP5y68 z1^8=~+xhe4e6H0S4Z-xE-MrRAu%O?$#iJqe1W{HTo-2LjR+;>yX7Hgbny^#>2_g#| z#}EzkYkk&WB)w8pvL8S{I?~HNu~V(cmN2jTz2lo^uT)_skeau%)%Wv7-eQ10UgN;u zo7qTW(P)TFAXyW^m%&^cE(ap!2Ae|X6N^pm`SYue+`TPK`>?FgbYI?*d+fRn&JsA( z4s3bUyaNg^u5N)mKk5P7?tdyS$JQv5PCl;%18EFt=WvN%r+%l&P6VtHlx_3|ezx6@ zlT)t2TlK6me$Q{{cxRX^H1O2c&r9xBy^0fcbfKJ7Y9-%D02NDe9_Sr7RUaG6^mD1M zF$OEj%73)d9yz0p?un5Y7%dSbS0$IXL`cD%nTnsqgmcDlrPQWZ;1I;nGw`-0vGYDp zUaKc{`D;GhlhA{#N4y@LqKj%s*BPK1pST!I#9W12FNJV%*3=|m9K@cH^Au@*FX-Vn z>_5xQb(jQ2nen;CU5+bBNKtXMe)0o&UUfH7J1p1{V}G}l@oVGApO^P@Jn(7nuPUP+ zTcJ!BP)K%msnF1>n((Tb{H`e(f|!IO@1<8?qFgMYcz`DjbnQVj60bNWbON5KG-lN3 zUg@Mv)?d-G5k`6G$l2FpGXsaplWQ%GA=1>C+{x47>f}7iI*b7Qc>hijy?+6 zLR`%A7LoA5zGv?3#Vk7&={oc7X~T9lH`6jo=byvQm^jQnBso*e;SN?$`x4V-ls~3+ zXgagFBG7)o>?fQ4OvK|=4*P;>Bgd*jMvv`vPZ>O1+&&3Oc67zZkEUkIYgwmu^KGeHyPvj6_y(9>NYX!FLB8!u^t`m@r_+8jW&C zB5+xzf_9pn zWF9y(nZjX^dEnMh^8rmE8v4lcM3an5=L_IuU;P%=_LtCHNzYPvEmV0;^A9BWHnoz& zp8(bS5zPZmaP58M&&WvyU|C=}yCY^M_!br+IrvQ>wr0UV@Mvusk+Pakw_!r$QYEIv zLtsC(g>_&&G$1R7qTq?iue+iVvkm3aZhXJq?sw&ID7&BYt^fVmhnuiL$G>*m6~Q?z z@Zsfai#Ewx?OImmEt=-}XUEoW*9Alek0Joc$-KKi@!sggOvvqaKEec{_TC3=S;PUV z-=vdJ^@s4Ymp}Y?{6J;pJ>P17&&!sI8=rb5C+~t^OG;&w$=S&2m^hKJL7kP9F4ht`TuESmam>pw#oMeJAR zgg`dG_#pOP0uKx!0x>BnKiTkN6V@sgjBi62mew9Bn?IcO-`47T3utAV!&Oh*#{iir zmNK3Jr&OAio48h6xOEZ@YrKE#JA*e0>>E&T{Q52$XXafXP?2f0r_&JgoBp2=)ya zYLRNC2v5fS6r_Kjl_0gSB%EMq#Uc~@)sL?ysAa~` z6UO*^4vm_Ahujd*mEgT6Lf>6_nEHjFKw&e{nn)|gai+UL-)9A5C5DjSh{LglEJc^dw>v7l!B z6%n)K|AC9XeA%c?%1}t~(osQSKhw;`*%QqDa!w7&iNwjb_KqDJZPX9_16T`>x0G|4 z3}8&qTPwkV(!TA{kUgZ^z_#iORAvOqUrFQsn+IGvhD~@&{{7Asjja4{Y;)gnt1NQR z_X*>zG*SSHY_PF9b;D!!GsD3u90g!P(f3|JUox({+}U}r;SCRgO9UDIf2+d&lK`Y> zkJAy2{S*DBqvj*?A<61Coe^|U)7ZO>)BSiCY&+N5zZ~3OOx4uUY8OS8KVb*-sI*$K z%(2LyyAPzsW2b&=p)T4rhaHa$d)p~BfnSdA2s|LLr>dxIMPykneRZcYI6j7_kaQ=4 z?-_0iG`c@}O%01hc4-v-`pC=DN9Xp(A;r*)a=EuT6&8D1G9xI}x3;0(V4k|7+)CrT z_ALEj;6lxo)9dycn?qGMV)-D8C)Kr~pII&~ zIFd-m|p| z?RXDd5OvZ^wmTm&@&A<_3ILVA7Yv@0Q+URM!W*6 z8GnSd34`1vWxWcZ=MBYOtmxt0%}3}~E6MF*{F?G-LF?;{=+GmP+N^=BUr*&wz4|9T zY6-&jSoWsrVH$Zv89GQJb!r*pG!=A}1h1N470M5d?}O&wxR!|Xs>*xc#!@8#6xkcQ zXte{D0v2j}q))Joi{r~bPy=GWgrv)@v;@Kb1Al)#$73GvaVt0ouVMbbe#?o>5TLu_B5i z0i=EcRJP|0Zcj-N@2&`wyOUCaFkhzZd)$3$TK4evz{gy-y9zNI|Ccnu#43lJu#OY? zdkfhO6+a@?>lSF3`b+sSB#DPgt!@HZ1E1H^n3QsgtccrcFCse;g>ycr1y|VwSg0Q7F~%3-OVz*g)0XGTK^xT=+E^O<#o>ee#_9=(R1AUXAt@6XEp_ zSpw)Xd-ymo0Eb;*=G$A9)92rtNo5Fv@^DNdv%{bEYjkpCC`1wEp`SA}rhfdtf>4VW zS7O&(NVp!N%(Kc(_}#;I08OGG+|b#Axl-bB@WjSkBW+Xr!MVxLXd##`!B+2IfTX|ku zjo2urus1=`iE?}zQU0V4lq?n4S8+JqSHib=ygtJhnA%SK1Z!KEk7&$-S?vbfTgJR3 zeVvc<`bQ54#rb$0stL8OKqDfJ3GtYfBZ-lf-QB&jxfj1z{59CPjdA=F3Wiy^Wa{zY zP0J@ytU~cE*ouy`?(BKTvgM0>TO)P_`Hs@A#9K-q316kAvOVO+Eii~*j&W`kQaxWP z680Dt;PKaKdj@0I-0XPaboWixeq+NVB4bzDea(n77KZi%t3$&Gf>Y-T(|*3>rMAbd zbPYbGXAE~Ft0lG)I%winG*bu;$jxw^ zvkwabi80tS(M?iiy)WV2VQJ*h0O%3oS)%bI@2RIrdTFN0bYxQ)K_(}RB?4k?tTJ}d zV0XJ3@4r%)nTd&o_!gr=^qR;9b$MuntF1IJmYmVFCVP2!t8WT9qh%z7aEAhSUp@-0 zJs#lG+q(1Uc}B*?bBdj}tb(Fmpe+}t0boTLZyvg$H8z=3;-L(bCUY7bNh^{HlX*y- z2Z%|^)&t6QJx%J*477Pq@P zVj17^u|qFqJD)|R%ZnX~x*fHai+tgw2=I13_`RNlL)l1&H#9NKE{o8z$%~($CA-1Y zqTDfSA+9s-4`)2oPd?3z-OM5}^`ZZzzRT8m_EQaOvxnA(otYo-ID3ZO9q2(d^<@sU zfoht9i-CR;yNX%2u4H7b@_&A+-lzQ@$0|}4duyudFLI{%9{I^ijOW+w~ z#*f_xP<_<@Ya%+i^}S0}h=pJ@ZGytODG{^MWy5N~{j)zL$Ds{2CU#Bhex-}wpKx}o z-oeJ{;@5_TT=&hGygJ0aIk;LARnYpbA8n?K(=}fhqAyG>9@Gf;wzR*0`RuHv9{Be` z@A%eoi><$E%grY^V@nIf7du+c>h3r%^@&(0vr@P$E1>&9cDUn?C8aG&JS+o_&Iz zC5>TPiXcQt=&VAS4;{B|l>f$uCGrH*4x(AjpLrAu2o~nI$aOyzhgs&vZjE|a>|EG7X6JPIir*_f369qMwZHQ@QV_juUFVzoNq z^ZP|OBdA7&6|^CAQFVOq?OrAWP$??rloMJ*|BX(ZDSr_ks7TB#dbxF@LuP;lU$?Fa zN-;+^d$Dt%H@!!X9d)XbDIUeyUYRnt_SXYfzFf&zkl3-;W9p7DK>NtdY&y#qzYl%4 z4jA!BEgFF(Tj{#7|xc|_rq3kqu3f4C>u4Z=Vnm# zZ)r8%#?H7Qn&nHbjzf&ZM&g#ih9;)-Vq!0lG@{oUDQQfuvVx(a*2AbCvP{Iix8=Bq z0m5th<5lRv{g-IVlrw-1Ndg^>Ku{x+i$EKZUd;0jqSW|3yibokb?VfBA7b${j~)HB z)ZJI2V@5_#qBi>vr;%~wqYI(X(|2l&)+ti+4c`U;qQ$zdZs55b8s$oeq}yceW^lEN zpqF0(v-Eh<8X3D?@`NM2CHBiVa&RSh*Z%xo&qT;|Ko;d`|0*@5)1#&8BX#VS&ysQ_ z8Z;ptD?m8T7qyKS5+?oyV8pO7>gfXB;?}|KQrioUb_9-fiIc~a<20b582Rq^wZ=1q zOS1Qc5UcBlaCX)&F6LLLrj^9R8kEl3dS?N=!32n;SA-4U^cr=3}tVFyU zet$V(NpU*`9i#r@jtF`P7@~s_>cQTJ!TCT2EY#fcW|x%WCLNufN(KK4M%!oQlK#zgmiARv*+R(g(zZe03` zjeHB=Vt35ov=|tnOx6fy-ay=Y^|?V&|2st5WMLzWjGR5rru+%OSKel?i0$Y0C-a2g zESc5_2Z7gsSKIMW4VzpOv4{hy|Ds@qB6^(=j1aoC^YDBcdx<5-uAu{B51L1KJmESq z>)Qq`MasGlyyp$SLxdp?F*_$4b&KmfOGXwbBIbwxJt3+Cxz)FtxZcA0O^$KV6}iTV zc_;en*E)<2%;aZ^1&>}W`zV?{2Ct!!;MDV;}ZBE!>#>{iV6%;*)S`_uhF%=(CXhjK!E zbpPGSd6xRP6%4EMwSmX}l%eSJbJ$t8`cj`YNR7TuZzPQJT z(InL)GyLUHhA#}l98PLmjOe4N?v64XO)vlUWNHL3gwx5GYn8ROwb&d$SF&bdsGG@9 z#XvLde~t;da)tjQZnWyyp;zw%1MI4vNb^}6Lq)YpLWCI#ZZg=P(asq!;vSQA(toFR ze|a_xs7S~JHt6|I7v*GKMk5`iz>3_7#A;CkoN?{8T?R4q#KQ#33+DR`y|Mm^nLn4W zN5|)+83C^j^EJ&g{^XM_2&%E&5Xm4jmX2Q&SCUu7Z}xSOi1nvN(nE@F!uUoh~ph# z%OO_=Btz}1V;mNC^--HR-kpqXPjiOdKkFiHQ2~aR5ycZx6ulm9XZCbtmT<#+FFpTI z!8abcU-WWsR@WD+DrNHb(b$m0=@_DJa)8XTZ_vnPa%F8g0TBp$%6{{CG$)rFC1*R; z6q6>RHNXj2GMVn^>TP8_?F@w37=KqZ6o#<5ejsDqJmUAC^RYPh@BWNP0h4`;nfUv;`>Ljex1RA+ckOq&o1Lm@B*ZKY^T8jPPf43?k;9J`Ut0|F^irm5;it{Ru z*M2tnv!#+Y#CDgr>>MiU+FmWI5E)Pdnr8e%%$dL8&2nb{Mo@r^i_ogqWP9fdr?uGz zv21x7RMStD_#GUjq~S;Zf9-@YBtlZH6&}6BZV_~|&Qs9W$z89+)C5kOp>K$eSOA^L zoyeEeBSn57*Tsb^`!d3EGOS3-_p`>Em$IsCG*J;R$F=0+K_O)PefFtVjAFhm&Bolr z-pXxB#PnTXl7!RHIRP+Xu?efgT(XM*%v)NJXE}_74{v7t;wn({w#*drL96%L`g$_9+9Jz&1DQT3(3#BE^YP+Mt`_?gIJ135Y)kl$8&p z<`517WxdMNTds2yI>>*w3>IJj+5tk&AFA&E)+Z`1x;BfZgQ-tjoKzcwC!9%9C&v)c z;UZ+@F`l*nM9{wm*+TeIk0X?;iAR8^HvQHBMR9TKl?srkHMY-7YO<2|rUeTYHrtqM zIV_WUSL@?O6V0L3qC?RqK@|+e9@+mDF|v$6)WAXJs-dr{IpWM7ud(#6a+aVt5^D4M znrl$2=4&dKG262P~B13l5oF&(%UPD6Ox7==8^701B%h`E#;CR;H>REUk^f)X< z2m-K=iwap>UcQn~8gx6LlXj5Y(MJ`1xf{v&*~+R(`&hvK$h?aVT&?mv17LU=B6^saru8zEk`$RUNyvts(p&W`p_IT)mVX~!pzSWxL3{5d&ZzGSEXZD8B z0>x{INPC%DI<7-{;-u}-DY0leqSK+d{I_VP#e-G*&Ml4l{r{JC0*32zu}sMKS8LB! z_1p?txE(DKFneTLyB3Fzkj|zqQAPxPDA8Lg>V|nb}8amTRwAdmaW zMhr$eKV)4%0G{Y<>4BY^3QlPAi`*~u$V0)KQ?x!>jcE=|^qLH7YFNJ3B75(17bwh? z+>95zxeWx_do|Fpd*gr{>7V2=i76sLdxbHT(o-d&di+;L>}q4h?Aw@P%mbY!GZfZX2ozOM4%dUa{XZ0= z8+)IPgpATWyT=c!1@V;CtYx?H$S&VopjeK_yz}-{6HqI zWS7tGa?#xW>0?Bk(!P9XK*@t`?3dl{{-HMQx<_cX#G)!}aS{du>$6VkaB=orWq}bO zGxK_*AL-tQ#%tZ|QR(&DRUJHt7z4s)e7z>MfoD4>JNONxbn@nX_o=b&;14Y)^Z|sB zppf4PHdgmrX=`F{Df(#sGB))eTV}M+-bx*k$L?1YsR+te!B!N2ypcnz<6si)bxCx!Aa>k~J=I@$q1^ zl*4s25I$Bb{is0vBZF;iziQ%{8!Aqh_c)3~9fZNww`J6ndUP;xo(PEcr5smL97XT= z6MqurHVv7#jFt==jZwv>^5$9=v5SLnzAxK-O-Cp=SKDjxa2>X%o+1f2Z{ne!q5Cs? z8TD=?iXOrcuy%@%<19JBIt*}^Pc=pGzfiMRiCgQ6Qw;2^O+U#^OSV#p{t2B~D`MIB zI<@@?Y`+ts&+UEiCz)2}Lb)@(moi-av*^{~Td7W5aBcB=jtPD-Jd0fQ`M|UFB)$K) zl>d)@mgrytWo_%^1wVSY$ZWMk#5(4^FS^~xStnUr;M@CWDRVY}72 z6LA8+(`HqYz00V?ox~})`T*7BdjIxEO>@f4I8H8Q!u@|@%Gg`=lK3$97dx*hYO{ZP zefmr@cRZHaqu%1`c;(HgwTX-Om@1OVykk}NixjwPE@786ci*(#?Nj!1)L)Bb?RnTw zoh2HEImx@PW&--3{BAx7AIM+i?z5zc4l7bGdI`ou>7>g3?BZsKzk~It1UW^eIqTIR ziG@ms1Ld2+mnoSw+_k~}rvs&xZN!`{V~E|0iInHg@hk61AQp%dFm%i&G zseQL{UG?s1^1tqmia z`5~34bTYv(F8ZEiQc}ejb#(Qc1$^_~?%a+UCZ9b%tm%WpmG~izPT@ba5OugO-h&6d zB3hd}Z(G>@#ImJtB_b0@{(w$XDlx*I&q$^!k)Os?20zop zu^K)n$we4+ZG1|#WBh!tR^>Z}0VcknBE$eB)5v~jTehkAlZz#g#|%XT^g;$>G~=W-5olildIl?qbLUP;5X**vrMkihB6^!d0_x0bA zZ>gt)d6b@gJ^DHIsN8X|-lj%X=!@ILxp8YPZ=>5WO|_!Zt>2h1B!~fne8Df`5kW@u zpSt;AOODc0{B+gjRk8F)o<0=QK4}Y_52$Er5<#bWs@>YH&EOLRj)^;PNi6H5<%`<%0P}|g_azqMigf@{mLI_Jxp)$u27MLU z9x}%m17XOAT)R4vBl1>;7SoGDQW9%n$mQd`JywfLTheMo>q8(xA6bu0Bp@fPJ*B z%ut^u1jJzd&eK=HvI~&#VEXxUUiu9L^C4eDnK$;S0Vgk`Pmj%?RuCND_~y71DWHaLK9e?AS)shFH?=))-W_j!S#v88&S5jjXyuk zAI0>O1`0bG30o9$g0sZ?ji)^%N03s$S!^-o2C=l4X;H_dX+4 zH~ESqnvIj;SD0c(D(=@wHfJ!68hVKZ7Q<_un)weG&qb(Z7Ubj02An6<&~N$ih>s@o zI2pM7;)o;FH$pnoPMM>iLS4mnu)V{Y<8yEQ?%6qUI;A78_^DDZp1m|9;N4QY5#mf)mu+HI?G$K(TAg5F{P2UG zvt6TiWPXCpQ#m1tOeTg8+@n@(pp;-hc=c>+4TE8K<4JI?5FG> z#q;n;au;@XsO)QtpT|L2ug?Ik7c~)N*e2DP$ulk6qe7Wizn94A;yJmx@&6N2M?}!+ zxgFLYU|V@7na7J8#%^tkf9&rDxgP6vU)F3rGed<_v zdi6l|tp!vP4=`bLD-*ZRQ-Nk21478Wn-&8CbJT$NWF=DJ-9c$}2AnU74w#{$yv&k? zLwDR++eA2z)5ic?7)|O;BBQpNM_bwy7Ewv5>Y|C5W&dlt>=YwgK8@z~Gr+JIH@xbm zkr+D1{~u`&44EXClnq+^r|oezjbtE^Tx~~S0pKi_`5M+zqTO5JH~tjkc#TJ8lt=qT zkyj5pFgFm89(Mwnu4E%$$uzWBpEe{P)*bIpWU8JVFLyu7zXY__*&uI(*ykOx&cg@G zIB#0AF8$Ocrl+3BT)_o(%=s zizSqi+qE*N`jkU7FP-{6%%Ip2~4woR-b5nHaz8 z_MH2QP43+1a_q79VF&#WbdyQ1Kz1$#x%{rvj8a=mzS>XN4CAVe@iwt%FaI6w=oMtF zv~E4|f6zxDLch;gWb3Tyd97idI$QnZ8~kQAwY~MF@ok(&!K9Hp`9S~8ZQk!MtwNhG zZgBo#g8++?#7QeecYKGHQYA7!dm5VG*dLC9pJtZzy?mUUm1Z@yAwkD6{x)ClH=%s% zdM>jL);D#i+00!XjHArLEBN$$YeBB$5DLPda z%`Q|8?}T4T(4(e+R)PMi9v8H}yTQ)Cz3?Vv`7EKVdM%io1cZ+J8bBr!y)2QnO?CR5 zjLnnm@@YI2r)4pSVc=b#{j=cPagC*JPUzvcGY2r^#8IM>LL(G+7yqBg{5Mt7h=X2w zd-}GSxL89bT*~*w^}>5@espA_|uqpRCoc!|?E^8)Jlo;+jyI;NAx z0AzQ42!ui3fsB_@(~@5a2tXbvx_kACy}MT@6c26uIR|grA!K=xofqV|Pck5B@)}HynXmx@+)fqp; zP@AmmFCe4Gxvk9bG9~Y3#q3i?oXrnB6ZjC1#lHRS%|l;~=I7W0GZuUzjVyA^-Z%&c zk5n;8g?POvK|SP4_~v)AxWoVnu+ziXme%zkE=>#eSEi{hcDbRK0mfhz8UGSwuO06Y zG?+lD>4|6fRXs?qgq{_2KiKtzb)X>Pe@k|ze0VemrP&8?|Di^%j;eRaNMsjo2F7H4 zZ?jKpgTLD2@2qLmOJ%HnVe211zpyeh&hD?&(%zMvW}Ou2`WC{BvgEFD@`w7QQh)z0 zy%4U19M9rPBKI6m3_wu&*LLB+Wl3wF0m`HI^ zNuFJ(b71izyoJ|opi<8Ub+p#{#OLTRgVG}w9Us)>-pVit3_gYp?+u-^0&mr=@;?={ zgkldZ&AdEOry|@=Ya(Qa^G#L<816y9^%VID5*2eyN0Q&zetwW($kh1evB&uF_4KDd zUlG}Y6G(MX)AyPHnlg)M-d^V0E)&GamhI({fI>mLKB_<=B;fpH*GbQVQ11A_dK4%w z>8VCDwwq7mbL^D&dm?VHt&&F-m`-lEu(K>4Q zhCtQiMP#;@Fkq!GT(AgyHX62 z8a}?f#dbw+U(Ld;-ho7~?}}~3^%skkBfgB|3(#1+TAhB#Vn4IkiyZ+)0Oi}!`&Zt8 zlYbM6CJC-Q$faE3JpAhXvbS52z9W?QFy5x^<>qol-W;gZl5f(l6RI`OW?1#ml9GnD zYJBn$s@8cW>AR1f(RC7!U;{MFb@0rUXPlLXd8e7Lbw{l?G`E zsS%_@x?`l9LApn}a~NWVnf-3Of9IU%`Ml@Ze-58v_FikRYhBkju0Ct( z5G{2B6GbW8ZJZ?!_-#$DQ7(b*fFs6>zkIqp7kWC$e}>S|pN9sS0!5;2=))SshFMfofLnhmm(Z($H2sMTvd`T81w zb~dZ08t|kirdGK+^t%-Pn(av(`^%SbKC&2F9u{l+TrtSRQN3I=GMj|7lH1i5d<0%c zf|IynwR@|($K_vBDxM9hvPeq_oH)!@KG2>LDV|JfzxWlUE!u_3!6VKOFG8m-F%_*7f#wqDA@NK!Zc(gZ6m`T((fllu&UAYiu+zUULL(5um zIIZUhlr;U(ow?VwRQz>m;)qoMTea|yrPE5ALD~_r$v1VRCRWVxr-_4V|19VbogiTg zc(2@mg&eIers2CX1WlS)T`&a3yB14UBt=Hc?lM={en#_etGH0k?DpN0&K#L6k-D)G zI{`gqh0ncU#v8n&C_&bD%DX+Sc<<&q7nuEUy3$6}4ri|HE|`X)2+8#1i6DB(Zn_f^ zl3Jsg$<_KXeactw+)p51oxt#g&{KZI;7;pyM6qn_LoG|ZLHgsEP?9&$5QoJof^Q~e zDPBeBpR+tz04UrVMZBS$+IkI0Y}Jc^a|UDB3L3!l6>pG|()bCxfV9mu>k>B2r#0?d zTJ%%Nsc30N*U-5He&aVUOrEm$6*&x!u1AKBtxKtl!6<_XMqX_B2A&G*E@7v43);7ON67 zq;Ax-OmnDDL=DYY!BxH-c|Jd^gfkxmL{t6RLU}AagHH#us7G3#V84sryL68N>Qc{D zr~wp3RXMB@8!z;8KwOuj->RztndH_rc8Tf=gfmH1{cB^@rfY{^Al2(ymEnaLIc9v@ zxnl9S<-l3gk=l;zM$$tDjq6JlA$;Y_UAE5b34vw0Om9YMiEo^Lf_&>RbNHhu(Z=;Q ze_sAiMV-6evAOFnK~@qU`Giu`I-Q$F={Exj5A7-21=q{olE^&V2oFFvk%B5y6AH8Vps6QeCbD90ic0Ru>p%pd{*dE|LRN4v^!3d+6i4&U3xs2MVRph zC$Uu1o4^jf)R+Yv;!R!&xb9_dT*j2#`R+3czUww&Et@7j%%^TA{(9=L{cknTsA8JL z|K6Ie&MH1khBH2``Q8FU(1syGVDmQ_qxP)G}yoxN2v$0%JHcs5)WPL(G29{*Vm^arUoiIJF5d`<5Cy#heC}ASz<@vz$5rN;F$d<%+0VDmBTs3Vd zjBHY}IBGdHq9*nY?Jl7zGJ_X*h=Dg>QXp9>{rX-(Ju+7xZa$riiW=zh`^gn{Rw?5Y zyHsN{f~1}z2k*%{!gv#w2`l5vtG?@Y*Go`Tru_lE*Fe{Iu`iRMQOYUP6>BCVFm^B& zUp3l5sgiBntI^fHy6+(+dL!vt70Jyy``ADLeA zA@&(DTb2-h6f8*~n}`+iCzrX#s(B1Hm!ty!Sd2(}VfVk0dZ^bq#Ap>Rp8wgP_Y=1i^6WpZf==uO@gW#w@U)v_iGcMRoaX=4s$fX(|!U{2b;oBd3|Bx z`k{-sc=h8RkbJpU5zihFo%5X_?BC6@b+M1IHm#%Px+oy)I5B`l4K*fZOndPYpgc)$ zU=c1YNkc~Bp&ox$TPY@SxV;gCD?zF}C_X*)@H0RsFD$i6w6bM16Vj3lB)3(;U-A8+ zh#!G97e9X+aRpDxIxnoEky%RX`>{$ZhlSU=C%AqfJUfRlx1NKR0Anb2|IAuw^x{=! zyLu6}UrKL6*aDs?SmVPjUe_!YS3Nqsmmk<|oQ6eBb#x@BUF1ve12-Y7mP1r|d&_HH zzmi5XVdK(%12c|Awr1`dd`>aRqoW9H8tP&rSGZVQR#?vD#1TZ52ge+2`1;>vL)Q%0 z1=atZrbpm3UG5EjceL-RyKr{Y!r+p^aBmxYS3#Pp_q&@#ByH zzug3L&J(P5_MBRJ1Zz3{7EDn9aVP+3JdBZmK=9`X!utLx;=BZ~RoCRtJ5*)~;BCE6A1oiTLbvRyilXU?*4&_a~3;kfLml#+)qDwHVrxXh* zeRqJQzZoNP4(9cHX^hYhyY;*R^Ji9H5GM`6&S$~7HCAU^xwa~`&L~E=&jVVYEj`(P zHhV}^$dz`*&D@u9X?PuS4go#4{6U{SWfTtmAXFuYavvc*l!6Hzuflgo_rxoZ(AT#r z#A_vs)7myuCy~`YC;JQIP%)asCITJ@+{K+Z5f0ZExD4Q8SvSkoc9%_#>&|OjdT73FlWu&P7-H{ESIOgFKr{J(Z9b=54AGL zFN0P|10dI`==pVioz@~k%e#e=QB;G~v72>BQfQPmfl}b^n-STy`v$oVuABb&bp7!c z{CEd`WKyZ`Ki-9X=17)z$FKyY-_WW($VVg{li?`>g00sWWgCUd-!l70SAMuir-x(o zT;4(+P55(9A>awe7?goORpiXN8WST)C4d9fS2bPiy}1X7hMzr1Bi-N=$F)Nc@vbCv zF%FuVnyx?mH!Y!b$<4C(_=jy-TLFl& z#1b!_g|maJ^93!_<6YAp=&BBMNfpQZ*<@F>{zc=N?DiLV$mC~Y5Hsx6Iqf*ZY0YiH z+bx1eF=kLdStZC+H6cyELn2gY_d%-sY0bw)_JglIH#gVe!^%K2IfX3LqgA&6R=XiL z#_O`@SjCY$*VK>)+e!&9Ke{`V+`&bp0WAWOy}xnF94hbJcVN0Npqj$mR(}FF{Lq&h z=r<|J=Sa;@-Z9a?xfcoT`Y8_nX2lWu%sQz}X>HT>Mt;^$0_Lhm6kV%tD!4o25Te(= zI$0lq1*Q_!ril=kmElRjXrn}g508U{9#k4ps$~MG_4BbDbAU0dSwj~n;uH6n&7a;;slS^{VtKH5oLzC* z{LiCrm-X<&Z^UF<3AvjOuQ0xYFY>zhXvnr(5dg{;U=~&forcP}fgovXKqCZdd2yIu zpuNrTwcUU*;r&5KyU&L`kmFUe&@YZ^r+beX$47`AkPvE&otQ(bYa1IfI>q+vhZ7$A znt_7z&rvqW_7|IyRdpgu17wi8Ql0cQ+hE^_u5-~u@sm!m3hljanHsomWCo)(CG_++ zI#H04f6@@~r3tKAs`6;OrCsbQ6T&8_TV080oZS4g z>QzdhgZd921|>F`PD&cJM{6ho*M1}7M=boZ*=3OOHJ=Sb3ykP+n2stB&Zv;pP^RWx zkxQWf*Avb#k^7}dI+@z^X))I3ov0rQ@pBOdudK1H1;-5V;q0=dG^5*&V|BD6VNtUu zQ9(X*9PfD!H5!C}PCKF184?-p)5B9Te<;~WIi&9@8QLoao)`D79*+&IDWqdV?`NLs zwFu*)jN%x}RMcCKTuNmYpWq}Q<=Ak!T~bkdw%*;*76 z7O(PM8#gI+m6n_tCW)2&MzHd#4`KU}Lm(mLd9al9)x3&amiPh99l8F7xMp+C%jxev zetKD2QK?2nbM~d(yQcW3%>!Xm2kmZ=2|V9SHgm8n>oa2Mf;;>2w+4^hBvNueDuux1 zs)%~cq{`@1a=9qqcXwExkv=73t10;@UD7wg`Oqh!Uuc&{OYhGElTcYM?J3PfH)=KF zjY}v%Sk4#E?j7?I@gy@ZB;=V*Q8@{la0Ws6>er}?Jx{ev4qKD5J?BI)Bs?#sZZP;ss*{@aDZ+WveL>eDaI1zr`nV8NV8`gbKv41>RWqrWw z^v5L>d$N3yM-W7cukT&2X!_DC0aanfOEly;5$J3^J_VmDEUI!g7A2P#^WC;%Jc{^A zqubLG&NUzXtzi@Fcd*;PnNkpqnD2=7&8}44!uRb>kI=t^*~27v5#FwE&Ucy%q)T3Y zu&?t~h?T715L&2s3iSF6TX5kU1?5`&pd!uOK*1iWbEZ-RDc*JG&^gSi*_wVs*{1*& z?1o8OlWxH6HN(8gXeUAkOt|oa4*K5bbx6(h1TsFUap2M37sFRW1;4&V&@b%Owe!ZKksZ`ut5*Rw%rlPdDYjzBdzkP7wJ!+Zys!R79H(GzlG@Mr~q-9prt} zH<}b|#o*1~JyM6pAv5xK&DgDHt(NES$JEwM`mS)Prl6yw=_(-y+DuW)96?N>;r-xa zMVIb-#SdH9W#hu`OZ!dKEBesQ3KkxIqKe8mLIQ=$leUIkn2-lQx7T9jZWM#*T?xB_w*ubTg!XN)# zW5^#*65=Rj?^+U1Bfi{sJKEdd=;ee*<(M4kNIhQ*bn^G@FbMv6j+ZdSrPuz7%Qaco z+Pw)mVQ6HIrAuVO#=CReDvj23n{&r_Ig>F*P3>-hy?xgB%ocG#YBL#oz)>KWVugCM zt)bS^^y3+c^qVI=VW@|dFy%)!@f!APnhMN#G*gPyLh+Y87#sr413HcUDn@VJ$BG^w z3ZDRHM}50MIM~RsQg#fFPXW75r6B3g!`QGh9`(l`lpIhudf}*d^COk!>PF63&I$kU zlnE0;oWu1dNJP zDiSS~%~-D`*g7x| zX_bJ2nWzjHMB4(9q!AY5)zStitbOK~IAUX!$4*;*%V8KO2=fejpQT`sz6R#dh=2)2pYvNeW&A zd%o^F%*>PC*sE~mv9;bQDqok`7^;cMTCjZfqqjMxv-N5 zyKEOe@5zIq&oupIy}>+|_1&jJ#p%qmNA=u6+HD_qn4D~O@@f>y+eB!p3aShxT;D#> zW=?Scs9}ZQs`)bJRL`nZiEUzKq<|x#J8Aj~XPjbSwFz#%E&sl?KfqF5N$V&RmZ3g& zi>)Dik6!V{-y%IezJrmUmkBL6!#N@FQs=<%XdqNKUESN8)9bVKYSXbRJ-_h-S;Q#-o?)zO$F|u1H&<06mZp;1Vq->cjrLwWsn&;7qdn&8O~=v(wY4VEppo#^IuuIQ`E*XnNlcFaB{ z1L91Iy;Yu8ziWa)UlOxPJln%S8yEbUy^cNQ90kSf4QSt{@H#`OCFUKoxG4korxL#1 zw$Yw$d~Lf4wnNf$a`0Ci5rFyq)2_b4CpxH-PgvOup*lNU>glM9)4I_llV$4Q?cga9 zSxB8Mok2bt*Oe^vlYE`V9^au=+qvjwUIOtpa`Pq=YbU?uP)n%GM-LPqQi-s&DM3-d zg5%1&IHtfqOE;Hy?YzT46l{8E9pk#1Vv>KY`CtU&6au;e0W+{pdrjl)T#Q|wdR-_ z8!O>pH(^337Cvn+(|5tIfG=w4M0(Twwww7*ft^7qmNRC*Y=U#%uDjj}$_ce%wz$4wC%qeaBkYPVHNP)@R<|>`D@%5_2s4%}&ce zFGP}~gz*aofEU`F%&N(KpoShb(MhWwD1c`DUV$#)D|~FJOUS)_r?>7mz2W}p;OZ;8 zW;tf$J%tH9M|uLhkd|uHZ%@%@vD>=a4UA|1x$S?m&;JcYEhX$sc`&#gIbBzm?puZJ zv4gsl*sV3=F+e^4ExjBun_QPW3XpOZ;M`|vZH9L@6)HX2(a9uC`EaA!z~COxtnhJ2 zz9HTZO#38f#t}{fl8V&;u4Y6aoCNRfcmC_gQl^7|^xeWS#rahbw{0Va!$joh|5oUi z{#NM!Z`h(i`~tR^shjYecCzu3)2Z;Ba3To`Xjn%kqDe|F6*GI$VQ)j7T@^#3U~4tm zzQxN*L6v}(1fEpjdfG0$A6ysX$0z%cxxR&TzD{fPWlPst<`nlX%_0u|R?KCnv23;Y)SP7=dUf zQkwmVkL)F|PX(?H_&`sW1+=LgMu4!}6Opayn+8@69v6^F<;VqO;vf7!kV(fSu+>hQ zZVP#Eh;_WOPoh2N&QDp(k^+K*Vpy&J7>k!(a1ha zVL<_NQrT^L=_GqDgQrwmBL{}%9&XJM{)s;+1;k84Po5=LKYAv;iiuRVPmf)0IpjhB zTD{^36Yp23o*vEjY5|+*tMkt!j|8e6sP0tk?H3{1CGU>#v3{FjJ91Uj@1Z%fv;mR- z?kPtc{W{H)7aL9ld z^6-{523i?_JGnX~le_yr<_ELGxba#pzVm(czY?j1)%RV5z4gAn*y*XmG1|?GG&VSI zrHTqMUdex6$3dNx?Z((AR9p2XdLawTGV*^7fcE1(zqQ2g#Z%Z8NP6CUkK)ABQWbwegKgVbW>#3Y- zVju}57pdCn!+RlD-HYA3QHz6B&^`55FOQhJ@0i1=P!Ae_5A$;c>UMa%?G#3tc#8e# zH4rX(YpnPejZlw2Nbe+S4;4=mI#w;pcHS=f?zFhXs*g3x3v>uIbnWC+i-4?S8cLWq z{XJEBDnWtq#?hXE#5Xxd#~)wODaJFrU{)sI))-%t7TZ*{TB#cG0=Tko@<95+P4Phnip z;W|y#_$z!cdrj8o2+k#D@*k6#7_JYa-sh5rjm;15%Er)6dQu`k;u=nl+ z;%Eg({hcd5cK^my&F0;V{;7BH{80?`)K5VJz+N^x1=Shi}S>tU8)-kSdQnFxyNxoj+-^ zI_A-ynj5DlVUzfEOA>e=_W;ZSH_Ov18w`f-iIJo=Q7>cK65L_q%m6+@k{f$M6Oft21VtXw+%#I zboTQ6?eRawRp`A_zhL1yLLDr+u)p}w8WdVY7#|@Kq@k`7lOCRz8~Z{_0`J05)iZgc zP_{+@RDVit>$gl!e3FW7Lc0oFpRWrD(ZJw^UTnf0uN>}s2?L!S&1Ww%Nun-OmrLe@b8IrMCR&L}I*2Etfk}Ns@ zSz*$@GwDH~`0U`D2mAgU805zant%lQ*zhrY?(oc6f-n_c`g?F?x=?WbF=H1S4PFc9 zuV){UPYRo7rpb zPld6buzGV2S6X2c(V;fQ4lT|4iN`Rno$F^1p~|jz=gI1YjNCo}VVwaD;ou(eg>Zpb zPNp<1;i|8SzS9ReGCg26@Y5bs(6!WtpGQc>-ScVmYd1BjhnFY5JTsaGFlqE)lI=Te z$GT*^ z)Ka2OK(^a`T?1GI&mUROs%rd1@Hv(WJ2v5e-}Iq6TkgZWn~>PL?S5hs(Pl~0D&CcQ z0s^mt2)vm|K|eFfO(6%|f5VI5qxBhrN-$n2k&Ww>xL2>l7Dg^P2H${1-W+ zc%;KrpYECDoOQp?aAn$w0`Zg-Sne{UKr>wys~&})+|~JY3==q@@ZJ1D&VHOPx|p0@ zysK4G%wis!gmhf@H&Fz1bY|B%gVizxe2|mJ0!e6@te;>)7Ceg*sMa^h*_$tzMugah z2$7wb^khd624CVS@fFgUJazq6Jm%)0j&URh*Bk!QnI*HpXa6Ua!H(c-NJ{l!Gcj8O zku+c*0}p0s{^8>7i}|$#^cN zsij^R4rg*cgQ+poHS;BaeaYKc1IPrL*5M+O&N7xgO-ej6)x9}j-5yC^@sBCNu~Iy= zy1w(o=W>5bTGMgg{LEjxHYbA6aRPgLcF(1D-~?7&mIw*7`6|C=87hW~SK9;TJ;?w0 z&Oanc;@LD&hVOHrfqN&?Em>_ejhr}?pAYX~s~Mdx6ZSu)fkS!iH`F_IoYUj{+i7S4 zvllKAhTjwb?ovIt?R)AN6>XN=g+=*SlDrT>YW%7eJP=wi}b8sA=-HP z%y~CU982U_^tC@?h&I#9If$qd7GtG~5C3r0Dhx}tq@a6EFty>H2)EhqE^N4C3z0h$ zaNVM|-E)dw^13&fi24@0V7WXV$&!mHJCOB()*PYy1m|q$>ItMpon9)uVsLXUdfD!w z-(4rL>3r535Jm2{xv(Ff-@dZvtdk(|#gO$e9?ta5#Fsij*nV7^K|Hzo)v59V)^Zne z!w8_}Gp?NVn5+olTPVp?nk+)LO>4b2pYm3S> z*1-(aEHP-{+f=AX>Z)BSg*2qwyN+*p{tOi5DYeRH)Pz(T?z@~Oz)Mp;a^qdUETo|# zI^sktNzW%+1>3z@RP7iO#y?$!Lx}IKVJl!;i$4fnHCzFMUDFfBs@H}=?F0R3G34QD zwxWfyKA6$FPmcleZQAsR=hKhhdJ|1d;xo4WCp0&s?3o^kKrDw8+t#tI<(=*Fe)B9~aB3 zntNu`TM+$b-lG0h?3D{~7roRb*i6GMTNY?Fq@0?S8|)6jT925Q-zSO9t)fvYHZC*T z3$8QqVZ_rM^xg2uxX`1R{y`((y!{K(x?ciGtp7_4W`TE_)Jr?=>@F>J2fJs3rwq&) zrr0>qJT|PHfPxhL6|xA=rN9!zu%92p^Vj$OurBycXt9VaMl~FSETul(g4la7t!ZR7 z5i;ERk*7D>%Cae*T^`{Dzbpor{gI z?eQU4f6R6=X&IAoyrJXh6rCvHuRXX0ru?)s4&C;37WcrNNY)N3`@YnsgUGSAh7LVt zIPB3RGOu~mGu0E}XTI7Gb^_jdx_#{VF5q$s(sn<_=ZWTLChG{K-_iNX4@Y_ibkq6> z!PP2hsnVIl1lM7j?lKgty9(s^{9sZ`UdrZYy2txa|f3+MXAC;$Wslz7p;z*XZi zP67qes1_9-HqqU*GuYi#zT$9%j5u2?b63n`=bvDxj75+obq_XIP2G93o3@7_Go zh!&R-Y57NAZy-A&B}`r{bedyQ!p2-enFjg8QOiqz?Lu#~+t>VI!Lh1aF;;2%P{Qq- z`Zr%aBj&==T!H1tE*pPQhv^sF%m+CpYZWuTZn!#^_9fochhbb^bWyoU2#oXJLQT~l z75JmKQ;p=#y-jK0_JeTqaXu9TrZXXRMm&21`~^GF;ArHlf<=MYd&ULKuS7tfC&=>r z7o8*c8ZT#ZD(!OO+%uci7Se63fOmQvdFFL`r#r(YD#C%>~bsqFL0dOIj`Z=Mlk?T`v{J$}rDhNOrbt zaJRW9>!H4px|ivYbjDnrmv-#nfnTJ8V35aN$g|t%GRa@s^%;c?8)(AI@(-nwMXoKn zTky|kQUCIMrFM^+#fwYKj#haqPp*NeNHppr4ZTroo~D=r>c5?*+vKHT`dflPR+@w41>Keb{)->^;4`PYfZehMI2s9 zzish-qTwY;?(xvOAzF9d+c~_$U*ebHckKz@| zy1|tyvW3N9W9-Uv1W(4McZfY&l6si_0_-R_a(W%@9XFe`NFHfV6mxl9#(z7=g4Htk zFUjZRc@eaO(yFmFjh~33bo)KW8RD=#ORpq7eGZREBS(U_XEI!amn9CA$ z!Tm%K$U_S9!@(WR=`Z7hQoGP9QIh^Aj|>EvvaB>h207`oay8U~s?_VwndTysKXDNc z$+Y=`0t!6*rg!igay@r^35Ec4Kn8ClDpOX58YNnK+tBR42`Bf)ZyywR_R36)MmE5~ zhdCAi*&s$zM>y_5 zgv4&K7zJI?9)Iw=^6r=mH}3t?r{z+~2aZo$4eip5)EMy%RN{@n8bcheLb9Xx=cjg* z0QWBzb|v+Kr(nyM$okIg(iL1l6jwy&1S3RjSG1?%-j2u#PSBDlOex6vghclwZX#}9Fh{?m!sGg}2+ThY;uFYyu|&Lh6* zn#9C!gaV&mKYm+)Q7?0CMuF|$iydFbr`UVmaX&h@I;kf`x8gi(KJ?LCccXFLVxB_g zJo%X{?%N`4uK~2@W)6f~6mWGOGc3Dv^yX%~D~#|E_fG8*WGL{_X96y<@!-%USI?8dogt5o(PQ>;2k>)n-!1H1qcORqVaH zP+@jqbz#qBL01_lyUvDz2TRV3^CuDKi_YTTN>*e38I$L{HJUxG$r$(G-NE!TZTn)w z8%0r_m%Y1(!~W@sD$P#-}!r|Hwq5xY`})yPj)w2 zINKRnk!%irc3DTWmzkneQ=p0qxJv0)UF?-pi4S}zrmRteeual+1P5t$Hs4Pmu>1-u z8r#iBd!hr*nN%KOfxmx9`E^?fht-E9^9fSg=7*u}Pz-kn664-t+4n z5%E5DR@exWfU|)foDD7_r{>>jcZJu z!PT~x0pT8gUS*Vew2rf|r0|1dNkI@ig3hZL0}JIYi3;P?PN5O*RyhatB+9FSBwQ z^V5^@(Cj2V|Ln=mlBoT}Ui!D*XTuk<{`Rz@+uE_FtvN{`UUxs<5dZp~Sz~0H(LFH^ zORRNN%WfY_g%peOXSsM&-)TSSC?bOb=809&lVv3AA618+AC#a*7&Ic+-^dx^z4t_p zIDQxWxvCl_eOAf#eiUJS0waTi4f`V)Xpa0tJ|PdcZIpGg&%zPB6{-u9=~7KQ&3Pkr zzAIrLZ$ln(lx996gc@>^c*&8jB(+11gyA*dYqB0yGJ zj}lThgx3KW`L^ml`MBU>?>pxnW<(dyB`&klZ-r$Q6vL(jlYAd^r7}gK(k81AkWJKn zuejmVk3%f3fY8Qy|~(pNk^f7-7-xK z$N10-r;){foJRlo+Rl*^D%fwN*>_Y4q>g?s>nI&cAZ+bO44O;Zz)T=T7ROJwlSiKMi3U z#-ynGp-H5_6z#^Ts=K`!W+RGusm#atK29jo=TNzOKYs)oLI1sQ$OydUA2;v+5D2+e zO%Kf|ClKM$+;5|ltCWE-Z1CIP4@+Q@;B=(XepwKrHjo-6WQpJ4oYEhH z&IPJagQyGW8`uaZ$ef$jB>r;2k8}!*VRb3~HFc?k5)|Z#n#RDv2k)>U5yU{jVf@1V zf6Wo`zf&s@Dgk@%$qj(AU+d3w3f;hXQDJQmtQK_28`9RhQC1OdE5KxzmZVbc&e;0XdO+}qx?b71SpZjO z{@=!_8{UYfGEdFjw%&|57ttW-6Xs$d>+HfueA362Wx4JBU7I<?p|4vx2D~byLX(-SH0-UMl1V&8qI7OMhoQuR?54*4smq)48G=EzoAr&PDs^) zdImhtc(6;$C{Ve`C0^i->Cz~5n6B%g+>4TC;DE0e$zWz3m`5trn1wr6wWn)tqrcP%0^TalS&AKDf0q-XapQ&^y}iOX@QL?1r^PwXA_s1D?3qdz0c)cLIU zni*Vj!#;smMig7!N|1N$?2PK%4Q%3uY~9ZAhq2VQG?Sxybv21iKuXFNT50keLZXTx z-G0)mNY>xQ`!6&pTBk+c&a$nWc=WadvnBTs{qhE2C`}e;W2>k}0 zG!5EcFoocHuW#RihrHa1pr1#g!kXsS$EEjM6DPu`U(ecr>r9V=O1pM6hM?+Y1l_^*7hK+n zHX}K6rK;{yQX3|Dg?jccLO;Ye8eTg%v(5v))f-&~dmcdK)BtXmNj}idLF202r3fx~ z-;5>#IeX}vJ^jtCi*PLS4@gD-bu;v>Z=l{?!prSzfTQG234%6%YaG45dGHeYLVJA^ z{BU#xAvggbRqv)+U|U<|3nx3Vpc)o;;;4N3w%YA4`zvi+izsu4Ip}{;PxB9$&}tyJ zPN-k+uLKW+N^rJM9>WwWn%%M7x`T&4fM*7T-l>TP?Lx$0fwH+_(ueU;6gU-UqI!US zQ;3NvQy@iFES+7y9_6qdT}$dyA~E+U~c@ow4Y6tC+05H zS0=kGiNf7_3G}m|z}E-V!byl2=mKv9VD+BuGx>W-xKs!TJhxUU7)p4H1%=a z=AY96^pbgaL3VY?a0j=Ao<4@kda_Xep+o4Cum~R=v=_*K17O)I$A@%X z(cXscFEDp{4yq@UGbQj1_&nRYKYoUe&~}iV z^O{IcqXruH+Z6f01#uW;2i$Avk_V4xO@~DJ_FuSGR79~JHZZ>{Ck`*Uy%QpD$*F>m zFq2=a{FXCK01bswKzxEURmFzW3by-`(sIkIoI zY|lQVtVM_)c+KFRewmGAb;ImU+T#cJ!2h>7@(P#OC@>Fv%}g7;@P97w{x=(%fD-&8f$fwFTp|)7o2cJyOJovEf1?gBXg;{|H41s* zkb20C*=v}fSTT=ekv{UlnzCuOvMr^aYM-w8tN5)SSV}i@OF|bsCOCldB`5mmwJ2lg z>5tZ&$c!0Z<-B|tX-AC7ucN@g&;)p}l$EP;aL@ry+P)T5eDuIsjp}m`XIFed%Dg&f zYlP6s&3B!(BI4|(rPsH{V^YzZ*jN3JUt{XF557JUZ0jK=xg+%$?=6`&hgG;ydd_7Z zn;jA{k<#N2QDyd#ypz2OOzL`Mq!S|en9w>#v+v6vEVaJquiZG(7H|?b z`Xmds{NSzelTc{5R<(UpAzd6UdUn71`oRK&`6}I1!L8l53aLK!Pen>#{J|gsu%wik z!c>uBHNhxzWow#$V^$tW zMJ94K_RHh@e5hw6e29!5q7o-0bF0Mgq{mcnb$77Mpq)=L=ix&Z|6QH|t#;m<2CH#d z#na%8ClHv$LkIUnb)K(f^IbOgPmX&qo_TGyC4&;IGN`zLkMc2JLwrga_u&WoEO)UW@Y~7+&_&8R z3PdJZCn?^_nC6tBb$l#9Vzgy4#6WY)OLgFQrRwJ0ku<`}p}?}u$US)loW;%3(bSP?gEz^a_qnF6&jz{bt;m-U(#Gd~){~phaeIh?U z_uwk#JXwY7<(T3SG*y|iciEMV$d(5!mvUt%omLZee!ofI?p}TPr7KG3)bQ4YakME4 z_xBz(SiJxulJ=27%A-4`Pbdp8$kY4Pn|ae}7L+941aXIi*R-@`1RYYN^H8~vU})^* zxkI{$gA19)Osr&@Yxf9tvXU0J$qz>R@ldg}^NiI~c-gQ8obXVFey+Ec;T}c7J>|w6 zYKd{b_FK=t#}sglLsjj{4sx2~7Yc)Dgg%fhTxS1@+;g_MNffO-*G`rtF2tm#Z&WdRP1Gk1Vf)=(OX>N zg?U5jaYouK&j;2E^XrQ!&?y@U@2pmuz@AJmo=r5?dE^zsT;t}S%ba{H@&bP|n*S4F zqunpldJh(#$RDamjAqK`b= zfI{3&p)(uH(c;lyAMFkG#GYIfP}Pd?8N~ZOERlERn~}ha0_)Bt@-0+) z;6>^_aDnozLq7j^!u09CKjnhJFLYa4WQM@dV1+8|Or)quYaZu)4Rq*=(ybv`4&6I1 zqLI#qB+R*&4O*FJOkr+?1ii8}FyDqwtyjdZv8m<68c?f%Bo#A%8D@VDR8-K7V&aeZq(hSTkI7hWub zA4;lt3Bj64Th)Yh6JeJ&Ji9B80Q|CKk7)+{|1b}03A>&kSwpAce3t8_KYZ@XL81)$aMk-col8d+R!4%q z1q>V*5TW%BtN29?ajbR1@Pe>!LVogI4_n}nko!O^y|zJ;!=Y)9vxn1a< zkUKb5B0X>P3C$ZmD%#_n20B#N1Hlfs|iLb>@v~#%7r8G2P5K6rC#cTSPaGriSvz zv)^4=s@vJc8h)n_M}H&!5yc=v@66t7ik zvdS`89($YTxdrxH%m`*rD6cb9i?o2-D)3ru+XG zd(W_@*6!VRxe!rNQBgq<5J6Z9h@f;xlp-J{N>y5<2+~!gmn@YcB3+8K(5ry-PDH6v zf^b)E1h4FYI^o@EreREh9YUt@VM|3Gn*zmPP!2NJ(xIu$Auv`S66?GJ{QAXHK%X3F z-%OWjZ+9{k~px!-1KQ4znIEC z5JbOD@K>&$elQ(1nSIrJXH$hk=^$u0UL4pK0sJV>BaDReq)yZVXv*#W5oE2- zdBl)6ef!@a}ixJzq8@cb}mYvEgp|n@_!Sb0s?bNtn+K*@$Ffze6wnh>i$rFI&JSQOv7>Q zO?K1lu}Tj24}mZ?Qvm7?yRbk#e1e&@jdio$%mx{i!0pg95(28LPbFY?4&oMCHLI>} zyZto+NumXvVa6(w4-;(gSXDLCk-{-F8Z zKC@2F8KEM7z0jRIrDu9p0{3NL#O}I=&hiqPp`AtDP6zL$K6+U3NJ6F^vgt<_Pe*CN zUq>_DMvTO?6@?R~x6TzDVdyeRIcr3$jKeUL3xD*h)bXDpwQ3rwvZFCgr#Iv_|9(Rp z^zVlcF#W%E{{Of7Hv-vbUcyyHG>lWlh5fg913o4r9+ZY!(ADg?MJwWvEIqOb~k_7x}ygY^^07l$=(VRr#`tI@X#{Et<8@g zmZSZSWY1u{ne*mnpwY4KUqk3Ld>roFd&0f@P{1~&g)c{f=PRYR&P@BUY}LMuLr;(( zs;Ze(6Z$$(zk3u~;%lvK&gr�OkEM>-if5oLqld#XMc7@CEE>NzgY860qx#tdl$~ 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
  • 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 F{67l|-0c7W literal 0 HcmV?d00001 diff --git a/sources_non_forked/nerdtree/syntax/nerdtree.vim b/sources_non_forked/nerdtree/syntax/nerdtree.vim index e93ca1df..7c80605c 100644 --- a/sources_non_forked/nerdtree/syntax/nerdtree.vim +++ b/sources_non_forked/nerdtree/syntax/nerdtree.vim @@ -8,7 +8,7 @@ execute "syn match NERDTreeUp #\\V". s:tree_up_dir_line ."#" "quickhelp syntax elements syn match NERDTreeHelpKey #" \{1,2\}[^ ]*:#ms=s+2,me=e-1 syn match NERDTreeHelpKey #" \{1,2\}[^ ]*,#ms=s+2,me=e-1 -syn match NERDTreeHelpTitle #" .*\~#ms=s+2,me=e-1 +syn match NERDTreeHelpTitle #" .*\~$#ms=s+2,me=e-1 syn match NERDTreeToggleOn #(on)#ms=s+1,he=e-1 syn match NERDTreeToggleOff #(off)#ms=e-3,me=e-1 syn match NERDTreeHelpCommand #" :.\{-}\>#hs=s+3 @@ -22,8 +22,8 @@ syn match NERDTreeLinkDir #.*/ ->#me=e-3 containedin=NERDTreeDir "highlighing for directory nodes and file nodes syn match NERDTreeDirSlash #/# containedin=NERDTreeDir -exec 'syn match NERDTreeClosable #'.escape(g:NERDTreeDirArrowCollapsible, '~').'# containedin=NERDTreeDir,NERDTreeFile' -exec 'syn match NERDTreeOpenable #'.escape(g:NERDTreeDirArrowExpandable, '~').'# containedin=NERDTreeDir,NERDTreeFile' +exec 'syn match NERDTreeClosable #' . escape(g:NERDTreeDirArrowCollapsible, '~') . '\ze .*/# containedin=NERDTreeDir,NERDTreeFile' +exec 'syn match NERDTreeOpenable #' . escape(g:NERDTreeDirArrowExpandable, '~') . '\ze .*/# containedin=NERDTreeDir,NERDTreeFile' let s:dirArrows = escape(g:NERDTreeDirArrowCollapsible, '~]\-').escape(g:NERDTreeDirArrowExpandable, '~]\-') exec 'syn match NERDTreeDir #[^'.s:dirArrows.' ].*/#' diff --git a/sources_non_forked/syntastic/README.markdown b/sources_non_forked/syntastic/README.markdown index 8f0e4607..66d996ef 100644 --- a/sources_non_forked/syntastic/README.markdown +++ b/sources_non_forked/syntastic/README.markdown @@ -68,9 +68,9 @@ Perl POD, PHP, gettext Portable Object, 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, Vala, Verilog, VHDL, -Vim help, VimL, xHtml, XML, XSLT, XQuery, YACC, YAML, YANG data models, z80, -Zope page templates, and Zsh. See the [manual][checkers] for details about the -corresponding supported checkers (`:help syntastic-checkers` in Vim). +Vim help, VimL, Vue.js, xHtml, XML, XSLT, XQuery, YACC, YAML, YANG data models, +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], @@ -437,15 +437,15 @@ scripts. __4.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 environment for 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] from the virtual environment. +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 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_ruby__exec` variables to the wrapper -scripts. +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__exec` variables to the wrapper scripts. diff --git a/sources_non_forked/syntastic/doc/syntastic-checkers.txt b/sources_non_forked/syntastic/doc/syntastic-checkers.txt index c8fac05e..d6d94386 100644 --- a/sources_non_forked/syntastic/doc/syntastic-checkers.txt +++ b/sources_non_forked/syntastic/doc/syntastic-checkers.txt @@ -121,6 +121,7 @@ SYNTAX CHECKERS BY LANGUAGE *syntastic-checkers-lang* 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| @@ -2867,7 +2868,8 @@ to it: https://github.com/mantoni/eslint_d.js#editor-integration -See also: |syntastic-javascript-eslint|, |syntastic-typescript-eslint|. +See also: |syntastic-javascript-eslint|, |syntastic-typescript-eslint|, +|syntastic-vue-eslint|. ------------------------------------------------------------------------------ 2. gjslint *syntastic-html-gjslint* @@ -2935,7 +2937,7 @@ See also: |syntastic-xhtml-tidy|. Name: HTMLHint Maintainer: LCD 47 -"JSHint" is a static code analysis tool for HTML. See the project's page for +"HTMLHint" is a static code analysis tool for HTML. See the project's page for details: http://htmlhint.com/ @@ -3425,7 +3427,8 @@ version 2.1.0 or later, instead of "ESLint". Just point https://github.com/mantoni/eslint_d.js#editor-integration -See also: |syntastic-html-eslint|, |syntastic-typescript-eslint|. +See also: |syntastic-html-eslint|, |syntastic-typescript-eslint|, +|syntastic-vue-eslint|. ------------------------------------------------------------------------------ 3. Flow *syntastic-javascript-flow* @@ -5720,11 +5723,12 @@ running "rubocop --version" from the shell. If it complains about "Parser" "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 -system such as "rbenv" (http://rbenv.org/) or "rvm" (https://rvm.io/), that -allows you to run multiple versions of "Ruby" without conflicts: > +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) @@ -5768,11 +5772,12 @@ running "ruby-lint --version" from the shell. If it complains about "Parser" "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 -system such as "rbenv" (http://rbenv.org/) or "rvm" (https://rvm.io/), that -allows you to run multiple versions of "Ruby" without conflicts: > +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) @@ -6377,6 +6382,14 @@ Default: 1 Whether to show informational messages ("chktex" option "-m"). By default informational messages are shown as warnings. +Note~ + +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 +< ------------------------------------------------------------------------------ 2. lacheck *syntastic-tex-lacheck* @@ -6726,7 +6739,8 @@ as "typescript-vim": https://github.com/leafgarland/typescript-vim -See also: |syntastic-html-eslint|, |syntastic-javascript-eslint|. +See also: |syntastic-html-eslint|, |syntastic-javascript-eslint|, +|syntastic-vue-eslint|. ------------------------------------------------------------------------------ 2. TSLint *syntastic-typescript-tslint* @@ -7026,6 +7040,72 @@ 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| + +------------------------------------------------------------------------------ +1. ESLint *syntastic-vue-eslint* + +Name: eslint +Maintainer: LCD 47 + +"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 + +"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 + ============================================================================== SYNTAX CHECKERS FOR XHTML *syntastic-checkers-xhtml* diff --git a/sources_non_forked/syntastic/doc/syntastic.txt b/sources_non_forked/syntastic/doc/syntastic.txt index 8bc455d3..c24f8fb4 100644 --- a/sources_non_forked/syntastic/doc/syntastic.txt +++ b/sources_non_forked/syntastic/doc/syntastic.txt @@ -1015,11 +1015,18 @@ also affect window sizes.) 7.1. airline *syntastic-airline* The "airline" Vim plugin (https://github.com/vim-airline/vim-airline) comes -packaged with a mechanism of showing flags on the |'statusline'| according -to your |'syntastic_stl_format'|. When using this plugin you do NOT need to -follow the recommendation outlined in the |syntastic-statusline-flag| section -above to modify your |'statusline'|; "airline" will make all necessary changes -automatically. +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* diff --git a/sources_non_forked/syntastic/plugin/syntastic.vim b/sources_non_forked/syntastic/plugin/syntastic.vim index 5c1b1e74..fff95345 100644 --- a/sources_non_forked/syntastic/plugin/syntastic.vim +++ b/sources_non_forked/syntastic/plugin/syntastic.vim @@ -19,7 +19,7 @@ if has('reltime') lockvar! g:_SYNTASTIC_START endif -let g:_SYNTASTIC_VERSION = '3.8.0-63' +let g:_SYNTASTIC_VERSION = '3.8.0-73' lockvar g:_SYNTASTIC_VERSION " Sanity checks {{{1 diff --git a/sources_non_forked/syntastic/plugin/syntastic/registry.vim b/sources_non_forked/syntastic/plugin/syntastic/registry.vim index 4efd5098..760cdb67 100644 --- a/sources_non_forked/syntastic/plugin/syntastic/registry.vim +++ b/sources_non_forked/syntastic/plugin/syntastic/registry.vim @@ -103,6 +103,7 @@ let s:_DEFAULT_CHECKERS = { \ 'verilog': ['verilator'], \ 'vhdl': ['ghdl'], \ 'vim': ['vimlint'], + \ 'vue': ['pug_lint_vue', 'eslint'], \ 'xhtml': ['tidy'], \ 'xml': ['xmllint'], \ 'xslt': ['xmllint'], diff --git a/sources_non_forked/syntastic/syntax_checkers/python/flake8.vim b/sources_non_forked/syntastic/syntax_checkers/python/flake8.vim index 257b69dd..64b98f81 100644 --- a/sources_non_forked/syntastic/syntax_checkers/python/flake8.vim +++ b/sources_non_forked/syntastic/syntax_checkers/python/flake8.vim @@ -23,7 +23,9 @@ function! SyntaxCheckers_python_flake8_GetLocList() dict let errorformat = \ '%E%f:%l: could not compile,%-Z%p^,' . + \ '%A%f:%l:%c: %t%n: %m,' . \ '%A%f:%l:%c: %t%n %m,' . + \ '%A%f:%l: %t%n: %m,' . \ '%A%f:%l: %t%n %m,' . \ '%-G%.%#' @@ -39,6 +41,7 @@ function! SyntaxCheckers_python_flake8_GetLocList() dict " F*** are PyFlakes codes " C*** are McCabe complexity messages " N*** are naming conventions from pep8-naming + " H*** are OpenStack messages if has_key(e, 'nr') let e['text'] .= printf(' [%s%03d]', e['type'], e['nr']) @@ -50,11 +53,11 @@ function! SyntaxCheckers_python_flake8_GetLocList() dict call remove(e, 'nr') endif - if e['type'] =~? '\m^[CNW]' + if e['type'] =~? '\m^[CHNW]' let e['subtype'] = 'Style' endif - let e['type'] = e['type'] =~? '\m^[EFC]' ? 'E' : 'W' + let e['type'] = e['type'] =~? '\m^[EFHC]' ? 'E' : 'W' endfor return loclist diff --git a/sources_non_forked/syntastic/syntax_checkers/tex/chktex.vim b/sources_non_forked/syntastic/syntax_checkers/tex/chktex.vim index 9b359028..8a38ed22 100644 --- a/sources_non_forked/syntastic/syntax_checkers/tex/chktex.vim +++ b/sources_non_forked/syntastic/syntax_checkers/tex/chktex.vim @@ -27,12 +27,12 @@ let s:save_cpo = &cpo set cpo&vim function! SyntaxCheckers_tex_chktex_GetLocList() dict - let makeprg = self.makeprgBuild({ 'args_after': '-q -v1' }) + let makeprg = self.makeprgBuild({ 'args_after': ['-q', '-f', "%k:%n:%f:%l:%c:%m\n"] }) let errorformat = - \ '%EError %n in %f line %l: %m,' . - \ '%WWarning %n in %f line %l: %m,' . - \ (g:syntastic_tex_chktex_showmsgs ? '%WMessage %n in %f line %l: %m,' : '') . + \ '%EError:%n:%f:%l:%v:%m,' . + \ '%WWarning:%n:%f:%l:%v:%m,' . + \ (g:syntastic_tex_chktex_showmsgs ? '%WMessage:%n:%f:%l:%v:%m,' : '') . \ '%Z%p^,' . \ '%-G%.%#' diff --git a/sources_non_forked/syntastic/syntax_checkers/vue/eslint.vim b/sources_non_forked/syntastic/syntax_checkers/vue/eslint.vim new file mode 100644 index 00000000..68ee396f --- /dev/null +++ b/sources_non_forked/syntastic/syntax_checkers/vue/eslint.vim @@ -0,0 +1,23 @@ +"============================================================================ +"File: eslint.vim +"Description: Syntax checking plugin for syntastic +"Maintainer: LCD 47 +"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_vue_eslint_checker') + finish +endif +let g:loaded_syntastic_vue_eslint_checker = 1 + +call g:SyntasticRegistry.CreateAndRegisterChecker({ + \ 'filetype': 'vue', + \ 'name': 'eslint', + \ 'redirect': 'javascript/eslint'}) + +" vim: set sw=4 sts=4 et fdm=marker: diff --git a/sources_non_forked/syntastic/syntax_checkers/vue/pug_lint_vue.vim b/sources_non_forked/syntastic/syntax_checkers/vue/pug_lint_vue.vim new file mode 100644 index 00000000..5665d036 --- /dev/null +++ b/sources_non_forked/syntastic/syntax_checkers/vue/pug_lint_vue.vim @@ -0,0 +1,42 @@ +"============================================================================ +"File: pug_lint_vue.vim +"Description: Syntax checking plugin for syntastic using pug-lint-vue +" (https://github.com/sourceboat/pug-lint-vue) +"Maintainer: Tim Carry +"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_vue_pug_lint_vue_checker') + finish +endif +let g:loaded_syntastic_vue_pug_lint_vue_checker = 1 + +let s:save_cpo = &cpo +set cpo&vim + +function! SyntaxCheckers_vue_pug_lint_vue_GetLocList() dict + let buf = bufnr('') + let makeprg = self.makeprgBuild({ 'fname': syntastic#util#shescape(fnamemodify(bufname(buf), ':p')) }) + + let errorformat = '%\s%#%l:%c %m' + + return SyntasticMake({ + \ 'makeprg': makeprg, + \ 'errorformat': errorformat, + \ 'defaults': { 'bufnr': buf, 'type': 'E' } }) +endfunction + +call g:SyntasticRegistry.CreateAndRegisterChecker({ + \ 'filetype': 'vue', + \ 'name': 'pug_lint_vue', + \ 'exec': 'pug-lint-vue' }) + +let &cpo = s:save_cpo +unlet s:save_cpo + +" vim: set sw=4 sts=4 et fdm=marker: diff --git a/sources_non_forked/vim-bundle-mako/README b/sources_non_forked/vim-bundle-mako/README deleted file mode 100644 index 9889879c..00000000 --- a/sources_non_forked/vim-bundle-mako/README +++ /dev/null @@ -1,19 +0,0 @@ -This project is a colleciton of vim scripts that relate to the Mako templating -engine for python. Most of thse are not at all written by me, just packaged -here from the vim-script site. The purpose is to make them easy to use with -pathogen.vim. - -About mako: http://www.makotemplates.org/ - -Original scripts: - -Externally sourced scripts: - -* indent/mako.vim (vim script 2663) by Scott Torborg - http://www.vim.org/scripts/script.php?script_id=2663 - version used here: 0.4 - -* syntax/mako.vim (vim script 1858) by Armin Ronacher - http://www.vim.org/scripts/script.php?script_id=1858 - version used here: 0.6.1 - diff --git a/sources_non_forked/vim-bundle-mako/README.md b/sources_non_forked/vim-bundle-mako/README.md new file mode 100644 index 00000000..037e44e4 --- /dev/null +++ b/sources_non_forked/vim-bundle-mako/README.md @@ -0,0 +1,22 @@ +This project is a colleciton of vim scripts that relate to the Mako templating +engine for python. Most of thse are not at all written by me, just packaged +here from the vim-script site. The purpose is to make them easy to use with +pathogen.vim. + +Useful configuration variables: + +* `g:mako_detect_lang_from_ext`: when set to 1 (the default), the ftdetect + script will attempt to figure out the "outer" filetype of the file by + stripping the ".mako" extension (eg: index.html.mako will be treated as HTML, + while script.cpp.mako will be treated as C++). Set to 0 to prevent this + detection. +* `g:mako_default_outer_lang`: if ftdetect cannot detect the "outer" filetype of + the file, this sets the default filetype used. If not set, defaults to "html". + +About mako: http://www.makotemplates.org/ + +Externally sourced scripts: + +* [indent/mako.vim](http://www.vim.org/scripts/script.php?script_id=2663) 0.4 by Scott Torborg +* [syntax/mako.vim](http://www.vim.org/scripts/script.php?script_id=1858) 0.6.1 by Armin Ronacher + diff --git a/sources_non_forked/vim-bundle-mako/ftdetect/mako.vim b/sources_non_forked/vim-bundle-mako/ftdetect/mako.vim index 397aa020..3051a431 100644 --- a/sources_non_forked/vim-bundle-mako/ftdetect/mako.vim +++ b/sources_non_forked/vim-bundle-mako/ftdetect/mako.vim @@ -1 +1,11 @@ +if !exists("g:mako_detect_lang_from_ext") + let g:mako_detect_lang_from_ext = 1 +endif +if g:mako_detect_lang_from_ext + au BufNewFile *.*.mako execute "do BufNewFile filetypedetect " . expand(":r") | let b:mako_outer_lang = &filetype + " it's important to get this before any of the normal BufRead autocmds execute + " for this file, otherwise a mako tag at the start of the file can cause the + " filetype to be set to mason + au BufReadPre *.*.mako execute "do BufRead filetypedetect " . expand(":r") | let b:mako_outer_lang = &filetype +endif au BufRead,BufNewFile *.mako set filetype=mako diff --git a/sources_non_forked/vim-bundle-mako/syntax/mako.vim b/sources_non_forked/vim-bundle-mako/syntax/mako.vim index 36bc4a7c..83736995 100644 --- a/sources_non_forked/vim-bundle-mako/syntax/mako.vim +++ b/sources_non_forked/vim-bundle-mako/syntax/mako.vim @@ -19,16 +19,27 @@ elseif exists("b:current_syntax") finish endif +if !exists("b:mako_outer_lang") + if exists("g:mako_default_outer_lang") + let b:mako_outer_lang = g:mako_default_outer_lang + else + let b:mako_outer_lang = "html" + endif +endif if !exists("main_syntax") - let main_syntax = "html" + let main_syntax = b:mako_outer_lang endif -"Source the html syntax file -ru! syntax/html.vim -unlet b:current_syntax +"Source the outer syntax file +execute "ru! syntax/" . b:mako_outer_lang . ".vim" +if exists("b:current_syntax") + unlet b:current_syntax +endif -" tell html.vim what syntax groups should take precedence (see :help html.vim) -syn cluster htmlPreproc add=makoLine,makoVariable,makoTag,makoDocComment,makoDefEnd,makoText,makoDelim,makoEnd,makoComment,makoEscape +if b:mako_outer_lang == "html" + " tell html.vim what syntax groups should take precedence (see :help html.vim) + syn cluster htmlPreproc add=makoLine,makoVariable,makoTag,makoDocComment,makoDefEnd,makoText,makoDelim,makoEnd,makoComment,makoEscape +endif "Put the python syntax file in @pythonTop syn include @pythonTop syntax/python.vim @@ -89,4 +100,4 @@ if version >= 508 || !exists("did_mako_syn_inits") delc HiLink endif -let b:current_syntax = "html" +let b:current_syntax = b:mako_outer_lang diff --git a/sources_non_forked/vim-fugitive/README.markdown b/sources_non_forked/vim-fugitive/README.markdown index a5f91f64..d81c2876 100644 --- a/sources_non_forked/vim-fugitive/README.markdown +++ b/sources_non_forked/vim-fugitive/README.markdown @@ -66,7 +66,7 @@ If you don't have a preferred installation method, one option is to install and paste: cd ~/.vim/bundle - git clone git://github.com/tpope/vim-fugitive.git + git clone https://github.com/tpope/vim-fugitive.git vim -u NONE -c "helptags vim-fugitive/doc" -c q If your Vim version is below 7.2, I recommend also installing diff --git a/sources_non_forked/vim-gitgutter/README.mkd b/sources_non_forked/vim-gitgutter/README.mkd index 4dc9ee97..83f10c20 100644 --- a/sources_non_forked/vim-gitgutter/README.mkd +++ b/sources_non_forked/vim-gitgutter/README.mkd @@ -134,7 +134,7 @@ And you can turn line highlighting on and off (defaults to off): Note that if you have line highlighting on and signs off, you will have an empty sign column – more accurately, a sign column with invisible signs. This is because line highlighting requires signs and Vim always shows the sign column even if the signs are invisible. -If you switch off both line highlighting and signs, you won't see the sign column. That is unless you have set `let g:gitgutter_sign_column_always = 1` so it's always there. +If you switch off both line highlighting and signs, you won't see the sign column. That is unless you configure the sign column always to be there (see Sign Column section). To keep your Vim snappy, vim-gitgutter will suppress itself when a file has more than 500 changes. As soon as the number of changes falls below the limit vim-gitgutter will show the signs again. You can configure the threshold with: @@ -270,7 +270,15 @@ highlight SignColumn ctermbg=whatever " terminal Vim highlight SignColumn guibg=whatever " gVim/MacVim ``` -By default the sign column will appear when there are signs to show and disappear when there aren't. If you would always like the sign column to be there, add `let g:gitgutter_sign_column_always = 1` to your `~/.vimrc`. +By default the sign column will appear when there are signs to show and disappear when there aren't. To always have the sign column, add to your vimrc: + +```viml +if exists('&signcolumn') " Vim 7.4.2201 + set signcolumn=yes +else + let g:gitgutter_sign_column_always = 1 +endif +``` #### Signs' colours and symbols diff --git a/sources_non_forked/vim-gitgutter/plugin/gitgutter.vim b/sources_non_forked/vim-gitgutter/plugin/gitgutter.vim index 11a5adfc..ad39bc17 100644 --- a/sources_non_forked/vim-gitgutter/plugin/gitgutter.vim +++ b/sources_non_forked/vim-gitgutter/plugin/gitgutter.vim @@ -32,6 +32,11 @@ call s:set('g:gitgutter_max_signs', 500) call s:set('g:gitgutter_signs', 1) call s:set('g:gitgutter_highlight_lines', 0) call s:set('g:gitgutter_sign_column_always', 0) +if g:gitgutter_sign_column_always && exists('&signcolumn') + set signcolumn=yes + let g:gitgutter_sign_column_always = 0 + call gitgutter#utility#warn('please replace "let g:gitgutter_sign_column_always=1" with "set signcolumn=yes"') +endif call s:set('g:gitgutter_override_sign_column_highlight', 1) call s:set('g:gitgutter_realtime', 1) call s:set('g:gitgutter_eager', 1) @@ -208,6 +213,11 @@ augroup gitgutter autocmd TabEnter * call settabvar(tabpagenr(), 'gitgutter_didtabenter', 1) + " Ensure that all buffers are processed when opening vim with multiple files, e.g.: + " + " vim -o file1 file2 + autocmd VimEnter * if winnr() != winnr('$') | :GitGutterAll | endif + if !has('gui_win32') autocmd FocusGained * call gitgutter#all() endif diff --git a/sources_non_forked/vim-go/.github/CONTRIBUTING.md b/sources_non_forked/vim-go/.github/CONTRIBUTING.md index eebdd6b5..f3fc905c 100644 --- a/sources_non_forked/vim-go/.github/CONTRIBUTING.md +++ b/sources_non_forked/vim-go/.github/CONTRIBUTING.md @@ -4,6 +4,6 @@ Thanks for improving vim-go! Before you dive in please read the following: [Documentation](https://github.com/fatih/vim-go/blob/master/doc/vim-go.txt), it might have answers for your problem 2. If you add a new feature please don't forget to update the documentation: - [doc/vim-go.txt](https://github.com/fatih/vim-go/blob/master/doc/vim-go.txt. + [doc/vim-go.txt](https://github.com/fatih/vim-go/blob/master/doc/vim-go.txt). 3. If it's a breaking change or exceed +100 lines please open an issue first and describe the changes you want to make. diff --git a/sources_non_forked/vim-go/CHANGELOG.md b/sources_non_forked/vim-go/CHANGELOG.md index 823b32e6..8b482bd7 100644 --- a/sources_non_forked/vim-go/CHANGELOG.md +++ b/sources_non_forked/vim-go/CHANGELOG.md @@ -1,8 +1,44 @@ ## unplanned +IMPROVEMENTS: + +* `:GoAddTags` and `:GoRemoveTags` now continue to process if there are malformed individual struct tags [gh-1401] +* `:GoAddTags` and `:GoRemoveTags` now shows a quickfix window if there are malformed struct tags [gh-1401] + + +BUG FIXES: + +* Include comments in import block when folding is enabled [gh-1387] +* Fix opening definitions in tabs [gh-1400] +* Fix accidently closing quickfix window from other commands if :GoFmt or autosave format was called [gh-1407] + +## 1.14 - (August 6, 2017) + +FEATURES: + +* We now have folding support based on Go syntax. Check out the + [demo](https://twitter.com/fatih/status/893843722093330433) to see it in + action. To enable it you have to set the following vim setting: `set + foldmethod=syntax`. Currently it folds at block (`{ }`), var and const level. + These can be individually disabled/enabled if wished. For more info please + read the documentation for the `g:go_fold_enable` setting. [gh-1339] +* `:GoFiles` accepts now an argument to change the type of files it can show. + By default it shows`.go source files` but now it can be changed to show + various kind of files. The full list can be seen via `go list --help` under + the `// Source Files` section [gh-1372] i.e: + +``` +:GoFiles CgoFiles // shows .go sources files that import "C" +:GoFiles TestGoFiles // shows _test.go files in package +:GoFiles IgnoredGoFiles // shows .go sources ignored due to build constraints +etc.. +``` + IMPROVEMENTS -* Files created with `_test.go` extension have a new template with a ready to go test function. The template can be changed with the `g:go_template_test_file` setting. [gh-1318] +* Files created with `_test.go` extension have a new template with a ready to + go test function. The template can be changed with the + `g:go_template_test_file` setting. [gh-1318] * Improve performance for highly used operations by caching `go env` calls [gh-1320] * `:GoCoverage` can accept arguments now. i.e: `:GoCoverage -run TestFoo` [gh-1326] * `:GoDecls` and `:GoDeclsDir` shows a warning if [ctrlp.vim](https://github.com/ctrlpvim/ctrlp.vim) is not installed @@ -10,6 +46,11 @@ IMPROVEMENTS * `:GoCoverage` echos now the progress if `g:go_echo_command_info` is enabled [gh-1333] * Add `g:go_doc_max_height` setting to control the maximum height of the window created by `:GoDoc` and `K` mapping [gh-1335] * The `af` text object is able to include the assignment variable for anonymous functions. Can be disabled with `g:go_textobj_include_variable = 0` [gh-1345] +* Add `g:go_list_autoclose` setting to prevent closting the quickfix/location list after zero items [gh-1361] +* Cursor is now adjusted and locked to the correct line when `goimports` is used for autosave [gh-1367] +* Complement the path of command for different situations of Cygwin environment [gh-1394] +* Show message when using :GoDef and opening a new buffer [gh-1385] + BUG FIXES: @@ -17,7 +58,29 @@ BUG FIXES: * Fix documentation for vim-go & syntastic integration for errcheck using [gh-1323] * Fix showing an output if a test has finished when `:GoTest` is called [gh-1327] * Fix warning when goimports doesn't support srcdir [gh-1344] -* Fix brokwn code folding with go_highlight_types [gh-1338] +* Fix broken code folding with go_highlight_types [gh-1338] +* Fix blocking the ui when swapfile is enabled and `:GoFmt` is called (either manually or via autosave) [gh-1362] +* Fix getting bin paths for binaries if GOPATH was not set and Go version =>1.7 was used [gh-1363] +* Fix picking up the correct list type for showing `:GoFmt` errors [gh-1365] +* Fix auto detecting of GOPATH for import paths with string 'src' (i.e: `GOPATH/src/github.com/foo/src/bar`) [gh-1366] +* Fix showing an empty window if `gogetdoc` was not found [gh-1379] +* Fix commands not being executed if paths would include spaces (binary name, GOPATH, file itself, etc..) [gh-1374] +* Fix showing correct message when editing a new file [gh-1371] +* Fix filepaths in the quickfix list for :GoVet [gh-1381] +* Run :GoLint against the package of the open file [gh-1382] + +BACKWARDS INCOMPATIBILITIES: + +* `:GoFmt` now uses `quickfix` to show formatting errors instead of + `locationlist`. To change back to `locationlist` you can change it with the + setting `let g:go_list_type = "locationlist"` [gh-1365] +* `:GoLint` now runs against the package of the open file instead of the + current working directory. This is so all commands behave the same relative + to the current open buffer. For more info check the [comment + here](https://github.com/fatih/vim-go/issues/1375#issuecomment-317535953) + [gh-1382] + + ## 1.13 - (June 6, 2017) @@ -150,7 +213,11 @@ BACKWARDS INCOMPATIBILITIES: FEATURES: -* Travis test integration has been added. Now any file that is added as `_test.vim` will be automatically tested in for every Pull Request (just like how we add tests to Go with `_test.go`). Going forward this will tremendously increase the stability and decrease the maintenance burden of vim-go. [gh-1157] +* Travis test integration has been added. Now any file that is added as + `_test.vim` will be automatically tested in for every Pull Request + (just like how we add tests to Go with `_test.go`). Going forward this will + tremendously increase the stability and decrease the maintenance burden of + vim-go. [gh-1157] * Add new `g:go_updatetime` setting to change the default updatetime (which was hardcoded previously) [gh-1055] * Add new `g:go_template_use_pkg` setting to enable to use cwd as package name instead of basic template file [gh-1124] @@ -491,6 +558,376 @@ BACKWARDS INCOMPATIBILITIES: i.g: `let g:go_guru_scope = ["github.com/fatih/structs", "golang.org/x/tools/..."]` -## Previous releases +## 1.5 (Mar 16, 2016) -Previous changelogs can be found here: https://github.com/fatih/vim-go/releases +FEATURES: +* Introducing code name "motion". A new whole way of moving + around and navigating (gh-765). Checkout the following new changes: + * A vim-go specific tool, called [motion](https://github.com/fatih/motion) is being developed which + provides us the underlying foundation for the following and upcoming + new features. + * `]]` and `[[` motions can be used to jump between functions + * `if` and `af` are improved and implement from scratch. It has now + support for literal functions, comments of functions, better cursor + position support and more stable. + * New `:GoDecls` and `:GoDeclsDir` commands that are available if + `ctrlp.vim` is installed. Once called one can easily jump to any generic declaration available. + * I wrote two blog posts about these new features in more detail. I recommend you to read it: [Treating Go types as objects in Vim](https://medium.com/@farslan/treating-go-types-as-objects-in-vim-ed6b3fad9287#.mbwaisevp) and [Navigation between functions and types in vim-go](https://medium.com/@farslan/navigation-between-functions-and-types-in-vim-go-f9dd7de8ca37#.2sdf8tbbe) +* A new `:GoAlternate` command that toggles to the test + file of the current file. It also has new appropriate mappings to open the + alternate file in split or tabs. (gh-704) +* Now commands can choose whether they want to open a + `quickfix` or a `location list` via the setting `g:go_list_type`. Also all + the commands have now some sensible settings, some will open a qf window, + some will open a location list (gh-700) + +IMPROVEMENTS: + +* Add support for goimport's new `-srcdir`. Goimports now succesfully suports `vendor/` folders with this release. (gh-735) +* Add `g:go_gorename_prefill` setting which disabled pre filling the argument for `:GoRename` (gh-711) +* Improve `:GoRun` to complete to filenames (gh-742) +* Highlight `//go:generate` comment directives (gh-757) +* Indent code in Go HTML templates (gh-709) +* Improve negative numbers of all types, octals, imaginary numbers with exponents (gh-752) +* Improved internal usage of retrieving offsets (gh-762) +* Improve by substitute all backslashes to slashes for filename (gh-703) +* Improve internal Go package path function (gh-702) +* Improved typo and grammar errors in docs (gh-714) +* Improved internal `:GoInfo` automatic call (gh-759) + +BUG FIXES: + +* Fix oracle scope not working if trailing slash exists in scope (gh-751) +* Fix `:GoErrCheck` checking abspath (gh-671) +* Fix `:GoInstall` correctly parsing errors (gh-692) +* Fix `:GoInstall` correctly parsing errors (gh-692) +* Fix `:GoTestFunc` for neovim (gh-695) +* Fix `:GoRun` accepting arguments for neovim (gh-730) +* Fix `go run` mappings not working (gh-542) +* Fix autodetect gopath picking up non existing GB vendor folder +* Fix gofmt errors showing per buffer instead of per script (gh-721) +* Fix some of the neosnippet snippets + +## 1.4 (Jan 18, 2016) + +FEATURES: + +* You waited for it for a long time. And here you have it: **Neovim support!** + This is a huge feature. It's fully compatible with Vim and kicks only in if + vim-go is being used within Neovim. Checkout the full list of changes + (gh-607): + * An async launcher and base foundation was implemented for the `go` command. + This will be used in the future for all upcoming subcommands of the `go` + tool. + * `:GoBuild` is now called asynchronously (it doesn't block the UI anymore). + * A new `go#jobcontrol#Statusline()` can be used to plug into the statusline. + This will show the status of the job running asynchronously. The statusline + is improved to show the status per package instead of file. Assume you have + three files open, all belonging to the same package, if the package build + (`:GoBuild`) is successful, all statusline's will be empty (means SUCCESS), + if it fails all files statusline's will show `FAILED`. + * `:GoRun` opens a new vertical terminal emulator inside Neovim and runs the + command there. The terminal mode can be changed with `g:go_term_mode`, + which is by default `vsplit`. Current options are `vsplit, split or tab`. + We also have three new mappings to open `:GoRun` command in different + terminal split modes: `(go-run-vertical)`, `(go-run-split)` + and `(go-run-tab)` + * `:GoTest`, `:GoTestFunc` and `:GoTestCompile` opens and runs in a new + terminal. The view mode (split,vertical, tab) is defined with + `g:go_term_mode`. The `g:go_term_enabled` setting can be use to change the + behavior of `:GoTestXXX` commands .If set to `1`, it opens the test + commands inside a terminal, if not it runs them in background just like + `:GoBuild` and displays the result in the statusline. + * We have two settings for terminal sizes: `g:go_term_height` and + `g:go_term_width`. By default a vertical or horizontal view is equally + splitted by vim automatically. However with these settings we can for + example have a terminal with a smaller height when we split it + horizontally. + * If a command inside the term fails (such as `go run`, `go test` ...) we + parse now the errors and list them inside a location list. +* Instead of quickfix window, vim-go now uses the `location list` feature of + Vim. These are associated with each window independently of each other. This + enables us to have multiple, independent location lists per window (example + usages: `:GoBuild` with errors that needs to be fixed, `:GoLint` with + warnings that we want to check, `:GoReferrers` with a list of referred + identifiers) (gh-626) +* a new **`:AsmFmt`** command which is integrated to work with [asmfmt](https://github.com/klauspost/asmfmt) (gh-673) +* the full identifier information of a completed identifier is echoed in + statusline. This is very useful to see a function signatures arguments. + (gh-685) + +IMPROVEMENTS: + +* Improve `:GoFmt` by checking if the binary is indeed installed on the system (gh-617) +* Improve `:GoMetaLinter` by adding the option to run the metalinter on save + and adding the option to limit the output to the currently active buffer. Set + `let g:go_metalinter_autosave = 1` to enable autosave and use `let + g:go_metalinter_autosave_enabled = ['vet', 'golint']` to change your options. + (gh-631) +* Improved `:GoDef`. If `vimproc` is installed `godef` will make use of it (gh-670) +* Improve completion of godoce when vimproc is used (gh-620) +* Improve internal error matching prodecure to not match false positives (gh-618) +* A new option to highlight interface variables with `go_highlight_interfaces` (gh-681) + +BUG FIXES + +* Fix `:GoFmt` changing the fileformat of the current buffer (gh-615) +* Fix `:GoRename` to output the original error if parsing fails (gh-675) +* Fix `:GoTest` to output the original error if parsing fails (gh-676) +* Fixed `fmt.Fprintln` not to highlight as builtin (gh-628) +* Fixed wrong highlighting of channels of channels (gh-678) + +## 1.3 (Nov 22, 2015) + +FEATURES: + +* A new `:GoOracleTags` command was added to pass build tags to Oracle's `-tags` flag. (gh-573) + +IMPROVEMENTS: + +* Change `:GoTest` command to timeout after 10 seconds. Vim UI is blocking and + tests with large running times makes Vim blocking for a long time. This is + also customizable with the new option `g:go_test_timeout`. (gh-578) +* Improve `:GoRename` to collect and populate quickfix window with errors. + (gh-577) +* Improve `:GoRun` by dropping bad filenames from quickfix window. This allows + us to have only valid entries which can be jumped to (gh-547) +* Improve `:GoMetaLinter` quickfix output by using absolute paths. This enables + us to jump to errors for all cases. (gh-565) +* Improve `:GoMetaLinter` command by adding a new option + `g:go_metalinter_deadline` which cancels the linters after 5 seconds + (previous default). (gh-576) +* Improve `:GoMetaLinter` by jumping to the first encountered error from the quickfix window. +* Automatically resize quickfix window based on the number of errors (gh-602) +* Improve build constraints to show invalid cases (such as `// +buildfoo`, not + having an empty line between the package statement, etc..). Also add missing + `GOARCH` values sucha s `arm64`. There are many other useful improvements, + for more detail please have a look at + ([gh-589](https://github.com/fatih/vim-go/pull/589)) +* Add support for all values of `GOARCH` (gh-601) +* Add note about Syntastic usage as this problem comes up a lot (gh-580) +* Add note about `:GoUpdateBinaries` (gh-606) + +BUG FIXES: + +* Fixed `:GoErrCheck` showing the correct output when executed inside the source folder (gh-564) +* Fixed `:GoBuild` by not using `/dev/null` anymore for build output (not + supported by `go`). We pass a temporary file now. (gh-567) +* Fixed `:GoFmt` passing `g:go_fmt_options` options to `goimports`. This option + is only valid with `gofmt`. (gh-590) +* Fix vim-go for `cygwin` users. (gh-575) +* Fixed identifier in template files to be highlighted correctly (gh-559) +* Fixed character region in template files to be highlighted correctly (gh-603) +* Fixed variables in template files to be highlighted correctly (gh-611) +* Do not treat builtins as keywords. Now `make` will not highlighted but + `make()` will be highlighted (gh-605) + +## 1.2 (Oct 2, 2015) + +FEATURES: + +* A new `:GoMetaLinter` command which invokes [gometalinter](https://github.com/alecthomas/gometalinter). Please check the PR [#553](https://github.com/fatih/vim-go/pull/553) for more detail on customizing and usage of `:GoMetaLinter`. + +IMPROVEMENTS: + +* Improve `:GoImport` to trim spaces when including import paths of form `"fmt "` +* Avoid setting `filetype` twice. Previously it was doing it twice, which was expensive +* Improve handling of GOPATH's with trailing `/` characters, such as `/home/user/go/` +* Add a new `g:go_highlight_string_spellcheck` feature, which is enabled by feature. Now if spell is enabled, go strings are also checked. +* Specify our limited but functional [gb](http://getgb.io/) support + +BUG FIXES: +* Fixed `:GoRun` to display errors when `g:go_dispatch_enabled` was enabled +* Fixed `:GoDrop` displaying "Not enough arguments" (regression) +* Fixed `:GoErrCheck` not showing `PASS` message if the command was successful +* Fixed `:GoErrCheck` not executing in the directory of the currently edited file +* Close quickfix window after a successful second round of `:GoInstall` +* Fix passing files rather than packages to certain oracle commands. +* Escape files passed to oracle command. This could lead to some serious things. +* Clear `g:go_oracle_scope` when the scope was reseted. Previously it was set to empty string, which was causing false positives. +* Correct various misspellings. + +## 1.1 (Jul 25, 2015) + +With this release the version will now increase in `minor` levels. So the next +release will be `1.2`, the other one `1.3`, etc.. This provides us more +flexibility (like releasing patch versions if needed). + +FEATURES: +* A new `:GoGenerate` command is now available which can be used to invoke `go generate` within vim +* Vim-go didn't had any license, now we use BSD 3-Clause License (the same as Go). This is needed for Linux distributions to package vim-go and is also something that people asked for. + +IMPROVEMENTS: +* Improve commands `GoRun, GoTest{,Func,Compile}, GoCoverage, + GoGenerate, GoErrcheck, GoLint, and GoVet` to handle multiple arguments. + Previously this feature was limited to only certain commands. What this means + is, for example `:GoVet . -all` will invoke `go tool vet . -all` + automatically instead of plan `go vet`. This is one of the big changes in + this release, so give it a try :) +* Improved `:GoFmt` command, which now uses the `-w` flag to + write to the source code directly, instead of outputting it to stdout. This + makes `:GoFmt` much more faster than the current implementation. This is one + of the big changes in this release, so feedback is welcome! +* Improve `:GoImport` to have a `!` feature. Now when when called + with a `!` appended it will go get it. i.e: `:GoImport! + github.com/fatih/color`. Useful if `:GoImport` fails and you want to download + it. +* Automatic GOPATH detections can now detect `gb` vendored folders. Some commands should now work without any problem when invoked on a `gb` project. +* All command arguments are now properly escaped for shell invocation. +* Added the `-f` flag to :GoInstallBinaries command to support `git url..insteadOf` configuration +* Improve width and precision highlighting, such as `%s %5s %-5s %5.5f %.5f` +* Show an error if a region is not selected when `:GoFreeVars` is called + +BUG FIXES: +* Fix`:GoDef` for files containing spaces. We know escape the files before passing to `:GoDef` +* Fix `:GoFmt` not picking up the correct GOPATH when the fmt command was set to `goimports` +* Fix and simplify README.md, add Wiki reference +* Fixed tagbar integration to show correct imports. + + +## 1.0.5 (May 26, 2015) + +FEATURES: +* A new `:GoOracleScope` is added to change the oracle scope on-the-fly. It + accepts import paths as arguments. If no arguments are passed it prints the + current custom oracle scope. `:GoOracleScope` also supports completion of + import paths, so it's very fast and handy to use. `:GoOracleScope ""` clears + the current custom scope. +* A new `:GoPath` command that displays the current `GOPATH`. A path can be + passed to change the `GOPATH` (i.e `:GoPath ~/foo/src`). `:GoPath ""` clears + and resets the `GOPATH` to the initial value. +* A new "autodetect GOPATH" feature is added. This automatically detects if the + project is using `godep` or is under a `src` root directory which is not in + `GOPATH` and changes/modifies the `GOPATH` so all commands work based on this + GOPATH. What this means is, commands such as `:GoDef`, `:GoBuild`, etc.. will + include the Godeps folder. For example any go-to-definition via `:GoDef` will + jump to the source code inside Godeps. This is enabled by default, but can + disabled with `let g:go_autodetect_gopath = 0`. This new feature is also the + foundation for other tools such as `gb` or `wgo`. + +IMPROVEMENTS: +* Improve `:GoFmt` (gofmt and goimports) speed. Now it's 2x faster than the previous implementation. +* Add Dispatch support for `:GoBuild` and `:GoRun`. For more info about + dispatch see https://github.com/tpope/vim-dispatch . By default it's + disabled, to enable it add `let g:go_dispatch_enabled = 1` to your vimrc. +* Add support for the bang `!` attribute for all `go` tool commands. What this + does it, if `:GoBuild` is called it will jump to the error. But `:GoBuild!` + will not jump to any error. This has the same behavior as the internal + `:make` command in vim. We had this feature already for `:GoBuild` and + `:GoRun`. But not for `:GoInstall`, `:GoTest`, etc.. Now all commands are + unified. +* Add autojump to error for `:GoInstall`. +* Add autowrite feature for `:GoInstall`, `:GoTestXXX` functions and `:GoVet` +* Support `git url..insteadOf` and custom import paths of binaries. This + improves the commands `:GoInstallBinaries` and `:GoUpdateBinaries`. +* Add support for highlighting go templates with `*.tmpl` extensions. Based on + the work from @cespare from https://github.com/cespare/vim-go-templates + +BUG FIXES: +* Fix clearing the status bar when `:GoErrCheck` is called +* Fix godocNotFound to not match 'os' pkg contents. This improves the command + `:GoDoc` +* Fix parsing and jumping to error locations when used Vim from a different + directory than the current buffer's directory +* Fix completion showing duplicates paths for completion results, such as + github.com/fatih/color and github.com/fatih/color/. + +## 1.0.4 (Apr 28, 2015) + +FEATURES: + +* A new `:GoTestFunc` command (with appropriate + mappings) is added. Run tests function which surrounds the current cursor + location. Useful to test single tests. +* Highlight all Go operators. Previously not all + operators were highlighted. As previously, to highlight options, enable it + with by setting `g:go_highlight_operators` to 1 in your vimrc. + +IMPROVEMENTS: + +* Improved certain `:GoDoc` usages to show a better error message +* Improved `:GoRename` to have a default value for rename input. Avoids retyping similar words. +* Synced with latest Oracle version. `callgraph` is removed. +* Removed our custom referrers mode. New version of oracle now displays the matching lines. + +BUG FIXES: + +* Fixed the internal `executeInDir` function which was failing when ignorelist was not set properly. +* Fixed trailing slash for package completion with `:GoImport` +* Fixed paths in error list for Windows users. +* Fixed not showing "import cycle not allowed" error message when called `:GoBuild` or `:GoRun` +* Fixed users using vimproc requiring arguments to functions to be escaped. +* Fixed depth for test snippets +* Fixed neosnippet support loading snippet files the second time if necessary. + +## 1.0.3 (Mar 7, 2015) + +FEATURES: +* A new `:GoTestCompile` command (with appropriate mappings) is added. Useful to compile a test binary or show/fix compile errors in quickfix window + +IMPROVEMENTS: +* `referrer` mode is improved to show referring lines in the quickfix window +* A new `errt` snippet is added, which expands to `if err != nil { t.Fatal(err) }` +* A new `errh` snippet is added, useful to be used in a `http.Handler` +* UltiSnips snippets are improved to take advance of Vim's `Visual` mode. For example selecting a block and typing `if` will create an if scope around the block. +* Cleanup README.md + +BUG FIXES: +* Fix trimming brackets if completion was invoked on a previous completion +* Fix Oracle scope settings. Added docs about usage. +* Fixed previously broken `var` and `vars` snippets +* Fix duplicate docs +* Fix fallback binary path for Windows users. The fallback mechanism is used to discover the necessary Go tools, such as `godef`, `gocode`, etc... + +## 1.0.2 (Feb 17, 2015) + +FEATURES: + +* New snippets are added, mostly for testing ( [changes](https://github.com/fatih/vim-go/pull/321/files)) + +IMPROVEMENTS: + +* Enable all Oracle commands. Docs, mappings and commands are also added. It uses Quickfix list instead of a custom UI. +* Clarify installation process in Readme, add instructions for vim-plug, NeoBundle and manual. + +BUG FIXES: + +* Fix shiftwidth parsing, it was broken in the previous release for old Vim versions +* Fix experimantal mode + + +## 1.0.1 (Feb 9, 2015) + +FEATURES: + +* New feature to highlight build constraints (disabled by default) + +IMPROVEMENTS: + +* Updated godef import path +* Updated Readme for possible problems with `csh` +* Documentation for text objects are updated, typo fixes are merged +* If vimproc is installed, Windows users will use it for autocompletion +* Improve UltiSnips snippets to pick Visual selection (demo: http://quick.as/0dvigz5) +* Packages with extensions, like "gopkg.in/yaml.v2" can be now displayed +* Packages with different import paths, like "github.com/bitly/go-simplejson" can be now displayed + +BUG FIXES: + +* Fatal errors are now parsed successfully and populated to quickfix list +* Shiftwidth is changed to use shiftwidth() function. Fixes usage with plugins like vim-sleuth and possible mis usage (like setting shiftwidth to zero) +* Added a new [Donation](https://github.com/fatih/vim-go#donations) section to Readme, for those who ask for it. +* Fix parsing of errcheck error syntax +* Fix consistency between Neosnippet and UltiSnips snippets + + +## 1.0 (Dec 24, 2014) + +We don't tag any changes or releases, so let's start with `1.0`. Our Windows +support is now in a good shape, tons of bugs are fixed, many new features and +improvements is being added and it's getting better with each day (thanks to +the community contributions). + +## 0.0 (Mar 24, 2014) + +Initial commit: https://github.com/fatih/vim-go/commit/78c5caa82c111c50e9c219f222d65b07694f8f5a diff --git a/sources_non_forked/vim-go/README.md b/sources_non_forked/vim-go/README.md index 7fdd1c91..864acfbe 100644 --- a/sources_non_forked/vim-go/README.md +++ b/sources_non_forked/vim-go/README.md @@ -59,6 +59,11 @@ Official documentation can be found under [doc/vim-go.txt](doc/vim-go.txt). You ``` :help vim-go ``` + +Depending on your installation, you may have to generate the plugin's [help +tags](https://github.com/vim/vim/blob/v8.0.0711/runtime/doc/helphelp.txt#L206-L227) +manually (eg. `:helptags ALL`). + We also have an [official vim-go tutorial](https://github.com/fatih/vim-go-tutorial). diff --git a/sources_non_forked/vim-go/autoload/go/def.vim b/sources_non_forked/vim-go/autoload/go/def.vim index 0c669b78..d8f77c21 100644 --- a/sources_non_forked/vim-go/autoload/go/def.vim +++ b/sources_non_forked/vim-go/autoload/go/def.vim @@ -25,7 +25,8 @@ function! go#def#Jump(mode) abort let $GOPATH = old_gopath return endif - let command = printf("%s -f=%s -o=%s -t", bin_path, fname, go#util#OffsetCursor()) + let command = printf("%s -f=%s -o=%s -t", go#util#Shellescape(bin_path), + \ go#util#Shellescape(fname), go#util#OffsetCursor()) let out = go#util#System(command) if exists("l:tmpname") call delete(l:tmpname) @@ -96,6 +97,7 @@ function! s:jump_to_declaration_cb(mode, bin_name, job, exit_status, data) abort endif call go#def#jump_to_declaration(a:data[0], a:mode, a:bin_name) + call go#util#EchoSuccess(fnamemodify(a:data[0], ":t")) endfunction function! go#def#jump_to_declaration(out, mode, bin_name) abort @@ -153,9 +155,11 @@ function! go#def#jump_to_declaration(out, mode, bin_name) abort endif if a:mode == "tab" - let &switchbuf = "usetab" + let &switchbuf = "useopen,usetab,newtab" if bufloaded(filename) == 0 tab split + else + let cmd = 'sbuf' endif elseif a:mode == "split" split @@ -164,7 +168,7 @@ function! go#def#jump_to_declaration(out, mode, bin_name) abort endif " open the file and jump to line and column - exec cmd filename + exec cmd fnameescape(filename) endif endif call cursor(line, col) diff --git a/sources_non_forked/vim-go/autoload/go/doc.vim b/sources_non_forked/vim-go/autoload/go/doc.vim index a9f96b2f..a818f98e 100644 --- a/sources_non_forked/vim-go/autoload/go/doc.vim +++ b/sources_non_forked/vim-go/autoload/go/doc.vim @@ -58,17 +58,21 @@ function! go#doc#OpenBrowser(...) abort endfunction function! go#doc#Open(newmode, mode, ...) abort + " With argument: run "godoc [arg]". if len(a:000) - " check if we have 'godoc' and use it automatically let bin_path = go#path#CheckBinPath('godoc') if empty(bin_path) return endif - let command = printf("%s %s", bin_path, join(a:000, ' ')) + let command = printf("%s %s", go#util#Shellescape(bin_path), join(a:000, ' ')) let out = go#util#System(command) + " Without argument: run gogetdoc on cursor position. else let out = s:gogetdoc(0) + if out == -1 + return + endif endif if go#util#ShellError() != 0 @@ -137,7 +141,7 @@ function! s:gogetdoc(json) abort return -1 endif - let cmd = [bin_path] + let cmd = [go#util#Shellescape(bin_path)] let offset = go#util#OffsetCursor() let fname = expand("%:p:gs!\\!/!") diff --git a/sources_non_forked/vim-go/autoload/go/fmt.vim b/sources_non_forked/vim-go/autoload/go/fmt.vim index 66dbecd7..079b918f 100644 --- a/sources_non_forked/vim-go/autoload/go/fmt.vim +++ b/sources_non_forked/vim-go/autoload/go/fmt.vim @@ -69,7 +69,10 @@ function! go#fmt#Format(withGoimport) abort let bin_name = "goimports" endif + let current_col = col('.') let out = go#fmt#run(bin_name, l:tmpname, expand('%')) + let diff_offset = len(readfile(l:tmpname)) - line('$') + if go#util#ShellError() == 0 call go#fmt#update_file(l:tmpname, expand('%')) elseif g:go_fmt_fail_silently == 0 @@ -95,6 +98,9 @@ function! go#fmt#Format(withGoimport) abort " Restore our cursor/windows positions. call winrestview(l:curw) endif + + " be smart and jump to the line the new statement was added/removed + call cursor(line('.') + diff_offset, current_col) endfunction " update_file updates the target file with the given formatted source @@ -116,15 +122,25 @@ function! go#fmt#update_file(source, target) endif " reload buffer to reflect latest changes - silent! edit! + silent edit! let &fileformat = old_fileformat let &syntax = &syntax + + " the title information was introduced with 7.4-2200 + " https://github.com/vim/vim/commit/d823fa910cca43fec3c31c030ee908a14c272640 + if !has('patch-7.4-2200') + return + endif + " clean up previous location list - let l:listtype = "locationlist" - call go#list#Clean(l:listtype) - call go#list#Window(l:listtype) + let l:list_title = getqflist({'title': 1}) + if has_key(l:list_title, "title") && l:list_title['title'] == "Format" + let l:listtype = go#list#Type("quickfix") + call go#list#Clean(l:listtype) + call go#list#Window(l:listtype) + endif endfunction " run runs the gofmt/goimport command for the given source file and returns @@ -166,9 +182,10 @@ function! s:fmt_cmd(bin_name, source, target) endif " start constructing the command + let bin_path = go#util#Shellescape(bin_path) let cmd = [bin_path] call add(cmd, "-w") - + " add the options for binary (if any). go_fmt_options was by default of type " string, however to allow customization it's now a dictionary of binary " name mapping to options. @@ -228,7 +245,7 @@ endfunction " show_errors opens a location list and shows the given errors. If the given " errors is empty, it closes the the location list function! s:show_errors(errors) abort - let l:listtype = go#list#Type("locationlist") + let l:listtype = go#list#Type("quickfix") if !empty(a:errors) call go#list#Populate(l:listtype, a:errors, 'Format') echohl Error | echomsg "Gofmt returned error" | echohl None diff --git a/sources_non_forked/vim-go/autoload/go/impl.vim b/sources_non_forked/vim-go/autoload/go/impl.vim index 4bbceeb2..940376bf 100644 --- a/sources_non_forked/vim-go/autoload/go/impl.vim +++ b/sources_non_forked/vim-go/autoload/go/impl.vim @@ -33,7 +33,7 @@ function! go#impl#Impl(...) abort return endif - let result = go#util#System(printf("%s '%s' '%s'", binpath, recv, iface)) + let result = go#util#System(join(go#util#Shelllist([binpath, recv, iface], ' '))) if go#util#ShellError() != 0 call go#util#EchoError(result) return diff --git a/sources_non_forked/vim-go/autoload/go/job.vim b/sources_non_forked/vim-go/autoload/go/job.vim index 6fb03af7..58410eda 100644 --- a/sources_non_forked/vim-go/autoload/go/job.vim +++ b/sources_non_forked/vim-go/autoload/go/job.vim @@ -31,10 +31,6 @@ function go#job#Spawn(args) endfunction function cbs.exit_cb(job, exitval) dict - if has_key(self, 'custom_cb') - call self.custom_cb(a:job, a:exitval, self.messages) - endif - if has_key(self, 'error_info_cb') call self.error_info_cb(a:job, a:exitval, self.messages) endif @@ -47,6 +43,10 @@ function go#job#Spawn(args) endif endif + if has_key(self, 'custom_cb') + call self.custom_cb(a:job, a:exitval, self.messages) + endif + let l:listtype = go#list#Type("quickfix") if a:exitval == 0 call go#list#Clean(l:listtype) diff --git a/sources_non_forked/vim-go/autoload/go/keyify.vim b/sources_non_forked/vim-go/autoload/go/keyify.vim index 32b30c61..4c47fd9b 100644 --- a/sources_non_forked/vim-go/autoload/go/keyify.vim +++ b/sources_non_forked/vim-go/autoload/go/keyify.vim @@ -10,7 +10,8 @@ function! go#keyify#Keyify() endif " Get result of command as json, that contains `start`, `end` and `replacement` - let command = printf("%s -json %s:#%s", bin_path, fname, go#util#OffsetCursor()) + let command = printf("%s -json %s:#%s", go#util#Shellescape(bin_path), + \ go#util#Shellescape(fname), go#util#OffsetCursor()) let output = go#util#System(command) silent! let result = json_decode(output) diff --git a/sources_non_forked/vim-go/autoload/go/lint.vim b/sources_non_forked/vim-go/autoload/go/lint.vim index c876af68..f1202834 100644 --- a/sources_non_forked/vim-go/autoload/go/lint.vim +++ b/sources_non_forked/vim-go/autoload/go/lint.vim @@ -121,9 +121,10 @@ function! go#lint#Golint(...) abort if empty(bin_path) return endif + let bin_path = go#util#Shellescape(bin_path) if a:0 == 0 - let out = go#util#System(bin_path) + let out = go#util#System(bin_path . " " . go#util#Shellescape(go#package#ImportPath())) else let out = go#util#System(bin_path . " " . go#util#Shelljoin(a:000)) endif @@ -146,9 +147,9 @@ function! go#lint#Vet(bang, ...) abort call go#cmd#autowrite() echon "vim-go: " | echohl Identifier | echon "calling vet..." | echohl None if a:0 == 0 - let out = go#tool#ExecuteInDir('go vet') + let out = go#util#System('go vet ' . go#util#Shellescape(go#package#ImportPath())) else - let out = go#tool#ExecuteInDir('go tool vet ' . go#util#Shelljoin(a:000)) + let out = go#util#System('go tool vet ' . go#util#Shelljoin(a:000)) endif let l:listtype = "quickfix" @@ -188,7 +189,7 @@ function! go#lint#Errcheck(...) abort echon "vim-go: " | echohl Identifier | echon "errcheck analysing ..." | echohl None redraw - let command = bin_path . ' -abspath ' . import_path + let command = go#util#Shellescape(bin_path) . ' -abspath ' . import_path let out = go#tool#ExecuteInDir(command) let l:listtype = "quickfix" diff --git a/sources_non_forked/vim-go/autoload/go/list.vim b/sources_non_forked/vim-go/autoload/go/list.vim index 6baba638..cbded90b 100644 --- a/sources_non_forked/vim-go/autoload/go/list.vim +++ b/sources_non_forked/vim-go/autoload/go/list.vim @@ -3,8 +3,10 @@ if !exists("g:go_list_type") endif " Window opens the list with the given height up to 10 lines maximum. -" Otherwise g:go_loclist_height is used. If no or zero height is given it -" closes the window +" Otherwise g:go_loclist_height is used. +" +" If no or zero height is given it closes the window by default. +" To prevent this, set g:go_list_autoclose = 0 function! go#list#Window(listtype, ...) abort let l:listtype = go#list#Type(a:listtype) " we don't use lwindow to close the location list as we need also the @@ -13,10 +15,13 @@ function! go#list#Window(listtype, ...) abort " location list increases/decreases, cwindow will not resize when a new " updated height is passed. lopen in the other hand resizes the screen. if !a:0 || a:1 == 0 - if l:listtype == "locationlist" - lclose - else - cclose + let autoclose_window = get(g:, 'go_list_autoclose', 1) + if autoclose_window + if l:listtype == "locationlist" + lclose + else + cclose + endif endif return endif diff --git a/sources_non_forked/vim-go/autoload/go/path.vim b/sources_non_forked/vim-go/autoload/go/path.vim index 17700b89..ec87e469 100644 --- a/sources_non_forked/vim-go/autoload/go/path.vim +++ b/sources_non_forked/vim-go/autoload/go/path.vim @@ -83,8 +83,16 @@ function! go#path#Detect() abort " fetched from a customizable list. The user should define any new package " management tool by it's own. - " src folder outside $GOPATH - let src_root = finddir("src", current_dir .";") + " src folders outside $GOPATH + let src_roots = finddir("src", current_dir .";", -1) + + " for cases like GOPATH/src/foo/src/bar, pick up GOPATH/src instead of + " GOPATH/src/foo/src + let src_root = "" + if len(src_roots) > 0 + let src_root = src_roots[-1] + endif + if !empty(src_root) let src_path = fnamemodify(src_root, ':p:h:h') . go#util#PathSep() @@ -129,6 +137,9 @@ function! go#path#BinPath() abort let bin_path = $GOBIN else let go_paths = split(go#path#Default(), go#util#PathListSep()) + if len(go_paths) == 0 + return "" "nothing found + endif let bin_path = expand(go_paths[0] . "/bin/") endif @@ -157,6 +168,11 @@ function! go#path#CheckBinPath(binpath) abort let binpath = exepath(binpath) endif let $PATH = old_path + + if go#util#IsUsingCygwinShell() == 1 + return go#path#CygwinPath(binpath) + endif + return binpath endif @@ -173,18 +189,15 @@ function! go#path#CheckBinPath(binpath) abort let $PATH = old_path - " When you are using: - " 1) Windows system - " 2) Has cygpath executable - " 3) Use *sh* as 'shell' - " - " This converts your to $(cygpath '') to make cygwin working in - " shell of cygwin way - if go#util#IsWin() && executable('cygpath') && &shell !~ '.*sh.*' - return printf("$(cygpath '%s')", a:bin_path) - endif + if go#util#IsUsingCygwinShell() == 1 + return go#path#CygwinPath(a:binpath) + endif return go_bin_path . go#util#PathSep() . basename endfunction +function! go#path#CygwinPath(path) + return substitute(a:path, '\\', '/', "g") +endfunction + " vim: sw=2 ts=2 et diff --git a/sources_non_forked/vim-go/autoload/go/tags.vim b/sources_non_forked/vim-go/autoload/go/tags.vim index fecf52e3..5152de9e 100644 --- a/sources_non_forked/vim-go/autoload/go/tags.vim +++ b/sources_non_forked/vim-go/autoload/go/tags.vim @@ -1,12 +1,6 @@ +" mapped to :GoAddTags function! go#tags#Add(start, end, count, ...) abort let fname = fnamemodify(expand("%"), ':p:gs?\\?/?') - if &modified - " Write current unsaved buffer to a temp file and use the modified content - let l:tmpname = tempname() - call writefile(getline(1, '$'), l:tmpname) - let fname = l:tmpname - endif - let offset = 0 if a:count == -1 let offset = go#util#OffsetCursor() @@ -14,22 +8,11 @@ function! go#tags#Add(start, end, count, ...) abort let test_mode = 0 call call("go#tags#run", [a:start, a:end, offset, "add", fname, test_mode] + a:000) - - " if exists, delete it as we don't need it anymore - if exists("l:tmpname") - call delete(l:tmpname) - endif endfunction +" mapped to :GoRemoveTags function! go#tags#Remove(start, end, count, ...) abort let fname = fnamemodify(expand("%"), ':p:gs?\\?/?') - if &modified - " Write current unsaved buffer to a temp file and use the modified content - let l:tmpname = tempname() - call writefile(getline(1, '$'), l:tmpname) - let fname = l:tmpname - endif - let offset = 0 if a:count == -1 let offset = go#util#OffsetCursor() @@ -37,11 +20,6 @@ function! go#tags#Remove(start, end, count, ...) abort let test_mode = 0 call call("go#tags#run", [a:start, a:end, offset, "remove", fname, test_mode] + a:000) - - " if exists, delete it as we don't need it anymore - if exists("l:tmpname") - call delete(l:tmpname) - endif endfunction " run runs gomodifytag. This is an internal test so we can test it @@ -49,6 +27,10 @@ function! go#tags#run(start, end, offset, mode, fname, test_mode, ...) abort " do not split this into multiple lines, somehow tests fail in that case let args = {'mode': a:mode,'start': a:start,'end': a:end,'offset': a:offset,'fname': a:fname,'cmd_args': a:000} + if &modified + let args["modified"] = 1 + endif + let result = s:create_cmd(args) if has_key(result, 'err') call go#util#EchoError(result.err) @@ -57,8 +39,15 @@ function! go#tags#run(start, end, offset, mode, fname, test_mode, ...) abort let command = join(result.cmd, " ") - call go#cmd#autowrite() - let out = go#util#System(command) + if &modified + let filename = expand("%:p:gs!\\!/!") + let content = join(go#util#GetLines(), "\n") + let in = filename . "\n" . strlen(content) . "\n" . content + let out = go#util#System(command, in) + else + let out = go#util#System(command) + endif + if go#util#ShellError() != 0 call go#util#EchoError(out) return @@ -103,6 +92,16 @@ func s:write_out(out) abort call setline(line, lines[index]) let index += 1 endfor + + if has_key(result, 'errors') + let l:winnr = winnr() + let l:listtype = go#list#Type("quickfix") + call go#list#ParseFormat(l:listtype, "%f:%l:%c:%m", result['errors'], "gomodifytags") + call go#list#Window(l:listtype, len(result['errors'])) + + "prevent jumping to quickfix list + exe l:winnr . "wincmd w" + endif endfunc @@ -116,6 +115,7 @@ func s:create_cmd(args) abort if empty(bin_path) return {'err': "gomodifytags does not exist"} endif + let bin_path = go#util#Shellescape(bin_path) let l:start = a:args.start let l:end = a:args.end @@ -127,9 +127,13 @@ func s:create_cmd(args) abort " start constructing the command let cmd = [bin_path] call extend(cmd, ["-format", "json"]) - call extend(cmd, ["-file", a:args.fname]) + call extend(cmd, ["-file", go#util#Shellescape(a:args.fname)]) call extend(cmd, ["-transform", l:modifytags_transform]) + if has_key(a:args, "modified") + call add(cmd, "-modified") + endif + if l:offset != 0 call extend(cmd, ["-offset", l:offset]) else diff --git a/sources_non_forked/vim-go/autoload/go/template.vim b/sources_non_forked/vim-go/autoload/go/template.vim index 18a78597..8fe9d1d5 100644 --- a/sources_non_forked/vim-go/autoload/go/template.vim +++ b/sources_non_forked/vim-go/autoload/go/template.vim @@ -21,7 +21,7 @@ function! go#template#create() abort let l:template_file = get(g:, 'go_template_file', "hello_world.go") endif let l:template_path = go#util#Join(l:root_dir, "templates", l:template_file) - exe '0r ' . fnameescape(l:template_path) + silent exe '0r ' . fnameescape(l:template_path) elseif l:package_name == -1 && l:go_template_use_pkg == 1 " cwd is now the dir of the package let l:path = fnamemodify(getcwd(), ':t') @@ -33,9 +33,6 @@ function! go#template#create() abort endif $delete _ - " Remove the '... [New File]' message line from the command line - echon - execute cd . fnameescape(dir) endfunction diff --git a/sources_non_forked/vim-go/autoload/go/tool.vim b/sources_non_forked/vim-go/autoload/go/tool.vim index 99577f4e..3ede64e5 100644 --- a/sources_non_forked/vim-go/autoload/go/tool.vim +++ b/sources_non_forked/vim-go/autoload/go/tool.vim @@ -1,11 +1,42 @@ -function! go#tool#Files() abort - if go#util#IsWin() - let format = '{{range $f := .GoFiles}}{{$.Dir}}\{{$f}}{{printf \"\n\"}}{{end}}{{range $f := .CgoFiles}}{{$.Dir}}\{{$f}}{{printf \"\n\"}}{{end}}' - else - let format = "{{range $f := .GoFiles}}{{$.Dir}}/{{$f}}{{printf \"\\n\"}}{{end}}{{range $f := .CgoFiles}}{{$.Dir}}/{{$f}}{{printf \"\\n\"}}{{end}}" +" From "go list -h". +function! go#tool#ValidFiles(...) + let l:list = ["GoFiles", "CgoFiles", "IgnoredGoFiles", "CFiles", "CXXFiles", + \ "MFiles", "HFiles", "FFiles", "SFiles", "SwigFiles", "SwigCXXFiles", + \ "SysoFiles", "TestGoFiles", "XTestGoFiles"] + + " Used as completion + if len(a:000) > 0 + let l:list = filter(l:list, 'strpart(v:val, 0, len(a:1)) == a:1') endif - let command = 'go list -f '.shellescape(format) - let out = go#tool#ExecuteInDir(command) + + return l:list +endfunction + +function! go#tool#Files(...) abort + if len(a:000) > 0 + let source_files = a:000 + else + let source_files = ['GoFiles'] + endif + + let combined = '' + for sf in source_files + " Strip dot in case people used ":GoFiles .GoFiles". + let sf = substitute(sf, '^\.', '', '') + + " Make sure the passed options are valid. + if index(go#tool#ValidFiles(), sf) == -1 + echoerr "unknown source file variable: " . sf + endif + + if go#util#IsWin() + let combined .= '{{range $f := .' . sf . '}}{{$.Dir}}\{{$f}}{{printf \"\n\"}}{{end}}{{range $f := .CgoFiles}}{{$.Dir}}\{{$f}}{{printf \"\n\"}}{{end}}' + else + let combined .= "{{range $f := ." . sf . "}}{{$.Dir}}/{{$f}}{{printf \"\\n\"}}{{end}}{{range $f := .CgoFiles}}{{$.Dir}}/{{$f}}{{printf \"\\n\"}}{{end}}" + endif + endfor + + let out = go#tool#ExecuteInDir('go list -f ' . shellescape(combined)) return split(out, '\n') endfunction diff --git a/sources_non_forked/vim-go/autoload/go/util.vim b/sources_non_forked/vim-go/autoload/go/util.vim index 1d818ea1..d35783f3 100644 --- a/sources_non_forked/vim-go/autoload/go/util.vim +++ b/sources_non_forked/vim-go/autoload/go/util.vim @@ -43,6 +43,14 @@ function! go#util#IsWin() abort return 0 endfunction + " Checks if using: + " 1) Windows system, + " 2) And has cygpath executable, + " 3) And uses *sh* as 'shell' +function! go#util#IsUsingCygwinShell() + return go#util#IsWin() && executable('cygpath') && &shell =~ '.*sh.*' +endfunction + function! go#util#has_job() abort " job was introduced in 7.4.xxx however there are multiple bug fixes and one " of the latest is 8.0.0087 which is required for a stable async API. @@ -102,7 +110,7 @@ function! go#util#osarch() abort return go#util#env("goos") . '_' . go#util#env("goarch") endfunction -" System runs a shell command. If possible, it will temporary set +" System runs a shell command. If possible, it will temporary set " the shell to /bin/sh for Unix-like systems providing a Bourne " POSIX like environment. function! go#util#System(str, ...) abort diff --git a/sources_non_forked/vim-go/doc/vim-go.txt b/sources_non_forked/vim-go/doc/vim-go.txt index d47b1b9f..1b0e575e 100644 --- a/sources_non_forked/vim-go/doc/vim-go.txt +++ b/sources_non_forked/vim-go/doc/vim-go.txt @@ -167,7 +167,8 @@ COMMANDS *go-commands* *:GoLint* :GoLint [packages] - Run golint for the current directory, or for given packages. + Run golint for the directory under your current file, or for the given + packages. *:GoDoc* :GoDoc [word] @@ -436,18 +437,22 @@ CTRL-t Check for unchecked errors in you current package. Errors are populated in the quickfix window. - You may optionally pass any valid errcheck flags/options. For a full list - please see `errcheck -h`. + You may optionally pass any valid errcheck flags/options. See + `errcheck -h` for a full list. *:GoFiles* -:GoFiles +:GoFiles [source_files] - Show source files that depends for the current package + Show source files for the current package. The [source_files] specifies + which file types to list. See the "// Source files" section of + `go list -h` for possible values; multiple values are accepted. + Command-line completion also works for this command. + The default is to use `GoFiles` if no arguments are given. *:GoDeps* :GoDeps - Show dependencies for the current package + Show dependencies for the current package. *:GoInstallBinaries* :GoInstallBinaries @@ -1129,7 +1134,7 @@ The dictionary version allows you to define options for multiple binaries: < *'g:go_fmt_fail_silently'* -Use this option to disable showing a location list when |'g:go_fmt_command'| +Use this option to disable showing a quickfix list when |'g:go_fmt_command'| fails. By default the location list is shown. > let g:go_fmt_fail_silently = 0 @@ -1163,7 +1168,7 @@ Maximum height for the GoDoc window created with |:GoDoc|. Default is 20. > Use this option to define the command to be used for |:GoDef|. By default `guru` is being used as it covers all edge cases. But one might also use -`godef` as it's more faster. Current valid options are: `[guru, godef]` > +`godef` as it's faster. Current valid options are: `[guru, godef]` > let g:go_def_mode = 'guru' < @@ -1419,6 +1424,16 @@ Supported values are "", "quickfix", and "locationlist". > let g:go_list_type = "" < + + *'g:go_list_autoclose'* + +Specifies whether the quickfix/location list should be closed automatically +in the absence of errors. The default value is 1. +If you prefer to keep a long running error window open, you can disable +this by setting the value to 0. +> + let g:go_list_autoclose = 1 +< *'g:go_asmfmt_autosave'* Use this option to auto |:AsmFmt| on save. By default it's disabled. > @@ -1574,7 +1589,6 @@ default it's 60 seconds. Must be in milliseconds. > let g:go_statusline_duration = 60000 < - *'g:go_addtags_transform'* Sets the `transform` option for `gomodifytags` when using |:GoAddTags| or if @@ -1598,6 +1612,28 @@ By default "snakecase" is used. Current values are: ["snakecase", > let g:go_addtags_transform = 'snakecase' < + *'g:go_fold_enable'* + +Control syntax-based folding which takes effect when 'foldmethod' is set to +`syntax`. +You can enable specific fold regions by setting an array. Possible values are: + +- "block" `{` .. `}` blocks. +- "import" `import` block. +- "varconst" `var` and `const` blocks. + +By default they're all enabled: +> + let g:go_fold_enable = ['block', 'import', 'varconst'] +< +Enable folding of only imports: +> + let g:go_fold_enable = ['import'] +< +Disable everything (same as not setting 'foldmethod' to `syntax`): +> + let g:go_fold_enable = [] +< ============================================================================== DEVELOPMENT *go-development* @@ -1669,6 +1705,25 @@ example sometimes code.google.com times out. To test, just execute a simple You'll see a more detailed error. If this works, vim-go will work too. +I want to use a different binary name than "go", can I do this?~ + +There is no way to directly configure the binary name; but you can use a +wrapper script; for example if you would like to run `goapp` instead of `go`: + +1. In `~/gobin/go` (remember to make it executable): +> + #!/bin/sh + # Remove gobin from PATH and run goapp. + PATH=${PATH#$HOME/gobin} goapp "$@" +< +2. Start Vim with `~/gobin` as the first `PATH` entry so it will use the + wrapper script: +> + PATH="$HOME/gobin/:$PATH" vim +< + Alternatively you you could set `$PATH` in your vimrc with an |:autocmd|. + + How do I use vim-go with syntastic?~ Sometimes when using both `vim-go` and `syntastic` Vim will start lagging diff --git a/sources_non_forked/vim-go/ftplugin/go/commands.vim b/sources_non_forked/vim-go/ftplugin/go/commands.vim index b0cb7760..66d4e5ba 100644 --- a/sources_non_forked/vim-go/ftplugin/go/commands.vim +++ b/sources_non_forked/vim-go/ftplugin/go/commands.vim @@ -23,7 +23,7 @@ command! -nargs=* -range GoAddTags call go#tags#Add(, , , < command! -nargs=* -range GoRemoveTags call go#tags#Remove(, , , ) " -- tool -command! -nargs=0 GoFiles echo go#tool#Files() +command! -nargs=* -complete=customlist,go#tool#ValidFiles GoFiles echo go#tool#Files() command! -nargs=0 GoDeps echo go#tool#Deps() command! -nargs=* GoInfo call go#tool#Info(0) command! -nargs=0 GoAutoTypeInfoToggle call go#complete#ToggleAutoTypeInfo() diff --git a/sources_non_forked/vim-go/syntax/go.vim b/sources_non_forked/vim-go/syntax/go.vim index 187ba67c..ec1c6955 100644 --- a/sources_non_forked/vim-go/syntax/go.vim +++ b/sources_non_forked/vim-go/syntax/go.vim @@ -89,12 +89,32 @@ if !exists("g:go_highlight_generate_tags") let g:go_highlight_generate_tags = 0 endif +let s:fold_block = 1 +let s:fold_import = 1 +let s:fold_varconst = 1 +if exists("g:go_fold_enable") + if index(g:go_fold_enable, 'block') == -1 + let s:fold_block = 0 + endif + if index(g:go_fold_enable, 'import') == -1 + let s:fold_import = 0 + endif + if index(g:go_fold_enable, 'varconst') == -1 + let s:fold_varconst = 0 + endif +endif + syn case match -syn keyword goDirective package import -syn keyword goDeclaration var const +syn keyword goPackage package +syn keyword goImport import contained +syn keyword goVar var contained +syn keyword goConst const contained -hi def link goDirective Statement +hi def link goPackage Statement +hi def link goImport Statement +hi def link goVar Keyword +hi def link goConst Keyword hi def link goDeclaration Keyword " Keywords within functions @@ -189,8 +209,35 @@ syn region goCharacter start=+'+ skip=+\\\\\|\\'+ end=+'+ contains= hi def link goCharacter Character " Regions -syn region goBlock start="{" end="}" transparent fold syn region goParen start='(' end=')' transparent +if s:fold_block + syn region goBlock start="{" end="}" transparent fold +else + syn region goBlock start="{" end="}" transparent +endif + +" import +if s:fold_import + syn region goImport start='import (' end=')' transparent fold contains=goImport,goString,goComment +else + syn region goImport start='import (' end=')' transparent contains=goImport,goString,goComment +endif + +" var, const +if s:fold_varconst + syn region goVar start='var (' end='^\s*)$' transparent fold + \ contains=ALLBUT,goParen,goBlock,goFunction,goTypeName,goReceiverType,goReceiverVar + syn region goConst start='const (' end='^\s*)$' transparent fold + \ contains=ALLBUT,goParen,goBlock,goFunction,goTypeName,goReceiverType,goReceiverVar +else + syn region goVar start='var (' end='^\s*)$' transparent + \ contains=ALLBUT,goParen,goBlock,goFunction,goTypeName,goReceiverType,goReceiverVar + syn region goConst start='const (' end='^\s*)$' transparent + \ contains=ALLBUT,goParen,goBlock,goFunction,goTypeName,goReceiverType,goReceiverVar +endif + +" Single-line var, const, and import. +syn match goSingleDecl /\(import\|var\|const\) [^(]\@=/ contains=goImport,goVar,goConst " Integers syn match goDecimalInt "\<-\=\d\+\%([Ee][-+]\=\d\+\)\=\>" @@ -321,7 +368,7 @@ hi def link goField Identifier " Structs & Interfaces; if g:go_highlight_types != 0 - syn match goTypeConstructor /\<\w\+{\@=/he=e-1 + syn match goTypeConstructor /\<\w\+{\@=/ syn match goTypeDecl /\/ nextgroup=goTypeName skipwhite skipnl syn match goTypeName /\w\+/ contained nextgroup=goDeclType skipwhite skipnl syn match goDeclType /\<\(interface\|struct\)\>/ skipwhite skipnl diff --git a/sources_non_forked/vim-multiple-cursors/autoload/multiple_cursors.vim b/sources_non_forked/vim-multiple-cursors/autoload/multiple_cursors.vim index 1e7a5f50..36d267ff 100644 --- a/sources_non_forked/vim-multiple-cursors/autoload/multiple_cursors.vim +++ b/sources_non_forked/vim-multiple-cursors/autoload/multiple_cursors.vim @@ -100,6 +100,17 @@ function! multiple_cursors#get_latency_debug_file() return s:latency_debug_file endfunction + +function! s:fire_pre_triggers() + if !s:before_function_called + doautocmd User MultipleCursorsPre + if exists('*Multiple_cursors_before') + exe "call Multiple_cursors_before()" + endif + let s:before_function_called = 1 + endif +endfunction + " Creates a new cursor. Different logic applies depending on the mode the user " is in and the current state of the buffer. " 1. In normal mode, a new cursor is created at the end of the word under Vim's @@ -111,13 +122,7 @@ endfunction " attempted to be created at the next occurrence of the visual selection function! multiple_cursors#new(mode, word_boundary) " Call before function if exists only once until it is canceled () - if !s:before_function_called - doautocmd User MultipleCursorsPre - if exists('*Multiple_cursors_before') - exe "call Multiple_cursors_before()" - endif - let s:before_function_called = 1 - endif + call s:fire_pre_triggers() let s:use_word_boundary = a:word_boundary if a:mode ==# 'n' " Reset all existing cursors, don't restore view and setting @@ -272,10 +277,7 @@ function! multiple_cursors#find(start, end, pattern) " If we've created any cursors, we need to call the before function, end " function will be called via normal routes - if exists('*Multiple_cursors_before') && !s:before_function_called - exe "call Multiple_cursors_before()" - let s:before_function_called = 1 - endif + call s:fire_pre_triggers() call s:wait_for_user_input('v') endif @@ -1014,13 +1016,28 @@ function! s:get_visual_region(pos) return region endfunction +function! s:strpart(s, i, l) + if a:l == 0 + return '' + endif + let [s, l] = ['', 0] + for c in split(a:s[a:i :], '\zs') + let s .= c + let l += len(c) + if l >= a:l + break + endif + endfor + return s +endfunction + " Return the content of the buffer between the input region. This is used to " find the next match in the buffer " Mode change: Normal -> Normal " Cursor change: None function! s:get_text(region) let lines = getline(a:region[0][0], a:region[1][0]) - let lines[-1] = lines[-1][:a:region[1][1] - 1] + let lines[-1] = s:strpart(lines[-1], 0, a:region[1][1]) let lines[0] = lines[0][a:region[0][1] - 1:] return join(lines, "\n") endfunction diff --git a/sources_non_forked/vim-multiple-cursors/spec/multiple_cursors_spec.rb b/sources_non_forked/vim-multiple-cursors/spec/multiple_cursors_spec.rb index 9f83c219..2d92e5a2 100644 --- a/sources_non_forked/vim-multiple-cursors/spec/multiple_cursors_spec.rb +++ b/sources_non_forked/vim-multiple-cursors/spec/multiple_cursors_spec.rb @@ -1,3 +1,4 @@ +# -*- encoding: utf-8 -*- require 'spec_helper' def set_file_content(string) @@ -797,4 +798,20 @@ describe "Multiple Cursors" do EOF end + specify "#multi-byte strings" do + before <<-EOF + こんにちわビム + 世界の中心でビムを叫ぶ + ビム大好き + EOF + + type '/ビムcヴィム' + + after <<-EOF + こんにちわヴィム + 世界の中心でヴィムを叫ぶ + ヴィム大好き + EOF + end + end diff --git a/sources_non_forked/vim-pyte/colors/pyte.vim b/sources_non_forked/vim-pyte/colors/pyte.vim index 76b53e78..cf81d29a 100644 --- a/sources_non_forked/vim-pyte/colors/pyte.vim +++ b/sources_non_forked/vim-pyte/colors/pyte.vim @@ -34,13 +34,14 @@ hi Cursor guifg=black guibg=#b0b4b8 hi lCursor guifg=black guibg=white hi LineNr guifg=#ffffff guibg=#c0d0e0 -hi Normal guifg=#202020 guibg=#f0f0f0 +hi Normal guifg=#404850 guibg=#f0f0f0 hi StatusLine guifg=white guibg=#8090a0 gui=bold,italic hi StatusLineNC guifg=#506070 guibg=#a0b0c0 gui=italic hi VertSplit guifg=#a0b0c0 guibg=#a0b0c0 gui=NONE -hi Folded guifg=#708090 guibg=#c0d0e0 +" hi Folded guifg=#708090 guibg=#c0d0e0 +hi Folded guifg=#a0a0a0 guibg=#e8e8e8 gui=italic hi NonText guifg=#c0c0c0 guibg=#e0e0e0 " Kommentare @@ -48,7 +49,7 @@ hi Comment guifg=#a0b0c0 gui=italic " Konstanten hi Constant guifg=#a07040 -hi String guifg=#4070a0 +hi String guifg=#4070a0 hi Number guifg=#40a070 hi Float guifg=#70a040 "hi Statement guifg=#0070e0 gui=NONE @@ -80,8 +81,9 @@ hi Special guifg=#70a0d0 gui=italic hi Operator guifg=#408010 -" color of s etc... -hi SpecialKey guifg=#d8a080 guibg=#e8e8e8 gui=italic +" color of s etc... +"hi SpecialKey guifg=#d8a080 guibg=#e8e8e8 gui=italic +hi SpecialKey guifg=#d0b0b0 guibg=#f0f0f0 gui=none " Diff hi DiffChange guifg=NONE guibg=#e0e0e0 gui=italic,bold diff --git a/sources_non_forked/vim-snippets/UltiSnips/django.snippets b/sources_non_forked/vim-snippets/UltiSnips/django.snippets index 8f836288..d6e2d434 100644 --- a/sources_non_forked/vim-snippets/UltiSnips/django.snippets +++ b/sources_non_forked/vim-snippets/UltiSnips/django.snippets @@ -292,25 +292,25 @@ endsnippet snippet createview "Generic Create View" b class ${1:MODEL_NAME}CreateView(CreateView): - model = ${1:MODEL_NAME} + model = $1 template_name = "${2:TEMPLATE_NAME}" endsnippet snippet deleteview "Generic Delete View" b class ${1:MODEL_NAME}DeleteView(DeleteView): - model = ${1:MODEL_NAME} + model = $1 template_name = "${2:TEMPLATE_NAME}" endsnippet snippet detailview "Generic Detail View" b class ${1:MODEL_NAME}DetailView(DetailView): - model = ${1:MODEL_NAME} + model = $1 template_name = "${2:TEMPLATE_NAME}" endsnippet snippet listview "Generic List View" b class ${1:MODEL_NAME}ListView(ListView): - model = ${1:MODEL_NAME} + model = $1 template_name = "${2:TEMPLATE_NAME}" endsnippet @@ -345,7 +345,7 @@ endsnippet snippet updateview "Generic Update View" b class ${1:MODEL_NAME}UpdateView(UpdateView): - model = ${1:MODEL_NAME} + model = $1 template_name = "${2:TEMPLATE_NAME}" endsnippet diff --git a/sources_non_forked/vim-snippets/UltiSnips/elm.snippets b/sources_non_forked/vim-snippets/UltiSnips/elm.snippets new file mode 100644 index 00000000..6e21bb5e --- /dev/null +++ b/sources_non_forked/vim-snippets/UltiSnips/elm.snippets @@ -0,0 +1,9 @@ +priority -50 + +snippet impa "Qualified import" +import ${1:Json.Encode} as ${0:`!p snip.rv = t[1].split(".")[-1]`} +endsnippet + +snippet impae "Qualified import with exposing" +import ${1:Json.Encode} as ${2:`!p snip.rv = t[1].split(".")[-1]`} exposing (${0:Value}) +endsnippet diff --git a/sources_non_forked/vim-snippets/UltiSnips/javascript.snippets b/sources_non_forked/vim-snippets/UltiSnips/javascript.snippets index 652dd707..b6a654c7 100644 --- a/sources_non_forked/vim-snippets/UltiSnips/javascript.snippets +++ b/sources_non_forked/vim-snippets/UltiSnips/javascript.snippets @@ -7,6 +7,14 @@ priority -50 # The smart snippets use a global options called # "g:ultisnips_javascript.{option}" which can control the format # of trailing semicolon, space before function paren, etc. +# +# e.g. +# let g:ultisnips_javascript = { +# \ 'keyword-spacing': 'always', +# \ 'semi': 'never', +# \ 'space-before-function-paren': 'always', +# \ } + global !p from javascript_snippets import ( diff --git a/sources_non_forked/vim-snippets/UltiSnips/markdown.snippets b/sources_non_forked/vim-snippets/UltiSnips/markdown.snippets index add9f7f9..0c844ecc 100644 --- a/sources_non_forked/vim-snippets/UltiSnips/markdown.snippets +++ b/sources_non_forked/vim-snippets/UltiSnips/markdown.snippets @@ -3,7 +3,7 @@ priority -50 global !p def create_table(snip): # retrieving single line from current string and treat it like tabstops count - placeholders_string = snip.buffer[snip.line].strip().split("x",1) + placeholders_string = snip.buffer[snip.line].strip()[2:].split("x",1) rows_amount = int(placeholders_string[0]) columns_amount = int(placeholders_string[1]) @@ -84,9 +84,8 @@ snippet fnt "Footnote" [^$1]:${2:Text} endsnippet -post_jump "create_table(snip)" +pre_expand "create_table(snip)" snippet "tb(\d+x\d+)" "Customizable table" br -`!p snip.rv = match.group(1)` endsnippet # vim:ft=snippets: diff --git a/sources_non_forked/vim-snippets/UltiSnips/ruby.snippets b/sources_non_forked/vim-snippets/UltiSnips/ruby.snippets index c61b2766..cb90a9db 100644 --- a/sources_non_forked/vim-snippets/UltiSnips/ruby.snippets +++ b/sources_non_forked/vim-snippets/UltiSnips/ruby.snippets @@ -302,7 +302,7 @@ endsnippet snippet "\b(case|sw(itch)?)" "case when ... end" r case ${1:variable} when ${2:expression} -$0 + $0 end endsnippet @@ -326,4 +326,16 @@ snippet ### =end endsnippet +snippet priv "private " m +private + +$0 +endsnippet + +snippet prot "protected" m +protected + +$0 +endsnippet + # vim: set ts=2 sw=2 expandtab: diff --git a/sources_non_forked/vim-snippets/snippets/elm.snippets b/sources_non_forked/vim-snippets/snippets/elm.snippets index 7a4e3ef5..336ee094 100644 --- a/sources_non_forked/vim-snippets/snippets/elm.snippets +++ b/sources_non_forked/vim-snippets/snippets/elm.snippets @@ -2,9 +2,11 @@ snippet mod module `substitute(substitute(expand('%:r'), '[/\\]','.','g'),'^\%(\l*\.\)\?','','')` exposing (${1}) ${0} snippet imp - import ${0:List} + import ${0:Http} snippet impe - import ${1:List} exposing (${0:map}) + import ${1:Html} exposing (${0:..}) +snippet impae + import ${1:Json.Encode} as ${2:Encode} exposing (${0:Value}) snippet fn ${1:fn} : ${2:a} -> ${3:a} $1 ${4} = @@ -49,3 +51,8 @@ snippet ty snippet tya type alias ${1:Model} = ${0} +snippet test + test "${1}" <| \_ -> $0 +snippet doc + {-| ${0} + -} diff --git a/sources_non_forked/vim-snippets/snippets/haskell.snippets b/sources_non_forked/vim-snippets/snippets/haskell.snippets index e4957e4c..adde1929 100644 --- a/sources_non_forked/vim-snippets/snippets/haskell.snippets +++ b/sources_non_forked/vim-snippets/snippets/haskell.snippets @@ -103,7 +103,22 @@ snippet spec spec :: Spec spec = describe "${1}" $ do - $0 + it "${2}" $ + $0 +snippet specf + module `substitute(substitute(expand('%:r'), '[/\\]','.','g'),'^\%(\l*\.\)\?','','')` (main, spec) where + + import Test.Hspec + import Test.Hspec.Runner (configFastFail, defaultConfig, hspecWith) + + main :: IO () + main = hspecWith defaultConfig {configFastFail = True} spec + + spec :: Spec + spec = + describe "${1}" $ do + it "${2}" $ + $0 snippet desc describe "${1}" $ do $0 @@ -113,3 +128,5 @@ snippet it snippet itp it "${1}" $ property $ $0 +snippet sb + \`shouldBe\` $0 From e9aac9794bd515bcbb5f2b01d5a72f3a52c3982c Mon Sep 17 00:00:00 2001 From: amix Date: Fri, 24 Nov 2017 14:54:40 +0100 Subject: [PATCH 09/12] Updated plugins, also experimenting with a new font The font is IBM Plex Mono: https://ibm.github.io/type/ --- sources_non_forked/ack.vim/README.md | 8 +- sources_non_forked/gruvbox/README.md | 2 +- .../lightline/colorscheme/gruvbox.vim | 12 +- sources_non_forked/lightline.vim/.travis.yml | 1 - sources_non_forked/lightline.vim/README.md | 4 +- .../lightline.vim/autoload/lightline.vim | 8 +- .../lightline.vim/doc/lightline.txt | 34 +- .../lightline.vim/test/tabs.vim | 6 +- sources_non_forked/nerdtree/CHANGELOG | 1 + .../nerdtree/autoload/nerdtree.vim | 5 + .../nerdtree/autoload/nerdtree/ui_glue.vim | 63 +- .../nerdtree/lib/nerdtree/creator.vim | 90 +-- .../nerdtree/lib/nerdtree/nerdtree.vim | 2 +- .../nerdtree/lib/nerdtree/opener.vim | 62 +- .../nerdtree/lib/nerdtree/tree_dir_node.vim | 17 +- .../nerdtree/lib/nerdtree/ui.vim | 2 + .../nerdtree/nerdtree_plugin/fs_menu.vim | 33 +- .../nerdtree/plugin/NERD_tree.vim | 2 +- sources_non_forked/nginx-vim-syntax/README.md | 10 - .../nginx-vim-syntax/ftdetect/nginx.vim | 4 - .../nginx-vim-syntax/indent/nginx.vim | 11 - .../nginx-vim-syntax/syntax/nginx.vim | 703 ------------------ sources_non_forked/syntastic/README.markdown | 8 +- .../autoload/syntastic/postprocess.vim | 11 + .../autoload/syntastic/preprocess.vim | 37 + .../syntastic/autoload/syntastic/util.vim | 10 +- .../syntastic/doc/syntastic-checkers.txt | 411 ++++++---- .../syntastic/doc/syntastic.txt | 38 +- .../syntastic/plugin/syntastic.vim | 2 +- .../syntastic/plugin/syntastic/registry.vim | 1 + .../syntastic/syntax_checkers/ada/gcc.vim | 2 +- .../syntax_checkers/ansible/ansible_lint.vim | 2 +- .../syntax_checkers/apiblueprint/drafter.vim | 2 +- .../applescript/osacompile.vim | 2 +- .../syntax_checkers/asciidoc/asciidoc.vim | 2 +- .../syntax_checkers/bemhtml/bemhtmllint.vim | 2 +- .../syntastic/syntax_checkers/bro/bro.vim | 2 +- .../syntax_checkers/c/checkpatch.vim | 2 +- .../syntax_checkers/c/clang_check.vim | 2 +- .../syntax_checkers/c/clang_tidy.vim | 2 +- .../syntastic/syntax_checkers/c/cppcheck.vim | 2 +- .../syntastic/syntax_checkers/c/gcc.vim | 2 +- .../syntastic/syntax_checkers/c/make.vim | 2 +- .../syntastic/syntax_checkers/c/oclint.vim | 2 +- .../syntastic/syntax_checkers/c/pc_lint.vim | 2 +- .../syntastic/syntax_checkers/c/sparse.vim | 2 +- .../syntastic/syntax_checkers/c/splint.vim | 2 +- .../syntax_checkers/chef/foodcritic.vim | 2 +- .../syntastic/syntax_checkers/co/coco.vim | 2 +- .../syntastic/syntax_checkers/cobol/cobc.vim | 4 +- .../syntax_checkers/coffee/coffee.vim | 2 +- .../syntax_checkers/coffee/coffeelint.vim | 2 +- .../syntastic/syntax_checkers/coq/coqtop.vim | 2 +- .../syntax_checkers/cpp/clang_check.vim | 2 +- .../syntax_checkers/cpp/clang_tidy.vim | 2 +- .../syntax_checkers/cpp/cppcheck.vim | 2 +- .../syntastic/syntax_checkers/cpp/cpplint.vim | 2 +- .../syntastic/syntax_checkers/cpp/gcc.vim | 2 +- .../syntastic/syntax_checkers/cpp/oclint.vim | 2 +- .../syntastic/syntax_checkers/cpp/pc_lint.vim | 2 +- .../syntastic/syntax_checkers/cpp/verapp.vim | 2 +- .../syntastic/syntax_checkers/cs/mcs.vim | 2 +- .../syntastic/syntax_checkers/css/csslint.vim | 2 +- .../syntastic/syntax_checkers/css/phpcs.vim | 2 +- .../syntax_checkers/css/prettycss.vim | 2 +- .../syntastic/syntax_checkers/css/recess.vim | 2 +- .../syntax_checkers/css/stylelint.vim | 4 +- .../syntax_checkers/cucumber/cucumber.vim | 2 +- .../syntastic/syntax_checkers/d/dmd.vim | 2 +- .../syntastic/syntax_checkers/docbk/igor.vim | 2 +- .../syntax_checkers/docbk/xmllint.vim | 2 +- .../dockerfile/dockerfile_lint.vim | 2 +- .../syntax_checkers/elixir/elixir.vim | 2 +- .../syntax_checkers/erlang/escript.vim | 2 +- .../syntastic/syntax_checkers/eruby/ruby.vim | 2 +- .../syntax_checkers/fortran/gfortran.vim | 2 +- .../syntastic/syntax_checkers/haml/haml.vim | 2 +- .../syntax_checkers/handlebars/handlebars.vim | 2 +- .../syntax_checkers/haskell/hdevtools.vim | 2 +- .../syntax_checkers/haskell/hlint.vim | 2 +- .../syntax_checkers/haskell/scan.vim | 2 +- .../syntastic/syntax_checkers/haxe/haxe.vim | 2 +- .../syntastic/syntax_checkers/hss/hss.vim | 2 +- .../syntastic/syntax_checkers/html/tidy.vim | 2 +- .../syntax_checkers/html/validator.vim | 2 +- .../syntastic/syntax_checkers/html/w3.vim | 2 +- .../syntax_checkers/java/checkstyle.vim | 2 +- .../syntastic/syntax_checkers/java/javac.vim | 2 +- .../syntastic/syntax_checkers/less/lessc.vim | 2 +- .../syntastic/syntax_checkers/less/recess.vim | 2 +- .../syntastic/syntax_checkers/lex/flex.vim | 2 +- .../syntastic/syntax_checkers/limbo/limbo.vim | 2 +- .../syntastic/syntax_checkers/lisp/clisp.vim | 2 +- .../syntastic/syntax_checkers/llvm/llvm.vim | 2 +- .../syntastic/syntax_checkers/lua/luac.vim | 2 +- .../syntax_checkers/markdown/mdl.vim | 2 +- .../syntax_checkers/matlab/mlint.vim | 2 +- .../syntastic/syntax_checkers/mercury/mmc.vim | 2 +- .../syntastic/syntax_checkers/nasm/nasm.vim | 2 +- .../syntastic/syntax_checkers/nroff/igor.vim | 2 +- .../syntax_checkers/nroff/mandoc.vim | 2 +- .../syntastic/syntax_checkers/objc/gcc.vim | 2 +- .../syntastic/syntax_checkers/objc/oclint.vim | 2 +- .../syntastic/syntax_checkers/objcpp/gcc.vim | 2 +- .../syntax_checkers/objcpp/oclint.vim | 2 +- .../syntax_checkers/ocaml/camlp4o.vim | 2 +- .../syntax_checkers/perl/perlcritic.vim | 2 +- .../syntax_checkers/perl/podchecker.vim | 2 +- .../syntastic/syntax_checkers/php/phpcs.vim | 2 +- .../syntastic/syntax_checkers/php/phplint.vim | 2 +- .../syntastic/syntax_checkers/php/phpmd.vim | 2 +- .../syntastic/syntax_checkers/php/phpstan.vim | 2 +- .../syntax_checkers/pod/podchecker.vim | 2 +- .../syntax_checkers/pug/pug_lint.vim | 2 +- .../syntax_checkers/puppet/puppet.vim | 2 +- .../syntax_checkers/puppet/puppetlint.vim | 2 +- .../syntax_checkers/python/flake8.vim | 2 +- .../syntax_checkers/python/frosted.vim | 2 +- .../syntastic/syntax_checkers/python/mypy.vim | 2 +- .../syntax_checkers/python/prospector.vim | 2 +- .../syntax_checkers/python/py3kwarn.vim | 2 +- .../syntax_checkers/python/pyflakes.vim | 2 +- .../syntax_checkers/python/pylama.vim | 2 +- .../syntax_checkers/python/pylint.vim | 2 +- .../syntax_checkers/python/python.vim | 2 +- .../syntastic/syntax_checkers/qml/qmllint.vim | 2 +- .../syntastic/syntax_checkers/r/lint.vim | 2 +- .../syntastic/syntax_checkers/r/lintr.vim | 2 +- .../syntastic/syntax_checkers/r/svtools.vim | 2 +- .../syntax_checkers/racket/code-ayatollah.vim | 2 +- .../syntax_checkers/racket/racket.vim | 2 +- .../syntastic/syntax_checkers/rmd/lintr.vim | 2 +- .../syntastic/syntax_checkers/rnc/rnv.vim | 2 +- .../syntastic/syntax_checkers/ruby/flog.vim | 2 +- .../syntastic/syntax_checkers/ruby/jruby.vim | 2 +- .../syntax_checkers/ruby/macruby.vim | 2 +- .../syntastic/syntax_checkers/ruby/mri.vim | 2 +- .../syntastic/syntax_checkers/ruby/reek.vim | 2 +- .../syntax_checkers/ruby/rubocop.vim | 2 +- .../syntastic/syntax_checkers/sass/sass.vim | 2 +- .../syntastic/syntax_checkers/scala/fsc.vim | 2 +- .../syntax_checkers/scala/scalac.vim | 5 +- .../syntax_checkers/scala/scalastyle.vim | 2 +- .../syntax_checkers/scss/stylelint.vim | 2 +- .../syntastic/syntax_checkers/sh/bashate.vim | 3 +- .../syntax_checkers/sh/checkbashisms.vim | 2 +- .../syntastic/syntax_checkers/sh/sh.vim | 2 +- .../syntax_checkers/sh/shellcheck.vim | 2 +- .../syntastic/syntax_checkers/slim/slimrb.vim | 2 +- .../syntastic/syntax_checkers/sml/smlnj.vim | 2 +- .../syntax_checkers/spec/rpmlint.vim | 2 +- .../syntastic/syntax_checkers/sql/sqlint.vim | 2 +- .../syntax_checkers/stylus/stylint.vim | 2 +- .../syntax_checkers/tcl/nagelfar.vim | 2 +- .../syntastic/syntax_checkers/tex/chktex.vim | 10 +- .../syntastic/syntax_checkers/tex/lacheck.vim | 2 +- .../syntax_checkers/texinfo/makeinfo.vim | 2 +- .../syntax_checkers/text/atdtool.vim | 2 +- .../syntastic/syntax_checkers/text/igor.vim | 2 +- .../syntax_checkers/twig/twiglint.vim | 2 +- .../syntastic/syntax_checkers/vala/valac.vim | 2 +- .../syntax_checkers/verilog/iverilog.vim | 2 +- .../syntax_checkers/verilog/verilator.vim | 2 +- .../syntastic/syntax_checkers/vhdl/ghdl.vim | 2 +- .../syntastic/syntax_checkers/vhdl/vcom.vim | 2 +- .../syntastic/syntax_checkers/vim/vimlint.vim | 2 +- .../syntastic/syntax_checkers/vim/vint.vim | 2 +- .../syntastic/syntax_checkers/xhtml/tidy.vim | 2 +- .../syntastic/syntax_checkers/xml/plutil.vim | 2 +- .../syntastic/syntax_checkers/xml/xmllint.vim | 2 +- .../syntax_checkers/xquery/basex.vim | 2 +- .../syntax_checkers/xslt/xmllint.vim | 2 +- .../syntastic/syntax_checkers/yacc/bison.vim | 2 +- .../syntastic/syntax_checkers/yaml/jsyaml.vim | 2 +- .../syntax_checkers/yaml/yamllint.vim | 2 +- .../syntastic/syntax_checkers/yaml/yamlxs.vim | 2 +- .../syntastic/syntax_checkers/yang/pyang.vim | 2 +- .../syntax_checkers/z80/z80syntaxchecker.vim | 2 +- .../syntastic/syntax_checkers/zpt/zptlint.vim | 2 +- .../syntastic/syntax_checkers/zsh/zsh.vim | 2 +- .../tpope-vim-abolish/.gitignore | 1 - .../tpope-vim-abolish/CONTRIBUTING.markdown | 1 - .../tpope-vim-abolish/README.markdown | 150 ---- .../tpope-vim-abolish/doc/abolish.txt | 181 ----- .../tpope-vim-abolish/plugin/abolish.vim | 631 ---------------- .../vim-commentary/plugin/commentary.vim | 16 +- .../vim-fugitive/README.markdown | 2 +- .../vim-fugitive/plugin/fugitive.vim | 4 +- .../autoload/gitgutter/async.vim | 238 ++---- .../autoload/gitgutter/highlight.vim | 2 +- .../vim-gitgutter/autoload/gitgutter/hunk.vim | 4 +- .../vim-go/.github/CONTRIBUTING.md | 13 +- .../vim-go/.github/ISSUE_TEMPLATE.md | 29 +- sources_non_forked/vim-go/.gitignore | 5 - sources_non_forked/vim-go/.travis.yml | 33 +- sources_non_forked/vim-go/CHANGELOG.md | 699 +++++++++-------- sources_non_forked/vim-go/Makefile | 27 +- sources_non_forked/vim-go/README.md | 89 ++- .../vim-go/autoload/ctrlp/decls.vim | 4 - sources_non_forked/vim-go/autoload/go/cmd.vim | 94 +-- .../vim-go/autoload/go/coverage.vim | 13 +- sources_non_forked/vim-go/autoload/go/def.vim | 2 +- .../vim-go/autoload/go/def_test.vim | 51 +- sources_non_forked/vim-go/autoload/go/doc.vim | 51 +- sources_non_forked/vim-go/autoload/go/fmt.vim | 18 +- .../vim-go/autoload/go/fmt_test.vim | 8 +- .../vim-go/autoload/go/guru.vim | 57 +- .../vim-go/autoload/go/impl.vim | 54 +- sources_non_forked/vim-go/autoload/go/job.vim | 10 +- .../vim-go/autoload/go/jobcontrol.vim | 9 +- .../vim-go/autoload/go/keyify.vim | 2 + .../vim-go/autoload/go/lint.vim | 21 +- .../vim-go/autoload/go/list.vim | 85 ++- .../vim-go/autoload/go/package.vim | 7 +- .../vim-go/autoload/go/path.vim | 3 +- .../vim-go/autoload/go/play.vim | 20 - .../vim-go/autoload/go/rename.vim | 37 +- .../vim-go/autoload/go/tags.vim | 6 +- .../vim-go/autoload/go/tags_test.vim | 42 +- .../vim-go/autoload/go/term.vim | 3 +- .../vim-go/autoload/go/test.vim | 116 ++- .../vim-go/autoload/go/tool.vim | 17 +- .../vim-go/autoload/go/util.vim | 158 +++- sources_non_forked/vim-go/compiler/go.vim | 4 +- sources_non_forked/vim-go/doc/vim-go.txt | 680 +++++++++++------ .../vim-go/ftdetect/gofiletype.vim | 17 +- .../vim-go/ftplugin/go/commands.vim | 20 +- .../vim-go/ftplugin/gohtmltmpl.vim | 3 +- .../vim-go/gosnippets/UltiSnips/go.snippets | 2 +- sources_non_forked/vim-go/plugin/go.vim | 116 ++- sources_non_forked/vim-go/scripts/runtest.vim | 98 +-- sources_non_forked/vim-go/scripts/test.sh | 45 -- sources_non_forked/vim-go/syntax/go.vim | 78 +- .../vim-go/syntax/gohtmltmpl.vim | 4 +- .../vim-markdown/syntax/markdown.vim | 18 +- .../vim-snippets/UltiSnips/html.snippets | 52 +- .../UltiSnips/javascript-openui5.snippets | 205 ----- .../vim-snippets/UltiSnips/php.snippets | 26 + .../vim-snippets/UltiSnips/r.snippets | 62 +- .../vim-snippets/UltiSnips/rst.snippets | 15 + .../vim-snippets/UltiSnips/tex.snippets | 10 +- .../vim-snippets/snippets/cmake.snippets | 4 +- .../vim-snippets/snippets/dart.snippets | 13 +- .../vim-snippets/snippets/eelixir.snippets | 2 + .../vim-snippets/snippets/elixir.snippets | 44 +- .../vim-snippets/snippets/elm.snippets | 44 ++ .../vim-snippets/snippets/haskell.snippets | 13 + .../vim-snippets/snippets/lua.snippets | 29 +- .../vim-snippets/snippets/puppet.snippets | 3 + .../vim-snippets/snippets/purescript.snippets | 14 + .../vim-snippets/snippets/python.snippets | 71 +- .../vim-snippets/snippets/vim.snippets | 16 + .../vim-snippets/snippets/vue.snippets | 2 +- update_plugins.py | 5 +- vimrcs/extended.vim | 8 +- 255 files changed, 2898 insertions(+), 3752 deletions(-) delete mode 100644 sources_non_forked/nginx-vim-syntax/README.md delete mode 100644 sources_non_forked/nginx-vim-syntax/ftdetect/nginx.vim delete mode 100644 sources_non_forked/nginx-vim-syntax/indent/nginx.vim delete mode 100644 sources_non_forked/nginx-vim-syntax/syntax/nginx.vim delete mode 100644 sources_non_forked/tpope-vim-abolish/.gitignore delete mode 100644 sources_non_forked/tpope-vim-abolish/CONTRIBUTING.markdown delete mode 100644 sources_non_forked/tpope-vim-abolish/README.markdown delete mode 100644 sources_non_forked/tpope-vim-abolish/doc/abolish.txt delete mode 100644 sources_non_forked/tpope-vim-abolish/plugin/abolish.vim delete mode 100644 sources_non_forked/vim-go/scripts/test.sh delete mode 100644 sources_non_forked/vim-snippets/UltiSnips/javascript-openui5.snippets diff --git a/sources_non_forked/ack.vim/README.md b/sources_non_forked/ack.vim/README.md index fca907fa..378fc3e3 100644 --- a/sources_non_forked/ack.vim/README.md +++ b/sources_non_forked/ack.vim/README.md @@ -76,9 +76,9 @@ The quickfix results window is augmented with these convenience mappings: ? a quick summary of these keys, repeat to close o to open (same as Enter) O to open and close the quickfix window - go to preview file, keeping focus on the results + go to preview file, open but maintain focus on ack.vim results t to open in new tab - T to open in new tab, keeping focus on the results + T to open in new tab without moving to it h to open in horizontal split H to open in horizontal split, keeping focus on the results v to open in vertical split @@ -87,6 +87,10 @@ The quickfix results window is augmented with these convenience mappings: ### Gotchas +To search for a pattern that contains whitespace, you need to enclose the +pattern in single quotes. For example: `:Ack 'foo bar'` to search for +'foo bar'. + Some characters have special meaning, and need to be escaped in your search pattern. For instance, `#`. You need to escape it with `:Ack '\\\#define foo'` to search for '#define foo'. See [issue #5]. diff --git a/sources_non_forked/gruvbox/README.md b/sources_non_forked/gruvbox/README.md index d36c02a3..4269786c 100644 --- a/sources_non_forked/gruvbox/README.md +++ b/sources_non_forked/gruvbox/README.md @@ -1,4 +1,4 @@ -

    +

    gruvbox is heavily inspired by [badwolf][], [jellybeans][] and [solarized][]. diff --git a/sources_non_forked/gruvbox/autoload/lightline/colorscheme/gruvbox.vim b/sources_non_forked/gruvbox/autoload/lightline/colorscheme/gruvbox.vim index 632390c5..4730c094 100644 --- a/sources_non_forked/gruvbox/autoload/lightline/colorscheme/gruvbox.vim +++ b/sources_non_forked/gruvbox/autoload/lightline/colorscheme/gruvbox.vim @@ -3,7 +3,7 @@ " Description: Gruvbox colorscheme for Lightline (itchyny/lightline.vim) " Author: gmoe " Source: https://github.com/morhetz/gruvbox -" Last Modified: 31 Oct 2015 +" Last Modified: 20 Sep 2017 " ----------------------------------------------------------------------------- function! s:getGruvColor(group) @@ -28,22 +28,22 @@ if exists('g:lightline') let s:green = s:getGruvColor('GruvboxGreen') let s:p = {'normal':{}, 'inactive':{}, 'insert':{}, 'replace':{}, 'visual':{}, 'tabline':{}, 'terminal':{}} - let s:p.normal.left = [ [ s:bg0, s:fg4 ], [ s:fg4, s:bg2 ] ] + let s:p.normal.left = [ [ s:bg0, s:fg4, 'bold' ], [ s:fg4, s:bg2 ] ] let s:p.normal.right = [ [ s:bg0, s:fg4 ], [ s:fg4, s:bg2 ] ] let s:p.normal.middle = [ [ s:fg4, s:bg1 ] ] let s:p.inactive.right = [ [ s:bg4, s:bg1 ], [ s:bg4, s:bg1 ] ] let s:p.inactive.left = [ [ s:bg4, s:bg1 ], [ s:bg4, s:bg1 ] ] let s:p.inactive.middle = [ [ s:bg4, s:bg1 ] ] - let s:p.insert.left = [ [ s:bg0, s:blue ], [ s:fg1, s:bg2 ] ] + let s:p.insert.left = [ [ s:bg0, s:blue, 'bold' ], [ s:fg1, s:bg2 ] ] let s:p.insert.right = [ [ s:bg0, s:blue ], [ s:fg1, s:bg2 ] ] let s:p.insert.middle = [ [ s:fg4, s:bg2 ] ] - let s:p.terminal.left = [ [ s:bg0, s:green ], [ s:fg1, s:bg2 ] ] + let s:p.terminal.left = [ [ s:bg0, s:green, 'bold' ], [ s:fg1, s:bg2 ] ] let s:p.terminal.right = [ [ s:bg0, s:green ], [ s:fg1, s:bg2 ] ] let s:p.terminal.middle = [ [ s:fg4, s:bg2 ] ] - let s:p.replace.left = [ [ s:bg0, s:aqua ], [ s:fg1, s:bg2 ] ] + let s:p.replace.left = [ [ s:bg0, s:aqua, 'bold' ], [ s:fg1, s:bg2 ] ] let s:p.replace.right = [ [ s:bg0, s:aqua ], [ s:fg1, s:bg2 ] ] let s:p.replace.middle = [ [ s:fg4, s:bg2 ] ] - let s:p.visual.left = [ [ s:bg0, s:orange ], [ s:bg0, s:bg4 ] ] + let s:p.visual.left = [ [ s:bg0, s:orange, 'bold' ], [ s:bg0, s:bg4 ] ] let s:p.visual.right = [ [ s:bg0, s:orange ], [ s:bg0, s:bg4 ] ] let s:p.visual.middle = [ [ s:fg4, s:bg1 ] ] let s:p.tabline.left = [ [ s:fg4, s:bg2 ] ] diff --git a/sources_non_forked/lightline.vim/.travis.yml b/sources_non_forked/lightline.vim/.travis.yml index 3767d735..b385a182 100644 --- a/sources_non_forked/lightline.vim/.travis.yml +++ b/sources_non_forked/lightline.vim/.travis.yml @@ -21,7 +21,6 @@ env: - VIM_VERSION=8.0.0000 - VIM_VERSION=7.4 - VIM_VERSION=7.3 - - VIM_VERSION=7.2.051 script: - export PATH=$HOME/vim-$VIM_VERSION/bin:$PATH diff --git a/sources_non_forked/lightline.vim/README.md b/sources_non_forked/lightline.vim/README.md index b9c1a1ae..69d0a104 100644 --- a/sources_non_forked/lightline.vim/README.md +++ b/sources_non_forked/lightline.vim/README.md @@ -47,8 +47,8 @@ landscape is my colorscheme, which is a high-contrast cui-supported colorscheme, ## Why yet another clone of powerline? + [vim-powerline](https://github.com/Lokaltog/vim-powerline) is a nice plugin, but deprecated. -+ [powerline](https://github.com/Lokaltog/powerline) is a nice plugin, but difficult to configure. -+ [vim-airline](https://github.com/bling/vim-airline) is a nice plugin, but it uses too much functions of other plugins, which should be done by users in `.vimrc`. ++ [powerline](https://github.com/powerline/powerline) is a nice plugin, but difficult to configure. ++ [vim-airline](https://github.com/vim-airline/vim-airline) is a nice plugin, but it uses too much functions of other plugins, which should be done by users in `.vimrc`. ## Spirit of this plugin + Minimalism. The core script is very small to achive enough functions as a statusline plugin. diff --git a/sources_non_forked/lightline.vim/autoload/lightline.vim b/sources_non_forked/lightline.vim/autoload/lightline.vim index 9004efd4..43cf1504 100644 --- a/sources_non_forked/lightline.vim/autoload/lightline.vim +++ b/sources_non_forked/lightline.vim/autoload/lightline.vim @@ -2,7 +2,7 @@ " Filename: autoload/lightline.vim " Author: itchyny " License: MIT License -" Last Change: 2017/08/21 08:19:52. +" Last Change: 2017/11/11 13:29:26. " ============================================================================= let s:save_cpo = &cpo @@ -105,7 +105,7 @@ let s:_lightline = { \ 'paste': '%{&paste?"PASTE":""}', 'readonly': '%R', 'charvalue': '%b', 'charvaluehex': '%B', \ 'spell': '%{&spell?&spelllang:""}', 'fileencoding': '%{&fenc!=#""?&fenc:&enc}', 'fileformat': '%{&ff}', \ 'filetype': '%{&ft!=#""?&ft:"no ft"}', 'percent': '%3p%%', 'percentwin': '%P', - \ 'lineinfo': '%3l:%-2v', 'line': '%l', 'column': '%c', 'close': '%999X X ' + \ 'lineinfo': '%3l:%-2v', 'line': '%l', 'column': '%c', 'close': '%999X X ', 'winnr': '%{winnr()}' \ }, \ 'component_visible_condition': { \ 'modified': '&modified||!&modifiable', 'readonly': '&readonly', 'paste': '&paste', 'spell': '&spell' @@ -267,7 +267,7 @@ function! lightline#highlight(...) abort let [s:lightline.llen, s:lightline.rlen] = [len(c.normal.left), len(c.normal.right)] let [s:lightline.tab_llen, s:lightline.tab_rlen] = [len(has_key(get(c, 'tabline', {}), 'left') ? c.tabline.left : c.normal.left), len(has_key(get(c, 'tabline', {}), 'right') ? c.tabline.right : c.normal.right)] let types = map(s:uniq(sort(filter(values(s:lightline.component_type), 'v:val !=# "raw"'))), '[v:val, 1]') - let modes = a:0 ? [a:1] : extend(['normal', 'insert', 'replace', 'visual', 'inactive', 'command', 'select', 'tabline'], has('nvim') ? ['terminal'] : []) + let modes = a:0 ? [a:1] : extend(['normal', 'insert', 'replace', 'visual', 'inactive', 'command', 'select', 'tabline'], exists(':terminal') == 2 ? ['terminal'] : []) for mode in modes let s:highlight[mode] = 1 let d = has_key(c, mode) ? mode : has_key(f, mode) && has_key(c, f[mode]) ? f[mode] : 'normal' @@ -450,7 +450,7 @@ function! lightline#tabs() abort let nr = tabpagenr() let cnt = tabpagenr('$') for i in range(1, cnt) - call add(i < nr ? x : i == nr ? y : z, '%'. i . 'T%{lightline#onetab(' . i . ',' . (i == nr) . ')}' . (i == cnt ? '%T' : '')) + call add(i < nr ? x : i == nr ? y : z, (i > nr + 3 ? '%<' : '') . '%'. i . 'T%{lightline#onetab(' . i . ',' . (i == nr) . ')}' . (i == cnt ? '%T' : '')) endfor let abbr = '...' let n = min([max([s:lightline.winwidth / 40, 2]), 8]) diff --git a/sources_non_forked/lightline.vim/doc/lightline.txt b/sources_non_forked/lightline.vim/doc/lightline.txt index f68be38f..15c729c5 100644 --- a/sources_non_forked/lightline.vim/doc/lightline.txt +++ b/sources_non_forked/lightline.vim/doc/lightline.txt @@ -4,7 +4,7 @@ Version: 0.1 Author: itchyny (https://github.com/itchyny) License: MIT License Repository: https://github.com/itchyny/lightline.vim -Last Change: 2017/08/21 08:33:12. +Last Change: 2017/11/18 20:07:05. CONTENTS *lightline-contents* @@ -109,8 +109,9 @@ OPTIONS *lightline-option* \ 'spell': '%{&spell?&spelllang:""}', \ 'lineinfo': '%3l:%-2v', \ 'line': '%l', - \ 'column': '%c' - \ 'close': '%999X X ' } + \ 'column': '%c', + \ 'close': '%999X X ', + \ 'winnr': '%{winnr()}' } < g:lightline.component_visible_condition *g:lightline.component_visible_condition* @@ -228,7 +229,7 @@ OPTIONS *lightline-option* Currently, wombat, solarized, powerline, jellybeans, Tomorrow, Tomorrow_Night, Tomorrow_Night_Blue, Tomorrow_Night_Eighties, PaperColor, seoul256, landscape, one, Dracula, darcula, - Molokai and 16color are available. + molokai, materia, material, OldHope, nord and 16color are available. The default value is: > let g:lightline.colorscheme = 'default' @@ -1223,7 +1224,9 @@ Problem 12: *lightline-problem-12* Problem 13: *lightline-problem-13* How to change the lightline colorscheme on the fly. - Add the following settings to your .vimrc(_vimrc). + To update your lightline colorscheme in sync with your vim + colorscheme (only for select colorschemes which exist for + both), add the following settings to your .vimrc(_vimrc). > augroup LightlineColorscheme autocmd! @@ -1244,6 +1247,27 @@ Problem 13: *lightline-problem-13* catch endtry endfunction +< + If you have not settled on a single lightline colorscheme, you + can easily switch between lightline colorschemes by adding the + following LightlineColorscheme command to your .vimrc(_vimrc). +> + function! s:set_lightline_colorscheme(name) abort + let g:lightline.colorscheme = a:name + call lightline#init() + call lightline#colorscheme() + call lightline#update() + endfunction + + function! s:lightline_colorschemes(...) abort + return join(map( + \ globpath(&rtp,"autoload/lightline/colorscheme/*.vim",1,1), + \ "fnamemodify(v:val,':t:r')"), + \ "\n") + endfunction + + command! -nargs=1 -complete=custom,s:lightline_colorschemes LightlineColorscheme + \ call s:set_lightline_colorscheme() < Problem 14: *lightline-problem-14* The 'E541' warning appears on the right hand side. diff --git a/sources_non_forked/lightline.vim/test/tabs.vim b/sources_non_forked/lightline.vim/test/tabs.vim index 92c2c08f..7851e705 100644 --- a/sources_non_forked/lightline.vim/test/tabs.vim +++ b/sources_non_forked/lightline.vim/test/tabs.vim @@ -61,7 +61,7 @@ function! s:suite.tabnew_20_tabfirst() tabnew endfor tabfirst - call s:assert.equals(lightline#tabs(), [[], [s:tab(1, 1)], [s:tab(2), s:tab(3), s:tab(4), s:tab(5), '...', s:tab(17), s:tab(18), s:tab(19), s:tab(20, 0, 1)]]) + call s:assert.equals(lightline#tabs(), [[], [s:tab(1, 1)], [s:tab(2), s:tab(3), s:tab(4), '%<' . s:tab(5), '...', '%<' . s:tab(17), '%<' . s:tab(18), '%<' . s:tab(19), '%<' . s:tab(20, 0, 1)]]) endfunction function! s:suite.tabnew_20_tabfirst_tabnext() @@ -70,7 +70,7 @@ function! s:suite.tabnew_20_tabfirst_tabnext() endfor tabfirst tabnext - call s:assert.equals(lightline#tabs(), [[s:tab(1)], [s:tab(2, 1)], [s:tab(3), s:tab(4), s:tab(5), s:tab(6), '...', s:tab(18), s:tab(19), s:tab(20, 0, 1)]]) + call s:assert.equals(lightline#tabs(), [[s:tab(1)], [s:tab(2, 1)], [s:tab(3), s:tab(4), s:tab(5), '%<' . s:tab(6), '...', '%<' . s:tab(18), '%<' . s:tab(19), '%<' . s:tab(20, 0, 1)]]) endfunction function! s:suite.tabnew_20_tabnext_10() @@ -78,7 +78,7 @@ function! s:suite.tabnew_20_tabnext_10() tabnew endfor tabnext 10 - call s:assert.equals(lightline#tabs(), [[s:tab(1), s:tab(2), '...', s:tab(8), s:tab(9)], [s:tab(10, 1)], [s:tab(11), s:tab(12), '...', s:tab(19), s:tab(20, 0, 1)]]) + call s:assert.equals(lightline#tabs(), [[s:tab(1), s:tab(2), '...', s:tab(8), s:tab(9)], [s:tab(10, 1)], [s:tab(11), s:tab(12), '...', '%<' . s:tab(19), '%<' . s:tab(20, 0, 1)]]) endfunction function! s:suite.tabnew_20_tabprevious() diff --git a/sources_non_forked/nerdtree/CHANGELOG b/sources_non_forked/nerdtree/CHANGELOG index 3d377ab2..6dac46dd 100644 --- a/sources_non_forked/nerdtree/CHANGELOG +++ b/sources_non_forked/nerdtree/CHANGELOG @@ -1,4 +1,5 @@ Next + - Fix broken "t" and "T" mappings, tabs now open at end (lifecrisis) #759 - Update doc with already existing mapping variables (asnr) #699 - Fix the broken g:NERDTreeBookmarksSort setting (lifecrisis) #696 - Correct NERDTreeIgnore pattern in doc (cntoplolicon) #648 diff --git a/sources_non_forked/nerdtree/autoload/nerdtree.vim b/sources_non_forked/nerdtree/autoload/nerdtree.vim index 1d2595b0..b138c21c 100644 --- a/sources_non_forked/nerdtree/autoload/nerdtree.vim +++ b/sources_non_forked/nerdtree/autoload/nerdtree.vim @@ -155,6 +155,11 @@ function! nerdtree#runningWindows() return has("win16") || has("win32") || has("win64") endfunction +"FUNCTION: nerdtree#runningCygwin(dir) {{{2 +function! nerdtree#runningCygwin() + return has("win32unix") +endfunction + " SECTION: View Functions {{{1 "============================================================ diff --git a/sources_non_forked/nerdtree/autoload/nerdtree/ui_glue.vim b/sources_non_forked/nerdtree/autoload/nerdtree/ui_glue.vim index 2d94fd9a..689b7845 100644 --- a/sources_non_forked/nerdtree/autoload/nerdtree/ui_glue.vim +++ b/sources_non_forked/nerdtree/autoload/nerdtree/ui_glue.vim @@ -68,10 +68,10 @@ function! nerdtree#ui_glue#createDefaultBindings() call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapJumpNextSibling, 'scope': "Node", 'callback': s."jumpToNextSibling" }) call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapJumpPrevSibling, 'scope': "Node", 'callback': s."jumpToPrevSibling" }) - call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapOpenInTab, 'scope': "Node", 'callback': s."openInNewTab" }) - call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapOpenInTabSilent, 'scope': "Node", 'callback': s."openInNewTabSilent" }) - call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapOpenInTab, 'scope': "Bookmark", 'callback': s."openInNewTab" }) - call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapOpenInTabSilent, 'scope': "Bookmark", 'callback': s."openInNewTabSilent" }) + call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapOpenInTab, 'scope': 'Node', 'callback': s . 'openInNewTab' }) + call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapOpenInTabSilent, 'scope': 'Node', 'callback': s . 'openInNewTabSilent' }) + call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapOpenInTab, 'scope': 'Bookmark', 'callback': s . 'openInNewTab' }) + call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapOpenInTabSilent, 'scope': 'Bookmark', 'callback': s . 'openInNewTabSilent' }) call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapOpenExpl, 'scope': "DirNode", 'callback': s."openExplorer" }) @@ -90,10 +90,15 @@ function! s:activateAll() endif endfunction -"FUNCTION: s:activateDirNode() {{{1 -"handle the user activating a tree node -function! s:activateDirNode(node) - call a:node.activate() +" FUNCTION: s:activateDirNode(directoryNode) {{{1 +function! s:activateDirNode(directoryNode) + + if a:directoryNode.isRoot() && a:directoryNode.isOpen + call nerdtree#echo('cannot close tree root') + return + endif + + call a:directoryNode.activate() endfunction "FUNCTION: s:activateFileNode() {{{1 @@ -184,24 +189,28 @@ function! s:closeChildren(node) endfunction " FUNCTION: s:closeCurrentDir(node) {{{1 -" closes the parent dir of the current node +" Close the parent directory of the current node. function! s:closeCurrentDir(node) - let parent = a:node.parent - while g:NERDTreeCascadeOpenSingleChildDir && !parent.isRoot() - let childNodes = parent.getVisibleChildren() - if len(childNodes) == 1 && childNodes[0].path.isDirectory - let parent = parent.parent - else - break - endif - endwhile - if parent ==# {} || parent.isRoot() - call nerdtree#echo("cannot close tree root") - else - call parent.close() - call b:NERDTree.render() - call parent.putCursorHere(0, 0) + + if a:node.isRoot() + call nerdtree#echo('cannot close parent of tree root') + return endif + + let l:parent = a:node.parent + + while l:parent.isCascadable() + let l:parent = l:parent.parent + endwhile + + if l:parent.isRoot() + call nerdtree#echo('cannot close tree root') + return + endif + + call l:parent.close() + call b:NERDTree.render() + call l:parent.putCursorHere(0, 0) endfunction " FUNCTION: s:closeTreeWindow() {{{1 @@ -494,12 +503,14 @@ endfunction " FUNCTION: s:openInNewTab(target) {{{1 function! s:openInNewTab(target) - call a:target.activate({'where': 't'}) + let l:opener = g:NERDTreeOpener.New(a:target.path, {'where': 't'}) + call l:opener.open(a:target) endfunction " FUNCTION: s:openInNewTabSilent(target) {{{1 function! s:openInNewTabSilent(target) - call a:target.activate({'where': 't', 'stay': 1}) + let l:opener = g:NERDTreeOpener.New(a:target.path, {'where': 't', 'stay': 1}) + call l:opener.open(a:target) endfunction " FUNCTION: s:openNodeRecursively(node) {{{1 diff --git a/sources_non_forked/nerdtree/lib/nerdtree/creator.vim b/sources_non_forked/nerdtree/lib/nerdtree/creator.vim index 92e1abeb..047939fa 100644 --- a/sources_non_forked/nerdtree/lib/nerdtree/creator.vim +++ b/sources_non_forked/nerdtree/lib/nerdtree/creator.vim @@ -1,11 +1,17 @@ -"CLASS: Creator -"Creates tab/window/mirror nerdtree windows. Sets up all the window and -"buffer options and key mappings etc. -"============================================================ +" ============================================================================ +" CLASS: Creator +" +" This class is responsible for creating NERDTree instances. The new NERDTree +" may be a tab tree, a window tree, or a mirrored tree. In the process of +" creating a NERDTree, it sets up all of the window and buffer options and key +" mappings etc. +" ============================================================================ + + let s:Creator = {} let g:NERDTreeCreator = s:Creator -"FUNCTION: s:Creator._bindMappings() {{{1 +" FUNCTION: s:Creator._bindMappings() {{{1 function! s:Creator._bindMappings() "make do the same as the activate node mapping nnoremap :call nerdtree#ui_glue#invokeKeyMap(g:NERDTreeMapActivateNode) @@ -22,7 +28,7 @@ function! s:Creator._bindMappings() command! -buffer -nargs=0 WriteBookmarks call g:NERDTreeBookmark.Write() endfunction -"FUNCTION: s:Creator._broadcastInitEvent() {{{1 +" FUNCTION: s:Creator._broadcastInitEvent() {{{1 function! s:Creator._broadcastInitEvent() silent doautocmd User NERDTreeInit endfunction @@ -32,55 +38,48 @@ function! s:Creator.BufNamePrefix() return 'NERD_tree_' endfunction -"FUNCTION: s:Creator.CreateTabTree(a:name) {{{1 +" FUNCTION: s:Creator.CreateTabTree(a:name) {{{1 function! s:Creator.CreateTabTree(name) let creator = s:Creator.New() call creator.createTabTree(a:name) endfunction -"FUNCTION: s:Creator.createTabTree(a:name) {{{1 -"name: the name of a bookmark or a directory +" FUNCTION: s:Creator.createTabTree(a:name) {{{1 +" name: the name of a bookmark or a directory function! s:Creator.createTabTree(name) - let path = self._pathForString(a:name) + let l:path = self._pathForString(a:name) - "abort if exception was thrown (bookmark/dir doesn't exist) - if empty(path) + " Abort if an exception was thrown (i.e., if the bookmark or directory + " does not exist). + if empty(l:path) return endif - if path == {} - return - endif - - "if instructed to, then change the vim CWD to the dir the NERDTree is - "inited in + " Obey the user's preferences for changing the working directory. if g:NERDTreeChDirMode != 0 - call path.changeToDir() + call l:path.changeToDir() endif if g:NERDTree.ExistsForTab() - if g:NERDTree.IsOpen() - call g:NERDTree.Close() - endif - + call g:NERDTree.Close() call self._removeTreeBufForTab() endif call self._createTreeWin() - call self._createNERDTree(path, "tab") + call self._createNERDTree(l:path, 'tab') call b:NERDTree.render() call b:NERDTree.root.putCursorHere(0, 0) call self._broadcastInitEvent() endfunction -"FUNCTION: s:Creator.CreateWindowTree(dir) {{{1 +" FUNCTION: s:Creator.CreateWindowTree(dir) {{{1 function! s:Creator.CreateWindowTree(dir) let creator = s:Creator.New() call creator.createWindowTree(a:dir) endfunction -"FUNCTION: s:Creator.createWindowTree(dir) {{{1 +" FUNCTION: s:Creator.createWindowTree(dir) {{{1 function! s:Creator.createWindowTree(dir) try let path = g:NERDTreePath.New(a:dir) @@ -110,9 +109,10 @@ endfunction " FUNCTION: s:Creator._createNERDTree(path) {{{1 function! s:Creator._createNERDTree(path, type) let b:NERDTree = g:NERDTree.New(a:path, a:type) - "TODO: This is kept for compatability only since many things use - "b:NERDTreeRoot instead of the new NERDTree.root - "Remove this one day + + " TODO: This assignment is kept for compatibility reasons. Many other + " plugins use "b:NERDTreeRoot" instead of "b:NERDTree.root". Remove this + " assignment in the future. let b:NERDTreeRoot = b:NERDTree.root call b:NERDTree.root.open() @@ -177,9 +177,9 @@ function! s:Creator.createMirror() endif endfunction -"FUNCTION: s:Creator._createTreeWin() {{{1 -"Inits the NERD tree window. ie. opens it, sizes it, sets all the local -"options etc +" FUNCTION: s:Creator._createTreeWin() {{{1 +" Inits the NERD tree window. ie. opens it, sizes it, sets all the local +" options etc function! s:Creator._createTreeWin() "create the nerd tree window let splitLocation = g:NERDTreeWinPos ==# "left" ? "topleft " : "botright " @@ -198,7 +198,7 @@ function! s:Creator._createTreeWin() call self._setCommonBufOptions() endfunction -"FUNCTION: s:Creator._isBufHidden(nr) {{{1 +" FUNCTION: s:Creator._isBufHidden(nr) {{{1 function! s:Creator._isBufHidden(nr) redir => bufs silent ls! @@ -207,7 +207,7 @@ function! s:Creator._isBufHidden(nr) return bufs =~ a:nr . '..h' endfunction -"FUNCTION: s:Creator.New() {{{1 +" FUNCTION: s:Creator.New() {{{1 function! s:Creator.New() let newCreator = copy(self) return newCreator @@ -232,8 +232,8 @@ function! s:Creator._nextBufferNumber() return s:Creator._NextBufNum endfunction -"FUNCTION: s:Creator._pathForString(str) {{{1 -"find a bookmark or adirectory for the given string +" FUNCTION: s:Creator._pathForString(str) {{{1 +" find a bookmark or adirectory for the given string function! s:Creator._pathForString(str) let path = {} if g:NERDTreeBookmark.BookmarkExistsFor(a:str) @@ -278,7 +278,7 @@ function! s:Creator._removeTreeBufForTab() unlet t:NERDTreeBufName endfunction -"FUNCTION: s:Creator._setCommonBufOptions() {{{1 +" FUNCTION: s:Creator._setCommonBufOptions() {{{1 function! s:Creator._setCommonBufOptions() "throwaway buffer options setlocal noswapfile @@ -310,7 +310,7 @@ function! s:Creator._setCommonBufOptions() setlocal filetype=nerdtree endfunction -"FUNCTION: s:Creator._setupStatusline() {{{1 +" FUNCTION: s:Creator._setupStatusline() {{{1 function! s:Creator._setupStatusline() if g:NERDTreeStatusline != -1 let &l:statusline = g:NERDTreeStatusline @@ -335,19 +335,19 @@ function! s:Creator._tabpagevar(tabnr, var) return v endfunction -"FUNCTION: s:Creator.ToggleTabTree(dir) {{{1 +" FUNCTION: s:Creator.ToggleTabTree(dir) {{{1 function! s:Creator.ToggleTabTree(dir) let creator = s:Creator.New() call creator.toggleTabTree(a:dir) endfunction -"FUNCTION: s:Creator.toggleTabTree(dir) {{{1 -"Toggles the NERD tree. I.e the NERD tree is open, it is closed, if it is -"closed it is restored or initialized (if it doesnt exist) +" FUNCTION: s:Creator.toggleTabTree(dir) {{{1 +" Toggles the NERD tree. I.e the NERD tree is open, it is closed, if it is +" closed it is restored or initialized (if it doesnt exist) " -"Args: -"dir: the full path for the root node (is only used if the NERD tree is being -"initialized. +" Args: +" dir: the full path for the root node (is only used if the NERD tree is being +" initialized. function! s:Creator.toggleTabTree(dir) if g:NERDTree.ExistsForTab() if !g:NERDTree.IsOpen() diff --git a/sources_non_forked/nerdtree/lib/nerdtree/nerdtree.vim b/sources_non_forked/nerdtree/lib/nerdtree/nerdtree.vim index 1404cee0..ffbc9d3c 100644 --- a/sources_non_forked/nerdtree/lib/nerdtree/nerdtree.vim +++ b/sources_non_forked/nerdtree/lib/nerdtree/nerdtree.vim @@ -21,7 +21,7 @@ function! s:NERDTree.changeRoot(node) "change dir to the dir of the new root if instructed to if g:NERDTreeChDirMode ==# 2 - exec "cd " . self.root.path.str({'format': 'Edit'}) + call self.root.path.changeToDir() endif call self.render() diff --git a/sources_non_forked/nerdtree/lib/nerdtree/opener.vim b/sources_non_forked/nerdtree/lib/nerdtree/opener.vim index fd32e643..974d99d3 100644 --- a/sources_non_forked/nerdtree/lib/nerdtree/opener.vim +++ b/sources_non_forked/nerdtree/lib/nerdtree/opener.vim @@ -126,38 +126,29 @@ function! s:Opener._isWindowUsable(winnumber) endfunction " FUNCTION: Opener.New(path, opts) {{{1 +" Instantiate a new NERDTreeOpener object. " Args: -" -" a:path: The path object that is to be opened. -" -" a:opts: -" -" A dictionary containing the following keys (all optional): -" 'where': Specifies whether the node should be opened in new split/tab or in -" the previous window. Can be either 'v' or 'h' or 't' (for open in -" new tab) -" 'reuse': if a window is displaying the file then jump the cursor there. Can -" 'all', 'currenttab' or empty to not reuse. -" 'keepopen': dont close the tree window -" 'stay': open the file, but keep the cursor in the tree win +" a:path: the path object that is to be opened +" a:opts: a dictionary containing the following optional keys... +" 'where': specifies whether the node should be opened in new split, in +" a new tab or, in the last window; takes values "v", "h", or "t" +" 'reuse': if file is already shown in a window, jump there; takes values +" "all", "currenttab", or empty +" 'keepopen': boolean (0 or 1); if true, the tree window will not be closed +" 'stay': boolean (0 or 1); if true, remain in tree window after opening function! s:Opener.New(path, opts) - let newObj = copy(self) + let l:newOpener = copy(self) - let newObj._path = a:path - let newObj._stay = nerdtree#has_opt(a:opts, 'stay') + let l:newOpener._keepopen = nerdtree#has_opt(a:opts, 'keepopen') + let l:newOpener._nerdtree = b:NERDTree + let l:newOpener._path = a:path + let l:newOpener._reuse = has_key(a:opts, 'reuse') ? a:opts['reuse'] : '' + let l:newOpener._stay = nerdtree#has_opt(a:opts, 'stay') + let l:newOpener._where = has_key(a:opts, 'where') ? a:opts['where'] : '' - if has_key(a:opts, 'reuse') - let newObj._reuse = a:opts['reuse'] - else - let newObj._reuse = '' - endif + call l:newOpener._saveCursorPos() - let newObj._keepopen = nerdtree#has_opt(a:opts, 'keepopen') - let newObj._where = has_key(a:opts, 'where') ? a:opts['where'] : '' - let newObj._nerdtree = b:NERDTree - call newObj._saveCursorPos() - - return newObj + return l:newOpener endfunction " FUNCTION: Opener._newSplit() {{{1 @@ -242,33 +233,40 @@ endfunction " FUNCTION: Opener.open(target) {{{1 function! s:Opener.open(target) + if self._path.isDirectory call self._openDirectory(a:target) - else - call self._openFile() + return endif + + call self._openFile() endfunction " FUNCTION: Opener._openFile() {{{1 function! s:Opener._openFile() + if self._reuseWindow() return endif call self._gotoTargetWin() - call self._path.edit() + if self._stay + silent call self._path.edit() call self._restoreCursorPos() + return endif + + call self._path.edit() endfunction " FUNCTION: Opener._openDirectory(node) {{{1 function! s:Opener._openDirectory(node) + call self._gotoTargetWin() + if self._nerdtree.isWinTree() - call self._gotoTargetWin() call g:NERDTreeCreator.CreateWindowTree(a:node.path.str()) else - call self._gotoTargetWin() if empty(self._where) call b:NERDTree.changeRoot(a:node) elseif self._where == 't' diff --git a/sources_non_forked/nerdtree/lib/nerdtree/tree_dir_node.vim b/sources_non_forked/nerdtree/lib/nerdtree/tree_dir_node.vim index 62bcf882..03c3545b 100644 --- a/sources_non_forked/nerdtree/lib/nerdtree/tree_dir_node.vim +++ b/sources_non_forked/nerdtree/lib/nerdtree/tree_dir_node.vim @@ -21,12 +21,19 @@ function! s:TreeDirNode.AbsoluteTreeRoot() endfunction " FUNCTION: TreeDirNode.activate([options]) {{{1 -unlet s:TreeDirNode.activate function! s:TreeDirNode.activate(...) - let opts = a:0 ? a:1 : {} - call self.toggleOpen(opts) - call self.getNerdtree().render() - call self.putCursorHere(0, 0) + let l:options = (a:0 > 0) ? a:1 : {} + + call self.toggleOpen(l:options) + + " Note that we only re-render the NERDTree for this node if we did NOT + " create a new node and render it in a new window or tab. In the latter + " case, rendering the NERDTree for this node could overwrite the text of + " the new NERDTree! + if !has_key(l:options, 'where') || empty(l:options['where']) + call self.getNerdtree().render() + call self.putCursorHere(0, 0) + endif endfunction " FUNCTION: TreeDirNode.addChild(treenode, inOrder) {{{1 diff --git a/sources_non_forked/nerdtree/lib/nerdtree/ui.vim b/sources_non_forked/nerdtree/lib/nerdtree/ui.vim index 03f11b84..6ee8dab0 100644 --- a/sources_non_forked/nerdtree/lib/nerdtree/ui.vim +++ b/sources_non_forked/nerdtree/lib/nerdtree/ui.vim @@ -47,6 +47,8 @@ function! s:UI._dumpHelp() let help .= "\" ". (g:NERDTreeMouseMode ==# 1 ? "double" : "single") ."-click,\n" let help .= "\" ". g:NERDTreeMapActivateNode .": open & close node\n" let help .= "\" ". g:NERDTreeMapOpenRecursively .": recursively open node\n" + let help .= "\" ". g:NERDTreeMapOpenInTab.": open in new tab\n" + let help .= "\" ". g:NERDTreeMapOpenInTabSilent .": open in new tab silently\n" let help .= "\" ". g:NERDTreeMapCloseDir .": close parent of node\n" let help .= "\" ". g:NERDTreeMapCloseChildren .": close all child nodes of\n" let help .= "\" current node recursively\n" diff --git a/sources_non_forked/nerdtree/nerdtree_plugin/fs_menu.vim b/sources_non_forked/nerdtree/nerdtree_plugin/fs_menu.vim index bdb638ec..3bb11dba 100644 --- a/sources_non_forked/nerdtree/nerdtree_plugin/fs_menu.vim +++ b/sources_non_forked/nerdtree/nerdtree_plugin/fs_menu.vim @@ -55,7 +55,22 @@ function! s:promptToDelBuffer(bufnum, msg) " Is not it better to close single tabs with this file only ? let s:originalTabNumber = tabpagenr() let s:originalWindowNumber = winnr() - exec "tabdo windo if winbufnr(0) == " . a:bufnum . " | exec ':enew! ' | endif" + " Go to the next buffer in buffer list if at least one extra buffer is listed + " Otherwise open a new empty buffer + if v:version >= 800 + let l:listedBufferCount = len(getbufinfo({'buflisted':1})) + elseif v:version >= 702 + let l:listedBufferCount = len(filter(range(1, bufnr('$')), 'buflisted(v:val)')) + else + " Ignore buffer count in this case to make sure we keep the old + " behavior + let l:listedBufferCount = 0 + endif + if l:listedBufferCount > 1 + exec "tabdo windo if winbufnr(0) == " . a:bufnum . " | exec ':bnext! ' | endif" + else + exec "tabdo windo if winbufnr(0) == " . a:bufnum . " | exec ':enew! ' | endif" + endif exec "tabnext " . s:originalTabNumber exec s:originalWindowNumber . "wincmd w" " 3. We don't need a previous buffer anymore @@ -202,11 +217,21 @@ endfunction " FUNCTION: NERDTreeListNode() {{{1 function! NERDTreeListNode() let treenode = g:NERDTreeFileNode.GetSelected() - if treenode != {} - let metadata = split(system('ls -ld ' . shellescape(treenode.path.str())), '\n') + if !empty(treenode) + if has("osx") + let stat_cmd = 'stat -f "%z" ' + else + let stat_cmd = 'stat -c "%s" ' + endif + + let cmd = 'size=$(' . stat_cmd . shellescape(treenode.path.str()) . ') && ' . + \ 'size_with_commas=$(echo $size | sed -e :a -e "s/\(.*[0-9]\)\([0-9]\{3\}\)/\1,\2/;ta") && ' . + \ 'ls -ld ' . shellescape(treenode.path.str()) . ' | sed -e "s/ $size / $size_with_commas /"' + + let metadata = split(system(cmd),'\n') call nerdtree#echo(metadata[0]) else - call nerdtree#echo("No information avaialable") + call nerdtree#echo("No information available") endif endfunction diff --git a/sources_non_forked/nerdtree/plugin/NERD_tree.vim b/sources_non_forked/nerdtree/plugin/NERD_tree.vim index 7eeb682c..35b47c38 100644 --- a/sources_non_forked/nerdtree/plugin/NERD_tree.vim +++ b/sources_non_forked/nerdtree/plugin/NERD_tree.vim @@ -69,7 +69,7 @@ call s:initVariable("g:NERDTreeShowHidden", 0) call s:initVariable("g:NERDTreeShowLineNumbers", 0) call s:initVariable("g:NERDTreeSortDirs", 1) -if !nerdtree#runningWindows() +if !nerdtree#runningWindows() && !nerdtree#runningCygwin() call s:initVariable("g:NERDTreeDirArrowExpandable", "▸") call s:initVariable("g:NERDTreeDirArrowCollapsible", "▾") else diff --git a/sources_non_forked/nginx-vim-syntax/README.md b/sources_non_forked/nginx-vim-syntax/README.md deleted file mode 100644 index 2893faf6..00000000 --- a/sources_non_forked/nginx-vim-syntax/README.md +++ /dev/null @@ -1,10 +0,0 @@ -# nginx syntax files for Vim. - -*NOTE*: As of Dec. 2013, these scripts are maintained in the "contrib" directory of the Nginx source: - -* http://hg.nginx.org/nginx/rev/f38043bd15f5 - -You can see the original vim.org version here: - -* http://www.vim.org/scripts/script.php?script_id=1886 - diff --git a/sources_non_forked/nginx-vim-syntax/ftdetect/nginx.vim b/sources_non_forked/nginx-vim-syntax/ftdetect/nginx.vim deleted file mode 100644 index 3ae470d2..00000000 --- a/sources_non_forked/nginx-vim-syntax/ftdetect/nginx.vim +++ /dev/null @@ -1,4 +0,0 @@ -au BufRead,BufNewFile *.nginx set ft=nginx -au BufRead,BufNewFile */etc/nginx/* set ft=nginx -au BufRead,BufNewFile */usr/local/nginx/conf/* set ft=nginx -au BufRead,BufNewFile nginx.conf set ft=nginx diff --git a/sources_non_forked/nginx-vim-syntax/indent/nginx.vim b/sources_non_forked/nginx-vim-syntax/indent/nginx.vim deleted file mode 100644 index 86013668..00000000 --- a/sources_non_forked/nginx-vim-syntax/indent/nginx.vim +++ /dev/null @@ -1,11 +0,0 @@ -if exists("b:did_indent") - finish -endif -let b:did_indent = 1 - -setlocal indentexpr= - -" cindent actually works for nginx' simple file structure -setlocal cindent -" Just make sure that the comments are not reset as defs would be. -setlocal cinkeys-=0# diff --git a/sources_non_forked/nginx-vim-syntax/syntax/nginx.vim b/sources_non_forked/nginx-vim-syntax/syntax/nginx.vim deleted file mode 100644 index 50d809bc..00000000 --- a/sources_non_forked/nginx-vim-syntax/syntax/nginx.vim +++ /dev/null @@ -1,703 +0,0 @@ -" Vim syntax file -" Language: nginx.conf - -if exists("b:current_syntax") - finish -end - -setlocal iskeyword+=. -setlocal iskeyword+=/ -setlocal iskeyword+=: - -syn match ngxVariable '\$\(\w\+\|{\w\+}\)' -syn match ngxVariableBlock '\$\(\w\+\|{\w\+}\)' contained -syn match ngxVariableString '\$\(\w\+\|{\w\+}\)' contained -syn region ngxBlock start=+^+ end=+{+ skip=+\${+ contains=ngxComment,ngxDirectiveBlock,ngxVariableBlock,ngxString oneline -syn region ngxString start=+\z(["']\)+ end=+\z1+ skip=+\\\\\|\\\z1+ contains=ngxVariableString -syn match ngxComment ' *#.*$' - -syn keyword ngxBoolean on -syn keyword ngxBoolean off - -syn keyword ngxDirectiveBlock http contained -syn keyword ngxDirectiveBlock mail contained -syn keyword ngxDirectiveBlock events contained -syn keyword ngxDirectiveBlock server contained -syn keyword ngxDirectiveBlock types contained -syn keyword ngxDirectiveBlock location contained -syn keyword ngxDirectiveBlock upstream contained -syn keyword ngxDirectiveBlock charset_map contained -syn keyword ngxDirectiveBlock limit_except contained -syn keyword ngxDirectiveBlock if contained -syn keyword ngxDirectiveBlock geo contained -syn keyword ngxDirectiveBlock map contained - -syn keyword ngxDirectiveImportant include -syn keyword ngxDirectiveImportant root -syn keyword ngxDirectiveImportant server -syn keyword ngxDirectiveImportant server_name -syn keyword ngxDirectiveImportant listen -syn keyword ngxDirectiveImportant internal -syn keyword ngxDirectiveImportant proxy_pass -syn keyword ngxDirectiveImportant memcached_pass -syn keyword ngxDirectiveImportant fastcgi_pass -syn keyword ngxDirectiveImportant try_files - -syn keyword ngxDirectiveControl break -syn keyword ngxDirectiveControl return -syn keyword ngxDirectiveControl rewrite -syn keyword ngxDirectiveControl set - -syn keyword ngxDirectiveError error_page -syn keyword ngxDirectiveError post_action - -syn keyword ngxDirectiveDeprecated connections -syn keyword ngxDirectiveDeprecated imap -syn keyword ngxDirectiveDeprecated open_file_cache_retest -syn keyword ngxDirectiveDeprecated optimize_server_names -syn keyword ngxDirectiveDeprecated satisfy_any - -syn keyword ngxDirective accept_mutex -syn keyword ngxDirective accept_mutex_delay -syn keyword ngxDirective access_log -syn keyword ngxDirective add_after_body -syn keyword ngxDirective add_before_body -syn keyword ngxDirective add_header -syn keyword ngxDirective addition_types -syn keyword ngxDirective aio -syn keyword ngxDirective alias -syn keyword ngxDirective allow -syn keyword ngxDirective ancient_browser -syn keyword ngxDirective ancient_browser_value -syn keyword ngxDirective auth_basic -syn keyword ngxDirective auth_basic_user_file -syn keyword ngxDirective auth_http -syn keyword ngxDirective auth_http_header -syn keyword ngxDirective auth_http_timeout -syn keyword ngxDirective autoindex -syn keyword ngxDirective autoindex_exact_size -syn keyword ngxDirective autoindex_localtime -syn keyword ngxDirective charset -syn keyword ngxDirective charset_types -syn keyword ngxDirective client_body_buffer_size -syn keyword ngxDirective client_body_in_file_only -syn keyword ngxDirective client_body_in_single_buffer -syn keyword ngxDirective client_body_temp_path -syn keyword ngxDirective client_body_timeout -syn keyword ngxDirective client_header_buffer_size -syn keyword ngxDirective client_header_timeout -syn keyword ngxDirective client_max_body_size -syn keyword ngxDirective connection_pool_size -syn keyword ngxDirective create_full_put_path -syn keyword ngxDirective daemon -syn keyword ngxDirective dav_access -syn keyword ngxDirective dav_methods -syn keyword ngxDirective debug_connection -syn keyword ngxDirective debug_points -syn keyword ngxDirective default_type -syn keyword ngxDirective degradation -syn keyword ngxDirective degrade -syn keyword ngxDirective deny -syn keyword ngxDirective devpoll_changes -syn keyword ngxDirective devpoll_events -syn keyword ngxDirective directio -syn keyword ngxDirective directio_alignment -syn keyword ngxDirective empty_gif -syn keyword ngxDirective env -syn keyword ngxDirective epoll_events -syn keyword ngxDirective error_log -syn keyword ngxDirective eventport_events -syn keyword ngxDirective expires -syn keyword ngxDirective fastcgi_bind -syn keyword ngxDirective fastcgi_buffer_size -syn keyword ngxDirective fastcgi_buffers -syn keyword ngxDirective fastcgi_busy_buffers_size -syn keyword ngxDirective fastcgi_cache -syn keyword ngxDirective fastcgi_cache_key -syn keyword ngxDirective fastcgi_cache_methods -syn keyword ngxDirective fastcgi_cache_min_uses -syn keyword ngxDirective fastcgi_cache_path -syn keyword ngxDirective fastcgi_cache_use_stale -syn keyword ngxDirective fastcgi_cache_valid -syn keyword ngxDirective fastcgi_catch_stderr -syn keyword ngxDirective fastcgi_connect_timeout -syn keyword ngxDirective fastcgi_hide_header -syn keyword ngxDirective fastcgi_ignore_client_abort -syn keyword ngxDirective fastcgi_ignore_headers -syn keyword ngxDirective fastcgi_index -syn keyword ngxDirective fastcgi_intercept_errors -syn keyword ngxDirective fastcgi_max_temp_file_size -syn keyword ngxDirective fastcgi_next_upstream -syn keyword ngxDirective fastcgi_param -syn keyword ngxDirective fastcgi_pass_header -syn keyword ngxDirective fastcgi_pass_request_body -syn keyword ngxDirective fastcgi_pass_request_headers -syn keyword ngxDirective fastcgi_read_timeout -syn keyword ngxDirective fastcgi_send_lowat -syn keyword ngxDirective fastcgi_send_timeout -syn keyword ngxDirective fastcgi_split_path_info -syn keyword ngxDirective fastcgi_store -syn keyword ngxDirective fastcgi_store_access -syn keyword ngxDirective fastcgi_temp_file_write_size -syn keyword ngxDirective fastcgi_temp_path -syn keyword ngxDirective fastcgi_upstream_fail_timeout -syn keyword ngxDirective fastcgi_upstream_max_fails -syn keyword ngxDirective flv -syn keyword ngxDirective geoip_city -syn keyword ngxDirective geoip_country -syn keyword ngxDirective google_perftools_profiles -syn keyword ngxDirective gzip -syn keyword ngxDirective gzip_buffers -syn keyword ngxDirective gzip_comp_level -syn keyword ngxDirective gzip_disable -syn keyword ngxDirective gzip_hash -syn keyword ngxDirective gzip_http_version -syn keyword ngxDirective gzip_min_length -syn keyword ngxDirective gzip_no_buffer -syn keyword ngxDirective gzip_proxied -syn keyword ngxDirective gzip_static -syn keyword ngxDirective gzip_types -syn keyword ngxDirective gzip_vary -syn keyword ngxDirective gzip_window -syn keyword ngxDirective if_modified_since -syn keyword ngxDirective ignore_invalid_headers -syn keyword ngxDirective image_filter -syn keyword ngxDirective image_filter_buffer -syn keyword ngxDirective image_filter_jpeg_quality -syn keyword ngxDirective image_filter_transparency -syn keyword ngxDirective imap_auth -syn keyword ngxDirective imap_capabilities -syn keyword ngxDirective imap_client_buffer -syn keyword ngxDirective index -syn keyword ngxDirective ip_hash -syn keyword ngxDirective keepalive_requests -syn keyword ngxDirective keepalive_timeout -syn keyword ngxDirective kqueue_changes -syn keyword ngxDirective kqueue_events -syn keyword ngxDirective large_client_header_buffers -syn keyword ngxDirective limit_conn -syn keyword ngxDirective limit_conn_log_level -syn keyword ngxDirective limit_rate -syn keyword ngxDirective limit_rate_after -syn keyword ngxDirective limit_req -syn keyword ngxDirective limit_req_log_level -syn keyword ngxDirective limit_req_zone -syn keyword ngxDirective limit_zone -syn keyword ngxDirective lingering_time -syn keyword ngxDirective lingering_timeout -syn keyword ngxDirective lock_file -syn keyword ngxDirective log_format -syn keyword ngxDirective log_not_found -syn keyword ngxDirective log_subrequest -syn keyword ngxDirective map_hash_bucket_size -syn keyword ngxDirective map_hash_max_size -syn keyword ngxDirective master_process -syn keyword ngxDirective memcached_bind -syn keyword ngxDirective memcached_buffer_size -syn keyword ngxDirective memcached_connect_timeout -syn keyword ngxDirective memcached_next_upstream -syn keyword ngxDirective memcached_read_timeout -syn keyword ngxDirective memcached_send_timeout -syn keyword ngxDirective memcached_upstream_fail_timeout -syn keyword ngxDirective memcached_upstream_max_fails -syn keyword ngxDirective merge_slashes -syn keyword ngxDirective min_delete_depth -syn keyword ngxDirective modern_browser -syn keyword ngxDirective modern_browser_value -syn keyword ngxDirective msie_padding -syn keyword ngxDirective msie_refresh -syn keyword ngxDirective multi_accept -syn keyword ngxDirective open_file_cache -syn keyword ngxDirective open_file_cache_errors -syn keyword ngxDirective open_file_cache_events -syn keyword ngxDirective open_file_cache_min_uses -syn keyword ngxDirective open_file_cache_valid -syn keyword ngxDirective open_log_file_cache -syn keyword ngxDirective output_buffers -syn keyword ngxDirective override_charset -syn keyword ngxDirective perl -syn keyword ngxDirective perl_modules -syn keyword ngxDirective perl_require -syn keyword ngxDirective perl_set -syn keyword ngxDirective pid -syn keyword ngxDirective pop3_auth -syn keyword ngxDirective pop3_capabilities -syn keyword ngxDirective port_in_redirect -syn keyword ngxDirective postpone_gzipping -syn keyword ngxDirective postpone_output -syn keyword ngxDirective protocol -syn keyword ngxDirective proxy -syn keyword ngxDirective proxy_bind -syn keyword ngxDirective proxy_buffer -syn keyword ngxDirective proxy_buffer_size -syn keyword ngxDirective proxy_buffering -syn keyword ngxDirective proxy_buffers -syn keyword ngxDirective proxy_busy_buffers_size -syn keyword ngxDirective proxy_cache -syn keyword ngxDirective proxy_cache_key -syn keyword ngxDirective proxy_cache_methods -syn keyword ngxDirective proxy_cache_min_uses -syn keyword ngxDirective proxy_cache_path -syn keyword ngxDirective proxy_cache_use_stale -syn keyword ngxDirective proxy_cache_valid -syn keyword ngxDirective proxy_connect_timeout -syn keyword ngxDirective proxy_headers_hash_bucket_size -syn keyword ngxDirective proxy_headers_hash_max_size -syn keyword ngxDirective proxy_hide_header -syn keyword ngxDirective proxy_ignore_client_abort -syn keyword ngxDirective proxy_ignore_headers -syn keyword ngxDirective proxy_intercept_errors -syn keyword ngxDirective proxy_max_temp_file_size -syn keyword ngxDirective proxy_method -syn keyword ngxDirective proxy_next_upstream -syn keyword ngxDirective proxy_pass_error_message -syn keyword ngxDirective proxy_pass_header -syn keyword ngxDirective proxy_pass_request_body -syn keyword ngxDirective proxy_pass_request_headers -syn keyword ngxDirective proxy_read_timeout -syn keyword ngxDirective proxy_redirect -syn keyword ngxDirective proxy_send_lowat -syn keyword ngxDirective proxy_send_timeout -syn keyword ngxDirective proxy_set_body -syn keyword ngxDirective proxy_set_header -syn keyword ngxDirective proxy_ssl_session_reuse -syn keyword ngxDirective proxy_store -syn keyword ngxDirective proxy_store_access -syn keyword ngxDirective proxy_temp_file_write_size -syn keyword ngxDirective proxy_temp_path -syn keyword ngxDirective proxy_timeout -syn keyword ngxDirective proxy_upstream_fail_timeout -syn keyword ngxDirective proxy_upstream_max_fails -syn keyword ngxDirective random_index -syn keyword ngxDirective read_ahead -syn keyword ngxDirective real_ip_header -syn keyword ngxDirective recursive_error_pages -syn keyword ngxDirective request_pool_size -syn keyword ngxDirective reset_timedout_connection -syn keyword ngxDirective resolver -syn keyword ngxDirective resolver_timeout -syn keyword ngxDirective rewrite_log -syn keyword ngxDirective rtsig_overflow_events -syn keyword ngxDirective rtsig_overflow_test -syn keyword ngxDirective rtsig_overflow_threshold -syn keyword ngxDirective rtsig_signo -syn keyword ngxDirective satisfy -syn keyword ngxDirective secure_link_secret -syn keyword ngxDirective send_lowat -syn keyword ngxDirective send_timeout -syn keyword ngxDirective sendfile -syn keyword ngxDirective sendfile_max_chunk -syn keyword ngxDirective server_name_in_redirect -syn keyword ngxDirective server_names_hash_bucket_size -syn keyword ngxDirective server_names_hash_max_size -syn keyword ngxDirective server_tokens -syn keyword ngxDirective set_real_ip_from -syn keyword ngxDirective smtp_auth -syn keyword ngxDirective smtp_capabilities -syn keyword ngxDirective smtp_client_buffer -syn keyword ngxDirective smtp_greeting_delay -syn keyword ngxDirective so_keepalive -syn keyword ngxDirective source_charset -syn keyword ngxDirective ssi -syn keyword ngxDirective ssi_ignore_recycled_buffers -syn keyword ngxDirective ssi_min_file_chunk -syn keyword ngxDirective ssi_silent_errors -syn keyword ngxDirective ssi_types -syn keyword ngxDirective ssi_value_length -syn keyword ngxDirective ssl -syn keyword ngxDirective ssl_certificate -syn keyword ngxDirective ssl_certificate_key -syn keyword ngxDirective ssl_ciphers -syn keyword ngxDirective ssl_client_certificate -syn keyword ngxDirective ssl_crl -syn keyword ngxDirective ssl_dhparam -syn keyword ngxDirective ssl_engine -syn keyword ngxDirective ssl_prefer_server_ciphers -syn keyword ngxDirective ssl_protocols -syn keyword ngxDirective ssl_session_cache -syn keyword ngxDirective ssl_session_timeout -syn keyword ngxDirective ssl_verify_client -syn keyword ngxDirective ssl_verify_depth -syn keyword ngxDirective starttls -syn keyword ngxDirective stub_status -syn keyword ngxDirective sub_filter -syn keyword ngxDirective sub_filter_once -syn keyword ngxDirective sub_filter_types -syn keyword ngxDirective tcp_nodelay -syn keyword ngxDirective tcp_nopush -syn keyword ngxDirective thread_stack_size -syn keyword ngxDirective timeout -syn keyword ngxDirective timer_resolution -syn keyword ngxDirective types_hash_bucket_size -syn keyword ngxDirective types_hash_max_size -syn keyword ngxDirective underscores_in_headers -syn keyword ngxDirective uninitialized_variable_warn -syn keyword ngxDirective use -syn keyword ngxDirective user -syn keyword ngxDirective userid -syn keyword ngxDirective userid_domain -syn keyword ngxDirective userid_expires -syn keyword ngxDirective userid_mark -syn keyword ngxDirective userid_name -syn keyword ngxDirective userid_p3p -syn keyword ngxDirective userid_path -syn keyword ngxDirective userid_service -syn keyword ngxDirective valid_referers -syn keyword ngxDirective variables_hash_bucket_size -syn keyword ngxDirective variables_hash_max_size -syn keyword ngxDirective worker_connections -syn keyword ngxDirective worker_cpu_affinity -syn keyword ngxDirective worker_priority -syn keyword ngxDirective worker_processes -syn keyword ngxDirective worker_rlimit_core -syn keyword ngxDirective worker_rlimit_nofile -syn keyword ngxDirective worker_rlimit_sigpending -syn keyword ngxDirective worker_threads -syn keyword ngxDirective working_directory -syn keyword ngxDirective xclient -syn keyword ngxDirective xml_entities -syn keyword ngxDirective xslt_stylesheet -syn keyword ngxDirective xslt_types - -" 3rd party module list: -" http://wiki.nginx.org/Nginx3rdPartyModules - -" Accept Language Module -" Parses the Accept-Language header and gives the most suitable locale from a list of supported locales. -syn keyword ngxDirectiveThirdParty set_from_accept_language - -" Access Key Module -" Denies access unless the request URL contains an access key. -syn keyword ngxDirectiveThirdParty accesskey -syn keyword ngxDirectiveThirdParty accesskey_arg -syn keyword ngxDirectiveThirdParty accesskey_hashmethod -syn keyword ngxDirectiveThirdParty accesskey_signature - -" Auth PAM Module -" HTTP Basic Authentication using PAM. -syn keyword ngxDirectiveThirdParty auth_pam -syn keyword ngxDirectiveThirdParty auth_pam_service_name - -" Cache Purge Module -" Module adding ability to purge content from FastCGI and proxy caches. -syn keyword ngxDirectiveThirdParty fastcgi_cache_purge -syn keyword ngxDirectiveThirdParty proxy_cache_purge - -" Chunkin Module -" HTTP 1.1 chunked-encoding request body support for Nginx. -syn keyword ngxDirectiveThirdParty chunkin -syn keyword ngxDirectiveThirdParty chunkin_keepalive -syn keyword ngxDirectiveThirdParty chunkin_max_chunks_per_buf -syn keyword ngxDirectiveThirdParty chunkin_resume - -" Circle GIF Module -" Generates simple circle images with the colors and size specified in the URL. -syn keyword ngxDirectiveThirdParty circle_gif -syn keyword ngxDirectiveThirdParty circle_gif_max_radius -syn keyword ngxDirectiveThirdParty circle_gif_min_radius -syn keyword ngxDirectiveThirdParty circle_gif_step_radius - -" Drizzle Module -" Make nginx talk directly to mysql, drizzle, and sqlite3 by libdrizzle. -syn keyword ngxDirectiveThirdParty drizzle_connect_timeout -syn keyword ngxDirectiveThirdParty drizzle_dbname -syn keyword ngxDirectiveThirdParty drizzle_keepalive -syn keyword ngxDirectiveThirdParty drizzle_module_header -syn keyword ngxDirectiveThirdParty drizzle_pass -syn keyword ngxDirectiveThirdParty drizzle_query -syn keyword ngxDirectiveThirdParty drizzle_recv_cols_timeout -syn keyword ngxDirectiveThirdParty drizzle_recv_rows_timeout -syn keyword ngxDirectiveThirdParty drizzle_send_query_timeout -syn keyword ngxDirectiveThirdParty drizzle_server - -" Echo Module -" Brings 'echo', 'sleep', 'time', 'exec' and more shell-style goodies to Nginx config file. -syn keyword ngxDirectiveThirdParty echo -syn keyword ngxDirectiveThirdParty echo_after_body -syn keyword ngxDirectiveThirdParty echo_before_body -syn keyword ngxDirectiveThirdParty echo_blocking_sleep -syn keyword ngxDirectiveThirdParty echo_duplicate -syn keyword ngxDirectiveThirdParty echo_end -syn keyword ngxDirectiveThirdParty echo_exec -syn keyword ngxDirectiveThirdParty echo_flush -syn keyword ngxDirectiveThirdParty echo_foreach_split -syn keyword ngxDirectiveThirdParty echo_location -syn keyword ngxDirectiveThirdParty echo_location_async -syn keyword ngxDirectiveThirdParty echo_read_request_body -syn keyword ngxDirectiveThirdParty echo_request_body -syn keyword ngxDirectiveThirdParty echo_reset_timer -syn keyword ngxDirectiveThirdParty echo_sleep -syn keyword ngxDirectiveThirdParty echo_subrequest -syn keyword ngxDirectiveThirdParty echo_subrequest_async - -" Events Module -" Privides options for start/stop events. -syn keyword ngxDirectiveThirdParty on_start -syn keyword ngxDirectiveThirdParty on_stop - -" EY Balancer Module -" Adds a request queue to Nginx that allows the limiting of concurrent requests passed to the upstream. -syn keyword ngxDirectiveThirdParty max_connections -syn keyword ngxDirectiveThirdParty max_connections_max_queue_length -syn keyword ngxDirectiveThirdParty max_connections_queue_timeout - -" Fancy Indexes Module -" Like the built-in autoindex module, but fancier. -syn keyword ngxDirectiveThirdParty fancyindex -syn keyword ngxDirectiveThirdParty fancyindex_exact_size -syn keyword ngxDirectiveThirdParty fancyindex_footer -syn keyword ngxDirectiveThirdParty fancyindex_header -syn keyword ngxDirectiveThirdParty fancyindex_localtime -syn keyword ngxDirectiveThirdParty fancyindex_readme -syn keyword ngxDirectiveThirdParty fancyindex_readme_mode - -" GeoIP Module (DEPRECATED) -" Country code lookups via the MaxMind GeoIP API. -syn keyword ngxDirectiveThirdParty geoip_country_file - -" Headers More Module -" Set and clear input and output headers...more than "add"! -syn keyword ngxDirectiveThirdParty more_clear_headers -syn keyword ngxDirectiveThirdParty more_clear_input_headers -syn keyword ngxDirectiveThirdParty more_set_headers -syn keyword ngxDirectiveThirdParty more_set_input_headers - -" HTTP Push Module -" Turn Nginx into an adept long-polling HTTP Push (Comet) server. -syn keyword ngxDirectiveThirdParty push_buffer_size -syn keyword ngxDirectiveThirdParty push_listener -syn keyword ngxDirectiveThirdParty push_message_timeout -syn keyword ngxDirectiveThirdParty push_queue_messages -syn keyword ngxDirectiveThirdParty push_sender - -" HTTP Redis Module > -" Redis support.> -syn keyword ngxDirectiveThirdParty redis_bind -syn keyword ngxDirectiveThirdParty redis_buffer_size -syn keyword ngxDirectiveThirdParty redis_connect_timeout -syn keyword ngxDirectiveThirdParty redis_next_upstream -syn keyword ngxDirectiveThirdParty redis_pass -syn keyword ngxDirectiveThirdParty redis_read_timeout -syn keyword ngxDirectiveThirdParty redis_send_timeout - -" HTTP JavaScript Module -" Embedding SpiderMonkey. Nearly full port on Perl module. -syn keyword ngxDirectiveThirdParty js -syn keyword ngxDirectiveThirdParty js_filter -syn keyword ngxDirectiveThirdParty js_filter_types -syn keyword ngxDirectiveThirdParty js_load -syn keyword ngxDirectiveThirdParty js_maxmem -syn keyword ngxDirectiveThirdParty js_require -syn keyword ngxDirectiveThirdParty js_set -syn keyword ngxDirectiveThirdParty js_utf8 - -" Log Request Speed -" Log the time it took to process each request. -syn keyword ngxDirectiveThirdParty log_request_speed_filter -syn keyword ngxDirectiveThirdParty log_request_speed_filter_timeout - -" Memc Module -" An extended version of the standard memcached module that supports set, add, delete, and many more memcached commands. -syn keyword ngxDirectiveThirdParty memc_buffer_size -syn keyword ngxDirectiveThirdParty memc_cmds_allowed -syn keyword ngxDirectiveThirdParty memc_connect_timeout -syn keyword ngxDirectiveThirdParty memc_flags_to_last_modified -syn keyword ngxDirectiveThirdParty memc_next_upstream -syn keyword ngxDirectiveThirdParty memc_pass -syn keyword ngxDirectiveThirdParty memc_read_timeout -syn keyword ngxDirectiveThirdParty memc_send_timeout -syn keyword ngxDirectiveThirdParty memc_upstream_fail_timeout -syn keyword ngxDirectiveThirdParty memc_upstream_max_fails - -" Mogilefs Module -" Implements a MogileFS client, provides a replace to the Perlbal reverse proxy of the original MogileFS. -syn keyword ngxDirectiveThirdParty mogilefs_connect_timeout -syn keyword ngxDirectiveThirdParty mogilefs_domain -syn keyword ngxDirectiveThirdParty mogilefs_methods -syn keyword ngxDirectiveThirdParty mogilefs_noverify -syn keyword ngxDirectiveThirdParty mogilefs_pass -syn keyword ngxDirectiveThirdParty mogilefs_read_timeout -syn keyword ngxDirectiveThirdParty mogilefs_send_timeout -syn keyword ngxDirectiveThirdParty mogilefs_tracker - -" MP4 Streaming Lite Module -" Will seek to a certain time within H.264/MP4 files when provided with a 'start' parameter in the URL. -syn keyword ngxDirectiveThirdParty mp4 - -" Nginx Notice Module -" Serve static file to POST requests. -syn keyword ngxDirectiveThirdParty notice -syn keyword ngxDirectiveThirdParty notice_type - -" Phusion Passenger -" Easy and robust deployment of Ruby on Rails application on Apache and Nginx webservers. -syn keyword ngxDirectiveThirdParty passenger_base_uri -syn keyword ngxDirectiveThirdParty passenger_default_user -syn keyword ngxDirectiveThirdParty passenger_enabled -syn keyword ngxDirectiveThirdParty passenger_log_level -syn keyword ngxDirectiveThirdParty passenger_max_instances_per_app -syn keyword ngxDirectiveThirdParty passenger_max_pool_size -syn keyword ngxDirectiveThirdParty passenger_pool_idle_time -syn keyword ngxDirectiveThirdParty passenger_root -syn keyword ngxDirectiveThirdParty passenger_ruby -syn keyword ngxDirectiveThirdParty passenger_use_global_queue -syn keyword ngxDirectiveThirdParty passenger_user_switching -syn keyword ngxDirectiveThirdParty rack_env -syn keyword ngxDirectiveThirdParty rails_app_spawner_idle_time -syn keyword ngxDirectiveThirdParty rails_env -syn keyword ngxDirectiveThirdParty rails_framework_spawner_idle_time -syn keyword ngxDirectiveThirdParty rails_spawn_method - -" RDS JSON Module -" Help ngx_drizzle and other DBD modules emit JSON data. -syn keyword ngxDirectiveThirdParty rds_json -syn keyword ngxDirectiveThirdParty rds_json_content_type -syn keyword ngxDirectiveThirdParty rds_json_format -syn keyword ngxDirectiveThirdParty rds_json_ret - -" RRD Graph Module -" This module provides an HTTP interface to RRDtool's graphing facilities. -syn keyword ngxDirectiveThirdParty rrd_graph -syn keyword ngxDirectiveThirdParty rrd_graph_root - -" Secure Download -" Create expiring links. -syn keyword ngxDirectiveThirdParty secure_download -syn keyword ngxDirectiveThirdParty secure_download_fail_location -syn keyword ngxDirectiveThirdParty secure_download_path_mode -syn keyword ngxDirectiveThirdParty secure_download_secret - -" SlowFS Cache Module -" Module adding ability to cache static files. -syn keyword ngxDirectiveThirdParty slowfs_big_file_size -syn keyword ngxDirectiveThirdParty slowfs_cache -syn keyword ngxDirectiveThirdParty slowfs_cache_key -syn keyword ngxDirectiveThirdParty slowfs_cache_min_uses -syn keyword ngxDirectiveThirdParty slowfs_cache_path -syn keyword ngxDirectiveThirdParty slowfs_cache_purge -syn keyword ngxDirectiveThirdParty slowfs_cache_valid -syn keyword ngxDirectiveThirdParty slowfs_temp_path - -" Strip Module -" Whitespace remover. -syn keyword ngxDirectiveThirdParty strip - -" Substitutions Module -" A filter module which can do both regular expression and fixed string substitutions on response bodies. -syn keyword ngxDirectiveThirdParty subs_filter -syn keyword ngxDirectiveThirdParty subs_filter_types - -" Supervisord Module -" Module providing nginx with API to communicate with supervisord and manage (start/stop) backends on-demand. -syn keyword ngxDirectiveThirdParty supervisord -syn keyword ngxDirectiveThirdParty supervisord_inherit_backend_status -syn keyword ngxDirectiveThirdParty supervisord_name -syn keyword ngxDirectiveThirdParty supervisord_start -syn keyword ngxDirectiveThirdParty supervisord_stop - -" Upload Module -" Parses multipart/form-data allowing arbitrary handling of uploaded files. -syn keyword ngxDirectiveThirdParty upload_aggregate_form_field -syn keyword ngxDirectiveThirdParty upload_buffer_size -syn keyword ngxDirectiveThirdParty upload_cleanup -syn keyword ngxDirectiveThirdParty upload_limit_rate -syn keyword ngxDirectiveThirdParty upload_max_file_size -syn keyword ngxDirectiveThirdParty upload_max_output_body_len -syn keyword ngxDirectiveThirdParty upload_max_part_header_len -syn keyword ngxDirectiveThirdParty upload_pass -syn keyword ngxDirectiveThirdParty upload_pass_args -syn keyword ngxDirectiveThirdParty upload_pass_form_field -syn keyword ngxDirectiveThirdParty upload_set_form_field -syn keyword ngxDirectiveThirdParty upload_store -syn keyword ngxDirectiveThirdParty upload_store_access - -" Upload Progress Module -" Tracks and reports upload progress. -syn keyword ngxDirectiveThirdParty report_uploads -syn keyword ngxDirectiveThirdParty track_uploads -syn keyword ngxDirectiveThirdParty upload_progress -syn keyword ngxDirectiveThirdParty upload_progress_content_type -syn keyword ngxDirectiveThirdParty upload_progress_header -syn keyword ngxDirectiveThirdParty upload_progress_json_output -syn keyword ngxDirectiveThirdParty upload_progress_template - -" Upstream Fair Balancer -" Sends an incoming request to the least-busy backend server, rather than distributing requests round-robin. -syn keyword ngxDirectiveThirdParty fair -syn keyword ngxDirectiveThirdParty upstream_fair_shm_size - -" Upstream Consistent Hash -" Select backend based on Consistent hash ring. -syn keyword ngxDirectiveThirdParty consistent_hash - -" Upstream Hash Module -" Provides simple upstream load distribution by hashing a configurable variable. -syn keyword ngxDirectiveThirdParty hash -syn keyword ngxDirectiveThirdParty hash_again - -" XSS Module -" Native support for cross-site scripting (XSS) in an nginx. -syn keyword ngxDirectiveThirdParty xss_callback_arg -syn keyword ngxDirectiveThirdParty xss_get -syn keyword ngxDirectiveThirdParty xss_input_types -syn keyword ngxDirectiveThirdParty xss_output_type - -" uWSGI Module -" Allows Nginx to interact with uWSGI processes and control what parameters are passed to the process. -syn keyword ngxDirectiveThirdParty uwsgi_bind -syn keyword ngxDirectiveThirdParty uwsgi_buffer_size -syn keyword ngxDirectiveThirdParty uwsgi_buffering -syn keyword ngxDirectiveThirdParty uwsgi_buffers -syn keyword ngxDirectiveThirdParty uwsgi_busy_buffers_size -syn keyword ngxDirectiveThirdParty uwsgi_cache -syn keyword ngxDirectiveThirdParty uwsgi_cache_bypass -syn keyword ngxDirectiveThirdParty uwsgi_cache_key -syn keyword ngxDirectiveThirdParty uwsgi_cache_lock -syn keyword ngxDirectiveThirdParty uwsgi_cache_lock_timeout -syn keyword ngxDirectiveThirdParty uwsgi_cache_methods -syn keyword ngxDirectiveThirdParty uwsgi_cache_min_uses -syn keyword ngxDirectiveThirdParty uwsgi_cache_path -syn keyword ngxDirectiveThirdParty uwsgi_cache_use_stale -syn keyword ngxDirectiveThirdParty uwsgi_cache_valid -syn keyword ngxDirectiveThirdParty uwsgi_connect_timeout -syn keyword ngxDirectiveThirdParty uwsgi_hide_header -syn keyword ngxDirectiveThirdParty uwsgi_ignore_client_abort -syn keyword ngxDirectiveThirdParty uwsgi_ignore_headers -syn keyword ngxDirectiveThirdParty uwsgi_intercept_errors -syn keyword ngxDirectiveThirdParty uwsgi_max_temp_file_size -syn keyword ngxDirectiveThirdParty uwsgi_modifier1 -syn keyword ngxDirectiveThirdParty uwsgi_modifier2 -syn keyword ngxDirectiveThirdParty uwsgi_next_upstream -syn keyword ngxDirectiveThirdParty uwsgi_no_cache -syn keyword ngxDirectiveThirdParty uwsgi_param -syn keyword ngxDirectiveThirdParty uwsgi_pass -syn keyword ngxDirectiveThirdParty uwsgi_pass_header -syn keyword ngxDirectiveThirdParty uwsgi_pass_request_body -syn keyword ngxDirectiveThirdParty uwsgi_pass_request_headers -syn keyword ngxDirectiveThirdParty uwsgi_read_timeout -syn keyword ngxDirectiveThirdParty uwsgi_send_timeout -syn keyword ngxDirectiveThirdParty uwsgi_store -syn keyword ngxDirectiveThirdParty uwsgi_store_access -syn keyword ngxDirectiveThirdParty uwsgi_string -syn keyword ngxDirectiveThirdParty uwsgi_temp_file_write_size -syn keyword ngxDirectiveThirdParty uwsgi_temp_path - -" highlight - -hi link ngxComment Comment -hi link ngxVariable Identifier -hi link ngxVariableBlock Identifier -hi link ngxVariableString PreProc -hi link ngxBlock Normal -hi link ngxString String - -hi link ngxBoolean Boolean -hi link ngxDirectiveBlock Statement -hi link ngxDirectiveImportant Type -hi link ngxDirectiveControl Keyword -hi link ngxDirectiveError Constant -hi link ngxDirectiveDeprecated Error -hi link ngxDirective Identifier -hi link ngxDirectiveThirdParty Special - -let b:current_syntax = "nginx" diff --git a/sources_non_forked/syntastic/README.markdown b/sources_non_forked/syntastic/README.markdown index 66d996ef..346123ee 100644 --- a/sources_non_forked/syntastic/README.markdown +++ b/sources_non_forked/syntastic/README.markdown @@ -61,10 +61,10 @@ 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, Julia, 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, OS X and iOS property lists, Pug +GLSL, Go, Haml, Haskell, Haxe, Handlebars, HSS, HTML, Java, JavaScript, JSON, +JSX, Julia, LESS, Lex, Limbo, LISP, LLVM intermediate language, Lua, Markdown, +MATLAB, Mercury, NASM, Nix, Objective-C, Objective-C++, OCaml, Perl, Perl +6, Perl POD, PHP, gettext Portable Object, 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, Vala, Verilog, VHDL, diff --git a/sources_non_forked/syntastic/autoload/syntastic/postprocess.vim b/sources_non_forked/syntastic/autoload/syntastic/postprocess.vim index 136fa589..c69f3978 100644 --- a/sources_non_forked/syntastic/autoload/syntastic/postprocess.vim +++ b/sources_non_forked/syntastic/autoload/syntastic/postprocess.vim @@ -65,6 +65,17 @@ function! syntastic#postprocess#guards(errors) abort " {{{2 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 diff --git a/sources_non_forked/syntastic/autoload/syntastic/preprocess.vim b/sources_non_forked/syntastic/autoload/syntastic/preprocess.vim index 43a1b9ac..79e4face 100644 --- a/sources_non_forked/syntastic/autoload/syntastic/preprocess.vim +++ b/sources_non_forked/syntastic/autoload/syntastic/preprocess.vim @@ -264,6 +264,43 @@ function! syntastic#preprocess#perl(errors) abort " {{{2 return syntastic#util#unique(out) endfunction " }}}2 +function! syntastic#preprocess#perl6(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 perl6/perl6: unrecognized error item ' . string(val)) + let out = [] + endtry + else + call syntastic#log#warn('checker perl6/perl6: unrecognized error format') + endif + + return out +endfunction " }}}2 + function! syntastic#preprocess#prospector(errors) abort " {{{2 let errs = join(a:errors, '') if errs ==# '' diff --git a/sources_non_forked/syntastic/autoload/syntastic/util.vim b/sources_non_forked/syntastic/autoload/syntastic/util.vim index 3f0f70fb..8a17fe64 100644 --- a/sources_non_forked/syntastic/autoload/syntastic/util.vim +++ b/sources_non_forked/syntastic/autoload/syntastic/util.vim @@ -253,7 +253,7 @@ endfunction " }}}2 function! syntastic#util#findFileInParent(what, where) abort " {{{2 let old_suffixesadd = &suffixesadd let &suffixesadd = '' - let file = findfile(a:what, escape(a:where, ' ') . ';') + let file = findfile(a:what, escape(a:where, ' ,') . ';') let &suffixesadd = old_suffixesadd return file endfunction " }}}2 @@ -307,8 +307,14 @@ function! syntastic#util#fname2buf(fname) abort " {{{2 " 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'] - let buf = bufnr('^' . escape(fnamemodify(a:fname, md), '\*?,{}[') . '$') + 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 diff --git a/sources_non_forked/syntastic/doc/syntastic-checkers.txt b/sources_non_forked/syntastic/doc/syntastic-checkers.txt index d6d94386..ec76927a 100644 --- a/sources_non_forked/syntastic/doc/syntastic-checkers.txt +++ b/sources_non_forked/syntastic/doc/syntastic-checkers.txt @@ -81,6 +81,7 @@ SYNTAX CHECKERS BY LANGUAGE *syntastic-checkers-lang* OCaml....................................|syntastic-checkers-ocaml| Perl.....................................|syntastic-checkers-perl| + Perl 6...................................|syntastic-checkers-perl6| PHP......................................|syntastic-checkers-php| POD......................................|syntastic-checkers-pod| Pug (formerly Jade)......................|syntastic-checkers-pug| @@ -228,18 +229,18 @@ fatal errors in one of the included files. Type: string Default: unset Compilation flags (such as defines or include directories) to be passed to the -checker. +linter. *'g:syntastic_ada_config_file'* Type: string Default: ".syntastic_ada_config" -File containing additional compilation flags to be passed to the checker, one +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 checker, in addition to the above +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"] < @@ -263,7 +264,7 @@ Note~ This checker doesn't call the "makeprgBuild()" function, and thus it ignores the usual 'g:syntastic_ada_gcc_