Compare commits

...

38 Commits

Author SHA1 Message Date
Dan Reif
1f34e0adcf Update (periodic rebuild) 2018-06-05 13:50:18 -07:00
Adam Stankiewicz
a26134de3c Add graphql_javascript_tags, fixes #303 2018-05-10 18:59:56 +02:00
Dan Reif
e2404449e4 Merge pull request #301 from timfeirg:feature/graphql 2018-05-08 10:28:33 -07:00
Dan Reif
dc8b2f45de applescript: vim-scripts -> mityu 2018-05-08 10:19:22 -07:00
CH-DanReif
aa5502c32e Merge pull request #286 from idbrii/improve-applescript
Update applescript to one that provides ftdetect
2018-05-08 10:18:12 -07:00
Dan Reif
e13e64d9c4 Update (periodic rebuild) 2018-05-08 10:17:30 -07:00
CH-DanReif
17a69ab565 Merge pull request #300 from sheerun/shellcheck_build_cleanup
Cleanup `build` syntax a bit, aided by `shellcheck(1)`
2018-05-08 10:04:17 -07:00
David Briscoe
da27f4c529 Update applescript to one that provides ftdetect
Current applescript defines a syntax file, but doesn't setup an
applescript filetype to apply the syntax.

This one does ftdetect and indent. Its ftplugin for running applescript
through osascript is excluded.

It uses an identical syntax file to the existing one.
2018-05-03 14:30:55 -07:00
CH-DanReif
cdd0ef41a6 And now it's 2018.... 2018-05-01 11:54:32 -07:00
Dan Reif
4be5fd3094 Cleanup build syntax a bit, aided by shellcheck(1) 2018-04-30 20:02:14 -07:00
Dan Reif
bde56bc8f7 Support autoload config file for golang
Fixes #299
2018-04-30 19:41:18 -07:00
Dan Reif
d9b11ed072 Allow use of # to skip packages being built (for testing) 2018-04-30 16:43:12 -07:00
Dan Reif
565b8b8a2c set et on build 2018-04-30 14:57:13 -07:00
Dan Reif
9f13bb7354 Update README with slightly more verbose contribution guidelines 2018-04-30 12:55:50 -07:00
Dan Reif
7408b2a34a Update (switch wdwoods->kurayama for systemd)
See https://github.com/sheerun/vim-polyglot/pull/267
2018-04-30 12:22:26 -07:00
Chris Weyl
faf6999c44 Use upstream of systemd plugin
While not immediately apparent, wdwoods is actually the author of the
original work kurayama's repo is based on.
2018-04-30 12:20:04 -07:00
CH-DanReif
e9fc23a0c1 Merge pull request #281 from djpowers/patch-1
Fix typo in README
2018-04-30 12:12:25 -07:00
Dan Reif
3e0c887365 Update (periodic rebuild)
I originally meant to run this before adding haproxy, but accidentally
pushed that into my branch.  If you'd like to see that content, it's at
414ad25c3a.
2018-04-30 12:00:42 -07:00
CH-DanReif
b4d7993e7e Add haproxy to polyglot, check for directory existence before globbing it (#291)
Add haproxy to polyglot, check for directory existence before globbing it
2018-04-30 11:55:17 -07:00
CH-DanReif
fb8c5fa8e9 Merge pull request #293 from CH-DanReif/disable_individual_ftdetect
Allow disabling individual ftdetects via `g:polyglot_disabled`
2018-04-30 11:19:20 -07:00
Dan Reif
ddc64d8db2 Don't actually update ftdetect/polyglot.vim
It was only in the original commit because I wanted to demonstrate the
changes that would be made.  Revert it back out now to make this a
clean, svelte, easy-to-merge PR.
2018-04-16 11:36:02 -07:00
Dan Reif
98f90bced5 Allow disabling of individual ftdetect rules via g:polyglot_disabled 2018-04-16 11:31:57 -07:00
David Briscoe
cab6866e21 Increase test file parsing timeout (#288)
There's been several PRs that inexplicably failed tests.

PR #279 (applescript) failed with "should parse test.em file" despite
the exact same PR #286 passing (I've removed one of them, sorry again
about that).

PR #268 (pandoc) failed with "parse test.erb file" but doesn't mess with
eruby.

PR #281 (readme) failed with "should parse test.jsx file" but it's a one
word change to the readme!

My assumption is that vim startup on Travis is near the edge of the
timeout so we're getting false failures. (I'm not familiar with
Vimrunner or rspec, but I assume this code is just testing that vim
doesn't throw errors one edit and automatically exits at the end of the
block.)
2018-04-03 12:30:51 +02:00
Dave Powers
a7e2b8a700 Fix typo in README 2018-03-08 16:34:01 -05:00
Adam Stankiewicz
96c5c20e41 Include indentation setting for markdown, fixes #270 2018-02-06 11:16:48 +08:00
Adam Stankiewicz
18efda3933 Update 2018-02-06 11:15:01 +08:00
Adam Stankiewicz
bfc6ed9fba Fix filetype detection by extension, #262 2018-01-10 23:54:03 +01:00
Adam Stankiewicz
58709c49f6 Update 2018-01-10 23:50:02 +01:00
Adam Stankiewicz
3d5b784fa5 Add example how to install this plugin, closes #260 2018-01-07 23:08:39 +01:00
Adam Stankiewicz
cef5e2d931 Disable ftdetect parts of some plugins, fixes #254
vim-polyglot discourages use of commands like:

autocmd BufRead *
autocmd BufNewFile *

And others that execute for every file / buffer opened.
2017-12-30 15:53:17 +01:00
Adam Stankiewicz
17ad302c54 Change python syntax providers, closes #209 2017-12-30 11:55:40 +01:00
Adam Stankiewicz
1541356fe1 Add json5 support, closes #256 2017-12-30 11:34:40 +01:00
Adam Stankiewicz
f3556c1eca Add carp language support, closes #258 2017-12-30 11:29:38 +01:00
Adam Stankiewicz
4855e5ee82 Add vital file for crystal, fixes #259 2017-12-30 11:26:56 +01:00
Adam Stankiewicz
bb85059bac Update 2017-12-30 11:10:32 +01:00
Adam Stankiewicz
11f53253ad Add slime syntax, closes #252 2017-12-06 13:17:06 +01:00
Adam Stankiewicz
9fe009095a Change julia provider to JuliaEditorSupport/julia-vim, closes #253 2017-12-06 13:05:56 +01:00
Adam Stankiewicz
dce9e8dec5 Update 2017-12-06 12:56:27 +01:00
125 changed files with 12894 additions and 3299 deletions

View File

@@ -1,4 +1,4 @@
# vim-polyglot [![Build Status][travis-img-url]][travis-url] [![Maintenance](https://img.shields.io/maintenance/yes/2017.svg?maxAge=2592000)]() # vim-polyglot [![Build Status][travis-img-url]][travis-url] [![Maintenance](https://img.shields.io/maintenance/yes/2018.svg?maxAge=2592000)]()
[travis-img-url]: https://travis-ci.org/sheerun/vim-polyglot.svg [travis-img-url]: https://travis-ci.org/sheerun/vim-polyglot.svg
[travis-url]: https://travis-ci.org/sheerun/vim-polyglot [travis-url]: https://travis-ci.org/sheerun/vim-polyglot
@@ -21,6 +21,12 @@ A collection of language packs for Vim.
1. Install [Pathogen](https://github.com/tpope/vim-pathogen), [Vundle](https://github.com/VundleVim/Vundle.vim), [NeoBundle](https://github.com/Shougo/neobundle.vim), or [Plug](https://github.com/junegunn/vim-plug) package manager for Vim. 1. Install [Pathogen](https://github.com/tpope/vim-pathogen), [Vundle](https://github.com/VundleVim/Vundle.vim), [NeoBundle](https://github.com/Shougo/neobundle.vim), or [Plug](https://github.com/junegunn/vim-plug) package manager for Vim.
2. Use this repository as submodule or package. 2. Use this repository as submodule or package.
For example when using [Plug](https://github.com/junegunn/vim-plug):
```
Plug 'sheerun/vim-polyglot'
```
Optionally download one of the [releases](https://github.com/sheerun/vim-polyglot/releases) and unpack it directly under `~/.vim` directory. Optionally download one of the [releases](https://github.com/sheerun/vim-polyglot/releases) and unpack it directly under `~/.vim` directory.
You can also use Vim 8 built-in package manager: You can also use Vim 8 built-in package manager:
@@ -38,7 +44,7 @@ If you need full functionality of any plugin, please use it directly with your p
- [ansible](https://github.com/pearofducks/ansible-vim) (syntax, indent, ftplugin) - [ansible](https://github.com/pearofducks/ansible-vim) (syntax, indent, ftplugin)
- [apiblueprint](https://github.com/sheerun/apiblueprint.vim) (syntax) - [apiblueprint](https://github.com/sheerun/apiblueprint.vim) (syntax)
- [applescript](https://github.com/vim-scripts/applescript.vim) (syntax) - [applescript](https://github.com/mityu/vim-applescript) (syntax, indent)
- [arduino](https://github.com/sudar/vim-arduino-syntax) (syntax, indent) - [arduino](https://github.com/sudar/vim-arduino-syntax) (syntax, indent)
- [asciidoc](https://github.com/asciidoc/vim-asciidoc) (syntax) - [asciidoc](https://github.com/asciidoc/vim-asciidoc) (syntax)
- [autohotkey](https://github.com/hnamikaw/vim-autohotkey) (indent) - [autohotkey](https://github.com/hnamikaw/vim-autohotkey) (indent)
@@ -46,6 +52,7 @@ If you need full functionality of any plugin, please use it directly with your p
- [c++11](https://github.com/octol/vim-cpp-enhanced-highlight) (syntax) - [c++11](https://github.com/octol/vim-cpp-enhanced-highlight) (syntax)
- [c/c++](https://github.com/vim-jp/vim-cpp) (syntax) - [c/c++](https://github.com/vim-jp/vim-cpp) (syntax)
- [caddyfile](https://github.com/isobit/vim-caddyfile) (syntax, indent, ftplugin) - [caddyfile](https://github.com/isobit/vim-caddyfile) (syntax, indent, ftplugin)
- [carp](https://github.com/hellerve/carp-vim) (syntax)
- [cjsx](https://github.com/mtscout6/vim-cjsx) (syntax, ftplugin) - [cjsx](https://github.com/mtscout6/vim-cjsx) (syntax, ftplugin)
- [clojure](https://github.com/guns/vim-clojure-static) (syntax, indent, autoload, ftplugin) - [clojure](https://github.com/guns/vim-clojure-static) (syntax, indent, autoload, ftplugin)
- [cmake](https://github.com/pboettch/vim-cmake-syntax) (syntax, indent) - [cmake](https://github.com/pboettch/vim-cmake-syntax) (syntax, indent)
@@ -68,9 +75,11 @@ If you need full functionality of any plugin, please use it directly with your p
- [gmpl](https://github.com/maelvalais/gmpl.vim) (syntax) - [gmpl](https://github.com/maelvalais/gmpl.vim) (syntax)
- [gnuplot](https://github.com/vim-scripts/gnuplot-syntax-highlighting) (syntax) - [gnuplot](https://github.com/vim-scripts/gnuplot-syntax-highlighting) (syntax)
- [go](https://github.com/fatih/vim-go) (syntax, compiler, indent) - [go](https://github.com/fatih/vim-go) (syntax, compiler, indent)
- [graphql](https://github.com/jparise/vim-graphql) (syntax, indent, ftplugin)
- [groovy](https://github.com/vim-scripts/groovy.vim) (syntax) - [groovy](https://github.com/vim-scripts/groovy.vim) (syntax)
- [haml](https://github.com/sheerun/vim-haml) (syntax, indent, compiler, ftplugin) - [haml](https://github.com/sheerun/vim-haml) (syntax, indent, compiler, ftplugin)
- [handlebars](https://github.com/mustache/vim-mustache-handlebars) (syntax, indent, ftplugin) - [handlebars](https://github.com/mustache/vim-mustache-handlebars) (syntax, indent, ftplugin)
- [haproxy](https://github.com/CH-DanReif/haproxy.vim) (syntax)
- [haskell](https://github.com/neovimhaskell/haskell-vim) (syntax, indent, ftplugin) - [haskell](https://github.com/neovimhaskell/haskell-vim) (syntax, indent, ftplugin)
- [haxe](https://github.com/yaymukund/vim-haxe) (syntax) - [haxe](https://github.com/yaymukund/vim-haxe) (syntax)
- [html5](https://github.com/othree/html5.vim) (syntax, indent, autoload, ftplugin) - [html5](https://github.com/othree/html5.vim) (syntax, indent, autoload, ftplugin)
@@ -78,10 +87,11 @@ If you need full functionality of any plugin, please use it directly with your p
- [jasmine](https://github.com/glanotte/vim-jasmine) (syntax) - [jasmine](https://github.com/glanotte/vim-jasmine) (syntax)
- [javascript](https://github.com/pangloss/vim-javascript) (syntax, indent, compiler, ftplugin, extras) - [javascript](https://github.com/pangloss/vim-javascript) (syntax, indent, compiler, ftplugin, extras)
- [jenkins](https://github.com/martinda/Jenkinsfile-vim-syntax) (syntax, indent) - [jenkins](https://github.com/martinda/Jenkinsfile-vim-syntax) (syntax, indent)
- [json5](https://github.com/GutenYe/json5.vim) (syntax)
- [json](https://github.com/elzr/vim-json) (syntax, indent, ftplugin) - [json](https://github.com/elzr/vim-json) (syntax, indent, ftplugin)
- [jst](https://github.com/briancollins/vim-jst) (syntax, indent) - [jst](https://github.com/briancollins/vim-jst) (syntax, indent)
- [jsx](https://github.com/mxw/vim-jsx) (after) - [jsx](https://github.com/mxw/vim-jsx) (after)
- [julia](https://github.com/dcjones/julia-minimalist-vim) (syntax, indent) - [julia](https://github.com/JuliaEditorSupport/julia-vim) (syntax, indent, autoload, ftplugin)
- [kotlin](https://github.com/udalov/kotlin-vim) (syntax, indent) - [kotlin](https://github.com/udalov/kotlin-vim) (syntax, indent)
- [latex](https://github.com/LaTeX-Box-Team/LaTeX-Box) (syntax, indent, ftplugin) - [latex](https://github.com/LaTeX-Box-Team/LaTeX-Box) (syntax, indent, ftplugin)
- [less](https://github.com/groenewege/vim-less) (syntax, indent, ftplugin) - [less](https://github.com/groenewege/vim-less) (syntax, indent, ftplugin)
@@ -89,7 +99,7 @@ If you need full functionality of any plugin, please use it directly with your p
- [livescript](https://github.com/gkz/vim-ls) (syntax, indent, compiler, ftplugin) - [livescript](https://github.com/gkz/vim-ls) (syntax, indent, compiler, ftplugin)
- [lua](https://github.com/tbastos/vim-lua) (syntax, indent) - [lua](https://github.com/tbastos/vim-lua) (syntax, indent)
- [mako](https://github.com/sophacles/vim-bundle-mako) (syntax, indent, ftplugin) - [mako](https://github.com/sophacles/vim-bundle-mako) (syntax, indent, ftplugin)
- [markdown](https://github.com/plasticboy/vim-markdown) (syntax) - [markdown](https://github.com/plasticboy/vim-markdown) (syntax, indent)
- [mathematica](https://github.com/rsmenon/vim-mathematica) (syntax, ftplugin) - [mathematica](https://github.com/rsmenon/vim-mathematica) (syntax, ftplugin)
- [nginx](https://github.com/chr4/nginx.vim) (syntax, indent, ftplugin) - [nginx](https://github.com/chr4/nginx.vim) (syntax, indent, ftplugin)
- [nim](https://github.com/zah/nim.vim) (syntax, compiler, indent) - [nim](https://github.com/zah/nim.vim) (syntax, compiler, indent)
@@ -108,7 +118,8 @@ If you need full functionality of any plugin, please use it directly with your p
- [puppet](https://github.com/voxpupuli/vim-puppet) (syntax, indent, ftplugin) - [puppet](https://github.com/voxpupuli/vim-puppet) (syntax, indent, ftplugin)
- [purescript](https://github.com/purescript-contrib/purescript-vim) (syntax, indent, ftplugin) - [purescript](https://github.com/purescript-contrib/purescript-vim) (syntax, indent, ftplugin)
- [python-compiler](https://github.com/aliev/vim-compiler-python) (compiler, autoload) - [python-compiler](https://github.com/aliev/vim-compiler-python) (compiler, autoload)
- [python](https://github.com/mitsuhiko/vim-python-combined) (syntax, indent) - [python-ident](https://github.com/Vimjas/vim-python-pep8-indent) (indent)
- [python](https://github.com/vim-python/python-syntax) (syntax)
- [qml](https://github.com/peterhoeg/vim-qml) (syntax, indent, ftplugin) - [qml](https://github.com/peterhoeg/vim-qml) (syntax, indent, ftplugin)
- [r-lang](https://github.com/vim-scripts/R.vim) (syntax, ftplugin) - [r-lang](https://github.com/vim-scripts/R.vim) (syntax, ftplugin)
- [racket](https://github.com/wlangstroth/vim-racket) (syntax, indent, autoload, ftplugin) - [racket](https://github.com/wlangstroth/vim-racket) (syntax, indent, autoload, ftplugin)
@@ -121,11 +132,12 @@ If you need full functionality of any plugin, please use it directly with your p
- [scala](https://github.com/derekwyatt/vim-scala) (syntax, indent, compiler, ftplugin) - [scala](https://github.com/derekwyatt/vim-scala) (syntax, indent, compiler, ftplugin)
- [scss](https://github.com/cakebaker/scss-syntax.vim) (syntax, autoload, ftplugin) - [scss](https://github.com/cakebaker/scss-syntax.vim) (syntax, autoload, ftplugin)
- [slim](https://github.com/slim-template/vim-slim) (syntax, indent, ftplugin) - [slim](https://github.com/slim-template/vim-slim) (syntax, indent, ftplugin)
- [slime](https://github.com/slime-lang/vim-slime-syntax) (syntax, indent)
- [solidity](https://github.com/tomlion/vim-solidity) (syntax, indent, ftplugin) - [solidity](https://github.com/tomlion/vim-solidity) (syntax, indent, ftplugin)
- [stylus](https://github.com/wavded/vim-stylus) (syntax, indent, ftplugin) - [stylus](https://github.com/wavded/vim-stylus) (syntax, indent, ftplugin)
- [swift](https://github.com/keith/swift.vim) (syntax, indent, ftplugin) - [swift](https://github.com/keith/swift.vim) (syntax, indent, ftplugin)
- [sxhkd](https://github.com/baskerville/vim-sxhkdrc) (syntax) - [sxhkd](https://github.com/baskerville/vim-sxhkdrc) (syntax)
- [systemd](https://github.com/kurayama/systemd-vim-syntax) (syntax) - [systemd](https://github.com/wgwoods/vim-systemd-syntax) (syntax)
- [terraform](https://github.com/hashivim/vim-terraform) (syntax, indent, ftplugin) - [terraform](https://github.com/hashivim/vim-terraform) (syntax, indent, ftplugin)
- [textile](https://github.com/timcharper/textile.vim) (syntax, ftplugin) - [textile](https://github.com/timcharper/textile.vim) (syntax, ftplugin)
- [thrift](https://github.com/solarnz/thrift.vim) (syntax) - [thrift](https://github.com/solarnz/thrift.vim) (syntax)
@@ -159,13 +171,18 @@ Individual language packs can be disabled by setting `g:polyglot_disabled` as fo
let g:polyglot_disabled = ['css'] let g:polyglot_disabled = ['css']
``` ```
Note that disabiling languages won't make in general your vim startup any faster / slower (only for specific file type). Vim-polyglot is selection of language plugins that are loaded only on demand. Note that disabling languages won't make in general your vim startup any faster / slower (only for specific file type). Vim-polyglot is selection of language plugins that are loaded only on demand.
## Contributing ## Contributing
Language packs are periodically updated using automated `build` script. Language packs are periodically updated using automated `build` script.
Feel free to add your language, and send pull-request. Feel free to add your language, and send pull-request. In your pull request, please include:
1. How you chose the particular repo from which to pull support for this language.
2. An updated https://github.com/sheerun/vim-polyglot/blob/master/build .
3. If at all possible, absolutely nothing else (in particular, please don't run `build` and include that in your PR).
The easier it is to validate that the new language won't do anything wacky, the faster it'll be merged. In particular, languages that utilize global plugins (loaded for every filetype), or plugins with dangerous features (like `call` based on the contents of a file being edited), will never be merged, as they will be slow or dangerous, respectively.
## License ## License

View File

@@ -8,6 +8,10 @@ if !exists('g:terraform_remap_spacebar')
let g:terraform_remap_spacebar = 0 let g:terraform_remap_spacebar = 0
endif endif
if !exists('g:terraform_fold_sections')
let g:terraform_fold_sections = 0
endif
if g:terraform_align && exists(':Tabularize') if g:terraform_align && exists(':Tabularize')
inoremap <buffer> <silent> = =<Esc>:call <SID>terraformalign()<CR>a inoremap <buffer> <silent> = =<Esc>:call <SID>terraformalign()<CR>a
function! s:terraformalign() function! s:terraformalign()
@@ -22,38 +26,39 @@ if g:terraform_align && exists(':Tabularize')
endfunction endfunction
endif endif
if g:terraform_fold_sections
function! TerraformFolds()
let thisline = getline(v:lnum)
if match(thisline, '^resource') >= 0
return ">1"
elseif match(thisline, '^provider') >= 0
return ">1"
elseif match(thisline, '^module') >= 0
return ">1"
elseif match(thisline, '^variable') >= 0
return ">1"
elseif match(thisline, '^output') >= 0
return ">1"
elseif match(thisline, '^data') >= 0
return ">1"
elseif match(thisline, '^terraform') >= 0
return ">1"
elseif match(thisline, '^locals') >= 0
return ">1"
else
return "="
endif
endfunction
setlocal foldmethod=expr
setlocal foldexpr=TerraformFolds()
setlocal foldlevel=1
function! TerraformFolds() function! TerraformFoldText()
let thisline = getline(v:lnum) let foldsize = (v:foldend-v:foldstart)
if match(thisline, '^resource') >= 0 return getline(v:foldstart).' ('.foldsize.' lines)'
return ">1" endfunction
elseif match(thisline, '^provider') >= 0 setlocal foldtext=TerraformFoldText()
return ">1" endif
elseif match(thisline, '^module') >= 0
return ">1"
elseif match(thisline, '^variable') >= 0
return ">1"
elseif match(thisline, '^output') >= 0
return ">1"
elseif match(thisline, '^data') >= 0
return ">1"
elseif match(thisline, '^terraform') >= 0
return ">1"
elseif match(thisline, '^locals') >= 0
return ">1"
else
return "="
endif
endfunction
setlocal foldmethod=expr
setlocal foldexpr=TerraformFolds()
setlocal foldlevel=1
function! TerraformFoldText()
let foldsize = (v:foldend-v:foldstart)
return getline(v:foldstart).' ('.foldsize.' lines)'
endfunction
setlocal foldtext=TerraformFoldText()
" Re-map the space bar to fold and unfold " Re-map the space bar to fold and unfold
if get(g:, "terraform_remap_spacebar", 1) if get(g:, "terraform_remap_spacebar", 1)
@@ -70,5 +75,4 @@ if get(g:, "terraform_align", 1)
setlocal shiftwidth=2 setlocal shiftwidth=2
endif endif
endif endif

View File

@@ -21,7 +21,7 @@ if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'c++11') == -1
" Highlight function names. " Highlight function names.
" ----------------------------------------------------------------------------- " -----------------------------------------------------------------------------
if !exists('g:cpp_no_function_highlight') if !exists('g:cpp_no_function_highlight')
syn match cCustomParen "(" contains=cParen contains=cCppParen syn match cCustomParen transparent "(" contains=cParen contains=cCppParen
syn match cCustomFunc "\w\+\s*(\@=" contains=cCustomParen syn match cCustomFunc "\w\+\s*(\@=" contains=cCustomParen
hi def link cCustomFunc Function hi def link cCustomFunc Function
endif endif
@@ -32,7 +32,7 @@ endif
if exists('g:cpp_member_variable_highlight') && g:cpp_member_variable_highlight if exists('g:cpp_member_variable_highlight') && g:cpp_member_variable_highlight
syn match cCustomDot "\." contained syn match cCustomDot "\." contained
syn match cCustomPtr "->" contained syn match cCustomPtr "->" contained
syn match cCustomMemVar "\(\.\|->\)\w\+" contains=cCustomDot,cCustomPtr syn match cCustomMemVar "\(\.\|->\)\h\w*" contains=cCustomDot,cCustomPtr
hi def link cCustomMemVar Function hi def link cCustomMemVar Function
endif endif

View File

@@ -4,7 +4,7 @@ if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'c++11') == -1
" Language: C++ Additions " Language: C++ Additions
" Maintainer: Jon Haggblad <jon@haeggblad.com> " Maintainer: Jon Haggblad <jon@haeggblad.com>
" URL: http://www.haeggblad.com " URL: http://www.haeggblad.com
" Last Change: 12 Oct 2016 " Last Change: 1 Feb 2018
" Version: 0.6 " Version: 0.6
" Changelog: " Changelog:
" 0.1 - initial version. " 0.1 - initial version.
@@ -37,7 +37,7 @@ if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'c++11') == -1
" Functions " Functions
if !exists('g:cpp_no_function_highlight') if !exists('g:cpp_no_function_highlight')
syn match cCustomParen "(" contains=cParen contains=cCppParen syn match cCustomParen transparent "(" contains=cParen contains=cCppParen
syn match cCustomFunc "\w\+\s*(\@=" syn match cCustomFunc "\w\+\s*(\@="
hi def link cCustomFunc Function hi def link cCustomFunc Function
endif endif
@@ -855,6 +855,37 @@ syntax keyword cppSTLconstant WEOF
syntax keyword cppSTLconstant WCHAR_MIN syntax keyword cppSTLconstant WCHAR_MIN
syntax keyword cppSTLconstant WCHAR_MAX syntax keyword cppSTLconstant WCHAR_MAX
" locale
syntax keyword cppSTLtype locale
syntax keyword cppSTLtype ctype_base
syntax keyword cppSTLtype codecvt_base
syntax keyword cppSTLtype messages_base
syntax keyword cppSTLtype time_base
syntax keyword cppSTLtype money_base
syntax keyword cppSTLtype ctype
syntax keyword cppSTLtype codecvt
syntax keyword cppSTLtype collate
syntax keyword cppSTLtype messages
syntax keyword cppSTLtype time_get
syntax keyword cppSTLtype time_put
syntax keyword cppSTLtype num_get
syntax keyword cppSTLtype num_put
syntax keyword cppSTLtype numpunct
syntax keyword cppSTLtype money_get
syntax keyword cppSTLtype money_put
syntax keyword cppSTLtype moneypunct
syntax keyword cppSTLtype ctype_byname
syntax keyword cppSTLtype codecvt_byname
syntax keyword cppSTLtype messages_byname
syntax keyword cppSTLtype collate_byname
syntax keyword cppSTLtype time_get_byname
syntax keyword cppSTLtype time_put_byname
syntax keyword cppSTLtype numpunct_byname
syntax keyword cppSTLtype moneypunct_byname
syntax keyword cppSTLfunction use_facet
syntax keyword cppSTLfunction has_facet
syntax keyword cppSTLfunction isspace isblank iscntrl isupper islower isalpha
syntax keyword cppSTLfunction isdigit ispunct isxdigit isalnum isprint isgraph
if !exists("cpp_no_cpp11") if !exists("cpp_no_cpp11")
syntax keyword cppSTLconstant nullptr syntax keyword cppSTLconstant nullptr
@@ -1766,6 +1797,9 @@ if !exists("cpp_no_cpp17")
syntax keyword cppSTLfunction do_deallocate syntax keyword cppSTLfunction do_deallocate
syntax keyword cppSTLfunction do_is_equal syntax keyword cppSTLfunction do_is_equal
" mutex
syntax keyword cppSTLtype scoped_lock
" new " new
syntax keyword cppSTLconstant hardware_destructive_interference_size syntax keyword cppSTLconstant hardware_destructive_interference_size
syntax keyword cppSTLconstant hardware_constructive_interference_size syntax keyword cppSTLconstant hardware_constructive_interference_size
@@ -1804,7 +1838,7 @@ if !exists("cpp_no_cpp17")
syntax keyword cppSTLbool is_error_code_enum_v syntax keyword cppSTLbool is_error_code_enum_v
syntax keyword cppSTLbool is_error_condition_enum_v syntax keyword cppSTLbool is_error_condition_enum_v
" thread " shared_mutex
syntax keyword cppSTLtype shared_mutex syntax keyword cppSTLtype shared_mutex
" tuple " tuple
@@ -1879,6 +1913,16 @@ if !exists("cpp_no_cpp17")
syntax keyword cppSTLbool conjunction_v syntax keyword cppSTLbool conjunction_v
syntax keyword cppSTLbool disjunction_v syntax keyword cppSTLbool disjunction_v
syntax keyword cppSTLbool negation_v syntax keyword cppSTLbool negation_v
syntax keyword cppSTLbool has_unique_object_representations_v
syntax keyword cppSTLbool is_swappable_v
syntax keyword cppSTLbool is_swappable_with_v
syntax keyword cppSTLbool is_nothrow_swappable_v
syntax keyword cppSTLbool is_nothrow_swappable_with_v
syntax keyword cppSTLbool is_invocable_v
syntax keyword cppSTLbool is_invocable_r_v
syntax keyword cppSTLbool is_nothrow_invocable_v
syntax keyword cppSTLbool is_nothrow_invocable_r_v
syntax keyword cppSTLbool is_aggregate_v
syntax keyword cppSTLconstant alignment_of_v syntax keyword cppSTLconstant alignment_of_v
syntax keyword cppSTLconstant rank_v syntax keyword cppSTLconstant rank_v
syntax keyword cppSTLconstant extent_v syntax keyword cppSTLconstant extent_v
@@ -1888,6 +1932,19 @@ if !exists("cpp_no_cpp17")
syntax keyword cppSTLtype conjunction syntax keyword cppSTLtype conjunction
syntax keyword cppSTLtype disjunction syntax keyword cppSTLtype disjunction
syntax keyword cppSTLtype negation syntax keyword cppSTLtype negation
syntax keyword cppSTLtype void_t
syntax keyword cppSTLtype has_unique_object_representations
syntax keyword cppSTLtype is_swappable
syntax keyword cppSTLtype is_swappable_with
syntax keyword cppSTLtype is_nothrow_swappable
syntax keyword cppSTLtype is_nothrow_swappable_with
syntax keyword cppSTLtype is_invocable
syntax keyword cppSTLtype is_invocable_r
syntax keyword cppSTLtype is_nothrow_invocable
syntax keyword cppSTLtype is_nothrow_invocable_r
syntax keyword cppSTLtype invoke_result
syntax keyword cppSTLtype invoke_result_t
syntax keyword cppSTLtype is_aggregate
" unordered_map, unordered_set, unordered_multimap, unordered_multiset " unordered_map, unordered_set, unordered_multimap, unordered_multiset
syntax keyword cppSTLtype node_type syntax keyword cppSTLtype node_type
@@ -1921,6 +1978,12 @@ if !exists("cpp_no_cpp17")
endif " C++17 endif " C++17
if !exists("cpp_no_cpp20")
" type_traits
syntax keyword cppSTLtype remove_cvref remove_cvref_t
endif
if exists('g:cpp_concepts_highlight') && g:cpp_concepts_highlight if exists('g:cpp_concepts_highlight') && g:cpp_concepts_highlight
syntax keyword cppStatement concept syntax keyword cppStatement concept
syntax keyword cppStorageClass requires syntax keyword cppStorageClass requires

View File

@@ -0,0 +1,21 @@
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'graphql') == -1
if exists('b:current_syntax')
let s:current_syntax = b:current_syntax
unlet b:current_syntax
endif
syn include @GraphQLSyntax syntax/graphql.vim
if exists('s:current_syntax')
let b:current_syntax = s:current_syntax
endif
syntax region graphqlTemplateString start=+`+ skip=+\\\(`\|$\)+ end=+`+ contains=@GraphQLSyntax,jsTemplateExpression,jsSpecial extend
exec 'syntax match graphqlTaggedTemplate +\%(' . join(g:graphql_javascript_tags, '\|') . '\)\%(`\)\@=+ nextgroup=graphqlTemplateString'
hi def link graphqlTemplateString jsTemplateString
hi def link graphqlTaggedTemplate jsTaggedTemplate
syn cluster jsExpression add=graphqlTaggedTemplate
syn cluster graphqlTaggedTemplate add=graphqlTemplateString
endif

View File

@@ -0,0 +1,20 @@
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'graphql') == -1
if exists('b:current_syntax')
let s:current_syntax = b:current_syntax
unlet b:current_syntax
endif
syn include @GraphQLSyntax syntax/graphql.vim
if exists('s:current_syntax')
let b:current_syntax = s:current_syntax
endif
syntax region graphqlTemplateString start=+`+ skip=+\\\(`\|$\)+ end=+`+ contains=@GraphQLSyntax,typescriptTemplateTag extend
exec 'syntax match graphqlTaggedTemplate +\%(' . join(g:graphql_javascript_tags, '\|') . '\)\%(`\)\@=+ nextgroup=graphqlTemplateString'
hi def link graphqlTemplateString typescriptTemplate
syn cluster typescriptExpression add=graphqlTaggedTemplate
syn cluster graphqlTaggedTemplate add=graphqlTemplateString
endif

View File

@@ -26,7 +26,7 @@ syn match yamlBlock "[\[\]\{\}\|\>]"
syn region yamlComment start="\#" end="$" syn region yamlComment start="\#" end="$"
syn match yamlIndicator "#YAML:\S\+" syn match yamlIndicator "#YAML:\S\+"
syn region yamlString start="'" end="'" skip="\\'" syn region yamlString start="\(^\|\s\|\[\|\,\|\-\)'" end="'" skip="\\'"
syn region yamlString start='"' end='"' skip='\\"' contains=yamlEscape syn region yamlString start='"' end='"' skip='\\"' contains=yamlEscape
syn match yamlEscape +\\[abfnrtv'"\\]+ contained syn match yamlEscape +\\[abfnrtv'"\\]+ contained
syn match yamlEscape "\\\o\o\=\o\=" contained syn match yamlEscape "\\\o\o\=\o\=" contained

625
autoload/LaTeXtoUnicode.vim Normal file
View File

@@ -0,0 +1,625 @@
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'julia') == -1
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" Support for LaTex-to-Unicode conversion as in the Julia REPL "
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
function! s:L2U_Setup()
call s:L2U_SetupGlobal()
" Keep track of whether LaTeX-to-Unicode is activated
" (used when filetype changes)
if !has_key(b:, "l2u_enabled")
let b:l2u_enabled = 0
endif
" Did we install the L2U tab mappings?
if !has_key(b:, "l2u_tab_set")
let b:l2u_tab_set = 0
endif
if !has_key(b:, "l2u_cmdtab_set")
let b:l2u_cmdtab_set = 0
endif
" Did we activate the L2U as-you-type substitutions?
if !has_key(b:, "l2u_autosub_set")
let b:l2u_autosub_set = 0
endif
" Following are some flags used to pass information between the function which
" attempts the LaTeX-to-Unicode completion and the fallback function
" Was a (possibly partial) completion found?
let b:l2u_found_completion = 0
" Is the cursor just after a single backslash
let b:l2u_singlebslash = 0
" Backup value of the completeopt settings
" (since we temporarily add the 'longest' setting while
" attempting LaTeX-to-Unicode)
let b:l2u_backup_commpleteopt = &completeopt
" Are we in the middle of a L2U tab completion?
let b:l2u_tab_completing = 0
" Are we calling the tab fallback?
let b:l2u_in_fallback = 0
endfunction
function! s:L2U_SetupGlobal()
" Initialization of global and script-local variables
" is only performed once
if get(g:, "l2u_did_global_setup", 0)
return
endif
let g:l2u_did_global_setup = 1
let g:l2u_symbols_dict = julia_latex_symbols#get_dict()
call s:L2U_deprecated_options()
if v:version < 704
let g:latex_to_unicode_tab = 0
let g:latex_to_unicode_auto = 0
endif
" YouCompleteMe and neocomplcache/neocomplete/deoplete plug-ins do not work well
" with LaTeX symbols suggestions
if exists("g:loaded_youcompleteme") ||
\ exists("g:loaded_neocomplcache") ||
\ exists("g:loaded_neocomplete") ||
\ exists("g:loaded_deoplete")
let g:latex_to_unicode_suggestions = 0
endif
" A hack to forcibly get out of completion mode: feed
" this string with feedkeys()
if has("win32") || has("win64")
if has("gui_running")
let s:l2u_esc_sequence = "\u0006"
else
let s:l2u_esc_sequence = "\u0006\b"
endif
else
let s:l2u_esc_sequence = "\u0091\b"
end
" Trigger for the previous mapping of <Tab>
let s:l2u_fallback_trigger = "\u0091L2UFallbackTab"
endfunction
" Each time the filetype changes, we may need to enable or
" disable the LaTeX-to-Unicode functionality
function! LaTeXtoUnicode#Refresh()
call s:L2U_Setup()
" by default, LaTeX-to-Unicode is only active on julia files
let file_types = s:L2U_file_type_regex(get(g:, "latex_to_unicode_file_types", "julia"))
let file_types_blacklist = s:L2U_file_type_regex(get(g:, "latex_to_unicode_file_types_blacklist", "$^"))
if match(&filetype, file_types) < 0 || match(&filetype, file_types_blacklist) >= 0
if b:l2u_enabled
call LaTeXtoUnicode#Disable()
else
return
endif
elseif !b:l2u_enabled
call LaTeXtoUnicode#Enable()
endif
endfunction
function! LaTeXtoUnicode#Enable()
if b:l2u_enabled
return
end
call s:L2U_ResetLastCompletionInfo()
let b:l2u_enabled = 1
" If we're editing the first file upon opening vim, this will only init the
" command line mode mapping, and the full initialization will be performed by
" the autocmd triggered by InsertEnter, defined in /ftdetect.vim.
" Otherwise, if we're opening a file from within a running vim session, this
" will actually initialize all the LaTeX-to-Unicode substitutions.
call LaTeXtoUnicode#Init()
return
endfunction
function! LaTeXtoUnicode#Disable()
if !b:l2u_enabled
return
endif
let b:l2u_enabled = 0
call LaTeXtoUnicode#Init()
return
endfunction
" Translate old options to their new equivalents
function! s:L2U_deprecated_options()
for [new, old] in [["latex_to_unicode_tab", "julia_latex_to_unicode"],
\ ["latex_to_unicode_auto", "julia_auto_latex_to_unicode"],
\ ["latex_to_unicode_suggestions", "julia_latex_suggestions_enabled"],
\ ["latex_to_unicode_eager", "julia_latex_to_unicode_eager"]]
if !has_key(g:, new) && has_key(g:, old)
exec "let g:" . new . " = g:" . old
endif
endfor
endfunction
function! s:L2U_file_type_regex(ft)
if type(a:ft) == 3
let file_types = "\\%(" . join(a:ft, "\\|") . "\\)"
elseif type(a:ft) == 1
let file_types = a:ft
else
echoerr "invalid file_type specification"
endif
return "^" . file_types . "$"
endfunction
" Some data used to keep track of the previous completion attempt.
" Used to detect
" 1) if we just attempted the same completion, or
" 2) if backspace was just pressed while completing
" This function initializes and resets the required info
function! s:L2U_ResetLastCompletionInfo()
let b:l2u_completed_once = 0
let b:l2u_bs_while_completing = 0
let b:l2u_last_compl = {
\ 'line': '',
\ 'col0': -1,
\ 'col1': -1,
\ }
endfunction
" This function only detects whether an exact match is found for a LaTeX
" symbol in front of the cursor
function! s:L2U_ismatch()
let col1 = col('.')
let l = getline('.')
let col0 = match(l[0:col1-2], '\\[^[:space:]\\]\+$')
if col0 == -1
return 0
endif
let base = l[col0 : col1-1]
return has_key(g:l2u_symbols_dict, base)
endfunction
" Helper function to sort suggestion entries
function! s:L2U_partmatches_sort(p1, p2)
return a:p1.word > a:p2.word ? 1 : a:p1.word < a:p2.word ? -1 : 0
endfunction
" Helper function to fix display of Unicode compose characters
" in the suggestions menu (they are displayed on top of '◌')
function! s:L2U_fix_compose_chars(uni)
let u = matchstr(a:uni, '^.')
let isc = ("\u0300" <= u && u <= "\u036F") ||
\ ("\u1DC0" <= u && u <= "\u1DFF") ||
\ ("\u20D0" <= u && u <= "\u20FF") ||
\ ("\uFE20" <= u && u <= "\uFE2F")
return isc ? "\u25CC" . a:uni : a:uni
endfunction
" Helper function to find the longest common prefix among
" partial completion matches (used when suggestions are disabled
" and in command line mode)
function! s:L2U_longest_common_prefix(partmatches)
let common = a:partmatches[0]
for i in range(1, len(a:partmatches)-1)
let p = a:partmatches[i]
if len(p) < len(common)
let common = common[0 : len(p)-1]
endif
for j in range(1, len(common)-1)
if p[j] != common[j]
let common = common[0 : j-1]
break
endif
endfor
endfor
return common
endfunction
" Omnicompletion function. Besides the usual two-stage omnifunc behaviour,
" it has the following peculiar features:
" *) keeps track of the previous completion attempt
" *) sets some info to be used by the fallback function
" *) either returns a list of completions if a partial match is found, or a
" Unicode char if an exact match is found
" *) forces its way out of completion mode through a hack in some cases
function! LaTeXtoUnicode#omnifunc(findstart, base)
if a:findstart
" first stage
" avoid infinite loop if the fallback happens to call omnicompletion
if b:l2u_in_fallback
let b:l2u_in_fallback = 0
return -3
endif
let b:l2u_in_fallback = 0
" set info for the callback
let b:l2u_tab_completing = 1
let b:l2u_found_completion = 1
" analyse current line
let col1 = col('.')
let l = getline('.')
let col0 = match(l[0:col1-2], '\\[^[:space:]\\]\+$')
" compare with previous completion attempt
let b:l2u_bs_while_completing = 0
let b:l2u_completed_once = 0
if col0 == b:l2u_last_compl['col0']
let prevl = b:l2u_last_compl['line']
if col1 == b:l2u_last_compl['col1'] && l ==# prevl
let b:l2u_completed_once = 1
elseif col1 == b:l2u_last_compl['col1'] - 1 && l ==# prevl[0 : col1-2] . prevl[col1 : -1]
let b:l2u_bs_while_completing = 1
endif
endif
" store completion info for next attempt
let b:l2u_last_compl['col0'] = col0
let b:l2u_last_compl['col1'] = col1
let b:l2u_last_compl['line'] = l
" is the cursor right after a backslash?
let b:l2u_singlebslash = (match(l[0:col1-2], '\\$') >= 0)
" completion not found
if col0 == -1
let b:l2u_found_completion = 0
call feedkeys(s:l2u_esc_sequence, 'n')
let col0 = -2
endif
return col0
else
" read settings (eager mode is implicit when suggestions are disabled)
let suggestions = get(g:, "latex_to_unicode_suggestions", 1)
let eager = get(g:, "latex_to_unicode_eager", 1) || !suggestions
" search for matches
let partmatches = []
let exact_match = 0
for k in keys(g:l2u_symbols_dict)
if k ==# a:base
let exact_match = 1
endif
if len(k) >= len(a:base) && k[0 : len(a:base)-1] ==# a:base
let menu = s:L2U_fix_compose_chars(g:l2u_symbols_dict[k])
if suggestions
call add(partmatches, {'word': k, 'menu': menu})
else
call add(partmatches, k)
endif
endif
endfor
" exact matches are replaced with Unicode
" exceptions:
" *) we reached an exact match by pressing backspace while completing
" *) the exact match is one among many, and the eager setting is
" disabled, and it's the first time this completion is attempted
if exact_match && !b:l2u_bs_while_completing && (len(partmatches) == 1 || eager || b:l2u_completed_once)
" the completion is successful: reset the last completion info...
call s:L2U_ResetLastCompletionInfo()
" ...force our way out of completion mode...
call feedkeys(s:l2u_esc_sequence, 'n')
" ...return the Unicode symbol
return [g:l2u_symbols_dict[a:base]]
endif
if !empty(partmatches)
" here, only partial matches were found; either keep just the longest
" common prefix, or pass them on
if !suggestions
let partmatches = [s:L2U_longest_common_prefix(partmatches)]
else
call sort(partmatches, "s:L2U_partmatches_sort")
endif
endif
if empty(partmatches)
call feedkeys(s:l2u_esc_sequence, 'n')
let b:l2u_found_completion = 0
endif
return partmatches
endif
endfunction
function! LaTeXtoUnicode#PutLiteral(k)
call feedkeys(a:k, 'ni')
return ''
endfunction
" Function which saves the current insert-mode mapping of a key sequence `s`
" and associates it with another key sequence `k` (e.g. stores the current
" <Tab> mapping into the Fallback trigger)
function! s:L2U_SetFallbackMapping(s, k)
let mmdict = maparg(a:s, 'i', 0, 1)
if empty(mmdict)
exe 'inoremap <buffer> ' . a:k . ' ' . a:s
return
endif
let rhs = mmdict["rhs"]
if rhs =~# '^<Plug>L2U'
return
endif
let pre = '<buffer>'
if mmdict["silent"]
let pre = pre . '<silent>'
endif
if mmdict["expr"]
let pre = pre . '<expr>'
endif
if mmdict["noremap"]
let cmd = 'inoremap '
else
let cmd = 'imap '
" This is a nasty hack used to prevent infinite recursion. It's not a
" general solution.
if mmdict["expr"]
let rhs = substitute(rhs, '\c' . a:s, "\<C-R>=LaTeXtoUnicode#PutLiteral('" . a:s . "')\<CR>", 'g')
endif
endif
exe cmd . pre . ' ' . a:k . ' ' . rhs
endfunction
" This is the function which is mapped to <Tab>
function! LaTeXtoUnicode#Tab()
" the <Tab> is passed through to the fallback mapping if the completion
" menu is present, and it hasn't been raised by the L2U tab, and there
" isn't an exact match before the cursor when suggestions are disabled
if pumvisible() && !b:l2u_tab_completing && (get(g:, "latex_to_unicode_suggestions", 1) || !s:L2U_ismatch())
call feedkeys(s:l2u_fallback_trigger)
return ''
endif
" reset the in_fallback info
let b:l2u_in_fallback = 0
" temporary change to completeopt to use the `longest` setting, which is
" probably the only one which makes sense given that the goal of the
" completion is to substitute the final string
let b:l2u_backup_commpleteopt = &completeopt
set completeopt+=longest
set completeopt-=noinsert
" invoke omnicompletion; failure to perform LaTeX-to-Unicode completion is
" handled by the CompleteDone autocommand.
return "\<C-X>\<C-O>"
endfunction
" This function is called at every CompleteDone event, and is meant to handle
" the failures of LaTeX-to-Unicode completion by calling a fallback
function! LaTeXtoUnicode#FallbackCallback()
if !b:l2u_tab_completing
" completion was not initiated by L2U, nothing to do
return
else
" completion was initiated by L2U, restore completeopt
let &completeopt = b:l2u_backup_commpleteopt
endif
" at this point L2U tab completion is over
let b:l2u_tab_completing = 0
" if the completion was successful do nothing
if b:l2u_found_completion == 1 || b:l2u_singlebslash == 1
return
endif
" fallback
let b:l2u_in_fallback = 1
call feedkeys(s:l2u_fallback_trigger)
return
endfunction
" This is the function which is mapped to <S-Tab> in command-line mode
function! LaTeXtoUnicode#CmdTab()
" first stage
" analyse command line
let col1 = getcmdpos() - 1
let l = getcmdline()
let col0 = match(l[0:col1-1], '\\[^[:space:]\\]\+$')
let b:l2u_singlebslash = (match(l[0:col1-1], '\\$') >= 0)
" completion not found
if col0 == -1
return l
endif
let base = l[col0 : col1-1]
" search for matches
let partmatches = []
let exact_match = 0
for k in keys(g:l2u_symbols_dict)
if k ==# base
let exact_match = 1
endif
if len(k) >= len(base) && k[0 : len(base)-1] ==# base
call add(partmatches, k)
endif
endfor
if len(partmatches) == 0
return l
endif
" exact matches are replaced with Unicode
if exact_match
let unicode = g:l2u_symbols_dict[base]
if col0 > 0
let pre = l[0 : col0 - 1]
else
let pre = ''
endif
let posdiff = col1-col0 - len(unicode)
call setcmdpos(col1 - posdiff + 1)
return pre . unicode . l[col1 : -1]
endif
" no exact match: complete with the longest common prefix
let common = s:L2U_longest_common_prefix(partmatches)
if col0 > 0
let pre = l[0 : col0 - 1]
else
let pre = ''
endif
let posdiff = col1-col0 - len(common)
call setcmdpos(col1 - posdiff + 1)
return pre . common . l[col1 : -1]
endfunction
" Setup the L2U tab mapping
function! s:L2U_SetTab(wait_insert_enter)
if !b:l2u_cmdtab_set && get(g:, "latex_to_unicode_tab", 1) && b:l2u_enabled
cmap <buffer> <S-Tab> <Plug>L2UCmdTab
cnoremap <buffer> <Plug>L2UCmdTab <C-\>eLaTeXtoUnicode#CmdTab()<CR>
let b:l2u_cmdtab_set = 1
endif
if b:l2u_tab_set
return
endif
" g:did_insert_enter is set from an autocommand in ftdetect
if a:wait_insert_enter && !get(g:, "did_insert_enter", 0)
return
endif
if !get(g:, "latex_to_unicode_tab", 1) || !b:l2u_enabled
return
endif
" Backup the previous omnifunc (the check is probably not really needed)
if get(b:, "prev_omnifunc", "") != "LaTeXtoUnicode#omnifunc"
let b:prev_omnifunc = &omnifunc
endif
setlocal omnifunc=LaTeXtoUnicode#omnifunc
call s:L2U_SetFallbackMapping('<Tab>', s:l2u_fallback_trigger)
imap <buffer> <Tab> <Plug>L2UTab
inoremap <buffer><expr> <Plug>L2UTab LaTeXtoUnicode#Tab()
augroup L2UTab
autocmd! * <buffer>
" Every time a completion finishes, the fallback may be invoked
autocmd CompleteDone <buffer> call LaTeXtoUnicode#FallbackCallback()
augroup END
let b:l2u_tab_set = 1
endfunction
" Revert the LaTeX-to-Unicode tab mapping settings
function! s:L2U_UnsetTab()
if b:l2u_cmdtab_set
cunmap <buffer> <S-Tab>
let b:l2u_cmdtab_set = 0
endif
if !b:l2u_tab_set
return
endif
exec "setlocal omnifunc=" . get(b:, "prev_omnifunc", "")
iunmap <buffer> <Tab>
if empty(maparg("<Tab>", "i"))
call s:L2U_SetFallbackMapping(s:l2u_fallback_trigger, '<Tab>')
endif
iunmap <buffer> <Plug>L2UTab
exe 'iunmap <buffer> ' . s:l2u_fallback_trigger
augroup L2UTab
autocmd! * <buffer>
augroup END
let b:l2u_tab_set = 0
endfunction
" Function which looks for viable LaTeX-to-Unicode supstitutions as you type
function! LaTeXtoUnicode#AutoSub(...)
let vc = a:0 == 0 ? v:char : a:1
let col1 = col('.')
let lnum = line('.')
if col1 == 1
if a:0 > 1
call feedkeys(a:2, 'n')
endif
return ''
endif
let bs = (vc != "\n")
let l = getline(lnum)[0 : col1-1-bs] . v:char
let col0 = match(l, '\\\%([_^]\?[A-Za-z]\+\%' . col1 . 'c\%([^A-Za-z]\|$\)\|[_^]\%([0-9()=+-]\)\%' . col1 .'c\%(.\|$\)\)')
if col0 == -1
if a:0 > 1
call feedkeys(a:2, 'n')
endif
return ''
endif
let base = l[col0 : -1-bs]
let unicode = get(g:l2u_symbols_dict, base, '')
if empty(unicode)
if a:0 > 1
call feedkeys(a:2, 'n')
endif
return ''
endif
call feedkeys("\<C-G>u", 'n')
call feedkeys(repeat("\b", len(base) + bs) . unicode . vc . s:l2u_esc_sequence, 'nt')
call feedkeys("\<C-G>u", 'n')
return ''
endfunction
" Setup the auto as-you-type LaTeX-to-Unicode substitution
function! s:L2U_SetAutoSub(wait_insert_enter)
if b:l2u_autosub_set
return
endif
" g:did_insert_enter is set from an autocommand in ftdetect
if a:wait_insert_enter && !get(g:, "did_insert_enter", 0)
return
endif
if !get(g:, "latex_to_unicode_auto", 0) || !b:l2u_enabled
return
endif
" Viable substitutions are searched at every character insertion via the
" autocmd InsertCharPre. The <Enter> key does not seem to be catched in
" this way though, so we use a mapping for that case.
imap <buffer> <CR> <Plug>L2UAutoSub
inoremap <buffer><expr> <Plug>L2UAutoSub LaTeXtoUnicode#AutoSub("\n", "\<CR>")
augroup L2UAutoSub
autocmd! * <buffer>
autocmd InsertCharPre <buffer> call LaTeXtoUnicode#AutoSub()
augroup END
let b:l2u_autosub_set = 1
endfunction
" Revert the auto LaTeX-to-Unicode settings
function! s:L2U_UnsetAutoSub()
if !b:l2u_autosub_set
return
endif
iunmap <buffer> <CR>
iunmap <buffer> <Plug>L2UAutoSub
augroup L2UAutoSub
autocmd! * <buffer>
augroup END
let b:l2u_autosub_set = 0
endfunction
" Initialization. Can be used to re-init when global settings have changed.
function! LaTeXtoUnicode#Init(...)
let wait_insert_enter = a:0 > 0 ? a:1 : 1
if !wait_insert_enter
augroup L2UInit
autocmd!
augroup END
endif
call s:L2U_UnsetTab()
call s:L2U_UnsetAutoSub()
call s:L2U_SetTab(wait_insert_enter)
call s:L2U_SetAutoSub(wait_insert_enter)
endfunction
function! LaTeXtoUnicode#Toggle()
call s:L2U_Setup()
if b:l2u_enabled
call LaTeXtoUnicode#Disable()
echo "LaTeX-to-Unicode disabled"
else
call LaTeXtoUnicode#Enable()
echo "LaTeX-to-Unicode enabled"
endif
return
endfunction
endif

89
autoload/cargo.vim Normal file
View File

@@ -0,0 +1,89 @@
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'rust') == -1
function! cargo#cmd(args)
silent! clear
if !a:args
execute "!" . "cargo ". a:args
else
echom "Missing arguments"
endif
endfunction
function! cargo#build(args)
silent! clear
if !a:args
execute "!" . "cargo build " . a:args
else
execute "!" . "cargo build"
endif
silent! clear
execute "!" . "cargo build"
endfunction
function! cargo#clean(args)
silent! clear
if !a:args
execute "!" . "cargo clean " . a:args
else
execute "!" . "cargo clean"
endif
silent! clear
execute "!" . "cargo clean"
endfunction
function! cargo#doc(args)
silent! clear
if !a:args
execute "!" . "cargo doc " . a:args
else
execute "!" . "cargo doc"
endif
endfunction
function! cargo#new(args)
silent! clear
if !a:args
execute "!cargo new " . a:args
:cd `=a:args`
else
echom "Missing arguments"
endif
endfunction
function! cargo#init(args)
silent! clear
if !a:args
execute "!" . "cargo init " . a:args
else
execute "!" . "cargo init"
endif
endfunction
function! cargo#run(args)
silent! clear
if !a:args
execute "!" . "cargo run " . a:args
else
execute "!" . "cargo run"
endif
endfunction
function! cargo#test(args)
silent! clear
if !a:args
execute "!" . "cargo test " . a:args
else
execute "!" . "cargo test"
endif
endfunction
function! cargo#bench(args)
silent! clear
if !a:args
execute "!" . "cargo bench " . a:args
else
execute "!" . "cargo bench"
endif
endfunction
endif

View File

@@ -3,11 +3,21 @@ if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'crystal') == -1
let s:save_cpo = &cpo let s:save_cpo = &cpo
set cpo&vim set cpo&vim
let s:V = vital#of('crystal') let s:V = vital#crystal#new()
let s:P = s:V.import('Process') let s:P = s:V.import('Process')
let s:J = s:V.import('Web.JSON')
let s:C = s:V.import('ColorEcho') let s:C = s:V.import('ColorEcho')
if exists('*json_decode')
function! s:decode_json(text) abort
return json_decode(a:text)
endfunction
else
let s:J = s:V.import('Web.JSON')
function! s:decode_json(text) abort
return s:J.decode(a:text)
endfunction
endif
function! s:echo_error(msg, ...) abort function! s:echo_error(msg, ...) abort
echohl ErrorMsg echohl ErrorMsg
if a:0 == 0 if a:0 == 0
@@ -102,7 +112,7 @@ function! crystal_lang#jump_to_definition(file, pos) abort
return s:echo_error(cmd_result.output) return s:echo_error(cmd_result.output)
endif endif
let impl = s:J.decode(cmd_result.output) let impl = s:decode_json(cmd_result.output)
if impl.status !=# 'ok' if impl.status !=# 'ok'
return s:echo_error(impl.message) return s:echo_error(impl.message)
endif endif
@@ -149,7 +159,6 @@ endfunction
function! crystal_lang#complete(findstart, base) abort function! crystal_lang#complete(findstart, base) abort
if a:findstart if a:findstart
echom 'find start'
return s:find_completion_start() return s:find_completion_start()
endif endif
@@ -158,7 +167,7 @@ function! crystal_lang#complete(findstart, base) abort
return return
endif endif
let contexts = s:J.decode(cmd_result.output) let contexts = s:decode_json(cmd_result.output)
if contexts.status !=# 'ok' if contexts.status !=# 'ok'
return return
endif endif
@@ -271,59 +280,34 @@ function! crystal_lang#format_string(code, ...) abort
return output return output
endfunction endfunction
function! s:get_saved_states() abort " crystal_lang#format(option_str [, on_save])
let result = {} function! crystal_lang#format(option_str, ...) abort
let fname = bufname('%')
let current_winnr = winnr()
for i in range(1, winnr('$'))
let bufnr = winbufnr(i)
if bufnr == -1
continue
endif
if bufname(bufnr) ==# fname
execute i 'wincmd w'
let result[i] = {
\ 'pos': getpos('.'),
\ 'screen': winsaveview()
\ }
endif
endfor
execute current_winnr 'wincmd w'
return result
endfunction
function! crystal_lang#format(option_str) abort
if !executable(g:crystal_compiler_command) if !executable(g:crystal_compiler_command)
" Finish command silently " Finish command silently
return return
endif endif
let formatted = crystal_lang#format_string(join(getline(1, '$'), "\n"), a:option_str) let on_save = a:0 > 0 ? a:1 : 0
let formatted = substitute(formatted, '\n$', '', '')
let sel_save = &l:selection let before = join(getline(1, '$'), "\n")
let ve_save = &virtualedit let formatted = crystal_lang#format_string(before, a:option_str)
let &l:selection = 'inclusive' if !on_save
let &virtualedit = '' let after = substitute(formatted, '\n$', '', '')
let [save_g_reg, save_g_regtype] = [getreg('g'), getregtype('g')] if before ==# after
let windows_save = s:get_saved_states() return
endif
endif
try let view_save = winsaveview()
call setreg('g', formatted, 'v') let pos_save = getpos('.')
silent normal! gg0vG$"gp let lines = split(formatted, '\n')
finally silent! undojoin
call setreg('g', save_g_reg, save_g_regtype) if line('$') > len(lines)
let &l:selection = sel_save execute len(lines) . ',$delete' '_'
let &virtualedit = ve_save endif
let winnr = winnr() call setline(1, lines)
for winnr in keys(windows_save) call winrestview(view_save)
let w = windows_save[winnr] call setpos('.', pos_save)
execute winnr 'wincmd w'
call setpos('.', w.pos)
call winrestview(w.screen)
endfor
execute winnr 'wincmd w'
endtry
endfunction endfunction
let &cpo = s:save_cpo let &cpo = s:save_cpo

View File

@@ -22,6 +22,7 @@ function! dart#fmt(q_args) abort
if executable('dartfmt') if executable('dartfmt')
let buffer_content = join(getline(1, '$'), "\n") let buffer_content = join(getline(1, '$'), "\n")
let joined_lines = system(printf('dartfmt %s', a:q_args), buffer_content) let joined_lines = system(printf('dartfmt %s', a:q_args), buffer_content)
if buffer_content ==# joined_lines[:-2] | return | endif
if 0 == v:shell_error if 0 == v:shell_error
let win_view = winsaveview() let win_view = winsaveview()
let lines = split(joined_lines, "\n") let lines = split(joined_lines, "\n")
@@ -129,6 +130,15 @@ function! s:PackageMap() abort
return [v:true, map] return [v:true, map]
endfunction endfunction
" Toggle whether dartfmt is run on save or not.
function! dart#ToggleFormatOnSave() abort
if get(g:, "dart_format_on_save", 0)
let g:dart_format_on_save = 0
return
endif
let g:dart_format_on_save = 1
endfunction
" Finds a file name '.packages' in the cwd, or in any directory above the open " Finds a file name '.packages' in the cwd, or in any directory above the open
" file. " file.
" "
@@ -152,4 +162,13 @@ function! s:DotPackagesFile() abort
return [v:false, ''] return [v:false, '']
endfunction endfunction
" Prevent writes to files in the pub cache.
function! dart#setModifiable() abort
let full_path = expand('%:p')
if full_path =~# '.pub-cache' ||
\ full_path =~# 'Pub\Cache'
setlocal nomodifiable
endif
endfunction
endif endif

View File

@@ -18,11 +18,15 @@ function! elixir#indent#indent(lnum)
call s:debug("==> Indenting line " . lnum) call s:debug("==> Indenting line " . lnum)
call s:debug("text = '" . text . "'") call s:debug("text = '" . text . "'")
let [_, curs_lnum, curs_col, _] = getpos('.')
call cursor(lnum, 0)
let handlers = [ let handlers = [
\'top_of_file', \'top_of_file',
\'starts_with_end', \'starts_with_end',
\'starts_with_mid_or_end_block_keyword', \'starts_with_mid_or_end_block_keyword',
\'following_trailing_do', \'following_trailing_do',
\'following_trailing_rocket',
\'following_trailing_binary_operator', \'following_trailing_binary_operator',
\'starts_with_pipe', \'starts_with_pipe',
\'starts_with_close_bracket', \'starts_with_close_bracket',
@@ -37,11 +41,13 @@ function! elixir#indent#indent(lnum)
let indent = function('elixir#indent#handle_'.handler)(lnum, text, prev_nb_lnum, prev_nb_text) let indent = function('elixir#indent#handle_'.handler)(lnum, text, prev_nb_lnum, prev_nb_text)
if indent != -1 if indent != -1
call s:debug('line '.lnum.': elixir#indent#handle_'.handler.' returned '.indent) call s:debug('line '.lnum.': elixir#indent#handle_'.handler.' returned '.indent)
call cursor(curs_lnum, curs_col)
return indent return indent
endif endif
endfor endfor
call s:debug("defaulting") call s:debug("defaulting")
call cursor(curs_lnum, curs_col)
return 0 return 0
endfunction endfunction
@@ -166,7 +172,7 @@ function! s:get_base_indent(lnum, text)
elseif s:ends_with(a:text, data_structure_close, a:lnum) elseif s:ends_with(a:text, data_structure_close, a:lnum)
let data_structure_open = '\%(\[\|{\|(\)' let data_structure_open = '\%(\[\|{\|(\)'
let close_match_idx = match(a:text, data_structure_close . '\s*$') let close_match_idx = match(a:text, data_structure_close . '\s*$')
let _move = cursor(a:lnum, close_match_idx + 1) call cursor(a:lnum, close_match_idx + 1)
let [open_match_lnum, open_match_col] = searchpairpos(data_structure_open, '', data_structure_close, 'bnW') let [open_match_lnum, open_match_col] = searchpairpos(data_structure_open, '', data_structure_close, 'bnW')
let open_match_text = getline(open_match_lnum) let open_match_text = getline(open_match_lnum)
return s:get_base_indent(open_match_lnum, open_match_text) return s:get_base_indent(open_match_lnum, open_match_text)
@@ -175,7 +181,6 @@ function! s:get_base_indent(lnum, text)
endif endif
endfunction endfunction
" TODO: @jbodah 2017-03-31: remove
function! elixir#indent#handle_following_trailing_do(lnum, text, prev_nb_lnum, prev_nb_text) function! elixir#indent#handle_following_trailing_do(lnum, text, prev_nb_lnum, prev_nb_text)
if s:ends_with(a:prev_nb_text, s:keyword('do'), a:prev_nb_lnum) if s:ends_with(a:prev_nb_text, s:keyword('do'), a:prev_nb_lnum)
if s:starts_with(a:text, s:keyword('end'), a:lnum) if s:starts_with(a:text, s:keyword('end'), a:lnum)
@@ -188,6 +193,14 @@ function! elixir#indent#handle_following_trailing_do(lnum, text, prev_nb_lnum, p
endif endif
endfunction endfunction
function! elixir#indent#handle_following_trailing_rocket(lnum, text, prev_nb_lnum, prev_nb_text)
if s:ends_with(a:prev_nb_text, '->', a:prev_nb_lnum)
return indent(a:prev_nb_lnum) + s:sw()
else
return -1
endif
endfunction
function! elixir#indent#handle_following_trailing_binary_operator(lnum, text, prev_nb_lnum, prev_nb_text) function! elixir#indent#handle_following_trailing_binary_operator(lnum, text, prev_nb_lnum, prev_nb_text)
let binary_operator = '\%(=\|<>\|>>>\|<=\|||\|+\|\~\~\~\|-\|&&\|<<<\|/\|\^\^\^\|\*\)' let binary_operator = '\%(=\|<>\|>>>\|<=\|||\|+\|\~\~\~\|-\|&&\|<<<\|/\|\^\^\^\|\*\)'

View File

@@ -1,6 +1,7 @@
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'fish') == -1 if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'fish') == -1
function! fish#Indent() function! fish#Indent()
let l:shiftwidth = shiftwidth()
let l:prevlnum = prevnonblank(v:lnum - 1) let l:prevlnum = prevnonblank(v:lnum - 1)
if l:prevlnum ==# 0 if l:prevlnum ==# 0
return 0 return 0
@@ -8,15 +9,15 @@ function! fish#Indent()
let l:indent = 0 let l:indent = 0
let l:prevline = getline(l:prevlnum) let l:prevline = getline(l:prevlnum)
if l:prevline =~# '\v^\s*switch>' if l:prevline =~# '\v^\s*switch>'
let l:indent = &shiftwidth * 2 let l:indent = l:shiftwidth * 2
elseif l:prevline =~# '\v^\s*%(begin|if|else|while|for|function|case)>' elseif l:prevline =~# '\v^\s*%(begin|if|else|while|for|function|case)>'
let l:indent = &shiftwidth let l:indent = l:shiftwidth
endif endif
let l:line = getline(v:lnum) let l:line = getline(v:lnum)
if l:line =~# '\v^\s*end>' if l:line =~# '\v^\s*end>'
return indent(v:lnum) - (l:indent ==# 0 ? &shiftwidth : l:indent) return indent(v:lnum) - (l:indent ==# 0 ? l:shiftwidth : l:indent)
elseif l:line =~# '\v^\s*%(case|else)>' elseif l:line =~# '\v^\s*%(case|else)>'
return indent(v:lnum) - &shiftwidth return indent(v:lnum) - l:shiftwidth
endif endif
return indent(l:prevlnum) + l:indent return indent(l:prevlnum) + l:indent
endfunction endfunction

436
autoload/go/config.vim Normal file
View File

@@ -0,0 +1,436 @@
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'go') == -1
function! go#config#AutodetectGopath() abort
return get(g:, 'go_autodetect_gopath', 0)
endfunction
function! go#config#ListTypeCommands() abort
return get(g:, 'go_list_type_commands', {})
endfunction
function! go#config#VersionWarning() abort
return get(g:, 'go_version_warning', 1)
endfunction
function! go#config#BuildTags() abort
return get(g:, 'go_build_tags', '')
endfunction
function! go#config#SetBuildTags(value) abort
if a:value is ''
silent! unlet g:go_build_tags
return
endif
let g:go_build_tags = a:value
endfunction
function! go#config#TestTimeout() abort
return get(g:, 'go_test_timeout', '10s')
endfunction
function! go#config#TestShowName() abort
return get(g:, 'go_test_show_name', 0)
endfunction
function! go#config#TermHeight() abort
return get(g:, 'go_term_height', winheight(0))
endfunction
function! go#config#TermWidth() abort
return get(g:, 'go_term_width', winwidth(0))
endfunction
function! go#config#TermMode() abort
return get(g:, 'go_term_mode', 'vsplit')
endfunction
function! go#config#TermEnabled() abort
return get(g:, 'go_term_enabled', 0)
endfunction
function! go#config#SetTermEnabled(value) abort
let g:go_term_enabled = a:value
endfunction
function! go#config#TemplateUsePkg() abort
return get(g:, 'go_template_use_pkg', 0)
endfunction
function! go#config#TemplateTestFile() abort
return get(g:, 'go_template_test_file', "hello_world_test.go")
endfunction
function! go#config#TemplateFile() abort
return get(g:, 'go_template_file', "hello_world.go")
endfunction
function! go#config#StatuslineDuration() abort
return get(g:, 'go_statusline_duration', 60000)
endfunction
function! go#config#SnippetEngine() abort
return get(g:, 'go_snippet_engine', 'automatic')
endfunction
function! go#config#PlayBrowserCommand() abort
if go#util#IsWin()
let go_play_browser_command = '!start rundll32 url.dll,FileProtocolHandler %URL%'
elseif go#util#IsMac()
let go_play_browser_command = 'open %URL%'
elseif executable('xdg-open')
let go_play_browser_command = 'xdg-open %URL%'
elseif executable('firefox')
let go_play_browser_command = 'firefox %URL% &'
elseif executable('chromium')
let go_play_browser_command = 'chromium %URL% &'
else
let go_play_browser_command = ''
endif
return get(g:, 'go_play_browser_command', go_play_browser_command)
endfunction
function! go#config#MetalinterDeadline() abort
" gometalinter has a default deadline of 5 seconds only when asynchronous
" jobs are not supported.
let deadline = '5s'
if go#util#has_job() && has('lambda')
let deadline = ''
endif
return get(g:, 'go_metalinter_deadline', deadline)
endfunction
function! go#config#ListType() abort
return get(g:, 'go_list_type', '')
endfunction
function! go#config#ListAutoclose() abort
return get(g:, 'go_list_autoclose', 1)
endfunction
function! go#config#InfoMode() abort
return get(g:, 'go_info_mode', 'gocode')
endfunction
function! go#config#GuruScope() abort
let scope = get(g:, 'go_guru_scope', [])
if !empty(scope)
" strip trailing slashes for each path in scope. bug:
" https://github.com/golang/go/issues/14584
let scopes = go#util#StripTrailingSlash(scope)
endif
return scope
endfunction
function! go#config#SetGuruScope(scope) abort
if empty(a:scope)
if exists('g:go_guru_scope')
unlet g:go_guru_scope
endif
else
let g:go_guru_scope = a:scope
endif
endfunction
function! go#config#GocodeUnimportedPackages() abort
return get(g:, 'go_gocode_unimported_packages', 0)
endfunction
let s:sock_type = (has('win32') || has('win64')) ? 'tcp' : 'unix'
function! go#config#GocodeSocketType() abort
return get(g:, 'go_gocode_socket_type', s:sock_type)
endfunction
function! go#config#GocodeProposeBuiltins() abort
return get(g:, 'go_gocode_propose_builtins', 1)
endfunction
function! go#config#GocodeAutobuild() abort
return get(g:, 'go_gocode_autobuild', 1)
endfunction
function! go#config#EchoCommandInfo() abort
return get(g:, 'go_echo_command_info', 1)
endfunction
function! go#config#DocUrl() abort
let godoc_url = get(g:, 'go_doc_url', 'https://godoc.org')
if godoc_url isnot 'https://godoc.org'
" strip last '/' character if available
let last_char = strlen(godoc_url) - 1
if godoc_url[last_char] == '/'
let godoc_url = strpart(godoc_url, 0, last_char)
endif
" custom godoc installations expect /pkg before package names
let godoc_url .= "/pkg"
endif
return godoc_url
endfunction
function! go#config#DefReuseBuffer() abort
return get(g:, 'go_def_reuse_buffer', 0)
endfunction
function! go#config#DefMode() abort
return get(g:, 'go_def_mode', 'guru')
endfunction
function! go#config#DeclsIncludes() abort
return get(g:, 'go_decls_includes', 'func,type')
endfunction
function! go#config#Debug() abort
return get(g:, 'go_debug', [])
endfunction
function! go#config#DebugWindows() abort
return get(g:, 'go_debug_windows', {
\ 'stack': 'leftabove 20vnew',
\ 'out': 'botright 10new',
\ 'vars': 'leftabove 30vnew',
\ }
\ )
endfunction
function! go#config#DebugAddress() abort
return get(g:, 'go_debug_address', '127.0.0.1:8181')
endfunction
function! go#config#DebugCommands() abort
" make sure g:go_debug_commands is set so that it can be added to easily.
let g:go_debug_commands = get(g:, 'go_debug_commands', {})
return g:go_debug_commands
endfunction
function! go#config#SetDebugDiag(value) abort
let g:go_debug_diag = a:value
endfunction
function! go#config#AutoSameids() abort
return get(g:, 'go_auto_sameids', 0)
endfunction
function! go#config#SetAutoSameids(value) abort
let g:go_auto_sameids = a:value
endfunction
function! go#config#AddtagsTransform() abort
return get(g:, 'go_addtags_transform', "snakecase")
endfunction
function! go#config#TemplateAutocreate() abort
return get(g:, "go_template_autocreate", 1)
endfunction
function! go#config#SetTemplateAutocreate(value) abort
let g:go_template_autocreate = a:value
endfunction
function! go#config#MetalinterCommand() abort
return get(g:, "go_metalinter_command", "")
endfunction
function! go#config#MetalinterAutosaveEnabled() abort
return get(g:, 'go_metalinter_autosave_enabled', ['vet', 'golint'])
endfunction
function! go#config#MetalinterEnabled() abort
return get(g:, "go_metalinter_enabled", ['vet', 'golint', 'errcheck'])
endfunction
function! go#config#MetalinterDisabled() abort
return get(g:, "go_metalinter_disabled", [])
endfunction
function! go#config#GolintBin() abort
return get(g:, "go_golint_bin", "golint")
endfunction
function! go#config#ErrcheckBin() abort
return get(g:, "go_errcheck_bin", "errcheck")
endfunction
function! go#config#MetalinterAutosave() abort
return get(g:, "go_metalinter_autosave", 0)
endfunction
function! go#config#SetMetalinterAutosave(value) abort
let g:go_metalinter_autosave = a:value
endfunction
function! go#config#ListHeight() abort
return get(g:, "go_list_height", 0)
endfunction
function! go#config#FmtAutosave() abort
return get(g:, "go_fmt_autosave", 1)
endfunction
function! go#config#SetFmtAutosave(value) abort
let g:go_fmt_autosave = a:value
endfunction
function! go#config#AsmfmtAutosave() abort
return get(g:, "go_asmfmt_autosave", 0)
endfunction
function! go#config#SetAsmfmtAutosave(value) abort
let g:go_asmfmt_autosave = a:value
endfunction
function! go#config#DocMaxHeight() abort
return get(g:, "go_doc_max_height", 20)
endfunction
function! go#config#AutoTypeInfo() abort
return get(g:, "go_auto_type_info", 0)
endfunction
function! go#config#SetAutoTypeInfo(value) abort
let g:go_auto_type_info = a:value
endfunction
function! go#config#AlternateMode() abort
return get(g:, "go_alternate_mode", "edit")
endfunction
function! go#config#DeclsMode() abort
return get(g:, "go_decls_mode", "")
endfunction
function! go#config#DocCommand() abort
return get(g:, "go_doc_command", ["godoc"])
endfunction
function! go#config#FmtCommand() abort
return get(g:, "go_fmt_command", "gofmt")
endfunction
function! go#config#FmtOptions() abort
return get(g:, "go_fmt_options", {})
endfunction
function! go#config#FmtFailSilently() abort
return get(g:, "go_fmt_fail_silently", 0)
endfunction
function! go#config#FmtExperimental() abort
return get(g:, "go_fmt_experimental", 0 )
endfunction
function! go#config#PlayOpenBrowser() abort
return get(g:, "go_play_open_browser", 1)
endfunction
function! go#config#GorenameBin() abort
return get(g:, "go_gorename_bin", "gorename")
endfunction
function! go#config#GorenamePrefill() abort
return get(g:, "go_gorename_prefill", 'expand("<cword>") =~# "^[A-Z]"' .
\ '? go#util#pascalcase(expand("<cword>"))' .
\ ': go#util#camelcase(expand("<cword>"))')
endfunction
function! go#config#TextobjIncludeFunctionDoc() abort
return get(g:, "go_textobj_include_function_doc", 1)
endfunction
function! go#config#TextobjIncludeVariable() abort
return get(g:, "go_textobj_include_variable", 1)
endfunction
function! go#config#BinPath() abort
return get(g:, "go_bin_path", "")
endfunction
function! go#config#HighlightArrayWhitespaceError() abort
return get(g:, 'go_highlight_array_whitespace_error', 0)
endfunction
function! go#config#HighlightChanWhitespaceError() abort
return get(g:, 'go_highlight_chan_whitespace_error', 0)
endfunction
function! go#config#HighlightExtraTypes() abort
return get(g:, 'go_highlight_extra_types', 0)
endfunction
function! go#config#HighlightSpaceTabError() abort
return get(g:, 'go_highlight_space_tab_error', 0)
endfunction
function! go#config#HighlightTrailingWhitespaceError() abort
return get(g:, 'go_highlight_trailing_whitespace_error', 0)
endfunction
function! go#config#HighlightOperators() abort
return get(g:, 'go_highlight_operators', 0)
endfunction
function! go#config#HighlightFunctions() abort
return get(g:, 'go_highlight_functions', 0)
endfunction
function! go#config#HighlightFunctionArguments() abort
return get(g:, 'go_highlight_function_arguments', 0)
endfunction
function! go#config#HighlightFunctionCalls() abort
return get(g:, 'go_highlight_function_calls', 0)
endfunction
function! go#config#HighlightFields() abort
return get(g:, 'go_highlight_fields', 0)
endfunction
function! go#config#HighlightTypes() abort
return get(g:, 'go_highlight_types', 0)
endfunction
function! go#config#HighlightBuildConstraints() abort
return get(g:, 'go_highlight_build_constraints', 0)
endfunction
function! go#config#HighlightStringSpellcheck() abort
return get(g:, 'go_highlight_string_spellcheck', 1)
endfunction
function! go#config#HighlightFormatStrings() abort
return get(g:, 'go_highlight_format_strings', 1)
endfunction
function! go#config#HighlightGenerateTags() abort
return get(g:, 'go_highlight_generate_tags', 0)
endfunction
function! go#config#HighlightVariableAssignments() abort
return get(g:, 'go_highlight_variable_assignments', 0)
endfunction
function! go#config#HighlightVariableDeclarations() abort
return get(g:, 'go_highlight_variable_declarations', 0)
endfunction
function go#config#FoldEnable(...) abort
if a:0 > 0
return index(go#config#FoldEnable(), a:1) > -1
endif
return get(g:, 'go_fold_enable', ['block', 'import', 'varconst', 'package_comment'])
endfunction
" Set the default value. A value of "1" is a shortcut for this, for
" compatibility reasons.
if exists("g:go_gorename_prefill") && g:go_gorename_prefill == 1
unlet g:go_gorename_prefill
endif
" vim: sw=2 ts=2 et
endif

188
autoload/julia.vim Normal file
View File

@@ -0,0 +1,188 @@
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'julia') == -1
function! julia#set_syntax_version(jvers)
if &filetype != "julia"
echo "Not a Julia file"
return
endif
syntax clear
let b:julia_syntax_version = a:jvers
set filetype=julia
endfunction
function! julia#toggle_deprecated_syntax()
if &filetype != "julia"
echo "Not a Julia file"
return
endif
syntax clear
let hd = get(b:, "julia_syntax_highlight_deprecated",
\ get(g:, "julia_syntax_highlight_deprecated", 0))
let b:julia_syntax_highlight_deprecated = hd ? 0 : 1
set filetype=julia
if b:julia_syntax_highlight_deprecated
echo "Highlighting of deprecated syntax enabled"
else
echo "Highlighting of deprecated syntax disabled"
endif
endfunction
if exists("loaded_matchit")
function! julia#toggle_function_blockassign()
let sav_pos = getcurpos()
let l = getline('.')
let c = match(l, '\C\m\<function\s\+.\+(')
if c != -1
return julia#function_block2assign()
endif
let c = match(l, '\C\m)\%(::\S\+\)\?\%(\s\+where\s\+.*\)\?\s*=\s*')
if c == -1
echohl WarningMsg | echo "Not on a function definition or assignment line" | echohl None
return
endif
return julia#function_assign2block()
endfunction
function! julia#function_block2assign()
let sav_pos = getcurpos()
let l = getline('.')
let c = match(l, '\C\m\<function\s\+.\+(')
if c == -1
echohl WarningMsg | echo "Not on a function definition line" | echohl None
return
endif
let fpos = copy(sav_pos)
let fpos[2] = c+1
call setpos('.', fpos)
normal %
if line('.') != fpos[1]+2 || match(getline('.'), '\C\m^\s*end\s*$') == -1
echohl WarningMsg | echo "Only works with 3-lines functions" | echohl None
call setpos('.', sav_pos)
return
endif
call setpos('.', fpos)
normal! f(
normal %
while line('.') == fpos[1] && match(l[col('.')-1:], '\C\m)(') == 0
normal! l
normal %
endwhile
if line('.') != fpos[1] || match(l[(col('.')-1):], '\C\m)\%(::\S\+\)\?\%(\s\+where\s\+.*\)\?\s*$') != 0
echohl WarningMsg | echo "Unrecognized function definition format" | echohl None
call setpos('.', sav_pos)
return
endif
call setpos('.', fpos)
normal! dwA = J
if match(getline('.')[(col('.')-1):], '\C\mreturn\>') == 0
normal! dw
endif
if match(getline('.')[(col('.')-1):], '\C\m\s*$') == 0
normal! F=C= nothing
endif
normal! jddk^
return
endfunction
function! julia#function_assign2block()
let sav_pos = getcurpos()
let l = getline('.')
let c = match(l, '\C\m)\%(::\S\+\)\?\%(\s\+where\s\+.*\)\?\s*=\s*')
if c == -1
echohl WarningMsg | echo "Not on a function assignment-definition line" | echohl None
return
endif
normal ^
while match(l[(col('.')-1):], '\%(\S\+\.\)*@') == 0
normal! W
endwhile
normal! ifunction 
let l = getline('.')
let c = match(l, '\C\m)\%(::\S\+\)\?\%(\s\+where\s\+.*\)\?\s*\zs=\s*')
let eqpos = copy(sav_pos)
let eqpos[2] = c+1
call setpos('.', eqpos)
normal! cw
oend
normal %
s/\s*$// | noh
return
endfunction
let s:nonid_chars = "\U01-\U07" . "\U0E-\U1F" .
\ "\"#$'(,.:;=?@`\\U5B{" .
\ "\U80-\UA1" . "\UA7\UA8\UAB\UAD\UAF\UB4" . "\UB6-\UB8" . "\UBB\UBF"
let s:nonidS_chars = "[:space:])\\U5D}" . s:nonid_chars
" the following excludes '!' since it can be used as an identifier,
" and '$' since it can be used in interpolations
" note that \U2D is '-'
let s:uniop_chars = "+\\U2D~¬√∛∜"
let s:binop_chars = "=+\\U2D*/\\%÷^&|⊻<>≤≥≡≠≢∈∉⋅×∪∩⊆⊈⊂⊄⊊←→∋∌⊕⊖⊞⊟∘∧⊗⊘↑↓∨⊠±"
" the following is a list of all remainig valid operator chars,
" but it's more efficient when expressed with ranges (see below)
" let s:binop_chars_extra = "↔↚↛↠↣↦↮⇎⇏⇒⇔⇴⇶⇷⇸⇹⇺⇻⇼⇽⇾⇿⟵⟶⟷⟷⟹⟺⟻⟼⟽⟾⟿⤀⤁⤂⤃⤄⤅⤆⤇⤌⤍⤎⤏⤐⤑⤔⤕⤖⤗⤘⤝⤞⤟⤠⥄⥅⥆⥇⥈⥊⥋⥎⥐⥒⥓⥖⥗⥚⥛⥞⥟⥢⥤⥦⥧⥨⥩⥪⥫⥬⥭⥰⧴⬱⬰⬲⬳⬴⬵⬶⬷⬸⬹⬺⬻⬼⬽⬾⬿⭀⭁⭂⭃⭄⭇⭈⭉⭊⭋⭌←→" .
" \ "∝∊∍∥∦∷∺∻∽∾≁≃≄≅≆≇≈≉≊≋≌≍≎≐≑≒≓≔≕≖≗≘≙≚≛≜≝≞≟≣≦≧≨≩≪≫≬≭≮≯≰≱≲≳≴≵≶≷≸≹≺≻≼≽≾≿⊀⊁⊃⊅⊇⊉⊋⊏⊐⊑⊒⊜⊩⊬⊮⊰⊱⊲⊳⊴⊵⊶⊷⋍⋐⋑⋕⋖⋗⋘⋙⋚⋛⋜⋝⋞⋟⋠⋡⋢⋣⋤⋥⋦⋧⋨⋩⋪⋫⋬⋭⋲⋳⋴⋵⋶⋷⋸⋹⋺⋻⋼⋽⋾⋿⟈⟉⟒⦷⧀⧁⧡⧣⧤⧥⩦⩧⩪⩫⩬⩭⩮⩯⩰⩱⩲⩳⩴⩵⩶⩷⩸⩹⩺⩻⩼⩽⩾⩿⪀⪁⪂⪃⪄⪅⪆⪇⪈⪉⪊⪋⪌⪍⪎⪏⪐⪑⪒⪓⪔⪕⪖⪗⪘⪙⪚⪛⪜⪝⪞⪟⪠⪡⪢⪣⪤⪥⪦⪧⪨⪩⪪⪫⪬⪭⪮⪯⪰⪱⪲⪳⪴⪵⪶⪷⪸⪹⪺⪻⪼⪽⪾⪿⫀⫁⫂⫃⫄⫅⫆⫇⫈⫉⫊⫋⫌⫍⫎⫏⫐⫑⫒⫓⫔⫕⫖⫗⫘⫙⫷⫸⫹⫺⊢⊣" .
" \ "⊔∓∔∸≂≏⊎⊽⋎⋓⧺⧻⨈⨢⨣⨤⨥⨦⨧⨨⨩⨪⨫⨬⨭⨮⨹⨺⩁⩂⩅⩊⩌⩏⩐⩒⩔⩖⩗⩛⩝⩡⩢⩣" .
" \ "⊙⊚⊛⊡⊓∗∙∤⅋≀⊼⋄⋆⋇⋉⋊⋋⋌⋏⋒⟑⦸⦼⦾⦿⧶⧷⨇⨰⨱⨲⨳⨴⨵⨶⨷⨸⨻⨼⨽⩀⩃⩄⩋⩍⩎⩑⩓⩕⩘⩚⩜⩞⩟⩠⫛⊍▷⨝⟕⟖⟗" .
" \ "⇵⟰⟱⤈⤉⤊⤋⤒⤓⥉⥌⥍⥏⥑⥔⥕⥘⥙⥜⥝⥠⥡⥣⥥⥮⥯↑↓"
" same as above, but with character ranges, for performance
let s:binop_chars_extra = "\\U214B\\U2190-\\U2194\\U219A\\U219B\\U21A0\\U21A3\\U21A6\\U21AE\\U21CE\\U21CF\\U21D2\\U21D4\\U21F4-\\U21FF\\U2208-\\U220D\\U2213\\U2214\\U2217-\\U2219\\U221D\\U2224-\\U222A\\U2237\\U2238\\U223A\\U223B\\U223D\\U223E\\U2240-\\U228B\\U228D-\\U229C\\U229E-\\U22A3\\U22A9\\U22AC\\U22AE\\U22B0-\\U22B7\\U22BB-\\U22BD\\U22C4-\\U22C7\\U22C9-\\U22D3\\U22D5-\\U22ED\\U22F2-\\U22FF\\U25B7\\U27C8\\U27C9\\U27D1\\U27D2\\U27D5-\\U27D7\\U27F0\\U27F1\\U27F5-\\U27F7\\U27F7\\U27F9-\\U27FF\\U2900-\\U2918\\U291D-\\U2920\\U2944-\\U2970\\U29B7\\U29B8\\U29BC\\U29BE-\\U29C1\\U29E1\\U29E3-\\U29E5\\U29F4\\U29F6\\U29F7\\U29FA\\U29FB\\U2A07\\U2A08\\U2A1D\\U2A22-\\U2A2E\\U2A30-\\U2A3D\\U2A40-\\U2A45\\U2A4A-\\U2A58\\U2A5A-\\U2A63\\U2A66\\U2A67\\U2A6A-\\U2AD9\\U2ADB\\U2AF7-\\U2AFA\\U2B30-\\U2B44\\U2B47-\\U2B4C\\UFFE9-\\UFFEC"
" a Julia identifier, sort of
let s:idregex = '[^' . s:nonidS_chars . '0-9!' . s:uniop_chars . s:binop_chars . '][^' . s:nonidS_chars . s:uniop_chars . s:binop_chars . s:binop_chars_extra . ']*'
let s:operators = '\%(' . '\.\%([-+*/^÷%|&!]\|//\|\\\|<<\|>>>\?\)\?=' .
\ '\|' . '[:$<>]=\|||\|&&\||>\|<|\|<:\|:>\|::\|<<\|>>>\?\|//\|[-=]>\|\.\{3\}' .
\ '\|' . '[' . s:uniop_chars . '!$]' .
\ '\|' . '\.\?[' . s:binop_chars . s:binop_chars_extra . ']' .
\ '\)'
function! julia#idundercursor()
" TODO...
let w = expand('<cword>')
" let [l,c] = [line('.'),col('.')]
" let ll = getline(l)
return w
endfunction
function! julia#gotodefinition()
let w = julia#idundercursor()
if empty(w)
return ''
endif
let [l,c] = [line('.'),col('.')]
let st = map(synstack(l,c), 'synIDattr(v:val, "name")')
let n = len(st)
if n > 0 && st[-1] =~# '^julia\%(\%(Range\|Ternary\|CTrans\)\?Operator\|\%(Possible\)\?SymbolS\?\|\%(Bl\|Rep\)\?Keyword\|Conditional\|ParDelim\|Char\|Colon\|Typedef\|Number\|Float\|Const\%(Generic\|Bool\)\|ComplexUnit\|\%(Special\|\%(Octal\|Hex\)Escape\)Char\|UniChar\%(Small\|Large\)\|Comment[LM]\|Todo\|Semicolon\)$'
return ''
endif
let comprehension = 0
let indollar = 0
for i in range(n-1, 0, -1)
if st[i] =~# '^juliaDollar\%(Var\|Par\|SqBra\)$'
let indollar = 1
endif
if !indollar && st[i] =~# '^julia\%(\a*String\|QuotedParBlockS\?\)$'
return ''
endif
if st[i] =~# '^julia\%(ParBlock\%(InRange\)\?\|SqBraBlock\|\%(Dollar\|StringVars\)\%(Par\|SqBra\)\)$'
let comprehension = 1
endif
endfor
let s1 = search('\C\<' . w . '\s*=[^=]', 'bcWzs')
return
endfunction
endif

798
autoload/julia_blocks.vim Normal file
View File

@@ -0,0 +1,798 @@
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'julia') == -1
" Facilities for moving around Julia blocks (e.g. if/end, function/end etc.)
" (AKA a collection of horrible hacks)
let s:default_mappings = {
\ "moveblock_n" : "]]",
\ "moveblock_N" : "][",
\ "moveblock_p" : "[[",
\ "moveblock_P" : "[]",
\
\ "move_n" : "]j",
\ "move_N" : "]J",
\ "move_p" : "[j",
\ "move_P" : "[J",
\
\ "select_a" : "aj",
\ "select_i" : "ij",
\
\ "whereami" : "",
\ }
function! s:getmapchars(function)
if exists("g:julia_blocks_mappings") && has_key(g:julia_blocks_mappings, a:function)
return s:escape(g:julia_blocks_mappings[a:function])
else
return s:escape(s:default_mappings[a:function])
endif
endfunction
function! s:map_move(function, toend, backwards)
let chars = s:getmapchars(a:function)
if empty(chars)
return
endif
let fn = "julia_blocks#" . a:function
let lhs = "<buffer> <nowait> <silent> " . chars . " "
let cnt = ":<C-U>let b:jlblk_count=v:count1"
exe "nnoremap " . lhs . cnt
\ . " <Bar> call " . fn . "()<CR>"
exe "onoremap " . lhs . cnt
\ . "<CR><Esc>:call julia_blocks#owrapper_move(v:operator, \"" . fn . "\", " . a:toend . ", " . a:backwards . ")<CR>"
exe "xnoremap " . lhs . cnt
\ . "<CR>gv<Esc>:call julia_blocks#vwrapper_move(\"" . fn . "\")<CR>"
let b:jlblk_mapped[a:function] = 1
endfunction
function! julia_blocks#owrapper_move(oper, function, toend, backwards)
let F = function(a:function)
let save_redraw = &lazyredraw
let save_select = &selection
let restore_cmds = "\<Esc>"
\ . ":let &l:selection = \"" . save_select . "\"\<CR>"
\ . ":let &l:lazyredraw = " . save_redraw . "\<CR>"
\ . ":\<BS>"
setlocal lazyredraw
let start_pos = getpos('.')
let b:jlblk_abort_calls_esc = 0
call F()
let b:jlblk_abort_calls_esc = 1
let end_pos = getpos('.')
if start_pos == end_pos
call feedkeys(restore_cmds, 'n')
endif
let &l:selection = "inclusive"
if a:backwards || !a:toend
let &l:selection = "exclusive"
endif
if a:toend && a:backwards
let end_pos[2] += 1
endif
if s:compare_pos(start_pos, end_pos) > 0
let [start_pos, end_pos] = [end_pos, start_pos]
endif
call setpos("'<", start_pos)
call setpos("'>", end_pos)
" NOTE: the 'c' operator behaves differently, for mysterious reasons. We
" simulate it with 'd' followed by 'i' instead
call feedkeys("gv" . (a:oper == "c" ? "d" : a:oper) . restore_cmds . (a:oper == "c" ? "i" : ""), 'n')
endfunction
function! julia_blocks#vwrapper_move(function)
let F = function(a:function)
let s = getpos('.')
let b1 = getpos("'<")
let b2 = getpos("'>")
let b = b1 == s ? b2 : b1
call setpos('.', s)
let b:jlblk_abort_calls_esc = 0
call F()
let b:jlblk_abort_calls_esc = 1
let e = getpos('.')
call setpos('.', b)
exe "normal " . visualmode()
call setpos('.', e)
endfunction
function! s:unmap(function)
if !get(b:jlblk_mapped, a:function, 0)
return
endif
let chars = s:getmapchars(a:function)
if empty(chars)
" shouldn't happen
return
endif
let mapids = a:function =~# "^move" ? ["n", "x", "o"] :
\ a:function =~# "^select" ? ["x", "o"] :
\ ["n"]
let fn = "julia_blocks#" . a:function
let cmd = "<buffer> " . chars
for m in mapids
exe m . "unmap " . cmd
endfor
let b:jlblk_mapped[a:function] = 0
endfunction
function! s:escape(chars)
let c = a:chars
let c = substitute(c, '|', '<Bar>', 'g')
return c
endfunction
function! s:map_select(function)
let chars = s:getmapchars(a:function)
if empty(chars)
return
endif
let fn = "julia_blocks#" . a:function
let lhs = "<buffer> <nowait> <silent> " . chars . " "
let cnt = ":<C-U>let b:jlblk_inwrapper=1<CR>:let b:jlblk_count=max([v:prevcount,1])<CR>"
exe "onoremap " . lhs . "<Esc>" . cnt
\ . ":call julia_blocks#owrapper_select(v:operator, \"" . fn . "\")<CR>"
exe "xnoremap " . lhs . cnt
\ . ":call julia_blocks#vwrapper_select(\"" . fn . "\")<CR>"
let b:jlblk_mapped[a:function] = 1
endfunction
function! julia_blocks#owrapper_select(oper, function) ", toend, backwards)
let F = function(a:function)
let save_redraw = &lazyredraw
let save_select = &selection
let restore_cmds = "\<Esc>"
\ . ":let &l:selection = \"" . save_select . "\"\<CR>"
\ . ":let &l:lazyredraw = " . save_redraw . "\<CR>"
\ . ":\<BS>"
setlocal lazyredraw
let b:jlblk_abort_calls_esc = 0
let retF = F()
let b:jlblk_abort_calls_esc = 1
if empty(retF)
let b:jlblk_inwrapper = 0
call feedkeys(restore_cmds, 'n')
return
end
let [start_pos, end_pos] = retF
if start_pos == end_pos
call feedkeys(restore_cmds, 'n')
endif
let &l:selection = "inclusive"
call setpos("'<", start_pos)
call setpos("'>", end_pos)
let b:jlblk_inwrapper = 0
" NOTE: the 'c' operator behaves differently, for mysterious reasons. We
" simulate it with 'd' followed by 'i' instead
call feedkeys("gv" . (a:oper == "c" ? "d" : a:oper) . restore_cmds . (a:oper == "c" ? "i" : ""), 'n')
endfunction
function! julia_blocks#vwrapper_select(function)
let F = function(a:function)
let b:jlblk_abort_calls_esc = 0
let retF = F()
let b:jlblk_abort_calls_esc = 1
if empty(retF)
let b:jlblk_inwrapper = 0
return
end
let [start_pos, end_pos] = retF
call setpos("'<", start_pos)
call setpos("'>", end_pos)
normal! gv
let b:jlblk_inwrapper = 0
endfunction
function! s:map_aux(function)
let chars = s:getmapchars(a:function)
if empty(chars)
return
endif
let fn = "julia_blocks#" . a:function
let lhs = "<buffer> <nowait> <silent> " . chars . " "
exe "nnoremap " . lhs . ":<C-U>echo " . fn . "()<CR>"
let b:jlblk_mapped[a:function] = 1
endfunction
let s:julia_blocks_functions = {
\ "moveblock_N": [1, 0],
\ "moveblock_n": [0, 0],
\ "moveblock_p": [0, 1],
\ "moveblock_P": [1, 1],
\
\ "move_N": [1, 0],
\ "move_n": [0, 0],
\ "move_p": [0, 1],
\ "move_P": [1, 1],
\
\ "select_a": [],
\ "select_i": [],
\
\ "whereami": [],
\ }
function! julia_blocks#init_mappings()
let b:jlblk_mapped = {}
for f in keys(s:julia_blocks_functions)
if f =~# "^move"
let [te, bw] = s:julia_blocks_functions[f]
call s:map_move(f, te, bw)
elseif f =~# "^select"
call s:map_select(f)
else
call s:map_aux(f)
endif
endfor
call julia_blocks#select_reset()
augroup JuliaBlocks
au!
au InsertEnter *.jl call julia_blocks#select_reset()
au CursorMoved *.jl call s:cursor_moved()
augroup END
" we would need some autocmd event associated with exiting from
" visual mode, but there isn't any, so we resort to this crude
" hack
" ACTUALLY this creates more problems than it solves, so the crude hack
" is just disabled
"vnoremap <buffer><silent><unique> <Esc> <Esc>:call julia_blocks#select_reset()<CR>
endfunction
function! julia_blocks#remove_mappings()
if exists("b:jlblk_mapped")
for f in keys(s:julia_blocks_functions)
call s:unmap(f)
endfor
endif
unlet! b:jlblk_save_pos b:jlblk_view b:jlblk_count b:jlblk_abort_calls_esc
unlet! b:jlblk_inwrapper b:jlblk_did_select b:jlblk_doing_select
unlet! b:jlblk_last_start_pos b:jlblk_last_end_pos b:jlblk_last_mode
augroup JuliaBlocks
au!
augroup END
augroup! JuliaBlocks
let md = maparg("<Esc>", "x", 0, 1)
if !empty(md) && md["buffer"]
vunmap <buffer> <Esc>
endif
endfunction
function! s:restore_view()
"redraw! " would ensure correct behaviour, but is annoying
let pos = getpos('.')
if pos == b:jlblk_save_pos
call winrestview(b:jlblk_view)
return
endif
let oldtopline = b:jlblk_view["topline"]
let newtopline = winsaveview()["topline"]
let l = pos[1]
if l >= oldtopline + &l:scrolloff && l <= oldtopline + winheight(0) - 1 - &l:scrolloff
if newtopline > oldtopline
exe ":normal! " . (newtopline - oldtopline) . "\<C-Y>"
elseif newtopline < oldtopline
exe ":normal! " . (oldtopline - newtopline) . "\<C-E>"
endif
" these reduce the scrolling to the minimum (which is maybe not
" standard ViM behaviour?)
elseif newtopline < oldtopline && (l - newtopline - &l:scrolloff) > 0
exe ":normal! " . (l - newtopline - &l:scrolloff) . "\<C-E>"
elseif newtopline > oldtopline && (newtopline + &l:scrolloff - l) > 0
exe ":normal! " . (l - newtopline - &l:scrolloff) . "\<C-E>"
endif
call setpos('.', pos) " make sure we didn't screw up
" (since winsaveview may not be up to date)
endfunction
function! s:abort()
call setpos('.', b:jlblk_save_pos)
call s:restore_view()
if get(b:, "jlblk_abort_calls_esc", 1)
call feedkeys("\<Esc>", 'n')
endif
return 0
endfunction
function! s:set_mark_tick(...)
" This could be a one-liner:
" call setpos("''", b:jlblk_save_pos)
" but we want to append to the jumplist,
" which setpos doesn't do
let p = getpos('.')
call setpos('.', b:jlblk_save_pos)
normal! m'
call setpos('.', p)
endfunction
function! s:get_save_pos(...)
if !exists("b:jlblk_save_pos") || (a:0 == 0) || (a:0 > 0 && a:1)
let b:jlblk_save_pos = getpos('.')
endif
let b:jlblk_view = winsaveview()
endfunction
function! s:on_end()
return getline('.')[col('.')-1] =~# '\k' && expand("<cword>") =~# b:julia_end_keywords
endfunction
function! s:on_begin()
let [l,c] = [line('.'), col('.')]
normal! ^
let patt = '\%<'.(c+1).'c\(' . b:julia_begin_keywordsm . '\)\%>'.(c-1).'c'
let n = search(patt, 'Wnc', l)
call cursor(l, c)
return n > 0
endfunction
function! s:matchit()
let lkj = exists(":lockjumps") == 2 ? "lockjumps " : ""
exe lkj . "normal %"
endfunction
function! s:move_before_begin()
call search(b:julia_begin_keywordsm, 'Wbc')
normal! h
endfunction
function! s:cycle_until_end()
let pos = getpos('.')
while !s:on_end()
call s:matchit()
let c = 0
if getpos('.') == pos || c > 1000
" shouldn't happen, but let's avoid infinite loops anyway
return 0
endif
let c += 1
endwhile
return 1
endfunction
function! s:moveto_block_delim(toend, backwards, ...)
let pattern = a:toend ? b:julia_end_keywords : b:julia_begin_keywordsm
let flags = a:backwards ? 'Wb' : 'W'
let cnt = a:0 > 0 ? a:1 : b:jlblk_count
if !a:toend && a:backwards && s:on_begin()
call s:move_before_begin()
endif
let ret = 0
for c in range(cnt)
if a:toend && a:backwards && s:on_end()
normal! l
normal! bh
endif
while 1
let searchret = search(pattern, flags)
if !searchret
return ret
endif
exe "let skip = " . b:match_skip
if !skip
let ret = 1
break
endif
endwhile
endfor
return ret
endfunction
function! s:compare_pos(pos1, pos2)
if a:pos1[1] < a:pos2[1]
return -1
elseif a:pos1[1] > a:pos2[1]
return 1
elseif a:pos1[2] < a:pos2[2]
return -1
elseif a:pos1[2] > a:pos2[2]
return 1
else
return 0
endif
endfunction
function! julia_blocks#move_N()
call s:get_save_pos()
let ret = s:moveto_block_delim(1, 0)
if !ret
return s:abort()
endif
normal! e
call s:set_mark_tick()
return 1
endfunction
function! julia_blocks#move_n()
call s:get_save_pos()
let ret = s:moveto_block_delim(0, 0)
if !ret
return s:abort()
endif
call s:set_mark_tick()
return 1
endfunction
function! julia_blocks#move_p()
call s:get_save_pos()
let ret = s:moveto_block_delim(0, 1)
if !ret
return s:abort()
endif
call s:set_mark_tick()
return 1
endfunction
function! julia_blocks#move_P()
call s:get_save_pos()
let ret = s:moveto_block_delim(1, 1)
if !ret
return s:abort()
endif
normal! e
call s:set_mark_tick()
return 1
endfunction
function! s:moveto_currentblock_end()
let flags = 'W'
if s:on_end()
let flags .= 'c'
" NOTE: using "normal! lb" fails at the end of the file (?!)
normal! l
normal! b
endif
let ret = searchpair(b:julia_begin_keywordsm, '', b:julia_end_keywords, flags, b:match_skip)
if ret <= 0
return s:abort()
endif
normal! e
return 1
endfunction
function! julia_blocks#moveblock_N()
call s:get_save_pos()
let ret = 0
for c in range(b:jlblk_count)
let last_seen_pos = getpos('.')
if s:on_end()
normal! hel
let save_pos = getpos('.')
let ret_start = s:moveto_block_delim(0, 0, 1)
let start1_pos = ret_start ? getpos('.') : [0,0,0,0]
call setpos('.', save_pos)
if s:on_end()
normal! h
endif
let ret_end = s:moveto_block_delim(1, 0, 1)
let end1_pos = ret_end ? getpos('.') : [0,0,0,0]
if ret_start && (!ret_end || s:compare_pos(start1_pos, end1_pos) < 0)
call setpos('.', start1_pos)
else
call setpos('.', save_pos)
endif
endif
let moveret = s:moveto_currentblock_end()
if !moveret && c == 0
let moveret = s:moveto_block_delim(0, 0, 1) && s:cycle_until_end()
if moveret
normal! e
endif
endif
if !moveret
call setpos('.', last_seen_pos)
break
endif
let ret = 1
endfor
if !ret
return s:abort()
endif
call s:set_mark_tick()
return 1
endfunction
function! julia_blocks#moveblock_n()
call s:get_save_pos()
let ret = 0
for c in range(b:jlblk_count)
let last_seen_pos = getpos('.')
call s:moveto_currentblock_end()
if s:moveto_block_delim(0, 0, 1)
let ret = 1
else
call setpos('.', last_seen_pos)
break
endif
endfor
if !ret
return s:abort()
endif
call s:set_mark_tick()
return 1
endfunction
function! julia_blocks#moveblock_p()
call s:get_save_pos()
let ret = 0
for c in range(b:jlblk_count)
let last_seen_pos = getpos('.')
if s:on_begin()
call s:move_before_begin()
if s:on_end()
normal! l
endif
let save_pos = getpos('.')
let ret_start = s:moveto_block_delim(0, 1, 1)
let start1_pos = ret_start ? getpos('.') : [0,0,0,0]
call setpos('.', save_pos)
let ret_end = s:moveto_block_delim(1, 1, 1)
let end1_pos = ret_end ? getpos('.') : [0,0,0,0]
if ret_end && (!ret_start || s:compare_pos(start1_pos, end1_pos) < 0)
call setpos('.', end1_pos)
else
call setpos('.', save_pos)
endif
endif
let moveret = s:moveto_currentblock_end()
if !moveret && c == 0
let moveret = s:moveto_block_delim(1, 1, 1)
endif
if !moveret
call setpos('.', last_seen_pos)
break
endif
call s:matchit()
let ret = 1
endfor
if !ret
return s:abort()
endif
call s:set_mark_tick()
call s:restore_view()
return 1
endfunction
function! julia_blocks#moveblock_P()
call s:get_save_pos()
let ret = 0
for c in range(b:jlblk_count)
let last_seen_pos = getpos('.')
call s:moveto_currentblock_end()
if s:on_end()
call s:matchit()
endif
if s:moveto_block_delim(1, 1, 1)
" NOTE: normal! he does not work unless &whichwrap inlcudes h
normal! h
normal! e
let ret = 1
else
call setpos('.', last_seen_pos)
endif
endfor
if !ret
return s:abort()
endif
call s:set_mark_tick()
call s:restore_view()
return 1
endfunction
function! julia_blocks#whereami()
let b:jlblk_count = v:count1
let save_redraw = &lazyredraw
setlocal lazyredraw
let pos = getpos('.')
let ret = julia_blocks#select_a('w')
if empty(ret)
call setpos('.', pos)
let &l:lazyredraw = save_redraw
return ""
end
let [start_pos, end_pos] = ret
let m = getline(start_pos[1])[start_pos[2]-1:]
" If cursor_moved was not forced from select_a, we force it now
" (TODO: this is *really* ugly)
if end_pos != pos
call s:cursor_moved(1)
endif
call setpos('.', pos)
call s:restore_view()
let &l:lazyredraw = save_redraw
return m
endfunction
" Block text objects
function! s:find_block(current_mode)
let flags = 'W'
if b:jlblk_did_select
call setpos('.', b:jlblk_last_start_pos)
if !s:cycle_until_end()
return s:abort()
endif
if !(a:current_mode[0] == 'a' && a:current_mode == b:jlblk_last_mode)
let flags .= 'c'
endif
elseif s:on_end()
let flags .= 'c'
" NOTE: using "normal! lb" fails at the end of the file (?!)
normal! l
normal! b
endif
let searchret = searchpair(b:julia_begin_keywordsm, '', b:julia_end_keywords, flags, b:match_skip)
if searchret <= 0
if !b:jlblk_did_select
return s:abort()
else
call setpos('.', b:jlblk_last_end_pos)
endif
endif
let end_pos = getpos('.')
" Jump to match
call s:matchit()
let start_pos = getpos('.')
let b:jlblk_last_start_pos = copy(start_pos)
let b:jlblk_last_end_pos = copy(end_pos)
return [start_pos, end_pos]
endfunction
function! s:repeated_find(ai_mode)
let repeat = b:jlblk_count + (a:ai_mode == 'i' && v:count1 > 1 ? 1 : 0)
for c in range(repeat)
let current_mode = (c < repeat - 1 ? 'a' : a:ai_mode)
let ret_find_block = s:find_block(current_mode)
if empty(ret_find_block)
return 0
endif
let [start_pos, end_pos] = ret_find_block
call setpos('.', end_pos)
let b:jlblk_last_mode = current_mode
if c < repeat - 1
let b:jlblk_doing_select = 0
let b:jlblk_did_select = 1
endif
endfor
return [start_pos, end_pos]
endfunction
function! julia_blocks#select_a(...)
let mode_flag = a:0 > 0 ? a:1 : ''
call s:get_save_pos(!b:jlblk_did_select)
let current_pos = getpos('.')
let ret_find_block = s:repeated_find('a' . mode_flag)
if empty(ret_find_block)
return 0
endif
let [start_pos, end_pos] = ret_find_block
call setpos('.', end_pos)
normal! e
let end_pos = getpos('.')
let b:jlblk_doing_select = 1
" CursorMove is only triggered if end_pos
" end_pos is different than the staring position;
" so when starting from the 'd' in 'end' we need to
" force it
if current_pos == end_pos
call s:cursor_moved(1)
endif
call s:set_mark_tick()
return [start_pos, end_pos]
endfunction
function! julia_blocks#select_i()
call s:get_save_pos(!b:jlblk_did_select)
let current_pos = getpos('.')
let ret_find_block = s:repeated_find('i')
if empty(ret_find_block)
return 0
endif
let [start_pos, end_pos] = ret_find_block
if end_pos[1] <= start_pos[1]+1
return s:abort()
endif
call setpos('.', end_pos)
let b:jlblk_doing_select = 1
let start_pos[1] += 1
call setpos('.', start_pos)
normal! ^
let start_pos = getpos('.')
let end_pos[1] -= 1
let end_pos[2] = len(getline(end_pos[1]))
" CursorMove is only triggered if end_pos
" end_pos is different than the staring position;
" so when starting from the 'd' in 'end' we need to
" force it
if current_pos == end_pos
call s:cursor_moved(1)
endif
call s:set_mark_tick()
return [start_pos, end_pos]
endfunction
function julia_blocks#select_reset()
let b:jlblk_did_select = 0
let b:jlblk_doing_select = 0
let b:jlblk_inwrapper = 0
let b:jlblk_last_mode = ""
endfunction
function! s:cursor_moved(...)
if b:jlblk_inwrapper && !(a:0 > 0 && a:1)
return
endif
let b:jlblk_did_select = b:jlblk_doing_select
let b:jlblk_doing_select = 0
endfunction
endif

File diff suppressed because it is too large Load Diff

31
autoload/vifm/globals.vim Normal file
View File

@@ -0,0 +1,31 @@
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'vifm') == -1
" common functions for vifm plugin related to globals
" Maintainer: xaizek <xaizek@posteo.net>
" Last Change: January 02, 2018
" Initializes global variables to defaults unless they are already set
function! vifm#globals#Init()
if !exists('g:vifm_exec')
let g:vifm_exec = 'vifm'
endif
if !exists('g:vifm_exec_args')
let g:vifm_exec_args = ''
endif
if !exists('g:vifm_term')
if has('win32')
if filereadable('C:\Windows\system32\cmd.exe')
let g:vifm_term = 'C:\Windows\system32\cmd.exe /C'
else
" If don't find use the integrate shell it work too
let g:vifm_term = ''
endif
else
let g:vifm_term = 'xterm -e'
endif
endif
endfunction
endif

View File

@@ -1,16 +0,0 @@
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'crystal') == -1
function! vital#of(name) abort
let files = globpath(&runtimepath, 'autoload/vital/' . a:name . '.vital')
let file = split(files, "\n")
if empty(file)
throw 'vital: version file not found: ' . a:name
endif
let ver = readfile(file[0], 'b')
if empty(ver)
throw 'vital: invalid version file: ' . a:name
endif
return vital#_{substitute(ver[0], '\W', '', 'g')}#new()
endfunction
endif

View File

@@ -1,313 +1,13 @@
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'crystal') == -1 if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'crystal') == -1
let s:self_version = expand('<sfile>:t:r') let s:_plugin_name = expand('<sfile>:t:r')
let s:self_file = expand('<sfile>')
" Note: The extra argument to globpath() was added in Patch 7.2.051. function! vital#{s:_plugin_name}#new() abort
let s:globpath_third_arg = v:version > 702 || v:version == 702 && has('patch51') return vital#{s:_plugin_name[1:]}#new()
let s:loaded = {}
let s:cache_module_path = {}
let s:cache_sid = {}
let s:_vital_files_cache_runtimepath = ''
let s:_vital_files_cache = []
let s:_unify_path_cache = {}
function! s:import(name, ...) abort
let target = {}
let functions = []
for a in a:000
if type(a) == type({})
let target = a
elseif type(a) == type([])
let functions = a
endif
unlet a
endfor
let module = s:_import(a:name)
if empty(functions)
call extend(target, module, 'keep')
else
for f in functions
if has_key(module, f) && !has_key(target, f)
let target[f] = module[f]
endif
endfor
endif
return target
endfunction endfunction
function! s:load(...) dict abort function! vital#{s:_plugin_name}#function(funcname) abort
for arg in a:000 silent! return function(a:funcname)
let [name; as] = type(arg) == type([]) ? arg[: 1] : [arg, arg]
let target = split(join(as, ''), '\W\+')
let dict = self
let dict_type = type({})
while !empty(target)
let ns = remove(target, 0)
if !has_key(dict, ns)
let dict[ns] = {}
endif
if type(dict[ns]) == dict_type
let dict = dict[ns]
else
unlet dict
break
endif
endwhile
if exists('dict')
call extend(dict, s:_import(name))
endif
unlet arg
endfor
return self
endfunction
function! s:unload() abort
let s:loaded = {}
let s:cache_sid = {}
let s:cache_module_path = {}
endfunction
function! s:exists(name) abort
return s:_get_module_path(a:name) !=# ''
endfunction
function! s:search(pattern) abort
let paths = s:_vital_files(a:pattern)
let modules = sort(map(paths, 's:_file2module(v:val)'))
return s:_uniq(modules)
endfunction
function! s:expand_modules(entry, all) abort
if type(a:entry) == type([])
let candidates = s:_concat(map(copy(a:entry), 's:search(v:val)'))
if empty(candidates)
throw printf('vital: Any of module %s is not found', string(a:entry))
endif
if eval(join(map(copy(candidates), 'has_key(a:all, v:val)'), '+'))
let modules = []
else
let modules = [candidates[0]]
endif
else
let modules = s:search(a:entry)
if empty(modules)
throw printf('vital: Module %s is not found', a:entry)
endif
endif
call filter(modules, '!has_key(a:all, v:val)')
for module in modules
let a:all[module] = 1
endfor
return modules
endfunction
function! s:_import(name) abort
if type(a:name) == type(0)
return s:_build_module(a:name)
endif
let path = s:_get_module_path(a:name)
if path ==# ''
throw 'vital: module not found: ' . a:name
endif
let sid = s:_get_sid_by_script(path)
if !sid
try
execute 'source' fnameescape(path)
catch /^Vim\%((\a\+)\)\?:E484/
throw 'vital: module not found: ' . a:name
catch /^Vim\%((\a\+)\)\?:E127/
" Ignore.
endtry
let sid = s:_get_sid_by_script(path)
endif
return s:_build_module(sid)
endfunction
function! s:_get_module_path(name) abort
let key = a:name . '_'
if has_key(s:cache_module_path, key)
return s:cache_module_path[key]
endif
if s:_is_absolute_path(a:name) && filereadable(a:name)
return a:name
endif
if a:name ==# ''
let paths = [s:self_file]
elseif a:name =~# '\v^\u\w*%(\.\u\w*)*$'
let paths = s:_vital_files(a:name)
else
throw 'vital: Invalid module name: ' . a:name
endif
call filter(paths, 'filereadable(expand(v:val, 1))')
let path = get(paths, 0, '')
let s:cache_module_path[key] = path
return path
endfunction
function! s:_get_sid_by_script(path) abort
if has_key(s:cache_sid, a:path)
return s:cache_sid[a:path]
endif
let path = s:_unify_path(a:path)
for line in filter(split(s:_redir('scriptnames'), "\n"),
\ 'stridx(v:val, s:self_version) > 0')
let list = matchlist(line, '^\s*\(\d\+\):\s\+\(.\+\)\s*$')
if !empty(list) && s:_unify_path(list[2]) ==# path
let s:cache_sid[a:path] = list[1] - 0
return s:cache_sid[a:path]
endif
endfor
return 0
endfunction
function! s:_file2module(file) abort
let filename = fnamemodify(a:file, ':p:gs?[\\/]?/?')
let tail = matchstr(filename, 'autoload/vital/_\w\+/\zs.*\ze\.vim$')
return join(split(tail, '[\\/]\+'), '.')
endfunction
if filereadable(expand('<sfile>:r') . '.VIM')
" resolve() is slow, so we cache results.
" Note: On windows, vim can't expand path names from 8.3 formats.
" So if getting full path via <sfile> and $HOME was set as 8.3 format,
" vital load duplicated scripts. Below's :~ avoid this issue.
function! s:_unify_path(path) abort
if has_key(s:_unify_path_cache, a:path)
return s:_unify_path_cache[a:path]
endif
let value = tolower(fnamemodify(resolve(fnamemodify(
\ a:path, ':p')), ':~:gs?[\\/]?/?'))
let s:_unify_path_cache[a:path] = value
return value
endfunction
else
function! s:_unify_path(path) abort
return resolve(fnamemodify(a:path, ':p:gs?[\\/]?/?'))
endfunction
endif
if s:globpath_third_arg
function! s:_runtime_files(path) abort
return split(globpath(&runtimepath, a:path, 1), "\n")
endfunction
else
function! s:_runtime_files(path) abort
return split(globpath(&runtimepath, a:path), "\n")
endfunction
endif
function! s:_vital_files(pattern) abort
if s:_vital_files_cache_runtimepath !=# &runtimepath
let path = printf('autoload/vital/%s/**/*.vim', s:self_version)
let s:_vital_files_cache = s:_runtime_files(path)
let mod = ':p:gs?[\\/]\+?/?'
call map(s:_vital_files_cache, 'fnamemodify(v:val, mod)')
let s:_vital_files_cache_runtimepath = &runtimepath
endif
let target = substitute(a:pattern, '\.', '/', 'g')
let target = substitute(target, '\*', '[^/]*', 'g')
let regexp = printf('autoload/vital/%s/%s.vim', s:self_version, target)
return filter(copy(s:_vital_files_cache), 'v:val =~# regexp')
endfunction
" Copy from System.Filepath
if has('win16') || has('win32') || has('win64')
function! s:_is_absolute_path(path) abort
return a:path =~? '^[a-z]:[/\\]'
endfunction
else
function! s:_is_absolute_path(path) abort
return a:path[0] ==# '/'
endfunction
endif
function! s:_build_module(sid) abort
if has_key(s:loaded, a:sid)
return copy(s:loaded[a:sid])
endif
let functions = s:_get_functions(a:sid)
let prefix = '<SNR>' . a:sid . '_'
let module = {}
for func in functions
let module[func] = function(prefix . func)
endfor
if has_key(module, '_vital_created')
call module._vital_created(module)
endif
let export_module = filter(copy(module), 'v:key =~# "^\\a"')
let s:loaded[a:sid] = get(g:, 'vital_debug', 0) ? module : export_module
if has_key(module, '_vital_loaded')
let V = vital#{s:self_version}#new()
call module._vital_loaded(V)
endif
return copy(s:loaded[a:sid])
endfunction
if exists('+regexpengine')
function! s:_get_functions(sid) abort
let funcs = s:_redir(printf("function /\\%%#=2^\<SNR>%d_", a:sid))
let map_pat = '<SNR>' . a:sid . '_\zs\w\+'
return map(split(funcs, "\n"), 'matchstr(v:val, map_pat)')
endfunction
else
function! s:_get_functions(sid) abort
let prefix = '<SNR>' . a:sid . '_'
let funcs = s:_redir('function')
let filter_pat = '^\s*function ' . prefix
let map_pat = prefix . '\zs\w\+'
return map(filter(split(funcs, "\n"),
\ 'stridx(v:val, prefix) > 0 && v:val =~# filter_pat'),
\ 'matchstr(v:val, map_pat)')
endfunction
endif
if exists('*uniq')
function! s:_uniq(list) abort
return uniq(a:list)
endfunction
else
function! s:_uniq(list) abort
let i = len(a:list) - 1
while 0 < i
if a:list[i] ==# a:list[i - 1]
call remove(a:list, i)
let i -= 2
else
let i -= 1
endif
endwhile
return a:list
endfunction
endif
function! s:_concat(lists) abort
let result_list = []
for list in a:lists
let result_list += list
endfor
return result_list
endfunction
function! s:_redir(cmd) abort
let [save_verbose, save_verbosefile] = [&verbose, &verbosefile]
set verbose=0 verbosefile=
redir => res
silent! execute a:cmd
redir END
let [&verbose, &verbosefile] = [save_verbose, save_verbosefile]
return res
endfunction
function! vital#{s:self_version}#new() abort
return s:_import('')
endfunction endfunction
endif endif

View File

@@ -1,5 +1,14 @@
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'crystal') == -1 if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'crystal') == -1
" ___vital___
" NOTE: lines between '" ___vital___' is generated by :Vitalize.
" Do not mofidify the code nor insert new lines before '" ___vital___'
function! s:_SID() abort
return matchstr(expand('<sfile>'), '<SNR>\zs\d\+\ze__SID$')
endfunction
execute join(['function! vital#_crystal#ColorEcho#import() abort', printf("return map({'get_echorizer': '', 'echo': '', 'is_available': ''}, \"vital#_crystal#function('<SNR>%s_' . v:key)\")", s:_SID()), 'endfunction'], "\n")
delfunction s:_SID
" ___vital___
scriptencoding utf-8 scriptencoding utf-8
let s:save_cpo = &cpo let s:save_cpo = &cpo
set cpo&vim set cpo&vim

View File

@@ -1,5 +1,14 @@
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'crystal') == -1 if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'crystal') == -1
" ___vital___
" NOTE: lines between '" ___vital___' is generated by :Vitalize.
" Do not mofidify the code nor insert new lines before '" ___vital___'
function! s:_SID() abort
return matchstr(expand('<sfile>'), '<SNR>\zs\d\+\ze__SID$')
endfunction
execute join(['function! vital#_crystal#Data#List#import() abort', printf("return map({'combinations': '', 'and': '', 'sort_by': '', 'foldr1': '', 'sort': '', 'flatten': '', 'has_index': '', 'find_indices': '', 'any': '', 'unshift': '', 'span': '', 'pop': '', 'binary_search': '', 'uniq_by': '', 'or': '', 'all': '', 'zip': '', 'find_last_index': '', 'find': '', 'partition': '', 'shift': '', 'permutations': '', 'break': '', 'max_by': '', 'foldl': '', 'foldr': '', 'find_index': '', 'drop_while': '', 'group_by': '', 'take_while': '', 'conj': '', 'push': '', 'char_range': '', 'cons': '', 'foldl1': '', 'intersect': '', 'concat': '', 'map_accum': '', 'clear': '', 'has_common_items': '', 'product': '', 'zip_fill': '', 'uniq': '', 'has': '', 'min_by': '', 'with_index': ''}, \"vital#_crystal#function('<SNR>%s_' . v:key)\")", s:_SID()), 'endfunction'], "\n")
delfunction s:_SID
" ___vital___
" Utilities for list. " Utilities for list.
let s:save_cpo = &cpo let s:save_cpo = &cpo
@@ -175,6 +184,11 @@ function! s:take_while(f, xs) abort
return s:span(a:f, a:xs)[0] return s:span(a:f, a:xs)[0]
endfunction endfunction
" similar to Haskell's Data.List.dropWhile
function! s:drop_while(f, xs) abort
return s:span(a:f, a:xs)[1]
endfunction
" similar to Haskell's Data.List.partition " similar to Haskell's Data.List.partition
function! s:partition(f, xs) abort function! s:partition(f, xs) abort
return [filter(copy(a:xs), a:f), filter(copy(a:xs), '!(' . a:f . ')')] return [filter(copy(a:xs), a:f), filter(copy(a:xs), '!(' . a:f . ')')]
@@ -271,14 +285,22 @@ endfunction
" similar to Ruby's detect or Haskell's find. " similar to Ruby's detect or Haskell's find.
function! s:find(list, default, f) abort function! s:find(list, default, f) abort
let l:Call = type(a:f) is type(function('function'))
\ ? function('call')
\ : function('s:_call_string_expr')
for x in a:list for x in a:list
if eval(substitute(a:f, 'v:val', string(x), 'g')) if l:Call(a:f, [x])
return x return x
endif endif
endfor endfor
return a:default return a:default
endfunction endfunction
function! s:_call_string_expr(expr, args) abort
return map([a:args[0]], a:expr)[0]
endfunction
" Returns the index of the first element which satisfies the given expr. " Returns the index of the first element which satisfies the given expr.
function! s:find_index(xs, f, ...) abort function! s:find_index(xs, f, ...) abort
let len = len(a:xs) let len = len(a:xs)
@@ -426,7 +448,7 @@ function! s:combinations(list, r) abort
if a:r > len(a:list) if a:r > len(a:list)
return [] return []
elseif a:r < 0 elseif a:r < 0
throw 'vital: Data:List: {r} must be non-negative integer' throw 'vital: Data.List: {r} must be non-negative integer'
endif endif
let n = len(a:list) let n = len(a:list)
let result = [] let result = []

View File

@@ -1,5 +1,14 @@
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'crystal') == -1 if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'crystal') == -1
" ___vital___
" NOTE: lines between '" ___vital___' is generated by :Vitalize.
" Do not mofidify the code nor insert new lines before '" ___vital___'
function! s:_SID() abort
return matchstr(expand('<sfile>'), '<SNR>\zs\d\+\ze__SID$')
endfunction
execute join(['function! vital#_crystal#Data#String#import() abort', printf("return map({'starts_with': '', 'split3': '', 'replace_first': '', 'chop': '', 'unescape': '', 'split_posix_text': '', 'replace': '', 'scan': '', 'strwidthpart': '', 'common_head': '', 'reverse': '', 'escape_pattern': '', 'trim_end': '', '_vital_depends': '', 'wrap': '', 'join_posix_lines': '', 'contains_multibyte': '', 'truncate_skipping': '', 'split_leftright': '', 'ends_with': '', 'nsplit': '', 'strwidthpart_reverse': '', 'unescape_pattern': '', 'levenshtein_distance': '', 'trim_start': '', 'justify_equal_spacing': '', 'nr2hex': '', 'iconv': '', 'pad_left': '', 'nr2enc_char': '', 'lines': '', 'repair_posix_text': '', 'nr2byte': '', 'trim': '', 'diffidx': '', 'truncate': '', 'split_by_displaywidth': '', '_vital_created': '', 'padding_by_displaywidth': '', 'hash': '', 'chomp': '', 'pad_between_letters': '', 'dstring': '', 'pad_both_sides': '', 'substitute_last': '', 'pad_right': '', 'remove_ansi_sequences': '', '_vital_loaded': ''}, \"vital#_crystal#function('<SNR>%s_' . v:key)\")", s:_SID()), 'endfunction'], "\n")
delfunction s:_SID
" ___vital___
" Utilities for string. " Utilities for string.
let s:save_cpo = &cpo let s:save_cpo = &cpo
@@ -7,12 +16,21 @@ set cpo&vim
function! s:_vital_loaded(V) abort function! s:_vital_loaded(V) abort
let s:V = a:V let s:V = a:V
let s:P = s:V.import('Prelude')
let s:L = s:V.import('Data.List') let s:L = s:V.import('Data.List')
endfunction endfunction
function! s:_vital_depends() abort function! s:_vital_depends() abort
return ['Prelude', 'Data.List'] return ['Data.List']
endfunction
function! s:_vital_created(module) abort
" Expose script-local funcref
if exists('s:strchars')
let a:module.strchars = s:strchars
endif
if exists('s:wcswidth')
let a:module.wcswidth = s:wcswidth
endif
endfunction endfunction
" Substitute a:from => a:to by string. " Substitute a:from => a:to by string.
@@ -61,7 +79,7 @@ function! s:common_head(strs) abort
endif endif
let strs = len == 2 ? a:strs : sort(copy(a:strs)) let strs = len == 2 ? a:strs : sort(copy(a:strs))
let pat = substitute(strs[0], '.', '\="[" . escape(submatch(0), "^\\") . "]"', 'g') let pat = substitute(strs[0], '.', '\="[" . escape(submatch(0), "^\\") . "]"', 'g')
return pat == '' ? '' : matchstr(strs[-1], '\C^\%[' . pat . ']') return pat ==# '' ? '' : matchstr(strs[-1], '\C^\%[' . pat . ']')
endfunction endfunction
" Split to two elements of List. ([left, right]) " Split to two elements of List. ([left, right])
@@ -130,9 +148,7 @@ endfunction
" even if a:str contains multibyte character(s). " even if a:str contains multibyte character(s).
" s:strchars(str) {{{ " s:strchars(str) {{{
if exists('*strchars') if exists('*strchars')
function! s:strchars(str) abort let s:strchars = function('strchars')
return strchars(a:str)
endfunction
else else
function! s:strchars(str) abort function! s:strchars(str) abort
return strlen(substitute(copy(a:str), '.', 'x', 'g')) return strlen(substitute(copy(a:str), '.', 'x', 'g'))
@@ -210,7 +226,7 @@ function! s:nr2byte(nr) abort
endfunction endfunction
function! s:nr2enc_char(charcode) abort function! s:nr2enc_char(charcode) abort
if &encoding == 'utf-8' if &encoding ==# 'utf-8'
return nr2char(a:charcode) return nr2char(a:charcode)
endif endif
let char = s:nr2byte(a:charcode) let char = s:nr2byte(a:charcode)
@@ -222,7 +238,7 @@ endfunction
function! s:nr2hex(nr) abort function! s:nr2hex(nr) abort
let n = a:nr let n = a:nr
let r = "" let r = ''
while n while n
let r = '0123456789ABCDEF'[n % 16] . r let r = '0123456789ABCDEF'[n % 16] . r
let n = n / 16 let n = n / 16
@@ -318,7 +334,7 @@ function! s:levenshtein_distance(str1, str2) abort
let letters2 = split(a:str2, '\zs') let letters2 = split(a:str2, '\zs')
let length1 = len(letters1) let length1 = len(letters1)
let length2 = len(letters2) let length2 = len(letters2)
let distances = map(range(1, length1 + 1), 'map(range(1, length2 + 1), "0")') let distances = map(range(1, length1 + 1), 'map(range(1, length2 + 1), ''0'')')
for i1 in range(0, length1) for i1 in range(0, length1)
let distances[i1][0] = i1 let distances[i1][0] = i1
@@ -373,7 +389,7 @@ function! s:split_by_displaywidth(expr, width, float, is_wrap) abort
let text = '' let text = ''
while cs_index < len(cs) while cs_index < len(cs)
if cs[cs_index] is "\n" if cs[cs_index] is# "\n"
let text = s:padding_by_displaywidth(text, a:width, a:float) let text = s:padding_by_displaywidth(text, a:width, a:float)
let lines += [text] let lines += [text]
let text = '' let text = ''
@@ -394,7 +410,7 @@ function! s:split_by_displaywidth(expr, width, float, is_wrap) abort
if a:is_wrap if a:is_wrap
if a:width < w if a:width < w
if a:width < strdisplaywidth(cs[cs_index]) if a:width < strdisplaywidth(cs[cs_index])
while get(cs, cs_index, "\n") isnot "\n" while get(cs, cs_index, "\n") isnot# "\n"
let cs_index += 1 let cs_index += 1
endwhile endwhile
continue continue
@@ -403,7 +419,7 @@ function! s:split_by_displaywidth(expr, width, float, is_wrap) abort
endif endif
endif endif
else else
while get(cs, cs_index, "\n") isnot "\n" while get(cs, cs_index, "\n") isnot# "\n"
let cs_index += 1 let cs_index += 1
endwhile endwhile
continue continue
@@ -440,8 +456,9 @@ function! s:truncate(str, width) abort
" http://github.com/mattn/googlereader-vim/tree/master " http://github.com/mattn/googlereader-vim/tree/master
if a:str =~# '^[\x00-\x7f]*$' if a:str =~# '^[\x00-\x7f]*$'
return len(a:str) < a:width ? return len(a:str) < a:width
\ printf('%-'.a:width.'s', a:str) : strpart(a:str, 0, a:width) \ ? printf('%-' . a:width . 's', a:str)
\ : strpart(a:str, 0, a:width)
endif endif
let ret = a:str let ret = a:str
@@ -471,57 +488,20 @@ function! s:truncate_skipping(str, max, footer_width, separator) abort
endfunction endfunction
function! s:strwidthpart(str, width) abort function! s:strwidthpart(str, width) abort
if a:width <= 0 let str = tr(a:str, "\t", ' ')
return '' let vcol = a:width + 2
endif return matchstr(str, '.*\%<' . (vcol < 0 ? 0 : vcol) . 'v')
let strarr = split(a:str, '\zs')
let width = s:wcswidth(a:str)
let index = len(strarr)
let diff = (index + 1) / 2
let rightindex = index - 1
while width > a:width
let index = max([rightindex - diff + 1, 0])
let partwidth = s:wcswidth(join(strarr[(index):(rightindex)], ''))
if width - partwidth >= a:width || diff <= 1
let width -= partwidth
let rightindex = index - 1
endif
if diff > 1
let diff = diff / 2
endif
endwhile
return index ? join(strarr[:index - 1], '') : ''
endfunction endfunction
function! s:strwidthpart_reverse(str, width) abort function! s:strwidthpart_reverse(str, width) abort
if a:width <= 0 let str = tr(a:str, "\t", ' ')
return '' let vcol = s:wcswidth(str) - a:width
endif return matchstr(str, '\%>' . (vcol < 0 ? 0 : vcol) . 'v.*')
let strarr = split(a:str, '\zs')
let width = s:wcswidth(a:str)
let strlen = len(strarr)
let diff = (strlen + 1) / 2
let leftindex = 0
let index = -1
while width > a:width
let index = min([leftindex + diff, strlen]) - 1
let partwidth = s:wcswidth(join(strarr[(leftindex):(index)], ''))
if width - partwidth >= a:width || diff <= 1
let width -= partwidth
let leftindex = index + 1
endif
if diff > 1
let diff = diff / 2
endif
endwhile
return index < strlen ? join(strarr[(index + 1):], '') : ''
endfunction endfunction
if v:version >= 703 if v:version >= 703
" Use builtin function. " Use builtin function.
function! s:wcswidth(str) abort let s:wcswidth = function('strwidth')
return strwidth(a:str)
endfunction
else else
function! s:wcswidth(str) abort function! s:wcswidth(str) abort
if a:str =~# '^[\x00-\x7f]*$' if a:str =~# '^[\x00-\x7f]*$'
@@ -564,9 +544,88 @@ else
endfunction endfunction
endif endif
function! s:remove_ansi_sequences(text) abort
return substitute(a:text, '\e\[\%(\%(\d\+;\)*\d\+\)\?[mK]', '', 'g')
endfunction
function! s:escape_pattern(str) abort
" escape characters for no-magic
return escape(a:str, '^$~.*[]\')
endfunction
function! s:unescape_pattern(str) abort
" unescape characters for no-magic
return s:unescape(a:str, '^$~.*[]\')
endfunction
function! s:unescape(str, chars) abort
let chars = map(split(a:chars, '\zs'), 'escape(v:val, ''^$~.*[]\'')')
return substitute(a:str, '\\\(' . join(chars, '\|') . '\)', '\1', 'g')
endfunction
function! s:iconv(expr, from, to) abort
if a:from ==# '' || a:to ==# '' || a:from ==? a:to
return a:expr
endif
let result = iconv(a:expr, a:from, a:to)
return empty(result) ? a:expr : result
endfunction
" NOTE:
" A definition of a TEXT file is "A file that contains characters organized
" into one or more lines."
" A definition of a LINE is "A sequence of zero or more non- <newline>s
" plus a terminating <newline>"
" That's why {stdin} always ends with <newline> ideally. However, there are
" some programs which does not follow the POSIX rule and a Vim's way to join
" List into TEXT; join({text}, "\n"); does not add <newline> to the end of
" the last line.
" That's why add a trailing <newline> if it does not exist.
" REF:
" http://pubs.opengroup.org/onlinepubs/000095399/basedefs/xbd_chap03.html#tag_03_392
" http://pubs.opengroup.org/onlinepubs/000095399/basedefs/xbd_chap03.html#tag_03_205
" :help split()
" NOTE:
" it does nothing if the text is a correct POSIX text
function! s:repair_posix_text(text, ...) abort
let newline = get(a:000, 0, "\n")
return a:text =~# '\n$' ? a:text : a:text . newline
endfunction
" NOTE:
" A definition of a TEXT file is "A file that contains characters organized
" into one or more lines."
" A definition of a LINE is "A sequence of zero or more non- <newline>s
" plus a terminating <newline>"
" REF:
" http://pubs.opengroup.org/onlinepubs/000095399/basedefs/xbd_chap03.html#tag_03_392
" http://pubs.opengroup.org/onlinepubs/000095399/basedefs/xbd_chap03.html#tag_03_205
function! s:join_posix_lines(lines, ...) abort
let newline = get(a:000, 0, "\n")
return join(a:lines, newline) . newline
endfunction
" NOTE:
" A definition of a TEXT file is "A file that contains characters organized
" into one or more lines."
" A definition of a LINE is "A sequence of zero or more non- <newline>s
" plus a terminating <newline>"
" TEXT into List; split({text}, '\r\?\n', 1); add an extra empty line at the
" end of List because the end of TEXT ends with <newline> and keepempty=1 is
" specified. (btw. keepempty=0 cannot be used because it will remove
" emptylines in the head and the tail).
" That's why removing a trailing <newline> before proceeding to 'split' is required
" REF:
" http://pubs.opengroup.org/onlinepubs/000095399/basedefs/xbd_chap03.html#tag_03_392
" http://pubs.opengroup.org/onlinepubs/000095399/basedefs/xbd_chap03.html#tag_03_205
function! s:split_posix_text(text, ...) abort
let newline = get(a:000, 0, '\r\?\n')
let text = substitute(a:text, newline . '$', '', '')
return split(text, newline, 1)
endfunction
let &cpo = s:save_cpo let &cpo = s:save_cpo
unlet s:save_cpo unlet s:save_cpo
" vim:set et ts=2 sts=2 sw=2 tw=0: " vim:set et ts=2 sts=2 sw=2 tw=0:
endif endif

View File

@@ -1,389 +0,0 @@
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'crystal') == -1
let s:save_cpo = &cpo
set cpo&vim
if v:version ># 703 ||
\ (v:version is 703 && has('patch465'))
function! s:glob(expr) abort
return glob(a:expr, 1, 1)
endfunction
else
function! s:glob(expr) abort
let R = glob(a:expr, 1)
return split(R, '\n')
endfunction
endif
function! s:globpath(path, expr) abort
let R = globpath(a:path, a:expr, 1)
return split(R, '\n')
endfunction
" Wrapper functions for type().
let [
\ s:__TYPE_NUMBER,
\ s:__TYPE_STRING,
\ s:__TYPE_FUNCREF,
\ s:__TYPE_LIST,
\ s:__TYPE_DICT,
\ s:__TYPE_FLOAT] = [
\ type(3),
\ type(""),
\ type(function('tr')),
\ type([]),
\ type({}),
\ has('float') ? type(str2float('0')) : -1]
" __TYPE_FLOAT = -1 when -float
" This doesn't match to anything.
" Number or Float
function! s:is_numeric(Value) abort
let _ = type(a:Value)
return _ ==# s:__TYPE_NUMBER
\ || _ ==# s:__TYPE_FLOAT
endfunction
" Number
function! s:is_number(Value) abort
return type(a:Value) ==# s:__TYPE_NUMBER
endfunction
" Float
function! s:is_float(Value) abort
return type(a:Value) ==# s:__TYPE_FLOAT
endfunction
" String
function! s:is_string(Value) abort
return type(a:Value) ==# s:__TYPE_STRING
endfunction
" Funcref
function! s:is_funcref(Value) abort
return type(a:Value) ==# s:__TYPE_FUNCREF
endfunction
" List
function! s:is_list(Value) abort
return type(a:Value) ==# s:__TYPE_LIST
endfunction
" Dictionary
function! s:is_dict(Value) abort
return type(a:Value) ==# s:__TYPE_DICT
endfunction
function! s:truncate_skipping(str, max, footer_width, separator) abort
call s:_warn_deprecated("truncate_skipping", "Data.String.truncate_skipping")
let width = s:wcswidth(a:str)
if width <= a:max
let ret = a:str
else
let header_width = a:max - s:wcswidth(a:separator) - a:footer_width
let ret = s:strwidthpart(a:str, header_width) . a:separator
\ . s:strwidthpart_reverse(a:str, a:footer_width)
endif
return s:truncate(ret, a:max)
endfunction
function! s:truncate(str, width) abort
" Original function is from mattn.
" http://github.com/mattn/googlereader-vim/tree/master
call s:_warn_deprecated("truncate", "Data.String.truncate")
if a:str =~# '^[\x00-\x7f]*$'
return len(a:str) < a:width ?
\ printf('%-'.a:width.'s', a:str) : strpart(a:str, 0, a:width)
endif
let ret = a:str
let width = s:wcswidth(a:str)
if width > a:width
let ret = s:strwidthpart(ret, a:width)
let width = s:wcswidth(ret)
endif
if width < a:width
let ret .= repeat(' ', a:width - width)
endif
return ret
endfunction
function! s:strwidthpart(str, width) abort
call s:_warn_deprecated("strwidthpart", "Data.String.strwidthpart")
if a:width <= 0
return ''
endif
let ret = a:str
let width = s:wcswidth(a:str)
while width > a:width
let char = matchstr(ret, '.$')
let ret = ret[: -1 - len(char)]
let width -= s:wcswidth(char)
endwhile
return ret
endfunction
function! s:strwidthpart_reverse(str, width) abort
call s:_warn_deprecated("strwidthpart_reverse", "Data.String.strwidthpart_reverse")
if a:width <= 0
return ''
endif
let ret = a:str
let width = s:wcswidth(a:str)
while width > a:width
let char = matchstr(ret, '^.')
let ret = ret[len(char) :]
let width -= s:wcswidth(char)
endwhile
return ret
endfunction
if v:version >= 703
" Use builtin function.
function! s:wcswidth(str) abort
call s:_warn_deprecated("wcswidth", "Data.String.wcswidth")
return strwidth(a:str)
endfunction
else
function! s:wcswidth(str) abort
call s:_warn_deprecated("wcswidth", "Data.String.wcswidth")
if a:str =~# '^[\x00-\x7f]*$'
return strlen(a:str)
end
let mx_first = '^\(.\)'
let str = a:str
let width = 0
while 1
let ucs = char2nr(substitute(str, mx_first, '\1', ''))
if ucs == 0
break
endif
let width += s:_wcwidth(ucs)
let str = substitute(str, mx_first, '', '')
endwhile
return width
endfunction
" UTF-8 only.
function! s:_wcwidth(ucs) abort
let ucs = a:ucs
if (ucs >= 0x1100
\ && (ucs <= 0x115f
\ || ucs == 0x2329
\ || ucs == 0x232a
\ || (ucs >= 0x2e80 && ucs <= 0xa4cf
\ && ucs != 0x303f)
\ || (ucs >= 0xac00 && ucs <= 0xd7a3)
\ || (ucs >= 0xf900 && ucs <= 0xfaff)
\ || (ucs >= 0xfe30 && ucs <= 0xfe6f)
\ || (ucs >= 0xff00 && ucs <= 0xff60)
\ || (ucs >= 0xffe0 && ucs <= 0xffe6)
\ || (ucs >= 0x20000 && ucs <= 0x2fffd)
\ || (ucs >= 0x30000 && ucs <= 0x3fffd)
\ ))
return 2
endif
return 1
endfunction
endif
let s:is_windows = has('win16') || has('win32') || has('win64') || has('win95')
let s:is_cygwin = has('win32unix')
let s:is_mac = !s:is_windows && !s:is_cygwin
\ && (has('mac') || has('macunix') || has('gui_macvim') ||
\ (!isdirectory('/proc') && executable('sw_vers')))
let s:is_unix = has('unix')
function! s:is_windows() abort
return s:is_windows
endfunction
function! s:is_cygwin() abort
return s:is_cygwin
endfunction
function! s:is_mac() abort
return s:is_mac
endfunction
function! s:is_unix() abort
return s:is_unix
endfunction
function! s:_warn_deprecated(name, alternative) abort
try
echohl Error
echomsg "Prelude." . a:name . " is deprecated! Please use " . a:alternative . " instead."
finally
echohl None
endtry
endfunction
function! s:smart_execute_command(action, word) abort
execute a:action . ' ' . (a:word == '' ? '' : '`=a:word`')
endfunction
function! s:escape_file_searching(buffer_name) abort
return escape(a:buffer_name, '*[]?{}, ')
endfunction
function! s:escape_pattern(str) abort
return escape(a:str, '~"\.^$[]*')
endfunction
function! s:getchar(...) abort
let c = call('getchar', a:000)
return type(c) == type(0) ? nr2char(c) : c
endfunction
function! s:getchar_safe(...) abort
let c = s:input_helper('getchar', a:000)
return type(c) == type("") ? c : nr2char(c)
endfunction
function! s:input_safe(...) abort
return s:input_helper('input', a:000)
endfunction
function! s:input_helper(funcname, args) abort
let success = 0
if inputsave() !=# success
throw 'vital: Prelude: inputsave() failed'
endif
try
return call(a:funcname, a:args)
finally
if inputrestore() !=# success
throw 'vital: Prelude: inputrestore() failed'
endif
endtry
endfunction
function! s:set_default(var, val) abort
if !exists(a:var) || type({a:var}) != type(a:val)
let {a:var} = a:val
endif
endfunction
function! s:substitute_path_separator(path) abort
return s:is_windows ? substitute(a:path, '\\', '/', 'g') : a:path
endfunction
function! s:path2directory(path) abort
return s:substitute_path_separator(isdirectory(a:path) ? a:path : fnamemodify(a:path, ':p:h'))
endfunction
function! s:_path2project_directory_git(path) abort
let parent = a:path
while 1
let path = parent . '/.git'
if isdirectory(path) || filereadable(path)
return parent
endif
let next = fnamemodify(parent, ':h')
if next == parent
return ''
endif
let parent = next
endwhile
endfunction
function! s:_path2project_directory_svn(path) abort
let search_directory = a:path
let directory = ''
let find_directory = s:escape_file_searching(search_directory)
let d = finddir('.svn', find_directory . ';')
if d == ''
return ''
endif
let directory = fnamemodify(d, ':p:h:h')
" Search parent directories.
let parent_directory = s:path2directory(
\ fnamemodify(directory, ':h'))
if parent_directory != ''
let d = finddir('.svn', parent_directory . ';')
if d != ''
let directory = s:_path2project_directory_svn(parent_directory)
endif
endif
return directory
endfunction
function! s:_path2project_directory_others(vcs, path) abort
let vcs = a:vcs
let search_directory = a:path
let find_directory = s:escape_file_searching(search_directory)
let d = finddir(vcs, find_directory . ';')
if d == ''
return ''
endif
return fnamemodify(d, ':p:h:h')
endfunction
function! s:path2project_directory(path, ...) abort
let is_allow_empty = get(a:000, 0, 0)
let search_directory = s:path2directory(a:path)
let directory = ''
" Search VCS directory.
for vcs in ['.git', '.bzr', '.hg', '.svn']
if vcs ==# '.git'
let directory = s:_path2project_directory_git(search_directory)
elseif vcs ==# '.svn'
let directory = s:_path2project_directory_svn(search_directory)
else
let directory = s:_path2project_directory_others(vcs, search_directory)
endif
if directory != ''
break
endif
endfor
" Search project file.
if directory == ''
for d in ['build.xml', 'prj.el', '.project', 'pom.xml', 'package.json',
\ 'Makefile', 'configure', 'Rakefile', 'NAnt.build',
\ 'P4CONFIG', 'tags', 'gtags']
let d = findfile(d, s:escape_file_searching(search_directory) . ';')
if d != ''
let directory = fnamemodify(d, ':p:h')
break
endif
endfor
endif
if directory == ''
" Search /src/ directory.
let base = s:substitute_path_separator(search_directory)
if base =~# '/src/'
let directory = base[: strridx(base, '/src/') + 3]
endif
endif
if directory == '' && !is_allow_empty
" Use original path.
let directory = search_directory
endif
return s:substitute_path_separator(directory)
endfunction
let &cpo = s:save_cpo
unlet s:save_cpo
" vim:set et ts=2 sts=2 sw=2 tw=0:
endif

View File

@@ -1,5 +1,14 @@
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'crystal') == -1 if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'crystal') == -1
" ___vital___
" NOTE: lines between '" ___vital___' is generated by :Vitalize.
" Do not mofidify the code nor insert new lines before '" ___vital___'
function! s:_SID() abort
return matchstr(expand('<sfile>'), '<SNR>\zs\d\+\ze__SID$')
endfunction
execute join(['function! vital#_crystal#Process#import() abort', printf("return map({'shellescape': '', 'has_vimproc': '', 'system': '', 'iconv': '', 'spawn': '', 'get_last_status': ''}, \"vital#_crystal#function('<SNR>%s_' . v:key)\")", s:_SID()), 'endfunction'], "\n")
delfunction s:_SID
" ___vital___
" TODO: move all comments to doc file. " TODO: move all comments to doc file.
" "
" "
@@ -21,62 +30,36 @@ let s:need_trans = v:version < 704 || (v:version == 704 && !has('patch122'))
let s:TYPE_DICT = type({}) let s:TYPE_DICT = type({})
let s:TYPE_LIST = type([]) let s:TYPE_LIST = type([])
let s:TYPE_STRING = type("") let s:TYPE_STRING = type('')
" Execute program in the background from Vim.
" Return an empty string always.
"
" If a:expr is a List, shellescape() each argument.
" If a:expr is a String, the arguments are passed as-is.
"
" Windows:
" Using :!start , execute program without via cmd.exe.
" Spawning 'expr' with 'noshellslash'
" keep special characters from unwanted expansion.
" (see :help shellescape())
"
" Unix:
" using :! , execute program in the background by shell.
function! s:spawn(expr, ...) abort function! s:spawn(expr, ...) abort
let shellslash = 0 if type(a:expr) is s:TYPE_LIST
if s:is_windows let special = 1
let shellslash = &l:shellslash let cmdline = join(map(a:expr, 's:shellescape(v:val, special)'), ' ')
setlocal noshellslash elseif type(a:expr) is s:TYPE_STRING
let cmdline = a:expr
if a:0 && a:1
" for :! command
let cmdline = substitute(cmdline, '\([!%#]\|<[^<>]\+>\)', '\\\1', 'g')
endif
else
throw 'vital: Process: invalid argument (value type:' . type(a:expr) . ')'
endif
if s:is_windows
silent execute '!start' cmdline
else
silent execute '!' cmdline '&'
endif endif
try
if type(a:expr) is s:TYPE_LIST
let special = 1
let cmdline = join(map(a:expr, 'shellescape(v:val, special)'), ' ')
elseif type(a:expr) is s:TYPE_STRING
let cmdline = a:expr
if a:0 && a:1
" for :! command
let cmdline = substitute(cmdline, '\([!%#]\|<[^<>]\+>\)', '\\\1', 'g')
endif
else
throw 'Process.spawn(): invalid argument (value type:'.type(a:expr).')'
endif
if s:is_windows
silent execute '!start' cmdline
else
silent execute '!' cmdline '&'
endif
finally
if s:is_windows
let &l:shellslash = shellslash
endif
endtry
return '' return ''
endfunction endfunction
" iconv() wrapper for safety. " iconv() wrapper for safety.
function! s:iconv(expr, from, to) abort function! s:iconv(expr, from, to) abort
if a:from == '' || a:to == '' || a:from ==? a:to if a:from ==# '' || a:to ==# '' || a:from ==? a:to
return a:expr return a:expr
endif endif
let result = iconv(a:expr, a:from, a:to) let result = iconv(a:expr, a:from, a:to)
return result != '' ? result : a:expr return result !=# '' ? result : a:expr
endfunction endfunction
" Check vimproc. " Check vimproc.
@@ -128,7 +111,7 @@ function! s:system(str, ...) abort
elseif type(a:1) is s:TYPE_STRING elseif type(a:1) is s:TYPE_STRING
let args += [s:iconv(a:1, &encoding, 'char')] let args += [s:iconv(a:1, &encoding, 'char')]
else else
throw 'Process.system(): invalid argument (value type:'.type(a:1).')' throw 'vital: Process: invalid argument (value type:' . type(a:1) . ')'
endif endif
elseif a:0 >= 2 elseif a:0 >= 2
" {command} [, {input} [, {timeout}]] " {command} [, {input} [, {timeout}]]
@@ -145,13 +128,16 @@ function! s:system(str, ...) abort
elseif type(a:str) is s:TYPE_STRING elseif type(a:str) is s:TYPE_STRING
let command = a:str let command = a:str
else else
throw 'Process.system(): invalid argument (value type:'.type(a:str).')' throw 'vital: Process: invalid argument (value type:' . type(a:str) . ')'
endif endif
if s:need_trans if s:need_trans
let command = s:iconv(command, &encoding, 'char') let command = s:iconv(command, &encoding, 'char')
endif endif
let args = [command] + args let args = [command] + args
if background && (use_vimproc || !s:is_windows) if background && (use_vimproc || !s:is_windows)
if has('nvim')
throw "vital: Process: neovim's system() doesn't support background(&) process (cmdline:" . string(a:str) . ')'
endif
let args[0] = args[0] . ' &' let args[0] = args[0] . ' &'
endif endif
@@ -167,8 +153,14 @@ function! s:get_last_status() abort
endfunction endfunction
if s:is_windows if s:is_windows
function! s:shellescape(command) abort function! s:shellescape(...) abort
return substitute(a:command, '[&()[\]{}^=;!''+,`~]', '^\0', 'g') try
let shellslash = &shellslash
set noshellslash
return call('shellescape', a:000)
finally
let &shellslash = shellslash
endtry
endfunction endfunction
else else
function! s:shellescape(...) abort function! s:shellescape(...) abort

View File

@@ -1,5 +1,14 @@
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'crystal') == -1 if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'crystal') == -1
" ___vital___
" NOTE: lines between '" ___vital___' is generated by :Vitalize.
" Do not mofidify the code nor insert new lines before '" ___vital___'
function! s:_SID() abort
return matchstr(expand('<sfile>'), '<SNR>\zs\d\+\ze__SID$')
endfunction
execute join(['function! vital#_crystal#Web#JSON#import() abort', printf("return map({'decode': '', '_vital_depends': '', '_vital_created': '', 'encode': '', '_vital_loaded': ''}, \"vital#_crystal#function('<SNR>%s_' . v:key)\")", s:_SID()), 'endfunction'], "\n")
delfunction s:_SID
" ___vital___
let s:save_cpo = &cpo let s:save_cpo = &cpo
set cpo&vim set cpo&vim
@@ -15,11 +24,6 @@ function! s:_null() abort
return 0 return 0
endfunction endfunction
let s:const = {}
let s:const.true = function('s:_true')
let s:const.false = function('s:_false')
let s:const.null = function('s:_null')
function! s:_resolve(val, prefix) abort function! s:_resolve(val, prefix) abort
let t = type(a:val) let t = type(a:val)
if t == type('') if t == type('')
@@ -36,6 +40,13 @@ endfunction
function! s:_vital_created(module) abort function! s:_vital_created(module) abort
" define constant variables " define constant variables
if !exists('s:const')
let s:const = {}
let s:const.true = function('s:_true')
let s:const.false = function('s:_false')
let s:const.null = function('s:_null')
lockvar s:const
endif
call extend(a:module, s:const) call extend(a:module, s:const)
endfunction endfunction
@@ -55,7 +66,7 @@ function! s:decode(json, ...) abort
let settings = extend({ let settings = extend({
\ 'use_token': 0, \ 'use_token': 0,
\}, get(a:000, 0, {})) \}, get(a:000, 0, {}))
let json = iconv(a:json, "utf-8", &encoding) let json = iconv(a:json, 'utf-8', &encoding)
let json = join(split(json, "\n"), '') let json = join(split(json, "\n"), '')
let json = substitute(json, '\\u34;', '\\"', 'g') let json = substitute(json, '\\u34;', '\\"', 'g')
let json = substitute(json, '\\u\(\x\x\x\x\)', '\=s:string.nr2enc_char("0x".submatch(1))', 'g') let json = substitute(json, '\\u\(\x\x\x\x\)', '\=s:string.nr2enc_char("0x".submatch(1))', 'g')
@@ -75,7 +86,11 @@ endfunction
" @vimlint(EVL102, 0, l:true) " @vimlint(EVL102, 0, l:true)
" @vimlint(EVL102, 0, l:false) " @vimlint(EVL102, 0, l:false)
function! s:encode(val) abort function! s:encode(val, ...) abort
let settings = extend({
\ 'indent': 0,
\}, get(a:000, 0, {})
\)
if type(a:val) == 0 if type(a:val) == 0
return a:val return a:val
elseif type(a:val) == 1 elseif type(a:val) == 1
@@ -83,7 +98,7 @@ function! s:encode(val) abort
let json = substitute(json, "\r", '\\r', 'g') let json = substitute(json, "\r", '\\r', 'g')
let json = substitute(json, "\n", '\\n', 'g') let json = substitute(json, "\n", '\\n', 'g')
let json = substitute(json, "\t", '\\t', 'g') let json = substitute(json, "\t", '\\t', 'g')
return iconv(json, &encoding, "utf-8") return iconv(json, &encoding, 'utf-8')
elseif type(a:val) == 2 elseif type(a:val) == 2
if s:const.true == a:val if s:const.true == a:val
return 'true' return 'true'
@@ -96,14 +111,69 @@ function! s:encode(val) abort
return string(a:val) return string(a:val)
endif endif
elseif type(a:val) == 3 elseif type(a:val) == 3
return '[' . join(map(copy(a:val), 's:encode(v:val)'), ',') . ']' return s:_encode_list(a:val, settings)
elseif type(a:val) == 4 elseif type(a:val) == 4
return '{' . join(map(keys(a:val), 's:encode(v:val).":".s:encode(a:val[v:val])'), ',') . '}' return s:_encode_dict(a:val, settings)
else else
return string(a:val) return string(a:val)
endif endif
endfunction endfunction
" @vimlint(EVL102, 1, l:ns)
function! s:_encode_list(val, settings) abort
if empty(a:val)
return '[]'
elseif !a:settings.indent
let encoded_candidates = map(copy(a:val), 's:encode(v:val, a:settings)')
return printf('[%s]', join(encoded_candidates, ','))
else
let previous_indent = get(a:settings, '_previous_indent')
let indent = previous_indent + a:settings.indent
let ns = extend(copy(a:settings), {
\ '_previous_indent': indent,
\})
let encoded_candidates = map(
\ copy(a:val),
\ printf('''%s'' . s:encode(v:val, ns)', repeat(' ', indent)),
\)
return printf(
\ "[\n%s\n%s]",
\ join(encoded_candidates, ",\n"),
\ repeat(' ', previous_indent)
\)
endif
endfunction
" @vimlint(EVL102, 0, l:ns)
" @vimlint(EVL102, 1, l:ns)
function! s:_encode_dict(val, settings) abort
if empty(a:val)
return '{}'
elseif !a:settings.indent
let encoded_candidates = map(keys(a:val),
\ 's:encode(v:val, a:settings) . '':'' . s:encode(a:val[v:val], a:settings)'
\)
return printf('{%s}', join(encoded_candidates, ','))
else
let previous_indent = get(a:settings, '_previous_indent')
let indent = previous_indent + a:settings.indent
let ns = extend(copy(a:settings), {
\ '_previous_indent': indent,
\})
let encoded_candidates = map(keys(a:val),
\ printf(
\ '''%s'' . s:encode(v:val, ns) . '': '' . s:encode(a:val[v:val], ns)',
\ repeat(' ', indent),
\ ),
\)
return printf("{\n%s\n%s}",
\ join(encoded_candidates, ",\n"),
\ repeat(' ', previous_indent),
\)
endif
endfunction
" @vimlint(EVL102, 0, l:ns)
let &cpo = s:save_cpo let &cpo = s:save_cpo
unlet s:save_cpo unlet s:save_cpo

332
autoload/vital/crystal.vim Normal file
View File

@@ -0,0 +1,332 @@
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'crystal') == -1
let s:plugin_name = expand('<sfile>:t:r')
let s:vital_base_dir = expand('<sfile>:h')
let s:project_root = expand('<sfile>:h:h:h')
let s:is_vital_vim = s:plugin_name is# 'vital'
let s:loaded = {}
let s:cache_sid = {}
" function() wrapper
if v:version > 703 || v:version == 703 && has('patch1170')
function! s:_function(fstr) abort
return function(a:fstr)
endfunction
else
function! s:_SID() abort
return matchstr(expand('<sfile>'), '<SNR>\zs\d\+\ze__SID$')
endfunction
let s:_s = '<SNR>' . s:_SID() . '_'
function! s:_function(fstr) abort
return function(substitute(a:fstr, 's:', s:_s, 'g'))
endfunction
endif
function! vital#{s:plugin_name}#new() abort
return s:new(s:plugin_name)
endfunction
function! vital#{s:plugin_name}#import(...) abort
if !exists('s:V')
let s:V = s:new(s:plugin_name)
endif
return call(s:V.import, a:000, s:V)
endfunction
let s:Vital = {}
function! s:new(plugin_name) abort
let base = deepcopy(s:Vital)
let base._plugin_name = a:plugin_name
return base
endfunction
function! s:vital_files() abort
if !exists('s:vital_files')
let s:vital_files = map(
\ s:is_vital_vim ? s:_global_vital_files() : s:_self_vital_files(),
\ 'fnamemodify(v:val, ":p:gs?[\\\\/]?/?")')
endif
return copy(s:vital_files)
endfunction
let s:Vital.vital_files = s:_function('s:vital_files')
function! s:import(name, ...) abort dict
let target = {}
let functions = []
for a in a:000
if type(a) == type({})
let target = a
elseif type(a) == type([])
let functions = a
endif
unlet a
endfor
let module = self._import(a:name)
if empty(functions)
call extend(target, module, 'keep')
else
for f in functions
if has_key(module, f) && !has_key(target, f)
let target[f] = module[f]
endif
endfor
endif
return target
endfunction
let s:Vital.import = s:_function('s:import')
function! s:load(...) abort dict
for arg in a:000
let [name; as] = type(arg) == type([]) ? arg[: 1] : [arg, arg]
let target = split(join(as, ''), '\W\+')
let dict = self
let dict_type = type({})
while !empty(target)
let ns = remove(target, 0)
if !has_key(dict, ns)
let dict[ns] = {}
endif
if type(dict[ns]) == dict_type
let dict = dict[ns]
else
unlet dict
break
endif
endwhile
if exists('dict')
call extend(dict, self._import(name))
endif
unlet arg
endfor
return self
endfunction
let s:Vital.load = s:_function('s:load')
function! s:unload() abort dict
let s:loaded = {}
let s:cache_sid = {}
unlet! s:vital_files
endfunction
let s:Vital.unload = s:_function('s:unload')
function! s:exists(name) abort dict
if a:name !~# '\v^\u\w*%(\.\u\w*)*$'
throw 'vital: Invalid module name: ' . a:name
endif
return s:_module_path(a:name) isnot# ''
endfunction
let s:Vital.exists = s:_function('s:exists')
function! s:search(pattern) abort dict
let paths = s:_extract_files(a:pattern, self.vital_files())
let modules = sort(map(paths, 's:_file2module(v:val)'))
return s:_uniq(modules)
endfunction
let s:Vital.search = s:_function('s:search')
function! s:plugin_name() abort dict
return self._plugin_name
endfunction
let s:Vital.plugin_name = s:_function('s:plugin_name')
function! s:_self_vital_files() abort
let builtin = printf('%s/__%s__/', s:vital_base_dir, s:plugin_name)
let installed = printf('%s/_%s/', s:vital_base_dir, s:plugin_name)
let base = builtin . ',' . installed
return split(globpath(base, '**/*.vim', 1), "\n")
endfunction
function! s:_global_vital_files() abort
let pattern = 'autoload/vital/__*__/**/*.vim'
return split(globpath(&runtimepath, pattern, 1), "\n")
endfunction
function! s:_extract_files(pattern, files) abort
let tr = {'.': '/', '*': '[^/]*', '**': '.*'}
let target = substitute(a:pattern, '\.\|\*\*\?', '\=tr[submatch(0)]', 'g')
let regexp = printf('autoload/vital/[^/]\+/%s.vim$', target)
return filter(a:files, 'v:val =~# regexp')
endfunction
function! s:_file2module(file) abort
let filename = fnamemodify(a:file, ':p:gs?[\\/]?/?')
let tail = matchstr(filename, 'autoload/vital/_\w\+/\zs.*\ze\.vim$')
return join(split(tail, '[\\/]\+'), '.')
endfunction
" @param {string} name e.g. Data.List
function! s:_import(name) abort dict
if has_key(s:loaded, a:name)
return copy(s:loaded[a:name])
endif
let module = self._get_module(a:name)
if has_key(module, '_vital_created')
call module._vital_created(module)
endif
let export_module = filter(copy(module), 'v:key =~# "^\\a"')
" Cache module before calling module.vital_loaded() to avoid cyclic
" dependences but remove the cache if module._vital_loaded() fails.
" let s:loaded[a:name] = export_module
let s:loaded[a:name] = export_module
if has_key(module, '_vital_loaded')
try
call module._vital_loaded(vital#{s:plugin_name}#new())
catch
unlet s:loaded[a:name]
throw 'vital: fail to call ._vital_loaded(): ' . v:exception
endtry
endif
return copy(s:loaded[a:name])
endfunction
let s:Vital._import = s:_function('s:_import')
" s:_get_module() returns module object wihch has all script local functions.
function! s:_get_module(name) abort dict
let funcname = s:_import_func_name(self.plugin_name(), a:name)
try
return call(funcname, [])
catch /^Vim\%((\a\+)\)\?:E117/
return s:_get_builtin_module(a:name)
endtry
endfunction
function! s:_get_builtin_module(name) abort
return s:sid2sfuncs(s:_module_sid(a:name))
endfunction
if s:is_vital_vim
" For vital.vim, we can use s:_get_builtin_module directly
let s:Vital._get_module = s:_function('s:_get_builtin_module')
else
let s:Vital._get_module = s:_function('s:_get_module')
endif
function! s:_import_func_name(plugin_name, module_name) abort
return printf('vital#_%s#%s#import', a:plugin_name, s:_dot_to_sharp(a:module_name))
endfunction
function! s:_module_sid(name) abort
let path = s:_module_path(a:name)
if !filereadable(path)
throw 'vital: module not found: ' . a:name
endif
let vital_dir = s:is_vital_vim ? '__\w\+__' : printf('_\{1,2}%s\%%(__\)\?', s:plugin_name)
let base = join([vital_dir, ''], '[/\\]\+')
let p = base . substitute('' . a:name, '\.', '[/\\\\]\\+', 'g')
let sid = s:_sid(path, p)
if !sid
call s:_source(path)
let sid = s:_sid(path, p)
if !sid
throw printf('vital: cannot get <SID> from path: %s', path)
endif
endif
return sid
endfunction
function! s:_module_path(name) abort
return get(s:_extract_files(a:name, s:vital_files()), 0, '')
endfunction
function! s:_module_sid_base_dir() abort
return s:is_vital_vim ? &rtp : s:project_root
endfunction
function! s:_dot_to_sharp(name) abort
return substitute(a:name, '\.', '#', 'g')
endfunction
function! s:_source(path) abort
execute 'source' fnameescape(a:path)
endfunction
" @vimlint(EVL102, 1, l:_)
" @vimlint(EVL102, 1, l:__)
function! s:_sid(path, filter_pattern) abort
let unified_path = s:_unify_path(a:path)
if has_key(s:cache_sid, unified_path)
return s:cache_sid[unified_path]
endif
for line in filter(split(s:_execute(':scriptnames'), "\n"), 'v:val =~# a:filter_pattern')
let [_, sid, path; __] = matchlist(line, '^\s*\(\d\+\):\s\+\(.\+\)\s*$')
if s:_unify_path(path) is# unified_path
let s:cache_sid[unified_path] = sid
return s:cache_sid[unified_path]
endif
endfor
return 0
endfunction
" We want to use a execute() builtin function instead of s:_execute(),
" however there is a bug in execute().
" execute() returns empty string when it is called in
" completion function of user defined ex command.
" https://github.com/vim-jp/issues/issues/1129
function! s:_execute(cmd) abort
let [save_verbose, save_verbosefile] = [&verbose, &verbosefile]
set verbose=0 verbosefile=
redir => res
silent! execute a:cmd
redir END
let [&verbose, &verbosefile] = [save_verbose, save_verbosefile]
return res
endfunction
if filereadable(expand('<sfile>:r') . '.VIM') " is case-insensitive or not
let s:_unify_path_cache = {}
" resolve() is slow, so we cache results.
" Note: On windows, vim can't expand path names from 8.3 formats.
" So if getting full path via <sfile> and $HOME was set as 8.3 format,
" vital load duplicated scripts. Below's :~ avoid this issue.
function! s:_unify_path(path) abort
if has_key(s:_unify_path_cache, a:path)
return s:_unify_path_cache[a:path]
endif
let value = tolower(fnamemodify(resolve(fnamemodify(
\ a:path, ':p')), ':~:gs?[\\/]?/?'))
let s:_unify_path_cache[a:path] = value
return value
endfunction
else
function! s:_unify_path(path) abort
return resolve(fnamemodify(a:path, ':p:gs?[\\/]?/?'))
endfunction
endif
" copied and modified from Vim.ScriptLocal
let s:SNR = join(map(range(len("\<SNR>")), '"[\\x" . printf("%0x", char2nr("\<SNR>"[v:val])) . "]"'), '')
function! s:sid2sfuncs(sid) abort
let fs = split(s:_execute(printf(':function /^%s%s_', s:SNR, a:sid)), "\n")
let r = {}
let pattern = printf('\m^function\s<SNR>%d_\zs\w\{-}\ze(', a:sid)
for fname in map(fs, 'matchstr(v:val, pattern)')
let r[fname] = function(s:_sfuncname(a:sid, fname))
endfor
return r
endfunction
"" Return funcname of script local functions with SID
function! s:_sfuncname(sid, funcname) abort
return printf('<SNR>%s_%s', a:sid, a:funcname)
endfunction
if exists('*uniq')
function! s:_uniq(list) abort
return uniq(a:list)
endfunction
else
function! s:_uniq(list) abort
let i = len(a:list) - 1
while 0 < i
if a:list[i] ==# a:list[i - 1]
call remove(a:list, i)
endif
let i -= 1
endwhile
return a:list
endfunction
endif
endif

View File

@@ -0,0 +1,10 @@
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'crystal') == -1
crystal
bee84ae23effb0510137ad177e98c94d8b3657a6
Process
Web.JSON
ColorEcho
endif

View File

@@ -94,44 +94,61 @@ let landmark_role = [
\ ] \ ]
" Ref: https://www.w3.org/TR/dpub-aria-1.0/ " Ref: https://www.w3.org/TR/dpub-aria-1.0/
" Version: W3C Candidate Recommendation 15 December 2016 " Version: W3C Recommendation 14 December 2017
let dpub_role = [ let dpub_role = [
\ 'dpub-abstract', \ 'doc-abstract',
\ 'dpub-afterword', \ 'doc-acknowledgments',
\ 'dpub-appendix', \ 'doc-afterword',
\ 'dpub-biblioentry', \ 'doc-appendix',
\ 'dpub-bibliography', \ 'doc-backlink',
\ 'dpub-biblioref', \ 'doc-biblioentry',
\ 'dpub-chapter', \ 'doc-bibliography',
\ 'dpub-cover', \ 'doc-biblioref',
\ 'dpub-epilogue', \ 'doc-chapter',
\ 'dpub-footnote', \ 'doc-colophon',
\ 'dpub-footnotes', \ 'doc-conclusion',
\ 'dpub-foreword', \ 'doc-cover',
\ 'dpub-glossary', \ 'doc-credit',
\ 'dpub-glossdef', \ 'doc-credits',
\ 'dpub-glossref', \ 'doc-dedication',
\ 'dpub-glossterm', \ 'doc-endnote',
\ 'dpub-index', \ 'doc-endnotes',
\ 'dpub-locator', \ 'doc-epigraph',
\ 'dpub-noteref', \ 'doc-epilogue',
\ 'dpub-notice', \ 'doc-errata',
\ 'dpub-pagebreak', \ 'doc-example',
\ 'dpub-pagelist', \ 'doc-footnote',
\ 'dpub-part', \ 'doc-foreword',
\ 'dpub-preface', \ 'doc-glossary',
\ 'dpub-prologue', \ 'doc-glossref',
\ 'dpub-pullquote', \ 'doc-index',
\ 'dpub-qna', \ 'doc-introduction',
\ 'dpub-subtitle', \ 'doc-noteref',
\ 'dpub-tip', \ 'doc-notice',
\ 'dpub-title', \ 'doc-pagebreak',
\ 'dpub-toc' \ 'doc-pagelist',
\ 'doc-part',
\ 'doc-preface',
\ 'doc-prologue',
\ 'doc-pullquote',
\ 'doc-qna',
\ 'doc-subtitle',
\ 'doc-tip',
\ 'doc-toc'
\ ]
" Ref: https://www.w3.org/TR/graphics-aria-1.0/
" Version: W3C Candidate Recommendation 29 March 2018
let graphic_role = [
\ 'graphics-document',
\ 'graphics-object',
\ 'graphics-symbol'
\ ] \ ]
let role = extend(widget_role, document_structure) let role = extend(widget_role, document_structure)
let role = extend(role, landmark_role) let role = extend(role, landmark_role)
let role = extend(role, dpub_role) let role = extend(role, dpub_role)
let role = extend(role, graphic_role)
" https://www.w3.org/TR/wai-aria-1.1/#states_and_properties " https://www.w3.org/TR/wai-aria-1.1/#states_and_properties
let global_states_and_properties = { let global_states_and_properties = {

View File

@@ -62,7 +62,7 @@ let charset = [
\ 'windows-1256', 'windows-1257', 'windows-1258', 'TIS-620', ] \ 'windows-1256', 'windows-1257', 'windows-1258', 'TIS-620', ]
" }}} " }}}
let autofill_tokens = ['on', 'off', 'name', 'honorific-prefix', 'given-name', 'additional-name', 'family-name', 'honorific-suffix', 'nickname', 'username', 'new-password', 'current-password', 'organization-title', 'organization', 'street-address', 'address-line1', 'address-line2', 'address-line3', 'address-level4', 'address-level3', 'address-level2', 'address-level1', 'country', 'country-name', 'postal-code', 'cc-name', 'cc-given-name', 'cc-additional-name', 'cc-family-name', 'cc-number', 'cc-exp', 'cc-exp-month', 'cc-exp-year', 'cc-csc', 'cc-type', 'transaction-currency', 'transaction-amount', 'language', 'bday', 'bday-day', 'bday-month', 'bday-year', 'sex', 'url', 'photo'] let autofill_tokens = ['on', 'off', 'name', 'honorific-prefix', 'given-name', 'additional-name', 'family-name', 'honorific-suffix', 'nickname', 'organization-title', 'username', 'new-password', 'current-password', 'organization', 'street-address', 'address-line1', 'address-line2', 'address-line3', 'address-level4', 'address-level3', 'address-level2', 'address-level1', 'country', 'country-name', 'postal-code', 'cc-name', 'cc-given-name', 'cc-additional-name', 'cc-family-name', 'cc-number', 'cc-exp', 'cc-exp-month', 'cc-exp-year', 'cc-csc', 'cc-type', 'transaction-currency', 'transaction-amount', 'language', 'bday', 'bday-day', 'bday-month', 'bday-year', 'sex', 'url', 'photo', 'tel', 'tel-country-code', 'tel-national', 'tel-area-code', 'tel-local', 'tel-local-prefix', 'tel-local-suffix', 'tel-extension', 'email', 'impp']
" Attributes_and_Settings: {{{ " Attributes_and_Settings: {{{
let core_attributes = {'accesskey': [], 'class': [], 'contenteditable': ['true', 'false', ''], 'contextmenu': [], 'dir': ['ltr', 'rtl'], 'draggable': ['true', 'false'], 'hidden': ['hidden', ''], 'id': [], 'is': [], 'lang': lang_tag, 'spellcheck': ['true', 'false', ''], 'style': [], 'tabindex': [], 'title': []} let core_attributes = {'accesskey': [], 'class': [], 'contenteditable': ['true', 'false', ''], 'contextmenu': [], 'dir': ['ltr', 'rtl'], 'draggable': ['true', 'false'], 'hidden': ['hidden', ''], 'id': [], 'is': [], 'lang': lang_tag, 'spellcheck': ['true', 'false', ''], 'style': [], 'tabindex': [], 'title': []}
@@ -82,6 +82,7 @@ let attributes_value = {
\ 'action': ['URL', ''], \ 'action': ['URL', ''],
\ 'allowfullscreen': ['Bool', ''], \ 'allowfullscreen': ['Bool', ''],
\ 'allowpaymentrequest': ['Bool', ''], \ 'allowpaymentrequest': ['Bool', ''],
\ 'allowpresentation': ['Bool', ''],
\ 'allowusermedia': ['Bool', ''], \ 'allowusermedia': ['Bool', ''],
\ 'alt': ['Text', ''], \ 'alt': ['Text', ''],
\ 'async': ['Bool', ''], \ 'async': ['Bool', ''],
@@ -190,7 +191,7 @@ let attributes_value = {
\ } \ }
if g:html5_event_handler_attributes_complete == 1 if g:html5_event_handler_attributes_complete == 1
let event_handler_attributes = {'onabort': [], 'onblur': [], 'oncanplay': [], 'oncanplaythrough': [], 'onchange': [], 'onclick': [], 'oncontextmenu': [], 'ondblclick': [], 'ondrag': [], 'ondragend': [], 'ondragenter': [], 'ondragleave': [], 'ondragover': [], 'ondragstart': [], 'ondrop': [], 'ondurationchange': [], 'onemptied': [], 'onended': [], 'onerror': [], 'onfocus': [], 'onformchange': [], 'onforminput': [], 'oninput': [], 'oninvalid': [], 'onkeydown': [], 'onkeypress': [], 'onkeyup': [], 'onload': [], 'onloadeddata': [], 'onloadedmetadata': [], 'onloadstart': [], 'onmousedown': [], 'onmousemove': [], 'onmouseout': [], 'onmouseover': [], 'onmouseup': [], 'onmousewheel': [], 'onpause': [], 'onplay': [], 'onplaying': [], 'onprogress': [], 'onratechange': [], 'onreadystatechange': [], 'onscroll': [], 'onseeked': [], 'onseeking': [], 'onselect': [], 'onshow': [], 'onstalled': [], 'onsubmit': [], 'onsuspend': [], 'ontimeupdate': [], 'onvolumechange': [], 'onwaiting': []} let event_handler_attributes = {'onabort': [], 'onblur': [], 'oncanplay': [], 'oncanplaythrough': [], 'onchange': [], 'onclick': [], 'oncontextmenu': [], 'ondblclick': [], 'ondrag': [], 'ondragend': [], 'ondragenter': [], 'ondragleave': [], 'ondragover': [], 'ondragstart': [], 'ondrop': [], 'ondurationchange': [], 'onemptied': [], 'onended': [], 'onerror': [], 'onfocus': [], 'onformchange': [], 'onforminput': [], 'oninput': [], 'oninvalid': [], 'onkeydown': [], 'onkeypress': [], 'onkeyup': [], 'onload': [], 'onloadeddata': [], 'onloadedmetadata': [], 'onloadstart': [], 'onmousedown': [], 'onmousemove': [], 'onmouseout': [], 'onmouseover': [], 'onmouseup': [], 'onmousewheel': [], 'onpause': [], 'onplay': [], 'onplaying': [], 'onprogress': [], 'onratechange': [], 'onreadystatechange': [], 'onscroll': [], 'onseeked': [], 'onseeking': [], 'onselect': [], 'onshow': [], 'onstalled': [], 'onsubmit': [], 'onsuspend': [], 'ontimeupdate': [], 'onvolumechange': [], 'onwaiting': [], 'onselectstart': [], 'onselectchange': []}
let global_attributes = extend(global_attributes, event_handler_attributes) let global_attributes = extend(global_attributes, event_handler_attributes)
let body_attributes = {'onafterprint': [], 'onbeforeprint': [], 'onbeforeunload': [], 'onblur': [], 'onerror': [], 'onfocus': [], 'onhashchange': [], 'onload': [], 'onmessage': [], 'onoffline': [], 'ononline': [], 'onpopstate': [], 'onredo': [], 'onresize': [], 'onstorage': [], 'onundo': [], 'onunload': []} let body_attributes = {'onafterprint': [], 'onbeforeprint': [], 'onbeforeunload': [], 'onblur': [], 'onerror': [], 'onfocus': [], 'onhashchange': [], 'onload': [], 'onmessage': [], 'onoffline': [], 'ononline': [], 'onpopstate': [], 'onredo': [], 'onresize': [], 'onstorage': [], 'onundo': [], 'onunload': []}
@@ -213,6 +214,8 @@ if g:html5_event_handler_attributes_complete == 1
\ 'ondragleave': ['Script', ''], \ 'ondragleave': ['Script', ''],
\ 'ondragover': ['Script', ''], \ 'ondragover': ['Script', ''],
\ 'ondragstart': ['Script', ''], \ 'ondragstart': ['Script', ''],
\ 'onselectstart': ['Script', ''],
\ 'onselectchange': ['Script', ''],
\ 'ondrop': ['Script', ''], \ 'ondrop': ['Script', ''],
\ 'ondurationchange': ['Script', ''], \ 'ondurationchange': ['Script', ''],
\ 'onemptied': ['Script', ''], \ 'onemptied': ['Script', ''],
@@ -373,6 +376,8 @@ let abutton_dec = 'details\\|embed\\|iframe\\|keygen\\|label\\|menu\\|select\\|t
let crossorigin = ['anonymous', 'use-credentials'] let crossorigin = ['anonymous', 'use-credentials']
let referrerpolicy = ['no-referrer', 'no-referrer-when-downgrade', 'same-origin', 'origin', 'strict-origin', 'origin-when-cross-origin', 'strict-origin-when-cross-origin', 'unsafe-url']
let g:xmldata_html5 = { let g:xmldata_html5 = {
\ 'vimxmlentities': ['AElig', 'Aacute', 'Acirc', 'Agrave', 'Alpha', 'Aring', 'Atilde', 'Auml', 'Beta', 'Ccedil', 'Chi', 'Dagger', 'Delta', 'ETH', 'Eacute', 'Ecirc', 'Egrave', 'Epsilon', 'Eta', 'Euml', 'Gamma', 'Iacute', 'Icirc', 'Igrave', 'Iota', 'Iuml', 'Kappa', 'Lambda', 'Mu', 'Ntilde', 'Nu', 'OElig', 'Oacute', 'Ocirc', 'Ograve', 'Omega', 'Omicron', 'Oslash', 'Otilde', 'Ouml', 'Phi', 'Pi', 'Prime', 'Psi', 'Rho', 'Scaron', 'Sigma', 'THORN', 'Tau', 'Theta', 'Uacute', 'Ucirc', 'Ugrave', 'Upsilon', 'Uuml', 'Xi', 'Yacute', 'Yuml', 'Zeta', 'aacute', 'acirc', 'acute', 'aelig', 'agrave', 'alefsym', 'alpha', 'amp', 'and', 'ang', 'apos', 'aring', 'asymp', 'atilde', 'auml', 'bdquo', 'beta', 'brvbar', 'bull', 'cap', 'ccedil', 'cedil', 'cent', 'chi', 'circ', 'clubs', 'cong', 'copy', 'crarr', 'cup', 'curren', 'dArr', 'dagger', 'darr', 'deg', 'delta', 'diams', 'divide', 'eacute', 'ecirc', 'egrave', 'empty', 'emsp', 'ensp', 'epsilon', 'equiv', 'eta', 'eth', 'euml', 'euro', 'exist', 'fnof', 'forall', 'frac12', 'frac14', 'frac34', 'frasl', 'gamma', 'ge', 'gt', 'hArr', 'harr', 'hearts', 'hellip', 'iacute', 'icirc', 'iexcl', 'igrave', 'image', 'infin', 'int', 'iota', 'iquest', 'isin', 'iuml', 'kappa', 'lArr', 'lambda', 'lang', 'laquo', 'larr', 'lceil', 'ldquo', 'le', 'lfloor', 'lowast', 'loz', 'lrm', 'lsaquo', 'lsquo', 'lt', 'macr', 'mdash', 'micro', 'middot', 'minus', 'mu', 'nabla', 'nbsp', 'ndash', 'ne', 'ni', 'not', 'notin', 'nsub', 'ntilde', 'nu', 'oacute', 'ocirc', 'oelig', 'ograve', 'oline', 'omega', 'omicron', 'oplus', 'or', 'ordf', 'ordm', 'oslash', 'otilde', 'otimes', 'ouml', 'para', 'part', 'permil', 'perp', 'phi', 'pi', 'piv', 'plusmn', 'pound', 'prime', 'prod', 'prop', 'psi', 'quot', 'rArr', 'radic', 'rang', 'raquo', 'rarr', 'rceil', 'rdquo', 'real', 'reg', 'rfloor', 'rho', 'rlm', 'rsaquo', 'rsquo', 'sbquo', 'scaron', 'sdot', 'sect', 'shy', 'sigma', 'sigmaf', 'sim', 'spades', 'sub', 'sube', 'sum', 'sup', 'sup1', 'sup2', 'sup3', 'supe', 'szlig', 'tau', 'there4', 'theta', 'thetasym', 'thinsp', 'thorn', 'tilde', 'times', 'trade', 'uArr', 'uacute', 'uarr', 'ucirc', 'ugrave', 'uml', 'upsih', 'upsilon', 'uuml', 'weierp', 'xi', 'yacute', 'yen', 'yuml', 'zeta', 'zwj', 'zwnj'], \ 'vimxmlentities': ['AElig', 'Aacute', 'Acirc', 'Agrave', 'Alpha', 'Aring', 'Atilde', 'Auml', 'Beta', 'Ccedil', 'Chi', 'Dagger', 'Delta', 'ETH', 'Eacute', 'Ecirc', 'Egrave', 'Epsilon', 'Eta', 'Euml', 'Gamma', 'Iacute', 'Icirc', 'Igrave', 'Iota', 'Iuml', 'Kappa', 'Lambda', 'Mu', 'Ntilde', 'Nu', 'OElig', 'Oacute', 'Ocirc', 'Ograve', 'Omega', 'Omicron', 'Oslash', 'Otilde', 'Ouml', 'Phi', 'Pi', 'Prime', 'Psi', 'Rho', 'Scaron', 'Sigma', 'THORN', 'Tau', 'Theta', 'Uacute', 'Ucirc', 'Ugrave', 'Upsilon', 'Uuml', 'Xi', 'Yacute', 'Yuml', 'Zeta', 'aacute', 'acirc', 'acute', 'aelig', 'agrave', 'alefsym', 'alpha', 'amp', 'and', 'ang', 'apos', 'aring', 'asymp', 'atilde', 'auml', 'bdquo', 'beta', 'brvbar', 'bull', 'cap', 'ccedil', 'cedil', 'cent', 'chi', 'circ', 'clubs', 'cong', 'copy', 'crarr', 'cup', 'curren', 'dArr', 'dagger', 'darr', 'deg', 'delta', 'diams', 'divide', 'eacute', 'ecirc', 'egrave', 'empty', 'emsp', 'ensp', 'epsilon', 'equiv', 'eta', 'eth', 'euml', 'euro', 'exist', 'fnof', 'forall', 'frac12', 'frac14', 'frac34', 'frasl', 'gamma', 'ge', 'gt', 'hArr', 'harr', 'hearts', 'hellip', 'iacute', 'icirc', 'iexcl', 'igrave', 'image', 'infin', 'int', 'iota', 'iquest', 'isin', 'iuml', 'kappa', 'lArr', 'lambda', 'lang', 'laquo', 'larr', 'lceil', 'ldquo', 'le', 'lfloor', 'lowast', 'loz', 'lrm', 'lsaquo', 'lsquo', 'lt', 'macr', 'mdash', 'micro', 'middot', 'minus', 'mu', 'nabla', 'nbsp', 'ndash', 'ne', 'ni', 'not', 'notin', 'nsub', 'ntilde', 'nu', 'oacute', 'ocirc', 'oelig', 'ograve', 'oline', 'omega', 'omicron', 'oplus', 'or', 'ordf', 'ordm', 'oslash', 'otilde', 'otimes', 'ouml', 'para', 'part', 'permil', 'perp', 'phi', 'pi', 'piv', 'plusmn', 'pound', 'prime', 'prod', 'prop', 'psi', 'quot', 'rArr', 'radic', 'rang', 'raquo', 'rarr', 'rceil', 'rdquo', 'real', 'reg', 'rfloor', 'rho', 'rlm', 'rsaquo', 'rsquo', 'sbquo', 'scaron', 'sdot', 'sect', 'shy', 'sigma', 'sigmaf', 'sim', 'spades', 'sub', 'sube', 'sum', 'sup', 'sup1', 'sup2', 'sup3', 'supe', 'szlig', 'tau', 'there4', 'theta', 'thetasym', 'thinsp', 'thorn', 'tilde', 'times', 'trade', 'uArr', 'uacute', 'uarr', 'ucirc', 'ugrave', 'uml', 'upsih', 'upsilon', 'uuml', 'weierp', 'xi', 'yacute', 'yen', 'yuml', 'zeta', 'zwj', 'zwnj'],
@@ -391,7 +396,7 @@ let g:xmldata_html5 = {
\ ], \ ],
\ 'area': [ \ 'area': [
\ [], \ [],
\ extend(copy(global_attributes), {'alt': [], 'href': [], 'target': [], 'rel': linktypes, 'media': [], 'hreflang': lang_tag, 'type': [], 'shape': ['rect', 'circle', 'poly', 'default'], 'coords': [], 'referrerpolicy': ['no-referrer', 'no-referrer-when-downgrade', 'origin', 'origin-when-cross-origin', 'unsafe-url']}) \ extend(copy(global_attributes), {'alt': [], 'href': [], 'target': [], 'rel': linktypes, 'media': [], 'hreflang': lang_tag, 'type': [], 'shape': ['rect', 'circle', 'poly', 'default'], 'coords': [], 'referrerpolicy': referrerpolicy})
\ ], \ ],
\ 'article': [ \ 'article': [
\ flow_elements + ['style'], \ flow_elements + ['style'],
@@ -489,6 +494,10 @@ let g:xmldata_html5 = {
\ filter(copy(phrasing_elements), "!(v:val =~ 'dfn')"), \ filter(copy(phrasing_elements), "!(v:val =~ 'dfn')"),
\ global_attributes \ global_attributes
\ ], \ ],
\ 'dialog': [
\ flow_elements,
\ extend(copy(global_attributes), {'open': []})
\ ],
\ 'div': [ \ 'div': [
\ flow_elements + ['style'], \ flow_elements + ['style'],
\ global_attributes \ global_attributes
@@ -579,11 +588,11 @@ let g:xmldata_html5 = {
\ ], \ ],
\ 'iframe': [ \ 'iframe': [
\ [], \ [],
\ extend(copy(global_attributes), {'src': [], 'srcdoc': [], 'name': [], 'width': [], 'height': [], 'sandbox': ['allow-same-origin', 'allow-forms', 'allow-scripts'], 'seamless': ['seamless', ''], 'referrerpolicy': ['no-referrer', 'no-referrer-when-downgrade', 'origin', 'origin-when-cross-origin', 'unsafe-url'], 'allowfullscreen': [], 'allowpaymentrequest': [], 'allowusermedia': []}) \ extend(copy(global_attributes), {'src': [], 'srcdoc': [], 'name': [], 'width': [], 'height': [], 'sandbox': ['allow-same-origin', 'allow-forms', 'allow-scripts'], 'seamless': ['seamless', ''], 'referrerpolicy': referrerpolicy, 'allowfullscreen': [], 'allowpaymentrequest': [], 'allowpresentation': [], 'allowusermedia': []})
\ ], \ ],
\ 'img': [ \ 'img': [
\ [], \ [],
\ extend(copy(global_attributes), {'src': [], 'alt': [], 'height': [], 'width': [], 'usemap': [], 'ismap': ['ismap', ''], 'referrerpolicy': ['no-referrer', 'no-referrer-when-downgrade', 'origin', 'origin-when-cross-origin', 'unsafe-url'], 'crossorigin': ['anonymous', 'use-credentials']}) \ extend(copy(global_attributes), {'src': [], 'alt': [], 'height': [], 'width': [], 'decoding': ['async', 'sync', 'auto'], 'usemap': [], 'ismap': ['ismap', ''], 'referrerpolicy': referrerpolicy, 'crossorigin': ['anonymous', 'use-credentials']})
\ ], \ ],
\ 'input': [ \ 'input': [
\ [], \ [],
@@ -615,7 +624,7 @@ let g:xmldata_html5 = {
\ ], \ ],
\ 'link': [ \ 'link': [
\ [], \ [],
\ extend(copy(global_attributes), {'href': [], 'rel': linkreltypes, 'hreflang': lang_tag, 'media': [], 'type': [], 'sizes': ['any'], 'referrerpolicy': ['no-referrer', 'no-referrer-when-downgrade', 'origin', 'origin-when-cross-origin', 'unsafe-url'], 'crossorigin': crossorigin, 'preload': ['preload', ''], 'prefetch': ['prefetch', '']}) \ extend(copy(global_attributes), {'href': [], 'rel': linkreltypes, 'hreflang': lang_tag, 'media': [], 'type': [], 'sizes': ['any'], 'referrerpolicy': referrerpolicy, 'crossorigin': crossorigin, 'preload': ['preload', ''], 'prefetch': ['prefetch', ''], 'as': ['report', 'document', 'document', 'object', 'embed', 'audio', 'font', 'image', 'audioworklet', 'paintworklet', 'script', 'serviceworker', 'sharedworker', 'worker', 'style', 'track', 'video', 'image', 'manifest', 'xslt', 'fetch', '']})
\ ], \ ],
\ 'main': [ \ 'main': [
\ flow_elements + ['style'], \ flow_elements + ['style'],

126
build
View File

@@ -3,41 +3,44 @@
set -E set -E
DIRS="syntax indent compiler autoload ftplugin after/syntax after/indent after/ftplugin" DIRS="syntax indent compiler autoload ftplugin after/syntax after/indent after/ftplugin"
# shellcheck disable=SC2034
DIRS_BASIC="syntax compiler indent after/syntax after/indent" DIRS_BASIC="syntax compiler indent after/syntax after/indent"
# shellcheck disable=SC2034
DIRS_ALL="syntax indent compiler autoload ftplugin after" DIRS_ALL="syntax indent compiler autoload ftplugin after"
DIRS_SYNTAX="syntax after/syntax" # shellcheck disable=SC2034
DIRS_SYNTAX="syntax indent after/syntax after/indent"
DIRS_JAVASCRIPT="${DIRS} extras" DIRS_JAVASCRIPT="${DIRS} extras"
DIRS_RM="$DIRS_JAVASCRIPT" read -r -a DIRS_RM <<<"$DIRS_JAVASCRIPT"
OUTPUT="" OUTPUT=""
output() { output() {
OUTPUT="$OUTPUT$1" OUTPUT="$OUTPUT$1"
printf -- "$1" echo -n "$1"
} }
download() { download() {
for pack in $1; do for pack in $1; do
path="$(printf "$pack" | cut -d ':' -f 2)" path="$(cut -d ':' -f 2 <<<"$pack")"
dir="tmp/$(printf "$path" | cut -d '/' -f 2)" dir="tmp/$(cut -d '/' -f 2 <<<"$path")"
rm -rf "$dir" rm -rf "$dir"
(mkdir -p "$dir" && curl --silent -L https://codeload.github.com/$path/tar.gz/master | tar -zx -C "$dir" --strip 1 && printf '.') & (mkdir -p "$dir" && curl --silent -L "https://codeload.github.com/$path/tar.gz/master" | tar -zx -C "$dir" --strip 1 && printf '.') &
done done
wait wait
} }
extract() { extract() {
printf "\n" echo
cat config.vim >> tmp/polyglot.vim cat config.vim >> tmp/polyglot.vim
for pack in $1; do for pack in $1; do
name="$(printf "$pack" | cut -d ':' -f 1)" name="$(cut -d ':' -f 1 <<<"$pack")"
path="$(printf "$pack" | cut -d ':' -f 2)" path="$(cut -d ':' -f 2 <<<"$pack")"
dir="tmp/$(printf "$path" | cut -d '/' -f 2)" dir="tmp/$(cut -d '/' -f 2 <<<"$path")"
directories="DIRS$(printf "$pack" | cut -d ':' -f 3)" directories="DIRS$(cut -d ':' -f 3 <<<"$pack")"
subtree="$(printf "$pack" | cut -d ':' -f 4)" subtree="$(cut -d ':' -f 4 <<<"$pack")"
output "- [$name](https://github.com/$path) (" output "- [$name](https://github.com/$path) ("
subdirs="" subdirs=""
@@ -52,53 +55,84 @@ extract() {
fi fi
done done
for f in ${dir}/ftdetect/*; do # syntax for go.vim depends on autoload for go.vim, but we exclude the
( # autoload always and the ftplugin because it's too complex. FML.
echo "augroup filetypedetect"; if [ "${pack%%:*}" = "go" ]; then
echo '" '"$pack"; copy_file "${dir}${subtree}" "${dir}${subtree}/autoload/go/config.vim" "${name}"
cat "${f}"; fi
echo "augroup END";
echo output "${subdirs##, })"$'\n'
) >> tmp/polyglot.vim;
if (echo "julia coffee-script elixir fish git plantuml scala swift" | grep -qF "$name"); then
echo "Skipping ftdetect installation of $name" >&2
continue
fi
[ -d "${dir}/ftdetect" ] && for f in "${dir}/ftdetect/"*; do
cat <<EOF >> tmp/polyglot.vim
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, '${pack%%:*}') == -1
augroup filetypedetect
" ${pack%%:*}, from ${f##*/ftdetect/} in ${pack#*:}
$(cat "${f}")
augroup end
endif
EOF
done done
output "${subdirs##, })\n"
done done
mv tmp/polyglot.vim ftdetect/ mv tmp/polyglot.vim ftdetect/
for pack in $1; do for pack in $1; do
name="$(printf "$pack" | cut -d ':' -f 1)" name="$(cut -d ':' -f 1 <<<"$pack")"
path="$(printf "$pack" | cut -d ':' -f 2)" path="$(cut -d ':' -f 2 <<<"$pack")"
dir="tmp/$(printf "$path" | cut -d '/' -f 2)" dir="tmp/$(cut -d '/' -f 2 <<<"$path")"
subtree="$(printf "$pack" | cut -d ':' -f 4)" subtree="$(cut -d ':' -f 4 <<<"$pack")"
if [ -d "$dir${subtree:-/}plugin" ]; then if [ -d "$dir${subtree:-/}plugin" ]; then
printf "Possible error (plugin directory exists): $path\n" echo "Possible error (plugin directory exists): $path" >&2
fi fi
done done
} }
copy_dir() { copy_dir() {
for file in $(find "$1/$2" -name '*.vim'); do find "$1/$2" \( -name '*.vim' -o -name '*.vital' \) -print0 | while read -r -d $'\0' file; do
file_path="$(dirname "${file##$1/}")" copy_file "$1" "$file" "$3"
mkdir -p "$file_path"
touch "$file_path/$(basename "$file")"
# Use comma instead of / to handle cases like c/c++
sed -e "s,%%PACK%%,$3," -e "/%%CONTENT%%/{r $file" -e "d;}" plugin_guard.vim.template >> $file_path/$(basename "$file")
done done
} }
update_readme() { copy_file() {
OLD_README="$(cat README.md)" ## $1 is the build dir (e.g. tmp/vim-go)
## $2 is the full file path, as returned by `find` (e.g. tmp/vim-go/indent/go.vim)
## $3 is the name of the package (so that we can detect if it's disabled at runtime)
local tmp_dir="$1"
local file_in_tmp="$2"
local file_basename="${2##*/}"
local file_path="${file_in_tmp##$tmp_dir/}" # Just this file's (full) path
file_path="${file_path%/*}" # Minus the actual name of the file
local file_in_dst="${file_path}/${file_basename}" # Could also be ${file_in_tmp##$tmp_dir/}
local package_name="$3"
if [ "${file_in_tmp##$tmp_dir/}" != "${file_in_dst}" ]; then
echo "Failure in logic in build script; '${file_in_tmp##$tmp_dir/}' != '${file_in_dst}'. Bailing." >&2
exit 1
fi
mkdir -p "${file_path}"
touch "$file_in_dst"
# Use comma instead of / to handle cases like c/c++
sed -e "s,%%PACK%%,${package_name}," -e "/%%CONTENT%%/{r ${file_in_tmp}" -e "d;}" plugin_guard.vim.template >> "$file_in_dst"
}
update_readme() {
ed README.md <<- EOF ed README.md <<- EOF
/Language packs /Language packs
+2kb +2kb
/## /##
'b,-2c 'b,-2c
$(printf -- "$OUTPUT" | sort) $(echo -n "$OUTPUT" | sort)
. .
w w
q q
@@ -108,7 +142,7 @@ EOF
PACKS=" PACKS="
apiblueprint:sheerun/apiblueprint.vim apiblueprint:sheerun/apiblueprint.vim
applescript:vim-scripts/applescript.vim applescript:mityu/vim-applescript:_SYNTAX
asciidoc:asciidoc/vim-asciidoc asciidoc:asciidoc/vim-asciidoc
yaml:stephpy/vim-yaml yaml:stephpy/vim-yaml
ansible:pearofducks/ansible-vim ansible:pearofducks/ansible-vim
@@ -118,6 +152,7 @@ PACKS="
c++11:octol/vim-cpp-enhanced-highlight c++11:octol/vim-cpp-enhanced-highlight
c/c++:vim-jp/vim-cpp c/c++:vim-jp/vim-cpp
caddyfile:isobit/vim-caddyfile caddyfile:isobit/vim-caddyfile
carp:hellerve/carp-vim
cjsx:mtscout6/vim-cjsx cjsx:mtscout6/vim-cjsx
clojure:guns/vim-clojure-static clojure:guns/vim-clojure-static
cmake:pboettch/vim-cmake-syntax cmake:pboettch/vim-cmake-syntax
@@ -140,9 +175,11 @@ PACKS="
glsl:tikhomirov/vim-glsl glsl:tikhomirov/vim-glsl
gnuplot:vim-scripts/gnuplot-syntax-highlighting gnuplot:vim-scripts/gnuplot-syntax-highlighting
go:fatih/vim-go:_BASIC go:fatih/vim-go:_BASIC
graphql:jparise/vim-graphql
groovy:vim-scripts/groovy.vim groovy:vim-scripts/groovy.vim
haml:sheerun/vim-haml haml:sheerun/vim-haml
handlebars:mustache/vim-mustache-handlebars handlebars:mustache/vim-mustache-handlebars
haproxy:CH-DanReif/haproxy.vim
haskell:neovimhaskell/haskell-vim haskell:neovimhaskell/haskell-vim
haxe:yaymukund/vim-haxe haxe:yaymukund/vim-haxe
html5:othree/html5.vim html5:othree/html5.vim
@@ -151,9 +188,10 @@ PACKS="
javascript:pangloss/vim-javascript:_JAVASCRIPT javascript:pangloss/vim-javascript:_JAVASCRIPT
jenkins:martinda/Jenkinsfile-vim-syntax jenkins:martinda/Jenkinsfile-vim-syntax
json:elzr/vim-json json:elzr/vim-json
json5:GutenYe/json5.vim
jst:briancollins/vim-jst jst:briancollins/vim-jst
jsx:mxw/vim-jsx:_ALL jsx:mxw/vim-jsx:_ALL
julia:dcjones/julia-minimalist-vim julia:JuliaEditorSupport/julia-vim
kotlin:udalov/kotlin-vim kotlin:udalov/kotlin-vim
latex:LaTeX-Box-Team/LaTeX-Box latex:LaTeX-Box-Team/LaTeX-Box
less:groenewege/vim-less less:groenewege/vim-less
@@ -179,8 +217,9 @@ PACKS="
pug:digitaltoad/vim-pug pug:digitaltoad/vim-pug
puppet:voxpupuli/vim-puppet puppet:voxpupuli/vim-puppet
purescript:purescript-contrib/purescript-vim purescript:purescript-contrib/purescript-vim
python:mitsuhiko/vim-python-combined python:vim-python/python-syntax
python-compiler:aliev/vim-compiler-python python-compiler:aliev/vim-compiler-python
python-ident:Vimjas/vim-python-pep8-indent
qml:peterhoeg/vim-qml qml:peterhoeg/vim-qml
r-lang:vim-scripts/R.vim r-lang:vim-scripts/R.vim
racket:wlangstroth/vim-racket racket:wlangstroth/vim-racket
@@ -193,11 +232,12 @@ PACKS="
scala:derekwyatt/vim-scala scala:derekwyatt/vim-scala
scss:cakebaker/scss-syntax.vim scss:cakebaker/scss-syntax.vim
slim:slim-template/vim-slim slim:slim-template/vim-slim
slime:slime-lang/vim-slime-syntax
solidity:tomlion/vim-solidity solidity:tomlion/vim-solidity
stylus:wavded/vim-stylus stylus:wavded/vim-stylus
swift:keith/swift.vim swift:keith/swift.vim
sxhkd:baskerville/vim-sxhkdrc sxhkd:baskerville/vim-sxhkdrc
systemd:kurayama/systemd-vim-syntax systemd:wgwoods/vim-systemd-syntax
terraform:hashivim/vim-terraform terraform:hashivim/vim-terraform
textile:timcharper/textile.vim textile:timcharper/textile.vim
thrift:solarnz/thrift.vim thrift:solarnz/thrift.vim
@@ -217,12 +257,12 @@ PACKS="
" "
rm -rf tmp rm -rf tmp
rm -rf $DIRS_RM rm -rf "${DIRS_RM[@]}"
mkdir tmp mkdir tmp
printf "Downloading packs..." printf "Downloading packs..."
download "$PACKS" download "$(sed '/^#/d' <<<"$PACKS")"
extract "$PACKS" extract "$(sed '/^#/d' <<<"$PACKS")"
update_readme update_readme
rm -rf tmp rm -rf tmp

15
compiler/credo.vim Normal file
View File

@@ -0,0 +1,15 @@
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'elixir') == -1
if exists('current_compiler')
finish
endif
let current_compiler = 'credo'
if exists(":CompilerSet") != 2
command -nargs=* CompilerSet setlocal <args>
endif
CompilerSet errorformat=%f:%l:\ %t:\ %m
CompilerSet makeprg=mix\ credo\ suggest\ --format=flycheck
endif

View File

@@ -30,8 +30,8 @@ CompilerSet errorformat=
\%W%f:%l:\ warning:\ %m, \%W%f:%l:\ warning:\ %m,
\%E%f:%l:in\ %*[^:]:\ %m, \%E%f:%l:in\ %*[^:]:\ %m,
\%E%f:%l:\ %m, \%E%f:%l:\ %m,
\%-C%\tfrom\ %f:%l:in\ %.%#, \%-C%\t%\\d%#:%#\ %#from\ %f:%l:in\ %.%#,
\%-Z%\tfrom\ %f:%l, \%-Z%\t%\\d%#:%#\ %#from\ %f:%l,
\%-Z%p^, \%-Z%p^,
\%-G%.%# \%-G%.%#

15
compiler/mix.vim Normal file
View File

@@ -0,0 +1,15 @@
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'elixir') == -1
if exists('current_compiler')
finish
endif
let current_compiler = 'mix'
if exists(":CompilerSet") != 2
command -nargs=* CompilerSet setlocal <args>
endif
CompilerSet errorformat=%A%t%*[^:]:\ %m,%C%f:%l:\ %m,%C%f:%l,%Z
CompilerSet makeprg=mix
endif

View File

@@ -13,7 +13,7 @@ endif
let s:cpo_save = &cpo let s:cpo_save = &cpo
set cpo-=C set cpo-=C
CompilerSet makeprg=nim\ c\ --verbosity:0\ $*\ %:p CompilerSet makeprg=nim\ c\ --verbosity:0\ --listfullpaths\ $*\ %:p
CompilerSet errorformat= CompilerSet errorformat=
\%-GHint:\ %m, \%-GHint:\ %m,

View File

@@ -22,12 +22,12 @@ CompilerSet makeprg=rake
CompilerSet errorformat= CompilerSet errorformat=
\%D(in\ %f), \%D(in\ %f),
\%\\s%#from\ %f:%l:%m, \%\\s%#%\\d%#:%#\ %#from\ %f:%l:%m,
\%\\s%#from\ %f:%l:, \%\\s%#%\\d%#:%#\ %#from\ %f:%l:,
\%\\s%##\ %f:%l:%m%\\&%.%#%\\D:%\\d%#:%.%#, \%\\s%##\ %f:%l:%m%\\&%.%#%\\D:%\\d%\\+:%.%#,
\%\\s%##\ %f:%l%\\&%.%#%\\D:%\\d%#, \%\\s%##\ %f:%l%\\&%.%#%\\D:%\\d%\\+,
\%\\s%#[%f:%l:\ %#%m%\\&%.%#%\\D:%\\d%#:%.%#, \%\\s%#[%f:%l:\ %#%m%\\&%.%#%\\D:%\\d%\\+:%.%#,
\%\\s%#%f:%l:\ %#%m%\\&%.%#%\\D:%\\d%#:%.%#, \%\\s%#%f:%l:\ %#%m%\\&%.%#%\\D:%\\d%\\+:%.%#,
\%\\s%#%f:%l:, \%\\s%#%f:%l:,
\%m\ [%f:%l]:, \%m\ [%f:%l]:,
\%+Erake\ aborted!, \%+Erake\ aborted!,

View File

@@ -25,7 +25,7 @@ CompilerSet errorformat=
\%E%.%#:in\ `load':\ %f:%l:%m, \%E%.%#:in\ `load':\ %f:%l:%m,
\%E%f:%l:in\ `%*[^']':\ %m, \%E%f:%l:in\ `%*[^']':\ %m,
\%-Z\ \ \ \ \ %\\+\#\ %f:%l:%.%#, \%-Z\ \ \ \ \ %\\+\#\ %f:%l:%.%#,
\%E\ \ %\\d%\\+)%.%#, \%E\ \ \ \ \ Failure/Error:\ %m,
\%C\ \ \ \ \ %m, \%C\ \ \ \ \ %m,
\%C%\\s%#, \%C%\\s%#,
\%-G%.%# \%-G%.%#

View File

@@ -23,21 +23,21 @@ set cpo-=C
" default settings runs script normally " default settings runs script normally
" add '-c' switch to run syntax check only: " add '-c' switch to run syntax check only:
" "
" CompilerSet makeprg=ruby\ -wc\ $* " CompilerSet makeprg=ruby\ -c
" "
" or add '-c' at :make command line: " or add '-c' at :make command line:
" "
" :make -c %<CR> " :make -c %<CR>
" "
CompilerSet makeprg=ruby\ -w\ $* CompilerSet makeprg=ruby
CompilerSet errorformat= CompilerSet errorformat=
\%+E%f:%l:\ parse\ error, \%+E%f:%l:\ parse\ error,
\%W%f:%l:\ warning:\ %m, \%W%f:%l:\ warning:\ %m,
\%E%f:%l:in\ %*[^:]:\ %m, \%E%f:%l:in\ %*[^:]:\ %m,
\%E%f:%l:\ %m, \%E%f:%l:\ %m,
\%-C%\tfrom\ %f:%l:in\ %.%#, \%-C%\t%\\d%#:%#\ %#from\ %f:%l:in\ %.%#,
\%-Z%\tfrom\ %f:%l, \%-Z%\t%\\d%#:%#\ %#from\ %f:%l,
\%-Z%p^, \%-Z%p^,
\%-G%.%# \%-G%.%#

View File

@@ -13,3 +13,63 @@ let g:filetype_euphoria = 'elixir'
augroup filetypedetect augroup filetypedetect
autocmd BufNewFile,BufReadPost *.vb setlocal filetype=vbnet autocmd BufNewFile,BufReadPost *.vb setlocal filetype=vbnet
augroup END augroup END
let g:python_highlight_all = 1
augroup filetypedetect
if v:version < 704
" NOTE: this line fixes an issue with the default system-wide lisp ftplugin
" which didn't define b:undo_ftplugin on older Vim versions
" (*.jl files are recognized as lisp)
autocmd BufRead,BufNewFile *.jl let b:undo_ftplugin = "setlocal comments< define< formatoptions< iskeyword< lisp<"
endif
autocmd BufRead,BufNewFile *.jl set filetype=julia
" coffeescript
autocmd BufNewFile,BufRead *.coffee set filetype=coffee
autocmd BufNewFile,BufRead *Cakefile set filetype=coffee
autocmd BufNewFile,BufRead *.coffeekup,*.ck set filetype=coffee
autocmd BufNewFile,BufRead *._coffee set filetype=coffee
autocmd BufNewFile,BufRead *.litcoffee set filetype=litcoffee
autocmd BufNewFile,BufRead *.coffee.md set filetype=litcoffee
" elixir
au BufRead,BufNewFile *.ex,*.exs call s:setf('elixir')
au BufRead,BufNewFile *.eex call s:setf('eelixir')
" fish
autocmd BufRead,BufNewFile *.fish setfiletype fish
autocmd BufRead fish_funced_*_*.fish call search('^$')
autocmd BufRead,BufNewFile ~/.config/fish/fish_{read_,}history setfiletype yaml
autocmd BufRead,BufNewFile ~/.config/fish/fishd.* setlocal readonly
autocmd BufNewFile ~/.config/fish/functions/*.fish
\ call append(0, ['function '.expand('%:t:r'),
\'',
\'end']) |
\ 2
" git
autocmd BufNewFile,BufRead *.git/{,modules/**/,worktrees/*/}{COMMIT_EDIT,TAG_EDIT,MERGE_,}MSG set ft=gitcommit
autocmd BufNewFile,BufRead *.git/config,.gitconfig,gitconfig,.gitmodules set ft=gitconfig
autocmd BufNewFile,BufRead */.config/git/config set ft=gitconfig
autocmd BufNewFile,BufRead *.git/modules/**/config set ft=gitconfig
autocmd BufNewFile,BufRead git-rebase-todo set ft=gitrebase
autocmd BufNewFile,BufRead .gitsendemail.* set ft=gitsendemail
" plantuml
autocmd BufRead,BufNewFile *.pu,*.uml,*.plantuml setfiletype plantuml | set filetype=plantuml
" scala
au BufRead,BufNewFile *.scala,*.sc set filetype=scala
au BufRead,BufNewFile *.sbt setfiletype sbt.scala
" swift
autocmd BufNewFile,BufRead *.swift set filetype=swift
augroup END
" Fix for https://github.com/sheerun/vim-polyglot/issues/236#issuecomment-387984954
if (!exists('g:graphql_javascript_tags'))
let g:graphql_javascript_tags = ['gql', 'graphql', 'Relay.QL']
endif

View File

@@ -29,10 +29,11 @@ syntax region jsFlowReturnGroup contained matchgroup=jsFlowNoise start=/</ e
syntax match jsFlowReturnOrOp contained /\s*|\s*/ skipwhite skipempty nextgroup=@jsFlowReturnCluster syntax match jsFlowReturnOrOp contained /\s*|\s*/ skipwhite skipempty nextgroup=@jsFlowReturnCluster
syntax match jsFlowWildcardReturn contained /*/ skipwhite skipempty nextgroup=jsFuncBlock syntax match jsFlowWildcardReturn contained /*/ skipwhite skipempty nextgroup=jsFuncBlock
syntax region jsFlowFunctionGroup contained matchgroup=jsFlowNoise start=/</ end=/>/ contains=@jsFlowCluster skipwhite skipempty nextgroup=jsFuncArgs syntax region jsFlowFunctionGroup contained matchgroup=jsFlowNoise start=/</ end=/>/ contains=@jsFlowCluster skipwhite skipempty nextgroup=jsFuncArgs
syntax region jsFlowClassGroup contained matchgroup=jsFlowNoise start=/</ end=/>/ contains=@jsFlowCluster skipwhite skipempty nextgroup=jsClassBlock syntax region jsFlowClassGroup contained matchgroup=jsFlowNoise start=/</ end=/>/ contains=@jsFlowCluster skipwhite skipempty nextgroup=jsClassBlock
syntax region jsFlowClassFunctionGroup contained matchgroup=jsFlowNoise start=/</ end=/>/ contains=@jsFlowCluster skipwhite skipempty nextgroup=jsFuncArgs
syntax region jsFlowTypeStatement start=/type\%(\s\+\k\)\@=/ end=/=\@=/ contains=jsFlowTypeOperator oneline skipwhite skipempty nextgroup=jsFlowTypeValue keepend syntax region jsFlowTypeStatement start=/\(opaque\s\+\)\?type\%(\s\+\k\)\@=/ end=/=\@=/ contains=jsFlowTypeOperator oneline skipwhite skipempty nextgroup=jsFlowTypeValue keepend
syntax region jsFlowTypeValue contained matchgroup=jsFlowNoise start=/=/ end=/[\n;]/ contains=@jsFlowCluster,jsFlowGroup,jsFlowMaybe syntax region jsFlowTypeValue contained matchgroup=jsFlowNoise start=/=/ end=/[\n;]/ contains=@jsFlowCluster,jsFlowGroup,jsFlowMaybe
syntax match jsFlowTypeOperator contained /=/ containedin=jsFlowTypeValue syntax match jsFlowTypeOperator contained /=/ containedin=jsFlowTypeValue
syntax match jsFlowTypeOperator contained /=/ syntax match jsFlowTypeOperator contained /=/
@@ -83,6 +84,7 @@ if version >= 508 || !exists("did_javascript_syn_inits")
HiLink jsFlowReturnGroup jsFlowGroup HiLink jsFlowReturnGroup jsFlowGroup
HiLink jsFlowFunctionGroup PreProc HiLink jsFlowFunctionGroup PreProc
HiLink jsFlowClassGroup PreProc HiLink jsFlowClassGroup PreProc
HiLink jsFlowClassFunctionGroup PreProc
HiLink jsFlowArrowArguments PreProc HiLink jsFlowArrowArguments PreProc
HiLink jsFlowArrow PreProc HiLink jsFlowArrow PreProc
HiLink jsFlowReturnArrow PreProc HiLink jsFlowReturnArrow PreProc

File diff suppressed because it is too large Load Diff

View File

@@ -4,6 +4,7 @@ if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'ansible') == -1
if exists('+regexpengine') && ('&regexpengine' == 0) if exists('+regexpengine') && ('&regexpengine' == 0)
setlocal regexpengine=1 setlocal regexpengine=1
endif endif
set path+=./../templates,./../files set isfname+=@-@
set path+=./../templates,./../files,templates,files
endif endif

View File

@@ -1,9 +0,0 @@
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'haskell') == -1
if exists("g:loaded_haskellvim_cabal")
finish
endif
let g:loaded_haskellvim_cabal = 1
endif

View File

@@ -50,18 +50,17 @@ command! -buffer -nargs=* CrystalHierarchy echo crystal_lang#type_hierarchy(expa
command! -buffer -nargs=? CrystalSpecSwitch call crystal_lang#switch_spec_file(<f-args>) command! -buffer -nargs=? CrystalSpecSwitch call crystal_lang#switch_spec_file(<f-args>)
command! -buffer -nargs=? CrystalSpecRunAll call crystal_lang#run_all_spec(<f-args>) command! -buffer -nargs=? CrystalSpecRunAll call crystal_lang#run_all_spec(<f-args>)
command! -buffer -nargs=? CrystalSpecRunCurrent call crystal_lang#run_current_spec(<f-args>) command! -buffer -nargs=? CrystalSpecRunCurrent call crystal_lang#run_current_spec(<f-args>)
command! -buffer -nargs=* -bar CrystalFormat call crystal_lang#format(<q-args>) command! -buffer -nargs=* -bar CrystalFormat call crystal_lang#format(<q-args>, 0)
nnoremap <Plug>(crystal-jump-to-definition) :<C-u>CrystalDef<CR> nnoremap <buffer><Plug>(crystal-jump-to-definition) :<C-u>CrystalDef<CR>
nnoremap <Plug>(crystal-show-context) :<C-u>CrystalContext<CR> nnoremap <buffer><Plug>(crystal-show-context) :<C-u>CrystalContext<CR>
nnoremap <Plug>(crystal-spec-switch) :<C-u>CrystalSpecSwitch<CR> nnoremap <buffer><Plug>(crystal-spec-switch) :<C-u>CrystalSpecSwitch<CR>
nnoremap <Plug>(crystal-spec-run-all) :<C-u>CrystalSpecRunAll<CR> nnoremap <buffer><Plug>(crystal-spec-run-all) :<C-u>CrystalSpecRunAll<CR>
nnoremap <Plug>(crystal-spec-run-current) :<C-u>CrystalSpecRunCurrent<CR> nnoremap <buffer><Plug>(crystal-spec-run-current) :<C-u>CrystalSpecRunCurrent<CR>
nnoremap <Plug>(crystal-format) :<C-u>CrystalFormat<CR> nnoremap <buffer><Plug>(crystal-format) :<C-u>CrystalFormat<CR>
augroup plugin-ft-crystal augroup plugin-ft-crystal
autocmd! autocmd BufWritePre <buffer> if g:crystal_auto_format | call crystal_lang#format('', 1) | endif
autocmd BufWritePre <buffer> if g:crystal_auto_format | CrystalFormat | endif
augroup END augroup END
if get(g:, 'crystal_define_mappings', 1) if get(g:, 'crystal_define_mappings', 1)

View File

@@ -1,12 +1,12 @@
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'elixir') == -1 if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'elixir') == -1
if (exists("b:did_ftplugin")) if exists('b:did_ftplugin')
finish finish
endif endif
let b:did_ftplugin = 1 let b:did_ftplugin = 1
" Matchit support " Matchit support
if exists("loaded_matchit") && !exists("b:match_words") if exists('loaded_matchit') && !exists('b:match_words')
let b:match_ignorecase = 0 let b:match_ignorecase = 0
let b:match_words = '\:\@<!\<\%(do\|fn\)\:\@!\>' . let b:match_words = '\:\@<!\<\%(do\|fn\)\:\@!\>' .
@@ -32,9 +32,26 @@ let &l:path =
setlocal includeexpr=elixir#util#get_filename(v:fname) setlocal includeexpr=elixir#util#get_filename(v:fname)
setlocal suffixesadd=.ex,.exs,.eex,.erl,.yrl,.hrl setlocal suffixesadd=.ex,.exs,.eex,.erl,.yrl,.hrl
let &l:define = 'def\(macro\|guard\|delegate\)\=p\='
silent! setlocal formatoptions-=t formatoptions+=croqlj silent! setlocal formatoptions-=t formatoptions+=croqlj
let b:undo_ftplugin = 'setlocal sw< sts< et< isk< com< cms< path< inex< sua< '. let b:block_begin = '\<\(do$\|fn\>\)'
\ '| unlet! b:match_ignorecase b:match_words' let b:block_end = '\<end\>'
nnoremap <buffer> <silent> <expr> ]] ':silent keeppatterns /'.b:block_begin.'<CR>'
nnoremap <buffer> <silent> <expr> [[ ':silent keeppatterns ?'.b:block_begin.'<CR>'
nnoremap <buffer> <silent> <expr> ][ ':silent keeppatterns /'.b:block_end .'<CR>'
nnoremap <buffer> <silent> <expr> [] ':silent keeppatterns ?'.b:block_end .'<CR>'
onoremap <buffer> <silent> <expr> ]] ':silent keeppatterns /'.b:block_begin.'<CR>'
onoremap <buffer> <silent> <expr> [[ ':silent keeppatterns ?'.b:block_begin.'<CR>'
onoremap <buffer> <silent> <expr> ][ ':silent keeppatterns /'.b:block_end .'<CR>'
onoremap <buffer> <silent> <expr> [] ':silent keeppatterns ?'.b:block_end .'<CR>'
silent! setlocal formatoptions-=t formatoptions+=croqlj
let b:undo_ftplugin = 'setlocal sw< sts< et< isk< com< cms< path< inex< sua< def<'.
\ '| unlet! b:match_ignorecase b:match_words b:block_begin b:block_end'
endif endif

View File

@@ -43,14 +43,14 @@ setlocal comments=:--
setlocal commentstring=--\ %s setlocal commentstring=--\ %s
" Commands " Commands
command -buffer -nargs=? -complete=file ElmMake call elm#Make(<f-args>) command! -buffer -nargs=? -complete=file ElmMake call elm#Make(<f-args>)
command -buffer ElmMakeMain call elm#Make("Main.elm") command! -buffer ElmMakeMain call elm#Make("Main.elm")
command -buffer -nargs=? -complete=file ElmTest call elm#Test(<f-args>) command! -buffer -nargs=? -complete=file ElmTest call elm#Test(<f-args>)
command -buffer ElmRepl call elm#Repl() command! -buffer ElmRepl call elm#Repl()
command -buffer ElmErrorDetail call elm#ErrorDetail() command! -buffer ElmErrorDetail call elm#ErrorDetail()
command -buffer ElmShowDocs call elm#ShowDocs() command! -buffer ElmShowDocs call elm#ShowDocs()
command -buffer ElmBrowseDocs call elm#BrowseDocs() command! -buffer ElmBrowseDocs call elm#BrowseDocs()
command -buffer ElmFormat call elm#Format() command! -buffer ElmFormat call elm#Format()
if get(g:, 'elm_setup_keybindings', 1) if get(g:, 'elm_setup_keybindings', 1)
nmap <buffer> <LocalLeader>m <Plug>(elm-make) nmap <buffer> <LocalLeader>m <Plug>(elm-make)

View File

@@ -31,7 +31,7 @@ endif
" Use the 'man' wrapper function in fish to include fish's man pages. " Use the 'man' wrapper function in fish to include fish's man pages.
" Have to use a script for this; 'fish -c man' would make the the man page an " Have to use a script for this; 'fish -c man' would make the the man page an
" argument to fish instead of man. " argument to fish instead of man.
execute 'setlocal keywordprg=fish\ '.expand('<sfile>:p:h:h').'/bin/man.fish' execute 'setlocal keywordprg=fish\ '.fnameescape(expand('<sfile>:p:h:h').'/bin/man.fish')
let b:match_words = let b:match_words =
\ escape('<%(begin|function|if|switch|while|for)>:<end>', '<>%|)') \ escape('<%(begin|function|if|switch|while|for)>:<end>', '<>%|)')

20
ftplugin/graphql.vim Normal file
View File

@@ -0,0 +1,20 @@
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'graphql') == -1
" Vim filetype plugin
" Language: GraphQL
" Maintainer: Jon Parise <jon@indelible.org>
if (exists('b:did_ftplugin'))
finish
endif
let b:did_ftplugin = 1
setlocal comments=:#
setlocal commentstring=#\ %s
setlocal formatoptions-=t
setlocal iskeyword+=$,@-@
setlocal softtabstop=2
setlocal shiftwidth=2
setlocal expandtab
endif

View File

@@ -1,20 +0,0 @@
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'haskell') == -1
if exists("g:loaded_haskellvim_haskell")
finish
endif
let g:loaded_haskellvim_haskell = 1
function! haskell#sortImports(line1, line2)
exe a:line1 . "," . a:line2 . "sort /import\\s\\+\\(qualified\\s\\+\\)\\?/"
endfunction
function! haskell#formatImport(line1, line2)
exec a:line1 . ",". a:line2 . "s/import\\s\\+\\([A-Z].*\\)/import \\1"
endfunction
command! -buffer -range HaskellSortImports call haskell#sortImports(<line1>, <line2>)
command! -buffer -range HaskellFormatImport call haskell#formatImport(<line1>, <line2>)
endif

99
ftplugin/julia.vim Normal file
View File

@@ -0,0 +1,99 @@
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'julia') == -1
" Vim filetype plugin file
" Language: Julia
" Maintainer: Carlo Baldassi <carlobaldassi@gmail.com>
" Last Change: 2014 may 29
if exists("b:did_ftplugin")
finish
endif
let b:did_ftplugin = 1
let s:save_cpo = &cpo
set cpo-=C
setlocal include=^\\s*\\%(reload\\\|include\\)\\>
setlocal suffixesadd=.jl
setlocal comments=:#
setlocal commentstring=#=%s=#
setlocal cinoptions+=#1
setlocal define=^\\s*macro\\>
let b:julia_vim_loaded = 1
let b:undo_ftplugin = "setlocal include< suffixesadd< comments< commentstring<"
\ . " define< shiftwidth< expandtab< indentexpr< indentkeys< cinoptions< omnifunc<"
\ . " | unlet! b:julia_vim_loaded"
" MatchIt plugin support
if exists("loaded_matchit")
let b:match_ignorecase = 0
" note: begin_keywords must contain all blocks in order
" for nested-structures-skipping to work properly
let b:julia_begin_keywords = '\%(\%(\.\s*\)\@<!\|\%(@\s*.\s*\)\@<=\)\<\%(\%(staged\)\?function\|macro\|begin\|mutable\s\+struct\|\%(mutable\s\+\)\@<!struct\|\%(abstract\|primitive\)\s\+type\|\%(\(abstract\|primitive\)\s\+\)\@<!type\|immutable\|let\|do\|\%(bare\)\?module\|quote\|if\|for\|while\|try\)\>'
let s:macro_regex = '@\%(#\@!\S\)\+\s\+'
let s:nomacro = '\%(' . s:macro_regex . '\)\@<!'
let s:yesmacro = s:nomacro . '\%('. s:macro_regex . '\)\+'
let b:julia_begin_keywordsm = '\%(' . s:yesmacro . b:julia_begin_keywords . '\)\|'
\ . '\%(' . s:nomacro . b:julia_begin_keywords . '\)'
let b:julia_end_keywords = '\<end\>'
" note: this function relies heavily on the syntax file
function! JuliaGetMatchWords()
let [l,c] = [line('.'),col('.')]
let attr = synIDattr(synID(l, c, 1),"name")
let c1 = c
while attr == 'juliaMacro'
normal! W
if line('.') > l || col('.') == c1
call cursor(l, c)
return ''
endif
let attr = synIDattr(synID(l, col('.'), 1),"name")
let c1 = col('.')
endwhile
call cursor(l, c)
if attr == 'juliaConditional'
return b:julia_begin_keywordsm . ':\<\%(elseif\|else\)\>:' . b:julia_end_keywords
elseif attr =~ '\<\%(juliaRepeat\|juliaRepKeyword\)\>'
return b:julia_begin_keywordsm . ':\<\%(break\|continue\)\>:' . b:julia_end_keywords
elseif attr == 'juliaBlKeyword'
return b:julia_begin_keywordsm . ':' . b:julia_end_keywords
elseif attr == 'juliaException'
return b:julia_begin_keywordsm . ':\<\%(catch\|finally\)\>:' . b:julia_end_keywords
endif
return '\<\>:\<\>'
endfunction
let b:match_words = 'JuliaGetMatchWords()'
" we need to skip everything within comments, strings and
" the 'end' keyword when it is used as a range rather than as
" the end of a block
let b:match_skip = 'synIDattr(synID(line("."),col("."),1),"name") =~ '
\ . '"\\<julia\\%(Comprehension\\%(For\\|If\\)\\|RangeEnd\\|SymbolS\\?\\|Comment[LM]\\|\\%([bv]\\|ip\\|MIME\\|Shell\\|Doc\\)\\?String\\|RegEx\\)\\>"'
let b:undo_ftplugin = b:undo_ftplugin
\ . " | unlet! b:match_words b:match_skip b:match_ignorecase"
\ . " | unlet! b:julia_begin_keywords b:julia_end_keywords"
\ . " | delfunction JuliaGetMatchWords"
\ . " | call julia_blocks#remove_mappings()"
if get(g:, "julia_blocks", 1)
call julia_blocks#init_mappings()
let b:undo_ftplugin .= " | call julia_blocks#remove_mappings()"
endif
endif
if has("gui_win32")
let b:browsefilter = "Julia Source Files (*.jl)\t*.jl\n"
let b:undo_ftplugin = b:undo_ftplugin . " | unlet! b:browsefilter"
endif
let &cpo = s:save_cpo
unlet s:save_cpo
endif

View File

@@ -2,11 +2,13 @@ if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'vifm') == -1
" Mail file type extension to pick files for attachments via vifm " Mail file type extension to pick files for attachments via vifm
" Maintainer: xaizek <xaizek@posteo.net> " Maintainer: xaizek <xaizek@posteo.net>
" Last Change: January 23, 2016 " Last Change: January 02, 2018
" Insert attachment picked via vifm after 'Subject' header " Insert attachment picked via vifm after 'Subject' header
function! s:AddMailAttacments() function! s:AddMailAttachments()
" TODO: reduce duplication between this file and plugins/vifm.vim call vifm#globals#Init()
" XXX: similar code is in plugins/vifm.vim, but it's different in details
let l:listf = tempname() let l:listf = tempname()
if !has('nvim') if !has('nvim')
@@ -26,7 +28,7 @@ function! s:AddMailAttacments()
else else
" Work around handicapped neovim... " Work around handicapped neovim...
let callback = { 'listf': l:listf } let callback = { 'listf': l:listf }
function! callback.on_exit(id, code) function! callback.on_exit(id, code, event)
buffer # buffer #
silent! bdelete! # silent! bdelete! #
call s:HandleRunResults(a:code, self.listf) call s:HandleRunResults(a:code, self.listf)
@@ -59,7 +61,7 @@ function! s:HandleRunResults(exitcode, listf)
call delete(a:listf) call delete(a:listf)
endfunction endfunction
nnoremap <buffer> <silent> <localleader>a :call <sid>AddMailAttacments()<cr> nnoremap <buffer> <silent> <localleader>a :call <sid>AddMailAttachments()<cr>
" vim: set tabstop=2 softtabstop=2 shiftwidth=2 noexpandtab cinoptions-=(0 : " vim: set tabstop=2 softtabstop=2 shiftwidth=2 noexpandtab cinoptions-=(0 :

View File

@@ -11,7 +11,12 @@ endif
let b:did_ftplugin = 1 let b:did_ftplugin = 1
setlocal comments=:# setlocal
setlocal commentstring=#\ %s \ comments=:#
\ commentstring=#\ %s
\ shiftwidth=2
\ softtabstop=2
\ expandtab
\ iskeyword+=-
endif endif

View File

@@ -1,6 +1,6 @@
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'purescript') == -1 if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'purescript') == -1
setlocal comments=s1fl:{-,mb:\ \ ,ex:-},:-- setlocal comments=s1fl:{-,mb:\ \ ,ex:-},:--\ \|,:--
setlocal include=^import setlocal include=^import
setlocal includeexpr=printf('%s.purs',substitute(v:fname,'\\.','/','g')) setlocal includeexpr=printf('%s.purs',substitute(v:fname,'\\.','/','g'))

View File

@@ -46,7 +46,7 @@ endif
setlocal formatoptions-=t formatoptions+=croql setlocal formatoptions-=t formatoptions+=croql
setlocal include=^\\s*\\<\\(load\\>\\\|require\\>\\\|autoload\\s*:\\=[\"']\\=\\h\\w*[\"']\\=,\\) setlocal include=^\\s*\\<\\(load\\>\\\|require\\>\\\|autoload\\s*:\\=[\"']\\=\\h\\w*[\"']\\=,\\)
setlocal includeexpr=substitute(substitute(v:fname,'::','/','g'),'\%(\.rb\)\=$','.rb','') setlocal includeexpr=substitute(substitute(v:fname,'::','/','g'),'\\%(\\.rb\\)\\=$','.rb','')
setlocal suffixesadd=.rb setlocal suffixesadd=.rb
if exists("&ofu") && has("ruby") if exists("&ofu") && has("ruby")
@@ -151,7 +151,7 @@ let b:undo_ftplugin = "setl fo< inc< inex< sua< def< com< cms< path< tags< kp<"
function! s:map(mode, flags, map) abort function! s:map(mode, flags, map) abort
let from = matchstr(a:map, '\S\+') let from = matchstr(a:map, '\S\+')
if empty(mapcheck(from, a:mode)) if empty(mapcheck(from, a:mode))
exe a:mode.'map' '<buffer>'.(a:0 ? a:1 : '') a:map exe a:mode.'map' '<buffer>' a:map
let b:undo_ftplugin .= '|sil! '.a:mode.'unmap <buffer> '.from let b:undo_ftplugin .= '|sil! '.a:mode.'unmap <buffer> '.from
endif endif
endfunction endfunction

View File

@@ -31,8 +31,6 @@ else
endif endif
unlet s:delims unlet s:delims
let b:undo_ftplugin = ""
let &cpo = s:save_cpo let &cpo = s:save_cpo
unlet s:save_cpo unlet s:save_cpo

View File

@@ -12,6 +12,27 @@ setlocal comments=s:{#,ex:#}
setlocal formatoptions+=tcqln setlocal formatoptions+=tcqln
" setlocal formatlistpat=^\\s*\\d\\+\\.\\s\\+\\\|^[-*+]\\s\\+ " setlocal formatlistpat=^\\s*\\d\\+\\.\\s\\+\\\|^[-*+]\\s\\+
if exists('b:match_words')
let b:twigMatchWords = [
\ ['block', 'endblock'],
\ ['for', 'endfor'],
\ ['macro', 'endmacro'],
\ ['if', 'elseif', 'else', 'endif'],
\ ['set', 'endset']
\]
for s:element in b:twigMatchWords
let s:pattern = ''
for s:tag in s:element[:-2]
if s:pattern != ''
let s:pattern .= ':'
endif
let s:pattern .= '{%\s*\<' . s:tag . '\>\s*\%(.*=\)\@![^}]\{-}%}'
endfor
let s:pattern .= ':{%\s*\<' . s:element[-1:][0] . '\>\s*.\{-}%}'
let b:match_words .= ',' . s:pattern
endfor
endif
if exists("b:did_ftplugin") if exists("b:did_ftplugin")
let b:undo_ftplugin .= "|setlocal comments< formatoptions<" let b:undo_ftplugin .= "|setlocal comments< formatoptions<"
else else

View File

@@ -13,6 +13,13 @@ runtime! ftplugin/html.vim
setlocal suffixesadd+=.vue setlocal suffixesadd+=.vue
if !exists('g:no_plugin_maps') && !exists('g:no_vue_maps')
nnoremap <silent> <buffer> [[ :call search('^<\(template\<Bar>script\<Bar>style\)', 'bW')<CR>
nnoremap <silent> <buffer> ]] :call search('^<\(template\<Bar>script\<Bar>style\)', 'W')<CR>
nnoremap <silent> <buffer> [] :call search('^</\(template\<Bar>script\<Bar>style\)', 'bW')<CR>
nnoremap <silent> <buffer> ][ :call search('^</\(template\<Bar>script\<Bar>style\)', 'W')<CR>
endif
if exists('g:loaded_ale') if exists('g:loaded_ale')
let g:ale_linters = get(g:, 'ale_linters', {}) let g:ale_linters = get(g:, 'ale_linters', {})
let g:ale_linters.vue = get(g:ale_linters, 'vue', ['eslint']) let g:ale_linters.vue = get(g:ale_linters, 'vue', ['eslint'])

81
indent/applescript.vim Normal file
View File

@@ -0,0 +1,81 @@
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'applescript') == -1
"Plugin Name: applescript indent file.
"Author: mityu
"Last Change: 02-May-2017.
let s:cpo_save=&cpo
set cpo&vim
setlocal indentexpr=GetAppleScriptIndent()
setlocal indentkeys+=0=end,0=else,=error
func! GetAppleScriptIndent()
let l:ignorecase_save=&ignorecase
try
let &ignorecase=0
return s:returnAppleScriptIndent()
finally
let &ignorecase=l:ignorecase_save
endtry
endfunc
func! s:returnAppleScriptIndent()
let l:current_text=getline(v:lnum)
let l:prev_line=prevnonblank(v:lnum-1)
"At the start of the file, use 0 indent.
if l:prev_line==0
return 0
endif
let l:prev_line_save=l:prev_line
let l:prev_line=s:prev_non_connected_line(l:prev_line)
let l:indent=indent(l:prev_line)
if l:prev_line_save-l:prev_line==1
"連結開始
let l:indent+=shiftwidth()*2
elseif l:prev_line_save-l:prev_line>=2
"絶賛連結中
"その時は前の行のインデントをそのまま流用する
return indent(l:prev_line_save)
elseif l:prev_line_save==l:prev_line && s:doesOrderConnect(getline(l:prev_line-1))
"前の行が連結される行の最終行の場合
let l:prev_line=s:prev_non_connected_line(l:prev_line-1)
if l:prev_line==0 | let l:prev_line=1 | endif
let l:indent=indent(l:prev_line)
endif
let l:prev_text=getline(l:prev_line)
if l:prev_text=~'^\s*\(on\|\(tell\(.*\<to\>\)\@!\)\|repeat\|try\|if\|else\)'
let l:indent+=shiftwidth()
endif
if l:current_text=~'^\s*\(end\|else\|on\serror\)'
let l:indent-=shiftwidth()
endif
return l:indent
endfunc
func! s:prev_non_connected_line(line)
let l:prev_line=prevnonblank(a:line)
while l:prev_line>0 && s:doesOrderConnect(getline(l:prev_line))
let l:prev_line-=1
endwhile
return l:prev_line
endfunc
func! s:doesOrderConnect(text)
return a:text=~'¬$'
endfunc
let &cpo=s:cpo_save
unlet s:cpo_save
" vim: foldmethod=marker
endif

View File

@@ -9,14 +9,13 @@ setlocal nolisp
setlocal autoindent setlocal autoindent
setlocal indentexpr=GetCaddyfileIndent(v:lnum) setlocal indentexpr=GetCaddyfileIndent(v:lnum)
setlocal indentkeys+=<:>,0=},0=) setlocal indentkeys+=<:>,0=},0=)
" setlocal cindent
if exists('*shiftwidth') if exists('*shiftwidth')
func s:sw() function! s:sw()
return shiftwidth() return shiftwidth()
endfunc endfunc
else else
func s:sw() function! s:sw()
return &sw return &sw
endfunc endfunc
endif endif

433
indent/cython.vim Normal file
View File

@@ -0,0 +1,433 @@
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'python-ident') == -1
" PEP8 compatible Python indent file
" Language: Python
" Maintainer: Daniel Hahler <https://daniel.hahler.de/>
" Prev Maintainer: Hynek Schlawack <hs@ox.cx>
" Prev Maintainer: Eric Mc Sween <em@tomcom.de> (address invalid)
" Original Author: David Bustos <bustos@caltech.edu> (address invalid)
" License: CC0
"
" vim-python-pep8-indent - A nicer Python indentation style for vim.
" Written in 2004 by David Bustos <bustos@caltech.edu>
" Maintained from 2004-2005 by Eric Mc Sween <em@tomcom.de>
" Maintained from 2013 by Hynek Schlawack <hs@ox.cx>
" Maintained from 2017 by Daniel Hahler <https://daniel.hahler.de/>
"
" To the extent possible under law, the author(s) have dedicated all copyright
" and related and neighboring rights to this software to the public domain
" worldwide. This software is distributed without any warranty.
" You should have received a copy of the CC0 Public Domain Dedication along
" with this software. If not, see
" <http://creativecommons.org/publicdomain/zero/1.0/>.
" Only load this indent file when no other was loaded.
if exists('b:did_indent')
finish
endif
let b:did_indent = 1
setlocal nolisp
setlocal autoindent
setlocal indentexpr=GetPythonPEPIndent(v:lnum)
setlocal indentkeys=!^F,o,O,<:>,0),0],0},=elif,=except
if !exists('g:python_pep8_indent_multiline_string')
let g:python_pep8_indent_multiline_string = 0
endif
let s:block_rules = {
\ '^\s*elif\>': ['if', 'elif'],
\ '^\s*except\>': ['try', 'except'],
\ '^\s*finally\>': ['try', 'except', 'else']
\ }
let s:block_rules_multiple = {
\ '^\s*else\>': ['if', 'elif', 'for', 'try', 'except'],
\ }
" Pairs to look for when searching for opening parenthesis.
" The value is the maximum offset in lines.
let s:paren_pairs = {'()': 50, '[]': 100, '{}': 1000}
if &filetype ==# 'pyrex' || &filetype ==# 'cython'
let b:control_statement = '\v^\s*(class|def|if|while|with|for|except|cdef|cpdef)>'
else
let b:control_statement = '\v^\s*(class|def|if|while|with|for|except)>'
endif
let s:stop_statement = '^\s*\(break\|continue\|raise\|return\|pass\)\>'
" Skip strings and comments. Return 1 for chars to skip.
" jedi* refers to syntax definitions from jedi-vim for call signatures, which
" are inserted temporarily into the buffer.
let s:skip_special_chars = 'synIDattr(synID(line("."), col("."), 0), "name") ' .
\ '=~? "\\vstring|comment|jedi\\S"'
let s:skip_after_opening_paren = 'synIDattr(synID(line("."), col("."), 0), "name") ' .
\ '=~? "\\vcomment|jedi\\S"'
" Also ignore anything concealed.
" Wrapper around synconcealed for older Vim (7.3.429, used on Travis CI).
function! s:is_concealed(line, col)
let concealed = synconcealed(a:line, a:col)
return len(concealed) && concealed[0]
endfunction
if has('conceal')
let s:skip_special_chars .= '|| s:is_concealed(line("."), col("."))'
endif
let s:skip_search = 'synIDattr(synID(line("."), col("."), 0), "name") ' .
\ '=~? "comment"'
" Use 'shiftwidth()' instead of '&sw'.
" (Since Vim patch 7.3.629, 'shiftwidth' can be set to 0 to follow 'tabstop').
if exists('*shiftwidth')
function! s:sw()
return shiftwidth()
endfunction
else
function! s:sw()
return &shiftwidth
endfunction
endif
function! s:pair_sort(x, y)
if a:x[0] == a:y[0]
return a:x[1] == a:y[1] ? 0 : a:x[1] > a:y[1] ? 1 : -1
else
return a:x[0] > a:y[0] ? 1 : -1
endif
endfunction
" Find backwards the closest open parenthesis/bracket/brace.
function! s:find_opening_paren(...)
" optional arguments: line and column (defaults to 1) to search around
if a:0 > 0
let view = winsaveview()
call cursor(a:1, a:0 > 1 ? a:2 : 1)
let ret = s:find_opening_paren()
call winrestview(view)
return ret
endif
" Return if cursor is in a comment.
exe 'if' s:skip_search '| return [0, 0] | endif'
let nearest = [0, 0]
for [p, maxoff] in items(s:paren_pairs)
let stopline = max([0, line('.') - maxoff, nearest[0]])
let next = searchpairpos(
\ '\V'.p[0], '', '\V'.p[1], 'bnW', s:skip_special_chars, stopline)
if next[0] && (next[0] > nearest[0] || (next[0] == nearest[0] && next[1] > nearest[1]))
let nearest = next
endif
endfor
return nearest
endfunction
" Find the start of a multi-line statement
function! s:find_start_of_multiline_statement(lnum)
let lnum = a:lnum
while lnum > 0
if getline(lnum - 1) =~# '\\$'
let lnum = prevnonblank(lnum - 1)
else
let [paren_lnum, _] = s:find_opening_paren(lnum)
if paren_lnum < 1
return lnum
else
let lnum = paren_lnum
endif
endif
endwhile
endfunction
" Find possible indent(s) of the block starter that matches the current line.
function! s:find_start_of_block(lnum, types, multiple)
let r = []
let types = copy(a:types)
let re = '\V\^\s\*\('.join(a:types, '\|').'\)\>'
let lnum = a:lnum
let last_indent = indent(lnum) + 1
while lnum > 0 && last_indent > 0
let indent = indent(lnum)
if indent < last_indent
for type in types
let re = '\v^\s*'.type.'>'
if getline(lnum) =~# re
if !a:multiple
return [indent]
endif
if index(r, indent) == -1
let r += [indent]
endif
" Remove any handled type, e.g. 'if'.
call remove(types, index(types, type))
endif
endfor
let last_indent = indent(lnum)
endif
let lnum = prevnonblank(lnum - 1)
endwhile
return r
endfunction
" Is "expr" true for every position in "lnum", beginning at "start"?
" (optionally up to a:1 / 4th argument)
function! s:match_expr_on_line(expr, lnum, start, ...)
let text = getline(a:lnum)
let end = a:0 ? a:1 : len(text)
if a:start > end
return 1
endif
let save_pos = getpos('.')
let r = 1
for i in range(a:start, end)
call cursor(a:lnum, i)
if !(eval(a:expr) || text[i-1] =~# '\s')
let r = 0
break
endif
endfor
call setpos('.', save_pos)
return r
endfunction
" Line up with open parenthesis/bracket/brace.
function! s:indent_like_opening_paren(lnum)
let [paren_lnum, paren_col] = s:find_opening_paren(a:lnum)
if paren_lnum <= 0
return -2
endif
let text = getline(paren_lnum)
let base = indent(paren_lnum)
let nothing_after_opening_paren = s:match_expr_on_line(
\ s:skip_after_opening_paren, paren_lnum, paren_col+1)
let starts_with_closing_paren = getline(a:lnum) =~# '^\s*[])}]'
if nothing_after_opening_paren
if starts_with_closing_paren
let res = base
else
let res = base + s:sw()
endif
else
" Indent to match position of opening paren.
let res = paren_col
endif
" If this line is the continuation of a control statement
" indent further to distinguish the continuation line
" from the next logical line.
if text =~# b:control_statement && res == base + s:sw()
return base + s:sw() * 2
else
return res
endif
endfunction
" Match indent of first block of this type.
function! s:indent_like_block(lnum)
let text = getline(a:lnum)
for [multiple, block_rules] in [
\ [0, s:block_rules],
\ [1, s:block_rules_multiple]]
for [line_re, blocks] in items(block_rules)
if text !~# line_re
continue
endif
let indents = s:find_start_of_block(a:lnum - 1, blocks, multiple)
if !len(indents)
return -1
endif
if len(indents) == 1
return indents[0]
endif
" Multiple valid indents, e.g. for 'else' with both try and if.
let indent = indent(a:lnum)
if index(indents, indent) != -1
" The indent is valid, keep it.
return indent
endif
" Fallback to the first/nearest one.
return indents[0]
endfor
endfor
return -2
endfunction
function! s:indent_like_previous_line(lnum)
let lnum = prevnonblank(a:lnum - 1)
" No previous line, keep current indent.
if lnum < 1
return -1
endif
let text = getline(lnum)
let start = s:find_start_of_multiline_statement(lnum)
let base = indent(start)
let current = indent(a:lnum)
" Jump to last character in previous line.
call cursor(lnum, len(text))
let ignore_last_char = eval(s:skip_special_chars)
" Search for final colon that is not inside something to be ignored.
while 1
let curpos = getpos('.')[2]
if curpos == 1 | break | endif
if eval(s:skip_special_chars) || text[curpos-1] =~# '\s'
normal! h
continue
elseif text[curpos-1] ==# ':'
return base + s:sw()
endif
break
endwhile
if text =~# '\\$' && !ignore_last_char
" If this line is the continuation of a control statement
" indent further to distinguish the continuation line
" from the next logical line.
if getline(start) =~# b:control_statement
return base + s:sw() * 2
endif
" Nest (other) explicit continuations only one level deeper.
return base + s:sw()
endif
let empty = getline(a:lnum) =~# '^\s*$'
" Current and prev line are empty, next is not -> indent like next.
if empty && a:lnum > 1 &&
\ (getline(a:lnum - 1) =~# '^\s*$') &&
\ !(getline(a:lnum + 1) =~# '^\s*$')
return indent(a:lnum + 1)
endif
" If the previous statement was a stop-execution statement or a pass
if getline(start) =~# s:stop_statement
" Remove one level of indentation if the user hasn't already dedented
if empty || current > base - s:sw()
return base - s:sw()
endif
" Otherwise, trust the user
return -1
endif
if !empty && s:is_dedented_already(current, base)
return -1
endif
" In all other cases, line up with the start of the previous statement.
return base
endfunction
" If this line is dedented and the number of indent spaces is valid
" (multiple of the indentation size), trust the user.
function! s:is_dedented_already(current, base)
let dedent_size = a:current - a:base
return (dedent_size < 0 && a:current % s:sw() == 0) ? 1 : 0
endfunction
" Is the syntax at lnum (and optionally cnum) a python string?
function! s:is_python_string(lnum, ...)
let line = getline(a:lnum)
let linelen = len(line)
if linelen < 1
let linelen = 1
endif
let cols = a:0 ? type(a:1) != type([]) ? [a:1] : a:1 : range(1, linelen)
for cnum in cols
if match(map(synstack(a:lnum, cnum),
\ "synIDattr(v:val, 'name')"), 'python\S*String') == -1
return 0
end
endfor
return 1
endfunction
function! GetPythonPEPIndent(lnum)
" First line has indent 0
if a:lnum == 1
return 0
endif
let line = getline(a:lnum)
let prevline = getline(a:lnum-1)
" Multilinestrings: continous, docstring or starting.
if s:is_python_string(a:lnum-1, len(prevline))
\ && (s:is_python_string(a:lnum, 1)
\ || match(line, '^\%("""\|''''''\)') != -1)
" Indent closing quotes as the line with the opening ones.
let match_quotes = match(line, '^\s*\zs\%("""\|''''''\)')
if match_quotes != -1
" closing multiline string
let quotes = line[match_quotes:(match_quotes+2)]
let pairpos = searchpairpos(quotes, '', quotes, 'b')
if pairpos[0] != 0
return indent(pairpos[0])
else
" TODO: test to cover this!
endif
endif
if s:is_python_string(a:lnum-1)
" Previous line is (completely) a string.
return indent(a:lnum-1)
endif
if match(prevline, '^\s*\%("""\|''''''\)') != -1
" docstring.
return indent(a:lnum-1)
endif
let indent_multi = get(b:, 'python_pep8_indent_multiline_string',
\ get(g:, 'python_pep8_indent_multiline_string', 0))
if match(prevline, '\v%("""|'''''')$') != -1
" Opening multiline string, started in previous line.
if (&autoindent && indent(a:lnum) == indent(a:lnum-1))
\ || match(line, '\v^\s+$') != -1
" <CR> with empty line or to split up 'foo("""bar' into
" 'foo("""' and 'bar'.
if indent_multi == -2
return indent(a:lnum-1) + s:sw()
endif
return indent_multi
endif
endif
" Keep existing indent.
if match(line, '\v^\s*\S') != -1
return -1
endif
if indent_multi != -2
return indent_multi
endif
return s:indent_like_opening_paren(a:lnum)
endif
" Parens: If we can find an open parenthesis/bracket/brace, line up with it.
let indent = s:indent_like_opening_paren(a:lnum)
if indent >= -1
return indent
endif
" Blocks: Match indent of first block of this type.
let indent = s:indent_like_block(a:lnum)
if indent >= -1
return indent
endif
return s:indent_like_previous_line(a:lnum)
endfunction
endif

81
indent/graphql.vim Normal file
View File

@@ -0,0 +1,81 @@
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'graphql') == -1
" Vim indent file
" Language: GraphQL
" Maintainer: Jon Parise <jon@indelible.org>
if exists('b:did_indent')
finish
endif
let b:did_indent = 1
setlocal autoindent
setlocal nocindent
setlocal nolisp
setlocal nosmartindent
setlocal indentexpr=GetGraphQLIndent()
setlocal indentkeys=0{,0},0),0[,0],0#,!^F,o,O,e
" If our indentation function already exists, we have nothing more to do.
if exists('*GetGraphQLIndent')
finish
endif
let s:cpo_save = &cpoptions
set cpoptions&vim
" Check if the character at lnum:col is inside a string.
function s:InString(lnum, col)
return synIDattr(synID(a:lnum, a:col, 1), 'name') is# 'graphqlString'
endfunction
function GetGraphQLIndent()
" If this is the first non-blank line, we have nothing more to do because
" all of our indentation rules are based on matching against earlier lines.
let l:prevlnum = prevnonblank(v:lnum - 1)
if l:prevlnum == 0
return 0
endif
let l:line = getline(v:lnum)
" If this line contains just a closing bracket, find its matching opening
" bracket and indent the closing backet to match.
let l:col = matchend(l:line, '^\s*[]})]')
if l:col > 0 && !s:InString(v:lnum, l:col)
let l:bracket = l:line[l:col - 1]
call cursor(v:lnum, l:col)
if l:bracket is# '}'
let l:matched = searchpair('{', '', '}', 'bW')
elseif l:bracket is# ']'
let l:matched = searchpair('\[', '', '\]', 'bW')
elseif l:bracket is# ')'
let l:matched = searchpair('(', '', ')', 'bW')
else
let l:matched = -1
endif
return l:matched > 0 ? indent(l:matched) : virtcol('.') - 1
endif
" If we're inside of a multiline string, continue with the same indentation.
if s:InString(v:lnum, matchend(l:line, '^\s*') + 1)
return indent(v:lnum)
endif
" If the previous line contained an opening bracket, and we are still in it,
" add indent depending on the bracket type.
if getline(l:prevlnum) =~# '[[{(]\s*$'
return indent(l:prevlnum) + shiftwidth()
endif
" Default to the existing indentation level.
return indent(l:prevlnum)
endfunction
let &cpoptions = s:cpo_save
unlet s:cpo_save
endif

View File

@@ -42,12 +42,6 @@ if !exists('g:haskell_indent_let')
let g:haskell_indent_let = 4 let g:haskell_indent_let = 4
endif endif
if !exists('g:haskell_indent_let_no_in')
" let x = 0
" x
let g:haskell_indent_let_no_in = 4
endif
if !exists('g:haskell_indent_where') if !exists('g:haskell_indent_where')
" where f :: Int -> Int " where f :: Int -> Int
" >>>>>>f x = x " >>>>>>f x = x
@@ -73,7 +67,7 @@ if !exists('g:haskell_indent_guard')
endif endif
setlocal indentexpr=GetHaskellIndent() setlocal indentexpr=GetHaskellIndent()
setlocal indentkeys=0},0),0],!^F,o,O,0=where,0=let,0=deriving,<space> setlocal indentkeys=!^F,o,O,0{,0},0(,0),0[,0],0,,0=where,0=let,0=deriving,0=in\ ,0=::\ ,0=\-\>\ ,0=\=\>\ ,0=\|\ ,=\=\
function! s:isInBlock(hlstack) function! s:isInBlock(hlstack)
return index(a:hlstack, 'haskellDelimiter') > -1 || index(a:hlstack, 'haskellParens') > -1 || index(a:hlstack, 'haskellBrackets') > -1 || index(a:hlstack, 'haskellBlock') > -1 || index(a:hlstack, 'haskellBlockComment') > -1 || index(a:hlstack, 'haskellPragma') > -1 return index(a:hlstack, 'haskellDelimiter') > -1 || index(a:hlstack, 'haskellParens') > -1 || index(a:hlstack, 'haskellBrackets') > -1 || index(a:hlstack, 'haskellBlock') > -1 || index(a:hlstack, 'haskellBlockComment') > -1 || index(a:hlstack, 'haskellPragma') > -1
@@ -115,25 +109,26 @@ endfunction
" backtrack to find guard clause " backtrack to find guard clause
function! s:indentGuard(pos, prevline) function! s:indentGuard(pos, prevline)
let l:l = a:prevline let l:l = a:prevline
let l:c = 1 let l:c = v:lnum - 1
let l:s = indent(l:c)
while v:lnum != l:c while l:c >= 1
" empty line, stop looking if l:s == 0 && strlen(l:l) > 0
if l:l =~ '^$' " top-level start, stop looking
return a:pos return g:haskell_indent_guard
" guard found elseif l:l =~ '^\s\+[|,=]\s\+'
elseif l:l =~ '^\s*|\s\+' " guard block found
return match(l:l, '|') return match(l:l, '[|,=]')
" found less deeper indentation (not starting with `,` or `=`)
" stop looking
else else
let l:m = match(l:l, '\S') if l:s > 0 && l:s <= a:pos
if l:l !~ '^\s*[=,]' && l:m <= a:pos " found less deeper indentation (not starting with `,` or `=`)
return l:m + g:haskell_indent_guard " stop looking
return l:s + g:haskell_indent_guard
endif endif
endif endif
let l:c += 1 let l:c -= 1
let l:l = getline(v:lnum - l:c) let l:l = getline(l:c)
let l:s = indent(l:c)
endwhile endwhile
return -1 return -1
@@ -196,7 +191,7 @@ function! GetHaskellIndent()
" operator at end of previous line " operator at end of previous line
if l:prevline =~ '[!#$%&*+./<>?@\\^|~-]\s*$' if l:prevline =~ '[!#$%&*+./<>?@\\^|~-]\s*$'
return match(l:prevline, '\S') + &shiftwidth return indent(v:lnum - 1) + &shiftwidth
endif endif
" let foo = " let foo =
@@ -207,7 +202,7 @@ function! GetHaskellIndent()
" let x = 1 in " let x = 1 in
" >>>>x " >>>>x
if l:prevline =~ '\C\<let\>\s\+.\+\<in\>\?$' && l:line !~ '\C^\s*\<in\>' if l:prevline =~ '\C\<let\>.\{-}\<in\>\s*$' && l:line !~ '\C^\s*\<in\>'
return match(l:prevline, '\C\<let\>') + g:haskell_indent_let return match(l:prevline, '\C\<let\>') + g:haskell_indent_let
endif endif
@@ -215,9 +210,6 @@ function! GetHaskellIndent()
" let y = 2 " let y = 2
" "
" let x = 1 " let x = 1
" >in x
"
" let x = 1
" >>>>y = 2 " >>>>y = 2
" "
" let x = 1 " let x = 1
@@ -228,21 +220,11 @@ function! GetHaskellIndent()
if s:isSYN('haskellLet', v:lnum - 1, l:s + 1) if s:isSYN('haskellLet', v:lnum - 1, l:s + 1)
return l:s return l:s
endif endif
elseif l:line =~ '\C^\s*\<in\>'
let l:s = match(l:prevline, '\C\<let\>')
if s:isSYN('haskellLet', v:lnum - 1, l:s + 1)
return l:s + g:haskell_indent_in
endif
elseif l:line =~ '\s=\s' elseif l:line =~ '\s=\s'
let l:s = match(l:prevline, '\C\<let\>') let l:s = match(l:prevline, '\C\<let\>')
if s:isSYN('haskellLet', v:lnum - 1, l:s + 1) if s:isSYN('haskellLet', v:lnum - 1, l:s + 1)
return l:s + g:haskell_indent_let return l:s + g:haskell_indent_let
endif endif
else
let l:s = match(l:prevline, '\C\<let\>')
if s:isSYN('haskellLet', v:lnum - 1, l:s + 1)
return l:s + g:haskell_indent_let_no_in
endif
endif endif
endif endif
@@ -263,7 +245,7 @@ function! GetHaskellIndent()
" >>foo " >>foo
" "
if l:prevline =~ '\C\<where\>\s*$' if l:prevline =~ '\C\<where\>\s*$'
return match(l:prevline, '\S') + get(g:, 'haskell_indent_after_bare_where', &shiftwidth) return indent(v:lnum - 1) + get(g:, 'haskell_indent_after_bare_where', &shiftwidth)
endif endif
" do " do
@@ -272,7 +254,7 @@ function! GetHaskellIndent()
" foo = " foo =
" >>bar " >>bar
if l:prevline =~ '\C\(\<do\>\|=\)\s*$' if l:prevline =~ '\C\(\<do\>\|=\)\s*$'
return match(l:prevline, '\S') + &shiftwidth return indent(v:lnum - 1) + &shiftwidth
endif endif
" do foo " do foo
@@ -288,7 +270,7 @@ function! GetHaskellIndent()
" >>bar -> quux " >>bar -> quux
if l:prevline =~ '\C\<case\>.\+\<of\>\s*$' if l:prevline =~ '\C\<case\>.\+\<of\>\s*$'
if get(g:,'haskell_indent_case_alternative', 0) if get(g:,'haskell_indent_case_alternative', 0)
return match(l:prevline, '\S') + &shiftwidth return indent(v:lnum - 1) + &shiftwidth
else else
return match(l:prevline, '\C\<case\>') + g:haskell_indent_case return match(l:prevline, '\C\<case\>') + g:haskell_indent_case
endif endif
@@ -296,9 +278,20 @@ function! GetHaskellIndent()
"" where foo "" where foo
"" >>>>>>bar "" >>>>>>bar
""
"" where foo :: Int
"" >>>>>>>>>>-> Int
""
"" where foo x
"" >>>>>>>>|
if l:prevline =~ '\C\<where\>\s\+\S\+.*$' if l:prevline =~ '\C\<where\>\s\+\S\+.*$'
if l:line =~ '^\s*[=-]>\s' && l:prevline =~ ' :: ' if l:line =~ '^\s*[=-]>\s' && l:prevline =~ ' :: '
return match(l:prevline, ':: ') return match(l:prevline, ':: ')
elseif l:line =~ '^\s*|\s'
let l:s = match(l:prevline, '\C\<where\>')
if s:isSYN('haskellWhere', v:lnum - 1, l:s + 1)
return l:s + g:haskell_indent_where + g:haskell_indent_guard
endif
else else
let l:s = match(l:prevline, '\C\<where\>') let l:s = match(l:prevline, '\C\<where\>')
if s:isSYN('haskellWhere', v:lnum - 1, l:s + 1) if s:isSYN('haskellWhere', v:lnum - 1, l:s + 1)
@@ -309,8 +302,8 @@ function! GetHaskellIndent()
" newtype Foo = Foo " newtype Foo = Foo
" >>deriving " >>deriving
if l:prevline =~ '\C\s*\<\(newtype\|data\)\>[^{]\+' && l:line =~ '\C^\s*\<deriving\>' if l:prevline =~ '\C^\s*\<\(newtype\|data\)\>[^{]\+' && l:line =~ '\C^\s*\<deriving\>'
return match(l:prevline, '\S') + &shiftwidth return indent(v:lnum - 1) + &shiftwidth
endif endif
" foo :: Int " foo :: Int
@@ -352,9 +345,9 @@ function! GetHaskellIndent()
else else
let l:m = matchstr(l:line, '^\s*\zs\<\S\+\>\ze') let l:m = matchstr(l:line, '^\s*\zs\<\S\+\>\ze')
let l:l = l:prevline let l:l = l:prevline
let l:c = 1 let l:c = v:lnum - 1
while v:lnum != l:c while l:c >= 1
" fun decl " fun decl
if l:l =~ ('^\s*' . l:m . '\(\s*::\|\n\s\+::\)') if l:l =~ ('^\s*' . l:m . '\(\s*::\|\n\s\+::\)')
let l:s = match(l:l, l:m) let l:s = match(l:l, l:m)
@@ -367,8 +360,8 @@ function! GetHaskellIndent()
elseif l:l =~ '^$' elseif l:l =~ '^$'
return 0 return 0
endif endif
let l:c += 1 let l:c -= 1
let l:l = getline(v:lnum - l:c) let l:l = getline(l:c)
endwhile endwhile
return 0 return 0
@@ -414,8 +407,8 @@ function! GetHaskellIndent()
" foo " foo
" >>{ " >>{
if l:line =~ '^\s*{ ' if l:line =~ '^\s*{'
let l:s = match(l:prevline, '\S') let l:s = indent(v:lnum - 1)
if l:s >= 0 if l:s >= 0
return l:s + &shiftwidth return l:s + &shiftwidth
endif endif
@@ -433,14 +426,27 @@ function! GetHaskellIndent()
return match(l:prevline, 'in') - g:haskell_indent_in return match(l:prevline, 'in') - g:haskell_indent_in
endif endif
return match(l:prevline, '\S') + get(g:, 'haskell_indent_before_where', &shiftwidth) return indent(v:lnum - 1) + get(g:, 'haskell_indent_before_where', &shiftwidth)
endif endif
" let x = 1 " let x = 1
" y = 2 " y = 2
" >in x + 1 " >in x + 1
if l:line =~ '\C^\s*\<in\>' if l:line =~ '\C^\s*\<in\>'
return match(l:prevline, '\S') - (4 - g:haskell_indent_in) let l:s = 0
let l:c = v:lnum - 1
while l:s <= 0 && l:c >= 1
let l:l = getline(l:c)
let l:s = match(l:l, '\C\<let\>')
if l:s >= 1 && s:isSYN('haskellLet', l:c, l:s + 1)
break
elseif l:l =~ '^\S'
return -1
endif
let l:c -= 1
endwhile
return l:s + g:haskell_indent_in
endif endif
" data Foo " data Foo
@@ -485,7 +491,7 @@ function! GetHaskellIndent()
" foo " foo
" >>:: Int " >>:: Int
if l:line =~ '^\s*::\s' if l:line =~ '^\s*::\s'
return match(l:prevline, '\S') + &shiftwidth return indent(v:lnum - 1) + &shiftwidth
endif endif
" indent closing brace, paren or bracket " indent closing brace, paren or bracket

File diff suppressed because it is too large Load Diff

View File

@@ -4,7 +4,7 @@ if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'javascript') ==
" Language: Javascript " Language: Javascript
" Maintainer: Chris Paul ( https://github.com/bounceme ) " Maintainer: Chris Paul ( https://github.com/bounceme )
" URL: https://github.com/pangloss/vim-javascript " URL: https://github.com/pangloss/vim-javascript
" Last Change: September 18, 2017 " Last Change: December 4, 2017
" Only load this indent file when no other was loaded. " Only load this indent file when no other was loaded.
if exists('b:did_indent') if exists('b:did_indent')
@@ -89,22 +89,22 @@ function s:SynAt(l,c)
endfunction endfunction
function s:ParseCino(f) function s:ParseCino(f)
let [divider, n, cstr] = [0] + matchlist(&cino, let [s, n, divider] = [strridx(&cino, a:f)+1, '', 0]
\ '\%(.*,\)\=\%(\%d'.char2nr(a:f).'\(-\)\=\([.s0-9]*\)\)\=')[1:2] while s && &cino[ s ] =~ '[^,]'
for c in split(cstr,'\zs') if &cino[ s ] == '.'
if c == '.' && !divider
let divider = 1 let divider = 1
elseif c ==# 's' elseif &cino[ s ] ==# 's'
if n !~ '\d' if n !~ '\d'
return n . s:sw() + 0 return n . s:sw() + 0
endif endif
let n = str2nr(n) * s:sw() let n = str2nr(n) * s:sw()
break break
else else
let [n, divider] .= [c, 0] let [n, divider] .= [&cino[ s ], 0]
endif endif
endfor let s += 1
return str2nr(n) / max([str2nr(divider),1]) endwhile
return str2nr(n) / max([divider, 1])
endfunction endfunction
" Optimized {skip} expr, only callable from the search loop which " Optimized {skip} expr, only callable from the search loop which
@@ -121,11 +121,14 @@ function s:SkipFunc()
if eval(s:skip_expr) if eval(s:skip_expr)
return 1 return 1
endif endif
elseif search('\m`\|\${\|\*\/','nW'.s:z,s:looksyn) && eval(s:skip_expr) elseif search('\m`\|\${\|\*\/','nW'.s:z,s:looksyn)
let s:check_in = 1 if eval(s:skip_expr)
return 1 let s:check_in = 1
return 1
endif
else
let s:synid_cache[:] += [[line2byte('.') + col('.') - 1], ['']]
endif endif
let s:synid_cache[:] += [[line2byte('.') + col('.') - 1], ['']]
let [s:looksyn, s:top_col] = getpos('.')[1:2] let [s:looksyn, s:top_col] = getpos('.')[1:2]
endfunction endfunction
@@ -205,18 +208,15 @@ function s:ExprCol()
let bal = 0 let bal = 0
while s:SearchLoop('[{}?:]','bW',s:skip_expr) while s:SearchLoop('[{}?:]','bW',s:skip_expr)
if s:LookingAt() == ':' if s:LookingAt() == ':'
if getline('.')[col('.')-2] == ':' let bal -= !search('\m:\%#','bW')
call cursor(0,col('.')-1)
continue
endif
let bal -= 1
elseif s:LookingAt() == '?' elseif s:LookingAt() == '?'
if getline('.')[col('.'):col('.')+1] =~ '^\.\d\@!' if getline('.')[col('.'):col('.')+1] =~ '^\.\d\@!'
continue " ?. conditional chain, not ternary start
elseif !bal elseif !bal
return 1 return 1
else
let bal += 1
endif endif
let bal += 1
elseif s:LookingAt() == '{' elseif s:LookingAt() == '{'
return !s:IsBlock() return !s:IsBlock()
elseif !s:GetPair('{','}','bW',s:skip_expr) elseif !s:GetPair('{','}','bW',s:skip_expr)
@@ -242,18 +242,18 @@ function s:Continues()
endfunction endfunction
" Check if line 'lnum' has a balanced amount of parentheses. " Check if line 'lnum' has a balanced amount of parentheses.
function s:Balanced(lnum) function s:Balanced(lnum,line)
let [l:open, l:line] = [0, getline(a:lnum)] let l:open = 0
let pos = match(l:line, '[][(){}]') let pos = match(a:line, '[][(){}]')
while pos != -1 while pos != -1
if s:SynAt(a:lnum,pos + 1) !~? b:syng_strcom if s:SynAt(a:lnum,pos + 1) !~? b:syng_strcom
let l:open += match(' ' . l:line[pos],'[[({]') let l:open += matchend(a:line[pos],'[[({]')
if l:open < 0 if l:open < 0
return return
endif endif
endif endif
let pos = match(l:line, !l:open ? '[][(){}]' : '()' =~ l:line[pos] ? let pos = match(a:line, !l:open ? '[][(){}]' : '()' =~ a:line[pos] ?
\ '[()]' : '{}' =~ l:line[pos] ? '[{}]' : '[][]', pos + 1) \ '[()]' : '{}' =~ a:line[pos] ? '[{}]' : '[][]', pos + 1)
endwhile endwhile
return !l:open return !l:open
endfunction endfunction
@@ -266,8 +266,10 @@ function s:OneScope()
\ s:Pure('s:PreviousToken') != '.' && !(tok == 'while' && s:DoWhile()) \ s:Pure('s:PreviousToken') != '.' && !(tok == 'while' && s:DoWhile())
elseif s:Token() =~# '^else$\|^do$' elseif s:Token() =~# '^else$\|^do$'
return s:Pure('s:PreviousToken') != '.' return s:Pure('s:PreviousToken') != '.'
elseif strpart(getline('.'),col('.')-2,2) == '=>'
call cursor(0,col('.')-1)
return s:PreviousToken() != ')' || s:GetPair('(', ')', 'bW', s:skip_expr)
endif endif
return strpart(getline('.'),col('.')-2,2) == '=>'
endfunction endfunction
function s:DoWhile() function s:DoWhile()
@@ -291,9 +293,9 @@ endfunction
" encloses the entire context, 'cont' if whether a:firstline is a continued " encloses the entire context, 'cont' if whether a:firstline is a continued
" expression, which could have started in a braceless context " expression, which could have started in a braceless context
function s:IsContOne(cont) function s:IsContOne(cont)
let [l:num, b_l] = [b:js_cache[1] + !b:js_cache[1], 0] let [l:num, pind] = b:js_cache[1] ?
let pind = b:js_cache[1] ? indent(b:js_cache[1]) + s:sw() : 0 \ [b:js_cache[1], indent(b:js_cache[1]) + s:sw()] : [1,0]
let ind = indent('.') + !a:cont let [ind, b_l] = [indent('.') + !a:cont, 0]
while line('.') > l:num && ind > pind || line('.') == l:num while line('.') > l:num && ind > pind || line('.') == l:num
if indent('.') < ind && s:OneScope() if indent('.') < ind && s:OneScope()
let b_l += 1 let b_l += 1
@@ -311,8 +313,8 @@ function s:IsContOne(cont)
endfunction endfunction
function s:IsSwitch() function s:IsSwitch()
call call('cursor',b:js_cache[1:]) return search(printf('\m\C\%%%dl\%%%dc%s',b:js_cache[1],b:js_cache[2],
return search('\m\C\%#.\_s*\%(\%(\/\/.*\_$\|\/\*\_.\{-}\*\/\)\@>\_s*\)*\%(case\|default\)\>','nWc'.s:z) \ '{\_s*\%(\%(\/\/.*\_$\|\/\*\_.\{-}\*\/\)\@>\_s*\)*\%(case\|default\)\>'),'nW'.s:z)
endfunction endfunction
" https://github.com/sweet-js/sweet.js/wiki/design#give-lookbehind-to-the-reader " https://github.com/sweet-js/sweet.js/wiki/design#give-lookbehind-to-the-reader
@@ -352,28 +354,26 @@ function GetJavascriptIndent()
" start with strings,comments,etc. " start with strings,comments,etc.
if s:stack[-1] =~? 'comment\|doc' if s:stack[-1] =~? 'comment\|doc'
if l:line =~ '^\s*\*' if l:line !~ '^\s*\/[/*]'
return cindent(v:lnum) return l:line =~ '^\s*\*' ? cindent(v:lnum) : -1
elseif l:line !~ '^\s*\/[/*]'
return -1
endif endif
elseif s:stack[-1] =~? b:syng_str elseif s:stack[-1] =~? b:syng_str
if b:js_cache[0] == v:lnum - 1 && s:Balanced(v:lnum-1) if b:js_cache[0] == v:lnum - 1 && s:Balanced(v:lnum-1,getline(v:lnum-1))
let b:js_cache[0] = v:lnum let b:js_cache[0] = v:lnum
endif endif
return -1 return -1
endif endif
let s:l1 = max([0,prevnonblank(v:lnum) - (s:rel ? 2000 : 1000), let nest = get(get(b:,'hi_indent',{}),'blocklnr')
\ get(get(b:,'hi_indent',{}),'blocklnr')]) let s:l1 = max([0, prevnonblank(v:lnum) - (s:rel ? 2000 : 1000), nest])
call cursor(v:lnum,1) call cursor(v:lnum,1)
if s:PreviousToken() is '' if s:PreviousToken() is ''
return return
endif endif
let [l:lnum, pline] = [line('.'), getline('.')[:col('.')-1]] let [l:lnum, lcol, pline] = getpos('.')[1:2] + [getline('.')[:col('.')-1]]
let l:line = substitute(l:line,'^\s*','','') let l:line = substitute(l:line,'^\s*','','')
let l:line_raw = l:line let l:line_s = l:line[0]
if l:line[:1] == '/*' if l:line[:1] == '/*'
let l:line = substitute(l:line,'^\%(\/\*.\{-}\*\/\s*\)*','','') let l:line = substitute(l:line,'^\%(\/\*.\{-}\*\/\s*\)*','','')
endif endif
@@ -385,7 +385,7 @@ function GetJavascriptIndent()
call cursor(v:lnum,1) call cursor(v:lnum,1)
let idx = index([']',')','}'],l:line[0]) let idx = index([']',')','}'],l:line[0])
if b:js_cache[0] > l:lnum && b:js_cache[0] < v:lnum || if b:js_cache[0] > l:lnum && b:js_cache[0] < v:lnum ||
\ b:js_cache[0] == l:lnum && s:Balanced(l:lnum) \ b:js_cache[0] == l:lnum && s:Balanced(l:lnum,pline)
call call('cursor',b:js_cache[1:]) call call('cursor',b:js_cache[1:])
else else
let [s:looksyn, s:top_col, s:check_in, s:l1] = [v:lnum - 1,0,0, let [s:looksyn, s:top_col, s:check_in, s:l1] = [v:lnum - 1,0,0,
@@ -423,7 +423,7 @@ function GetJavascriptIndent()
endif endif
endif endif
if idx == -1 && pline[-1:] !~ '[{;]' if idx == -1 && pline[-1:] !~ '[{;]'
call cursor(l:lnum, len(pline)) call cursor(l:lnum, lcol)
let sol = matchstr(l:line,s:opfirst) let sol = matchstr(l:line,s:opfirst)
if sol is '' || sol == '/' && s:SynAt(v:lnum, if sol is '' || sol == '/' && s:SynAt(v:lnum,
\ 1 + len(getline(v:lnum)) - len(l:line)) =~? 'regex' \ 1 + len(getline(v:lnum)) - len(l:line)) =~? 'regex'
@@ -439,14 +439,15 @@ function GetJavascriptIndent()
else else
let is_op = s:sw() let is_op = s:sw()
endif endif
call cursor(l:lnum, len(pline)) call cursor(l:lnum, lcol)
let b_l = s:Nat(s:IsContOne(is_op) - (!is_op && l:line =~ '^{')) * s:sw() let b_l = s:Nat(s:IsContOne(is_op) - (!is_op && l:line =~ '^{')) * s:sw()
endif endif
elseif idx.s:LookingAt().&cino =~ '^-1(.*(' && (search('\m\S','nbW',num) || s:ParseCino('U')) elseif idx == -1 && s:LookingAt() == '(' && &cino =~ '(' &&
\ (search('\m\S','nbW',num) || s:ParseCino('U'))
let pval = s:ParseCino('(') let pval = s:ParseCino('(')
if !pval if !pval
let [Wval, vcol] = [s:ParseCino('W'), virtcol('.')] let [Wval, vcol] = [s:ParseCino('W'), virtcol('.')]
if search('\m\S','W',num) if search('\m'.get(g:,'javascript_indent_W_pat','\S'),'W',num)
return s:ParseCino('w') ? vcol : virtcol('.')-1 return s:ParseCino('w') ? vcol : virtcol('.')-1
endif endif
return Wval ? s:Nat(num_ind + Wval) : vcol return Wval ? s:Nat(num_ind + Wval) : vcol
@@ -456,7 +457,7 @@ function GetJavascriptIndent()
" main return " main return
if l:line =~ '^[])}]\|^|}' if l:line =~ '^[])}]\|^|}'
if l:line_raw[0] == ')' if l:line_s == ')'
if s:ParseCino('M') if s:ParseCino('M')
return indent(l:lnum) return indent(l:lnum)
elseif num && &cino =~# 'm' && !s:ParseCino('m') elseif num && &cino =~# 'm' && !s:ParseCino('m')
@@ -466,6 +467,8 @@ function GetJavascriptIndent()
return num_ind return num_ind
elseif num elseif num
return s:Nat(num_ind + get(l:,'case_offset',s:sw()) + l:switch_offset + b_l + is_op) return s:Nat(num_ind + get(l:,'case_offset',s:sw()) + l:switch_offset + b_l + is_op)
elseif nest
return indent(nextnonblank(nest+1)) + b_l + is_op
endif endif
return b_l + is_op return b_l + is_op
endfunction endfunction

View File

@@ -3,13 +3,13 @@ if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'julia') == -1
" Vim indent file " Vim indent file
" Language: Julia " Language: Julia
" Maintainer: Carlo Baldassi <carlobaldassi@gmail.com> " Maintainer: Carlo Baldassi <carlobaldassi@gmail.com>
" Last Change: 2011 dec 11 " Last Change: 2016 jun 16
" Notes: based on Bram Moneaar's indent file for vim " Notes: originally based on Bram Molenaar's indent file for vim
setlocal autoindent setlocal autoindent
setlocal indentexpr=GetJuliaIndent() setlocal indentexpr=GetJuliaIndent()
setlocal indentkeys+==end,=else,=catch,=finally setlocal indentkeys+==end,=else,=catch,=finally,),],}
setlocal indentkeys-=0# setlocal indentkeys-=0#
setlocal indentkeys-=: setlocal indentkeys-=:
setlocal indentkeys-=0{ setlocal indentkeys-=0{
@@ -21,15 +21,19 @@ if exists("*GetJuliaIndent")
finish finish
endif endif
let s:skipPatterns = '\<julia\%(Comment\)\>' let s:skipPatterns = '\<julia\%(Comprehension\%(For\|If\)\|RangeEnd\|Comment[LM]\|\%([bsv]\|ip\|big\|MIME\|Shell\|Printf\|Doc\)\=String\|RegEx\|SymbolS\?\)\>'
function JuliaMatch(lnum, str, regex, st) function JuliaMatch(lnum, str, regex, st, ...)
let s = a:st let s = a:st
let e = a:0 > 0 ? a:1 : -1
while 1 while 1
let f = match(a:str, a:regex, s) let f = match(a:str, '\C' . a:regex, s)
if e >= 0 && f >= e
return -1
endif
if f >= 0 if f >= 0
let attr = synIDattr(synID(a:lnum,f+1,1),"name") let attr = synIDattr(synID(a:lnum,f+1,1),"name")
if attr =~ s:skipPatterns if attr =~# s:skipPatterns
let s = f+1 let s = f+1
continue continue
endif endif
@@ -39,15 +43,16 @@ function JuliaMatch(lnum, str, regex, st)
return f return f
endfunction endfunction
function GetJuliaNestingStruct(lnum) function GetJuliaNestingStruct(lnum, ...)
" Auxiliary function to inspect the block structure of a line " Auxiliary function to inspect the block structure of a line
let line = getline(a:lnum) let line = getline(a:lnum)
let s = 0 let s = a:0 > 0 ? a:1 : 0
let e = a:0 > 1 ? a:2 : -1
let blocks_stack = [] let blocks_stack = []
let num_closed_blocks = 0 let num_closed_blocks = 0
while 1 while 1
let fb = JuliaMatch(a:lnum, line, '@\@<!\<\%(if\|else\%(if\)\=\|while\|for\|try\|catch\|finally\|function\|macro\|begin\|type\|immutable\|let\|\%(bare\)\?module\|quote\|do\)\>', s) let fb = JuliaMatch(a:lnum, line, '@\@<!\<\%(if\|else\%(if\)\=\|while\|for\|try\|catch\|finally\|\%(staged\)\?function\|macro\|begin\|mutable\s\+struct\|\%(mutable\s\+\)\@<!struct\|\%(abstract\|primitive\)\s\+type\|\%(\%(abstract\|primitive\)\s\+\)\@<!type\|immutable\|let\|\%(bare\)\?module\|quote\|do\)\>', s, e)
let fe = JuliaMatch(a:lnum, line, '@\@<!\<end\>', s) let fe = JuliaMatch(a:lnum, line, '@\@<!\<end\>', s, e)
if fb < 0 && fe < 0 if fb < 0 && fe < 0
" No blocks found " No blocks found
@@ -79,7 +84,7 @@ function GetJuliaNestingStruct(lnum)
let i = JuliaMatch(a:lnum, line, '@\@<!\<else\>', s) let i = JuliaMatch(a:lnum, line, '@\@<!\<else\>', s)
if i >= 0 && i == fb if i >= 0 && i == fb
let s = i+1 let s = i+1
if len(blocks_stack) > 0 && blocks_stack[-1] =~ '\<\%(else\)\=if\>' if len(blocks_stack) > 0 && blocks_stack[-1] =~# '\<\%(else\)\=if\>'
let blocks_stack[-1] = 'else' let blocks_stack[-1] = 'else'
else else
call add(blocks_stack, 'else') call add(blocks_stack, 'else')
@@ -128,9 +133,13 @@ function GetJuliaNestingStruct(lnum)
continue continue
endif endif
let i = JuliaMatch(a:lnum, line, '@\@<!\<\%(while\|for\|function\|macro\|begin\|type\|immutable\|let\|quote\|do\)\>', s) let i = JuliaMatch(a:lnum, line, '@\@<!\<\%(while\|for\|\%(staged\)\?function\|macro\|begin\|\%(mutable\s\+\)\?struct\|\%(\%(abstract\|primitive\)\s\+\)\?type\|immutable\|let\|quote\|do\)\>', s)
if i >= 0 && i == fb if i >= 0 && i == fb
let s = i+1 if match(line, '\C\<\%(mutable\|abstract\|primitive\)', i) != -1
let s = i+11
else
let s = i+1
endif
call add(blocks_stack, 'other') call add(blocks_stack, 'other')
continue continue
endif endif
@@ -158,33 +167,212 @@ function GetJuliaNestingStruct(lnum)
return [num_open_blocks, num_closed_blocks] return [num_open_blocks, num_closed_blocks]
endfunction endfunction
function GetJuliaIndent() function GetJuliaNestingBrackets(lnum, c)
let s:save_ignorecase = &ignorecase " Auxiliary function to inspect the brackets structure of a line
set noignorecase let line = getline(a:lnum)[0 : (a:c - 1)]
let s = 0
let brackets_stack = []
let last_closed_bracket = -1
while 1
let fb = JuliaMatch(a:lnum, line, '[([{]', s)
let fe = JuliaMatch(a:lnum, line, '[])}]', s)
if fb < 0 && fe < 0
" No brackets found
break
end
if fb >= 0 && (fb < fe || fe < 0)
" The first occurrence is an opening bracket
let i = JuliaMatch(a:lnum, line, '(', s)
if i >= 0 && i == fb
let s = i+1
call add(brackets_stack, ['par',i])
continue
endif
let i = JuliaMatch(a:lnum, line, '\[', s)
if i >= 0 && i == fb
let s = i+1
call add(brackets_stack, ['sqbra',i])
continue
endif
let i = JuliaMatch(a:lnum, line, '{', s)
if i >= 0 && i == fb
let s = i+1
call add(brackets_stack, ['curbra',i])
continue
endif
" Note: it should be impossible to get here
break
else
" The first occurrence is a closing bracket
let i = JuliaMatch(a:lnum, line, ')', s)
if i >= 0 && i == fe
let s = i+1
if len(brackets_stack) > 0 && brackets_stack[-1][0] == 'par'
call remove(brackets_stack, -1)
else
let last_closed_bracket = i + 1
endif
continue
endif
let i = JuliaMatch(a:lnum, line, ']', s)
if i >= 0 && i == fe
let s = i+1
if len(brackets_stack) > 0 && brackets_stack[-1][0] == 'sqbra'
call remove(brackets_stack, -1)
else
let last_closed_bracket = i + 1
endif
continue
endif
let i = JuliaMatch(a:lnum, line, '}', s)
if i >= 0 && i == fe
let s = i+1
if len(brackets_stack) > 0 && brackets_stack[-1][0] == 'curbra'
call remove(brackets_stack, -1)
else
let last_closed_bracket = i + 1
endif
continue
endif
" Note: it should be impossible to get here
break
endif
" Note: it should be impossible to get here
break
endwhile
let first_open_bracket = -1
let last_open_bracket = -1
if len(brackets_stack) > 0
let first_open_bracket = brackets_stack[0][1]
let last_open_bracket = brackets_stack[-1][1]
endif
return [first_open_bracket, last_open_bracket, last_closed_bracket]
endfunction
let s:bracketBlocks = '\<julia\%(\%(\%(Printf\)\?Par\|SqBra\|CurBra\)Block\|ParBlockInRange\|StringVars\%(Par\|SqBra\|CurBra\)\|Dollar\%(Par\|SqBra\)\|QuotedParBlockS\?\)\>'
function IsInBrackets(lnum, c)
let stack = map(synstack(a:lnum, a:c), 'synIDattr(v:val, "name")')
call filter(stack, 'v:val =~# s:bracketBlocks')
return len(stack) > 0
endfunction
" Auxiliary function to find a line which does not start in the middle of a
" multiline bracketed expression, to be used as reference for block
" indentation.
function LastBlockIndent(lnum)
let lnum = a:lnum
let ind = 0
while lnum > 0
let ind = indent(lnum)
if ind == 0
return [lnum, 0]
endif
if !IsInBrackets(lnum, 1)
break
endif
let lnum = prevnonblank(lnum - 1)
endwhile
return [max([lnum,1]), ind]
endfunction
function GetJuliaIndent()
" Find a non-blank line above the current line. " Find a non-blank line above the current line.
let lnum = prevnonblank(v:lnum - 1) let lnum = prevnonblank(v:lnum - 1)
" At the start of the file use zero indent. " At the start of the file use zero indent.
if lnum == 0 if lnum == 0
let &ignorecase = s:save_ignorecase
unlet s:save_ignorecase
return 0 return 0
endif endif
let ind = indent(lnum) let ind = -1
let st = -1
let lim = -1
" Analyse previous line " Multiline bracketed expressions take precedence
let [num_open_blocks, num_closed_blocks] = GetJuliaNestingStruct(lnum) let c = len(getline(lnum)) + 1
while IsInBrackets(lnum, c)
let [first_open_bracket, last_open_bracket, last_closed_bracket] = GetJuliaNestingBrackets(lnum, c)
" First scenario: the previous line has a hanging open bracket:
" set the indentation to match the opening bracket (plus an extra space)
if last_open_bracket != -1
let st = last_open_bracket
let ind = virtcol([lnum, st + 1])
" Second scenario: some multiline bracketed expression was closed in the
" previous line. But since we know we are still in a bracketed expression,
" we need to find the line where the bracket was open
elseif last_closed_bracket != -1 " && exists("loaded_matchit")
" we use the % command to skip back (this is buggy without matchit, and
" is potentially a disaster if % got remapped)
call cursor(lnum, last_closed_bracket)
normal %
if line(".") == lnum
" something wrong here, give up
let ind = indent(lnum)
else
let lnum = line(".")
let c = col(".") - 1
if c == 0
" uhm, give up
let ind = 0
else
" we skipped a bracket set, keep searching for an opening bracket
let lim = c
continue
endif
endif
" Third scenario: nothing special, or matchit not available: keep the indentation
else
let ind = indent(lnum)
endif
" In case the current line starts with a closing bracket, we align it with
" the opening one.
if JuliaMatch(v:lnum, getline(v:lnum), '[])}]', indent(v:lnum)) == indent(v:lnum) && ind > 0
return ind - 1
endif
break
endwhile
if ind == -1
" We are not in a multiline bracketed expression. Thus we look for a
" previous line to use as a reference
let [lnum,ind] = LastBlockIndent(lnum)
let c = len(getline(lnum)) + 1
if IsInBrackets(lnum, c)
let [first_open_bracket, last_open_bracket, last_closed_bracket] = GetJuliaNestingBrackets(lnum, c)
let lim = first_open_bracket
endif
end
" Analyse the reference line
let [num_open_blocks, num_closed_blocks] = GetJuliaNestingStruct(lnum, st, lim)
" Increase indentation for each newly opened block " Increase indentation for each newly opened block
" in the previous line " in the reference line
while num_open_blocks > 0 while num_open_blocks > 0
let ind += &sw let ind += &sw
let num_open_blocks -= 1 let num_open_blocks -= 1
endwhile endwhile
" Analyse current line " Analyse the current line
let [num_open_blocks, num_closed_blocks] = GetJuliaNestingStruct(v:lnum) let [num_open_blocks, num_closed_blocks] = GetJuliaNestingStruct(v:lnum)
" Decrease indentation for each closed block " Decrease indentation for each closed block
@@ -194,8 +382,6 @@ function GetJuliaIndent()
let num_closed_blocks -= 1 let num_closed_blocks -= 1
endwhile endwhile
let &ignorecase = s:save_ignorecase
unlet s:save_ignorecase
return ind return ind
endfunction endfunction

79
indent/markdown.vim Normal file
View File

@@ -0,0 +1,79 @@
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'markdown') == -1
if exists("b:did_indent") | finish | endif
let b:did_indent = 1
setlocal indentexpr=GetMarkdownIndent()
setlocal nolisp
setlocal autoindent
" Automatically insert bullets
setlocal formatoptions+=r
" Do not automatically insert bullets when auto-wrapping with text-width
setlocal formatoptions-=c
" Accept various markers as bullets
setlocal comments=b:*,b:+,b:-
" Automatically continue blockquote on line break
setlocal comments+=b:>
" Only define the function once
if exists("*GetMarkdownIndent") | finish | endif
function! s:IsMkdCode(lnum)
let name = synIDattr(synID(a:lnum, 1, 0), 'name')
return (name =~ '^mkd\%(Code$\|Snippet\)' || name != '' && name !~ '^\%(mkd\|html\)')
endfunction
function! s:IsLiStart(line)
return a:line !~ '^ *\([*-]\)\%( *\1\)\{2}\%( \|\1\)*$' &&
\ a:line =~ '^\s*[*+-] \+'
endfunction
function! s:IsHeaderLine(line)
return a:line =~ '^\s*#'
endfunction
function! s:IsBlankLine(line)
return a:line =~ '^$'
endfunction
function! s:PrevNonBlank(lnum)
let i = a:lnum
while i > 1 && s:IsBlankLine(getline(i))
let i -= 1
endwhile
return i
endfunction
function GetMarkdownIndent()
if v:lnum > 2 && s:IsBlankLine(getline(v:lnum - 1)) && s:IsBlankLine(getline(v:lnum - 2))
return 0
endif
let list_ind = get(g:, "vim_markdown_new_list_item_indent", 4)
" Find a non-blank line above the current line.
let lnum = s:PrevNonBlank(v:lnum - 1)
" At the start of the file use zero indent.
if lnum == 0 | return 0 | endif
let ind = indent(lnum)
let line = getline(lnum) " Last line
let cline = getline(v:lnum) " Current line
if s:IsLiStart(cline)
" Current line is the first line of a list item, do not change indent
return indent(v:lnum)
elseif s:IsHeaderLine(cline) && !s:IsMkdCode(v:lnum)
" Current line is the header, do not indent
return 0
elseif s:IsLiStart(line)
if s:IsMkdCode(lnum)
return ind
else
" Last line is the first line of a list item, increase indent
return ind + list_ind
end
else
return ind
endif
endfunction
endif

View File

@@ -33,6 +33,12 @@ function! GetNixIndent()
return 0 return 0
endif endif
" Skip indentation for single line comments explicitly, in case a
" comment was just inserted (eg. visual block mode)
if getline(v:lnum) =~ '^\s*#'
return indent(v:lnum)
endif
if synIDattr(synID(v:lnum, 1, 1), "name") !~ s:skip_syntax if synIDattr(synID(v:lnum, 1, 1), "name") !~ s:skip_syntax
let current_line = getline(v:lnum) let current_line = getline(v:lnum)
let last_line = getline(lnum) let last_line = getline(lnum)
@@ -63,7 +69,7 @@ function! GetNixIndent()
let ind = indent(v:lnum) let ind = indent(v:lnum)
let bslnum = searchpair('''''', '', '''''', 'bnW', let bslnum = searchpair('''''', '', '''''', 'bnW',
\ 'synIDattr(synID(line("."), col("."), 0), "name") =~? "InterpolationSpecial$"') \ 'synIDattr(synID(line("."), col("."), 0), "name") =~? "StringSpecial$"')
if ind <= indent(bslnum) if ind <= indent(bslnum)
let ind = indent(bslnum) + &sw let ind = indent(bslnum) + &sw

View File

@@ -1,217 +1,433 @@
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'python') == -1 if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'python-ident') == -1
" PEP8 compatible Python indent file " PEP8 compatible Python indent file
" Language: Python
" Maintainer: Daniel Hahler <https://daniel.hahler.de/>
" Prev Maintainer: Hynek Schlawack <hs@ox.cx>
" Prev Maintainer: Eric Mc Sween <em@tomcom.de> (address invalid)
" Original Author: David Bustos <bustos@caltech.edu> (address invalid)
" License: CC0
"
" vim-python-pep8-indent - A nicer Python indentation style for vim.
" Written in 2004 by David Bustos <bustos@caltech.edu>
" Maintained from 2004-2005 by Eric Mc Sween <em@tomcom.de>
" Maintained from 2013 by Hynek Schlawack <hs@ox.cx>
" Maintained from 2017 by Daniel Hahler <https://daniel.hahler.de/>
"
" To the extent possible under law, the author(s) have dedicated all copyright
" and related and neighboring rights to this software to the public domain
" worldwide. This software is distributed without any warranty.
" You should have received a copy of the CC0 Public Domain Dedication along
" with this software. If not, see
" <http://creativecommons.org/publicdomain/zero/1.0/>.
" Only load this indent file when no other was loaded. " Only load this indent file when no other was loaded.
if exists("b:did_indent") if exists('b:did_indent')
finish finish
endif endif
let b:did_indent = 1 let b:did_indent = 1
setlocal expandtab
setlocal nolisp setlocal nolisp
setlocal autoindent setlocal autoindent
setlocal indentexpr=GetPythonPEPIndent(v:lnum) setlocal indentexpr=GetPythonPEPIndent(v:lnum)
setlocal indentkeys=!^F,o,O,<:>,0),0],0},=elif,=except setlocal indentkeys=!^F,o,O,<:>,0),0],0},=elif,=except
let s:maxoff = 50 if !exists('g:python_pep8_indent_multiline_string')
let g:python_pep8_indent_multiline_string = 0
endif
let s:block_rules = {
\ '^\s*elif\>': ['if', 'elif'],
\ '^\s*except\>': ['try', 'except'],
\ '^\s*finally\>': ['try', 'except', 'else']
\ }
let s:block_rules_multiple = {
\ '^\s*else\>': ['if', 'elif', 'for', 'try', 'except'],
\ }
" Pairs to look for when searching for opening parenthesis.
" The value is the maximum offset in lines.
let s:paren_pairs = {'()': 50, '[]': 100, '{}': 1000}
if &filetype ==# 'pyrex' || &filetype ==# 'cython'
let b:control_statement = '\v^\s*(class|def|if|while|with|for|except|cdef|cpdef)>'
else
let b:control_statement = '\v^\s*(class|def|if|while|with|for|except)>'
endif
let s:stop_statement = '^\s*\(break\|continue\|raise\|return\|pass\)\>'
" Skip strings and comments. Return 1 for chars to skip.
" jedi* refers to syntax definitions from jedi-vim for call signatures, which
" are inserted temporarily into the buffer.
let s:skip_special_chars = 'synIDattr(synID(line("."), col("."), 0), "name") ' .
\ '=~? "\\vstring|comment|jedi\\S"'
let s:skip_after_opening_paren = 'synIDattr(synID(line("."), col("."), 0), "name") ' .
\ '=~? "\\vcomment|jedi\\S"'
" Also ignore anything concealed.
" Wrapper around synconcealed for older Vim (7.3.429, used on Travis CI).
function! s:is_concealed(line, col)
let concealed = synconcealed(a:line, a:col)
return len(concealed) && concealed[0]
endfunction
if has('conceal')
let s:skip_special_chars .= '|| s:is_concealed(line("."), col("."))'
endif
let s:skip_search = 'synIDattr(synID(line("."), col("."), 0), "name") ' .
\ '=~? "comment"'
" Use 'shiftwidth()' instead of '&sw'.
" (Since Vim patch 7.3.629, 'shiftwidth' can be set to 0 to follow 'tabstop').
if exists('*shiftwidth')
function! s:sw()
return shiftwidth()
endfunction
else
function! s:sw()
return &shiftwidth
endfunction
endif
function! s:pair_sort(x, y)
if a:x[0] == a:y[0]
return a:x[1] == a:y[1] ? 0 : a:x[1] > a:y[1] ? 1 : -1
else
return a:x[0] > a:y[0] ? 1 : -1
endif
endfunction
" Find backwards the closest open parenthesis/bracket/brace. " Find backwards the closest open parenthesis/bracket/brace.
function! s:SearchParensPair() function! s:find_opening_paren(...)
let line = line('.') " optional arguments: line and column (defaults to 1) to search around
let col = col('.') if a:0 > 0
let view = winsaveview()
call cursor(a:1, a:0 > 1 ? a:2 : 1)
let ret = s:find_opening_paren()
call winrestview(view)
return ret
endif
" Skip strings and comments and don't look too far " Return if cursor is in a comment.
let skip = "line('.') < " . (line - s:maxoff) . " ? dummy :" . exe 'if' s:skip_search '| return [0, 0] | endif'
\ 'synIDattr(synID(line("."), col("."), 0), "name") =~? ' .
\ '"string\\|comment"'
" Search for parentheses let nearest = [0, 0]
call cursor(line, col) for [p, maxoff] in items(s:paren_pairs)
let parlnum = searchpair('(', '', ')', 'bW', skip) let stopline = max([0, line('.') - maxoff, nearest[0]])
let parcol = col('.') let next = searchpairpos(
\ '\V'.p[0], '', '\V'.p[1], 'bnW', s:skip_special_chars, stopline)
" Search for brackets if next[0] && (next[0] > nearest[0] || (next[0] == nearest[0] && next[1] > nearest[1]))
call cursor(line, col) let nearest = next
let par2lnum = searchpair('\[', '', '\]', 'bW', skip) endif
let par2col = col('.') endfor
return nearest
" Search for braces
call cursor(line, col)
let par3lnum = searchpair('{', '', '}', 'bW', skip)
let par3col = col('.')
" Get the closest match
if par2lnum > parlnum || (par2lnum == parlnum && par2col > parcol)
let parlnum = par2lnum
let parcol = par2col
endif
if par3lnum > parlnum || (par3lnum == parlnum && par3col > parcol)
let parlnum = par3lnum
let parcol = par3col
endif
" Put the cursor on the match
if parlnum > 0
call cursor(parlnum, parcol)
endif
return parlnum
endfunction endfunction
" Find the start of a multi-line statement " Find the start of a multi-line statement
function! s:StatementStart(lnum) function! s:find_start_of_multiline_statement(lnum)
let lnum = a:lnum let lnum = a:lnum
while 1 while lnum > 0
if getline(lnum - 1) =~ '\\$' if getline(lnum - 1) =~# '\\$'
let lnum = lnum - 1 let lnum = prevnonblank(lnum - 1)
else else
call cursor(lnum, 1) let [paren_lnum, _] = s:find_opening_paren(lnum)
let maybe_lnum = s:SearchParensPair() if paren_lnum < 1
if maybe_lnum < 1 return lnum
return lnum else
else let lnum = paren_lnum
let lnum = maybe_lnum endif
endif endif
endif endwhile
endwhile
endfunction endfunction
" Find the block starter that matches the current line " Find possible indent(s) of the block starter that matches the current line.
function! s:BlockStarter(lnum, block_start_re) function! s:find_start_of_block(lnum, types, multiple)
let lnum = a:lnum let r = []
let maxindent = 10000 " whatever let types = copy(a:types)
while lnum > 1 let re = '\V\^\s\*\('.join(a:types, '\|').'\)\>'
let lnum = prevnonblank(lnum - 1) let lnum = a:lnum
if indent(lnum) < maxindent let last_indent = indent(lnum) + 1
if getline(lnum) =~ a:block_start_re while lnum > 0 && last_indent > 0
return lnum let indent = indent(lnum)
else if indent < last_indent
let maxindent = indent(lnum) for type in types
" It's not worth going further if we reached the top level let re = '\v^\s*'.type.'>'
if maxindent == 0 if getline(lnum) =~# re
return -1 if !a:multiple
return [indent]
endif
if index(r, indent) == -1
let r += [indent]
endif
" Remove any handled type, e.g. 'if'.
call remove(types, index(types, type))
endif
endfor
let last_indent = indent(lnum)
endif endif
endif let lnum = prevnonblank(lnum - 1)
endwhile
return r
endfunction
" Is "expr" true for every position in "lnum", beginning at "start"?
" (optionally up to a:1 / 4th argument)
function! s:match_expr_on_line(expr, lnum, start, ...)
let text = getline(a:lnum)
let end = a:0 ? a:1 : len(text)
if a:start > end
return 1
endif endif
endwhile let save_pos = getpos('.')
return -1 let r = 1
for i in range(a:start, end)
call cursor(a:lnum, i)
if !(eval(a:expr) || text[i-1] =~# '\s')
let r = 0
break
endif
endfor
call setpos('.', save_pos)
return r
endfunction
" Line up with open parenthesis/bracket/brace.
function! s:indent_like_opening_paren(lnum)
let [paren_lnum, paren_col] = s:find_opening_paren(a:lnum)
if paren_lnum <= 0
return -2
endif
let text = getline(paren_lnum)
let base = indent(paren_lnum)
let nothing_after_opening_paren = s:match_expr_on_line(
\ s:skip_after_opening_paren, paren_lnum, paren_col+1)
let starts_with_closing_paren = getline(a:lnum) =~# '^\s*[])}]'
if nothing_after_opening_paren
if starts_with_closing_paren
let res = base
else
let res = base + s:sw()
endif
else
" Indent to match position of opening paren.
let res = paren_col
endif
" If this line is the continuation of a control statement
" indent further to distinguish the continuation line
" from the next logical line.
if text =~# b:control_statement && res == base + s:sw()
return base + s:sw() * 2
else
return res
endif
endfunction
" Match indent of first block of this type.
function! s:indent_like_block(lnum)
let text = getline(a:lnum)
for [multiple, block_rules] in [
\ [0, s:block_rules],
\ [1, s:block_rules_multiple]]
for [line_re, blocks] in items(block_rules)
if text !~# line_re
continue
endif
let indents = s:find_start_of_block(a:lnum - 1, blocks, multiple)
if !len(indents)
return -1
endif
if len(indents) == 1
return indents[0]
endif
" Multiple valid indents, e.g. for 'else' with both try and if.
let indent = indent(a:lnum)
if index(indents, indent) != -1
" The indent is valid, keep it.
return indent
endif
" Fallback to the first/nearest one.
return indents[0]
endfor
endfor
return -2
endfunction
function! s:indent_like_previous_line(lnum)
let lnum = prevnonblank(a:lnum - 1)
" No previous line, keep current indent.
if lnum < 1
return -1
endif
let text = getline(lnum)
let start = s:find_start_of_multiline_statement(lnum)
let base = indent(start)
let current = indent(a:lnum)
" Jump to last character in previous line.
call cursor(lnum, len(text))
let ignore_last_char = eval(s:skip_special_chars)
" Search for final colon that is not inside something to be ignored.
while 1
let curpos = getpos('.')[2]
if curpos == 1 | break | endif
if eval(s:skip_special_chars) || text[curpos-1] =~# '\s'
normal! h
continue
elseif text[curpos-1] ==# ':'
return base + s:sw()
endif
break
endwhile
if text =~# '\\$' && !ignore_last_char
" If this line is the continuation of a control statement
" indent further to distinguish the continuation line
" from the next logical line.
if getline(start) =~# b:control_statement
return base + s:sw() * 2
endif
" Nest (other) explicit continuations only one level deeper.
return base + s:sw()
endif
let empty = getline(a:lnum) =~# '^\s*$'
" Current and prev line are empty, next is not -> indent like next.
if empty && a:lnum > 1 &&
\ (getline(a:lnum - 1) =~# '^\s*$') &&
\ !(getline(a:lnum + 1) =~# '^\s*$')
return indent(a:lnum + 1)
endif
" If the previous statement was a stop-execution statement or a pass
if getline(start) =~# s:stop_statement
" Remove one level of indentation if the user hasn't already dedented
if empty || current > base - s:sw()
return base - s:sw()
endif
" Otherwise, trust the user
return -1
endif
if !empty && s:is_dedented_already(current, base)
return -1
endif
" In all other cases, line up with the start of the previous statement.
return base
endfunction
" If this line is dedented and the number of indent spaces is valid
" (multiple of the indentation size), trust the user.
function! s:is_dedented_already(current, base)
let dedent_size = a:current - a:base
return (dedent_size < 0 && a:current % s:sw() == 0) ? 1 : 0
endfunction
" Is the syntax at lnum (and optionally cnum) a python string?
function! s:is_python_string(lnum, ...)
let line = getline(a:lnum)
let linelen = len(line)
if linelen < 1
let linelen = 1
endif
let cols = a:0 ? type(a:1) != type([]) ? [a:1] : a:1 : range(1, linelen)
for cnum in cols
if match(map(synstack(a:lnum, cnum),
\ "synIDattr(v:val, 'name')"), 'python\S*String') == -1
return 0
end
endfor
return 1
endfunction endfunction
function! GetPythonPEPIndent(lnum) function! GetPythonPEPIndent(lnum)
let scol = col('.') " First line has indent 0
if a:lnum == 1
" First line has indent 0 return 0
if a:lnum == 1
return 0
endif
" If we can find an open parenthesis/bracket/brace, line up with it.
call cursor(a:lnum, 1)
let parlnum = s:SearchParensPair()
if parlnum > 0
let parcol = col('.')
let matches = matchlist(getline(a:lnum), '^\(\s*\)[])}]')
if len(matches) == 0
let closing_paren = 0
let closing_paren_pos = 0
else
let closing_paren = 1
let closing_paren_pos = len(matches[1])
endif endif
if match(getline(parlnum), '[([{]\s*$', parcol - 1) != -1
if closing_paren let line = getline(a:lnum)
return indent(parlnum) let prevline = getline(a:lnum-1)
else
return indent(parlnum) + &shiftwidth " Multilinestrings: continous, docstring or starting.
endif if s:is_python_string(a:lnum-1, len(prevline))
elseif a:lnum - 1 != parlnum \ && (s:is_python_string(a:lnum, 1)
if closing_paren && closing_paren_pos > scol \ || match(line, '^\%("""\|''''''\)') != -1)
return indent(parlnum)
else " Indent closing quotes as the line with the opening ones.
let lastindent = match(getline(a:lnum - 1), '\S') let match_quotes = match(line, '^\s*\zs\%("""\|''''''\)')
if lastindent != -1 && lastindent < parcol if match_quotes != -1
return lastindent " closing multiline string
let quotes = line[match_quotes:(match_quotes+2)]
let pairpos = searchpairpos(quotes, '', quotes, 'b')
if pairpos[0] != 0
return indent(pairpos[0])
else
" TODO: test to cover this!
endif
endif endif
endif
if s:is_python_string(a:lnum-1)
" Previous line is (completely) a string.
return indent(a:lnum-1)
endif
if match(prevline, '^\s*\%("""\|''''''\)') != -1
" docstring.
return indent(a:lnum-1)
endif
let indent_multi = get(b:, 'python_pep8_indent_multiline_string',
\ get(g:, 'python_pep8_indent_multiline_string', 0))
if match(prevline, '\v%("""|'''''')$') != -1
" Opening multiline string, started in previous line.
if (&autoindent && indent(a:lnum) == indent(a:lnum-1))
\ || match(line, '\v^\s+$') != -1
" <CR> with empty line or to split up 'foo("""bar' into
" 'foo("""' and 'bar'.
if indent_multi == -2
return indent(a:lnum-1) + s:sw()
endif
return indent_multi
endif
endif
" Keep existing indent.
if match(line, '\v^\s*\S') != -1
return -1
endif
if indent_multi != -2
return indent_multi
endif
return s:indent_like_opening_paren(a:lnum)
endif endif
" If we line up with an opening column there is a special case " Parens: If we can find an open parenthesis/bracket/brace, line up with it.
" we want to handle: a docstring as argument. In that case we let indent = s:indent_like_opening_paren(a:lnum)
" don't want to line up with the paren but with the statement if indent >= -1
" imagine foo(doc=""" as example return indent
echo getline(parlnum)
if match(getline(parlnum), '\("""\|' . "'''" . '\)\s*$') != -1
return indent(parlnum)
endif endif
return parcol " Blocks: Match indent of first block of this type.
endif let indent = s:indent_like_block(a:lnum)
if indent >= -1
" Examine this line return indent
let thisline = getline(a:lnum)
let thisindent = indent(a:lnum)
" If the line starts with 'elif' or 'else', line up with 'if' or 'elif'
if thisline =~ '^\s*\(elif\|else\)\>'
let bslnum = s:BlockStarter(a:lnum, '^\s*\(if\|elif\)\>')
if bslnum > 0
return indent(bslnum)
else
return -1
endif endif
endif
" If the line starts with 'except' or 'finally', line up with 'try' return s:indent_like_previous_line(a:lnum)
" or 'except'
if thisline =~ '^\s*\(except\|finally\)\>'
let bslnum = s:BlockStarter(a:lnum, '^\s*\(try\|except\)\>')
if bslnum > 0
return indent(bslnum)
else
return -1
endif
endif
" Examine previous line
let plnum = a:lnum - 1
let pline = getline(plnum)
let sslnum = s:StatementStart(plnum)
" If the previous line is blank, keep the same indentation
if pline =~ '^\s*$'
return -1
endif
" If this line is explicitly joined, try to find an indentation that looks
" good.
if pline =~ '\\$'
let compound_statement = '^\s*\(if\|while\|from\|import\|for\s.*\sin\|except\)\s*'
let maybe_indent = matchend(getline(sslnum), compound_statement)
if maybe_indent != -1
return maybe_indent
else
return indent(sslnum) + &sw * 2
endif
endif
" If the previous line ended with a colon and is not a comment, indent
" relative to statement start.
if pline =~ '^[^#]*:\s*\(#.*\)\?$'
return indent(sslnum) + &sw
endif
" If the previous line was a stop-execution statement or a pass
if getline(sslnum) =~ '^\s*\(break\|continue\|raise\|return\|pass\)\>'
" See if the user has already dedented
if indent(a:lnum) > indent(sslnum) - &sw
" If not, recommend one dedent
return indent(sslnum) - &sw
endif
" Otherwise, trust the user
return -1
endif
" In all other cases, line up with the start of the previous statement.
return indent(sslnum)
endfunction endfunction
endif endif

79
indent/slime.vim Normal file
View File

@@ -0,0 +1,79 @@
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'slime') == -1
" Vim indent file
" Language: Slime
if exists("b:did_indent")
finish
endif
runtime! indent/ruby.vim
unlet! b:did_indent
let b:did_indent = 1
setlocal autoindent sw=2 et
setlocal indentexpr=GetSlimeIndent()
setlocal indentkeys=o,O,*<Return>,},],0),!^F,=end,=else,=elsif,=rescue,=ensure,=when
" Only define the function once.
if exists("*GetSlimeIndent")
finish
endif
let s:attributes = '\%({.\{-\}}\|\[.\{-\}\]\)'
let s:tag = '\%([%.#][[:alnum:]_-]\+\|'.s:attributes.'\)*[<>]*'
if !exists('g:haml_self_closing_tags')
let g:haml_self_closing_tags = 'meta|link|img|hr|br'
endif
function! GetSlimeIndent()
let lnum = prevnonblank(v:lnum-1)
if lnum == 0
return 0
endif
let line = substitute(getline(lnum),'\s\+$','','')
let cline = substitute(substitute(getline(v:lnum),'\s\+$','',''),'^\s\+','','')
let lastcol = strlen(line)
let line = substitute(line,'^\s\+','','')
let indent = indent(lnum)
let cindent = indent(v:lnum)
if cline =~# '\v^-\s*%(elsif|else|when)>'
let indent = cindent < indent ? cindent : indent - &sw
endif
let increase = indent + &sw
if indent == indent(lnum)
let indent = cindent <= indent ? -1 : increase
endif
let group = synIDattr(synID(lnum,lastcol,1),'name')
if line =~ '^doctype'
return indent
elseif line =~ '^/\%(\[[^]]*\]\)\=$'
return increase
elseif line =~ '^[\.#]'
return increase
elseif line =~? '^div'
return increase
elseif group == 'hamlFilter'
return increase
elseif line =~ '^'.s:tag.'[&!]\=[=~-]\s*\%(\%(if\|else\|elsif\|unless\|case\|when\|while\|until\|for\|begin\|module\|class\|def\)\>\%(.*\<end\>\)\@!\|.*do\%(\s*|[^|]*|\)\=\s*$\)'
return increase
elseif line =~ '^'.s:tag.'[&!]\=[=~-].*,\s*$'
return increase
elseif line == '-#'
return increase
elseif group =~? '\v^(hamlSelfCloser)$' || line =~? '^\v('.g:haml_self_closing_tags.')>'
return indent
elseif group =~? '\v^(hamlTag|hamlAttributesDelimiter|hamlObjectDelimiter|hamlClass|hamlId|htmlTagName|htmlSpecialTagName)$'
return increase
elseif synIDattr(synID(v:lnum,1,1),'name') ==? 'hamlRubyFilter'
return GetRubyIndent()
else
return indent
endif
endfunction
" vim:set sw=2:
endif

View File

@@ -42,11 +42,15 @@ endfunction
function! s:IsExcludedFromIndentAtPosition(line, column) function! s:IsExcludedFromIndentAtPosition(line, column)
let name = s:SyntaxNameAtPosition(a:line, a:column) let name = s:SyntaxNameAtPosition(a:line, a:column)
return name ==# "swiftComment" || name ==# "swiftString" return s:IsSyntaxNameExcludedFromIndent(name)
endfunction endfunction
function! s:IsExcludedFromIndent() function! s:IsExcludedFromIndent()
return s:SyntaxName() ==# "swiftComment" || s:SyntaxName() ==# "swiftString" return s:IsSyntaxNameExcludedFromIndent(s:SyntaxName())
endfunction
function! s:IsSyntaxNameExcludedFromIndent(name)
return a:name ==# "swiftComment" || a:name ==# "swiftString" || a:name ==# "swiftInterpolatedWrapper" || a:name ==# "swiftMultilineInterpolatedWrapper" || a:name ==# "swiftMultilineString"
endfunction endfunction
function! s:IsCommentLine(lnum) function! s:IsCommentLine(lnum)
@@ -103,10 +107,10 @@ function! SwiftIndent(...)
return indent(openingSquare) + shiftwidth() return indent(openingSquare) + shiftwidth()
endif endif
if line =~ ":$" if line =~ ":$" && (line =~ '^\s*case\W' || line =~ '^\s*default\W')
let switch = search("switch", "bWn") let switch = search("switch", "bWn")
return indent(switch) return indent(switch)
elseif previous =~ ":$" elseif previous =~ ":$" && (previous =~ '^\s*case\W' || previous =~ '^\s*default\W')
return previousIndent + shiftwidth() return previousIndent + shiftwidth()
endif endif
@@ -133,12 +137,26 @@ function! SwiftIndent(...)
return previousIndent + shiftwidth() return previousIndent + shiftwidth()
elseif line =~ "}.*{" elseif line =~ "}.*{"
let openingBracket = searchpair("{", "", "}", "bWn", "s:IsExcludedFromIndent()") let openingBracket = searchpair("{", "", "}", "bWn", "s:IsExcludedFromIndent()")
let bracketLine = getline(openingBracket)
let numOpenParensBracketLine = s:NumberOfMatches("(", bracketLine, openingBracket)
let numCloseParensBracketLine = s:NumberOfMatches(")", bracketLine, openingBracket)
if numOpenParensBracketLine > numCloseParensBracketLine
let line = line(".")
let column = col(".")
call cursor(openingParen, column)
let openingParenCol = searchpairpos("(", "", ")", "bWn", "s:IsExcludedFromIndent()")[1]
call cursor(line, column)
return openingParenCol
endif
return indent(openingBracket) return indent(openingBracket)
elseif currentCloseBrackets > currentOpenBrackets elseif currentCloseBrackets > currentOpenBrackets
let column = col(".") let column = col(".")
call cursor(line("."), 1) let line = line(".")
call cursor(line, 1)
let openingBracket = searchpair("{", "", "}", "bWn", "s:IsExcludedFromIndent()") let openingBracket = searchpair("{", "", "}", "bWn", "s:IsExcludedFromIndent()")
call cursor(line("."), column) call cursor(line, column)
let bracketLine = getline(openingBracket) let bracketLine = getline(openingBracket)
@@ -151,8 +169,23 @@ function! SwiftIndent(...)
let openingParen = searchpair("(", "", ")", "bWn", "s:IsExcludedFromIndent()") let openingParen = searchpair("(", "", ")", "bWn", "s:IsExcludedFromIndent()")
call cursor(line, column) call cursor(line, column)
return indent(openingParen) return indent(openingParen)
elseif numOpenParensBracketLine > numCloseParensBracketLine
let line = line(".")
let column = col(".")
call cursor(openingParen, column)
let openingParenCol = searchpairpos("(", "", ")", "bWn", "s:IsExcludedFromIndent()")[1]
call cursor(line, column)
return openingParenCol
endif endif
return indent(openingBracket) return indent(openingBracket)
elseif line =~ '^\s*)$'
let line = line(".")
let column = col(".")
call cursor(line, 1)
let openingParen = searchpair("(", "", ")", "bWn", "s:IsExcludedFromIndent()")
call cursor(line, column)
return indent(openingParen)
else else
" - Current line is blank, and the user presses 'o' " - Current line is blank, and the user presses 'o'
return previousIndent return previousIndent
@@ -196,8 +229,19 @@ function! SwiftIndent(...)
return previousIndent + shiftwidth() return previousIndent + shiftwidth()
endif endif
let previousParen = match(previous, "(") let previousParen = match(previous, '\v\($')
return indent(previousParen) + shiftwidth() if previousParen != -1
return previousIndent + shiftwidth()
endif
let line = line(".")
let column = col(".")
call cursor(previousNum, col([previousNum, "$"]))
let previousParen = searchpairpos("(", "", ")", "cbWn", "s:IsExcludedFromIndent()")
call cursor(line, column)
" Match the last non escaped paren on the previous line
return previousParen[1]
endif endif
if numOpenBrackets > numCloseBrackets if numOpenBrackets > numCloseBrackets
@@ -206,7 +250,7 @@ function! SwiftIndent(...)
call cursor(previousNum, column) call cursor(previousNum, column)
let openingParen = searchpair("(", "", ")", "bWn", "s:IsExcludedFromIndent()") let openingParen = searchpair("(", "", ")", "bWn", "s:IsExcludedFromIndent()")
call cursor(line, column) call cursor(line, column)
return indent(openingParen) + shiftwidth() return openingParen + 1
endif endif
" - Previous line has close then open braces, indent previous + 1 'sw' " - Previous line has close then open braces, indent previous + 1 'sw'
@@ -226,11 +270,23 @@ function! SwiftIndent(...)
" - Line above has (unmatched) open paren, next line needs indent " - Line above has (unmatched) open paren, next line needs indent
if numOpenParens > 0 if numOpenParens > 0
let savePosition = getcurpos() let savePosition = getcurpos()
let lastColumnOfPreviousLine = col([previousNum, "$"]) - 1
" Must be at EOL because open paren has to be above (left of) the cursor " Must be at EOL because open paren has to be above (left of) the cursor
call cursor(previousNum, [previousNum, col("$")]) call cursor(previousNum, lastColumnOfPreviousLine)
let previousParen = searchpair("(", "", ")", "cbWn", "s:IsExcludedFromIndent()") let previousParen = searchpairpos("(", "", ")", "cbWn", "s:IsExcludedFromIndent()")[1]
" If the paren on the last line is the last character, indent the contents
" at shiftwidth + previous indent
if previousParen == lastColumnOfPreviousLine
return previousIndent + shiftwidth()
endif
" The previous line opens a closure and doesn't close it
if numOpenBrackets > numCloseBrackets
return previousParen + shiftwidth()
endif
call setpos(".", savePosition) call setpos(".", savePosition)
return indent(previousParen) + shiftwidth() return previousParen
endif endif
return cindent return cindent

View File

@@ -1,13 +1,13 @@
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'terraform') == -1 if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'terraform') == -1
" Only load this file if no other indent file was loaded
if exists("b:did_indent") if exists("b:did_indent")
finish finish
endif endif
let b:did_indent = 1 let b:did_indent = 1
setlocal nolisp setlocal nolisp
setlocal autoindent setlocal autoindent sw=2 ts=2
setlocal indentexpr=TerraformIndent(v:lnum) setlocal indentexpr=TerraformIndent(v:lnum)
setlocal indentkeys+=<:>,0=},0=) setlocal indentkeys+=<:>,0=},0=)
@@ -16,29 +16,30 @@ if exists("*TerraformIndent")
endif endif
function! TerraformIndent(lnum) function! TerraformIndent(lnum)
" previous non-blank line " Beginning of the file should have no indent
let prevlnum = prevnonblank(a:lnum-1) if a:lnum == 0
" beginning of file?
if prevlnum == 0
return 0 return 0
endif endif
" previous line without comments " Previous non-blank line should continue the indent level
let prevlnum = prevnonblank(a:lnum-1)
" Previous line without comments should continue the indent level
let prevline = substitute(getline(prevlnum), '//.*$', '', '') let prevline = substitute(getline(prevlnum), '//.*$', '', '')
let previndent = indent(prevlnum) let previndent = indent(prevlnum)
let thisindent = previndent let thisindent = previndent
" block open? " Config block starting with [ { ( should increase the indent level
if prevline =~ '[\[{\(]\s*$' if prevline =~ '[\[{\(]\s*$'
let thisindent += &sw let thisindent += &sw
endif endif
" current line without comments " Current line without comments should continue the indent level
let thisline = substitute(getline(a:lnum), '//.*$', '', '') let thisline = substitute(getline(a:lnum), '//.*$', '', '')
" block close? " Config block ending with ) } ] should get the indentation
if thisline =~ '^\s*[\)\]}]' " level from the initial config block
if thisline =~ '^\s*[\)}\]]'
let thisindent -= &sw let thisindent -= &sw
endif endif

View File

@@ -11,7 +11,7 @@ describe "My Vim plugin" do
extensions.each do |ext| extensions.each do |ext|
it "should parse #{ext} file" do it "should parse #{ext} file" do
Timeout::timeout(5) do Timeout::timeout(15) do
write_file "#{ext}", "" write_file "#{ext}", ""
vim.edit "#{ext}" vim.edit "#{ext}"
vim.insert "sample" vim.insert "sample"

View File

@@ -3,24 +3,125 @@ if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'jenkins') == -1
runtime syntax/groovy.vim runtime syntax/groovy.vim
syn keyword jenkinsfileBuiltInVariable currentBuild syn keyword jenkinsfileBuiltInVariable currentBuild
syn keyword jenkinsfileSection pipeline agent stages steps
syn keyword jenkinsfileDirective environment options parameters triggers stage tools input when
syn keyword jenkinsfileOption contained buildDiscarder disableConcurrentBuilds overrideIndexTriggers skipDefaultCheckout nextgroup=jenkinsfileOptionParams
syn keyword jenkinsfileOption contained skipStagesAfterUnstable checkoutToSubdirectory timeout retry timestamps nextgroup=jenkinsfileOptionParams
syn region jenkinsfileOptionParams contained start="(" end=")" transparent contains=@groovyTop
syn match jenkinsfileOptionO /[a-zA-Z]\+([^)]*)/ contains=jenkinsfileOption,jenkinsfileOptionParams transparent containedin=groovyParenT1
syn keyword jenkinsfileCoreStep checkout syn keyword jenkinsfileCoreStep checkout
syn keyword jenkinsfileCoreStep docker skipwhite nextgroup=jenkinsFileDockerConfigBlock
syn keyword jenkinsfileCoreStep node syn keyword jenkinsfileCoreStep node
syn keyword jenkinsfileCoreStep scm syn keyword jenkinsfileCoreStep scm
syn keyword jenkinsfileCoreStep sh syn keyword jenkinsfileCoreStep sh
syn keyword jenkinsfileCoreStep stage syn keyword jenkinsfileCoreStep stage
syn keyword jenkinsfileCoreStep parallel
syn keyword jenkinsfileCoreStep steps
syn keyword jenkinsfileCoreStep step syn keyword jenkinsfileCoreStep step
syn keyword jenkinsfileCoreStep tool syn keyword jenkinsfileCoreStep tool
syn keyword jenkinsfilePluginStep docker " TODO: These should probably be broken out.
syn keyword jenkinsfilePluginStep emailext syn keyword jenkinsfileCoreStep post always changed failure success unstable aborted
syn keyword jenkinsfilePluginStep exwsAllocate
syn keyword jenkinsfilePluginStep exws
syn keyword jenkinsfilePluginStep httpRequest
syn keyword jenkinsfilePluginStep junit
hi link jenkinsfileCoreStep Function syn region jenkinsFileDockerConfigBlock contained start="{" end="}" contains=groovyString,jenkinsfileDockerKeyword transparent
hi link jenkinsfilePluginStep Include syn keyword jenkinsFileDockerKeyword contained image args dockerfile additionalBuildArgs
hi link jenkinsfileBuiltInVariable Identifier
syn keyword jenkinsfilePipelineStep Applitools ArtifactoryGradleBuild Consul MavenDescriptorStep OneSky VersionNumber
syn keyword jenkinsfilePipelineStep ViolationsToBitbucketServer ViolationsToGitHub ViolationsToGitLab _OcAction _OcContextInit
syn keyword jenkinsfilePipelineStep _OcWatch acceptGitLabMR acsDeploy activateDTConfiguration addBadge addErrorBadge
syn keyword jenkinsfilePipelineStep addGitLabMRComment addInfoBadge addInteractivePromotion addShortText addWarningBadge
syn keyword jenkinsfilePipelineStep allure anchore androidApkMove androidApkUpload androidLint ansiColor ansiblePlaybook
syn keyword jenkinsfilePipelineStep ansibleTower ansibleVault appMonBuildEnvironment appMonPublishTestResults appMonRegisterTestRun
syn keyword jenkinsfilePipelineStep applatix approveReceivedEvent approveRequestedEvent aqua archive archiveArtifacts
syn keyword jenkinsfilePipelineStep arestocats artifactResolver artifactoryDistributeBuild artifactoryDownload artifactoryMavenBuild
syn keyword jenkinsfilePipelineStep artifactoryPromoteBuild artifactoryUpload awaitDeployment awaitDeploymentCompletion
syn keyword jenkinsfilePipelineStep awsCodeBuild awsIdentity azureCLI azureDownload azureFunctionAppPublish azureUpload
syn keyword jenkinsfilePipelineStep azureVMSSUpdate azureVMSSUpdateInstances azureWebAppPublish backlogPullRequest bat
syn keyword jenkinsfilePipelineStep bearychatSend benchmark bitbucketStatusNotify blazeMeterTest build buildBamboo buildImage
syn keyword jenkinsfilePipelineStep bzt cache catchError cbt cbtScreenshotsTest cbtSeleniumTest cfInvalidate cfnCreateChangeSet
syn keyword jenkinsfilePipelineStep cfnDelete cfnDeleteStackSet cfnDescribe cfnExecuteChangeSet cfnExports cfnUpdate
syn keyword jenkinsfilePipelineStep cfnUpdateStackSet cfnValidate changeAsmVer checkstyle chefSinatraStep cifsPublisher
syn keyword jenkinsfilePipelineStep cleanWs cleanup cloudshareDockerMachine cm cmake cmakeBuild cobertura codefreshLaunch
syn keyword jenkinsfilePipelineStep codefreshRun codescene codesonar collectEnv conanAddRemote conanAddUser configFileProvider
syn keyword jenkinsfilePipelineStep container containerLog contrastAgent contrastVerification copy copyArtifacts coverityResults
syn keyword jenkinsfilePipelineStep cpack createDeploymentEvent createEnvironment createEvent createMemoryDump createSummary
syn keyword jenkinsfilePipelineStep createThreadDump crxBuild crxDeploy crxDownload crxReplicate crxValidate ctest ctmInitiatePipeline
syn keyword jenkinsfilePipelineStep ctmPostPiData ctmSetPiData cucumber cucumberSlackSend currentNamespace debianPbuilder
syn keyword jenkinsfilePipelineStep deleteDir dependencyCheckAnalyzer dependencyCheckPublisher dependencyCheckUpdateOnly
syn keyword jenkinsfilePipelineStep dependencyTrackPublisher deployAPI deployArtifacts deployLambda dingding dir disk
syn keyword jenkinsfilePipelineStep dockerFingerprintFrom dockerFingerprintRun dockerNode dockerPullStep dockerPushStep
syn keyword jenkinsfilePipelineStep dockerPushWithProxyStep doktor downloadProgetPackage downstreamPublisher dropbox
syn keyword jenkinsfilePipelineStep dry ec2 ec2ShareAmi echo ecrLogin emailext emailextrecipients envVarsForTool error
syn keyword jenkinsfilePipelineStep evaluateGate eventSourceLambda executeCerberusCampaign exportPackages exportProjects
syn keyword jenkinsfilePipelineStep exws exwsAllocate figlet fileExists fileOperations findFiles findbugs fingerprint
syn keyword jenkinsfilePipelineStep flywayrunner ftp ftpPublisher gatlingArchive getArtifactoryServer getContext getLastChangesPublisher
syn keyword jenkinsfilePipelineStep git gitbisect githubNotify gitlabBuilds gitlabCommitStatus googleCloudBuild googleStorageDownload
syn keyword jenkinsfilePipelineStep googleStorageUpload gprbuild greet hipchatSend http httpRequest hub_detect hub_scan
syn keyword jenkinsfilePipelineStep hub_scan_failure hubotApprove hubotSend importPackages importProjects inNamespace
syn keyword jenkinsfilePipelineStep inSession initConanClient input invokeLambda isUnix ispwOperation ispwRegisterWebhook
syn keyword jenkinsfilePipelineStep ispwWaitForWebhook jacoco jdbc jiraAddComment jiraAddWatcher jiraAssignIssue jiraAssignableUserSearch
syn keyword jenkinsfilePipelineStep jiraComment jiraDeleteAttachment jiraDeleteIssueLink jiraDeleteIssueRemoteLink jiraDeleteIssueRemoteLinks
syn keyword jenkinsfilePipelineStep jiraDownloadAttachment jiraEditComment jiraEditComponent jiraEditIssue jiraEditVersion
syn keyword jenkinsfilePipelineStep jiraGetAttachmentInfo jiraGetComment jiraGetComments jiraGetComponent jiraGetComponentIssueCount
syn keyword jenkinsfilePipelineStep jiraGetFields jiraGetIssue jiraGetIssueLink jiraGetIssueLinkTypes jiraGetIssueRemoteLink
syn keyword jenkinsfilePipelineStep jiraGetIssueRemoteLinks jiraGetIssueTransitions jiraGetIssueWatches jiraGetProject
syn keyword jenkinsfilePipelineStep jiraGetProjectComponents jiraGetProjectStatuses jiraGetProjectVersions jiraGetProjects
syn keyword jenkinsfilePipelineStep jiraGetVersion jiraIssueSelector jiraJqlSearch jiraLinkIssues jiraNewComponent jiraNewIssue
syn keyword jenkinsfilePipelineStep jiraNewIssueRemoteLink jiraNewIssues jiraNewVersion jiraNotifyIssue jiraSearch jiraTransitionIssue
syn keyword jenkinsfilePipelineStep jiraUploadAttachment jiraUserSearch jmhReport jobDsl junit klocworkBuildSpecGeneration
syn keyword jenkinsfilePipelineStep klocworkIncremental klocworkIntegrationStep1 klocworkIntegrationStep2 klocworkIssueSync
syn keyword jenkinsfilePipelineStep klocworkQualityGateway klocworkWrapper kubernetesApply kubernetesDeploy lastChanges
syn keyword jenkinsfilePipelineStep library libraryResource liquibaseDbDoc liquibaseRollback liquibaseUpdate listAWSAccounts
syn keyword jenkinsfilePipelineStep livingDocs loadRunnerTest lock logstashSend mail marathon mattermostSend memoryMap
syn keyword jenkinsfilePipelineStep milestone mockLoad newArtifactoryServer newBuildInfo newGradleBuild newMavenBuild
syn keyword jenkinsfilePipelineStep nexusArtifactUploader nexusPolicyEvaluation nexusPublisher node nodejs nodesByLabel
syn keyword jenkinsfilePipelineStep notifyBitbucket notifyDeploymon notifyOTC nunit nvm octoPerfTest office365ConnectorSend
syn keyword jenkinsfilePipelineStep openTasks openshiftBuild openshiftCreateResource openshiftDeleteResourceByJsonYaml
syn keyword jenkinsfilePipelineStep openshiftDeleteResourceByKey openshiftDeleteResourceByLabels openshiftDeploy openshiftExec
syn keyword jenkinsfilePipelineStep openshiftImageStream openshiftScale openshiftTag openshiftVerifyBuild openshiftVerifyDeployment
syn keyword jenkinsfilePipelineStep openshiftVerifyService openstackMachine osfBuilderSuiteForSFCCDeploy p4 p4approve
syn keyword jenkinsfilePipelineStep p4publish p4sync p4tag p4unshelve pagerduty parasoftFindings pcBuild pdrone perfReport
syn keyword jenkinsfilePipelineStep perfSigReports perfpublisher plot pmd podTemplate powershell pragprog pretestedIntegrationPublisher
syn keyword jenkinsfilePipelineStep properties protecodesc publishATX publishBrakeman publishBuildInfo publishBuildRecord
syn keyword jenkinsfilePipelineStep publishConfluence publishDeployRecord publishETLogs publishEventQ publishGenerators
syn keyword jenkinsfilePipelineStep publishHTML publishLambda publishLastChanges publishSQResults publishStoplight publishTMS
syn keyword jenkinsfilePipelineStep publishTRF publishTestResult publishTraceAnalysis publishUNIT publishValgrind pullPerfSigReports
syn keyword jenkinsfilePipelineStep puppetCode puppetHiera puppetJob puppetQuery pushImage pushToCloudFoundry pwd pybat
syn keyword jenkinsfilePipelineStep pysh qc queryModuleBuildRequest questavrm r radargunreporting rancher readFile readJSON
syn keyword jenkinsfilePipelineStep readManifest readMavenPom readProperties readTrusted readXml readYaml realtimeJUnit
syn keyword jenkinsfilePipelineStep registerWebhook release resolveScm retry rocketSend rtp runConanCommand runFromAlmBuilder
syn keyword jenkinsfilePipelineStep runLoadRunnerScript runValgrind s3CopyArtifact s3Delete s3Download s3FindFiles s3Upload
syn keyword jenkinsfilePipelineStep salt sauce saucePublisher sauceconnect script selectRun sendCIMessage sendDeployableMessage
syn keyword jenkinsfilePipelineStep serviceNow_attachFile serviceNow_attachZip serviceNow_createChange serviceNow_getCTask
syn keyword jenkinsfilePipelineStep serviceNow_getChangeState serviceNow_updateChangeItem setAccountAlias setGerritReview
syn keyword jenkinsfilePipelineStep setGitHubPullRequestStatus sh sha1 signAndroidApks silkcentral silkcentralCollectResults
syn keyword jenkinsfilePipelineStep slackSend sleep sloccountPublish snsPublish snykSecurity sonarToGerrit sparkSend
syn keyword jenkinsfilePipelineStep splitTests springBoot sscm sseBuild sseBuildAndPublish sshPublisher sshagent stage
syn keyword jenkinsfilePipelineStep startET startSandbox startSession startTS stash step stepcounter stopET stopSandbox
syn keyword jenkinsfilePipelineStep stopSession stopTS submitJUnitTestResultsToqTest submitModuleBuildRequest svChangeModeStep
syn keyword jenkinsfilePipelineStep svDeployStep svExportStep svUndeployStep svn tagImage task teamconcert tee testFolder
syn keyword jenkinsfilePipelineStep testPackage testProject testiniumExecution themisRefresh themisReport throttle time
syn keyword jenkinsfilePipelineStep timeout timestamps tm tool touch triggerInputStep triggerJob typetalkSend uftScenarioLoad
syn keyword jenkinsfilePipelineStep unarchive unstash unzip updateBotPush updateGitlabCommitStatus updateIdP updateTrustPolicy
syn keyword jenkinsfilePipelineStep upload-pgyer uploadProgetPackage uploadToIncappticConnect vSphere validateDeclarativePipeline
syn keyword jenkinsfilePipelineStep vmanagerLaunch waitForCIMessage waitForJob waitForQualityGate waitForWebhook waitUntil
syn keyword jenkinsfilePipelineStep walk waptProReport warnings whitesource winRMClient withAWS withAnt withContext withCoverityEnv
syn keyword jenkinsfilePipelineStep withCredentials withDockerContainer withDockerRegistry withDockerServer withEnv withKafkaLog
syn keyword jenkinsfilePipelineStep withKubeConfig withMaven withNPM withPod withPythonEnv withSCM withSandbox withSonarQubeEnv
syn keyword jenkinsfilePipelineStep withTypetalk wrap writeFile writeJSON writeMavenPom writeProperties writeXml writeYaml
syn keyword jenkinsfilePipelineStep ws xUnitImporter xUnitUploader xldCreatePackage xldDeploy xldPublishPackage xlrCreateRelease
syn keyword jenkinsfilePipelineStep xrayScanBuild zip
hi link jenkinsfileSection Statement
hi link jenkinsfileDirective jenkinsfileSection
hi link jenkinsfileOption Function
hi link jenkinsfileCoreStep Function
hi link jenkinsfilePipelineStep Include
hi link jenkinsfileBuiltInVariable Identifier
hi link jenkinsFileDockerKeyword jenkinsfilePipelineStep
let b:current_syntax = "Jenkinsfile" let b:current_syntax = "Jenkinsfile"

View File

@@ -3,28 +3,23 @@ if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'ansible') == -1
" Vim syntax file " Vim syntax file
" Language: Ansible YAML/Jinja templates " Language: Ansible YAML/Jinja templates
" Maintainer: Dave Honneffer <pearofducks@gmail.com> " Maintainer: Dave Honneffer <pearofducks@gmail.com>
" Last Change: 2015.09.06 " Last Change: 2018.02.08
if exists("b:current_syntax")
finish
endif
if !exists("main_syntax") if !exists("main_syntax")
let main_syntax = 'yaml' let main_syntax = 'yaml'
endif endif
let b:current_syntax = '' if exists('b:current_syntax')
unlet b:current_syntax let s:current_syntax=b:current_syntax
runtime! syntax/yaml.vim unlet b:current_syntax
endif
let b:current_syntax = ''
unlet b:current_syntax
syntax include @Yaml syntax/yaml.vim
let b:current_syntax = ''
unlet b:current_syntax
syntax include @Jinja syntax/jinja2.vim syntax include @Jinja syntax/jinja2.vim
if exists('s:current_syntax')
let b:current_syntax=s:current_syntax
endif
" Jinja " Jinja
" ================================ " ================================
@@ -39,6 +34,12 @@ highlight link jinjaVarDelim Delimiter
" YAML " YAML
" ================================ " ================================
if exists("g:ansible_yamlKeyName")
let s:yamlKey = g:ansible_yamlKeyName
else
let s:yamlKey = "yamlBlockMappingKey"
endif
" Reset some YAML to plain styling " Reset some YAML to plain styling
" the number 80 in Ansible isn't any more important than the word root " the number 80 in Ansible isn't any more important than the word root
highlight link yamlInteger NONE highlight link yamlInteger NONE
@@ -46,58 +47,9 @@ highlight link yamlBool NONE
highlight link yamlFlowString NONE highlight link yamlFlowString NONE
" but it does make sense we visualize quotes easily " but it does make sense we visualize quotes easily
highlight link yamlFlowStringDelimiter Delimiter highlight link yamlFlowStringDelimiter Delimiter
" This is only found in stephypy/vim-yaml, since it's one line it isn't worth
fun! s:normal_keywords_highlight(name) " making conditional
if a:name == 'Comment' highlight link yamlConstant NONE
highlight link ansible_normal_keywords Comment
elseif a:name == 'Constant'
highlight link ansible_normal_keywords Constant
elseif a:name == 'Identifier'
highlight link ansible_normal_keywords Identifier
elseif a:name == 'Statement'
highlight link ansible_normal_keywords Statement
elseif a:name == 'PreProc'
highlight link ansible_normal_keywords PreProc
elseif a:name == 'Type'
highlight link ansible_normal_keywords Type
elseif a:name == 'Special'
highlight link ansible_normal_keywords Special
elseif a:name == 'Underlined'
highlight link ansible_normal_keywords Underlined
elseif a:name == 'Ignore'
highlight link ansible_normal_keywords Ignore
elseif a:name == 'Error'
highlight link ansible_normal_keywords Error
elseif a:name == 'Todo'
highlight link ansible_normal_keywords Todo
endif
endfun
fun! s:with_keywords_highlight(name)
if a:name == 'Comment'
highlight link ansible_with_keywords Comment
elseif a:name == 'Constant'
highlight link ansible_with_keywords Constant
elseif a:name == 'Identifier'
highlight link ansible_with_keywords Identifier
elseif a:name == 'Statement'
highlight link ansible_with_keywords Statement
elseif a:name == 'PreProc'
highlight link ansible_with_keywords PreProc
elseif a:name == 'Type'
highlight link ansible_with_keywords Type
elseif a:name == 'Special'
highlight link ansible_with_keywords Special
elseif a:name == 'Underlined'
highlight link ansible_with_keywords Underlined
elseif a:name == 'Ignore'
highlight link ansible_with_keywords Ignore
elseif a:name == 'Error'
highlight link ansible_with_keywords Error
elseif a:name == 'Todo'
highlight link ansible_with_keywords Todo
endif
endfun
fun! s:attribute_highlight(attributes) fun! s:attribute_highlight(attributes)
if a:attributes =~ 'a' if a:attributes =~ 'a'
@@ -121,7 +73,7 @@ else
endif endif
if exists("g:ansible_name_highlight") if exists("g:ansible_name_highlight")
syn keyword ansible_name name containedin=yamlBlockMappingKey contained execute 'syn keyword ansible_name name containedin='.s:yamlKey.' contained'
if g:ansible_name_highlight =~ 'd' if g:ansible_name_highlight =~ 'd'
highlight link ansible_name Comment highlight link ansible_name Comment
else else
@@ -129,24 +81,24 @@ if exists("g:ansible_name_highlight")
endif endif
endif endif
syn keyword ansible_debug_keywords debug containedin=yamlBlockMappingKey contained execute 'syn keyword ansible_debug_keywords debug containedin='.s:yamlKey.' contained'
highlight link ansible_debug_keywords Debug highlight link ansible_debug_keywords Debug
if exists("g:ansible_extra_keywords_highlight") if exists("g:ansible_extra_keywords_highlight")
syn keyword ansible_extra_special_keywords register always_run changed_when failed_when no_log args vars delegate_to ignore_errors containedin=yamlBlockMappingKey contained execute 'syn keyword ansible_extra_special_keywords register always_run changed_when failed_when no_log args vars delegate_to ignore_errors containedin='.s:yamlKey.' contained'
highlight link ansible_extra_special_keywords Statement highlight link ansible_extra_special_keywords Statement
endif endif
syn keyword ansible_normal_keywords include include_tasks import_tasks until retries delay when only_if become become_user block rescue always notify containedin=yamlBlockMappingKey contained execute 'syn keyword ansible_normal_keywords include include_tasks import_tasks until retries delay when only_if become become_user block rescue always notify containedin='.s:yamlKey.' contained'
if exists("g:ansible_normal_keywords_highlight") if exists("g:ansible_normal_keywords_highlight")
call s:normal_keywords_highlight(g:ansible_normal_keywords_highlight) execute 'highlight link ansible_normal_keywords '.g:ansible_normal_keywords_highlight
else else
highlight link ansible_normal_keywords Statement highlight link ansible_normal_keywords Statement
endif endif
syn match ansible_with_keywords "\vwith_.+" containedin=yamlBlockMappingKey contained execute 'syn match ansible_with_keywords "\vwith_.+" containedin='.s:yamlKey.' contained'
if exists("g:ansible_with_keywords_highlight") if exists("g:ansible_with_keywords_highlight")
call s:with_keywords_highlight(g:ansible_with_keywords_highlight) execute 'highlight link ansible_with_keywords '.g:ansible_with_keywords_highlight
else else
highlight link ansible_with_keywords Statement highlight link ansible_with_keywords Statement
endif endif

View File

@@ -1,31 +0,0 @@
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'ansible') == -1
" Vim syntax file
" Language: Ansible YAML/Jinja templates
" Maintainer: Dave Honneffer <pearofducks@gmail.com>
" Last Change: 2015.09.06
if exists("b:current_syntax")
finish
endif
if !exists("main_syntax")
let main_syntax = 'jinja2'
endif
let b:current_syntax = ''
unlet b:current_syntax
runtime! syntax/jinja2.vim
if exists("g:ansible_extra_syntaxes")
let s:extra_syntax = split(g:ansible_extra_syntaxes)
for syntax_name in s:extra_syntax
let b:current_syntax = ''
unlet b:current_syntax
execute 'runtime!' "syntax/" . syntax_name
endfor
endif
let b:current_syntax = "ansible_template"
endif

View File

@@ -33,12 +33,12 @@ syn region bladeComment matchgroup=bladeDelimiter start="{{--" end="--}}" c
syn keyword bladeKeyword @if @elseif @foreach @forelse @for @while @can @cannot @elsecan @elsecannot @include syn keyword bladeKeyword @if @elseif @foreach @forelse @for @while @can @cannot @elsecan @elsecannot @include
\ @includeIf @each @inject @extends @section @stack @push @unless @yield @parent @hasSection @break @continue \ @includeIf @each @inject @extends @section @stack @push @unless @yield @parent @hasSection @break @continue
\ @unset @lang @choice @component @slot @prepend \ @unset @lang @choice @component @slot @prepend @json @isset @auth @guest @switch @case @includeFirst @empty
\ nextgroup=bladePhpParenBlock skipwhite containedin=ALLBUT,@bladeExempt \ nextgroup=bladePhpParenBlock skipwhite containedin=ALLBUT,@bladeExempt
syn keyword bladeKeyword @else @endif @endunless @endfor @endforeach @empty @endforelse @endwhile @endcan syn keyword bladeKeyword @else @endif @endunless @endfor @endforeach @endforelse @endwhile @endcan
\ @endcannot @stop @append @endsection @endpush @show @overwrite @verbatim @endverbatim @endcomponent \ @endcannot @stop @append @endsection @endpush @show @overwrite @verbatim @endverbatim @endcomponent
\ @endslot @endprepend \ @endslot @endprepend @endisset @endempty @endauth @endguest @endswitch
\ containedin=ALLBUT,@bladeExempt \ containedin=ALLBUT,@bladeExempt
if exists('g:blade_custom_directives') if exists('g:blade_custom_directives')

View File

@@ -7,7 +7,7 @@ if exists("b:current_syntax")
finish finish
endif endif
syn match caddyDirective "^\s*\([a-z]\+\)" nextgroup=caddyDirectiveArgs skipwhite syn match caddyDirective "^\s*\([a-zA-Z0-9_]\+\)" nextgroup=caddyDirectiveArgs skipwhite
syn region caddyDirectiveArgs start="" end="\({\|#\|$\)"me=s-1 oneline contained contains=caddyPlaceholder,caddyString nextgroup=caddyDirectiveBlock skipwhite syn region caddyDirectiveArgs start="" end="\({\|#\|$\)"me=s-1 oneline contained contains=caddyPlaceholder,caddyString nextgroup=caddyDirectiveBlock skipwhite
syn region caddyDirectiveBlock start="{" skip="\\}" end="}" contained contains=caddySubdirective,caddyComment syn region caddyDirectiveBlock start="{" skip="\\}" end="}" contained contains=caddySubdirective,caddyComment

145
syntax/carp.vim Normal file
View File

@@ -0,0 +1,145 @@
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'carp') == -1
" Vim syntax file
" Language: Carp
" Maintainer: Veit Heller <veit@veitheller.de>
" URL: http://github.com/hellerve/carp-vim.git
" Description: Contains all of the keywords in #lang carp
if exists("b:current_syntax")
finish
endif
syn match carpError ,[]})],
if version < 600
set iskeyword=33,35-39,42-43,45-58,60-63,65-90,94,95,97-122,124,126,_
else
setlocal iskeyword=33,35-39,42-43,45-58,60-63,65-90,94,95,97-122,124,126,_
endif
syn keyword carpSyntax def defn let do if while ref address set! the
syn keyword carpSyntax defmacro defdynamic quote cons list array
syn keyword carpSyntax expand deftype register system-include register-type
syn keyword carpSyntax defmodule copy use module defalias definterface eval
syn keyword carpSyntax expand instantiate type info help quit env build run
syn keyword carpSyntax cat project-set! local-include
syn keyword carpSyntax add-cflag add-lib project load reload let-do ignore
syn keyword carpSyntax fmt mac-only linux-only windows-only use-all when
syn keyword carpSyntax unless defn-do comment forever-do case and* or*
syn keyword carpSyntax str* println* break doc sig hidden private
syn match carpSyntax "\vc(a|d){1,4}r"
syn keyword carpFunc Int Float Double Bool String Char Array Fn Ref Long λ
syn keyword carpFunc Pattern
syn keyword carpFunc not or and + - * / = /= >= <= > < inc dec
syn keyword carpFunc println print get-line from-string mod random
syn keyword carpFunc random-between str mask delete append length duplicate
syn keyword carpFunc cstr chars from-chars to-int from-int sin cos sqrt acos
syn keyword carpFunc atan2 exit time seed-random for cond floor abs sort-with
syn keyword carpFunc subarray prefix-array suffix-array reverse sum min max
syn keyword carpFunc first last reduce format zero read-file bit-shift-left
syn keyword carpFunc bit-shift-right bit-and bit-or bit-xor bit-not safe-add
syn keyword carpFunc safe-sub safe-mul even? odd? cmp allocate repeat-indexed
syn keyword carpFunc sanitize-addresses memory-balance reset-memory-balance!
syn keyword carpFunc log-memory-balance! memory-logged assert-balanced trace
syn keyword carpFunc pi e swap! update! char-at tail head split-by words lines
syn keyword carpFunc pad-left pad-right count-char empty? random-sized substring
syn keyword carpFunc prefix-string suffix-string starts-with? ends-with?
syn keyword carpFunc string-join free sleep-seconds sleep-micros substitute
syn keyword carpFunc neg to-float match matches? find global-match match-str
syn keyword carpFunc from-float tan asin atan cosh sinh tanh exp frexp ldexp
syn keyword carpFunc log log10 modf pow ceil clamp approx refstr foreach
syn keyword carpFunc => ==> repeat nth replicate range raw aset aset!
syn keyword carpFunc push-back pop-back sort index-of element-count
syn match carpSymbol ,\k+, contained
syn match carpTodo /\v<(FIXME|NOTE|TODO|OPTIMIZE)/ containedin=carpComment,carpString
syn cluster carpNormal contains=carpSyntax,carpFunc,carpDelimiter
syn cluster carpQuotedStuff contains=carpSymbol
syn cluster carpQuotedOrNormal contains=carpDelimiter
syn region carpQuotedStruc start="@("rs=s+2 end=")"re=e-1 contains=@carpQuotedStuff,@carpQuotedOrNormal contained
syn region carpQuotedStruc start="&("rs=s+2 end=")"re=e-1 contains=@carpQuotedStuff,@carpQuotedOrNormal contained
syn region carpQuotedStruc start="("rs=s+1 end=")"re=e-1 contains=@carpQuotedStuff,@carpQuotedOrNormal contained
syn region carpQuotedStruc start="\["rs=s+1 end="\]"re=e-1 contains=@carpQuotedStuff,@carpQuotedOrNormal contained
syn cluster carpQuotedStuff add=carpQuotedStruc
syn region carpStruc matchgroup=Delimiter start="@("rs=s+2 matchgroup=Delimiter end=")"re=e-1 contains=@carpNormal
syn region carpStruc matchgroup=Delimiter start="&("rs=s+2 matchgroup=Delimiter end=")"re=e-1 contains=@carpNormal
syn region carpStruc matchgroup=Delimiter start="&"rs=s+1 end=![ \t()\[\]";]!me=e-1 contains=@carpNormal
syn region carpStruc matchgroup=Delimiter start="@"rs=s+1 end=![ \t()\[\]";]!me=e-1 contains=@carpNormal
syn region carpStruc matchgroup=Delimiter start="("rs=s+1 matchgroup=Delimiter end=")"re=e-1 contains=@carpNormal
syn region carpStruc matchgroup=Delimiter start="\["rs=s+1 matchgroup=Delimiter end="\]"re=e-1 contains=@carpNormal
syn region carpString start=/\%(\\\)\@<!"/ skip=/\\[\\"]/ end=/"/
syn region carpPattern start=/\%(\\\)\@<!\#"/ skip=/\\[\\"]/ end=/"/
syn cluster carpNormal add=carpError,carpStruc,carpString,carpPattern
syn cluster carpQuotedOrNormal add=carpString
syn match carpNumber "\<[-+]\?\(\d\+\|\d\+#*\.\|\d*\.\d\+\)#*\(/\d\+#*\)\?[lf]\?\>" contains=carpContainedNumberError
syn match carpNumber "\<[-+]\?\d\+/\d\+[lf]\?\>" contains=carpContainedNumberError
syn keyword carpBoolean true false
syn match carpChar "\<\\.\w\@!"
syn region carpQuoted matchgroup=Delimiter start="['`]" end=![ \t()\[\]";]!me=e-1 contains=@carpQuotedStuff,@carpQuotedOrNormal
syn region carpQuoted matchgroup=Delimiter start="['`](" matchgroup=Delimiter end=")" contains=@carpQuotedStuff,@carpQuotedOrNormal
syn cluster carpNormal add=carpNumber,carpBoolean,carpChar
syn cluster carpQuotedOrNormal add=carpNumber,carpBoolean
syn match carpComment /;.*$/ contains=@Spell
syn region carpQuoted matchgroup=Delimiter start="#['`]"rs=s+2 end=![ \t()\[\]";]!re=e-1,me=e-1 contains=@carpQuotedStuff,@carpQuotedOrNormal
syn region carpQuoted matchgroup=Delimiter start="#['`]("rs=s+3 matchgroup=Delimiter end=")"re=e-1 contains=@carpQuotedStuff,@carpQuotedOrNormal
syn cluster carpNormal add=carpQuoted,carpComment
syn cluster carpQuotedOrNormal add=carpComment
syn sync match matchPlace grouphere NONE "^[^ \t]"
if version >= 508 || !exists("carp_syntax_init")
if version < 508
let carp_syntax_init = 1
command -nargs=+ HiLink hi link <args>
else
command -nargs=+ HiLink hi def link <args>
endif
HiLink carpSyntax Statement
HiLink carpFunc Function
HiLink carpCopy Function
HiLink carpString String
HiLink carpPattern String
HiLink carpChar Character
HiLink carpBoolean Boolean
HiLink carpNumber Number
HiLink carpNumberError Error
HiLink carpContainedNumberError Error
HiLink carpQuoted Structure
HiLink carpQuotedStruc Structure
HiLink carpSymbol Structure
HiLink carpAtom Structure
HiLink carpDelimiter Delimiter
HiLink carpConstant Constant
HiLink carpTodo Todo
HiLink carpComment Comment
HiLink carpError Error
delcommand HiLink
endif
let b:current_syntax = "carp"
endif

View File

@@ -21,8 +21,10 @@ endif
let s:keepcpo= &cpo let s:keepcpo= &cpo
set cpo&vim set cpo&vim
syn region cmakeComment start="#" end="$" contains=cmakeTodo,cmakeLuaComment,@Spell syn region cmakeBracketArgument start="\[\z(=\?\|=[0-9]*\)\[" end="\]\z1\]" contains=cmakeTodo,@Spell
syn region cmakeLuaComment start="\[\z(=*\)\[" end="\]\z1\]" contains=cmakeTodo,@Spell
syn region cmakeComment start="#" end="$" contains=cmakeTodo,@Spell
syn region cmakeBracketComment start="#\[\z(=\?\|=[0-9]*\)\[" end="\]\z1\]" contains=cmakeTodo,@Spell
syn match cmakeEscaped /\(\\\\\|\\"\|\\n\|\\t\)/ contained syn match cmakeEscaped /\(\\\\\|\\"\|\\n\|\\t\)/ contained
syn region cmakeRegistry start="\[" end="]" contained oneline contains=cmakeTodo,cmakeEscaped syn region cmakeRegistry start="\[" end="]" contained oneline contains=cmakeTodo,cmakeEscaped
@@ -358,6 +360,8 @@ syn keyword cmakeTodo
\ TODO FIXME XXX \ TODO FIXME XXX
\ contained \ contained
hi def link cmakeBracketArgument String
hi def link cmakeBracketComment Comment
hi def link cmakeCommand Function hi def link cmakeCommand Function
hi def link cmakeCommandConditional Conditional hi def link cmakeCommandConditional Conditional
hi def link cmakeCommandDeprecated WarningMsg hi def link cmakeCommandDeprecated WarningMsg
@@ -367,7 +371,6 @@ hi def link cmakeEnvironment Special
hi def link cmakeEscaped Special hi def link cmakeEscaped Special
hi def link cmakeGeneratorExpression WarningMsg hi def link cmakeGeneratorExpression WarningMsg
hi def link cmakeGeneratorExpressions Constant hi def link cmakeGeneratorExpressions Constant
hi def link cmakeLuaComment Comment
hi def link cmakeModule Include hi def link cmakeModule Include
hi def link cmakeProperty Constant hi def link cmakeProperty Constant
hi def link cmakeRegistry Underlined hi def link cmakeRegistry Underlined

View File

@@ -34,7 +34,7 @@ hi def link coffeeConditional Conditional
syn match coffeeException /\<\%(try\|catch\|finally\)\>/ display syn match coffeeException /\<\%(try\|catch\|finally\)\>/ display
hi def link coffeeException Exception hi def link coffeeException Exception
syn match coffeeKeyword /\<\%(new\|in\|of\|by\|and\|or\|not\|is\|isnt\|class\|extends\|super\|do\|yield\|debugger\|import\|export\|await\)\>/ syn match coffeeKeyword /\<\%(new\|in\|of\|from\|by\|and\|or\|not\|is\|isnt\|class\|extends\|super\|do\|yield\|debugger\|import\|export\|default\|await\)\>/
\ display \ display
" The `own` keyword is only a keyword after `for`. " The `own` keyword is only a keyword after `for`.
syn match coffeeKeyword /\<for\s\+own\>/ contained containedin=coffeeRepeat syn match coffeeKeyword /\<for\s\+own\>/ contained containedin=coffeeRepeat
@@ -109,7 +109,7 @@ hi def link coffeeFloat Float
" An error for reserved keywords, taken from the RESERVED array: " An error for reserved keywords, taken from the RESERVED array:
" http://coffeescript.org/documentation/docs/lexer.html#section-67 " http://coffeescript.org/documentation/docs/lexer.html#section-67
syn match coffeeReservedError /\<\%(case\|default\|function\|var\|void\|with\|const\|let\|enum\|native\|implements\|interface\|package\|private\|protected\|public\|static\)\>/ syn match coffeeReservedError /\<\%(case\|function\|var\|void\|with\|const\|let\|enum\|native\|implements\|interface\|package\|private\|protected\|public\|static\)\>/
\ display \ display
hi def link coffeeReservedError Error hi def link coffeeReservedError Error

View File

@@ -2,7 +2,7 @@ if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'crystal') == -1
" Language: Crystal " Language: Crystal
" Based on Ruby syntax highlight " Based on Ruby syntax highlight
" which is made by Mirko Nasato and Doug Kearns " which was made by Mirko Nasato and Doug Kearns
" --------------------------------------------- " ---------------------------------------------
if exists('b:current_syntax') if exists('b:current_syntax')
@@ -66,9 +66,9 @@ syn match crystalRegexpSpecial "\\k'\%([a-z_]\w*\|-\=\d\+\)\%([+-]\d\+\)\='" co
syn match crystalRegexpSpecial "\\g<\%([a-z_]\w*\|-\=\d\+\)>" contained display syn match crystalRegexpSpecial "\\g<\%([a-z_]\w*\|-\=\d\+\)>" contained display
syn match crystalRegexpSpecial "\\g'\%([a-z_]\w*\|-\=\d\+\)'" contained display syn match crystalRegexpSpecial "\\g'\%([a-z_]\w*\|-\=\d\+\)'" contained display
syn cluster crystalStringSpecial contains=crystalInterpolation,crystalNoInterpolation,crystalStringEscape syn cluster crystalStringSpecial contains=crystalInterpolation,crystalNoInterpolation,crystalStringEscape
syn cluster crystalExtendedStringSpecial contains=@crystalStringSpecial,crystalNestedParentheses,crystalNestedCurlyBraces,crystalNestedAngleBrackets,crystalNestedSquareBrackets syn cluster crystalExtendedStringSpecial contains=@crystalStringSpecial,crystalNestedParentheses,crystalNestedCurlyBraces,crystalNestedAngleBrackets,crystalNestedSquareBrackets
syn cluster crystalRegexpSpecial contains=crystalInterpolation,crystalNoInterpolation,crystalStringEscape,crystalRegexpSpecial,crystalRegexpEscape,crystalRegexpBrackets,crystalRegexpCharClass,crystalRegexpDot,crystalRegexpQuantifier,crystalRegexpAnchor,crystalRegexpParens,crystalRegexpComment syn cluster crystalRegexpSpecial contains=crystalInterpolation,crystalNoInterpolation,crystalStringEscape,crystalRegexpSpecial,crystalRegexpEscape,crystalRegexpBrackets,crystalRegexpCharClass,crystalRegexpDot,crystalRegexpQuantifier,crystalRegexpAnchor,crystalRegexpParens,crystalRegexpComment
" Numbers and ASCII Codes " Numbers and ASCII Codes
syn match crystalASCIICode "\%(\w\|[]})\"'/]\)\@<!\%(?\%(\\M-\\C-\|\\C-\\M-\|\\M-\\c\|\\c\\M-\|\\c\|\\C-\|\\M-\)\=\%(\\\o\{1,3}\|\\x\x\{1,2}\|\\\=\S\)\)" syn match crystalASCIICode "\%(\w\|[]})\"'/]\)\@<!\%(?\%(\\M-\\C-\|\\C-\\M-\|\\M-\\c\|\\c\\M-\|\\c\|\\C-\|\\M-\)\=\%(\\\o\{1,3}\|\\x\x\{1,2}\|\\\=\S\)\)"
@@ -129,7 +129,7 @@ syn region crystalString matchgroup=crystalStringDelimiter start="\"" end="\"" s
syn region crystalString matchgroup=crystalStringDelimiter start="`" end="`" skip="\\\\\|\\`" contains=@crystalStringSpecial fold syn region crystalString matchgroup=crystalStringDelimiter start="`" end="`" skip="\\\\\|\\`" contains=@crystalStringSpecial fold
" Character " Character
syn match crystalCharLiteral "'\%([^\\]\|\\[abefnrstv'\\]\|\\\o\{1,3}\|\\x\x\{1,2}\|\\u\x\{4}\)'" contained display syn match crystalCharLiteral "'\%([^\\]\|\\[abefnrstv'\\]\|\\\o\{1,3}\|\\x\x\{1,2}\|\\u\x\{4}\)'" contains=crystalStringEscape display
" Generalized Single Quoted String, Symbol and Array of Strings " Generalized Single Quoted String, Symbol and Array of Strings
syn region crystalString matchgroup=crystalStringDelimiter start="%[qwi]\z([~`!@#$%^&*_\-+=|\:;"',.?/]\)" end="\z1" skip="\\\\\|\\\z1" fold syn region crystalString matchgroup=crystalStringDelimiter start="%[qwi]\z([~`!@#$%^&*_\-+=|\:;"',.?/]\)" end="\z1" skip="\\\\\|\\\z1" fold

View File

@@ -84,8 +84,8 @@ endif
syntax cluster dartStringContains contains=@dartRawStringContains,dartInterpolation,dartSpecialChar syntax cluster dartStringContains contains=@dartRawStringContains,dartInterpolation,dartSpecialChar
syntax region dartString oneline start=+\z(["']\)+ end=+\z1+ contains=@dartStringContains keepend syntax region dartString oneline start=+\z(["']\)+ end=+\z1+ contains=@dartStringContains keepend
syntax region dartRawString oneline start=+r\z(["']\)+ end=+\z1+ contains=@dartRawStringContains keepend syntax region dartRawString oneline start=+r\z(["']\)+ end=+\z1+ contains=@dartRawStringContains keepend
syntax region dartMultilineString start=+\z("\{3\}\|'\{3\}\)+ end=+\z1+ contains=@dartStringContains syntax region dartMultilineString start=+\z("\{3\}\|'\{3\}\)+ end=+\z1+ contains=@dartStringContains keepend
syntax region dartRawMultilineString start=+r\z("\{3\}\|'\{3\}\)+ end=+\z1+ contains=@dartSRawtringContains syntax region dartRawMultilineString start=+r\z("\{3\}\|'\{3\}\)+ end=+\z1+ contains=@dartSRawtringContains keepend
syntax match dartInterpolation contained "\$\(\w\+\|{[^}]\+}\)" extend syntax match dartInterpolation contained "\$\(\w\+\|{[^}]\+}\)" extend
syntax match dartSpecialChar contained "\\\(u\x\{4\}\|u{\x\+}\|x\x\x\|x{\x\+}\|.\)" extend syntax match dartSpecialChar contained "\\\(u\x\{4\}\|u{\x\+}\|x\x\x\|x{\x\+}\|.\)" extend

View File

@@ -18,25 +18,15 @@ syn cluster elixirDeclaration contains=elixirFunctionDeclaration,elixirModuleDec
syn match elixirComment '#.*' contains=elixirTodo,@Spell syn match elixirComment '#.*' contains=elixirTodo,@Spell
syn keyword elixirTodo FIXME NOTE TODO OPTIMIZE XXX HACK contained syn keyword elixirTodo FIXME NOTE TODO OPTIMIZE XXX HACK contained
syn match elixirId '\<[_a-zA-Z]\w*[!?]\?\>' contains=elixirUnusedVariable,elixirKernelFunction syn match elixirId '\<[_a-zA-Z]\w*[!?]\?\>' contains=elixirUnusedVariable
syn match elixirKeyword '\(\.\)\@<!\<\(for\|case\|when\|with\|cond\|if\|unless\|try\|receive\|send\)\>' syn match elixirKeyword '\(\.\)\@<!\<\(for\|case\|when\|with\|cond\|if\|unless\|try\|receive\|after\|rescue\|catch\|else\|quote\|unquote\|super\|unquote_splicing\)\>:\@!'
syn match elixirKeyword '\(\.\)\@<!\<\(exit\|raise\|throw\|after\|rescue\|catch\|else\)\>'
syn match elixirKeyword '\(\.\)\@<!\<\(quote\|unquote\|super\|spawn\|spawn_link\|spawn_monitor\)\>'
" Kernel functions
syn keyword elixirKernelFunction contained is_atom is_binary is_bitstring is_boolean is_float
syn keyword elixirKernelFunction contained is_function is_integer is_list is_map is_nil
syn keyword elixirKernelFunction contained is_number is_pid is_port is_reference is_tuple
syn keyword elixirKernelFunction contained abs binary_part bit_size byte_size div elem hd length
syn keyword elixirKernelFunction contained map_size node rem round tl trunc tuple_size
syn keyword elixirInclude import require alias use syn keyword elixirInclude import require alias use
syn keyword elixirSelf self syn keyword elixirSelf self
" This unfortunately also matches function names in function calls syn match elixirUnusedVariable contained '\%(\.\)\@<!\<_\w*\>\%((\)\@!'
syn match elixirUnusedVariable contained '\v%(^|[^.])@<=<_\w*>'
syn match elixirOperator '\v\.@<!<%(and|or|in|not)>' syn match elixirOperator '\v\.@<!<%(and|or|in|not)>'
syn match elixirOperator '!==\|!=\|!' syn match elixirOperator '!==\|!=\|!'
@@ -64,9 +54,10 @@ syn match elixirVariable '&\d\+'
syn keyword elixirPseudoVariable __FILE__ __DIR__ __MODULE__ __ENV__ __CALLER__ syn keyword elixirPseudoVariable __FILE__ __DIR__ __MODULE__ __ENV__ __CALLER__
syn match elixirNumber '\<\d\(_\?\d\)*\(\.[^[:space:][:digit:]]\@!\(_\?\d\)*\)\?\([eE][-+]\?\d\(_\?\d\)*\)\?\>' syn match elixirNumber '\<-\?\d\(_\?\d\)*\(\.[^[:space:][:digit:]]\@!\(_\?\d\)*\)\?\([eE][-+]\?\d\(_\?\d\)*\)\?\>'
syn match elixirNumber '\<0[xX][0-9A-Fa-f]\+\>' syn match elixirNumber '\<-\?0[xX][0-9A-Fa-f]\+\>'
syn match elixirNumber '\<0[bB][01]\+\>' syn match elixirNumber '\<-\?0[oO][0-7]\+\>'
syn match elixirNumber '\<-\?0[bB][01]\+\>'
syn match elixirRegexEscape "\\\\\|\\[aAbBcdDefGhHnrsStvVwW]\|\\\d\{3}\|\\x[0-9a-fA-F]\{2}" contained syn match elixirRegexEscape "\\\\\|\\[aAbBcdDefGhHnrsStvVwW]\|\\\d\{3}\|\\x[0-9a-fA-F]\{2}" contained
syn match elixirRegexEscapePunctuation "?\|\\.\|*\|\\\[\|\\\]\|+\|\\^\|\\\$\|\\|\|\\(\|\\)\|\\{\|\\}" contained syn match elixirRegexEscapePunctuation "?\|\\.\|*\|\\\[\|\\\]\|+\|\\^\|\\\$\|\\|\|\\(\|\\)\|\\{\|\\}" contained
@@ -87,16 +78,16 @@ syn region elixirString matchgroup=elixirStringDelimiter start=+\z('\)+ end=+
syn region elixirString matchgroup=elixirStringDelimiter start=+\z("\)+ end=+\z1+ skip=+\\\\\|\\\z1+ contains=@Spell,@elixirStringContained syn region elixirString matchgroup=elixirStringDelimiter start=+\z("\)+ end=+\z1+ skip=+\\\\\|\\\z1+ contains=@Spell,@elixirStringContained
syn region elixirString matchgroup=elixirStringDelimiter start=+\z('''\)+ end=+^\s*\z1+ contains=@Spell,@elixirStringContained syn region elixirString matchgroup=elixirStringDelimiter start=+\z('''\)+ end=+^\s*\z1+ contains=@Spell,@elixirStringContained
syn region elixirString matchgroup=elixirStringDelimiter start=+\z("""\)+ end=+^\s*\z1+ contains=@Spell,@elixirStringContained syn region elixirString matchgroup=elixirStringDelimiter start=+\z("""\)+ end=+^\s*\z1+ contains=@Spell,@elixirStringContained
syn region elixirInterpolation matchgroup=elixirInterpolationDelimiter start="#{" end="}" contained contains=ALLBUT,elixirKernelFunction,elixirComment,@elixirNotTop syn region elixirInterpolation matchgroup=elixirInterpolationDelimiter start="#{" end="}" contained contains=ALLBUT,elixirComment,@elixirNotTop
syn match elixirAtomInterpolated ':\("\)\@=' contains=elixirString syn match elixirAtomInterpolated ':\("\)\@=' contains=elixirString
syn match elixirString "\(\w\)\@<!?\%(\\\(x\d{1,2}\|\h{1,2}\h\@!\>\|0[0-7]{0,2}[0-7]\@!\>\|[^x0MC]\)\|(\\[MC]-)+\w\|[^\s\\]\)" syn match elixirString "\(\w\)\@<!?\%(\\\(x\d{1,2}\|\h{1,2}\h\@!\>\|0[0-7]{0,2}[0-7]\@!\>\|[^x0MC]\)\|(\\[MC]-)+\w\|[^\s\\]\)"
syn region elixirBlock matchgroup=elixirBlockDefinition start="\<do\>:\@!" end="\<end\>" contains=ALLBUT,elixirKernelFunction,@elixirNotTop fold syn region elixirBlock matchgroup=elixirBlockDefinition start="\<do\>:\@!" end="\<end\>" contains=ALLBUT,@elixirNotTop fold
syn region elixirElseBlock matchgroup=elixirBlockDefinition start="\<else\>:\@!" end="\<end\>" contains=ALLBUT,elixirKernelFunction,@elixirNotTop fold syn region elixirElseBlock matchgroup=elixirBlockDefinition start="\<else\>:\@!" end="\<end\>" contains=ALLBUT,@elixirNotTop fold
syn region elixirAnonymousFunction matchgroup=elixirBlockDefinition start="\<fn\>" end="\<end\>" contains=ALLBUT,elixirKernelFunction,@elixirNotTop fold syn region elixirAnonymousFunction matchgroup=elixirBlockDefinition start="\<fn\>" end="\<end\>" contains=ALLBUT,@elixirNotTop fold
syn region elixirArguments start="(" end=")" contained contains=elixirOperator,elixirAtom,elixirPseudoVariable,elixirAlias,elixirBoolean,elixirVariable,elixirUnusedVariable,elixirNumber,elixirDocString,elixirAtomInterpolated,elixirRegex,elixirString,elixirStringDelimiter,elixirRegexDelimiter,elixirInterpolationDelimiter,elixirSigil,elixirAnonymousFunction syn region elixirArguments start="(" end=")" contained contains=elixirOperator,elixirAtom,elixirPseudoVariable,elixirAlias,elixirBoolean,elixirVariable,elixirUnusedVariable,elixirNumber,elixirDocString,elixirAtomInterpolated,elixirRegex,elixirString,elixirStringDelimiter,elixirRegexDelimiter,elixirInterpolationDelimiter,elixirSigil,elixirAnonymousFunction,elixirComment
syn match elixirDelimEscape "\\[(<{\[)>}\]/\"'|]" transparent display contained contains=NONE syn match elixirDelimEscape "\\[(<{\[)>}\]/\"'|]" transparent display contained contains=NONE
@@ -142,6 +133,8 @@ syn region elixirDocString matchgroup=elixirSigilDelimiter start=+\%(@\w*doc\s\
" Defines " Defines
syn match elixirDefine '\<def\>\(:\)\@!' nextgroup=elixirFunctionDeclaration skipwhite skipnl syn match elixirDefine '\<def\>\(:\)\@!' nextgroup=elixirFunctionDeclaration skipwhite skipnl
syn match elixirPrivateDefine '\<defp\>\(:\)\@!' nextgroup=elixirFunctionDeclaration skipwhite skipnl syn match elixirPrivateDefine '\<defp\>\(:\)\@!' nextgroup=elixirFunctionDeclaration skipwhite skipnl
syn match elixirGuard '\<defguard\>\(:\)\@!' nextgroup=elixirFunctionDeclaration skipwhite skipnl
syn match elixirPrivateGuard '\<defguardp\>\(:\)\@!' nextgroup=elixirFunctionDeclaration skipwhite skipnl
syn match elixirModuleDefine '\<defmodule\>\(:\)\@!' nextgroup=elixirModuleDeclaration skipwhite skipnl syn match elixirModuleDefine '\<defmodule\>\(:\)\@!' nextgroup=elixirModuleDeclaration skipwhite skipnl
syn match elixirProtocolDefine '\<defprotocol\>\(:\)\@!' nextgroup=elixirProtocolDeclaration skipwhite skipnl syn match elixirProtocolDefine '\<defprotocol\>\(:\)\@!' nextgroup=elixirProtocolDeclaration skipwhite skipnl
syn match elixirImplDefine '\<defimpl\>\(:\)\@!' nextgroup=elixirImplDeclaration skipwhite skipnl syn match elixirImplDefine '\<defimpl\>\(:\)\@!' nextgroup=elixirImplDeclaration skipwhite skipnl
@@ -164,8 +157,8 @@ syn match elixirRecordDeclaration "[^[:space:];#<]\+" contained con
syn match elixirMacroDeclaration "[^[:space:];#<,()\[\]]\+" contained nextgroup=elixirArguments skipwhite skipnl syn match elixirMacroDeclaration "[^[:space:];#<,()\[\]]\+" contained nextgroup=elixirArguments skipwhite skipnl
syn match elixirDelegateDeclaration "[^[:space:];#<,()\[\]]\+" contained contains=elixirFunctionDeclaration skipwhite skipnl syn match elixirDelegateDeclaration "[^[:space:];#<,()\[\]]\+" contained contains=elixirFunctionDeclaration skipwhite skipnl
syn region elixirDelegateDeclaration start='\[' end='\]' contained contains=elixirFunctionDeclaration skipwhite skipnl syn region elixirDelegateDeclaration start='\[' end='\]' contained contains=elixirFunctionDeclaration skipwhite skipnl
syn match elixirOverridableDeclaration "[^[:space:];#<]\+" contained contains=elixirAlias skipwhite skipnl syn match elixirOverridableDeclaration "[^[:space:];#<]\+" contained contains=elixirAlias,elixirAtom skipwhite skipnl
syn match elixirExceptionDeclaration "[^[:space:];#<]\+" contained contains=elixirAlias skipwhite skipnl syn match elixirExceptionDeclaration "[^[:space:];#<]\+" contained contains=elixirAlias,elixirAtom skipwhite skipnl
syn match elixirCallbackDeclaration "[^[:space:];#<,()\[\]]\+" contained contains=elixirFunctionDeclaration skipwhite skipnl syn match elixirCallbackDeclaration "[^[:space:];#<,()\[\]]\+" contained contains=elixirFunctionDeclaration skipwhite skipnl
" ExUnit " ExUnit
@@ -173,9 +166,11 @@ syn match elixirExUnitMacro "\(^\s*\)\@<=\<\(test\|describe\|setup\|setup_all\|
syn match elixirExUnitAssert "\(^\s*\)\@<=\<\(assert\|assert_in_delta\|assert_raise\|assert_receive\|assert_received\|catch_error\)\>" syn match elixirExUnitAssert "\(^\s*\)\@<=\<\(assert\|assert_in_delta\|assert_raise\|assert_receive\|assert_received\|catch_error\)\>"
syn match elixirExUnitAssert "\(^\s*\)\@<=\<\(catch_exit\|catch_throw\|flunk\|refute\|refute_in_delta\|refute_receive\|refute_received\)\>" syn match elixirExUnitAssert "\(^\s*\)\@<=\<\(catch_exit\|catch_throw\|flunk\|refute\|refute_in_delta\|refute_receive\|refute_received\)\>"
hi def link elixirBlockDefinition Keyword hi def link elixirBlockDefinition Define
hi def link elixirDefine Define hi def link elixirDefine Define
hi def link elixirPrivateDefine Define hi def link elixirPrivateDefine Define
hi def link elixirGuard Define
hi def link elixirPrivateGuard Define
hi def link elixirModuleDefine Define hi def link elixirModuleDefine Define
hi def link elixirProtocolDefine Define hi def link elixirProtocolDefine Define
hi def link elixirImplDefine Define hi def link elixirImplDefine Define
@@ -195,9 +190,8 @@ hi def link elixirMacroDeclaration Macro
hi def link elixirInclude Include hi def link elixirInclude Include
hi def link elixirComment Comment hi def link elixirComment Comment
hi def link elixirTodo Todo hi def link elixirTodo Todo
hi def link elixirKeyword Keyword hi def link elixirKeyword Define
hi def link elixirExUnitAssert Keyword hi def link elixirExUnitAssert Keyword
hi def link elixirKernelFunction Keyword
hi def link elixirOperator Operator hi def link elixirOperator Operator
hi def link elixirAtom Constant hi def link elixirAtom Constant
hi def link elixirPseudoVariable Constant hi def link elixirPseudoVariable Constant

View File

@@ -7,13 +7,13 @@ if exists('b:current_syntax')
endif endif
" Keywords " Keywords
syn keyword elmConditional case else if of then syn keyword elmConditional else if of then
syn keyword elmAlias alias syn keyword elmAlias alias
syn keyword elmTypedef type port let in syn keyword elmTypedef contained type port
syn keyword elmImport exposing as import module where syn keyword elmImport exposing as import module where
" Operators " Operators
syn match elmOperator "\([-!#$%`&\*\+./<=>\?@\\^|~:]\|\<_\>\)" syn match elmOperator contained "\([-!#$%`&\*\+./<=>\?@\\^|~:]\|\<_\>\)"
" Types " Types
syn match elmType "\<[A-Z][0-9A-Za-z_'-]*" syn match elmType "\<[A-Z][0-9A-Za-z_'-]*"
@@ -29,7 +29,7 @@ syn match elmTupleFunction "\((,\+)\)"
" Comments " Comments
syn keyword elmTodo TODO FIXME XXX contained syn keyword elmTodo TODO FIXME XXX contained
syn match elmLineComment "--.*" contains=elmTodo,@spell syn match elmLineComment "--.*" contains=elmTodo,@spell
syn region elmComment matchgroup=elmComment start="{-|\=" end="-}" contains=elmTodo,elmComment,@spell syn region elmComment matchgroup=elmComment start="{-|\=" end="-}" contains=elmTodo,elmComment,@spell fold
" Strings " Strings
syn match elmStringEscape "\\u[0-9a-fA-F]\{4}" contained syn match elmStringEscape "\\u[0-9a-fA-F]\{4}" contained
@@ -45,6 +45,16 @@ syn match elmFloat "\(\<\d\+\.\d\+\>\)"
" Identifiers " Identifiers
syn match elmTopLevelDecl "^\s*[a-zA-Z][a-zA-z0-9_]*\('\)*\s\+:\s\+" contains=elmOperator syn match elmTopLevelDecl "^\s*[a-zA-Z][a-zA-z0-9_]*\('\)*\s\+:\s\+" contains=elmOperator
" Folding
syn region elmTopLevelTypedef start="type" end="\n\(\n\n\)\@=" contains=ALL fold
syn region elmTopLevelFunction start="^[a-zA-Z].\+\n[a-zA-Z].\+=" end="^\(\n\+\)\@=" contains=ALL fold
syn region elmCaseBlock matchgroup=elmCaseBlockDefinition start="^\z\(\s\+\)\<case\>" end="^\z1\@!\W\@=" end="\(\n\n\z1\@!\)\@=" end="\n\z1\@!\(\n\n\)\@=" contains=ALL fold
syn region elmCaseItemBlock start="^\z\(\s\+\).\+->$" end="^\z1\@!\W\@=" end="\(\n\n\z1\@!\)\@=" end="\(\n\z1\S\)\@=" contains=ALL fold
syn region elmLetBlock matchgroup=elmLetBlockDefinition start="\<let\>" end="\<in\>" contains=ALL fold
hi def link elmCaseBlockDefinition Conditional
hi def link elmCaseBlockItemDefinition Conditional
hi def link elmLetBlockDefinition TypeDef
hi def link elmTopLevelDecl Function hi def link elmTopLevelDecl Function
hi def link elmTupleFunction Normal hi def link elmTupleFunction Normal
hi def link elmTodo Todo hi def link elmTodo Todo

View File

@@ -81,6 +81,7 @@ syn match erlangGlobalFuncRef '\<\%(\a[[:alnum:]_@]*\%(\s\|\n\|%.*\n\)*\.\%(\s\
syn match erlangVariable '\<[A-Z_][[:alnum:]_@]*' syn match erlangVariable '\<[A-Z_][[:alnum:]_@]*'
syn match erlangMacro '??\=[[:alnum:]_@]\+' syn match erlangMacro '??\=[[:alnum:]_@]\+'
syn match erlangMacro '\%(-define(\)\@<=[[:alnum:]_@]\+' syn match erlangMacro '\%(-define(\)\@<=[[:alnum:]_@]\+'
syn region erlangQuotedMacro start=/??\=\s*'/ end=/'/ contains=erlangQuotedAtomModifier
syn match erlangMap '#' syn match erlangMap '#'
syn match erlangRecord '#\s*\l[[:alnum:]_@]*' syn match erlangRecord '#\s*\l[[:alnum:]_@]*'
syn region erlangQuotedRecord start=/#\s*'/ end=/'/ contains=erlangQuotedAtomModifier syn region erlangQuotedRecord start=/#\s*'/ end=/'/ contains=erlangQuotedAtomModifier
@@ -193,6 +194,7 @@ hi def link erlangGlobalFuncCall Function
hi def link erlangGlobalFuncRef Function hi def link erlangGlobalFuncRef Function
hi def link erlangVariable Normal hi def link erlangVariable Normal
hi def link erlangMacro Normal hi def link erlangMacro Normal
hi def link erlangQuotedMacro Normal
hi def link erlangRecord Normal hi def link erlangRecord Normal
hi def link erlangQuotedRecord Normal hi def link erlangQuotedRecord Normal
hi def link erlangMap Normal hi def link erlangMap Normal
@@ -204,6 +206,7 @@ hi def link erlangGlobalFuncCall Normal
hi def link erlangGlobalFuncRef Normal hi def link erlangGlobalFuncRef Normal
hi def link erlangVariable Identifier hi def link erlangVariable Identifier
hi def link erlangMacro Macro hi def link erlangMacro Macro
hi def link erlangQuotedMacro Macro
hi def link erlangRecord Structure hi def link erlangRecord Structure
hi def link erlangQuotedRecord Structure hi def link erlangQuotedRecord Structure
hi def link erlangMap Structure hi def link erlangMap Structure

View File

@@ -22,7 +22,7 @@ syntax match fishCommandSub /\v\(\s*\zs\k+>/
syntax region fishLineContinuation matchgroup=fishStatement syntax region fishLineContinuation matchgroup=fishStatement
\ start='\v^\s*\zs\k+>' skip='\\$' end='$' \ start='\v^\s*\zs\k+>' skip='\\$' end='$'
\ contains=fishSpecial,fishIdentifier,fishString,fishCharacter,fishStatement,fishCommandSub \ contains=fishSpecial,fishIdentifier,fishString,fishCharacter,fishStatement,fishCommandSub,fishComment
highlight default link fishKeyword Keyword highlight default link fishKeyword Keyword
highlight default link fishConditional Conditional highlight default link fishConditional Conditional

View File

@@ -27,7 +27,9 @@ syn region gitDiff start=/^\%(@@ -\)\@=/ end=/^\%(diff --\%(git\|cc\|combined\)
syn region gitDiffMerge start=/^\%(diff --\%(cc\|combined\) \)\@=/ end=/^\%(diff --\|$\)\@=/ contains=@gitDiff syn region gitDiffMerge start=/^\%(diff --\%(cc\|combined\) \)\@=/ end=/^\%(diff --\|$\)\@=/ contains=@gitDiff
syn region gitDiffMerge start=/^\%(@@@@* -\)\@=/ end=/^\%(diff --\|$\)\@=/ contains=@gitDiff syn region gitDiffMerge start=/^\%(@@@@* -\)\@=/ end=/^\%(diff --\|$\)\@=/ contains=@gitDiff
syn match gitDiffAdded "^ \++.*" contained containedin=gitDiffMerge syn match gitDiffAdded "^ \++.*" contained containedin=gitDiffMerge
syn match gitDiffAdded "{+.*+}" contained containedin=gitDiff
syn match gitDiffRemoved "^ \+-.*" contained containedin=gitDiffMerge syn match gitDiffRemoved "^ \+-.*" contained containedin=gitDiffMerge
syn match gitDiffRemoved "\[-.*-\]" contained containedin=gitDiff
syn match gitKeyword /^\%(object\|type\|tag\|commit\|tree\|parent\|encoding\)\>/ contained containedin=gitHead nextgroup=gitHash,gitType skipwhite syn match gitKeyword /^\%(object\|type\|tag\|commit\|tree\|parent\|encoding\)\>/ contained containedin=gitHead nextgroup=gitHash,gitType skipwhite
syn match gitKeyword /^\%(tag\>\|ref:\)/ contained containedin=gitHead nextgroup=gitReference skipwhite syn match gitKeyword /^\%(tag\>\|ref:\)/ contained containedin=gitHead nextgroup=gitReference skipwhite

View File

@@ -20,11 +20,18 @@ endif
syn include @gitcommitDiff syntax/diff.vim syn include @gitcommitDiff syntax/diff.vim
syn region gitcommitDiff start=/\%(^diff --\%(git\|cc\|combined\) \)\@=/ end=/^\%(diff --\|$\|#\)\@=/ fold contains=@gitcommitDiff syn region gitcommitDiff start=/\%(^diff --\%(git\|cc\|combined\) \)\@=/ end=/^\%(diff --\|$\|#\)\@=/ fold contains=@gitcommitDiff
syn match gitcommitFirstLine "\%^[^#].*" nextgroup=gitcommitBlank skipnl
syn match gitcommitSummary "^.\{0,50\}" contained containedin=gitcommitFirstLine nextgroup=gitcommitOverflow contains=@Spell syn match gitcommitSummary "^.\{0,50\}" contained containedin=gitcommitFirstLine nextgroup=gitcommitOverflow contains=@Spell
syn match gitcommitOverflow ".*" contained contains=@Spell syn match gitcommitOverflow ".*" contained contains=@Spell
syn match gitcommitBlank "^[^#].*" contained contains=@Spell syn match gitcommitBlank "^[^#].*" contained contains=@Spell
syn match gitcommitComment "^#.*"
if get(g:, "gitcommit_cleanup") is# "scissors"
syn match gitcommitFirstLine "\%^.*" nextgroup=gitcommitBlank skipnl
syn region gitcommitComment start=/^# -\+ >8 -\+$/ end=/\%$/ contains=gitcommitDiff
else
syn match gitcommitFirstLine "\%^[^#].*" nextgroup=gitcommitBlank skipnl
syn match gitcommitComment "^#.*"
endif
syn match gitcommitHead "^\%(# .*\n\)\+#$" contained transparent syn match gitcommitHead "^\%(# .*\n\)\+#$" contained transparent
syn match gitcommitOnBranch "\%(^# \)\@<=On branch" contained containedin=gitcommitComment nextgroup=gitcommitBranch skipwhite syn match gitcommitOnBranch "\%(^# \)\@<=On branch" contained containedin=gitcommitComment nextgroup=gitcommitBranch skipwhite
syn match gitcommitOnBranch "\%(^# \)\@<=Your branch .\{-\} '" contained containedin=gitcommitComment nextgroup=gitcommitBranch skipwhite syn match gitcommitOnBranch "\%(^# \)\@<=Your branch .\{-\} '" contained containedin=gitcommitComment nextgroup=gitcommitBranch skipwhite

View File

@@ -10,18 +10,16 @@ if exists("b:current_syntax")
finish finish
endif endif
setlocal iskeyword+=-
setlocal iskeyword-=_
syn case ignore syn case ignore
syn sync minlines=10 syn sync minlines=10
syn match gitconfigComment "[#;].*" syn match gitconfigComment "[#;].*"
syn match gitconfigSection "\%(^\s*\)\@<=\[[a-z0-9.-]\+\]" syn match gitconfigSection "\%(^\s*\)\@<=\[[a-z0-9.-]\+\]"
syn match gitconfigSection '\%(^\s*\)\@<=\[[a-z0-9.-]\+ \+\"\%([^\\"]\|\\.\)*"\]' syn match gitconfigSection '\%(^\s*\)\@<=\[[a-z0-9.-]\+ \+\"\%([^\\"]\|\\.\)*"\]'
syn match gitconfigVariable "\%(^\s*\)\@<=\a\k*\%(\s*\%([=#;]\|$\)\)\@=" nextgroup=gitconfigAssignment skipwhite syn match gitconfigVariable "\%(^\s*\)\@<=\a[a-z0-9-]*\%(\s*\%([=#;]\|$\)\)\@=" nextgroup=gitconfigAssignment skipwhite
syn region gitconfigAssignment matchgroup=gitconfigNone start=+=\s*+ skip=+\\+ end=+\s*$+ contained contains=gitconfigBoolean,gitconfigNumber,gitConfigString,gitConfigEscape,gitConfigError,gitconfigComment keepend syn region gitconfigAssignment matchgroup=gitconfigNone start=+=\s*+ skip=+\\+ end=+\s*$+ contained contains=gitconfigBoolean,gitconfigNumber,gitConfigString,gitConfigEscape,gitConfigError,gitconfigComment keepend
syn keyword gitconfigBoolean true false yes no contained syn keyword gitconfigBoolean true false yes no contained
syn match gitconfigNumber "\d\+" contained syn match gitconfigNumber "\<\d\+\>" contained
syn region gitconfigString matchgroup=gitconfigDelim start=+"+ skip=+\\+ end=+"+ matchgroup=gitconfigError end=+[^\\"]\%#\@!$+ contained contains=gitconfigEscape,gitconfigEscapeError syn region gitconfigString matchgroup=gitconfigDelim start=+"+ skip=+\\+ end=+"+ matchgroup=gitconfigError end=+[^\\"]\%#\@!$+ contained contains=gitconfigEscape,gitconfigEscapeError
syn match gitconfigError +\\.+ contained syn match gitconfigError +\\.+ contained
syn match gitconfigEscape +\\[\\"ntb]+ contained syn match gitconfigEscape +\\[\\"ntb]+ contained

View File

@@ -11,98 +11,6 @@ if exists("b:current_syntax")
finish finish
endif endif
" Set settings to default values.
if !exists("g:go_highlight_array_whitespace_error")
let g:go_highlight_array_whitespace_error = 0
endif
if !exists("g:go_highlight_chan_whitespace_error")
let g:go_highlight_chan_whitespace_error = 0
endif
if !exists("g:go_highlight_extra_types")
let g:go_highlight_extra_types = 0
endif
if !exists("g:go_highlight_space_tab_error")
let g:go_highlight_space_tab_error = 0
endif
if !exists("g:go_highlight_trailing_whitespace_error")
let g:go_highlight_trailing_whitespace_error = 0
endif
if !exists("g:go_highlight_operators")
let g:go_highlight_operators = 0
endif
if !exists("g:go_highlight_functions")
let g:go_highlight_functions = 0
endif
if !exists("g:go_highlight_methods")
let g:go_highlight_methods = 0
endif
if !exists("g:go_highlight_fields")
let g:go_highlight_fields = 0
endif
if !exists("g:go_highlight_types")
let g:go_highlight_types = 0
endif
if !exists("g:go_highlight_build_constraints")
let g:go_highlight_build_constraints = 0
endif
if !exists("g:go_highlight_string_spellcheck")
let g:go_highlight_string_spellcheck = 1
endif
if !exists("g:go_highlight_format_strings")
let g:go_highlight_format_strings = 1
endif
if !exists("g:go_highlight_generate_tags")
let g:go_highlight_generate_tags = 0
endif
if !exists("g:go_highlight_variable_assignments")
let g:go_highlight_variable_assignments = 0
endif
if !exists("g:go_highlight_variable_declarations")
let g:go_highlight_variable_declarations = 0
endif
let s:fold_block = 1
let s:fold_import = 1
let s:fold_varconst = 1
let s:fold_package_comment = 1
let s:fold_comment = 0
if exists("g:go_fold_enable")
" Enabled by default.
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
if index(g:go_fold_enable, 'package_comment') == -1
let s:fold_package_comment = 0
endif
" Disabled by default.
if index(g:go_fold_enable, 'comment') > -1
let s:fold_comment = 1
endif
endif
syn case match syn case match
syn keyword goPackage package syn keyword goPackage package
@@ -140,7 +48,6 @@ hi def link goUnsignedInts Type
hi def link goFloats Type hi def link goFloats Type
hi def link goComplexes Type hi def link goComplexes Type
" Predefined functions and values " Predefined functions and values
syn match goBuiltins /\<\v(append|cap|close|complex|copy|delete|imag|len)\ze\(/ syn match goBuiltins /\<\v(append|cap|close|complex|copy|delete|imag|len)\ze\(/
syn match goBuiltins /\<\v(make|new|panic|print|println|real|recover)\ze\(/ syn match goBuiltins /\<\v(make|new|panic|print|println|real|recover)\ze\(/
@@ -156,7 +63,7 @@ syn keyword goTodo contained TODO FIXME XXX BUG
syn cluster goCommentGroup contains=goTodo syn cluster goCommentGroup contains=goTodo
syn region goComment start="//" end="$" contains=goGenerate,@goCommentGroup,@Spell syn region goComment start="//" end="$" contains=goGenerate,@goCommentGroup,@Spell
if s:fold_comment if go#config#FoldEnable('comment')
syn region goComment start="/\*" end="\*/" contains=@goCommentGroup,@Spell fold syn region goComment start="/\*" end="\*/" contains=@goCommentGroup,@Spell fold
syn match goComment "\v(^\s*//.*\n)+" contains=goGenerate,@goCommentGroup,@Spell fold syn match goComment "\v(^\s*//.*\n)+" contains=goGenerate,@goCommentGroup,@Spell fold
else else
@@ -166,7 +73,7 @@ endif
hi def link goComment Comment hi def link goComment Comment
hi def link goTodo Todo hi def link goTodo Todo
if g:go_highlight_generate_tags != 0 if go#config#HighlightGenerateTags()
syn match goGenerateVariables contained /\(\$GOARCH\|\$GOOS\|\$GOFILE\|\$GOLINE\|\$GOPACKAGE\|\$DOLLAR\)\>/ syn match goGenerateVariables contained /\(\$GOARCH\|\$GOOS\|\$GOFILE\|\$GOLINE\|\$GOPACKAGE\|\$DOLLAR\)\>/
syn region goGenerate start="^\s*//go:generate" end="$" contains=goGenerateVariables syn region goGenerate start="^\s*//go:generate" end="$" contains=goGenerateVariables
hi def link goGenerate PreProc hi def link goGenerate PreProc
@@ -191,7 +98,7 @@ hi def link goEscapeError Error
" Strings and their contents " Strings and their contents
syn cluster goStringGroup contains=goEscapeOctal,goEscapeC,goEscapeX,goEscapeU,goEscapeBigU,goEscapeError syn cluster goStringGroup contains=goEscapeOctal,goEscapeC,goEscapeX,goEscapeU,goEscapeBigU,goEscapeError
if g:go_highlight_string_spellcheck != 0 if go#config#HighlightStringSpellcheck()
syn region goString start=+"+ skip=+\\\\\|\\"+ end=+"+ contains=@goStringGroup,@Spell syn region goString start=+"+ skip=+\\\\\|\\"+ end=+"+ contains=@goStringGroup,@Spell
syn region goRawString start=+`+ end=+`+ contains=@Spell syn region goRawString start=+`+ end=+`+ contains=@Spell
else else
@@ -199,8 +106,20 @@ else
syn region goRawString start=+`+ end=+`+ syn region goRawString start=+`+ end=+`+
endif endif
if g:go_highlight_format_strings != 0 if go#config#HighlightFormatStrings()
syn match goFormatSpecifier /\([^%]\(%%\)*\)\@<=%[-#0 +]*\%(\*\|\d\+\)\=\%(\.\%(\*\|\d\+\)\)*[vTtbcdoqxXUeEfgGsp]/ contained containedin=goString " [n] notation is valid for specifying explicit argument indexes
" 1. Match a literal % not preceded by a %.
" 2. Match any number of -, #, 0, space, or +
" 3. Match * or [n]* or any number or nothing before a .
" 4. Match * or [n]* or any number or nothing after a .
" 5. Match [n] or nothing before a verb
" 6. Match a formatting verb
syn match goFormatSpecifier /\
\([^%]\(%%\)*\)\
\@<=%[-#0 +]*\
\%(\%(\%(\[\d\+\]\)\=\*\)\|\d\+\)\=\
\%(\.\%(\%(\%(\[\d\+\]\)\=\*\)\|\d\+\)\=\)\=\
\%(\[\d\+\]\)\=[vTtbcdoqxXUeEfFgGsp]/ contained containedin=goString,goRawString
hi def link goFormatSpecifier goSpecialString hi def link goFormatSpecifier goSpecialString
endif endif
@@ -215,30 +134,30 @@ hi def link goCharacter Character
" Regions " Regions
syn region goParen start='(' end=')' transparent syn region goParen start='(' end=')' transparent
if s:fold_block if go#config#FoldEnable('block')
syn region goBlock start="{" end="}" transparent fold syn region goBlock start="{" end="}" transparent fold
else else
syn region goBlock start="{" end="}" transparent syn region goBlock start="{" end="}" transparent
endif endif
" import " import
if s:fold_import if go#config#FoldEnable('import')
syn region goImport start='import (' end=')' transparent fold contains=goImport,goString,goComment syn region goImport start='import (' end=')' transparent fold contains=goImport,goString,goComment
else else
syn region goImport start='import (' end=')' transparent contains=goImport,goString,goComment syn region goImport start='import (' end=')' transparent contains=goImport,goString,goComment
endif endif
" var, const " var, const
if s:fold_varconst if go#config#FoldEnable('varconst')
syn region goVar start='var (' end='^\s*)$' transparent fold syn region goVar start='var (' end='^\s*)$' transparent fold
\ contains=ALLBUT,goParen,goBlock,goFunction,goTypeName,goReceiverType,goReceiverVar \ contains=ALLBUT,goParen,goBlock,goFunction,goTypeName,goReceiverType,goReceiverVar,goArgumentName,goArgumentType,goSimpleArguments
syn region goConst start='const (' end='^\s*)$' transparent fold syn region goConst start='const (' end='^\s*)$' transparent fold
\ contains=ALLBUT,goParen,goBlock,goFunction,goTypeName,goReceiverType,goReceiverVar \ contains=ALLBUT,goParen,goBlock,goFunction,goTypeName,goReceiverType,goReceiverVar,goArgumentName,goArgumentType,goSimpleArguments
else else
syn region goVar start='var (' end='^\s*)$' transparent syn region goVar start='var (' end='^\s*)$' transparent
\ contains=ALLBUT,goParen,goBlock,goFunction,goTypeName,goReceiverType,goReceiverVar \ contains=ALLBUT,goParen,goBlock,goFunction,goTypeName,goReceiverType,goReceiverVar,goArgumentName,goArgumentType,goSimpleArguments
syn region goConst start='const (' end='^\s*)$' transparent syn region goConst start='const (' end='^\s*)$' transparent
\ contains=ALLBUT,goParen,goBlock,goFunction,goTypeName,goReceiverType,goReceiverVar \ contains=ALLBUT,goParen,goBlock,goFunction,goTypeName,goReceiverType,goReceiverVar,goArgumentName,goArgumentType,goSimpleArguments
endif endif
" Single-line var, const, and import. " Single-line var, const, and import.
@@ -272,12 +191,12 @@ hi def link goImaginary Number
hi def link goImaginaryFloat Float hi def link goImaginaryFloat Float
" Spaces after "[]" " Spaces after "[]"
if g:go_highlight_array_whitespace_error != 0 if go#config#HighlightArrayWhitespaceError()
syn match goSpaceError display "\(\[\]\)\@<=\s\+" syn match goSpaceError display "\(\[\]\)\@<=\s\+"
endif endif
" Spacing errors around the 'chan' keyword " Spacing errors around the 'chan' keyword
if g:go_highlight_chan_whitespace_error != 0 if go#config#HighlightChanWhitespaceError()
" receive-only annotation on chan type " receive-only annotation on chan type
" "
" \(\<chan\>\)\@<!<- (only pick arrow when it doesn't come after a chan) " \(\<chan\>\)\@<!<- (only pick arrow when it doesn't come after a chan)
@@ -295,7 +214,7 @@ if g:go_highlight_chan_whitespace_error != 0
endif endif
" Extra types commonly seen " Extra types commonly seen
if g:go_highlight_extra_types != 0 if go#config#HighlightExtraTypes()
syn match goExtraType /\<bytes\.\(Buffer\)\>/ syn match goExtraType /\<bytes\.\(Buffer\)\>/
syn match goExtraType /\<io\.\(Reader\|ReadSeeker\|ReadWriter\|ReadCloser\|ReadWriteCloser\|Writer\|WriteCloser\|Seeker\)\>/ syn match goExtraType /\<io\.\(Reader\|ReadSeeker\|ReadWriter\|ReadCloser\|ReadWriteCloser\|Writer\|WriteCloser\|Seeker\)\>/
syn match goExtraType /\<reflect\.\(Kind\|Type\|Value\)\>/ syn match goExtraType /\<reflect\.\(Kind\|Type\|Value\)\>/
@@ -303,12 +222,12 @@ if g:go_highlight_extra_types != 0
endif endif
" Space-tab error " Space-tab error
if g:go_highlight_space_tab_error != 0 if go#config#HighlightSpaceTabError()
syn match goSpaceError display " \+\t"me=e-1 syn match goSpaceError display " \+\t"me=e-1
endif endif
" Trailing white space error " Trailing white space error
if g:go_highlight_trailing_whitespace_error != 0 if go#config#HighlightTrailingWhitespaceError()
syn match goSpaceError display excludenl "\s\+$" syn match goSpaceError display excludenl "\s\+$"
endif endif
@@ -326,7 +245,7 @@ hi def link goTodo Todo
syn match goVarArgs /\.\.\./ syn match goVarArgs /\.\.\./
" Operators; " Operators;
if g:go_highlight_operators != 0 if go#config#HighlightOperators()
" match single-char operators: - + % < > ! & | ^ * = " match single-char operators: - + % < > ! & | ^ * =
" and corresponding two-char operators: -= += %= <= >= != &= |= ^= *= == " and corresponding two-char operators: -= += %= <= >= != &= |= ^= *= ==
syn match goOperator /[-+%<>!&|^*=]=\?/ syn match goOperator /[-+%<>!&|^*=]=\?/
@@ -345,34 +264,40 @@ endif
hi def link goOperator Operator hi def link goOperator Operator
" Functions; " Functions;
if g:go_highlight_functions != 0 if go#config#HighlightFunctions() || go#config#HighlightFunctionArguments()
syn match goDeclaration /\<func\>/ nextgroup=goReceiver,goFunction skipwhite skipnl syn match goDeclaration /\<func\>/ nextgroup=goReceiver,goFunction,goSimpleArguments skipwhite skipnl
syn match goReceiver /(\(\w\|[ *]\)\+)/ contained nextgroup=goFunction contains=goReceiverVar skipwhite skipnl syn match goReceiverVar /\w\+\ze\s\+\(\w\|\*\)/ nextgroup=goPointerOperator,goReceiverType skipwhite skipnl contained
syn match goReceiverVar /\w\+/ nextgroup=goPointerOperator,goReceiverType skipwhite skipnl contained
syn match goPointerOperator /\*/ nextgroup=goReceiverType contained skipwhite skipnl syn match goPointerOperator /\*/ nextgroup=goReceiverType contained skipwhite skipnl
syn match goFunction /\w\+/ nextgroup=goSimpleArguments contained skipwhite skipnl
syn match goReceiverType /\w\+/ contained syn match goReceiverType /\w\+/ contained
syn match goFunction /\w\+/ contained if go#config#HighlightFunctionArguments()
syn match goFunctionCall /\w\+\ze(/ contains=GoBuiltins,goDeclaration syn match goSimpleArguments /(\(\w\|\_s\|[*\.\[\],\{\}<>-]\)*)/ contained contains=goArgumentName nextgroup=goSimpleArguments skipwhite skipnl
syn match goArgumentName /\w\+\(\s*,\s*\w\+\)*\ze\s\+\(\w\|\.\|\*\|\[\)/ contained nextgroup=goArgumentType skipwhite skipnl
syn match goArgumentType /\([^,)]\|\_s\)\+,\?/ contained nextgroup=goArgumentName skipwhite skipnl
\ contains=goVarArgs,goType,goSignedInts,goUnsignedInts,goFloats,goComplexes,goDeclType,goBlock
hi def link goReceiverVar goArgumentName
hi def link goArgumentName Identifier
endif
syn match goReceiver /(\s*\w\+\(\s\+\*\?\s*\w\+\)\?\s*)\ze\s*\w/ contained nextgroup=goFunction contains=goReceiverVar skipwhite skipnl
else else
syn keyword goDeclaration func syn keyword goDeclaration func
endif endif
hi def link goFunction Function hi def link goFunction Function
" Function calls;
if go#config#HighlightFunctionCalls()
syn match goFunctionCall /\w\+\ze(/ contains=goBuiltins,goDeclaration
endif
hi def link goFunctionCall Type hi def link goFunctionCall Type
" Methods;
if g:go_highlight_methods != 0
syn match goMethodCall /\.\w\+\ze(/hs=s+1
endif
hi def link goMethodCall Type
" Fields; " Fields;
if g:go_highlight_fields != 0 if go#config#HighlightFields()
syn match goField /\.\w\+\([.\ \n\r\:\)\[,]\)\@=/hs=s+1 syn match goField /\.\w\+\([.\ \n\r\:\)\[,]\)\@=/hs=s+1
endif endif
hi def link goField Identifier hi def link goField Identifier
" Structs & Interfaces; " Structs & Interfaces;
if g:go_highlight_types != 0 if go#config#HighlightTypes()
syn match goTypeConstructor /\<\w\+{\@=/ syn match goTypeConstructor /\<\w\+{\@=/
syn match goTypeDecl /\<type\>/ nextgroup=goTypeName skipwhite skipnl syn match goTypeDecl /\<type\>/ nextgroup=goTypeName skipwhite skipnl
syn match goTypeName /\w\+/ contained nextgroup=goDeclType skipwhite skipnl syn match goTypeName /\w\+/ contained nextgroup=goDeclType skipwhite skipnl
@@ -388,19 +313,19 @@ hi def link goTypeDecl Keyword
hi def link goDeclType Keyword hi def link goDeclType Keyword
" Variable Assignments " Variable Assignments
if g:go_highlight_variable_assignments != 0 if go#config#HighlightVariableAssignments()
syn match goVarAssign /\v[_.[:alnum:]]+(,\s*[_.[:alnum:]]+)*\ze(\s*([-^+|^\/%&]|\*|\<\<|\>\>|\&\^)?\=[^=])/ syn match goVarAssign /\v[_.[:alnum:]]+(,\s*[_.[:alnum:]]+)*\ze(\s*([-^+|^\/%&]|\*|\<\<|\>\>|\&\^)?\=[^=])/
hi def link goVarAssign Special hi def link goVarAssign Special
endif endif
" Variable Declarations " Variable Declarations
if g:go_highlight_variable_declarations != 0 if go#config#HighlightVariableDeclarations()
syn match goVarDefs /\v\w+(,\s*\w+)*\ze(\s*:\=)/ syn match goVarDefs /\v\w+(,\s*\w+)*\ze(\s*:\=)/
hi def link goVarDefs Special hi def link goVarDefs Special
endif endif
" Build Constraints " Build Constraints
if g:go_highlight_build_constraints != 0 if go#config#HighlightBuildConstraints()
syn match goBuildKeyword display contained "+build" syn match goBuildKeyword display contained "+build"
" Highlight the known values of GOOS, GOARCH, and other +build options. " Highlight the known values of GOOS, GOARCH, and other +build options.
syn keyword goBuildDirectives contained syn keyword goBuildDirectives contained
@@ -422,7 +347,7 @@ if g:go_highlight_build_constraints != 0
hi def link goBuildKeyword PreProc hi def link goBuildKeyword PreProc
endif endif
if g:go_highlight_build_constraints != 0 || s:fold_package_comment if go#config#HighlightBuildConstraints() || go#config#FoldEnable('package_comment')
" One or more line comments that are followed immediately by a "package" " One or more line comments that are followed immediately by a "package"
" declaration are treated like package documentation, so these must be " declaration are treated like package documentation, so these must be
" matched as comments to avoid looking like working build constraints. " matched as comments to avoid looking like working build constraints.
@@ -431,11 +356,11 @@ if g:go_highlight_build_constraints != 0 || s:fold_package_comment
exe 'syn region goPackageComment start=/\v(\/\/.*\n)+\s*package/' exe 'syn region goPackageComment start=/\v(\/\/.*\n)+\s*package/'
\ . ' end=/\v\n\s*package/he=e-7,me=e-7,re=e-7' \ . ' end=/\v\n\s*package/he=e-7,me=e-7,re=e-7'
\ . ' contains=@goCommentGroup,@Spell' \ . ' contains=@goCommentGroup,@Spell'
\ . (s:fold_package_comment ? ' fold' : '') \ . (go#config#FoldEnable('package_comment') ? ' fold' : '')
exe 'syn region goPackageComment start=/\v\/\*.*\n(.*\n)*\s*\*\/\npackage/' exe 'syn region goPackageComment start=/\v^\s*\/\*.*\n(.*\n)*\s*\*\/\npackage/'
\ . ' end=/\v\n\s*package/he=e-7,me=e-7,re=e-7' \ . ' end=/\v\*\/\n\s*package/he=e-7,me=e-7,re=e-7'
\ . ' contains=@goCommentGroup,@Spell' \ . ' contains=@goCommentGroup,@Spell'
\ . (s:fold_package_comment ? ' fold' : '') \ . (go#config#FoldEnable('package_comment') ? ' fold' : '')
hi def link goPackageComment Comment hi def link goPackageComment Comment
endif endif

17
syntax/godebugoutput.vim Normal file
View File

@@ -0,0 +1,17 @@
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'go') == -1
if exists("b:current_syntax")
finish
endif
syn match godebugOutputErr '^ERR:.*'
syn match godebugOutputOut '^OUT:.*'
let b:current_syntax = "godebugoutput"
hi def link godebugOutputErr Comment
hi def link godebugOutputOut Normal
" vim: sw=2 ts=2 et
endif

View File

@@ -0,0 +1,15 @@
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'go') == -1
if exists("b:current_syntax")
finish
endif
syn match godebugStacktrace '^\S\+'
let b:current_syntax = "godebugoutput"
hi def link godebugStacktrace SpecialKey
" vim: sw=2 ts=2 et
endif

View File

@@ -0,0 +1,27 @@
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'go') == -1
if exists("b:current_syntax")
finish
endif
syn match godebugTitle '^#.*'
syn match godebugVariables '^\s*\S\+\ze:'
syn keyword goType chan map bool string error
syn keyword goSignedInts int int8 int16 int32 int64 rune
syn keyword goUnsignedInts byte uint uint8 uint16 uint32 uint64 uintptr
syn keyword goFloats float32 float64
syn keyword goComplexes complex64 complex128
syn keyword goBoolean true false
let b:current_syntax = "godebugvariables"
hi def link godebugTitle Underlined
hi def link godebugVariables Statement
hi def link goType Type
hi def link goBoolean Boolean
" vim: sw=2 ts=2 et
endif

View File

@@ -12,6 +12,8 @@ runtime! syntax/gotexttmpl.vim
runtime! syntax/html.vim runtime! syntax/html.vim
unlet b:current_syntax unlet b:current_syntax
syn cluster htmlPreproc add=gotplAction,goTplComment
let b:current_syntax = "gohtmltmpl" let b:current_syntax = "gohtmltmpl"
" vim: sw=2 ts=2 et " vim: sw=2 ts=2 et

68
syntax/graphql.vim Normal file
View File

@@ -0,0 +1,68 @@
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'graphql') == -1
" Vim syntax file
" Language: GraphQL
" Maintainer: Jon Parise <jon@indelible.org>
if exists('b:current_syntax')
finish
endif
syn match graphqlComment "#.*$" contains=@Spell
syn match graphqlOperator "=" display
syn match graphqlOperator "!" display
syn match graphqlOperator "|" display
syn match graphqlOperator "\M..." display
syn keyword graphqlBoolean true false
syn keyword graphqlNull null
syn match graphqlNumber "-\=\<\%(0\|[1-9]\d*\)\%(\.\d\+\)\=\%([eE][-+]\=\d\+\)\=\>" display
syn region graphqlString start=+"+ skip=+\\\\\|\\"+ end=+"\|$+
syn region graphqlString start=+"""+ end=+"""+
syn keyword graphqlKeyword on nextgroup=graphqlType skipwhite
syn keyword graphqlStructure enum scalar type union nextgroup=graphqlType skipwhite
syn keyword graphqlStructure input interface subscription nextgroup=graphqlType skipwhite
syn keyword graphqlStructure implements nextgroup=graphqlType skipwhite
syn keyword graphqlStructure query mutation fragment nextgroup=graphqlName skipwhite
syn keyword graphqlStructure directive nextgroup=graphqlDirective skipwhite
syn keyword graphqlStructure extend nextgroup=graphqlStructure skipwhite
syn keyword graphqlStructure schema nextgroup=graphqlFold skipwhite
syn match graphqlDirective "\<@\h\w*\>" display
syn match graphqlVariable "\<\$\h\w*\>" display
syn match graphqlName "\<\h\w*\>" display
syn match graphqlType "\<_*\u\w*\>" display
syn match graphqlConstant "\<[A-Z_]\+\>" display
syn keyword graphqlMetaFields __schema __type __typename
syn region graphqlFold matchgroup=graphqlBraces start="{" end=/}\(\_s\+\ze\("\|{\)\)\@!/ transparent fold contains=ALLBUT,graphqlStructure
syn region graphqlList matchgroup=graphqlBraces start="\[" end=/]\(\_s\+\ze"\)\@!/ transparent contains=ALLBUT,graphqlDirective,graphqlStructure
hi def link graphqlComment Comment
hi def link graphqlOperator Operator
hi def link graphqlBraces Delimiter
hi def link graphqlBoolean Boolean
hi def link graphqlNull Keyword
hi def link graphqlNumber Number
hi def link graphqlString String
hi def link graphqlConstant Constant
hi def link graphqlDirective PreProc
hi def link graphqlName Identifier
hi def link graphqlMetaFields Special
hi def link graphqlKeyword Keyword
hi def link graphqlStructure Structure
hi def link graphqlType Type
hi def link graphqlVariable Identifier
syn sync minlines=500
let b:current_syntax = 'graphql'
endif

360
syntax/haproxy.vim Normal file
View File

@@ -0,0 +1,360 @@
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'haproxy') == -1
" Vim syntax file
" Language: HAproxy
" Maintainer: Dan Reif
" Last Change: Mar 2, 2018
" Version: 0.5
" URL: https://github.com/CH-DanReif/haproxy.vim
" For version 5.x: Clear all syntax items
" For version 6.x: Quit when a syntax file was already loaded
if version < 600
syntax clear
elseif exists("b:current_syntax")
finish
endif
if version >= 600
setlocal iskeyword=_,-,a-z,A-Z,48-57
else
set iskeyword=_,-,a-z,A-Z,48-57
endif
" Escaped chars
syn match hapEscape +\\\(\\\| \|n\|r\|t\|#\|x\x\x\)+
" Match whitespace at the end of a line
syn match hapNothingErr /\s\+\ze\(#.*\)\?$/ contained nextgroup=hapGreedyComment
" Match anything other than whitespace; flag as error if found. 'contained'
" because comments are valid where otherwise only hapNothing is.
syn match hapNothingErr /\s*\zs[^# \t][^#]*/ contained nextgroup=hapGreedyComment
" Comments
syn match hapComment /\(^\|\s\)#.*$/ contains=hapTodo
" `acl foo path_reg hi[#]mom` is an error because [ is unclosed. (!!!)
syn match hapGreedyComment /#.*$/ contained containedin=hapAclRemainder contains=hapTodo
syn keyword hapTodo TODO FIXME XXX contained
" `daemon#hi mom` is perfectly valid. :/
syn cluster hapNothing contains=hapNothingErr,hapGreedyComment
" Case-insensitive matching
syn case ignore
" Sections
syn match hapSection /^\s*\(global\|defaults\)/
syn match hapSection /^\s*\(backend\|frontend\|listen\|ruleset\|userlist\)/ skipwhite nextgroup=hapSectLabel
syn match hapSectLabel /\S\+/ skipwhite nextgroup=hapIp1 contained
syn match hapIp1 /\(\d\{1,3}\.\d\{1,3}\.\d\{1,3}\.\d\{1,3}\)\?:\d\{1,5}/ nextgroup=hapIp2 contained
syn match hapIp2 /,\(\d\{1,3}\.\d\{1,3}\.\d\{1,3}\.\d\{1,3}\)\?:\d\{1,5}/hs=s+1 nextgroup=hapIp2 contained
" Timeouts. We try to hint towards the use of 'ms' and 's' when
" g:haproxy_guess_ms_sec is set. We consider the lack of either 'ms' or 's'
" as an error when haproxy_enforce_ms_sec is set. (HAproxy's default is 'ms',
" but that arguably leads to ambiguity in the config.)
if get(g:, 'haproxy_guess_ms_sec', 1)
" Timeouts and such specified in ms, where seconds are *allowed*, but are
" probably a mistake.
syn match hapNumberMS /\d\+m\?s/ contained transparent
syn match hapError /\d\+\zss\ze/ contained containedin=hapNumberMS
endif
if get(g:, 'haproxy_enforce_ms_sec', 1)
syn match hapNumberMS /\d\+\(m\?s\)\?/ contained transparent
syn match hapError /\d\+\(m\?s\)\@!\(\D\|$\)/ contained containedin=hapNumberMS
syn match hapNumberMS /\d\+m\?s/ contained
else
syn match hapNumberMS /\d\+m\?s/ contained
endif
if get(g:, 'haproxy_guess_ms_sec', 1)
" Timeouts generally specified in whole seconds, where we want to highlight
" errant 'm's.
syn match hapNumberSec /\d\+m\?s/ contained transparent
syn match hapError /\d\+\zsm\zes/ contained containedin=hapNumberSec
endif
if get(g:, 'haproxy_enforce_ms_sec', 1)
syn match hapNumberSec /\d\+\(m\?s\)\?/ contained transparent
syn match hapError /\d\+\(m\?s\)\@!\(\D\|$\)/ contained containedin=hapNumberSec
syn match hapNumberSec /\d\+m\?s/ contained
else
syn match hapNumberSec /\d\+m\?s/ contained
endif
" Other numbers, no 'ms'.
syn match hapNumber /[0-9]\+/ contained
" Timeout types
syn keyword hapTimeoutType connect client server contained skipwhite nextgroup=hapNumberMS
" URIs
syn match hapAbsURI /\/\S*/ contained
syn match hapURI /\S*/ contained
" File paths (always absolute, and never just '/' unless you're insane)
syn match hapFilePath /\/\S\+/ contained
" SSL configuration keywords
syn match hapSSLCiphersAll /\s\+\zs.*/ contained transparent
syn match hapSSLCiphersError /.\+/ contained containedin=hapSSLCiphersAll
syn match hapSSLCiphers /\([-+!]\?[A-Z0-9-]\+[:+]\)*[-+!]\?[A-Z0-9-]\+/ contained containedin=hapSSLCiphersAll
"
" ACLs
"
" This comes first, lest it gobble up everything else.
syn match hapAclName /\S\+/ contained skipwhite nextgroup=hapAclCriterion
syn match hapAclCriterion /FALSE\|HTTP\|HTTP_1\.0\|HTTP_1\.1\|HTTP_CONTENT\|HTTP_URL_ABS\|HTTP_URL_SLASH\|HTTP_URL_STAR\|LOCALHOST\|METH_CONNECT\|METH_GET\|METH_HEAD\|METH_OPTIONS\|METH_POST\|METH_TRACE\|RDP_COOKIE\|REQ_CONTENT\|TRUE\|WAIT_END\|\(req_rdp_cookie\|s\?cook\|s\?hdr\|http_auth_group\|urlp\)\(_\(beg\|dir\|dom\|end\|len\|reg\|sub\|cnt\)\)\?([^)]*)\|\(req_ssl_[a-z]\+\|base\|method\|path\|req_ver\|resp_ver\|url\)\(_\(beg\|dir\|dom\|end\|len\|reg\|sub\|cnt\)\)\?/ contained skipwhite nextgroup=hapAclConverterOrNothing
" This one's a bit tricky. Match zero or more converters, and then *require* the
" space afterwards. Strictly speaking, deviates from the BNF, but only in
" pathological cases ('acl lolwat TRUE,upper').
syn match hapAclConverterOrNothing /\(,\(\(base64\|bool\|cpl\|debug\|even\|hex\|lower\|neg\|not\|odd\|upper\|url_dec\)\|\(add\|and\|bytes\|crc32\|da-csv-conv\|div\|djb2\|field\|http_date\|in_table\|ipmask\|json\|language\|ltime\|map\|mod\|mul\|or\|regsub\|capture-req\|capture-res\|sdbm\|sub\|table_[a-z0-9_]\+\|utime\|word\|wt6\|xor\)([^)]*)\)\)*\s\+/ contained nextgroup=hapAclFlag,hapAclFlagWithParameter,hapAclOperator
syn match hapAclFlag /-[-in]/ contained skipwhite nextgroup=hapAclFlag,hapAclFlagWithParameter,hapAclOperator
syn match hapAclFlagWithParameter /-[fmMu]/ contained skipwhite nextgroup=hapAclFlagParameter
syn match hapAclFlagParameter /\S\+/ contained skipwhite nextgroup=hapAclFlag,hapAclFlagWithParameter,hapAclOperator
syn match hapAclOperator /eq\|ge\|gt\|le\|lt/ contained skipwhite
syn match hapAclRemainder /.*/ contained transparent
" Generic tune.ssl
syn match hapParam /tune\.ssl\.[a-z0-9-]\+/
" tune.ssl where we know what follows
syn match hapParam /tune\.ssl\.default-dh-param/ skipwhite nextgroup=hapNumber
syn keyword hapSSLServerVerify none required contained skipwhite nextgroup=@hapNothing
" Keywords deprecated for at least a decade. Kill 'em.
syn keyword hapError cliexp srvexp
" Parameters
syn keyword hapParam timeout skipwhite nextgroup=hapTimeoutType
syn keyword hapParam chroot pidfile skipwhite nextgroup=hapFilePath
syn keyword hapParam clitimeout skipwhite nextgroup=hapNumberMS
syn keyword hapParam contimeout skipwhite nextgroup=hapNumberMS
syn keyword hapParam daemon debug disabled skipwhite nextgroup=@hapNothing
syn keyword hapParam enabled skipwhite nextgroup=@hapNothing
syn keyword hapParam fullconn maxconn skipwhite nextgroup=hapNumber
syn keyword hapParam gid skipwhite nextgroup=hapNumber
syn keyword hapParam group
syn keyword hapParam grace skipwhite nextgroup=hapNumberMS
syn keyword hapParam monitor-uri skipwhite nextgroup=hapAbsURI
syn keyword hapParam nbproc skipwhite nextgroup=hapNumber
syn keyword hapParam noepoll nopoll skipwhite nextgroup=@hapNothing
syn keyword hapParam quiet skipwhite nextgroup=@hapNothing
syn keyword hapParam redispatch retries skipwhite nextgroup=hapNumber
" 'add' takes exactly one string, not regexes
syn keyword hapParam reqadd reqiadd skipwhite nextgroup=hapOneStringIfUnless
syn keyword hapParam rspadd rspiadd skipwhite nextgroup=hapOneStringIfUnless
" All of these take exactly one regexp
syn match hapParam /reqi\?\(allow\|del\)/ skipwhite nextgroup=hapOneRegexpIfUnless
syn match hapParam /reqi\?\(deny\|pass\)/ skipwhite nextgroup=hapOneRegexpIfUnless
syn match hapParam /reqi\?\(tarpit\)/ skipwhite nextgroup=hapOneRegexpIfUnless
syn match hapParam /rspi\?\(del\|deny\)/ skipwhite nextgroup=hapOneRegexpIfUnless
" 'rep' is unique in taking two regexes (one search, one replace)
syn keyword hapParam reqrep reqirep skipwhite nextgroup=hapRegSearchReplIfUnless
syn keyword hapParam rsprep rspirep skipwhite nextgroup=hapRegSearchReplIfUnless
syn keyword hapParam reqsetbe reqisetbe skipwhite nextgroup=hapRegexpBE
syn keyword hapParam server source
syn keyword hapParam srvtimeout skipwhite nextgroup=hapNumberMS
syn keyword hapParam uid ulimit-n skipwhite nextgroup=hapNumber
syn keyword hapParam user
syn keyword hapParam acl skipwhite nextgroup=hapAclName
syn keyword hapParam errorloc skipwhite nextgroup=hapStatusURI
syn keyword hapParam errorloc302 errorloc303 skipwhite nextgroup=hapStatusURI
syn keyword hapParam default_backend skipwhite nextgroup=hapSectLabel
syn keyword hapParam use_backend skipwhite nextgroup=hapSectLabel
syn keyword hapParam appsession skipwhite nextgroup=hapAppSess
syn keyword hapParam bind skipwhite nextgroup=hapIp1
syn keyword hapParam balance skipwhite nextgroup=hapBalance
syn keyword hapParam cookie skipwhite nextgroup=hapCookieNam
syn keyword hapParam capture skipwhite nextgroup=hapCapture
syn keyword hapParam dispatch skipwhite nextgroup=hapIpPort
syn keyword hapParam source skipwhite nextgroup=hapIpPort
syn keyword hapParam mode skipwhite nextgroup=hapMode
syn keyword hapParam monitor-net skipwhite nextgroup=hapIPv4Mask
syn keyword hapParam option skipwhite nextgroup=hapOption
syn keyword hapParam stats skipwhite nextgroup=hapStats
syn keyword hapParam server skipwhite nextgroup=hapServerN
syn keyword hapParam source skipwhite nextgroup=hapServerEOL
syn keyword hapParam log skipwhite nextgroup=hapGLog,hapLogIp,hapFilePath
syn keyword hapParam ca-base skipwhite nextgroup=hapFilePath
syn keyword hapParam crt-base skipwhite nextgroup=hapFilePath
syn keyword hapParam ssl-default-bind-ciphers skipwhite nextgroup=hapSSLCiphersAll
syn keyword hapParam ssl-default-bind-options skipwhite nextgroup=hapGLog,hapLogIp
syn keyword hapParam ssl-server-verify skipwhite nextgroup=hapSSLServerVerify
syn keyword hapParam errorfile skipwhite nextgroup=hapStatusPath
syn keyword hapParam http-request skipwhite nextgroup=hapHttpRequestVerb
" Transparent is a Vim keyword, so we need a regexp to match it
syn match hapParam /transparent/
" Options and additional parameters
syn keyword hapAppSess len timeout contained
syn keyword hapBalance roundrobin source contained
syn keyword hapLen len contained
syn keyword hapGLog global contained
syn keyword hapMode http tcp health contained
syn keyword hapOption abortonclose allbackups checkcache clitcpka dontlognull contained
syn keyword hapOption forceclose forwardfor http-server-close contained
syn keyword hapOption httpchk httpclose httplog keepalive logasap contained
syn keyword hapOption persist srvtcpka ssl-hello-chk contained
syn keyword hapOption tcplog tcpka tcpsplice contained
syn keyword hapOption except contained skipwhite nextgroup=hapIPv4Mask
" Transparent is a Vim keyword, so we need a regexp to match it
syn match hapOption /transparent/ contained
syn keyword hapStats realm auth scope enable contained
syn keyword hapStats uri contained skipwhite nextgroup=hapAbsURI
syn keyword hapStats socket contained skipwhite nextgroup=hapFilePath
syn keyword hapStats timeout contained skipwhite nextgroup=hapNumberMS
syn keyword hapLogFac kern user mail daemon auth syslog lpr news contained skipwhite nextgroup=hapLogLvl
syn keyword hapLogFac uucp cron auth2 ftp ntp audit alert cron2 contained skipwhite nextgroup=hapLogLvl
syn keyword hapLogFac local0 local1 local2 local3 local4 local5 local6 local7 contained skipwhite nextgroup=hapLogLvl
syn keyword hapLogLvl emerg alert crit err warning notice info debug contained
syn keyword hapCookieKey rewrite insert nocache postonly indirect prefix contained skipwhite nextgroup=hapCookieKey
syn keyword hapCapture cookie contained skipwhite nextgroup=hapNameLen
syn keyword hapCapture request response contained skipwhite nextgroup=hapHeader
syn keyword hapHeader header contained skipwhite nextgroup=hapNameLen
syn keyword hapSrvKey backup cookie check inter rise fall port contained
syn keyword hapSrvKey source minconn maxconn weight usesrc contained
syn match hapStatus /\d\{3}/ contained
syn match hapStatusPath /\d\{3}/ contained skipwhite nextgroup=hapFilePath
syn match hapStatusURI /\d\{3}/ contained skipwhite nextgroup=hapURI
syn match hapIPv4Mask /\d\{1,3}\.\d\{1,3}\.\d\{1,3}\.\d\{1,3}\(\/\d\{1,2}\)\?/ contained
syn match hapLogIp /\d\{1,3}\.\d\{1,3}\.\d\{1,3}\.\d\{1,3}/ contained skipwhite nextgroup=hapLogFac
syn match hapIpPort /\d\{1,3}\.\d\{1,3}\.\d\{1,3}\.\d\{1,3}:\d\{1,5}/ contained
syn match hapServerAd /\d\{1,3}\.\d\{1,3}\.\d\{1,3}\.\d\{1,3}\(:[+-]\?\d\{1,5}\)\?/ contained skipwhite nextgroup=hapSrvEOL
syn match hapNameLen /\S\+/ contained skipwhite nextgroup=hapLen
syn match hapCookieNam /\S\+/ contained skipwhite nextgroup=hapCookieKey
syn match hapServerN /\S\+/ contained skipwhite nextgroup=hapServerAd
syn region hapSrvEOL start=/\S/ end=/$/ contains=hapSrvKey contained
" Brutally stolen from https://github.com/vim-perl/vim-perl:
syn match hapPerlSpecialMatch "\\\%(\o\{1,3}\|x\%({\x\+}\|\x\{1,2}\)\|c.\|[^cx]\)" contained extend
syn match hapPerlSpecialMatch "\\." extend contained contains=NONE
syn match hapPerlSpecialMatch "\\\\" contained
syn match hapPerlSpecialMatch "\\[1-9]" contained extend
syn match hapPerlSpecialMatch "\\g\%(\d\+\|{\%(-\=\d\+\|\h\w*\)}\)" contained
syn match hapPerlSpecialMatch "\\k\%(<\h\w*>\|'\h\w*'\)" contained
syn match hapPerlSpecialMatch "{\d\+\%(,\%(\d\+\)\=\)\=}" contained
syn match hapPerlSpecialMatch "\[[]-]\=[^\[\]]*[]-]\=\]" contained extend
syn match hapPerlSpecialMatch "[+*()?.]" contained
syn match hapPerlSpecialMatch "(?[#:=!]" contained
syn match hapPerlSpecialMatch "(?[impsx]*\%(-[imsx]\+\)\=)" contained
syn match hapPerlSpecialMatch "(?\%([-+]\=\d\+\|R\))" contained
syn match hapPerlSpecialMatch "(?\%(&\|P[>=]\)\h\w*)" contained
syn region hapOneRegexpIfUnless contained start=/\S/ end=/\(\ze\s\|$\)/ skip=/\\ / contains=hapPerlSpecialMatch nextgroup=hapIfUnless,@hapNothing skipwhite
syn region hapRegSearchReplIfUnless contained start=/\S/ end=/\(\s\|$\)/ skip=/\\ / contains=hapPerlSpecialMatch nextgroup=hapRegReplIfUnless skipwhite
syn region hapRegReplIfUnless contained start=/\S/ end=/$/ contains=hapComment,hapEscape,hapPerlSpecialMatch nextgroup=hapIfUnless skipwhite
syn region hapRegexpBE contained start=/\S/ end=/\(\s\|$\)/ skip=/\\ / contains=hapPerlSpecialMatch nextgroup=hapSectLabel skipwhite
"
" http-request
"
" http-request verbs that don't allow parameters
syn keyword hapHttpRequestVerb allow tarpit silent-drop contained skipwhite nextgroup=hapHttpIfUnless
" http-request verbs with optional parameters
syn keyword hapHttpRequestVerb auth deny contained skipwhite nextgroup=hapHttpIfUnless,hapHttpRequestParam
" http-request verbs with required parameters
syn keyword hapHttpRequestVerb redirect add-header set-header capture contained skipwhite nextgroup=hapHttpRequestParam
syn keyword hapHttpRequestVerb del-header set-nice set-log-level replace-header contained skipwhite nextgroup=hapHttpRequestParam
syn keyword hapHttpRequestVerb replace-value set-method set-path set-query contained skipwhite nextgroup=hapHttpRequestParam
syn keyword hapHttpRequestVerb set-uri set-tos set-mark contained skipwhite nextgroup=hapHttpRequestParam
" http-request verbs with both parenthetical arguments and required parameters
syn match hapHttpRequestVerb /\(add-acl\|del-acl\|del-map\|set-map\)([^)]*)/ contained skipwhite nextgroup=hapHttpRequestParam
syn match hapHttpRequestVerb /\(set-var\|unset-var\)([^)]*)/ contained skipwhite nextgroup=hapHttpRequestParam
syn match hapHttpRequestVerb /\(sc-inc-gpc0\|sc-set-gpt0\)([^)]*)/ contained skipwhite nextgroup=hapHttpRequestParam
" http-request verbs with parenthetical arguments, but without parameters
syn match hapHttpRequestVerb /\(unset-var\|sc-inc-gpc0\)([^)]*)/ contained skipwhite nextgroup=hapHttpIfUnless
" Listed first because we want to match this rather than hapHttpRequestParam,
" which can be just about anything (including these two keywords). 'keyword'
" is actually higher priority inside the highlighter, but we'll play it extra
" safe by doing this ordering trick, too.
syn keyword hapIfUnless if unless contained skipwhite nextgroup=hapIfUnlessCond
" A little bit of fancy footwork here, because we want to match the log-format
" parameters inside of the string separately.
syn match hapHttpRequestParam /|S\+/ contained skipwhite nextgroup=hapIfUnless,hapHttpRequestParam transparent
syn match hapHttpLogFormatStr /%\[[^][]\+\]/ contained containedin=hapHttpRequestParam
syn match hapHttpLogFormatErr /%\(\[[^][]\+\]\)\@!.*/ contained containedin=hapHttpRequestParam
syn match hapHttpRequestParamLiteral /[^%]\+/ contained containedin=hapHttpRequestParam
" Define the default highlighting.
" For version 5.7 and earlier: only when not done already
" For version 5.8 and later: only when an item doesn't have highlighting yet
if version < 508
command -nargs=+ HiLink hi link <args>
else
command -nargs=+ HiLink hi def link <args>
endif
HiLink hapError Error
HiLink hapNothingErr hapError
HiLink hapEscape SpecialChar
HiLink hapComment Comment
HiLink hapGreedyComment Comment
HiLink hapTodo Todo
HiLink hapSection Underlined
HiLink hapSectLabel Identifier
HiLink hapParam Keyword
HiLink hapSSLCiphers String
HiLink hapSSLCiphersError Error
HiLink hapTimeoutType hapParam
HiLink hapOneRegexpIfUnless String
HiLink hapTwoRegexpsIfUnless hapRegexp
HiLink hapRegReplIfUnless hapRegexp
HiLink hapRegexpBE hapRegexp
HiLink hapPerlSpecialMatch Special
HiLink hapFilePath String
HiLink hapURI String
HiLink hapAbsURI hapURI
HiLink hapIp1 Number
HiLink hapIp2 hapIp1
HiLink hapLogIp hapIp1
HiLink hapIpPort hapIp1
HiLink hapIPv4Mask hapIp1
HiLink hapServerAd hapIp1
HiLink hapStatus Number
HiLink hapStatusPath hapStatus
HiLink hapStatusURI hapStatus
HiLink hapNumber Number
HiLink hapNumberMS hapNumber
HiLink hapNumberSec hapNumber
HiLink hapAclName Identifier
HiLink hapAclCriterion String
HiLink hapAclConverterOrNothing Special
HiLink hapAclFlag Special
HiLink hapAclFlagWithParameter Special
HiLink hapAclFlagParameter String
HiLink hapAclOperator Operator
HiLink hapAclPattern String
HiLink hapHttpRequestVerb Operator
HiLink hapIfUnless Operator
HiLink hapHttpRequestParamLiteral String
HiLink hapHttpLogFormatStr Special
HiLink hapHttpLogFormatErr Error
HiLink hapOption Operator
HiLink hapAppSess hapOption
HiLink hapBalance hapOption
HiLink hapCapture hapOption
HiLink hapCookieKey hapOption
HiLink hapHeader hapOption
HiLink hapGLog hapOption
HiLink hapLogFac hapOption
HiLink hapLogLvl hapOption
HiLink hapMode hapOption
HiLink hapStats hapOption
HiLink hapLen hapOption
HiLink hapSrvKey hapOption
delcommand HiLink
let b:current_syntax = "haproxy"
" vim: ts=8
endif

View File

@@ -38,7 +38,8 @@ syn match haskellTypeSig
\ haskellParens \ haskellParens
syn keyword haskellWhere where syn keyword haskellWhere where
syn keyword haskellLet let syn keyword haskellLet let
syn keyword haskellDeclKeyword module class instance newtype deriving in syn match HaskellDerive "\<deriving\>\(\s\+\<\(anyclass\|instance\|newtype\|stock\)\>\)\?"
syn keyword haskellDeclKeyword module class instance newtype in
syn match haskellDecl "\<\(type\|data\)\>\s\+\(\<family\>\)\?" syn match haskellDecl "\<\(type\|data\)\>\s\+\(\<family\>\)\?"
syn keyword haskellDefault default syn keyword haskellDefault default
syn keyword haskellImportKeywords import qualified safe as hiding contained syn keyword haskellImportKeywords import qualified safe as hiding contained
@@ -57,6 +58,7 @@ syn match haskellImport "^\s*\<import\>\s\+\(\<safe\>\s\+\)\?\(\<qualified\>\s\+
\ haskellType, \ haskellType,
\ haskellLineComment, \ haskellLineComment,
\ haskellBlockComment, \ haskellBlockComment,
\ haskellString,
\ haskellPragma \ haskellPragma
syn keyword haskellKeyword do case of syn keyword haskellKeyword do case of
if get(g:, 'haskell_enable_static_pointers', 0) if get(g:, 'haskell_enable_static_pointers', 0)
@@ -161,11 +163,13 @@ highlight def link haskellType Type
highlight def link haskellImportKeywords Include highlight def link haskellImportKeywords Include
if get(g:, 'haskell_classic_highlighting', 0) if get(g:, 'haskell_classic_highlighting', 0)
highlight def link haskellDeclKeyword Keyword highlight def link haskellDeclKeyword Keyword
highlight def link HaskellDerive Keyword
highlight def link haskellDecl Keyword highlight def link haskellDecl Keyword
highlight def link haskellWhere Keyword highlight def link haskellWhere Keyword
highlight def link haskellLet Keyword highlight def link haskellLet Keyword
else else
highlight def link haskellDeclKeyword Structure highlight def link haskellDeclKeyword Structure
highlight def link HaskellDerive Structure
highlight def link haskellDecl Structure highlight def link haskellDecl Structure
highlight def link haskellWhere Structure highlight def link haskellWhere Structure
highlight def link haskellLet Structure highlight def link haskellLet Structure

View File

@@ -79,6 +79,7 @@ syn keyword htmlTagName contained uplimit variance vector vectorproduct xor
" Custom Element " Custom Element
syn match htmlTagName contained "\<[a-z][-.0-9_a-z]*-[-.0-9_a-z]*\>" syn match htmlTagName contained "\<[a-z][-.0-9_a-z]*-[-.0-9_a-z]*\>"
syn match htmlTagName contained "[.0-9_a-z]\@<=-[-.0-9_a-z]*\>"
" HTML 5 arguments " HTML 5 arguments
" Core Attributes " Core Attributes
@@ -112,7 +113,7 @@ syn keyword htmlArg contained async
" <content> " <content>
syn keyword htmlArg contained select syn keyword htmlArg contained select
" <iframe> " <iframe>
syn keyword htmlArg contained seamless srcdoc sandbox allowfullscreen allowusermedia allowpaymentrequest syn keyword htmlArg contained seamless srcdoc sandbox allowfullscreen allowusermedia allowpaymentrequest allowpresentation
" <picture> " <picture>
syn keyword htmlArg contained srcset sizes syn keyword htmlArg contained srcset sizes
" <a> " <a>
@@ -126,6 +127,10 @@ syn keyword htmlArg contained integrity crossorigin
" <link> " <link>
syn keyword htmlArg contained prefetch syn keyword htmlArg contained prefetch
" syn keyword htmlArg contained preload " syn keyword htmlArg contained preload
" <img>
syn keyword htmlArg contained decoding
" https://w3c.github.io/selection-api/#extensions-to-globaleventhandlers
syn keyword htmlArg contained onselectstart onselectionchange
" Custom Data Attributes " Custom Data Attributes
" http://w3c.github.io/html/single-page.html#embedding-custom-non-visible-data-with-the-data-attributes " http://w3c.github.io/html/single-page.html#embedding-custom-non-visible-data-with-the-data-attributes

View File

@@ -35,7 +35,7 @@ syntax match jsParensError /[)}\]]/
" Program Keywords " Program Keywords
syntax keyword jsStorageClass const var let skipwhite skipempty nextgroup=jsDestructuringBlock,jsDestructuringArray,jsVariableDef syntax keyword jsStorageClass const var let skipwhite skipempty nextgroup=jsDestructuringBlock,jsDestructuringArray,jsVariableDef
syntax match jsVariableDef contained /\<\K\k*/ skipwhite skipempty nextgroup=jsFlowDefinition syntax match jsVariableDef contained /\<\K\k*/ skipwhite skipempty nextgroup=jsFlowDefinition
syntax keyword jsOperator delete instanceof typeof void new in of skipwhite skipempty nextgroup=@jsExpression syntax keyword jsOperatorKeyword delete instanceof typeof void new in of skipwhite skipempty nextgroup=@jsExpression
syntax match jsOperator "[-!|&+<>=%/*~^]" skipwhite skipempty nextgroup=@jsExpression syntax match jsOperator "[-!|&+<>=%/*~^]" skipwhite skipempty nextgroup=@jsExpression
syntax match jsOperator /::/ skipwhite skipempty nextgroup=@jsExpression syntax match jsOperator /::/ skipwhite skipempty nextgroup=@jsExpression
syntax keyword jsBooleanTrue true syntax keyword jsBooleanTrue true
@@ -74,7 +74,7 @@ syntax region jsRegexpString start=+\%(\%(\<return\|\<typeof\|\_[^)\]'"[:blan
syntax cluster jsRegexpSpecial contains=jsSpecial,jsRegexpBoundary,jsRegexpBackRef,jsRegexpQuantifier,jsRegexpOr,jsRegexpMod syntax cluster jsRegexpSpecial contains=jsSpecial,jsRegexpBoundary,jsRegexpBackRef,jsRegexpQuantifier,jsRegexpOr,jsRegexpMod
" Objects " Objects
syntax match jsObjectKey contained /\<\K\k*\ze\s*:/ contains=jsFunctionKey skipwhite skipempty nextgroup=jsObjectValue syntax match jsObjectKey contained /\<\k*\ze\s*:/ contains=jsFunctionKey skipwhite skipempty nextgroup=jsObjectValue
syntax match jsObjectColon contained /:/ skipwhite skipempty syntax match jsObjectColon contained /:/ skipwhite skipempty
syntax region jsObjectKeyString contained start=+\z(["']\)+ skip=+\\\%(\z1\|$\)+ end=+\z1\|$+ contains=jsSpecial,@Spell skipwhite skipempty nextgroup=jsObjectValue syntax region jsObjectKeyString contained start=+\z(["']\)+ skip=+\\\%(\z1\|$\)+ end=+\z1\|$+ contains=jsSpecial,@Spell skipwhite skipempty nextgroup=jsObjectValue
syntax region jsObjectKeyComputed contained matchgroup=jsBrackets start=/\[/ end=/]/ contains=@jsExpression skipwhite skipempty nextgroup=jsObjectValue,jsFuncArgs extend syntax region jsObjectKeyComputed contained matchgroup=jsBrackets start=/\[/ end=/]/ contains=@jsExpression skipwhite skipempty nextgroup=jsObjectValue,jsFuncArgs extend
@@ -86,7 +86,7 @@ syntax match jsObjectMethodType contained /\<[gs]et\ze\s\+\K\k*/ skipwhite sk
syntax region jsObjectStringKey contained start=+\z(["']\)+ skip=+\\\%(\z1\|$\)+ end=+\z1\|$+ contains=jsSpecial,@Spell extend skipwhite skipempty nextgroup=jsFuncArgs,jsObjectValue syntax region jsObjectStringKey contained start=+\z(["']\)+ skip=+\\\%(\z1\|$\)+ end=+\z1\|$+ contains=jsSpecial,@Spell extend skipwhite skipempty nextgroup=jsFuncArgs,jsObjectValue
exe 'syntax keyword jsNull null '.(exists('g:javascript_conceal_null') ? 'conceal cchar='.g:javascript_conceal_null : '') exe 'syntax keyword jsNull null '.(exists('g:javascript_conceal_null') ? 'conceal cchar='.g:javascript_conceal_null : '')
exe 'syntax keyword jsReturn return contained '.(exists('g:javascript_conceal_return') ? 'conceal cchar='.g:javascript_conceal_return : '').' skipwhite skipempty nextgroup=@jsExpression' exe 'syntax keyword jsReturn return contained '.(exists('g:javascript_conceal_return') ? 'conceal cchar='.g:javascript_conceal_return : '').' skipwhite nextgroup=@jsExpression'
exe 'syntax keyword jsUndefined undefined '.(exists('g:javascript_conceal_undefined') ? 'conceal cchar='.g:javascript_conceal_undefined : '') exe 'syntax keyword jsUndefined undefined '.(exists('g:javascript_conceal_undefined') ? 'conceal cchar='.g:javascript_conceal_undefined : '')
exe 'syntax keyword jsNan NaN '.(exists('g:javascript_conceal_NaN') ? 'conceal cchar='.g:javascript_conceal_NaN : '') exe 'syntax keyword jsNan NaN '.(exists('g:javascript_conceal_NaN') ? 'conceal cchar='.g:javascript_conceal_NaN : '')
exe 'syntax keyword jsPrototype prototype '.(exists('g:javascript_conceal_prototype') ? 'conceal cchar='.g:javascript_conceal_prototype : '') exe 'syntax keyword jsPrototype prototype '.(exists('g:javascript_conceal_prototype') ? 'conceal cchar='.g:javascript_conceal_prototype : '')
@@ -151,7 +151,7 @@ syntax region jsFinallyBlock contained matchgroup=jsFinallyBraces s
syntax region jsSwitchBlock contained matchgroup=jsSwitchBraces start=/{/ end=/}/ contains=@jsAll,jsBlock,jsSwitchCase extend fold syntax region jsSwitchBlock contained matchgroup=jsSwitchBraces start=/{/ end=/}/ contains=@jsAll,jsBlock,jsSwitchCase extend fold
syntax region jsRepeatBlock contained matchgroup=jsRepeatBraces start=/{/ end=/}/ contains=@jsAll,jsBlock extend fold syntax region jsRepeatBlock contained matchgroup=jsRepeatBraces start=/{/ end=/}/ contains=@jsAll,jsBlock extend fold
syntax region jsDestructuringBlock contained matchgroup=jsDestructuringBraces start=/{/ end=/}/ contains=jsDestructuringProperty,jsDestructuringAssignment,jsDestructuringNoise,jsDestructuringPropertyComputed,jsSpreadExpression,jsComment extend fold syntax region jsDestructuringBlock contained matchgroup=jsDestructuringBraces start=/{/ end=/}/ contains=jsDestructuringProperty,jsDestructuringAssignment,jsDestructuringNoise,jsDestructuringPropertyComputed,jsSpreadExpression,jsComment extend fold
syntax region jsDestructuringArray contained matchgroup=jsDestructuringBraces start=/\[/ end=/\]/ contains=jsDestructuringPropertyValue,jsNoise,jsDestructuringProperty,jsSpreadExpression,jsComment extend fold syntax region jsDestructuringArray contained matchgroup=jsDestructuringBraces start=/\[/ end=/\]/ contains=jsDestructuringPropertyValue,jsNoise,jsDestructuringProperty,jsSpreadExpression,jsDestructuringBlock,jsComment extend fold
syntax region jsObject contained matchgroup=jsObjectBraces start=/{/ end=/}/ contains=jsObjectKey,jsObjectKeyString,jsObjectKeyComputed,jsObjectSeparator,jsObjectFuncName,jsObjectMethodType,jsGenerator,jsComment,jsObjectStringKey,jsSpreadExpression,jsDecorator,jsAsyncKeyword extend fold syntax region jsObject contained matchgroup=jsObjectBraces start=/{/ end=/}/ contains=jsObjectKey,jsObjectKeyString,jsObjectKeyComputed,jsObjectSeparator,jsObjectFuncName,jsObjectMethodType,jsGenerator,jsComment,jsObjectStringKey,jsSpreadExpression,jsDecorator,jsAsyncKeyword extend fold
syntax region jsBlock matchgroup=jsBraces start=/{/ end=/}/ contains=@jsAll,jsSpreadExpression extend fold syntax region jsBlock matchgroup=jsBraces start=/{/ end=/}/ contains=@jsAll,jsSpreadExpression extend fold
syntax region jsModuleGroup contained matchgroup=jsModuleBraces start=/{/ end=/}/ contains=jsModuleKeyword,jsModuleComma,jsModuleAs,jsComment,jsFlowTypeKeyword skipwhite skipempty nextgroup=jsFrom fold syntax region jsModuleGroup contained matchgroup=jsModuleBraces start=/{/ end=/}/ contains=jsModuleKeyword,jsModuleComma,jsModuleAs,jsComment,jsFlowTypeKeyword skipwhite skipempty nextgroup=jsFrom fold
@@ -181,12 +181,12 @@ exe 'syntax match jsArrowFunction /_\ze\s*=>/ skipwhite skipempty nextgroup=j
syntax keyword jsClassKeyword contained class syntax keyword jsClassKeyword contained class
syntax keyword jsExtendsKeyword contained extends skipwhite skipempty nextgroup=@jsExpression syntax keyword jsExtendsKeyword contained extends skipwhite skipempty nextgroup=@jsExpression
syntax match jsClassNoise contained /\./ syntax match jsClassNoise contained /\./
syntax match jsClassMethodType contained /\<\%([gs]et\|static\)\ze\s\+\K\k*/ skipwhite skipempty nextgroup=jsAsyncKeyword,jsFuncName,jsClassProperty syntax match jsClassFuncName contained /\<\K\k*\ze\s*[(<]/ skipwhite skipempty nextgroup=jsFuncArgs,jsFlowClassFunctionGroup
syntax match jsClassMethodType contained /\<\%([gs]et\|static\)\ze\s\+\K\k*/ skipwhite skipempty nextgroup=jsAsyncKeyword,jsClassFuncName,jsClassProperty
syntax region jsClassDefinition start=/\<class\>/ end=/\(\<extends\>\s\+\)\@<!{\@=/ contains=jsClassKeyword,jsExtendsKeyword,jsClassNoise,@jsExpression,jsFlowClassGroup skipwhite skipempty nextgroup=jsCommentClass,jsClassBlock,jsFlowClassGroup syntax region jsClassDefinition start=/\<class\>/ end=/\(\<extends\>\s\+\)\@<!{\@=/ contains=jsClassKeyword,jsExtendsKeyword,jsClassNoise,@jsExpression,jsFlowClassGroup skipwhite skipempty nextgroup=jsCommentClass,jsClassBlock,jsFlowClassGroup
syntax match jsClassProperty contained /\<\K\k*\ze\s*=/ skipwhite skipempty nextgroup=jsClassValue,jsFlowClassDef syntax match jsClassProperty contained /\<\K\k*\ze\s*=/ skipwhite skipempty nextgroup=jsClassValue,jsFlowClassDef
syntax region jsClassValue contained start=/=/ end=/\_[;}]\@=/ contains=@jsExpression syntax region jsClassValue contained start=/=/ end=/\_[;}]\@=/ contains=@jsExpression
syntax region jsClassPropertyComputed contained matchgroup=jsBrackets start=/\[/ end=/]/ contains=@jsExpression skipwhite skipempty nextgroup=jsFuncArgs,jsClassValue extend syntax region jsClassPropertyComputed contained matchgroup=jsBrackets start=/\[/ end=/]/ contains=@jsExpression skipwhite skipempty nextgroup=jsFuncArgs,jsClassValue extend
syntax match jsClassFuncName contained /\<\K\k*\ze\s*(/ skipwhite skipempty nextgroup=jsFuncArgs
syntax region jsClassStringKey contained start=+\z(["']\)+ skip=+\\\%(\z1\|$\)+ end=+\z1\|$+ contains=jsSpecial,@Spell extend skipwhite skipempty nextgroup=jsFuncArgs syntax region jsClassStringKey contained start=+\z(["']\)+ skip=+\\\%(\z1\|$\)+ end=+\z1\|$+ contains=jsSpecial,@Spell extend skipwhite skipempty nextgroup=jsFuncArgs
" Destructuring " Destructuring
@@ -196,7 +196,7 @@ syntax match jsDestructuringAssignment contained /\k\+\ze\s*:/ skipwhit
syntax region jsDestructuringValue contained start=/=/ end=/[,}\]]\@=/ contains=@jsExpression extend syntax region jsDestructuringValue contained start=/=/ end=/[,}\]]\@=/ contains=@jsExpression extend
syntax region jsDestructuringValueAssignment contained start=/:/ end=/[,}=]\@=/ contains=jsDestructuringPropertyValue,jsDestructuringBlock,jsNoise,jsDestructuringNoise skipwhite skipempty nextgroup=jsDestructuringValue extend syntax region jsDestructuringValueAssignment contained start=/:/ end=/[,}=]\@=/ contains=jsDestructuringPropertyValue,jsDestructuringBlock,jsNoise,jsDestructuringNoise skipwhite skipempty nextgroup=jsDestructuringValue extend
syntax match jsDestructuringNoise contained /[,[\]]/ syntax match jsDestructuringNoise contained /[,[\]]/
syntax region jsDestructuringPropertyComputed contained matchgroup=jsBrackets start=/\[/ end=/]/ contains=@jsExpression skipwhite skipempty nextgroup=jsDestructuringValue,jsDestructuringNoise extend fold syntax region jsDestructuringPropertyComputed contained matchgroup=jsDestructuringBraces start=/\[/ end=/]/ contains=@jsExpression skipwhite skipempty nextgroup=jsDestructuringValue,jsDestructuringValueAssignment,jsDestructuringNoise extend fold
" Comments " Comments
syntax keyword jsCommentTodo contained TODO FIXME XXX TBD syntax keyword jsCommentTodo contained TODO FIXME XXX TBD
@@ -232,7 +232,7 @@ if exists("javascript_plugin_flow")
runtime extras/flow.vim runtime extras/flow.vim
endif endif
syntax cluster jsExpression contains=jsBracket,jsParen,jsObject,jsTernaryIf,jsTaggedTemplate,jsTemplateString,jsString,jsRegexpString,jsNumber,jsFloat,jsOperator,jsBooleanTrue,jsBooleanFalse,jsNull,jsFunction,jsArrowFunction,jsGlobalObjects,jsExceptions,jsFutureKeys,jsDomErrNo,jsDomNodeConsts,jsHtmlEvents,jsFuncCall,jsUndefined,jsNan,jsPrototype,jsBuiltins,jsNoise,jsClassDefinition,jsArrowFunction,jsArrowFuncArgs,jsParensError,jsComment,jsArguments,jsThis,jsSuper,jsDo,jsForAwait,jsAsyncKeyword,jsStatement syntax cluster jsExpression contains=jsBracket,jsParen,jsObject,jsTernaryIf,jsTaggedTemplate,jsTemplateString,jsString,jsRegexpString,jsNumber,jsFloat,jsOperator,jsOperatorKeyword,jsBooleanTrue,jsBooleanFalse,jsNull,jsFunction,jsArrowFunction,jsGlobalObjects,jsExceptions,jsFutureKeys,jsDomErrNo,jsDomNodeConsts,jsHtmlEvents,jsFuncCall,jsUndefined,jsNan,jsPrototype,jsBuiltins,jsNoise,jsClassDefinition,jsArrowFunction,jsArrowFuncArgs,jsParensError,jsComment,jsArguments,jsThis,jsSuper,jsDo,jsForAwait,jsAsyncKeyword,jsStatement
syntax cluster jsAll contains=@jsExpression,jsStorageClass,jsConditional,jsRepeat,jsReturn,jsException,jsTry,jsNoise,jsBlockLabel syntax cluster jsAll contains=@jsExpression,jsStorageClass,jsConditional,jsRepeat,jsReturn,jsException,jsTry,jsNoise,jsBlockLabel
" Define the default highlighting. " Define the default highlighting.
@@ -292,6 +292,7 @@ if version >= 508 || !exists("did_javascript_syn_inits")
HiLink jsArguments Special HiLink jsArguments Special
HiLink jsError Error HiLink jsError Error
HiLink jsParensError Error HiLink jsParensError Error
HiLink jsOperatorKeyword jsOperator
HiLink jsOperator Operator HiLink jsOperator Operator
HiLink jsOf Operator HiLink jsOf Operator
HiLink jsStorageClass StorageClass HiLink jsStorageClass StorageClass

View File

@@ -42,9 +42,12 @@ syn keyword javascriptDomElemFuncs load addTextTrack
syn keyword javascriptDomElemAttrs videoWidth videoHeight poster syn keyword javascriptDomElemAttrs videoWidth videoHeight poster
" drag and drop " drag and drop
syn keyword javascriptDomElemAttrs onDragStart onDragEnd onDragEnter onDragLeave onDragOver onDrag onDrop draggable dropzone syn keyword javascriptDomElemAttrs ondragstart ondragend ondragenter ondragleave ondragover ondrag ondrop draggable dropzone
" <checkbox> " <checkbox>
syn keyword javascriptDomElemAttrs indeterminate syn keyword javascriptDomElemAttrs indeterminate
" select https://w3c.github.io/selection-api/#extensions-to-globaleventhandlers
syn keyword javascriptDomElemAttrs onselectstart onselectchange
endif endif

Some files were not shown because too many files have changed in this diff Show More