mirror of
https://github.com/sheerun/vim-polyglot.git
synced 2025-11-08 11:33:52 -05:00
Compare commits
115 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
7dd2e11698 | ||
|
|
9197c69900 | ||
|
|
c7dfe2f626 | ||
|
|
af87010071 | ||
|
|
ef369d45a5 | ||
|
|
64938393bd | ||
|
|
79fce146dd | ||
|
|
ef4435cffc | ||
|
|
c2a7f363c6 | ||
|
|
0134940f23 | ||
|
|
8bb259b1f6 | ||
|
|
466f20b12e | ||
|
|
461de4cc21 | ||
|
|
ba75890936 | ||
|
|
0801eac01a | ||
|
|
9f735b1fe7 | ||
|
|
fbeb019a85 | ||
|
|
6e9529be4e | ||
|
|
462bb76e06 | ||
|
|
8002795088 | ||
|
|
7404993f0c | ||
|
|
b7e2b0cad3 | ||
|
|
cc868aee51 | ||
|
|
39036a553f | ||
|
|
e685e4b431 | ||
|
|
e404a658b1 | ||
|
|
74652b465d | ||
|
|
7575da2064 | ||
|
|
9b23910103 | ||
|
|
98e021e969 | ||
|
|
b8d9939329 | ||
|
|
0244e228fa | ||
|
|
ab61d2ac8e | ||
|
|
f42e1f477c | ||
|
|
3019afa721 | ||
|
|
cb574b283f | ||
|
|
b9ce3df4cd | ||
|
|
f028cfae59 | ||
|
|
041ab2d237 | ||
|
|
acd25ccf95 | ||
|
|
7dd62806a0 | ||
|
|
6a823fb3af | ||
|
|
11f34624aa | ||
|
|
1422f7a75c | ||
|
|
b17b5d4d9f | ||
|
|
bd824d9407 | ||
|
|
c3233deb70 | ||
|
|
bf188c4a51 | ||
|
|
a5857b81c2 | ||
|
|
7a32eec6d1 | ||
|
|
c69562f864 | ||
|
|
40c54bc12b | ||
|
|
44b3d860cb | ||
|
|
5a65ffe66d | ||
|
|
b9dae8fbab | ||
|
|
84593f2d7f | ||
|
|
22f6f3b6d3 | ||
|
|
8cd62b9eab | ||
|
|
93e3f020a9 | ||
|
|
81ccd02032 | ||
|
|
2ae1aab49b | ||
|
|
554ae93ef1 | ||
|
|
7a29850ae9 | ||
|
|
c200e7a0c5 | ||
|
|
5529a5e8e2 | ||
|
|
905031eb95 | ||
|
|
76d23a21e6 | ||
|
|
5dd1a7e839 | ||
|
|
bc098370c1 | ||
|
|
b07b46bc0c | ||
|
|
b0823d2068 | ||
|
|
b4a6290b42 | ||
|
|
c324a086b2 | ||
|
|
2bde381723 | ||
|
|
61390f5885 | ||
|
|
f8a0fb37bf | ||
|
|
13fe6ad758 | ||
|
|
78427e4c22 | ||
|
|
829ab22723 | ||
|
|
a8d08c8a49 | ||
|
|
7679a92627 | ||
|
|
ad44c4f7a3 | ||
|
|
3c56c1c7cd | ||
|
|
d4e83d706f | ||
|
|
c47dc02849 | ||
|
|
841cb535df | ||
|
|
e5b26a7308 | ||
|
|
b4b054ebf5 | ||
|
|
08ea94e011 | ||
|
|
ba7a783c7f | ||
|
|
f58692a641 | ||
|
|
0dc7696c89 | ||
|
|
5658b62b7a | ||
|
|
938a2f1667 | ||
|
|
303b3f1b43 | ||
|
|
bf84973173 | ||
|
|
89728a486d | ||
|
|
ae3a0d72cc | ||
|
|
3475a2df67 | ||
|
|
ac42e00864 | ||
|
|
0293cf8346 | ||
|
|
8c139a4546 | ||
|
|
47a036761a | ||
|
|
d2c90dad0a | ||
|
|
7ac92eac0f | ||
|
|
7800dae776 | ||
|
|
a39c9013cc | ||
|
|
25d2786cae | ||
|
|
1f1e821192 | ||
|
|
ae882e85f8 | ||
|
|
aec5e42bdb | ||
|
|
a0c79360ed | ||
|
|
2d3b20bc68 | ||
|
|
a6b0efd530 | ||
|
|
0de043adbc |
@@ -1,7 +1,11 @@
|
|||||||
language: ruby
|
language: ruby
|
||||||
rvm:
|
rvm:
|
||||||
- 1.9.3
|
- 1.9.3
|
||||||
before_install: sudo apt-get install vim-gtk
|
sudo: false
|
||||||
|
addons:
|
||||||
|
apt:
|
||||||
|
packages:
|
||||||
|
- vim-gtk
|
||||||
before_script:
|
before_script:
|
||||||
- "export DISPLAY=:99.0"
|
- "export DISPLAY=:99.0"
|
||||||
- "sh -e /etc/init.d/xvfb start"
|
- "sh -e /etc/init.d/xvfb start"
|
||||||
|
|||||||
173
README.md
173
README.md
@@ -1,6 +1,6 @@
|
|||||||
# vim-polyglot [![Build Status][travis-img-url]][travis-url]
|
# vim-polyglot [![Build Status][travis-img-url]][travis-url] []()
|
||||||
|
|
||||||
[travis-img-url]: https://travis-ci.org/sheerun/vim-polyglot.png
|
[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
|
||||||
|
|
||||||
A collection of language packs for Vim.
|
A collection of language packs for Vim.
|
||||||
@@ -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 50+ times faster** than 50+ 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`).
|
||||||
@@ -18,83 +18,136 @@ A collection of language packs for Vim.
|
|||||||
|
|
||||||
## Installation
|
## Installation
|
||||||
|
|
||||||
1. Install pathogen, Vundle or NeoBundle package manager.
|
1. Install [Pathogen](https://github.com/tpope/vim-pathogen), [Vundle](https://github.com/VundleVim/Vundle.vim), [NeoBundle](https://github.com/Shougo/neobundle.vim), or [Plug](https://github.com/junegunn/vim-plug) package manager for Vim.
|
||||||
2. Use this repository as submodule or package.
|
2. Use this repository as submodule or package.
|
||||||
|
|
||||||
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
|
||||||
|
|
||||||
- [arduino](https://github.com/sudar/vim-arduino-syntax) (syntax, indent, ftdetect)
|
- [ansible](https://github.com/pearofducks/ansible-vim) (syntax, indent, ftplugin)
|
||||||
- [blade](https://github.com/xsbeats/vim-blade) (syntax, indent, ftdetect)
|
- [apiblueprint](https://github.com/sheerun/apiblueprint.vim) (syntax)
|
||||||
|
- [applescript](https://github.com/vim-scripts/applescript.vim) (syntax)
|
||||||
|
- [arduino](https://github.com/sudar/vim-arduino-syntax) (syntax, indent)
|
||||||
|
- [asciidoc](https://github.com/asciidoc/vim-asciidoc) (syntax)
|
||||||
|
- [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/cpp-vim) (syntax)
|
- [c/c++](https://github.com/vim-jp/vim-cpp) (syntax)
|
||||||
- [clojure](https://github.com/guns/vim-clojure-static) (syntax, indent, autoload, ftplugin, ftdetect)
|
- [caddyfile](https://github.com/joshglendenning/vim-caddyfile) (syntax, indent, ftplugin)
|
||||||
- [coffee-script](https://github.com/kchmck/vim-coffee-script) (syntax, indent, compiler, autoload, ftplugin, ftdetect)
|
- [cjsx](https://github.com/mtscout6/vim-cjsx) (syntax, ftplugin)
|
||||||
- [cjsx](https://github.com/mtscout6/vim-cjsx) (ftdetect, syntax, ftplugin)
|
- [clojure](https://github.com/guns/vim-clojure-static) (syntax, indent, autoload, ftplugin)
|
||||||
|
- [coffee-script](https://github.com/kchmck/vim-coffee-script) (syntax, indent, compiler, autoload, ftplugin)
|
||||||
|
- [cql](https://github.com/elubow/cql-vim) (syntax)
|
||||||
|
- [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)
|
||||||
- [dockerfile](https://github.com/honza/dockerfile.vim) (syntax, ftdetect)
|
- [dart](https://github.com/dart-lang/dart-vim-plugin) (syntax, indent, autoload, ftplugin)
|
||||||
- [elixir](https://github.com/elixir-lang/vim-elixir) (syntax, indent, compiler, ftplugin, ftdetect)
|
- [dockerfile](https://github.com/docker/docker) (syntax)
|
||||||
- [emberscript](https://github.com/heartsentwined/vim-ember-script) (syntax, indent, ftplugin, ftdetect)
|
- [elixir](https://github.com/elixir-lang/vim-elixir) (syntax, indent, compiler, autoload, ftplugin)
|
||||||
- [emblem](https://github.com/heartsentwined/vim-emblem) (syntax, indent, ftplugin, ftdetect)
|
- [elm](https://github.com/lambdatoast/elm.vim) (syntax, indent, autoload, ftplugin)
|
||||||
- [erlang](https://github.com/hcs42/vim-erlang-runtime) (syntax, indent)
|
- [emberscript](https://github.com/yalesov/vim-ember-script) (syntax, indent, ftplugin)
|
||||||
- [git](https://github.com/tpope/vim-git) (syntax, indent, ftplugin, ftdetect)
|
- [emblem](https://github.com/yalesov/vim-emblem) (syntax, indent, ftplugin)
|
||||||
- [go](https://github.com/fatih/vim-go) (syntax, indent, ftdetect)
|
- [erlang](https://github.com/vim-erlang/vim-erlang-runtime) (syntax, indent)
|
||||||
- [haml](https://github.com/tpope/vim-haml) (syntax, indent, compiler, ftplugin, ftdetect)
|
- [fish](https://github.com/dag/vim-fish) (syntax, indent, compiler, autoload, ftplugin)
|
||||||
- [handlebars](https://github.com/mustache/vim-mustache-handlebars) (syntax, ftplugin, ftdetect)
|
- [git](https://github.com/tpope/vim-git) (syntax, indent, ftplugin)
|
||||||
- [haskell](https://github.com/raichoo/haskell-vim) (syntax, indent, ftplugin, ftdetect)
|
- [glsl](https://github.com/tikhomirov/vim-glsl) (syntax, indent)
|
||||||
- [haxe](https://github.com/yaymukund/vim-haxe) (syntax, ftdetect)
|
- [gnuplot](https://github.com/vim-scripts/gnuplot-syntax-highlighting) (syntax)
|
||||||
|
- [go](https://github.com/fatih/vim-go) (syntax, compiler, indent)
|
||||||
|
- [graphql](https://github.com/jparise/vim-graphql) (syntax, ftplugin)
|
||||||
|
- [groovy](https://github.com/vim-scripts/groovy.vim) (syntax)
|
||||||
|
- [haml](https://github.com/sheerun/vim-haml) (syntax, indent, compiler, ftplugin)
|
||||||
|
- [handlebars](https://github.com/mustache/vim-mustache-handlebars) (syntax, indent, ftplugin)
|
||||||
|
- [haskell](https://github.com/neovimhaskell/haskell-vim) (syntax, indent, ftplugin)
|
||||||
|
- [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)
|
||||||
- [jade](https://github.com/digitaltoad/vim-jade) (syntax, indent, ftplugin, ftdetect)
|
- [i3](https://github.com/PotatoesMaster/i3-vim-syntax) (syntax, ftplugin)
|
||||||
- [jasmine](https://github.com/glanotte/vim-jasmine) (syntax, ftdetect)
|
- [jasmine](https://github.com/glanotte/vim-jasmine) (syntax)
|
||||||
- [javascript](https://github.com/sheerun/yajs.vim) (syntax, indent)
|
- [javascript](https://github.com/pangloss/vim-javascript) (syntax, indent, compiler, ftplugin, extras)
|
||||||
- [julia](https://github.com/dcjones/julia-minimalist-vim) (syntax, indent, ftdetect)
|
- [json](https://github.com/elzr/vim-json) (syntax, indent, ftplugin)
|
||||||
- [json](https://github.com/sheerun/vim-json) (syntax, indent, ftdetect)
|
- [jst](https://github.com/briancollins/vim-jst) (syntax, indent)
|
||||||
- [jst](https://github.com/briancollins/vim-jst) (syntax, indent, ftdetect)
|
|
||||||
- [jsx](https://github.com/mxw/vim-jsx) (after)
|
- [jsx](https://github.com/mxw/vim-jsx) (after)
|
||||||
|
- [julia](https://github.com/dcjones/julia-minimalist-vim) (syntax, indent)
|
||||||
|
- [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)
|
||||||
- [markdown](https://github.com/tpope/vim-markdown) (syntax, ftplugin, ftdetect)
|
- [livescript](https://github.com/gkz/vim-ls) (syntax, indent, compiler, ftplugin)
|
||||||
- [nginx](https://github.com/mutewinter/nginx.vim) (syntax, ftdetect)
|
- [lua](https://github.com/tbastos/vim-lua) (syntax, indent)
|
||||||
|
- [mako](https://github.com/sophacles/vim-bundle-mako) (syntax, indent, ftplugin)
|
||||||
|
- [markdown](https://github.com/plasticboy/vim-markdown) (syntax)
|
||||||
|
- [mathematica](https://github.com/rsmenon/vim-mathematica) (syntax, ftplugin)
|
||||||
|
- [nginx](https://github.com/chr4/nginx.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)
|
||||||
- [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)
|
||||||
- [php](https://github.com/StanAngeloff/php.vim) (syntax)
|
- [php](https://github.com/StanAngeloff/php.vim) (syntax)
|
||||||
- [puppet](https://github.com/rodjek/vim-puppet) (syntax, indent, 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, ftdetect)
|
- [protobuf](https://github.com/uarun/vim-protobuf) (syntax, indent)
|
||||||
|
- [pug](https://github.com/digitaltoad/vim-pug) (syntax, indent, ftplugin)
|
||||||
|
- [puppet](https://github.com/voxpupuli/vim-puppet) (syntax, indent, ftplugin)
|
||||||
|
- [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)
|
||||||
- [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/wting/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, 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)
|
||||||
- [systemd](https://github.com/kurayama/systemd-vim-syntax) (syntax, ftdetect)
|
- [solidity](https://github.com/ethereum/vim-solidity) (syntax, indent)
|
||||||
- [swift](https://github.com/toyamarinyon/vim-swift) (syntax, indent, 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)
|
||||||
- [tmux](https://github.com/tejr/vim-tmux) (syntax, ftdetect)
|
- [sxhkd](https://github.com/baskerville/vim-sxhkdrc) (syntax)
|
||||||
- [tomdoc](https://github.com/duwanis/tomdoc.vim) (syntax)
|
- [systemd](https://github.com/kurayama/systemd-vim-syntax) (syntax)
|
||||||
- [typescript](https://github.com/leafgarland/typescript-vim) (syntax, indent, compiler, ftplugin, ftdetect)
|
- [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)
|
||||||
|
- [toml](https://github.com/cespare/vim-toml) (syntax, ftplugin)
|
||||||
|
- [twig](https://github.com/lumiliet/vim-twig) (syntax, indent, ftplugin)
|
||||||
|
- [typescript](https://github.com/leafgarland/typescript-vim) (syntax, indent, compiler, ftplugin)
|
||||||
|
- [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)
|
||||||
- [thrift](https://github.com/solarnz/thrift.vim) (syntax, ftdetect)
|
- [vcl](https://github.com/smerrill/vcl-vim-plugin) (syntax)
|
||||||
- [toml](https://github.com/cespare/vim-toml) (syntax, ftplugin, ftdetect)
|
- [vm](https://github.com/lepture/vim-velocity) (syntax, indent)
|
||||||
- [twig](https://github.com/beyondwords/vim-twig) (syntax, ftplugin, ftdetect)
|
- [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)
|
||||||
- [yard](https://github.com/sheerun/vim-yardoc) (syntax)
|
- [yard](https://github.com/sheerun/vim-yardoc) (syntax)
|
||||||
- [vala](https://github.com/tkztmk/vim-vala) (syntax, indent, ftdetect)
|
|
||||||
- [vm](https://github.com/lepture/vim-velocity) (syntax, indent, ftdetect)
|
|
||||||
|
|
||||||
## Disabling a language pack
|
## Updating
|
||||||
|
|
||||||
Individual language packs can be disabled by setting `g:polyglot_disabled`.
|
You can either wait for new patch release with updates or run the `./build` script by yourself.
|
||||||
|
|
||||||
|
## Troubleshooting
|
||||||
|
|
||||||
|
Please make sure you have `syntax on` in your `.vimrc`, otherwise syntax files are not loaded at all.
|
||||||
|
|
||||||
|
Individual language packs can be disabled by setting `g:polyglot_disabled` as follows:
|
||||||
|
|
||||||
```viml
|
```viml
|
||||||
" ~/.vimrc
|
" ~/.vimrc
|
||||||
@@ -103,10 +156,6 @@ let g:polyglot_disabled = ['css']
|
|||||||
|
|
||||||
Note that disabiling languages won't make in general your vim startup any faster / slower (only for specific file type). Vim-polyglot is selection of language plugins that are loaded only on demand.
|
Note that disabiling languages won't make in general your vim startup any faster / slower (only for specific file type). Vim-polyglot is selection of language plugins that are loaded only on demand.
|
||||||
|
|
||||||
## Updating
|
|
||||||
|
|
||||||
You can either wait for new patch release with updates or run the `./build` script by yourself.
|
|
||||||
|
|
||||||
## Contributing
|
## Contributing
|
||||||
|
|
||||||
Language packs are periodically updated using automated `build` script.
|
Language packs are periodically updated using automated `build` script.
|
||||||
|
|||||||
@@ -1,24 +0,0 @@
|
|||||||
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'jsx') == -1
|
|
||||||
|
|
||||||
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
|
|
||||||
" Vim ftdetect file
|
|
||||||
"
|
|
||||||
" Language: JSX (JavaScript)
|
|
||||||
" Maintainer: Max Wang <mxawng@gmail.com>
|
|
||||||
"
|
|
||||||
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
|
|
||||||
|
|
||||||
exec 'source '.fnameescape(expand('<sfile>:p:h:h').'/jsx-config.vim')
|
|
||||||
|
|
||||||
fu! <SID>EnableJSX()
|
|
||||||
if g:jsx_pragma_required && !b:jsx_pragma_found | return 0 | endif
|
|
||||||
if g:jsx_ext_required && !exists('b:jsx_ext_found') | return 0 | endif
|
|
||||||
return 1
|
|
||||||
endfu
|
|
||||||
|
|
||||||
autocmd BufNewFile,BufRead *.jsx let b:jsx_ext_found = 1
|
|
||||||
autocmd BufNewFile,BufRead *.jsx set filetype=javascript.jsx
|
|
||||||
autocmd BufNewFile,BufRead *.js
|
|
||||||
\ if <SID>EnableJSX() | set filetype=javascript.jsx | endif
|
|
||||||
|
|
||||||
endif
|
|
||||||
@@ -1,7 +1,6 @@
|
|||||||
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'haskell') == -1
|
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'haskell') == -1
|
||||||
|
|
||||||
setlocal comments=s1fl:{-,mb:-,ex:-},:--
|
setlocal comments=s1fl:{-,mb:-,ex:-},:--
|
||||||
setlocal formatoptions-=cro formatoptions+=j
|
|
||||||
setlocal iskeyword+=-,.,*
|
setlocal iskeyword+=-,.,*
|
||||||
setlocal commentstring=--\ %s
|
setlocal commentstring=--\ %s
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'haskell') == -1
|
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'haskell') == -1
|
||||||
|
|
||||||
setlocal comments=s1fl:{-,mb:-,ex:-},:--
|
setlocal comments=s1fl:{-,mb:\ \ ,ex:-},:--
|
||||||
setlocal formatoptions-=cro formatoptions+=j
|
|
||||||
setlocal iskeyword+='
|
setlocal iskeyword+='
|
||||||
|
|
||||||
endif
|
endif
|
||||||
|
|||||||
16
after/ftplugin/javascript.vim
Normal file
16
after/ftplugin/javascript.vim
Normal 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
|
||||||
@@ -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
|
|
||||||
"
|
"
|
||||||
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
|
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
|
||||||
|
|
||||||
|
|||||||
61
after/ftplugin/terraform.vim
Normal file
61
after/ftplugin/terraform.vim
Normal file
@@ -0,0 +1,61 @@
|
|||||||
|
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
|
||||||
|
|
||||||
|
|
||||||
|
function! TerraformFolds()
|
||||||
|
let thisline = getline(v:lnum)
|
||||||
|
if match(thisline, '^resource') >= 0
|
||||||
|
return ">1"
|
||||||
|
elseif match(thisline, '^provider') >= 0
|
||||||
|
return ">1"
|
||||||
|
elseif match(thisline, '^module') >= 0
|
||||||
|
return ">1"
|
||||||
|
elseif match(thisline, '^variable') >= 0
|
||||||
|
return ">1"
|
||||||
|
elseif match(thisline, '^output') >= 0
|
||||||
|
return ">1"
|
||||||
|
else
|
||||||
|
return "="
|
||||||
|
endif
|
||||||
|
endfunction
|
||||||
|
setlocal foldmethod=expr
|
||||||
|
setlocal foldexpr=TerraformFolds()
|
||||||
|
setlocal foldlevel=1
|
||||||
|
|
||||||
|
function! TerraformFoldText()
|
||||||
|
let foldsize = (v:foldend-v:foldstart)
|
||||||
|
return getline(v:foldstart).' ('.foldsize.' lines)'
|
||||||
|
endfunction
|
||||||
|
setlocal foldtext=TerraformFoldText()
|
||||||
|
|
||||||
|
"inoremap <space> <C-O>za
|
||||||
|
nnoremap <space> za
|
||||||
|
onoremap <space> <C-C>za
|
||||||
|
vnoremap <space> zf
|
||||||
|
|
||||||
|
" 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
|
||||||
11
after/ftplugin/yaml.vim
Normal file
11
after/ftplugin/yaml.vim
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'yaml') == -1
|
||||||
|
|
||||||
|
" Vim indent file
|
||||||
|
" Language: Yaml
|
||||||
|
" Author: Henrique Barcelos
|
||||||
|
" Date: 2014-10-08
|
||||||
|
" URL: https://github.com/hjpbarcelos
|
||||||
|
setlocal autoindent sw=2 ts=2 expandtab
|
||||||
|
" vim:set sw=2:
|
||||||
|
|
||||||
|
endif
|
||||||
@@ -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)
|
||||||
|
|
||||||
|
|||||||
@@ -5,16 +5,11 @@ 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
|
|
||||||
"
|
"
|
||||||
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
|
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
|
||||||
|
|
||||||
" Do nothing if we don't find the @jsx pragma (and we care).
|
" Save the current JavaScript indentexpr.
|
||||||
exec 'source '.fnameescape(expand('<sfile>:p:h:h').'/jsx-config.vim')
|
let b:jsx_js_indentexpr = &indentexpr
|
||||||
if g:jsx_pragma_required && !b:jsx_pragma_found | finish | endif
|
|
||||||
|
|
||||||
" Do nothing if we don't have the .jsx extension (and we care).
|
|
||||||
if g:jsx_ext_required && !exists('b:jsx_ext_found') | finish | endif
|
|
||||||
|
|
||||||
" Prologue; load in XML indentation.
|
" Prologue; load in XML indentation.
|
||||||
if exists('b:did_indent')
|
if exists('b:did_indent')
|
||||||
@@ -33,8 +28,8 @@ setlocal indentkeys=0{,0},0),0],0\,,!^F,o,O,e
|
|||||||
" XML indentkeys
|
" XML indentkeys
|
||||||
setlocal indentkeys+=*<Return>,<>>,<<>,/
|
setlocal indentkeys+=*<Return>,<>>,<<>,/
|
||||||
|
|
||||||
" Self-closing tag regex.
|
" Multiline end tag regex (line beginning with '>' or '/>')
|
||||||
let s:sctag = '^\s*\/>\s*;\='
|
let s:endtag = '^\s*\/\?>\s*;\='
|
||||||
|
|
||||||
" Get all syntax types at the beginning of a given line.
|
" Get all syntax types at the beginning of a given line.
|
||||||
fu! SynSOL(lnum)
|
fu! SynSOL(lnum)
|
||||||
@@ -58,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.
|
||||||
@@ -78,22 +85,31 @@ 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 '/>' with '<' for multiline self-closing tags.
|
" Align '/>' and '>' with '<' for multiline tags.
|
||||||
if getline(v:lnum) =~? s:sctag
|
if getline(v:lnum) =~? s:endtag
|
||||||
let ind = ind - &sw
|
let ind = ind - &sw
|
||||||
endif
|
endif
|
||||||
|
|
||||||
" Then correct the indentation of any JSX following '/>'.
|
" Then correct the indentation of any JSX following '/>' or '>'.
|
||||||
if getline(v:lnum - 1) =~? s:sctag
|
if getline(v:lnum - 1) =~? s:endtag
|
||||||
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
|
||||||
|
|||||||
97
after/indent/objc.vim
Normal file
97
after/indent/objc.vim
Normal file
@@ -0,0 +1,97 @@
|
|||||||
|
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'objc') == -1
|
||||||
|
|
||||||
|
" Vim indent file
|
||||||
|
" Language: Objective-C
|
||||||
|
" Maintainer: Bjorn Winckler <bjorn.winckler@gmail.com>
|
||||||
|
" Last Change: 2012 Jan 01
|
||||||
|
|
||||||
|
" Ensure 'cpo' is set to Vim default values and restore later
|
||||||
|
let s:save_cpo = &cpo
|
||||||
|
set cpo&vim
|
||||||
|
|
||||||
|
" Only load this indent file when no other was loaded.
|
||||||
|
"if exists("b:did_indent")
|
||||||
|
" finish
|
||||||
|
"endif
|
||||||
|
"let b:did_indent = 1
|
||||||
|
"setlocal cindent
|
||||||
|
|
||||||
|
setl indentkeys=0{,0},:,0#,!^F,o,O,e,<:>
|
||||||
|
|
||||||
|
setlocal indentexpr=GetObjCIndentImproved()
|
||||||
|
|
||||||
|
" Top level statements which should not be indented, and which should not
|
||||||
|
" cause next (non-blank) line to be indented either.
|
||||||
|
let s:topLev = '^\s*@\%(class\|end\|implementation\|interface\|protocol\|\)\>'
|
||||||
|
|
||||||
|
function! GetObjCIndentImproved()
|
||||||
|
" NOTE: Ignore leading white space to avoid having to deal with space vs.
|
||||||
|
" tab issues. Rely on the indent() function instead.
|
||||||
|
let thisLine = substitute(getline(v:lnum), '^\s*', '', '')
|
||||||
|
|
||||||
|
if thisLine =~# s:topLev || getline(prevnonblank(v:lnum - 1)) =~# s:topLev
|
||||||
|
return 0
|
||||||
|
endif
|
||||||
|
|
||||||
|
" If current line looks like an argument to a message dispatch, then line
|
||||||
|
" up colon with previous line. This will indent the second line so that
|
||||||
|
" the colons line up in
|
||||||
|
"
|
||||||
|
" [obj firstParameter:value
|
||||||
|
" paramB:value2];
|
||||||
|
"
|
||||||
|
" but it will not line up colons in
|
||||||
|
"
|
||||||
|
" if ([obj something:here])
|
||||||
|
" [obj other:here];
|
||||||
|
"
|
||||||
|
let thisColon = match(thisLine, '^\s*\K\k*\zs:')
|
||||||
|
if thisColon > 0
|
||||||
|
let prevLine = substitute(getline(v:lnum - 1), '^\s*', '', '')
|
||||||
|
let prevColon = match(prevLine, ':')
|
||||||
|
if prevColon > 0
|
||||||
|
" Try to align colons, always making sure line is indented at least
|
||||||
|
" one shiftwidth more than the indentation at the beginning of the
|
||||||
|
" message. Avoids situations like this:
|
||||||
|
"
|
||||||
|
" if ([obj a:x
|
||||||
|
" aLongParameter:y])
|
||||||
|
"
|
||||||
|
let [lnum,lcol] = searchpairpos('\[', '', '\]', 'b', 0,
|
||||||
|
\ max([1, v:lnum - 10]))
|
||||||
|
let minInd = &sw + (lnum > 0 ? indent(lnum) : 0)
|
||||||
|
let alignedInd = indent(v:lnum - 1) + prevColon - thisColon
|
||||||
|
return alignedInd > minInd ? alignedInd : minInd
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
let prevLnum = v:lnum - 1
|
||||||
|
let ind = indent(prevLnum)
|
||||||
|
|
||||||
|
" Indent one shiftwidth after opening block, e.g.:
|
||||||
|
"
|
||||||
|
" call_func_with_block(param, ^{
|
||||||
|
" do_stuff();
|
||||||
|
" });
|
||||||
|
"
|
||||||
|
let blockPat = '\^\s*\(([^)]*)\)\?\s*{$'
|
||||||
|
if thisLine =~ '^}'
|
||||||
|
norm '^%'
|
||||||
|
if getline(".") =~ blockPat
|
||||||
|
return indent(".")
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
if getline(prevLnum) =~ blockPat
|
||||||
|
return ind + &sw
|
||||||
|
endif
|
||||||
|
|
||||||
|
return cindent(v:lnum)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
|
||||||
|
" Restore 'cpo' options
|
||||||
|
let &cpo = s:save_cpo
|
||||||
|
unlet s:save_cpo
|
||||||
|
|
||||||
|
endif
|
||||||
@@ -1,37 +0,0 @@
|
|||||||
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'jsx') == -1
|
|
||||||
|
|
||||||
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
|
|
||||||
" Vimscript file
|
|
||||||
"
|
|
||||||
" Set up a bunch of configuration variables.
|
|
||||||
"
|
|
||||||
" Also check (if desired) whether or not the @jsx pragma is correctly included
|
|
||||||
" in '%'. Set the result in b:jsx_pragma_found.
|
|
||||||
"
|
|
||||||
" Language: JSX (JavaScript)
|
|
||||||
" Maintainer: Max Wang <mxawng@gmail.com>
|
|
||||||
"
|
|
||||||
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
|
|
||||||
|
|
||||||
" Only check once.
|
|
||||||
if exists('b:jsx_pragma_found')
|
|
||||||
finish
|
|
||||||
endif
|
|
||||||
|
|
||||||
" Whether the .jsx extension is required to enable JSX syntax/indent.
|
|
||||||
if !exists('g:jsx_ext_required')
|
|
||||||
let g:jsx_ext_required = 1
|
|
||||||
endif
|
|
||||||
|
|
||||||
" Whether the @jsx pragma is required to enable JSX syntax/indent.
|
|
||||||
if !exists('g:jsx_pragma_required')
|
|
||||||
let g:jsx_pragma_required = 0
|
|
||||||
endif
|
|
||||||
if !g:jsx_pragma_required | finish | endif
|
|
||||||
|
|
||||||
" Look for the @jsx pragma. It must be included in a docblock comment before
|
|
||||||
" anything else in the file (except whitespace).
|
|
||||||
let s:jsx_pragma_pattern = '\%^\_s*\/\*\*\%(\_.\%(\*\/\)\@!\)*@jsx\_.\{-}\*\/'
|
|
||||||
let b:jsx_pragma_found = search(s:jsx_pragma_pattern, 'npw')
|
|
||||||
|
|
||||||
endif
|
|
||||||
@@ -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
|
||||||
" -----------------------------------------------------------------------------
|
" -----------------------------------------------------------------------------
|
||||||
|
|||||||
1564
after/syntax/cpp.vim
1564
after/syntax/cpp.vim
File diff suppressed because it is too large
Load Diff
@@ -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
|
||||||
|
|||||||
@@ -5,13 +5,51 @@ 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
|
||||||
|
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'glsl') == -1
|
||||||
|
|
||||||
|
" Language: OpenGL Shading Language
|
||||||
|
" Maintainer: Sergey Tikhomirov <sergey@tikhomirov.io>
|
||||||
|
|
||||||
|
syn include @GLSL syntax/glsl.vim
|
||||||
|
syn region ShaderScript
|
||||||
|
\ start="<script [^>]*type=\('\|\"\)x-shader/x-\(vertex\|fragment\)\('\|\"\)[^>]*>"
|
||||||
|
\ keepend
|
||||||
|
\ end="</script>"me=s-1
|
||||||
|
\ 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
|
||||||
|
|
||||||
|
|||||||
@@ -11,13 +11,6 @@ if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'jsx') == -1
|
|||||||
"
|
"
|
||||||
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
|
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
|
||||||
|
|
||||||
" Do nothing if we don't find the @jsx pragma (and we care).
|
|
||||||
exec 'source '.fnameescape(expand('<sfile>:p:h:h').'/jsx-config.vim')
|
|
||||||
if g:jsx_pragma_required && !b:jsx_pragma_found | finish | endif
|
|
||||||
|
|
||||||
" Do nothing if we don't have the .jsx extension (and we care).
|
|
||||||
if g:jsx_ext_required && !exists('b:jsx_ext_found') | finish | endif
|
|
||||||
|
|
||||||
" Prologue; load in XML syntax.
|
" Prologue; load in XML syntax.
|
||||||
if exists('b:current_syntax')
|
if exists('b:current_syntax')
|
||||||
let s:current_syntax=b:current_syntax
|
let s:current_syntax=b:current_syntax
|
||||||
@@ -28,20 +21,45 @@ if exists('s:current_syntax')
|
|||||||
let b:current_syntax=s:current_syntax
|
let b:current_syntax=s:current_syntax
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
" Officially, vim-jsx depends on the pangloss/vim-javascript syntax package
|
||||||
|
" (and is tested against it exclusively). However, in practice, we make some
|
||||||
|
" effort towards compatibility with other packages.
|
||||||
|
"
|
||||||
|
" These are the plugin-to-syntax-element correspondences:
|
||||||
|
"
|
||||||
|
" - pangloss/vim-javascript: jsBlock, jsExpression
|
||||||
|
" - jelera/vim-javascript-syntax: javascriptBlock
|
||||||
|
" - othree/yajs.vim: javascriptNoReserved
|
||||||
|
|
||||||
|
|
||||||
|
" JSX attributes should color as JS. Note the trivial end pattern; we let
|
||||||
|
" jsBlock take care of ending the region.
|
||||||
|
syn region xmlString contained start=+{+ end=++ contains=jsBlock,javascriptBlock
|
||||||
|
|
||||||
|
" JSX child blocks behave just like JSX attributes, except that (a) they are
|
||||||
|
" syntactically distinct, and (b) they need the syn-extend argument, or else
|
||||||
|
" nested XML end-tag patterns may end the outer jsxRegion.
|
||||||
|
syn region jsxChild contained start=+{+ end=++ contains=jsBlock,javascriptBlock
|
||||||
|
\ extend
|
||||||
|
|
||||||
" Highlight JSX regions as XML; recursively match.
|
" Highlight JSX regions as XML; recursively match.
|
||||||
syn region jsxRegion contains=@XMLSyntax,jsxRegion,jsBlock,javascriptBlock
|
"
|
||||||
\ start=+<\@<!<\z([a-zA-Z][a-zA-Z0-9:\-.]*\)+
|
" Note that we prohibit JSX tags from having a < or word character immediately
|
||||||
|
" preceding it, to avoid conflicts with, respectively, the left shift operator
|
||||||
|
" and generic Flow type annotations (http://flowtype.org/).
|
||||||
|
syn region jsxRegion
|
||||||
|
\ contains=@Spell,@XMLSyntax,jsxRegion,jsxChild,jsBlock,javascriptBlock
|
||||||
|
\ start=+\%(<\|\w\)\@<!<\z([a-zA-Z][a-zA-Z0-9:\-.]*\)+
|
||||||
\ skip=+<!--\_.\{-}-->+
|
\ skip=+<!--\_.\{-}-->+
|
||||||
\ end=+</\z1\_\s\{-}>+
|
\ end=+</\z1\_\s\{-}>+
|
||||||
\ end=+/>+
|
\ end=+/>+
|
||||||
\ keepend
|
\ keepend
|
||||||
\ extend
|
\ extend
|
||||||
|
|
||||||
" JSX attributes should color as JS. Note the trivial end pattern; we let
|
|
||||||
" jsBlock take care of ending the region.
|
|
||||||
syn region xmlString contained start=+{+ end=++ contains=jsBlock,javascriptBlock
|
|
||||||
|
|
||||||
" Add jsxRegion to the lowest-level JS syntax cluster.
|
" Add jsxRegion to the lowest-level JS syntax cluster.
|
||||||
syn cluster jsExpression add=jsxRegion
|
syn cluster jsExpression add=jsxRegion
|
||||||
|
|
||||||
|
" Allow jsxRegion to contain reserved words.
|
||||||
|
syn cluster javascriptNoReserved add=jsxRegion
|
||||||
|
|
||||||
endif
|
endif
|
||||||
|
|||||||
107
after/syntax/mma.vim
Normal file
107
after/syntax/mma.vim
Normal 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
|
||||||
23
after/syntax/objc.vim
Normal file
23
after/syntax/objc.vim
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'objc') == -1
|
||||||
|
|
||||||
|
" ARC type modifiers
|
||||||
|
syn keyword objcTypeModifier __bridge __bridge_retained __bridge_transfer __autoreleasing __strong __weak __unsafe_unretained
|
||||||
|
|
||||||
|
" Block modifiers
|
||||||
|
syn keyword objcTypeModifier __block
|
||||||
|
|
||||||
|
" Remote messaging modifiers
|
||||||
|
syn keyword objcTypeModifier byref
|
||||||
|
|
||||||
|
" Property keywords - these are only highlighted inside '@property (...)'
|
||||||
|
syn keyword objcPropertyAttribute contained getter setter readwrite readonly strong weak copy assign retain nonatomic
|
||||||
|
syn match objcProperty display "^\s*@property\>\s*([^)]*)" contains=objcPropertyAttribute
|
||||||
|
|
||||||
|
" The @property directive must be defined after objcProperty or it won't be
|
||||||
|
" highlighted
|
||||||
|
syn match objcDirective "@property\|@synthesize\|@dynamic\|@package"
|
||||||
|
|
||||||
|
" Highlight property attributes as if they were type modifiers
|
||||||
|
hi def link objcPropertyAttribute objcTypeModifier
|
||||||
|
|
||||||
|
endif
|
||||||
@@ -1,11 +1,11 @@
|
|||||||
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'rust') == -1
|
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'rust') == -1
|
||||||
|
|
||||||
if !exists('g:rust_conceal') || !has('conceal') || &enc != 'utf-8'
|
if !exists('g:rust_conceal') || g:rust_conceal == 0 || !has('conceal') || &enc != 'utf-8'
|
||||||
finish
|
finish
|
||||||
endif
|
endif
|
||||||
|
|
||||||
" For those who don't want to see `::`...
|
" For those who don't want to see `::`...
|
||||||
if exists('g:rust_conceal_mod_path')
|
if exists('g:rust_conceal_mod_path') && g:rust_conceal_mod_path != 0
|
||||||
syn match rustNiceOperator "::" conceal cchar=ㆍ
|
syn match rustNiceOperator "::" conceal cchar=ㆍ
|
||||||
endif
|
endif
|
||||||
|
|
||||||
@@ -20,7 +20,7 @@ syn match rustNiceOperator "=>" contains=rustFatRightArrowHead,rustFatRightArrow
|
|||||||
syn match rustNiceOperator /\<\@!_\(_*\>\)\@=/ conceal cchar=′
|
syn match rustNiceOperator /\<\@!_\(_*\>\)\@=/ conceal cchar=′
|
||||||
|
|
||||||
" For those who don't want to see `pub`...
|
" For those who don't want to see `pub`...
|
||||||
if exists('g:rust_conceal_pub')
|
if exists('g:rust_conceal_pub') && g:rust_conceal_pub != 0
|
||||||
syn match rustPublicSigil contained "pu" conceal cchar=*
|
syn match rustPublicSigil contained "pu" conceal cchar=*
|
||||||
syn match rustPublicRest contained "b" conceal cchar=
|
syn match rustPublicRest contained "b" conceal cchar=
|
||||||
syn match rustNiceOperator "pub " contains=rustPublicSigil,rustPublicRest
|
syn match rustNiceOperator "pub " contains=rustPublicSigil,rustPublicRest
|
||||||
@@ -28,8 +28,11 @@ endif
|
|||||||
|
|
||||||
hi link rustNiceOperator Operator
|
hi link rustNiceOperator Operator
|
||||||
|
|
||||||
if !exists('g:rust_conceal_mod_path')
|
if !(exists('g:rust_conceal_mod_path') && g:rust_conceal_mod_path != 0)
|
||||||
hi! link Conceal Operator
|
hi! link Conceal Operator
|
||||||
|
|
||||||
|
" And keep it after a colorscheme change
|
||||||
|
au ColorScheme <buffer> hi! link Conceal Operator
|
||||||
endif
|
endif
|
||||||
|
|
||||||
endif
|
endif
|
||||||
|
|||||||
60
after/syntax/yaml.vim
Normal file
60
after/syntax/yaml.vim
Normal file
@@ -0,0 +1,60 @@
|
|||||||
|
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'yaml') == -1
|
||||||
|
|
||||||
|
" To make this file do stuff, add something like the following (without the
|
||||||
|
" leading ") to your ~/.vimrc:
|
||||||
|
" au BufNewFile,BufRead *.yaml,*.yml so ~/src/PyYaml/YAML.vim
|
||||||
|
|
||||||
|
" Vim syntax/macro file
|
||||||
|
" Language: YAML
|
||||||
|
" Author: Igor Vergeichik <iverg@mail.ru>
|
||||||
|
" Sponsor: Tom Sawyer <transami@transami.net>
|
||||||
|
" Stayven: Ryan King <jking@panoptic.com>
|
||||||
|
" Copyright (c) 2002 Tom Saywer
|
||||||
|
|
||||||
|
" Add an item to a gangly list:
|
||||||
|
"map , o<bs><bs><bs><bs>-<esc>o
|
||||||
|
" Convert to Canonical form:
|
||||||
|
"map \c :%!python -c 'from yaml.redump import redump; import sys; print redump(sys.stdin.read()).rstrip()'
|
||||||
|
|
||||||
|
if version < 600
|
||||||
|
syntax clear
|
||||||
|
endif
|
||||||
|
syntax clear
|
||||||
|
|
||||||
|
syn match yamlBlock "[\[\]\{\}\|\>]"
|
||||||
|
|
||||||
|
syn region yamlComment start="\#" end="$"
|
||||||
|
syn match yamlIndicator "#YAML:\S\+"
|
||||||
|
|
||||||
|
syn region yamlString start="'" end="'" skip="\\'"
|
||||||
|
syn region yamlString start='"' end='"' skip='\\"' contains=yamlEscape
|
||||||
|
syn match yamlEscape +\\[abfnrtv'"\\]+ contained
|
||||||
|
syn match yamlEscape "\\\o\o\=\o\=" contained
|
||||||
|
syn match yamlEscape "\\x\x\+" contained
|
||||||
|
|
||||||
|
syn match yamlType "!\S\+"
|
||||||
|
|
||||||
|
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 FALSE False false NO No no OFF Off off
|
||||||
|
|
||||||
|
syn match yamlKey "^\s*\zs[^ \t\"]\+\ze\s*:"
|
||||||
|
syn match yamlKey "^\s*-\s*\zs[^ \t\"]\+\ze\s*:"
|
||||||
|
syn match yamlAnchor "&\S\+"
|
||||||
|
syn match yamlAlias "*\S\+"
|
||||||
|
|
||||||
|
" Setup the highlighting links
|
||||||
|
|
||||||
|
hi link yamlConstant Keyword
|
||||||
|
hi link yamlIndicator PreCondit
|
||||||
|
hi link yamlAnchor Function
|
||||||
|
hi link yamlAlias Function
|
||||||
|
hi link yamlKey Identifier
|
||||||
|
hi link yamlType Type
|
||||||
|
|
||||||
|
hi link yamlComment Comment
|
||||||
|
hi link yamlBlock Operator
|
||||||
|
hi link yamlString String
|
||||||
|
hi link yamlEscape Special
|
||||||
|
|
||||||
|
endif
|
||||||
File diff suppressed because one or more lines are too long
332
autoload/crystal_lang.vim
Normal file
332
autoload/crystal_lang.vim
Normal file
@@ -0,0 +1,332 @@
|
|||||||
|
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'crystal') == -1
|
||||||
|
|
||||||
|
let s:save_cpo = &cpo
|
||||||
|
set cpo&vim
|
||||||
|
|
||||||
|
let s:V = vital#of('crystal')
|
||||||
|
let s:P = s:V.import('Process')
|
||||||
|
let s:J = s:V.import('Web.JSON')
|
||||||
|
let s:C = s:V.import('ColorEcho')
|
||||||
|
|
||||||
|
function! s:echo_error(msg, ...) abort
|
||||||
|
echohl ErrorMsg
|
||||||
|
if a:0 == 0
|
||||||
|
echomsg a:msg
|
||||||
|
else
|
||||||
|
echomsg call('printf', [a:msg] + a:000)
|
||||||
|
endif
|
||||||
|
echohl None
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:run_cmd(cmd) abort
|
||||||
|
if !executable(g:crystal_compiler_command)
|
||||||
|
throw "vim-crystal: Error: '" . g:crystal_compiler_command . "' command is not found."
|
||||||
|
endif
|
||||||
|
return s:P.system(a:cmd)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:find_root_by_spec(d) abort
|
||||||
|
let dir = finddir('spec', a:d . ';')
|
||||||
|
if dir ==# ''
|
||||||
|
return ''
|
||||||
|
endif
|
||||||
|
|
||||||
|
" Note: ':h:h' for {root}/spec/ -> {root}/spec -> {root}
|
||||||
|
return fnamemodify(dir, ':p:h:h')
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! crystal_lang#entrypoint_for(file_path) abort
|
||||||
|
let parent_dir = fnamemodify(a:file_path, ':p:h')
|
||||||
|
let root_dir = s:find_root_by_spec(parent_dir)
|
||||||
|
if root_dir ==# ''
|
||||||
|
" No spec diretory found. No need to make temporary file
|
||||||
|
return a:file_path
|
||||||
|
endif
|
||||||
|
|
||||||
|
let temp_name = root_dir . '/__vim-crystal-temporary-entrypoint-' . fnamemodify(a:file_path, ':t')
|
||||||
|
let contents = [
|
||||||
|
\ 'require "spec"',
|
||||||
|
\ 'require "./spec/**"',
|
||||||
|
\ printf('require "./%s"', fnamemodify(a:file_path, ':p')[strlen(root_dir)+1 : ])
|
||||||
|
\ ]
|
||||||
|
|
||||||
|
let result = writefile(contents, temp_name)
|
||||||
|
if result == -1
|
||||||
|
" Note: When writefile() failed
|
||||||
|
return a:file_path
|
||||||
|
endif
|
||||||
|
|
||||||
|
return temp_name
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! crystal_lang#tool(name, file, pos, option_str) abort
|
||||||
|
let entrypoint = crystal_lang#entrypoint_for(a:file)
|
||||||
|
let cmd = printf(
|
||||||
|
\ '%s tool %s --no-color %s --cursor %s:%d:%d %s',
|
||||||
|
\ g:crystal_compiler_command,
|
||||||
|
\ a:name,
|
||||||
|
\ a:option_str,
|
||||||
|
\ a:file,
|
||||||
|
\ a:pos[1],
|
||||||
|
\ a:pos[2],
|
||||||
|
\ entrypoint
|
||||||
|
\ )
|
||||||
|
|
||||||
|
try
|
||||||
|
let output = s:run_cmd(cmd)
|
||||||
|
return {'failed': s:P.get_last_status(), 'output': output}
|
||||||
|
finally
|
||||||
|
" Note:
|
||||||
|
" If the entry point is temporary file, delete it finally.
|
||||||
|
if a:file !=# entrypoint
|
||||||
|
call delete(entrypoint)
|
||||||
|
endif
|
||||||
|
endtry
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" `pos` is assumed a returned value from getpos()
|
||||||
|
function! crystal_lang#impl(file, pos, option_str) abort
|
||||||
|
return crystal_lang#tool('implementations', a:file, a:pos, a:option_str)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:jump_to_impl(impl) abort
|
||||||
|
execute 'edit' a:impl.filename
|
||||||
|
call cursor(a:impl.line, a:impl.column)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! crystal_lang#jump_to_definition(file, pos) abort
|
||||||
|
echo 'analyzing definitions under cursor...'
|
||||||
|
|
||||||
|
let cmd_result = crystal_lang#impl(a:file, a:pos, '--format json')
|
||||||
|
if cmd_result.failed
|
||||||
|
return s:echo_error(cmd_result.output)
|
||||||
|
endif
|
||||||
|
|
||||||
|
let impl = s:J.decode(cmd_result.output)
|
||||||
|
if impl.status !=# 'ok'
|
||||||
|
return s:echo_error(impl.message)
|
||||||
|
endif
|
||||||
|
|
||||||
|
if len(impl.implementations) == 1
|
||||||
|
call s:jump_to_impl(impl.implementations[0])
|
||||||
|
return
|
||||||
|
endif
|
||||||
|
|
||||||
|
let message = "Multiple definitions detected. Choose a number\n\n"
|
||||||
|
for idx in range(len(impl.implementations))
|
||||||
|
let i = impl.implementations[idx]
|
||||||
|
let message .= printf("[%d] %s:%d:%d\n", idx, i.filename, i.line, i.column)
|
||||||
|
endfor
|
||||||
|
let message .= "\n"
|
||||||
|
let idx = str2nr(input(message, "\n> "))
|
||||||
|
call s:jump_to_impl(impl.implementations[idx])
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! crystal_lang#context(file, pos, option_str) abort
|
||||||
|
return crystal_lang#tool('context', a:file, a:pos, a:option_str)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! crystal_lang#type_hierarchy(file, option_str) abort
|
||||||
|
let cmd = printf(
|
||||||
|
\ '%s tool hierarchy --no-color %s %s',
|
||||||
|
\ g:crystal_compiler_command,
|
||||||
|
\ a:option_str,
|
||||||
|
\ a:file
|
||||||
|
\ )
|
||||||
|
|
||||||
|
return s:run_cmd(cmd)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:find_completion_start() abort
|
||||||
|
let c = col('.')
|
||||||
|
if c <= 1
|
||||||
|
return -1
|
||||||
|
endif
|
||||||
|
|
||||||
|
let line = getline('.')[:c-2]
|
||||||
|
return match(line, '\w\+$')
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! crystal_lang#complete(findstart, base) abort
|
||||||
|
if a:findstart
|
||||||
|
echom 'find start'
|
||||||
|
return s:find_completion_start()
|
||||||
|
endif
|
||||||
|
|
||||||
|
let cmd_result = crystal_lang#context(expand('%'), getpos('.'), '--format json')
|
||||||
|
if cmd_result.failed
|
||||||
|
return
|
||||||
|
endif
|
||||||
|
|
||||||
|
let contexts = s:J.decode(cmd_result.output)
|
||||||
|
if contexts.status !=# 'ok'
|
||||||
|
return
|
||||||
|
endif
|
||||||
|
|
||||||
|
let candidates = []
|
||||||
|
|
||||||
|
for c in contexts.contexts
|
||||||
|
for [name, desc] in items(c)
|
||||||
|
let candidates += [{
|
||||||
|
\ 'word': name,
|
||||||
|
\ 'menu': ': ' . desc . ' [var]',
|
||||||
|
\ }]
|
||||||
|
endfor
|
||||||
|
endfor
|
||||||
|
|
||||||
|
return candidates
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! crystal_lang#get_spec_switched_path(absolute_path) abort
|
||||||
|
let base = fnamemodify(a:absolute_path, ':t:r')
|
||||||
|
|
||||||
|
" TODO: Make cleverer
|
||||||
|
if base =~# '_spec$'
|
||||||
|
let parent = fnamemodify(substitute(a:absolute_path, '/spec/', '/src/', ''), ':h')
|
||||||
|
return parent . '/' . matchstr(base, '.\+\ze_spec$') . '.cr'
|
||||||
|
else
|
||||||
|
let parent = fnamemodify(substitute(a:absolute_path, '/src/', '/spec/', ''), ':h')
|
||||||
|
return parent . '/' . base . '_spec.cr'
|
||||||
|
endif
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! crystal_lang#switch_spec_file(...) abort
|
||||||
|
let path = a:0 == 0 ? expand('%:p') : fnamemodify(a:1, ':p')
|
||||||
|
if path !~# '.cr$'
|
||||||
|
return s:echo_error('Not crystal source file: ' . path)
|
||||||
|
endif
|
||||||
|
|
||||||
|
execute 'edit!' crystal_lang#get_spec_switched_path(path)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:run_spec(root, path, ...) abort
|
||||||
|
" Note:
|
||||||
|
" `crystal spec` can't understand absolute path.
|
||||||
|
let cmd = printf(
|
||||||
|
\ '%s spec %s%s',
|
||||||
|
\ g:crystal_compiler_command,
|
||||||
|
\ a:path,
|
||||||
|
\ a:0 == 0 ? '' : (':' . a:1)
|
||||||
|
\ )
|
||||||
|
|
||||||
|
let saved_cwd = getcwd()
|
||||||
|
let cd = haslocaldir() ? 'lcd' : 'cd'
|
||||||
|
try
|
||||||
|
execute cd a:root
|
||||||
|
call s:C.echo(s:run_cmd(cmd))
|
||||||
|
finally
|
||||||
|
execute cd saved_cwd
|
||||||
|
endtry
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! crystal_lang#run_all_spec(...) abort
|
||||||
|
let path = a:0 == 0 ? expand('%:p:h') : a:1
|
||||||
|
let root_path = s:find_root_by_spec(path)
|
||||||
|
if root_path ==# ''
|
||||||
|
return s:echo_error("'spec' directory is not found")
|
||||||
|
endif
|
||||||
|
call s:run_spec(root_path, 'spec')
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! crystal_lang#run_current_spec(...) abort
|
||||||
|
" /foo/bar/src/poyo.cr
|
||||||
|
let path = a:0 == 0 ? expand('%:p') : fnamemodify(a:1, ':p')
|
||||||
|
if path !~# '.cr$'
|
||||||
|
return s:echo_error('Not crystal source file: ' . path)
|
||||||
|
endif
|
||||||
|
|
||||||
|
" /foo/bar/src
|
||||||
|
let source_dir = fnamemodify(path, ':h')
|
||||||
|
|
||||||
|
" /foo/bar
|
||||||
|
let root_dir = s:find_root_by_spec(source_dir)
|
||||||
|
if root_dir ==# ''
|
||||||
|
return s:echo_error("'spec' directory is not found")
|
||||||
|
endif
|
||||||
|
|
||||||
|
" src
|
||||||
|
let rel_path = source_dir[strlen(root_dir)+1 : ]
|
||||||
|
|
||||||
|
if path =~# '_spec.cr$'
|
||||||
|
call s:run_spec(root_dir, path[strlen(root_dir)+1 : ], line('.'))
|
||||||
|
else
|
||||||
|
let spec_path = substitute(rel_path, '^src', 'spec', '') . '/' . fnamemodify(path, ':t:r') . '_spec.cr'
|
||||||
|
if !filereadable(root_dir . '/' . spec_path)
|
||||||
|
return s:echo_error('Error: Could not find a spec source corresponding to ' . path)
|
||||||
|
endif
|
||||||
|
call s:run_spec(root_dir, spec_path)
|
||||||
|
endif
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! crystal_lang#format_string(code, ...) abort
|
||||||
|
let cmd = printf(
|
||||||
|
\ '%s tool format --no-color %s -',
|
||||||
|
\ g:crystal_compiler_command,
|
||||||
|
\ get(a:, 1, '')
|
||||||
|
\ )
|
||||||
|
let output = s:P.system(cmd, a:code)
|
||||||
|
if s:P.get_last_status()
|
||||||
|
throw 'vim-crystal: Error on formatting: ' . output
|
||||||
|
endif
|
||||||
|
return output
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:get_saved_states() abort
|
||||||
|
let result = {}
|
||||||
|
let fname = bufname('%')
|
||||||
|
let current_winnr = winnr()
|
||||||
|
for i in range(1, winnr('$'))
|
||||||
|
let bufnr = winbufnr(i)
|
||||||
|
if bufnr == -1
|
||||||
|
continue
|
||||||
|
endif
|
||||||
|
if bufname(bufnr) ==# fname
|
||||||
|
execute i 'wincmd w'
|
||||||
|
let result[i] = {
|
||||||
|
\ 'pos': getpos('.'),
|
||||||
|
\ 'screen': winsaveview()
|
||||||
|
\ }
|
||||||
|
endif
|
||||||
|
endfor
|
||||||
|
execute current_winnr 'wincmd w'
|
||||||
|
return result
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! crystal_lang#format(option_str) abort
|
||||||
|
if !executable(g:crystal_compiler_command)
|
||||||
|
" Finish command silently
|
||||||
|
return
|
||||||
|
endif
|
||||||
|
|
||||||
|
let formatted = crystal_lang#format_string(join(getline(1, '$'), "\n"), a:option_str)
|
||||||
|
let formatted = substitute(formatted, '\n$', '', '')
|
||||||
|
|
||||||
|
let sel_save = &l:selection
|
||||||
|
let ve_save = &virtualedit
|
||||||
|
let &l:selection = 'inclusive'
|
||||||
|
let &virtualedit = ''
|
||||||
|
let [save_g_reg, save_g_regtype] = [getreg('g'), getregtype('g')]
|
||||||
|
let windows_save = s:get_saved_states()
|
||||||
|
|
||||||
|
try
|
||||||
|
call setreg('g', formatted, 'v')
|
||||||
|
silent normal! ggvG$"gp
|
||||||
|
finally
|
||||||
|
call setreg('g', save_g_reg, save_g_regtype)
|
||||||
|
let &l:selection = sel_save
|
||||||
|
let &virtualedit = ve_save
|
||||||
|
let winnr = winnr()
|
||||||
|
for winnr in keys(windows_save)
|
||||||
|
let w = windows_save[winnr]
|
||||||
|
execute winnr 'wincmd w'
|
||||||
|
call setpos('.', w.pos)
|
||||||
|
call winrestview(w.screen)
|
||||||
|
endfor
|
||||||
|
execute winnr 'wincmd w'
|
||||||
|
endtry
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
let &cpo = s:save_cpo
|
||||||
|
unlet s:save_cpo
|
||||||
|
|
||||||
|
endif
|
||||||
153
autoload/dart.vim
Normal file
153
autoload/dart.vim
Normal file
@@ -0,0 +1,153 @@
|
|||||||
|
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'dart') == -1
|
||||||
|
|
||||||
|
|
||||||
|
function! s:error(text) abort
|
||||||
|
echohl Error
|
||||||
|
echomsg printf('[dart-vim-plugin] %s', a:text)
|
||||||
|
echohl None
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:cexpr(errorformat, joined_lines) abort
|
||||||
|
let temp_errorfomat = &errorformat
|
||||||
|
try
|
||||||
|
let &errorformat = a:errorformat
|
||||||
|
cexpr a:joined_lines
|
||||||
|
copen
|
||||||
|
finally
|
||||||
|
let &errorformat = temp_errorfomat
|
||||||
|
endtry
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! dart#fmt(q_args) abort
|
||||||
|
if executable('dartfmt')
|
||||||
|
let buffer_content = join(getline(1, '$'), "\n")
|
||||||
|
let joined_lines = system(printf('dartfmt %s', a:q_args), buffer_content)
|
||||||
|
if 0 == v:shell_error
|
||||||
|
let win_view = winsaveview()
|
||||||
|
silent % delete _
|
||||||
|
silent put=joined_lines
|
||||||
|
silent 1 delete _
|
||||||
|
call winrestview(win_view)
|
||||||
|
else
|
||||||
|
let errors = split(joined_lines, "\n")[2:]
|
||||||
|
let file_path = expand('%')
|
||||||
|
call map(errors, 'file_path.":".v:val')
|
||||||
|
let error_format = '%A%f:line %l\, column %c of stdin: %m,%C%.%#'
|
||||||
|
call s:cexpr(error_format, join(errors, "\n"))
|
||||||
|
endif
|
||||||
|
else
|
||||||
|
call s:error('cannot execute binary file: dartfmt')
|
||||||
|
endif
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! dart#analyzer(q_args) abort
|
||||||
|
if executable('dartanalyzer')
|
||||||
|
let path = expand('%:p:gs:\:/:')
|
||||||
|
if filereadable(path)
|
||||||
|
let joined_lines = system(printf('dartanalyzer %s %s', a:q_args, shellescape(path)))
|
||||||
|
call s:cexpr('%m (%f\, line %l\, col %c)', joined_lines)
|
||||||
|
else
|
||||||
|
call s:error(printf('cannot read a file: "%s"', path))
|
||||||
|
endif
|
||||||
|
else
|
||||||
|
call s:error('cannot execute binary file: dartanalyzer')
|
||||||
|
endif
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! dart#tojs(q_args) abort
|
||||||
|
if executable('dart2js')
|
||||||
|
let path = expand('%:p:gs:\:/:')
|
||||||
|
if filereadable(path)
|
||||||
|
let joined_lines = system(printf('dart2js %s %s', a:q_args, shellescape(path)))
|
||||||
|
call s:cexpr('%m (%f\, line %l\, col %c)', joined_lines)
|
||||||
|
else
|
||||||
|
call s:error(printf('cannot read a file: "%s"', path))
|
||||||
|
endif
|
||||||
|
else
|
||||||
|
call s:error('cannot execute binary file: dartanalyzer')
|
||||||
|
endif
|
||||||
|
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
|
||||||
347
autoload/elixir/indent.vim
Normal file
347
autoload/elixir/indent.vim
Normal file
@@ -0,0 +1,347 @@
|
|||||||
|
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'elixir') == -1
|
||||||
|
|
||||||
|
function! elixir#indent#debug(str)
|
||||||
|
if exists("g:elixir_indent_debug") && g:elixir_indent_debug
|
||||||
|
echom a:str
|
||||||
|
endif
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" Returns 0 or 1 based on whether or not the text starts with the given
|
||||||
|
" expression and is not a string or comment
|
||||||
|
function! elixir#indent#starts_with(text, expr, lnum)
|
||||||
|
let pos = match(a:text, '^\s*'.a:expr)
|
||||||
|
if pos == -1
|
||||||
|
return 0
|
||||||
|
else
|
||||||
|
" NOTE: @jbodah 2017-02-24: pos is the index of the match which is
|
||||||
|
" zero-indexed. Add one to make it the column number
|
||||||
|
if elixir#indent#is_string_or_comment(a:lnum, pos + 1)
|
||||||
|
return 0
|
||||||
|
else
|
||||||
|
return 1
|
||||||
|
end
|
||||||
|
end
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" Returns 0 or 1 based on whether or not the text ends with the given
|
||||||
|
" expression and is not a string or comment
|
||||||
|
function! elixir#indent#ends_with(text, expr, lnum)
|
||||||
|
let pos = match(a:text, a:expr.'\s*$')
|
||||||
|
if pos == -1
|
||||||
|
return 0
|
||||||
|
else
|
||||||
|
if elixir#indent#is_string_or_comment(a:lnum, pos)
|
||||||
|
return 0
|
||||||
|
else
|
||||||
|
return 1
|
||||||
|
end
|
||||||
|
end
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" Returns 0 or 1 based on whether or not the text matches the given expression
|
||||||
|
function! elixir#indent#contains(text, expr)
|
||||||
|
return a:text =~ a:expr
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" Returns 0 or 1 based on whether or not the given line number and column
|
||||||
|
" number pair is a string or comment
|
||||||
|
function! elixir#indent#is_string_or_comment(line, col)
|
||||||
|
return synIDattr(synID(a:line, a:col, 1), "name") =~ '\%(String\|Comment\)'
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" Skip expression for searchpair. Returns 0 or 1 based on whether the value
|
||||||
|
" under the cursor is a string or comment
|
||||||
|
function! elixir#indent#searchpair_back_skip()
|
||||||
|
" NOTE: @jbodah 2017-02-27: for some reason this function gets called with
|
||||||
|
" and index that doesn't exist in the line sometimes. Detect and account for
|
||||||
|
" that situation
|
||||||
|
let curr_col = col('.')
|
||||||
|
if getline('.')[curr_col-1] == ''
|
||||||
|
let curr_col = curr_col-1
|
||||||
|
endif
|
||||||
|
return elixir#indent#is_string_or_comment(line('.'), curr_col)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" DRY up searchpair calls
|
||||||
|
function! elixir#indent#searchpair_back(start, mid, end)
|
||||||
|
let line = line('.')
|
||||||
|
return searchpair(a:start, a:mid, a:end, 'bnW', "line('.') == " . line . " || elixir#indent#searchpair_back_skip()")
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" DRY up searchpairpos calls
|
||||||
|
function! elixir#indent#searchpairpos_back(start, mid, end)
|
||||||
|
let line = line('.')
|
||||||
|
return searchpairpos(a:start, a:mid, a:end, 'bnW', "line('.') == " . line . " || elixir#indent#searchpair_back_skip()")
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" DRY up regex for keywords that 1) makes sure we only look at complete words
|
||||||
|
" and 2) ignores atoms
|
||||||
|
function! elixir#indent#keyword(expr)
|
||||||
|
return ':\@<!\<\C\%('.a:expr.'\)\>:\@!'
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! elixir#indent#starts_with_comment(text)
|
||||||
|
return match(a:text, '^\s*#') != -1
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" Start at the end of text and search backwards looking for a match. Also peek
|
||||||
|
" ahead if we get a match to make sure we get a complete match. This means
|
||||||
|
" that the result should be the position of the start of the right-most match
|
||||||
|
function! elixir#indent#find_last_pos(lnum, text, match)
|
||||||
|
let last = len(a:text) - 1
|
||||||
|
let c = last
|
||||||
|
|
||||||
|
while c >= 0
|
||||||
|
let substr = strpart(a:text, c, last)
|
||||||
|
let peek = strpart(a:text, c - 1, last)
|
||||||
|
let ss_match = match(substr, a:match)
|
||||||
|
if ss_match != -1
|
||||||
|
let peek_match = match(peek, a:match)
|
||||||
|
if peek_match == ss_match + 1
|
||||||
|
let syng = synIDattr(synID(a:lnum, c + ss_match, 1), 'name')
|
||||||
|
if syng !~ '\%(String\|Comment\)'
|
||||||
|
return c + ss_match
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
let c -= 1
|
||||||
|
endwhile
|
||||||
|
|
||||||
|
return -1
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! elixir#indent#handle_top_of_file(_lnum, _text, prev_nb_lnum, _prev_nb_text)
|
||||||
|
if a:prev_nb_lnum == 0
|
||||||
|
return 0
|
||||||
|
else
|
||||||
|
return -1
|
||||||
|
end
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" TODO: @jbodah 2017-03-31: remove
|
||||||
|
function! elixir#indent#handle_following_trailing_do(lnum, text, prev_nb_lnum, prev_nb_text)
|
||||||
|
if elixir#indent#ends_with(a:prev_nb_text, elixir#indent#keyword('do'), a:prev_nb_lnum)
|
||||||
|
if elixir#indent#starts_with(a:text, elixir#indent#keyword('end'), a:lnum)
|
||||||
|
return indent(a:prev_nb_lnum)
|
||||||
|
else
|
||||||
|
return indent(a:prev_nb_lnum) + &sw
|
||||||
|
end
|
||||||
|
else
|
||||||
|
return -1
|
||||||
|
endif
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! elixir#indent#handle_following_trailing_binary_operator(lnum, text, prev_nb_lnum, prev_nb_text)
|
||||||
|
let binary_operator = '\%(=\|<>\|>>>\|<=\|||\|+\|\~\~\~\|-\|&&\|<<<\|/\|\^\^\^\|\*\)'
|
||||||
|
|
||||||
|
if elixir#indent#ends_with(a:prev_nb_text, binary_operator, a:prev_nb_lnum)
|
||||||
|
return indent(a:prev_nb_lnum) + &sw
|
||||||
|
else
|
||||||
|
return -1
|
||||||
|
endif
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! elixir#indent#handle_starts_with_pipe(lnum, text, prev_nb_lnum, prev_nb_text)
|
||||||
|
if elixir#indent#starts_with(a:text, '|>', a:lnum)
|
||||||
|
let match_operator = '\%(!\|=\|<\|>\)\@<!=\%(=\|>\|\~\)\@!'
|
||||||
|
let pos = elixir#indent#find_last_pos(a:prev_nb_lnum, a:prev_nb_text, match_operator)
|
||||||
|
if pos == -1
|
||||||
|
return indent(a:prev_nb_lnum)
|
||||||
|
else
|
||||||
|
let next_word_pos = match(strpart(a:prev_nb_text, pos+1, len(a:prev_nb_text)-1), '\S')
|
||||||
|
if next_word_pos == -1
|
||||||
|
return indent(a:prev_nb_lnum) + &sw
|
||||||
|
else
|
||||||
|
return pos + 1 + next_word_pos
|
||||||
|
end
|
||||||
|
end
|
||||||
|
else
|
||||||
|
return -1
|
||||||
|
endif
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! elixir#indent#handle_starts_with_comment(_lnum, text, prev_nb_lnum, _prev_nb_text)
|
||||||
|
if elixir#indent#starts_with_comment(a:text)
|
||||||
|
return indent(a:prev_nb_lnum)
|
||||||
|
else
|
||||||
|
return -1
|
||||||
|
endif
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! elixir#indent#handle_starts_with_end(lnum, text, _prev_nb_lnum, _prev_nb_text)
|
||||||
|
if elixir#indent#starts_with(a:text, elixir#indent#keyword('end'), a:lnum)
|
||||||
|
let pair_lnum = elixir#indent#searchpair_back(elixir#indent#keyword('do\|fn'), '', elixir#indent#keyword('end').'\zs')
|
||||||
|
return indent(pair_lnum)
|
||||||
|
else
|
||||||
|
return -1
|
||||||
|
endif
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! elixir#indent#handle_starts_with_mid_or_end_block_keyword(lnum, text, _prev_nb_lnum, _prev_nb_text)
|
||||||
|
if elixir#indent#starts_with(a:text, elixir#indent#keyword('catch\|rescue\|after\|else'), a:lnum)
|
||||||
|
let pair_lnum = elixir#indent#searchpair_back(elixir#indent#keyword('with\|receive\|try\|if\|fn'), elixir#indent#keyword('catch\|rescue\|after\|else').'\zs', elixir#indent#keyword('end'))
|
||||||
|
return indent(pair_lnum)
|
||||||
|
else
|
||||||
|
return -1
|
||||||
|
endif
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! elixir#indent#handle_starts_with_close_bracket(lnum, text, _prev_nb_lnum, _prev_nb_text)
|
||||||
|
if elixir#indent#starts_with(a:text, '\%(\]\|}\|)\)', a:lnum)
|
||||||
|
let pair_lnum = elixir#indent#searchpair_back('\%(\[\|{\|(\)', '', '\%(\]\|}\|)\)')
|
||||||
|
return indent(pair_lnum)
|
||||||
|
else
|
||||||
|
return -1
|
||||||
|
endif
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! elixir#indent#handle_starts_with_binary_operator(lnum, text, prev_nb_lnum, prev_nb_text)
|
||||||
|
let binary_operator = '\%(=\|<>\|>>>\|<=\|||\|+\|\~\~\~\|-\|&&\|<<<\|/\|\^\^\^\|\*\)'
|
||||||
|
|
||||||
|
if elixir#indent#starts_with(a:text, binary_operator, a:lnum)
|
||||||
|
let match_operator = '\%(!\|=\|<\|>\)\@<!=\%(=\|>\|\~\)\@!'
|
||||||
|
let pos = elixir#indent#find_last_pos(a:prev_nb_lnum, a:prev_nb_text, match_operator)
|
||||||
|
if pos == -1
|
||||||
|
return indent(a:prev_nb_lnum)
|
||||||
|
else
|
||||||
|
let next_word_pos = match(strpart(a:prev_nb_text, pos+1, len(a:prev_nb_text)-1), '\S')
|
||||||
|
if next_word_pos == -1
|
||||||
|
return indent(a:prev_nb_lnum) + &sw
|
||||||
|
else
|
||||||
|
return pos + 1 + next_word_pos
|
||||||
|
end
|
||||||
|
end
|
||||||
|
else
|
||||||
|
return -1
|
||||||
|
endif
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" To handle nested structures properly we need to find the innermost
|
||||||
|
" nested structure. For example, we might be in a function in a map in a
|
||||||
|
" function, etc... so we need to first figure out what the innermost structure
|
||||||
|
" is then forward execution to the proper handler
|
||||||
|
function! elixir#indent#handle_inside_nested_construct(lnum, text, prev_nb_lnum, prev_nb_text)
|
||||||
|
let start_pattern = '\C\%(\<if\>\|\<case\>\|\<cond\>\|\<try\>\|\<receive\>\|\<fn\>\|{\|\[\|(\)'
|
||||||
|
let end_pattern = '\C\%(\<end\>\|\]\|}\|)\)'
|
||||||
|
let pair_info = elixir#indent#searchpairpos_back(start_pattern, '', end_pattern)
|
||||||
|
let pair_lnum = pair_info[0]
|
||||||
|
let pair_col = pair_info[1]
|
||||||
|
if pair_lnum != 0 || pair_col != 0
|
||||||
|
let pair_text = getline(pair_lnum)
|
||||||
|
let pair_char = pair_text[pair_col - 1]
|
||||||
|
if pair_char == 'f'
|
||||||
|
call elixir#indent#debug("testing elixir#indent#do_handle_inside_fn")
|
||||||
|
return elixir#indent#do_handle_inside_fn(pair_lnum, pair_col, a:lnum, a:text, a:prev_nb_lnum, a:prev_nb_text)
|
||||||
|
elseif pair_char == '['
|
||||||
|
call elixir#indent#debug("testing elixir#indent#do_handle_inside_square_brace")
|
||||||
|
return elixir#indent#do_handle_inside_square_brace(pair_lnum, pair_col, a:lnum, a:text, a:prev_nb_lnum, a:prev_nb_text)
|
||||||
|
elseif pair_char == '{'
|
||||||
|
call elixir#indent#debug("testing elixir#indent#do_handle_inside_curly_brace")
|
||||||
|
return elixir#indent#do_handle_inside_curly_brace(pair_lnum, pair_col, a:lnum, a:text, a:prev_nb_lnum, a:prev_nb_text)
|
||||||
|
elseif pair_char == '('
|
||||||
|
call elixir#indent#debug("testing elixir#indent#do_handle_inside_parens")
|
||||||
|
return elixir#indent#do_handle_inside_parens(pair_lnum, pair_col, a:lnum, a:text, a:prev_nb_lnum, a:prev_nb_text)
|
||||||
|
else
|
||||||
|
call elixir#indent#debug("testing elixir#indent#do_handle_inside_keyword_block")
|
||||||
|
return elixir#indent#do_handle_inside_keyword_block(pair_lnum, pair_col, a:lnum, a:text, a:prev_nb_lnum, a:prev_nb_text)
|
||||||
|
end
|
||||||
|
else
|
||||||
|
return -1
|
||||||
|
end
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! elixir#indent#do_handle_inside_keyword_block(pair_lnum, _pair_col, _lnum, text, prev_nb_lnum, prev_nb_text)
|
||||||
|
let keyword_pattern = '\C\%(\<case\>\|\<cond\>\|\<try\>\|\<receive\>\|\<after\>\|\<catch\>\|\<rescue\>\|\<else\>\)'
|
||||||
|
if a:pair_lnum
|
||||||
|
" last line is a "receive" or something
|
||||||
|
if elixir#indent#starts_with(a:prev_nb_text, keyword_pattern, a:prev_nb_lnum)
|
||||||
|
call elixir#indent#debug("prev nb line is keyword")
|
||||||
|
return indent(a:prev_nb_lnum) + &sw
|
||||||
|
elseif elixir#indent#contains(a:text, '->')
|
||||||
|
call elixir#indent#debug("contains ->")
|
||||||
|
" TODO: @jbodah 2017-03-31: test contains ignores str + comments
|
||||||
|
return indent(a:pair_lnum) + &sw
|
||||||
|
elseif elixir#indent#contains(a:prev_nb_text, '->')
|
||||||
|
call elixir#indent#debug("prev nb line contains ->")
|
||||||
|
return indent(a:prev_nb_lnum) + &sw
|
||||||
|
else
|
||||||
|
call elixir#indent#debug("doesnt start with comment or contain ->")
|
||||||
|
return indent(a:prev_nb_lnum)
|
||||||
|
end
|
||||||
|
else
|
||||||
|
return -1
|
||||||
|
endif
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! elixir#indent#do_handle_inside_fn(pair_lnum, _pair_col, lnum, text, prev_nb_lnum, prev_nb_text)
|
||||||
|
if a:pair_lnum && a:pair_lnum != a:lnum
|
||||||
|
if elixir#indent#contains(a:text, '->')
|
||||||
|
return indent(a:pair_lnum) + &sw
|
||||||
|
else
|
||||||
|
if elixir#indent#ends_with(a:prev_nb_text, '->', a:prev_nb_lnum)
|
||||||
|
return indent(a:prev_nb_lnum) + &sw
|
||||||
|
else
|
||||||
|
return indent(a:prev_nb_lnum)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
else
|
||||||
|
return -1
|
||||||
|
endif
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! elixir#indent#do_handle_inside_square_brace(pair_lnum, pair_col, _lnum, _text, _prev_nb_lnum, _prev_nb_text)
|
||||||
|
" If in list...
|
||||||
|
if a:pair_lnum != 0 || a:pair_col != 0
|
||||||
|
let pair_text = getline(a:pair_lnum)
|
||||||
|
let substr = strpart(pair_text, a:pair_col, len(pair_text)-1)
|
||||||
|
let indent_pos = match(substr, '\S')
|
||||||
|
if indent_pos != -1
|
||||||
|
return indent_pos + a:pair_col
|
||||||
|
else
|
||||||
|
return indent(a:pair_lnum) + &sw
|
||||||
|
endif
|
||||||
|
else
|
||||||
|
return -1
|
||||||
|
end
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! elixir#indent#do_handle_inside_curly_brace(pair_lnum, _pair_col, _lnum, _text, _prev_nb_lnum, _prev_nb_text)
|
||||||
|
return indent(a:pair_lnum) + &sw
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! elixir#indent#do_handle_inside_parens(pair_lnum, pair_col, _lnum, _text, prev_nb_lnum, prev_nb_text)
|
||||||
|
if a:pair_lnum
|
||||||
|
if elixir#indent#ends_with(a:prev_nb_text, '(', a:prev_nb_lnum)
|
||||||
|
return indent(a:prev_nb_lnum) + &sw
|
||||||
|
elseif a:pair_lnum == a:prev_nb_lnum
|
||||||
|
" Align indent (e.g. "def add(a,")
|
||||||
|
let pos = elixir#indent#find_last_pos(a:prev_nb_lnum, a:prev_nb_text, '[^(]\+,')
|
||||||
|
if pos == -1
|
||||||
|
return 0
|
||||||
|
else
|
||||||
|
return pos
|
||||||
|
end
|
||||||
|
else
|
||||||
|
return indent(a:prev_nb_lnum)
|
||||||
|
end
|
||||||
|
else
|
||||||
|
return -1
|
||||||
|
endif
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! elixir#indent#handle_inside_generic_block(lnum, _text, prev_nb_lnum, prev_nb_text)
|
||||||
|
let pair_lnum = searchpair(elixir#indent#keyword('do\|fn'), '', elixir#indent#keyword('end'), 'bW', "line('.') == ".a:lnum." || elixir#indent#is_string_or_comment(line('.'), col('.'))")
|
||||||
|
if pair_lnum
|
||||||
|
" TODO: @jbodah 2017-03-29: this should probably be the case in *all*
|
||||||
|
" blocks
|
||||||
|
if elixir#indent#ends_with(a:prev_nb_text, ',', a:prev_nb_lnum)
|
||||||
|
return indent(pair_lnum) + 2 * &sw
|
||||||
|
else
|
||||||
|
return indent(pair_lnum) + &sw
|
||||||
|
endif
|
||||||
|
else
|
||||||
|
return -1
|
||||||
|
endif
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
endif
|
||||||
28
autoload/elixir/util.vim
Normal file
28
autoload/elixir/util.vim
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'elixir') == -1
|
||||||
|
|
||||||
|
function! elixir#util#get_filename(word) abort
|
||||||
|
let word = a:word
|
||||||
|
|
||||||
|
" get first thing that starts uppercase, until the first space or end of line
|
||||||
|
let word = substitute(word,'^\s*\(\u[^ ]\+\).*$','\1','g')
|
||||||
|
|
||||||
|
" remove any trailing characters that don't look like a nested module
|
||||||
|
let word = substitute(word,'\.\U.*$','','g')
|
||||||
|
|
||||||
|
" replace module dots with slash
|
||||||
|
let word = substitute(word,'\.','/','g')
|
||||||
|
|
||||||
|
" remove any special chars
|
||||||
|
let word = substitute(word,'[^A-z0-9-_/]','','g')
|
||||||
|
|
||||||
|
" convert to snake_case
|
||||||
|
let word = substitute(word,'\(\u\+\)\(\u\l\)','\1_\2','g')
|
||||||
|
let word = substitute(word,'\(\u\+\)\(\u\l\)','\1_\2','g')
|
||||||
|
let word = substitute(word,'\(\l\|\d\)\(\u\)','\1_\2','g')
|
||||||
|
let word = substitute(word,'-','_','g')
|
||||||
|
let word = tolower(word)
|
||||||
|
|
||||||
|
return word
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
endif
|
||||||
12
autoload/elm/io.vim
Normal file
12
autoload/elm/io.vim
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'elm') == -1
|
||||||
|
|
||||||
|
" System IO
|
||||||
|
|
||||||
|
" Craft a system command and run it, returning the output.
|
||||||
|
function! elm#io#system(program, args)
|
||||||
|
let cmd ="which " . a:program . " && " . a:program . " " . a:args
|
||||||
|
return system(cmd)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
|
||||||
|
endif
|
||||||
70
autoload/fish.vim
Normal file
70
autoload/fish.vim
Normal file
@@ -0,0 +1,70 @@
|
|||||||
|
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'fish') == -1
|
||||||
|
|
||||||
|
function! fish#Indent()
|
||||||
|
let l:prevlnum = prevnonblank(v:lnum - 1)
|
||||||
|
if l:prevlnum ==# 0
|
||||||
|
return 0
|
||||||
|
endif
|
||||||
|
let l:indent = 0
|
||||||
|
let l:prevline = getline(l:prevlnum)
|
||||||
|
if l:prevline =~# '\v^\s*switch>'
|
||||||
|
let l:indent = &shiftwidth * 2
|
||||||
|
elseif l:prevline =~# '\v^\s*%(begin|if|else|while|for|function|case)>'
|
||||||
|
let l:indent = &shiftwidth
|
||||||
|
endif
|
||||||
|
let l:line = getline(v:lnum)
|
||||||
|
if l:line =~# '\v^\s*end>'
|
||||||
|
return indent(v:lnum) - (l:indent ==# 0 ? &shiftwidth : l:indent)
|
||||||
|
elseif l:line =~# '\v^\s*%(case|else)>'
|
||||||
|
return indent(v:lnum) - &shiftwidth
|
||||||
|
endif
|
||||||
|
return indent(l:prevlnum) + l:indent
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! fish#Format()
|
||||||
|
if mode() =~# '\v^%(i|R)$'
|
||||||
|
return 1
|
||||||
|
else
|
||||||
|
let l:command = v:lnum.','.(v:lnum+v:count-1).'!fish_indent'
|
||||||
|
echo l:command
|
||||||
|
execute l:command
|
||||||
|
endif
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! fish#Fold()
|
||||||
|
let l:line = getline(v:lnum)
|
||||||
|
if l:line =~# '\v^\s*%(begin|if|while|for|function|switch)>'
|
||||||
|
return 'a1'
|
||||||
|
elseif l:line =~# '\v^\s*end>'
|
||||||
|
return 's1'
|
||||||
|
else
|
||||||
|
return '='
|
||||||
|
end
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! fish#Complete(findstart, base)
|
||||||
|
if a:findstart
|
||||||
|
return getline('.') =~# '\v^\s*$' ? -1 : 0
|
||||||
|
else
|
||||||
|
if empty(a:base)
|
||||||
|
return []
|
||||||
|
endif
|
||||||
|
let l:results = []
|
||||||
|
let l:completions =
|
||||||
|
\ system('fish -c "complete -C'.shellescape(a:base).'"')
|
||||||
|
let l:cmd = substitute(a:base, '\v\S+$', '', '')
|
||||||
|
for l:line in split(l:completions, '\n')
|
||||||
|
let l:tokens = split(l:line, '\t')
|
||||||
|
call add(l:results, {'word': l:cmd.l:tokens[0],
|
||||||
|
\'abbr': l:tokens[0],
|
||||||
|
\'menu': get(l:tokens, 1, '')})
|
||||||
|
endfor
|
||||||
|
return l:results
|
||||||
|
endif
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! fish#errorformat()
|
||||||
|
return '%Afish: %m,%-G%*\\ ^,%-Z%f (line %l):%s'
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
endif
|
||||||
File diff suppressed because it is too large
Load Diff
21
autoload/python/utils.vim
Normal file
21
autoload/python/utils.vim
Normal 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
|
||||||
@@ -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,11 +589,13 @@ 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
|
||||||
Thread.new(a) do |b|
|
require 'thread'
|
||||||
begin
|
Thread.new(a) do |b|
|
||||||
b.load_rails
|
begin
|
||||||
rescue
|
b.load_rails
|
||||||
|
rescue
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
a.load_rails
|
a.load_rails
|
||||||
|
|||||||
@@ -36,72 +36,74 @@ endfunction
|
|||||||
" Run {{{1
|
" Run {{{1
|
||||||
|
|
||||||
function! rust#Run(bang, args)
|
function! rust#Run(bang, args)
|
||||||
|
let args = s:ShellTokenize(a:args)
|
||||||
if a:bang
|
if a:bang
|
||||||
let idx = index(a:args, '--')
|
let idx = index(l:args, '--')
|
||||||
if idx != -1
|
if idx != -1
|
||||||
let rustc_args = idx == 0 ? [] : a:args[:idx-1]
|
let rustc_args = idx == 0 ? [] : l:args[:idx-1]
|
||||||
let args = a:args[idx+1:]
|
let args = l:args[idx+1:]
|
||||||
else
|
else
|
||||||
let rustc_args = a:args
|
let rustc_args = l:args
|
||||||
let args = []
|
let args = []
|
||||||
endif
|
endif
|
||||||
else
|
else
|
||||||
let rustc_args = []
|
let rustc_args = []
|
||||||
let args = a:args
|
|
||||||
endif
|
endif
|
||||||
|
|
||||||
let b:rust_last_rustc_args = rustc_args
|
let b:rust_last_rustc_args = l:rustc_args
|
||||||
let b:rust_last_args = args
|
let b:rust_last_args = l:args
|
||||||
|
|
||||||
call s:WithPath(function("s:Run"), rustc_args, args)
|
call s:WithPath(function("s:Run"), rustc_args, args)
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! s:Run(path, rustc_args, args)
|
function! s:Run(dict, rustc_args, args)
|
||||||
try
|
let exepath = a:dict.tmpdir.'/'.fnamemodify(a:dict.path, ':t:r')
|
||||||
let exepath = tempname()
|
if has('win32')
|
||||||
if has('win32')
|
let exepath .= '.exe'
|
||||||
let exepath .= '.exe'
|
endif
|
||||||
endif
|
|
||||||
|
|
||||||
let rustc_args = [a:path, '-o', exepath] + a:rustc_args
|
let relpath = get(a:dict, 'tmpdir_relpath', a:dict.path)
|
||||||
|
let rustc_args = [relpath, '-o', exepath] + a:rustc_args
|
||||||
|
|
||||||
let rustc = exists("g:rustc_path") ? g:rustc_path : "rustc"
|
let rustc = exists("g:rustc_path") ? g:rustc_path : "rustc"
|
||||||
|
|
||||||
let output = system(shellescape(rustc) . " " . join(map(rustc_args, 'shellescape(v:val)')))
|
let pwd = a:dict.istemp ? a:dict.tmpdir : ''
|
||||||
if output != ''
|
let output = s:system(pwd, shellescape(rustc) . " " . join(map(rustc_args, 'shellescape(v:val)')))
|
||||||
echohl WarningMsg
|
if output != ''
|
||||||
echo output
|
echohl WarningMsg
|
||||||
echohl None
|
echo output
|
||||||
endif
|
echohl None
|
||||||
if !v:shell_error
|
endif
|
||||||
exe '!' . shellescape(exepath) . " " . join(map(a:args, 'shellescape(v:val)'))
|
if !v:shell_error
|
||||||
endif
|
exe '!' . shellescape(exepath) . " " . join(map(a:args, 'shellescape(v:val)'))
|
||||||
finally
|
endif
|
||||||
if exists("exepath")
|
|
||||||
silent! call delete(exepath)
|
|
||||||
endif
|
|
||||||
endtry
|
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
" Expand {{{1
|
" Expand {{{1
|
||||||
|
|
||||||
function! rust#Expand(bang, args)
|
function! rust#Expand(bang, args)
|
||||||
if a:bang && !empty(a:args)
|
let args = s:ShellTokenize(a:args)
|
||||||
let pretty = a:args[0]
|
if a:bang && !empty(l:args)
|
||||||
let args = a:args[1:]
|
let pretty = remove(l:args, 0)
|
||||||
else
|
else
|
||||||
let pretty = "expanded"
|
let pretty = "expanded"
|
||||||
let args = a:args
|
|
||||||
endif
|
endif
|
||||||
call s:WithPath(function("s:Expand"), pretty, args)
|
call s:WithPath(function("s:Expand"), pretty, args)
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! s:Expand(path, pretty, args)
|
function! s:Expand(dict, pretty, args)
|
||||||
try
|
try
|
||||||
let rustc = exists("g:rustc_path") ? g:rustc_path : "rustc"
|
let rustc = exists("g:rustc_path") ? g:rustc_path : "rustc"
|
||||||
|
|
||||||
let args = [a:path, '--pretty', a:pretty] + a:args
|
if a:pretty =~? '^\%(everybody_loops$\|flowgraph=\)'
|
||||||
let output = system(shellescape(rustc) . " " . join(map(args, "shellescape(v:val)")))
|
let flag = '--xpretty'
|
||||||
|
else
|
||||||
|
let flag = '--pretty'
|
||||||
|
endif
|
||||||
|
let relpath = get(a:dict, 'tmpdir_relpath', a:dict.path)
|
||||||
|
let args = [relpath, '-Z', 'unstable-options', l:flag, a:pretty] + a:args
|
||||||
|
let pwd = a:dict.istemp ? a:dict.tmpdir : ''
|
||||||
|
let output = s:system(pwd, shellescape(rustc) . " " . join(map(args, 'shellescape(v:val)')))
|
||||||
if v:shell_error
|
if v:shell_error
|
||||||
echohl WarningMsg
|
echohl WarningMsg
|
||||||
echo output
|
echo output
|
||||||
@@ -115,6 +117,20 @@ function! s:Expand(path, pretty, args)
|
|||||||
setl buftype=nofile
|
setl buftype=nofile
|
||||||
setl bufhidden=hide
|
setl bufhidden=hide
|
||||||
setl noswapfile
|
setl noswapfile
|
||||||
|
" give the buffer a nice name
|
||||||
|
let suffix = 1
|
||||||
|
let basename = fnamemodify(a:dict.path, ':t:r')
|
||||||
|
while 1
|
||||||
|
let bufname = basename
|
||||||
|
if suffix > 1 | let bufname .= ' ('.suffix.')' | endif
|
||||||
|
let bufname .= '.pretty.rs'
|
||||||
|
if bufexists(bufname)
|
||||||
|
let suffix += 1
|
||||||
|
continue
|
||||||
|
endif
|
||||||
|
exe 'silent noautocmd keepalt file' fnameescape(bufname)
|
||||||
|
break
|
||||||
|
endwhile
|
||||||
endif
|
endif
|
||||||
endtry
|
endtry
|
||||||
endfunction
|
endfunction
|
||||||
@@ -122,7 +138,7 @@ endfunction
|
|||||||
function! rust#CompleteExpand(lead, line, pos)
|
function! rust#CompleteExpand(lead, line, pos)
|
||||||
if a:line[: a:pos-1] =~ '^RustExpand!\s*\S*$'
|
if a:line[: a:pos-1] =~ '^RustExpand!\s*\S*$'
|
||||||
" first argument and it has a !
|
" first argument and it has a !
|
||||||
let list = ["normal", "expanded", "typed", "expanded,identified", "flowgraph="]
|
let list = ["normal", "expanded", "typed", "expanded,identified", "flowgraph=", "everybody_loops"]
|
||||||
if !empty(a:lead)
|
if !empty(a:lead)
|
||||||
call filter(list, "v:val[:len(a:lead)-1] == a:lead")
|
call filter(list, "v:val[:len(a:lead)-1] == a:lead")
|
||||||
endif
|
endif
|
||||||
@@ -135,72 +151,120 @@ endfunction
|
|||||||
" Emit {{{1
|
" Emit {{{1
|
||||||
|
|
||||||
function! rust#Emit(type, args)
|
function! rust#Emit(type, args)
|
||||||
call s:WithPath(function("s:Emit"), a:type, a:args)
|
let args = s:ShellTokenize(a:args)
|
||||||
|
call s:WithPath(function("s:Emit"), a:type, args)
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! s:Emit(path, type, args)
|
function! s:Emit(dict, type, args)
|
||||||
try
|
try
|
||||||
|
let output_path = a:dict.tmpdir.'/output'
|
||||||
|
|
||||||
let rustc = exists("g:rustc_path") ? g:rustc_path : "rustc"
|
let rustc = exists("g:rustc_path") ? g:rustc_path : "rustc"
|
||||||
|
|
||||||
let args = [a:path, '--emit', a:type, '-o', '-'] + a:args
|
let relpath = get(a:dict, 'tmpdir_relpath', a:dict.path)
|
||||||
let output = system(shellescape(rustc) . " " . join(map(args, "shellescape(v:val)")))
|
let args = [relpath, '--emit', a:type, '-o', output_path] + a:args
|
||||||
if v:shell_error
|
let pwd = a:dict.istemp ? a:dict.tmpdir : ''
|
||||||
|
let output = s:system(pwd, shellescape(rustc) . " " . join(map(args, 'shellescape(v:val)')))
|
||||||
|
if output != ''
|
||||||
echohl WarningMsg
|
echohl WarningMsg
|
||||||
echo output
|
echo output
|
||||||
echohl None
|
echohl None
|
||||||
else
|
endif
|
||||||
|
if !v:shell_error
|
||||||
new
|
new
|
||||||
silent put =output
|
exe 'silent keepalt read' fnameescape(output_path)
|
||||||
1
|
1
|
||||||
d
|
d
|
||||||
if a:type == "ir"
|
if a:type == "llvm-ir"
|
||||||
setl filetype=llvm
|
setl filetype=llvm
|
||||||
|
let extension = 'll'
|
||||||
elseif a:type == "asm"
|
elseif a:type == "asm"
|
||||||
setl filetype=asm
|
setl filetype=asm
|
||||||
|
let extension = 's'
|
||||||
endif
|
endif
|
||||||
setl buftype=nofile
|
setl buftype=nofile
|
||||||
setl bufhidden=hide
|
setl bufhidden=hide
|
||||||
setl noswapfile
|
setl noswapfile
|
||||||
|
if exists('l:extension')
|
||||||
|
" give the buffer a nice name
|
||||||
|
let suffix = 1
|
||||||
|
let basename = fnamemodify(a:dict.path, ':t:r')
|
||||||
|
while 1
|
||||||
|
let bufname = basename
|
||||||
|
if suffix > 1 | let bufname .= ' ('.suffix.')' | endif
|
||||||
|
let bufname .= '.'.extension
|
||||||
|
if bufexists(bufname)
|
||||||
|
let suffix += 1
|
||||||
|
continue
|
||||||
|
endif
|
||||||
|
exe 'silent noautocmd keepalt file' fnameescape(bufname)
|
||||||
|
break
|
||||||
|
endwhile
|
||||||
|
endif
|
||||||
endif
|
endif
|
||||||
endtry
|
endtry
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
" Utility functions {{{1
|
" Utility functions {{{1
|
||||||
|
|
||||||
|
" Invokes func(dict, ...)
|
||||||
|
" Where {dict} is a dictionary with the following keys:
|
||||||
|
" 'path' - The path to the file
|
||||||
|
" 'tmpdir' - The path to a temporary directory that will be deleted when the
|
||||||
|
" function returns.
|
||||||
|
" 'istemp' - 1 if the path is a file inside of {dict.tmpdir} or 0 otherwise.
|
||||||
|
" If {istemp} is 1 then an additional key is provided:
|
||||||
|
" 'tmpdir_relpath' - The {path} relative to the {tmpdir}.
|
||||||
|
"
|
||||||
|
" {dict.path} may be a path to a file inside of {dict.tmpdir} or it may be the
|
||||||
|
" existing path of the current buffer. If the path is inside of {dict.tmpdir}
|
||||||
|
" then it is guaranteed to have a '.rs' extension.
|
||||||
function! s:WithPath(func, ...)
|
function! s:WithPath(func, ...)
|
||||||
|
let buf = bufnr('')
|
||||||
|
let saved = {}
|
||||||
|
let dict = {}
|
||||||
try
|
try
|
||||||
let save_write = &write
|
let saved.write = &write
|
||||||
set write
|
set write
|
||||||
let path = expand('%')
|
let dict.path = expand('%')
|
||||||
let pathisempty = empty(path)
|
let pathisempty = empty(dict.path)
|
||||||
if pathisempty || !save_write
|
|
||||||
" use a temporary file named 'unnamed.rs' inside a temporary
|
|
||||||
" directory. This produces better error messages
|
|
||||||
let tmpdir = tempname()
|
|
||||||
call mkdir(tmpdir)
|
|
||||||
|
|
||||||
let save_cwd = getcwd()
|
" Always create a tmpdir in case the wrapped command wants it
|
||||||
silent exe 'lcd' fnameescape(tmpdir)
|
let dict.tmpdir = tempname()
|
||||||
|
call mkdir(dict.tmpdir)
|
||||||
|
|
||||||
let path = 'unnamed.rs'
|
if pathisempty || !saved.write
|
||||||
|
let dict.istemp = 1
|
||||||
|
" if we're doing this because of nowrite, preserve the filename
|
||||||
|
if !pathisempty
|
||||||
|
let filename = expand('%:t:r').".rs"
|
||||||
|
else
|
||||||
|
let filename = 'unnamed.rs'
|
||||||
|
endif
|
||||||
|
let dict.tmpdir_relpath = filename
|
||||||
|
let dict.path = dict.tmpdir.'/'.filename
|
||||||
|
|
||||||
let save_mod = &mod
|
let saved.mod = &mod
|
||||||
set nomod
|
set nomod
|
||||||
|
|
||||||
silent exe 'keepalt write! ' . fnameescape(path)
|
silent exe 'keepalt write! ' . fnameescape(dict.path)
|
||||||
if pathisempty
|
if pathisempty
|
||||||
silent keepalt 0file
|
silent keepalt 0file
|
||||||
endif
|
endif
|
||||||
else
|
else
|
||||||
|
let dict.istemp = 0
|
||||||
update
|
update
|
||||||
endif
|
endif
|
||||||
|
|
||||||
call call(a:func, [path] + a:000)
|
call call(a:func, [dict] + a:000)
|
||||||
finally
|
finally
|
||||||
if exists("save_mod") | let &mod = save_mod | endif
|
if bufexists(buf)
|
||||||
if exists("save_write") | let &write = save_write | endif
|
for [opt, value] in items(saved)
|
||||||
if exists("save_cwd") | silent exe 'lcd' fnameescape(save_cwd) | endif
|
silent call setbufvar(buf, '&'.opt, value)
|
||||||
if exists("tmpdir") | silent call s:RmDir(tmpdir) | endif
|
unlet value " avoid variable type mismatches
|
||||||
|
endfor
|
||||||
|
endif
|
||||||
|
if has_key(dict, 'tmpdir') | silent call s:RmDir(dict.tmpdir) | endif
|
||||||
endtry
|
endtry
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
@@ -210,6 +274,71 @@ function! rust#AppendCmdLine(text)
|
|||||||
return cmd
|
return cmd
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
|
" Tokenize the string according to sh parsing rules
|
||||||
|
function! s:ShellTokenize(text)
|
||||||
|
" states:
|
||||||
|
" 0: start of word
|
||||||
|
" 1: unquoted
|
||||||
|
" 2: unquoted backslash
|
||||||
|
" 3: double-quote
|
||||||
|
" 4: double-quoted backslash
|
||||||
|
" 5: single-quote
|
||||||
|
let l:state = 0
|
||||||
|
let l:current = ''
|
||||||
|
let l:args = []
|
||||||
|
for c in split(a:text, '\zs')
|
||||||
|
if l:state == 0 || l:state == 1 " unquoted
|
||||||
|
if l:c ==# ' '
|
||||||
|
if l:state == 0 | continue | endif
|
||||||
|
call add(l:args, l:current)
|
||||||
|
let l:current = ''
|
||||||
|
let l:state = 0
|
||||||
|
elseif l:c ==# '\'
|
||||||
|
let l:state = 2
|
||||||
|
elseif l:c ==# '"'
|
||||||
|
let l:state = 3
|
||||||
|
elseif l:c ==# "'"
|
||||||
|
let l:state = 5
|
||||||
|
else
|
||||||
|
let l:current .= l:c
|
||||||
|
let l:state = 1
|
||||||
|
endif
|
||||||
|
elseif l:state == 2 " unquoted backslash
|
||||||
|
if l:c !=# "\n" " can it even be \n?
|
||||||
|
let l:current .= l:c
|
||||||
|
endif
|
||||||
|
let l:state = 1
|
||||||
|
elseif l:state == 3 " double-quote
|
||||||
|
if l:c ==# '\'
|
||||||
|
let l:state = 4
|
||||||
|
elseif l:c ==# '"'
|
||||||
|
let l:state = 1
|
||||||
|
else
|
||||||
|
let l:current .= l:c
|
||||||
|
endif
|
||||||
|
elseif l:state == 4 " double-quoted backslash
|
||||||
|
if stridx('$`"\', l:c) >= 0
|
||||||
|
let l:current .= l:c
|
||||||
|
elseif l:c ==# "\n" " is this even possible?
|
||||||
|
" skip it
|
||||||
|
else
|
||||||
|
let l:current .= '\'.l:c
|
||||||
|
endif
|
||||||
|
let l:state = 3
|
||||||
|
elseif l:state == 5 " single-quoted
|
||||||
|
if l:c == "'"
|
||||||
|
let l:state = 1
|
||||||
|
else
|
||||||
|
let l:current .= l:c
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
endfor
|
||||||
|
if l:state != 0
|
||||||
|
call add(l:args, l:current)
|
||||||
|
endif
|
||||||
|
return l:args
|
||||||
|
endfunction
|
||||||
|
|
||||||
function! s:RmDir(path)
|
function! s:RmDir(path)
|
||||||
" sanity check; make sure it's not empty, /, or $HOME
|
" sanity check; make sure it's not empty, /, or $HOME
|
||||||
if empty(a:path)
|
if empty(a:path)
|
||||||
@@ -219,7 +348,67 @@ function! s:RmDir(path)
|
|||||||
echoerr 'Attempted to delete protected path: ' . a:path
|
echoerr 'Attempted to delete protected path: ' . a:path
|
||||||
return 0
|
return 0
|
||||||
endif
|
endif
|
||||||
silent exe "!rm -rf " . shellescape(a:path)
|
return system("rm -rf " . shellescape(a:path))
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" Executes {cmd} with the cwd set to {pwd}, without changing Vim's cwd.
|
||||||
|
" If {pwd} is the empty string then it doesn't change the cwd.
|
||||||
|
function! s:system(pwd, cmd)
|
||||||
|
let cmd = a:cmd
|
||||||
|
if !empty(a:pwd)
|
||||||
|
let cmd = 'cd ' . shellescape(a:pwd) . ' && ' . cmd
|
||||||
|
endif
|
||||||
|
return system(cmd)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" Playpen Support {{{1
|
||||||
|
" Parts of gist.vim by Yasuhiro Matsumoto <mattn.jp@gmail.com> reused
|
||||||
|
" gist.vim available under the BSD license, available at
|
||||||
|
" http://github.com/mattn/gist-vim
|
||||||
|
function! s:has_webapi()
|
||||||
|
if !exists("*webapi#http#post")
|
||||||
|
try
|
||||||
|
call webapi#http#post()
|
||||||
|
catch
|
||||||
|
endtry
|
||||||
|
endif
|
||||||
|
return exists("*webapi#http#post")
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! rust#Play(count, line1, line2, ...) abort
|
||||||
|
redraw
|
||||||
|
|
||||||
|
let l:rust_playpen_url = get(g:, 'rust_playpen_url', 'https://play.rust-lang.org/')
|
||||||
|
let l:rust_shortener_url = get(g:, 'rust_shortener_url', 'https://is.gd/')
|
||||||
|
|
||||||
|
if !s:has_webapi()
|
||||||
|
echohl ErrorMsg | echomsg ':RustPlay depends on webapi.vim (https://github.com/mattn/webapi-vim)' | echohl None
|
||||||
|
return
|
||||||
|
endif
|
||||||
|
|
||||||
|
let bufname = bufname('%')
|
||||||
|
if a:count < 1
|
||||||
|
let content = join(getline(a:line1, a:line2), "\n")
|
||||||
|
else
|
||||||
|
let save_regcont = @"
|
||||||
|
let save_regtype = getregtype('"')
|
||||||
|
silent! normal! gvy
|
||||||
|
let content = @"
|
||||||
|
call setreg('"', save_regcont, save_regtype)
|
||||||
|
endif
|
||||||
|
|
||||||
|
let body = l:rust_playpen_url."?code=".webapi#http#encodeURI(content)
|
||||||
|
|
||||||
|
if strlen(body) > 5000
|
||||||
|
echohl ErrorMsg | echomsg 'Buffer too large, max 5000 encoded characters ('.strlen(body).')' | echohl None
|
||||||
|
return
|
||||||
|
endif
|
||||||
|
|
||||||
|
let payload = "format=simple&url=".webapi#http#encodeURI(body)
|
||||||
|
let res = webapi#http#post(l:rust_shortener_url.'create.php', payload, {})
|
||||||
|
let url = res.content
|
||||||
|
|
||||||
|
redraw | echomsg 'Done: '.url
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
" }}}1
|
" }}}1
|
||||||
|
|||||||
110
autoload/rustfmt.vim
Normal file
110
autoload/rustfmt.vim
Normal file
@@ -0,0 +1,110 @@
|
|||||||
|
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'rust') == -1
|
||||||
|
|
||||||
|
" Author: Stephen Sugden <stephen@stephensugden.com>
|
||||||
|
"
|
||||||
|
" Adapted from https://github.com/fatih/vim-go
|
||||||
|
|
||||||
|
if !exists("g:rustfmt_autosave")
|
||||||
|
let g:rustfmt_autosave = 0
|
||||||
|
endif
|
||||||
|
|
||||||
|
if !exists("g:rustfmt_command")
|
||||||
|
let g:rustfmt_command = "rustfmt"
|
||||||
|
endif
|
||||||
|
|
||||||
|
if !exists("g:rustfmt_options")
|
||||||
|
let g:rustfmt_options = ""
|
||||||
|
endif
|
||||||
|
|
||||||
|
if !exists("g:rustfmt_fail_silently")
|
||||||
|
let g:rustfmt_fail_silently = 0
|
||||||
|
endif
|
||||||
|
|
||||||
|
let s:got_fmt_error = 0
|
||||||
|
|
||||||
|
function! s:RustfmtCommandRange(filename, line1, line2)
|
||||||
|
let l:arg = {"file": shellescape(a:filename), "range": [a:line1, a:line2]}
|
||||||
|
return printf("%s %s --write-mode=overwrite --file-lines '[%s]'", g:rustfmt_command, g:rustfmt_options, json_encode(l:arg))
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
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")
|
||||||
|
let out = systemlist(a:command)
|
||||||
|
else
|
||||||
|
let out = split(system(a:command), '\r\?\n')
|
||||||
|
endif
|
||||||
|
|
||||||
|
if v:shell_error == 0 || v:shell_error == 3
|
||||||
|
" remove undo point caused via BufWritePre
|
||||||
|
try | silent undojoin | catch | endtry
|
||||||
|
|
||||||
|
" Replace current file with temp file, then reload buffer
|
||||||
|
call rename(a:tmpname, expand('%'))
|
||||||
|
silent edit!
|
||||||
|
let &syntax = &syntax
|
||||||
|
|
||||||
|
" only clear location list if it was previously filled to prevent
|
||||||
|
" clobbering other additions
|
||||||
|
if s:got_fmt_error
|
||||||
|
let s:got_fmt_error = 0
|
||||||
|
call setloclist(0, [])
|
||||||
|
lwindow
|
||||||
|
endif
|
||||||
|
elseif g:rustfmt_fail_silently == 0
|
||||||
|
" otherwise get the errors and put them in the location list
|
||||||
|
let errors = []
|
||||||
|
|
||||||
|
for line in out
|
||||||
|
" src/lib.rs:13:5: 13:10 error: expected `,`, or `}`, found `value`
|
||||||
|
let tokens = matchlist(line, '^\(.\{-}\):\(\d\+\):\(\d\+\):\s*\(\d\+:\d\+\s*\)\?\s*error: \(.*\)')
|
||||||
|
if !empty(tokens)
|
||||||
|
call add(errors, {"filename": @%,
|
||||||
|
\"lnum": tokens[2],
|
||||||
|
\"col": tokens[3],
|
||||||
|
\"text": tokens[5]})
|
||||||
|
endif
|
||||||
|
endfor
|
||||||
|
|
||||||
|
if empty(errors)
|
||||||
|
% | " Couldn't detect rustfmt error format, output errors
|
||||||
|
endif
|
||||||
|
|
||||||
|
if !empty(errors)
|
||||||
|
call setloclist(0, errors, 'r')
|
||||||
|
echohl Error | echomsg "rustfmt returned error" | echohl None
|
||||||
|
endif
|
||||||
|
|
||||||
|
let s:got_fmt_error = 1
|
||||||
|
lwindow
|
||||||
|
" We didn't use the temp file, so clean up
|
||||||
|
call delete(a:tmpname)
|
||||||
|
endif
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
|
endif
|
||||||
41
autoload/scss_indent.vim
Normal file
41
autoload/scss_indent.vim
Normal 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
|
||||||
16
autoload/vital.vim
Normal file
16
autoload/vital.vim
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'crystal') == -1
|
||||||
|
|
||||||
|
function! vital#of(name) abort
|
||||||
|
let files = globpath(&runtimepath, 'autoload/vital/' . a:name . '.vital')
|
||||||
|
let file = split(files, "\n")
|
||||||
|
if empty(file)
|
||||||
|
throw 'vital: version file not found: ' . a:name
|
||||||
|
endif
|
||||||
|
let ver = readfile(file[0], 'b')
|
||||||
|
if empty(ver)
|
||||||
|
throw 'vital: invalid version file: ' . a:name
|
||||||
|
endif
|
||||||
|
return vital#_{substitute(ver[0], '\W', '', 'g')}#new()
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
endif
|
||||||
313
autoload/vital/_crystal.vim
Normal file
313
autoload/vital/_crystal.vim
Normal file
@@ -0,0 +1,313 @@
|
|||||||
|
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'crystal') == -1
|
||||||
|
|
||||||
|
let s:self_version = expand('<sfile>:t:r')
|
||||||
|
let s:self_file = expand('<sfile>')
|
||||||
|
|
||||||
|
" Note: The extra argument to globpath() was added in Patch 7.2.051.
|
||||||
|
let s:globpath_third_arg = v:version > 702 || v:version == 702 && has('patch51')
|
||||||
|
|
||||||
|
let s:loaded = {}
|
||||||
|
let s:cache_module_path = {}
|
||||||
|
let s:cache_sid = {}
|
||||||
|
|
||||||
|
let s:_vital_files_cache_runtimepath = ''
|
||||||
|
let s:_vital_files_cache = []
|
||||||
|
let s:_unify_path_cache = {}
|
||||||
|
|
||||||
|
function! s:import(name, ...) abort
|
||||||
|
let target = {}
|
||||||
|
let functions = []
|
||||||
|
for a in a:000
|
||||||
|
if type(a) == type({})
|
||||||
|
let target = a
|
||||||
|
elseif type(a) == type([])
|
||||||
|
let functions = a
|
||||||
|
endif
|
||||||
|
unlet a
|
||||||
|
endfor
|
||||||
|
let module = s:_import(a:name)
|
||||||
|
if empty(functions)
|
||||||
|
call extend(target, module, 'keep')
|
||||||
|
else
|
||||||
|
for f in functions
|
||||||
|
if has_key(module, f) && !has_key(target, f)
|
||||||
|
let target[f] = module[f]
|
||||||
|
endif
|
||||||
|
endfor
|
||||||
|
endif
|
||||||
|
return target
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:load(...) dict abort
|
||||||
|
for arg in a:000
|
||||||
|
let [name; as] = type(arg) == type([]) ? arg[: 1] : [arg, arg]
|
||||||
|
let target = split(join(as, ''), '\W\+')
|
||||||
|
let dict = self
|
||||||
|
let dict_type = type({})
|
||||||
|
while !empty(target)
|
||||||
|
let ns = remove(target, 0)
|
||||||
|
if !has_key(dict, ns)
|
||||||
|
let dict[ns] = {}
|
||||||
|
endif
|
||||||
|
if type(dict[ns]) == dict_type
|
||||||
|
let dict = dict[ns]
|
||||||
|
else
|
||||||
|
unlet dict
|
||||||
|
break
|
||||||
|
endif
|
||||||
|
endwhile
|
||||||
|
|
||||||
|
if exists('dict')
|
||||||
|
call extend(dict, s:_import(name))
|
||||||
|
endif
|
||||||
|
unlet arg
|
||||||
|
endfor
|
||||||
|
return self
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:unload() abort
|
||||||
|
let s:loaded = {}
|
||||||
|
let s:cache_sid = {}
|
||||||
|
let s:cache_module_path = {}
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:exists(name) abort
|
||||||
|
return s:_get_module_path(a:name) !=# ''
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:search(pattern) abort
|
||||||
|
let paths = s:_vital_files(a:pattern)
|
||||||
|
let modules = sort(map(paths, 's:_file2module(v:val)'))
|
||||||
|
return s:_uniq(modules)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:expand_modules(entry, all) abort
|
||||||
|
if type(a:entry) == type([])
|
||||||
|
let candidates = s:_concat(map(copy(a:entry), 's:search(v:val)'))
|
||||||
|
if empty(candidates)
|
||||||
|
throw printf('vital: Any of module %s is not found', string(a:entry))
|
||||||
|
endif
|
||||||
|
if eval(join(map(copy(candidates), 'has_key(a:all, v:val)'), '+'))
|
||||||
|
let modules = []
|
||||||
|
else
|
||||||
|
let modules = [candidates[0]]
|
||||||
|
endif
|
||||||
|
else
|
||||||
|
let modules = s:search(a:entry)
|
||||||
|
if empty(modules)
|
||||||
|
throw printf('vital: Module %s is not found', a:entry)
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
call filter(modules, '!has_key(a:all, v:val)')
|
||||||
|
for module in modules
|
||||||
|
let a:all[module] = 1
|
||||||
|
endfor
|
||||||
|
return modules
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:_import(name) abort
|
||||||
|
if type(a:name) == type(0)
|
||||||
|
return s:_build_module(a:name)
|
||||||
|
endif
|
||||||
|
let path = s:_get_module_path(a:name)
|
||||||
|
if path ==# ''
|
||||||
|
throw 'vital: module not found: ' . a:name
|
||||||
|
endif
|
||||||
|
let sid = s:_get_sid_by_script(path)
|
||||||
|
if !sid
|
||||||
|
try
|
||||||
|
execute 'source' fnameescape(path)
|
||||||
|
catch /^Vim\%((\a\+)\)\?:E484/
|
||||||
|
throw 'vital: module not found: ' . a:name
|
||||||
|
catch /^Vim\%((\a\+)\)\?:E127/
|
||||||
|
" Ignore.
|
||||||
|
endtry
|
||||||
|
|
||||||
|
let sid = s:_get_sid_by_script(path)
|
||||||
|
endif
|
||||||
|
return s:_build_module(sid)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:_get_module_path(name) abort
|
||||||
|
let key = a:name . '_'
|
||||||
|
if has_key(s:cache_module_path, key)
|
||||||
|
return s:cache_module_path[key]
|
||||||
|
endif
|
||||||
|
if s:_is_absolute_path(a:name) && filereadable(a:name)
|
||||||
|
return a:name
|
||||||
|
endif
|
||||||
|
if a:name ==# ''
|
||||||
|
let paths = [s:self_file]
|
||||||
|
elseif a:name =~# '\v^\u\w*%(\.\u\w*)*$'
|
||||||
|
let paths = s:_vital_files(a:name)
|
||||||
|
else
|
||||||
|
throw 'vital: Invalid module name: ' . a:name
|
||||||
|
endif
|
||||||
|
|
||||||
|
call filter(paths, 'filereadable(expand(v:val, 1))')
|
||||||
|
let path = get(paths, 0, '')
|
||||||
|
let s:cache_module_path[key] = path
|
||||||
|
return path
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:_get_sid_by_script(path) abort
|
||||||
|
if has_key(s:cache_sid, a:path)
|
||||||
|
return s:cache_sid[a:path]
|
||||||
|
endif
|
||||||
|
|
||||||
|
let path = s:_unify_path(a:path)
|
||||||
|
for line in filter(split(s:_redir('scriptnames'), "\n"),
|
||||||
|
\ 'stridx(v:val, s:self_version) > 0')
|
||||||
|
let list = matchlist(line, '^\s*\(\d\+\):\s\+\(.\+\)\s*$')
|
||||||
|
if !empty(list) && s:_unify_path(list[2]) ==# path
|
||||||
|
let s:cache_sid[a:path] = list[1] - 0
|
||||||
|
return s:cache_sid[a:path]
|
||||||
|
endif
|
||||||
|
endfor
|
||||||
|
return 0
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:_file2module(file) abort
|
||||||
|
let filename = fnamemodify(a:file, ':p:gs?[\\/]?/?')
|
||||||
|
let tail = matchstr(filename, 'autoload/vital/_\w\+/\zs.*\ze\.vim$')
|
||||||
|
return join(split(tail, '[\\/]\+'), '.')
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
if filereadable(expand('<sfile>:r') . '.VIM')
|
||||||
|
" resolve() is slow, so we cache results.
|
||||||
|
" Note: On windows, vim can't expand path names from 8.3 formats.
|
||||||
|
" So if getting full path via <sfile> and $HOME was set as 8.3 format,
|
||||||
|
" vital load duplicated scripts. Below's :~ avoid this issue.
|
||||||
|
function! s:_unify_path(path) abort
|
||||||
|
if has_key(s:_unify_path_cache, a:path)
|
||||||
|
return s:_unify_path_cache[a:path]
|
||||||
|
endif
|
||||||
|
let value = tolower(fnamemodify(resolve(fnamemodify(
|
||||||
|
\ a:path, ':p')), ':~:gs?[\\/]?/?'))
|
||||||
|
let s:_unify_path_cache[a:path] = value
|
||||||
|
return value
|
||||||
|
endfunction
|
||||||
|
else
|
||||||
|
function! s:_unify_path(path) abort
|
||||||
|
return resolve(fnamemodify(a:path, ':p:gs?[\\/]?/?'))
|
||||||
|
endfunction
|
||||||
|
endif
|
||||||
|
|
||||||
|
if s:globpath_third_arg
|
||||||
|
function! s:_runtime_files(path) abort
|
||||||
|
return split(globpath(&runtimepath, a:path, 1), "\n")
|
||||||
|
endfunction
|
||||||
|
else
|
||||||
|
function! s:_runtime_files(path) abort
|
||||||
|
return split(globpath(&runtimepath, a:path), "\n")
|
||||||
|
endfunction
|
||||||
|
endif
|
||||||
|
|
||||||
|
function! s:_vital_files(pattern) abort
|
||||||
|
if s:_vital_files_cache_runtimepath !=# &runtimepath
|
||||||
|
let path = printf('autoload/vital/%s/**/*.vim', s:self_version)
|
||||||
|
let s:_vital_files_cache = s:_runtime_files(path)
|
||||||
|
let mod = ':p:gs?[\\/]\+?/?'
|
||||||
|
call map(s:_vital_files_cache, 'fnamemodify(v:val, mod)')
|
||||||
|
let s:_vital_files_cache_runtimepath = &runtimepath
|
||||||
|
endif
|
||||||
|
let target = substitute(a:pattern, '\.', '/', 'g')
|
||||||
|
let target = substitute(target, '\*', '[^/]*', 'g')
|
||||||
|
let regexp = printf('autoload/vital/%s/%s.vim', s:self_version, target)
|
||||||
|
return filter(copy(s:_vital_files_cache), 'v:val =~# regexp')
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" Copy from System.Filepath
|
||||||
|
if has('win16') || has('win32') || has('win64')
|
||||||
|
function! s:_is_absolute_path(path) abort
|
||||||
|
return a:path =~? '^[a-z]:[/\\]'
|
||||||
|
endfunction
|
||||||
|
else
|
||||||
|
function! s:_is_absolute_path(path) abort
|
||||||
|
return a:path[0] ==# '/'
|
||||||
|
endfunction
|
||||||
|
endif
|
||||||
|
|
||||||
|
function! s:_build_module(sid) abort
|
||||||
|
if has_key(s:loaded, a:sid)
|
||||||
|
return copy(s:loaded[a:sid])
|
||||||
|
endif
|
||||||
|
let functions = s:_get_functions(a:sid)
|
||||||
|
|
||||||
|
let prefix = '<SNR>' . a:sid . '_'
|
||||||
|
let module = {}
|
||||||
|
for func in functions
|
||||||
|
let module[func] = function(prefix . func)
|
||||||
|
endfor
|
||||||
|
if has_key(module, '_vital_created')
|
||||||
|
call module._vital_created(module)
|
||||||
|
endif
|
||||||
|
let export_module = filter(copy(module), 'v:key =~# "^\\a"')
|
||||||
|
let s:loaded[a:sid] = get(g:, 'vital_debug', 0) ? module : export_module
|
||||||
|
if has_key(module, '_vital_loaded')
|
||||||
|
let V = vital#{s:self_version}#new()
|
||||||
|
call module._vital_loaded(V)
|
||||||
|
endif
|
||||||
|
return copy(s:loaded[a:sid])
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
if exists('+regexpengine')
|
||||||
|
function! s:_get_functions(sid) abort
|
||||||
|
let funcs = s:_redir(printf("function /\\%%#=2^\<SNR>%d_", a:sid))
|
||||||
|
let map_pat = '<SNR>' . a:sid . '_\zs\w\+'
|
||||||
|
return map(split(funcs, "\n"), 'matchstr(v:val, map_pat)')
|
||||||
|
endfunction
|
||||||
|
else
|
||||||
|
function! s:_get_functions(sid) abort
|
||||||
|
let prefix = '<SNR>' . a:sid . '_'
|
||||||
|
let funcs = s:_redir('function')
|
||||||
|
let filter_pat = '^\s*function ' . prefix
|
||||||
|
let map_pat = prefix . '\zs\w\+'
|
||||||
|
return map(filter(split(funcs, "\n"),
|
||||||
|
\ 'stridx(v:val, prefix) > 0 && v:val =~# filter_pat'),
|
||||||
|
\ 'matchstr(v:val, map_pat)')
|
||||||
|
endfunction
|
||||||
|
endif
|
||||||
|
|
||||||
|
if exists('*uniq')
|
||||||
|
function! s:_uniq(list) abort
|
||||||
|
return uniq(a:list)
|
||||||
|
endfunction
|
||||||
|
else
|
||||||
|
function! s:_uniq(list) abort
|
||||||
|
let i = len(a:list) - 1
|
||||||
|
while 0 < i
|
||||||
|
if a:list[i] ==# a:list[i - 1]
|
||||||
|
call remove(a:list, i)
|
||||||
|
let i -= 2
|
||||||
|
else
|
||||||
|
let i -= 1
|
||||||
|
endif
|
||||||
|
endwhile
|
||||||
|
return a:list
|
||||||
|
endfunction
|
||||||
|
endif
|
||||||
|
|
||||||
|
function! s:_concat(lists) abort
|
||||||
|
let result_list = []
|
||||||
|
for list in a:lists
|
||||||
|
let result_list += list
|
||||||
|
endfor
|
||||||
|
return result_list
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:_redir(cmd) abort
|
||||||
|
let [save_verbose, save_verbosefile] = [&verbose, &verbosefile]
|
||||||
|
set verbose=0 verbosefile=
|
||||||
|
redir => res
|
||||||
|
silent! execute a:cmd
|
||||||
|
redir END
|
||||||
|
let [&verbose, &verbosefile] = [save_verbose, save_verbosefile]
|
||||||
|
return res
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! vital#{s:self_version}#new() abort
|
||||||
|
return s:_import('')
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
endif
|
||||||
182
autoload/vital/_crystal/ColorEcho.vim
Normal file
182
autoload/vital/_crystal/ColorEcho.vim
Normal file
@@ -0,0 +1,182 @@
|
|||||||
|
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'crystal') == -1
|
||||||
|
|
||||||
|
scriptencoding utf-8
|
||||||
|
let s:save_cpo = &cpo
|
||||||
|
set cpo&vim
|
||||||
|
|
||||||
|
function! s:_is_available() abort
|
||||||
|
if has('gui_running')
|
||||||
|
return 1
|
||||||
|
endif
|
||||||
|
|
||||||
|
if has('win32') || has('win64')
|
||||||
|
return 0
|
||||||
|
endif
|
||||||
|
|
||||||
|
return exists('&t_Co') && (&t_Co == 8 || &t_Co == 256)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:is_available() abort
|
||||||
|
if exists('s:is_available_cache')
|
||||||
|
return s:is_available_cache
|
||||||
|
endif
|
||||||
|
let s:is_available_cache = s:_is_available()
|
||||||
|
return s:is_available_cache
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:_define_ansi_highlights() abort
|
||||||
|
hi ansiNone cterm=NONE gui=NONE
|
||||||
|
|
||||||
|
hi ansiBlackBg ctermbg=black guibg=black cterm=none gui=none
|
||||||
|
hi ansiRedBg ctermbg=red guibg=red cterm=none gui=none
|
||||||
|
hi ansiGreenBg ctermbg=green guibg=green cterm=none gui=none
|
||||||
|
hi ansiYellowBg ctermbg=yellow guibg=yellow cterm=none gui=none
|
||||||
|
hi ansiBlueBg ctermbg=blue guibg=blue cterm=none gui=none
|
||||||
|
hi ansiMagentaBg ctermbg=magenta guibg=magenta cterm=none gui=none
|
||||||
|
hi ansiCyanBg ctermbg=cyan guibg=cyan cterm=none gui=none
|
||||||
|
hi ansiWhiteBg ctermbg=white guibg=white cterm=none gui=none
|
||||||
|
hi ansiGrayBg ctermbg=gray guibg=gray cterm=none gui=none
|
||||||
|
|
||||||
|
hi ansiBlackFg ctermfg=black guifg=black cterm=none gui=none
|
||||||
|
hi ansiRedFg ctermfg=red guifg=red cterm=none gui=none
|
||||||
|
hi ansiGreenFg ctermfg=green guifg=green cterm=none gui=none
|
||||||
|
hi ansiYellowFg ctermfg=yellow guifg=yellow cterm=none gui=none
|
||||||
|
hi ansiBlueFg ctermfg=blue guifg=blue cterm=none gui=none
|
||||||
|
hi ansiMagentaFg ctermfg=magenta guifg=magenta cterm=none gui=none
|
||||||
|
hi ansiCyanFg ctermfg=cyan guifg=cyan cterm=none gui=none
|
||||||
|
hi ansiWhiteFg ctermfg=white guifg=white cterm=none gui=none
|
||||||
|
hi ansiGrayFg ctermfg=gray guifg=gray cterm=none gui=none
|
||||||
|
|
||||||
|
hi ansiBoldBlackFg ctermfg=black guifg=black cterm=none gui=none cterm=bold gui=bold
|
||||||
|
hi ansiBoldRedFg ctermfg=red guifg=red cterm=none gui=none cterm=bold gui=bold
|
||||||
|
hi ansiBoldGreenFg ctermfg=green guifg=green cterm=none gui=none cterm=bold gui=bold
|
||||||
|
hi ansiBoldYellowFg ctermfg=yellow guifg=yellow cterm=none gui=none cterm=bold gui=bold
|
||||||
|
hi ansiBoldBlueFg ctermfg=blue guifg=blue cterm=none gui=none cterm=bold gui=bold
|
||||||
|
hi ansiBoldMagentaFg ctermfg=magenta guifg=magenta cterm=none gui=none cterm=bold gui=bold
|
||||||
|
hi ansiBoldCyanFg ctermfg=cyan guifg=cyan cterm=none gui=none cterm=bold gui=bold
|
||||||
|
hi ansiBoldWhiteFg ctermfg=white guifg=white cterm=none gui=none cterm=bold gui=bold
|
||||||
|
hi ansiBoldGrayFg ctermfg=gray guifg=gray cterm=none gui=none cterm=bold gui=bold
|
||||||
|
|
||||||
|
hi ansiUnderlineBlackFg ctermfg=black guifg=black cterm=none gui=none cterm=underline gui=underline
|
||||||
|
hi ansiUnderlineRedFg ctermfg=red guifg=red cterm=none gui=none cterm=underline gui=underline
|
||||||
|
hi ansiUnderlineGreenFg ctermfg=green guifg=green cterm=none gui=none cterm=underline gui=underline
|
||||||
|
hi ansiUnderlineYellowFg ctermfg=yellow guifg=yellow cterm=none gui=none cterm=underline gui=underline
|
||||||
|
hi ansiUnderlineBlueFg ctermfg=blue guifg=blue cterm=none gui=none cterm=underline gui=underline
|
||||||
|
hi ansiUnderlineMagentaFg ctermfg=magenta guifg=magenta cterm=none gui=none cterm=underline gui=underline
|
||||||
|
hi ansiUnderlineCyanFg ctermfg=cyan guifg=cyan cterm=none gui=none cterm=underline gui=underline
|
||||||
|
hi ansiUnderlineWhiteFg ctermfg=white guifg=white cterm=none gui=none cterm=underline gui=underline
|
||||||
|
hi ansiUnderlineGrayFg ctermfg=gray guifg=gray cterm=none gui=none cterm=underline gui=underline
|
||||||
|
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
let s:echorizer = {
|
||||||
|
\ 'value': '',
|
||||||
|
\ 'attr': '',
|
||||||
|
\ }
|
||||||
|
|
||||||
|
function s:echorizer.eat() abort
|
||||||
|
let matched = match(self.value, '\e\[\d*;\=m')
|
||||||
|
if matched == -1
|
||||||
|
return {}
|
||||||
|
endif
|
||||||
|
|
||||||
|
let matched_end = matchend(self.value, '\e\[\d*;\=m')
|
||||||
|
|
||||||
|
let token = {
|
||||||
|
\ 'body': matched == 0 ? '' : self.value[ : matched-1],
|
||||||
|
\ 'code': matchstr(self.value[matched : matched_end-1], '\d\+')
|
||||||
|
\ }
|
||||||
|
|
||||||
|
let self.value = self.value[matched_end : ]
|
||||||
|
|
||||||
|
return token
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
let s:COLORS = {
|
||||||
|
\ 0: "None",
|
||||||
|
\ 30: "BlackFg",
|
||||||
|
\ 31: "RedFg",
|
||||||
|
\ 32: "GreenFg",
|
||||||
|
\ 33: "YellowFg",
|
||||||
|
\ 34: "BlueFg",
|
||||||
|
\ 35: "MagentaFg",
|
||||||
|
\ 36: "CyanFg",
|
||||||
|
\ 37: "WhiteFg",
|
||||||
|
\ 40: "BlackBg",
|
||||||
|
\ 41: "RedBg",
|
||||||
|
\ 42: "GreenBg",
|
||||||
|
\ 43: "YellowBg",
|
||||||
|
\ 44: "BlueBg",
|
||||||
|
\ 45: "MagentaBg",
|
||||||
|
\ 46: "CyanBg",
|
||||||
|
\ 47: "WhiteBg",
|
||||||
|
\ 90: "GrayFg",
|
||||||
|
\ }
|
||||||
|
|
||||||
|
function s:echorizer.echo_ansi(code) abort
|
||||||
|
if !has_key(s:COLORS, a:code)
|
||||||
|
return
|
||||||
|
endif
|
||||||
|
|
||||||
|
execute 'echohl' 'ansi' . self.attr . s:COLORS[a:code]
|
||||||
|
|
||||||
|
if a:code == 0
|
||||||
|
let self.attr = ''
|
||||||
|
endif
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function s:echorizer.echo() abort
|
||||||
|
echo
|
||||||
|
|
||||||
|
while 1
|
||||||
|
let token = self.eat()
|
||||||
|
if token == {}
|
||||||
|
break
|
||||||
|
endif
|
||||||
|
|
||||||
|
if token.body !=# ''
|
||||||
|
echon token.body
|
||||||
|
endif
|
||||||
|
|
||||||
|
" TODO: Now only one attribute can be specified
|
||||||
|
if token.code == 1
|
||||||
|
let self.attr = 'Bold'
|
||||||
|
elseif token.code == 4
|
||||||
|
let self.attr = 'Underline'
|
||||||
|
elseif token.code ==# ''
|
||||||
|
call self.echo_ansi(0)
|
||||||
|
else
|
||||||
|
call self.echo_ansi(token.code)
|
||||||
|
endif
|
||||||
|
endwhile
|
||||||
|
|
||||||
|
echon self.value
|
||||||
|
echohl None
|
||||||
|
let self.value = ''
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:get_echorizer(str) abort
|
||||||
|
let e = deepcopy(s:echorizer)
|
||||||
|
let e.value = a:str
|
||||||
|
return e
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:echo(str) abort
|
||||||
|
if !s:is_available()
|
||||||
|
echo substitute(a:str, '\e[.*m', '', 'g')
|
||||||
|
return
|
||||||
|
endif
|
||||||
|
|
||||||
|
if !exists('g:__vital_color_echo_already_highlighted')
|
||||||
|
call s:_define_ansi_highlights()
|
||||||
|
let g:__vital_color_echo_already_highlighted = 1
|
||||||
|
endif
|
||||||
|
|
||||||
|
let echorizer = s:get_echorizer(a:str)
|
||||||
|
call echorizer.echo()
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
let &cpo = s:save_cpo
|
||||||
|
unlet s:save_cpo
|
||||||
|
|
||||||
|
endif
|
||||||
446
autoload/vital/_crystal/Data/List.vim
Normal file
446
autoload/vital/_crystal/Data/List.vim
Normal file
@@ -0,0 +1,446 @@
|
|||||||
|
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'crystal') == -1
|
||||||
|
|
||||||
|
" Utilities for list.
|
||||||
|
|
||||||
|
let s:save_cpo = &cpo
|
||||||
|
set cpo&vim
|
||||||
|
|
||||||
|
function! s:pop(list) abort
|
||||||
|
return remove(a:list, -1)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:push(list, val) abort
|
||||||
|
call add(a:list, a:val)
|
||||||
|
return a:list
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:shift(list) abort
|
||||||
|
return remove(a:list, 0)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:unshift(list, val) abort
|
||||||
|
return insert(a:list, a:val)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:cons(x, xs) abort
|
||||||
|
return [a:x] + a:xs
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:conj(xs, x) abort
|
||||||
|
return a:xs + [a:x]
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" Removes duplicates from a list.
|
||||||
|
function! s:uniq(list) abort
|
||||||
|
return s:uniq_by(a:list, 'v:val')
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" Removes duplicates from a list.
|
||||||
|
function! s:uniq_by(list, f) abort
|
||||||
|
let list = map(copy(a:list), printf('[v:val, %s]', a:f))
|
||||||
|
let i = 0
|
||||||
|
let seen = {}
|
||||||
|
while i < len(list)
|
||||||
|
let key = string(list[i][1])
|
||||||
|
if has_key(seen, key)
|
||||||
|
call remove(list, i)
|
||||||
|
else
|
||||||
|
let seen[key] = 1
|
||||||
|
let i += 1
|
||||||
|
endif
|
||||||
|
endwhile
|
||||||
|
return map(list, 'v:val[0]')
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:clear(list) abort
|
||||||
|
if !empty(a:list)
|
||||||
|
unlet! a:list[0 : len(a:list) - 1]
|
||||||
|
endif
|
||||||
|
return a:list
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" Concatenates a list of lists.
|
||||||
|
" XXX: Should we verify the input?
|
||||||
|
function! s:concat(list) abort
|
||||||
|
let memo = []
|
||||||
|
for Value in a:list
|
||||||
|
let memo += Value
|
||||||
|
endfor
|
||||||
|
return memo
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" Take each elements from lists to a new list.
|
||||||
|
function! s:flatten(list, ...) abort
|
||||||
|
let limit = a:0 > 0 ? a:1 : -1
|
||||||
|
let memo = []
|
||||||
|
if limit == 0
|
||||||
|
return a:list
|
||||||
|
endif
|
||||||
|
let limit -= 1
|
||||||
|
for Value in a:list
|
||||||
|
let memo +=
|
||||||
|
\ type(Value) == type([]) ?
|
||||||
|
\ s:flatten(Value, limit) :
|
||||||
|
\ [Value]
|
||||||
|
unlet! Value
|
||||||
|
endfor
|
||||||
|
return memo
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" Sorts a list with expression to compare each two values.
|
||||||
|
" a:a and a:b can be used in {expr}.
|
||||||
|
function! s:sort(list, expr) abort
|
||||||
|
if type(a:expr) == type(function('function'))
|
||||||
|
return sort(a:list, a:expr)
|
||||||
|
endif
|
||||||
|
let s:expr = a:expr
|
||||||
|
return sort(a:list, 's:_compare')
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:_compare(a, b) abort
|
||||||
|
return eval(s:expr)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" Sorts a list using a set of keys generated by mapping the values in the list
|
||||||
|
" through the given expr.
|
||||||
|
" v:val is used in {expr}
|
||||||
|
function! s:sort_by(list, expr) abort
|
||||||
|
let pairs = map(a:list, printf('[v:val, %s]', a:expr))
|
||||||
|
return map(s:sort(pairs,
|
||||||
|
\ 'a:a[1] ==# a:b[1] ? 0 : a:a[1] ># a:b[1] ? 1 : -1'), 'v:val[0]')
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" Returns a maximum value in {list} through given {expr}.
|
||||||
|
" Returns 0 if {list} is empty.
|
||||||
|
" v:val is used in {expr}
|
||||||
|
function! s:max_by(list, expr) abort
|
||||||
|
if empty(a:list)
|
||||||
|
return 0
|
||||||
|
endif
|
||||||
|
let list = map(copy(a:list), a:expr)
|
||||||
|
return a:list[index(list, max(list))]
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" Returns a minimum value in {list} through given {expr}.
|
||||||
|
" Returns 0 if {list} is empty.
|
||||||
|
" v:val is used in {expr}
|
||||||
|
" FIXME: -0x80000000 == 0x80000000
|
||||||
|
function! s:min_by(list, expr) abort
|
||||||
|
return s:max_by(a:list, '-(' . a:expr . ')')
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" Returns List of character sequence between [a:from, a:to]
|
||||||
|
" e.g.: s:char_range('a', 'c') returns ['a', 'b', 'c']
|
||||||
|
function! s:char_range(from, to) abort
|
||||||
|
return map(
|
||||||
|
\ range(char2nr(a:from), char2nr(a:to)),
|
||||||
|
\ 'nr2char(v:val)'
|
||||||
|
\)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" Returns true if a:list has a:value.
|
||||||
|
" Returns false otherwise.
|
||||||
|
function! s:has(list, value) abort
|
||||||
|
return index(a:list, a:value) isnot -1
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" Returns true if a:list[a:index] exists.
|
||||||
|
" Returns false otherwise.
|
||||||
|
" NOTE: Returns false when a:index is negative number.
|
||||||
|
function! s:has_index(list, index) abort
|
||||||
|
" Return true when negative index?
|
||||||
|
" let index = a:index >= 0 ? a:index : len(a:list) + a:index
|
||||||
|
return 0 <= a:index && a:index < len(a:list)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" similar to Haskell's Data.List.span
|
||||||
|
function! s:span(f, xs) abort
|
||||||
|
let border = len(a:xs)
|
||||||
|
for i in range(len(a:xs))
|
||||||
|
if !eval(substitute(a:f, 'v:val', string(a:xs[i]), 'g'))
|
||||||
|
let border = i
|
||||||
|
break
|
||||||
|
endif
|
||||||
|
endfor
|
||||||
|
return border == 0 ? [[], copy(a:xs)] : [a:xs[: border - 1], a:xs[border :]]
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" similar to Haskell's Data.List.break
|
||||||
|
function! s:break(f, xs) abort
|
||||||
|
return s:span(printf('!(%s)', a:f), a:xs)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" similar to Haskell's Data.List.takeWhile
|
||||||
|
function! s:take_while(f, xs) abort
|
||||||
|
return s:span(a:f, a:xs)[0]
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" similar to Haskell's Data.List.partition
|
||||||
|
function! s:partition(f, xs) abort
|
||||||
|
return [filter(copy(a:xs), a:f), filter(copy(a:xs), '!(' . a:f . ')')]
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" similar to Haskell's Prelude.all
|
||||||
|
function! s:all(f, xs) abort
|
||||||
|
return !s:any(printf('!(%s)', a:f), a:xs)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" similar to Haskell's Prelude.any
|
||||||
|
function! s:any(f, xs) abort
|
||||||
|
return !empty(filter(map(copy(a:xs), a:f), 'v:val'))
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" similar to Haskell's Prelude.and
|
||||||
|
function! s:and(xs) abort
|
||||||
|
return s:all('v:val', a:xs)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" similar to Haskell's Prelude.or
|
||||||
|
function! s:or(xs) abort
|
||||||
|
return s:any('v:val', a:xs)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:map_accum(expr, xs, init) abort
|
||||||
|
let memo = []
|
||||||
|
let init = a:init
|
||||||
|
for x in a:xs
|
||||||
|
let expr = substitute(a:expr, 'v:memo', init, 'g')
|
||||||
|
let expr = substitute(expr, 'v:val', x, 'g')
|
||||||
|
let [tmp, init] = eval(expr)
|
||||||
|
call add(memo, tmp)
|
||||||
|
endfor
|
||||||
|
return memo
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" similar to Haskell's Prelude.foldl
|
||||||
|
function! s:foldl(f, init, xs) abort
|
||||||
|
let memo = a:init
|
||||||
|
for x in a:xs
|
||||||
|
let expr = substitute(a:f, 'v:val', string(x), 'g')
|
||||||
|
let expr = substitute(expr, 'v:memo', string(memo), 'g')
|
||||||
|
unlet memo
|
||||||
|
let memo = eval(expr)
|
||||||
|
endfor
|
||||||
|
return memo
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" similar to Haskell's Prelude.foldl1
|
||||||
|
function! s:foldl1(f, xs) abort
|
||||||
|
if len(a:xs) == 0
|
||||||
|
throw 'vital: Data.List: foldl1'
|
||||||
|
endif
|
||||||
|
return s:foldl(a:f, a:xs[0], a:xs[1:])
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" similar to Haskell's Prelude.foldr
|
||||||
|
function! s:foldr(f, init, xs) abort
|
||||||
|
return s:foldl(a:f, a:init, reverse(copy(a:xs)))
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" similar to Haskell's Prelude.fold11
|
||||||
|
function! s:foldr1(f, xs) abort
|
||||||
|
if len(a:xs) == 0
|
||||||
|
throw 'vital: Data.List: foldr1'
|
||||||
|
endif
|
||||||
|
return s:foldr(a:f, a:xs[-1], a:xs[0:-2])
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" similar to python's zip()
|
||||||
|
function! s:zip(...) abort
|
||||||
|
return map(range(min(map(copy(a:000), 'len(v:val)'))), "map(copy(a:000), 'v:val['.v:val.']')")
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" similar to zip(), but goes until the longer one.
|
||||||
|
function! s:zip_fill(xs, ys, filler) abort
|
||||||
|
if empty(a:xs) && empty(a:ys)
|
||||||
|
return []
|
||||||
|
elseif empty(a:ys)
|
||||||
|
return s:cons([a:xs[0], a:filler], s:zip_fill(a:xs[1 :], [], a:filler))
|
||||||
|
elseif empty(a:xs)
|
||||||
|
return s:cons([a:filler, a:ys[0]], s:zip_fill([], a:ys[1 :], a:filler))
|
||||||
|
else
|
||||||
|
return s:cons([a:xs[0], a:ys[0]], s:zip_fill(a:xs[1 :], a:ys[1: ], a:filler))
|
||||||
|
endif
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" Inspired by Ruby's with_index method.
|
||||||
|
function! s:with_index(list, ...) abort
|
||||||
|
let base = a:0 > 0 ? a:1 : 0
|
||||||
|
return map(copy(a:list), '[v:val, v:key + base]')
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" similar to Ruby's detect or Haskell's find.
|
||||||
|
function! s:find(list, default, f) abort
|
||||||
|
for x in a:list
|
||||||
|
if eval(substitute(a:f, 'v:val', string(x), 'g'))
|
||||||
|
return x
|
||||||
|
endif
|
||||||
|
endfor
|
||||||
|
return a:default
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" Returns the index of the first element which satisfies the given expr.
|
||||||
|
function! s:find_index(xs, f, ...) abort
|
||||||
|
let len = len(a:xs)
|
||||||
|
let start = a:0 > 0 ? (a:1 < 0 ? len + a:1 : a:1) : 0
|
||||||
|
let default = a:0 > 1 ? a:2 : -1
|
||||||
|
if start >=# len || start < 0
|
||||||
|
return default
|
||||||
|
endif
|
||||||
|
for i in range(start, len - 1)
|
||||||
|
if eval(substitute(a:f, 'v:val', string(a:xs[i]), 'g'))
|
||||||
|
return i
|
||||||
|
endif
|
||||||
|
endfor
|
||||||
|
return default
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" Returns the index of the last element which satisfies the given expr.
|
||||||
|
function! s:find_last_index(xs, f, ...) abort
|
||||||
|
let len = len(a:xs)
|
||||||
|
let start = a:0 > 0 ? (a:1 < 0 ? len + a:1 : a:1) : len - 1
|
||||||
|
let default = a:0 > 1 ? a:2 : -1
|
||||||
|
if start >=# len || start < 0
|
||||||
|
return default
|
||||||
|
endif
|
||||||
|
for i in range(start, 0, -1)
|
||||||
|
if eval(substitute(a:f, 'v:val', string(a:xs[i]), 'g'))
|
||||||
|
return i
|
||||||
|
endif
|
||||||
|
endfor
|
||||||
|
return default
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" Similar to find_index but returns the list of indices satisfying the given expr.
|
||||||
|
function! s:find_indices(xs, f, ...) abort
|
||||||
|
let len = len(a:xs)
|
||||||
|
let start = a:0 > 0 ? (a:1 < 0 ? len + a:1 : a:1) : 0
|
||||||
|
let result = []
|
||||||
|
if start >=# len || start < 0
|
||||||
|
return result
|
||||||
|
endif
|
||||||
|
for i in range(start, len - 1)
|
||||||
|
if eval(substitute(a:f, 'v:val', string(a:xs[i]), 'g'))
|
||||||
|
call add(result, i)
|
||||||
|
endif
|
||||||
|
endfor
|
||||||
|
return result
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" Return non-zero if a:list1 and a:list2 have any common item(s).
|
||||||
|
" Return zero otherwise.
|
||||||
|
function! s:has_common_items(list1, list2) abort
|
||||||
|
return !empty(filter(copy(a:list1), 'index(a:list2, v:val) isnot -1'))
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:intersect(list1, list2) abort
|
||||||
|
let items = []
|
||||||
|
" for funcref
|
||||||
|
for X in a:list1
|
||||||
|
if index(a:list2, X) != -1 && index(items, X) == -1
|
||||||
|
let items += [X]
|
||||||
|
endif
|
||||||
|
endfor
|
||||||
|
return items
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" similar to Ruby's group_by.
|
||||||
|
function! s:group_by(xs, f) abort
|
||||||
|
let result = {}
|
||||||
|
let list = map(copy(a:xs), printf('[v:val, %s]', a:f))
|
||||||
|
for x in list
|
||||||
|
let Val = x[0]
|
||||||
|
let key = type(x[1]) !=# type('') ? string(x[1]) : x[1]
|
||||||
|
if has_key(result, key)
|
||||||
|
call add(result[key], Val)
|
||||||
|
else
|
||||||
|
let result[key] = [Val]
|
||||||
|
endif
|
||||||
|
unlet Val
|
||||||
|
endfor
|
||||||
|
return result
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:_default_compare(a, b) abort
|
||||||
|
return a:a <# a:b ? -1 : a:a ># a:b ? 1 : 0
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:binary_search(list, value, ...) abort
|
||||||
|
let Predicate = a:0 >= 1 ? a:1 : 's:_default_compare'
|
||||||
|
let dic = a:0 >= 2 ? a:2 : {}
|
||||||
|
let start = 0
|
||||||
|
let end = len(a:list) - 1
|
||||||
|
|
||||||
|
while 1
|
||||||
|
if start > end
|
||||||
|
return -1
|
||||||
|
endif
|
||||||
|
|
||||||
|
let middle = (start + end) / 2
|
||||||
|
|
||||||
|
let compared = call(Predicate, [a:value, a:list[middle]], dic)
|
||||||
|
|
||||||
|
if compared < 0
|
||||||
|
let end = middle - 1
|
||||||
|
elseif compared > 0
|
||||||
|
let start = middle + 1
|
||||||
|
else
|
||||||
|
return middle
|
||||||
|
endif
|
||||||
|
endwhile
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:product(lists) abort
|
||||||
|
let result = [[]]
|
||||||
|
for pool in a:lists
|
||||||
|
let tmp = []
|
||||||
|
for x in result
|
||||||
|
let tmp += map(copy(pool), 'x + [v:val]')
|
||||||
|
endfor
|
||||||
|
let result = tmp
|
||||||
|
endfor
|
||||||
|
return result
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:permutations(list, ...) abort
|
||||||
|
if a:0 > 1
|
||||||
|
throw 'vital: Data.List: too many arguments'
|
||||||
|
endif
|
||||||
|
let r = a:0 == 1 ? a:1 : len(a:list)
|
||||||
|
if r > len(a:list)
|
||||||
|
return []
|
||||||
|
elseif r < 0
|
||||||
|
throw 'vital: Data.List: {r} must be non-negative integer'
|
||||||
|
endif
|
||||||
|
let n = len(a:list)
|
||||||
|
let result = []
|
||||||
|
for indices in s:product(map(range(r), 'range(n)'))
|
||||||
|
if len(s:uniq(indices)) == r
|
||||||
|
call add(result, map(indices, 'a:list[v:val]'))
|
||||||
|
endif
|
||||||
|
endfor
|
||||||
|
return result
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:combinations(list, r) abort
|
||||||
|
if a:r > len(a:list)
|
||||||
|
return []
|
||||||
|
elseif a:r < 0
|
||||||
|
throw 'vital: Data:List: {r} must be non-negative integer'
|
||||||
|
endif
|
||||||
|
let n = len(a:list)
|
||||||
|
let result = []
|
||||||
|
for indices in s:permutations(range(n), a:r)
|
||||||
|
if s:sort(copy(indices), 'a:a - a:b') == indices
|
||||||
|
call add(result, map(indices, 'a:list[v:val]'))
|
||||||
|
endif
|
||||||
|
endfor
|
||||||
|
return result
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
let &cpo = s:save_cpo
|
||||||
|
unlet s:save_cpo
|
||||||
|
|
||||||
|
" vim:set et ts=2 sts=2 sw=2 tw=0:
|
||||||
|
|
||||||
|
endif
|
||||||
572
autoload/vital/_crystal/Data/String.vim
Normal file
572
autoload/vital/_crystal/Data/String.vim
Normal file
@@ -0,0 +1,572 @@
|
|||||||
|
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'crystal') == -1
|
||||||
|
|
||||||
|
" Utilities for string.
|
||||||
|
|
||||||
|
let s:save_cpo = &cpo
|
||||||
|
set cpo&vim
|
||||||
|
|
||||||
|
function! s:_vital_loaded(V) abort
|
||||||
|
let s:V = a:V
|
||||||
|
let s:P = s:V.import('Prelude')
|
||||||
|
let s:L = s:V.import('Data.List')
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:_vital_depends() abort
|
||||||
|
return ['Prelude', 'Data.List']
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" Substitute a:from => a:to by string.
|
||||||
|
" To substitute by pattern, use substitute() instead.
|
||||||
|
function! s:replace(str, from, to) abort
|
||||||
|
return s:_replace(a:str, a:from, a:to, 'g')
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" Substitute a:from => a:to only once.
|
||||||
|
" cf. s:replace()
|
||||||
|
function! s:replace_first(str, from, to) abort
|
||||||
|
return s:_replace(a:str, a:from, a:to, '')
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" implement of replace() and replace_first()
|
||||||
|
function! s:_replace(str, from, to, flags) abort
|
||||||
|
return substitute(a:str, '\V'.escape(a:from, '\'), escape(a:to, '\'), a:flags)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:scan(str, pattern) abort
|
||||||
|
let list = []
|
||||||
|
call substitute(a:str, a:pattern, '\=add(list, submatch(0)) == [] ? "" : ""', 'g')
|
||||||
|
return list
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:reverse(str) abort
|
||||||
|
return join(reverse(split(a:str, '.\zs')), '')
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:starts_with(str, prefix) abort
|
||||||
|
return stridx(a:str, a:prefix) == 0
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:ends_with(str, suffix) abort
|
||||||
|
let idx = strridx(a:str, a:suffix)
|
||||||
|
return 0 <= idx && idx + len(a:suffix) == len(a:str)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:common_head(strs) abort
|
||||||
|
if empty(a:strs)
|
||||||
|
return ''
|
||||||
|
endif
|
||||||
|
let len = len(a:strs)
|
||||||
|
if len == 1
|
||||||
|
return a:strs[0]
|
||||||
|
endif
|
||||||
|
let strs = len == 2 ? a:strs : sort(copy(a:strs))
|
||||||
|
let pat = substitute(strs[0], '.', '\="[" . escape(submatch(0), "^\\") . "]"', 'g')
|
||||||
|
return pat == '' ? '' : matchstr(strs[-1], '\C^\%[' . pat . ']')
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" Split to two elements of List. ([left, right])
|
||||||
|
" e.g.: s:split3('neocomplcache', 'compl') returns ['neo', 'compl', 'cache']
|
||||||
|
function! s:split_leftright(expr, pattern) abort
|
||||||
|
let [left, _, right] = s:split3(a:expr, a:pattern)
|
||||||
|
return [left, right]
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:split3(expr, pattern) abort
|
||||||
|
let ERROR = ['', '', '']
|
||||||
|
if a:expr ==# '' || a:pattern ==# ''
|
||||||
|
return ERROR
|
||||||
|
endif
|
||||||
|
let begin = match(a:expr, a:pattern)
|
||||||
|
if begin is -1
|
||||||
|
return ERROR
|
||||||
|
endif
|
||||||
|
let end = matchend(a:expr, a:pattern)
|
||||||
|
let left = begin <=# 0 ? '' : a:expr[: begin - 1]
|
||||||
|
let right = a:expr[end :]
|
||||||
|
return [left, a:expr[begin : end-1], right]
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" Slices into strings determines the number of substrings.
|
||||||
|
" e.g.: s:nsplit("neo compl cache", 2, '\s') returns ['neo', 'compl cache']
|
||||||
|
function! s:nsplit(expr, n, ...) abort
|
||||||
|
let pattern = get(a:000, 0, '\s')
|
||||||
|
let keepempty = get(a:000, 1, 1)
|
||||||
|
let ret = []
|
||||||
|
let expr = a:expr
|
||||||
|
if a:n <= 1
|
||||||
|
return [expr]
|
||||||
|
endif
|
||||||
|
while 1
|
||||||
|
let pos = match(expr, pattern)
|
||||||
|
if pos == -1
|
||||||
|
if expr !~ pattern || keepempty
|
||||||
|
call add(ret, expr)
|
||||||
|
endif
|
||||||
|
break
|
||||||
|
elseif pos >= 0
|
||||||
|
let left = pos > 0 ? expr[:pos-1] : ''
|
||||||
|
if pos > 0 || keepempty
|
||||||
|
call add(ret, left)
|
||||||
|
endif
|
||||||
|
let ml = len(matchstr(expr, pattern))
|
||||||
|
if pos == 0 && ml == 0
|
||||||
|
let pos = 1
|
||||||
|
endif
|
||||||
|
let expr = expr[pos+ml :]
|
||||||
|
endif
|
||||||
|
if len(expr) == 0
|
||||||
|
break
|
||||||
|
endif
|
||||||
|
if len(ret) == a:n - 1
|
||||||
|
call add(ret, expr)
|
||||||
|
break
|
||||||
|
endif
|
||||||
|
endwhile
|
||||||
|
return ret
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" Returns the number of character in a:str.
|
||||||
|
" NOTE: This returns proper value
|
||||||
|
" even if a:str contains multibyte character(s).
|
||||||
|
" s:strchars(str) {{{
|
||||||
|
if exists('*strchars')
|
||||||
|
function! s:strchars(str) abort
|
||||||
|
return strchars(a:str)
|
||||||
|
endfunction
|
||||||
|
else
|
||||||
|
function! s:strchars(str) abort
|
||||||
|
return strlen(substitute(copy(a:str), '.', 'x', 'g'))
|
||||||
|
endfunction
|
||||||
|
endif "}}}
|
||||||
|
|
||||||
|
" Returns the bool of contains any multibyte character in s:str
|
||||||
|
function! s:contains_multibyte(str) abort "{{{
|
||||||
|
return strlen(a:str) != s:strchars(a:str)
|
||||||
|
endfunction "}}}
|
||||||
|
|
||||||
|
" Remove last character from a:str.
|
||||||
|
" NOTE: This returns proper value
|
||||||
|
" even if a:str contains multibyte character(s).
|
||||||
|
function! s:chop(str) abort "{{{
|
||||||
|
return substitute(a:str, '.$', '', '')
|
||||||
|
endfunction "}}}
|
||||||
|
|
||||||
|
" Remove last \r,\n,\r\n from a:str.
|
||||||
|
function! s:chomp(str) abort "{{{
|
||||||
|
return substitute(a:str, '\%(\r\n\|[\r\n]\)$', '', '')
|
||||||
|
endfunction "}}}
|
||||||
|
|
||||||
|
" wrap() and its internal functions
|
||||||
|
" * _split_by_wcswidth_once()
|
||||||
|
" * _split_by_wcswidth()
|
||||||
|
" * _concat()
|
||||||
|
" * wrap()
|
||||||
|
"
|
||||||
|
" NOTE _concat() is just a copy of Data.List.concat().
|
||||||
|
" FIXME don't repeat yourself
|
||||||
|
function! s:_split_by_wcswidth_once(body, x) abort
|
||||||
|
let fst = s:strwidthpart(a:body, a:x)
|
||||||
|
let snd = s:strwidthpart_reverse(a:body, s:wcswidth(a:body) - s:wcswidth(fst))
|
||||||
|
return [fst, snd]
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:_split_by_wcswidth(body, x) abort
|
||||||
|
let memo = []
|
||||||
|
let body = a:body
|
||||||
|
while s:wcswidth(body) > a:x
|
||||||
|
let [tmp, body] = s:_split_by_wcswidth_once(body, a:x)
|
||||||
|
call add(memo, tmp)
|
||||||
|
endwhile
|
||||||
|
call add(memo, body)
|
||||||
|
return memo
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:trim(str) abort
|
||||||
|
return matchstr(a:str,'^\s*\zs.\{-}\ze\s*$')
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:trim_start(str) abort
|
||||||
|
return matchstr(a:str,'^\s*\zs.\{-}$')
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:trim_end(str) abort
|
||||||
|
return matchstr(a:str,'^.\{-}\ze\s*$')
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:wrap(str,...) abort
|
||||||
|
let _columns = a:0 > 0 ? a:1 : &columns
|
||||||
|
return s:L.concat(
|
||||||
|
\ map(split(a:str, '\r\n\|[\r\n]'), 's:_split_by_wcswidth(v:val, _columns - 1)'))
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:nr2byte(nr) abort
|
||||||
|
if a:nr < 0x80
|
||||||
|
return nr2char(a:nr)
|
||||||
|
elseif a:nr < 0x800
|
||||||
|
return nr2char(a:nr/64+192).nr2char(a:nr%64+128)
|
||||||
|
else
|
||||||
|
return nr2char(a:nr/4096%16+224).nr2char(a:nr/64%64+128).nr2char(a:nr%64+128)
|
||||||
|
endif
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:nr2enc_char(charcode) abort
|
||||||
|
if &encoding == 'utf-8'
|
||||||
|
return nr2char(a:charcode)
|
||||||
|
endif
|
||||||
|
let char = s:nr2byte(a:charcode)
|
||||||
|
if strlen(char) > 1
|
||||||
|
let char = strtrans(iconv(char, 'utf-8', &encoding))
|
||||||
|
endif
|
||||||
|
return char
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:nr2hex(nr) abort
|
||||||
|
let n = a:nr
|
||||||
|
let r = ""
|
||||||
|
while n
|
||||||
|
let r = '0123456789ABCDEF'[n % 16] . r
|
||||||
|
let n = n / 16
|
||||||
|
endwhile
|
||||||
|
return r
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" If a ==# b, returns -1.
|
||||||
|
" If a !=# b, returns first index of different character.
|
||||||
|
function! s:diffidx(a, b) abort
|
||||||
|
return a:a ==# a:b ? -1 : strlen(s:common_head([a:a, a:b]))
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:substitute_last(expr, pat, sub) abort
|
||||||
|
return substitute(a:expr, printf('.*\zs%s', a:pat), a:sub, '')
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:dstring(expr) abort
|
||||||
|
let x = substitute(string(a:expr), "^'\\|'$", '', 'g')
|
||||||
|
let x = substitute(x, "''", "'", 'g')
|
||||||
|
return printf('"%s"', escape(x, '"'))
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:lines(str) abort
|
||||||
|
return split(a:str, '\r\?\n')
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:_pad_with_char(str, left, right, char) abort
|
||||||
|
return repeat(a:char, a:left). a:str. repeat(a:char, a:right)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:pad_left(str, width, ...) abort
|
||||||
|
let char = get(a:, 1, ' ')
|
||||||
|
if strdisplaywidth(char) != 1
|
||||||
|
throw "vital: Data.String: Can't use non-half-width characters for padding."
|
||||||
|
endif
|
||||||
|
let left = max([0, a:width - strdisplaywidth(a:str)])
|
||||||
|
return s:_pad_with_char(a:str, left, 0, char)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:pad_right(str, width, ...) abort
|
||||||
|
let char = get(a:, 1, ' ')
|
||||||
|
if strdisplaywidth(char) != 1
|
||||||
|
throw "vital: Data.String: Can't use non-half-width characters for padding."
|
||||||
|
endif
|
||||||
|
let right = max([0, a:width - strdisplaywidth(a:str)])
|
||||||
|
return s:_pad_with_char(a:str, 0, right, char)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:pad_both_sides(str, width, ...) abort
|
||||||
|
let char = get(a:, 1, ' ')
|
||||||
|
if strdisplaywidth(char) != 1
|
||||||
|
throw "vital: Data.String: Can't use non-half-width characters for padding."
|
||||||
|
endif
|
||||||
|
let space = max([0, a:width - strdisplaywidth(a:str)])
|
||||||
|
let left = space / 2
|
||||||
|
let right = space - left
|
||||||
|
return s:_pad_with_char(a:str, left, right, char)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:pad_between_letters(str, width, ...) abort
|
||||||
|
let char = get(a:, 1, ' ')
|
||||||
|
if strdisplaywidth(char) != 1
|
||||||
|
throw "vital: Data.String: Can't use non-half-width characters for padding."
|
||||||
|
endif
|
||||||
|
let letters = split(a:str, '\zs')
|
||||||
|
let each_width = a:width / len(letters)
|
||||||
|
let str = join(map(letters, 's:pad_both_sides(v:val, each_width, char)'), '')
|
||||||
|
if a:width - strdisplaywidth(str) > 0
|
||||||
|
return char. s:pad_both_sides(str, a:width - 1, char)
|
||||||
|
endif
|
||||||
|
return str
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:justify_equal_spacing(str, width, ...) abort
|
||||||
|
let char = get(a:, 1, ' ')
|
||||||
|
if strdisplaywidth(char) != 1
|
||||||
|
throw "vital: Data.String: Can't use non-half-width characters for padding."
|
||||||
|
endif
|
||||||
|
let letters = split(a:str, '\zs')
|
||||||
|
let first_letter = letters[0]
|
||||||
|
" {width w/o the first letter} / {length w/o the first letter}
|
||||||
|
let each_width = (a:width - strdisplaywidth(first_letter)) / (len(letters) - 1)
|
||||||
|
let remainder = (a:width - strdisplaywidth(first_letter)) % (len(letters) - 1)
|
||||||
|
return first_letter. join(s:L.concat([
|
||||||
|
\ map(letters[1:remainder], 's:pad_left(v:val, each_width + 1, char)'),
|
||||||
|
\ map(letters[remainder + 1:], 's:pad_left(v:val, each_width, char)')
|
||||||
|
\ ]), '')
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:levenshtein_distance(str1, str2) abort
|
||||||
|
let letters1 = split(a:str1, '\zs')
|
||||||
|
let letters2 = split(a:str2, '\zs')
|
||||||
|
let length1 = len(letters1)
|
||||||
|
let length2 = len(letters2)
|
||||||
|
let distances = map(range(1, length1 + 1), 'map(range(1, length2 + 1), "0")')
|
||||||
|
|
||||||
|
for i1 in range(0, length1)
|
||||||
|
let distances[i1][0] = i1
|
||||||
|
endfor
|
||||||
|
for i2 in range(0, length2)
|
||||||
|
let distances[0][i2] = i2
|
||||||
|
endfor
|
||||||
|
|
||||||
|
for i1 in range(1, length1)
|
||||||
|
for i2 in range(1, length2)
|
||||||
|
let cost = (letters1[i1 - 1] ==# letters2[i2 - 1]) ? 0 : 1
|
||||||
|
|
||||||
|
let distances[i1][i2] = min([
|
||||||
|
\ distances[i1 - 1][i2 ] + 1,
|
||||||
|
\ distances[i1 ][i2 - 1] + 1,
|
||||||
|
\ distances[i1 - 1][i2 - 1] + cost,
|
||||||
|
\])
|
||||||
|
endfor
|
||||||
|
endfor
|
||||||
|
|
||||||
|
return distances[length1][length2]
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:padding_by_displaywidth(expr, width, float) abort
|
||||||
|
let padding_char = ' '
|
||||||
|
let n = a:width - strdisplaywidth(a:expr)
|
||||||
|
if n <= 0
|
||||||
|
let n = 0
|
||||||
|
endif
|
||||||
|
if a:float < 0
|
||||||
|
return a:expr . repeat(padding_char, n)
|
||||||
|
elseif 0 < a:float
|
||||||
|
return repeat(padding_char, n) . a:expr
|
||||||
|
else
|
||||||
|
if n % 2 is 0
|
||||||
|
return repeat(padding_char, n / 2) . a:expr . repeat(padding_char, n / 2)
|
||||||
|
else
|
||||||
|
return repeat(padding_char, (n - 1) / 2) . a:expr . repeat(padding_char, (n - 1) / 2) . padding_char
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:split_by_displaywidth(expr, width, float, is_wrap) abort
|
||||||
|
if a:width is 0
|
||||||
|
return ['']
|
||||||
|
endif
|
||||||
|
|
||||||
|
let lines = []
|
||||||
|
|
||||||
|
let cs = split(a:expr, '\zs')
|
||||||
|
let cs_index = 0
|
||||||
|
|
||||||
|
let text = ''
|
||||||
|
while cs_index < len(cs)
|
||||||
|
if cs[cs_index] is "\n"
|
||||||
|
let text = s:padding_by_displaywidth(text, a:width, a:float)
|
||||||
|
let lines += [text]
|
||||||
|
let text = ''
|
||||||
|
else
|
||||||
|
let w = strdisplaywidth(text . cs[cs_index])
|
||||||
|
|
||||||
|
if w < a:width
|
||||||
|
let text .= cs[cs_index]
|
||||||
|
elseif a:width < w
|
||||||
|
let text = s:padding_by_displaywidth(text, a:width, a:float)
|
||||||
|
else
|
||||||
|
let text .= cs[cs_index]
|
||||||
|
endif
|
||||||
|
|
||||||
|
if a:width <= w
|
||||||
|
let lines += [text]
|
||||||
|
let text = ''
|
||||||
|
if a:is_wrap
|
||||||
|
if a:width < w
|
||||||
|
if a:width < strdisplaywidth(cs[cs_index])
|
||||||
|
while get(cs, cs_index, "\n") isnot "\n"
|
||||||
|
let cs_index += 1
|
||||||
|
endwhile
|
||||||
|
continue
|
||||||
|
else
|
||||||
|
let text = cs[cs_index]
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
else
|
||||||
|
while get(cs, cs_index, "\n") isnot "\n"
|
||||||
|
let cs_index += 1
|
||||||
|
endwhile
|
||||||
|
continue
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
endif
|
||||||
|
let cs_index += 1
|
||||||
|
endwhile
|
||||||
|
|
||||||
|
if !empty(text)
|
||||||
|
let lines += [ s:padding_by_displaywidth(text, a:width, a:float) ]
|
||||||
|
endif
|
||||||
|
|
||||||
|
return lines
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:hash(str) abort
|
||||||
|
if exists('*sha256')
|
||||||
|
return sha256(a:str)
|
||||||
|
else
|
||||||
|
" This gives up sha256ing but just adds up char with index.
|
||||||
|
let sum = 0
|
||||||
|
for i in range(len(a:str))
|
||||||
|
let sum += char2nr(a:str[i]) * (i + 1)
|
||||||
|
endfor
|
||||||
|
|
||||||
|
return printf('%x', sum)
|
||||||
|
endif
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:truncate(str, width) abort
|
||||||
|
" Original function is from mattn.
|
||||||
|
" http://github.com/mattn/googlereader-vim/tree/master
|
||||||
|
|
||||||
|
if a:str =~# '^[\x00-\x7f]*$'
|
||||||
|
return len(a:str) < a:width ?
|
||||||
|
\ printf('%-'.a:width.'s', a:str) : strpart(a:str, 0, a:width)
|
||||||
|
endif
|
||||||
|
|
||||||
|
let ret = a:str
|
||||||
|
let width = s:wcswidth(a:str)
|
||||||
|
if width > a:width
|
||||||
|
let ret = s:strwidthpart(ret, a:width)
|
||||||
|
let width = s:wcswidth(ret)
|
||||||
|
endif
|
||||||
|
|
||||||
|
if width < a:width
|
||||||
|
let ret .= repeat(' ', a:width - width)
|
||||||
|
endif
|
||||||
|
|
||||||
|
return ret
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:truncate_skipping(str, max, footer_width, separator) abort
|
||||||
|
let width = s:wcswidth(a:str)
|
||||||
|
if width <= a:max
|
||||||
|
let ret = a:str
|
||||||
|
else
|
||||||
|
let header_width = a:max - s:wcswidth(a:separator) - a:footer_width
|
||||||
|
let ret = s:strwidthpart(a:str, header_width) . a:separator
|
||||||
|
\ . s:strwidthpart_reverse(a:str, a:footer_width)
|
||||||
|
endif
|
||||||
|
return s:truncate(ret, a:max)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:strwidthpart(str, width) abort
|
||||||
|
if a:width <= 0
|
||||||
|
return ''
|
||||||
|
endif
|
||||||
|
let strarr = split(a:str, '\zs')
|
||||||
|
let width = s:wcswidth(a:str)
|
||||||
|
let index = len(strarr)
|
||||||
|
let diff = (index + 1) / 2
|
||||||
|
let rightindex = index - 1
|
||||||
|
while width > a:width
|
||||||
|
let index = max([rightindex - diff + 1, 0])
|
||||||
|
let partwidth = s:wcswidth(join(strarr[(index):(rightindex)], ''))
|
||||||
|
if width - partwidth >= a:width || diff <= 1
|
||||||
|
let width -= partwidth
|
||||||
|
let rightindex = index - 1
|
||||||
|
endif
|
||||||
|
if diff > 1
|
||||||
|
let diff = diff / 2
|
||||||
|
endif
|
||||||
|
endwhile
|
||||||
|
return index ? join(strarr[:index - 1], '') : ''
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:strwidthpart_reverse(str, width) abort
|
||||||
|
if a:width <= 0
|
||||||
|
return ''
|
||||||
|
endif
|
||||||
|
let strarr = split(a:str, '\zs')
|
||||||
|
let width = s:wcswidth(a:str)
|
||||||
|
let strlen = len(strarr)
|
||||||
|
let diff = (strlen + 1) / 2
|
||||||
|
let leftindex = 0
|
||||||
|
let index = -1
|
||||||
|
while width > a:width
|
||||||
|
let index = min([leftindex + diff, strlen]) - 1
|
||||||
|
let partwidth = s:wcswidth(join(strarr[(leftindex):(index)], ''))
|
||||||
|
if width - partwidth >= a:width || diff <= 1
|
||||||
|
let width -= partwidth
|
||||||
|
let leftindex = index + 1
|
||||||
|
endif
|
||||||
|
if diff > 1
|
||||||
|
let diff = diff / 2
|
||||||
|
endif
|
||||||
|
endwhile
|
||||||
|
return index < strlen ? join(strarr[(index + 1):], '') : ''
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
if v:version >= 703
|
||||||
|
" Use builtin function.
|
||||||
|
function! s:wcswidth(str) abort
|
||||||
|
return strwidth(a:str)
|
||||||
|
endfunction
|
||||||
|
else
|
||||||
|
function! s:wcswidth(str) abort
|
||||||
|
if a:str =~# '^[\x00-\x7f]*$'
|
||||||
|
return strlen(a:str)
|
||||||
|
endif
|
||||||
|
let mx_first = '^\(.\)'
|
||||||
|
let str = a:str
|
||||||
|
let width = 0
|
||||||
|
while 1
|
||||||
|
let ucs = char2nr(substitute(str, mx_first, '\1', ''))
|
||||||
|
if ucs == 0
|
||||||
|
break
|
||||||
|
endif
|
||||||
|
let width += s:_wcwidth(ucs)
|
||||||
|
let str = substitute(str, mx_first, '', '')
|
||||||
|
endwhile
|
||||||
|
return width
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" UTF-8 only.
|
||||||
|
function! s:_wcwidth(ucs) abort
|
||||||
|
let ucs = a:ucs
|
||||||
|
if (ucs >= 0x1100
|
||||||
|
\ && (ucs <= 0x115f
|
||||||
|
\ || ucs == 0x2329
|
||||||
|
\ || ucs == 0x232a
|
||||||
|
\ || (ucs >= 0x2e80 && ucs <= 0xa4cf
|
||||||
|
\ && ucs != 0x303f)
|
||||||
|
\ || (ucs >= 0xac00 && ucs <= 0xd7a3)
|
||||||
|
\ || (ucs >= 0xf900 && ucs <= 0xfaff)
|
||||||
|
\ || (ucs >= 0xfe30 && ucs <= 0xfe6f)
|
||||||
|
\ || (ucs >= 0xff00 && ucs <= 0xff60)
|
||||||
|
\ || (ucs >= 0xffe0 && ucs <= 0xffe6)
|
||||||
|
\ || (ucs >= 0x20000 && ucs <= 0x2fffd)
|
||||||
|
\ || (ucs >= 0x30000 && ucs <= 0x3fffd)
|
||||||
|
\ ))
|
||||||
|
return 2
|
||||||
|
endif
|
||||||
|
return 1
|
||||||
|
endfunction
|
||||||
|
endif
|
||||||
|
|
||||||
|
let &cpo = s:save_cpo
|
||||||
|
unlet s:save_cpo
|
||||||
|
|
||||||
|
" vim:set et ts=2 sts=2 sw=2 tw=0:
|
||||||
|
|
||||||
|
endif
|
||||||
389
autoload/vital/_crystal/Prelude.vim
Normal file
389
autoload/vital/_crystal/Prelude.vim
Normal file
@@ -0,0 +1,389 @@
|
|||||||
|
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'crystal') == -1
|
||||||
|
|
||||||
|
let s:save_cpo = &cpo
|
||||||
|
set cpo&vim
|
||||||
|
|
||||||
|
if v:version ># 703 ||
|
||||||
|
\ (v:version is 703 && has('patch465'))
|
||||||
|
function! s:glob(expr) abort
|
||||||
|
return glob(a:expr, 1, 1)
|
||||||
|
endfunction
|
||||||
|
else
|
||||||
|
function! s:glob(expr) abort
|
||||||
|
let R = glob(a:expr, 1)
|
||||||
|
return split(R, '\n')
|
||||||
|
endfunction
|
||||||
|
endif
|
||||||
|
|
||||||
|
function! s:globpath(path, expr) abort
|
||||||
|
let R = globpath(a:path, a:expr, 1)
|
||||||
|
return split(R, '\n')
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" Wrapper functions for type().
|
||||||
|
let [
|
||||||
|
\ s:__TYPE_NUMBER,
|
||||||
|
\ s:__TYPE_STRING,
|
||||||
|
\ s:__TYPE_FUNCREF,
|
||||||
|
\ s:__TYPE_LIST,
|
||||||
|
\ s:__TYPE_DICT,
|
||||||
|
\ s:__TYPE_FLOAT] = [
|
||||||
|
\ type(3),
|
||||||
|
\ type(""),
|
||||||
|
\ type(function('tr')),
|
||||||
|
\ type([]),
|
||||||
|
\ type({}),
|
||||||
|
\ has('float') ? type(str2float('0')) : -1]
|
||||||
|
" __TYPE_FLOAT = -1 when -float
|
||||||
|
" This doesn't match to anything.
|
||||||
|
|
||||||
|
" Number or Float
|
||||||
|
function! s:is_numeric(Value) abort
|
||||||
|
let _ = type(a:Value)
|
||||||
|
return _ ==# s:__TYPE_NUMBER
|
||||||
|
\ || _ ==# s:__TYPE_FLOAT
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" Number
|
||||||
|
function! s:is_number(Value) abort
|
||||||
|
return type(a:Value) ==# s:__TYPE_NUMBER
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" Float
|
||||||
|
function! s:is_float(Value) abort
|
||||||
|
return type(a:Value) ==# s:__TYPE_FLOAT
|
||||||
|
endfunction
|
||||||
|
" String
|
||||||
|
function! s:is_string(Value) abort
|
||||||
|
return type(a:Value) ==# s:__TYPE_STRING
|
||||||
|
endfunction
|
||||||
|
" Funcref
|
||||||
|
function! s:is_funcref(Value) abort
|
||||||
|
return type(a:Value) ==# s:__TYPE_FUNCREF
|
||||||
|
endfunction
|
||||||
|
" List
|
||||||
|
function! s:is_list(Value) abort
|
||||||
|
return type(a:Value) ==# s:__TYPE_LIST
|
||||||
|
endfunction
|
||||||
|
" Dictionary
|
||||||
|
function! s:is_dict(Value) abort
|
||||||
|
return type(a:Value) ==# s:__TYPE_DICT
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:truncate_skipping(str, max, footer_width, separator) abort
|
||||||
|
call s:_warn_deprecated("truncate_skipping", "Data.String.truncate_skipping")
|
||||||
|
|
||||||
|
let width = s:wcswidth(a:str)
|
||||||
|
if width <= a:max
|
||||||
|
let ret = a:str
|
||||||
|
else
|
||||||
|
let header_width = a:max - s:wcswidth(a:separator) - a:footer_width
|
||||||
|
let ret = s:strwidthpart(a:str, header_width) . a:separator
|
||||||
|
\ . s:strwidthpart_reverse(a:str, a:footer_width)
|
||||||
|
endif
|
||||||
|
|
||||||
|
return s:truncate(ret, a:max)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:truncate(str, width) abort
|
||||||
|
" Original function is from mattn.
|
||||||
|
" http://github.com/mattn/googlereader-vim/tree/master
|
||||||
|
|
||||||
|
call s:_warn_deprecated("truncate", "Data.String.truncate")
|
||||||
|
|
||||||
|
if a:str =~# '^[\x00-\x7f]*$'
|
||||||
|
return len(a:str) < a:width ?
|
||||||
|
\ printf('%-'.a:width.'s', a:str) : strpart(a:str, 0, a:width)
|
||||||
|
endif
|
||||||
|
|
||||||
|
let ret = a:str
|
||||||
|
let width = s:wcswidth(a:str)
|
||||||
|
if width > a:width
|
||||||
|
let ret = s:strwidthpart(ret, a:width)
|
||||||
|
let width = s:wcswidth(ret)
|
||||||
|
endif
|
||||||
|
|
||||||
|
if width < a:width
|
||||||
|
let ret .= repeat(' ', a:width - width)
|
||||||
|
endif
|
||||||
|
|
||||||
|
return ret
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:strwidthpart(str, width) abort
|
||||||
|
call s:_warn_deprecated("strwidthpart", "Data.String.strwidthpart")
|
||||||
|
|
||||||
|
if a:width <= 0
|
||||||
|
return ''
|
||||||
|
endif
|
||||||
|
let ret = a:str
|
||||||
|
let width = s:wcswidth(a:str)
|
||||||
|
while width > a:width
|
||||||
|
let char = matchstr(ret, '.$')
|
||||||
|
let ret = ret[: -1 - len(char)]
|
||||||
|
let width -= s:wcswidth(char)
|
||||||
|
endwhile
|
||||||
|
|
||||||
|
return ret
|
||||||
|
endfunction
|
||||||
|
function! s:strwidthpart_reverse(str, width) abort
|
||||||
|
call s:_warn_deprecated("strwidthpart_reverse", "Data.String.strwidthpart_reverse")
|
||||||
|
|
||||||
|
if a:width <= 0
|
||||||
|
return ''
|
||||||
|
endif
|
||||||
|
let ret = a:str
|
||||||
|
let width = s:wcswidth(a:str)
|
||||||
|
while width > a:width
|
||||||
|
let char = matchstr(ret, '^.')
|
||||||
|
let ret = ret[len(char) :]
|
||||||
|
let width -= s:wcswidth(char)
|
||||||
|
endwhile
|
||||||
|
|
||||||
|
return ret
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
if v:version >= 703
|
||||||
|
" Use builtin function.
|
||||||
|
function! s:wcswidth(str) abort
|
||||||
|
call s:_warn_deprecated("wcswidth", "Data.String.wcswidth")
|
||||||
|
return strwidth(a:str)
|
||||||
|
endfunction
|
||||||
|
else
|
||||||
|
function! s:wcswidth(str) abort
|
||||||
|
call s:_warn_deprecated("wcswidth", "Data.String.wcswidth")
|
||||||
|
|
||||||
|
if a:str =~# '^[\x00-\x7f]*$'
|
||||||
|
return strlen(a:str)
|
||||||
|
end
|
||||||
|
|
||||||
|
let mx_first = '^\(.\)'
|
||||||
|
let str = a:str
|
||||||
|
let width = 0
|
||||||
|
while 1
|
||||||
|
let ucs = char2nr(substitute(str, mx_first, '\1', ''))
|
||||||
|
if ucs == 0
|
||||||
|
break
|
||||||
|
endif
|
||||||
|
let width += s:_wcwidth(ucs)
|
||||||
|
let str = substitute(str, mx_first, '', '')
|
||||||
|
endwhile
|
||||||
|
return width
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" UTF-8 only.
|
||||||
|
function! s:_wcwidth(ucs) abort
|
||||||
|
let ucs = a:ucs
|
||||||
|
if (ucs >= 0x1100
|
||||||
|
\ && (ucs <= 0x115f
|
||||||
|
\ || ucs == 0x2329
|
||||||
|
\ || ucs == 0x232a
|
||||||
|
\ || (ucs >= 0x2e80 && ucs <= 0xa4cf
|
||||||
|
\ && ucs != 0x303f)
|
||||||
|
\ || (ucs >= 0xac00 && ucs <= 0xd7a3)
|
||||||
|
\ || (ucs >= 0xf900 && ucs <= 0xfaff)
|
||||||
|
\ || (ucs >= 0xfe30 && ucs <= 0xfe6f)
|
||||||
|
\ || (ucs >= 0xff00 && ucs <= 0xff60)
|
||||||
|
\ || (ucs >= 0xffe0 && ucs <= 0xffe6)
|
||||||
|
\ || (ucs >= 0x20000 && ucs <= 0x2fffd)
|
||||||
|
\ || (ucs >= 0x30000 && ucs <= 0x3fffd)
|
||||||
|
\ ))
|
||||||
|
return 2
|
||||||
|
endif
|
||||||
|
return 1
|
||||||
|
endfunction
|
||||||
|
endif
|
||||||
|
|
||||||
|
let s:is_windows = has('win16') || has('win32') || has('win64') || has('win95')
|
||||||
|
let s:is_cygwin = has('win32unix')
|
||||||
|
let s:is_mac = !s:is_windows && !s:is_cygwin
|
||||||
|
\ && (has('mac') || has('macunix') || has('gui_macvim') ||
|
||||||
|
\ (!isdirectory('/proc') && executable('sw_vers')))
|
||||||
|
let s:is_unix = has('unix')
|
||||||
|
|
||||||
|
function! s:is_windows() abort
|
||||||
|
return s:is_windows
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:is_cygwin() abort
|
||||||
|
return s:is_cygwin
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:is_mac() abort
|
||||||
|
return s:is_mac
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:is_unix() abort
|
||||||
|
return s:is_unix
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:_warn_deprecated(name, alternative) abort
|
||||||
|
try
|
||||||
|
echohl Error
|
||||||
|
echomsg "Prelude." . a:name . " is deprecated! Please use " . a:alternative . " instead."
|
||||||
|
finally
|
||||||
|
echohl None
|
||||||
|
endtry
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:smart_execute_command(action, word) abort
|
||||||
|
execute a:action . ' ' . (a:word == '' ? '' : '`=a:word`')
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:escape_file_searching(buffer_name) abort
|
||||||
|
return escape(a:buffer_name, '*[]?{}, ')
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:escape_pattern(str) abort
|
||||||
|
return escape(a:str, '~"\.^$[]*')
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:getchar(...) abort
|
||||||
|
let c = call('getchar', a:000)
|
||||||
|
return type(c) == type(0) ? nr2char(c) : c
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:getchar_safe(...) abort
|
||||||
|
let c = s:input_helper('getchar', a:000)
|
||||||
|
return type(c) == type("") ? c : nr2char(c)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:input_safe(...) abort
|
||||||
|
return s:input_helper('input', a:000)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:input_helper(funcname, args) abort
|
||||||
|
let success = 0
|
||||||
|
if inputsave() !=# success
|
||||||
|
throw 'vital: Prelude: inputsave() failed'
|
||||||
|
endif
|
||||||
|
try
|
||||||
|
return call(a:funcname, a:args)
|
||||||
|
finally
|
||||||
|
if inputrestore() !=# success
|
||||||
|
throw 'vital: Prelude: inputrestore() failed'
|
||||||
|
endif
|
||||||
|
endtry
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:set_default(var, val) abort
|
||||||
|
if !exists(a:var) || type({a:var}) != type(a:val)
|
||||||
|
let {a:var} = a:val
|
||||||
|
endif
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:substitute_path_separator(path) abort
|
||||||
|
return s:is_windows ? substitute(a:path, '\\', '/', 'g') : a:path
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:path2directory(path) abort
|
||||||
|
return s:substitute_path_separator(isdirectory(a:path) ? a:path : fnamemodify(a:path, ':p:h'))
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:_path2project_directory_git(path) abort
|
||||||
|
let parent = a:path
|
||||||
|
|
||||||
|
while 1
|
||||||
|
let path = parent . '/.git'
|
||||||
|
if isdirectory(path) || filereadable(path)
|
||||||
|
return parent
|
||||||
|
endif
|
||||||
|
let next = fnamemodify(parent, ':h')
|
||||||
|
if next == parent
|
||||||
|
return ''
|
||||||
|
endif
|
||||||
|
let parent = next
|
||||||
|
endwhile
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:_path2project_directory_svn(path) abort
|
||||||
|
let search_directory = a:path
|
||||||
|
let directory = ''
|
||||||
|
|
||||||
|
let find_directory = s:escape_file_searching(search_directory)
|
||||||
|
let d = finddir('.svn', find_directory . ';')
|
||||||
|
if d == ''
|
||||||
|
return ''
|
||||||
|
endif
|
||||||
|
|
||||||
|
let directory = fnamemodify(d, ':p:h:h')
|
||||||
|
|
||||||
|
" Search parent directories.
|
||||||
|
let parent_directory = s:path2directory(
|
||||||
|
\ fnamemodify(directory, ':h'))
|
||||||
|
|
||||||
|
if parent_directory != ''
|
||||||
|
let d = finddir('.svn', parent_directory . ';')
|
||||||
|
if d != ''
|
||||||
|
let directory = s:_path2project_directory_svn(parent_directory)
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
return directory
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:_path2project_directory_others(vcs, path) abort
|
||||||
|
let vcs = a:vcs
|
||||||
|
let search_directory = a:path
|
||||||
|
|
||||||
|
let find_directory = s:escape_file_searching(search_directory)
|
||||||
|
let d = finddir(vcs, find_directory . ';')
|
||||||
|
if d == ''
|
||||||
|
return ''
|
||||||
|
endif
|
||||||
|
return fnamemodify(d, ':p:h:h')
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:path2project_directory(path, ...) abort
|
||||||
|
let is_allow_empty = get(a:000, 0, 0)
|
||||||
|
let search_directory = s:path2directory(a:path)
|
||||||
|
let directory = ''
|
||||||
|
|
||||||
|
" Search VCS directory.
|
||||||
|
for vcs in ['.git', '.bzr', '.hg', '.svn']
|
||||||
|
if vcs ==# '.git'
|
||||||
|
let directory = s:_path2project_directory_git(search_directory)
|
||||||
|
elseif vcs ==# '.svn'
|
||||||
|
let directory = s:_path2project_directory_svn(search_directory)
|
||||||
|
else
|
||||||
|
let directory = s:_path2project_directory_others(vcs, search_directory)
|
||||||
|
endif
|
||||||
|
if directory != ''
|
||||||
|
break
|
||||||
|
endif
|
||||||
|
endfor
|
||||||
|
|
||||||
|
" Search project file.
|
||||||
|
if directory == ''
|
||||||
|
for d in ['build.xml', 'prj.el', '.project', 'pom.xml', 'package.json',
|
||||||
|
\ 'Makefile', 'configure', 'Rakefile', 'NAnt.build',
|
||||||
|
\ 'P4CONFIG', 'tags', 'gtags']
|
||||||
|
let d = findfile(d, s:escape_file_searching(search_directory) . ';')
|
||||||
|
if d != ''
|
||||||
|
let directory = fnamemodify(d, ':p:h')
|
||||||
|
break
|
||||||
|
endif
|
||||||
|
endfor
|
||||||
|
endif
|
||||||
|
|
||||||
|
if directory == ''
|
||||||
|
" Search /src/ directory.
|
||||||
|
let base = s:substitute_path_separator(search_directory)
|
||||||
|
if base =~# '/src/'
|
||||||
|
let directory = base[: strridx(base, '/src/') + 3]
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
if directory == '' && !is_allow_empty
|
||||||
|
" Use original path.
|
||||||
|
let directory = search_directory
|
||||||
|
endif
|
||||||
|
|
||||||
|
return s:substitute_path_separator(directory)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
let &cpo = s:save_cpo
|
||||||
|
unlet s:save_cpo
|
||||||
|
|
||||||
|
" vim:set et ts=2 sts=2 sw=2 tw=0:
|
||||||
|
|
||||||
|
endif
|
||||||
185
autoload/vital/_crystal/Process.vim
Normal file
185
autoload/vital/_crystal/Process.vim
Normal file
@@ -0,0 +1,185 @@
|
|||||||
|
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'crystal') == -1
|
||||||
|
|
||||||
|
" TODO: move all comments to doc file.
|
||||||
|
"
|
||||||
|
"
|
||||||
|
" FIXME: This module name should be Vital.System ?
|
||||||
|
" But the name has been already taken.
|
||||||
|
|
||||||
|
let s:save_cpo = &cpo
|
||||||
|
set cpo&vim
|
||||||
|
|
||||||
|
|
||||||
|
" FIXME: Unfortunately, can't use s:_vital_loaded() for this purpose.
|
||||||
|
" Because these variables are used when this script file is loaded.
|
||||||
|
let s:is_windows = has('win16') || has('win32') || has('win64') || has('win95')
|
||||||
|
let s:is_unix = has('unix')
|
||||||
|
" As of 7.4.122, the system()'s 1st argument is converted internally by Vim.
|
||||||
|
" Note that Patch 7.4.122 does not convert system()'s 2nd argument and
|
||||||
|
" return-value. We must convert them manually.
|
||||||
|
let s:need_trans = v:version < 704 || (v:version == 704 && !has('patch122'))
|
||||||
|
|
||||||
|
let s:TYPE_DICT = type({})
|
||||||
|
let s:TYPE_LIST = type([])
|
||||||
|
let s:TYPE_STRING = type("")
|
||||||
|
|
||||||
|
|
||||||
|
" Execute program in the background from Vim.
|
||||||
|
" Return an empty string always.
|
||||||
|
"
|
||||||
|
" If a:expr is a List, shellescape() each argument.
|
||||||
|
" If a:expr is a String, the arguments are passed as-is.
|
||||||
|
"
|
||||||
|
" Windows:
|
||||||
|
" Using :!start , execute program without via cmd.exe.
|
||||||
|
" Spawning 'expr' with 'noshellslash'
|
||||||
|
" keep special characters from unwanted expansion.
|
||||||
|
" (see :help shellescape())
|
||||||
|
"
|
||||||
|
" Unix:
|
||||||
|
" using :! , execute program in the background by shell.
|
||||||
|
function! s:spawn(expr, ...) abort
|
||||||
|
let shellslash = 0
|
||||||
|
if s:is_windows
|
||||||
|
let shellslash = &l:shellslash
|
||||||
|
setlocal noshellslash
|
||||||
|
endif
|
||||||
|
try
|
||||||
|
if type(a:expr) is s:TYPE_LIST
|
||||||
|
let special = 1
|
||||||
|
let cmdline = join(map(a:expr, 'shellescape(v:val, special)'), ' ')
|
||||||
|
elseif type(a:expr) is s:TYPE_STRING
|
||||||
|
let cmdline = a:expr
|
||||||
|
if a:0 && a:1
|
||||||
|
" for :! command
|
||||||
|
let cmdline = substitute(cmdline, '\([!%#]\|<[^<>]\+>\)', '\\\1', 'g')
|
||||||
|
endif
|
||||||
|
else
|
||||||
|
throw 'Process.spawn(): invalid argument (value type:'.type(a:expr).')'
|
||||||
|
endif
|
||||||
|
if s:is_windows
|
||||||
|
silent execute '!start' cmdline
|
||||||
|
else
|
||||||
|
silent execute '!' cmdline '&'
|
||||||
|
endif
|
||||||
|
finally
|
||||||
|
if s:is_windows
|
||||||
|
let &l:shellslash = shellslash
|
||||||
|
endif
|
||||||
|
endtry
|
||||||
|
return ''
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" iconv() wrapper for safety.
|
||||||
|
function! s:iconv(expr, from, to) abort
|
||||||
|
if a:from == '' || a:to == '' || a:from ==? a:to
|
||||||
|
return a:expr
|
||||||
|
endif
|
||||||
|
let result = iconv(a:expr, a:from, a:to)
|
||||||
|
return result != '' ? result : a:expr
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" Check vimproc.
|
||||||
|
function! s:has_vimproc() abort
|
||||||
|
if !exists('s:exists_vimproc')
|
||||||
|
try
|
||||||
|
call vimproc#version()
|
||||||
|
let s:exists_vimproc = 1
|
||||||
|
catch
|
||||||
|
let s:exists_vimproc = 0
|
||||||
|
endtry
|
||||||
|
endif
|
||||||
|
return s:exists_vimproc
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" * {command} [, {input} [, {timeout}]]
|
||||||
|
" * {command} [, {dict}]
|
||||||
|
" {dict} = {
|
||||||
|
" use_vimproc: bool,
|
||||||
|
" input: string,
|
||||||
|
" timeout: bool,
|
||||||
|
" background: bool,
|
||||||
|
" }
|
||||||
|
function! s:system(str, ...) abort
|
||||||
|
" Process optional arguments at first
|
||||||
|
" because use_vimproc is required later
|
||||||
|
" for a:str argument.
|
||||||
|
let input = ''
|
||||||
|
let use_vimproc = s:has_vimproc()
|
||||||
|
let background = 0
|
||||||
|
let args = []
|
||||||
|
if a:0 ==# 1
|
||||||
|
" {command} [, {dict}]
|
||||||
|
" a:1 = {dict}
|
||||||
|
if type(a:1) is s:TYPE_DICT
|
||||||
|
if has_key(a:1, 'use_vimproc')
|
||||||
|
let use_vimproc = a:1.use_vimproc
|
||||||
|
endif
|
||||||
|
if has_key(a:1, 'input')
|
||||||
|
let args += [s:iconv(a:1.input, &encoding, 'char')]
|
||||||
|
endif
|
||||||
|
if use_vimproc && has_key(a:1, 'timeout')
|
||||||
|
" ignores timeout unless you have vimproc.
|
||||||
|
let args += [a:1.timeout]
|
||||||
|
endif
|
||||||
|
if has_key(a:1, 'background')
|
||||||
|
let background = a:1.background
|
||||||
|
endif
|
||||||
|
elseif type(a:1) is s:TYPE_STRING
|
||||||
|
let args += [s:iconv(a:1, &encoding, 'char')]
|
||||||
|
else
|
||||||
|
throw 'Process.system(): invalid argument (value type:'.type(a:1).')'
|
||||||
|
endif
|
||||||
|
elseif a:0 >= 2
|
||||||
|
" {command} [, {input} [, {timeout}]]
|
||||||
|
" a:000 = [{input} [, {timeout}]]
|
||||||
|
let [input; rest] = a:000
|
||||||
|
let input = s:iconv(input, &encoding, 'char')
|
||||||
|
let args += [input] + rest
|
||||||
|
endif
|
||||||
|
|
||||||
|
" Process a:str argument.
|
||||||
|
if type(a:str) is s:TYPE_LIST
|
||||||
|
let expr = use_vimproc ? '"''" . v:val . "''"' : 's:shellescape(v:val)'
|
||||||
|
let command = join(map(copy(a:str), expr), ' ')
|
||||||
|
elseif type(a:str) is s:TYPE_STRING
|
||||||
|
let command = a:str
|
||||||
|
else
|
||||||
|
throw 'Process.system(): invalid argument (value type:'.type(a:str).')'
|
||||||
|
endif
|
||||||
|
if s:need_trans
|
||||||
|
let command = s:iconv(command, &encoding, 'char')
|
||||||
|
endif
|
||||||
|
let args = [command] + args
|
||||||
|
if background && (use_vimproc || !s:is_windows)
|
||||||
|
let args[0] = args[0] . ' &'
|
||||||
|
endif
|
||||||
|
|
||||||
|
let funcname = use_vimproc ? 'vimproc#system' : 'system'
|
||||||
|
let output = call(funcname, args)
|
||||||
|
let output = s:iconv(output, 'char', &encoding)
|
||||||
|
return output
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:get_last_status() abort
|
||||||
|
return s:has_vimproc() ?
|
||||||
|
\ vimproc#get_last_status() : v:shell_error
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
if s:is_windows
|
||||||
|
function! s:shellescape(command) abort
|
||||||
|
return substitute(a:command, '[&()[\]{}^=;!''+,`~]', '^\0', 'g')
|
||||||
|
endfunction
|
||||||
|
else
|
||||||
|
function! s:shellescape(...) abort
|
||||||
|
return call('shellescape', a:000)
|
||||||
|
endfunction
|
||||||
|
endif
|
||||||
|
|
||||||
|
|
||||||
|
let &cpo = s:save_cpo
|
||||||
|
unlet s:save_cpo
|
||||||
|
|
||||||
|
" vim:set et ts=2 sts=2 sw=2 tw=0:
|
||||||
|
|
||||||
|
endif
|
||||||
112
autoload/vital/_crystal/Web/JSON.vim
Normal file
112
autoload/vital/_crystal/Web/JSON.vim
Normal file
@@ -0,0 +1,112 @@
|
|||||||
|
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'crystal') == -1
|
||||||
|
|
||||||
|
let s:save_cpo = &cpo
|
||||||
|
set cpo&vim
|
||||||
|
|
||||||
|
function! s:_true() abort
|
||||||
|
return 1
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:_false() abort
|
||||||
|
return 0
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:_null() abort
|
||||||
|
return 0
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
let s:const = {}
|
||||||
|
let s:const.true = function('s:_true')
|
||||||
|
let s:const.false = function('s:_false')
|
||||||
|
let s:const.null = function('s:_null')
|
||||||
|
|
||||||
|
function! s:_resolve(val, prefix) abort
|
||||||
|
let t = type(a:val)
|
||||||
|
if t == type('')
|
||||||
|
let m = matchlist(a:val, '^' . a:prefix . '\(null\|true\|false\)$')
|
||||||
|
if !empty(m)
|
||||||
|
return s:const[m[1]]
|
||||||
|
endif
|
||||||
|
elseif t == type([]) || t == type({})
|
||||||
|
return map(a:val, 's:_resolve(v:val, a:prefix)')
|
||||||
|
endif
|
||||||
|
return a:val
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
|
||||||
|
function! s:_vital_created(module) abort
|
||||||
|
" define constant variables
|
||||||
|
call extend(a:module, s:const)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:_vital_loaded(V) abort
|
||||||
|
let s:V = a:V
|
||||||
|
let s:string = s:V.import('Data.String')
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:_vital_depends() abort
|
||||||
|
return ['Data.String']
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" @vimlint(EVL102, 1, l:null)
|
||||||
|
" @vimlint(EVL102, 1, l:true)
|
||||||
|
" @vimlint(EVL102, 1, l:false)
|
||||||
|
function! s:decode(json, ...) abort
|
||||||
|
let settings = extend({
|
||||||
|
\ 'use_token': 0,
|
||||||
|
\}, get(a:000, 0, {}))
|
||||||
|
let json = iconv(a:json, "utf-8", &encoding)
|
||||||
|
let json = join(split(json, "\n"), '')
|
||||||
|
let json = substitute(json, '\\u34;', '\\"', 'g')
|
||||||
|
let json = substitute(json, '\\u\(\x\x\x\x\)', '\=s:string.nr2enc_char("0x".submatch(1))', 'g')
|
||||||
|
if settings.use_token
|
||||||
|
let prefix = '__Web.JSON__'
|
||||||
|
while stridx(json, prefix) != -1
|
||||||
|
let prefix .= '_'
|
||||||
|
endwhile
|
||||||
|
let [null,true,false] = map(['null','true','false'], 'prefix . v:val')
|
||||||
|
sandbox return s:_resolve(eval(json), prefix)
|
||||||
|
else
|
||||||
|
let [null,true,false] = [s:const.null(),s:const.true(),s:const.false()]
|
||||||
|
sandbox return eval(json)
|
||||||
|
endif
|
||||||
|
endfunction
|
||||||
|
" @vimlint(EVL102, 0, l:null)
|
||||||
|
" @vimlint(EVL102, 0, l:true)
|
||||||
|
" @vimlint(EVL102, 0, l:false)
|
||||||
|
|
||||||
|
function! s:encode(val) abort
|
||||||
|
if type(a:val) == 0
|
||||||
|
return a:val
|
||||||
|
elseif type(a:val) == 1
|
||||||
|
let json = '"' . escape(a:val, '\"') . '"'
|
||||||
|
let json = substitute(json, "\r", '\\r', 'g')
|
||||||
|
let json = substitute(json, "\n", '\\n', 'g')
|
||||||
|
let json = substitute(json, "\t", '\\t', 'g')
|
||||||
|
return iconv(json, &encoding, "utf-8")
|
||||||
|
elseif type(a:val) == 2
|
||||||
|
if s:const.true == a:val
|
||||||
|
return 'true'
|
||||||
|
elseif s:const.false == a:val
|
||||||
|
return 'false'
|
||||||
|
elseif s:const.null == a:val
|
||||||
|
return 'null'
|
||||||
|
else
|
||||||
|
" backward compatibility
|
||||||
|
return string(a:val)
|
||||||
|
endif
|
||||||
|
elseif type(a:val) == 3
|
||||||
|
return '[' . join(map(copy(a:val), 's:encode(v:val)'), ',') . ']'
|
||||||
|
elseif type(a:val) == 4
|
||||||
|
return '{' . join(map(keys(a:val), 's:encode(v:val).":".s:encode(a:val[v:val])'), ',') . '}'
|
||||||
|
else
|
||||||
|
return string(a:val)
|
||||||
|
endif
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
let &cpo = s:save_cpo
|
||||||
|
unlet s:save_cpo
|
||||||
|
|
||||||
|
" vim:set et ts=2 sts=2 sw=2 tw=0:
|
||||||
|
|
||||||
|
endif
|
||||||
@@ -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', ''],
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'html5') == -1
|
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'html5') == -1
|
||||||
|
|
||||||
" Vim completion for HTML5 data file
|
" Vim completion for HTML5 data file
|
||||||
" Language: HTML5
|
" Language: HTML (version 5.1 Draft 2016 Jan 13)
|
||||||
" Maintainer: othree <othree@gmail.com>
|
" Maintainer: Kao, Wei-Ko(othree) ( othree AT gmail DOT com )
|
||||||
" Last Change: 2011 Apr 9
|
" Last Change: 2016 Jan 20
|
||||||
|
|
||||||
|
|
||||||
" Lang Tag: {{{
|
" Lang Tag: {{{
|
||||||
@@ -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,14 +340,38 @@ 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'
|
||||||
|
|
||||||
|
let crossorigin = ['anonymous', 'use-credentials']
|
||||||
|
|
||||||
|
|
||||||
let g:xmldata_html5 = {
|
let g:xmldata_html5 = {
|
||||||
@@ -347,7 +379,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 +391,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 +527,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 +579,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'], 'crossorigin': ['anonymous', 'use-credentials']})
|
||||||
\ ],
|
\ ],
|
||||||
\ '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 +615,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'], 'crossorigin': crossorigin, 'preload': ['preload', ''], 'prefetch': ['prefetch', '']})
|
||||||
\ ],
|
\ ],
|
||||||
\ 'main': [
|
\ 'main': [
|
||||||
\ flow_elements + ['style'],
|
\ flow_elements + ['style'],
|
||||||
@@ -598,9 +630,13 @@ let g:xmldata_html5 = {
|
|||||||
\ global_attributes
|
\ global_attributes
|
||||||
\ ],
|
\ ],
|
||||||
\ 'menu': [
|
\ 'menu': [
|
||||||
\ flow_elements + ['li'],
|
\ flow_elements + ['menuitem'],
|
||||||
\ extend(copy(global_attributes), {'type': ['toolbar', 'context'], 'label': []})
|
\ extend(copy(global_attributes), {'type': ['toolbar', 'context'], 'label': []})
|
||||||
\ ],
|
\ ],
|
||||||
|
\ 'menuitem': [
|
||||||
|
\ flow_elements + ['li'],
|
||||||
|
\ extend(copy(global_attributes), {'type': ['toolbar', 'context'], 'label': [], 'icon': [], 'disabled': [], 'checked': [], 'radiogroup': [], 'default': [], 'command': []})
|
||||||
|
\ ],
|
||||||
\ 'meta': [
|
\ 'meta': [
|
||||||
\ [],
|
\ [],
|
||||||
\ extend(copy(global_attributes), {'name': ['application-name', 'author', 'description', 'generator', 'referrer', 'creator', 'googlebot', 'publisher', 'robots', 'slurp', 'viewport', 'theme-color'], 'http-equiv': ['refresh', 'default-style', 'content-type'], 'content': [], 'charset': charset})
|
\ extend(copy(global_attributes), {'name': ['application-name', 'author', 'description', 'generator', 'referrer', 'creator', 'googlebot', 'publisher', 'robots', 'slurp', 'viewport', 'theme-color'], 'http-equiv': ['refresh', 'default-style', 'content-type'], 'content': [], 'charset': charset})
|
||||||
@@ -687,7 +723,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': [], 'crossorigin': crossorigin})
|
||||||
\ ],
|
\ ],
|
||||||
\ 'section': [
|
\ 'section': [
|
||||||
\ flow_elements + ['style'],
|
\ flow_elements + ['style'],
|
||||||
@@ -719,7 +755,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,
|
||||||
@@ -799,7 +835,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': [], 'crossorigin': crossorigin})
|
||||||
\ ],
|
\ ],
|
||||||
\ 'wbr': [
|
\ 'wbr': [
|
||||||
\ [],
|
\ [],
|
||||||
|
|||||||
122
build
122
build
@@ -2,9 +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 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 after/syntax"
|
||||||
|
DIRS_JAVASCRIPT="${DIRS} extras"
|
||||||
|
DIRS_RM="$DIRS_JAVASCRIPT"
|
||||||
|
|
||||||
OUTPUT=""
|
OUTPUT=""
|
||||||
|
|
||||||
@@ -26,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)"
|
||||||
@@ -46,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)"
|
||||||
@@ -73,12 +90,6 @@ copy_dir() {
|
|||||||
done
|
done
|
||||||
}
|
}
|
||||||
|
|
||||||
concat_ftdetect() {
|
|
||||||
cat ftdetect/* | grep -E '^[^"]' > tmp/polyglot.vim
|
|
||||||
rm -f ftdetect/*
|
|
||||||
mv tmp/polyglot.vim ftdetect/
|
|
||||||
}
|
|
||||||
|
|
||||||
update_readme() {
|
update_readme() {
|
||||||
OLD_README="$(cat README.md)"
|
OLD_README="$(cat README.md)"
|
||||||
|
|
||||||
@@ -87,7 +98,7 @@ update_readme() {
|
|||||||
+2kb
|
+2kb
|
||||||
/##
|
/##
|
||||||
'b,-2c
|
'b,-2c
|
||||||
$(printf -- "$OUTPUT")
|
$(printf -- "$OUTPUT" | sort)
|
||||||
.
|
.
|
||||||
w
|
w
|
||||||
q
|
q
|
||||||
@@ -96,82 +107,117 @@ EOF
|
|||||||
}
|
}
|
||||||
|
|
||||||
PACKS="
|
PACKS="
|
||||||
|
apiblueprint:sheerun/apiblueprint.vim
|
||||||
|
applescript:vim-scripts/applescript.vim
|
||||||
|
asciidoc:asciidoc/vim-asciidoc
|
||||||
|
yaml:stephpy/vim-yaml
|
||||||
|
ansible:pearofducks/ansible-vim
|
||||||
arduino:sudar/vim-arduino-syntax
|
arduino:sudar/vim-arduino-syntax
|
||||||
blade:xsbeats/vim-blade
|
blade:jwalton512/vim-blade
|
||||||
c++11:octol/vim-cpp-enhanced-highlight
|
c++11:octol/vim-cpp-enhanced-highlight
|
||||||
c/c++:vim-jp/cpp-vim
|
c/c++:vim-jp/vim-cpp
|
||||||
|
caddyfile:joshglendenning/vim-caddyfile
|
||||||
|
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
|
||||||
cjsx:mtscout6/vim-cjsx
|
cryptol:victoredwardocallaghan/cryptol.vim
|
||||||
|
crystal:rhysd/vim-crystal
|
||||||
|
cql:elubow/cql-vim
|
||||||
css:JulesWang/css.vim
|
css:JulesWang/css.vim
|
||||||
cucumber:tpope/vim-cucumber
|
cucumber:tpope/vim-cucumber
|
||||||
dockerfile:honza/dockerfile.vim
|
dart:dart-lang/dart-vim-plugin
|
||||||
|
dockerfile:docker/docker::/contrib/syntax/vim/
|
||||||
elixir:elixir-lang/vim-elixir
|
elixir:elixir-lang/vim-elixir
|
||||||
emberscript:heartsentwined/vim-ember-script
|
elm:lambdatoast/elm.vim
|
||||||
emblem:heartsentwined/vim-emblem
|
emberscript:yalesov/vim-ember-script
|
||||||
erlang:hcs42/vim-erlang-runtime
|
emblem:yalesov/vim-emblem
|
||||||
|
erlang:vim-erlang/vim-erlang-runtime
|
||||||
|
fish:dag/vim-fish
|
||||||
git:tpope/vim-git
|
git:tpope/vim-git
|
||||||
|
glsl:tikhomirov/vim-glsl
|
||||||
|
gnuplot:vim-scripts/gnuplot-syntax-highlighting
|
||||||
go:fatih/vim-go:_BASIC
|
go:fatih/vim-go:_BASIC
|
||||||
haml:tpope/vim-haml
|
graphql:jparise/vim-graphql
|
||||||
|
groovy:vim-scripts/groovy.vim
|
||||||
|
haml:sheerun/vim-haml
|
||||||
handlebars:mustache/vim-mustache-handlebars
|
handlebars:mustache/vim-mustache-handlebars
|
||||||
haskell:raichoo/haskell-vim
|
haskell:neovimhaskell/haskell-vim
|
||||||
haxe:yaymukund/vim-haxe
|
haxe:yaymukund/vim-haxe
|
||||||
html5:othree/html5.vim
|
html5:othree/html5.vim
|
||||||
jade:digitaltoad/vim-jade
|
i3:PotatoesMaster/i3-vim-syntax
|
||||||
jasmine:glanotte/vim-jasmine
|
jasmine:glanotte/vim-jasmine
|
||||||
javascript:sheerun/yajs.vim
|
javascript:pangloss/vim-javascript:_JAVASCRIPT
|
||||||
julia:dcjones/julia-minimalist-vim
|
json:elzr/vim-json
|
||||||
json:sheerun/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
|
||||||
|
kotlin:udalov/kotlin-vim
|
||||||
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
|
||||||
markdown:tpope/vim-markdown
|
livescript:gkz/vim-ls
|
||||||
nginx:mutewinter/nginx.vim
|
lua:tbastos/vim-lua
|
||||||
|
mako:sophacles/vim-bundle-mako
|
||||||
|
markdown:plasticboy/vim-markdown:_SYNTAX
|
||||||
|
mathematica:rsmenon/vim-mathematica
|
||||||
|
nginx:chr4/nginx.vim
|
||||||
|
nim:zah/nim.vim:_BASIC
|
||||||
|
nix:spwhitt/vim-nix
|
||||||
|
objc:b4winckler/vim-objc
|
||||||
ocaml:jrk/vim-ocaml
|
ocaml:jrk/vim-ocaml
|
||||||
octave:vim-scripts/octave.vim--
|
octave:vim-scripts/octave.vim--
|
||||||
opencl:petRUShka/vim-opencl
|
opencl:petRUShka/vim-opencl
|
||||||
perl:vim-perl/vim-perl
|
perl:vim-perl/vim-perl
|
||||||
|
pgsql:exu/pgsql.vim
|
||||||
php:StanAngeloff/php.vim
|
php:StanAngeloff/php.vim
|
||||||
puppet:rodjek/vim-puppet
|
plantuml:aklt/plantuml-syntax
|
||||||
powershell:Persistent13/vim-ps1
|
powershell:PProvost/vim-ps1
|
||||||
protobuf:uarun/vim-protobuf
|
protobuf:uarun/vim-protobuf
|
||||||
|
pug:digitaltoad/vim-pug
|
||||||
|
puppet:voxpupuli/vim-puppet
|
||||||
|
purescript:raichoo/purescript-vim
|
||||||
python:mitsuhiko/vim-python-combined
|
python:mitsuhiko/vim-python-combined
|
||||||
|
python-compiler:aliev/vim-compiler-python
|
||||||
|
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:wting/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
|
||||||
|
sxhkd:baskerville/vim-sxhkdrc
|
||||||
systemd:kurayama/systemd-vim-syntax
|
systemd:kurayama/systemd-vim-syntax
|
||||||
swift:toyamarinyon/vim-swift
|
terraform:hashivim/vim-terraform
|
||||||
textile:timcharper/textile.vim
|
textile:timcharper/textile.vim
|
||||||
tmux:tejr/vim-tmux
|
|
||||||
tomdoc:duwanis/tomdoc.vim
|
|
||||||
typescript:leafgarland/typescript-vim
|
|
||||||
vbnet:vim-scripts/vbnet.vim
|
|
||||||
thrift:solarnz/thrift.vim
|
thrift:solarnz/thrift.vim
|
||||||
|
tmux:keith/tmux.vim
|
||||||
|
tomdoc:wellbredgrapefruit/tomdoc.vim
|
||||||
toml:cespare/vim-toml
|
toml:cespare/vim-toml
|
||||||
twig:beyondwords/vim-twig
|
twig:lumiliet/vim-twig
|
||||||
|
typescript:leafgarland/typescript-vim
|
||||||
|
vala:arrufat/vala.vim
|
||||||
|
vbnet:vim-scripts/vbnet.vim
|
||||||
|
vcl:smerrill/vcl-vim-plugin
|
||||||
|
vue:posva/vim-vue
|
||||||
|
vm:lepture/vim-velocity
|
||||||
xls:vim-scripts/XSLT-syntax
|
xls:vim-scripts/XSLT-syntax
|
||||||
yard:sheerun/vim-yardoc
|
yard:sheerun/vim-yardoc
|
||||||
vala:tkztmk/vim-vala
|
|
||||||
vm:lepture/vim-velocity
|
|
||||||
"
|
"
|
||||||
|
|
||||||
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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
24
compiler/cryptol.vim
Normal file
24
compiler/cryptol.vim
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'cryptol') == -1
|
||||||
|
|
||||||
|
" Vim compiler file
|
||||||
|
" Compiler: Cryptol version 1.8.19-academic Compiler
|
||||||
|
" Maintainer: Edward O'Callaghan <victoredwardocallaghan AT gmail DOT com>
|
||||||
|
" Latest Revision: 25-Apr-2013
|
||||||
|
|
||||||
|
if exists("current_compiler")
|
||||||
|
finish
|
||||||
|
endif
|
||||||
|
let current_compiler = "cryptol"
|
||||||
|
|
||||||
|
if exists(":CompilerSet") != 2
|
||||||
|
command = -nargs =* CompilerSet setlocal <args>
|
||||||
|
endif
|
||||||
|
|
||||||
|
" TODO: Work out errorformat for the Cryptol compiler, see
|
||||||
|
" :help errorformat
|
||||||
|
CompilerSet errorformat& " use the default 'errorformat'
|
||||||
|
|
||||||
|
" "%<" means the current file name without extension.
|
||||||
|
CompilerSet makeprg=cryptol\ -o\ %<\ %
|
||||||
|
|
||||||
|
endif
|
||||||
20
compiler/eslint.vim
Normal file
20
compiler/eslint.vim
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'javascript') == -1
|
||||||
|
|
||||||
|
" Vim compiler plugin
|
||||||
|
" Language: JavaScript
|
||||||
|
" Maintainer: vim-javascript community
|
||||||
|
" URL: https://github.com/pangloss/vim-javascript
|
||||||
|
|
||||||
|
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
|
||||||
@@ -1,10 +1,5 @@
|
|||||||
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'elixir') == -1
|
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'elixir') == -1
|
||||||
|
|
||||||
" Vim compiler file
|
|
||||||
" Language: ExUnit
|
|
||||||
" Maintainer: Rein Henrichs <rein.henrichs@gmail.com>
|
|
||||||
" URL: https://github.com/elixir-lang/vim-elixir
|
|
||||||
|
|
||||||
if exists("current_compiler")
|
if exists("current_compiler")
|
||||||
finish
|
finish
|
||||||
endif
|
endif
|
||||||
@@ -16,9 +11,15 @@ endif
|
|||||||
|
|
||||||
let s:cpo_save = &cpo
|
let s:cpo_save = &cpo
|
||||||
set cpo-=C
|
set cpo-=C
|
||||||
|
|
||||||
CompilerSet makeprg=mix\ test
|
CompilerSet makeprg=mix\ test
|
||||||
CompilerSet errorformat=%A\ \ %.)\ %m(%.%#),%C\ \ \ \ \ **%m,%C\ \ \ \ \ \ \ %m,%Z\ \ \ \ \ at\ %f:%l,%-G%.%#
|
CompilerSet errorformat=
|
||||||
|
\%E\ \ %n)\ %m,
|
||||||
|
\%+G\ \ \ \ \ **\ %m,
|
||||||
|
\%+G\ \ \ \ \ stacktrace:,
|
||||||
|
\%C\ \ \ \ \ %f:%l,
|
||||||
|
\%+G\ \ \ \ \ \ \ (%\\w%\\+)\ %f:%l:\ %m,
|
||||||
|
\%+G\ \ \ \ \ \ \ %f:%l:\ %.%#,
|
||||||
|
\**\ (%\\w%\\+)\ %f:%l:\ %m
|
||||||
|
|
||||||
let &cpo = s:cpo_save
|
let &cpo = s:cpo_save
|
||||||
unlet s:cpo_save
|
unlet s:cpo_save
|
||||||
|
|||||||
11
compiler/fish.vim
Normal file
11
compiler/fish.vim
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'fish') == -1
|
||||||
|
|
||||||
|
if exists('current_compiler')
|
||||||
|
finish
|
||||||
|
endif
|
||||||
|
let current_compiler = 'fish'
|
||||||
|
|
||||||
|
CompilerSet makeprg=fish\ --no-execute\ %
|
||||||
|
execute 'CompilerSet errorformat='.escape(fish#errorformat(), ' ')
|
||||||
|
|
||||||
|
endif
|
||||||
45
compiler/go.vim
Normal file
45
compiler/go.vim
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'go') == -1
|
||||||
|
|
||||||
|
" Copyright 2013 The Go Authors. All rights reserved.
|
||||||
|
" Use of this source code is governed by a BSD-style
|
||||||
|
" license that can be found in the LICENSE file.
|
||||||
|
"
|
||||||
|
" compiler/go.vim: Vim compiler file for Go.
|
||||||
|
|
||||||
|
if exists("current_compiler")
|
||||||
|
finish
|
||||||
|
endif
|
||||||
|
let current_compiler = "go"
|
||||||
|
|
||||||
|
if exists(":CompilerSet") != 2
|
||||||
|
command -nargs=* CompilerSet setlocal <args>
|
||||||
|
endif
|
||||||
|
|
||||||
|
let s:save_cpo = &cpo
|
||||||
|
set cpo-=C
|
||||||
|
if filereadable("makefile") || filereadable("Makefile")
|
||||||
|
CompilerSet makeprg=make
|
||||||
|
else
|
||||||
|
CompilerSet makeprg=go\ build
|
||||||
|
endif
|
||||||
|
|
||||||
|
" Define the patterns that will be recognized by QuickFix when parsing the
|
||||||
|
" output of Go command that use this errorforamt (when called make, cexpr or
|
||||||
|
" lmake, lexpr). This is the global errorformat, however some command might
|
||||||
|
" use a different output, for those we define them directly and modify the
|
||||||
|
" errorformat ourselves. More information at:
|
||||||
|
" http://vimdoc.sourceforge.net/htmldoc/quickfix.html#errorformat
|
||||||
|
CompilerSet errorformat =%-G#\ %.%# " Ignore lines beginning with '#' ('# command-line-arguments' line sometimes appears?)
|
||||||
|
CompilerSet errorformat+=%-G%.%#panic:\ %m " Ignore lines containing 'panic: message'
|
||||||
|
CompilerSet errorformat+=%Ecan\'t\ load\ package:\ %m " Start of multiline error string is 'can\'t load package'
|
||||||
|
CompilerSet errorformat+=%A%f:%l:%c:\ %m " Start of multiline unspecified string is 'filename:linenumber:columnnumber:'
|
||||||
|
CompilerSet errorformat+=%A%f:%l:\ %m " Start of multiline unspecified string is 'filename:linenumber:'
|
||||||
|
CompilerSet errorformat+=%C%*\\s%m " Continuation of multiline error message is indented
|
||||||
|
CompilerSet errorformat+=%-G%.%# " All lines not matching any of the above patterns are ignored
|
||||||
|
|
||||||
|
let &cpo = s:save_cpo
|
||||||
|
unlet s:save_cpo
|
||||||
|
|
||||||
|
" vim: sw=2 ts=2 et
|
||||||
|
|
||||||
|
endif
|
||||||
78
compiler/ls.vim
Normal file
78
compiler/ls.vim
Normal 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
|
||||||
27
compiler/nim.vim
Normal file
27
compiler/nim.vim
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'nim') == -1
|
||||||
|
|
||||||
|
if exists("current_compiler")
|
||||||
|
finish
|
||||||
|
endif
|
||||||
|
|
||||||
|
let current_compiler = "nim"
|
||||||
|
|
||||||
|
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=nim\ c\ --verbosity:0\ $*\ %:p
|
||||||
|
|
||||||
|
CompilerSet errorformat=
|
||||||
|
\%-GHint:\ %m,
|
||||||
|
\%E%f(%l\\,\ %c)\ Error:\ %m,
|
||||||
|
\%W%f(%l\\,\ %c)\ Hint:\ %m
|
||||||
|
|
||||||
|
let &cpo = s:cpo_save
|
||||||
|
unlet s:cpo_save
|
||||||
|
|
||||||
|
|
||||||
|
endif
|
||||||
71
compiler/python.vim
Normal file
71
compiler/python.vim
Normal 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
|
||||||
@@ -24,10 +24,10 @@ CompilerSet errorformat=
|
|||||||
\%D(in\ %f),
|
\%D(in\ %f),
|
||||||
\%\\s%#from\ %f:%l:%m,
|
\%\\s%#from\ %f:%l:%m,
|
||||||
\%\\s%#from\ %f:%l:,
|
\%\\s%#from\ %f:%l:,
|
||||||
\%\\s%##\ %f:%l:%m,
|
\%\\s%##\ %f:%l:%m%\\&%.%#%\\D:%.%#,
|
||||||
\%\\s%##\ %f:%l,
|
\%\\s%##\ %f:%l%\\&%.%#%\\D:%.%#,
|
||||||
\%\\s%#[%f:%l:\ %#%m,
|
\%\\s%#[%f:%l:\ %#%m%\\&%.%#%\\D:%.%#,
|
||||||
\%\\s%#%f:%l:\ %#%m,
|
\%\\s%#%f:%l:\ %#%m%\\&%.%#%\\D:%.%#,
|
||||||
\%\\s%#%f:%l:,
|
\%\\s%#%f:%l:,
|
||||||
\%m\ [%f:%l]:,
|
\%m\ [%f:%l]:,
|
||||||
\%+Erake\ aborted!,
|
\%+Erake\ aborted!,
|
||||||
|
|||||||
@@ -24,9 +24,10 @@ CompilerSet errorformat=
|
|||||||
\%f:%l:\ %tarning:\ %m,
|
\%f:%l:\ %tarning:\ %m,
|
||||||
\%E%.%#:in\ `load':\ %f:%l:%m,
|
\%E%.%#:in\ `load':\ %f:%l:%m,
|
||||||
\%E%f:%l:in\ `%*[^']':\ %m,
|
\%E%f:%l:in\ `%*[^']':\ %m,
|
||||||
\%-Z\ \ \ \ \ \#\ %f:%l:%.%#,
|
\%-Z\ \ \ \ \ %\\+\#\ %f:%l:%.%#,
|
||||||
\%E\ \ %\\d%\\+)%.%#,
|
\%E\ \ %\\d%\\+)%.%#,
|
||||||
\%C\ \ \ \ \ %m,
|
\%C\ \ \ \ \ %m,
|
||||||
|
\%C%\\s%#,
|
||||||
\%-G%.%#
|
\%-G%.%#
|
||||||
|
|
||||||
let &cpo = s:cpo_save
|
let &cpo = s:cpo_save
|
||||||
|
|||||||
@@ -17,12 +17,13 @@ if exists(":CompilerSet") != 2
|
|||||||
command -nargs=* CompilerSet setlocal <args>
|
command -nargs=* CompilerSet setlocal <args>
|
||||||
endif
|
endif
|
||||||
|
|
||||||
if exists("g:rustc_makeprg_no_percent") && g:rustc_makeprg_no_percent == 1
|
if exists("g:rustc_makeprg_no_percent") && g:rustc_makeprg_no_percent != 0
|
||||||
CompilerSet makeprg=rustc
|
CompilerSet makeprg=rustc
|
||||||
else
|
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
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
|
||||||
@@ -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
11
config.vim
Normal 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
96
extras/flow.vim
Normal 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
43
extras/jsdoc.vim
Normal 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
7
extras/ngdoc.vim
Normal 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
9
ftplugin/ansible.vim
Normal file
9
ftplugin/ansible.vim
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'ansible') == -1
|
||||||
|
|
||||||
|
" Slow yaml highlighting workaround
|
||||||
|
if exists('+regexpengine') && ('®expengine' == 0)
|
||||||
|
setlocal regexpengine=1
|
||||||
|
endif
|
||||||
|
set path+=./../templates,./../files
|
||||||
|
|
||||||
|
endif
|
||||||
13
ftplugin/ansible_hosts.vim
Normal file
13
ftplugin/ansible_hosts.vim
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'ansible') == -1
|
||||||
|
|
||||||
|
if exists("b:did_ftplugin")
|
||||||
|
finish
|
||||||
|
else
|
||||||
|
let b:did_ftplugin = 1
|
||||||
|
endif
|
||||||
|
|
||||||
|
setlocal comments=:# commentstring=#\ %s formatoptions-=t formatoptions-=c
|
||||||
|
|
||||||
|
let b:undo_ftplugin = "setl comments< commentstring< formatoptions<"
|
||||||
|
|
||||||
|
endif
|
||||||
37
ftplugin/blade.vim
Normal file
37
ftplugin/blade.vim
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'blade') == -1
|
||||||
|
|
||||||
|
" Vim filetype plugin
|
||||||
|
" Language: Blade (Laravel)
|
||||||
|
" Maintainer: Jason Walton <jwalton512@gmail.com>
|
||||||
|
|
||||||
|
if exists('b:did_ftplugin')
|
||||||
|
finish
|
||||||
|
endif
|
||||||
|
|
||||||
|
runtime! ftplugin/html.vim
|
||||||
|
let b:did_ftplugin = 1
|
||||||
|
|
||||||
|
setlocal suffixesadd=.blade.php,.php
|
||||||
|
setlocal includeexpr=substitute(v:fname,'\\.','/','g')
|
||||||
|
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
|
||||||
@@ -6,64 +6,4 @@ endif
|
|||||||
|
|
||||||
let g:loaded_haskellvim_cabal = 1
|
let g:loaded_haskellvim_cabal = 1
|
||||||
|
|
||||||
function! s:makeSection(content)
|
|
||||||
return "\n" . join(a:content, "\n")
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
function! s:exeTmpl(name, src)
|
|
||||||
let l:exetmpl = [ 'executable ' . a:name,
|
|
||||||
\ '-- ghc-options:',
|
|
||||||
\ 'main-is: ' . a:src,
|
|
||||||
\ '-- other-modules:',
|
|
||||||
\ '-- other-extensions:',
|
|
||||||
\ 'build-depends: base',
|
|
||||||
\ '-- hs-source-dirs:',
|
|
||||||
\ 'default-language: Haskell2010'
|
|
||||||
\ ]
|
|
||||||
|
|
||||||
return s:makeSection(l:exetmpl)
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
function! s:libTmpl()
|
|
||||||
let l:libtmpl = [ 'library',
|
|
||||||
\ '-- ghc-options:',
|
|
||||||
\ '-- other-modules:',
|
|
||||||
\ '-- other-extensions:',
|
|
||||||
\ 'build-depends: base',
|
|
||||||
\ '-- hs-source-dirs:',
|
|
||||||
\ 'default-language: Haskell2010'
|
|
||||||
\ ]
|
|
||||||
|
|
||||||
return s:makeSection(l:libtmpl)
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
function! s:flagTmpl(name)
|
|
||||||
let l:flagtmpl = [ 'flag ' . a:name,
|
|
||||||
\ 'description:',
|
|
||||||
\ 'default: False',
|
|
||||||
\ 'manual: True',
|
|
||||||
\ ]
|
|
||||||
|
|
||||||
return s:makeSection(l:flagtmpl)
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
function! cabal#addExecutable()
|
|
||||||
let l:name = input("Enter executable name: ")
|
|
||||||
let l:src = input("Enter source file: ")
|
|
||||||
exe "normal Go" . s:exeTmpl(l:name, l:src)
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
function! cabal#addLibrary()
|
|
||||||
exe "normal Go" . s:libTmpl()
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
function! cabal#addFlag()
|
|
||||||
let l:name = input("Enter flag name: ")
|
|
||||||
exe "normal Go" . s:flagTmpl(l:name)
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
command! -buffer CabalAddExecutable call cabal#addExecutable()
|
|
||||||
command! -buffer CabalAddLibrary call cabal#addLibrary()
|
|
||||||
command! -buffer CabalAddFlag call cabal#addFlag()
|
|
||||||
|
|
||||||
endif
|
endif
|
||||||
|
|||||||
28
ftplugin/caddyfile.vim
Normal file
28
ftplugin/caddyfile.vim
Normal 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
|
||||||
@@ -1,13 +1,13 @@
|
|||||||
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'clojure') == -1
|
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'clojure') == -1
|
||||||
|
|
||||||
" Vim filetype plugin file
|
" Vim filetype plugin file
|
||||||
" Language: Clojure
|
" Language: Clojure
|
||||||
" Author: Meikel Brandmeyer <mb@kotka.de>
|
" Author: Meikel Brandmeyer <mb@kotka.de>
|
||||||
"
|
"
|
||||||
" Maintainer: Sung Pae <self@sungpae.com>
|
" Maintainer: Sung Pae <self@sungpae.com>
|
||||||
" URL: https://github.com/guns/vim-clojure-static
|
" URL: https://github.com/guns/vim-clojure-static
|
||||||
" License: Same as Vim
|
" License: Same as Vim
|
||||||
" Last Change: %%RELEASE_DATE%%
|
" Last Change: %%RELEASE_DATE%%
|
||||||
|
|
||||||
if exists("b:did_ftplugin")
|
if exists("b:did_ftplugin")
|
||||||
finish
|
finish
|
||||||
@@ -84,9 +84,9 @@ endif
|
|||||||
" Win32 can filter files in the browse dialog
|
" Win32 can filter files in the browse dialog
|
||||||
if has("gui_win32") && !exists("b:browsefilter")
|
if has("gui_win32") && !exists("b:browsefilter")
|
||||||
let b:browsefilter = "Clojure Source Files (*.clj)\t*.clj\n" .
|
let b:browsefilter = "Clojure Source Files (*.clj)\t*.clj\n" .
|
||||||
\ "ClojureScript Source Files (*.cljs)\t*.cljs\n" .
|
\ "ClojureScript Source Files (*.cljs)\t*.cljs\n" .
|
||||||
\ "Java Source Files (*.java)\t*.java\n" .
|
\ "Java Source Files (*.java)\t*.java\n" .
|
||||||
\ "All Files (*.*)\t*.*\n"
|
\ "All Files (*.*)\t*.*\n"
|
||||||
let b:undo_ftplugin .= ' | unlet! b:browsefilter'
|
let b:undo_ftplugin .= ' | unlet! b:browsefilter'
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ call coffee#CoffeeSetUpVariables()
|
|||||||
setlocal formatoptions-=t formatoptions+=croql
|
setlocal formatoptions-=t formatoptions+=croql
|
||||||
setlocal comments=:# commentstring=#\ %s
|
setlocal comments=:# commentstring=#\ %s
|
||||||
setlocal omnifunc=javascriptcomplete#CompleteJS
|
setlocal omnifunc=javascriptcomplete#CompleteJS
|
||||||
setlocal suffixesadd+=coffee
|
setlocal suffixesadd+=.coffee
|
||||||
|
|
||||||
" Create custom augroups.
|
" Create custom augroups.
|
||||||
augroup CoffeeBufUpdate | augroup END
|
augroup CoffeeBufUpdate | augroup END
|
||||||
|
|||||||
50
ftplugin/cryptol/folding.vim
Normal file
50
ftplugin/cryptol/folding.vim
Normal file
@@ -0,0 +1,50 @@
|
|||||||
|
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'cryptol') == -1
|
||||||
|
|
||||||
|
" Copyright © 2013 Edward O'Callaghan. All Rights Reserved.
|
||||||
|
|
||||||
|
"setlocal foldmethod=indent
|
||||||
|
"setlocal foldignore=
|
||||||
|
|
||||||
|
setlocal foldmethod=expr
|
||||||
|
setlocal foldexpr=GetPotionFold(v:lnum)
|
||||||
|
|
||||||
|
" Helper function: To tackle non-blank lines,
|
||||||
|
" wish to know their indentation level
|
||||||
|
function! IndentLevel(lnum)
|
||||||
|
return indent(a:lnum) / &shiftwidth
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" Helper function: .
|
||||||
|
function! NextNonBlankLine(lnum)
|
||||||
|
let numlines = line('$')
|
||||||
|
let current = a:lnum + 1
|
||||||
|
|
||||||
|
while current <= numlines
|
||||||
|
if getline(current) =~? '\v\S'
|
||||||
|
return current
|
||||||
|
endif
|
||||||
|
|
||||||
|
let current += 1
|
||||||
|
endwhile
|
||||||
|
|
||||||
|
return -2
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! GetPotionFold(lnum)
|
||||||
|
if getline(a:lnum) =~? '\v^\s*$'
|
||||||
|
return '-1'
|
||||||
|
endif
|
||||||
|
|
||||||
|
let this_indent = IndentLevel(a:lnum)
|
||||||
|
let next_indent = IndentLevel(NextNonBlankLine(a:lnum))
|
||||||
|
|
||||||
|
if next_indent == this_indent
|
||||||
|
return this_indent
|
||||||
|
elseif next_indent < this_indent
|
||||||
|
return this_indent
|
||||||
|
elseif next_indent > this_indent
|
||||||
|
return '>' . next_indent
|
||||||
|
endif
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
endif
|
||||||
84
ftplugin/crystal.vim
Normal file
84
ftplugin/crystal.vim
Normal file
@@ -0,0 +1,84 @@
|
|||||||
|
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'crystal') == -1
|
||||||
|
|
||||||
|
if exists('b:did_ftplugin')
|
||||||
|
finish
|
||||||
|
endif
|
||||||
|
let b:did_ftplugin = 1
|
||||||
|
|
||||||
|
let s:save_cpo = &cpo
|
||||||
|
set cpo&vim
|
||||||
|
|
||||||
|
if exists('loaded_matchit') && !exists('b:match_words')
|
||||||
|
let b:match_ignorecase = 0
|
||||||
|
|
||||||
|
let b:match_words =
|
||||||
|
\ '\<\%(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\)\>' .
|
||||||
|
\ ':' .
|
||||||
|
\ '\<end\>' .
|
||||||
|
\ ',{:},\[:\],(:)'
|
||||||
|
|
||||||
|
let b:match_skip =
|
||||||
|
\ "synIDattr(synID(line('.'),col('.'),0),'name') =~ '" .
|
||||||
|
\ "\\<crystal\\%(String\\|StringDelimiter\\|ASCIICode\\|Escape\\|" .
|
||||||
|
\ "Interpolation\\|NoInterpolation\\|Comment\\|Documentation\\|" .
|
||||||
|
\ "ConditionalModifier\\|RepeatModifier\\|OptionalDo\\|" .
|
||||||
|
\ "Function\\|BlockArgument\\|KeywordAsMethod\\|ClassVariable\\|" .
|
||||||
|
\ "InstanceVariable\\|GlobalVariable\\|Symbol\\)\\>'"
|
||||||
|
endif
|
||||||
|
|
||||||
|
setlocal comments=:#
|
||||||
|
setlocal commentstring=#\ %s
|
||||||
|
setlocal suffixesadd=.cr
|
||||||
|
|
||||||
|
" Set format for quickfix window
|
||||||
|
setlocal errorformat=
|
||||||
|
\%ESyntax\ error\ in\ line\ %l:\ %m,
|
||||||
|
\%ESyntax\ error\ in\ %f:%l:\ %m,
|
||||||
|
\%EError\ in\ %f:%l:\ %m,
|
||||||
|
\%C%p^,
|
||||||
|
\%-C%.%#
|
||||||
|
|
||||||
|
let g:crystal_compiler_command = get(g:, 'crystal_compiler_command', 'crystal')
|
||||||
|
let g:crystal_auto_format = get(g:, 'crystal_auto_format', 0)
|
||||||
|
|
||||||
|
command! -buffer -nargs=* CrystalImpl echo crystal_lang#impl(expand('%'), getpos('.'), <q-args>).output
|
||||||
|
command! -buffer -nargs=0 CrystalDef call crystal_lang#jump_to_definition(expand('%'), getpos('.'))
|
||||||
|
command! -buffer -nargs=* CrystalContext echo crystal_lang#context(expand('%'), getpos('.'), <q-args>).output
|
||||||
|
command! -buffer -nargs=* CrystalHierarchy echo crystal_lang#type_hierarchy(expand('%'), <q-args>)
|
||||||
|
command! -buffer -nargs=? CrystalSpecSwitch call crystal_lang#switch_spec_file(<f-args>)
|
||||||
|
command! -buffer -nargs=? CrystalSpecRunAll call crystal_lang#run_all_spec(<f-args>)
|
||||||
|
command! -buffer -nargs=? CrystalSpecRunCurrent call crystal_lang#run_current_spec(<f-args>)
|
||||||
|
command! -buffer -nargs=* -bar CrystalFormat call crystal_lang#format(<q-args>)
|
||||||
|
|
||||||
|
nnoremap <Plug>(crystal-jump-to-definition) :<C-u>CrystalDef<CR>
|
||||||
|
nnoremap <Plug>(crystal-show-context) :<C-u>CrystalContext<CR>
|
||||||
|
nnoremap <Plug>(crystal-spec-switch) :<C-u>CrystalSpecSwitch<CR>
|
||||||
|
nnoremap <Plug>(crystal-spec-run-all) :<C-u>CrystalSpecRunAll<CR>
|
||||||
|
nnoremap <Plug>(crystal-spec-run-current) :<C-u>CrystalSpecRunCurrent<CR>
|
||||||
|
nnoremap <Plug>(crystal-format) :<C-u>CrystalFormat<CR>
|
||||||
|
|
||||||
|
augroup plugin-ft-crystal
|
||||||
|
autocmd!
|
||||||
|
autocmd BufWritePre <buffer> if g:crystal_auto_format | CrystalFormat | endif
|
||||||
|
augroup END
|
||||||
|
|
||||||
|
if get(g:, 'crystal_define_mappings', 1)
|
||||||
|
nmap <buffer>gd <Plug>(crystal-jump-to-definition)
|
||||||
|
nmap <buffer>gc <Plug>(crystal-show-context)
|
||||||
|
nmap <buffer>gss <Plug>(crystal-spec-switch)
|
||||||
|
nmap <buffer>gsa <Plug>(crystal-spec-run-all)
|
||||||
|
nmap <buffer>gsc <Plug>(crystal-spec-run-current)
|
||||||
|
endif
|
||||||
|
|
||||||
|
if &l:ofu ==# ''
|
||||||
|
setlocal omnifunc=crystal_lang#complete
|
||||||
|
endif
|
||||||
|
|
||||||
|
let &cpo = s:save_cpo
|
||||||
|
unlet s:save_cpo
|
||||||
|
|
||||||
|
" vim: nowrap sw=2 sts=2 ts=8:
|
||||||
|
|
||||||
|
endif
|
||||||
33
ftplugin/dart.vim
Normal file
33
ftplugin/dart.vim
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'dart') == -1
|
||||||
|
|
||||||
|
if exists('b:did_ftplugin')
|
||||||
|
finish
|
||||||
|
endif
|
||||||
|
let b:did_ftplugin = 1
|
||||||
|
|
||||||
|
" Enable automatic indentation (2 spaces) if variable g:dart_style_guide is set
|
||||||
|
if exists('g:dart_style_guide')
|
||||||
|
setlocal expandtab
|
||||||
|
setlocal shiftwidth=2
|
||||||
|
setlocal softtabstop=2
|
||||||
|
|
||||||
|
setlocal formatoptions-=t
|
||||||
|
endif
|
||||||
|
|
||||||
|
" Set 'comments' to format dashed lists in comments.
|
||||||
|
setlocal comments=sO:*\ -,mO:*\ \ ,exO:*/,s1:/*,mb:*,ex:*/,:///,://
|
||||||
|
|
||||||
|
setlocal commentstring=//%s
|
||||||
|
let s:win_sep = (has('win32') || has('win64')) ? '/' : ''
|
||||||
|
let &l:errorformat =
|
||||||
|
\ join([
|
||||||
|
\ ' %#''file://' . s:win_sep . '%f'': %s: line %l pos %c:%m',
|
||||||
|
\ '%m'
|
||||||
|
\ ], ',')
|
||||||
|
|
||||||
|
setlocal includeexpr=dart#resolveUri(v:fname)
|
||||||
|
setlocal isfname+=:
|
||||||
|
|
||||||
|
let b:undo_ftplugin = 'setl et< fo< sw< sts< com< cms< inex< isf<'
|
||||||
|
|
||||||
|
endif
|
||||||
@@ -1,9 +1,5 @@
|
|||||||
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'elixir') == -1
|
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'elixir') == -1
|
||||||
|
|
||||||
" Vim filetype plugin
|
|
||||||
" Language: Embedded Elixir
|
|
||||||
" URL: https://github.com/elixir-lang/vim-elixir
|
|
||||||
|
|
||||||
if exists("b:did_ftplugin")
|
if exists("b:did_ftplugin")
|
||||||
finish
|
finish
|
||||||
endif
|
endif
|
||||||
@@ -20,7 +16,7 @@ if !exists("g:eelixir_default_subtype")
|
|||||||
endif
|
endif
|
||||||
|
|
||||||
if !exists("b:eelixir_subtype")
|
if !exists("b:eelixir_subtype")
|
||||||
let s:lines = getline(1)."\n".getline(2)."\n".getline(3)."\n".getline(4)."\n".getline(5)."\n".getline("$")
|
let s:lines = join(getline(1, 5) + [getline('$')], "\n")
|
||||||
let b:eelixir_subtype = matchstr(s:lines,'eelixir_subtype=\zs\w\+')
|
let b:eelixir_subtype = matchstr(s:lines,'eelixir_subtype=\zs\w\+')
|
||||||
if b:eelixir_subtype == ''
|
if b:eelixir_subtype == ''
|
||||||
let b:eelixir_subtype = matchstr(&filetype,'^eex\.\zs\w\+')
|
let b:eelixir_subtype = matchstr(&filetype,'^eex\.\zs\w\+')
|
||||||
@@ -84,10 +80,27 @@ 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\ %>
|
||||||
|
|
||||||
let b:undo_ftplugin = "setl cms< "
|
let b:undo_ftplugin = "setl cms< " .
|
||||||
\ " | unlet! b:browsefilter b:match_words | " . s:undo_ftplugin
|
\ " | unlet! b:browsefilter b:match_words | " . s:undo_ftplugin
|
||||||
|
|
||||||
let &cpo = s:save_cpo
|
let &cpo = s:save_cpo
|
||||||
|
|||||||
@@ -1,21 +1,15 @@
|
|||||||
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'elixir') == -1
|
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'elixir') == -1
|
||||||
|
|
||||||
" Vim filetype plugin
|
|
||||||
" Language: Elixir
|
|
||||||
" Maintainer: Carlos Galdino <carloshsgaldino@gmail.com>
|
|
||||||
" URL: https://github.com/elixir-lang/vim-elixir
|
|
||||||
|
|
||||||
if (exists("b:did_ftplugin"))
|
if (exists("b:did_ftplugin"))
|
||||||
finish
|
finish
|
||||||
endif
|
endif
|
||||||
let b:did_ftplugin = 1
|
let b:did_ftplugin = 1
|
||||||
|
|
||||||
|
|
||||||
" Matchit support
|
" Matchit support
|
||||||
if exists("loaded_matchit") && !exists("b:match_words")
|
if exists("loaded_matchit") && !exists("b:match_words")
|
||||||
let b:match_ignorecase = 0
|
let b:match_ignorecase = 0
|
||||||
|
|
||||||
let b:match_words = '\<\%(do\|fn\)\:\@!\>' .
|
let b:match_words = '\:\@<!\<\%(do\|fn\)\:\@!\>' .
|
||||||
\ ':' .
|
\ ':' .
|
||||||
\ '\<\%(else\|elsif\|catch\|after\|rescue\)\:\@!\>' .
|
\ '\<\%(else\|elsif\|catch\|after\|rescue\)\:\@!\>' .
|
||||||
\ ':' .
|
\ ':' .
|
||||||
@@ -23,7 +17,24 @@ if exists("loaded_matchit") && !exists("b:match_words")
|
|||||||
\ ',{:},\[:\],(:)'
|
\ ',{:},\[:\],(:)'
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
setlocal shiftwidth=2 softtabstop=2 expandtab iskeyword+=!,?
|
||||||
setlocal comments=:#
|
setlocal comments=:#
|
||||||
setlocal commentstring=#\ %s
|
setlocal commentstring=#\ %s
|
||||||
|
|
||||||
|
let &l:path =
|
||||||
|
\ join([
|
||||||
|
\ 'lib',
|
||||||
|
\ 'src',
|
||||||
|
\ 'deps/**/lib',
|
||||||
|
\ 'deps/**/src',
|
||||||
|
\ &g:path
|
||||||
|
\ ], ',')
|
||||||
|
setlocal includeexpr=elixir#util#get_filename(v:fname)
|
||||||
|
setlocal suffixesadd=.ex,.exs,.eex,.erl,.yrl,.hrl
|
||||||
|
|
||||||
|
silent! setlocal formatoptions-=t formatoptions+=croqlj
|
||||||
|
|
||||||
|
let b:undo_ftplugin = 'setlocal sw< sts< et< isk< com< cms< path< inex< sua< '.
|
||||||
|
\ '| unlet! b:match_ignorecase b:match_words'
|
||||||
|
|
||||||
endif
|
endif
|
||||||
|
|||||||
86
ftplugin/elm.vim
Normal file
86
ftplugin/elm.vim
Normal file
@@ -0,0 +1,86 @@
|
|||||||
|
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'elm') == -1
|
||||||
|
|
||||||
|
" elm.vim - Plugin for the Elm programming language
|
||||||
|
" Maintainer: Alexander Noriega <http://lambdatoast.com/>
|
||||||
|
" Version: 0.4.3
|
||||||
|
|
||||||
|
" Plugin setup stuff
|
||||||
|
|
||||||
|
if exists("b:did_ftplugin")
|
||||||
|
finish
|
||||||
|
endif
|
||||||
|
|
||||||
|
let b:did_ftplugin = 1
|
||||||
|
|
||||||
|
" Compilation
|
||||||
|
|
||||||
|
function! ElmMake(file)
|
||||||
|
let args = a:file
|
||||||
|
return elm#io#system("elm-make", args)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! ElmMakeCurrentFile()
|
||||||
|
echo ElmMake(expand("%"))
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! ElmMakeMain()
|
||||||
|
echo ElmMake("Main.elm")
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! ElmMakeFile(file)
|
||||||
|
echo ElmMake(a:file)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" REPL
|
||||||
|
|
||||||
|
function! ElmRepl()
|
||||||
|
!elm-repl
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" Evaluation
|
||||||
|
|
||||||
|
function! ElmEvalLine()
|
||||||
|
return ElmEval(getline("."))
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! ElmEvalSelection()
|
||||||
|
let savedReg = @z
|
||||||
|
normal! `<v`>"zy
|
||||||
|
let res = ElmEval(substitute(getreg("z"), "\n", "\\\n", "g"))
|
||||||
|
let @z = savedReg
|
||||||
|
normal! gv
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! ElmEval(sourceCode)
|
||||||
|
let currentLine = a:sourceCode
|
||||||
|
let args = "echo '" . currentLine . "' | elm-repl"
|
||||||
|
let result = elm#io#system("echo", args)
|
||||||
|
let cleanResult = "-- " . join(s:Filtered(function("s:IsUsefulReplOutput"), split(result, "\n")), "")
|
||||||
|
put =cleanResult
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:IsUsefulReplOutput(str)
|
||||||
|
return a:str !~ "^Elm REPL" && a:str !~ "Type :help" && a:str !~ ">\\s*$"
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" List processing
|
||||||
|
|
||||||
|
function! s:Filtered(fn, l)
|
||||||
|
let new_list = deepcopy(a:l)
|
||||||
|
call filter(new_list, string(a:fn) . '(v:val)')
|
||||||
|
return new_list
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
command -buffer ElmEvalLine call ElmEvalLine()
|
||||||
|
command -buffer ElmEvalSelection call ElmEvalSelection()
|
||||||
|
command -buffer ElmMakeMain call ElmMakeMain()
|
||||||
|
command -buffer -nargs=1 ElmMakeFile call ElmMakeFile <args>
|
||||||
|
command -buffer ElmMakeCurrentFile call ElmMakeCurrentFile()
|
||||||
|
command -buffer ElmRepl call ElmRepl()
|
||||||
|
|
||||||
|
" Define comment convention
|
||||||
|
|
||||||
|
setlocal comments=:--
|
||||||
|
setlocal commentstring=--%s
|
||||||
|
|
||||||
|
endif
|
||||||
@@ -1,11 +1,11 @@
|
|||||||
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'emberscript') == -1
|
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'emberscript') == -1
|
||||||
|
|
||||||
" Language: ember-script
|
" Language: ember-script
|
||||||
" Maintainer: heartsentwined <heartsentwined@cogito-lab.com>
|
" Maintainer: Yulij Andreevich Lesov <yalesov@gmail.com>>
|
||||||
" URL: http://github.com/heartsentwined/vim-ember-script
|
" URL: http://github.com/yalesov/vim-ember-script
|
||||||
" Version: 1.0.1
|
" Version: 1.0.4
|
||||||
" Last Change: 2013 Apr 17
|
" Last Change: 2016 Jul 6
|
||||||
" License: GPL-3.0
|
" License: ISC
|
||||||
|
|
||||||
setlocal tabstop=2
|
setlocal tabstop=2
|
||||||
setlocal softtabstop=2
|
setlocal softtabstop=2
|
||||||
@@ -14,7 +14,11 @@ setlocal smarttab
|
|||||||
setlocal expandtab
|
setlocal expandtab
|
||||||
setlocal smartindent
|
setlocal smartindent
|
||||||
|
|
||||||
setlocal formatoptions-=t formatoptions+=croqlj
|
if v:version < 703
|
||||||
|
setlocal formatoptions-=t formatoptions+=croql
|
||||||
|
else
|
||||||
|
setlocal formatoptions-=t formatoptions+=croqlj
|
||||||
|
endif
|
||||||
setlocal comments=:#
|
setlocal comments=:#
|
||||||
setlocal commentstring=#\ %s
|
setlocal commentstring=#\ %s
|
||||||
|
|
||||||
|
|||||||
@@ -1,11 +1,11 @@
|
|||||||
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'emblem') == -1
|
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'emblem') == -1
|
||||||
|
|
||||||
" Language: emblem
|
" Language: emblem
|
||||||
" Maintainer: heartsentwined <heartsentwined@cogito-lab.com>
|
" Maintainer: Yulij Andreevich Lesov <yalesov@gmail.com>
|
||||||
" URL: http://github.com/heartsentwined/vim-emblem
|
" URL: http://github.com/yalesov/vim-emblem
|
||||||
" Version: 1.2.0
|
" Version: 2.0.1
|
||||||
" Last Change: 2013 Apr 22
|
" Last Change: 2016 Jul 6
|
||||||
" License: GPL-3.0
|
" License: ISC
|
||||||
|
|
||||||
setlocal tabstop=2
|
setlocal tabstop=2
|
||||||
setlocal softtabstop=2
|
setlocal softtabstop=2
|
||||||
|
|||||||
43
ftplugin/fish.vim
Normal file
43
ftplugin/fish.vim
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'fish') == -1
|
||||||
|
|
||||||
|
setlocal comments=:#
|
||||||
|
setlocal commentstring=#%s
|
||||||
|
setlocal define=\\v^\\s*function>
|
||||||
|
setlocal foldexpr=fish#Fold()
|
||||||
|
setlocal formatoptions+=ron1
|
||||||
|
setlocal formatoptions-=t
|
||||||
|
setlocal include=\\v^\\s*\\.>
|
||||||
|
setlocal iskeyword=@,48-57,-,_,.,/
|
||||||
|
setlocal suffixesadd^=.fish
|
||||||
|
|
||||||
|
" Use the 'j' format option when available.
|
||||||
|
if v:version ># 703 || v:version ==# 703 && has('patch541')
|
||||||
|
setlocal formatoptions+=j
|
||||||
|
endif
|
||||||
|
|
||||||
|
if executable('fish_indent')
|
||||||
|
setlocal formatexpr=fish#Format()
|
||||||
|
endif
|
||||||
|
|
||||||
|
if executable('fish')
|
||||||
|
setlocal omnifunc=fish#Complete
|
||||||
|
for s:path in split(system("fish -c 'echo $fish_function_path'"))
|
||||||
|
execute 'setlocal path+='.s:path
|
||||||
|
endfor
|
||||||
|
else
|
||||||
|
setlocal omnifunc=syntaxcomplete#Complete
|
||||||
|
endif
|
||||||
|
|
||||||
|
" Use the 'man' wrapper function in fish to include fish's man pages.
|
||||||
|
" Have to use a script for this; 'fish -c man' would make the the man page an
|
||||||
|
" argument to fish instead of man.
|
||||||
|
execute 'setlocal keywordprg=fish\ '.expand('<sfile>:p:h:h').'/bin/man.fish'
|
||||||
|
|
||||||
|
let b:match_words =
|
||||||
|
\ escape('<%(begin|function|if|switch|while|for)>:<end>', '<>%|)')
|
||||||
|
|
||||||
|
let b:endwise_addition = 'end'
|
||||||
|
let b:endwise_words = 'begin,function,if,switch,while,for'
|
||||||
|
let b:endwise_syngroups = 'fishKeyword,fishConditional,fishRepeat'
|
||||||
|
|
||||||
|
endif
|
||||||
@@ -3,6 +3,7 @@ if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'git') == -1
|
|||||||
" Vim filetype plugin
|
" Vim filetype plugin
|
||||||
" Language: generic git output
|
" Language: generic git output
|
||||||
" Maintainer: Tim Pope <vimNOSPAM@tpope.org>
|
" Maintainer: Tim Pope <vimNOSPAM@tpope.org>
|
||||||
|
" Last Change: 2013 May 30
|
||||||
|
|
||||||
" Only do this when not done yet for this buffer
|
" Only do this when not done yet for this buffer
|
||||||
if (exists("b:did_ftplugin"))
|
if (exists("b:did_ftplugin"))
|
||||||
@@ -13,6 +14,8 @@ let b:did_ftplugin = 1
|
|||||||
if !exists('b:git_dir')
|
if !exists('b:git_dir')
|
||||||
if expand('%:p') =~# '[\/]\.git[\/]modules[\/]'
|
if expand('%:p') =~# '[\/]\.git[\/]modules[\/]'
|
||||||
" Stay out of the way
|
" Stay out of the way
|
||||||
|
elseif expand('%:p') =~# '[\/]\.git[\/]worktrees'
|
||||||
|
let b:git_dir = matchstr(expand('%:p'),'.*\.git[\/]worktrees[\/][^\/]\+\>')
|
||||||
elseif expand('%:p') =~# '\.git\>'
|
elseif expand('%:p') =~# '\.git\>'
|
||||||
let b:git_dir = matchstr(expand('%:p'),'.*\.git\>')
|
let b:git_dir = matchstr(expand('%:p'),'.*\.git\>')
|
||||||
elseif $GIT_DIR != ''
|
elseif $GIT_DIR != ''
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'git') == -1
|
|||||||
" Vim filetype plugin
|
" Vim filetype plugin
|
||||||
" Language: git commit file
|
" Language: git commit file
|
||||||
" Maintainer: Tim Pope <vimNOSPAM@tpope.org>
|
" Maintainer: Tim Pope <vimNOSPAM@tpope.org>
|
||||||
" Last Change: 2012 April 7
|
" Last Change: 2013 May 30
|
||||||
|
|
||||||
" Only do this when not done yet for this buffer
|
" Only do this when not done yet for this buffer
|
||||||
if (exists("b:did_ftplugin"))
|
if (exists("b:did_ftplugin"))
|
||||||
@@ -13,8 +13,10 @@ endif
|
|||||||
runtime! ftplugin/git.vim
|
runtime! ftplugin/git.vim
|
||||||
let b:did_ftplugin = 1
|
let b:did_ftplugin = 1
|
||||||
|
|
||||||
setlocal nomodeline tabstop=8 formatoptions-=croq formatoptions+=tl textwidth=72
|
setlocal comments=:# commentstring=#\ %s
|
||||||
let b:undo_ftplugin = 'setl modeline< tabstop< formatoptions< tw<'
|
setlocal nomodeline tabstop=8 formatoptions+=tl textwidth=72
|
||||||
|
setlocal formatoptions-=c formatoptions-=r formatoptions-=o formatoptions-=q
|
||||||
|
let b:undo_ftplugin = 'setl modeline< tabstop< formatoptions< tw< com< cms<'
|
||||||
|
|
||||||
if exists("g:no_gitcommit_commands") || v:version < 700
|
if exists("g:no_gitcommit_commands") || v:version < 700
|
||||||
finish
|
finish
|
||||||
@@ -26,6 +28,8 @@ endif
|
|||||||
|
|
||||||
command! -bang -bar -buffer -complete=custom,s:diffcomplete -nargs=* DiffGitCached :call s:gitdiffcached(<bang>0,b:git_dir,<f-args>)
|
command! -bang -bar -buffer -complete=custom,s:diffcomplete -nargs=* DiffGitCached :call s:gitdiffcached(<bang>0,b:git_dir,<f-args>)
|
||||||
|
|
||||||
|
let b:undo_ftplugin = b:undo_ftplugin . "|delc DiffGitCached"
|
||||||
|
|
||||||
function! s:diffcomplete(A,L,P)
|
function! s:diffcomplete(A,L,P)
|
||||||
let args = ""
|
let args = ""
|
||||||
if a:P <= match(a:L." -- "," -- ")+3
|
if a:P <= match(a:L." -- "," -- ")+3
|
||||||
|
|||||||
@@ -14,10 +14,11 @@ runtime! ftplugin/git.vim
|
|||||||
let b:did_ftplugin = 1
|
let b:did_ftplugin = 1
|
||||||
|
|
||||||
setlocal comments=:# commentstring=#\ %s formatoptions-=t
|
setlocal comments=:# commentstring=#\ %s formatoptions-=t
|
||||||
|
setlocal nomodeline
|
||||||
if !exists("b:undo_ftplugin")
|
if !exists("b:undo_ftplugin")
|
||||||
let b:undo_ftplugin = ""
|
let b:undo_ftplugin = ""
|
||||||
endif
|
endif
|
||||||
let b:undo_ftplugin = b:undo_ftplugin."|setl com< cms< fo<"
|
let b:undo_ftplugin = b:undo_ftplugin."|setl com< cms< fo< ml<"
|
||||||
|
|
||||||
function! s:choose(word)
|
function! s:choose(word)
|
||||||
s/^\(\w\+\>\)\=\(\s*\)\ze\x\{4,40\}\>/\=(strlen(submatch(1)) == 1 ? a:word[0] : a:word) . substitute(submatch(2),'^$',' ','')/e
|
s/^\(\w\+\>\)\=\(\s*\)\ze\x\{4,40\}\>/\=(strlen(submatch(1)) == 1 ? a:word[0] : a:word) . substitute(submatch(2),'^$',' ','')/e
|
||||||
|
|||||||
17
ftplugin/graphql.vim
Normal file
17
ftplugin/graphql.vim
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'graphql') == -1
|
||||||
|
|
||||||
|
" Vim filetype plugin
|
||||||
|
" Language: GraphQL
|
||||||
|
" Maintainer: Jon Parise <jon@indelible.org>
|
||||||
|
|
||||||
|
if (exists("b:did_ftplugin"))
|
||||||
|
finish
|
||||||
|
endif
|
||||||
|
let b:did_ftplugin = 1
|
||||||
|
|
||||||
|
setlocal comments=:#
|
||||||
|
setlocal commentstring=#\ %s
|
||||||
|
setlocal formatoptions-=t
|
||||||
|
setlocal iskeyword+=$,@-@
|
||||||
|
|
||||||
|
endif
|
||||||
@@ -6,20 +6,15 @@ endif
|
|||||||
|
|
||||||
let g:loaded_haskellvim_haskell = 1
|
let g:loaded_haskellvim_haskell = 1
|
||||||
|
|
||||||
function! haskell#makeModuleCommentBlock()
|
function! haskell#sortImports(line1, line2)
|
||||||
let l:commenttmpl = [ '{-|',
|
exe a:line1 . "," . a:line2 . "sort /import\\s\\+\\(qualified\\s\\+\\)\\?/"
|
||||||
\ 'Module : ',
|
|
||||||
\ 'Description : ',
|
|
||||||
\ 'Copyright : ',
|
|
||||||
\ 'License : ',
|
|
||||||
\ 'Maintainer : ',
|
|
||||||
\ 'Stability : ',
|
|
||||||
\ 'Portability : ',
|
|
||||||
\ '-}']
|
|
||||||
|
|
||||||
exe "normal ggO" . join(l:commenttmpl, "\n")
|
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
command! -buffer -nargs=0 HaskellAddModuleComment call haskell#makeModuleCommentBlock()
|
function! haskell#formatImport(line1, line2)
|
||||||
|
exec a:line1 . ",". a:line2 . "s/import\\s\\+\\([A-Z].*\\)/import \\1"
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
command! -buffer -range HaskellSortImports call haskell#sortImports(<line1>, <line2>)
|
||||||
|
command! -buffer -range HaskellFormatImport call haskell#formatImport(<line1>, <line2>)
|
||||||
|
|
||||||
endif
|
endif
|
||||||
|
|||||||
@@ -8,4 +8,6 @@ if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'html5') == -1
|
|||||||
|
|
||||||
" setlocal iskeyword+=-
|
" setlocal iskeyword+=-
|
||||||
|
|
||||||
|
setlocal commentstring=<!--%s-->
|
||||||
|
|
||||||
endif
|
endif
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'javascript') == -1
|
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'i3') == -1
|
||||||
|
|
||||||
|
setlocal commentstring=#\ %s
|
||||||
|
|
||||||
endif
|
endif
|
||||||
42
ftplugin/json.vim
Normal file
42
ftplugin/json.vim
Normal 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
|
||||||
@@ -21,7 +21,7 @@ setlocal includeexpr=substitute(v:fname,'\\%(.*/\\\|^\\)\\zs','_','')
|
|||||||
setlocal omnifunc=csscomplete#CompleteCSS
|
setlocal omnifunc=csscomplete#CompleteCSS
|
||||||
setlocal suffixesadd=.less
|
setlocal suffixesadd=.less
|
||||||
setlocal comments=sO:*\ -,mO:*\ \ ,exO:*/,://
|
setlocal comments=sO:*\ -,mO:*\ \ ,exO:*/,://
|
||||||
setlocal fo=jcroql
|
setlocal fo=croql
|
||||||
|
|
||||||
let &l:include = '^\s*@import\s\+\%(url(\)\=["'']\='
|
let &l:include = '^\s*@import\s\+\%(url(\)\=["'']\='
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'javascript') == -1
|
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'coffee-script') == -1
|
||||||
|
|
||||||
syntax keyword javascriptGlobal Intl
|
runtime ftplugin/coffee.vim
|
||||||
|
|
||||||
endif
|
endif
|
||||||
208
ftplugin/ls.vim
Normal file
208
ftplugin/ls.vim
Normal 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
|
||||||
15
ftplugin/mako.vim
Normal file
15
ftplugin/mako.vim
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'mako') == -1
|
||||||
|
|
||||||
|
" Vim filetype plugin file
|
||||||
|
" Language: Mako
|
||||||
|
" Maintainer: Randy Stauner <randy@magnificent-tears.com>
|
||||||
|
" Last Change: 2014-02-07
|
||||||
|
" Version: 0.1
|
||||||
|
|
||||||
|
if exists("b:did_ftplugin") | finish | endif
|
||||||
|
let b:did_ftplugin = 1
|
||||||
|
|
||||||
|
setlocal comments=:##
|
||||||
|
setlocal commentstring=##%s
|
||||||
|
|
||||||
|
endif
|
||||||
@@ -1,54 +0,0 @@
|
|||||||
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'markdown') == -1
|
|
||||||
|
|
||||||
" Vim filetype plugin
|
|
||||||
" Language: Markdown
|
|
||||||
" Maintainer: Tim Pope <vimNOSPAM@tpope.org>
|
|
||||||
" Last Change: 2013 May 30
|
|
||||||
|
|
||||||
if exists("b:did_ftplugin")
|
|
||||||
finish
|
|
||||||
endif
|
|
||||||
|
|
||||||
runtime! ftplugin/html.vim ftplugin/html_*.vim ftplugin/html/*.vim
|
|
||||||
|
|
||||||
setlocal comments=fb:*,fb:-,fb:+,n:> commentstring=>\ %s
|
|
||||||
setlocal formatoptions+=tcqln formatoptions-=r formatoptions-=o
|
|
||||||
setlocal formatlistpat=^\\s*\\d\\+\\.\\s\\+\\\|^[-*+]\\s\\+\\\|^\\[^\\ze[^\\]]\\+\\]:
|
|
||||||
|
|
||||||
if exists('b:undo_ftplugin')
|
|
||||||
let b:undo_ftplugin .= "|setl cms< com< fo< flp<"
|
|
||||||
else
|
|
||||||
let b:undo_ftplugin = "setl cms< com< fo< flp<"
|
|
||||||
endif
|
|
||||||
|
|
||||||
function! MarkdownFold()
|
|
||||||
let line = getline(v:lnum)
|
|
||||||
|
|
||||||
" Regular headers
|
|
||||||
let depth = match(line, '\(^#\+\)\@<=\( .*$\)\@=')
|
|
||||||
if depth > 0
|
|
||||||
return ">" . depth
|
|
||||||
endif
|
|
||||||
|
|
||||||
" Setext style headings
|
|
||||||
let nextline = getline(v:lnum + 1)
|
|
||||||
if (line =~ '^.\+$') && (nextline =~ '^=\+$')
|
|
||||||
return ">1"
|
|
||||||
endif
|
|
||||||
|
|
||||||
if (line =~ '^.\+$') && (nextline =~ '^-\+$')
|
|
||||||
return ">2"
|
|
||||||
endif
|
|
||||||
|
|
||||||
return "="
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
if has("folding") && exists("g:markdown_folding")
|
|
||||||
setlocal foldexpr=MarkdownFold()
|
|
||||||
setlocal foldmethod=expr
|
|
||||||
let b:undo_ftplugin .= " foldexpr< foldmethod<"
|
|
||||||
endif
|
|
||||||
|
|
||||||
" vim:set sw=2:
|
|
||||||
|
|
||||||
endif
|
|
||||||
63
ftplugin/mma.vim
Normal file
63
ftplugin/mma.vim
Normal 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
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'javascript') == -1
|
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'nginx') == -1
|
||||||
|
|
||||||
syntax keyword javascriptGlobal Proxy
|
setlocal commentstring=#\ %s
|
||||||
|
|
||||||
endif
|
endif
|
||||||
17
ftplugin/nix.vim
Normal file
17
ftplugin/nix.vim
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'nix') == -1
|
||||||
|
|
||||||
|
if exists("b:did_ftplugin")
|
||||||
|
finish
|
||||||
|
endif
|
||||||
|
let b:did_ftplugin=1
|
||||||
|
|
||||||
|
setlocal comments=
|
||||||
|
setlocal commentstring=#\ %s
|
||||||
|
|
||||||
|
" Nixpkgs indent settings
|
||||||
|
setlocal tabstop=2
|
||||||
|
setlocal softtabstop=2
|
||||||
|
setlocal shiftwidth=2
|
||||||
|
setlocal expandtab
|
||||||
|
|
||||||
|
endif
|
||||||
10
ftplugin/objc.vim
Normal file
10
ftplugin/objc.vim
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'objc') == -1
|
||||||
|
|
||||||
|
" Use C++ style comment strings with commentary.vim
|
||||||
|
setl commentstring=//%s
|
||||||
|
|
||||||
|
" Search for include files inside frameworks (used for gf etc.)
|
||||||
|
setl includeexpr=substitute(v:fname,'\\([^/]\\+\\)/\\(.\\+\\)','/System/Library/Frameworks/\\1.framework/Headers/\\2','')
|
||||||
|
|
||||||
|
|
||||||
|
endif
|
||||||
@@ -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
|
|
||||||
37
ftplugin/plantuml.vim
Normal file
37
ftplugin/plantuml.vim
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'plantuml') == -1
|
||||||
|
|
||||||
|
if exists('b:loaded_plantuml_plugin')
|
||||||
|
finish
|
||||||
|
endif
|
||||||
|
let b:loaded_plantuml_plugin = 1
|
||||||
|
let s:cpo_save = &cpo
|
||||||
|
set cpo&vim
|
||||||
|
|
||||||
|
if !exists('g:plantuml_executable_script')
|
||||||
|
let g:plantuml_executable_script='plantuml'
|
||||||
|
endif
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
|
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
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user