mirror of
https://github.com/sheerun/vim-polyglot.git
synced 2025-11-08 11:33:52 -05:00
Compare commits
145 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
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 | ||
|
|
67fcbd2a86 | ||
|
|
c925c92217 | ||
|
|
852d25b307 | ||
|
|
4d8ff4eabc | ||
|
|
d6bc08610b | ||
|
|
c154d82557 | ||
|
|
cf1e53bc39 | ||
|
|
92ab75408d | ||
|
|
f977779693 | ||
|
|
4033ac02d0 | ||
|
|
9ab9275f66 | ||
|
|
1c80c4bb08 | ||
|
|
548653cafe | ||
|
|
ee6b1ea157 | ||
|
|
12db3dafc5 | ||
|
|
d1e95cbc98 | ||
|
|
7ffa793f19 | ||
|
|
4203435c48 | ||
|
|
271b63d717 | ||
|
|
acd7ce5950 | ||
|
|
f24fecc338 | ||
|
|
23913e0598 | ||
|
|
1c21231175 | ||
|
|
4541e98466 | ||
|
|
6cd2d5417d | ||
|
|
b7a30b1f1a | ||
|
|
6745c49110 | ||
|
|
1a97304cf6 | ||
|
|
d8eaa50aed | ||
|
|
8e26e6e963 | ||
|
|
676e9dd82e | ||
|
|
23af3f70da | ||
|
|
b79385fecc | ||
|
|
03dd22587a | ||
|
|
bbc6be1099 | ||
|
|
7f2e366334 | ||
|
|
04f868b94a | ||
|
|
4071c094c6 | ||
|
|
617b01a5b6 | ||
|
|
bd35da8e9c | ||
|
|
91da1ec2a5 | ||
|
|
964107c604 | ||
|
|
c0560d6199 | ||
|
|
15db2d7120 | ||
|
|
4935f02217 | ||
|
|
438d222b95 | ||
|
|
90b24287de |
1
.gitattributes
vendored
1
.gitattributes
vendored
@@ -1,6 +1,5 @@
|
||||
.gitignore export-ignore
|
||||
.gitattributes export-ignore
|
||||
build export-ignore
|
||||
README.md export-ignore
|
||||
/spec export-ignore
|
||||
Gemfile export-ignore
|
||||
|
||||
@@ -1,7 +1,11 @@
|
||||
language: ruby
|
||||
rvm:
|
||||
- 1.9.3
|
||||
before_install: sudo apt-get install vim-gtk
|
||||
sudo: false
|
||||
addons:
|
||||
apt:
|
||||
packages:
|
||||
- vim-gtk
|
||||
before_script:
|
||||
- "export DISPLAY=:99.0"
|
||||
- "sh -e /etc/init.d/xvfb start"
|
||||
|
||||
126
README.md
126
README.md
@@ -1,14 +1,14 @@
|
||||
# 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
|
||||
|
||||
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.
|
||||
|
||||
- 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 **won't affect your startup time**, as scripts are loaded only on demand\*.
|
||||
- It **installs and updates 70+ times faster** than 70+ packages it consist of.
|
||||
- Solid syntax and indentation support. Only the best language packs.
|
||||
- All unnecessary files are ignored (like enormous documentation from php support).
|
||||
- No support for esoteric languages, only most popular ones (modern too, like `slim`).
|
||||
@@ -18,69 +18,129 @@ A collection of language packs for Vim.
|
||||
|
||||
## 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.
|
||||
|
||||
Optionally download one of the [releases](https://github.com/sheerun/vim-polyglot/releases) and unpack it directly under `~/.vim` directory.
|
||||
|
||||
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
|
||||
|
||||
- [applescript](https://github.com/vim-scripts/applescript.vim) (syntax)
|
||||
- [ansible](https://github.com/pearofducks/ansible-vim) (syntax, indent, ftplugin, ftdetect)
|
||||
- [arduino](https://github.com/sudar/vim-arduino-syntax) (syntax, indent, ftdetect)
|
||||
- [blade](https://github.com/jwalton512/vim-blade) (syntax, indent, ftplugin, ftdetect)
|
||||
- [c++11](https://github.com/octol/vim-cpp-enhanced-highlight) (syntax)
|
||||
- [c/c++](https://github.com/vim-jp/cpp-vim) (syntax)
|
||||
- [c-extensions](https://github.com/kergoth/aftersyntaxc.vim) (syntax)
|
||||
- [c/c++](https://github.com/vim-jp/vim-cpp) (syntax)
|
||||
- [cjsx](https://github.com/mtscout6/vim-cjsx) (ftdetect, syntax, ftplugin)
|
||||
- [clojure](https://github.com/guns/vim-clojure-static) (syntax, indent, autoload, ftplugin, ftdetect)
|
||||
- [coffee-script](https://github.com/kchmck/vim-coffee-script) (syntax, indent, compiler, autoload, ftplugin, ftdetect)
|
||||
- [csv](https://github.com/chrisbra/csv.vim) (syntax, ftplugin, ftdetect)
|
||||
- [cryptol](https://github.com/victoredwardocallaghan/cryptol.vim) (syntax, compiler, ftplugin, ftdetect)
|
||||
- [crystal](https://github.com/rhysd/vim-crystal) (syntax, indent, autoload, ftplugin, ftdetect)
|
||||
- [cql](https://github.com/elubow/cql-vim) (syntax, ftdetect)
|
||||
- [css](https://github.com/JulesWang/css.vim) (syntax)
|
||||
- [cucumber](https://github.com/tpope/vim-cucumber) (syntax, indent, compiler, ftplugin, ftdetect)
|
||||
- [dart](https://github.com/dart-lang/dart-vim-plugin) (syntax, indent, autoload, ftplugin, ftdetect)
|
||||
- [dockerfile](https://github.com/honza/dockerfile.vim) (syntax, ftdetect)
|
||||
- [elixir](https://github.com/elixir-lang/vim-elixir) (syntax, indent, compiler, ftplugin, ftdetect)
|
||||
- [emberscript](https://github.com/heartsentwined/vim-ember-script) (syntax, indent, ftplugin, ftdetect)
|
||||
- [erlang](https://github.com/oscarh/vimerl) (syntax, indent, compiler, autoload, ftplugin)
|
||||
- [elixir](https://github.com/elixir-lang/vim-elixir) (syntax, indent, compiler, autoload, ftplugin, ftdetect)
|
||||
- [elm](https://github.com/lambdatoast/elm.vim) (syntax, indent, autoload, ftplugin, ftdetect)
|
||||
- [emberscript](https://github.com/yalesov/vim-ember-script) (syntax, indent, ftplugin, ftdetect)
|
||||
- [emblem](https://github.com/yalesov/vim-emblem) (syntax, indent, ftplugin, ftdetect)
|
||||
- [erlang](https://github.com/vim-erlang/vim-erlang-runtime) (syntax, indent, ftdetect)
|
||||
- [fish](https://github.com/dag/vim-fish) (syntax, indent, compiler, autoload, ftplugin, ftdetect)
|
||||
- [git](https://github.com/tpope/vim-git) (syntax, indent, ftplugin, ftdetect)
|
||||
- [go](https://github.com/jnwhiteh/vim-golang) (syntax, indent, compiler, autoload, ftplugin, ftdetect)
|
||||
- [haml](https://github.com/tpope/vim-haml) (syntax, indent, compiler, ftplugin, ftdetect)
|
||||
- [handlebars](https://github.com/mustache/vim-mustache-handlebars) (syntax, ftplugin, ftdetect)
|
||||
- [haskell](https://github.com/travitch/hasksyn) (syntax, indent, ftplugin)
|
||||
- [glsl](https://github.com/tikhomirov/vim-glsl) (syntax, indent, ftdetect)
|
||||
- [go](https://github.com/fatih/vim-go) (syntax, compiler, indent, ftdetect)
|
||||
- [groovy](https://github.com/vim-scripts/groovy.vim) (syntax)
|
||||
- [haml](https://github.com/sheerun/vim-haml) (syntax, indent, compiler, ftplugin, ftdetect)
|
||||
- [handlebars](https://github.com/mustache/vim-mustache-handlebars) (syntax, indent, ftplugin, ftdetect)
|
||||
- [haskell](https://github.com/neovimhaskell/haskell-vim) (syntax, indent, ftplugin, ftdetect)
|
||||
- [haxe](https://github.com/yaymukund/vim-haxe) (syntax, ftdetect)
|
||||
- [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, ftdetect)
|
||||
- [jasmine](https://github.com/glanotte/vim-jasmine) (syntax, ftdetect)
|
||||
- [javascript](https://github.com/pangloss/vim-javascript) (syntax, indent, ftdetect)
|
||||
- [json](https://github.com/leshill/vim-json) (syntax, ftdetect)
|
||||
- [javascript](https://github.com/pangloss/vim-javascript) (syntax, indent, compiler, ftdetect, ftplugin, extras)
|
||||
- [json](https://github.com/elzr/vim-json) (syntax, indent, ftplugin, ftdetect)
|
||||
- [jst](https://github.com/briancollins/vim-jst) (syntax, indent, ftdetect)
|
||||
- [jsx](https://github.com/mxw/vim-jsx) (ftdetect, after)
|
||||
- [julia](https://github.com/dcjones/julia-minimalist-vim) (syntax, indent, ftdetect)
|
||||
- [kotlin](https://github.com/udalov/kotlin-vim) (syntax, indent, ftdetect)
|
||||
- [latex](https://github.com/LaTeX-Box-Team/LaTeX-Box) (syntax, indent, ftplugin)
|
||||
- [less](https://github.com/groenewege/vim-less) (syntax, indent, ftplugin, ftdetect)
|
||||
- [liquid](https://github.com/tpope/vim-liquid) (syntax, indent, ftplugin, ftdetect)
|
||||
- [markdown](https://github.com/tpope/vim-markdown) (syntax, ftplugin, ftdetect)
|
||||
- [nginx](https://github.com/mutewinter/nginx.vim) (syntax, ftdetect)
|
||||
- [livescript](https://github.com/gkz/vim-ls) (syntax, indent, compiler, ftplugin, ftdetect)
|
||||
- [lua](https://github.com/tbastos/vim-lua) (syntax, indent)
|
||||
- [mako](https://github.com/sophacles/vim-bundle-mako) (syntax, indent, ftplugin, ftdetect)
|
||||
- [markdown](https://github.com/plasticboy/vim-markdown) (syntax, ftdetect)
|
||||
- [nginx](https://github.com/othree/nginx-contrib-vim) (syntax, indent, ftplugin, ftdetect)
|
||||
- [nim](https://github.com/zah/nim.vim) (syntax, compiler, indent, ftdetect)
|
||||
- [nix](https://github.com/spwhitt/vim-nix) (syntax, ftplugin, ftdetect)
|
||||
- [objc](https://github.com/b4winckler/vim-objc) (ftplugin, syntax, indent)
|
||||
- [ocaml](https://github.com/jrk/vim-ocaml) (syntax, indent, ftplugin)
|
||||
- [octave](https://github.com/vim-scripts/octave.vim--) (syntax)
|
||||
- [opencl](https://github.com/petRUShka/vim-opencl) (syntax, indent, ftplugin, ftdetect)
|
||||
- [perl](https://github.com/vim-perl/vim-perl) (syntax, indent, ftplugin, ftdetect)
|
||||
- [pgsql](https://github.com/exu/pgsql.vim) (syntax, ftdetect)
|
||||
- [php](https://github.com/StanAngeloff/php.vim) (syntax)
|
||||
- [puppet](https://github.com/rodjek/vim-puppet) (syntax, indent, ftplugin, ftdetect)
|
||||
- [protobuf](https://github.com/uarun/vim-protobuf) (syntax, ftdetect)
|
||||
- [plantuml](https://github.com/aklt/plantuml-syntax) (syntax, indent, ftplugin, ftdetect)
|
||||
- [powershell](https://github.com/PProvost/vim-ps1) (syntax, indent, ftplugin, ftdetect)
|
||||
- [protobuf](https://github.com/uarun/vim-protobuf) (syntax, indent, ftdetect)
|
||||
- [pug](https://github.com/digitaltoad/vim-pug) (syntax, indent, ftplugin, ftdetect)
|
||||
- [puppet](https://github.com/voxpupuli/vim-puppet) (syntax, indent, ftplugin, ftdetect)
|
||||
- [purescript](https://github.com/raichoo/purescript-vim) (syntax, indent, ftplugin, ftdetect)
|
||||
- [python](https://github.com/mitsuhiko/vim-python-combined) (syntax, indent)
|
||||
- [python-compiler](https://github.com/aliev/vim-compiler-python) (compiler, autoload, ftdetect)
|
||||
- [qml](https://github.com/peterhoeg/vim-qml) (syntax, indent, ftplugin, ftdetect)
|
||||
- [r-lang](https://github.com/vim-scripts/R.vim) (syntax, ftplugin)
|
||||
- [raml](https://github.com/IN3D/vim-raml) (syntax, ftplugin, ftdetect)
|
||||
- [ragel](https://github.com/jneen/ragel.vim) (syntax)
|
||||
- [rspec](https://github.com/sheerun/rspec.vim) (syntax, ftdetect)
|
||||
- [ruby](https://github.com/vim-ruby/vim-ruby) (syntax, indent, compiler, autoload, ftplugin, ftdetect)
|
||||
- [rust](https://github.com/wting/rust.vim) (syntax, indent, compiler, ftplugin, ftdetect)
|
||||
- [rust](https://github.com/rust-lang/rust.vim) (syntax, indent, compiler, autoload, ftplugin, ftdetect)
|
||||
- [sbt](https://github.com/derekwyatt/vim-sbt) (syntax, ftdetect)
|
||||
- [scala](https://github.com/derekwyatt/vim-scala) (syntax, indent, ftplugin, ftdetect)
|
||||
- [slim](https://github.com/slim-template/vim-slim) (syntax, indent, ftdetect)
|
||||
- [scala](https://github.com/derekwyatt/vim-scala) (syntax, indent, compiler, ftplugin, ftdetect)
|
||||
- [scss](https://github.com/cakebaker/scss-syntax.vim) (syntax, autoload, ftplugin, ftdetect)
|
||||
- [slim](https://github.com/slim-template/vim-slim) (syntax, indent, ftplugin, ftdetect)
|
||||
- [solidity](https://github.com/ethereum/vim-solidity) (syntax, indent, ftdetect)
|
||||
- [stylus](https://github.com/wavded/vim-stylus) (syntax, indent, ftplugin, ftdetect)
|
||||
- [swift](https://github.com/keith/swift.vim) (syntax, indent, ftplugin, ftdetect)
|
||||
- [systemd](https://github.com/kurayama/systemd-vim-syntax) (syntax, ftdetect)
|
||||
- [terraform](https://github.com/hashivim/vim-terraform) (syntax, indent, ftdetect, ftplugin)
|
||||
- [textile](https://github.com/timcharper/textile.vim) (syntax, ftplugin, ftdetect)
|
||||
- [tmux](https://github.com/acustodioo/vim-tmux) (syntax, ftdetect)
|
||||
- [tomdoc](https://github.com/duwanis/tomdoc.vim) (syntax)
|
||||
- [typescript](https://github.com/leafgarland/typescript-vim) (syntax, compiler, ftplugin, ftdetect)
|
||||
- [thrift](https://github.com/solarnz/thrift.vim) (syntax, ftdetect)
|
||||
- [tmux](https://github.com/keith/tmux.vim) (syntax, ftplugin, ftdetect)
|
||||
- [tomdoc](https://github.com/wellbredgrapefruit/tomdoc.vim) (syntax)
|
||||
- [toml](https://github.com/cespare/vim-toml) (syntax, ftplugin, ftdetect)
|
||||
- [twig](https://github.com/lumiliet/vim-twig) (syntax, indent, ftplugin)
|
||||
- [typescript](https://github.com/leafgarland/typescript-vim) (syntax, indent, compiler, ftplugin, ftdetect)
|
||||
- [vala](https://github.com/arrufat/vala.vim) (syntax, indent, ftdetect)
|
||||
- [vbnet](https://github.com/vim-scripts/vbnet.vim) (syntax)
|
||||
- [toml](https://github.com/cespare/vim-toml) (syntax, ftdetect)
|
||||
- [twig](https://github.com/beyondwords/vim-twig) (syntax, ftplugin, ftdetect)
|
||||
- [vcl](https://github.com/smerrill/vcl-vim-plugin) (syntax, ftdetect)
|
||||
- [vue](https://github.com/posva/vim-vue) (syntax, indent, ftplugin, ftdetect)
|
||||
- [vm](https://github.com/lepture/vim-velocity) (syntax, indent, ftdetect)
|
||||
- [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)
|
||||
- [css-color](https://github.com/ap/vim-css-color) (autoload, syntax)
|
||||
|
||||
## Updating
|
||||
|
||||
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
|
||||
" ~/.vimrc
|
||||
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.
|
||||
|
||||
## Contributing
|
||||
|
||||
@@ -91,7 +151,3 @@ Feel free to add your language, and send pull-request.
|
||||
## License
|
||||
|
||||
See linked repositories for detailed license information.
|
||||
|
||||
|
||||
[](https://bitdeli.com/free "Bitdeli Badge")
|
||||
|
||||
|
||||
@@ -1,2 +1,6 @@
|
||||
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'rspec') == -1
|
||||
|
||||
autocmd BufReadPost,BufNewFile *_spec.rb set syntax=rspec
|
||||
autocmd BufReadPost,BufNewFile *_spec.rb setlocal commentstring=#\ %s
|
||||
|
||||
endif
|
||||
|
||||
7
after/ftplugin/cabal.vim
Normal file
7
after/ftplugin/cabal.vim
Normal file
@@ -0,0 +1,7 @@
|
||||
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'haskell') == -1
|
||||
|
||||
setlocal comments=s1fl:{-,mb:-,ex:-},:--
|
||||
setlocal iskeyword+=-,.,*
|
||||
setlocal commentstring=--\ %s
|
||||
|
||||
endif
|
||||
9
after/ftplugin/coffee.vim
Normal file
9
after/ftplugin/coffee.vim
Normal file
@@ -0,0 +1,9 @@
|
||||
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'cjsx') == -1
|
||||
|
||||
if exists("loaded_matchit")
|
||||
let b:match_ignorecase = 0
|
||||
let b:match_words = '(:),\[:\],{:},<:>,' .
|
||||
\ '<\@<=\([^/][^ \t>]*\)[^>]*\%(>\|$\):<\@<=/\1>'
|
||||
endif
|
||||
|
||||
endif
|
||||
@@ -1,9 +1,6 @@
|
||||
" Vim ftplugin file
|
||||
" Language: Haskell
|
||||
" Maintainer: Tristan Ravitch
|
||||
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'haskell') == -1
|
||||
|
||||
setlocal comments=s1fl:{-,mb:\ \ ,ex:-},:--
|
||||
setlocal iskeyword+='
|
||||
|
||||
" I don't fully understand what the vim-default ftplugin does, but I do know
|
||||
" that the three-part comment entry really messes up this indenter (I also
|
||||
" hate the leading '-'s it puts in on each line). Disable it here.
|
||||
setlocal comments&
|
||||
setlocal comments=:--
|
||||
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
|
||||
20
after/ftplugin/jsx.vim
Normal file
20
after/ftplugin/jsx.vim
Normal file
@@ -0,0 +1,20 @@
|
||||
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'jsx') == -1
|
||||
|
||||
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
|
||||
" Vim ftplugin file
|
||||
"
|
||||
" Language: JSX (JavaScript)
|
||||
" Maintainer: Max Wang <mxawng@gmail.com>
|
||||
"
|
||||
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
|
||||
|
||||
" modified from html.vim
|
||||
if exists("loaded_matchit")
|
||||
let b:match_ignorecase = 0
|
||||
let b:match_words = '(:),\[:\],{:},<:>,' .
|
||||
\ '<\@<=\([^/][^ \t>]*\)[^>]*\%(>\|$\):<\@<=/\1>'
|
||||
endif
|
||||
|
||||
setlocal suffixesadd+=.jsx
|
||||
|
||||
endif
|
||||
@@ -1,11 +1,20 @@
|
||||
inoremap <buffer> <silent> > ><Esc>:call <SID>puppetalign()<CR>A
|
||||
function! s:puppetalign()
|
||||
let p = '^\s*\w+\s*[=+]>.*$'
|
||||
let lineContainsHashrocket = getline('.') =~# '^\s*\w+\s*[=+]>'
|
||||
let hashrocketOnPrevLine = getline(line('.') - 1) =~# p
|
||||
let hashrocketOnNextLine = getline(line('.') + 1) =~# p
|
||||
if exists(':Tabularize') " && lineContainsHashrocket && (hashrocketOnPrevLine || hashrocketOnNextLine)
|
||||
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'puppet') == -1
|
||||
|
||||
if !exists('g:puppet_align_hashes')
|
||||
let g:puppet_align_hashes = 1
|
||||
endif
|
||||
|
||||
if g:puppet_align_hashes && exists(':Tabularize')
|
||||
inoremap <buffer> <silent> > ><Esc>:call <SID>puppetalign()<CR>a
|
||||
function! s:puppetalign()
|
||||
let p = '^\s*\w+\s*[=+]>.*$'
|
||||
let column = strlen(substitute(getline('.')[0:col('.')],'\([^=]\|=[^>]\)','','g'))
|
||||
let position = strlen(matchstr(getline('.')[0:col('.')],'.*=>\s*\zs.*'))
|
||||
Tabularize /=>/l1
|
||||
normal! 0
|
||||
endif
|
||||
endfunction
|
||||
echo repeat('\([^=]\|=[^>]\)*=>',column).'\s\{-\}'.repeat('.',position)
|
||||
call search(repeat('\([^=]\|=[^>]\)*=>',column).'\s\{-\}'.repeat('.',position),'ce',line('.'))
|
||||
endfunction
|
||||
endif
|
||||
|
||||
endif
|
||||
|
||||
21
after/ftplugin/terraform.vim
Normal file
21
after/ftplugin/terraform.vim
Normal file
@@ -0,0 +1,21 @@
|
||||
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
|
||||
|
||||
endif
|
||||
5
after/ftplugin/vue.vim
Normal file
5
after/ftplugin/vue.vim
Normal file
@@ -0,0 +1,5 @@
|
||||
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'vue') == -1
|
||||
|
||||
setlocal suffixesadd+=.vue
|
||||
|
||||
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
|
||||
@@ -1,5 +1,7 @@
|
||||
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'coffee-script') == -1
|
||||
|
||||
" Language: CoffeeScript
|
||||
" Maintainer: Mick Koch <kchmck@gmail.com>
|
||||
" Maintainer: Mick Koch <mick@kochm.co>
|
||||
" URL: http://github.com/kchmck/vim-coffee-script
|
||||
" License: WTFPL
|
||||
|
||||
@@ -18,7 +20,7 @@ setlocal indentexpr=GetCoffeeHtmlIndent(v:lnum)
|
||||
|
||||
function! GetCoffeeHtmlIndent(curlinenum)
|
||||
" See if we're inside a coffeescript block.
|
||||
let scriptlnum = searchpair('<script [^>]*type="text/coffeescript"[^>]*>', '',
|
||||
let scriptlnum = searchpair('<script [^>]*type=[''"]\?text/coffeescript[''"]\?[^>]*>', '',
|
||||
\ '</script>', 'bWn')
|
||||
let prevlnum = prevnonblank(a:curlinenum)
|
||||
|
||||
@@ -31,3 +33,5 @@ function! GetCoffeeHtmlIndent(curlinenum)
|
||||
" Otherwise use html indenting.
|
||||
exec 'return ' s:htmlIndentExpr
|
||||
endfunction
|
||||
|
||||
endif
|
||||
|
||||
118
after/indent/jsx.vim
Normal file
118
after/indent/jsx.vim
Normal file
@@ -0,0 +1,118 @@
|
||||
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'jsx') == -1
|
||||
|
||||
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
|
||||
" Vim indent file
|
||||
"
|
||||
" Language: JSX (JavaScript)
|
||||
" Maintainer: Max Wang <mxawng@gmail.com>
|
||||
"
|
||||
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
|
||||
|
||||
" Save the current JavaScript indentexpr.
|
||||
let b:jsx_js_indentexpr = &indentexpr
|
||||
|
||||
" Prologue; load in XML indentation.
|
||||
if exists('b:did_indent')
|
||||
let s:did_indent=b:did_indent
|
||||
unlet b:did_indent
|
||||
endif
|
||||
exe 'runtime! indent/xml.vim'
|
||||
if exists('s:did_indent')
|
||||
let b:did_indent=s:did_indent
|
||||
endif
|
||||
|
||||
setlocal indentexpr=GetJsxIndent()
|
||||
|
||||
" JS indentkeys
|
||||
setlocal indentkeys=0{,0},0),0],0\,,!^F,o,O,e
|
||||
" XML indentkeys
|
||||
setlocal indentkeys+=*<Return>,<>>,<<>,/
|
||||
|
||||
" Multiline end tag regex (line beginning with '>' or '/>')
|
||||
let s:endtag = '^\s*\/\?>\s*;\='
|
||||
|
||||
" Get all syntax types at the beginning of a given line.
|
||||
fu! SynSOL(lnum)
|
||||
return map(synstack(a:lnum, 1), 'synIDattr(v:val, "name")')
|
||||
endfu
|
||||
|
||||
" Get all syntax types at the end of a given line.
|
||||
fu! SynEOL(lnum)
|
||||
let lnum = prevnonblank(a:lnum)
|
||||
let col = strlen(getline(lnum))
|
||||
return map(synstack(lnum, col), 'synIDattr(v:val, "name")')
|
||||
endfu
|
||||
|
||||
" Check if a syntax attribute is XMLish.
|
||||
fu! SynAttrXMLish(synattr)
|
||||
return a:synattr =~ "^xml" || a:synattr =~ "^jsx"
|
||||
endfu
|
||||
|
||||
" Check if a synstack is XMLish (i.e., has an XMLish last attribute).
|
||||
fu! SynXMLish(syns)
|
||||
return SynAttrXMLish(get(a:syns, -1))
|
||||
endfu
|
||||
|
||||
" Check if a synstack denotes the end of a JSX block.
|
||||
fu! SynJSXBlockEnd(syns)
|
||||
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
|
||||
|
||||
" Cleverly mix JS and XML indentation.
|
||||
fu! GetJsxIndent()
|
||||
let cursyn = SynSOL(v:lnum)
|
||||
let prevsyn = SynEOL(v:lnum - 1)
|
||||
|
||||
" Use XML indenting iff:
|
||||
" - the syntax at the end of the previous line was either JSX or was the
|
||||
" 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)
|
||||
|
||||
" Align '/>' and '>' with '<' for multiline tags.
|
||||
if getline(v:lnum) =~? s:endtag
|
||||
let ind = ind - &sw
|
||||
endif
|
||||
|
||||
" Then correct the indentation of any JSX following '/>' or '>'.
|
||||
if getline(v:lnum - 1) =~? s:endtag
|
||||
let ind = ind + &sw
|
||||
endif
|
||||
else
|
||||
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
|
||||
|
||||
return ind
|
||||
endfu
|
||||
|
||||
endif
|
||||
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,19 +1,32 @@
|
||||
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'c++11') == -1
|
||||
|
||||
" Vim syntax file
|
||||
" Language: C Additions
|
||||
" Maintainer: Mikhail Wolfson <mywolfson@gmail.com>
|
||||
" URL: http://web.mit.edu/wolfsonm
|
||||
" Last Change: 2010 Dec. 3
|
||||
" Version: 0.4
|
||||
"
|
||||
" Language: C Additions
|
||||
" Maintainer: Jon Haggblad <jon@haeggblad.com>
|
||||
" Contributor: Mikhail Wolfson <mywolfson@gmail.com>
|
||||
" URL: http://www.haeggblad.com
|
||||
" Last Change: 6 Sep 2014
|
||||
" Version: 0.3
|
||||
" Changelog:
|
||||
" 0.4 - updates and fixes to cDelimiter to fix break with foldmethod=syntax,
|
||||
" entirely suggested and solved by Ivan Freitas
|
||||
" <ivansichfreitas@gmail.com>
|
||||
" 0.3 - updates and fixes to cUserFunctionPointer, thanks to
|
||||
" Alexei <lxmzhv@gmail.com>
|
||||
" 0.2 - change [] to operator
|
||||
" 0.1 - initial upload, modification from vimscript#1201, Extended c.vim
|
||||
" 0.3 - integration of aftersyntaxc.vim
|
||||
" 0.2 - Cleanup
|
||||
" 0.1 - initial version.
|
||||
"
|
||||
" Syntax highlighting for functions in C.
|
||||
"
|
||||
" Based on:
|
||||
" http://stackoverflow.com/questions/736701/class-function-names-highlighting-in-vim
|
||||
|
||||
" -----------------------------------------------------------------------------
|
||||
" Highlight function names.
|
||||
" -----------------------------------------------------------------------------
|
||||
syn match cCustomParen "(" contains=cParen contains=cCppParen
|
||||
syn match cCustomFunc "\w\+\s*(\@=" contains=cCustomParen
|
||||
hi def link cCustomFunc Function
|
||||
|
||||
" -----------------------------------------------------------------------------
|
||||
" Source: aftersyntaxc.vim
|
||||
" -----------------------------------------------------------------------------
|
||||
|
||||
" Common ANSI-standard functions
|
||||
syn keyword cAnsiFunction MULU_ DIVU_ MODU_ MUL_ DIV_ MOD_
|
||||
@@ -61,7 +74,8 @@ syn keyword cAnsiFunction wcstombs mbstowcs wctomb
|
||||
syn keyword cAnsiFunction mbtowc mblen lldiv
|
||||
syn keyword cAnsiFunction ldiv div llabs
|
||||
syn keyword cAnsiFunction labs abs qsort
|
||||
syn keyword cAnsiFunction bsearch system getenv
|
||||
"syn keyword cAnsiFunction bsearch system getenv
|
||||
syn keyword cAnsiFunction bsearch getenv
|
||||
syn keyword cAnsiFunction exit atexit abort
|
||||
syn keyword cAnsiFunction realloc malloc free
|
||||
syn keyword cAnsiFunction calloc srand rand
|
||||
@@ -238,42 +252,45 @@ syn keyword cAnsiName bitand not or_eq
|
||||
|
||||
hi def link cAnsiFunction cFunction
|
||||
hi def link cAnsiName cIdentifier
|
||||
|
||||
" Operators
|
||||
syn match cOperator "\(<<\|>>\|[-+*/%&^|<>!=]\)="
|
||||
syn match cOperator "<<\|>>\|&&\|||\|++\|--\|->"
|
||||
syn match cOperator "[.!~*&%<>^|=,+-]"
|
||||
syn match cOperator "/[^/*=]"me=e-1
|
||||
syn match cOperator "/$"
|
||||
syn match cOperator "&&\|||"
|
||||
syn match cOperator "[][]"
|
||||
|
||||
" Preprocs
|
||||
syn keyword cDefined defined contained containedin=cDefine
|
||||
hi def link cDefined cDefine
|
||||
|
||||
" Functions
|
||||
syn match cUserFunction "\<\h\w*\>\(\s\|\n\)*("me=e-1 contains=cType,cDelimiter,cDefine
|
||||
syn match cUserFunctionPointer "(\s*\*\s*\h\w*\s*)\(\s\|\n\)*(" contains=cDelimiter,cOperator
|
||||
|
||||
hi def link cUserFunction cFunction
|
||||
hi def link cUserFunctionPointer cFunction
|
||||
|
||||
" Delimiters
|
||||
syn match cDelimiter "[();\\]"
|
||||
" foldmethod=syntax fix, courtesy of Ivan Freitas
|
||||
syn match cBraces display "[{}]"
|
||||
|
||||
hi def link cFunction Function
|
||||
hi def link cIdentifier Identifier
|
||||
|
||||
" Booleans
|
||||
syn keyword cBoolean true false TRUE FALSE
|
||||
|
||||
|
||||
" Links
|
||||
hi def link cFunction Function
|
||||
hi def link cIdentifier Identifier
|
||||
hi def link cDelimiter Delimiter
|
||||
" foldmethod=syntax fix, courtesy of Ivan Freitas
|
||||
hi def link cBraces Delimiter
|
||||
hi def link cBoolean Boolean
|
||||
|
||||
" -----------------------------------------------------------------------------
|
||||
" Additional optional highlighting
|
||||
" -----------------------------------------------------------------------------
|
||||
|
||||
" Operators
|
||||
"syn match cOperator "\(<<\|>>\|[-+*/%&^|<>!=]\)="
|
||||
"syn match cOperator "<<\|>>\|&&\|||\|++\|--\|->"
|
||||
"syn match cOperator "[.!~*&%<>^|=,+-]"
|
||||
"syn match cOperator "/[^/*=]"me=e-1
|
||||
"syn match cOperator "/$"
|
||||
"syn match cOperator "&&\|||"
|
||||
"syn match cOperator "[][]"
|
||||
"
|
||||
"" Preprocs
|
||||
"syn keyword cDefined defined contained containedin=cDefine
|
||||
"hi def link cDefined cDefine
|
||||
|
||||
"" Functions
|
||||
"syn match cUserFunction "\<\h\w*\>\(\s\|\n\)*("me=e-1 contains=cType,cDelimiter,cDefine
|
||||
"syn match cUserFunctionPointer "(\s*\*\s*\h\w*\s*)\(\s\|\n\)*(" contains=cDelimiter,cOperator
|
||||
"
|
||||
"hi def link cUserFunction cFunction
|
||||
"hi def link cUserFunctionPointer cFunction
|
||||
"
|
||||
"" Delimiters
|
||||
"syn match cDelimiter "[();\\]"
|
||||
"" foldmethod=syntax fix, courtesy of Ivan Freitas
|
||||
"syn match cBraces display "[{}]"
|
||||
|
||||
" Links
|
||||
"hi def link cDelimiter Delimiter
|
||||
" foldmethod=syntax fix, courtesy of Ivan Freitas
|
||||
"hi def link cBraces Delimiter
|
||||
|
||||
endif
|
||||
|
||||
@@ -1,20 +1,31 @@
|
||||
" This file describes a very basic syntax for TomDoc comments in a
|
||||
" CoffeeScript file.
|
||||
"
|
||||
" For more information on TomDoc, check it out here: http://tomdoc.org/
|
||||
"
|
||||
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'cjsx') == -1
|
||||
|
||||
if exists('b:current_syntax')
|
||||
let s:current_syntax=b:current_syntax
|
||||
unlet b:current_syntax
|
||||
endif
|
||||
|
||||
syn keyword tomdocKeywords Returns containedin=coffeeComment contained
|
||||
syn keyword tomdocKeywords Throws containedin=coffeeComment contained
|
||||
syn keyword tomdocKeywords Examples containedin=coffeeComment contained
|
||||
syn keyword tomdocKeywords Signature containedin=coffeeComment contained
|
||||
if exists('s:current_syntax')
|
||||
let b:current_syntax=s:current_syntax
|
||||
endif
|
||||
|
||||
syn match tomdocArguments +\s*[A-Za-z0-9_\-&\*:]*\(\s*- \)+he=e-3 containedin=coffeeComment contained
|
||||
syn match cjsxEntity contained "&[^; \t]*;" contains=cjsxEntityPunct
|
||||
syn match cjsxEntityPunct contained "[&.;]"
|
||||
|
||||
syn match tomdocDescriptions +\s*Public:+he=e-1 containedin=coffeeComment contained
|
||||
syn match tomdocDescriptions +\s*Internal:+he=e-1 containedin=coffeeComment contained
|
||||
syn match tomdocDescriptions +\s*Deprecated:+he=e-1 containedin=coffeeComment contained
|
||||
syn match cjsxAttribProperty /[A-Za-z_][A-Za-z0-9_-]*/ contained
|
||||
syn region cjsxAttrib start=/\s[A-Za-z_][A-Za-z0-9_-]/hs=s+1 end=/=/ end=/\s[A-Za-z_]/me=e-2 end=+[/>]+me=e-1 contained contains=cjsxAttribProperty
|
||||
|
||||
hi default link tomdocDescriptions String
|
||||
hi default link tomdocKeywords String
|
||||
hi default link tomdocArguments HELP
|
||||
syn region cjsxBody start=+[^/]>+ms=s+2 start=/>/ms=s+1 end=+<\/+me=e-2 contained contains=cjsxElement,coffeeCurlies,cjsxEntity
|
||||
|
||||
syn region cjsxElement start=/<@\=[A-Za-z_][A-Za-z0-9-_\.]*/ end=/\/>/ end=/<\/@\=[A-Za-z_][A-Za-z0-9-_\.]*>/ contains=cjsxOpenTag,cjsxBody,coffeeCurlies,coffeeString,cjsxAttrib,coffeeNumber,coffeeFloat
|
||||
|
||||
syn cluster coffeeAll add=cjsxElement
|
||||
|
||||
" The default highlighting.
|
||||
hi def link cjsxElement Function
|
||||
hi def link cjsxTagName Function
|
||||
hi def link cjsxEntity Statement
|
||||
hi def link cjsxEntityPunct Type
|
||||
hi def link cjsxAttribProperty Type
|
||||
|
||||
endif
|
||||
|
||||
1589
after/syntax/cpp.vim
1589
after/syntax/cpp.vim
File diff suppressed because it is too large
Load Diff
@@ -1,6 +0,0 @@
|
||||
" Language: Colorful CSS Color Preview
|
||||
" Author: Aristotle Pagaltzis <pagaltzis@gmx.de>
|
||||
|
||||
if !( has('gui_running') || &t_Co==256 ) | finish | endif
|
||||
|
||||
call css_color#init('css', 'cssMediaBlock,cssFunction,cssDefinition,cssAttrRegion,cssComment')
|
||||
@@ -1,8 +1,15 @@
|
||||
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'coffee-script') == -1
|
||||
|
||||
" Language: CoffeeScript
|
||||
" Maintainer: Sven Felix Oberquelle <Svelix.Github@gmail.com>
|
||||
" URL: http://github.com/kchmck/vim-coffee-script
|
||||
" 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
|
||||
" priority than hamlInterpolation.
|
||||
syn cluster hamlCoffeescript contains=@htmlCoffeeScript
|
||||
@@ -11,3 +18,10 @@ syn region hamlCoffeescriptFilter matchgroup=hamlFilter
|
||||
\ end="^\%(\z1 \| *$\)\@!"
|
||||
\ contains=@hamlCoffeeScript,hamlInterpolation
|
||||
\ keepend
|
||||
|
||||
if exists('s:current_syntax_save')
|
||||
let b:current_syntax = s:current_syntax_save
|
||||
unlet s:current_syntax_save
|
||||
endif
|
||||
|
||||
endif
|
||||
|
||||
@@ -1,8 +1,18 @@
|
||||
let b:current_syntax = ''
|
||||
unlet b:current_syntax
|
||||
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'scala') == -1
|
||||
|
||||
" Extends standard help syntax with highlighting of Scala code.
|
||||
"
|
||||
" Place code between !sc! and !/sc! delimiters. These will be hidden if Vim is
|
||||
" built with conceal support.
|
||||
|
||||
unlet! b:current_syntax
|
||||
|
||||
syntax include @ScalaCode syntax/scala.vim
|
||||
|
||||
if has('conceal')
|
||||
syntax region rgnScala matchgroup=Ignore concealends start='!sc!' end='!/sc!' contains=@ScalaCode
|
||||
else
|
||||
syntax region rgnScala matchgroup=Ignore start='!sc!' end='!/sc!' contains=@ScalaCode
|
||||
endif
|
||||
|
||||
endif
|
||||
|
||||
@@ -1,18 +1,67 @@
|
||||
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'coffee-script') == -1
|
||||
|
||||
" Language: CoffeeScript
|
||||
" Maintainer: Mick Koch <kchmck@gmail.com>
|
||||
" Maintainer: Mick Koch <mick@kochm.co>
|
||||
" URL: http://github.com/kchmck/vim-coffee-script
|
||||
" License: WTFPL
|
||||
|
||||
if exists('b:current_syntax')
|
||||
let s:current_syntax_save = b:current_syntax
|
||||
endif
|
||||
|
||||
" Syntax highlighting for text/coffeescript script tags
|
||||
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
|
||||
\ contains=@htmlCoffeeScript,htmlScriptTag,@htmlPreproc
|
||||
\ containedin=htmlHead
|
||||
" Language: Colorful CSS Color Preview
|
||||
" Author: Aristotle Pagaltzis <pagaltzis@gmx.de>
|
||||
|
||||
if !( has('gui_running') || &t_Co==256 ) | finish | endif
|
||||
if exists('s:current_syntax_save')
|
||||
let b:current_syntax = s:current_syntax_save
|
||||
unlet s:current_syntax_save
|
||||
endif
|
||||
|
||||
" default html syntax should already be including the css syntax
|
||||
syn cluster colorableGroup add=htmlString,htmlCommentPart
|
||||
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, 'less') == -1
|
||||
|
||||
if !exists("g:less_html_style_tags")
|
||||
let g:less_html_style_tags = 1
|
||||
endif
|
||||
|
||||
if !g:less_html_style_tags
|
||||
finish
|
||||
endif
|
||||
|
||||
" Unset (but preserve) so that less will run.
|
||||
if exists("b:current_syntax")
|
||||
let s:pre_less_cur_syn = b:current_syntax
|
||||
unlet b:current_syntax
|
||||
endif
|
||||
|
||||
" Inspired by code from github.com/kchmck/vim-coffee-script
|
||||
" and the html syntax file included with vim 7.4.
|
||||
|
||||
syn include @htmlLess syntax/less.vim
|
||||
|
||||
" We have to explicitly add to htmlHead (containedin) as that region specifies 'contains'.
|
||||
syn region lessStyle start=+<style [^>]*type *=[^>]*text/less[^>]*>+ keepend end=+</style>+ contains=@htmlLess,htmlTag,htmlEndTag,htmlCssStyleComment,@htmlPreproc containedin=htmlHead
|
||||
|
||||
" Reset since 'less' isn't really the current_syntax.
|
||||
if exists("s:pre_less_cur_syn")
|
||||
let b:current_syntax = s:pre_less_cur_syn
|
||||
endif
|
||||
|
||||
endif
|
||||
|
||||
65
after/syntax/jsx.vim
Normal file
65
after/syntax/jsx.vim
Normal file
@@ -0,0 +1,65 @@
|
||||
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'jsx') == -1
|
||||
|
||||
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
|
||||
" Vim syntax file
|
||||
"
|
||||
" Language: JSX (JavaScript)
|
||||
" Maintainer: Max Wang <mxawng@gmail.com>
|
||||
" Depends: pangloss/vim-javascript
|
||||
"
|
||||
" CREDITS: Inspired by Facebook.
|
||||
"
|
||||
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
|
||||
|
||||
" Prologue; load in XML syntax.
|
||||
if exists('b:current_syntax')
|
||||
let s:current_syntax=b:current_syntax
|
||||
unlet b:current_syntax
|
||||
endif
|
||||
syn include @XMLSyntax syntax/xml.vim
|
||||
if exists('s:current_syntax')
|
||||
let b:current_syntax=s:current_syntax
|
||||
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.
|
||||
"
|
||||
" 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=+<!--\_.\{-}-->+
|
||||
\ end=+</\z1\_\s\{-}>+
|
||||
\ end=+/>+
|
||||
\ keepend
|
||||
\ extend
|
||||
|
||||
" Add jsxRegion to the lowest-level JS syntax cluster.
|
||||
syn cluster jsExpression add=jsxRegion
|
||||
|
||||
" Allow jsxRegion to contain reserved words.
|
||||
syn cluster javascriptNoReserved add=jsxRegion
|
||||
|
||||
endif
|
||||
@@ -1,6 +0,0 @@
|
||||
" Language: Colorful CSS Color Preview
|
||||
" Author: Aristotle Pagaltzis <pagaltzis@gmx.de>
|
||||
|
||||
if !( has('gui_running') || &t_Co==256 ) | finish | endif
|
||||
|
||||
call css_color#init('css', 'lessVariableValue,lessDefinition,lessComment')
|
||||
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,3 +1,5 @@
|
||||
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'rspec') == -1
|
||||
|
||||
"
|
||||
" An rspec syntax file
|
||||
" Originally from http://www.vim.org/scripts/script.php?script_id=2286
|
||||
@@ -30,3 +32,5 @@ syntax keyword rspecMessageExpectation advise any_args any_number_of_times anyth
|
||||
highlight link rspecMessageExpectation Function
|
||||
|
||||
let b:current_syntax = 'rspec'
|
||||
|
||||
endif
|
||||
|
||||
@@ -1,23 +1,5 @@
|
||||
" This file describes a very basic syntax for TomDoc comments in a Ruby file.
|
||||
"
|
||||
" For more information on TomDoc, check it out here: http://tomdoc.org/
|
||||
"
|
||||
|
||||
syn keyword tomdocKeywords Returns containedin=rubyComment contained
|
||||
syn keyword tomdocKeywords Yields containedin=rubyComment contained
|
||||
syn keyword tomdocKeywords Raises containedin=rubyComment contained
|
||||
syn keyword tomdocKeywords Examples containedin=rubyComment contained
|
||||
syn keyword tomdocKeywords Signature containedin=rubyComment contained
|
||||
|
||||
syn match tomdocArguments +\s*[A-Za-z0-9_\-&\*:]*\(\s*- \)+he=e-3 containedin=rubyComment contained
|
||||
|
||||
syn match tomdocDescriptions +\s*Public:+he=e-1 containedin=rubyComment contained
|
||||
syn match tomdocDescriptions +\s*Internal:+he=e-1 containedin=rubyComment contained
|
||||
syn match tomdocDescriptions +\s*Deprecated:+he=e-1 containedin=rubyComment contained
|
||||
|
||||
hi default link tomdocDescriptions String
|
||||
hi default link tomdocKeywords String
|
||||
hi default link tomdocArguments HELP
|
||||
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'yard') == -1
|
||||
|
||||
" Ruby syntax extensions for highlighting YARD documentation.
|
||||
"
|
||||
" Author: Joel Holdbrooks <https://github.com/noprompt>
|
||||
@@ -144,3 +126,5 @@ hi def link yardParametricType yardComment
|
||||
hi def link yardArrow yardComment
|
||||
hi def link yardHashAngle yardComment
|
||||
hi def link yardHashCurly yardComment
|
||||
|
||||
endif
|
||||
|
||||
@@ -1,9 +1,11 @@
|
||||
if !exists('g:rust_conceal') || !has('conceal') || &enc != 'utf-8'
|
||||
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'rust') == -1
|
||||
|
||||
if !exists('g:rust_conceal') || g:rust_conceal == 0 || !has('conceal') || &enc != 'utf-8'
|
||||
finish
|
||||
endif
|
||||
|
||||
" 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=ㆍ
|
||||
endif
|
||||
|
||||
@@ -18,7 +20,7 @@ syn match rustNiceOperator "=>" contains=rustFatRightArrowHead,rustFatRightArrow
|
||||
syn match rustNiceOperator /\<\@!_\(_*\>\)\@=/ conceal cchar=′
|
||||
|
||||
" 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 rustPublicRest contained "b" conceal cchar=
|
||||
syn match rustNiceOperator "pub " contains=rustPublicSigil,rustPublicRest
|
||||
@@ -26,8 +28,11 @@ endif
|
||||
|
||||
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
|
||||
|
||||
" And keep it after a colorscheme change
|
||||
au ColorScheme <buffer> hi! link Conceal Operator
|
||||
endif
|
||||
|
||||
setlocal conceallevel=2
|
||||
endif
|
||||
|
||||
@@ -1,6 +0,0 @@
|
||||
" Language: Colorful CSS Color Preview
|
||||
" Author: Aristotle Pagaltzis <pagaltzis@gmx.de>
|
||||
|
||||
if !( has('gui_running') || &t_Co==256 ) | finish | endif
|
||||
|
||||
call css_color#init('css', 'sassCssAttribute,sassComment,sassCssComment')
|
||||
@@ -1,6 +0,0 @@
|
||||
" Language: Colorful CSS Color Preview
|
||||
" Author: Aristotle Pagaltzis <pagaltzis@gmx.de>
|
||||
|
||||
if !( has('gui_running') || &t_Co==256 ) | finish | endif
|
||||
|
||||
call css_color#init('css', 'stylusCssAttribute,stylusComment,cssComment')
|
||||
@@ -1,3 +1,5 @@
|
||||
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'latex') == -1
|
||||
|
||||
" adds support for cleverref package
|
||||
" \Cref, \cref, \cpageref, \labelcref, \labelcpageref
|
||||
syn region texRefZone matchgroup=texStatement start="\\Cref{" end="}\|%stopzone\>" contains=@texRefGroup
|
||||
@@ -7,3 +9,5 @@ syn region texRefZone matchgroup=texStatement start="\\\(label\|\)c\(page\|\)re
|
||||
syn region texZone start="\\begin{lstlisting}" end="\\end{lstlisting}\|%stopzone\>"
|
||||
syn match texInputFile "\\lstinputlisting\s*\(\[.*\]\)\={.\{-}}" contains=texStatement,texInputCurlies,texInputFileOpt
|
||||
syn match texZone "\\lstinline\s*\(\[.*\]\)\={.\{-}}"
|
||||
|
||||
endif
|
||||
|
||||
@@ -1,6 +0,0 @@
|
||||
" Language: Colorful CSS Color Preview
|
||||
" Author: Aristotle Pagaltzis <pagaltzis@gmx.de>
|
||||
|
||||
if !( has('gui_running') || &t_Co==256 ) | finish | endif
|
||||
|
||||
call css_color#init('any', 'vimHiGuiRgb,vimComment,vimLineComment')
|
||||
64
after/syntax/yaml.vim
Normal file
64
after/syntax/yaml.vim
Normal file
@@ -0,0 +1,64 @@
|
||||
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 yamlDelimiter "[:,-]"
|
||||
syn match yamlBlock "[\[\]\{\}\|\>]"
|
||||
syn match yamlOperator "[?^+-]\|=>"
|
||||
|
||||
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\S\+\ze\s*:"
|
||||
syn match yamlAnchor "&\S\+"
|
||||
syn match yamlAlias "*\S\+"
|
||||
|
||||
" Setupt the hilighting 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 yamlOperator Operator
|
||||
hi link yamlDelimiter Delimiter
|
||||
hi link yamlString String
|
||||
hi link yamlEscape Special
|
||||
|
||||
|
||||
endif
|
||||
File diff suppressed because one or more lines are too long
@@ -1,5 +1,7 @@
|
||||
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'coffee-script') == -1
|
||||
|
||||
" Language: CoffeeScript
|
||||
" Maintainer: Mick Koch <kchmck@gmail.com>
|
||||
" Maintainer: Mick Koch <mick@kochm.co>
|
||||
" URL: http://github.com/kchmck/vim-coffee-script
|
||||
" License: WTFPL
|
||||
|
||||
@@ -52,3 +54,5 @@ function! coffee#CoffeeSetUpErrorFormat()
|
||||
\%f:%l:%c:\ error:\ %m,
|
||||
\%-G%.%#
|
||||
endfunction
|
||||
|
||||
endif
|
||||
|
||||
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
|
||||
@@ -1,559 +0,0 @@
|
||||
" Language: Colorful CSS Color Preview
|
||||
" Author: Aristotle Pagaltzis <pagaltzis@gmx.de>
|
||||
" Last Change: 2014-01-14
|
||||
" Licence: No Warranties. WTFPL. But please tell me!
|
||||
" Version: 1.0
|
||||
|
||||
if v:version < 700
|
||||
echoerr printf('Vim 7 is required for css-color (this is only %d.%d)',v:version/100,v:version%100)
|
||||
finish
|
||||
endif
|
||||
|
||||
if !( has('gui_running') || &t_Co==256 ) | finish | endif
|
||||
|
||||
function! s:rgb2color(r,g,b)
|
||||
" Convert 80% -> 204, 100% -> 255, etc.
|
||||
let rgb = map( [a:r,a:g,a:b], 'v:val =~ "%$" ? ( 255 * v:val ) / 100 : v:val' )
|
||||
return printf( '%02x%02x%02x', rgb[0], rgb[1], rgb[2] )
|
||||
endfunction
|
||||
|
||||
function! s:hsl2color(h,s,l)
|
||||
" Convert 80% -> 0.8, 100% -> 1.0, etc.
|
||||
let [s,l] = map( [a:s, a:l], 'v:val =~ "%$" ? v:val / 100.0 : v:val + 0.0' )
|
||||
" algorithm transcoded to vim from http://www.w3.org/TR/css3-color/#hsl-color
|
||||
let hh = ( a:h % 360 ) / 360.0
|
||||
let m2 = l <= 0.5 ? l * ( s + 1 ) : l + s - l * s
|
||||
let m1 = l * 2 - m2
|
||||
let rgb = []
|
||||
for h in [ hh + (1/3.0), hh, hh - (1/3.0) ]
|
||||
let h = h < 0 ? h + 1 : h > 1 ? h - 1 : h
|
||||
let v =
|
||||
\ h * 6 < 1 ? m1 + ( m2 - m1 ) * h * 6 :
|
||||
\ h * 2 < 1 ? m2 :
|
||||
\ h * 3 < 2 ? m1 + ( m2 - m1 ) * ( 2/3.0 - h ) * 6 :
|
||||
\ m1
|
||||
if v > 1.0 | return '' | endif
|
||||
let rgb += [ float2nr( 255 * v ) ]
|
||||
endfor
|
||||
return printf( '%02x%02x%02x', rgb[0], rgb[1], rgb[2] )
|
||||
endfunction
|
||||
|
||||
let s:hex={}
|
||||
for i in range(0, 255)
|
||||
let s:hex[ printf( '%02x', i ) ] = i
|
||||
endfor
|
||||
|
||||
if has('gui_running')
|
||||
let s:is_gui = 1
|
||||
else
|
||||
let s:is_gui = 0
|
||||
|
||||
" preset 16 vt100 colors
|
||||
let s:xtermcolor = [
|
||||
\ [ 0x00, 0x00, 0x00, 0 ],
|
||||
\ [ 0xCD, 0x00, 0x00, 1 ],
|
||||
\ [ 0x00, 0xCD, 0x00, 2 ],
|
||||
\ [ 0xCD, 0xCD, 0x00, 3 ],
|
||||
\ [ 0x00, 0x00, 0xEE, 4 ],
|
||||
\ [ 0xCD, 0x00, 0xCD, 5 ],
|
||||
\ [ 0x00, 0xCD, 0xCD, 6 ],
|
||||
\ [ 0xE5, 0xE5, 0xE5, 7 ],
|
||||
\ [ 0x7F, 0x7F, 0x7F, 8 ],
|
||||
\ [ 0xFF, 0x00, 0x00, 9 ],
|
||||
\ [ 0x00, 0xFF, 0x00, 10 ],
|
||||
\ [ 0xFF, 0xFF, 0x00, 11 ],
|
||||
\ [ 0x5C, 0x5C, 0xFF, 12 ],
|
||||
\ [ 0xFF, 0x00, 0xFF, 13 ],
|
||||
\ [ 0x00, 0xFF, 0xFF, 14 ],
|
||||
\ [ 0xFF, 0xFF, 0xFF, 15 ]]
|
||||
" grayscale ramp
|
||||
" (value is 8+10*lum for lum in 0..23)
|
||||
let s:xtermcolor += [
|
||||
\ [ 0x08, 0x08, 0x08, 232 ],
|
||||
\ [ 0x12, 0x12, 0x12, 233 ],
|
||||
\ [ 0x1C, 0x1C, 0x1C, 234 ],
|
||||
\ [ 0x26, 0x26, 0x26, 235 ],
|
||||
\ [ 0x30, 0x30, 0x30, 236 ],
|
||||
\ [ 0x3A, 0x3A, 0x3A, 237 ],
|
||||
\ [ 0x44, 0x44, 0x44, 238 ],
|
||||
\ [ 0x4E, 0x4E, 0x4E, 239 ],
|
||||
\ [ 0x58, 0x58, 0x58, 240 ],
|
||||
\ [ 0x62, 0x62, 0x62, 241 ],
|
||||
\ [ 0x6C, 0x6C, 0x6C, 242 ],
|
||||
\ [ 0x76, 0x76, 0x76, 243 ],
|
||||
\ [ 0x80, 0x80, 0x80, 244 ],
|
||||
\ [ 0x8A, 0x8A, 0x8A, 245 ],
|
||||
\ [ 0x94, 0x94, 0x94, 246 ],
|
||||
\ [ 0x9E, 0x9E, 0x9E, 247 ],
|
||||
\ [ 0xA8, 0xA8, 0xA8, 248 ],
|
||||
\ [ 0xB2, 0xB2, 0xB2, 249 ],
|
||||
\ [ 0xBC, 0xBC, 0xBC, 250 ],
|
||||
\ [ 0xC6, 0xC6, 0xC6, 251 ],
|
||||
\ [ 0xD0, 0xD0, 0xD0, 252 ],
|
||||
\ [ 0xDA, 0xDA, 0xDA, 253 ],
|
||||
\ [ 0xE4, 0xE4, 0xE4, 254 ],
|
||||
\ [ 0xEE, 0xEE, 0xEE, 255 ]]
|
||||
|
||||
" the 6 values used in the xterm color cube
|
||||
" 0 95 135 175 215 255
|
||||
let s:cubergb = [ 0x00, 0x5F, 0x87, 0xAF, 0xD7, 0xFF ]
|
||||
|
||||
" 0..255 mapped to 0..5 based on the color cube values
|
||||
let s:xvquant = repeat([0],48)
|
||||
\ + repeat([1],68)
|
||||
\ + repeat([2],40)
|
||||
\ + repeat([3],40)
|
||||
\ + repeat([4],40)
|
||||
\ + repeat([5],20)
|
||||
" tweak the mapping for the exact matches (0 and 1 already correct)
|
||||
let s:xvquant[s:cubergb[2]] = 2
|
||||
let s:xvquant[s:cubergb[3]] = 3
|
||||
let s:xvquant[s:cubergb[4]] = 4
|
||||
let s:xvquant[s:cubergb[5]] = 5
|
||||
|
||||
" selects the nearest xterm color for a rgb value like #FF0000
|
||||
function! s:rgb2xterm(color)
|
||||
let best_match=0
|
||||
let smallest_distance = 10000000000
|
||||
let color = tolower(a:color)
|
||||
let r = s:hex[color[0:1]]
|
||||
let g = s:hex[color[2:3]]
|
||||
let b = s:hex[color[4:5]]
|
||||
|
||||
let vr = s:xvquant[r]
|
||||
let vg = s:xvquant[g]
|
||||
let vb = s:xvquant[b]
|
||||
let cidx = vr * 36 + vg * 6 + vb + 16
|
||||
let ccol = [ s:cubergb[vr], s:cubergb[vg], s:cubergb[vb], cidx ]
|
||||
|
||||
for [tr,tg,tb,idx] in [ ccol ] + s:xtermcolor
|
||||
let dr = tr - r
|
||||
let dg = tg - g
|
||||
let db = tb - b
|
||||
let distance = dr*dr + dg*dg + db*db
|
||||
if distance == 0 | return idx | endif
|
||||
if distance > smallest_distance | continue | endif
|
||||
let smallest_distance = distance
|
||||
let best_match = idx
|
||||
endfor
|
||||
return best_match
|
||||
endfunction
|
||||
endif
|
||||
|
||||
let s:pattern_color = {}
|
||||
let s:color_fg = {}
|
||||
let s:color_bg = {}
|
||||
let [s:hi_cmd, s:black, s:white] = s:is_gui
|
||||
\ ? ['hi %s guibg=#%s guifg=%s', '#000000', '#ffffff']
|
||||
\ : ['hi %s ctermbg=%s ctermfg=%s', 0, 15]
|
||||
function! s:create_syn_match()
|
||||
|
||||
let pattern = submatch(0)
|
||||
|
||||
if has_key( b:has_pattern_syn, pattern ) | return | endif
|
||||
let b:has_pattern_syn[pattern] = 1
|
||||
|
||||
let rgb_color = get( s:pattern_color, pattern, '' )
|
||||
|
||||
if ! strlen( rgb_color )
|
||||
let hexcolor = submatch(1)
|
||||
let funcname = submatch(2)
|
||||
|
||||
if funcname == 'rgb'
|
||||
let rgb_color = s:rgb2color(submatch(3),submatch(4),submatch(5))
|
||||
elseif funcname == 'hsl'
|
||||
let rgb_color = s:hsl2color(submatch(3),submatch(4),submatch(5))
|
||||
elseif strlen(hexcolor) == 6
|
||||
let rgb_color = tolower(hexcolor)
|
||||
elseif strlen(hexcolor) == 3
|
||||
let rgb_color = substitute(tolower(hexcolor), '\(.\)', '\1\1', 'g')
|
||||
else
|
||||
throw 'css_color: create_syn_match invoked on bad match data'
|
||||
endif
|
||||
|
||||
let s:pattern_color[pattern] = rgb_color
|
||||
endif
|
||||
|
||||
if ! has_key( b:has_color_hi, rgb_color )
|
||||
" check GUI flag early here to avoid pure-overhead caching
|
||||
let syn_bg = s:is_gui ? rgb_color : get( s:color_bg, rgb_color, '' )
|
||||
if ! strlen(syn_bg)
|
||||
let syn_bg = s:rgb2xterm(rgb_color)
|
||||
let s:color_bg[rgb_color] = syn_bg
|
||||
endif
|
||||
|
||||
let syn_fg = get( s:color_fg, rgb_color, '' )
|
||||
if ! strlen(syn_fg)
|
||||
let r = s:hex[rgb_color[0:1]]
|
||||
let g = s:hex[rgb_color[2:3]]
|
||||
let b = s:hex[rgb_color[4:5]]
|
||||
let syn_fg = r*30 + g*59 + b*11 > 12000 ? s:black : s:white
|
||||
let s:color_fg[rgb_color] = syn_fg
|
||||
endif
|
||||
endif
|
||||
|
||||
let group = 'BG' . rgb_color
|
||||
|
||||
if ! has_key( b:has_color_hi, rgb_color )
|
||||
exe printf( s:hi_cmd, group, syn_bg, syn_fg )
|
||||
let b:has_color_hi[rgb_color] = 1
|
||||
endif
|
||||
|
||||
" iff pattern ends on word character, require word break to match
|
||||
if pattern =~ '\>$' | let pattern .= '\>' | endif
|
||||
exe 'syn match' group '/'.escape(pattern, '/').'/ contained containedin=@colorableGroup'
|
||||
|
||||
return ''
|
||||
endfunction
|
||||
|
||||
function! s:update_matches()
|
||||
call filter(b:color_match_id, 'matchdelete(v:val)')
|
||||
if &l:cursorline
|
||||
" adds matches based that duplicate the highlighted colors on the current line
|
||||
let lnr = line('.')
|
||||
let group = ''
|
||||
let groupstart = 0
|
||||
let endcol = col('$')
|
||||
for col in range( 1, endcol )
|
||||
let nextgroup = col < endcol ? synIDattr( synID( lnr, col, 1 ), 'name' ) : ''
|
||||
if group == nextgroup | continue | endif
|
||||
if group =~ '^BG\x\{6}$'
|
||||
let regex = '\%'.lnr.'l\%'.groupstart.'c'.repeat( '.', col - groupstart )
|
||||
let match = matchadd( group, regex, -1 )
|
||||
let b:color_match_id += [ match ]
|
||||
endif
|
||||
let group = nextgroup
|
||||
let groupstart = col
|
||||
endfor
|
||||
endif
|
||||
endfunction
|
||||
|
||||
let s:_hexcolor = '#\(\x\{3}\|\x\{6}\)\>' " submatch 1
|
||||
let s:_funcname = '\(rgb\|hsl\)a\?' " submatch 2
|
||||
let s:_numval = '\(\d\{1,3}%\?\)' " submatch 3,4,5
|
||||
let s:_ws_ = '\s*'
|
||||
let s:_listsep = s:_ws_ . ',' . s:_ws_
|
||||
let s:_otherargs_ = '\%(,[^)]*\)\?'
|
||||
let s:_funcexpr = s:_funcname . '[(]' . s:_numval . s:_listsep . s:_numval . s:_listsep . s:_numval . s:_ws_ . s:_otherargs_ . '[)]'
|
||||
let s:_csscolor = s:_hexcolor . '\|' . s:_funcexpr
|
||||
" N.B. these substitute() calls are here just for the side effect
|
||||
" of invoking s:create_syn_match during substitution -- because
|
||||
" match() and friends do not allow finding all matches in a single
|
||||
" scan without examining the start of the string over and over
|
||||
function! s:parse_css_screen()
|
||||
call substitute( join( getline('w0','w$'), "\n" ), s:_csscolor, '\=s:create_syn_match()', 'g' )
|
||||
call s:update_matches()
|
||||
endfunction
|
||||
function! s:parse_any_screen()
|
||||
call substitute( join( getline('w0','w$'), "\n" ), s:_hexcolor, '\=s:create_syn_match()', 'g' )
|
||||
call s:update_matches()
|
||||
endfunction
|
||||
|
||||
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
|
||||
|
||||
function! css_color#init(type, groups)
|
||||
exe 'syn cluster colorableGroup contains=' . a:groups
|
||||
|
||||
let b:has_color_hi = {}
|
||||
let b:has_pattern_syn = {}
|
||||
let b:color_match_id = []
|
||||
|
||||
augroup CSSColor
|
||||
autocmd! * <buffer>
|
||||
exe 'autocmd CursorMoved,CursorMovedI <buffer> call s:parse_'.a:type.'_screen()'
|
||||
augroup END
|
||||
|
||||
do CSSColor CursorMoved <buffer>
|
||||
|
||||
if a:type != 'css' | return | endif
|
||||
|
||||
hi BG000000 guibg=#000000 guifg=#FFFFFF ctermbg=16 ctermfg=231
|
||||
hi BG000080 guibg=#000080 guifg=#FFFFFF ctermbg=235 ctermfg=231
|
||||
hi BG00008b guibg=#00008B guifg=#FFFFFF ctermbg=4 ctermfg=231
|
||||
hi BG0000cd guibg=#0000CD guifg=#FFFFFF ctermbg=4 ctermfg=231
|
||||
hi BG0000ff guibg=#0000FF guifg=#FFFFFF ctermbg=4 ctermfg=231
|
||||
hi BG006400 guibg=#006400 guifg=#FFFFFF ctermbg=235 ctermfg=231
|
||||
hi BG008000 guibg=#008000 guifg=#FFFFFF ctermbg=2 ctermfg=231
|
||||
hi BG008080 guibg=#008080 guifg=#FFFFFF ctermbg=30 ctermfg=231
|
||||
hi BG008b8b guibg=#008B8B guifg=#FFFFFF ctermbg=30 ctermfg=231
|
||||
hi BG00bfff guibg=#00BFFF guifg=#000000 ctermbg=6 ctermfg=16
|
||||
hi BG00ced1 guibg=#00CED1 guifg=#000000 ctermbg=6 ctermfg=16
|
||||
hi BG00fa9a guibg=#00FA9A guifg=#000000 ctermbg=6 ctermfg=16
|
||||
hi BG00ff00 guibg=#00FF00 guifg=#000000 ctermbg=10 ctermfg=16
|
||||
hi BG00ff7f guibg=#00FF7F guifg=#000000 ctermbg=6 ctermfg=16
|
||||
hi BG00ffff guibg=#00FFFF guifg=#000000 ctermbg=51 ctermfg=16
|
||||
hi BG191970 guibg=#191970 guifg=#FFFFFF ctermbg=237 ctermfg=231
|
||||
hi BG1e90ff guibg=#1E90FF guifg=#000000 ctermbg=12 ctermfg=16
|
||||
hi BG20b2aa guibg=#20B2AA guifg=#000000 ctermbg=37 ctermfg=16
|
||||
hi BG228b22 guibg=#228B22 guifg=#FFFFFF ctermbg=2 ctermfg=231
|
||||
hi BG2e8b57 guibg=#2E8B57 guifg=#FFFFFF ctermbg=240 ctermfg=231
|
||||
hi BG2f4f4f guibg=#2F4F4F guifg=#FFFFFF ctermbg=238 ctermfg=231
|
||||
hi BG32cd32 guibg=#32CD32 guifg=#000000 ctermbg=2 ctermfg=16
|
||||
hi BG3cb371 guibg=#3CB371 guifg=#000000 ctermbg=71 ctermfg=16
|
||||
hi BG40e0d0 guibg=#40E0D0 guifg=#000000 ctermbg=80 ctermfg=16
|
||||
hi BG4169e1 guibg=#4169E1 guifg=#FFFFFF ctermbg=12 ctermfg=231
|
||||
hi BG4682b4 guibg=#4682B4 guifg=#FFFFFF ctermbg=67 ctermfg=231
|
||||
hi BG483d8b guibg=#483D8B guifg=#FFFFFF ctermbg=240 ctermfg=231
|
||||
hi BG48d1cc guibg=#48D1CC guifg=#000000 ctermbg=80 ctermfg=16
|
||||
hi BG4b0082 guibg=#4B0082 guifg=#FFFFFF ctermbg=238 ctermfg=231
|
||||
hi BG556b2f guibg=#556B2F guifg=#FFFFFF ctermbg=239 ctermfg=231
|
||||
hi BG5f9ea0 guibg=#5F9EA0 guifg=#000000 ctermbg=73 ctermfg=16
|
||||
hi BG6495ed guibg=#6495ED guifg=#000000 ctermbg=12 ctermfg=16
|
||||
hi BG66cdaa guibg=#66CDAA guifg=#000000 ctermbg=79 ctermfg=16
|
||||
hi BG696969 guibg=#696969 guifg=#FFFFFF ctermbg=242 ctermfg=231
|
||||
hi BG6a5acd guibg=#6A5ACD guifg=#FFFFFF ctermbg=12 ctermfg=231
|
||||
hi BG6b8e23 guibg=#6B8E23 guifg=#FFFFFF ctermbg=241 ctermfg=231
|
||||
hi BG708090 guibg=#708090 guifg=#000000 ctermbg=66 ctermfg=16
|
||||
hi BG778899 guibg=#778899 guifg=#000000 ctermbg=102 ctermfg=16
|
||||
hi BG7b68ee guibg=#7B68EE guifg=#000000 ctermbg=12 ctermfg=16
|
||||
hi BG7cfc00 guibg=#7CFC00 guifg=#000000 ctermbg=3 ctermfg=16
|
||||
hi BG7fff00 guibg=#7FFF00 guifg=#000000 ctermbg=3 ctermfg=16
|
||||
hi BG7fffd4 guibg=#7FFFD4 guifg=#000000 ctermbg=122 ctermfg=16
|
||||
hi BG800000 guibg=#800000 guifg=#FFFFFF ctermbg=88 ctermfg=231
|
||||
hi BG800080 guibg=#800080 guifg=#FFFFFF ctermbg=240 ctermfg=231
|
||||
hi BG808000 guibg=#808000 guifg=#FFFFFF ctermbg=240 ctermfg=231
|
||||
hi BG808080 guibg=#808080 guifg=#000000 ctermbg=244 ctermfg=16
|
||||
hi BG87ceeb guibg=#87CEEB guifg=#000000 ctermbg=117 ctermfg=16
|
||||
hi BG87cefa guibg=#87CEFA guifg=#000000 ctermbg=117 ctermfg=16
|
||||
hi BG8a2be2 guibg=#8A2BE2 guifg=#FFFFFF ctermbg=12 ctermfg=231
|
||||
hi BG8b0000 guibg=#8B0000 guifg=#FFFFFF ctermbg=88 ctermfg=231
|
||||
hi BG8b008b guibg=#8B008B guifg=#FFFFFF ctermbg=5 ctermfg=231
|
||||
hi BG8b4513 guibg=#8B4513 guifg=#FFFFFF ctermbg=94 ctermfg=231
|
||||
hi BG8fbc8f guibg=#8FBC8F guifg=#000000 ctermbg=108 ctermfg=16
|
||||
hi BG90ee90 guibg=#90EE90 guifg=#000000 ctermbg=249 ctermfg=16
|
||||
hi BG9370d8 guibg=#9370D8 guifg=#000000 ctermbg=12 ctermfg=16
|
||||
hi BG9400d3 guibg=#9400D3 guifg=#FFFFFF ctermbg=5 ctermfg=231
|
||||
hi BG98fb98 guibg=#98FB98 guifg=#000000 ctermbg=250 ctermfg=16
|
||||
hi BG9932cc guibg=#9932CC guifg=#FFFFFF ctermbg=5 ctermfg=231
|
||||
hi BG9acd32 guibg=#9ACD32 guifg=#000000 ctermbg=3 ctermfg=16
|
||||
hi BGa0522d guibg=#A0522D guifg=#FFFFFF ctermbg=130 ctermfg=231
|
||||
hi BGa52a2a guibg=#A52A2A guifg=#FFFFFF ctermbg=124 ctermfg=231
|
||||
hi BGa9a9a9 guibg=#A9A9A9 guifg=#000000 ctermbg=248 ctermfg=16
|
||||
hi BGadd8e6 guibg=#ADD8E6 guifg=#000000 ctermbg=152 ctermfg=16
|
||||
hi BGadff2f guibg=#ADFF2F guifg=#000000 ctermbg=3 ctermfg=16
|
||||
hi BGafeeee guibg=#AFEEEE guifg=#000000 ctermbg=159 ctermfg=16
|
||||
hi BGb0c4de guibg=#B0C4DE guifg=#000000 ctermbg=152 ctermfg=16
|
||||
hi BGb0e0e6 guibg=#B0E0E6 guifg=#000000 ctermbg=152 ctermfg=16
|
||||
hi BGb22222 guibg=#B22222 guifg=#FFFFFF ctermbg=124 ctermfg=231
|
||||
hi BGb8860b guibg=#B8860B guifg=#000000 ctermbg=3 ctermfg=16
|
||||
hi BGba55d3 guibg=#BA55D3 guifg=#000000 ctermbg=5 ctermfg=16
|
||||
hi BGbc8f8f guibg=#BC8F8F guifg=#000000 ctermbg=138 ctermfg=16
|
||||
hi BGbdb76b guibg=#BDB76B guifg=#000000 ctermbg=247 ctermfg=16
|
||||
hi BGc0c0c0 guibg=#C0C0C0 guifg=#000000 ctermbg=250 ctermfg=16
|
||||
hi BGc71585 guibg=#C71585 guifg=#FFFFFF ctermbg=5 ctermfg=231
|
||||
hi BGcd5c5c guibg=#CD5C5C guifg=#000000 ctermbg=167 ctermfg=16
|
||||
hi BGcd853f guibg=#CD853F guifg=#000000 ctermbg=173 ctermfg=16
|
||||
hi BGd2691e guibg=#D2691E guifg=#000000 ctermbg=166 ctermfg=16
|
||||
hi BGd2b48c guibg=#D2B48C guifg=#000000 ctermbg=180 ctermfg=16
|
||||
hi BGd3d3d3 guibg=#D3D3D3 guifg=#000000 ctermbg=252 ctermfg=16
|
||||
hi BGd87093 guibg=#D87093 guifg=#000000 ctermbg=168 ctermfg=16
|
||||
hi BGd8bfd8 guibg=#D8BFD8 guifg=#000000 ctermbg=252 ctermfg=16
|
||||
hi BGda70d6 guibg=#DA70D6 guifg=#000000 ctermbg=249 ctermfg=16
|
||||
hi BGdaa520 guibg=#DAA520 guifg=#000000 ctermbg=3 ctermfg=16
|
||||
hi BGdc143c guibg=#DC143C guifg=#FFFFFF ctermbg=161 ctermfg=231
|
||||
hi BGdcdcdc guibg=#DCDCDC guifg=#000000 ctermbg=253 ctermfg=16
|
||||
hi BGdda0dd guibg=#DDA0DD guifg=#000000 ctermbg=182 ctermfg=16
|
||||
hi BGdeb887 guibg=#DEB887 guifg=#000000 ctermbg=180 ctermfg=16
|
||||
hi BGe0ffff guibg=#E0FFFF guifg=#000000 ctermbg=195 ctermfg=16
|
||||
hi BGe6e6fa guibg=#E6E6FA guifg=#000000 ctermbg=255 ctermfg=16
|
||||
hi BGe9967a guibg=#E9967A guifg=#000000 ctermbg=174 ctermfg=16
|
||||
hi BGee82ee guibg=#EE82EE guifg=#000000 ctermbg=251 ctermfg=16
|
||||
hi BGeee8aa guibg=#EEE8AA guifg=#000000 ctermbg=223 ctermfg=16
|
||||
hi BGf08080 guibg=#F08080 guifg=#000000 ctermbg=210 ctermfg=16
|
||||
hi BGf0e68c guibg=#F0E68C guifg=#000000 ctermbg=222 ctermfg=16
|
||||
hi BGf0f8ff guibg=#F0F8FF guifg=#000000 ctermbg=15 ctermfg=16
|
||||
hi BGf0fff0 guibg=#F0FFF0 guifg=#000000 ctermbg=255 ctermfg=16
|
||||
hi BGf0ffff guibg=#F0FFFF guifg=#000000 ctermbg=15 ctermfg=16
|
||||
hi BGf4a460 guibg=#F4A460 guifg=#000000 ctermbg=215 ctermfg=16
|
||||
hi BGf5deb3 guibg=#F5DEB3 guifg=#000000 ctermbg=223 ctermfg=16
|
||||
hi BGf5f5dc guibg=#F5F5DC guifg=#000000 ctermbg=255 ctermfg=16
|
||||
hi BGf5f5f5 guibg=#F5F5F5 guifg=#000000 ctermbg=255 ctermfg=16
|
||||
hi BGf5fffa guibg=#F5FFFA guifg=#000000 ctermbg=15 ctermfg=16
|
||||
hi BGf8f8ff guibg=#F8F8FF guifg=#000000 ctermbg=15 ctermfg=16
|
||||
hi BGfa8072 guibg=#FA8072 guifg=#000000 ctermbg=209 ctermfg=16
|
||||
hi BGfaebd7 guibg=#FAEBD7 guifg=#000000 ctermbg=7 ctermfg=16
|
||||
hi BGfaf0e6 guibg=#FAF0E6 guifg=#000000 ctermbg=255 ctermfg=16
|
||||
hi BGfafad2 guibg=#FAFAD2 guifg=#000000 ctermbg=255 ctermfg=16
|
||||
hi BGfdf5e6 guibg=#FDF5E6 guifg=#000000 ctermbg=255 ctermfg=16
|
||||
hi BGff0000 guibg=#FF0000 guifg=#FFFFFF ctermbg=196 ctermfg=231
|
||||
hi BGff00ff guibg=#FF00FF guifg=#FFFFFF ctermbg=13 ctermfg=231
|
||||
hi BGff1493 guibg=#FF1493 guifg=#FFFFFF ctermbg=5 ctermfg=231
|
||||
hi BGff4500 guibg=#FF4500 guifg=#FFFFFF ctermbg=9 ctermfg=231
|
||||
hi BGff6347 guibg=#FF6347 guifg=#000000 ctermbg=203 ctermfg=16
|
||||
hi BGff69b4 guibg=#FF69B4 guifg=#000000 ctermbg=205 ctermfg=16
|
||||
hi BGff7f50 guibg=#FF7F50 guifg=#000000 ctermbg=209 ctermfg=16
|
||||
hi BGff8c00 guibg=#FF8C00 guifg=#000000 ctermbg=3 ctermfg=16
|
||||
hi BGffa07a guibg=#FFA07A guifg=#000000 ctermbg=216 ctermfg=16
|
||||
hi BGffa500 guibg=#FFA500 guifg=#000000 ctermbg=3 ctermfg=16
|
||||
hi BGffb6c1 guibg=#FFB6C1 guifg=#000000 ctermbg=217 ctermfg=16
|
||||
hi BGffc0cb guibg=#FFC0CB guifg=#000000 ctermbg=218 ctermfg=16
|
||||
hi BGffd700 guibg=#FFD700 guifg=#000000 ctermbg=11 ctermfg=16
|
||||
hi BGffdab9 guibg=#FFDAB9 guifg=#000000 ctermbg=223 ctermfg=16
|
||||
hi BGffdead guibg=#FFDEAD guifg=#000000 ctermbg=223 ctermfg=16
|
||||
hi BGffe4b5 guibg=#FFE4B5 guifg=#000000 ctermbg=223 ctermfg=16
|
||||
hi BGffe4c4 guibg=#FFE4C4 guifg=#000000 ctermbg=224 ctermfg=16
|
||||
hi BGffe4e1 guibg=#FFE4E1 guifg=#000000 ctermbg=224 ctermfg=16
|
||||
hi BGffebcd guibg=#FFEBCD guifg=#000000 ctermbg=7 ctermfg=16
|
||||
hi BGffefd5 guibg=#FFEFD5 guifg=#000000 ctermbg=255 ctermfg=16
|
||||
hi BGfff0f5 guibg=#FFF0F5 guifg=#000000 ctermbg=15 ctermfg=16
|
||||
hi BGfff5ee guibg=#FFF5EE guifg=#000000 ctermbg=255 ctermfg=16
|
||||
hi BGfff8dc guibg=#FFF8DC guifg=#000000 ctermbg=255 ctermfg=16
|
||||
hi BGfffacd guibg=#FFFACD guifg=#000000 ctermbg=255 ctermfg=16
|
||||
hi BGfffaf0 guibg=#FFFAF0 guifg=#000000 ctermbg=15 ctermfg=16
|
||||
hi BGfffafa guibg=#FFFAFA guifg=#000000 ctermbg=15 ctermfg=16
|
||||
hi BGffff00 guibg=#FFFF00 guifg=#000000 ctermbg=11 ctermfg=16
|
||||
hi BGffffe0 guibg=#FFFFE0 guifg=#000000 ctermbg=255 ctermfg=16
|
||||
hi BGfffff0 guibg=#FFFFF0 guifg=#000000 ctermbg=15 ctermfg=16
|
||||
hi BGffffff guibg=#FFFFFF guifg=#000000 ctermbg=231 ctermfg=16
|
||||
|
||||
" W3C Colors
|
||||
syn keyword BG000000 black contained containedin=@colorableGroup
|
||||
syn keyword BGc0c0c0 silver contained containedin=@colorableGroup
|
||||
syn keyword BG808080 gray contained containedin=@colorableGroup
|
||||
syn match BGffffff "\<white\(-\)\@!\>" contained containedin=@colorableGroup
|
||||
syn keyword BG800000 maroon contained containedin=@colorableGroup
|
||||
syn keyword BGff0000 red contained containedin=@colorableGroup
|
||||
syn keyword BG800080 purple contained containedin=@colorableGroup
|
||||
syn keyword BGff00ff fuchsia contained containedin=@colorableGroup
|
||||
syn keyword BG008000 green contained containedin=@colorableGroup
|
||||
syn keyword BG00ff00 lime contained containedin=@colorableGroup
|
||||
syn keyword BG808000 olive contained containedin=@colorableGroup
|
||||
syn keyword BGffff00 yellow contained containedin=@colorableGroup
|
||||
syn keyword BG000080 navy contained containedin=@colorableGroup
|
||||
syn keyword BG0000ff blue contained containedin=@colorableGroup
|
||||
syn keyword BG008080 teal contained containedin=@colorableGroup
|
||||
syn keyword BG00ffff aqua contained containedin=@colorableGroup
|
||||
|
||||
" extra colors
|
||||
syn keyword BGf0f8ff AliceBlue contained containedin=@colorableGroup
|
||||
syn keyword BGfaebd7 AntiqueWhite contained containedin=@colorableGroup
|
||||
syn keyword BG7fffd4 Aquamarine contained containedin=@colorableGroup
|
||||
syn keyword BGf0ffff Azure contained containedin=@colorableGroup
|
||||
syn keyword BGf5f5dc Beige contained containedin=@colorableGroup
|
||||
syn keyword BGffe4c4 Bisque contained containedin=@colorableGroup
|
||||
syn keyword BGffebcd BlanchedAlmond contained containedin=@colorableGroup
|
||||
syn keyword BG8a2be2 BlueViolet contained containedin=@colorableGroup
|
||||
syn keyword BGa52a2a Brown contained containedin=@colorableGroup
|
||||
syn keyword BGdeb887 BurlyWood contained containedin=@colorableGroup
|
||||
syn keyword BG5f9ea0 CadetBlue contained containedin=@colorableGroup
|
||||
syn keyword BG7fff00 Chartreuse contained containedin=@colorableGroup
|
||||
syn keyword BGd2691e Chocolate contained containedin=@colorableGroup
|
||||
syn keyword BGff7f50 Coral contained containedin=@colorableGroup
|
||||
syn keyword BG6495ed CornflowerBlue contained containedin=@colorableGroup
|
||||
syn keyword BGfff8dc Cornsilk contained containedin=@colorableGroup
|
||||
syn keyword BGdc143c Crimson contained containedin=@colorableGroup
|
||||
syn keyword BG00ffff Cyan contained containedin=@colorableGroup
|
||||
syn keyword BG00008b DarkBlue contained containedin=@colorableGroup
|
||||
syn keyword BG008b8b DarkCyan contained containedin=@colorableGroup
|
||||
syn keyword BGb8860b DarkGoldenRod contained containedin=@colorableGroup
|
||||
syn keyword BGa9a9a9 DarkGray contained containedin=@colorableGroup
|
||||
syn keyword BG006400 DarkGreen contained containedin=@colorableGroup
|
||||
syn keyword BGa9a9a9 DarkGrey contained containedin=@colorableGroup
|
||||
syn keyword BGbdb76b DarkKhaki contained containedin=@colorableGroup
|
||||
syn keyword BG8b008b DarkMagenta contained containedin=@colorableGroup
|
||||
syn keyword BG556b2f DarkOliveGreen contained containedin=@colorableGroup
|
||||
syn keyword BG9932cc DarkOrchid contained containedin=@colorableGroup
|
||||
syn keyword BG8b0000 DarkRed contained containedin=@colorableGroup
|
||||
syn keyword BGe9967a DarkSalmon contained containedin=@colorableGroup
|
||||
syn keyword BG8fbc8f DarkSeaGreen contained containedin=@colorableGroup
|
||||
syn keyword BG483d8b DarkSlateBlue contained containedin=@colorableGroup
|
||||
syn keyword BG2f4f4f DarkSlateGray contained containedin=@colorableGroup
|
||||
syn keyword BG2f4f4f DarkSlateGrey contained containedin=@colorableGroup
|
||||
syn keyword BG00ced1 DarkTurquoise contained containedin=@colorableGroup
|
||||
syn keyword BG9400d3 DarkViolet contained containedin=@colorableGroup
|
||||
syn keyword BGff8c00 Darkorange contained containedin=@colorableGroup
|
||||
syn keyword BGff1493 DeepPink contained containedin=@colorableGroup
|
||||
syn keyword BG00bfff DeepSkyBlue contained containedin=@colorableGroup
|
||||
syn keyword BG696969 DimGray contained containedin=@colorableGroup
|
||||
syn keyword BG696969 DimGrey contained containedin=@colorableGroup
|
||||
syn keyword BG1e90ff DodgerBlue contained containedin=@colorableGroup
|
||||
syn keyword BGb22222 FireBrick contained containedin=@colorableGroup
|
||||
syn keyword BGfffaf0 FloralWhite contained containedin=@colorableGroup
|
||||
syn keyword BG228b22 ForestGreen contained containedin=@colorableGroup
|
||||
syn keyword BGdcdcdc Gainsboro contained containedin=@colorableGroup
|
||||
syn keyword BGf8f8ff GhostWhite contained containedin=@colorableGroup
|
||||
syn keyword BGffd700 Gold contained containedin=@colorableGroup
|
||||
syn keyword BGdaa520 GoldenRod contained containedin=@colorableGroup
|
||||
syn keyword BGadff2f GreenYellow contained containedin=@colorableGroup
|
||||
syn keyword BG808080 Grey contained containedin=@colorableGroup
|
||||
syn keyword BGf0fff0 HoneyDew contained containedin=@colorableGroup
|
||||
syn keyword BGff69b4 HotPink contained containedin=@colorableGroup
|
||||
syn keyword BGcd5c5c IndianRed contained containedin=@colorableGroup
|
||||
syn keyword BG4b0082 Indigo contained containedin=@colorableGroup
|
||||
syn keyword BGfffff0 Ivory contained containedin=@colorableGroup
|
||||
syn keyword BGf0e68c Khaki contained containedin=@colorableGroup
|
||||
syn keyword BGe6e6fa Lavender contained containedin=@colorableGroup
|
||||
syn keyword BGfff0f5 LavenderBlush contained containedin=@colorableGroup
|
||||
syn keyword BG7cfc00 LawnGreen contained containedin=@colorableGroup
|
||||
syn keyword BGfffacd LemonChiffon contained containedin=@colorableGroup
|
||||
syn keyword BGadd8e6 LightBlue contained containedin=@colorableGroup
|
||||
syn keyword BGf08080 LightCoral contained containedin=@colorableGroup
|
||||
syn keyword BGe0ffff LightCyan contained containedin=@colorableGroup
|
||||
syn keyword BGfafad2 LightGoldenRodYellow contained containedin=@colorableGroup
|
||||
syn keyword BGd3d3d3 LightGray contained containedin=@colorableGroup
|
||||
syn keyword BG90ee90 LightGreen contained containedin=@colorableGroup
|
||||
syn keyword BGd3d3d3 LightGrey contained containedin=@colorableGroup
|
||||
syn keyword BGffb6c1 LightPink contained containedin=@colorableGroup
|
||||
syn keyword BGffa07a LightSalmon contained containedin=@colorableGroup
|
||||
syn keyword BG20b2aa LightSeaGreen contained containedin=@colorableGroup
|
||||
syn keyword BG87cefa LightSkyBlue contained containedin=@colorableGroup
|
||||
syn keyword BG778899 LightSlateGray contained containedin=@colorableGroup
|
||||
syn keyword BG778899 LightSlateGrey contained containedin=@colorableGroup
|
||||
syn keyword BGb0c4de LightSteelBlue contained containedin=@colorableGroup
|
||||
syn keyword BGffffe0 LightYellow contained containedin=@colorableGroup
|
||||
syn keyword BG32cd32 LimeGreen contained containedin=@colorableGroup
|
||||
syn keyword BGfaf0e6 Linen contained containedin=@colorableGroup
|
||||
syn keyword BGff00ff Magenta contained containedin=@colorableGroup
|
||||
syn keyword BG66cdaa MediumAquaMarine contained containedin=@colorableGroup
|
||||
syn keyword BG0000cd MediumBlue contained containedin=@colorableGroup
|
||||
syn keyword BGba55d3 MediumOrchid contained containedin=@colorableGroup
|
||||
syn keyword BG9370d8 MediumPurple contained containedin=@colorableGroup
|
||||
syn keyword BG3cb371 MediumSeaGreen contained containedin=@colorableGroup
|
||||
syn keyword BG7b68ee MediumSlateBlue contained containedin=@colorableGroup
|
||||
syn keyword BG00fa9a MediumSpringGreen contained containedin=@colorableGroup
|
||||
syn keyword BG48d1cc MediumTurquoise contained containedin=@colorableGroup
|
||||
syn keyword BGc71585 MediumVioletRed contained containedin=@colorableGroup
|
||||
syn keyword BG191970 MidnightBlue contained containedin=@colorableGroup
|
||||
syn keyword BGf5fffa MintCream contained containedin=@colorableGroup
|
||||
syn keyword BGffe4e1 MistyRose contained containedin=@colorableGroup
|
||||
syn keyword BGffe4b5 Moccasin contained containedin=@colorableGroup
|
||||
syn keyword BGffdead NavajoWhite contained containedin=@colorableGroup
|
||||
syn keyword BGfdf5e6 OldLace contained containedin=@colorableGroup
|
||||
syn keyword BG6b8e23 OliveDrab contained containedin=@colorableGroup
|
||||
syn keyword BGffa500 Orange contained containedin=@colorableGroup
|
||||
syn keyword BGff4500 OrangeRed contained containedin=@colorableGroup
|
||||
syn keyword BGda70d6 Orchid contained containedin=@colorableGroup
|
||||
syn keyword BGeee8aa PaleGoldenRod contained containedin=@colorableGroup
|
||||
syn keyword BG98fb98 PaleGreen contained containedin=@colorableGroup
|
||||
syn keyword BGafeeee PaleTurquoise contained containedin=@colorableGroup
|
||||
syn keyword BGd87093 PaleVioletRed contained containedin=@colorableGroup
|
||||
syn keyword BGffefd5 PapayaWhip contained containedin=@colorableGroup
|
||||
syn keyword BGffdab9 PeachPuff contained containedin=@colorableGroup
|
||||
syn keyword BGcd853f Peru contained containedin=@colorableGroup
|
||||
syn keyword BGffc0cb Pink contained containedin=@colorableGroup
|
||||
syn keyword BGdda0dd Plum contained containedin=@colorableGroup
|
||||
syn keyword BGb0e0e6 PowderBlue contained containedin=@colorableGroup
|
||||
syn keyword BGbc8f8f RosyBrown contained containedin=@colorableGroup
|
||||
syn keyword BG4169e1 RoyalBlue contained containedin=@colorableGroup
|
||||
syn keyword BG8b4513 SaddleBrown contained containedin=@colorableGroup
|
||||
syn keyword BGfa8072 Salmon contained containedin=@colorableGroup
|
||||
syn keyword BGf4a460 SandyBrown contained containedin=@colorableGroup
|
||||
syn keyword BG2e8b57 SeaGreen contained containedin=@colorableGroup
|
||||
syn keyword BGfff5ee SeaShell contained containedin=@colorableGroup
|
||||
syn keyword BGa0522d Sienna contained containedin=@colorableGroup
|
||||
syn keyword BG87ceeb SkyBlue contained containedin=@colorableGroup
|
||||
syn keyword BG6a5acd SlateBlue contained containedin=@colorableGroup
|
||||
syn keyword BG708090 SlateGray contained containedin=@colorableGroup
|
||||
syn keyword BG708090 SlateGrey contained containedin=@colorableGroup
|
||||
syn keyword BGfffafa Snow contained containedin=@colorableGroup
|
||||
syn keyword BG00ff7f SpringGreen contained containedin=@colorableGroup
|
||||
syn keyword BG4682b4 SteelBlue contained containedin=@colorableGroup
|
||||
syn keyword BGd2b48c Tan contained containedin=@colorableGroup
|
||||
syn keyword BGd8bfd8 Thistle contained containedin=@colorableGroup
|
||||
syn keyword BGff6347 Tomato contained containedin=@colorableGroup
|
||||
syn keyword BG40e0d0 Turquoise contained containedin=@colorableGroup
|
||||
syn keyword BGee82ee Violet contained containedin=@colorableGroup
|
||||
syn keyword BGf5deb3 Wheat contained containedin=@colorableGroup
|
||||
syn keyword BGf5f5f5 WhiteSmoke contained containedin=@colorableGroup
|
||||
syn keyword BG9acd32 YellowGreen contained containedin=@colorableGroup
|
||||
endfunction
|
||||
72
autoload/dart.vim
Normal file
72
autoload/dart.vim
Normal file
@@ -0,0 +1,72 @@
|
||||
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
|
||||
|
||||
|
||||
endif
|
||||
219
autoload/elixir/indent.vim
Normal file
219
autoload/elixir/indent.vim
Normal file
@@ -0,0 +1,219 @@
|
||||
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'elixir') == -1
|
||||
|
||||
let s:NO_COLON_BEFORE = ':\@<!'
|
||||
let s:NO_COLON_AFTER = ':\@!'
|
||||
let s:ENDING_SYMBOLS = '\]\|}\|)'
|
||||
let s:ARROW = '->'
|
||||
let s:END_WITH_ARROW = s:ARROW.'$'
|
||||
let s:SKIP_SYNTAX = '\%(Comment\|String\)$'
|
||||
let s:BLOCK_SKIP = "synIDattr(synID(line('.'),col('.'),1),'name') =~? '".s:SKIP_SYNTAX."'"
|
||||
let s:DEF = '^\s*def'
|
||||
let s:FN = '\<fn\>'
|
||||
let s:MULTILINE_FN = s:FN.'\%(.*end\)\@!'
|
||||
let s:BLOCK_START = '\%(\<do\>\|'.s:FN.'\)\>'
|
||||
let s:MULTILINE_BLOCK = '\%(\<do\>'.s:NO_COLON_AFTER.'\|'.s:MULTILINE_FN.'\)'
|
||||
let s:BLOCK_MIDDLE = '\<\%(else\|match\|elsif\|catch\|after\|rescue\)\>'
|
||||
let s:BLOCK_END = 'end'
|
||||
let s:STARTS_WITH_PIPELINE = '^\s*|>.*$'
|
||||
let s:QUERY_FROM = '^\s*\<from\>.*\<in\>.*,'
|
||||
let s:ENDING_WITH_ASSIGNMENT = '=\s*$'
|
||||
let s:INDENT_KEYWORDS = s:NO_COLON_BEFORE.'\%('.s:MULTILINE_BLOCK.'\|'.s:BLOCK_MIDDLE.'\)'
|
||||
let s:DEINDENT_KEYWORDS = '^\s*\<\%('.s:BLOCK_END.'\|'.s:BLOCK_MIDDLE.'\)\>'
|
||||
let s:PAIR_START = '\<\%('.s:NO_COLON_BEFORE.s:BLOCK_START.'\)\>'.s:NO_COLON_AFTER
|
||||
let s:PAIR_MIDDLE = '^\s*\%('.s:BLOCK_MIDDLE.'\)\>'.s:NO_COLON_AFTER.'\zs'
|
||||
let s:PAIR_END = '\<\%('.s:NO_COLON_BEFORE.s:BLOCK_END.'\)\>\zs'
|
||||
let s:LINE_COMMENT = '^\s*#'
|
||||
let s:MATCH_OPERATOR = '[^!><=]=[^~=>]'
|
||||
|
||||
function! s:pending_parenthesis(line)
|
||||
if a:line.last_non_blank.text !~ s:ARROW
|
||||
return elixir#util#count_indentable_symbol_diff(a:line.last_non_blank, '(', '\%(end\s*\)\@<!)')
|
||||
end
|
||||
endfunction
|
||||
|
||||
function! s:pending_square_brackets(line)
|
||||
if a:line.last_non_blank.text !~ s:ARROW
|
||||
return elixir#util#count_indentable_symbol_diff(a:line.last_non_blank, '[', ']')
|
||||
end
|
||||
endfunction
|
||||
|
||||
function! s:pending_brackets(line)
|
||||
if a:line.last_non_blank.text !~ s:ARROW
|
||||
return elixir#util#count_indentable_symbol_diff(a:line.last_non_blank, '{', '}')
|
||||
end
|
||||
endfunction
|
||||
|
||||
function! elixir#indent#deindent_case_arrow(ind, line)
|
||||
if get(b:old_ind, 'arrow', 0) > 0
|
||||
\ && (a:line.current.text =~ s:ARROW
|
||||
\ || a:line.current.text =~ s:BLOCK_END)
|
||||
let ind = b:old_ind.arrow
|
||||
let b:old_ind.arrow = 0
|
||||
return ind
|
||||
else
|
||||
return a:ind
|
||||
end
|
||||
endfunction
|
||||
|
||||
function! elixir#indent#deindent_ending_symbols(ind, line)
|
||||
if a:line.current.text =~ '^\s*\('.s:ENDING_SYMBOLS.'\)'
|
||||
return a:ind - &sw
|
||||
else
|
||||
return a:ind
|
||||
end
|
||||
endfunction
|
||||
|
||||
function! elixir#indent#deindent_keywords(ind, line)
|
||||
if a:line.current.text =~ s:DEINDENT_KEYWORDS
|
||||
let bslnum = searchpair(
|
||||
\ s:PAIR_START,
|
||||
\ s:PAIR_MIDDLE,
|
||||
\ s:PAIR_END,
|
||||
\ 'nbW',
|
||||
\ s:BLOCK_SKIP
|
||||
\ )
|
||||
|
||||
return indent(bslnum)
|
||||
else
|
||||
return a:ind
|
||||
end
|
||||
endfunction
|
||||
|
||||
function! elixir#indent#deindent_opened_symbols(ind, line)
|
||||
let s:opened_symbol =
|
||||
\ s:pending_parenthesis(a:line)
|
||||
\ + s:pending_square_brackets(a:line)
|
||||
\ + s:pending_brackets(a:line)
|
||||
|
||||
if s:opened_symbol < 0
|
||||
let ind = get(b:old_ind, 'symbol', a:ind + (s:opened_symbol * &sw))
|
||||
let ind = float2nr(ceil(floor(ind)/&sw)*&sw)
|
||||
return ind <= 0 ? 0 : ind
|
||||
else
|
||||
return a:ind
|
||||
end
|
||||
endfunction
|
||||
|
||||
function! elixir#indent#indent_after_pipeline(ind, line)
|
||||
if exists("b:old_ind.pipeline")
|
||||
\ && elixir#util#is_blank(a:line.last.text)
|
||||
\ && a:line.current.text !~ s:STARTS_WITH_PIPELINE
|
||||
" Reset indentation in pipelines if there is a blank line between
|
||||
" pipes
|
||||
let ind = b:old_ind.pipeline
|
||||
unlet b:old_ind.pipeline
|
||||
return ind
|
||||
elseif a:line.last_non_blank.text =~ s:STARTS_WITH_PIPELINE
|
||||
if empty(substitute(a:line.current.text, ' ', '', 'g'))
|
||||
\ || a:line.current.text =~ s:STARTS_WITH_PIPELINE
|
||||
return indent(a:line.last_non_blank.num)
|
||||
elseif a:line.last_non_blank.text !~ s:INDENT_KEYWORDS
|
||||
let ind = b:old_ind.pipeline
|
||||
unlet b:old_ind.pipeline
|
||||
return ind
|
||||
end
|
||||
end
|
||||
|
||||
return a:ind
|
||||
endfunction
|
||||
|
||||
function! elixir#indent#indent_assignment(ind, line)
|
||||
if a:line.last_non_blank.text =~ s:ENDING_WITH_ASSIGNMENT
|
||||
let b:old_ind.pipeline = indent(a:line.last_non_blank.num) " FIXME: side effect
|
||||
return a:ind + &sw
|
||||
else
|
||||
return a:ind
|
||||
end
|
||||
endfunction
|
||||
|
||||
function! elixir#indent#indent_brackets(ind, line)
|
||||
if s:pending_brackets(a:line) > 0
|
||||
return a:ind + &sw
|
||||
else
|
||||
return a:ind
|
||||
end
|
||||
endfunction
|
||||
|
||||
function! elixir#indent#indent_case_arrow(ind, line)
|
||||
if a:line.last_non_blank.text =~ s:END_WITH_ARROW && a:line.last_non_blank.text !~ '\<fn\>'
|
||||
let b:old_ind.arrow = a:ind
|
||||
return a:ind + &sw
|
||||
else
|
||||
return a:ind
|
||||
end
|
||||
endfunction
|
||||
|
||||
function! elixir#indent#indent_ending_symbols(ind, line)
|
||||
if a:line.last_non_blank.text =~ '^\s*\('.s:ENDING_SYMBOLS.'\)\s*$'
|
||||
return a:ind + &sw
|
||||
else
|
||||
return a:ind
|
||||
end
|
||||
endfunction
|
||||
|
||||
function! elixir#indent#indent_keywords(ind, line)
|
||||
if a:line.last_non_blank.text =~ s:INDENT_KEYWORDS && a:line.last_non_blank.text !~ s:LINE_COMMENT
|
||||
return a:ind + &sw
|
||||
else
|
||||
return a:ind
|
||||
end
|
||||
endfunction
|
||||
|
||||
function! elixir#indent#indent_parenthesis(ind, line)
|
||||
if s:pending_parenthesis(a:line) > 0
|
||||
\ && a:line.last_non_blank.text !~ s:DEF
|
||||
\ && a:line.last_non_blank.text !~ s:END_WITH_ARROW
|
||||
let b:old_ind.symbol = a:ind
|
||||
return matchend(a:line.last_non_blank.text, '(')
|
||||
else
|
||||
return a:ind
|
||||
end
|
||||
endfunction
|
||||
|
||||
function! elixir#indent#indent_pipeline_assignment(ind, line)
|
||||
if a:line.current.text =~ s:STARTS_WITH_PIPELINE
|
||||
\ && a:line.last_non_blank.text =~ s:MATCH_OPERATOR
|
||||
let b:old_ind.pipeline = indent(a:line.last_non_blank.num)
|
||||
" if line starts with pipeline
|
||||
" and last_non_blank line is an attribution
|
||||
" indents pipeline in same level as attribution
|
||||
let assign_pos = match(a:line.last_non_blank.text, '=\s*\zs[^ ]')
|
||||
return (elixir#util#is_indentable_at(a:line.last_non_blank.num, assign_pos) ? assign_pos : a:ind)
|
||||
else
|
||||
return a:ind
|
||||
end
|
||||
endfunction
|
||||
|
||||
function! elixir#indent#indent_pipeline_continuation(ind, line)
|
||||
if a:line.last_non_blank.text =~ s:STARTS_WITH_PIPELINE
|
||||
\ && a:line.current.text =~ s:STARTS_WITH_PIPELINE
|
||||
return indent(a:line.last_non_blank.num)
|
||||
else
|
||||
return a:ind
|
||||
end
|
||||
endfunction
|
||||
|
||||
function! elixir#indent#indent_square_brackets(ind, line)
|
||||
if s:pending_square_brackets(a:line) > 0
|
||||
if a:line.last_non_blank.text =~ '[\s*$'
|
||||
return a:ind + &sw
|
||||
else
|
||||
" if start symbol is followed by a character, indent based on the
|
||||
" whitespace after the symbol, otherwise use the default shiftwidth
|
||||
" Avoid negative indentation index
|
||||
return matchend(a:line.last_non_blank.text, '[\s*')
|
||||
end
|
||||
else
|
||||
return a:ind
|
||||
end
|
||||
endfunction
|
||||
|
||||
function! elixir#indent#indent_ecto_queries(ind, line)
|
||||
if a:line.last_non_blank.text =~ s:QUERY_FROM
|
||||
return a:ind + &sw
|
||||
else
|
||||
return a:ind
|
||||
end
|
||||
endfunction
|
||||
|
||||
endif
|
||||
52
autoload/elixir/util.vim
Normal file
52
autoload/elixir/util.vim
Normal file
@@ -0,0 +1,52 @@
|
||||
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'elixir') == -1
|
||||
|
||||
let s:SKIP_SYNTAX = '\%(Comment\|String\)$'
|
||||
|
||||
function! elixir#util#is_indentable_at(line, col)
|
||||
if a:col == -1 " skip synID lookup for not found match
|
||||
return 1
|
||||
end
|
||||
" TODO: Remove these 2 lines
|
||||
" I don't know why, but for the test on spec/indent/lists_spec.rb:24.
|
||||
" Vim is making some mess on parsing the syntax of 'end', it is being
|
||||
" recognized as 'elixirString' when should be recognized as 'elixirBlock'.
|
||||
call synID(a:line, a:col, 1)
|
||||
" This forces vim to sync the syntax. Using fromstart is very slow on files
|
||||
" over 1k lines
|
||||
syntax sync minlines=20 maxlines=150
|
||||
|
||||
return synIDattr(synID(a:line, a:col, 1), "name")
|
||||
\ !~ s:SKIP_SYNTAX
|
||||
endfunction
|
||||
|
||||
function! elixir#util#count_indentable_symbol_diff(line, open, close)
|
||||
return
|
||||
\ s:match_count(a:line, a:open)
|
||||
\ - s:match_count(a:line, a:close)
|
||||
endfunction
|
||||
|
||||
function! s:match_count(line, pattern)
|
||||
let size = strlen(a:line.text)
|
||||
let index = 0
|
||||
let counter = 0
|
||||
|
||||
while index < size
|
||||
let index = match(a:line.text, a:pattern, index)
|
||||
if index >= 0
|
||||
let index += 1
|
||||
if elixir#util#is_indentable_at(a:line.num, index)
|
||||
let counter +=1
|
||||
end
|
||||
else
|
||||
break
|
||||
end
|
||||
endwhile
|
||||
|
||||
return counter
|
||||
endfunction
|
||||
|
||||
function elixir#util#is_blank(string)
|
||||
return a:string =~ '^\s*$'
|
||||
endfunction
|
||||
|
||||
endif
|
||||
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
|
||||
@@ -1,161 +0,0 @@
|
||||
" ------------------------------------------------------------------------------
|
||||
" Vim omni-completion script
|
||||
" Author: Oscar Hellström
|
||||
" Email: oscar@oscarh.net
|
||||
" Version: 2010-08-10
|
||||
" Contributors: kTT (http://github.com/kTT)
|
||||
" Ricardo Catalinas Jiménez <jimenezrick@gmail.com>
|
||||
" ------------------------------------------------------------------------------
|
||||
|
||||
" Patterns for completions {{{1
|
||||
let s:erlangLocalFuncBeg = '\(\<[0-9A-Za-z_-]*\|\s*\)$'
|
||||
let s:erlangExternalFuncBeg = '\<[0-9A-Za-z_-]\+:[0-9A-Za-z_-]*$'
|
||||
let s:ErlangBlankLine = '^\s*\(%.*\)\?$'
|
||||
let s:erlangCompletionPath = expand('<sfile>:p:h') . '/erlang_completion.erl'
|
||||
|
||||
if !exists('g:erlangCompletionGrep')
|
||||
let g:erlangCompletionGrep = 'grep'
|
||||
endif
|
||||
|
||||
if !exists('g:erlangManSuffix')
|
||||
let g:erlangManSuffix = ''
|
||||
endif
|
||||
|
||||
if !exists('g:erlangManPath')
|
||||
let g:erlangManPath = '/usr/lib/erlang/man'
|
||||
endif
|
||||
|
||||
if !exists('g:erlangCompletionDisplayDoc')
|
||||
let g:erlangCompletionDisplayDoc = 1
|
||||
endif
|
||||
|
||||
" Main function for completion {{{1
|
||||
function! erlangcomplete#Complete(findstart, base)
|
||||
" 0) Init {{{2
|
||||
let lnum = line('.')
|
||||
let column = col('.')
|
||||
let line = strpart(getline('.'), 0, column - 1)
|
||||
|
||||
" 1) First, check if completion is impossible {{{2
|
||||
if line =~ '[^~\\]%'
|
||||
return -1
|
||||
endif
|
||||
|
||||
"echo "line[col - 1]:" . line[column - 1] . " line[col - 2]:" . line[column - 2] . "\n" . line . "\n"
|
||||
|
||||
" 2) Check if the char to the left of us are part of a function call {{{2
|
||||
"
|
||||
" Nothing interesting is written at the char just before the cursor
|
||||
" This means _anything_ could be started here
|
||||
" In this case, keyword completion should probably be used,
|
||||
" for now we'll only try and complete local functions.
|
||||
" TODO: Examine if we can stare Identifiers end complete on them
|
||||
" Is this worth it? Is /completion/ of a "blank" wanted? Can we consider (
|
||||
" interesting and check if we are in a function call etc.?
|
||||
if line[column - 2] !~ '[0-9A-Za-z:_-]'
|
||||
if a:findstart
|
||||
return column
|
||||
else
|
||||
return s:erlangFindLocalFunc(a:base)
|
||||
endif
|
||||
endif
|
||||
|
||||
|
||||
" 3) Function in external module {{{2
|
||||
if line =~ s:erlangExternalFuncBeg
|
||||
let delimiter = match(line, ':[0-9A-Za-z_-]*$') + 1
|
||||
if a:findstart
|
||||
return delimiter
|
||||
else
|
||||
let module = matchstr(line[:-2], '\<\k*\>$')
|
||||
return s:erlangFindExternalFunc(module, a:base)
|
||||
endif
|
||||
endif
|
||||
|
||||
" 4) Local function {{{2
|
||||
if line =~ s:erlangLocalFuncBeg
|
||||
let funcstart = match(line, ':\@<![0-9A-Za-z_-]*$')
|
||||
if a:findstart
|
||||
return funcstart
|
||||
else
|
||||
return s:erlangFindLocalFunc(a:base)
|
||||
endif
|
||||
endif
|
||||
|
||||
" 5) Unhandled situation {{{2
|
||||
if a:findstart
|
||||
return -1
|
||||
else
|
||||
return []
|
||||
endif
|
||||
endfunction
|
||||
|
||||
" Auxiliary functions for completion {{{1
|
||||
" Find the next non-blank line {{{2
|
||||
function s:erlangFindNextNonBlank(lnum)
|
||||
let lnum = nextnonblank(a:lnum + 1)
|
||||
let line = getline(lnum)
|
||||
while line =~ s:ErlangBlankLine && 0 != lnum
|
||||
let lnum = nextnonblank(lnum + 1)
|
||||
let line = getline(lnum)
|
||||
endwhile
|
||||
return lnum
|
||||
endfunction
|
||||
|
||||
" vim: foldmethod=marker:
|
||||
" Find external function names {{{2
|
||||
function s:erlangFindExternalFunc(module, base)
|
||||
" If it's a local module, try to compile it
|
||||
if filereadable(a:module . '.erl') && !filereadable(a:module . '.beam')
|
||||
silent execute '!erlc' a:module . '.erl' '>/dev/null' '2>/dev/null'
|
||||
redraw!
|
||||
endif
|
||||
let functions = system(s:erlangCompletionPath . ' ' . a:module)
|
||||
for element in sort(split(functions, '\n'))
|
||||
if match(element, a:base) == 0
|
||||
let function_name = matchstr(element, a:base . '\w\+')
|
||||
let number_of_args = matchstr(element, '\d\+', len(function_name))
|
||||
let number_of_comma = max([number_of_args - 1, 0])
|
||||
let file_path = g:erlangManPath . '/man?/' . a:module . '\.?' . g:erlangManSuffix
|
||||
" [:-2] cutting some weird characters at the end
|
||||
" becouse grep doesn't support multilines, we have to filter
|
||||
" first by .B and next by looking via function name
|
||||
" if someone have better idea, please change it
|
||||
let description = ''
|
||||
" Don't look man pages if the module is present in the current directory
|
||||
if g:erlangCompletionDisplayDoc != 0 && !filereadable(a:module . '.erl')
|
||||
let system_command = g:erlangCompletionGrep . ' -A 1 "\.B" ' . file_path . ' | grep -EZo "\<' .
|
||||
\ function_name . '\>\((\w+, ){' . number_of_comma . '}[^),]*\) -> .*"'
|
||||
let description = system(system_command)
|
||||
let description = description[:-2]
|
||||
endif
|
||||
if description == ''
|
||||
let description = element " if function doesn't have description e.g. lists:rmerge, put rmerge/2 instead
|
||||
endif
|
||||
let field = {'word': function_name . '(', 'abbr': description, 'kind': 'f', 'dup': 1} " always duplicate functions
|
||||
call complete_add(field)
|
||||
endif
|
||||
endfor
|
||||
return []
|
||||
endfunction
|
||||
|
||||
" Find local function names {{{2
|
||||
function s:erlangFindLocalFunc(base)
|
||||
" begin at line 1
|
||||
let lnum = s:erlangFindNextNonBlank(1)
|
||||
if "" == a:base
|
||||
let base = '\w' " used to match against word symbol
|
||||
else
|
||||
let base = a:base
|
||||
endif
|
||||
while 0 != lnum && !complete_check()
|
||||
let line = getline(lnum)
|
||||
let function_name = matchstr(line, '^' . base . '[0-9A-Za-z_-]\+(\@=')
|
||||
if function_name != ""
|
||||
call complete_add(function_name)
|
||||
endif
|
||||
let lnum = s:erlangFindNextNonBlank(lnum)
|
||||
endwhile
|
||||
return []
|
||||
endfunction
|
||||
|
||||
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
|
||||
@@ -1,103 +0,0 @@
|
||||
" Copyright 2011 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.
|
||||
"
|
||||
" This file provides a utility function that performs auto-completion of
|
||||
" package names, for use by other commands.
|
||||
|
||||
let s:goos = $GOOS
|
||||
let s:goarch = $GOARCH
|
||||
|
||||
if len(s:goos) == 0
|
||||
if exists('g:golang_goos')
|
||||
let s:goos = g:golang_goos
|
||||
elseif has('win32') || has('win64')
|
||||
let s:goos = 'windows'
|
||||
elseif has('macunix')
|
||||
let s:goos = 'darwin'
|
||||
else
|
||||
let s:goos = '*'
|
||||
endif
|
||||
endif
|
||||
|
||||
if len(s:goarch) == 0
|
||||
if exists('g:golang_goarch')
|
||||
let s:goarch = g:golang_goarch
|
||||
else
|
||||
let s:goarch = '*'
|
||||
endif
|
||||
endif
|
||||
|
||||
function! go#complete#PackageMembers(package, member)
|
||||
silent! let content = system('godoc ' . a:package)
|
||||
if v:shell_error || !len(content)
|
||||
return []
|
||||
endif
|
||||
let lines = filter(split(content, "\n"),"v:val !~ '^\\s\\+$'")
|
||||
try
|
||||
let mx1 = '^\s\+\(\S+\)\s\+=\s\+.*'
|
||||
let mx2 = '^\%(const\|var\|type\|func\) \([A-Z][^ (]\+\).*'
|
||||
let candidates =
|
||||
\ map(filter(copy(lines), 'v:val =~ mx1'), 'substitute(v:val, mx1, "\\1", "")')
|
||||
\ + map(filter(copy(lines), 'v:val =~ mx2'), 'substitute(v:val, mx2, "\\1", "")')
|
||||
return filter(candidates, '!stridx(v:val, a:member)')
|
||||
catch
|
||||
return []
|
||||
endtry
|
||||
endfunction
|
||||
|
||||
function! go#complete#Package(ArgLead, CmdLine, CursorPos)
|
||||
let dirs = []
|
||||
|
||||
let words = split(a:CmdLine, '\s\+', 1)
|
||||
if len(words) > 2
|
||||
" Complete package members
|
||||
return go#complete#PackageMembers(words[1], words[2])
|
||||
endif
|
||||
|
||||
if executable('go')
|
||||
let goroot = substitute(system('go env GOROOT'), '\n', '', 'g')
|
||||
if v:shell_error
|
||||
echomsg '''go env GOROOT'' failed'
|
||||
endif
|
||||
else
|
||||
let goroot = $GOROOT
|
||||
endif
|
||||
|
||||
if len(goroot) != 0 && isdirectory(goroot)
|
||||
let dirs += [goroot]
|
||||
endif
|
||||
|
||||
let pathsep = ':'
|
||||
if s:goos == 'windows'
|
||||
let pathsep = ';'
|
||||
endif
|
||||
let workspaces = split($GOPATH, pathsep)
|
||||
if workspaces != []
|
||||
let dirs += workspaces
|
||||
endif
|
||||
|
||||
if len(dirs) == 0
|
||||
" should not happen
|
||||
return []
|
||||
endif
|
||||
|
||||
let ret = {}
|
||||
for dir in dirs
|
||||
" this may expand to multiple lines
|
||||
let root = split(expand(dir . '/pkg/' . s:goos . '_' . s:goarch), "\n")
|
||||
call add(root, expand(dir . '/src'))
|
||||
for r in root
|
||||
for i in split(globpath(r, a:ArgLead.'*'), "\n")
|
||||
if isdirectory(i)
|
||||
let i .= '/'
|
||||
elseif i !~ '\.a$'
|
||||
continue
|
||||
endif
|
||||
let i = substitute(substitute(i[len(r)+1:], '[\\]', '/', 'g'), '\.a$', '', 'g')
|
||||
let ret[i] = i
|
||||
endfor
|
||||
endfor
|
||||
endfor
|
||||
return sort(keys(ret))
|
||||
endfunction
|
||||
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
|
||||
@@ -1,3 +1,5 @@
|
||||
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'ruby') == -1
|
||||
|
||||
" Vim completion script
|
||||
" Language: Ruby
|
||||
" Maintainer: Mark Guzman <segfault@hasno.info>
|
||||
@@ -196,7 +198,7 @@ function! rubycomplete#Complete(findstart, base)
|
||||
if c =~ '\w'
|
||||
continue
|
||||
elseif ! c =~ '\.'
|
||||
idx = -1
|
||||
let idx = -1
|
||||
break
|
||||
else
|
||||
break
|
||||
@@ -704,7 +706,9 @@ class VimRubyCompletion
|
||||
cv = eval("self.class.constants")
|
||||
vartype = get_var_type( receiver )
|
||||
dprint "vartype: %s" % vartype
|
||||
if vartype != ''
|
||||
|
||||
invalid_vartype = ['', "gets"]
|
||||
if !invalid_vartype.include?(vartype)
|
||||
load_buffer_class( vartype )
|
||||
|
||||
begin
|
||||
@@ -732,7 +736,7 @@ class VimRubyCompletion
|
||||
methods.concat m.instance_methods(false)
|
||||
}
|
||||
end
|
||||
variables += add_rails_columns( "#{vartype}" ) if vartype && vartype.length > 0
|
||||
variables += add_rails_columns( "#{vartype}" ) if vartype && !invalid_vartype.include?(vartype)
|
||||
|
||||
when /^\(?\s*[A-Za-z0-9:^@.%\/+*\(\)]+\.\.\.?[A-Za-z0-9:^@.%\/+*\(\)]+\s*\)?\.([^.]*)/
|
||||
message = $1
|
||||
@@ -829,3 +833,5 @@ call s:DefRuby()
|
||||
|
||||
|
||||
" vim:tw=78:sw=4:ts=8:et:fdm=marker:ft=vim:norl:
|
||||
|
||||
endif
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'rust') == -1
|
||||
|
||||
" Author: Kevin Ballard
|
||||
" Description: Helper functions for Rust commands/mappings
|
||||
" Last Modified: May 27, 2014
|
||||
@@ -34,72 +36,74 @@ endfunction
|
||||
" Run {{{1
|
||||
|
||||
function! rust#Run(bang, args)
|
||||
let args = s:ShellTokenize(a:args)
|
||||
if a:bang
|
||||
let idx = index(a:args, '--')
|
||||
let idx = index(l:args, '--')
|
||||
if idx != -1
|
||||
let rustc_args = idx == 0 ? [] : a:args[:idx-1]
|
||||
let args = a:args[idx+1:]
|
||||
let rustc_args = idx == 0 ? [] : l:args[:idx-1]
|
||||
let args = l:args[idx+1:]
|
||||
else
|
||||
let rustc_args = a:args
|
||||
let rustc_args = l:args
|
||||
let args = []
|
||||
endif
|
||||
else
|
||||
let rustc_args = []
|
||||
let args = a:args
|
||||
endif
|
||||
|
||||
let b:rust_last_rustc_args = rustc_args
|
||||
let b:rust_last_args = args
|
||||
let b:rust_last_rustc_args = l:rustc_args
|
||||
let b:rust_last_args = l:args
|
||||
|
||||
call s:WithPath(function("s:Run"), rustc_args, args)
|
||||
endfunction
|
||||
|
||||
function! s:Run(path, rustc_args, args)
|
||||
try
|
||||
let exepath = tempname()
|
||||
if has('win32')
|
||||
let exepath .= '.exe'
|
||||
endif
|
||||
function! s:Run(dict, rustc_args, args)
|
||||
let exepath = a:dict.tmpdir.'/'.fnamemodify(a:dict.path, ':t:r')
|
||||
if has('win32')
|
||||
let exepath .= '.exe'
|
||||
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)')))
|
||||
if output != ''
|
||||
echohl WarningMsg
|
||||
echo output
|
||||
echohl None
|
||||
endif
|
||||
if !v:shell_error
|
||||
exe '!' . shellescape(exepath) . " " . join(map(a:args, 'shellescape(v:val)'))
|
||||
endif
|
||||
finally
|
||||
if exists("exepath")
|
||||
silent! call delete(exepath)
|
||||
endif
|
||||
endtry
|
||||
let pwd = a:dict.istemp ? a:dict.tmpdir : ''
|
||||
let output = s:system(pwd, shellescape(rustc) . " " . join(map(rustc_args, 'shellescape(v:val)')))
|
||||
if output != ''
|
||||
echohl WarningMsg
|
||||
echo output
|
||||
echohl None
|
||||
endif
|
||||
if !v:shell_error
|
||||
exe '!' . shellescape(exepath) . " " . join(map(a:args, 'shellescape(v:val)'))
|
||||
endif
|
||||
endfunction
|
||||
|
||||
" Expand {{{1
|
||||
|
||||
function! rust#Expand(bang, args)
|
||||
if a:bang && !empty(a:args)
|
||||
let pretty = a:args[0]
|
||||
let args = a:args[1:]
|
||||
let args = s:ShellTokenize(a:args)
|
||||
if a:bang && !empty(l:args)
|
||||
let pretty = remove(l:args, 0)
|
||||
else
|
||||
let pretty = "expanded"
|
||||
let args = a:args
|
||||
endif
|
||||
call s:WithPath(function("s:Expand"), pretty, args)
|
||||
endfunction
|
||||
|
||||
function! s:Expand(path, pretty, args)
|
||||
function! s:Expand(dict, pretty, args)
|
||||
try
|
||||
let rustc = exists("g:rustc_path") ? g:rustc_path : "rustc"
|
||||
|
||||
let args = [a:path, '--pretty', a:pretty] + a:args
|
||||
let output = system(shellescape(rustc) . " " . join(map(args, "shellescape(v:val)")))
|
||||
if a:pretty =~? '^\%(everybody_loops$\|flowgraph=\)'
|
||||
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
|
||||
echohl WarningMsg
|
||||
echo output
|
||||
@@ -113,6 +117,20 @@ function! s:Expand(path, pretty, args)
|
||||
setl buftype=nofile
|
||||
setl bufhidden=hide
|
||||
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
|
||||
endtry
|
||||
endfunction
|
||||
@@ -120,7 +138,7 @@ endfunction
|
||||
function! rust#CompleteExpand(lead, line, pos)
|
||||
if a:line[: a:pos-1] =~ '^RustExpand!\s*\S*$'
|
||||
" 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)
|
||||
call filter(list, "v:val[:len(a:lead)-1] == a:lead")
|
||||
endif
|
||||
@@ -133,72 +151,120 @@ endfunction
|
||||
" Emit {{{1
|
||||
|
||||
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
|
||||
|
||||
function! s:Emit(path, type, args)
|
||||
function! s:Emit(dict, type, args)
|
||||
try
|
||||
let output_path = a:dict.tmpdir.'/output'
|
||||
|
||||
let rustc = exists("g:rustc_path") ? g:rustc_path : "rustc"
|
||||
|
||||
let args = [a:path, '--emit', a:type, '-o', '-'] + a:args
|
||||
let output = system(shellescape(rustc) . " " . join(map(args, "shellescape(v:val)")))
|
||||
if v:shell_error
|
||||
let relpath = get(a:dict, 'tmpdir_relpath', a:dict.path)
|
||||
let args = [relpath, '--emit', a:type, '-o', output_path] + a:args
|
||||
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
|
||||
echo output
|
||||
echohl None
|
||||
else
|
||||
endif
|
||||
if !v:shell_error
|
||||
new
|
||||
silent put =output
|
||||
exe 'silent keepalt read' fnameescape(output_path)
|
||||
1
|
||||
d
|
||||
if a:type == "ir"
|
||||
if a:type == "llvm-ir"
|
||||
setl filetype=llvm
|
||||
let extension = 'll'
|
||||
elseif a:type == "asm"
|
||||
setl filetype=asm
|
||||
let extension = 's'
|
||||
endif
|
||||
setl buftype=nofile
|
||||
setl bufhidden=hide
|
||||
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
|
||||
endtry
|
||||
endfunction
|
||||
|
||||
" 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, ...)
|
||||
let buf = bufnr('')
|
||||
let saved = {}
|
||||
let dict = {}
|
||||
try
|
||||
let save_write = &write
|
||||
let saved.write = &write
|
||||
set write
|
||||
let path = expand('%')
|
||||
let pathisempty = empty(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 dict.path = expand('%')
|
||||
let pathisempty = empty(dict.path)
|
||||
|
||||
let save_cwd = getcwd()
|
||||
silent exe 'lcd' tmpdir
|
||||
" Always create a tmpdir in case the wrapped command wants it
|
||||
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
|
||||
|
||||
silent exe 'keepalt write! ' . path
|
||||
silent exe 'keepalt write! ' . fnameescape(dict.path)
|
||||
if pathisempty
|
||||
silent keepalt 0file
|
||||
endif
|
||||
else
|
||||
let dict.istemp = 0
|
||||
update
|
||||
endif
|
||||
|
||||
call call(a:func, [path] + a:000)
|
||||
call call(a:func, [dict] + a:000)
|
||||
finally
|
||||
if exists("save_mod") | let &mod = save_mod | endif
|
||||
if exists("save_write") | let &write = save_write | endif
|
||||
if exists("save_cwd") | silent exe 'lcd' save_cwd | endif
|
||||
if exists("tmpdir") | silent call s:RmDir(tmpdir) | endif
|
||||
if bufexists(buf)
|
||||
for [opt, value] in items(saved)
|
||||
silent call setbufvar(buf, '&'.opt, value)
|
||||
unlet value " avoid variable type mismatches
|
||||
endfor
|
||||
endif
|
||||
if has_key(dict, 'tmpdir') | silent call s:RmDir(dict.tmpdir) | endif
|
||||
endtry
|
||||
endfunction
|
||||
|
||||
@@ -208,6 +274,71 @@ function! rust#AppendCmdLine(text)
|
||||
return cmd
|
||||
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)
|
||||
" sanity check; make sure it's not empty, /, or $HOME
|
||||
if empty(a:path)
|
||||
@@ -217,9 +348,71 @@ function! s:RmDir(path)
|
||||
echoerr 'Attempted to delete protected path: ' . a:path
|
||||
return 0
|
||||
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
|
||||
|
||||
" }}}1
|
||||
|
||||
" vim: set noet sw=4 ts=4:
|
||||
|
||||
endif
|
||||
|
||||
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
|
||||
@@ -1,3 +1,5 @@
|
||||
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'html5') == -1
|
||||
|
||||
" Vim completion for WAI-ARIA data file
|
||||
" Language: HTML + WAI-ARIA
|
||||
" Maintainer: othree <othree@gmail.com>
|
||||
@@ -16,8 +18,10 @@ let default_role = {}
|
||||
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 document_structure = ['article', 'columnheader', 'definition', 'directory', 'document', 'group', 'heading', 'img', 'list', 'listitem', 'math', 'note', 'presentation', 'region', 'row', 'rowheader', 'separator']
|
||||
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(role, landmark_role)
|
||||
let role = extend(role, dpub_role)
|
||||
|
||||
" http://www.w3.org/TR/wai-aria/states_and_properties#state_prop_taxonomy
|
||||
"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']}
|
||||
@@ -230,3 +234,5 @@ let g:xmldata_aria = {
|
||||
\ 'default_role': default_role,
|
||||
\ 'vimariaattrinfo': aria_attributes_value
|
||||
\ }
|
||||
|
||||
endif
|
||||
|
||||
@@ -1,7 +1,9 @@
|
||||
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'html5') == -1
|
||||
|
||||
" Vim completion for HTML5 data file
|
||||
" Language: HTML5
|
||||
" Maintainer: othree <othree@gmail.com>
|
||||
" Last Change: 2011 Apr 9
|
||||
" Language: HTML (version 5.1 Draft 2016 Jan 13)
|
||||
" Maintainer: Kao, Wei-Ko(othree) ( othree AT gmail DOT com )
|
||||
" Last Change: 2016 Jan 20
|
||||
|
||||
|
||||
" Lang Tag: {{{
|
||||
@@ -60,6 +62,8 @@ let charset = [
|
||||
\ '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: {{{
|
||||
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']}
|
||||
@@ -78,7 +82,7 @@ let attributes_value = {
|
||||
\ 'action': ['URL', ''],
|
||||
\ 'alt': ['Text', ''],
|
||||
\ 'async': ['Bool', ''],
|
||||
\ 'autocomplete': ['on/off', ''],
|
||||
\ 'autocomplete': ['*Token', ''],
|
||||
\ 'autofocus': ['Bool', ''],
|
||||
\ 'autoplay': ['Bool', ''],
|
||||
\ 'border': ['1', ''],
|
||||
@@ -316,15 +320,17 @@ if g:html5_aria_attributes_complete == 1
|
||||
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 document_structure = ['article', 'columnheader', 'definition', 'directory', 'document', 'group', 'heading', 'img', 'list', 'listitem', 'math', 'note', 'presentation', 'region', 'row', 'rowheader', 'separator']
|
||||
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(role, landmark_role)
|
||||
let role = extend(role, dpub_role)
|
||||
let global_attributes = extend(global_attributes, {'role': role})
|
||||
endif
|
||||
" }}}
|
||||
|
||||
" Ref: http://dev.w3.org/html5/markup/
|
||||
" Version: Draft 05 April 2011
|
||||
let phrasing_elements = ['a', 'em', 'strong', 'small', 'mark', 'abbr', 'dfn', 'i', 'b', 'u', 'code', 'var', 'samp', 'kbd', 'sup', 'sub', 'q', 'cite', 'span', 'bdo', 'bdi', 'br', 'wbr', 'ins', 'del', 'img', 'embed', 'object', 'iframe', 'map', 'area', 'script', 'noscript', 'ruby', 'video', 'audio', 'input', 'textarea', 'select', 'button', 'label', 'output', 'datalist', 'keygen', 'progress', 'command', 'canvas', 'time', 'meter', 'data', 'content', 'shadow']
|
||||
let phrasing_elements = ['a', 'em', 'strong', 'small', 'mark', 'abbr', 'dfn', 'i', 'b', 'u', 'code', 'var', 'samp', 'kbd', 'sup', 'sub', 'q', 'cite', 'span', 'bdo', 'bdi', 'br', 'wbr', 'ins', 'del', 'img', 'picture', 'embed', 'object', 'iframe', 'map', 'area', 'script', 'noscript', 'ruby', 'video', 'audio', 'input', 'textarea', 'select', 'button', 'label', 'output', 'datalist', 'keygen', 'progress', 'command', 'canvas', 'time', 'meter', 'data', 'content', 'shadow']
|
||||
|
||||
let metadata_elements = ['link', 'style', 'meta', 'script', 'noscript', 'command']
|
||||
|
||||
@@ -345,7 +351,7 @@ let g:xmldata_html5 = {
|
||||
\ 'vimxmlroot': ['html', 'head', 'body'] + flow_elements,
|
||||
\ 'a': [
|
||||
\ 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': [
|
||||
\ phrasing_elements,
|
||||
@@ -357,7 +363,7 @@ let g:xmldata_html5 = {
|
||||
\ ],
|
||||
\ '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': [
|
||||
\ flow_elements + ['style'],
|
||||
@@ -493,7 +499,7 @@ let g:xmldata_html5 = {
|
||||
\ ],
|
||||
\ 'form': [
|
||||
\ 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': [
|
||||
\ phrasing_elements,
|
||||
@@ -545,15 +551,15 @@ let g:xmldata_html5 = {
|
||||
\ ],
|
||||
\ 'iframe': [
|
||||
\ [],
|
||||
\ extend(copy(global_attributes), {'src': [], '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']})
|
||||
\ ],
|
||||
\ 'img': [
|
||||
\ [],
|
||||
\ extend(copy(global_attributes), {'src': [], 'alt': [], 'height': [], 'width': [], 'usemap': [], 'ismap': ['ismap', '']})
|
||||
\ extend(copy(global_attributes), {'src': [], 'alt': [], 'height': [], 'width': [], 'usemap': [], 'ismap': ['ismap', ''], 'referrerpolicy': ['no-referrer', 'no-referrer-when-downgrade', 'origin', 'origin-when-cross-origin', 'unsafe-url']})
|
||||
\ ],
|
||||
\ 'input': [
|
||||
\ [],
|
||||
\ 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': [
|
||||
\ flow_elements,
|
||||
@@ -581,7 +587,7 @@ let g:xmldata_html5 = {
|
||||
\ ],
|
||||
\ 'link': [
|
||||
\ [],
|
||||
\ extend(copy(global_attributes), {'href': [], 'rel': linkreltypes, 'hreflang': lang_tag, 'media': [], 'type': [], 'sizes': ['any']})
|
||||
\ extend(copy(global_attributes), {'href': [], 'rel': linkreltypes, 'hreflang': lang_tag, 'media': [], 'type': [], 'sizes': ['any'], 'referrerpolicy': ['no-referrer', 'no-referrer-when-downgrade', 'origin', 'origin-when-cross-origin', 'unsafe-url']})
|
||||
\ ],
|
||||
\ 'main': [
|
||||
\ flow_elements + ['style'],
|
||||
@@ -596,12 +602,16 @@ let g:xmldata_html5 = {
|
||||
\ global_attributes
|
||||
\ ],
|
||||
\ 'menu': [
|
||||
\ flow_elements + ['li'],
|
||||
\ flow_elements + ['menuitem'],
|
||||
\ 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': [
|
||||
\ [],
|
||||
\ extend(copy(global_attributes), {'name': [], '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})
|
||||
\ ],
|
||||
\ 'meter': [
|
||||
\ phrasing_elements,
|
||||
@@ -643,6 +653,10 @@ let g:xmldata_html5 = {
|
||||
\ [],
|
||||
\ extend(copy(global_attributes), {'name': [], 'value': []})
|
||||
\ ],
|
||||
\ 'picture': [
|
||||
\ flow_elements + ['source'],
|
||||
\ global_attributes
|
||||
\ ],
|
||||
\ 'pre': [
|
||||
\ phrasing_elements,
|
||||
\ global_attributes
|
||||
@@ -655,6 +669,10 @@ let g:xmldata_html5 = {
|
||||
\ phrasing_elements,
|
||||
\ extend(copy(global_attributes), {'cite': []})
|
||||
\ ],
|
||||
\ 'rb': [
|
||||
\ phrasing_elements,
|
||||
\ global_attributes
|
||||
\ ],
|
||||
\ 'rp': [
|
||||
\ phrasing_elements,
|
||||
\ global_attributes
|
||||
@@ -663,17 +681,21 @@ let g:xmldata_html5 = {
|
||||
\ phrasing_elements,
|
||||
\ global_attributes
|
||||
\ ],
|
||||
\ 'ruby': [
|
||||
\ 'rtc': [
|
||||
\ phrasing_elements + ['rp', 'rt'],
|
||||
\ global_attributes
|
||||
\ ],
|
||||
\ 'ruby': [
|
||||
\ phrasing_elements + ['rb', 'rp', 'rt', 'rtc'],
|
||||
\ global_attributes
|
||||
\ ],
|
||||
\ 'samp': [
|
||||
\ phrasing_elements,
|
||||
\ global_attributes
|
||||
\ ],
|
||||
\ 'script': [
|
||||
\ [],
|
||||
\ extend(copy(global_attributes), {'src': [], 'defer': ['defer', ''], 'async': ['async', ''], 'type': [], 'charset': charset})
|
||||
\ extend(copy(global_attributes), {'src': [], 'defer': ['defer', ''], 'async': ['async', ''], 'type': [], 'charset': charset, 'nonce': []})
|
||||
\ ],
|
||||
\ 'section': [
|
||||
\ flow_elements + ['style'],
|
||||
@@ -693,7 +715,7 @@ let g:xmldata_html5 = {
|
||||
\ ],
|
||||
\ 'source': [
|
||||
\ [],
|
||||
\ extend(copy(global_attributes), {'src': [], 'type': [], 'media': []})
|
||||
\ extend(copy(global_attributes), {'src': [], 'type': [], 'media': [], 'srcset': [], 'sizes': []})
|
||||
\ ],
|
||||
\ 'span': [
|
||||
\ phrasing_elements,
|
||||
@@ -705,7 +727,7 @@ let g:xmldata_html5 = {
|
||||
\ ],
|
||||
\ 'style': [
|
||||
\ [],
|
||||
\ extend(copy(global_attributes), {'type': [], 'media': [], 'scoped': ['scoped', '']})
|
||||
\ extend(copy(global_attributes), {'type': [], 'media': [], 'scoped': ['scoped', ''], 'nonce': []})
|
||||
\ ],
|
||||
\ 'sub': [
|
||||
\ phrasing_elements,
|
||||
@@ -811,3 +833,5 @@ let g:xmldata_html5 = {
|
||||
\ 'wbr': ['/>', ''],
|
||||
\ },
|
||||
\ }
|
||||
|
||||
endif
|
||||
|
||||
138
build
138
build
@@ -3,13 +3,25 @@
|
||||
set -E
|
||||
|
||||
DIRS="syntax indent compiler autoload ftplugin ftdetect after/syntax after/indent after/ftplugin after/ftdetect"
|
||||
DIRS_BASIC="syntax compiler indent ftdetect after/syntax after/indent after/ftdetect"
|
||||
DIRS_ALL="syntax indent compiler autoload ftplugin ftdetect after"
|
||||
DIRS_SYNTAX="syntax ftdetect after/syntax after/ftdetect"
|
||||
DIRS_JAVASCRIPT="${DIRS} extras"
|
||||
DIRS_RM="$DIRS_JAVASCRIPT"
|
||||
|
||||
OUTPUT=""
|
||||
|
||||
output() {
|
||||
OUTPUT="$OUTPUT$1"
|
||||
printf -- "$1"
|
||||
}
|
||||
|
||||
download() {
|
||||
for pack in $1; do
|
||||
path="$(printf "$pack" | cut -d ':' -f 2)"
|
||||
dir="tmp/$(printf "$path" | cut -d '/' -f 2)"
|
||||
rm -rf "$dir"
|
||||
(git clone -q --recursive "https://github.com/$path.git" "$dir" && printf '.') &
|
||||
(mkdir -p "$dir" && curl --silent -L https://codeload.github.com/$path/tar.gz/master | tar -zx -C "$dir" --strip 1 && printf '.') &
|
||||
done
|
||||
|
||||
wait
|
||||
@@ -21,30 +33,33 @@ extract() {
|
||||
name="$(printf "$pack" | cut -d ':' -f 1)"
|
||||
path="$(printf "$pack" | cut -d ':' -f 2)"
|
||||
dir="tmp/$(printf "$path" | cut -d '/' -f 2)"
|
||||
printf -- "- [$name](https://github.com/$path) ("
|
||||
directories="DIRS$(printf "$pack" | cut -d ':' -f 3)"
|
||||
subtree="$(printf "$pack" | cut -d ':' -f 4)"
|
||||
output "- [$name](https://github.com/$path) ("
|
||||
|
||||
subdirs=""
|
||||
for subdir in $DIRS; do
|
||||
if [ -d "$dir/$subdir" ]; then
|
||||
for subdir in ${!directories}; do
|
||||
if [ -d "${dir}${subtree:-/}${subdir}" ]; then
|
||||
base="$(basename "$subdir")"
|
||||
if [[ "$subdirs" != *"$base"* ]]; then
|
||||
subdirs="$subdirs, $base"
|
||||
fi
|
||||
|
||||
copy_dir "$dir" "$subdir"
|
||||
copy_dir "${dir}${subtree}" "$subdir" "$name"
|
||||
fi
|
||||
done
|
||||
|
||||
|
||||
printf "${subdirs##, })\n"
|
||||
output "${subdirs##, })\n"
|
||||
done
|
||||
|
||||
for pack in $1; do
|
||||
name="$(printf "$pack" | cut -d ':' -f 1)"
|
||||
path="$(printf "$pack" | cut -d ':' -f 2)"
|
||||
dir="tmp/$(printf "$path" | cut -d '/' -f 2)"
|
||||
subtree="$(printf "$pack" | cut -d ':' -f 4)"
|
||||
|
||||
if [ -d "$dir/plugin" ]; then
|
||||
if [ -d "$dir${subtree:-/}plugin" ]; then
|
||||
printf "Possible error (plugin directory exists): $path\n"
|
||||
fi
|
||||
done
|
||||
@@ -55,82 +70,143 @@ copy_dir() {
|
||||
file_path="$(dirname "${file##$1/}")"
|
||||
mkdir -p "$file_path"
|
||||
touch "$file_path/$(basename "$file")"
|
||||
cat $file >> $file_path/$(basename "$file")
|
||||
|
||||
# Use comma instead of / to handle cases like c/c++
|
||||
sed -e "s,%%PACK%%,$3," -e "/%%CONTENT%%/{r $file" -e "d;}" plugin_guard.vim.template >> $file_path/$(basename "$file")
|
||||
done
|
||||
}
|
||||
|
||||
concat_ftdetect() {
|
||||
cat ftdetect/* | grep -E '^[^"]' > tmp/polyglot.vim
|
||||
echo "augroup filetypedetect" > tmp/polyglot.vim
|
||||
cat config.vim >> tmp/polyglot.vim
|
||||
for f in ftdetect/*; do (echo '" '"$f"; cat "${f}"; echo) >> tmp/polyglot.vim; done
|
||||
echo "augroup END" >> tmp/polyglot.vim
|
||||
rm -f ftdetect/*
|
||||
mv tmp/polyglot.vim ftdetect/
|
||||
}
|
||||
|
||||
update_readme() {
|
||||
OLD_README="$(cat README.md)"
|
||||
|
||||
ed README.md <<- EOF
|
||||
/Language packs
|
||||
+2kb
|
||||
/##
|
||||
'b,-2c
|
||||
$(printf -- "$OUTPUT")
|
||||
.
|
||||
w
|
||||
q
|
||||
EOF
|
||||
|
||||
}
|
||||
|
||||
PACKS="
|
||||
applescript:vim-scripts/applescript.vim
|
||||
ansible:pearofducks/ansible-vim
|
||||
arduino:sudar/vim-arduino-syntax
|
||||
blade:jwalton512/vim-blade
|
||||
c++11:octol/vim-cpp-enhanced-highlight
|
||||
c/c++:vim-jp/cpp-vim
|
||||
c-extensions:kergoth/aftersyntaxc.vim
|
||||
c/c++:vim-jp/vim-cpp
|
||||
cjsx:mtscout6/vim-cjsx
|
||||
clojure:guns/vim-clojure-static
|
||||
coffee-script:kchmck/vim-coffee-script
|
||||
csv:chrisbra/csv.vim
|
||||
cryptol:victoredwardocallaghan/cryptol.vim
|
||||
crystal:rhysd/vim-crystal
|
||||
cql:elubow/cql-vim
|
||||
css:JulesWang/css.vim
|
||||
cucumber:tpope/vim-cucumber
|
||||
dart:dart-lang/dart-vim-plugin
|
||||
dockerfile:honza/dockerfile.vim
|
||||
elixir:elixir-lang/vim-elixir
|
||||
emberscript:heartsentwined/vim-ember-script
|
||||
erlang:oscarh/vimerl
|
||||
elm:lambdatoast/elm.vim
|
||||
emberscript:yalesov/vim-ember-script
|
||||
emblem:yalesov/vim-emblem
|
||||
erlang:vim-erlang/vim-erlang-runtime
|
||||
fish:dag/vim-fish
|
||||
git:tpope/vim-git
|
||||
go:jnwhiteh/vim-golang
|
||||
haml:tpope/vim-haml
|
||||
glsl:tikhomirov/vim-glsl
|
||||
go:fatih/vim-go:_BASIC
|
||||
groovy:vim-scripts/groovy.vim
|
||||
haml:sheerun/vim-haml
|
||||
handlebars:mustache/vim-mustache-handlebars
|
||||
haskell:travitch/hasksyn
|
||||
haskell:neovimhaskell/haskell-vim
|
||||
haxe:yaymukund/vim-haxe
|
||||
html5:othree/html5.vim
|
||||
jade:digitaltoad/vim-jade
|
||||
i3:PotatoesMaster/i3-vim-syntax
|
||||
jasmine:glanotte/vim-jasmine
|
||||
javascript:pangloss/vim-javascript
|
||||
json:leshill/vim-json
|
||||
javascript:pangloss/vim-javascript:_JAVASCRIPT
|
||||
json:elzr/vim-json
|
||||
jst:briancollins/vim-jst
|
||||
jsx:mxw/vim-jsx:_ALL
|
||||
julia:dcjones/julia-minimalist-vim
|
||||
kotlin:udalov/kotlin-vim
|
||||
latex:LaTeX-Box-Team/LaTeX-Box
|
||||
less:groenewege/vim-less
|
||||
liquid:tpope/vim-liquid
|
||||
markdown:tpope/vim-markdown
|
||||
nginx:mutewinter/nginx.vim
|
||||
livescript:gkz/vim-ls
|
||||
lua:tbastos/vim-lua
|
||||
mako:sophacles/vim-bundle-mako
|
||||
markdown:plasticboy/vim-markdown:_SYNTAX
|
||||
nginx:othree/nginx-contrib-vim
|
||||
nim:zah/nim.vim:_BASIC
|
||||
nix:spwhitt/vim-nix
|
||||
objc:b4winckler/vim-objc
|
||||
ocaml:jrk/vim-ocaml
|
||||
octave:vim-scripts/octave.vim--
|
||||
opencl:petRUShka/vim-opencl
|
||||
perl:vim-perl/vim-perl
|
||||
pgsql:exu/pgsql.vim
|
||||
php:StanAngeloff/php.vim
|
||||
puppet:rodjek/vim-puppet
|
||||
plantuml:aklt/plantuml-syntax
|
||||
powershell:PProvost/vim-ps1
|
||||
protobuf:uarun/vim-protobuf
|
||||
pug:digitaltoad/vim-pug
|
||||
puppet:voxpupuli/vim-puppet
|
||||
purescript:raichoo/purescript-vim
|
||||
python:mitsuhiko/vim-python-combined
|
||||
python-compiler:aliev/vim-compiler-python
|
||||
qml:peterhoeg/vim-qml
|
||||
r-lang:vim-scripts/R.vim
|
||||
raml:IN3D/vim-raml
|
||||
ragel:jneen/ragel.vim
|
||||
rspec:sheerun/rspec.vim
|
||||
ruby:vim-ruby/vim-ruby
|
||||
rust:wting/rust.vim
|
||||
rust:rust-lang/rust.vim
|
||||
sbt:derekwyatt/vim-sbt
|
||||
scala:derekwyatt/vim-scala
|
||||
scss:cakebaker/scss-syntax.vim
|
||||
slim:slim-template/vim-slim
|
||||
solidity:ethereum/vim-solidity
|
||||
stylus:wavded/vim-stylus
|
||||
swift:keith/swift.vim
|
||||
systemd:kurayama/systemd-vim-syntax
|
||||
terraform:hashivim/vim-terraform
|
||||
textile:timcharper/textile.vim
|
||||
tmux:acustodioo/vim-tmux
|
||||
tomdoc:duwanis/tomdoc.vim
|
||||
typescript:leafgarland/typescript-vim
|
||||
vbnet:vim-scripts/vbnet.vim
|
||||
thrift:solarnz/thrift.vim
|
||||
tmux:keith/tmux.vim
|
||||
tomdoc:wellbredgrapefruit/tomdoc.vim
|
||||
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
|
||||
yaml:stephpy/vim-yaml
|
||||
yard:sheerun/vim-yardoc
|
||||
css-color:ap/vim-css-color
|
||||
"
|
||||
|
||||
rm -rf tmp
|
||||
rm -rf $DIRS
|
||||
rm -rf $DIRS_RM
|
||||
mkdir tmp
|
||||
|
||||
printf "Downloading packs..."
|
||||
download "$PACKS"
|
||||
extract "$PACKS"
|
||||
concat_ftdetect
|
||||
update_readme
|
||||
|
||||
rm -rf tmp
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'coffee-script') == -1
|
||||
|
||||
" Language: CoffeeScript
|
||||
" Maintainer: Mick Koch <kchmck@gmail.com>
|
||||
" Maintainer: Mick Koch <mick@kochm.co>
|
||||
" URL: http://github.com/kchmck/vim-coffee-script
|
||||
" License: WTFPL
|
||||
|
||||
@@ -13,3 +15,5 @@ call coffee#CoffeeSetUpVariables()
|
||||
exec 'CompilerSet makeprg=' . escape(g:coffee_cake . ' ' .
|
||||
\ g:coffee_cake_options . ' $*', ' ')
|
||||
call coffee#CoffeeSetUpErrorFormat()
|
||||
|
||||
endif
|
||||
|
||||
32
compiler/cargo.vim
Normal file
32
compiler/cargo.vim
Normal file
@@ -0,0 +1,32 @@
|
||||
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'rust') == -1
|
||||
|
||||
" Vim compiler file
|
||||
" Compiler: Cargo Compiler
|
||||
" Maintainer: Damien Radtke <damienradtke@gmail.com>
|
||||
" Latest Revision: 2014 Sep 24
|
||||
|
||||
if exists('current_compiler')
|
||||
finish
|
||||
endif
|
||||
runtime compiler/rustc.vim
|
||||
let current_compiler = "cargo"
|
||||
|
||||
if exists(':CompilerSet') != 2
|
||||
command -nargs=* CompilerSet setlocal <args>
|
||||
endif
|
||||
|
||||
if exists('g:cargo_makeprg_params')
|
||||
execute 'CompilerSet makeprg=cargo\ '.escape(g:cargo_makeprg_params, ' \|"').'\ $*'
|
||||
else
|
||||
CompilerSet makeprg=cargo\ $*
|
||||
endif
|
||||
|
||||
" Ignore general cargo progress messages
|
||||
CompilerSet errorformat+=
|
||||
\%-G%\\s%#Downloading%.%#,
|
||||
\%-G%\\s%#Compiling%.%#,
|
||||
\%-G%\\s%#Finished%.%#,
|
||||
\%-G%\\s%#error:\ Could\ not\ compile\ %.%#,
|
||||
\%-G%\\s%#To\ learn\ more\\,%.%#
|
||||
|
||||
endif
|
||||
@@ -1,5 +1,7 @@
|
||||
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'coffee-script') == -1
|
||||
|
||||
" Language: CoffeeScript
|
||||
" Maintainer: Mick Koch <kchmck@gmail.com>
|
||||
" Maintainer: Mick Koch <mick@kochm.co>
|
||||
" URL: http://github.com/kchmck/vim-coffee-script
|
||||
" License: WTFPL
|
||||
|
||||
@@ -80,3 +82,5 @@ augroup CoffeeUpdateMakePrg
|
||||
autocmd BufWritePre,BufFilePost call s:UpdateMakePrg()
|
||||
endif
|
||||
augroup END
|
||||
|
||||
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
|
||||
@@ -1,3 +1,5 @@
|
||||
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'cucumber') == -1
|
||||
|
||||
" Vim compiler file
|
||||
" Compiler: Cucumber
|
||||
" Maintainer: Tim Pope <vimNOSPAM@tpope.org>
|
||||
@@ -19,7 +21,7 @@ CompilerSet makeprg=cucumber
|
||||
|
||||
CompilerSet errorformat=
|
||||
\%W%m\ (Cucumber::Undefined),
|
||||
\%E%m\ (%.%#),
|
||||
\%E%m\ (%\\S%#),
|
||||
\%Z%f:%l,
|
||||
\%Z%f:%l:%.%#
|
||||
|
||||
@@ -27,3 +29,5 @@ let &cpo = s:cpo_save
|
||||
unlet s:cpo_save
|
||||
|
||||
" vim:set sw=2 sts=2:
|
||||
|
||||
endif
|
||||
|
||||
@@ -1,80 +0,0 @@
|
||||
" Erlang compiler file
|
||||
" Language: Erlang
|
||||
" Maintainer: Pawel 'kTT' Salata <rockplayer.pl@gmail.com>
|
||||
" URL: http://ktototaki.info
|
||||
|
||||
if exists("current_compiler")
|
||||
finish
|
||||
endif
|
||||
let current_compiler = "erlang"
|
||||
|
||||
if exists(":CompilerSet") != 2
|
||||
command -nargs=* CompilerSet setlocal <args>
|
||||
endif
|
||||
|
||||
if !exists('g:erlangCheckFile')
|
||||
let g:erlangCheckFile = "~/.vim/compiler/erlang_check_file.erl"
|
||||
endif
|
||||
|
||||
if !exists('g:erlangHighlightErrors')
|
||||
let g:erlangHighlightErrors = 0
|
||||
endif
|
||||
|
||||
let b:error_list = {}
|
||||
let b:is_showing_msg = 0
|
||||
|
||||
function! HighlightErlangErrors()
|
||||
if match(getline(1), "#!.*escript") != -1
|
||||
setlocal makeprg=escript\ -s\ %
|
||||
else
|
||||
execute "setlocal makeprg=" . g:erlangCheckFile . "\\ \%"
|
||||
endif
|
||||
silent make!
|
||||
call s:clear_matches()
|
||||
for error in getqflist()
|
||||
let item = {}
|
||||
let item['lnum'] = error.lnum
|
||||
let item['msg'] = error.text
|
||||
let b:error_list[error.lnum] = item
|
||||
call matchadd('SpellBad', "\\%" . error.lnum . "l")
|
||||
endfor
|
||||
if len(getqflist())
|
||||
redraw!
|
||||
endif
|
||||
call s:show_msg()
|
||||
setlocal makeprg=erlc\ %
|
||||
endfunction
|
||||
|
||||
function! s:show_msg()
|
||||
let pos = getpos(".")
|
||||
if has_key(b:error_list, pos[1])
|
||||
let item = get(b:error_list, pos[1])
|
||||
echo item.msg
|
||||
let b:is_showing_msg = 1
|
||||
else
|
||||
if exists("b:is_showing_msg") && b:is_showing_msg == 1
|
||||
echo
|
||||
let b:is_showing_msg = 0
|
||||
endif
|
||||
endif
|
||||
endf
|
||||
|
||||
function! s:clear_matches()
|
||||
call clearmatches()
|
||||
let b:error_list = {}
|
||||
if exists("b:is_showing_msg") && b:is_showing_msg == 1
|
||||
echo
|
||||
let b:is_showing_msg = 0
|
||||
endif
|
||||
endfunction
|
||||
|
||||
CompilerSet makeprg=erlc\ %
|
||||
CompilerSet errorformat=%f:%l:\ %tarning:\ %m,%E%f:%l:\ %m
|
||||
|
||||
if g:erlangHighlightErrors
|
||||
autocmd BufLeave *.erl call s:clear_matches()
|
||||
autocmd BufEnter *.erl call s:clear_matches()
|
||||
autocmd BufWritePost *.erl call HighlightErlangErrors()
|
||||
autocmd CursorHold *.erl call s:show_msg()
|
||||
autocmd CursorMoved *.erl call s:show_msg()
|
||||
endif
|
||||
@@ -1,3 +1,5 @@
|
||||
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'ruby') == -1
|
||||
|
||||
" Vim compiler file
|
||||
" Language: eRuby
|
||||
" Maintainer: Doug Kearns <dougkearns@gmail.com>
|
||||
@@ -37,3 +39,5 @@ let &cpo = s:cpo_save
|
||||
unlet s:cpo_save
|
||||
|
||||
" vim: nowrap sw=2 sts=2 ts=8:
|
||||
|
||||
endif
|
||||
|
||||
15
compiler/eslint.vim
Normal file
15
compiler/eslint.vim
Normal file
@@ -0,0 +1,15 @@
|
||||
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'javascript') == -1
|
||||
|
||||
if exists("current_compiler")
|
||||
finish
|
||||
endif
|
||||
let current_compiler = "eslint"
|
||||
|
||||
if exists(":CompilerSet") != 2
|
||||
command! -nargs=* CompilerSet setlocal <args>
|
||||
endif
|
||||
|
||||
CompilerSet makeprg=eslint\ -f\ compact\ %
|
||||
CompilerSet errorformat=%f:\ line\ %l\\,\ col\ %c\\,\ %m
|
||||
|
||||
endif
|
||||
@@ -1,8 +1,5 @@
|
||||
" Vim compiler file
|
||||
" Language: ExUnit
|
||||
" Maintainer: Rein Henrichs <rein.henrichs@gmail.com>
|
||||
" URL: https://github.com/elixir-lang/vim-elixir
|
||||
|
||||
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'elixir') == -1
|
||||
|
||||
if exists("current_compiler")
|
||||
finish
|
||||
endif
|
||||
@@ -14,11 +11,19 @@ endif
|
||||
|
||||
let s:cpo_save = &cpo
|
||||
set cpo-=C
|
||||
|
||||
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
|
||||
unlet s:cpo_save
|
||||
|
||||
" vim: nowrap sw=2 sts=2 ts=8:
|
||||
|
||||
endif
|
||||
|
||||
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
|
||||
@@ -1,3 +1,5 @@
|
||||
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.
|
||||
@@ -5,26 +7,39 @@
|
||||
" compiler/go.vim: Vim compiler file for Go.
|
||||
|
||||
if exists("current_compiler")
|
||||
finish
|
||||
finish
|
||||
endif
|
||||
let current_compiler = "go"
|
||||
|
||||
if exists(":CompilerSet") != 2
|
||||
command -nargs=* CompilerSet setlocal <args>
|
||||
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
|
||||
|
||||
CompilerSet makeprg=go\ build
|
||||
CompilerSet errorformat=
|
||||
\%-G#\ %.%#,
|
||||
\%A%f:%l:%c:\ %m,
|
||||
\%A%f:%l:\ %m,
|
||||
\%C%*\\s%m,
|
||||
\%-G%.%#
|
||||
" 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:ts=4:sw=4:et
|
||||
" vim: sw=2 ts=2 et
|
||||
|
||||
endif
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'haml') == -1
|
||||
|
||||
" Vim compiler file
|
||||
" Compiler: Haml
|
||||
" Maintainer: Tim Pope <vimNOSPAM@tpope.org>
|
||||
@@ -26,3 +28,5 @@ let &cpo = s:cpo_save
|
||||
unlet s:cpo_save
|
||||
|
||||
" vim:set sw=2 sts=2:
|
||||
|
||||
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
|
||||
@@ -1,3 +1,5 @@
|
||||
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'ruby') == -1
|
||||
|
||||
" Vim compiler file
|
||||
" Language: Rake
|
||||
" Maintainer: Tim Pope <vimNOSPAM@tpope.org>
|
||||
@@ -37,3 +39,5 @@ let &cpo = s:cpo_save
|
||||
unlet s:cpo_save
|
||||
|
||||
" vim: nowrap sw=2 sts=2 ts=8:
|
||||
|
||||
endif
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'ruby') == -1
|
||||
|
||||
" Vim compiler file
|
||||
" Language: RSpec
|
||||
" Maintainer: Tim Pope <vimNOSPAM@tpope.org>
|
||||
@@ -22,12 +24,15 @@ CompilerSet errorformat=
|
||||
\%f:%l:\ %tarning:\ %m,
|
||||
\%E%.%#:in\ `load':\ %f:%l:%m,
|
||||
\%E%f:%l:in\ `%*[^']':\ %m,
|
||||
\%-Z\ \ \ \ \ \#\ %f:%l:%.%#,
|
||||
\%-Z\ \ \ \ \ %\\+\#\ %f:%l:%.%#,
|
||||
\%E\ \ %\\d%\\+)%.%#,
|
||||
\%C\ \ \ \ \ %m,
|
||||
\%C%\\s%#,
|
||||
\%-G%.%#
|
||||
|
||||
let &cpo = s:cpo_save
|
||||
unlet s:cpo_save
|
||||
|
||||
" vim: nowrap sw=2 sts=2 ts=8:
|
||||
|
||||
endif
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'ruby') == -1
|
||||
|
||||
" Vim compiler file
|
||||
" Language: Ruby
|
||||
" Function: Syntax check and/or error reporting
|
||||
@@ -43,3 +45,5 @@ let &cpo = s:cpo_save
|
||||
unlet s:cpo_save
|
||||
|
||||
" vim: nowrap sw=2 sts=2 ts=8:
|
||||
|
||||
endif
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'ruby') == -1
|
||||
|
||||
" Vim compiler file
|
||||
" Language: Test::Unit - Ruby Unit Testing Framework
|
||||
" Maintainer: Doug Kearns <dougkearns@gmail.com>
|
||||
@@ -33,3 +35,5 @@ let &cpo = s:cpo_save
|
||||
unlet s:cpo_save
|
||||
|
||||
" vim: nowrap sw=2 sts=2 ts=8:
|
||||
|
||||
endif
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'rust') == -1
|
||||
|
||||
" Vim compiler file
|
||||
" Compiler: Rust Compiler
|
||||
" Maintainer: Chris Morgan <me@chrismorgan.info>
|
||||
@@ -15,12 +17,13 @@ if exists(":CompilerSet") != 2
|
||||
command -nargs=* CompilerSet setlocal <args>
|
||||
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
|
||||
else
|
||||
CompilerSet makeprg=rustc\ \%
|
||||
endif
|
||||
|
||||
" Old errorformat (before nightly 2016/08/10)
|
||||
CompilerSet errorformat=
|
||||
\%f:%l:%c:\ %t%*[^:]:\ %m,
|
||||
\%f:%l:%c:\ %*\\d:%*\\d\ %t%*[^:]:\ %m,
|
||||
@@ -29,5 +32,18 @@ CompilerSet errorformat=
|
||||
\%-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
|
||||
unlet s:cpo_save
|
||||
|
||||
endif
|
||||
|
||||
@@ -1,30 +0,0 @@
|
||||
" 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:
|
||||
34
compiler/sbt.vim
Normal file
34
compiler/sbt.vim
Normal file
@@ -0,0 +1,34 @@
|
||||
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'scala') == -1
|
||||
|
||||
" Vim compiler file
|
||||
" Language: Scala SBT (http://www.scala-sbt.org/)
|
||||
" Maintainer: Derek Wyatt
|
||||
" URL: https://github.com/derekwyatt/vim-scala
|
||||
" License: Apache 2
|
||||
" ----------------------------------------------------------------------------
|
||||
|
||||
if exists('current_compiler')
|
||||
finish
|
||||
endif
|
||||
let current_compiler = 'sbt'
|
||||
|
||||
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=sbt\ -Dsbt.log.noformat=true\ compile
|
||||
|
||||
CompilerSet errorformat=
|
||||
\%E\ %#[error]\ %f:%l:\ %m,%C\ %#[error]\ %p^,%-C%.%#,%Z,
|
||||
\%W\ %#[warn]\ %f:%l:\ %m,%C\ %#[warn]\ %p^,%-C%.%#,%Z,
|
||||
\%-G%.%#
|
||||
|
||||
let &cpo = s:cpo_save
|
||||
unlet s:cpo_save
|
||||
|
||||
" vim:set sw=2 sts=2 ts=8 et:
|
||||
|
||||
endif
|
||||
@@ -1,8 +1,24 @@
|
||||
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'typescript') == -1
|
||||
|
||||
if exists("current_compiler")
|
||||
finish
|
||||
endif
|
||||
let current_compiler = "typescript"
|
||||
|
||||
CompilerSet makeprg=tsc\ $*\ %
|
||||
if !exists("g:typescript_compiler_binary")
|
||||
let g:typescript_compiler_binary = "tsc"
|
||||
endif
|
||||
|
||||
if !exists("g:typescript_compiler_options")
|
||||
let g:typescript_compiler_options = ""
|
||||
endif
|
||||
|
||||
if exists(":CompilerSet") != 2
|
||||
command! -nargs=* CompilerSet setlocal <args>
|
||||
endif
|
||||
|
||||
let &l:makeprg = g:typescript_compiler_binary . ' ' . g:typescript_compiler_options . ' $* %'
|
||||
|
||||
CompilerSet errorformat=%+A\ %#%f\ %#(%l\\\,%c):\ %m,%C%m
|
||||
|
||||
endif
|
||||
|
||||
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
|
||||
36
ftplugin/blade.vim
Normal file
36
ftplugin/blade.vim
Normal file
@@ -0,0 +1,36 @@
|
||||
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\|if\|unless\|foreach\|forelse\|for\|while\|push\|can\|cannot\|hasSection\|php\|verbatim\)\>' .
|
||||
\ ':' .
|
||||
\ '@\%(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
|
||||
9
ftplugin/cabal.vim
Normal file
9
ftplugin/cabal.vim
Normal file
@@ -0,0 +1,9 @@
|
||||
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'haskell') == -1
|
||||
|
||||
if exists("g:loaded_haskellvim_cabal")
|
||||
finish
|
||||
endif
|
||||
|
||||
let g:loaded_haskellvim_cabal = 1
|
||||
|
||||
endif
|
||||
@@ -1,11 +1,13 @@
|
||||
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'clojure') == -1
|
||||
|
||||
" Vim filetype plugin file
|
||||
" Language: Clojure
|
||||
" Author: Meikel Brandmeyer <mb@kotka.de>
|
||||
" Language: Clojure
|
||||
" Author: Meikel Brandmeyer <mb@kotka.de>
|
||||
"
|
||||
" Maintainer: Sung Pae <self@sungpae.com>
|
||||
" URL: https://github.com/guns/vim-clojure-static
|
||||
" License: Same as Vim
|
||||
" Last Change: %%RELEASE_DATE%%
|
||||
" Maintainer: Sung Pae <self@sungpae.com>
|
||||
" URL: https://github.com/guns/vim-clojure-static
|
||||
" License: Same as Vim
|
||||
" Last Change: %%RELEASE_DATE%%
|
||||
|
||||
if exists("b:did_ftplugin")
|
||||
finish
|
||||
@@ -82,9 +84,9 @@ endif
|
||||
" Win32 can filter files in the browse dialog
|
||||
if has("gui_win32") && !exists("b:browsefilter")
|
||||
let b:browsefilter = "Clojure Source Files (*.clj)\t*.clj\n" .
|
||||
\ "ClojureScript Source Files (*.cljs)\t*.cljs\n" .
|
||||
\ "Java Source Files (*.java)\t*.java\n" .
|
||||
\ "All Files (*.*)\t*.*\n"
|
||||
\ "ClojureScript Source Files (*.cljs)\t*.cljs\n" .
|
||||
\ "Java Source Files (*.java)\t*.java\n" .
|
||||
\ "All Files (*.*)\t*.*\n"
|
||||
let b:undo_ftplugin .= ' | unlet! b:browsefilter'
|
||||
endif
|
||||
|
||||
@@ -93,3 +95,5 @@ let &cpo = s:cpo_save
|
||||
unlet! s:cpo_save s:setting s:dir
|
||||
|
||||
" vim:sts=8:sw=8:ts=8:noet
|
||||
|
||||
endif
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'coffee-script') == -1
|
||||
|
||||
" Language: CoffeeScript
|
||||
" Maintainer: Mick Koch <kchmck@gmail.com>
|
||||
" Maintainer: Mick Koch <mick@kochm.co>
|
||||
" URL: http://github.com/kchmck/vim-coffee-script
|
||||
" License: WTFPL
|
||||
|
||||
@@ -13,6 +15,7 @@ call coffee#CoffeeSetUpVariables()
|
||||
setlocal formatoptions-=t formatoptions+=croql
|
||||
setlocal comments=:# commentstring=#\ %s
|
||||
setlocal omnifunc=javascriptcomplete#CompleteJS
|
||||
setlocal suffixesadd+=.coffee
|
||||
|
||||
" Create custom augroups.
|
||||
augroup CoffeeBufUpdate | augroup END
|
||||
@@ -330,7 +333,7 @@ function! s:CoffeeLint(startline, endline, bang, args)
|
||||
endif
|
||||
|
||||
let output = system(g:coffee_linter .
|
||||
\ ' -s --csv' .
|
||||
\ ' -s --reporter csv' .
|
||||
\ ' ' . b:coffee_litcoffee .
|
||||
\ ' ' . g:coffee_lint_options .
|
||||
\ ' ' . a:args .
|
||||
@@ -394,11 +397,13 @@ if !exists('b:coffee_run_buf')
|
||||
call s:CoffeeRunResetVars()
|
||||
endif
|
||||
|
||||
command! -range=% -bar -nargs=* -complete=customlist,s:CoffeeComplete
|
||||
command! -buffer -range=% -bar -nargs=* -complete=customlist,s:CoffeeComplete
|
||||
\ CoffeeCompile call s:CoffeeCompile(<line1>, <line2>, <q-args>)
|
||||
command! -bar -nargs=* -complete=customlist,s:CoffeeComplete
|
||||
command! -buffer -bar -nargs=* -complete=customlist,s:CoffeeComplete
|
||||
\ CoffeeWatch call s:CoffeeWatch(<q-args>)
|
||||
command! -range=% -bar -nargs=* CoffeeRun
|
||||
command! -buffer -range=% -bar -nargs=* CoffeeRun
|
||||
\ call s:CoffeeRun(<line1>, <line2>, <q-args>)
|
||||
command! -range=% -bang -bar -nargs=* CoffeeLint
|
||||
command! -buffer -range=% -bang -bar -nargs=* CoffeeLint
|
||||
\ call s:CoffeeLint(<line1>, <line2>, <q-bang>, <q-args>)
|
||||
|
||||
endif
|
||||
|
||||
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
|
||||
2530
ftplugin/csv.vim
2530
ftplugin/csv.vim
File diff suppressed because it is too large
Load Diff
@@ -1,3 +1,5 @@
|
||||
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'cucumber') == -1
|
||||
|
||||
" Vim filetype plugin
|
||||
" Language: Cucumber
|
||||
" Maintainer: Tim Pope <vimNOSPAM@tpope.org>
|
||||
@@ -19,6 +21,9 @@ setlocal omnifunc=CucumberComplete
|
||||
let b:undo_ftplugin = "setl fo< com< cms< ofu<"
|
||||
|
||||
let b:cucumber_root = expand('%:p:h:s?.*[\/]\%(features\|stories\)\zs[\/].*??')
|
||||
if !exists("b:cucumber_steps_glob")
|
||||
let b:cucumber_steps_glob = b:cucumber_root.'/**/*.rb'
|
||||
endif
|
||||
|
||||
if !exists("g:no_plugin_maps") && !exists("g:no_cucumber_maps")
|
||||
cnoremap <SID>foldopen <Bar>if &foldopen =~# 'tag'<Bar>exe 'norm! zv'<Bar>endif
|
||||
@@ -52,7 +57,7 @@ endfunction
|
||||
function! s:allsteps()
|
||||
let step_pattern = '\C^\s*\K\k*\>\s*(\=\s*\zs\S.\{-\}\ze\s*)\=\s*\%(do\|{\)\s*\%(|[^|]*|\s*\)\=\%($\|#\)'
|
||||
let steps = []
|
||||
for file in split(glob(b:cucumber_root.'/**/*.rb'),"\n")
|
||||
for file in split(glob(b:cucumber_steps_glob),"\n")
|
||||
let lines = readfile(file)
|
||||
let num = 0
|
||||
for line in lines
|
||||
@@ -145,3 +150,5 @@ let &cpo = s:keepcpo
|
||||
unlet s:keepcpo
|
||||
|
||||
" vim:set sts=2 sw=2:
|
||||
|
||||
endif
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user