Compare commits

..

40 Commits

Author SHA1 Message Date
Adam Stankiewicz
ef369d45a5 fix: Re-introduce config.vim into build 2017-03-24 16:10:53 +01:00
Adam Stankiewicz
64938393bd Update 2017-03-24 16:08:42 +01:00
Adam Stankiewicz
79fce146dd That escalated quickly 😄 2017-03-23 13:26:10 +01:00
Adam Stankiewicz
ef4435cffc Add api blueprint support, closes #182 2017-03-23 13:21:01 +01:00
Adam Stankiewicz
c2a7f363c6 Ftdetect yaml before ansible, fixes #185
Also fixes #154
2017-03-23 13:15:25 +01:00
Adam Stankiewicz
0134940f23 Add sxhkd support, closes #186 2017-03-23 12:48:28 +01:00
Adam Stankiewicz
8bb259b1f6 Add mathematica support, closes #189 2017-03-23 12:11:44 +01:00
Adam Stankiewicz
466f20b12e Add support for gnuplot, closes #197 2017-03-23 11:49:10 +01:00
Adam Stankiewicz
461de4cc21 Add caddyfile support, closes #195 2017-03-23 11:43:41 +01:00
Adam Stankiewicz
ba75890936 Update Dockerfile provider to offical, closes #191 2017-03-23 11:30:58 +01:00
Adam Stankiewicz
0801eac01a Update 2017-03-23 11:28:28 +01:00
Adam Stankiewicz
9f735b1fe7 Mention how to use with Vim8 package manager 2017-03-23 11:25:41 +01:00
Adam Stankiewicz
fbeb019a85 Update maintenance badge 2017-02-02 23:32:20 +01:00
Adam Stankiewicz
6e9529be4e Change scss provider to cakebaker, closes #173 2017-02-02 23:23:52 +01:00
Adam Stankiewicz
462bb76e06 Change powershell provider to PProvost, closes #177 2017-02-02 22:22:41 +01:00
Adam Stankiewicz
8002795088 Fix elixir not opening with :Explore, closes #172 2017-02-02 22:11:43 +01:00
Adam Stankiewicz
7404993f0c Add i3 config support, closes #168 2017-02-02 21:54:55 +01:00
Adam Stankiewicz
b7e2b0cad3 Change vala provider to arrufat, closes #165 2017-02-02 21:53:26 +01:00
Adam Stankiewicz
cc868aee51 Add vue support, closes #160 2017-02-02 21:49:51 +01:00
Adam Stankiewicz
39036a553f Add terraform, closes #163 2017-02-02 21:44:42 +01:00
Adam Stankiewicz
e685e4b431 Update 2017-02-02 21:16:29 +01:00
Adam Stankiewicz
e404a658b1 Update 2016-12-20 20:57:20 +01:00
Adam Stankiewicz
74652b465d Update twig source 2016-09-11 13:50:56 +02:00
Adam Stankiewicz
7575da2064 Update 2016-09-11 13:42:21 +02:00
Adam Stankiewicz
9b23910103 Add raml syntax highlighting, closes #155 2016-09-11 13:38:46 +02:00
Adam Stankiewicz
98e021e969 Wrap ftdetect file in augroup, fixes #153 2016-09-11 13:34:02 +02:00
Adam Stankiewicz
b8d9939329 Add python compiler, closes #147 2016-09-11 13:25:03 +02:00
Adam Stankiewicz
0244e228fa Update 2016-09-11 13:24:17 +02:00
Adam Stankiewicz
ab61d2ac8e Update 2016-07-30 13:19:35 +02:00
Adam Stankiewicz
f42e1f477c Add note about non-completeness of plugins, #146 2016-07-27 19:48:12 +02:00
Adam Stankiewicz
3019afa721 Add applescript, closes #133 2016-07-26 14:08:59 +02:00
Adam Stankiewicz
cb574b283f Add livescript, closes #135 2016-07-26 14:06:32 +02:00
Adam Stankiewicz
b9ce3df4cd Add extras directory of vim-javascript, fixes #144 2016-07-26 14:04:56 +02:00
Adam Stankiewicz
f028cfae59 Add lua 2016-07-26 13:58:55 +02:00
Adam Stankiewicz
041ab2d237 Update 2016-07-26 13:52:55 +02:00
Adam Stankiewicz
acd25ccf95 Switch to elzr for json syntax, and disable conceal by default 2016-07-26 13:52:30 +02:00
Adam Stankiewicz
7dd62806a0 Enable jsx by default 2016-07-26 13:52:30 +02:00
Adam Stankiewicz
6a823fb3af Update 2016-07-26 13:52:30 +02:00
Adam Stankiewicz
11f34624aa Update 2016-07-19 10:09:54 +02:00
Yulij Andreevich Lesov
1422f7a75c Update vim-ember-script repo link (#138) 2016-07-05 10:28:08 +02:00
282 changed files with 15113 additions and 6800 deletions

165
README.md
View File

@@ -1,4 +1,4 @@
# vim-polyglot [![Build Status][travis-img-url]][travis-url] [![Maintenance](https://img.shields.io/maintenance/yes/2016.svg?maxAge=2592000)]() # vim-polyglot [![Build Status][travis-img-url]][travis-url] [![Maintenance](https://img.shields.io/maintenance/yes/2017.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
@@ -8,7 +8,7 @@ A collection of language packs for Vim.
> One to rule them all, one to find them, one to bring them all and in the darkness bind them. > One to rule them all, one to find them, one to bring them all and in the darkness bind them.
- It **won't affect your startup time**, as scripts are loaded only on demand\*. - It **won't affect your startup time**, as scripts are loaded only on demand\*.
- It **installs and updates 70+ times faster** than 70+ packages it consist of. - It **installs and updates 100+ times faster** than 100+ packages it consist of.
- Solid syntax and indentation support. Only the best language packs. - Solid syntax and indentation support. Only the best language packs.
- All unnecessary files are ignored (like enormous documentation from php support). - All unnecessary files are ignored (like enormous documentation from php support).
- No support for esoteric languages, only most popular ones (modern too, like `slim`). - No support for esoteric languages, only most popular ones (modern too, like `slim`).
@@ -23,91 +23,116 @@ A collection of language packs for Vim.
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:
```
mkdir -p ~/.vim/pack/default/start
git clone https://github.com/sheerun/vim-polyglot ~/.vim/pack/default/start/vim-polyglot
```
NOTE: Not all features of listed language packs are available. We strip them from functionality slowing vim startup in general (for example we ignore `plugins` folder that is loaded regardless of file type, use `ftplugin` instead).
If you need full functionality of any plugin, please use it directly with your plugin manager.
## Language packs ## Language packs
- [ansible](https://github.com/pearofducks/ansible-vim) (syntax, indent, ftplugin, ftdetect) - [ansible](https://github.com/pearofducks/ansible-vim) (syntax, indent, ftplugin)
- [arduino](https://github.com/sudar/vim-arduino-syntax) (syntax, indent, ftdetect) - [apiblueprint](https://github.com/sheerun/apiblueprint.vim) (syntax)
- [blade](https://github.com/jwalton512/vim-blade) (syntax, indent, ftplugin, ftdetect) - [applescript](https://github.com/vim-scripts/applescript.vim) (syntax)
- [arduino](https://github.com/sudar/vim-arduino-syntax) (syntax, indent)
- [blade](https://github.com/jwalton512/vim-blade) (syntax, indent, ftplugin)
- [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)
- [cjsx](https://github.com/mtscout6/vim-cjsx) (ftdetect, syntax, ftplugin) - [caddyfile](https://github.com/joshglendenning/vim-caddyfile) (syntax, indent, ftplugin)
- [clojure](https://github.com/guns/vim-clojure-static) (syntax, indent, autoload, ftplugin, ftdetect) - [cjsx](https://github.com/mtscout6/vim-cjsx) (syntax, ftplugin)
- [coffee-script](https://github.com/kchmck/vim-coffee-script) (syntax, indent, compiler, autoload, ftplugin, ftdetect) - [clojure](https://github.com/guns/vim-clojure-static) (syntax, indent, autoload, ftplugin)
- [cryptol](https://github.com/victoredwardocallaghan/cryptol.vim) (syntax, compiler, ftplugin, ftdetect) - [coffee-script](https://github.com/kchmck/vim-coffee-script) (syntax, indent, compiler, autoload, ftplugin)
- [crystal](https://github.com/rhysd/vim-crystal) (syntax, indent, autoload, ftplugin, ftdetect) - [cql](https://github.com/elubow/cql-vim) (syntax)
- [cql](https://github.com/elubow/cql-vim) (syntax, ftdetect) - [cryptol](https://github.com/victoredwardocallaghan/cryptol.vim) (syntax, compiler, ftplugin)
- [crystal](https://github.com/rhysd/vim-crystal) (syntax, indent, autoload, ftplugin)
- [css](https://github.com/JulesWang/css.vim) (syntax) - [css](https://github.com/JulesWang/css.vim) (syntax)
- [cucumber](https://github.com/tpope/vim-cucumber) (syntax, indent, compiler, ftplugin, ftdetect) - [cucumber](https://github.com/tpope/vim-cucumber) (syntax, indent, compiler, ftplugin)
- [dart](https://github.com/dart-lang/dart-vim-plugin) (syntax, indent, autoload, ftplugin, ftdetect) - [dart](https://github.com/dart-lang/dart-vim-plugin) (syntax, indent, autoload, ftplugin)
- [dockerfile](https://github.com/honza/dockerfile.vim) (syntax, ftdetect) - [dockerfile](https://github.com/docker/docker) (syntax)
- [elixir](https://github.com/elixir-lang/vim-elixir) (syntax, indent, compiler, ftplugin, ftdetect) - [elixir](https://github.com/elixir-lang/vim-elixir) (syntax, indent, compiler, autoload, ftplugin)
- [elm](https://github.com/lambdatoast/elm.vim) (syntax, indent, autoload, ftplugin, ftdetect) - [elm](https://github.com/lambdatoast/elm.vim) (syntax, indent, autoload, ftplugin)
- [emberscript](https://github.com/heartsentwined/vim-ember-script) (syntax, indent, ftplugin, ftdetect) - [emberscript](https://github.com/yalesov/vim-ember-script) (syntax, indent, ftplugin)
- [emblem](https://github.com/yalesov/vim-emblem) (syntax, indent, ftplugin, ftdetect) - [emblem](https://github.com/yalesov/vim-emblem) (syntax, indent, ftplugin)
- [erlang](https://github.com/vim-erlang/vim-erlang-runtime) (syntax, indent, ftdetect) - [erlang](https://github.com/vim-erlang/vim-erlang-runtime) (syntax, indent)
- [fish](https://github.com/dag/vim-fish) (syntax, indent, compiler, autoload, ftplugin, ftdetect) - [fish](https://github.com/dag/vim-fish) (syntax, indent, compiler, autoload, ftplugin)
- [git](https://github.com/tpope/vim-git) (syntax, indent, ftplugin, ftdetect) - [git](https://github.com/tpope/vim-git) (syntax, indent, ftplugin)
- [glsl](https://github.com/tikhomirov/vim-glsl) (syntax, indent, ftdetect) - [glsl](https://github.com/tikhomirov/vim-glsl) (syntax, indent)
- [go](https://github.com/fatih/vim-go) (syntax, compiler, indent, ftdetect) - [gnuplot](https://github.com/vim-scripts/gnuplot-syntax-highlighting) (syntax)
- [go](https://github.com/fatih/vim-go) (syntax, compiler, indent)
- [groovy](https://github.com/vim-scripts/groovy.vim) (syntax) - [groovy](https://github.com/vim-scripts/groovy.vim) (syntax)
- [haml](https://github.com/tpope/vim-haml) (syntax, indent, compiler, ftplugin, ftdetect) - [haml](https://github.com/sheerun/vim-haml) (syntax, indent, compiler, ftplugin)
- [handlebars](https://github.com/mustache/vim-mustache-handlebars) (syntax, indent, ftplugin, ftdetect) - [handlebars](https://github.com/mustache/vim-mustache-handlebars) (syntax, indent, ftplugin)
- [haskell](https://github.com/neovimhaskell/haskell-vim) (syntax, indent, ftplugin, ftdetect) - [haskell](https://github.com/neovimhaskell/haskell-vim) (syntax, indent, ftplugin)
- [haxe](https://github.com/yaymukund/vim-haxe) (syntax, ftdetect) - [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)
- [jasmine](https://github.com/glanotte/vim-jasmine) (syntax, ftdetect) - [i3](https://github.com/PotatoesMaster/i3-vim-syntax) (syntax, ftplugin)
- [javascript](https://github.com/pangloss/vim-javascript) (syntax, indent, ftplugin, ftdetect) - [jasmine](https://github.com/glanotte/vim-jasmine) (syntax)
- [json](https://github.com/sheerun/vim-json) (syntax, indent, ftdetect) - [javascript](https://github.com/pangloss/vim-javascript) (syntax, indent, compiler, ftplugin, extras)
- [jst](https://github.com/briancollins/vim-jst) (syntax, indent, ftdetect) - [json](https://github.com/elzr/vim-json) (syntax, indent, ftplugin)
- [jsx](https://github.com/mxw/vim-jsx) (ftdetect, after) - [jst](https://github.com/briancollins/vim-jst) (syntax, indent)
- [julia](https://github.com/dcjones/julia-minimalist-vim) (syntax, indent, ftdetect) - [jsx](https://github.com/mxw/vim-jsx) (after)
- [kotlin](https://github.com/udalov/kotlin-vim) (syntax, indent, ftdetect) - [julia](https://github.com/dcjones/julia-minimalist-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, ftdetect) - [less](https://github.com/groenewege/vim-less) (syntax, indent, ftplugin)
- [liquid](https://github.com/tpope/vim-liquid) (syntax, indent, ftplugin, ftdetect) - [liquid](https://github.com/tpope/vim-liquid) (syntax, indent, ftplugin)
- [mako](https://github.com/sophacles/vim-bundle-mako) (syntax, indent, ftplugin, ftdetect) - [livescript](https://github.com/gkz/vim-ls) (syntax, indent, compiler, ftplugin)
- [markdown](https://github.com/plasticboy/vim-markdown) (syntax, ftdetect) - [lua](https://github.com/tbastos/vim-lua) (syntax, indent)
- [nginx](https://github.com/othree/nginx-contrib-vim) (syntax, indent, ftdetect) - [mako](https://github.com/sophacles/vim-bundle-mako) (syntax, indent, ftplugin)
- [nim](https://github.com/zah/nim.vim) (syntax, compiler, indent, ftdetect) - [markdown](https://github.com/plasticboy/vim-markdown) (syntax)
- [nix](https://github.com/spwhitt/vim-nix) (syntax, ftplugin, ftdetect) - [mathematica](https://github.com/rsmenon/vim-mathematica) (syntax, ftplugin)
- [nginx](https://github.com/othree/nginx-contrib-vim) (syntax, indent, ftplugin)
- [nim](https://github.com/zah/nim.vim) (syntax, compiler, indent)
- [nix](https://github.com/spwhitt/vim-nix) (syntax, ftplugin)
- [objc](https://github.com/b4winckler/vim-objc) (ftplugin, syntax, indent) - [objc](https://github.com/b4winckler/vim-objc) (ftplugin, syntax, indent)
- [ocaml](https://github.com/jrk/vim-ocaml) (syntax, indent, ftplugin) - [ocaml](https://github.com/jrk/vim-ocaml) (syntax, indent, ftplugin)
- [octave](https://github.com/vim-scripts/octave.vim--) (syntax) - [octave](https://github.com/vim-scripts/octave.vim--) (syntax)
- [opencl](https://github.com/petRUShka/vim-opencl) (syntax, indent, ftplugin, ftdetect) - [opencl](https://github.com/petRUShka/vim-opencl) (syntax, indent, ftplugin)
- [perl](https://github.com/vim-perl/vim-perl) (syntax, indent, ftplugin, ftdetect) - [perl](https://github.com/vim-perl/vim-perl) (syntax, indent, ftplugin)
- [pgsql](https://github.com/exu/pgsql.vim) (syntax, ftdetect) - [pgsql](https://github.com/exu/pgsql.vim) (syntax)
- [php](https://github.com/StanAngeloff/php.vim) (syntax) - [php](https://github.com/StanAngeloff/php.vim) (syntax)
- [plantuml](https://github.com/aklt/plantuml-syntax) (syntax, ftplugin, ftdetect) - [plantuml](https://github.com/aklt/plantuml-syntax) (syntax, indent, ftplugin)
- [powershell](https://github.com/Persistent13/vim-ps1) (syntax, indent, ftplugin, ftdetect) - [powershell](https://github.com/PProvost/vim-ps1) (syntax, indent, ftplugin)
- [protobuf](https://github.com/uarun/vim-protobuf) (syntax, indent, ftdetect) - [protobuf](https://github.com/uarun/vim-protobuf) (syntax, indent)
- [pug](https://github.com/digitaltoad/vim-pug) (syntax, indent, ftplugin, ftdetect) - [pug](https://github.com/digitaltoad/vim-pug) (syntax, indent, ftplugin)
- [puppet](https://github.com/voxpupuli/vim-puppet) (syntax, indent, ftplugin, ftdetect) - [puppet](https://github.com/voxpupuli/vim-puppet) (syntax, indent, ftplugin)
- [purescript](https://github.com/raichoo/purescript-vim) (syntax, indent, ftdetect) - [purescript](https://github.com/raichoo/purescript-vim) (syntax, indent, ftplugin)
- [python-compiler](https://github.com/aliev/vim-compiler-python) (compiler, autoload)
- [python](https://github.com/mitsuhiko/vim-python-combined) (syntax, indent) - [python](https://github.com/mitsuhiko/vim-python-combined) (syntax, indent)
- [qml](https://github.com/peterhoeg/vim-qml) (syntax, indent, ftplugin, ftdetect) - [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)
- [ragel](https://github.com/jneen/ragel.vim) (syntax) - [ragel](https://github.com/jneen/ragel.vim) (syntax)
- [rspec](https://github.com/sheerun/rspec.vim) (syntax, ftdetect) - [raml](https://github.com/IN3D/vim-raml) (syntax, ftplugin)
- [ruby](https://github.com/vim-ruby/vim-ruby) (syntax, indent, compiler, autoload, ftplugin, ftdetect) - [rspec](https://github.com/sheerun/rspec.vim) (syntax)
- [rust](https://github.com/rust-lang/rust.vim) (syntax, indent, compiler, autoload, ftplugin, ftdetect) - [ruby](https://github.com/vim-ruby/vim-ruby) (syntax, indent, compiler, autoload, ftplugin)
- [sbt](https://github.com/derekwyatt/vim-sbt) (syntax, ftdetect) - [rust](https://github.com/rust-lang/rust.vim) (syntax, indent, compiler, autoload, ftplugin)
- [scala](https://github.com/derekwyatt/vim-scala) (syntax, indent, compiler, ftplugin, ftdetect) - [sbt](https://github.com/derekwyatt/vim-sbt) (syntax)
- [slim](https://github.com/slim-template/vim-slim) (syntax, indent, ftplugin, ftdetect) - [scala](https://github.com/derekwyatt/vim-scala) (syntax, indent, compiler, ftplugin)
- [solidity](https://github.com/ethereum/vim-solidity) (syntax, indent, ftdetect) - [scss](https://github.com/cakebaker/scss-syntax.vim) (syntax, autoload, ftplugin)
- [stylus](https://github.com/wavded/vim-stylus) (syntax, indent, ftplugin, ftdetect) - [slim](https://github.com/slim-template/vim-slim) (syntax, indent, ftplugin)
- [swift](https://github.com/keith/swift.vim) (syntax, indent, ftplugin, ftdetect) - [solidity](https://github.com/ethereum/vim-solidity) (syntax, indent)
- [systemd](https://github.com/kurayama/systemd-vim-syntax) (syntax, ftdetect) - [stylus](https://github.com/wavded/vim-stylus) (syntax, indent, ftplugin)
- [textile](https://github.com/timcharper/textile.vim) (syntax, ftplugin, ftdetect) - [swift](https://github.com/keith/swift.vim) (syntax, indent, ftplugin)
- [thrift](https://github.com/solarnz/thrift.vim) (syntax, ftdetect) - [sxhkd](https://github.com/baskerville/vim-sxhkdrc) (syntax)
- [tmux](https://github.com/keith/tmux.vim) (syntax, ftplugin, ftdetect) - [systemd](https://github.com/kurayama/systemd-vim-syntax) (syntax)
- [terraform](https://github.com/hashivim/vim-terraform) (syntax, indent, ftplugin)
- [textile](https://github.com/timcharper/textile.vim) (syntax, ftplugin)
- [thrift](https://github.com/solarnz/thrift.vim) (syntax)
- [tmux](https://github.com/keith/tmux.vim) (syntax, ftplugin)
- [tomdoc](https://github.com/wellbredgrapefruit/tomdoc.vim) (syntax) - [tomdoc](https://github.com/wellbredgrapefruit/tomdoc.vim) (syntax)
- [toml](https://github.com/cespare/vim-toml) (syntax, ftplugin, ftdetect) - [toml](https://github.com/cespare/vim-toml) (syntax, ftplugin)
- [twig](https://github.com/evidens/vim-twig) (syntax, ftplugin) - [twig](https://github.com/lumiliet/vim-twig) (syntax, indent, ftplugin)
- [typescript](https://github.com/leafgarland/typescript-vim) (syntax, indent, compiler, ftplugin, ftdetect) - [typescript](https://github.com/leafgarland/typescript-vim) (syntax, indent, compiler, ftplugin)
- [vala](https://github.com/tkztmk/vim-vala) (syntax, indent, ftdetect) - [vala](https://github.com/arrufat/vala.vim) (syntax, indent)
- [vbnet](https://github.com/vim-scripts/vbnet.vim) (syntax) - [vbnet](https://github.com/vim-scripts/vbnet.vim) (syntax)
- [vcl](https://github.com/smerrill/vcl-vim-plugin) (syntax, ftdetect) - [vcl](https://github.com/smerrill/vcl-vim-plugin) (syntax)
- [vm](https://github.com/lepture/vim-velocity) (syntax, indent, ftdetect) - [vm](https://github.com/lepture/vim-velocity) (syntax, indent)
- [vue](https://github.com/posva/vim-vue) (syntax, indent, ftplugin)
- [xls](https://github.com/vim-scripts/XSLT-syntax) (syntax) - [xls](https://github.com/vim-scripts/XSLT-syntax) (syntax)
- [yaml](https://github.com/stephpy/vim-yaml) (syntax, ftplugin) - [yaml](https://github.com/stephpy/vim-yaml) (syntax, ftplugin)
- [yard](https://github.com/sheerun/vim-yardoc) (syntax) - [yard](https://github.com/sheerun/vim-yardoc) (syntax)

View File

@@ -0,0 +1,16 @@
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'javascript') == -1
" Vim filetype plugin file
" Language: JavaScript
" Maintainer: vim-javascript community
" URL: https://github.com/pangloss/vim-javascript
setlocal iskeyword+=$ suffixesadd+=.js
if exists('b:undo_ftplugin')
let b:undo_ftplugin .= ' | setlocal iskeyword< suffixesadd<'
else
let b:undo_ftplugin = 'setlocal iskeyword< suffixesadd<'
endif
endif

View File

@@ -5,7 +5,6 @@ if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'jsx') == -1
" "
" Language: JSX (JavaScript) " Language: JSX (JavaScript)
" Maintainer: Max Wang <mxawng@gmail.com> " Maintainer: Max Wang <mxawng@gmail.com>
" Depends: pangloss/vim-javascript
" "
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""

View File

@@ -0,0 +1,28 @@
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'terraform') == -1
if !exists('g:terraform_align')
let g:terraform_align = 0
endif
if g:terraform_align && exists(':Tabularize')
inoremap <buffer> <silent> = =<Esc>:call <SID>terraformalign()<CR>a
function! s:terraformalign()
let p = '^.*=[^>]*$'
if exists(':Tabularize') && getline('.') =~# '^.*=' && (getline(line('.')-1) =~# p || getline(line('.')+1) =~# p)
let column = strlen(substitute(getline('.')[0:col('.')],'[^=]','','g'))
let position = strlen(matchstr(getline('.')[0:col('.')],'.*=\s*\zs.*'))
Tabularize/=/l1
normal! 0
call search(repeat('[^=]*=',column).'\s\{-\}'.repeat('.',position),'ce',line('.'))
endif
endfunction
endif
" Match the identation put in place by Hashicorp and :TerraformFmt, https://github.com/hashivim/vim-terraform/issues/21
if get(g:, "terraform_align", 1)
setlocal tabstop=2
setlocal softtabstop=2
setlocal shiftwidth=2
endif
endif

View File

@@ -20,7 +20,7 @@ setlocal indentexpr=GetCoffeeHtmlIndent(v:lnum)
function! GetCoffeeHtmlIndent(curlinenum) function! GetCoffeeHtmlIndent(curlinenum)
" See if we're inside a coffeescript block. " See if we're inside a coffeescript block.
let scriptlnum = searchpair('<script [^>]*type="text/coffeescript"[^>]*>', '', let scriptlnum = searchpair('<script [^>]*type=[''"]\?text/coffeescript[''"]\?[^>]*>', '',
\ '</script>', 'bWn') \ '</script>', 'bWn')
let prevlnum = prevnonblank(a:curlinenum) let prevlnum = prevnonblank(a:curlinenum)

View File

@@ -5,10 +5,12 @@ if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'jsx') == -1
" "
" Language: JSX (JavaScript) " Language: JSX (JavaScript)
" Maintainer: Max Wang <mxawng@gmail.com> " Maintainer: Max Wang <mxawng@gmail.com>
" Depends: pangloss/vim-javascript
" "
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" Save the current JavaScript indentexpr.
let b:jsx_js_indentexpr = &indentexpr
" Prologue; load in XML indentation. " Prologue; load in XML indentation.
if exists('b:did_indent') if exists('b:did_indent')
let s:did_indent=b:did_indent let s:did_indent=b:did_indent
@@ -51,19 +53,31 @@ fu! SynXMLish(syns)
return SynAttrXMLish(get(a:syns, -1)) return SynAttrXMLish(get(a:syns, -1))
endfu endfu
" Check if a synstack has any XMLish attribute.
fu! SynXMLishAny(syns)
for synattr in a:syns
if SynAttrXMLish(synattr)
return 1
endif
endfor
return 0
endfu
" Check if a synstack denotes the end of a JSX block. " Check if a synstack denotes the end of a JSX block.
fu! SynJSXBlockEnd(syns) fu! SynJSXBlockEnd(syns)
return get(a:syns, -1) == 'jsBraces' && SynAttrXMLish(get(a:syns, -2)) return get(a:syns, -1) =~ '\%(js\|javascript\)Braces' &&
\ SynAttrXMLish(get(a:syns, -2))
endfu
" Determine how many jsxRegions deep a synstack is.
fu! SynJSXDepth(syns)
return len(filter(copy(a:syns), 'v:val ==# "jsxRegion"'))
endfu
" Check whether `cursyn' continues the same jsxRegion as `prevsyn'.
fu! SynJSXContinues(cursyn, prevsyn)
let curdepth = SynJSXDepth(a:cursyn)
let prevdepth = SynJSXDepth(a:prevsyn)
" In most places, we expect the nesting depths to be the same between any
" two consecutive positions within a jsxRegion (e.g., between a parent and
" child node, between two JSX attributes, etc.). The exception is between
" sibling nodes, where after a completed element (with depth N), we return
" to the parent's nesting (depth N - 1). This case is easily detected,
" since it is the only time when the top syntax element in the synstack is
" jsxRegion---specifically, the jsxRegion corresponding to the parent.
return prevdepth == curdepth ||
\ (prevdepth == curdepth + 1 && get(a:cursyn, -1) ==# 'jsxRegion')
endfu endfu
" Cleverly mix JS and XML indentation. " Cleverly mix JS and XML indentation.
@@ -71,9 +85,12 @@ fu! GetJsxIndent()
let cursyn = SynSOL(v:lnum) let cursyn = SynSOL(v:lnum)
let prevsyn = SynEOL(v:lnum - 1) let prevsyn = SynEOL(v:lnum - 1)
" Use XML indenting if the syntax at the end of the previous line was either " Use XML indenting iff:
" JSX or was the closing brace of a jsBlock whose parent syntax was JSX. " - the syntax at the end of the previous line was either JSX or was the
if (SynXMLish(prevsyn) || SynJSXBlockEnd(prevsyn)) && SynXMLishAny(cursyn) " closing brace of a jsBlock whose parent syntax was JSX; and
" - the current line continues the same jsxRegion as the previous line.
if (SynXMLish(prevsyn) || SynJSXBlockEnd(prevsyn)) &&
\ SynJSXContinues(cursyn, prevsyn)
let ind = XmlIndentGet(v:lnum, 0) let ind = XmlIndentGet(v:lnum, 0)
" Align '/>' and '>' with '<' for multiline tags. " Align '/>' and '>' with '<' for multiline tags.
@@ -86,7 +103,13 @@ fu! GetJsxIndent()
let ind = ind + &sw let ind = ind + &sw
endif endif
else else
let ind = GetJavascriptIndent() if len(b:jsx_js_indentexpr)
" Invoke the base JS package's custom indenter. (For vim-javascript,
" e.g., this will be GetJavascriptIndent().)
let ind = eval(b:jsx_js_indentexpr)
else
let ind = cindent(v:lnum)
endif
endif endif
return ind return ind

View File

@@ -24,6 +24,16 @@ syn match cCustomParen "(" 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
" -----------------------------------------------------------------------------
" Highlight member variable names.
" -----------------------------------------------------------------------------
if exists('g:cpp_member_variable_highlight') && g:cpp_member_variable_highlight
syn match cCustomDot "\." contained
syn match cCustomPtr "->" contained
syn match cCustomMemVar "\(\.\|->\)\w\+" contains=cCustomDot,cCustomPtr
hi def link cCustomMemVar Function
endif
" ----------------------------------------------------------------------------- " -----------------------------------------------------------------------------
" Source: aftersyntaxc.vim " Source: aftersyntaxc.vim
" ----------------------------------------------------------------------------- " -----------------------------------------------------------------------------

File diff suppressed because it is too large Load Diff

View File

@@ -5,6 +5,11 @@ if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'coffee-script')
" URL: http://github.com/kchmck/vim-coffee-script " URL: http://github.com/kchmck/vim-coffee-script
" License: WTFPL " License: WTFPL
if exists('b:current_syntax')
let s:current_syntax_save = b:current_syntax
endif
" Inherit coffee from html so coffeeComment isn't redefined and given higher " Inherit coffee from html so coffeeComment isn't redefined and given higher
" priority than hamlInterpolation. " priority than hamlInterpolation.
syn cluster hamlCoffeescript contains=@htmlCoffeeScript syn cluster hamlCoffeescript contains=@htmlCoffeeScript
@@ -14,4 +19,9 @@ syn region hamlCoffeescriptFilter matchgroup=hamlFilter
\ contains=@hamlCoffeeScript,hamlInterpolation \ contains=@hamlCoffeeScript,hamlInterpolation
\ keepend \ keepend
if exists('s:current_syntax_save')
let b:current_syntax = s:current_syntax_save
unlet s:current_syntax_save
endif
endif endif

View File

@@ -5,13 +5,22 @@ if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'coffee-script')
" URL: http://github.com/kchmck/vim-coffee-script " URL: http://github.com/kchmck/vim-coffee-script
" License: WTFPL " License: WTFPL
if exists('b:current_syntax')
let s:current_syntax_save = b:current_syntax
endif
" Syntax highlighting for text/coffeescript script tags " Syntax highlighting for text/coffeescript script tags
syn include @htmlCoffeeScript syntax/coffee.vim syn include @htmlCoffeeScript syntax/coffee.vim
syn region coffeeScript start=#<script [^>]*type="text/coffeescript"[^>]*># syn region coffeeScript start=#<script [^>]*type=['"]\?text/coffeescript['"]\?[^>]*>#
\ end=#</script>#me=s-1 keepend \ end=#</script>#me=s-1 keepend
\ contains=@htmlCoffeeScript,htmlScriptTag,@htmlPreproc \ contains=@htmlCoffeeScript,htmlScriptTag,@htmlPreproc
\ containedin=htmlHead \ containedin=htmlHead
if exists('s:current_syntax_save')
let b:current_syntax = s:current_syntax_save
unlet s:current_syntax_save
endif
endif endif
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'glsl') == -1 if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'glsl') == -1
@@ -25,6 +34,22 @@ syn region ShaderScript
\ end="</script>"me=s-1 \ end="</script>"me=s-1
\ contains=@GLSL,htmlScriptTag,@htmlPreproc \ contains=@GLSL,htmlScriptTag,@htmlPreproc
endif
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'html5') == -1
" Vim syntax file
" Language: HTML (version 5.1)
" Last Change: 2017 Feb 15
" License: Public domain
" (but let me know if you like :) )
"
" Maintainer: Kao, Wei-Ko(othree) ( othree AT gmail DOT com )
" Comment
" https://github.com/w3c/html/issues/694
syntax region htmlComment start=+<!--+ end=+-->+ contains=@Spell
syntax region htmlComment start=+<!DOCTYPE+ keepend end=+>+
endif endif
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'less') == -1 if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'less') == -1

View File

@@ -48,7 +48,7 @@ syn region jsxChild contained start=+{+ end=++ contains=jsBlock,javascriptBlock
" preceding it, to avoid conflicts with, respectively, the left shift operator " preceding it, to avoid conflicts with, respectively, the left shift operator
" and generic Flow type annotations (http://flowtype.org/). " and generic Flow type annotations (http://flowtype.org/).
syn region jsxRegion syn region jsxRegion
\ contains=@XMLSyntax,jsxRegion,jsxChild,jsBlock,javascriptBlock \ contains=@Spell,@XMLSyntax,jsxRegion,jsxChild,jsBlock,javascriptBlock
\ start=+\%(<\|\w\)\@<!<\z([a-zA-Z][a-zA-Z0-9:\-.]*\)+ \ start=+\%(<\|\w\)\@<!<\z([a-zA-Z][a-zA-Z0-9:\-.]*\)+
\ skip=+<!--\_.\{-}-->+ \ skip=+<!--\_.\{-}-->+
\ end=+</\z1\_\s\{-}>+ \ end=+</\z1\_\s\{-}>+

107
after/syntax/mma.vim Normal file
View File

@@ -0,0 +1,107 @@
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'mathematica') == -1
"Vim conceal file
" Language: Mathematica
" Maintainer: R. Menon <rsmenon@icloud.com>
" Last Change: Feb 25, 2013
if (exists('g:mma_candy') && g:mma_candy == 0) || !has('conceal') || &enc != 'utf-8'
finish
endif
"These are fairly safe and straightforward conceals
if exists('g:mma_candy') && g:mma_candy > 0
"Rules
syntax match mmaOperator "->" conceal cchar="Rule
syntax match mmaOperator ":>" conceal cchar="RuleDelayed
"Logicals
syntax match mmaOperator "===" conceal cchar="SameQ
syntax match mmaOperator "=!=" conceal cchar="UnsameQ
syntax match mmaOperator "!=" conceal cchar="NotEqual
syntax match mmaOperator "<=" conceal cchar="LessEqual
syntax match mmaOperator ">=" conceal cchar="GreaterEqual
"Constants
syntax keyword mmaSystemSymbol Pi conceal cchar=π
syntax keyword mmaSystemSymbol Infinity conceal cchar=
syntax keyword mmaSystemSymbol Degree conceal cchar=°
"Domains
syntax keyword mmaSystemSymbol Reals conceal cchar=
syntax keyword mmaSystemSymbol Integers conceal cchar=
syntax keyword mmaSystemSymbol Complexes conceal cchar=
syntax keyword mmaSystemSymbol Rationals conceal cchar=
"Greek
syntax match mmaSymbol "\\\[CapitalAlpha\]" conceal cchar=Α
syntax match mmaSymbol "\\\[CapitalBeta\]" conceal cchar=Β
syntax match mmaSymbol "\\\[CapitalGamma\]" conceal cchar=Γ
syntax match mmaSymbol "\\\[CapitalDelta\]" conceal cchar=Δ
syntax match mmaSymbol "\\\[CapitalEpsilon\]" conceal cchar=Ε
syntax match mmaSymbol "\\\[CapitalZeta\]" conceal cchar=Ζ
syntax match mmaSymbol "\\\[CapitalEta\]" conceal cchar=Η
syntax match mmaSymbol "\\\[CapitalTheta\]" conceal cchar=Θ
syntax match mmaSymbol "\\\[CapitalIota\]" conceal cchar=Ι
syntax match mmaSymbol "\\\[CapitalKappa\]" conceal cchar=Κ
syntax match mmaSymbol "\\\[CapitalLambda\]" conceal cchar=Λ
syntax match mmaSymbol "\\\[CapitalMu\]" conceal cchar=Μ
syntax match mmaSymbol "\\\[CapitalNu\]" conceal cchar=Ν
syntax match mmaSymbol "\\\[CapitalXi\]" conceal cchar=Ξ
syntax match mmaSymbol "\\\[CapitalOmicron\]" conceal cchar=Ο
syntax match mmaSymbol "\\\[CapitalPi\]" conceal cchar=Π
syntax match mmaSymbol "\\\[CapitalRho\]" conceal cchar=Ρ
syntax match mmaSymbol "\\\[CapitalSigma\]" conceal cchar=Σ
syntax match mmaSymbol "\\\[CapitalTau\]" conceal cchar=Τ
syntax match mmaSymbol "\\\[CapitalUpsilon\]" conceal cchar=Υ
syntax match mmaSymbol "\\\[CapitalPhi\]" conceal cchar=Φ
syntax match mmaSymbol "\\\[CapitalChi\]" conceal cchar=Χ
syntax match mmaSymbol "\\\[CapitalPsi\]" conceal cchar=Ψ
syntax match mmaSymbol "\\\[CapitalOmega\]" conceal cchar=Ω
syntax match mmaSymbol "\\\[Alpha\]" conceal cchar=α
syntax match mmaSymbol "\\\[Beta\]" conceal cchar=β
syntax match mmaSymbol "\\\[Gamma\]" conceal cchar=γ
syntax match mmaSymbol "\\\[Delta\]" conceal cchar=δ
syntax match mmaSymbol "\\\[Epsilon\]" conceal cchar=ε
syntax match mmaSymbol "\\\[Zeta\]" conceal cchar=ζ
syntax match mmaSymbol "\\\[Eta\]" conceal cchar=η
syntax match mmaSymbol "\\\[Theta\]" conceal cchar=θ
syntax match mmaSymbol "\\\[Iota\]" conceal cchar=ι
syntax match mmaSymbol "\\\[Kappa\]" conceal cchar=κ
syntax match mmaSymbol "\\\[Lambda\]" conceal cchar=λ
syntax match mmaSymbol "\\\[Mu\]" conceal cchar=μ
syntax match mmaSymbol "\\\[Nu\]" conceal cchar=ν
syntax match mmaSymbol "\\\[Xi\]" conceal cchar=ξ
syntax match mmaSymbol "\\\[Omicron\]" conceal cchar=ο
syntax match mmaSymbol "\\\[Pi\]" conceal cchar=π
syntax match mmaSymbol "\\\[Rho\]" conceal cchar=ρ
syntax match mmaSymbol "\\\[Sigma\]" conceal cchar=σ
syntax match mmaSymbol "\\\[Tau\]" conceal cchar=τ
syntax match mmaSymbol "\\\[Upsilon\]" conceal cchar=υ
syntax match mmaSymbol "\\\[Phi\]" conceal cchar=φ
syntax match mmaSymbol "\\\[Chi\]" conceal cchar=χ
syntax match mmaSymbol "\\\[Psi\]" conceal cchar=ψ
syntax match mmaSymbol "\\\[Omega\]" conceal cchar=ω
endif
"These might be troublesome if the appropriate fonts are missing. Also, they don't
"look quite as good as the earlier ones, so enable only if the user chooses to
if exists('g:mma_candy') && g:mma_candy == 2
"Constants
syntax keyword mmaSystemSymbol I conceal cchar=
syntax keyword mmaSystemSymbol E conceal cchar=
"Functions
syntax keyword mmaSystemSymbol Sum conceal cchar=
syntax keyword mmaSystemSymbol Product conceal cchar=
syntax keyword mmaSystemSymbol Sqrt conceal cchar=
"Misc
syntax match mmaOperator ">>" conceal cchar=» "Put
syntax match mmaOperator "<<" conceal cchar=« "Get
endif
hi! link Conceal Normal
setlocal conceallevel=2
endif

View File

@@ -21,9 +21,7 @@ if version < 600
endif endif
syntax clear syntax clear
syn match yamlDelimiter "[:,-]"
syn match yamlBlock "[\[\]\{\}\|\>]" syn match yamlBlock "[\[\]\{\}\|\>]"
syn match yamlOperator "[?^+-]\|=>"
syn region yamlComment start="\#" end="$" syn region yamlComment start="\#" end="$"
syn match yamlIndicator "#YAML:\S\+" syn match yamlIndicator "#YAML:\S\+"
@@ -40,11 +38,12 @@ syn keyword yamlConstant NULL Null null NONE None none NIL Nil nil
syn keyword yamlConstant TRUE True true YES Yes yes ON On on syn keyword yamlConstant TRUE True true YES Yes yes ON On on
syn keyword yamlConstant FALSE False false NO No no OFF Off off syn keyword yamlConstant FALSE False false NO No no OFF Off off
syn match yamlKey "\w\+\ze\s*:" syn match yamlKey "^\s*\zs\S\+\ze\s*:"
syn match yamlKey "^\s*-\s*\zs\S\+\ze\s*:"
syn match yamlAnchor "&\S\+" syn match yamlAnchor "&\S\+"
syn match yamlAlias "*\S\+" syn match yamlAlias "*\S\+"
" Setupt the hilighting links " Setup the highlighting links
hi link yamlConstant Keyword hi link yamlConstant Keyword
hi link yamlIndicator PreCondit hi link yamlIndicator PreCondit
@@ -55,10 +54,7 @@ hi link yamlType Type
hi link yamlComment Comment hi link yamlComment Comment
hi link yamlBlock Operator hi link yamlBlock Operator
hi link yamlOperator Operator
hi link yamlDelimiter Delimiter
hi link yamlString String hi link yamlString String
hi link yamlEscape Special hi link yamlEscape Special
endif endif

File diff suppressed because one or more lines are too long

View File

@@ -20,18 +20,20 @@ endfunction
function! dart#fmt(q_args) abort function! dart#fmt(q_args) abort
if executable('dartfmt') if executable('dartfmt')
let path = expand('%:p:gs:\:/:') let buffer_content = join(getline(1, '$'), "\n")
if filereadable(path) let joined_lines = system(printf('dartfmt %s', a:q_args), buffer_content)
let joined_lines = system(printf('dartfmt %s %s', a:q_args, shellescape(path)))
if 0 == v:shell_error if 0 == v:shell_error
let win_view = winsaveview()
silent % delete _ silent % delete _
silent put=joined_lines silent put=joined_lines
silent 1 delete _ silent 1 delete _
call winrestview(win_view)
else else
call s:cexpr('line %l\, column %c of %f: %m', joined_lines) let errors = split(joined_lines, "\n")[2:]
endif let file_path = expand('%')
else call map(errors, 'file_path.":".v:val')
call s:error(printf('cannot read a file: "%s"', path)) let error_format = '%A%f:line %l\, column %c of stdin: %m,%C%.%#'
call s:cexpr(error_format, join(errors, "\n"))
endif endif
else else
call s:error('cannot execute binary file: dartfmt') call s:error('cannot execute binary file: dartfmt')
@@ -66,5 +68,86 @@ function! dart#tojs(q_args) abort
endif endif
endfunction endfunction
" Finds the path to `uri`.
"
" If the file is a package: uri, looks for a .packages file to resolve the path.
" If the path cannot be resolved, or is not a package: uri, returns the
" original.
function! dart#resolveUri(uri) abort
if a:uri !~ 'package:'
return a:uri
endif
let package_name = substitute(a:uri, 'package:\(\w\+\)\/.*', '\1', '')
let [found, package_map] = s:PackageMap()
if !found
call s:error('cannot find .packages file')
return a:uri
endif
if !has_key(package_map, package_name)
call s:error('no package mapping for '.package_name)
return a:uri
endif
let package_lib = package_map[package_name]
return substitute(a:uri,
\ 'package:'.package_name,
\ escape(package_map[package_name], '\'),
\ '')
endfunction
" A map from package name to lib directory parse from a '.packages' file.
"
" Returns [found, package_map]
function! s:PackageMap() abort
let [found, dot_packages] = s:DotPackagesFile()
if !found
return [v:false, {}]
endif
let dot_packages_dir = fnamemodify(dot_packages, ':p:h')
let lines = readfile(dot_packages)
let map = {}
for line in lines
if line =~ '\s*#'
continue
endif
let package = substitute(line, ':.*$', '', '')
let lib_dir = substitute(line, '^[^:]*:', '', '')
if lib_dir =~ 'file:/'
let lib_dir = substitute(lib_dir, 'file://', '', '')
if lib_dir =~ '/[A-Z]:/'
let lib_dir = lib_dir[1:]
endif
else
let lib_dir = resolve(dot_packages_dir.'/'.lib_dir)
endif
if lib_dir =~ '/$'
let lib_dir = lib_dir[:len(lib_dir) - 2]
endif
let map[package] = lib_dir
endfor
return [v:true, map]
endfunction
" Finds a file name '.packages' in the cwd, or in any directory above the open
" file.
"
" Returns [found, file].
function! s:DotPackagesFile() abort
if filereadable('.packages')
return [v:true, '.packages']
endif
let dir_path = expand('%:p:h')
while v:true
let file_path = dir_path.'/.packages'
if filereadable(file_path)
return [v:true, file_path]
endif
let parent = fnamemodify(dir_path, ':h')
if dir_path == parent
break
endif
let dir_path = parent
endwhile
return [v:false, '']
endfunction
endif endif

219
autoload/elixir/indent.vim Normal file
View File

@@ -0,0 +1,219 @@
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'elixir') == -1
let s:NO_COLON_BEFORE = ':\@<!'
let s:NO_COLON_AFTER = ':\@!'
let s:ENDING_SYMBOLS = '\]\|}\|)'
let s:ARROW = '->'
let s:END_WITH_ARROW = s:ARROW.'$'
let s:SKIP_SYNTAX = '\%(Comment\|String\)$'
let s:BLOCK_SKIP = "synIDattr(synID(line('.'),col('.'),1),'name') =~? '".s:SKIP_SYNTAX."'"
let s:DEF = '^\s*def'
let s:FN = '\<fn\>'
let s:MULTILINE_FN = s:FN.'\%(.*end\)\@!'
let s:BLOCK_START = '\%(\<do\>\|'.s:FN.'\)\>'
let s:MULTILINE_BLOCK = '\%(\<do\>'.s:NO_COLON_AFTER.'\|'.s:MULTILINE_FN.'\)'
let s:BLOCK_MIDDLE = '\<\%(else\|match\|elsif\|catch\|after\|rescue\)\>'
let s:BLOCK_END = 'end'
let s:STARTS_WITH_PIPELINE = '^\s*|>.*$'
let s:QUERY_FROM = '^\s*\<from\>.*\<in\>.*,'
let s:ENDING_WITH_ASSIGNMENT = '=\s*$'
let s:INDENT_KEYWORDS = s:NO_COLON_BEFORE.'\%('.s:MULTILINE_BLOCK.'\|'.s:BLOCK_MIDDLE.'\)'
let s:DEINDENT_KEYWORDS = '^\s*\<\%('.s:BLOCK_END.'\|'.s:BLOCK_MIDDLE.'\)\>'
let s:PAIR_START = '\<\%('.s:NO_COLON_BEFORE.s:BLOCK_START.'\)\>'.s:NO_COLON_AFTER
let s:PAIR_MIDDLE = '^\s*\%('.s:BLOCK_MIDDLE.'\)\>'.s:NO_COLON_AFTER.'\zs'
let s:PAIR_END = '\<\%('.s:NO_COLON_BEFORE.s:BLOCK_END.'\)\>\zs'
let s:LINE_COMMENT = '^\s*#'
let s:MATCH_OPERATOR = '[^!><=]=[^~=>]'
function! s:pending_parenthesis(line)
if a:line.last_non_blank.text !~ s:ARROW
return elixir#util#count_indentable_symbol_diff(a:line.last_non_blank, '(', '\%(end\s*\)\@<!)')
end
endfunction
function! s:pending_square_brackets(line)
if a:line.last_non_blank.text !~ s:ARROW
return elixir#util#count_indentable_symbol_diff(a:line.last_non_blank, '[', ']')
end
endfunction
function! s:pending_brackets(line)
if a:line.last_non_blank.text !~ s:ARROW
return elixir#util#count_indentable_symbol_diff(a:line.last_non_blank, '{', '}')
end
endfunction
function! elixir#indent#deindent_case_arrow(ind, line)
if get(b:old_ind, 'arrow', 0) > 0
\ && (a:line.current.text =~ s:ARROW
\ || a:line.current.text =~ s:BLOCK_END)
let ind = b:old_ind.arrow
let b:old_ind.arrow = 0
return ind
else
return a:ind
end
endfunction
function! elixir#indent#deindent_ending_symbols(ind, line)
if a:line.current.text =~ '^\s*\('.s:ENDING_SYMBOLS.'\)'
return a:ind - &sw
else
return a:ind
end
endfunction
function! elixir#indent#deindent_keywords(ind, line)
if a:line.current.text =~ s:DEINDENT_KEYWORDS
let bslnum = searchpair(
\ s:PAIR_START,
\ s:PAIR_MIDDLE,
\ s:PAIR_END,
\ 'nbW',
\ s:BLOCK_SKIP
\ )
return indent(bslnum)
else
return a:ind
end
endfunction
function! elixir#indent#deindent_opened_symbols(ind, line)
let s:opened_symbol =
\ s:pending_parenthesis(a:line)
\ + s:pending_square_brackets(a:line)
\ + s:pending_brackets(a:line)
if s:opened_symbol < 0
let ind = get(b:old_ind, 'symbol', a:ind + (s:opened_symbol * &sw))
let ind = float2nr(ceil(floor(ind)/&sw)*&sw)
return ind <= 0 ? 0 : ind
else
return a:ind
end
endfunction
function! elixir#indent#indent_after_pipeline(ind, line)
if exists("b:old_ind.pipeline")
\ && elixir#util#is_blank(a:line.last.text)
\ && a:line.current.text !~ s:STARTS_WITH_PIPELINE
" Reset indentation in pipelines if there is a blank line between
" pipes
let ind = b:old_ind.pipeline
unlet b:old_ind.pipeline
return ind
elseif a:line.last_non_blank.text =~ s:STARTS_WITH_PIPELINE
if empty(substitute(a:line.current.text, ' ', '', 'g'))
\ || a:line.current.text =~ s:STARTS_WITH_PIPELINE
return indent(a:line.last_non_blank.num)
elseif a:line.last_non_blank.text !~ s:INDENT_KEYWORDS
let ind = b:old_ind.pipeline
unlet b:old_ind.pipeline
return ind
end
end
return a:ind
endfunction
function! elixir#indent#indent_assignment(ind, line)
if a:line.last_non_blank.text =~ s:ENDING_WITH_ASSIGNMENT
let b:old_ind.pipeline = indent(a:line.last_non_blank.num) " FIXME: side effect
return a:ind + &sw
else
return a:ind
end
endfunction
function! elixir#indent#indent_brackets(ind, line)
if s:pending_brackets(a:line) > 0
return a:ind + &sw
else
return a:ind
end
endfunction
function! elixir#indent#indent_case_arrow(ind, line)
if a:line.last_non_blank.text =~ s:END_WITH_ARROW && a:line.last_non_blank.text !~ '\<fn\>'
let b:old_ind.arrow = a:ind
return a:ind + &sw
else
return a:ind
end
endfunction
function! elixir#indent#indent_ending_symbols(ind, line)
if a:line.last_non_blank.text =~ '^\s*\('.s:ENDING_SYMBOLS.'\)\s*$'
return a:ind + &sw
else
return a:ind
end
endfunction
function! elixir#indent#indent_keywords(ind, line)
if a:line.last_non_blank.text =~ s:INDENT_KEYWORDS && a:line.last_non_blank.text !~ s:LINE_COMMENT
return a:ind + &sw
else
return a:ind
end
endfunction
function! elixir#indent#indent_parenthesis(ind, line)
if s:pending_parenthesis(a:line) > 0
\ && a:line.last_non_blank.text !~ s:DEF
\ && a:line.last_non_blank.text !~ s:END_WITH_ARROW
let b:old_ind.symbol = a:ind
return matchend(a:line.last_non_blank.text, '(')
else
return a:ind
end
endfunction
function! elixir#indent#indent_pipeline_assignment(ind, line)
if a:line.current.text =~ s:STARTS_WITH_PIPELINE
\ && a:line.last_non_blank.text =~ s:MATCH_OPERATOR
let b:old_ind.pipeline = indent(a:line.last_non_blank.num)
" if line starts with pipeline
" and last_non_blank line is an attribution
" indents pipeline in same level as attribution
let assign_pos = match(a:line.last_non_blank.text, '=\s*\zs[^ ]')
return (elixir#util#is_indentable_at(a:line.last_non_blank.num, assign_pos) ? assign_pos : a:ind)
else
return a:ind
end
endfunction
function! elixir#indent#indent_pipeline_continuation(ind, line)
if a:line.last_non_blank.text =~ s:STARTS_WITH_PIPELINE
\ && a:line.current.text =~ s:STARTS_WITH_PIPELINE
return indent(a:line.last_non_blank.num)
else
return a:ind
end
endfunction
function! elixir#indent#indent_square_brackets(ind, line)
if s:pending_square_brackets(a:line) > 0
if a:line.last_non_blank.text =~ '[\s*$'
return a:ind + &sw
else
" if start symbol is followed by a character, indent based on the
" whitespace after the symbol, otherwise use the default shiftwidth
" Avoid negative indentation index
return matchend(a:line.last_non_blank.text, '[\s*')
end
else
return a:ind
end
endfunction
function! elixir#indent#indent_ecto_queries(ind, line)
if a:line.last_non_blank.text =~ s:QUERY_FROM
return a:ind + &sw
else
return a:ind
end
endfunction
endif

52
autoload/elixir/util.vim Normal file
View File

@@ -0,0 +1,52 @@
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'elixir') == -1
let s:SKIP_SYNTAX = '\%(Comment\|String\)$'
function! elixir#util#is_indentable_at(line, col)
if a:col == -1 " skip synID lookup for not found match
return 1
end
" TODO: Remove these 2 lines
" I don't know why, but for the test on spec/indent/lists_spec.rb:24.
" Vim is making some mess on parsing the syntax of 'end', it is being
" recognized as 'elixirString' when should be recognized as 'elixirBlock'.
call synID(a:line, a:col, 1)
" This forces vim to sync the syntax. Using fromstart is very slow on files
" over 1k lines
syntax sync minlines=20 maxlines=150
return synIDattr(synID(a:line, a:col, 1), "name")
\ !~ s:SKIP_SYNTAX
endfunction
function! elixir#util#count_indentable_symbol_diff(line, open, close)
return
\ s:match_count(a:line, a:open)
\ - s:match_count(a:line, a:close)
endfunction
function! s:match_count(line, pattern)
let size = strlen(a:line.text)
let index = 0
let counter = 0
while index < size
let index = match(a:line.text, a:pattern, index)
if index >= 0
let index += 1
if elixir#util#is_indentable_at(a:line.num, index)
let counter +=1
end
else
break
end
endwhile
return counter
endfunction
function elixir#util#is_blank(string)
return a:string =~ '^\s*$'
endfunction
endif

View File

@@ -6,7 +6,7 @@ if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'html5') == -1
" Last Change: 2006 Oct 19 " Last Change: 2006 Oct 19
" Modified: othree <othree@gmail.com> " Modified: othree <othree@gmail.com>
" Changes: Add HTML5, WAI-ARIA support " Changes: Add HTML5, WAI-ARIA support
" Last Change: 2010 Sep 25 " Last Change: 2016 Oct 11
if !exists('g:aria_attributes_complete') if !exists('g:aria_attributes_complete')
let g:aria_attributes_complete = 1 let g:aria_attributes_complete = 1
@@ -276,7 +276,9 @@ function! htmlcomplete#CompleteTags(findstart, base)
" 1. Events attributes " 1. Events attributes
if context =~ '\s' if context =~ '\s'
" Sort out style, class, and on* cases " Sort out style, class, and on* cases
if context =~? "\\s\\(on[a-z]+\\|id\\|style\\|class\\)\\s*=\\s*[\"']" if context =~? "\\(id\\|class\\)\\s*=\\s*[\"'][a-zA-Z0-9_ -]*$"
\ || context =~? "style\\s*=\\s*[\"'][^\"']*$"
\ || context =~? 'on[a-z]*\s*=\s*\(''[^'']*\|"[^"]*\)$'
" Id, class completion {{{ " Id, class completion {{{
if context =~? "\\(id\\|class\\)\\s*=\\s*[\"'][a-zA-Z0-9_ -]*$" if context =~? "\\(id\\|class\\)\\s*=\\s*[\"'][a-zA-Z0-9_ -]*$"
if context =~? "class\\s*=\\s*[\"'][a-zA-Z0-9_ -]*$" if context =~? "class\\s*=\\s*[\"'][a-zA-Z0-9_ -]*$"

21
autoload/python/utils.vim Normal file
View File

@@ -0,0 +1,21 @@
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'python-compiler') == -1
" Sometimes Python issues debugging messages
" which don't belong to a call stack context
" this function filters these messages
function! python#utils#fix_qflist() " {{{
let l:traceback = []
let l:qflist = getqflist()
for l:item in l:qflist
if !empty(l:item.type)
call add(l:traceback, l:item)
endif
endfor
if !empty(l:traceback)
call setqflist(l:traceback)
endif
endfunction " }}}
endif

View File

@@ -198,7 +198,7 @@ function! rubycomplete#Complete(findstart, base)
if c =~ '\w' if c =~ '\w'
continue continue
elseif ! c =~ '\.' elseif ! c =~ '\.'
idx = -1 let idx = -1
break break
else else
break break
@@ -589,13 +589,15 @@ class VimRubyCompletion
# {{{ main completion code # {{{ main completion code
def self.preload_rails def self.preload_rails
a = VimRubyCompletion.new a = VimRubyCompletion.new
require 'Thread' if VIM::evaluate("has('nvim')") == 0
require 'thread'
Thread.new(a) do |b| Thread.new(a) do |b|
begin begin
b.load_rails b.load_rails
rescue rescue
end end
end end
end
a.load_rails a.load_rails
rescue rescue
end end

View File

@@ -22,17 +22,20 @@ endif
let s:got_fmt_error = 0 let s:got_fmt_error = 0
function! rustfmt#Format() function! s:RustfmtCommandRange(filename, line1, line2)
let l:curw = winsaveview() let l:arg = {"file": shellescape(a:filename), "range": [a:line1, a:line2]}
let l:tmpname = expand("%:p:h") . "/." . expand("%:p:t") . ".rustfmt" return printf("%s %s --write-mode=overwrite --file-lines '[%s]'", g:rustfmt_command, g:rustfmt_options, json_encode(l:arg))
call writefile(getline(1, '$'), l:tmpname) endfunction
let command = g:rustfmt_command . " --write-mode=overwrite " function! s:RustfmtCommand(filename)
return g:rustfmt_command . " --write-mode=overwrite " . g:rustfmt_options . " " . shellescape(a:filename)
endfunction
function! s:RunRustfmt(command, curw, tmpname)
if exists("*systemlist") if exists("*systemlist")
let out = systemlist(command . g:rustfmt_options . " " . shellescape(l:tmpname)) let out = systemlist(a:command)
else else
let out = split(system(command . g:rustfmt_options . " " . shellescape(l:tmpname)), '\r\?\n') let out = split(system(a:command), '\r\?\n')
endif endif
if v:shell_error == 0 || v:shell_error == 3 if v:shell_error == 0 || v:shell_error == 3
@@ -40,7 +43,7 @@ function! rustfmt#Format()
try | silent undojoin | catch | endtry try | silent undojoin | catch | endtry
" Replace current file with temp file, then reload buffer " Replace current file with temp file, then reload buffer
call rename(l:tmpname, expand('%')) call rename(a:tmpname, expand('%'))
silent edit! silent edit!
let &syntax = &syntax let &syntax = &syntax
@@ -78,10 +81,30 @@ function! rustfmt#Format()
let s:got_fmt_error = 1 let s:got_fmt_error = 1
lwindow lwindow
" We didn't use the temp file, so clean up " We didn't use the temp file, so clean up
call delete(l:tmpname) call delete(a:tmpname)
endif endif
call winrestview(l:curw) call winrestview(a:curw)
endfunction
function! rustfmt#FormatRange(line1, line2)
let l:curw = winsaveview()
let l:tmpname = expand("%:p:h") . "/." . expand("%:p:t") . ".rustfmt"
call writefile(getline(1, '$'), l:tmpname)
let command = s:RustfmtCommandRange(l:tmpname, a:line1, a:line2)
call s:RunRustfmt(command, l:curw, l:tmpname)
endfunction
function! rustfmt#Format()
let l:curw = winsaveview()
let l:tmpname = expand("%:p:h") . "/." . expand("%:p:t") . ".rustfmt"
call writefile(getline(1, '$'), l:tmpname)
let command = s:RustfmtCommand(l:tmpname)
call s:RunRustfmt(command, l:curw, l:tmpname)
endfunction endfunction
endif endif

41
autoload/scss_indent.vim Normal file
View File

@@ -0,0 +1,41 @@
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'scss') == -1
" usage:
" set indentexpr=scss_indent#GetIndent(v:lnum)
fun! scss_indent#GetIndent(lnum)
" { -> increase indent
" } -> decrease indent
if a:lnum == 1
" start at 0 indentation
return 0
endif
" try to find last line ending with { or }
" ignoring // comments
let regex = '\([{}]\)\%(\/\/.*\)\?$'
let nr = search(regex, 'bnW')
if nr > 0
let last = indent(nr)
let m = matchlist(getline(nr), regex)
let m_curr = matchlist(getline(a:lnum), regex)
echoe string(m).string(m_curr)
if !empty(m_curr) && m_curr[1] == '}' && m[1] == '{'
" last was open, current is close, use same indent
return last
elseif !empty(m_curr) && m_curr[1] == '}' && m[1] == '}'
" } line and last line was }: decrease
return last - &sw
endif
if m[1] == '{'
" line after {: increase indent
return last + &sw
else
" line after } or { - same indent
return last
endif
else
return 0
endif
endfun
endif

View File

@@ -3,31 +3,220 @@ if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'html5') == -1
" Vim completion for WAI-ARIA data file " Vim completion for WAI-ARIA data file
" Language: HTML + WAI-ARIA " Language: HTML + WAI-ARIA
" Maintainer: othree <othree@gmail.com> " Maintainer: othree <othree@gmail.com>
" Last Change: 2010 Sep 09 " Last Change: 2017 Mar 07
" WAI_ARIA: {{{ " WAI_ARIA: {{{
" Ref: http://www.w3.org/TR/wai-aria/ " Ref: https://www.w3.org/TR/wai-aria-1.1/
" Version: Draft 15 December 2009 " Version: W3C Candidate Recommendation 27 October 2016
let abstract_role = {} let abstract_role = {}
let role_attributes = {} let role_attributes = {}
let default_role = {} let default_role = {}
" Ref: http://www.w3.org/TR/wai-aria/roles " Ref: https://www.w3.org/TR/wai-aria-1.1/#roles_categorization
" Version: Draft 15 December 2009 " Version: W3C Candidate Recommendation 27 October 2016
let widget_role = ['alert', 'alertdialog', 'button', 'checkbox', 'combobox', 'dialog', 'gridcell', 'link', 'log', 'marquee', 'menuitem', 'menuitemcheckbox', 'menuitemradio', 'option', 'progressbar', 'radio', 'radiogroup', 'scrollbar', 'slider', 'spinbutton', 'status', 'tab', 'tabpanel', 'textbox', 'timer', 'tooltip', 'treeitem', 'combobox', 'grid', 'listbox', 'menu', 'menubar', 'radiogroup', 'tablist', 'tree', 'treegrid'] let widget_role = [
let document_structure = ['article', 'columnheader', 'definition', 'directory', 'document', 'group', 'heading', 'img', 'list', 'listitem', 'math', 'note', 'presentation', 'region', 'row', 'rowheader', 'separator'] \ 'alert',
let landmark_role = ['application', 'banner', 'complementary', 'contentinfo', 'form', 'main', 'navigation', 'search'] \ 'alertdialog',
\ 'button',
\ 'checkbox',
\ 'combobox',
\ 'dialog',
\ 'gridcell',
\ 'link',
\ 'log',
\ 'marquee',
\ 'menuitem',
\ 'menuitemcheckbox',
\ 'menuitemradio',
\ 'option',
\ 'progressbar',
\ 'radio',
\ 'radiogroup',
\ 'scrollbar',
\ 'searchbox',
\ 'slider',
\ 'spinbutton',
\ 'status',
\ 'switch',
\ 'tab',
\ 'tabpanel',
\ 'textbox',
\ 'timer',
\ 'tooltip',
\ 'treeitem',
\ 'combobox',
\ 'grid',
\ 'listbox',
\ 'menu',
\ 'menubar',
\ 'radiogroup',
\ 'tablist',
\ 'tree',
\ 'treegrid'
\ ]
let document_structure = [
\ 'article',
\ 'cell',
\ 'columnheader',
\ 'definition',
\ 'directory',
\ 'document',
\ 'feed',
\ 'figure',
\ 'group',
\ 'heading',
\ 'img',
\ 'list',
\ 'listitem',
\ 'math',
\ 'none',
\ 'note',
\ 'presentation',
\ 'region',
\ 'row',
\ 'rowheader',
\ 'separator',
\ 'table',
\ 'term'
\ ]
let landmark_role = [
\ 'application',
\ 'banner',
\ 'complementary',
\ 'contentinfo',
\ 'form',
\ 'main',
\ 'navigation',
\ 'search'
\ ]
" Ref: https://www.w3.org/TR/dpub-aria-1.0/
" Version: W3C Candidate Recommendation 15 December 2016
let dpub_role = [
\ 'dpub-abstract',
\ 'dpub-afterword',
\ 'dpub-appendix',
\ 'dpub-biblioentry',
\ 'dpub-bibliography',
\ 'dpub-biblioref',
\ 'dpub-chapter',
\ 'dpub-cover',
\ 'dpub-epilogue',
\ 'dpub-footnote',
\ 'dpub-footnotes',
\ 'dpub-foreword',
\ 'dpub-glossary',
\ 'dpub-glossdef',
\ 'dpub-glossref',
\ 'dpub-glossterm',
\ 'dpub-index',
\ 'dpub-locator',
\ 'dpub-noteref',
\ 'dpub-notice',
\ 'dpub-pagebreak',
\ 'dpub-pagelist',
\ 'dpub-part',
\ 'dpub-preface',
\ 'dpub-prologue',
\ 'dpub-pullquote',
\ 'dpub-qna',
\ 'dpub-subtitle',
\ 'dpub-tip',
\ 'dpub-title',
\ 'dpub-toc'
\ ]
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)
" http://www.w3.org/TR/wai-aria/states_and_properties#state_prop_taxonomy " https://www.w3.org/TR/wai-aria-1.1/#states_and_properties
"let global_states_and_properties = {'aria-atomic': ['true', 'false'], 'aria-busy': ['true', 'false'], 'aria-controls': [], 'aria-describedby': [], 'aria-disabled': ['true', 'false'], 'aria-dropeffect': ['copy', 'move', 'link', 'execute', 'popup', 'none'], 'aria-flowto': [], 'aria-grabbed': ['true', 'false', 'undefined'], 'aria-haspopup': ['true', 'false'], 'aria-hidden': ['true', 'false'], 'aria-invalid': ['grammar', 'spelling', 'true', 'false'], 'aria-label': [], 'aria-labelledby': [], 'aria-live': ['off', 'polite', 'assertive'], 'aria-owns': [], 'aria-relevant': ['additions', 'removals', 'text', 'all']} let global_states_and_properties = {
let widget_attributes = {'aria-autocomplete': ['inline', 'list', 'both', 'none'], 'aria-checked': ['true', 'false', 'mixed', 'undefined'], 'aria-disabled': ['true', 'false'], 'aria-expanded': ['true', 'false', 'undefined'], 'aria-haspopup': ['true', 'false'], 'aria-hidden': ['true', 'false'], 'aria-invalid': ['grammar', 'spelling', 'true', 'false'], 'aria-label': [], 'aria-level': [], 'aria-multiline': ['true', 'false'], 'aria-multiselectable': ['true', 'false'], 'aria-orientation': ['horizontal', 'vertical'], 'aria-pressed': ['true', 'false', 'mixed', 'undefined'], 'aria-readonly': ['true', 'false'], 'aria-required': ['true', 'false'], 'aria-selected': ['true', 'false', 'undefined'], 'aria-sort': ['ascending', 'descending', 'none', 'other'], 'aria-valuemax': [], 'aria-valuemin': [], 'aria-valuenow': [], 'aria-valuetext': []} \ 'aria-atomic': ['true', 'false'],
let live_region_attributes = {'aria-atomic': ['true', 'false'], 'aria-busy': ['true', 'false'], 'aria-live': ['off', 'polite', 'assertive'], 'aria-relevant': ['additions', 'removals', 'text', 'all', 'additions text']} \ 'aria-busy': ['true', 'false'],
let drag_and_drop_attributes = {'aria-dropeffect': ['copy', 'move', 'link', 'execute', 'popup', 'none'], 'aria-grabbed': ['true', 'false', 'undefined']} \ 'aria-controls': [],
let relationship_attributes = {'aria-activedescendant': [], 'aria-controls': [], 'aria-describedby': [], 'aria-flowto': [], 'aria-labelledby': [], 'aria-owns': [], 'aria-posinset': [], 'aria-setsize': []} \ 'aria-current': [],
let aria_attributes = widget_attributes \ 'aria-describedby': [],
\ 'aria-disabled': ['true', 'false'],
\ 'aria-dropeffect': ['copy', 'move', 'link', 'execute', 'popup', 'none'],
\ 'aria-errormessage': [],
\ 'aria-flowto': [],
\ 'aria-grabbed': ['true', 'false', 'undefined'],
\ 'aria-haspopup': ['true', 'false'],
\ 'aria-hidden': ['true', 'false'],
\ 'aria-invalid': ['grammar', 'spelling', 'true', 'false'],
\ 'aria-keyshortcuts': [],
\ 'aria-label': [],
\ 'aria-labelledby': [],
\ 'aria-live': ['off', 'polite', 'assertive'],
\ 'aria-owns': [],
\ 'aria-relevant': ['additions', 'removals', 'text', 'all'],
\ 'aria-roledescription': [],
\ }
let widget_attributes = {
\ 'aria-autocomplete': ['inline', 'list', 'both', 'none'],
\ 'aria-checked': ['true', 'false', 'mixed', 'undefined'],
\ 'aria-disabled': ['true', 'false'],
\ 'aria-errormessage': [],
\ 'aria-expanded': ['true', 'false', 'undefined'],
\ 'aria-haspopup': ['true', 'false'],
\ 'aria-hidden': ['true', 'false'],
\ 'aria-invalid': ['grammar', 'spelling', 'true', 'false'],
\ 'aria-label': [],
\ 'aria-level': [],
\ 'aria-modal': ['true', 'false'],
\ 'aria-multiline': ['true', 'false'],
\ 'aria-multiselectable': ['true', 'false'],
\ 'aria-orientation': ['horizontal', 'vertical'],
\ 'aria-placeholder': [],
\ 'aria-pressed': ['true', 'false', 'mixed', 'undefined'],
\ 'aria-readonly': ['true', 'false'],
\ 'aria-required': ['true', 'false'],
\ 'aria-selected': ['true', 'false', 'undefined'],
\ 'aria-sort': ['ascending', 'descending', 'none', 'other'],
\ 'aria-valuemax': [],
\ 'aria-valuemin': [],
\ 'aria-valuenow': [],
\ 'aria-valuetext': []
\ }
let live_region_attributes = {
\ 'aria-atomic': ['true', 'false'],
\ 'aria-busy': ['true', 'false'],
\ 'aria-live': ['off', 'polite', 'assertive'],
\ 'aria-relevant': ['additions', 'removals', 'text', 'all', 'additions text']
\ }
let drag_and_drop_attributes = {
\ 'aria-dropeffect': ['copy', 'move', 'link', 'execute', 'popup', 'none'],
\ 'aria-grabbed': ['true', 'false', 'undefined']
\ }
let relationship_attributes = {
\ 'aria-activedescendant': [],
\ 'aria-colcount': [],
\ 'aria-colindex': [],
\ 'aria-colspan': [],
\ 'aria-controls': [],
\ 'aria-describedby': [],
\ 'aria-details': [],
\ 'aria-errormessage': [],
\ 'aria-flowto': [],
\ 'aria-labelledby': [],
\ 'aria-owns': [],
\ 'aria-posinset': [],
\ 'aria-rowcount': [],
\ 'aria-rowindex': [],
\ 'aria-rowspan': [],
\ 'aria-setsize': []
\ }
let aria_attributes = global_states_and_properties
let aria_attributes = extend(aria_attributes, widget_attributes)
let aria_attributes = extend(aria_attributes, live_region_attributes) let aria_attributes = extend(aria_attributes, live_region_attributes)
let aria_attributes = extend(aria_attributes, drag_and_drop_attributes) let aria_attributes = extend(aria_attributes, drag_and_drop_attributes)
let aria_attributes = extend(aria_attributes, relationship_attributes) let aria_attributes = extend(aria_attributes, relationship_attributes)
@@ -82,6 +271,8 @@ let role_attributes['status'] = abstract_role['composite'] + role_attributes['re
let role_attributes['tab'] = abstract_role['sectionhead'] + abstract_role['widget'] + ['aria-selected'] let role_attributes['tab'] = abstract_role['sectionhead'] + abstract_role['widget'] + ['aria-selected']
let role_attributes['tabpanel'] = role_attributes['region'] let role_attributes['tabpanel'] = role_attributes['region']
let role_attributes['textbox'] = abstract_role['input'] + ['aria-autocomplete', 'aria-multiline', 'aria-readonly', 'aria-required'] let role_attributes['textbox'] = abstract_role['input'] + ['aria-autocomplete', 'aria-multiline', 'aria-readonly', 'aria-required']
let role_attributes['searchbox'] = role_attributes['textbox']
let role_attributes['switch'] = role_attributes['checkbox']
let role_attributes['timer'] = role_attributes['status'] let role_attributes['timer'] = role_attributes['status']
let role_attributes['tooltip'] = abstract_role['section'] let role_attributes['tooltip'] = abstract_role['section']
let role_attributes['treeitem'] = role_attributes['listitem'] + role_attributes['option'] let role_attributes['treeitem'] = role_attributes['listitem'] + role_attributes['option']
@@ -99,16 +290,22 @@ let role_attributes['treegrid'] = role_attributes['grid'] + role_attributes['tre
let role_attributes['document'] = abstract_role['structure'] + ['aria-expanded'] let role_attributes['document'] = abstract_role['structure'] + ['aria-expanded']
let role_attributes['article'] = role_attributes['document'] + role_attributes['region'] let role_attributes['article'] = role_attributes['document'] + role_attributes['region']
let role_attributes['cell'] = abstract_role['section'] + ['aria-colindex', 'aria-colspan', 'aria-rowindex', 'aria-rowspan']
let role_attributes['columnheader'] = role_attributes['gridcell'] + abstract_role['sectionhead'] + ['aria-sort'] let role_attributes['columnheader'] = role_attributes['gridcell'] + abstract_role['sectionhead'] + ['aria-sort']
let role_attributes['definition'] = abstract_role['section'] let role_attributes['definition'] = abstract_role['section']
let role_attributes['feed'] = role_attributes['list']
let role_attributes['figure'] = abstract_role['section']
let role_attributes['heading'] = abstract_role['sectionhead'] + ['aria-level'] let role_attributes['heading'] = abstract_role['sectionhead'] + ['aria-level']
let role_attributes['img'] = abstract_role['section'] let role_attributes['img'] = abstract_role['section']
let role_attributes['math'] = abstract_role['section'] let role_attributes['math'] = abstract_role['section']
let role_attributes['note'] = abstract_role['section'] let role_attributes['note'] = abstract_role['section']
let role_attributes['presentation'] = abstract_role['structure'] let role_attributes['presentation'] = abstract_role['structure']
let role_attributes['none'] = role_attributes['presentation']
let role_attributes['row'] = role_attributes['group'] + ['aria-level', 'aria-selected'] let role_attributes['row'] = role_attributes['group'] + ['aria-level', 'aria-selected']
let role_attributes['rowheader'] = role_attributes['gridcell'] + abstract_role['sectionhead'] let role_attributes['rowheader'] = role_attributes['gridcell'] + abstract_role['sectionhead']
let role_attributes['separator'] = abstract_role['structure'] + ['aria-expanded'] let role_attributes['separator'] = abstract_role['structure'] + ['aria-expanded']
let role_attributes['table'] = abstract_role['section'] + ['aria-colcount', 'aria-rowcount']
let role_attributes['term'] = abstract_role['section']
" Landmark Roles " Landmark Roles
let role_attributes['application'] = abstract_role['landmark'] let role_attributes['application'] = abstract_role['landmark']
@@ -124,19 +321,30 @@ let role_attributes['search'] = abstract_role['landmark']
let aria_attributes_value = { let aria_attributes_value = {
\ 'aria-autocomplete': ['ID', ''], \ 'aria-autocomplete': ['ID', ''],
\ 'aria-checked': ['Token', ''], \ 'aria-checked': ['Token', ''],
\ 'aria-colcount': ['Number', ''],
\ 'aria-colindex': ['Number', ''],
\ 'aria-colspan': ['Number', ''],
\ 'aria-disabled': ['true/false', ''], \ 'aria-disabled': ['true/false', ''],
\ 'aria-errormessage': ['ID', ''],
\ 'aria-expanded': ['Token', ''], \ 'aria-expanded': ['Token', ''],
\ 'aria-haspopup': ['true/false', ''], \ 'aria-haspopup': ['Token', ''],
\ 'aria-hidden': ['true/false', ''], \ 'aria-hidden': ['true/false', ''],
\ 'aria-invalid': ['Token', ''], \ 'aria-invalid': ['Token', ''],
\ 'aria-keyshortcuts': ['String', ''],
\ 'aria-label': ['String', ''], \ 'aria-label': ['String', ''],
\ 'aria-level': ['Int', ''], \ 'aria-level': ['Int', ''],
\ 'aria-modal': ['true/false', ''],
\ 'aria-multiline': ['true/false', ''], \ 'aria-multiline': ['true/false', ''],
\ 'aria-multiselectable': ['true/false', ''], \ 'aria-multiselectable': ['true/false', ''],
\ 'aria-orientation': ['Token', ''], \ 'aria-orientation': ['Token', ''],
\ 'aria-placeholder': ['String', ''],
\ 'aria-pressed': ['Token', ''], \ 'aria-pressed': ['Token', ''],
\ 'aria-readonly': ['true/false', ''], \ 'aria-readonly': ['true/false', ''],
\ 'aria-required': ['true/false', ''], \ 'aria-required': ['true/false', ''],
\ 'aria-roledescription': ['String', ''],
\ 'aria-rowcount': ['Number', ''],
\ 'aria-rowindex': ['Number', ''],
\ 'aria-rowspan': ['Number', ''],
\ 'aria-selected': ['Token', ''], \ 'aria-selected': ['Token', ''],
\ 'aria-sort': ['Token', ''], \ 'aria-sort': ['Token', ''],
\ 'aria-valuemax': ['Number', ''], \ 'aria-valuemax': ['Number', ''],

View File

@@ -62,6 +62,8 @@ 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']
" 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': []}
let xml_attributes = {'xml:lang': lang_tag, 'xml:space': ['preserve'], 'xml:base': [], 'xmlns': ['http://www.w3.org/1999/xhtml', 'http://www.w3.org/1998/Math/MathML', 'http://www.w3.org/2000/svg', 'http://www.w3.org/1999/xlink']} let xml_attributes = {'xml:lang': lang_tag, 'xml:space': ['preserve'], 'xml:base': [], 'xmlns': ['http://www.w3.org/1999/xhtml', 'http://www.w3.org/1998/Math/MathML', 'http://www.w3.org/2000/svg', 'http://www.w3.org/1999/xlink']}
@@ -78,9 +80,12 @@ let attributes_value = {
\ 'accept-charset': ['Charset', ''], \ 'accept-charset': ['Charset', ''],
\ 'accesskey': ['Character', ''], \ 'accesskey': ['Character', ''],
\ 'action': ['URL', ''], \ 'action': ['URL', ''],
\ 'allowfullscreen': ['Bool', ''],
\ 'allowpaymentrequest': ['Bool', ''],
\ 'allowusermedia': ['Bool', ''],
\ 'alt': ['Text', ''], \ 'alt': ['Text', ''],
\ 'async': ['Bool', ''], \ 'async': ['Bool', ''],
\ 'autocomplete': ['on/off', ''], \ 'autocomplete': ['*Token', ''],
\ 'autofocus': ['Bool', ''], \ 'autofocus': ['Bool', ''],
\ 'autoplay': ['Bool', ''], \ 'autoplay': ['Bool', ''],
\ 'border': ['1', ''], \ 'border': ['1', ''],
@@ -140,6 +145,7 @@ let attributes_value = {
\ 'optimum': ['Number', ''], \ 'optimum': ['Number', ''],
\ 'pattern': ['Pattern', ''], \ 'pattern': ['Pattern', ''],
\ 'placeholder': ['Text', ''], \ 'placeholder': ['Text', ''],
\ 'playsinline': ['Bool', ''],
\ 'poster': ['URL', ''], \ 'poster': ['URL', ''],
\ 'preload': ['Token', ''], \ 'preload': ['Token', ''],
\ 'pubdate': ['Bool', ''], \ 'pubdate': ['Bool', ''],
@@ -313,13 +319,15 @@ if !exists('g:html5_aria_attributes_complete')
let g:html5_aria_attributes_complete = 1 let g:html5_aria_attributes_complete = 1
endif endif
if g:html5_aria_attributes_complete == 1 if g:html5_aria_attributes_complete == 1
" Ref: http://www.w3.org/TR/wai-aria/roles " Ref: https://www.w3.org/TR/wai-aria-1.1/#role_definitions
" Version: Draft 15 December 2009 " Version: W3C Candidate Recommendation 27 October 2016
let widget_role = ['alert', 'alertdialog', 'button', 'checkbox', 'combobox', 'dialog', 'gridcell', 'link', 'log', 'marquee', 'menuitem', 'menuitemcheckbox', 'menuitemradio', 'option', 'progressbar', 'radio', 'radiogroup', 'scrollbar', 'slider', 'spinbutton', 'status', 'tab', 'tabpanel', 'textbox', 'timer', 'tooltip', 'treeitem', 'combobox', 'grid', 'listbox', 'menu', 'menubar', 'radiogroup', 'tablist', 'tree', 'treegrid'] let widget_role = ['alert', 'alertdialog', 'button', 'checkbox', 'combobox', 'dialog', 'gridcell', 'link', 'log', 'marquee', 'menuitem', 'menuitemcheckbox', 'menuitemradio', 'option', 'progressbar', 'radio', 'radiogroup', 'scrollbar', 'searchbox', 'slider', 'spinbutton', 'status', 'switch', 'tab', 'tabpanel', 'textbox', 'timer', 'tooltip', 'treeitem', 'combobox', 'grid', 'listbox', 'menu', 'menubar', 'radiogroup', 'tablist', 'tree', 'treegrid']
let document_structure = ['article', 'columnheader', 'definition', 'directory', 'document', 'group', 'heading', 'img', 'list', 'listitem', 'math', 'note', 'presentation', 'region', 'row', 'rowheader', 'separator'] let document_structure = ['article', 'cell', 'columnheader', 'definition', 'directory', 'document', 'feed', 'figure', 'group', 'heading', 'img', 'list', 'listitem', 'math', 'none', 'note', 'presentation', 'region', 'row', 'rowheader', 'separator', 'table', 'term']
let landmark_role = ['application', 'banner', 'complementary', 'contentinfo', 'form', 'main', 'navigation', 'search'] let landmark_role = ['application', 'banner', 'complementary', 'contentinfo', 'form', 'main', 'navigation', 'search']
let dpub_role = ['dpub-abstract', 'dpub-afterword', 'dpub-appendix', 'dpub-biblioentry', 'dpub-bibliography', 'dpub-biblioref', 'dpub-chapter', 'dpub-cover', 'dpub-epilogue', 'dpub-footnote', 'dpub-footnotes', 'dpub-foreword', 'dpub-glossary', 'dpub-glossdef', 'dpub-glossref', 'dpub-glossterm', 'dpub-index', 'dpub-locator', 'dpub-noteref', 'dpub-notice', 'dpub-pagebreak', 'dpub-pagelist', 'dpub-part', 'dpub-preface', 'dpub-prologue', 'dpub-pullquote', 'dpub-qna', 'dpub-subtitle', 'dpub-tip', 'dpub-title', 'dpub-toc']
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 global_attributes = extend(global_attributes, {'role': role}) let global_attributes = extend(global_attributes, {'role': role})
endif endif
" }}} " }}}
@@ -332,10 +340,33 @@ let metadata_elements = ['link', 'style', 'meta', 'script', 'noscript', 'command
let flow_elements = phrasing_elements + ['p', 'hr', 'pre', 'ul', 'ol', 'dl', 'div', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'hgroup', 'address', 'blockquote', 'ins', 'del', 'element', 'object', 'main', 'map', 'noscript', 'section', 'nav', 'article', 'aside', 'header', 'footer', 'video', 'audio', 'figure', 'table', 'template', 'form', 'fieldset', 'menu', 'canvas', 'details'] let flow_elements = phrasing_elements + ['p', 'hr', 'pre', 'ul', 'ol', 'dl', 'div', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'hgroup', 'address', 'blockquote', 'ins', 'del', 'element', 'object', 'main', 'map', 'noscript', 'section', 'nav', 'article', 'aside', 'header', 'footer', 'video', 'audio', 'figure', 'table', 'template', 'form', 'fieldset', 'menu', 'canvas', 'details']
" http://dev.w3.org/html5/spec/Overview.html#linkTypes " https://html.spec.whatwg.org/#linkTypes
let linktypes = ['alternate', 'author', 'bookmark', 'external', 'help', 'icon', 'license', 'next', 'nofollow', 'noreferrer', 'pingback', 'prefetch', 'prev', 'search', 'stylesheet', 'sidebar', 'tag'] let linktypes = ['alternate', 'author', 'bookmark', 'dns-prefetch', 'external', 'help', 'icon', 'license', 'next', 'nofollow', 'noreferrer', 'noopener', 'pingback', 'preconnect', 'prefetch', 'preload', 'prerender', 'prev', 'search', 'stylesheet', 'tag']
" https://w3c.github.io/manifest/
let linkreltypes = linktypes
let linkreltypes = linkreltypes + ['manifest']
" http://googlewebmastercentral.blogspot.com/2009/02/specify-your-canonical.html " http://googlewebmastercentral.blogspot.com/2009/02/specify-your-canonical.html
let linkreltypes = linktypes + ['canonical', 'import'] " http://www.ysearchblog.com/2009/02/12/fighting-duplication-adding-more-arrows-to-your-quiver/
" http://blogs.bing.com/webmaster/2009/02/12/partnering-to-help-solve-duplicate-content-issues
let linkreltypes = linkreltypes + ['canonical']
" http://w3c.github.io/webcomponents/spec/imports/
let linkreltypes = linkreltypes + ['import']
" https://www.w3.org/TR/webmention/#sender-discovers-receiver-webmention-endpoint
let linkreltypes = linkreltypes + ['webmention']
" http://www.opensearch.org/Specifications/OpenSearch/1.1#Autodiscovery_in_HTML.2FXHTML
let linkreltypes = linkreltypes + ['search']
" http://microformats.org/wiki/rel-sitemap
let linkreltypes = linkreltypes + ['sitemap']
" https://www.ampproject.org/docs/get_started/create/prepare_for_discovery
let linkreltypes = linkreltypes + ['amphtml']
" https://developer.apple.com/library/content/documentation/AppleApplications/Reference/SafariWebContent/ConfiguringWebApplications/ConfiguringWebApplications.html
let linkreltypes = linkreltypes + ['apple-touch-icon', 'apple-touch-icon-precomposed', 'apple-touch-startup-image']
" https://developer.chrome.com/webstore/inline_installation
let linkreltypes = linkreltypes + ['chrome-webstore-item']
" http://pubsubhubbub.github.io/PubSubHubbub/pubsubhubbub-core-0.4.html#rfc.section.4
let linkreltypes = linkreltypes + ['hub']
" https://golem.ph.utexas.edu/~distler/blog/archives/000320.html
let linkreltypes = linkreltypes + ['pgpkey']
" a and button are special elements for interactive, some element can't be its descendent " a and button are special elements for interactive, some element can't be its descendent
let abutton_dec = 'details\\|embed\\|iframe\\|keygen\\|label\\|menu\\|select\\|textarea' let abutton_dec = 'details\\|embed\\|iframe\\|keygen\\|label\\|menu\\|select\\|textarea'
@@ -347,7 +378,7 @@ let g:xmldata_html5 = {
\ 'vimxmlroot': ['html', 'head', 'body'] + flow_elements, \ 'vimxmlroot': ['html', 'head', 'body'] + flow_elements,
\ 'a': [ \ 'a': [
\ filter(copy(flow_elements), "!(v:val =~ '". abutton_dec ."')"), \ filter(copy(flow_elements), "!(v:val =~ '". abutton_dec ."')"),
\ extend(copy(global_attributes), {'name': [], 'href': [], 'target': [], 'rel': linktypes, 'hreflang': lang_tag, 'media': [], 'type': []}) \ extend(copy(global_attributes), {'name': [], 'href': [], 'target': [], 'rel': linktypes, 'hreflang': lang_tag, 'media': [], 'type': [], 'referrerpolicy': ['no-referrer', 'no-referrer-when-downgrade', 'origin', 'origin-when-cross-origin', 'unsafe-url']})
\ ], \ ],
\ 'abbr': [ \ 'abbr': [
\ phrasing_elements, \ phrasing_elements,
@@ -359,7 +390,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': []}) \ 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']})
\ ], \ ],
\ 'article': [ \ 'article': [
\ flow_elements + ['style'], \ flow_elements + ['style'],
@@ -495,7 +526,7 @@ let g:xmldata_html5 = {
\ ], \ ],
\ 'form': [ \ 'form': [
\ flow_elements, \ flow_elements,
\ extend(copy(global_attributes), {'name': [], 'action': [], 'enctype': ['application/x-www-form-urlencoded', 'multipart/form-data', 'text/plain'], 'method': ['get', 'post', 'put', 'delete'], 'target': [], 'novalidate': ['novalidate', ''], 'accept-charset': charset, 'autocomplete': ['on', 'off']}) \ extend(copy(global_attributes), {'name': [], 'action': [], 'enctype': ['application/x-www-form-urlencoded', 'multipart/form-data', 'text/plain'], 'method': ['get', 'post', 'put', 'delete'], 'target': [], 'novalidate': ['novalidate', ''], 'accept-charset': charset, 'autocomplete': autofill_tokens})
\ ], \ ],
\ 'h1': [ \ 'h1': [
\ phrasing_elements, \ phrasing_elements,
@@ -547,15 +578,15 @@ 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', '']}) \ 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': []})
\ ], \ ],
\ 'img': [ \ 'img': [
\ [], \ [],
\ extend(copy(global_attributes), {'src': [], 'alt': [], 'height': [], 'width': [], 'usemap': [], 'ismap': ['ismap', '']}) \ 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']})
\ ], \ ],
\ 'input': [ \ 'input': [
\ [], \ [],
\ extend(copy(global_attributes), {'type': ['text', 'password', 'checkbox', 'radio', 'button', 'submit', 'reset', 'file', 'hidden', 'image', 'datetime', 'datetime-local', 'date', 'month', 'time', 'week', 'number', 'range', 'email', 'url', 'search', 'tel', 'color'], 'name': [], 'disabled': ['disabled', ''], 'form': [], 'maxlength': [], 'readonly': ['readonly', ''], 'size': [], 'value': [], 'autocomplete': ['on', 'off'], 'autofocus': ['autofocus', ''], 'list': [], 'pattern': [], 'required': ['required', ''], 'placeholder': [], 'checked': ['checked'], 'accept': [], 'multiple': ['multiple', ''], 'alt': [], 'src': [], 'height': [], 'width': [], 'min': [], 'max': [], 'step': [], 'formenctype': ['application/x-www-form-urlencoded', 'multipart/form-data', 'text/plain'], 'formmethod': ['get', 'post', 'put', 'delete'], 'formtarget': [], 'formnovalidate': ['formnovalidate', '']}) \ extend(copy(global_attributes), {'type': ['text', 'password', 'checkbox', 'radio', 'button', 'submit', 'reset', 'file', 'hidden', 'image', 'datetime', 'datetime-local', 'date', 'month', 'time', 'week', 'number', 'range', 'email', 'url', 'search', 'tel', 'color'], 'name': [], 'disabled': ['disabled', ''], 'form': [], 'maxlength': [], 'readonly': ['readonly', ''], 'size': [], 'value': [], 'autocomplete': autofill_tokens, 'autofocus': ['autofocus', ''], 'list': [], 'pattern': [], 'required': ['required', ''], 'placeholder': [], 'checked': ['checked'], 'accept': [], 'multiple': ['multiple', ''], 'alt': [], 'src': [], 'height': [], 'width': [], 'min': [], 'max': [], 'step': [], 'formenctype': ['application/x-www-form-urlencoded', 'multipart/form-data', 'text/plain'], 'formmethod': ['get', 'post', 'put', 'delete'], 'formtarget': [], 'formnovalidate': ['formnovalidate', '']})
\ ], \ ],
\ 'ins': [ \ 'ins': [
\ flow_elements, \ flow_elements,
@@ -583,7 +614,7 @@ let g:xmldata_html5 = {
\ ], \ ],
\ 'link': [ \ 'link': [
\ [], \ [],
\ extend(copy(global_attributes), {'href': [], 'rel': linkreltypes, 'hreflang': lang_tag, 'media': [], 'type': [], 'sizes': ['any']}) \ 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']})
\ ], \ ],
\ 'main': [ \ 'main': [
\ flow_elements + ['style'], \ flow_elements + ['style'],
@@ -691,7 +722,7 @@ let g:xmldata_html5 = {
\ ], \ ],
\ 'script': [ \ 'script': [
\ [], \ [],
\ extend(copy(global_attributes), {'src': [], 'defer': ['defer', ''], 'async': ['async', ''], 'type': [], 'charset': charset}) \ extend(copy(global_attributes), {'src': [], 'defer': ['defer', ''], 'async': ['async', ''], 'type': [], 'charset': charset, 'nonce': []})
\ ], \ ],
\ 'section': [ \ 'section': [
\ flow_elements + ['style'], \ flow_elements + ['style'],
@@ -723,7 +754,7 @@ let g:xmldata_html5 = {
\ ], \ ],
\ 'style': [ \ 'style': [
\ [], \ [],
\ extend(copy(global_attributes), {'type': [], 'media': [], 'scoped': ['scoped', '']}) \ extend(copy(global_attributes), {'type': [], 'media': [], 'scoped': ['scoped', ''], 'nonce': []})
\ ], \ ],
\ 'sub': [ \ 'sub': [
\ phrasing_elements, \ phrasing_elements,
@@ -803,7 +834,7 @@ let g:xmldata_html5 = {
\ ], \ ],
\ 'video': [ \ 'video': [
\ flow_elements + ['source', 'track'], \ flow_elements + ['source', 'track'],
\ extend(copy(global_attributes), {'autoplay': ['autoplay', ''], 'preload': ['none', 'metadata', 'auto', ''], 'controls': ['controls', ''], 'loop': ['loop', ''], 'poster': [], 'height': [], 'width': [], 'src': []}) \ extend(copy(global_attributes), {'autoplay': ['autoplay', ''], 'preload': ['none', 'metadata', 'auto', ''], 'controls': ['controls', ''], 'loop': ['loop', ''], 'playsinline': ['playsinline', ''], 'poster': [], 'height': [], 'width': [], 'src': []})
\ ], \ ],
\ 'wbr': [ \ 'wbr': [
\ [], \ [],

67
build
View File

@@ -2,10 +2,12 @@
set -E set -E
DIRS="syntax indent compiler autoload ftplugin ftdetect after/syntax after/indent after/ftplugin after/ftdetect" DIRS="syntax indent compiler autoload ftplugin after/syntax after/indent after/ftplugin"
DIRS_BASIC="syntax compiler indent ftdetect after/syntax after/indent after/ftdetect" DIRS_BASIC="syntax compiler indent after/syntax after/indent"
DIRS_ALL="syntax indent compiler autoload ftplugin ftdetect after" DIRS_ALL="syntax indent compiler autoload ftplugin after"
DIRS_SYNTAX="syntax ftdetect after/syntax after/ftdetect" DIRS_SYNTAX="syntax after/syntax"
DIRS_JAVASCRIPT="${DIRS} extras"
DIRS_RM="$DIRS_JAVASCRIPT"
OUTPUT="" OUTPUT=""
@@ -27,6 +29,9 @@ download() {
extract() { extract() {
printf "\n" printf "\n"
cat config.vim >> tmp/polyglot.vim
for pack in $1; do for pack in $1; do
name="$(printf "$pack" | cut -d ':' -f 1)" name="$(printf "$pack" | cut -d ':' -f 1)"
path="$(printf "$pack" | cut -d ':' -f 2)" path="$(printf "$pack" | cut -d ':' -f 2)"
@@ -47,10 +52,21 @@ extract() {
fi fi
done done
for f in ${dir}/ftdetect/*; do
(
echo "augroup filetypedetect";
echo '" '"$pack";
cat "${f}";
echo "augroup END";
echo
) >> tmp/polyglot.vim;
done
output "${subdirs##, })\n" output "${subdirs##, })\n"
done done
mv tmp/polyglot.vim ftdetect/
for pack in $1; do for pack in $1; do
name="$(printf "$pack" | cut -d ':' -f 1)" name="$(printf "$pack" | cut -d ':' -f 1)"
path="$(printf "$pack" | cut -d ':' -f 2)" path="$(printf "$pack" | cut -d ':' -f 2)"
@@ -74,12 +90,6 @@ copy_dir() {
done done
} }
concat_ftdetect() {
for f in ftdetect/*; do (echo '" '"$f"; cat "${f}"; echo) >> tmp/polyglot.vim; done
rm -f ftdetect/*
mv tmp/polyglot.vim ftdetect/
}
update_readme() { update_readme() {
OLD_README="$(cat README.md)" OLD_README="$(cat README.md)"
@@ -88,7 +98,7 @@ update_readme() {
+2kb +2kb
/## /##
'b,-2c 'b,-2c
$(printf -- "$OUTPUT") $(printf -- "$OUTPUT" | sort)
. .
w w
q q
@@ -97,11 +107,15 @@ EOF
} }
PACKS=" PACKS="
apiblueprint:sheerun/apiblueprint.vim
applescript:vim-scripts/applescript.vim
yaml:stephpy/vim-yaml
ansible:pearofducks/ansible-vim ansible:pearofducks/ansible-vim
arduino:sudar/vim-arduino-syntax arduino:sudar/vim-arduino-syntax
blade:jwalton512/vim-blade blade:jwalton512/vim-blade
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:joshglendenning/vim-caddyfile
cjsx:mtscout6/vim-cjsx cjsx:mtscout6/vim-cjsx
clojure:guns/vim-clojure-static clojure:guns/vim-clojure-static
coffee-script:kchmck/vim-coffee-script coffee-script:kchmck/vim-coffee-script
@@ -111,25 +125,27 @@ PACKS="
css:JulesWang/css.vim css:JulesWang/css.vim
cucumber:tpope/vim-cucumber cucumber:tpope/vim-cucumber
dart:dart-lang/dart-vim-plugin dart:dart-lang/dart-vim-plugin
dockerfile:honza/dockerfile.vim dockerfile:docker/docker::/contrib/syntax/vim/
elixir:elixir-lang/vim-elixir elixir:elixir-lang/vim-elixir
elm:lambdatoast/elm.vim elm:lambdatoast/elm.vim
emberscript:heartsentwined/vim-ember-script emberscript:yalesov/vim-ember-script
emblem:yalesov/vim-emblem emblem:yalesov/vim-emblem
erlang:vim-erlang/vim-erlang-runtime erlang:vim-erlang/vim-erlang-runtime
fish:dag/vim-fish fish:dag/vim-fish
git:tpope/vim-git git:tpope/vim-git
glsl:tikhomirov/vim-glsl glsl:tikhomirov/vim-glsl
gnuplot:vim-scripts/gnuplot-syntax-highlighting
go:fatih/vim-go:_BASIC go:fatih/vim-go:_BASIC
groovy:vim-scripts/groovy.vim groovy:vim-scripts/groovy.vim
haml:tpope/vim-haml haml:sheerun/vim-haml
handlebars:mustache/vim-mustache-handlebars handlebars:mustache/vim-mustache-handlebars
haskell:neovimhaskell/haskell-vim haskell:neovimhaskell/haskell-vim
haxe:yaymukund/vim-haxe haxe:yaymukund/vim-haxe
html5:othree/html5.vim html5:othree/html5.vim
i3:PotatoesMaster/i3-vim-syntax
jasmine:glanotte/vim-jasmine jasmine:glanotte/vim-jasmine
javascript:pangloss/vim-javascript javascript:pangloss/vim-javascript:_JAVASCRIPT
json:sheerun/vim-json json:elzr/vim-json
jst:briancollins/vim-jst jst:briancollins/vim-jst
jsx:mxw/vim-jsx:_ALL jsx:mxw/vim-jsx:_ALL
julia:dcjones/julia-minimalist-vim julia:dcjones/julia-minimalist-vim
@@ -137,8 +153,11 @@ PACKS="
latex:LaTeX-Box-Team/LaTeX-Box latex:LaTeX-Box-Team/LaTeX-Box
less:groenewege/vim-less less:groenewege/vim-less
liquid:tpope/vim-liquid liquid:tpope/vim-liquid
livescript:gkz/vim-ls
lua:tbastos/vim-lua
mako:sophacles/vim-bundle-mako mako:sophacles/vim-bundle-mako
markdown:plasticboy/vim-markdown:_SYNTAX markdown:plasticboy/vim-markdown:_SYNTAX
mathematica:rsmenon/vim-mathematica
nginx:othree/nginx-contrib-vim nginx:othree/nginx-contrib-vim
nim:zah/nim.vim:_BASIC nim:zah/nim.vim:_BASIC
nix:spwhitt/vim-nix nix:spwhitt/vim-nix
@@ -150,49 +169,53 @@ PACKS="
pgsql:exu/pgsql.vim pgsql:exu/pgsql.vim
php:StanAngeloff/php.vim php:StanAngeloff/php.vim
plantuml:aklt/plantuml-syntax plantuml:aklt/plantuml-syntax
powershell:Persistent13/vim-ps1 powershell:PProvost/vim-ps1
protobuf:uarun/vim-protobuf protobuf:uarun/vim-protobuf
pug:digitaltoad/vim-pug pug:digitaltoad/vim-pug
puppet:voxpupuli/vim-puppet puppet:voxpupuli/vim-puppet
purescript:raichoo/purescript-vim purescript:raichoo/purescript-vim
python:mitsuhiko/vim-python-combined python:mitsuhiko/vim-python-combined
python-compiler:aliev/vim-compiler-python
qml:peterhoeg/vim-qml qml:peterhoeg/vim-qml
r-lang:vim-scripts/R.vim r-lang:vim-scripts/R.vim
raml:IN3D/vim-raml
ragel:jneen/ragel.vim ragel:jneen/ragel.vim
rspec:sheerun/rspec.vim rspec:sheerun/rspec.vim
ruby:vim-ruby/vim-ruby ruby:vim-ruby/vim-ruby
rust:rust-lang/rust.vim rust:rust-lang/rust.vim
sbt:derekwyatt/vim-sbt sbt:derekwyatt/vim-sbt
scala:derekwyatt/vim-scala scala:derekwyatt/vim-scala
scss:cakebaker/scss-syntax.vim
slim:slim-template/vim-slim slim:slim-template/vim-slim
solidity:ethereum/vim-solidity solidity:ethereum/vim-solidity
stylus:wavded/vim-stylus stylus:wavded/vim-stylus
swift:keith/swift.vim swift:keith/swift.vim
sxhkd:baskerville/vim-sxhkdrc
systemd:kurayama/systemd-vim-syntax systemd:kurayama/systemd-vim-syntax
terraform:hashivim/vim-terraform
textile:timcharper/textile.vim textile:timcharper/textile.vim
thrift:solarnz/thrift.vim thrift:solarnz/thrift.vim
tmux:keith/tmux.vim tmux:keith/tmux.vim
tomdoc:wellbredgrapefruit/tomdoc.vim tomdoc:wellbredgrapefruit/tomdoc.vim
toml:cespare/vim-toml toml:cespare/vim-toml
twig:evidens/vim-twig twig:lumiliet/vim-twig
typescript:leafgarland/typescript-vim typescript:leafgarland/typescript-vim
vala:tkztmk/vim-vala vala:arrufat/vala.vim
vbnet:vim-scripts/vbnet.vim vbnet:vim-scripts/vbnet.vim
vcl:smerrill/vcl-vim-plugin vcl:smerrill/vcl-vim-plugin
vue:posva/vim-vue
vm:lepture/vim-velocity vm:lepture/vim-velocity
xls:vim-scripts/XSLT-syntax xls:vim-scripts/XSLT-syntax
yaml:stephpy/vim-yaml
yard:sheerun/vim-yardoc yard:sheerun/vim-yardoc
" "
rm -rf tmp rm -rf tmp
rm -rf $DIRS_ALL rm -rf $DIRS_RM
mkdir tmp mkdir tmp
printf "Downloading packs..." printf "Downloading packs..."
download "$PACKS" download "$PACKS"
extract "$PACKS" extract "$PACKS"
concat_ftdetect
update_readme update_readme
rm -rf tmp rm -rf tmp

View File

@@ -21,49 +21,12 @@ else
CompilerSet makeprg=cargo\ $* CompilerSet makeprg=cargo\ $*
endif endif
" Allow a configurable global Cargo.toml name. This makes it easy to " Ignore general cargo progress messages
" support variations like 'cargo.toml'. CompilerSet errorformat+=
let s:cargo_manifest_name = get(g:, 'cargo_manifest_name', 'Cargo.toml') \%-G%\\s%#Downloading%.%#,
\%-G%\\s%#Compiling%.%#,
function! s:is_absolute(path) \%-G%\\s%#Finished%.%#,
return a:path[0] == '/' || a:path =~ '[A-Z]\+:' \%-G%\\s%#error:\ Could\ not\ compile\ %.%#,
endfunction \%-G%\\s%#To\ learn\ more\\,%.%#
let s:local_manifest = findfile(s:cargo_manifest_name, '.;')
if s:local_manifest != ''
let s:local_manifest = fnamemodify(s:local_manifest, ':p:h').'/'
augroup cargo
au!
au QuickfixCmdPost make call s:FixPaths()
augroup END
" FixPaths() is run after Cargo, and is used to change the file paths
" to be relative to the current directory instead of Cargo.toml.
function! s:FixPaths()
let qflist = getqflist()
let manifest = s:local_manifest
for qf in qflist
if !qf.valid
let m = matchlist(qf.text, '(file://\(.*\))$')
if !empty(m)
let manifest = m[1].'/'
" Manually strip another slash if needed; usually just an
" issue on Windows.
if manifest =~ '^/[A-Z]\+:/'
let manifest = manifest[1:]
endif
endif
continue
endif
let filename = bufname(qf.bufnr)
if s:is_absolute(filename)
continue
endif
let qf.filename = simplify(manifest.filename)
call remove(qf, 'bufnr')
endfor
call setqflist(qflist, 'r')
endfunction
endif
endif endif

15
compiler/eslint.vim Normal file
View File

@@ -0,0 +1,15 @@
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'javascript') == -1
if exists("current_compiler")
finish
endif
let current_compiler = "eslint"
if exists(":CompilerSet") != 2
command! -nargs=* CompilerSet setlocal <args>
endif
CompilerSet makeprg=eslint\ -f\ compact\ %
CompilerSet errorformat=%f:\ line\ %l\\,\ col\ %c\\,\ %m
endif

78
compiler/ls.vim Normal file
View File

@@ -0,0 +1,78 @@
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'livescript') == -1
" Language: LiveScript
" Maintainer: George Zahariev
" URL: http://github.com/gkz/vim-ls
" License: WTFPL
if exists('current_compiler')
finish
endif
let current_compiler = 'ls'
" Pattern to check if livescript is the compiler
let s:pat = '^' . current_compiler
" Path to LiveScript compiler
if !exists('livescript_compiler')
let livescript_compiler = 'lsc'
endif
if !exists('livescript_make_options')
let livescript_make_options = ''
endif
" Get a `makeprg` for the current filename. This is needed to support filenames
" with spaces and quotes, but also not break generic `make`.
function! s:GetMakePrg()
return g:livescript_compiler . ' -c ' . g:livescript_make_options . ' $* '
\ . fnameescape(expand('%'))
endfunction
" Set `makeprg` and return 1 if coffee is still the compiler, else return 0.
function! s:SetMakePrg()
if &l:makeprg =~ s:pat
let &l:makeprg = s:GetMakePrg()
elseif &g:makeprg =~ s:pat
let &g:makeprg = s:GetMakePrg()
else
return 0
endif
return 1
endfunction
" Set a dummy compiler so we can check whether to set locally or globally.
CompilerSet makeprg=ls
call s:SetMakePrg()
CompilerSet errorformat=%EFailed\ at:\ %f,
\%ECan't\ find:\ %f,
\%CSyntaxError:\ %m\ on\ line\ %l,
\%CError:\ Parse\ error\ on\ line\ %l:\ %m,
\%C,%C\ %.%#
" Compile the current file.
command! -bang -bar -nargs=* LiveScriptMake make<bang> <args>
" Set `makeprg` on rename since we embed the filename in the setting.
augroup LiveScriptUpdateMakePrg
autocmd!
" Update `makeprg` if livescript is still the compiler, else stop running this
" function.
function! s:UpdateMakePrg()
if !s:SetMakePrg()
autocmd! LiveScriptUpdateMakePrg
endif
endfunction
" Set autocmd locally if compiler was set locally.
if &l:makeprg =~ s:pat
autocmd BufFilePost,BufWritePost <buffer> call s:UpdateMakePrg()
else
autocmd BufFilePost,BufWritePost call s:UpdateMakePrg()
endif
augroup END
endif

71
compiler/python.vim Normal file
View File

@@ -0,0 +1,71 @@
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'python-compiler') == -1
" Vim compiler file
" Compiler: Unit testing tool for Python
" Maintainer: Ali Aliev <ali@aliev.me>
" Last Change: 2015 Nov 2
if exists("current_compiler")
finish
endif
let current_compiler = "python"
if exists(":CompilerSet") != 2 " older Vim always used :setlocal
command -nargs=* CompilerSet setlocal <args>
endif
" Disable Python warnings
if !exists('$PYTHONWARNINGS')
let $PYTHONWARNINGS="ignore"
endif
" For Flake8 first
CompilerSet efm =%E%f:%l:\ could\ not\ compile,
CompilerSet efm +=%-Z%p^,
CompilerSet efm +=%A%f:%l:%c:\ %t%n\ %m,
CompilerSet efm +=%A%f:%l:\ %t%n\ %m,
" Python errors are multi-lined. They often start with 'Traceback', so
" we want to capture that (with +G) and show it in the quickfix window
" because it explains the order of error messages.
CompilerSet efm +=%+GTraceback%.%#,
" The error message itself starts with a line with 'File' in it. There
" are a couple of variations, and we need to process a line beginning
" with whitespace followed by File, the filename in "", a line number,
" and optional further text. %E here indicates the start of a multi-line
" error message. The %\C at the end means that a case-sensitive search is
" required.
CompilerSet efm +=%E\ \ File\ \"%f\"\\,\ line\ %l\\,%m%\\C,
CompilerSet efm +=%E\ \ File\ \"%f\"\\,\ line\ %l%\\C,
" The possible continutation lines are idenitifed to Vim by %C. We deal
" with these in order of most to least specific to ensure a proper
" match. A pointer (^) identifies the column in which the error occurs
" (but will not be entirely accurate due to indention of Python code).
CompilerSet efm +=%C%p^,
" Any text, indented by more than two spaces contain useful information.
" We want this to appear in the quickfix window, hence %+.
CompilerSet efm +=%+C\ \ \ \ %.%#,
CompilerSet efm +=%+C\ \ %.%#,
" The last line (%Z) does not begin with any whitespace. We use a zero
" width lookahead (\&) to check this. The line contains the error
" message itself (%m)
CompilerSet efm +=%Z%\\S%\\&%m,
" We can ignore any other lines (%-G)
CompilerSet efm +=%-G%.%#
if filereadable("Makefile")
CompilerSet makeprg=make
else
CompilerSet makeprg=python
endif
" vim:foldmethod=marker:foldlevel=0
endif

View File

@@ -23,6 +23,7 @@ else
CompilerSet makeprg=rustc\ \% CompilerSet makeprg=rustc\ \%
endif endif
" Old errorformat (before nightly 2016/08/10)
CompilerSet errorformat= CompilerSet errorformat=
\%f:%l:%c:\ %t%*[^:]:\ %m, \%f:%l:%c:\ %t%*[^:]:\ %m,
\%f:%l:%c:\ %*\\d:%*\\d\ %t%*[^:]:\ %m, \%f:%l:%c:\ %*\\d:%*\\d\ %t%*[^:]:\ %m,
@@ -31,6 +32,17 @@ CompilerSet errorformat=
\%-G%*[\ ]^%*[~], \%-G%*[\ ]^%*[~],
\%-G%*[\ ]... \%-G%*[\ ]...
" New errorformat (after nightly 2016/08/10)
CompilerSet errorformat+=
\%-G,
\%-Gerror:\ aborting\ %.%#,
\%-Gerror:\ Could\ not\ compile\ %.%#,
\%Eerror:\ %m,
\%Eerror[E%n]:\ %m,
\%Wwarning:\ %m,
\%Inote:\ %m,
\%C\ %#-->\ %f:%l:%c
let &cpo = s:cpo_save let &cpo = s:cpo_save
unlet s:cpo_save unlet s:cpo_save

View File

@@ -1,34 +0,0 @@
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'haml') == -1
" Vim compiler file
" Compiler: Sass
" Maintainer: Tim Pope <vimNOSPAM@tpope.org>
" Last Change: 2013 May 30
if exists("current_compiler")
finish
endif
let current_compiler = "sass"
if exists(":CompilerSet") != 2 " older Vim always used :setlocal
command -nargs=* CompilerSet setlocal <args>
endif
let s:cpo_save = &cpo
set cpo-=C
CompilerSet makeprg=sass
CompilerSet errorformat=
\%f:%l:%m\ (Sass::Syntax%trror),
\%ESyntax\ %trror:%m,
\%C%\\s%\\+on\ line\ %l\ of\ %f,
\%Z%.%#,
\%-G%.%#
let &cpo = s:cpo_save
unlet s:cpo_save
" vim:set sw=2 sts=2:
endif

View File

@@ -13,6 +13,10 @@ if !exists("g:typescript_compiler_options")
let g:typescript_compiler_options = "" let g:typescript_compiler_options = ""
endif endif
if exists(":CompilerSet") != 2
command! -nargs=* CompilerSet setlocal <args>
endif
let &l:makeprg = g:typescript_compiler_binary . ' ' . g:typescript_compiler_options . ' $* %' let &l:makeprg = g:typescript_compiler_binary . ' ' . g:typescript_compiler_options . ' $* %'
CompilerSet errorformat=%+A\ %#%f\ %#(%l\\\,%c):\ %m,%C%m CompilerSet errorformat=%+A\ %#%f\ %#(%l\\\,%c):\ %m,%C%m

11
config.vim Normal file
View File

@@ -0,0 +1,11 @@
" Enable jsx syntax by default
if !exists('g:jsx_ext_required')
let g:jsx_ext_required = 0
endif
" Disable json concealing by default
if !exists('g:vim_json_syntax_conceal')
let g:vim_json_syntax_conceal = 0
endif
let g:filetype_euphoria = 'elixir'

96
extras/flow.vim Normal file
View File

@@ -0,0 +1,96 @@
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'javascript') == -1
syntax region jsFlowDefinition contained start=/:/ end=/\%(\s*[,=;)\n]\)\@=/ contains=@jsFlowCluster containedin=jsParen
syntax region jsFlowArgumentDef contained start=/:/ end=/\%(\s*[,)]\|=>\@!\)\@=/ contains=@jsFlowCluster
syntax region jsFlowArray contained matchgroup=jsFlowNoise start=/\[/ end=/\]/ contains=@jsFlowCluster
syntax region jsFlowObject contained matchgroup=jsFlowNoise start=/{/ end=/}/ contains=@jsFlowCluster
syntax region jsFlowParens contained matchgroup=jsFlowNoise start=/(/ end=/)/ contains=@jsFlowCluster
syntax match jsFlowNoise contained /[:;,<>]/
syntax keyword jsFlowType contained boolean number string null void any mixed JSON array Function object array bool class
syntax keyword jsFlowTypeof contained typeof skipempty skipempty nextgroup=jsFlowTypeCustom,jsFlowType
syntax match jsFlowTypeCustom contained /[0-9a-zA-Z_.]*/ skipwhite skipempty nextgroup=jsFlowGroup
syntax region jsFlowGroup contained matchgroup=jsFlowNoise start=/</ end=/>/ contains=@jsFlowCluster
syntax region jsFlowArrowArguments contained matchgroup=jsFlowNoise start=/(/ end=/)\%(\s*=>\)\@=/ oneline skipwhite skipempty nextgroup=jsFlowArrow contains=@jsFlowCluster
syntax match jsFlowArrow contained /=>/ skipwhite skipempty nextgroup=jsFlowType,jsFlowTypeCustom,jsFlowParens
syntax match jsFlowMaybe contained /?/ skipwhite skipempty nextgroup=jsFlowType,jsFlowTypeCustom,jsFlowParens,jsFlowArrowArguments,jsFlowObject,jsFlowReturnObject
syntax match jsFlowObjectKey contained /[0-9a-zA-Z_$?]*\(\s*:\)\@=/ contains=jsFunctionKey,jsFlowMaybe skipwhite skipempty nextgroup=jsObjectValue containedin=jsObject
syntax match jsFlowOrOperator contained /|/ skipwhite skipempty nextgroup=@jsFlowCluster
syntax keyword jsFlowImportType contained type skipwhite skipempty nextgroup=jsModuleAsterisk,jsModuleKeyword,jsModuleGroup
syntax match jsFlowWildcard contained /*/
syntax match jsFlowReturn contained /:\s*/ contains=jsFlowNoise skipwhite skipempty nextgroup=@jsFlowReturnCluster
syntax region jsFlowReturnObject contained matchgroup=jsFlowNoise start=/{/ end=/}/ contains=@jsFlowCluster skipwhite skipempty nextgroup=jsFuncBlock,jsFlowReturnOrOp
syntax region jsFlowReturnArray contained matchgroup=jsFlowNoise start=/\[/ end=/\]/ contains=@jsFlowCluster skipwhite skipempty nextgroup=jsFuncBlock,jsFlowReturnOrOp
syntax region jsFlowReturnParens contained matchgroup=jsFlowNoise start=/(/ end=/)/ contains=@jsFlowCluster skipwhite skipempty nextgroup=jsFuncBlock,jsFlowReturnOrOp
syntax match jsFlowReturnKeyword contained /\k\+/ contains=jsFlowType,jsFlowTypeCustom skipwhite skipempty nextgroup=jsFlowReturnGroup,jsFuncBlock,jsFlowReturnOrOp
syntax match jsFlowReturnMaybe contained /?/ skipwhite skipempty nextgroup=jsFlowReturnKeyword
syntax region jsFlowReturnGroup contained matchgroup=jsFlowNoise start=/</ end=/>/ contains=@jsFlowCluster skipwhite skipempty nextgroup=jsFuncBlock,jsFlowReturnOrOp
syntax match jsFlowReturnOrOp contained /\s*|\s*/ skipwhite skipempty nextgroup=@jsFlowReturnCluster
syntax match jsFlowWildcardReturn contained /*/ skipwhite skipempty nextgroup=jsFuncBlock
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 jsFlowTypeStatement start=/type\%(\s\+\k\)\@=/ end=/=\@=/ contains=jsFlowTypeOperator oneline skipwhite skipempty nextgroup=jsFlowTypeValue keepend
syntax region jsFlowTypeValue contained start=/=/ end=/[;\n]/ contains=@jsExpression,jsFlowGroup,jsFlowMaybe
syntax match jsFlowTypeOperator contained /=/
syntax keyword jsFlowTypeKeyword contained type
syntax keyword jsFlowDeclare declare skipwhite skipempty nextgroup=jsFlowTypeStatement,jsClassDefinition,jsStorageClass,jsFlowModule,jsFlowInterface
syntax match jsFlowClassProperty contained /\<[0-9a-zA-Z_$]*\>:\@=/ skipwhite skipempty nextgroup=jsFlowClassDef containedin=jsClassBlock
syntax region jsFlowClassDef contained start=/:/ end=/\%(\s*[,=;)\n]\)\@=/ contains=@jsFlowCluster skipwhite skipempty nextgroup=jsClassValue
syntax region jsFlowModule contained start=/module/ end=/{\@=/ skipempty skipempty nextgroup=jsFlowDeclareBlock contains=jsString
syntax region jsFlowInterface contained start=/interface/ end=/{\@=/ skipempty skipempty nextgroup=jsFlowInterfaceBlock contains=@jsFlowCluster
syntax region jsFlowDeclareBlock contained matchgroup=jsFlowNoise start=/{/ end=/}/ contains=jsFlowDeclare,jsFlowNoise
syntax region jsFlowInterfaceBlock contained matchgroup=jsFlowNoise start=/{/ end=/}/ contains=jsObjectKey,jsObjectKeyString,jsObjectKeyComputed,jsObjectSeparator,jsObjectFuncName,jsObjectMethodType,jsGenerator,jsComment,jsObjectStringKey,jsSpreadExpression,jsFlowNoise keepend
syntax cluster jsFlowReturnCluster contains=jsFlowNoise,jsFlowReturnObject,jsFlowReturnArray,jsFlowReturnKeyword,jsFlowReturnGroup,jsFlowReturnMaybe,jsFlowReturnOrOp,jsFlowWildcardReturn
syntax cluster jsFlowCluster contains=jsFlowArray,jsFlowObject,jsFlowNoise,jsFlowTypeof,jsFlowType,jsFlowGroup,jsFlowArrowArguments,jsFlowMaybe,jsFlowParens,jsFlowOrOperator,jsFlowWildcard
if version >= 508 || !exists("did_javascript_syn_inits")
if version < 508
let did_javascript_syn_inits = 1
command -nargs=+ HiLink hi link <args>
else
command -nargs=+ HiLink hi def link <args>
endif
HiLink jsFlowDefinition PreProc
HiLink jsFlowClassDef jsFlowDefinition
HiLink jsFlowArgumentDef jsFlowDefinition
HiLink jsFlowType Type
HiLink jsFlowTypeCustom PreProc
HiLink jsFlowTypeof PreProc
HiLink jsFlowArray PreProc
HiLink jsFlowObject PreProc
HiLink jsFlowParens PreProc
HiLink jsFlowGroup PreProc
HiLink jsFlowReturn PreProc
HiLink jsFlowReturnObject jsFlowReturn
HiLink jsFlowReturnArray jsFlowArray
HiLink jsFlowReturnParens jsFlowParens
HiLink jsFlowReturnGroup jsFlowGroup
HiLink jsFlowFunctionGroup PreProc
HiLink jsFlowClassGroup PreProc
HiLink jsFlowArrowArguments PreProc
HiLink jsFlowArrow PreProc
HiLink jsFlowTypeStatement PreProc
HiLink jsFlowTypeKeyword PreProc
HiLink jsFlowTypeOperator PreProc
HiLink jsFlowMaybe PreProc
HiLink jsFlowReturnMaybe PreProc
HiLink jsFlowClassProperty jsClassProperty
HiLink jsFlowDeclare PreProc
HiLink jsFlowModule PreProc
HiLink jsFlowInterface PreProc
HiLink jsFlowNoise Noise
HiLink jsFlowObjectKey jsObjectKey
HiLink jsFlowOrOperator PreProc
HiLink jsFlowReturnOrOp jsFlowOrOperator
HiLink jsFlowWildcard PreProc
HiLink jsFlowWildcardReturn PreProc
delcommand HiLink
endif
endif

43
extras/jsdoc.vim Normal file
View File

@@ -0,0 +1,43 @@
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'javascript') == -1
"" syntax coloring for javadoc comments (HTML)
syntax region jsComment matchgroup=jsComment start="/\*\s*" end="\*/" contains=jsDocTags,jsCommentTodo,jsCvsTag,@jsHtml,@Spell fold
" tags containing a param
syntax match jsDocTags contained "@\(alias\|api\|augments\|borrows\|class\|constructs\|default\|defaultvalue\|emits\|exception\|exports\|extends\|fires\|kind\|link\|listens\|member\|member[oO]f\|mixes\|module\|name\|namespace\|requires\|template\|throws\|var\|variation\|version\)\>" skipwhite nextgroup=jsDocParam
" tags containing type and param
syntax match jsDocTags contained "@\(arg\|argument\|cfg\|param\|property\|prop\|typedef\)\>" skipwhite nextgroup=jsDocType
" tags containing type but no param
syntax match jsDocTags contained "@\(callback\|define\|enum\|external\|implements\|this\|type\|return\|returns\)\>" skipwhite nextgroup=jsDocTypeNoParam
" tags containing references
syntax match jsDocTags contained "@\(lends\|see\|tutorial\)\>" skipwhite nextgroup=jsDocSeeTag
" other tags (no extra syntax)
syntax match jsDocTags contained "@\(abstract\|access\|accessor\|author\|classdesc\|constant\|const\|constructor\|copyright\|deprecated\|desc\|description\|dict\|event\|example\|file\|file[oO]verview\|final\|function\|global\|ignore\|inheritDoc\|inner\|instance\|interface\|license\|localdoc\|method\|mixin\|nosideeffects\|override\|overview\|preserve\|private\|protected\|public\|readonly\|since\|static\|struct\|todo\|summary\|undocumented\|virtual\)\>"
syntax region jsDocType contained matchgroup=jsDocTypeBrackets start="{" end="}" contains=jsDocTypeRecord oneline skipwhite nextgroup=jsDocParam
syntax match jsDocType contained "\%(#\|\"\|\w\|\.\|:\|\/\)\+" skipwhite nextgroup=jsDocParam
syntax region jsDocTypeRecord contained start=/{/ end=/}/ contains=jsDocTypeRecord extend
syntax region jsDocTypeRecord contained start=/\[/ end=/\]/ contains=jsDocTypeRecord extend
syntax region jsDocTypeNoParam contained start="{" end="}" oneline
syntax match jsDocTypeNoParam contained "\%(#\|\"\|\w\|\.\|:\|\/\)\+"
syntax match jsDocParam contained "\%(#\|\$\|-\|'\|\"\|{.\{-}}\|\w\|\.\|:\|\/\|\[.\{-}]\|=\)\+"
syntax region jsDocSeeTag contained matchgroup=jsDocSeeTag start="{" end="}" contains=jsDocTags
if version >= 508 || !exists("did_javascript_syn_inits")
if version < 508
let did_javascript_syn_inits = 1
command -nargs=+ HiLink hi link <args>
else
command -nargs=+ HiLink hi def link <args>
endif
HiLink jsDocTags Special
HiLink jsDocSeeTag Function
HiLink jsDocType Type
HiLink jsDocTypeBrackets jsDocType
HiLink jsDocTypeRecord jsDocType
HiLink jsDocTypeNoParam Type
HiLink jsDocParam Label
delcommand HiLink
endif
endif

7
extras/ngdoc.vim Normal file
View File

@@ -0,0 +1,7 @@
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'javascript') == -1
syntax match jsDocTags contained /@\(link\|method[oO]f\|ngdoc\|ng[iI]nject\|restrict\)/ nextgroup=jsDocParam skipwhite
syntax match jsDocType contained "\%(#\|\$\|\w\|\"\|-\|\.\|:\|\/\)\+" nextgroup=jsDocParam skipwhite
syntax match jsDocParam contained "\%(#\|\$\|\w\|\"\|-\|\.\|:\|{\|}\|\/\|\[\|]\|=\)\+"
endif

File diff suppressed because it is too large Load Diff

View File

@@ -4,5 +4,6 @@ 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
endif endif

View File

@@ -14,5 +14,24 @@ let b:did_ftplugin = 1
setlocal suffixesadd=.blade.php,.php setlocal suffixesadd=.blade.php,.php
setlocal includeexpr=substitute(v:fname,'\\.','/','g') setlocal includeexpr=substitute(v:fname,'\\.','/','g')
setlocal path+=resources/views; setlocal path+=resources/views;
setlocal include=\\w\\@<!@\\%(include\\\|extends\\)
setlocal define=\\w\\@<!@\\%(yield\\\|stack\\)
setlocal commentstring={{--%s--}}
setlocal comments+=s:{{--,m:\ \ \ \ ,e:--}}
if exists('loaded_matchit') && exists('b:match_words')
" Append to html matchit words
let b:match_words .= ',' .
\ '@\%(section\s*([^\,]*)\|if\|unless\|foreach\|forelse\|for\|while\|push\|can\|cannot\|hasSection\|' .
\ 'php\s*(\@!\|verbatim\|component\|slot\|prepend\)' .
\ ':' .
\ '@\%(else\|elseif\|empty\|break\|continue\|elsecan\|elsecannot\)\>' .
\ ':' .
\ '@\%(end\w\+\|stop\|show\|append\|overwrite\)' .
\ ',{:},\[:\],(:)'
let b:match_skip = 'synIDattr(synID(line("."), col("."), 0), "name") !=# "bladeKeyword"'
let b:match_ignorecase = 0
endif
endif endif

28
ftplugin/caddyfile.vim Normal file
View File

@@ -0,0 +1,28 @@
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'caddyfile') == -1
" Language: Caddyfile
" Author: Josh Glendenning <josh@isobit.io>
if exists('b:did_ftplugin')
finish
endif
let b:did_ftplugin = 1
setlocal commentstring=#\ %s
" Add NERDCommenter delimiters
let s:delimiters = {'left': '#'}
if exists('g:NERDDelimiterMap')
if !has_key(g:NERDDelimiterMap, 'caddyfile')
let g:NERDDelimiterMap.caddyfile = s:delimiters
endif
elseif exists('g:NERDCustomDelimiters')
if !has_key(g:NERDCustomDelimiters, 'caddyfile')
let g:NERDDelimiterMap.caddyfile = s:delimiters
endif
else
let g:NERDCustomDelimiters = {'caddyfile': s:delimiters}
endif
unlet s:delimiters
endif

View File

@@ -12,7 +12,7 @@ if exists('loaded_matchit') && !exists('b:match_words')
let b:match_ignorecase = 0 let b:match_ignorecase = 0
let b:match_words = let b:match_words =
\ '\<\%(if\|unless\|case\|while\|until\|for\|do\|class\|module\|struct\|lib\|macro\|ifdef\|def\|fun\|begin\)\>=\@!' . \ '\<\%(if\|unless\|case\|while\|until\|for\|do\|class\|module\|struct\|lib\|macro\|ifdef\|def\|fun\|begin\|enum\)\>=\@!' .
\ ':' . \ ':' .
\ '\<\%(else\|elsif\|ensure\|when\|rescue\|break\|redo\|next\|retry\)\>' . \ '\<\%(else\|elsif\|ensure\|when\|rescue\|break\|redo\|next\|retry\)\>' .
\ ':' . \ ':' .

View File

@@ -25,7 +25,9 @@ let &l:errorformat =
\ '%m' \ '%m'
\ ], ',') \ ], ',')
setlocal includeexpr=dart#resolveUri(v:fname)
setlocal isfname+=:
let b:undo_ftplugin = 'setl et< fo< sw< sts< com< cms<' let b:undo_ftplugin = 'setl et< fo< sw< sts< com< cms< inex< isf<'
endif endif

View File

@@ -80,6 +80,23 @@ if exists("loaded_matchit")
let b:match_words = s:match_words let b:match_words = s:match_words
endif endif
if !exists('b:surround_45')
" When using surround `-` (ASCII 45) would provide `<% selection %>`
let b:surround_45 = "<% \r %>"
endif
if !exists('b:surround_61')
" When using surround `=` (ASCII 61) would provide `<%= selection %>`
let b:surround_61 = "<%= \r %>"
endif
if !exists('b:surround_35')
" When using surround `#` (ASCII 35) would provide `<%# selection %>`
let b:surround_35 = "<%# \r %>"
endif
if !exists('b:surround_5')
" When using surround `<C-e>` (ASCII 5 `ENQ`) would provide `<% selection %>\n<% end %>`
let b:surround_5 = "<% \r %>\n<% end %>"
endif
setlocal comments=:<%# setlocal comments=:<%#
setlocal commentstring=<%#\ %s\ %> setlocal commentstring=<%#\ %s\ %>

View File

@@ -3,9 +3,9 @@ if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'emberscript') =
" Language: ember-script " Language: ember-script
" Maintainer: Yulij Andreevich Lesov <yalesov@gmail.com>> " Maintainer: Yulij Andreevich Lesov <yalesov@gmail.com>>
" URL: http://github.com/yalesov/vim-ember-script " URL: http://github.com/yalesov/vim-ember-script
" Version: 1.0.3 " Version: 1.0.4
" Last Change: 2016 Jul 5 " Last Change: 2016 Jul 6
" License: GPL-3.0 " License: ISC
setlocal tabstop=2 setlocal tabstop=2
setlocal softtabstop=2 setlocal softtabstop=2

View File

@@ -3,9 +3,9 @@ if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'emblem') == -1
" Language: emblem " Language: emblem
" Maintainer: Yulij Andreevich Lesov <yalesov@gmail.com> " Maintainer: Yulij Andreevich Lesov <yalesov@gmail.com>
" URL: http://github.com/yalesov/vim-emblem " URL: http://github.com/yalesov/vim-emblem
" Version: 2.0.0 " Version: 2.0.1
" Last Change: 2016 Jul 5 " Last Change: 2016 Jul 6
" License: GPL-3.0 " License: ISC
setlocal tabstop=2 setlocal tabstop=2
setlocal softtabstop=2 setlocal softtabstop=2

5
ftplugin/i3.vim Normal file
View File

@@ -0,0 +1,5 @@
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'i3') == -1
setlocal commentstring=#\ %s
endif

View File

@@ -1,8 +0,0 @@
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'javascript') == -1
setlocal suffixesadd+=.js
if (v:version < 704 || (v:version == 704 && !has('patch002'))) && exists('&regexpengine')
set re=1
end
endif

42
ftplugin/json.vim Normal file
View File

@@ -0,0 +1,42 @@
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'json') == -1
" Vim syntax file
" Language: JSON
" Maintainer: Eli Parra <eli@elzr.com> https://github.com/elzr/vim-json
" Last Change: 2014-05-20 added warning toggle
"uncomment to enable folding of `{...}` and `[...]` blocks
"setlocal foldmethod=syntax
"conceal by default
if !exists("g:vim_json_syntax_conceal")
let g:vim_json_syntax_conceal = 1
end
"have warnings by default
if !exists("g:vim_json_warnings")
let g:vim_json_warnings = 1
end
"set concealcursor blank by default
"this should turn off the concealing in the current line (where the cursor is at),
"on all modes (normal, visual, insert)
if !exists("g:vim_json_syntax_concealcursor")
let g:vim_json_syntax_concealcursor = ""
end
if has('conceal')
if (g:vim_json_syntax_conceal == 1)
"level 2 means concealed text gets completely hidden unless a
"replacement is defined (none is defined by us)
setlocal conceallevel=2
let &l:concealcursor = g:vim_json_syntax_concealcursor
else
"level 0 means text is shown normally = no concealing
setlocal conceallevel=0
endif
"maybe g:vim_json_syntax_conceal could be settable to 0,1,2 to map
"directly to vim's conceallevels? unsure if anyone cares
endif
endif

5
ftplugin/litcoffee.vim Normal file
View File

@@ -0,0 +1,5 @@
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'coffee-script') == -1
runtime ftplugin/coffee.vim
endif

208
ftplugin/ls.vim Normal file
View File

@@ -0,0 +1,208 @@
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'livescript') == -1
" Language: LiveScript
" Maintainer: George Zahariev
" URL: http://github.com/gkz/vim-ls
" License: WTFPL
"
if exists("b:did_ftplugin")
finish
endif
let b:did_ftplugin = 1
setlocal formatoptions-=t formatoptions+=croql
setlocal comments=:#
setlocal commentstring=#\ %s
setlocal omnifunc=javascriptcomplete#CompleteJS
" Enable LiveScriptMake if it won't overwrite any settings.
if !len(&l:makeprg)
compiler ls
endif
" Check here too in case the compiler above isn't loaded.
if !exists('livescript_compiler')
let livescript_compiler = 'lsc'
endif
" Reset the LiveScriptCompile variables for the current buffer.
function! s:LiveScriptCompileResetVars()
" Compiled output buffer
let b:livescript_compile_buf = -1
let b:livescript_compile_pos = []
" If LiveScriptCompile is watching a buffer
let b:livescript_compile_watch = 0
endfunction
" Clean things up in the source buffer.
function! s:LiveScriptCompileClose()
exec bufwinnr(b:livescript_compile_src_buf) 'wincmd w'
silent! autocmd! LiveScriptCompileAuWatch * <buffer>
call s:LiveScriptCompileResetVars()
endfunction
" Update the LiveScriptCompile buffer given some input lines.
function! s:LiveScriptCompileUpdate(startline, endline)
let input = join(getline(a:startline, a:endline), "\n")
" Move to the LiveScriptCompile buffer.
exec bufwinnr(b:livescript_compile_buf) 'wincmd w'
" LiveScript doesn't like empty input.
if !len(input)
return
endif
" Compile input.
let output = system(g:livescript_compiler . ' -scb 2>&1', input)
" Be sure we're in the LiveScriptCompile buffer before overwriting.
if exists('b:livescript_compile_buf')
echoerr 'LiveScriptCompile buffers are messed up'
return
endif
" Replace buffer contents with new output and delete the last empty line.
setlocal modifiable
exec '% delete _'
put! =output
exec '$ delete _'
setlocal nomodifiable
" Highlight as JavaScript if there is no compile error.
if v:shell_error
setlocal filetype=
else
setlocal filetype=javascript
endif
call setpos('.', b:livescript_compile_pos)
endfunction
" Update the LiveScriptCompile buffer with the whole source buffer.
function! s:LiveScriptCompileWatchUpdate()
call s:LiveScriptCompileUpdate(1, '$')
exec bufwinnr(b:livescript_compile_src_buf) 'wincmd w'
endfunction
" Peek at compiled LiveScript in a scratch buffer. We handle ranges like this
" to prevent the cursor from being moved (and its position saved) before the
" function is called.
function! s:LiveScriptCompile(startline, endline, args)
if !executable(g:livescript_compiler)
echoerr "Can't find LiveScript compiler `" . g:livescript_compiler . "`"
return
endif
" If in the LiveScriptCompile buffer, switch back to the source buffer and
" continue.
if !exists('b:livescript_compile_buf')
exec bufwinnr(b:livescript_compile_src_buf) 'wincmd w'
endif
" Parse arguments.
let watch = a:args =~ '\<watch\>'
let unwatch = a:args =~ '\<unwatch\>'
let size = str2nr(matchstr(a:args, '\<\d\+\>'))
" Determine default split direction.
if exists('g:livescript_compile_vert')
let vert = 1
else
let vert = a:args =~ '\<vert\%[ical]\>'
endif
" Remove any watch listeners.
silent! autocmd! LiveScriptCompileAuWatch * <buffer>
" If just unwatching, don't compile.
if unwatch
let b:livescript_compile_watch = 0
return
endif
if watch
let b:livescript_compile_watch = 1
endif
" Build the LiveScriptCompile buffer if it doesn't exist.
if bufwinnr(b:livescript_compile_buf) == -1
let src_buf = bufnr('%')
let src_win = bufwinnr(src_buf)
" Create the new window and resize it.
if vert
let width = size ? size : winwidth(src_win) / 2
belowright vertical new
exec 'vertical resize' width
else
" Try to guess the compiled output's height.
let height = size ? size : min([winheight(src_win) / 2,
\ a:endline - a:startline + 5])
belowright new
exec 'resize' height
endif
" We're now in the scratch buffer, so set it up.
setlocal bufhidden=wipe buftype=nofile
setlocal nobuflisted nomodifiable noswapfile nowrap
autocmd BufWipeout <buffer> call s:LiveScriptCompileClose()
" Save the cursor when leaving the LiveScriptCompile buffer.
autocmd BufLeave <buffer> let b:livescript_compile_pos = getpos('.')
nnoremap <buffer> <silent> q :hide<CR>
let b:livescript_compile_src_buf = src_buf
let buf = bufnr('%')
" Go back to the source buffer and set it up.
exec bufwinnr(b:livescript_compile_src_buf) 'wincmd w'
let b:livescript_compile_buf = buf
endif
if b:livescript_compile_watch
call s:LiveScriptCompileWatchUpdate()
augroup LiveScriptCompileAuWatch
autocmd InsertLeave <buffer> call s:LiveScriptCompileWatchUpdate()
autocmd BufWritePost <buffer> call s:LiveScriptCompileWatchUpdate()
augroup END
else
call s:LiveScriptCompileUpdate(a:startline, a:endline)
endif
endfunction
" Complete arguments for the LiveScriptCompile command.
function! s:LiveScriptCompileComplete(arg, cmdline, cursor)
let args = ['unwatch', 'vertical', 'watch']
if !len(a:arg)
return args
endif
let match = '^' . a:arg
for arg in args
if arg =~ match
return [arg]
endif
endfor
endfunction
" Don't overwrite the CoffeeCompile variables.
if !exists("s:livescript_compile_buf")
call s:LiveScriptCompileResetVars()
endif
" Peek at compiled LiveScript.
command! -range=% -bar -nargs=* -complete=customlist,s:LiveScriptCompileComplete
\ LiveScriptCompile call s:LiveScriptCompile(<line1>, <line2>, <q-args>)
" Run some LiveScript.
command! -range=% -bar LiveScriptRun <line1>,<line2>:w !lsc -sp
endif

63
ftplugin/mma.vim Normal file
View File

@@ -0,0 +1,63 @@
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'mathematica') == -1
"Vim filetype plugin
" Language: Mathematica
" Maintainer: R. Menon <rsmenon@icloud.com>
" Last Change: Feb 26, 2013
" Initialization {
if exists("b:did_ftplugin")
finish
endif
let b:did_ftplugin = 1
let s:cpo_save = &cpo
set cpo&vim
"}
" Syntax completion function {
if exists('&ofu')
setlocal omnifunc=syntaxcomplete#Complete
setlocal completefunc=syntaxcomplete#Complete
endif
"}
" Main functions {
if has('python')
" Random ID generator {
function! RandomID()
"Python implementation follows; do not alter indentations/whitespace
python << EOF
import random, string, vim
vim.command("let l:id = '" + (''.join(random.sample(string.ascii_uppercase + string.digits, 8))) + "'")
EOF
return l:id
endfunction
"}
"Unit test template {
function! Test()
if exists("*strftime")
let l:date = strftime("%Y%m%d") . "-"
else
let l:date = ""
endif
let l:testid = expand("%:t") . "-" . l:date . RandomID()
let l:template = "Test[\rtest\r,\rresult\r,\rTestID -> \"" . l:testid . "\"\r\b]"
exe ":normal i" . l:template
endfunction
"}
endif
"}
" Cleanup {
let &cpo = s:cpo_save
unlet s:cpo_save
"}
" vim: set foldmarker={,} foldlevel=0 foldmethod=marker:
endif

9
ftplugin/nginx.vim Normal file
View File

@@ -0,0 +1,9 @@
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'nginx') == -1
setlocal commentstring=#\ %s
setlocal iskeyword+=.
setlocal iskeyword+=/
setlocal iskeyword+=:
endif

View File

@@ -1,92 +0,0 @@
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'perl') == -1
" Vim filetype plugin file
" Language: Perl 6
" Maintainer: vim-perl <vim-perl@googlegroups.com>
" Homepage: http://github.com/vim-perl/vim-perl
" Bugs/requests: http://github.com/vim-perl/vim-perl/issues
" Last Change: {{LAST_CHANGE}}
" Contributors: Hinrik Örn Sigurðsson <hinrik.sig@gmail.com>
"
" Based on ftplugin/perl.vim by Dan Sharp <dwsharp at hotmail dot com>
if exists("b:did_ftplugin") | finish | endif
let b:did_ftplugin = 1
" Make sure the continuation lines below do not cause problems in
" compatibility mode.
let s:save_cpo = &cpo
set cpo-=C
setlocal formatoptions-=t
setlocal formatoptions+=crqol
setlocal keywordprg=p6doc
setlocal comments=:#\|,:#=,:#
setlocal commentstring=#%s
" Change the browse dialog on Win32 to show mainly Perl-related files
if has("gui_win32")
let b:browsefilter = "Perl Source Files (*.pl)\t*.pl\n" .
\ "Perl Modules (*.pm)\t*.pm\n" .
\ "Perl Documentation Files (*.pod)\t*.pod\n" .
\ "All Files (*.*)\t*.*\n"
endif
" Provided by Ned Konz <ned at bike-nomad dot com>
"---------------------------------------------
setlocal include=\\<\\(use\\\|require\\)\\>
setlocal includeexpr=substitute(substitute(v:fname,'::','/','g'),'$','.pm','')
setlocal define=[^A-Za-z_]
" The following line changes a global variable but is necessary to make
" gf and similar commands work. Thanks to Andrew Pimlott for pointing out
" the problem. If this causes a " problem for you, add an
" after/ftplugin/perl6.vim file that contains
" set isfname-=:
set isfname+=:
setlocal iskeyword=@,48-57,_,192-255,-
" Set this once, globally.
if !exists("perlpath")
if executable("perl6")
try
if &shellxquote != '"'
let perlpath = system('perl6 -e "@*INC.join(q/,/).say"')
else
let perlpath = system("perl6 -e '@*INC.join(q/,/).say'")
endif
let perlpath = substitute(perlpath,',.$',',,','')
catch /E145:/
let perlpath = ".,,"
endtry
else
" If we can't call perl to get its path, just default to using the
" current directory and the directory of the current file.
let perlpath = ".,,"
endif
endif
" Append perlpath to the existing path value, if it is set. Since we don't
" use += to do it because of the commas in perlpath, we have to handle the
" global / local settings, too.
if &l:path == ""
if &g:path == ""
let &l:path=perlpath
else
let &l:path=&g:path.",".perlpath
endif
else
let &l:path=&l:path.",".perlpath
endif
"---------------------------------------------
" Undo the stuff we changed.
let b:undo_ftplugin = "setlocal fo< com< cms< inc< inex< def< isf< isk< kp< path<" .
\ " | unlet! b:browsefilter"
" Restore the saved compatibility options.
let &cpo = s:save_cpo
unlet s:save_cpo
endif

View File

@@ -3,20 +3,40 @@ if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'plantuml') == -
" Vim plugin file " Vim plugin file
" Language: PlantUML " Language: PlantUML
" Maintainer: Aaron C. Meadows < language name at shadowguarddev dot com> " Maintainer: Aaron C. Meadows < language name at shadowguarddev dot com>
" Last Change: 19-Jun-2012
" Version: 0.1 " Version: 0.1
if exists("g:loaded_plantuml_plugin") if exists("b:loaded_plantuml_plugin")
finish finish
endif endif
let g:loaded_plantuml_plugin = 1 let b:loaded_plantuml_plugin = 1
let s:cpo_save = &cpo
set cpo&vim
if !exists("g:plantuml_executable_script") if !exists("g:plantuml_executable_script")
let g:plantuml_executable_script="plantuml" let g:plantuml_executable_script="plantuml"
endif endif
autocmd Filetype plantuml let &l:makeprg=g:plantuml_executable_script . " " . fnameescape(expand("%")) if exists("loaded_matchit")
let b:match_ignorecase = 0
let b:match_words =
\ '\(\<ref\>\|\<box\>\|\<opt\>\|\<alt\>\|\<group\>\|\<loop\>\|\<note\>\|\<legend\>\):\<else\>:\<end\>' .
\ ',\<if\>:\<elseif\>:\<else\>:\<endif\>' .
\ ',\<rnote\>:\<endrnote\>' .
\ ',\<hnote\>:\<endhnote\>' .
\ ',\<title\>:\<endtitle\>' .
\ ',\<\while\>:\<endwhile\>'
endif
let &l:makeprg=g:plantuml_executable_script . " " . fnameescape(expand("%"))
setlocal comments=s1:/',mb:',ex:'/,:' commentstring=/'%s'/ formatoptions-=t formatoptions+=croql setlocal comments=s1:/',mb:',ex:'/,:' commentstring=/'%s'/ formatoptions-=t formatoptions+=croql
let b:endwise_addition = '\=index(["note","legend"], submatch(0))!=-1 ? "end " . submatch(0) : "end"'
let b:endwise_words = 'loop,group,alt,note,legend'
let b:endwise_pattern = '^\s*\zs\<\(loop\|group\|alt\|note\ze[^:]*$\|legend\)\>.*$'
let b:endwise_syngroups = 'plantumlKeyword'
let &cpo = s:cpo_save
unlet s:cpo_save
endif endif

5
ftplugin/purescript.vim Normal file
View File

@@ -0,0 +1,5 @@
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'purescript') == -1
setlocal comments=s1fl:{-,mb:\ \ ,ex:-},:--
endif

5
ftplugin/raml.vim Normal file
View File

@@ -0,0 +1,5 @@
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'raml') == -1
set ts=2 sts=2 sw=2 et
endif

View File

@@ -77,9 +77,9 @@ function! s:query_path(root) abort
let prefix = '' let prefix = ''
endif endif
if &shellxquote == "'" if &shellxquote == "'"
let path_check = prefix.'ruby -e --disable-gems"' . code . '"' let path_check = prefix.'ruby --disable-gems -e "' . code . '"'
else else
let path_check = prefix."ruby -e --disable-gems'" . code . "'" let path_check = prefix."ruby --disable-gems -e '" . code . "'"
endif endif
let cd = haslocaldir() ? 'lcd' : 'cd' let cd = haslocaldir() ? 'lcd' : 'cd'

View File

@@ -48,7 +48,6 @@ endif
" This includeexpr isn't perfect, but it's a good start " This includeexpr isn't perfect, but it's a good start
setlocal includeexpr=substitute(v:fname,'::','/','g') setlocal includeexpr=substitute(v:fname,'::','/','g')
" NOT adding .rc as it's being phased out (0.7)
setlocal suffixesadd=.rs setlocal suffixesadd=.rs
if exists("g:ftplugin_rust_source_path") if exists("g:ftplugin_rust_source_path")
@@ -113,16 +112,6 @@ xnoremap <silent> <buffer> ]] :call rust#Jump('v', 'Forward')<CR>
onoremap <silent> <buffer> [[ :call rust#Jump('o', 'Back')<CR> onoremap <silent> <buffer> [[ :call rust#Jump('o', 'Back')<CR>
onoremap <silent> <buffer> ]] :call rust#Jump('o', 'Forward')<CR> onoremap <silent> <buffer> ]] :call rust#Jump('o', 'Forward')<CR>
" %-matching. <:> is handy for generics.
set matchpairs+=<:>
" There are two minor issues with it; (a) comparison operators in expressions,
" where a less-than may match a greater-than later on—this is deemed a trivial
" issue—and (b) `Fn() -> X` syntax. This latter issue is irremediable from the
" highlighting perspective (built into Vim), but the actual % functionality
" can be fixed by this use of matchit.vim.
let b:match_skip = 's:comment\|string\|rustArrow'
source $VIMRUNTIME/macros/matchit.vim
" Commands {{{1 " Commands {{{1
" See |:RustRun| for docs " See |:RustRun| for docs
@@ -143,6 +132,9 @@ command! -range=% RustPlay :call rust#Play(<count>, <line1>, <line2>, <f-args>)
" See |:RustFmt| for docs " See |:RustFmt| for docs
command! -buffer RustFmt call rustfmt#Format() command! -buffer RustFmt call rustfmt#Format()
" See |:RustFmtRange| for docs
command! -range -buffer RustFmtRange call rustfmt#FormatRange(<line1>, <line2>)
" Mappings {{{1 " Mappings {{{1
" Bind ⌘R in MacVim to :RustRun " Bind ⌘R in MacVim to :RustRun
@@ -190,13 +182,27 @@ let b:undo_ftplugin = "
\|ounmap <buffer> ]] \|ounmap <buffer> ]]
\|set matchpairs-=<:> \|set matchpairs-=<:>
\|unlet b:match_skip \|unlet b:match_skip
\|augroup! rust.vim
\" \"
" }}}1 " }}}1
" Code formatting on save
if get(g:, "rustfmt_autosave", 0)
autocmd BufWritePre *.rs silent! call rustfmt#Format()
endif
augroup END augroup END
" %-matching. <:> is handy for generics.
set matchpairs+=<:>
" There are two minor issues with it; (a) comparison operators in expressions,
" where a less-than may match a greater-than later on—this is deemed a trivial
" issue—and (b) `Fn() -> X` syntax. This latter issue is irremediable from the
" highlighting perspective (built into Vim), but the actual % functionality
" can be fixed by this use of matchit.vim.
let b:match_skip = 's:comment\|string\|rustArrow'
source $VIMRUNTIME/macros/matchit.vim
let &cpo = s:save_cpo let &cpo = s:save_cpo
unlet s:save_cpo unlet s:save_cpo

View File

@@ -1,27 +0,0 @@
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'haml') == -1
" Vim filetype plugin
" Language: Sass
" Maintainer: Tim Pope <vimNOSPAM@tpope.org>
" Last Change: 2010 Jul 26
" Only do this when not done yet for this buffer
if exists("b:did_ftplugin")
finish
endif
let b:did_ftplugin = 1
let b:undo_ftplugin = "setl com< cms< def< inc< inex< ofu< sua<"
setlocal comments=://
setlocal commentstring=//\ %s
setlocal define=^\\s*\\%(@mixin\\\|=\\)
setlocal includeexpr=substitute(v:fname,'\\%(.*/\\\|^\\)\\zs','_','')
setlocal omnifunc=csscomplete#CompleteCSS
setlocal suffixesadd=.sass,.scss,.css
let &l:include = '^\s*@import\s\+\%(url(\)\=["'']\='
" vim:set sw=2:
endif

View File

@@ -18,7 +18,11 @@ silent! setlocal formatoptions+=j
" Just like c.vim, but additionally doesn't wrap text onto /** line when " Just like c.vim, but additionally doesn't wrap text onto /** line when
" formatting. Doesn't bungle bulleted lists when formatting. " formatting. Doesn't bungle bulleted lists when formatting.
setlocal comments=sO:*\ -,mO:*\ \ ,exO:*/,s1:/**,mb:*,ex:*/,s1:/*,mb:*,ex:*/,:// if get(g:, 'scala_scaladoc_indent', 0)
setlocal comments=sO:*\ -,mO:*\ \ ,exO:*/,s2:/**,mb:*,ex:*/,s1:/*,mb:*,ex:*/,://
else
setlocal comments=sO:*\ -,mO:*\ \ ,exO:*/,s1:/**,mb:*,ex:*/,s1:/*,mb:*,ex:*/,://
endif
setlocal commentstring=//\ %s setlocal commentstring=//\ %s
setlocal shiftwidth=2 softtabstop=2 expandtab setlocal shiftwidth=2 softtabstop=2 expandtab

View File

@@ -1,17 +1,17 @@
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'haml') == -1 if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'scss') == -1
" Vim filetype plugin if exists('b:did_indent') && b:did_indent
" Language: SCSS " be kind. allow users to override this. Does it work?
" Maintainer: Tim Pope <vimNOSPAM@tpope.org>
" Last Change: 2010 Jul 26
if exists("b:did_ftplugin")
finish finish
endif endif
runtime! ftplugin/sass.vim setlocal indentexpr=scss_indent#GetIndent(v:lnum)
" Automatically insert the current comment leader after hitting <Enter>
" in Insert mode respectively after hitting 'o' or 'O' in Normal mode
setlocal formatoptions+=ro
" SCSS comments are either /* */ or //
setlocal comments=s1:/*,mb:*,ex:*/,:// setlocal comments=s1:/*,mb:*,ex:*/,://
" vim:set sw=2:
endif endif

16
ftplugin/vue.vim Normal file
View File

@@ -0,0 +1,16 @@
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'vue') == -1
" Vim filetype plugin
" Language: Vue.js
" Maintainer: Eduardo San Martin Morote
" Author: Adriaan Zonnenberg
if exists("b:did_ftplugin")
finish
endif
runtime! ftplugin/html.vim
setlocal suffixesadd+=.vue
endif

View File

@@ -4,68 +4,96 @@ if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'blade') == -1
" Language: Blade (Laravel) " Language: Blade (Laravel)
" Maintainer: Jason Walton <jwalton512@gmail.com> " Maintainer: Jason Walton <jwalton512@gmail.com>
if exists("b:did_indent") if exists('b:did_indent')
finish finish
endif endif
runtime! indent/html.vim runtime! indent/html.vim
let s:htmlindent = &indentexpr let s:htmlindent = &indentexpr
unlet! b:did_indent
unlet! b:did_indent
runtime! indent/php.vim runtime! indent/php.vim
let s:phpindent = &indentexpr let s:phpindent = &indentexpr
unlet! b:did_indent
let b:did_indent = 1 let b:did_indent = 1
" Doesn't include 'foreach' and 'forelse' because these already get matched by 'for'.
let s:directives_start = 'if\|else\|unless\|for\|while\|empty\|push\|section\|can\|hasSection\|verbatim\|php\|' .
\ 'component\|slot\|prepend'
let s:directives_end = 'else\|end\|empty\|show\|stop\|append\|overwrite'
if exists('g:blade_custom_directives_pairs')
let s:directives_start .= '\|' . join(keys(g:blade_custom_directives_pairs), '\|')
let s:directives_end .= '\|' . join(values(g:blade_custom_directives_pairs), '\|')
endif
setlocal autoindent setlocal autoindent
setlocal indentexpr=GetBladeIndent() setlocal indentexpr=GetBladeIndent()
setlocal indentkeys=o,O,*<Return>,<>>,!^F,=@else,=@end,=@empty,=@show,=@stop exe 'setlocal indentkeys=o,O,<>>,!^F,0=}},0=!!},=@' . substitute(s:directives_end, '\\|', ',=@', 'g')
" Only define the function once. " Only define the function once.
if exists("*GetBladeIndent") if exists('*GetBladeIndent')
finish finish
endif endif
function! s:IsStartingDelimiter(lnum)
let line = getline(a:lnum)
return line =~# '\%(\w\|@\)\@<!@\%(' . s:directives_start . '\)\%(.*@end\|.*@stop\)\@!'
\ || line =~# '{{\%(.*}}\)\@!'
\ || line =~# '{!!\%(.*!!}\)\@!'
\ || line =~# '<?\%(.*?>\)\@!'
endfunction
function! GetBladeIndent() function! GetBladeIndent()
let lnum = prevnonblank(v:lnum-1) let lnum = prevnonblank(v:lnum - 1)
if lnum == 0 if lnum == 0
return 0 return 0
endif endif
let line = substitute(substitute(getline(lnum), '\s\+$', '', ''), '^\s\+', '', '') let line = getline(lnum)
let cline = substitute(substitute(getline(v:lnum), '\s\+$', '', ''), '^\s\+', '', '') let cline = getline(v:lnum)
let indent = indent(lnum) let indent = indent(lnum)
if cline =~# '@\%(else\|elseif\|empty\|end\|show\|stop\)' ||
\ cline =~# '\%(<?.*\)\@<!?>\|\%({{.*\)\@<!}}\|\%({!!.*\)\@<!!!}' " 1. Check for special directives
let indent = indent - &sw " @section is a single-line directive if it has a second argument.
elseif line =~# '<?\%(.*?>\)\@!' " @php is a single-line directive if it is followed by parentheses.
let indent = indent + &sw if (line =~# '@section\%(.*@end\)\@!' && line !~# '@section\s*([^,]*)')
else \ || line =~# '@php\s*('
if exists("*GetBladeIndentCustom") return indent
let hindent = GetBladeIndentCustom() endif
elseif searchpair('@include\s*(', '', ')', 'bWr') ||
" 2. When the current line is an ending delimiter: decrease indentation
" if the previous line wasn't a starting delimiter.
if cline =~# '^\s*@\%(' . s:directives_end . '\)'
\ || cline =~# '\%(<?.*\)\@<!?>'
\ || cline =~# '\%({{.*\)\@<!}}'
\ || cline =~# '\%({!!.*\)\@<!!!}'
return s:IsStartingDelimiter(lnum) ? indent : indent - &sw
endif
" 3. Increase indentation if the line contains a starting delimiter.
if s:IsStartingDelimiter(lnum)
return indent + &sw
endif
" 4. External indent scripts (PHP and HTML)
execute 'let indent = ' . s:htmlindent
if exists('*GetBladeIndentCustom')
let indent = GetBladeIndentCustom()
elseif line !~# '^\s*\%(#\|//\)\|\*/\s*$' && (
\ searchpair('@include\%(If\)\?\s*(', '', ')', 'bWr') ||
\ searchpair('{!!', '', '!!}', 'bWr') || \ searchpair('{!!', '', '!!}', 'bWr') ||
\ searchpair('{{', '', '}}', 'bWr') || \ searchpair('{{', '', '}}', 'bWr') ||
\ searchpair('<?', '', '?>', 'bWr') \ searchpair('<?', '', '?>', 'bWr') ||
execute 'let hindent = ' . s:phpindent \ searchpair('@php\s*(\@!', '', '@endphp', 'bWr') )
else " Only use PHP's indent if the region spans multiple lines
execute 'let hindent = ' . s:htmlindent if !s:IsStartingDelimiter(v:lnum)
endif execute 'let indent = ' . s:phpindent
if hindent > -1
let indent = hindent
endif endif
endif endif
let increase = indent + &sw
if line =~# '@\%(section\)\%(.*@end\)\@!' && line !~# '@\%(section\)\s*([^,]*)'
return indent return indent
elseif line =~# '@\%(if\|elseif\|else\|unless\|foreach\|forelse\|for\|while\|empty\|push\|section\|can\|hasSection\)\%(.*@end\|.*@stop\)\@!' ||
\ line =~# '{{\%(.*}}\)\@!' || line =~# '{!!\%(.*!!}\)\@!'
return increase
else
return indent
endif
endfunction endfunction
endif endif

46
indent/caddyfile.vim Normal file
View File

@@ -0,0 +1,46 @@
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'caddyfile') == -1
if exists('b:did_indent')
finish
endif
let b:did_indent = 1
setlocal nolisp
setlocal autoindent
setlocal indentexpr=GetCaddyfileIndent(v:lnum)
setlocal indentkeys+=<:>,0=},0=)
" setlocal cindent
if exists('*shiftwidth')
func s:sw()
return shiftwidth()
endfunc
else
func s:sw()
return &sw
endfunc
endif
function! GetCaddyfileIndent(lnum)
let prevlnum = prevnonblank(a:lnum-1)
if prevlnum == 0
return 0
endif
let thisl = substitute(getline(a:lnum), '#.*$', '', '')
let prevl = substitute(getline(prevlnum), '#.*$', '', '')
let ind = indent(prevlnum)
if prevl =~ '{\s*$'
let ind += s:sw()
endif
if thisl =~ '^\s*}\s*$'
let ind -= s:sw()
endif
return ind
endfunction
endif

View File

@@ -89,7 +89,7 @@ if exists("*searchpairpos")
function! s:match_pairs(open, close, stopat) function! s:match_pairs(open, close, stopat)
" Stop only on vector and map [ resp. {. Ignore the ones in strings and " Stop only on vector and map [ resp. {. Ignore the ones in strings and
" comments. " comments.
if a:stopat == 0 if a:stopat == 0 && g:clojure_maxlines > 0
let stopat = max([line(".") - g:clojure_maxlines, 0]) let stopat = max([line(".") - g:clojure_maxlines, 0])
else else
let stopat = a:stopat let stopat = a:stopat
@@ -123,7 +123,7 @@ if exists("*searchpairpos")
if s:syn_id_name() !~? "string" if s:syn_id_name() !~? "string"
return -1 return -1
endif endif
if s:current_char() != '\\' if s:current_char() != '\'
return -1 return -1
endif endif
call cursor(0, col("$") - 1) call cursor(0, col("$") - 1)
@@ -189,6 +189,16 @@ if exists("*searchpairpos")
return val return val
endfunction endfunction
" Check if form is a reader conditional, that is, it is prefixed by #?
" or @#?
function! s:is_reader_conditional_special_case(position)
if getline(a:position[0])[a:position[1] - 3 : a:position[1] - 2] == "#?"
return 1
endif
return 0
endfunction
" Returns 1 for opening brackets, -1 for _anything else_. " Returns 1 for opening brackets, -1 for _anything else_.
function! s:bracket_type(char) function! s:bracket_type(char)
return stridx('([{', a:char) > -1 ? 1 : -1 return stridx('([{', a:char) > -1 ? 1 : -1
@@ -256,6 +266,10 @@ if exists("*searchpairpos")
return [paren[0], paren[1] + &shiftwidth - 1] return [paren[0], paren[1] + &shiftwidth - 1]
endif endif
if s:is_reader_conditional_special_case(paren)
return paren
endif
" In case we are at the last character, we use the paren position. " In case we are at the last character, we use the paren position.
if col("$") - 1 == paren[1] if col("$") - 1 == paren[1]
return paren return paren

View File

@@ -8,6 +8,32 @@ let b:did_indent = 1
setlocal cindent setlocal cindent
setlocal cinoptions+=j1,J1 setlocal cinoptions+=j1,J1
setlocal indentexpr=DartIndent()
let b:undo_indent = 'setl cin< cino<' let b:undo_indent = 'setl cin< cino<'
if exists("*DartIndent")
finish
endif
function! DartIndent()
" Default to cindent in most cases
let indentTo = cindent(v:lnum)
let previousLine = getline(prevnonblank(v:lnum - 1))
let currentLine = getline(v:lnum)
" Don't indent after an annotation
if previousLine =~# '^\s*@.*$'
let indentTo = indent(v:lnum - 1)
endif
" Indent after opening List literal
if previousLine =~# '\[$' && !(currentLine =~# '^\s*\]')
let indentTo = indent(v:lnum - 1) + &shiftwidth
endif
return indentTo
endfunction
endif endif

View File

@@ -8,6 +8,9 @@ runtime! indent/elixir.vim
unlet! b:did_indent unlet! b:did_indent
setlocal indentexpr= setlocal indentexpr=
let s:cpo_save = &cpo
set cpo&vim
if exists("b:eelixir_subtype") if exists("b:eelixir_subtype")
exe "runtime! indent/".b:eelixir_subtype.".vim" exe "runtime! indent/".b:eelixir_subtype.".vim"
else else
@@ -53,19 +56,21 @@ function! GetEelixirIndent(...)
let line = getline(lnum) let line = getline(lnum)
let cline = getline(v:lnum) let cline = getline(v:lnum)
if cline =~# '^\s*<%\s*\%(end\|else\|elsif\|catch\|after\|rescue\)\>.*%>' if cline =~# '^\s*<%\s*\%(end\|else\|elsif\|catch\|after\|rescue\)\>.*%>'
let ind = ind - &sw let ind -= &sw
elseif line =~# '\S\s*<%\s*end\s*%>' elseif line =~# '\S\s*<%\s*end\s*%>'
let ind = ind - &sw let ind -= &sw
endif endif
if line =~# '<%[=%]\=\s*.*\<do\s*%>' if line =~# '<%[=%]\=\s*.*\(\<do\|->\)\s*%>' ||
let ind = ind + &sw \ line =~# '<%\s*\%(else\|elsif\|catch\|after\|rescue\)\>.*%>'
elseif line =~# '<%\s*\%(else\|elsif\|catch\|after\|rescue\)\>.*%>' let ind += &sw
let ind = ind + &sw
endif endif
if cline =~# '^\s*%>\s*$' if cline =~# '^\s*%>\s*$'
let ind = ind - &sw let ind -= &sw
endif endif
return ind return ind
endfunction endfunction
let &cpo = s:cpo_save
unlet s:cpo_save
endif endif

View File

@@ -1,142 +1,94 @@
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_indent")
finish
endif
let b:did_indent = 1
setlocal nosmartindent setlocal nosmartindent
setlocal indentexpr=elixir#indent()
setlocal indentkeys+=0),0],0=\|>,=->
setlocal indentkeys+=0=end,0=else,0=match,0=elsif,0=catch,0=after,0=rescue
setlocal indentexpr=GetElixirIndent() if exists("b:did_indent") || exists("*elixir#indent")
setlocal indentkeys+=0),0],0=end,0=else,0=match,0=elsif,0=catch,0=after,0=rescue
if exists("*GetElixirIndent")
finish finish
endif end
let b:did_indent = 1
let s:cpo_save = &cpo let s:cpo_save = &cpo
set cpo&vim set cpo&vim
let s:no_colon_before = ':\@<!' function! elixir#indent()
let s:no_colon_after = ':\@!' " initiates the `old_ind` dictionary
let s:symbols_end = '\]\|}\|)' let b:old_ind = get(b:, 'old_ind', {})
let s:symbols_start = '\[\|{\|(' " initiates the `line` dictionary
let s:arrow = '^.*->$' let line = s:build_line(v:lnum)
let s:skip_syntax = '\%(Comment\|String\)$'
let s:block_skip = "synIDattr(synID(line('.'),col('.'),1),'name') =~? '".s:skip_syntax."'"
let s:block_start = '\<\%(do\|fn\)\>'
let s:block_middle = 'else\|match\|elsif\|catch\|after\|rescue'
let s:block_end = 'end'
let s:starts_with_pipeline = '^\s*|>.*$'
let s:ending_with_assignment = '=\s*$'
let s:indent_keywords = '\<'.s:no_colon_before.'\%('.s:block_start.'\|'.s:block_middle.'\)$'.'\|'.s:arrow
let s:deindent_keywords = '^\s*\<\%('.s:block_end.'\|'.s:block_middle.'\)\>'.'\|'.s:arrow
let s:pair_start = '\<\%('.s:no_colon_before.s:block_start.'\)\>'.s:no_colon_after
let s:pair_middle = '\<\%('.s:block_middle.'\)\>'.s:no_colon_after.'\zs'
let s:pair_end = '\<\%('.s:no_colon_before.s:block_end.'\)\>\zs'
let s:inside_block = 0
function! GetElixirIndent()
let lnum = prevnonblank(v:lnum - 1)
if s:is_beginning_of_file(line)
" Reset `old_ind` dictionary at the beginning of the file
let b:old_ind = {}
" At the start of the file use zero indent. " At the start of the file use zero indent.
if lnum == 0
return 0 return 0
endif elseif !s:is_indentable_line(line)
" Keep last line indentation if the current line does not have an
let opened_symbol = 0 " indentable syntax
let current_line = getline(v:lnum) return indent(line.last_non_blank.num)
let last_line = getline(lnum)
let ind = indent(lnum)
" TODO: Remove these 2 lines
" I don't know why, but for the test on spec/indent/lists_spec.rb:24.
" Vim is making some mess on parsing the syntax of 'end', it is being
" recognized as 'elixirString' when should be recognized as 'elixirBlock'.
" This forces vim to sync the syntax.
call synID(v:lnum, 1, 1)
syntax sync fromstart
if synIDattr(synID(v:lnum, 1, 1), "name") !~ s:skip_syntax
if last_line !~ s:arrow
let split_line = split(last_line, '\zs')
let opened_symbol += count(split_line, '(') - count(split_line, ')')
let opened_symbol += count(split_line, '[') - count(split_line, ']')
let opened_symbol += count(split_line, '{') - count(split_line, '}')
end
" if start symbol is followed by a character, indent based on the
" whitespace after the symbol, otherwise use the default shiftwidth
if last_line =~ '\('.s:symbols_start.'\).'
let opened_prefix = matchlist(last_line, '\('.s:symbols_start.'\)\s*')[0]
let ind += (opened_symbol * strlen(opened_prefix))
else else
let ind += (opened_symbol * &sw) " Calculates the indenation level based on the rules
endif " All the rules are defined in `autoload/elixir/indent.vim`
let ind = indent(line.last_non_blank.num)
if last_line =~ '^\s*\('.s:symbols_end.'\)' || last_line =~ s:indent_keywords call s:debug('>>> line = ' . string(line.current))
let ind += &sw call s:debug('>>> ind = ' . ind)
endif let ind = s:indent('deindent_case_arrow', ind, line)
let ind = s:indent('indent_parenthesis', ind, line)
if current_line =~ '^\s*\('.s:symbols_end.'\)' let ind = s:indent('indent_square_brackets', ind, line)
let ind -= &sw let ind = s:indent('indent_brackets', ind, line)
endif let ind = s:indent('deindent_opened_symbols', ind, line)
let ind = s:indent('indent_pipeline_assignment', ind, line)
if last_line =~ s:ending_with_assignment && opened_symbol == 0 let ind = s:indent('indent_pipeline_continuation', ind, line)
let b:old_ind = indent(lnum) let ind = s:indent('indent_after_pipeline', ind, line)
let ind += &sw let ind = s:indent('indent_assignment', ind, line)
end let ind = s:indent('indent_ending_symbols', ind, line)
let ind = s:indent('indent_keywords', ind, line)
" if line starts with pipeline let ind = s:indent('deindent_keywords', ind, line)
" and last line ends with a pipeline, let ind = s:indent('deindent_ending_symbols', ind, line)
" align them let ind = s:indent('indent_case_arrow', ind, line)
if last_line =~ '|>.*$' && let ind = s:indent('indent_ecto_queries', ind, line)
\ current_line =~ s:starts_with_pipeline call s:debug('<<< final = ' . ind)
let ind = float2nr(match(last_line, '|>') / &sw) * &sw
" if line starts with pipeline
" and last line is an attribution
" indents pipeline in same level as attribution
elseif current_line =~ s:starts_with_pipeline &&
\ last_line =~ '^[^=]\+=.\+$'
if !exists('b:old_ind') || b:old_ind == 0
let b:old_ind = indent(lnum)
end
let ind = float2nr(matchend(last_line, '=\s*[^ ]') / &sw) * &sw
endif
" if last line starts with pipeline
" and current line doesn't start with pipeline
" returns the indentation before the pipeline
if last_line =~ s:starts_with_pipeline &&
\ current_line !~ s:starts_with_pipeline
let ind = b:old_ind
endif
if current_line =~ s:deindent_keywords
let bslnum = searchpair(
\ s:pair_start,
\ s:pair_middle,
\ s:pair_end,
\ 'nbW',
\ s:block_skip
\ )
let ind = indent(bslnum)
endif
" indent case statements '->'
if current_line =~ s:arrow
let ind += &sw
endif
endif
return ind return ind
end
endfunction
function s:indent(rule, ind, line)
let Fn = function('elixir#indent#'.a:rule)
let ind = Fn(a:ind, a:line)
call s:debug(a:rule . ' = ' . ind)
return ind
endfunction
function s:debug(message)
if get(g:, 'elixir_indent_debug', 0)
echom a:message
end
endfunction
function! s:is_beginning_of_file(line)
return a:line.last_non_blank.num == 0
endfunction
function! s:is_indentable_line(line)
return elixir#util#is_indentable_at(a:line.current.num, 1)
endfunction
function! s:build_line(line)
let line = { 'current': {}, 'last': {}, 'last_non_blank': {} }
let line.current = s:new_line(a:line)
let line.last = s:new_line(line.current.num - 1)
let line.last_non_blank = s:new_line(prevnonblank(line.current.num - 1))
return line
endfunction
function! s:new_line(num)
return {
\ "num": a:num,
\ "text": getline(a:num)
\ }
endfunction endfunction
let &cpo = s:cpo_save let &cpo = s:cpo_save

View File

@@ -3,9 +3,9 @@ if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'emberscript') =
" Language: ember-script " Language: ember-script
" Maintainer: Yulij Andreevich Lesov <yalesov@gmail.com>> " Maintainer: Yulij Andreevich Lesov <yalesov@gmail.com>>
" URL: http://github.com/yalesov/vim-ember-script " URL: http://github.com/yalesov/vim-ember-script
" Version: 1.0.3 " Version: 1.0.4
" Last Change: 2016 Jul 5 " Last Change: 2016 Jul 6
" License: GPL-3.0 " License: ISC
if exists('b:did_indent') if exists('b:did_indent')
finish finish

View File

@@ -3,8 +3,8 @@ if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'emblem') == -1
" Language: emblem " Language: emblem
" Maintainer: Yulij Andreevich Lesov <yalesov@gmail.com> " Maintainer: Yulij Andreevich Lesov <yalesov@gmail.com>
" URL: http://github.com/yalesov/vim-emblem " URL: http://github.com/yalesov/vim-emblem
" Version: 2.0.0 " Version: 2.0.1
" Last Change: 2016 Jul 5 " Last Change: 2016 Jul 6
" License: GPL-3.0 " License: ISC
endif endif

View File

@@ -6,9 +6,9 @@ if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'erlang') == -1
" Contributors: Edwin Fine <efine145_nospam01 at usa dot net> " Contributors: Edwin Fine <efine145_nospam01 at usa dot net>
" Pawel 'kTT' Salata <rockplayer.pl@gmail.com> " Pawel 'kTT' Salata <rockplayer.pl@gmail.com>
" Ricardo Catalinas Jiménez <jimenezrick@gmail.com> " Ricardo Catalinas Jiménez <jimenezrick@gmail.com>
" Last Update: 2013-Jul-21 " Last Update: 2017-Feb-28
" License: Vim license " License: Vim license
" URL: https://github.com/hcs42/vim-erlang " URL: https://github.com/vim-erlang/vim-erlang-runtime
" Note About Usage: " Note About Usage:
" This indentation script works best with the Erlang syntax file created by " This indentation script works best with the Erlang syntax file created by
@@ -528,7 +528,9 @@ endfunction
" ok. % IsLineAtomContinuation = false " ok. % IsLineAtomContinuation = false
function! s:IsLineAtomContinuation(lnum) function! s:IsLineAtomContinuation(lnum)
if has('syntax_items') if has('syntax_items')
return synIDattr(synID(a:lnum, 1, 0), 'name') =~# '^erlangQuotedAtom' let syn_name = synIDattr(synID(a:lnum, 1, 0), 'name')
return syn_name =~# '^erlangQuotedAtom' ||
\ syn_name =~# '^erlangQuotedRecord'
else else
return 0 return 0
endif endif
@@ -682,7 +684,7 @@ function! s:BeginningOfClauseFound(stack, token, stored_vcol, lnum, i)
call s:Pop(a:stack) call s:Pop(a:stack)
if empty(a:stack) if empty(a:stack)
call s:Log(' Stack is ["when"], so LTI is in a guard -> return') call s:Log(' Stack is ["when"], so LTI is in a guard -> return')
return [1, a:stored_vcol + &sw + 2] return [1, a:stored_vcol + shiftwidth() + 2]
else else
return [1, s:UnexpectedToken(a:token, a:stack)] return [1, s:UnexpectedToken(a:token, a:stack)]
endif endif
@@ -691,7 +693,7 @@ function! s:BeginningOfClauseFound(stack, token, stored_vcol, lnum, i)
call s:Pop(a:stack) call s:Pop(a:stack)
if empty(a:stack) if empty(a:stack)
call s:Log(' Stack is ["->"], so LTI is in function body -> return') call s:Log(' Stack is ["->"], so LTI is in function body -> return')
return [1, a:stored_vcol + &sw] return [1, a:stored_vcol + shiftwidth()]
elseif a:stack[0] ==# ';' elseif a:stack[0] ==# ';'
call s:Pop(a:stack) call s:Pop(a:stack)
@@ -843,7 +845,7 @@ function! s:ErlangCalcIndent2(lnum, stack)
elseif token ==# 'begin' elseif token ==# 'begin'
let [ret, res] = s:BeginElementFound(stack, token, curr_vcol, let [ret, res] = s:BeginElementFound(stack, token, curr_vcol,
\stored_vcol, 'end', &sw) \stored_vcol, 'end', shiftwidth())
if ret | return res | endif if ret | return res | endif
" case EXPR of BRANCHES end " case EXPR of BRANCHES end
@@ -894,11 +896,11 @@ function! s:ErlangCalcIndent2(lnum, stack)
elseif stack == ['->'] elseif stack == ['->']
call s:Log(' LTI is in a branch after ' . call s:Log(' LTI is in a branch after ' .
\'"of/receive/after/if/catch" -> return') \'"of/receive/after/if/catch" -> return')
return stored_vcol + &sw return stored_vcol + shiftwidth()
elseif stack == ['when'] elseif stack == ['when']
call s:Log(' LTI is in a guard after ' . call s:Log(' LTI is in a guard after ' .
\'"of/receive/after/if/catch" -> return') \'"of/receive/after/if/catch" -> return')
return stored_vcol + &sw return stored_vcol + shiftwidth()
else else
return s:UnexpectedToken(token, stack) return s:UnexpectedToken(token, stack)
endif endif
@@ -934,7 +936,7 @@ function! s:ErlangCalcIndent2(lnum, stack)
if empty(stack) if empty(stack)
call s:Log(' LTI is in a condition; matching ' . call s:Log(' LTI is in a condition; matching ' .
\'"case/if/try/receive" found') \'"case/if/try/receive" found')
let stored_vcol = curr_vcol + &sw let stored_vcol = curr_vcol + shiftwidth()
elseif stack[0] ==# 'align_to_begin_element' elseif stack[0] ==# 'align_to_begin_element'
call s:Pop(stack) call s:Pop(stack)
let stored_vcol = curr_vcol let stored_vcol = curr_vcol
@@ -943,23 +945,23 @@ function! s:ErlangCalcIndent2(lnum, stack)
\'"case/if/try/receive" found') \'"case/if/try/receive" found')
call s:Pop(stack) call s:Pop(stack)
call s:Pop(stack) call s:Pop(stack)
let stored_vcol = curr_vcol + &sw let stored_vcol = curr_vcol + shiftwidth()
elseif stack[0] ==# '->' elseif stack[0] ==# '->'
call s:Log(' LTI is in a branch; matching ' . call s:Log(' LTI is in a branch; matching ' .
\'"case/if/try/receive" found') \'"case/if/try/receive" found')
call s:Pop(stack) call s:Pop(stack)
let stored_vcol = curr_vcol + 2 * &sw let stored_vcol = curr_vcol + 2 * shiftwidth()
elseif stack[0] ==# 'when' elseif stack[0] ==# 'when'
call s:Log(' LTI is in a guard; matching ' . call s:Log(' LTI is in a guard; matching ' .
\'"case/if/try/receive" found') \'"case/if/try/receive" found')
call s:Pop(stack) call s:Pop(stack)
let stored_vcol = curr_vcol + 2 * &sw + 2 let stored_vcol = curr_vcol + 2 * shiftwidth() + 2
endif endif
endif endif
let [ret, res] = s:BeginElementFound(stack, token, curr_vcol, let [ret, res] = s:BeginElementFound(stack, token, curr_vcol,
\stored_vcol, 'end', &sw) \stored_vcol, 'end', shiftwidth())
if ret | return res | endif if ret | return res | endif
elseif token ==# 'fun' elseif token ==# 'fun'
@@ -985,7 +987,7 @@ function! s:ErlangCalcIndent2(lnum, stack)
" stack = ['when'] => LTI is in a guard " stack = ['when'] => LTI is in a guard
if empty(stack) if empty(stack)
call s:Log(' LTI is in a condition; matching "fun" found') call s:Log(' LTI is in a condition; matching "fun" found')
let stored_vcol = curr_vcol + &sw let stored_vcol = curr_vcol + shiftwidth()
elseif len(stack) > 1 && stack[0] ==# '->' && stack[1] ==# ';' elseif len(stack) > 1 && stack[0] ==# '->' && stack[1] ==# ';'
call s:Log(' LTI is in a condition; matching "fun" found') call s:Log(' LTI is in a condition; matching "fun" found')
call s:Pop(stack) call s:Pop(stack)
@@ -993,15 +995,15 @@ function! s:ErlangCalcIndent2(lnum, stack)
elseif stack[0] ==# '->' elseif stack[0] ==# '->'
call s:Log(' LTI is in a branch; matching "fun" found') call s:Log(' LTI is in a branch; matching "fun" found')
call s:Pop(stack) call s:Pop(stack)
let stored_vcol = curr_vcol + 2 * &sw let stored_vcol = curr_vcol + 2 * shiftwidth()
elseif stack[0] ==# 'when' elseif stack[0] ==# 'when'
call s:Log(' LTI is in a guard; matching "fun" found') call s:Log(' LTI is in a guard; matching "fun" found')
call s:Pop(stack) call s:Pop(stack)
let stored_vcol = curr_vcol + 2 * &sw + 2 let stored_vcol = curr_vcol + 2 * shiftwidth() + 2
endif endif
let [ret, res] = s:BeginElementFound(stack, token, curr_vcol, let [ret, res] = s:BeginElementFound(stack, token, curr_vcol,
\stored_vcol, 'end', &sw) \stored_vcol, 'end', shiftwidth())
if ret | return res | endif if ret | return res | endif
else else
" Pass: we have a function reference (e.g. "fun f/0") " Pass: we have a function reference (e.g. "fun f/0")
@@ -1275,7 +1277,7 @@ function! s:ErlangCalcIndent2(lnum, stack)
" when A, " when A,
" LTI " LTI
let [ret, res] = s:BeginElementFoundIfEmpty(stack, token, curr_vcol, let [ret, res] = s:BeginElementFoundIfEmpty(stack, token, curr_vcol,
\stored_vcol, &sw) \stored_vcol, shiftwidth())
if ret | return res | endif if ret | return res | endif
else else
" Example: " Example:
@@ -1307,7 +1309,7 @@ function! s:ErlangCalcIndent2(lnum, stack)
" If LTI is between an 'after' and the corresponding " If LTI is between an 'after' and the corresponding
" 'end', then let's return " 'end', then let's return
let [ret, res] = s:BeginElementFoundIfEmpty(stack, token, curr_vcol, let [ret, res] = s:BeginElementFoundIfEmpty(stack, token, curr_vcol,
\stored_vcol, &sw) \stored_vcol, shiftwidth())
if ret | return res | endif if ret | return res | endif
endif endif

View File

@@ -43,6 +43,10 @@ if exists("*GetErubyIndent")
finish finish
endif endif
" this file uses line continuations
let s:cpo_sav = &cpo
set cpo&vim
function! GetErubyIndent(...) function! GetErubyIndent(...)
" The value of a single shift-width " The value of a single shift-width
if exists('*shiftwidth') if exists('*shiftwidth')
@@ -93,6 +97,7 @@ function! GetErubyIndent(...)
let ind = ind + sw let ind = ind + sw
endif endif
if line !~# '^\s*<%' && line =~# '%>\s*$' && line !~# '^\s*end\>' if line !~# '^\s*<%' && line =~# '%>\s*$' && line !~# '^\s*end\>'
\ && synID(v:lnum, match(cline, '\S') + 1, 1) != hlID('htmlEndTag')
let ind = ind - sw let ind = ind - sw
endif endif
if cline =~# '^\s*[-=]\=%>\s*$' if cline =~# '^\s*[-=]\=%>\s*$'
@@ -101,6 +106,9 @@ function! GetErubyIndent(...)
return ind return ind
endfunction endfunction
let &cpo = s:cpo_sav
unlet! s:cpo_sav
" vim:set sw=2 sts=2 ts=8 noet: " vim:set sw=2 sts=2 ts=8 noet:
endif endif

View File

@@ -32,13 +32,13 @@ function! GetGoHTMLTmplIndent(lnum)
" If need to indent based on last line " If need to indent based on last line
let last_line = getline(a:lnum-1) let last_line = getline(a:lnum-1)
if last_line =~ '^\s*{{\s*\%(if\|else\|range\|with\|define\|block\).*}}' if last_line =~ '^\s*{{-\=\s*\%(if\|else\|range\|with\|define\|block\).*}}'
let ind += sw let ind += sw
endif endif
" End of FuncMap block " End of FuncMap block
let current_line = getline(a:lnum) let current_line = getline(a:lnum)
if current_line =~ '^\s*{{\s*\%(else\|end\).*}}' if current_line =~ '^\s*{{-\=\s*\%(else\|end\).*}}'
let ind -= sw let ind -= sw
endif endif

View File

@@ -13,6 +13,14 @@ if exists('b:did_indent')
finish finish
endif endif
if !exists('g:haskell_indent_disable')
let g:haskell_indent_disable = 0
endif
if g:haskell_indent_disable != 0
finish
endif
let b:did_indent = 1 let b:did_indent = 1
if !exists('g:haskell_indent_if') if !exists('g:haskell_indent_if')
@@ -60,18 +68,35 @@ if !exists('g:haskell_indent_guard')
endif endif
setlocal indentexpr=GetHaskellIndent() setlocal indentexpr=GetHaskellIndent()
setlocal indentkeys=0{,0},0(,0),0[,0],!^F,o,O,0\=,0=where,0=let,0=deriving,0\,,<space> setlocal indentkeys=0},0),0],!^F,o,O,0\=,0=where,0=let,0=deriving,<space>
function! s:isInBlock(hlstack) function! s:isInBlock(hlstack)
return index(a:hlstack, 'haskellParens') > -1 || index(a:hlstack, 'haskellBrackets') > -1 || index(a:hlstack, 'haskellBlock') > -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
endfunction
function! s:stripComment(line)
if a:line =~ '^\s*--\(-*\s\+\|$\)'
return ''
else
let l:stripped = split(a:line, '-- ')
if len(l:stripped) > 1
return substitute(l:stripped[0], '\s*$', '', '')
else
return a:line
endif
endif
endfunction
function! s:isSYN(grp, line, col)
return index(s:getHLStack(a:line, a:col), a:grp) != -1
endfunction endfunction
function! s:getNesting(hlstack) function! s:getNesting(hlstack)
return filter(a:hlstack, 'v:val == "haskellBlock" || v:val == "haskellBrackets" || v:val == "haskellParens"') return filter(a:hlstack, 'v:val == "haskellBlock" || v:val == "haskellBrackets" || v:val == "haskellParens" || v:val == "haskellBlockComment" || v:val == "haskellPragma" ')
endfunction endfunction
function! s:getHLStack() function! s:getHLStack(line, col)
return map(synstack(line('.'), col('.')), 'synIDattr(v:val, "name")') return map(synstack(a:line, a:col), 'synIDattr(v:val, "name")')
endfunction endfunction
" indent matching character " indent matching character
@@ -110,14 +135,14 @@ function! s:indentGuard(pos, prevline)
endfunction endfunction
function! GetHaskellIndent() function! GetHaskellIndent()
let l:hlstack = s:getHLStack() let l:hlstack = s:getHLStack(line('.'), col('.'))
" do not indent in strings and quasiquotes " do not indent in strings and quasiquotes
if index(l:hlstack, 'haskellQuasiQuote') > -1 || index(l:hlstack, 'haskellBlockComment') > -1 if index(l:hlstack, 'haskellQuasiQuote') > -1 || index(l:hlstack, 'haskellBlockComment') > -1
return -1 return -1
endif endif
let l:prevline = getline(v:lnum - 1) let l:prevline = s:stripComment(getline(v:lnum - 1))
let l:line = getline(v:lnum) let l:line = getline(v:lnum)
" indent multiline strings " indent multiline strings
@@ -134,9 +159,43 @@ function! GetHaskellIndent()
return 0 return 0
endif endif
" comment indentation " " comment indentation
if l:prevline =~ '^\s*--' " if l:line =~ '^\s*--'
return match(l:prevline, '\S') " let l:s = match(l:prevline, '-- ')
" if l:s > -1
" endif
" " if l:prevline =~ '^\s*--'
" " return match(l:prevline, '\S')
" " endif
" { foo :: Int
" >>,
"
" |
" ...
" >>,
if l:line =~ '^\s*,'
if s:isInBlock(s:getHLStack(line('.'), col('.')))
normal! 0
call search(',', 'cW')
let l:n = s:getNesting(s:getHLStack(line('.'), col('.')))
call search('[([{]', 'bW')
let l:cl = line('.')
let l:cc = col('.')
while l:n != s:getNesting(s:getHLStack(l:cl, l:cc)) || s:isSYN('haskellString', l:cl, l:cc) || s:isSYN('haskellChar', l:cl, l:cc)
call search('[([{]', 'bW')
let l:cl = line('.')
let l:cc = col('.')
endwhile
return l:cc - 1
else
let l:s = s:indentGuard(match(l:line, ','), l:prevline)
if l:s > -1
return l:s
end
endif
endif endif
" operator at end of previous line " operator at end of previous line
@@ -166,11 +225,20 @@ function! GetHaskellIndent()
" >>>>y = 2 " >>>>y = 2
if l:prevline =~ '\C\<let\>\s\+.\+$' if l:prevline =~ '\C\<let\>\s\+.\+$'
if l:line =~ '\C^\s*\<let\>' if l:line =~ '\C^\s*\<let\>'
return match(l:prevline, '\C\<let\>') let l:s = match(l:prevline, '\C\<let\>')
if s:isSYN('haskellLet', v:lnum - 1, l:s + 1)
return l:s
endif
elseif l:line =~ '\C^\s*\<in\>' elseif l:line =~ '\C^\s*\<in\>'
return match(l:prevline, '\C\<let\>') + g:haskell_indent_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
else else
return match(l:prevline, '\C\<let\>') + g:haskell_indent_let 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
endif
endif endif
endif endif
@@ -199,26 +267,36 @@ function! GetHaskellIndent()
return match(l:prevline, '\S') + &shiftwidth return match(l:prevline, '\S') + &shiftwidth
endif endif
" do foo
" >>>bar
if l:prevline =~ '\C\<do\>\s\+\S\+.*$'
let l:s = match(l:prevline, '\C\<do\>')
if s:isSYN('haskellKeyword', v:lnum - 1, l:s + 1)
return l:s + g:haskell_indent_do
endif
endif
" case foo of
" >>bar -> quux
if l:prevline =~ '\C\<case\>.\+\<of\>\s*$'
if exists('g:haskell_indent_case_alternative') && g:haskell_indent_case_alternative
return match(l:prevline, '\S') + &shiftwidth
else
return match(l:prevline, '\C\<case\>') + g:haskell_indent_case
endif
endif
"" where foo "" where foo
"" >>>>>>bar "" >>>>>>bar
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, ':: ')
else else
return match(l:prevline, '\C\<where\>') + g:haskell_indent_where 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
endif endif
endif endif
" do foo
" >>>bar
if l:prevline =~ '\C\<do\>\s\+\S\+.*$'
return match(l:prevline, '\C\<do\>') + g:haskell_indent_do
endif
" case foo of
" >>bar -> quux
if l:prevline =~ '\C\<case\>.\+\<of\>\s*$'
return match(l:prevline, '\C\<case\>') + g:haskell_indent_case
endif endif
" newtype Foo = Foo " newtype Foo = Foo
@@ -259,8 +337,8 @@ function! GetHaskellIndent()
while v:lnum != l:c while v:lnum != l:c
" fun decl " fun decl
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)
if l:s >= 0
if match(l:l, '\C^\s*\<default\>') > -1 if match(l:l, '\C^\s*\<default\>') > -1
return l:s - 8 return l:s - 8
else else
@@ -316,7 +394,7 @@ function! GetHaskellIndent()
" foo " foo
" >>{ " >>{
if l:line =~ '^\s*{' && l:prevline !~ '^{' if l:line =~ '^\s*{ '
let l:s = match(l:prevline, '\S') let l:s = match(l:prevline, '\S')
if l:s >= 0 if l:s >= 0
return l:s + &shiftwidth return l:s + &shiftwidth
@@ -362,32 +440,6 @@ function! GetHaskellIndent()
endif endif
endif endif
" { foo :: Int
" >>,
"
" |
" ...
" >>,
if l:line =~ '^\s*,'
if s:isInBlock(l:hlstack)
normal! 0
call search(',', 'cW')
let l:n = s:getNesting(s:getHLStack())
call search('[(\[{]', 'bW')
while l:n != s:getNesting(s:getHLStack())
call search('[(\[{]', 'bW')
endwhile
return col('.') - 1
else
let l:s = s:indentGuard(match(l:line, ','), l:prevline)
if l:s > -1
return l:s
end
endif
endif
" | " |
" ... " ...
" >>| " >>|
@@ -423,22 +475,8 @@ function! GetHaskellIndent()
if l:line =~ '^\s*]' if l:line =~ '^\s*]'
return s:indentMatching(']') return s:indentMatching(']')
endif endif
"
" indent import
if l:line =~ '\C^\s*import'
return 0
endif
" do not reindent indented lines
if match(l:prevline, '\S') < match(l:line, '\S')
return -1 return -1
endif
if l:line !~ '^\s*[=-]>\s' && l:line =~ '^\s*[!#$%&*+./<>?@\\^|~-]\+'
return -1
endif
return match(l:prevline, '\S')
endfunction endfunction
endif endif

View File

@@ -42,6 +42,7 @@ setlocal indentkeys=o,O,*<Return>,<>>,{,},!^F
let s:tags = [] let s:tags = []
let s:no_tags = []
" [-- <ELEMENT ? - - ...> --] " [-- <ELEMENT ? - - ...> --]
call add(s:tags, 'a') call add(s:tags, 'a')
@@ -165,6 +166,44 @@ call add(s:tags, 'text')
call add(s:tags, 'textPath') call add(s:tags, 'textPath')
call add(s:tags, 'tref') call add(s:tags, 'tref')
call add(s:tags, 'tspan') call add(s:tags, 'tspan')
" Common self closing SVG elements
call add(s:no_tags, 'animate')
call add(s:no_tags, 'animateTransform')
call add(s:no_tags, 'circle')
call add(s:no_tags, 'ellipse')
call add(s:no_tags, 'feBlend')
call add(s:no_tags, 'feColorMatrix')
call add(s:no_tags, 'feComposite')
call add(s:no_tags, 'feConvolveMatrix')
call add(s:no_tags, 'feDisplacementMap')
call add(s:no_tags, 'feFlood')
call add(s:no_tags, 'feFuncR')
call add(s:no_tags, 'feFuncG')
call add(s:no_tags, 'feFuncB')
call add(s:no_tags, 'feFuncA')
call add(s:no_tags, 'feGaussianBlur')
call add(s:no_tags, 'feImage')
call add(s:no_tags, 'feMergeNode')
call add(s:no_tags, 'feMorphology')
call add(s:no_tags, 'feOffset')
call add(s:no_tags, 'fePointLight')
call add(s:no_tags, 'feSpotLight')
call add(s:no_tags, 'feTile')
call add(s:no_tags, 'feTurbulence')
call add(s:no_tags, 'hatchpath')
call add(s:no_tags, 'hkern')
call add(s:no_tags, 'image')
call add(s:no_tags, 'line')
call add(s:no_tags, 'mpath')
call add(s:no_tags, 'polygon')
call add(s:no_tags, 'polyline')
call add(s:no_tags, 'path')
call add(s:no_tags, 'rect')
call add(s:no_tags, 'solidColor')
call add(s:no_tags, 'stop')
call add(s:no_tags, 'use')
call add(s:no_tags, 'view')
call add(s:no_tags, 'vkern')
call add(s:tags, 'html') call add(s:tags, 'html')
call add(s:tags, 'head') call add(s:tags, 'head')
@@ -177,8 +216,6 @@ call add(s:tags, 'tr')
call add(s:tags, 'th') call add(s:tags, 'th')
call add(s:tags, 'td') call add(s:tags, 'td')
let s:no_tags = []
call add(s:no_tags, 'base') call add(s:no_tags, 'base')
call add(s:no_tags, 'link') call add(s:no_tags, 'link')
call add(s:no_tags, 'meta') call add(s:no_tags, 'meta')

View File

@@ -2,27 +2,29 @@ if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'javascript') ==
" Vim indent file " Vim indent file
" Language: Javascript " Language: Javascript
" Acknowledgement: Based off of vim-ruby maintained by Nikolai Weibull http://vim-ruby.rubyforge.org " Maintainer: Chris Paul ( https://github.com/bounceme )
" URL: https://github.com/pangloss/vim-javascript
" 0. Initialization {{{1 " Last Change: March 9, 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')
finish finish
endif endif
let b:did_indent = 1 let b:did_indent = 1
setlocal nosmartindent
" Now, set up our indentation expression and keys that trigger it. " Now, set up our indentation expression and keys that trigger it.
setlocal indentexpr=GetJavascriptIndent() setlocal indentexpr=GetJavascriptIndent()
setlocal formatexpr=Fixedgq(v:lnum,v:count) setlocal autoindent nolisp nosmartindent
setlocal indentkeys=0{,0},0),0],0\,*<Return>,:,!^F,o,O,e setlocal indentkeys+=0],0)
setlocal cinoptions+=j1,J1,c1 " Testable with something like:
" vim -eNs "+filetype plugin indent on" "+syntax on" "+set ft=javascript" \
" "+norm! gg=G" '+%print' '+:q!' testfile.js \
" | diff -uBZ testfile.js -
let b:undo_indent = 'setlocal indentexpr< smartindent< autoindent< indentkeys<'
" Only define the function once. " Only define the function once.
if exists("*GetJavascriptIndent") if exists('*GetJavascriptIndent')
finish finish
endif endif
@@ -31,536 +33,349 @@ set cpo&vim
" Get shiftwidth value " Get shiftwidth value
if exists('*shiftwidth') if exists('*shiftwidth')
func s:sw() function s:sw()
return shiftwidth() return shiftwidth()
endfunc endfunction
else else
func s:sw() function s:sw()
return &sw return &l:shiftwidth == 0 ? &l:tabstop : &l:shiftwidth
endfunc endfunction
endif endif
" 1. Variables {{{1 " Performance for forwards search(): start search at pos rather than masking
" ============ " matches before pos.
let s:z = has('patch-7.4.984') ? 'z' : ''
" searchpair() wrapper
if has('reltime')
function s:GetPair(start,end,flags,skip,time,...)
return searchpair('\m'.a:start,'','\m'.a:end,a:flags,a:skip,max([prevnonblank(v:lnum) - 2000,0] + a:000),a:time)
endfunction
else
function s:GetPair(start,end,flags,skip,...)
return searchpair('\m'.a:start,'','\m'.a:end,a:flags,a:skip,max([prevnonblank(v:lnum) - 1000,get(a:000,1)]))
endfunction
endif
let s:line_pre = '^\s*\%(\/\*.*\*\/\s*\)*'
let s:js_keywords = s:line_pre . '\%(break\|import\|export\|catch\|const\|continue\|debugger\|delete\|do\|else\|finally\|for\|function\|if\|in\|instanceof\|let\|new\|return\|switch\|this\|throw\|try\|typeof\|var\|void\|while\|with\)\>\C'
let s:expr_case = s:line_pre . '\%(\%(case\>.*\)\|default\)\s*:\C'
" Regex of syntax group names that are or delimit string or are comments. " Regex of syntax group names that are or delimit string or are comments.
let s:syng_strcom = '\%(string\|regex\|special\|doc\|comment\|template\)\c' let s:syng_strcom = 'string\|comment\|regex\|special\|doc\|template\%(braces\)\@!'
let s:syng_str = 'string\|template\|special'
" Regex of syntax group names that are strings. let s:syng_com = 'comment\|doc'
let s:syng_string = 'regex\c'
" Regex of syntax group names that are strings or documentation.
let s:syng_comment = '\%(comment\|doc\)\c'
" Expression used to check whether we should skip a match with searchpair(). " Expression used to check whether we should skip a match with searchpair().
let s:skip_expr = "synIDattr(synID(line('.'),col('.'),1),'name') =~ '".s:syng_strcom."'" let s:skip_expr = "synIDattr(synID(line('.'),col('.'),0),'name') =~? '".s:syng_strcom."'"
func s:lookForParens(start,end,flags,stop) function s:parse_cino(f) abort
try return float2nr(eval(substitute(substitute(join(split(
return searchpair(a:start,'',a:end,a:flags,s:skip_expr,a:stop,300) \ matchstr(&cino,'\C.*'.a:f.'\zs[^,]*'), 's',1), '*'.s:W)
catch /E118/ \ , '^-\=\zs\*','',''), '^-\=\zs\.','0.','')))
return searchpair(a:start,'',a:end,a:flags,0,a:stop) endfunction
endtry
endfunc
let s:line_term = '\s*\%(\%(\/\/.*\)\=\|\%(\/\*.*\*\/\s*\)*\)$' function s:skip_func()
if getline('.') =~ '\%<'.col('.').'c\/.\{-}\/\|\%>'.col('.').'c[''"]\|\\$'
return eval(s:skip_expr)
elseif s:checkIn || search('\m`\|\${\|\*\/','nW'.s:z,s:looksyn)
let s:checkIn = eval(s:skip_expr)
endif
let s:looksyn = line('.')
return s:checkIn
endfunction
" Regex that defines continuation lines, not including (, {, or [. function s:alternatePair(stop)
let s:continuation_regex = '\%([*.?:]\|+\@<!+\|-\@<!-\|\*\@<!\/\|=\|||\|&&\)' . s:line_term let pos = getpos('.')[1:2]
let pat = '[][(){};]'
let s:one_line_scope_regex = '\%(\<else\>\|=>\)\C' . s:line_term while search('\m'.pat,'bW',a:stop)
if s:skip_func() | continue | endif
function s:Onescope(lnum) let idx = stridx('])};',s:looking_at())
if getline(a:lnum) =~ s:one_line_scope_regex if idx is 3 | let pat = '[{}()]' | continue | endif
return 1 if idx + 1
end if s:GetPair(['\[','(','{'][idx], '])}'[idx],'bW','s:skip_func()',2000,a:stop) <= 0
let mypos = col('.') break
call cursor(a:lnum, 1) endif
if search('.*\zs\<\%(while\|for\|if\)\>\s*(\C', 'ce', a:lnum) > 0 &&
\ s:lookForParens('(', ')', 'W', a:lnum) > 0 &&
\ col('.') == strlen(s:RemoveTrailingComments(getline(a:lnum)))
call cursor(a:lnum, mypos)
return 1
else else
call cursor(a:lnum, mypos) return
return 0
end
endfunction
" Regex that defines blocks.
let s:block_regex = '[{([]' . s:line_term
let s:operator_first = s:line_pre . '\%([,:?]\|\([-/.+*]\)\%(\1\|\*\|\/\)\@!\|||\|&&\)'
let s:var_stmt = s:line_pre . '\%(const\|let\|var\)\s\+\C'
let s:comma_last = ',' . s:line_term
" 2. Auxiliary Functions {{{1
" ======================
" Check if the character at lnum:col is inside a string, comment, or is ascii.
function s:IsInStringOrComment(lnum, col)
return synIDattr(synID(a:lnum, a:col, 1), 'name') =~ s:syng_strcom
endfunction
" Check if the character at lnum:col is inside a string.
function s:IsInString(lnum, col)
return synIDattr(synID(a:lnum, a:col, 1), 'name') =~ s:syng_string
endfunction
" Check if the character at lnum:col is inside a multi-line comment.
function s:IsInComment(lnum, col)
return synIDattr(synID(a:lnum, a:col, 1), 'name') =~ s:syng_comment
endfunction
" Find line above 'lnum' that isn't empty, in a comment, or in a string.
function s:PrevNonBlankNonString(lnum)
let lnum = prevnonblank(a:lnum)
while lnum > 0
let line = getline(lnum)
let com = match(line, '\%(\/\*.*\)\@<!\*\/') + 1
if s:IsInComment(lnum, com)
call cursor(lnum, com)
let parlnum = search('\%(\/\/.*\)\@<!\/\*', 'nbW')
if parlnum > 0
let lnum = parlnum
end
elseif line !~ '^' . s:line_term && !s:IsInStringOrComment(lnum,1)
break
endif endif
let lnum = prevnonblank(lnum - 1)
endwhile endwhile
return lnum call call('cursor',pos)
endfunction endfunction
" Find line above 'lnum' that started the continuation 'lnum' may be part of. function s:save_pos(f,...)
function s:GetMSL(lnum, in_one_line_scope) let l:pos = getpos('.')[1:2]
" Start on the line we're at and use its indent. let ret = call(a:f,a:000)
let msl = a:lnum call call('cursor',l:pos)
let lnum = s:PrevNonBlankNonString(a:lnum - 1) return ret
while lnum > 0 && !s:Match(msl,s:line_pre . '[])}]') endfunction
" If we have a continuation line, or we're in a string, use line as MSL.
" Otherwise, terminate search as we have found our MSL already.
let line = getline(lnum)
let line2 = getline(msl)
if ((s:Match(lnum,s:continuation_regex) || s:Match(lnum, s:comma_last)) &&
\ !s:Match(lnum, s:expr_case)) || s:IsInString(lnum, strlen(line))
let msl = lnum
if s:Match(lnum, s:line_pre . '[]})]') && !a:in_one_line_scope
call cursor(lnum,1)
let parlnum = s:lookForParens('(\|{\|\[', ')\|}\|\]', 'nbW', 0)
if parlnum > 0
let lnum = parlnum
continue
end
end
function s:syn_at(l,c)
return synIDattr(synID(a:l,a:c,0),'name')
endfunction
function s:looking_at()
return getline('.')[col('.')-1]
endfunction
function s:token()
return s:looking_at() =~ '\k' ? expand('<cword>') : s:looking_at()
endfunction
function s:previous_token()
let l:pos = getpos('.')[1:2]
if search('\m\k\{1,}\|\S','ebW')
if (getline('.')[col('.')-2:col('.')-1] == '*/' || line('.') != l:pos[0] &&
\ getline('.') =~ '\%<'.col('.').'c\/\/') && s:syn_at(line('.'),col('.')) =~? s:syng_com
while search('\m\S\ze\_s*\/[/*]','bW')
if s:syn_at(line('.'),col('.')) !~? s:syng_com
return s:token()
endif
endwhile
else else
return s:token()
endif
endif
call call('cursor',l:pos)
return ''
endfunction
" Don't use lines that are part of a one line scope as msl unless the function s:expr_col()
" flag in_one_line_scope is set to 1 if getline('.')[col('.')-2] == ':'
" return 1
if a:in_one_line_scope endif
break let bal = 0
end while search('\m[{}?:;]','bW')
let msl_one_line = s:Onescope(lnum) if eval(s:skip_expr) | continue | endif
if msl_one_line == 0 " switch (looking_at())
exe { '}': "if s:GetPair('{','}','bW',s:skip_expr,200) <= 0 | return | endif",
\ ';': "return",
\ '{': "return getpos('.')[1:2] != b:js_cache[1:] && !s:IsBlock()",
\ ':': "let bal -= getline('.')[max([col('.')-2,0]):col('.')] !~ '::'",
\ '?': "let bal += 1 | if bal > 0 | return 1 | endif" }[s:looking_at()]
endwhile
endfunction
" configurable regexes that define continuation lines, not including (, {, or [.
let s:opfirst = '^' . get(g:,'javascript_opfirst',
\ '\C\%([<>=,?^%|*/&]\|\([-.:+]\)\1\@!\|!=\|in\%(stanceof\)\=\>\)')
let s:continuation = get(g:,'javascript_continuation',
\ '\C\%([-+<>=,.~!?/*^%|&:]\|\<\%(typeof\|new\|delete\|void\|in\|instanceof\|await\)\)') . '$'
function s:continues(ln,con)
if !cursor(a:ln, match(' '.a:con,s:continuation))
let teol = s:looking_at()
if teol == '/'
return s:syn_at(line('.'),col('.')) !~? 'regex'
elseif teol =~ '[-+>]'
return getline('.')[col('.')-2] != tr(teol,'>','=')
elseif teol =~ '\l'
return s:previous_token() != '.'
elseif teol == ':'
return s:expr_col()
endif
return 1
endif
endfunction
" get the line of code stripped of comments and move cursor to the last
" non-comment char.
function s:Trim(ln)
let pline = substitute(getline(a:ln),'\s*$','','')
let l:max = max([strridx(pline,'//'), strridx(pline,'/*')])
while l:max != -1 && s:syn_at(a:ln, strlen(pline)) =~? s:syng_com
let pline = pline[: l:max]
let l:max = max([strridx(pline,'//'), strridx(pline,'/*')])
let pline = substitute(pline[:-2],'\s*$','','')
endwhile
return pline is '' || cursor(a:ln,strlen(pline)) ? pline : pline
endfunction
" Find line above 'lnum' that isn't empty or in a comment
function s:PrevCodeLine(lnum)
let [l:pos, l:n] = [getpos('.')[1:2], prevnonblank(a:lnum)]
while l:n
if getline(l:n) =~ '^\s*\/[/*]'
let l:n = prevnonblank(l:n-1)
elseif stridx(getline(l:n), '*/') + 1 && s:syn_at(l:n,1) =~? s:syng_com
call cursor(l:n,1)
keepjumps norm! [*
let l:n = search('\m\S','nbW')
else
break break
endif endif
end
let lnum = s:PrevNonBlankNonString(lnum - 1)
endwhile endwhile
return msl call call('cursor',l:pos)
return l:n
endfunction endfunction
function s:RemoveTrailingComments(content) " Check if line 'lnum' has a balanced amount of parentheses.
let single = '\/\/\%(.*\)\s*$' function s:Balanced(lnum)
let multi = '\/\*\%(.*\)\*\/\s*$' let l:open = 0
return substitute(substitute(substitute(a:content, single, '', ''), multi, '', ''), '\s\+$', '', '') let l:line = getline(a:lnum)
endfunction let pos = match(l:line, '[][(){}]', 0)
" Find if the string is inside var statement (but not the first string)
function s:InMultiVarStatement(lnum, cont, prev)
let lnum = s:PrevNonBlankNonString(a:lnum - 1)
let cont = a:cont
let prev = a:prev
" let type = synIDattr(synID(lnum, indent(lnum) + 1, 0), 'name')
" loop through previous expressions to find a var statement
while lnum > 0 && (s:Match(lnum, s:comma_last) ||(cont && getline(lnum) =~ s:line_pre . '[]})]') ||
\ s:Match(lnum,s:continuation_regex)) || (prev && (s:Match(prev, s:comma_last) ||
\ s:Match(prev,s:continuation_regex)))
" if the line is a js keyword
if cont
let cont = 0
call cursor(lnum,1)
let parlnum = s:lookForParens('(\|{\|\[', ')\|}\|\]', 'nbW', 0)
if parlnum > 0
let lnum = parlnum
end
end
if s:Match(lnum, s:js_keywords)
" check if the line is a var stmt
" if the line has a comma first or comma last then we can assume that we
" are in a multiple var statement
if s:Match(lnum, s:var_stmt) && (s:Match(lnum, s:comma_last)||s:Match(lnum,s:continuation_regex))
return lnum
endif
" other js keywords, not a var
if !s:Match(lnum, s:comma_last)||!s:Match(lnum,s:continuation_regex)
return 0
end
endif
let lnum = s:PrevNonBlankNonString(lnum - 1)
let prev = prev && lnum > 0 ? prev : 0
endwhile
" beginning of program, not a var
return 0
endfunction
" Check if line 'lnum' has more opening brackets than closing ones.
function s:LineHasOpeningBrackets(lnum)
let open_0 = 0
let open_2 = 0
let open_4 = 0
let line = getline(a:lnum)
let pos = match(line, '[][(){}]', 0)
while pos != -1 while pos != -1
if !s:IsInStringOrComment(a:lnum, pos + 1) if s:syn_at(a:lnum,pos + 1) !~? s:syng_strcom
let idx = stridx('(){}[]', line[pos]) let l:open += match(' ' . l:line[pos],'[[({]')
if idx % 2 == 0 if l:open < 0
let open_{idx} = open_{idx} + 1 return
else
let open_{idx - 1} = open_{idx - 1} - 1
endif endif
endif endif
let pos = match(line, '[][(){}]', pos + 1) let pos = match(l:line, (l:open ?
\ '['.matchstr(['][','()','{}'],l:line[pos]).']' :
\ '[][(){}]'), pos + 1)
endwhile endwhile
return (open_0 > 0 ? 1 : (open_0 == 0 ? 0 : 2)) . (open_2 > 0 ? 1 : (open_2 == 0 ? 0 : 2)) . (open_4 > 0 ? 1 : (open_4 == 0 ? 0 : 2)) return !l:open
endfunction endfunction
function s:Match(lnum, regex) function s:OneScope(lnum)
let col = match(getline(a:lnum), a:regex) + 1 let pline = s:Trim(a:lnum)
return col > 0 && !s:IsInStringOrComment(a:lnum, col) ? col : 0 let kw = 'else do'
endfunction if pline[-1:] == ')' && s:GetPair('(', ')', 'bW', s:skip_expr, 100) > 0
if s:previous_token() =~# '^\%(await\|each\)$'
function s:IndentWithContinuation(lnum, ind, width) call s:previous_token()
" Set up variables to use and search for MSL to the previous line. let kw = 'for'
let p_lnum = a:lnum
let lnum = s:GetMSL(a:lnum, 1)
let line = getline(lnum)
" If the previous line wasn't a MSL and is continuation return its indent.
" TODO: the || s:IsInString() thing worries me a bit.
if p_lnum != lnum
if s:Match(p_lnum,s:continuation_regex)||s:IsInString(p_lnum,strlen(line))
return a:ind
endif
endif
" Set up more variables now that we know we aren't continuation bound.
let msl_ind = indent(lnum)
" If the previous line ended with [*+/.-=], start a continuation that
" indents an extra level.
if s:Match(lnum, s:continuation_regex)
if lnum == p_lnum
return msl_ind + a:width
else else
return msl_ind let kw = 'for if let while with'
end
elseif s:InMultiVarStatement(p_lnum, 0, s:PrevNonBlankNonString(p_lnum - 1))
return indent(p_lnum) - s:sw()
endif endif
endif
return a:ind return pline[-2:] == '=>' || index(split(kw),s:token()) + 1 &&
\ s:save_pos('s:previous_token') != '.'
endfunction endfunction
function s:InOneLineScope(lnum) " returns braceless levels started by 'i' and above lines * &sw. 'num' is the
let msl = s:GetMSL(a:lnum, 1) " lineNr which encloses the entire context, 'cont' if whether line 'i' + 1 is
if msl > 0 && s:Onescope(msl) " a continued expression, which could have started in a braceless context
return msl function s:iscontOne(i,num,cont)
let [l:i, l:num, bL] = [a:i, a:num + !a:num, 0]
let pind = a:num ? indent(l:num) + s:W : 0
let ind = indent(l:i) + (a:cont ? 0 : s:W)
while l:i >= l:num && (ind > pind || l:i == l:num)
if indent(l:i) < ind && s:OneScope(l:i)
let bL += s:W
let l:i = line('.')
elseif !a:cont || bL || ind < indent(a:i)
break
endif endif
return 0 let ind = min([ind, indent(l:i)])
let l:i = s:PrevCodeLine(l:i - 1)
endwhile
return bL
endfunction endfunction
function s:ExitingOneLineScope(lnum) " https://github.com/sweet-js/sweet.js/wiki/design#give-lookbehind-to-the-reader
let msl = s:GetMSL(a:lnum, 1) function s:IsBlock()
if msl > 0 if s:looking_at() == '{'
" if the current line is in a one line scope .. let l:n = line('.')
if s:Onescope(msl) let char = s:previous_token()
return 0 if match(s:stack,'\cxml\|jsx') + 1 && s:syn_at(line('.'),col('.')-1) =~? 'xml\|jsx'
else return char != '{'
let prev_msl = s:GetMSL(msl - 1, 1) elseif char =~ '\k'
if s:Onescope(prev_msl) if char ==# 'type'
return prev_msl return s:previous_token() !~# '^\%(im\|ex\)port$'
endif endif
return index(split('return const let import export extends yield default delete var await void typeof throw case new of in instanceof')
\ ,char) < (line('.') != l:n) || s:save_pos('s:previous_token') == '.'
elseif char == '>'
return getline('.')[col('.')-2] == '=' || s:syn_at(line('.'),col('.')) =~? '^jsflow'
elseif char == ':'
return !s:save_pos('s:expr_col')
elseif char == '/'
return s:syn_at(line('.'),col('.')) =~? 'regex'
endif endif
return char !~ '[=~!<*,?^%|&([]' &&
\ (char !~ '[-+]' || l:n != line('.') && getline('.')[col('.')-2] == char)
endif endif
return 0
endfunction endfunction
" 3. GetJavascriptIndent Function {{{1
" =========================
function GetJavascriptIndent() function GetJavascriptIndent()
" 3.1. Setup {{{1 let b:js_cache = get(b:,'js_cache',[0,0,0])
" ----------
" Set up variables for restoring position in file. Could use v:lnum here.
" Avoid use of line('.')/col('.') type functions as the curpos can change
let vcol = col('.')
" 3.2. Work on the current line {{{1
" -----------------------------
let ind = -1
" Get the current line. " Get the current line.
let line = getline(v:lnum) call cursor(v:lnum,1)
" previous nonblank line number let l:line = getline('.')
let prevline = prevnonblank(v:lnum - 1) " use synstack as it validates syn state and works in an empty line
" previous line of code let s:stack = map(synstack(v:lnum,1),"synIDattr(v:val,'name')")
let lnum = s:PrevNonBlankNonString(v:lnum - 1) let syns = get(s:stack,-1,'')
" to not change multiline string values " start with strings,comments,etc.
if line !~ '^[''"`]' && synIDattr(synID(v:lnum, 1, 1), 'name') =~? 'string\|template' if syns =~? s:syng_com
if l:line =~ '^\s*\*'
return cindent(v:lnum)
elseif l:line !~ '^\s*\/[/*]'
return -1 return -1
endif endif
elseif syns =~? s:syng_str
" If we are in a multi-line comment, cindent does the right thing. if b:js_cache[0] == v:lnum - 1 && s:Balanced(v:lnum-1)
if line !~ '^\%(\/\*\|\s*\/\/\)' && s:IsInComment(v:lnum, 1) let b:js_cache[0] = v:lnum
return cindent(v:lnum) endif
return -1
endif
let l:lnum = s:PrevCodeLine(v:lnum - 1)
if !l:lnum
return
endif endif
" single opening bracket will assume you want a c style of indenting let l:line = substitute(l:line,'^\s*','','')
if line =~ s:line_pre . '{' && !s:Match(lnum,s:block_regex) && if l:line[:1] == '/*'
\ !s:Match(lnum,s:comma_last) let l:line = substitute(l:line,'^\%(\/\*.\{-}\*\/\s*\)*','','')
return cindent(v:lnum) endif
if l:line =~ '^\/[/*]'
let l:line = ''
endif endif
" cindent each line which has a switch label " the containing paren, bracket, or curly. Many hacks for performance
if (line =~ s:expr_case) let idx = index([']',')','}'],l:line[0])
let s:cpo_switch = &cpo if b:js_cache[0] >= l:lnum && b:js_cache[0] < v:lnum &&
set cpo+=% \ (b:js_cache[0] > l:lnum || s:Balanced(l:lnum))
let ind = cindent(v:lnum) call call('cursor',b:js_cache[1:])
let &cpo = s:cpo_switch
return ind
endif
" If we got a closing bracket on an empty line, find its match and indent
" according to it.
let col = line =~ s:line_pre . '[]})]'
if col > 0
let parlnum = v:lnum
while col
call cursor(parlnum, 1)
let parlnum = s:lookForParens('(\|{\|\[', ')\|}\|\]', 'nbW', 0)
let col = s:Match(parlnum, s:line_pre . '[]})]')
if col
continue
end
if parlnum > 0
let ind = s:InMultiVarStatement(parlnum, 0, 0)|| s:LineHasOpeningBrackets(parlnum) !~ '2' ?
\ indent(parlnum) : indent(s:GetMSL(parlnum, 0))
endif
endwhile
return ind
endif
" If line starts with an operator...
if (line =~ s:operator_first)
if (s:Match(lnum, s:operator_first) || (s:Match(lnum, s:line_pre . '[])}]') &&
\ !(s:Match(v:lnum,s:line_pre . '\.') && s:Match(lnum, ')' . s:line_term))))
" and so does previous line, don't indent
return indent(lnum)
end
let counts = s:LineHasOpeningBrackets(lnum)
if counts =~ '2'
call cursor(lnum, 1)
" Search for the opening tag
let parlnum = s:lookForParens('(\|{\|\[', ')\|}\|\]', 'nbW', 0)
if parlnum > 0
return !s:Match(parlnum, s:operator_first) &&
\ synIDattr(synID(v:lnum, 1, 1), 'name') !~? 'jsbracket\|jsparen\|jsobject' ?
\ indent(lnum) + s:sw() : indent(parlnum)
end
elseif synIDattr(synID(v:lnum, 1, 1), 'name') !~? 'jsbracket\|jsparen\|jsobject'
" otherwise, if not in an key/val;array item;param, indent 1 level
return indent(lnum) + s:sw()
end
" If previous line starts with an operator...
elseif (s:Match(lnum, s:operator_first) && !s:Match(lnum,s:continuation_regex)) ||
\ getline(lnum) =~ '[]})];\=' . s:line_term
let counts = s:LineHasOpeningBrackets(lnum)
if counts =~ '2' && !s:Match(lnum, s:operator_first)
call cursor(lnum, 1)
" Search for the opening tag
let mnum = s:lookForParens('(\|{\|\[', ')\|}\|\]', 'nbW', 0)
if mnum > 0 && (s:Match(mnum, s:operator_first) ||
\ (s:Onescope(s:PrevNonBlankNonString(mnum - 1))) && !s:Match(mnum, s:line_pre . '{'))
return indent(mnum) - s:sw()
end
elseif s:Match(lnum, s:operator_first)
if counts !~ '1'
return indent(lnum) - s:sw()
end
end
end
" 3.3. Work on the previous line. {{{1
" -------------------------------
" If the line is empty and the previous nonblank line was a multi-line
" comment, use that comment's indent. Deduct one char to account for the
" space in ' */'.
if line =~ '^\s*$' && getline(prevline) =~ '\%(\%(^\s*\/\/\|\/\*\).*\)\@<!\*\/' &&
\ s:IsInComment(prevline, 1)
return indent(prevline) - 1
endif
" Find a non-blank, non-multi-line string line above the current line.
" If the line is empty and inside a string, use the previous line.
if line =~ '^\s*$' && lnum != prevline
return indent(prevnonblank(v:lnum))
endif
" At the start of the file use zero indent.
if lnum == 0
return 0
endif
" If the previous line ended with a block opening, add a level of indent.
if s:Match(lnum, s:block_regex)
return s:InMultiVarStatement(lnum, 0, 0) || s:LineHasOpeningBrackets(lnum) !~ '2' ?
\ indent(lnum) + s:sw() : indent(s:GetMSL(lnum, 0)) + s:sw()
endif
" Set up variables for current line.
let line = getline(lnum)
let ind = indent(lnum)
" If the previous line contained an opening bracket, and we are still in it,
" add indent depending on the bracket type.
if s:Match(lnum, '[[({})\]]')
let counts = s:LineHasOpeningBrackets(lnum)
if counts =~ '2'
call cursor(lnum,matchend(s:RemoveTrailingComments(line), '.*\zs[])}]'))
while s:lookForParens('(\|{\|\[', ')\|}\|\]', 'bW', 0) == lnum
call cursor(lnum, matchend(s:RemoveTrailingComments(strpart(line,0,col('.'))), '.*\zs[])}]'))
endwhile
let cur = line('.')
if cur < lnum && !s:InMultiVarStatement(cur,0,0)
return indent(s:GetMSL(cur, 0))
end
elseif counts =~ '1' || s:Onescope(lnum)
return ind + s:sw()
end
end
" 3.4. Work on the MSL line. {{{1
" --------------------------
if s:Match(lnum, s:comma_last) && !s:Match(lnum, s:continuation_regex)
return s:Match(lnum, s:var_stmt) ? indent(lnum) + s:sw() : indent(lnum)
elseif s:Match(s:PrevNonBlankNonString(lnum - 1), s:comma_last)
if !s:Match(lnum, s:comma_last) && s:InMultiVarStatement(lnum,1,0)
return indent(lnum) - s:sw()
end
end
let ind_con = ind
let ind = s:IndentWithContinuation(lnum, ind_con, s:sw())
" }}}2
"
"
let ols = s:InOneLineScope(lnum)
if ols > 0
let ind = ind + s:sw()
else else
let ols = s:ExitingOneLineScope(lnum) let [s:looksyn, s:checkIn, top] = [v:lnum - 1, 0, (!indent(l:lnum) &&
while ols > 0 && ind > 0 \ s:syn_at(l:lnum,1) !~? s:syng_str) * l:lnum]
let ind = ind - s:sw() if idx + 1
let ols = s:InOneLineScope(ols - 1) call s:GetPair(['\[','(','{'][idx],'])}'[idx],'bW','s:skip_func()',2000,top)
endwhile elseif getline(v:lnum) !~ '^\S' && syns =~? 'block'
call s:GetPair('{','}','bW','s:skip_func()',2000,top)
else
call s:alternatePair(top)
endif
endif endif
return ind let b:js_cache = [v:lnum] + (line('.') == v:lnum ? [0,0] : getpos('.')[1:2])
endfunction let num = b:js_cache[1]
" }}}1 let [s:W, isOp, bL, switch_offset] = [s:sw(),0,0,0]
if !num || s:IsBlock()
let ilnum = line('.')
let pline = s:save_pos('s:Trim',l:lnum)
if num && s:looking_at() == ')' && s:GetPair('(', ')', 'bW', s:skip_expr, 100) > 0
let num = ilnum == num ? line('.') : num
if idx < 0 && s:previous_token() ==# 'switch' && s:previous_token() != '.'
if &cino !~ ':'
let switch_offset = s:W
else
let switch_offset = max([-indent(num),s:parse_cino(':')])
endif
if pline[-1:] != '.' && l:line =~# '^\%(default\|case\)\>'
return indent(num) + switch_offset
endif
endif
endif
if idx < 0 && pline[-1:] !~ '[{;]'
let isOp = (l:line =~# s:opfirst || s:continues(l:lnum,pline)) * s:W
let bL = s:iscontOne(l:lnum,b:js_cache[1],isOp)
let bL -= (bL && l:line[0] == '{') * s:W
endif
elseif idx < 0 && getline(b:js_cache[1])[b:js_cache[2]-1] == '(' && &cino =~ '('
let pval = s:parse_cino('(')
return !pval ? (s:parse_cino('w') ? 0 : -(!!search('\m\S','W'.s:z,num))) + virtcol('.') :
\ max([indent('.') + pval + (s:GetPair('(',')','nbrmW',s:skip_expr,100,num) * s:W),0])
endif
" main return
if l:line =~ '^\%([])}]\||}\)'
return max([indent(num),0])
elseif num
return indent(num) + s:W + switch_offset + bL + isOp
endif
return bL + isOp
endfunction
let &cpo = s:cpo_save let &cpo = s:cpo_save
unlet s:cpo_save unlet s:cpo_save
" gq{{{2
function! Fixedgq(lnum, count)
let l:tw = &tw ? &tw : 80;
let l:count = a:count
let l:first_char = indent(a:lnum) + 1
if mode() == 'i' " gq was not pressed, but tw was set
return 1
endif
" This gq is only meant to do code with strings, not comments
if s:IsInComment(a:lnum, l:first_char)
return 1
endif
if len(getline(a:lnum)) < l:tw && l:count == 1 " No need for gq
return 1
endif
" Put all the lines on one line and do normal spliting after that
if l:count > 1
while l:count > 1
let l:count -= 1
normal J
endwhile
endif
let l:winview = winsaveview()
call cursor(a:lnum, l:tw + 1)
let orig_breakpoint = searchpairpos(' ', '', '\.', 'bcW', '', a:lnum)
call cursor(a:lnum, l:tw + 1)
let breakpoint = searchpairpos(' ', '', '\.', 'bcW', s:skip_expr, a:lnum)
" No need for special treatment, normal gq handles edgecases better
if breakpoint[1] == orig_breakpoint[1]
call winrestview(l:winview)
return 1
endif
" Try breaking after string
if breakpoint[1] <= indent(a:lnum)
call cursor(a:lnum, l:tw + 1)
let breakpoint = searchpairpos('\.', '', ' ', 'cW', s:skip_expr, a:lnum)
endif
if breakpoint[1] != 0
call feedkeys("r\<CR>")
else
let l:count = l:count - 1
endif
" run gq on new lines
if l:count == 1
call feedkeys("gqq")
endif
return 0
endfunction
"}}}
" vim: foldmethod=marker:foldlevel=1
endif endif

View File

@@ -44,7 +44,7 @@ let s:block_regex = '\%({\)\s*\%(|\%([*@]\=\h\w*,\=\s*\)\%(,\s*[*@]\=\h\w*\)*|\)
" Check if the character at lnum:col is inside a string. " Check if the character at lnum:col is inside a string.
function s:IsInString(lnum, col) function s:IsInString(lnum, col)
return synIDattr(synID(a:lnum, a:col, 1), 'name') == jsonString return synIDattr(synID(a:lnum, a:col, 1), 'name') == "jsonString"
endfunction endfunction
" Find line above 'lnum' that isn't empty, or in a string. " Find line above 'lnum' that isn't empty, or in a string.
@@ -143,7 +143,11 @@ function GetJSONIndent()
" If the previous line ended with a block opening, add a level of indent. " If the previous line ended with a block opening, add a level of indent.
" if s:Match(lnum, s:block_regex) " if s:Match(lnum, s:block_regex)
" if exists('*shiftwidth')
" return indent(lnum) + shiftwidth() " return indent(lnum) + shiftwidth()
" else
" return indent(lnum) + &sw
" endif
" endif " endif
" If the previous line contained an opening bracket, and we are still in it, " If the previous line contained an opening bracket, and we are still in it,
@@ -151,7 +155,11 @@ function GetJSONIndent()
if line =~ '[[({]' if line =~ '[[({]'
let counts = s:LineHasOpeningBrackets(lnum) let counts = s:LineHasOpeningBrackets(lnum)
if counts[0] == '1' || counts[1] == '1' || counts[2] == '1' if counts[0] == '1' || counts[1] == '1' || counts[2] == '1'
if exists('*shiftwidth')
return ind + shiftwidth() return ind + shiftwidth()
else
return ind + &sw
endif
else else
call cursor(v:lnum, vcol) call cursor(v:lnum, vcol)
end end

26
indent/litcoffee.vim Normal file
View File

@@ -0,0 +1,26 @@
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'coffee-script') == -1
if exists('b:did_indent')
finish
endif
runtime! indent/coffee.vim
let b:did_indent = 1
setlocal indentexpr=GetLitCoffeeIndent()
if exists('*GetLitCoffeeIndent')
finish
endif
function GetLitCoffeeIndent()
if searchpair('^ \|\t', '', '$', 'bWnm') > 0
return GetCoffeeIndent(v:lnum)
else
return -1
endif
endfunc
endif

268
indent/ls.vim Normal file
View File

@@ -0,0 +1,268 @@
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'livescript') == -1
" Language: LiveScript
" Maintainer: George Zahariev
" URL: http://github.com/gkz/vim-ls
" License: WTFPL
if exists("b:did_indent")
finish
endif
let b:did_indent = 1
setlocal autoindent
setlocal indentexpr=GetLiveScriptIndent(v:lnum)
" Make sure GetLiveScriptIndent is run when these are typed so they can be
" indented or outdented.
setlocal indentkeys+=0],0),0.,=else,=when,=catch,=finally
" Only define the function once.
if exists("*GetLiveScriptIndent")
finish
endif
" Keywords to indent after
let s:INDENT_AFTER_KEYWORD = '^\%(if\|unless\|else\|for\|while\|until\|'
\ . 'loop\|case\|default\|try\|catch\|finally\|'
\ . 'class\|do\|new\|let\|with\|function\)\>'
" Operators to indent after
let s:INDENT_AFTER_OPERATOR = '\%([([{:=]\|[-=]>\)$'
" Keywords and operators that continue a line
let s:CONTINUATION = '\<\%(is\|isnt\|and\|or\|do\)\>$'
\ . '\|'
\ . '\%(-\@<!-\|+\@<!+\|<\|[-~]\@<!>\|\*\|/\@<!/\|%\||\|'
\ . '&\|,\|\.\@<!\.\)$'
" Operators that block continuation indenting
let s:CONTINUATION_BLOCK = '[([{:=]$'
" A continuation dot access
let s:DOT_ACCESS = '^\.'
" Keywords to outdent after
let s:OUTDENT_AFTER = '^\%(return\|break\|continue\|throw\)\>'
" A compound assignment like `... = if ...`
let s:COMPOUND_ASSIGNMENT = '[:=]\s*\%(if\|unless\|for\|while\|until\|'
\ . 'try\|class\|do\|new\|let\|with\)\>'
" A postfix condition like `return ... if ...`.
let s:POSTFIX_CONDITION = '\S\s\+\zs\<\%(if\|unless\)\>'
" A single-line else statement like `else ...` but not `else if ...
let s:SINGLE_LINE_ELSE = '^else\s\+\%(\<\%(if\|unless\)\>\)\@!'
" Max lines to look back for a match
let s:MAX_LOOKBACK = 50
" Get the linked syntax name of a character.
function! s:SyntaxName(linenum, col)
return synIDattr(synIDtrans(synID(a:linenum, a:col, 1)), 'name')
endfunction
" Check if a character is in a comment.
function! s:IsComment(linenum, col)
return s:SyntaxName(a:linenum, a:col) == 'Comment'
endfunction
" Check if a character is in a string.
function! s:IsString(linenum, col)
return s:SyntaxName(a:linenum, a:col) == 'Constant'
endfunction
" Check if a character is in a comment or string.
function! s:IsCommentOrString(linenum, col)
return s:SyntaxName(a:linenum, a:col) =~ 'Comment\|Constant'
endfunction
" Check if a whole line is a comment.
function! s:IsCommentLine(linenum)
" Check the first non-whitespace character.
return s:IsComment(a:linenum, indent(a:linenum) + 1)
endfunction
" Repeatedly search a line for a regex until one is found outside a string or
" comment.
function! s:SmartSearch(linenum, regex)
" Start at the first column.
let col = 0
" Search until there are no more matches, unless a good match is found.
while 1
call cursor(a:linenum, col + 1)
let [_, col] = searchpos(a:regex, 'cn', a:linenum)
" No more matches.
if !col
break
endif
if !s:IsCommentOrString(a:linenum, col)
return 1
endif
endwhile
" No good match found.
return 0
endfunction
" Skip a match if it's in a comment or string, is a single-line statement that
" isn't adjacent, or is a postfix condition.
function! s:ShouldSkip(startlinenum, linenum, col)
if s:IsCommentOrString(a:linenum, a:col)
return 1
endif
" Check for a single-line statement that isn't adjacent.
if s:SmartSearch(a:linenum, '\<then\>') && a:startlinenum - a:linenum > 1
return 1
endif
if s:SmartSearch(a:linenum, s:POSTFIX_CONDITION) &&
\ !s:SmartSearch(a:linenum, s:COMPOUND_ASSIGNMENT)
return 1
endif
return 0
endfunction
" Find the farthest line to look back to, capped to line 1 (zero and negative
" numbers cause bad things).
function! s:MaxLookback(startlinenum)
return max([1, a:startlinenum - s:MAX_LOOKBACK])
endfunction
" Get the skip expression for searchpair().
function! s:SkipExpr(startlinenum)
return "s:ShouldSkip(" . a:startlinenum . ", line('.'), col('.'))"
endfunction
" Search for pairs of text.
function! s:SearchPair(start, end)
" The cursor must be in the first column for regexes to match.
call cursor(0, 1)
let startlinenum = line('.')
" Don't need the W flag since MaxLookback caps the search to line 1.
return searchpair(a:start, '', a:end, 'bcn',
\ s:SkipExpr(startlinenum),
\ s:MaxLookback(startlinenum))
endfunction
" Try to find a previous matching line.
function! s:GetMatch(curline)
let firstchar = a:curline[0]
if firstchar == '}'
return s:SearchPair('{', '}')
elseif firstchar == ')'
return s:SearchPair('(', ')')
elseif firstchar == ']'
return s:SearchPair('\[', '\]')
elseif a:curline =~ '^else\>'
return s:SearchPair('\<\%(if\|unless\|case\|when\)\>', '\<else\>')
elseif a:curline =~ '^catch\>'
return s:SearchPair('\<try\>', '\<catch\>')
elseif a:curline =~ '^finally\>'
return s:SearchPair('\<try\>', '\<finally\>')
endif
return 0
endfunction
" Get the nearest previous line that isn't a comment.
function! s:GetPrevNormalLine(startlinenum)
let curlinenum = a:startlinenum
while curlinenum > 0
let curlinenum = prevnonblank(curlinenum - 1)
if !s:IsCommentLine(curlinenum)
return curlinenum
endif
endwhile
return 0
endfunction
" Get the contents of a line without leading or trailing whitespace.
function! s:GetTrimmedLine(linenum)
return substitute(substitute(getline(a:linenum), '^\s\+', '', ''),
\ '\s\+$', '', '')
endfunction
function! s:GetLiveScriptIndent(curlinenum)
let prevlinenum = s:GetPrevNormalLine(a:curlinenum)
" Don't do anything if there's no previous line.
if !prevlinenum
return -1
endif
let curline = s:GetTrimmedLine(a:curlinenum)
" Try to find a previous matching statement. This handles outdenting.
let matchlinenum = s:GetMatch(curline)
if matchlinenum
return indent(matchlinenum)
endif
let prevline = s:GetTrimmedLine(prevlinenum)
let previndent = indent(prevlinenum)
" Always indent after these operators.
if prevline =~ s:INDENT_AFTER_OPERATOR
return previndent + &shiftwidth
endif
" Indent after a continuation if it's the first.
if prevline =~ s:CONTINUATION
let prevprevlinenum = s:GetPrevNormalLine(prevlinenum)
let prevprevline = s:GetTrimmedLine(prevprevlinenum)
if prevprevline !~ s:CONTINUATION && prevprevline !~ s:CONTINUATION_BLOCK
return previndent + &shiftwidth
endif
endif
" Indent after these keywords and compound assignments if they aren't a
" single-line statement.
if prevline =~ s:INDENT_AFTER_KEYWORD || prevline =~ s:COMPOUND_ASSIGNMENT
if !s:SmartSearch(prevlinenum, '\<then\>') && prevline !~ s:SINGLE_LINE_ELSE
return previndent + &shiftwidth
endif
endif
" Indent a dot access if it's the first.
if curline =~ s:DOT_ACCESS && prevline !~ s:DOT_ACCESS
return previndent + &shiftwidth
endif
" Outdent after these keywords if they don't have a postfix condition and
" aren't a single-line statement.
if prevline =~ s:OUTDENT_AFTER
if !s:SmartSearch(prevlinenum, s:POSTFIX_CONDITION) ||
\ s:SmartSearch(prevlinenum, '\<then\>')
return previndent - &shiftwidth
endif
endif
" No indenting or outdenting is needed.
return -1
endfunction
" Wrap s:GetLiveScriptIndent to keep the cursor position.
function! GetLiveScriptIndent(curlinenum)
let oldcursor = getpos('.')
let indent = s:GetLiveScriptIndent(a:curlinenum)
call setpos('.', oldcursor)
return indent
endfunction
endif

126
indent/lua.vim Normal file
View File

@@ -0,0 +1,126 @@
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'lua') == -1
" Vim indent file
" Language: Lua
" URL: https://github.com/tbastos/vim-lua
" Initialization ------------------------------------------{{{1
if exists("b:did_indent")
finish
endif
let b:did_indent = 1
setlocal autoindent
setlocal nosmartindent
setlocal indentexpr=GetLuaIndent()
setlocal indentkeys+=0=end,0=until,0=elseif,0=else
" Only define the function once.
if exists("*GetLuaIndent")
finish
endif
" Variables -----------------------------------------------{{{1
let s:open_patt = '\%(\<\%(function\|if\|repeat\|do\)\>\|(\|{\)'
let s:middle_patt = '\<\%(else\|elseif\)\>'
let s:close_patt = '\%(\<\%(end\|until\)\>\|)\|}\)'
let s:anon_func_start = '\S\+\s*[({].*\<function\s*(.*)\s*$'
let s:anon_func_end = '\<end\%(\s*[)}]\)\+'
" Expression used to check whether we should skip a match with searchpair().
let s:skip_expr = "synIDattr(synID(line('.'),col('.'),1),'name') =~ 'luaComment\\|luaString'"
" Auxiliary Functions -------------------------------------{{{1
function s:IsInCommentOrString(lnum, col)
return synIDattr(synID(a:lnum, a:col, 1), 'name') =~ 'luaCommentLong\|luaStringLong'
\ && !(getline(a:lnum) =~ '^\s*\%(--\)\?\[=*\[') " opening tag is not considered 'in'
endfunction
" Find line above 'lnum' that isn't blank, in a comment or string.
function s:PrevLineOfCode(lnum)
let lnum = prevnonblank(a:lnum)
while s:IsInCommentOrString(lnum, 1)
let lnum = prevnonblank(lnum - 1)
endwhile
return lnum
endfunction
" Gets line contents, excluding trailing comments.
function s:GetContents(lnum)
return substitute(getline(a:lnum), '\v\m--.*$', '', '')
endfunction
" GetLuaIndent Function -----------------------------------{{{1
function GetLuaIndent()
" if the line is in a long comment or string, don't change the indent
if s:IsInCommentOrString(v:lnum, 1)
return -1
endif
let prev_line = s:PrevLineOfCode(v:lnum - 1)
if prev_line == 0
" this is the first non-empty line
return 0
endif
let contents_cur = s:GetContents(v:lnum)
let contents_prev = s:GetContents(prev_line)
let original_cursor_pos = getpos(".")
let i = 0
" check if the previous line opens blocks
call cursor(v:lnum, 1)
let num_pairs = searchpair(s:open_patt, s:middle_patt, s:close_patt,
\ 'mrb', s:skip_expr, prev_line)
if num_pairs > 0
let i += num_pairs
endif
" special case: call(with, {anon = function() -- should indent only once
if num_pairs > 1 && contents_prev =~ s:anon_func_start
let i = 1
endif
" check if current line closes blocks
call cursor(prev_line, col([prev_line,'$']))
let num_pairs = searchpair(s:open_patt, s:middle_patt, s:close_patt,
\ 'mr', s:skip_expr, v:lnum)
if num_pairs > 0
let i -= num_pairs
endif
" special case: end}) -- end of call with anon func should unindent once
if num_pairs > 1 && contents_cur =~ s:anon_func_end
let i = -1
endif
" if the previous line closed a paren, unindent (except with anon funcs)
call cursor(prev_line - 1, col([prev_line - 1, '$']))
let num_pairs = searchpair('(', '', ')', 'mr', s:skip_expr, prev_line)
if num_pairs > 0 && contents_prev !~ s:anon_func_end
let i -= 1
endif
" if this line closed a paren, indent (except with anon funcs)
call cursor(prev_line, col([prev_line, '$']))
let num_pairs = searchpair('(', '', ')', 'mr', s:skip_expr, v:lnum)
if num_pairs > 0 && contents_cur !~ s:anon_func_end
let i += 1
endif
" restore cursor
call setpos(".", original_cursor_pos)
return indent(prev_line) + (&sw * i)
endfunction
endif

View File

@@ -1,131 +0,0 @@
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'perl') == -1
" Vim indent file
" Language: Perl 6
" Maintainer: vim-perl <vim-perl@googlegroups.com>
" Homepage: http://github.com/vim-perl/vim-perl
" Bugs/requests: http://github.com/vim-perl/vim-perl/issues
" Last Change: {{LAST_CHANGE}}
" Contributors: Andy Lester <andy@petdance.com>
" Hinrik Örn Sigurðsson <hinrik.sig@gmail.com>
"
" Adapted from indent/perl.vim by Rafael Garcia-Suarez <rgarciasuarez@free.fr>
" Suggestions and improvements by :
" Aaron J. Sherman (use syntax for hints)
" Artem Chuprina (play nice with folding)
" TODO:
" This file still relies on stuff from the Perl 5 syntax file, which Perl 6
" does not use.
"
" Things that are not or not properly indented (yet) :
" - Continued statements
" print "foo",
" "bar";
" print "foo"
" if bar();
" - Multiline regular expressions (m//x)
" (The following probably needs modifying the perl syntax file)
" - qw() lists
" - Heredocs with terminators that don't match \I\i*
" Only load this indent file when no other was loaded.
if exists("b:did_indent")
finish
endif
let b:did_indent = 1
" Is syntax highlighting active ?
let b:indent_use_syntax = has("syntax")
setlocal indentexpr=GetPerl6Indent()
" we reset it first because the Perl 5 indent file might have been loaded due
" to a .pl/pm file extension, and indent files don't clean up afterwards
setlocal indentkeys&
setlocal indentkeys+=0=,0),0],0>,0»,0=or,0=and
if !b:indent_use_syntax
setlocal indentkeys+=0=EO
endif
let s:cpo_save = &cpo
set cpo-=C
function! GetPerl6Indent()
" Get the line to be indented
let cline = getline(v:lnum)
" Indent POD markers to column 0
if cline =~ '^\s*=\L\@!'
return 0
endif
" Get current syntax item at the line's first char
let csynid = ''
if b:indent_use_syntax
let csynid = synIDattr(synID(v:lnum,1,0),"name")
endif
" Don't reindent POD and heredocs
if csynid =~ "^p6Pod"
return indent(v:lnum)
endif
" Now get the indent of the previous perl line.
" Find a non-blank line above the current line.
let lnum = prevnonblank(v:lnum - 1)
" Hit the start of the file, use zero indent.
if lnum == 0
return 0
endif
let line = getline(lnum)
let ind = indent(lnum)
" Skip heredocs, POD, and comments on 1st column
if b:indent_use_syntax
let skippin = 2
while skippin
let synid = synIDattr(synID(lnum,1,0),"name")
if (synid =~ "^p6Pod" || synid =~ "p6Comment")
let lnum = prevnonblank(lnum - 1)
if lnum == 0
return 0
endif
let line = getline(lnum)
let ind = indent(lnum)
let skippin = 1
else
let skippin = 0
endif
endwhile
endif
if line =~ '[<«\[{(]\s*\(#[^)}\]»>]*\)\=$'
let ind = ind + &sw
endif
if cline =~ '^\s*[)}\]»>]'
let ind = ind - &sw
endif
" Indent lines that begin with 'or' or 'and'
if cline =~ '^\s*\(or\|and\)\>'
if line !~ '^\s*\(or\|and\)\>'
let ind = ind + &sw
endif
elseif line =~ '^\s*\(or\|and\)\>'
let ind = ind - &sw
endif
return ind
endfunction
let &cpo = s:cpo_save
unlet s:cpo_save
" vim:ts=8:sts=4:sw=4:expandtab:ft=vim
endif

59
indent/plantuml.vim Normal file
View File

@@ -0,0 +1,59 @@
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'plantuml') == -1
if exists("b:did_indent")
finish
endif
let b:did_indent = 1
setlocal indentexpr=GetPlantUMLIndent()
setlocal indentkeys=o,O,<CR>,<:>,!^F,0end,0else,}
" only define the indent code once
if exists("*GetPlantUMLIndent")
finish
endif
let s:incIndent =
\ '^\s*\%(loop\|alt\|opt\|group\|critical\|else\|legend\|box\|if\|while\)\>\|' .
\ '^\s*ref\>[^:]*$\|' .
\ '^\s*[hr]\?note\>\%(\%("[^"]*" \<as\>\)\@![^:]\)*$\|' .
\ '^\s*title\s*$\|' .
\ '^\s*skinparam\>.*{\s*$\|' .
\ '^\s*\%(state\|class\|partition\|rectangle\|enum\|interface\|namespace\)\>.*{'
let s:decIndent = '^\s*\%(end\|else\|}\)'
function! GetPlantUMLIndent(...) abort
"for current line, use arg if given or v:lnum otherwise
let clnum = a:0 ? a:1 : v:lnum
if !s:insidePlantUMLTags(clnum)
return indent(clnum)
endif
let pnum = prevnonblank(clnum-1)
let pindent = indent(pnum)
let pline = getline(pnum)
let cline = getline(clnum)
if cline =~ s:decIndent
if pline =~ s:incIndent
return pindent
else
return pindent - shiftwidth()
endif
elseif pline =~ s:incIndent
return pindent + shiftwidth()
endif
return pindent
endfunction
function! s:insidePlantUMLTags(lnum) abort
call cursor(a:lnum, 1)
return search('@startuml', 'Wbn') && search('@enduml', 'Wn')
endfunction
endif

View File

@@ -20,6 +20,11 @@ if !exists('g:ruby_indent_access_modifier_style')
let g:ruby_indent_access_modifier_style = 'normal' let g:ruby_indent_access_modifier_style = 'normal'
endif endif
if !exists('g:ruby_indent_assignment_style')
" Possible values: "variable", "hanging"
let g:ruby_indent_assignment_style = 'hanging'
endif
if !exists('g:ruby_indent_block_style') if !exists('g:ruby_indent_block_style')
" Possible values: "expression", "do" " Possible values: "expression", "do"
let g:ruby_indent_block_style = 'expression' let g:ruby_indent_block_style = 'expression'
@@ -51,11 +56,11 @@ let s:syng_strcom = '\<ruby\%(Regexp\|RegexpDelimiter\|RegexpEscape' .
" Regex of syntax group names that are strings. " Regex of syntax group names that are strings.
let s:syng_string = let s:syng_string =
\ '\<ruby\%(String\|Interpolation\|NoInterpolation\|StringEscape\)\>' \ '\<ruby\%(String\|Interpolation\|InterpolationDelimiter\|NoInterpolation\|StringEscape\)\>'
" Regex of syntax group names that are strings or documentation. " Regex of syntax group names that are strings or documentation.
let s:syng_stringdoc = let s:syng_stringdoc =
\'\<ruby\%(String\|Interpolation\|NoInterpolation\|StringEscape\|Documentation\)\>' \ '\<ruby\%(String\|Interpolation\|InterpolationDelimiter\|NoInterpolation\|StringEscape\|Documentation\)\>'
" Expression used to check whether we should skip a match with searchpair(). " Expression used to check whether we should skip a match with searchpair().
let s:skip_expr = let s:skip_expr =
@@ -94,11 +99,12 @@ let s:end_skip_expr = s:skip_expr .
\ ' && getline(".") =~ "^\\s*\\<\\(while\\|until\\|for\\):\\@!\\>")' \ ' && getline(".") =~ "^\\s*\\<\\(while\\|until\\|for\\):\\@!\\>")'
" Regex that defines continuation lines, not including (, {, or [. " Regex that defines continuation lines, not including (, {, or [.
let s:non_bracket_continuation_regex = '\%([\\.,:*/%+]\|\<and\|\<or\|\%(<%\)\@<![=-]\|\W[|&?]\|||\|&&\)\s*\%(#.*\)\=$' let s:non_bracket_continuation_regex =
\ '\%([\\.,:*/%+]\|\<and\|\<or\|\%(<%\)\@<![=-]\|:\@<![^[:alnum:]:][|&?]\|||\|&&\)\s*\%(#.*\)\=$'
" Regex that defines continuation lines. " Regex that defines continuation lines.
let s:continuation_regex = let s:continuation_regex =
\ '\%(%\@<![({[\\.,:*/%+]\|\<and\|\<or\|\%(<%\)\@<![=-]\|\W[|&?]\|||\|&&\)\s*\%(#.*\)\=$' \ '\%(%\@<![({[\\.,:*/%+]\|\<and\|\<or\|\%(<%\)\@<![=-]\|:\@<![^[:alnum:]:][|&?]\|||\|&&\)\s*\%(#.*\)\=$'
" Regex that defines continuable keywords " Regex that defines continuable keywords
let s:continuable_regex = let s:continuable_regex =
@@ -108,6 +114,12 @@ let s:continuable_regex =
" Regex that defines bracket continuations " Regex that defines bracket continuations
let s:bracket_continuation_regex = '%\@<!\%([({[]\)\s*\%(#.*\)\=$' let s:bracket_continuation_regex = '%\@<!\%([({[]\)\s*\%(#.*\)\=$'
" Regex that defines dot continuations
let s:dot_continuation_regex = '%\@<!\.\s*\%(#.*\)\=$'
" Regex that defines backslash continuations
let s:backslash_continuation_regex = '%\@<!\\\s*$'
" Regex that defines end of bracket continuation followed by another continuation " Regex that defines end of bracket continuation followed by another continuation
let s:bracket_switch_continuation_regex = '^\([^(]\+\zs).\+\)\+'.s:continuation_regex let s:bracket_switch_continuation_regex = '^\([^(]\+\zs).\+\)\+'.s:continuation_regex
@@ -137,7 +149,507 @@ let s:block_continuation_regex = '^\s*[^])}\t ].*'.s:block_regex
" Regex that describes a leading operator (only a method call's dot for now) " Regex that describes a leading operator (only a method call's dot for now)
let s:leading_operator_regex = '^\s*[.]' let s:leading_operator_regex = '^\s*[.]'
" 2. Auxiliary Functions {{{1 " 2. GetRubyIndent Function {{{1
" =========================
function GetRubyIndent(...)
" 2.1. Setup {{{2
" ----------
let indent_info = {}
" The value of a single shift-width
if exists('*shiftwidth')
let indent_info.sw = shiftwidth()
else
let indent_info.sw = &sw
endif
" For the current line, use the first argument if given, else v:lnum
let indent_info.clnum = a:0 ? a:1 : v:lnum
let indent_info.cline = getline(indent_info.clnum)
" Set up variables for restoring position in file. Could use clnum here.
let indent_info.col = col('.')
" 2.2. Work on the current line {{{2
" -----------------------------
let indent_callback_names = [
\ 's:AccessModifier',
\ 's:ClosingBracketOnEmptyLine',
\ 's:BlockComment',
\ 's:DeindentingKeyword',
\ 's:MultilineStringOrLineComment',
\ 's:ClosingHeredocDelimiter',
\ 's:LeadingOperator',
\ ]
for callback_name in indent_callback_names
" Decho "Running: ".callback_name
let indent = call(function(callback_name), [indent_info])
if indent >= 0
" Decho "Match: ".callback_name." indent=".indent." info=".string(indent_info)
return indent
endif
endfor
" 2.3. Work on the previous line. {{{2
" -------------------------------
let indent_callback_names = [
\ 's:EmptyInsideString',
\ 's:StartOfFile',
\ 's:AfterAccessModifier',
\ 's:ContinuedLine',
\ 's:AfterBlockOpening',
\ 's:AfterHangingSplat',
\ 's:AfterUnbalancedBracket',
\ 's:AfterLeadingOperator',
\ 's:AfterEndKeyword',
\ 's:AfterIndentKeyword',
\ ]
" Previous line number
let indent_info.plnum = s:PrevNonBlankNonString(indent_info.clnum - 1)
let indent_info.pline = getline(indent_info.plnum)
for callback_name in indent_callback_names
" Decho "Running: ".callback_name
let indent = call(function(callback_name), [indent_info])
if indent >= 0
" Decho "Match: ".callback_name." indent=".indent." info=".string(indent_info)
return indent
endif
endfor
" 2.4. Work on the MSL line. {{{2
" --------------------------
let indent_callback_names = [
\ 's:PreviousNotMSL',
\ 's:IndentingKeywordInMSL',
\ 's:ContinuedHangingOperator',
\ ]
" Most Significant line based on the previous one -- in case it's a
" contination of something above
let indent_info.plnum_msl = s:GetMSL(indent_info.plnum)
for callback_name in indent_callback_names
" Decho "Running: ".callback_name
let indent = call(function(callback_name), [indent_info])
if indent >= 0
" Decho "Match: ".callback_name." indent=".indent." info=".string(indent_info)
return indent
endif
endfor
" }}}2
" By default, just return the previous line's indent
" Decho "Default case matched"
return indent(indent_info.plnum)
endfunction
" 3. Indenting Logic Callbacks {{{1
" ============================
function! s:AccessModifier(cline_info)
let info = a:cline_info
" If this line is an access modifier keyword, align according to the closest
" class declaration.
if g:ruby_indent_access_modifier_style == 'indent'
if s:Match(info.clnum, s:access_modifier_regex)
let class_lnum = s:FindContainingClass()
if class_lnum > 0
return indent(class_lnum) + info.sw
endif
endif
elseif g:ruby_indent_access_modifier_style == 'outdent'
if s:Match(info.clnum, s:access_modifier_regex)
let class_lnum = s:FindContainingClass()
if class_lnum > 0
return indent(class_lnum)
endif
endif
endif
return -1
endfunction
function! s:ClosingBracketOnEmptyLine(cline_info)
let info = a:cline_info
" If we got a closing bracket on an empty line, find its match and indent
" according to it. For parentheses we indent to its column - 1, for the
" others we indent to the containing line's MSL's level. Return -1 if fail.
let col = matchend(info.cline, '^\s*[]})]')
if col > 0 && !s:IsInStringOrComment(info.clnum, col)
call cursor(info.clnum, col)
let closing_bracket = info.cline[col - 1]
let bracket_pair = strpart('(){}[]', stridx(')}]', closing_bracket) * 2, 2)
if searchpair(escape(bracket_pair[0], '\['), '', bracket_pair[1], 'bW', s:skip_expr) > 0
if closing_bracket == ')' && col('.') != col('$') - 1
let ind = virtcol('.') - 1
elseif g:ruby_indent_block_style == 'do'
let ind = indent(line('.'))
else " g:ruby_indent_block_style == 'expression'
let ind = indent(s:GetMSL(line('.')))
endif
endif
return ind
endif
return -1
endfunction
function! s:BlockComment(cline_info)
" If we have a =begin or =end set indent to first column.
if match(a:cline_info.cline, '^\s*\%(=begin\|=end\)$') != -1
return 0
endif
return -1
endfunction
function! s:DeindentingKeyword(cline_info)
let info = a:cline_info
" If we have a deindenting keyword, find its match and indent to its level.
" TODO: this is messy
if s:Match(info.clnum, s:ruby_deindent_keywords)
call cursor(info.clnum, 1)
if searchpair(s:end_start_regex, s:end_middle_regex, s:end_end_regex, 'bW',
\ s:end_skip_expr) > 0
let msl = s:GetMSL(line('.'))
let line = getline(line('.'))
if s:IsAssignment(line, col('.')) &&
\ strpart(line, col('.') - 1, 2) !~ 'do'
" assignment to case/begin/etc, on the same line
if g:ruby_indent_assignment_style == 'hanging'
" hanging indent
let ind = virtcol('.') - 1
else
" align with variable
let ind = indent(line('.'))
endif
elseif g:ruby_indent_block_style == 'do'
" align to line of the "do", not to the MSL
let ind = indent(line('.'))
elseif getline(msl) =~ '=\s*\(#.*\)\=$'
" in the case of assignment to the MSL, align to the starting line,
" not to the MSL
let ind = indent(line('.'))
else
" align to the MSL
let ind = indent(msl)
endif
endif
return ind
endif
return -1
endfunction
function! s:MultilineStringOrLineComment(cline_info)
let info = a:cline_info
" If we are in a multi-line string or line-comment, don't do anything to it.
if s:IsInStringOrDocumentation(info.clnum, matchend(info.cline, '^\s*') + 1)
return indent(info.clnum)
endif
return -1
endfunction
function! s:ClosingHeredocDelimiter(cline_info)
let info = a:cline_info
" If we are at the closing delimiter of a "<<" heredoc-style string, set the
" indent to 0.
if info.cline =~ '^\k\+\s*$'
\ && s:IsInStringDelimiter(info.clnum, 1)
\ && search('\V<<'.info.cline, 'nbW') > 0
return 0
endif
return -1
endfunction
function! s:LeadingOperator(cline_info)
" If the current line starts with a leading operator, add a level of indent.
if s:Match(a:cline_info.clnum, s:leading_operator_regex)
return indent(s:GetMSL(a:cline_info.clnum)) + a:cline_info.sw
endif
return -1
endfunction
function! s:EmptyInsideString(pline_info)
" If the line is empty and inside a string (plnum would not be the real
" prevnonblank in that case), use the previous line's indent
let info = a:pline_info
if info.cline =~ '^\s*$' && info.plnum != prevnonblank(info.clnum - 1)
return indent(prevnonblank(info.clnum))
endif
return -1
endfunction
function! s:StartOfFile(pline_info)
" At the start of the file use zero indent.
if a:pline_info.plnum == 0
return 0
endif
return -1
endfunction
function! s:AfterAccessModifier(pline_info)
let info = a:pline_info
if g:ruby_indent_access_modifier_style == 'indent'
" If the previous line was a private/protected keyword, add a
" level of indent.
if s:Match(info.plnum, s:indent_access_modifier_regex)
return indent(info.plnum) + info.sw
endif
elseif g:ruby_indent_access_modifier_style == 'outdent'
" If the previous line was a private/protected/public keyword, add
" a level of indent, since the keyword has been out-dented.
if s:Match(info.plnum, s:access_modifier_regex)
return indent(info.plnum) + info.sw
endif
endif
return -1
endfunction
" Example:
"
" if foo || bar ||
" baz || bing
" puts "foo"
" end
"
function! s:ContinuedLine(pline_info)
let info = a:pline_info
let col = s:Match(info.plnum, s:ruby_indent_keywords)
if s:Match(info.plnum, s:continuable_regex) &&
\ s:Match(info.plnum, s:continuation_regex)
if col > 0 && s:IsAssignment(info.pline, col)
if g:ruby_indent_assignment_style == 'hanging'
" hanging indent
let ind = col - 1
else
" align with variable
let ind = indent(info.plnum)
endif
else
let ind = indent(s:GetMSL(info.plnum))
endif
return ind + info.sw + info.sw
endif
return -1
endfunction
function! s:AfterBlockOpening(pline_info)
let info = a:pline_info
" If the previous line ended with a block opening, add a level of indent.
if s:Match(info.plnum, s:block_regex)
if g:ruby_indent_block_style == 'do'
" don't align to the msl, align to the "do"
let ind = indent(info.plnum) + info.sw
else
let plnum_msl = s:GetMSL(info.plnum)
if getline(plnum_msl) =~ '=\s*\(#.*\)\=$'
" in the case of assignment to the msl, align to the starting line,
" not to the msl
let ind = indent(info.plnum) + info.sw
else
let ind = indent(plnum_msl) + info.sw
endif
endif
return ind
endif
return -1
endfunction
function! s:AfterLeadingOperator(pline_info)
" If the previous line started with a leading operator, use its MSL's level
" of indent
if s:Match(a:pline_info.plnum, s:leading_operator_regex)
return indent(s:GetMSL(a:pline_info.plnum))
endif
return -1
endfunction
function! s:AfterHangingSplat(pline_info)
let info = a:pline_info
" If the previous line ended with the "*" of a splat, add a level of indent
if info.pline =~ s:splat_regex
return indent(info.plnum) + info.sw
endif
return -1
endfunction
function! s:AfterUnbalancedBracket(pline_info)
let info = a:pline_info
" If the previous line contained unclosed opening brackets and we are still
" in them, find the rightmost one and add indent depending on the bracket
" type.
"
" If it contained hanging closing brackets, find the rightmost one, find its
" match and indent according to that.
if info.pline =~ '[[({]' || info.pline =~ '[])}]\s*\%(#.*\)\=$'
let [opening, closing] = s:ExtraBrackets(info.plnum)
if opening.pos != -1
if opening.type == '(' && searchpair('(', '', ')', 'bW', s:skip_expr) > 0
if col('.') + 1 == col('$')
return indent(info.plnum) + info.sw
else
return virtcol('.')
endif
else
let nonspace = matchend(info.pline, '\S', opening.pos + 1) - 1
return nonspace > 0 ? nonspace : indent(info.plnum) + info.sw
endif
elseif closing.pos != -1
call cursor(info.plnum, closing.pos + 1)
normal! %
if s:Match(line('.'), s:ruby_indent_keywords)
return indent('.') + info.sw
else
return indent(s:GetMSL(line('.')))
endif
else
call cursor(info.clnum, info.col)
end
endif
return -1
endfunction
function! s:AfterEndKeyword(pline_info)
let info = a:pline_info
" If the previous line ended with an "end", match that "end"s beginning's
" indent.
let col = s:Match(info.plnum, '\%(^\|[^.:@$]\)\<end\>\s*\%(#.*\)\=$')
if col > 0
call cursor(info.plnum, col)
if searchpair(s:end_start_regex, '', s:end_end_regex, 'bW',
\ s:end_skip_expr) > 0
let n = line('.')
let ind = indent('.')
let msl = s:GetMSL(n)
if msl != n
let ind = indent(msl)
end
return ind
endif
end
return -1
endfunction
function! s:AfterIndentKeyword(pline_info)
let info = a:pline_info
let col = s:Match(info.plnum, s:ruby_indent_keywords)
if col > 0
call cursor(info.plnum, col)
let ind = virtcol('.') - 1 + info.sw
" TODO: make this better (we need to count them) (or, if a searchpair
" fails, we know that something is lacking an end and thus we indent a
" level
if s:Match(info.plnum, s:end_end_regex)
let ind = indent('.')
elseif s:IsAssignment(info.pline, col)
if g:ruby_indent_assignment_style == 'hanging'
" hanging indent
let ind = col + info.sw - 1
else
" align with variable
let ind = indent(info.plnum) + info.sw
endif
endif
return ind
endif
return -1
endfunction
function! s:PreviousNotMSL(msl_info)
let info = a:msl_info
" If the previous line wasn't a MSL
if info.plnum != info.plnum_msl
" If previous line ends bracket and begins non-bracket continuation decrease indent by 1.
if s:Match(info.plnum, s:bracket_switch_continuation_regex)
" TODO (2016-10-07) Wrong/unused? How could it be "1"?
return indent(info.plnum) - 1
" If previous line is a continuation return its indent.
" TODO: the || s:IsInString() thing worries me a bit.
elseif s:Match(info.plnum, s:non_bracket_continuation_regex) || s:IsInString(info.plnum, strlen(line))
return indent(info.plnum)
endif
endif
return -1
endfunction
function! s:IndentingKeywordInMSL(msl_info)
let info = a:msl_info
" If the MSL line had an indenting keyword in it, add a level of indent.
" TODO: this does not take into account contrived things such as
" module Foo; class Bar; end
let col = s:Match(info.plnum_msl, s:ruby_indent_keywords)
if col > 0
let ind = indent(info.plnum_msl) + info.sw
if s:Match(info.plnum_msl, s:end_end_regex)
let ind = ind - info.sw
elseif s:IsAssignment(getline(info.plnum_msl), col)
if g:ruby_indent_assignment_style == 'hanging'
" hanging indent
let ind = col + info.sw - 1
else
" align with variable
let ind = indent(info.plnum_msl) + info.sw
endif
endif
return ind
endif
return -1
endfunction
function! s:ContinuedHangingOperator(msl_info)
let info = a:msl_info
" If the previous line ended with [*+/.,-=], but wasn't a block ending or a
" closing bracket, indent one extra level.
if s:Match(info.plnum_msl, s:non_bracket_continuation_regex) && !s:Match(info.plnum_msl, '^\s*\([\])}]\|end\)')
if info.plnum_msl == info.plnum
let ind = indent(info.plnum_msl) + info.sw
else
let ind = indent(info.plnum_msl)
endif
return ind
endif
return -1
endfunction
" 4. Auxiliary Functions {{{1
" ====================== " ======================
" Check if the character at lnum:col is inside a string, comment, or is ascii. " Check if the character at lnum:col is inside a string, comment, or is ascii.
@@ -160,6 +672,10 @@ function s:IsInStringDelimiter(lnum, col)
return synIDattr(synID(a:lnum, a:col, 1), 'name') == 'rubyStringDelimiter' return synIDattr(synID(a:lnum, a:col, 1), 'name') == 'rubyStringDelimiter'
endfunction endfunction
function s:IsAssignment(str, pos)
return strpart(a:str, 0, a:pos - 1) =~ '=\s*$'
endfunction
" Find line above 'lnum' that isn't empty, in a comment, or in a string. " Find line above 'lnum' that isn't empty, in a comment, or in a string.
function s:PrevNonBlankNonString(lnum) function s:PrevNonBlankNonString(lnum)
let in_block = 0 let in_block = 0
@@ -189,14 +705,23 @@ endfunction
function s:GetMSL(lnum) function s:GetMSL(lnum)
" Start on the line we're at and use its indent. " Start on the line we're at and use its indent.
let msl = a:lnum let msl = a:lnum
let msl_body = getline(msl)
let lnum = s:PrevNonBlankNonString(a:lnum - 1) let lnum = s:PrevNonBlankNonString(a:lnum - 1)
while lnum > 0 while lnum > 0
" If we have a continuation line, or we're in a string, use line as MSL. " If we have a continuation line, or we're in a string, use line as MSL.
" Otherwise, terminate search as we have found our MSL already. " Otherwise, terminate search as we have found our MSL already.
let line = getline(lnum) let line = getline(lnum)
if s:Match(msl, s:leading_operator_regex) if !s:Match(msl, s:backslash_continuation_regex) &&
\ s:Match(lnum, s:backslash_continuation_regex)
" If the current line doesn't end in a backslash, but the previous one
" does, look for that line's msl
"
" Example:
" foo = "bar" \
" "baz"
"
let msl = lnum
elseif s:Match(msl, s:leading_operator_regex)
" If the current line starts with a leading operator, keep its indent " If the current line starts with a leading operator, keep its indent
" and keep looking for an MSL. " and keep looking for an MSL.
let msl = lnum let msl = lnum
@@ -221,18 +746,30 @@ function s:GetMSL(lnum)
" three " three
" "
let msl = lnum let msl = lnum
elseif s:Match(lnum, s:dot_continuation_regex) &&
\ (s:Match(msl, s:bracket_continuation_regex) || s:Match(msl, s:block_continuation_regex))
" If the current line is a bracket continuation or a block-starter, but
" the previous is a dot, keep going to see if the previous line is the
" start of another continuation.
"
" Example:
" parent.
" method_call {
" three
"
let msl = lnum
elseif s:Match(lnum, s:non_bracket_continuation_regex) && elseif s:Match(lnum, s:non_bracket_continuation_regex) &&
\ (s:Match(msl, s:bracket_continuation_regex) || s:Match(msl, s:block_continuation_regex)) \ (s:Match(msl, s:bracket_continuation_regex) || s:Match(msl, s:block_continuation_regex))
" If the current line is a bracket continuation or a block-starter, but " If the current line is a bracket continuation or a block-starter, but
" the previous is a non-bracket one, keep going to see if the previous " the previous is a non-bracket one, respect the previous' indentation,
" line is a part of another continuation. " and stop here.
" "
" Example: " Example:
" method_call one, " method_call one,
" two { " two {
" three " three
" "
let msl = lnum return lnum
elseif s:Match(lnum, s:bracket_continuation_regex) && elseif s:Match(lnum, s:bracket_continuation_regex) &&
\ (s:Match(msl, s:bracket_continuation_regex) || s:Match(msl, s:block_continuation_regex)) \ (s:Match(msl, s:bracket_continuation_regex) || s:Match(msl, s:block_continuation_regex))
" If both lines are bracket continuations (the current may also be a " If both lines are bracket continuations (the current may also be a
@@ -264,7 +801,6 @@ function s:GetMSL(lnum)
endif endif
endif endif
let msl_body = getline(msl)
let lnum = s:PrevNonBlankNonString(lnum - 1) let lnum = s:PrevNonBlankNonString(lnum - 1)
endwhile endwhile
return msl return msl
@@ -363,307 +899,12 @@ function! s:FindContainingClass()
call setpos('.', saved_position) call setpos('.', saved_position)
return found_lnum return found_lnum
endif endif
endif endwhile
call setpos('.', saved_position) call setpos('.', saved_position)
return 0 return 0
endfunction endfunction
" 3. GetRubyIndent Function {{{1
" =========================
function GetRubyIndent(...)
" 3.1. Setup {{{2
" ----------
" The value of a single shift-width
if exists('*shiftwidth')
let sw = shiftwidth()
else
let sw = &sw
endif
" For the current line, use the first argument if given, else v:lnum
let clnum = a:0 ? a:1 : v:lnum
" Set up variables for restoring position in file. Could use clnum here.
let vcol = col('.')
" 3.2. Work on the current line {{{2
" -----------------------------
" Get the current line.
let line = getline(clnum)
let ind = -1
" If this line is an access modifier keyword, align according to the closest
" class declaration.
if g:ruby_indent_access_modifier_style == 'indent'
if s:Match(clnum, s:access_modifier_regex)
let class_line = s:FindContainingClass()
if class_line > 0
return indent(class_line) + sw
endif
endif
elseif g:ruby_indent_access_modifier_style == 'outdent'
if s:Match(clnum, s:access_modifier_regex)
let class_line = s:FindContainingClass()
if class_line > 0
return indent(class_line)
endif
endif
endif
" If we got a closing bracket on an empty line, find its match and indent
" according to it. For parentheses we indent to its column - 1, for the
" others we indent to the containing line's MSL's level. Return -1 if fail.
let col = matchend(line, '^\s*[]})]')
if col > 0 && !s:IsInStringOrComment(clnum, col)
call cursor(clnum, col)
let bs = strpart('(){}[]', stridx(')}]', line[col - 1]) * 2, 2)
if searchpair(escape(bs[0], '\['), '', bs[1], 'bW', s:skip_expr) > 0
if line[col-1]==')' && col('.') != col('$') - 1
let ind = virtcol('.') - 1
elseif g:ruby_indent_block_style == 'do'
let ind = indent(line('.'))
else " g:ruby_indent_block_style == 'expression'
let ind = indent(s:GetMSL(line('.')))
endif
endif
return ind
endif
" If we have a =begin or =end set indent to first column.
if match(line, '^\s*\%(=begin\|=end\)$') != -1
return 0
endif
" If we have a deindenting keyword, find its match and indent to its level.
" TODO: this is messy
if s:Match(clnum, s:ruby_deindent_keywords)
call cursor(clnum, 1)
if searchpair(s:end_start_regex, s:end_middle_regex, s:end_end_regex, 'bW',
\ s:end_skip_expr) > 0
let msl = s:GetMSL(line('.'))
let line = getline(line('.'))
if strpart(line, 0, col('.') - 1) =~ '=\s*$' &&
\ strpart(line, col('.') - 1, 2) !~ 'do'
" assignment to case/begin/etc, on the same line, hanging indent
let ind = virtcol('.') - 1
elseif g:ruby_indent_block_style == 'do'
" align to line of the "do", not to the MSL
let ind = indent(line('.'))
elseif getline(msl) =~ '=\s*\(#.*\)\=$'
" in the case of assignment to the MSL, align to the starting line,
" not to the MSL
let ind = indent(line('.'))
else
" align to the MSL
let ind = indent(msl)
endif
endif
return ind
endif
" If we are in a multi-line string or line-comment, don't do anything to it.
if s:IsInStringOrDocumentation(clnum, matchend(line, '^\s*') + 1)
return indent('.')
endif
" If we are at the closing delimiter of a "<<" heredoc-style string, set the
" indent to 0.
if line =~ '^\k\+\s*$'
\ && s:IsInStringDelimiter(clnum, 1)
\ && search('\V<<'.line, 'nbW') > 0
return 0
endif
" If the current line starts with a leading operator, add a level of indent.
if s:Match(clnum, s:leading_operator_regex)
return indent(s:GetMSL(clnum)) + sw
endif
" 3.3. Work on the previous line. {{{2
" -------------------------------
" Find a non-blank, non-multi-line string line above the current line.
let lnum = s:PrevNonBlankNonString(clnum - 1)
" If the line is empty and inside a string, use the previous line.
if line =~ '^\s*$' && lnum != prevnonblank(clnum - 1)
return indent(prevnonblank(clnum))
endif
" At the start of the file use zero indent.
if lnum == 0
return 0
endif
" Set up variables for the previous line.
let line = getline(lnum)
let ind = indent(lnum)
if g:ruby_indent_access_modifier_style == 'indent'
" If the previous line was a private/protected keyword, add a
" level of indent.
if s:Match(lnum, s:indent_access_modifier_regex)
return indent(lnum) + sw
endif
elseif g:ruby_indent_access_modifier_style == 'outdent'
" If the previous line was a private/protected/public keyword, add
" a level of indent, since the keyword has been out-dented.
if s:Match(lnum, s:access_modifier_regex)
return indent(lnum) + sw
endif
endif
if s:Match(lnum, s:continuable_regex) && s:Match(lnum, s:continuation_regex)
return indent(s:GetMSL(lnum)) + sw + sw
endif
" If the previous line ended with a block opening, add a level of indent.
if s:Match(lnum, s:block_regex)
let msl = s:GetMSL(lnum)
if g:ruby_indent_block_style == 'do'
" don't align to the msl, align to the "do"
let ind = indent(lnum) + sw
elseif getline(msl) =~ '=\s*\(#.*\)\=$'
" in the case of assignment to the msl, align to the starting line,
" not to the msl
let ind = indent(lnum) + sw
else
let ind = indent(msl) + sw
endif
return ind
endif
" If the previous line started with a leading operator, use its MSL's level
" of indent
if s:Match(lnum, s:leading_operator_regex)
return indent(s:GetMSL(lnum))
endif
" If the previous line ended with the "*" of a splat, add a level of indent
if line =~ s:splat_regex
return indent(lnum) + sw
endif
" If the previous line contained unclosed opening brackets and we are still
" in them, find the rightmost one and add indent depending on the bracket
" type.
"
" If it contained hanging closing brackets, find the rightmost one, find its
" match and indent according to that.
if line =~ '[[({]' || line =~ '[])}]\s*\%(#.*\)\=$'
let [opening, closing] = s:ExtraBrackets(lnum)
if opening.pos != -1
if opening.type == '(' && searchpair('(', '', ')', 'bW', s:skip_expr) > 0
if col('.') + 1 == col('$')
return ind + sw
else
return virtcol('.')
endif
else
let nonspace = matchend(line, '\S', opening.pos + 1) - 1
return nonspace > 0 ? nonspace : ind + sw
endif
elseif closing.pos != -1
call cursor(lnum, closing.pos + 1)
normal! %
if s:Match(line('.'), s:ruby_indent_keywords)
return indent('.') + sw
else
return indent(s:GetMSL(line('.')))
endif
else
call cursor(clnum, vcol)
end
endif
" If the previous line ended with an "end", match that "end"s beginning's
" indent.
let col = s:Match(lnum, '\%(^\|[^.:@$]\)\<end\>\s*\%(#.*\)\=$')
if col > 0
call cursor(lnum, col)
if searchpair(s:end_start_regex, '', s:end_end_regex, 'bW',
\ s:end_skip_expr) > 0
let n = line('.')
let ind = indent('.')
let msl = s:GetMSL(n)
if msl != n
let ind = indent(msl)
end
return ind
endif
end
let col = s:Match(lnum, s:ruby_indent_keywords)
if col > 0
call cursor(lnum, col)
let ind = virtcol('.') - 1 + sw
" TODO: make this better (we need to count them) (or, if a searchpair
" fails, we know that something is lacking an end and thus we indent a
" level
if s:Match(lnum, s:end_end_regex)
let ind = indent('.')
endif
return ind
endif
" 3.4. Work on the MSL line. {{{2
" --------------------------
" Set up variables to use and search for MSL to the previous line.
let p_lnum = lnum
let lnum = s:GetMSL(lnum)
" If the previous line wasn't a MSL.
if p_lnum != lnum
" If previous line ends bracket and begins non-bracket continuation decrease indent by 1.
if s:Match(p_lnum, s:bracket_switch_continuation_regex)
return ind - 1
" If previous line is a continuation return its indent.
" TODO: the || s:IsInString() thing worries me a bit.
elseif s:Match(p_lnum, s:non_bracket_continuation_regex) || s:IsInString(p_lnum,strlen(line))
return ind
endif
endif
" Set up more variables, now that we know we wasn't continuation bound.
let line = getline(lnum)
let msl_ind = indent(lnum)
" If the MSL line had an indenting keyword in it, add a level of indent.
" TODO: this does not take into account contrived things such as
" module Foo; class Bar; end
if s:Match(lnum, s:ruby_indent_keywords)
let ind = msl_ind + sw
if s:Match(lnum, s:end_end_regex)
let ind = ind - sw
endif
return ind
endif
" If the previous line ended with [*+/.,-=], but wasn't a block ending or a
" closing bracket, indent one extra level.
if s:Match(lnum, s:non_bracket_continuation_regex) && !s:Match(lnum, '^\s*\([\])}]\|end\)')
if lnum == p_lnum
let ind = msl_ind + sw
else
let ind = msl_ind
endif
return ind
endif
" }}}2
return ind
endfunction
" }}}1 " }}}1
let &cpo = s:cpo_save let &cpo = s:cpo_save

View File

@@ -3,7 +3,7 @@ if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'rust') == -1
" Vim indent file " Vim indent file
" Language: Rust " Language: Rust
" Author: Chris Morgan <me@chrismorgan.info> " Author: Chris Morgan <me@chrismorgan.info>
" Last Change: 2014 Sep 13 " Last Change: 2016 Jul 15
" 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")
@@ -134,6 +134,7 @@ function GetRustIndent(lnum)
\ && s:get_line_trimmed(a:lnum) !~ '^\s*[\[\]{}]' \ && s:get_line_trimmed(a:lnum) !~ '^\s*[\[\]{}]'
\ && prevline !~ '^\s*fn\s' \ && prevline !~ '^\s*fn\s'
\ && prevline !~ '([^()]\+,$' \ && prevline !~ '([^()]\+,$'
\ && s:get_line_trimmed(a:lnum) !~ '^\s*\S\+\s*=>'
" Oh ho! The previous line ended in a comma! I bet cindent will try to " Oh ho! The previous line ended in a comma! I bet cindent will try to
" take this too far... For now, let's normally use the previous line's " take this too far... For now, let's normally use the previous line's
" indent. " indent.
@@ -158,6 +159,8 @@ function GetRustIndent(lnum)
" if baz && (foo || " if baz && (foo ||
" bar) { " bar) {
" "
" Another case is when the current line is a new match arm.
"
" There are probably other cases where we don't want to do this as " There are probably other cases where we don't want to do this as
" well. Add them as needed. " well. Add them as needed.
return indent(prevlinenum) return indent(prevlinenum)

View File

@@ -1,42 +0,0 @@
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'haml') == -1
" Vim indent file
" Language: Sass
" Maintainer: Tim Pope <vimNOSPAM@tpope.org>
" Last Change: 2010 May 21
if exists("b:did_indent")
finish
endif
let b:did_indent = 1
setlocal autoindent sw=2 et
setlocal indentexpr=GetSassIndent()
setlocal indentkeys=o,O,*<Return>,<:>,!^F
" Only define the function once.
if exists("*GetSassIndent")
finish
endif
let s:property = '^\s*:\|^\s*[[:alnum:]#{}-]\+\%(:\|\s*=\)'
let s:extend = '^\s*\%(@extend\|@include\|+\)'
function! GetSassIndent()
let lnum = prevnonblank(v:lnum-1)
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 line !~ s:property && line !~ s:extend && cline =~ s:property
return indent + (exists('*shiftwidth') ? shiftwidth() : &sw)
else
return -1
endif
endfunction
" vim:set sw=2:
endif

View File

@@ -378,12 +378,17 @@ function! GetScalaIndent()
let prevline = scala#GetLine(prevlnum) let prevline = scala#GetLine(prevlnum)
let curlnum = v:lnum let curlnum = v:lnum
let curline = scala#GetLine(curlnum) let curline = scala#GetLine(curlnum)
if get(g:, 'scala_scaladoc_indent', 0)
let star_indent = 2
else
let star_indent = 1
end
if prevline =~ '^\s*/\*\*' if prevline =~ '^\s*/\*\*'
if prevline =~ '\*/\s*$' if prevline =~ '\*/\s*$'
return ind return ind
else else
return ind + 1 return ind + star_indent
endif endif
endif endif
@@ -538,7 +543,7 @@ function! GetScalaIndent()
if prevline =~ '^\s*\*/' if prevline =~ '^\s*\*/'
\ || prevline =~ '*/\s*$' \ || prevline =~ '*/\s*$'
call scala#ConditionalConfirm("18") call scala#ConditionalConfirm("18")
let ind = ind - 1 let ind = ind - star_indent
endif endif
if scala#LineEndsInIncomplete(prevline) if scala#LineEndsInIncomplete(prevline)

View File

@@ -1,16 +0,0 @@
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'haml') == -1
" Vim indent file
" Language: SCSS
" Maintainer: Tim Pope <vimNOSPAM@tpope.org>
" Last Change: 2010 Jul 26
if exists("b:did_indent")
finish
endif
runtime! indent/css.vim
" vim:set sw=2:
endif

48
indent/terraform.vim Normal file
View File

@@ -0,0 +1,48 @@
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'terraform') == -1
if exists("b:did_indent")
finish
endif
let b:did_indent = 1
setlocal nolisp
setlocal autoindent
setlocal indentexpr=TerraformIndent(v:lnum)
setlocal indentkeys+=<:>,0=},0=)
if exists("*TerraformIndent")
finish
endif
function! TerraformIndent(lnum)
" previous non-blank line
let prevlnum = prevnonblank(a:lnum-1)
" beginning of file?
if prevlnum == 0
return 0
endif
" previous line without comments
let prevline = substitute(getline(prevlnum), '//.*$', '', '')
let previndent = indent(prevlnum)
let thisindent = previndent
" block open?
if prevline =~ '[\[{]\s*$'
let thisindent += &sw
endif
" current line without comments
let thisline = substitute(getline(a:lnum), '//.*$', '', '')
" block close?
if thisline =~ '^\s*[\]}]'
let thisindent -= &sw
endif
return thisindent
endfunction
endif

80
indent/twig.vim Normal file
View File

@@ -0,0 +1,80 @@
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'twig') == -1
if exists("b:ran_once")
finish
endif
let b:ran_once = 1
let s:baseIndentExpr=&indentexpr
setlocal indentexpr=GetTwigIndent(v:lnum)
fun! GetTwigIndent(currentLineNumber)
let currentLine = getline(a:currentLineNumber)
let previousLineNumber = prevnonblank(a:currentLineNumber - 1)
let previousLine = getline(previousLineNumber)
if (previousLine =~ s:startStructures || previousLine =~ s:middleStructures) && (currentLine !~ s:endStructures && currentLine !~ s:middleStructures)
return indent(previousLineNumber) + &shiftwidth
elseif currentLine =~ s:endStructures || currentLine =~ s:middleStructures
let previousOpenStructureNumber = s:FindPreviousOpenStructure(a:currentLineNumber)
let previousOpenStructureLine = getline(previousOpenStructureNumber)
return indent(previousOpenStructureNumber)
endif
return s:CallBaseIndent()
endf
function! s:CallBaseIndent()
exe 'redir => s:outputOfBaseIndent'
exe 'silent echo ' . s:baseIndentExpr
exe 'redir END'
return split(s:outputOfBaseIndent)[0]
endf
function! s:FindPreviousOpenStructure(lineNumber)
let countOpen = 0
let countClosed = 0
let lineNumber = a:lineNumber
while lineNumber != 1 && countOpen <= countClosed
let lineNumber -= 1
let currentLine = getline(lineNumber)
if currentLine =~ s:startStructures
let countOpen += 1
elseif currentLine =~ s:endStructures
let countClosed += 1
endif
endwhile
return lineNumber
endfunction
function! s:StartStructure(name)
return '^\s*{%\s*' . a:name . '.*%}'
endfunction
function! s:EndStructure(name)
return '^\s*{%\s*end' . a:name . '.*%}'
endfunction
function! s:Map(Fun, list)
if len(a:list) == 0
return []
else
return [a:Fun(a:list[0])] + s:Map(a:Fun, a:list[1:])
endif
endfunction
fun! s:BuildStructures()
let structures = ['if','for','block']
let mStructures = ['elseif','else']
let s:startStructures = join(s:Map(function('s:StartStructure'), structures), '\|')
let s:endStructures = join(s:Map(function('s:EndStructure'), structures), '\|')
let s:middleStructures = join(s:Map(function('s:StartStructure'), mStructures), '\|')
endfun
call s:BuildStructures()
endif

View File

@@ -2,504 +2,362 @@ if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'typescript') ==
" Vim indent file " Vim indent file
" Language: Typescript " Language: Typescript
" Acknowledgement: Based off of vim-ruby maintained by Nikolai Weibull http://vim-ruby.rubyforge.org " Acknowledgement: Almost direct copy from https://github.com/pangloss/vim-javascript
" 0. Initialization {{{1
" =================
" 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') || get(g:, 'typescript_indent_disable', 0)
finish finish
endif endif
let b:did_indent = 1 let b:did_indent = 1
setlocal nosmartindent
" Now, set up our indentation expression and keys that trigger it. " Now, set up our indentation expression and keys that trigger it.
setlocal indentexpr=GetTypescriptIndent() setlocal indentexpr=GetTypescriptIndent()
setlocal formatexpr=Fixedgq(v:lnum,v:count) setlocal autoindent nolisp nosmartindent
setlocal indentkeys=0{,0},0),0],0\,,!^F,o,O,e setlocal indentkeys+=0],0)
let b:undo_indent = 'setlocal indentexpr< smartindent< autoindent< indentkeys<'
" Only define the function once. " Only define the function once.
if exists("*GetTypescriptIndent") if exists('*GetTypescriptIndent')
finish finish
endif endif
let s:cpo_save = &cpo let s:cpo_save = &cpo
set cpo&vim set cpo&vim
" 1. Variables {{{1 " Get shiftwidth value
" ============ if exists('*shiftwidth')
function s:sw()
return shiftwidth()
endfunction
else
function s:sw()
return &sw
endfunction
endif
let s:ts_keywords = '^\s*\(break\|case\|catch\|continue\|debugger\|default\|delete\|do\|else\|finally\|for\|function\|if\|in\|instanceof\|new\|return\|switch\|this\|throw\|try\|typeof\|var\|void\|while\|with\)' " searchpair() wrapper
if has('reltime')
function s:GetPair(start,end,flags,skip,time,...)
return searchpair('\m'.a:start,'','\m'.a:end,a:flags,a:skip,max([prevnonblank(v:lnum) - 2000,0] + a:000),a:time)
endfunction
else
function s:GetPair(start,end,flags,skip,...)
return searchpair('\m'.a:start,'','\m'.a:end,a:flags,a:skip,max([prevnonblank(v:lnum) - 1000,get(a:000,1)]))
endfunction
endif
" Regex of syntax group names that are or delimit string or are comments. " Regex of syntax group names that are or delimit string or are comments.
let s:syng_strcom = 'string\|regex\|comment\c' let s:syng_strcom = 'string\|comment\|regex\|special\|doc\|template\%(braces\)\@!'
let s:syng_str = 'string\|template\|special'
" Regex of syntax group names that are strings. let s:syng_com = 'comment\|doc'
let s:syng_string = 'regex\c'
" Regex of syntax group names that are strings or documentation.
let s:syng_multiline = 'comment\c'
" Regex of syntax group names that are line comment.
let s:syng_linecom = 'linecomment\c'
" Expression used to check whether we should skip a match with searchpair(). " Expression used to check whether we should skip a match with searchpair().
let s:skip_expr = "synIDattr(synID(line('.'),col('.'),1),'name') =~ '".s:syng_strcom."'" let s:skip_expr = "synIDattr(synID(line('.'),col('.'),0),'name') =~? '".s:syng_strcom."'"
let s:line_term = '\s*\%(\%(\/\/\).*\)\=$' function s:skip_func()
if !s:free || search('\m`\|\${\|\*\/','nW',s:looksyn)
" Regex that defines continuation lines, not including (, {, or [. let s:free = !eval(s:skip_expr)
let s:continuation_regex = '\%([\\*+/.:]\|\%(<%\)\@<![=-]\|\W[|&?]\|||\|&&\|[^=]=[^=].*,\)' . s:line_term let s:looksyn = line('.')
return !s:free
" Regex that defines continuation lines. endif
" TODO: this needs to deal with if ...: and so on let s:looksyn = line('.')
let s:msl_regex = s:continuation_regex return getline('.') =~ '\%<'.col('.').'c\/.\{-}\/\|\%>'.col('.').'c[''"]\|\\$' &&
\ eval(s:skip_expr)
let s:one_line_scope_regex = '\<\%(if\|else\|for\|while\)\>[^{;]*' . s:line_term
" Regex that defines blocks.
let s:block_regex = '\%([{[]\)\s*\%(|\%([*@]\=\h\w*,\=\s*\)\%(,\s*[*@]\=\h\w*\)*|\)\=' . s:line_term
let s:var_stmt = '^\s*var'
let s:comma_first = '^\s*,'
let s:comma_last = ',\s*$'
let s:ternary = '^\s\+[?|:]'
let s:ternary_q = '^\s\+?'
" 2. Auxiliary Functions {{{1
" ======================
" Check if the character at lnum:col is inside a string, comment, or is ascii.
function s:IsInStringOrComment(lnum, col)
return synIDattr(synID(a:lnum, a:col, 1), 'name') =~ s:syng_strcom
endfunction endfunction
" Check if the character at lnum:col is inside a string. function s:alternatePair(stop)
function s:IsInString(lnum, col) let pos = getpos('.')[1:2]
return synIDattr(synID(a:lnum, a:col, 1), 'name') =~ s:syng_string while search('\m[][(){}]','bW',a:stop)
endfunction if !s:skip_func()
let idx = stridx('])}',s:looking_at())
" Check if the character at lnum:col is inside a multi-line comment. if idx + 1
function s:IsInMultilineComment(lnum, col) if s:GetPair(['\[','(','{'][idx], '])}'[idx],'bW','s:skip_func()',2000,a:stop) <= 0
return !s:IsLineComment(a:lnum, a:col) && synIDattr(synID(a:lnum, a:col, 1), 'name') =~ s:syng_multiline break
endfunction endif
" Check if the character at lnum:col is a line comment.
function s:IsLineComment(lnum, col)
return synIDattr(synID(a:lnum, a:col, 1), 'name') =~ s:syng_linecom
endfunction
" Find line above 'lnum' that isn't empty, in a comment, or in a string.
function s:PrevNonBlankNonString(lnum)
let in_block = 0
let lnum = prevnonblank(a:lnum)
while lnum > 0
" Go in and out of blocks comments as necessary.
" If the line isn't empty (with opt. comment) or in a string, end search.
let line = getline(lnum)
if line =~ '/\*'
if in_block
let in_block = 0
else else
break return
endif endif
elseif !in_block && line =~ '\*/'
let in_block = 1
elseif !in_block && line !~ '^\s*\%(//\).*$' && !(s:IsInStringOrComment(lnum, 1) && s:IsInStringOrComment(lnum, strlen(line)))
break
endif endif
let lnum = prevnonblank(lnum - 1)
endwhile endwhile
return lnum call call('cursor',pos)
endfunction endfunction
" Find line above 'lnum' that started the continuation 'lnum' may be part of. function s:save_pos(f,...)
function s:GetMSL(lnum, in_one_line_scope) let l:pos = getpos('.')[1:2]
" Start on the line we're at and use its indent. let ret = call(a:f,a:000)
let msl = a:lnum call call('cursor',l:pos)
let lnum = s:PrevNonBlankNonString(a:lnum - 1) return ret
while lnum > 0 endfunction
" If we have a continuation line, or we're in a string, use line as MSL.
" Otherwise, terminate search as we have found our MSL already. function s:syn_at(l,c)
let line = getline(lnum) return synIDattr(synID(a:l,a:c,0),'name')
let col = match(line, s:msl_regex) + 1 endfunction
if (col > 0 && !s:IsInStringOrComment(lnum, col)) || s:IsInString(lnum, strlen(line))
let msl = lnum function s:looking_at()
return getline('.')[col('.')-1]
endfunction
function s:token()
return s:looking_at() =~ '\k' ? expand('<cword>') : s:looking_at()
endfunction
function s:previous_token()
let l:n = line('.')
if (s:looking_at() !~ '\k' || search('\m\<','cbW')) && search('\m\S','bW')
if (getline('.')[col('.')-2:col('.')-1] == '*/' || line('.') != l:n &&
\ getline('.') =~ '\%<'.col('.').'c\/\/') && s:syn_at(line('.'),col('.')) =~? s:syng_com
while search('\m\/\ze[/*]','cbW')
if !search('\m\S','bW')
break
elseif s:syn_at(line('.'),col('.')) !~? s:syng_com
return s:token()
endif
endwhile
else else
" Don't use lines that are part of a one line scope as msl unless the return s:token()
" flag in_one_line_scope is set to 1
"
if a:in_one_line_scope
break
end
let msl_one_line = s:Match(lnum, s:one_line_scope_regex)
if msl_one_line == 0
break
endif endif
endif endif
let lnum = s:PrevNonBlankNonString(lnum - 1) return ''
endwhile
return msl
endfunction endfunction
function s:RemoveTrailingComments(content) function s:others(p)
let single = '\/\/\(.*\)\s*$' return "((line2byte(line('.')) + col('.')) <= ".(line2byte(a:p[0]) + a:p[1]).") || ".s:skip_expr
let multi = '\/\*\(.*\)\*\/\s*$'
return substitute(substitute(a:content, single, '', ''), multi, '', '')
endfunction endfunction
" Find if the string is inside var statement (but not the first string) function s:tern_skip(p)
function s:InMultiVarStatement(lnum) return s:GetPair('{','}','nbW',s:others(a:p),200,a:p[0]) > 0
let lnum = s:PrevNonBlankNonString(a:lnum - 1)
" let type = synIDattr(synID(lnum, indent(lnum) + 1, 0), 'name')
" loop through previous expressions to find a var statement
while lnum > 0
let line = getline(lnum)
" if the line is a ts keyword
if (line =~ s:ts_keywords)
" check if the line is a var stmt
" if the line has a comma first or comma last then we can assume that we
" are in a multiple var statement
if (line =~ s:var_stmt)
return lnum
endif
" other ts keywords, not a var
return 0
endif
let lnum = s:PrevNonBlankNonString(lnum - 1)
endwhile
" beginning of program, not a var
return 0
endfunction endfunction
" Find line above with beginning of the var statement or returns 0 if it's not function s:tern_col(p)
" this statement return s:GetPair('?',':\@<!::\@!','nbW',s:others(a:p)
function s:GetVarIndent(lnum) \ .' || s:tern_skip('.string(a:p).')',200,a:p[0]) > 0
let lvar = s:InMultiVarStatement(a:lnum) endfunction
let prev_lnum = s:PrevNonBlankNonString(a:lnum - 1)
if lvar function s:label_col()
let line = s:RemoveTrailingComments(getline(prev_lnum)) let pos = getpos('.')[1:2]
let [s:looksyn,s:free] = pos
call s:alternatePair(0)
if s:save_pos('s:IsBlock')
let poss = getpos('.')[1:2]
return call('cursor',pos) || !s:tern_col(poss)
elseif s:looking_at() == ':'
return !s:tern_col([0,0])
endif
endfunction
" if the previous line doesn't end in a comma, return to regular indent " configurable regexes that define continuation lines, not including (, {, or [.
if (line !~ s:comma_last) let s:opfirst = '^' . get(g:,'typescript_opfirst',
return indent(prev_lnum) - &sw \ '\%([<>=,?^%|*/&]\|\([-.:+]\)\1\@!\|!=\|in\%(stanceof\)\=\>\)')
let s:continuation = get(g:,'typescript_continuation',
\ '\%([-+<>=,.~!?/*^%|&:]\|\<\%(typeof\|delete\|void\|in\|instanceof\)\)') . '$'
function s:continues(ln,con)
return !cursor(a:ln, match(' '.a:con,s:continuation)) &&
\ eval( (['s:syn_at(line("."),col(".")) !~? "regex"'] +
\ repeat(['getline(".")[col(".")-2] != tr(s:looking_at(),">","=")'],3) +
\ repeat(['s:previous_token() != "."'],5) + [1])[
\ index(split('/ > - + typeof in instanceof void delete'),s:token())])
endfunction
" get the line of code stripped of comments and move cursor to the last
" non-comment char.
function s:Trim(ln)
call cursor(a:ln+1,1)
call s:previous_token()
return strpart(getline('.'),0,col('.'))
endfunction
" Find line above 'lnum' that isn't empty or in a comment
function s:PrevCodeLine(lnum)
let l:n = prevnonblank(a:lnum)
while l:n
if getline(l:n) =~ '^\s*\/[/*]'
if (stridx(getline(l:n),'`') > 0 || getline(l:n-1)[-1:] == '\') &&
\ s:syn_at(l:n,1) =~? s:syng_str
return l:n
endif
let l:n = prevnonblank(l:n-1)
elseif getline(l:n) =~ '\([/*]\)\1\@![/*]' && s:syn_at(l:n,1) =~? s:syng_com
let l:n = s:save_pos('eval',
\ 'cursor('.l:n.',1) + search(''\m\/\*'',"bW")')
else else
return indent(lvar) + &sw return l:n
endif endif
endif endwhile
return -1
endfunction endfunction
" Check if line 'lnum' has a balanced amount of parentheses.
" Check if line 'lnum' has more opening brackets than closing ones. function s:Balanced(lnum)
function s:LineHasOpeningBrackets(lnum) let l:open = 0
let open_0 = 0 let l:line = getline(a:lnum)
let open_2 = 0 let pos = match(l:line, '[][(){}]', 0)
let open_4 = 0
let line = getline(a:lnum)
let pos = match(line, '[][(){}]', 0)
while pos != -1 while pos != -1
if !s:IsInStringOrComment(a:lnum, pos + 1) if s:syn_at(a:lnum,pos + 1) !~? s:syng_strcom
let idx = stridx('(){}[]', line[pos]) let l:open += match(' ' . l:line[pos],'[[({]')
if idx % 2 == 0 if l:open < 0
let open_{idx} = open_{idx} + 1 return
else
let open_{idx - 1} = open_{idx - 1} - 1
endif endif
endif endif
let pos = match(line, '[][(){}]', pos + 1) let pos = match(l:line, '[][(){}]', pos + 1)
endwhile endwhile
return (open_0 > 0) . (open_2 > 0) . (open_4 > 0) return !l:open
endfunction endfunction
function s:Match(lnum, regex) function s:OneScope(lnum)
let col = match(getline(a:lnum), a:regex) + 1 let pline = s:Trim(a:lnum)
return col > 0 && !s:IsInStringOrComment(a:lnum, col) ? col : 0 let kw = 'else do'
if pline[-1:] == ')' && s:GetPair('(', ')', 'bW', s:skip_expr, 100) > 0
call s:previous_token()
let kw = 'for if let while with'
if index(split('await each'),s:token()) + 1
call s:previous_token()
let kw = 'for'
endif
endif
return pline[-2:] == '=>' || index(split(kw),s:token()) + 1 &&
\ s:save_pos('s:previous_token') != '.'
endfunction endfunction
function s:IndentWithContinuation(lnum, ind, width) " returns braceless levels started by 'i' and above lines * &sw. 'num' is the
" Set up variables to use and search for MSL to the previous line. " lineNr which encloses the entire context, 'cont' if whether line 'i' + 1 is
let p_lnum = a:lnum " a continued expression, which could have started in a braceless context
let lnum = s:GetMSL(a:lnum, 1) function s:iscontOne(i,num,cont)
let line = getline(lnum) let [l:i, l:num, bL] = [a:i, a:num + !a:num, 0]
let pind = a:num ? indent(l:num) + s:W : 0
" If the previous line wasn't a MSL and is continuation return its indent. let ind = indent(l:i) + (a:cont ? 0 : s:W)
" TODO: the || s:IsInString() thing worries me a bit. while l:i >= l:num && (ind > pind || l:i == l:num)
if p_lnum != lnum if indent(l:i) < ind && s:OneScope(l:i)
if s:Match(p_lnum,s:continuation_regex)||s:IsInString(p_lnum,strlen(line)) let bL += s:W
return a:ind let l:i = line('.')
elseif !a:cont || bL || ind < indent(a:i)
break
endif endif
endif let ind = min([ind, indent(l:i)])
let l:i = s:PrevCodeLine(l:i - 1)
" Set up more variables now that we know we aren't continuation bound. endwhile
let msl_ind = indent(lnum) return bL
" If the previous line ended with [*+/.-=], start a continuation that
" indents an extra level.
if s:Match(lnum, s:continuation_regex)
if lnum == p_lnum
return msl_ind + a:width
else
return msl_ind
endif
endif
return a:ind
endfunction endfunction
function s:InOneLineScope(lnum) " https://github.com/sweet-js/sweet.js/wiki/design#give-lookbehind-to-the-reader
let msl = s:GetMSL(a:lnum, 1) function s:IsBlock()
if msl > 0 && s:Match(msl, s:one_line_scope_regex) if s:looking_at() == '{'
return msl let l:n = line('.')
let char = s:previous_token()
if match(s:stack,'xml\|jsx') + 1 && s:syn_at(line('.'),col('.')-1) =~? 'xml\|jsx'
return char != '{'
elseif char =~ '\k'
return index(split('return const let import export yield default delete var await void typeof throw case new in instanceof')
\ ,char) < (line('.') != l:n) || s:previous_token() == '.'
elseif char == '>'
return getline('.')[col('.')-2] == '=' || s:syn_at(line('.'),col('.')) =~? '^jsflow'
elseif char == ':'
return getline('.')[col('.')-2] != ':' && s:label_col()
elseif char == '/'
return s:syn_at(line('.'),col('.')) =~? 'regex'
endif
return char !~ '[=~!<*,?^%|&([]' &&
\ (char !~ '[-+]' || l:n != line('.') && getline('.')[col('.')-2] == char)
endif endif
return 0
endfunction endfunction
function s:ExitingOneLineScope(lnum)
let msl = s:GetMSL(a:lnum, 1)
if msl > 0
" if the current line is in a one line scope ..
if s:Match(msl, s:one_line_scope_regex)
return 0
else
let prev_msl = s:GetMSL(msl - 1, 1)
if s:Match(prev_msl, s:one_line_scope_regex)
return prev_msl
endif
endif
endif
return 0
endfunction
" 3. GetTypescriptIndent Function {{{1
" =========================
function GetTypescriptIndent() function GetTypescriptIndent()
" 3.1. Setup {{{2 let b:js_cache = get(b:,'js_cache',[0,0,0])
" ----------
" Set up variables for restoring position in file. Could use v:lnum here.
let vcol = col('.')
" 3.2. Work on the current line {{{2
" -----------------------------
let ind = -1
" Get the current line. " Get the current line.
let line = getline(v:lnum) call cursor(v:lnum,1)
" previous nonblank line number let l:line = getline('.')
let prevline = prevnonblank(v:lnum - 1) " use synstack as it validates syn state and works in an empty line
let s:stack = synstack(v:lnum,1)
let syns = synIDattr(get(s:stack,-1),'name')
" If we got a closing bracket on an empty line, find its match and indent " start with strings,comments,etc.
" according to it. For parentheses we indent to its column - 1, for the if syns =~? s:syng_com
" others we indent to the containing line's MSL's level. Return -1 if fail. if l:line =~ '^\s*\*'
let col = matchend(line, '^\s*[],})]')
if col > 0 && !s:IsInStringOrComment(v:lnum, col)
call cursor(v:lnum, col)
let lvar = s:InMultiVarStatement(v:lnum)
if lvar
let prevline_contents = s:RemoveTrailingComments(getline(prevline))
" check for comma first
if (line[col - 1] =~ ',')
" if the previous line ends in comma or semicolon don't indent
if (prevline_contents =~ '[;,]\s*$')
return indent(s:GetMSL(line('.'), 0))
" get previous line indent, if it's comma first return prevline indent
elseif (prevline_contents =~ s:comma_first)
return indent(prevline)
" otherwise we indent 1 level
else
return indent(lvar) + &sw
endif
endif
endif
let bs = strpart('(){}[]', stridx(')}]', line[col - 1]) * 2, 2)
if searchpair(escape(bs[0], '\['), '', bs[1], 'bW', s:skip_expr) > 0
if line[col-1]==')' && col('.') != col('$') - 1
let ind = virtcol('.')-1
else
let ind = indent(s:GetMSL(line('.'), 0))
endif
endif
return ind
endif
" If the line is comma first, dedent 1 level
if (getline(prevline) =~ s:comma_first)
return indent(prevline) - &sw
endif
if (line =~ s:ternary)
if (getline(prevline) =~ s:ternary_q)
return indent(prevline)
else
return indent(prevline) + &sw
endif
endif
" If we are in a multi-line comment, cindent does the right thing.
if s:IsInMultilineComment(v:lnum, 1) && !s:IsLineComment(v:lnum, 1)
return cindent(v:lnum) return cindent(v:lnum)
elseif l:line !~ '^\s*\/[/*]'
return -1
endif
elseif syns =~? s:syng_str && l:line !~ '^[''"]'
if b:js_cache[0] == v:lnum - 1 && s:Balanced(v:lnum-1)
let b:js_cache[0] = v:lnum
endif
return -1
endif
let l:lnum = s:PrevCodeLine(v:lnum - 1)
if !l:lnum
return
endif endif
" Check for multiple var assignments let l:line = substitute(l:line,'^\s*','','')
" let var_indent = s:GetVarIndent(v:lnum) if l:line[:1] == '/*'
" if var_indent >= 0 let l:line = substitute(l:line,'^\%(\/\*.\{-}\*\/\s*\)*','','')
" return var_indent endif
" endif if l:line =~ '^\/[/*]'
let l:line = ''
" 3.3. Work on the previous line. {{{2
" -------------------------------
" If the line is empty and the previous nonblank line was a multi-line
" comment, use that comment's indent. Deduct one char to account for the
" space in ' */'.
if line =~ '^\s*$' && s:IsInMultilineComment(prevline, 1)
return indent(prevline) - 1
endif endif
" Find a non-blank, non-multi-line string line above the current line. " the containing paren, bracket, or curly. Many hacks for performance
let lnum = s:PrevNonBlankNonString(v:lnum - 1) let idx = index([']',')','}'],l:line[0])
if b:js_cache[0] >= l:lnum && b:js_cache[0] < v:lnum &&
" If the line is empty and inside a string, use the previous line. \ (b:js_cache[0] > l:lnum || s:Balanced(l:lnum))
if line =~ '^\s*$' && lnum != prevline call call('cursor',b:js_cache[1:])
return indent(prevnonblank(v:lnum))
endif
" At the start of the file use zero indent.
if lnum == 0
return 0
endif
" Set up variables for current line.
let line = getline(lnum)
let ind = indent(lnum)
" If the previous line ended with a block opening, add a level of indent.
if s:Match(lnum, s:block_regex)
return indent(s:GetMSL(lnum, 0)) + &sw
endif
" If the previous line contained an opening bracket, and we are still in it,
" add indent depending on the bracket type.
if line =~ '[[({]'
let counts = s:LineHasOpeningBrackets(lnum)
if counts[0] == '1' && searchpair('(', '', ')', 'bW', s:skip_expr) > 0
if col('.') + 1 == col('$')
return ind + &sw
else else
return virtcol('.') let [s:looksyn, s:free, top] = [v:lnum - 1, 1, (!indent(l:lnum) &&
endif \ s:syn_at(l:lnum,1) !~? s:syng_str) * l:lnum]
elseif counts[1] == '1' || counts[2] == '1' if idx + 1
return ind + &sw call s:GetPair(['\[','(','{'][idx],'])}'[idx],'bW','s:skip_func()',2000,top)
elseif getline(v:lnum) !~ '^\S' && syns =~? 'block'
call s:GetPair('{','}','bW','s:skip_func()',2000,top)
else else
call cursor(v:lnum, vcol) call s:alternatePair(top)
end endif
endif endif
" 3.4. Work on the MSL line. {{{2 let b:js_cache = [v:lnum] + (line('.') == v:lnum ? [0,0] : getpos('.')[1:2])
" -------------------------- let num = b:js_cache[1]
let ind_con = ind let [s:W, isOp, bL, switch_offset] = [s:sw(),0,0,0]
let ind = s:IndentWithContinuation(lnum, ind_con, &sw) if !num || s:IsBlock()
let ilnum = line('.')
" }}}2 let pline = s:save_pos('s:Trim',l:lnum)
" if num && s:looking_at() == ')' && s:GetPair('(', ')', 'bW', s:skip_expr, 100) > 0
" let num = ilnum == num ? line('.') : num
let ols = s:InOneLineScope(lnum) if idx < 0 && s:previous_token() ==# 'switch' && s:previous_token() != '.'
if ols > 0 if &cino !~ ':'
let ind = ind + &sw let switch_offset = s:W
else else
let ols = s:ExitingOneLineScope(lnum) let cinc = matchlist(&cino,'.*:\zs\(-\)\=\(\d*\)\(\.\d\+\)\=\(s\)\=\C')
while ols > 0 && ind > 0 let switch_offset = max([cinc[0] is '' ? 0 : (cinc[1].1) *
let ind = ind - &sw \ ((strlen(cinc[2].cinc[3]) ? str2nr(cinc[2].str2nr(cinc[3][1])) : 10) *
let ols = s:InOneLineScope(ols - 1) \ (cinc[4] is '' ? 1 : s:W)) / 10, -indent(num)])
endwhile endif
if pline[-1:] != '.' && l:line =~# '^\%(default\|case\)\>'
return indent(num) + switch_offset
endif
endif
endif
if idx < 0 && pline !~ '[{;]$'
if pline =~# ':\@<!:$'
call cursor(l:lnum,strlen(pline))
let isOp = s:tern_col(b:js_cache[1:2]) * s:W
else
let isOp = (l:line =~# s:opfirst || s:continues(l:lnum,pline)) * s:W
endif
let bL = s:iscontOne(l:lnum,b:js_cache[1],isOp)
let bL -= (bL && l:line[0] == '{') * s:W
endif
endif endif
return ind " main return
if idx + 1 || l:line[:1] == '|}'
return indent(num)
elseif num
return indent(num) + s:W + switch_offset + bL + isOp
endif
return bL + isOp
endfunction endfunction
" }}}1
let &cpo = s:cpo_save let &cpo = s:cpo_save
unlet s:cpo_save unlet s:cpo_save
function! Fixedgq(lnum, count)
let l:tw = &tw ? &tw : 80
let l:count = a:count
let l:first_char = indent(a:lnum) + 1
if mode() == 'i' " gq was not pressed, but tw was set
return 1
endif
" This gq is only meant to do code with strings, not comments
if s:IsLineComment(a:lnum, l:first_char) || s:IsInMultilineComment(a:lnum, l:first_char)
return 1
endif
if len(getline(a:lnum)) < l:tw && l:count == 1 " No need for gq
return 1
endif
" Put all the lines on one line and do normal spliting after that
if l:count > 1
while l:count > 1
let l:count -= 1
normal J
endwhile
endif
let l:winview = winsaveview()
call cursor(a:lnum, l:tw + 1)
let orig_breakpoint = searchpairpos(' ', '', '\.', 'bcW', '', a:lnum)
call cursor(a:lnum, l:tw + 1)
let breakpoint = searchpairpos(' ', '', '\.', 'bcW', s:skip_expr, a:lnum)
" No need for special treatment, normal gq handles edgecases better
if breakpoint[1] == orig_breakpoint[1]
call winrestview(l:winview)
return 1
endif
" Try breaking after string
if breakpoint[1] <= indent(a:lnum)
call cursor(a:lnum, l:tw + 1)
let breakpoint = searchpairpos('\.', '', ' ', 'cW', s:skip_expr, a:lnum)
endif
if breakpoint[1] != 0
call feedkeys("r\<CR>")
else
let l:count = l:count - 1
endif
" run gq on new lines
if l:count == 1
call feedkeys("gqq")
endif
return 0
endfunction
endif endif

View File

@@ -1,36 +1,87 @@
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'vala') == -1 if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'vala') == -1
" Copyright (c) 2012 Takezoe Tomoaki <tkztmk@outlook.com> " Vim indent file
" " Language: Vala
" Permission is hereby granted, free of charge, to any person obtaining a copy " Author: Adrià Arrufat <adria.arrufat@protonmail.ch>
" of " Last Change: 2016 Dec 04
" this software and associated documentation files (the "Software"), to deal in
" the Software without restriction, including without limitation the rights to
" use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
" of
" the Software, and to permit persons to whom the Software is furnished to do
" so,
" subject to the following conditions:
"
" The above copyright notice and this permission notice shall be included in all
" copies or substantial portions of the Software.
"
" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
" IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
" FITNESS
" FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
" COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
" IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
" CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
" Vim indent file for Vala. " Only load this indent file when no other was loaded.
" It just sets cindent for Vala files...
if exists("b:did_indent") if exists("b:did_indent")
finish finish
endif endif
let b:did_indent = 1 let b:did_indent = 1
setl cin
let b:undo_indent = "setl cin<"
setlocal cindent
setlocal cinoptions=L0,(0,Ws,J1,j1
setlocal cinkeys=0{,0},!^F,o,O,0[,0]
" Some preliminary settings
setlocal nolisp " Make sure lisp indenting doesn't supersede us
setlocal autoindent " indentexpr isn't much help otherwise
setlocal indentexpr=GetValaIndent(v:lnum)
" Only define the function once.
if exists("*GetValaIndent")
finish
endif
" Come here when loading the script the first time.
function GetValaIndent(lnum)
" Hit the start of the file, use zero indent.
if a:lnum == 0
return 0
endif
" Starting assumption: cindent (called at the end) will do it right
" normally. We just want to fix up a few cases.
let line = getline(a:lnum)
" Search backwards for the previous non-empty line.
let prevlinenum = prevnonblank(a:lnum - 1)
let prevline = getline(prevlinenum)
while prevlinenum > 1 && prevline !~ '[^[:blank:]]'
let prevlinenum = prevnonblank(prevlinenum - 1)
let prevline = s:getline(prevlinenum)
endwhile
" If previous line contains a code attribute (e.g. [CCode (...)])
" don't increase the indentation
if prevline =~? '^\s*\[[A-Za-z]' && prevline =~? '\]$'
return indent(prevlinenum)
endif
" cindent gets lambda body wrong, as it treats the comma as indicating an
" unfinished statement (fix borrowed from rust.vim indent file):
"
" list.foreach ((entry) => {
" stdout.puts (entry);
" stdout.putc ('\n');
" if (entry == null) {
" print ("empty entry\n");
" }
" });
"
" and we want it to be:
" list.foreach ((entry) => {
" stdout.puts (entry);
" stdout.putc ('\n');
" if (entry == null) {
" print ("empty entry\n");
" }
" });
if prevline[len(prevline) - 1] == ","
\ && line !~ '^\s*[\[\]{}]'
\ && prevline !~ '([^()]\+,$'
\ && line !~ '^\s*\S\+\s*=>'
return indent(prevlinenum)
endif
" Fall back on cindent, which does it mostly right
return cindent(a:lnum)
endfunction
endif endif

45
indent/vue.vim Normal file
View File

@@ -0,0 +1,45 @@
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'vue') == -1
" Vim indent file
" Language: Vue.js
" Maintainer: Eduardo San Martin Morote
" Author: Adriaan Zonnenberg
if exists("b:did_indent")
finish
endif
" Load indent files for required languages
for language in ['stylus', 'pug', 'css', 'javascript', 'html', 'coffee']
unlet! b:did_indent
exe "runtime! indent/".language.".vim"
exe "let s:".language."indent = &indentexpr"
endfor
let b:did_indent = 1
setlocal indentexpr=GetVueIndent()
if exists("*GetVueIndent")
finish
endif
function! GetVueIndent()
if searchpair('<template lang="pug"', '', '</template>', 'bWr')
exe "let indent = ".s:pugindent
elseif searchpair('<style lang="stylus"', '', '</style>', 'bWr')
exe "let indent = ".s:stylusindent
elseif searchpair('<style', '', '</style>', 'bWr')
exe "let indent = ".s:cssindent
elseif searchpair('<script lang="coffee"', '', '</script>', 'bWr')
exe "let indent = ".s:coffeeindent
elseif searchpair('<script', '', '</script>', 'bWr')
exe "let indent = ".s:javascriptindent
else
exe "let indent = ".s:htmlindent
endif
return indent > -1 ? indent : s:htmlindent
endfunction
endif

38
syntax/apiblueprint.vim Normal file
View File

@@ -0,0 +1,38 @@
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'apiblueprint') == -1
runtime! syntax/markdown.vim
unlet! b:current_syntax
" Metadata
syntax region apibMarkdownMetadata start=/\%^.*:.*$/ end=/^$/ contains=apibMarkdownMetadataKey,apibMarkdownMetadataValue fold
syntax match apibMarkdownMetadataKey /^[^:]*\ze:/ contained
syntax match apibMarkdownMetadataValue /:.*/ contained
syntax region apibHTTPStatusCode start=/\d\d\d/ end=// contained containedin=apibResponseSection
syntax region apibHTTPContentType start=/(.*)/ end=// contained containedin=apibResponseSection
syntax region apibModelSection start=/^+ Model/ end=/$/ oneline
syntax region apibRequestSection start=/^[-+*] Request.*/ end=/^$/ contains=apibHTTPContentType
syntax region apibResponseSection start=/^[-+*] Response \d\d\d/ end=/^$/ contains=apibHTTPStatusCode,apibHTTPContentType
syntax region apibHeadersSection start=/^+ Headers$/ end=/^\S.*$/ contains=apibHeadersSectionKey,apibHeadersSectionValue
syntax region apibActionRelationKey start=/: .*/ end=/$/ contained
syntax region apibActionRelation start=/^[-+*] Relation: .*$/ end=/$/ oneline contains=apibActionRelationKey
syntax match apibHeadersSectionKey /^[^:]*\ze:/ contained
syntax match apibHeadersSectionValue /:.*/ contained
highlight default link apibMarkdownMetadataKey Function
highlight default link apibRequestSection Function
highlight default link apibResponseSection Function
highlight default link apibModelSection Function
highlight default link apibHeadersSectionKey Function
highlight default link apibHTTPStatusCode Delimiter
highlight default link apibHTTPContentType Comment
highlight default link apibActionRelation Function
highlight default link apibActionRelationKey Identifier
let b:current_syntax = 'apiblueprint'
endif

249
syntax/applescript.vim Normal file
View File

@@ -0,0 +1,249 @@
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'applescript') == -1
" Vim syntax file
" Language: AppleScript
" Maintainer: Jim Eberle <jim.eberle@fastnlight.com>
" Last Change: Mar 18, 2010
" URL: http://www.fastnlight.com/syntax/applescript.vim
" Use :syn w/in a buffer to see language element breakdown
if version < 600
syntax clear
elseif exists("b:current_syntax")
finish
endif
" --- Statement ---
syn keyword scptStmt get set count copy run global local prop property
syn keyword scptStmt close put delete duplicate exists
syn keyword scptStmt launch open print quit make move reopen save
syn keyword scptStmt saving into
hi def link scptStmt Statement
" --- Type ---
syn keyword scptType text string number integer real color date
hi def link scptType Type
" --- Operator ---
syn keyword scptOp div mod not and or as
syn match scptOp "[-+*/^&]"
" MacRoman single char :- (divide)
exec 'syn match scptOp "'.nr2char(214).'"'
syn match scptOp "\<\(a \)\?\(ref\( to\)\?\|reference to\)\>"
hi def link scptOp Operator
" Containment
syn match scptIN "\<starts\? with\>"
syn match scptIN "\<begins\? with\>"
syn match scptIN "\<ends\? with\>"
syn match scptIN "\<contains\>"
syn match scptIN "\<does not contain\>"
syn match scptIN "\<doesn't contain\>"
syn match scptIN "\<is in\>"
syn match scptIN "\<is contained by\>"
syn match scptIN "\<is not in\>"
syn match scptIN "\<is not contained by\>"
syn match scptIN "\<isn't contained by\>"
hi def link scptIN scptOp
" Equals
syn match scptEQ "="
syn match scptEQ "\<equal\>"
syn match scptEQ "\<equals\>"
syn match scptEQ "\<equal to\>"
syn match scptEQ "\<is\>"
syn match scptEQ "\<is equal to\>"
hi def link scptEQ scptOp
" Not Equals
syn match scptNE "\<does not equal\>"
syn match scptNE "\<doesn't equal\>"
syn match scptNE "\<is not\>"
syn match scptNE "\<is not equal\( to\)\?\>"
syn match scptNE "\<isn't\>"
syn match scptNE "\<isn't equal\( to\)\?\>"
hi def link scptNE scptOp
" MacRoman single char /=
exec 'syn match scptNE "'.nr2char(173).'"'
" Less Than
syn match scptLT "<"
syn match scptLT "\<comes before\>"
syn match scptLT "\(is \)\?less than"
syn match scptLT "\<is not greater than or equal\( to\)\?\>"
syn match scptLT "\<isn't greater than or equal\( to\)\?\>"
hi def link scptLT scptOp
" Greater Than
syn match scptGT ">"
syn match scptGT "\<comes after\>"
syn match scptGT "\(is \)\?greater than"
syn match scptGT "\<is not less than or equal\( to\)\?\>"
syn match scptGT "\<isn't less than or equal\( to\)\?\>"
hi def link scptGT scptOp
" Less Than or Equals
syn match scptLE "<="
syn match scptLE "\<does not come after\>"
syn match scptLE "\<doesn't come after\>"
syn match scptLE "\(is \)\?less than or equal\( to\)\?"
syn match scptLE "\<is not greater than\>"
syn match scptLE "\<isn't greater than\>"
hi def link scptLE scptOp
" MacRoman single char <=
exec 'syn match scptLE "'.nr2char(178).'"'
" Greater Than or Equals
syn match scptGE ">="
syn match scptGE "\<does not come before\>"
syn match scptGE "\<doesn't come before\>"
syn match scptGE "\(is \)\?greater than or equal\( to\)\?"
syn match scptGE "\<is not less than\>"
syn match scptGE "\<isn't less than\>"
hi def link scptGE scptOp
" MacRoman single char >=
exec 'syn match scptGE "'.nr2char(179).'"'
" --- Constant String ---
syn region scptString start=+"+ skip=+\\\\\|\\"+ end=+"+
hi def link scptString String
" --- Constant Number ---
syn match scptNumber "\<-\?\d\+\>"
hi def link scptNumber Number
" --- Constant Float ---
syn match scptFloat display contained "\d\+\.\d*\(e[-+]\=\d\+\)\="
syn match scptFloat display contained "\.\d\+\(e[-+]\=\d\+\)\=\>"
syn match scptFloat display contained "\d\+e[-+]\>"
hi def link scptFloat Float
" --- Constant Boolean ---
syn keyword scptBoolean true false yes no ask
hi def link scptBoolean Boolean
" --- Other Constants ---
syn keyword scptConst it me version pi result space tab anything
syn match scptConst "\<missing value\>"
" Considering and Ignoring
syn match scptConst "\<application responses\>"
syn match scptConst "\<current application\>"
syn match scptConst "\<white space\>"
syn keyword scptConst case diacriticals expansion hyphens punctuation
hi def link scptConst Constant
" Style
syn match scptStyle "\<all caps\>"
syn match scptStyle "\<all lowercase\>"
syn match scptStyle "\<small caps\>"
syn keyword scptStyle bold condensed expanded hidden italic outline plain
syn keyword scptStyle shadow strikethrough subscript superscript underline
hi def link scptStyle scptConst
" Day
syn keyword scptDay Mon Tue Wed Thu Fri Sat Sun
syn keyword scptDay Monday Tuesday Wednesday Thursday Friday Saturday Sunday
syn keyword scptDay weekday
hi def link scptDay scptConst
" Month
syn keyword scptMonth Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
syn keyword scptMonth January February March
syn keyword scptMonth April May June
syn keyword scptMonth July August September
syn keyword scptMonth October November December
syn keyword scptMonth month
hi def link scptMonth scptConst
" Time
syn keyword scptTime minutes hours days weeks
hi def link scptTime scptConstant
" --- Conditional ---
syn keyword scptCond if then else
syn match scptCond "\<end if\>"
hi def link scptCond Conditional
" --- Repeat ---
syn keyword scptRepeat repeat with from to by continue
syn match scptRepeat "\<repeat while\>"
syn match scptRepeat "\<repeat until\>"
syn match scptRepeat "\<repeat with\>"
syn match scptRepeat "\<end repeat\>"
hi def link scptRepeat Repeat
" --- Exception ---
syn keyword scptException try error
syn match scptException "\<on error\>"
syn match scptException "\<end try\>"
syn match scptException "\<end error\>"
hi def link scptException Exception
" --- Keyword ---
syn keyword scptKeyword end tell times exit
syn keyword scptKeyword application file alias activate
syn keyword scptKeyword script on return without given
syn keyword scptKeyword considering ignoring items delimiters
syn keyword scptKeyword some each every whose where id index item its
syn keyword scptKeyword first second third fourth fifth sixth seventh
syn keyword scptKeyword eighth ninth tenth container
syn match scptKeyword "\d\+\(st\|nd\|rd\|th\)"
syn keyword scptKeyword last front back middle named thru through
syn keyword scptKeyword before after in of the
syn match scptKeyword "\<text \>"
syn match scptKeyword "\<partial result\>"
syn match scptKeyword "\<but ignoring\>"
syn match scptKeyword "\<but considering\>"
syn match scptKeyword "\<with timeout\>"
syn match scptKeyword "\<with transaction\>"
syn match scptKeyword "\<do script\>"
syn match scptKeyword "\<POSIX path\>"
syn match scptKeyword "\<quoted form\>"
syn match scptKeyword "'s"
hi def link scptKeyword Keyword
" US Units
syn keyword scptUnitUS quarts gallons ounces pounds inches feet yards miles
syn match scptUnitUS "\<square feet\>"
syn match scptUnitUS "\<square yards\>"
syn match scptUnitUS "\<square miles\>"
syn match scptUnitUS "\<cubic inches\>"
syn match scptUnitUS "\<cubic feet\>"
syn match scptUnitUS "\<cubic yards\>"
syn match scptUnitUS "\<degrees Fahrenheit\>"
hi def link scptUnitUS scptKey
" British Units
syn keyword scptUnitBT litres centimetres metres kilometres
syn match scptUnitBT "\<square metres\>"
syn match scptUnitBT "\<square kilometres\>"
syn match scptUnitBT "\<cubic centimetres\>"
syn match scptUnitBT "\<cubic metres\>"
hi def link scptUnitBT scptKey
" Metric Units
syn keyword scptUnitMT liters centimeters meters kilometers grams kilograms
syn match scptUnitMT "\<square meters\>"
syn match scptUnitMT "\<square kilometers\>"
syn match scptUnitMT "\<cubic centimeters\>"
syn match scptUnitMT "\<cubic meters\>"
syn match scptUnitMT "\<degrees Celsius\>"
syn match scptUnitMT "\<degrees Kelvin\>"
hi def link scptUnitMT scptKey
" --- Comment ---
syn match scptComment "--.*"
syn match scptComment "#.*"
syn region scptComment start="(\*" end="\*)"
hi def link scptComment Comment
" --- Todo ---
syn keyword scptTodo contained TODO FIXME XXX
hi def link scptTodo Todo
let b:current_syntax = "applescript"
endif

View File

@@ -22,7 +22,7 @@ syn case match
syn clear htmlError syn clear htmlError
if has('patch-7.4.1142') if has('patch-7.4.1142')
syn iskeyword @,48-57,_,192-255,@-@ syn iskeyword @,48-57,_,192-255,@-@,:
else else
setlocal iskeyword+=@-@ setlocal iskeyword+=@-@
endif endif
@@ -31,17 +31,36 @@ syn region bladeEcho matchgroup=bladeDelimiter start="@\@<!{{" end="}}"
syn region bladeEcho matchgroup=bladeDelimiter start="{!!" end="!!}" contains=@bladePhp,bladePhpParenBlock containedin=ALLBUT,@bladeExempt keepend syn region bladeEcho matchgroup=bladeDelimiter start="{!!" end="!!}" contains=@bladePhp,bladePhpParenBlock containedin=ALLBUT,@bladeExempt keepend
syn region bladeComment matchgroup=bladeDelimiter start="{{--" end="--}}" contains=bladeTodo containedin=ALLBUT,@bladeExempt keepend syn region bladeComment matchgroup=bladeDelimiter start="{{--" end="--}}" contains=bladeTodo containedin=ALLBUT,@bladeExempt keepend
syn keyword bladeKeyword @if @elseif @foreach @forelse @for @while @can @include @each @inject @extends @section @stack @push @unless @yield @parent @hasSection nextgroup=bladePhpParenBlock skipwhite containedin=ALLBUT,@bladeExempt syn keyword bladeKeyword @if @elseif @foreach @forelse @for @while @can @cannot @elsecan @elsecannot @include
syn keyword bladeKeyword @else @endif @endunless @endfor @endforeach @empty @endforelse @endwhile @endcan @stop @append @endsection @endpush @show containedin=ALLBUT,@bladeExempt \ @includeIf @each @inject @extends @section @stack @push @unless @yield @parent @hasSection @break @continue
\ @unset @lang @choice @component @slot @prepend
\ nextgroup=bladePhpParenBlock skipwhite containedin=ALLBUT,@bladeExempt
syn keyword bladeKeyword @else @endif @endunless @endfor @endforeach @empty @endforelse @endwhile @endcan
\ @endcannot @stop @append @endsection @endpush @show @overwrite @verbatim @endverbatim @endcomponent
\ @endslot @endprepend
\ containedin=ALLBUT,@bladeExempt
if exists('g:blade_custom_directives')
exe "syn keyword bladeKeyword @" . join(g:blade_custom_directives, ' @') . " nextgroup=bladePhpParenBlock skipwhite containedin=ALLBUT,@bladeExempt"
endif
if exists('g:blade_custom_directives_pairs')
exe "syn keyword bladeKeyword @" . join(keys(g:blade_custom_directives_pairs), ' @') . " nextgroup=bladePhpParenBlock skipwhite containedin=ALLBUT,@bladeExempt"
exe "syn keyword bladeKeyword @" . join(values(g:blade_custom_directives_pairs), ' @') . " containedin=ALLBUT,@bladeExempt"
endif
syn region bladePhpRegion matchgroup=bladeKeyword start="\<@php\>\s*(\@!" end="\<@endphp\>" contains=@bladePhp containedin=ALLBUT,@bladeExempt keepend
syn match bladeKeyword "@php\ze\s*(" nextgroup=bladePhpParenBlock skipwhite containedin=ALLBUT,@bladeExempt
syn region bladePhpParenBlock matchgroup=bladeDelimiter start="\s*(" end=")" contains=@bladePhp,bladePhpParenBlock skipwhite contained syn region bladePhpParenBlock matchgroup=bladeDelimiter start="\s*(" end=")" contains=@bladePhp,bladePhpParenBlock skipwhite contained
syn cluster bladePhp contains=@phpClTop syn cluster bladePhp contains=@phpClTop
syn cluster bladeExempt contains=bladeComment,@htmlTop syn cluster bladeExempt contains=bladeComment,bladePhpRegion,bladePhpParenBlock,@htmlTop
syn cluster htmlPreproc add=bladeEcho,bladeComment syn cluster htmlPreproc add=bladeEcho,bladeComment,bladePhpRegion
syn keyword bladeTodo todo fixme xxx contained syn case ignore
syn keyword bladeTodo todo fixme xxx note contained
hi def link bladeDelimiter PreProc hi def link bladeDelimiter PreProc
hi def link bladeComment Comment hi def link bladeComment Comment

View File

@@ -3,7 +3,7 @@ if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'c/c++') == -1
" Vim syntax file " Vim syntax file
" Language: C " Language: C
" Maintainer: Bram Moolenaar <Bram@vim.org> " Maintainer: Bram Moolenaar <Bram@vim.org>
" Last Change: 2016 Apr 10 " Last Change: 2016 Nov 17
" Quit when a (custom) syntax file was already loaded " Quit when a (custom) syntax file was already loaded
if exists("b:current_syntax") if exists("b:current_syntax")
@@ -297,7 +297,7 @@ if !exists("c_no_ansi") || exists("c_ansi_constants") || exists("c_gnu")
syn keyword cConstant SCHAR_MIN SINT_MIN SLONG_MIN SSHRT_MIN syn keyword cConstant SCHAR_MIN SINT_MIN SLONG_MIN SSHRT_MIN
syn keyword cConstant SCHAR_MAX SINT_MAX SLONG_MAX SSHRT_MAX syn keyword cConstant SCHAR_MAX SINT_MAX SLONG_MAX SSHRT_MAX
if !exists("c_no_c99") if !exists("c_no_c99")
syn keyword cConstant __func__ syn keyword cConstant __func__ __VA_ARGS__
syn keyword cConstant LLONG_MIN LLONG_MAX ULLONG_MAX syn keyword cConstant LLONG_MIN LLONG_MAX ULLONG_MAX
syn keyword cConstant INT8_MIN INT16_MIN INT32_MIN INT64_MIN syn keyword cConstant INT8_MIN INT16_MIN INT32_MIN INT64_MIN
syn keyword cConstant INT8_MAX INT16_MAX INT32_MAX INT64_MAX syn keyword cConstant INT8_MAX INT16_MAX INT32_MAX INT64_MAX
@@ -360,36 +360,36 @@ if !exists("c_no_c99") " ISO C99
endif endif
" Accept %: for # (C99) " Accept %: for # (C99)
syn region cPreCondit start="^\s*\(%:\|#\)\s*\(if\|ifdef\|ifndef\|elif\)\>" skip="\\$" end="$" keepend contains=cComment,cCommentL,cCppString,cCharacter,cCppParen,cParenError,cNumbers,cCommentError,cSpaceError syn region cPreCondit start="^\s*\zs\(%:\|#\)\s*\(if\|ifdef\|ifndef\|elif\)\>" skip="\\$" end="$" keepend contains=cComment,cCommentL,cCppString,cCharacter,cCppParen,cParenError,cNumbers,cCommentError,cSpaceError
syn match cPreConditMatch display "^\s*\(%:\|#\)\s*\(else\|endif\)\>" syn match cPreConditMatch display "^\s*\zs\(%:\|#\)\s*\(else\|endif\)\>"
if !exists("c_no_if0") if !exists("c_no_if0")
syn cluster cCppOutInGroup contains=cCppInIf,cCppInElse,cCppInElse2,cCppOutIf,cCppOutIf2,cCppOutElse,cCppInSkip,cCppOutSkip syn cluster cCppOutInGroup contains=cCppInIf,cCppInElse,cCppInElse2,cCppOutIf,cCppOutIf2,cCppOutElse,cCppInSkip,cCppOutSkip
syn region cCppOutWrapper start="^\s*\(%:\|#\)\s*if\s\+0\+\s*\($\|//\|/\*\|&\)" end=".\@=\|$" contains=cCppOutIf,cCppOutElse,@NoSpell fold syn region cCppOutWrapper start="^\s*\zs\(%:\|#\)\s*if\s\+0\+\s*\($\|//\|/\*\|&\)" end=".\@=\|$" contains=cCppOutIf,cCppOutElse,@NoSpell fold
syn region cCppOutIf contained start="0\+" matchgroup=cCppOutWrapper end="^\s*\(%:\|#\)\s*endif\>" contains=cCppOutIf2,cCppOutElse syn region cCppOutIf contained start="0\+" matchgroup=cCppOutWrapper end="^\s*\zs\(%:\|#\)\s*endif\>" contains=cCppOutIf2,cCppOutElse
if !exists("c_no_if0_fold") if !exists("c_no_if0_fold")
syn region cCppOutIf2 contained matchgroup=cCppOutWrapper start="0\+" end="^\s*\(%:\|#\)\s*\(else\>\|elif\s\+\(0\+\s*\($\|//\|/\*\|&\)\)\@!\|endif\>\)"me=s-1 contains=cSpaceError,cCppOutSkip,@Spell fold syn region cCppOutIf2 contained matchgroup=cCppOutWrapper start="0\+" end="^\s*\(%:\|#\)\s*\(else\>\|elif\s\+\(0\+\s*\($\|//\|/\*\|&\)\)\@!\|endif\>\)"me=s-1 contains=cSpaceError,cCppOutSkip,@Spell fold
else else
syn region cCppOutIf2 contained matchgroup=cCppOutWrapper start="0\+" end="^\s*\(%:\|#\)\s*\(else\>\|elif\s\+\(0\+\s*\($\|//\|/\*\|&\)\)\@!\|endif\>\)"me=s-1 contains=cSpaceError,cCppOutSkip,@Spell syn region cCppOutIf2 contained matchgroup=cCppOutWrapper start="0\+" end="^\s*\(%:\|#\)\s*\(else\>\|elif\s\+\(0\+\s*\($\|//\|/\*\|&\)\)\@!\|endif\>\)"me=s-1 contains=cSpaceError,cCppOutSkip,@Spell
endif endif
syn region cCppOutElse contained matchgroup=cCppOutWrapper start="^\s*\(%:\|#\)\s*\(else\|elif\)" end="^\s*\(%:\|#\)\s*endif\>"me=s-1 contains=TOP,cPreCondit syn region cCppOutElse contained matchgroup=cCppOutWrapper start="^\s*\zs\(%:\|#\)\s*\(else\|elif\)" end="^\s*\zs\(%:\|#\)\s*endif\>"me=s-1 contains=TOP,cPreCondit
syn region cCppInWrapper start="^\s*\(%:\|#\)\s*if\s\+0*[1-9]\d*\s*\($\|//\|/\*\||\)" end=".\@=\|$" contains=cCppInIf,cCppInElse fold syn region cCppInWrapper start="^\s*\zs\(%:\|#\)\s*if\s\+0*[1-9]\d*\s*\($\|//\|/\*\||\)" end=".\@=\|$" contains=cCppInIf,cCppInElse fold
syn region cCppInIf contained matchgroup=cCppInWrapper start="\d\+" end="^\s*\(%:\|#\)\s*endif\>" contains=TOP,cPreCondit syn region cCppInIf contained matchgroup=cCppInWrapper start="\d\+" end="^\s*\zs\(%:\|#\)\s*endif\>" contains=TOP,cPreCondit
if !exists("c_no_if0_fold") if !exists("c_no_if0_fold")
syn region cCppInElse contained start="^\s*\(%:\|#\)\s*\(else\>\|elif\s\+\(0*[1-9]\d*\s*\($\|//\|/\*\||\)\)\@!\)" end=".\@=\|$" containedin=cCppInIf contains=cCppInElse2 fold syn region cCppInElse contained start="^\s*\zs\(%:\|#\)\s*\(else\>\|elif\s\+\(0*[1-9]\d*\s*\($\|//\|/\*\||\)\)\@!\)" end=".\@=\|$" containedin=cCppInIf contains=cCppInElse2 fold
else else
syn region cCppInElse contained start="^\s*\(%:\|#\)\s*\(else\>\|elif\s\+\(0*[1-9]\d*\s*\($\|//\|/\*\||\)\)\@!\)" end=".\@=\|$" containedin=cCppInIf contains=cCppInElse2 syn region cCppInElse contained start="^\s*\zs\(%:\|#\)\s*\(else\>\|elif\s\+\(0*[1-9]\d*\s*\($\|//\|/\*\||\)\)\@!\)" end=".\@=\|$" containedin=cCppInIf contains=cCppInElse2
endif endif
syn region cCppInElse2 contained matchgroup=cCppInWrapper start="^\s*\(%:\|#\)\s*\(else\|elif\)\([^/]\|/[^/*]\)*" end="^\s*\(%:\|#\)\s*endif\>"me=s-1 contains=cSpaceError,cCppOutSkip,@Spell syn region cCppInElse2 contained matchgroup=cCppInWrapper start="^\s*\zs\(%:\|#\)\s*\(else\|elif\)\([^/]\|/[^/*]\)*" end="^\s*\zs\(%:\|#\)\s*endif\>"me=s-1 contains=cSpaceError,cCppOutSkip,@Spell
syn region cCppOutSkip contained start="^\s*\(%:\|#\)\s*\(if\>\|ifdef\>\|ifndef\>\)" skip="\\$" end="^\s*\(%:\|#\)\s*endif\>" contains=cSpaceError,cCppOutSkip syn region cCppOutSkip contained start="^\s*\zs\(%:\|#\)\s*\(if\>\|ifdef\>\|ifndef\>\)" skip="\\$" end="^\s*\zs\(%:\|#\)\s*endif\>" contains=cSpaceError,cCppOutSkip
syn region cCppInSkip contained matchgroup=cCppInWrapper start="^\s*\(%:\|#\)\s*\(if\s\+\(\d\+\s*\($\|//\|/\*\||\|&\)\)\@!\|ifdef\>\|ifndef\>\)" skip="\\$" end="^\s*\(%:\|#\)\s*endif\>" containedin=cCppOutElse,cCppInIf,cCppInSkip contains=TOP,cPreProc syn region cCppInSkip contained matchgroup=cCppInWrapper start="^\s*\zs\(%:\|#\)\s*\(if\s\+\(\d\+\s*\($\|//\|/\*\||\|&\)\)\@!\|ifdef\>\|ifndef\>\)" skip="\\$" end="^\s*\zs\(%:\|#\)\s*endif\>" containedin=cCppOutElse,cCppInIf,cCppInSkip contains=TOP,cPreProc
endif endif
syn region cIncluded display contained start=+"+ skip=+\\\\\|\\"+ end=+"+ syn region cIncluded display contained start=+"+ skip=+\\\\\|\\"+ end=+"+
syn match cIncluded display contained "<[^>]*>" syn match cIncluded display contained "<[^>]*>"
syn match cInclude display "^\s*\(%:\|#\)\s*include\>\s*["<]" contains=cIncluded syn match cInclude display "^\s*\zs\(%:\|#\)\s*include\>\s*["<]" contains=cIncluded
"syn match cLineSkip "\\$" "syn match cLineSkip "\\$"
syn cluster cPreProcGroup contains=cPreCondit,cIncluded,cInclude,cDefine,cErrInParen,cErrInBracket,cUserLabel,cSpecial,cOctalZero,cCppOutWrapper,cCppInWrapper,@cCppOutInGroup,cFormat,cNumber,cFloat,cOctal,cOctalError,cNumbersCom,cString,cCommentSkip,cCommentString,cComment2String,@cCommentGroup,cCommentStartError,cParen,cBracket,cMulti,cBadBlock syn cluster cPreProcGroup contains=cPreCondit,cIncluded,cInclude,cDefine,cErrInParen,cErrInBracket,cUserLabel,cSpecial,cOctalZero,cCppOutWrapper,cCppInWrapper,@cCppOutInGroup,cFormat,cNumber,cFloat,cOctal,cOctalError,cNumbersCom,cString,cCommentSkip,cCommentString,cComment2String,@cCommentGroup,cCommentStartError,cParen,cBracket,cMulti,cBadBlock
syn region cDefine start="^\s*\(%:\|#\)\s*\(define\|undef\)\>" skip="\\$" end="$" keepend contains=ALLBUT,@cPreProcGroup,@Spell syn region cDefine start="^\s*\zs\(%:\|#\)\s*\(define\|undef\)\>" skip="\\$" end="$" keepend contains=ALLBUT,@cPreProcGroup,@Spell
syn region cPreProc start="^\s*\(%:\|#\)\s*\(pragma\>\|line\>\|warning\>\|warn\>\|error\>\)" skip="\\$" end="$" keepend contains=ALLBUT,@cPreProcGroup,@Spell syn region cPreProc start="^\s*\zs\(%:\|#\)\s*\(pragma\>\|line\>\|warning\>\|warn\>\|error\>\)" skip="\\$" end="$" keepend contains=ALLBUT,@cPreProcGroup,@Spell
" Highlight User Labels " Highlight User Labels
syn cluster cMultiGroup contains=cIncluded,cSpecial,cCommentSkip,cCommentString,cComment2String,@cCommentGroup,cCommentStartError,cUserCont,cUserLabel,cBitField,cOctalZero,cCppOutWrapper,cCppInWrapper,@cCppOutInGroup,cFormat,cNumber,cFloat,cOctal,cOctalError,cNumbersCom,cCppParen,cCppBracket,cCppString syn cluster cMultiGroup contains=cIncluded,cSpecial,cCommentSkip,cCommentString,cComment2String,@cCommentGroup,cCommentStartError,cUserCont,cUserLabel,cBitField,cOctalZero,cCppOutWrapper,cCppInWrapper,@cCppOutInGroup,cFormat,cNumber,cFloat,cOctal,cOctalError,cNumbersCom,cCppParen,cCppBracket,cCppString
@@ -398,21 +398,21 @@ if s:ft ==# 'c' || exists("cpp_no_cpp11")
endif endif
" Avoid matching foo::bar() in C++ by requiring that the next char is not ':' " Avoid matching foo::bar() in C++ by requiring that the next char is not ':'
syn cluster cLabelGroup contains=cUserLabel syn cluster cLabelGroup contains=cUserLabel
syn match cUserCont display "^\s*\I\i*\s*:$" contains=@cLabelGroup syn match cUserCont display "^\s*\zs\I\i*\s*:$" contains=@cLabelGroup
syn match cUserCont display ";\s*\I\i*\s*:$" contains=@cLabelGroup syn match cUserCont display ";\s*\zs\I\i*\s*:$" contains=@cLabelGroup
if s:ft ==# 'cpp' if s:ft ==# 'cpp'
syn match cUserCont display "^\s*\%(class\|struct\|enum\)\@!\I\i*\s*:[^:]"me=e-1 contains=@cLabelGroup syn match cUserCont display "^\s*\zs\%(class\|struct\|enum\)\@!\I\i*\s*:[^:]"me=e-1 contains=@cLabelGroup
syn match cUserCont display ";\s*\%(class\|struct\|enum\)\@!\I\i*\s*:[^:]"me=e-1 contains=@cLabelGroup syn match cUserCont display ";\s*\zs\%(class\|struct\|enum\)\@!\I\i*\s*:[^:]"me=e-1 contains=@cLabelGroup
else else
syn match cUserCont display "^\s*\I\i*\s*:[^:]"me=e-1 contains=@cLabelGroup syn match cUserCont display "^\s*\zs\I\i*\s*:[^:]"me=e-1 contains=@cLabelGroup
syn match cUserCont display ";\s*\I\i*\s*:[^:]"me=e-1 contains=@cLabelGroup syn match cUserCont display ";\s*\zs\I\i*\s*:[^:]"me=e-1 contains=@cLabelGroup
endif endif
syn match cUserLabel display "\I\i*" contained syn match cUserLabel display "\I\i*" contained
" Avoid recognizing most bitfields as labels " Avoid recognizing most bitfields as labels
syn match cBitField display "^\s*\I\i*\s*:\s*[1-9]"me=e-1 contains=cType syn match cBitField display "^\s*\zs\I\i*\s*:\s*[1-9]"me=e-1 contains=cType
syn match cBitField display ";\s*\I\i*\s*:\s*[1-9]"me=e-1 contains=cType syn match cBitField display ";\s*\zs\I\i*\s*:\s*[1-9]"me=e-1 contains=cType
if exists("c_minlines") if exists("c_minlines")
let b:c_minlines = c_minlines let b:c_minlines = c_minlines

33
syntax/caddyfile.vim Normal file
View File

@@ -0,0 +1,33 @@
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'caddyfile') == -1
" Language: Caddyfile
" Author: Josh Glendenning <josh@isobit.io>
if exists("b:current_syntax")
finish
endif
syn match caddyDirective "^\s*\([a-z]\+\)" nextgroup=caddyDirectiveArgs 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 match caddySubdirective "^\s*\([a-zA-Z0-9_]\+\)" contained nextgroup=caddySubdirectiveArgs skipwhite
syn region caddySubdirectiveArgs start="" end="\(#\|$\)"me=s-1 oneline contained contains=caddyPlaceholder,caddyString
syn match caddyHost "\(https\?:\/\/\)\?\(\(\w\{1,}\.\)\(\w\{2,}\.\?\)\+\|localhost\)\(:[0-9]\{1,5}\)\?" nextgroup=caddyHostBlock skipwhite
syn region caddyHostBlock start="{" skip="\\}" end="}" contained contains=caddyDirective,caddyComment
syn region caddyPlaceholder start="{" skip="\\}" end="}" oneline contained
syn region caddyString start='"' skip='\\\\\|\\"' end='"' oneline
syn match caddyComment "#.*$"
hi link caddyDirective Keyword
hi link caddySubdirective Structure
hi link caddyHost Identifier
hi link caddyPlaceholder Special
hi link caddyString String
hi link caddyComment Comment
let b:current_syntax = "caddyfile"
endif

File diff suppressed because one or more lines are too long

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\)\>/ syn match coffeeKeyword /\<\%(new\|in\|of\|by\|and\|or\|not\|is\|isnt\|class\|extends\|super\|do\|yield\|debugger\|import\|export\|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\|export\|import\|native\|__hasProp\|__extends\|__slice\|__bind\|__indexOf\|implements\|interface\|package\|private\|protected\|public\|static\)\>/ syn match coffeeReservedError /\<\%(case\|default\|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

@@ -4,23 +4,16 @@ if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'c/c++') == -1
" Language: C++ " Language: C++
" Current Maintainer: vim-jp (https://github.com/vim-jp/vim-cpp) " Current Maintainer: vim-jp (https://github.com/vim-jp/vim-cpp)
" Previous Maintainer: Ken Shan <ccshan@post.harvard.edu> " Previous Maintainer: Ken Shan <ccshan@post.harvard.edu>
" Last Change: 2015 Nov 10 " Last Change: 2016 Oct 28
" For version 5.x: Clear all syntax items " quit when a syntax file was already loaded
" For version 6.x: Quit when a syntax file was already loaded if exists("b:current_syntax")
if version < 600
syntax clear
elseif exists("b:current_syntax")
finish finish
endif endif
" Read the C syntax to start with " Read the C syntax to start with
if version < 600 runtime! syntax/c.vim
so <sfile>:p:h/c.vim unlet b:current_syntax
else
runtime! syntax/c.vim
unlet b:current_syntax
endif
" C++ extensions " C++ extensions
syn keyword cppStatement new delete this friend using syn keyword cppStatement new delete this friend using
@@ -40,7 +33,7 @@ syn keyword cppConstant __cplusplus
" C++ 11 extensions " C++ 11 extensions
if !exists("cpp_no_cpp11") if !exists("cpp_no_cpp11")
syn keyword cppModifier override final syn keyword cppModifier override final
syn keyword cppType nullptr_t syn keyword cppType nullptr_t auto
syn keyword cppExceptions noexcept syn keyword cppExceptions noexcept
syn keyword cppStorageClass constexpr decltype thread_local syn keyword cppStorageClass constexpr decltype thread_local
syn keyword cppConstant nullptr syn keyword cppConstant nullptr
@@ -55,36 +48,31 @@ endif
" C++ 14 extensions " C++ 14 extensions
if !exists("cpp_no_cpp14") if !exists("cpp_no_cpp14")
syn match cppNumber display "\<0b[01]\+\(u\=l\{0,2}\|ll\=u\)\>" syn case ignore
syn match cppNumber display "\<0b[01]\('\=[01]\+\)*\(u\=l\{0,2}\|ll\=u\)\>"
syn match cppNumber display "\<[1-9]\('\=\d\+\)*\(u\=l\{0,2}\|ll\=u\)\>"
syn match cppNumber display "\<0x\x\('\=\x\+\)*\(u\=l\{0,2}\|ll\=u\)\>"
syn case match
endif endif
" The minimum and maximum operators in GNU C++ " The minimum and maximum operators in GNU C++
syn match cppMinMax "[<>]?" syn match cppMinMax "[<>]?"
" Default highlighting " Default highlighting
if version >= 508 || !exists("did_cpp_syntax_inits") hi def link cppAccess cppStatement
if version < 508 hi def link cppCast cppStatement
let did_cpp_syntax_inits = 1 hi def link cppExceptions Exception
command -nargs=+ HiLink hi link <args> hi def link cppOperator Operator
else hi def link cppStatement Statement
command -nargs=+ HiLink hi def link <args> hi def link cppModifier Type
endif hi def link cppType Type
HiLink cppAccess cppStatement hi def link cppStorageClass StorageClass
HiLink cppCast cppStatement hi def link cppStructure Structure
HiLink cppExceptions Exception hi def link cppBoolean Boolean
HiLink cppOperator Operator hi def link cppConstant Constant
HiLink cppStatement Statement hi def link cppRawStringDelimiter Delimiter
HiLink cppModifier Type hi def link cppRawString String
HiLink cppType Type hi def link cppNumber Number
HiLink cppStorageClass StorageClass
HiLink cppStructure Structure
HiLink cppBoolean Boolean
HiLink cppConstant Constant
HiLink cppRawStringDelimiter Delimiter
HiLink cppRawString String
HiLink cppNumber Number
delcommand HiLink
endif
let b:current_syntax = "cpp" let b:current_syntax = "cpp"

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