mirror of
https://github.com/sheerun/vim-polyglot.git
synced 2025-11-08 11:33:52 -05:00
Compare commits
79 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
0df1bfa0c5 | ||
|
|
f7302d9262 | ||
|
|
7e38f4288a | ||
|
|
e521ba3ae2 | ||
|
|
ee4f51587d | ||
|
|
20a388cbc8 | ||
|
|
81e61a3c5d | ||
|
|
5670985b3a | ||
|
|
69eae22ea6 | ||
|
|
f8cee0172b | ||
|
|
c6936aeeb1 | ||
|
|
6bb111eaba | ||
|
|
dfecb63078 | ||
|
|
00015bd105 | ||
|
|
d821de3142 | ||
|
|
a3bdbcdb3c | ||
|
|
34e01b8b62 | ||
|
|
1e533e5982 | ||
|
|
56121b4e27 | ||
|
|
9c3c0bc082 | ||
|
|
8500ae8bb9 | ||
|
|
d09a56a494 | ||
|
|
abca7c2014 | ||
|
|
8b6c06e723 | ||
|
|
a86c0179eb | ||
|
|
22095febb7 | ||
|
|
ff066ee9f0 | ||
|
|
5b38663027 | ||
|
|
f0b38f2c1d | ||
|
|
6676d61f61 | ||
|
|
f0da1a9f4d | ||
|
|
298d6b6356 | ||
|
|
62f004c3da | ||
|
|
c73ea49ecb | ||
|
|
b2be47befc | ||
|
|
de38ccabbd | ||
|
|
f0f49cf0fa | ||
|
|
224a6348f9 | ||
|
|
00c3f02945 | ||
|
|
df34b4b4fa | ||
|
|
f3804b0892 | ||
|
|
685aeaaeb1 | ||
|
|
a9cc6fd218 | ||
|
|
3c47f192b5 | ||
|
|
c8b350432c | ||
|
|
cdb8e233c2 | ||
|
|
ff282f610f | ||
|
|
74cb75bedd | ||
|
|
42529540df | ||
|
|
a688c66a04 | ||
|
|
0a7c62b3b2 | ||
|
|
c7b5826d53 | ||
|
|
1d348d0c2d | ||
|
|
6a15d48ed4 | ||
|
|
24f0581a96 | ||
|
|
33c9484671 | ||
|
|
55287efdf7 | ||
|
|
d757bfd643 | ||
|
|
8ec73a3a89 | ||
|
|
b2ee28374b | ||
|
|
68b2748af1 | ||
|
|
14dc82fc4e | ||
|
|
e86e0ad36e | ||
|
|
45ab4d80dd | ||
|
|
9cd6e8533b | ||
|
|
43ecbfae50 | ||
|
|
f77702c090 | ||
|
|
e558a218c6 | ||
|
|
16774887a3 | ||
|
|
e7dc03dc01 | ||
|
|
aee260a301 | ||
|
|
6b540d7db0 | ||
|
|
35ea4d2b90 | ||
|
|
967486dd71 | ||
|
|
e8454d66ab | ||
|
|
a60e299a3c | ||
|
|
b8a5504021 | ||
|
|
cea0d08a06 | ||
|
|
43085dc02f |
7
.gitattributes
vendored
7
.gitattributes
vendored
@@ -1,7 +0,0 @@
|
|||||||
.gitignore export-ignore
|
|
||||||
.gitattributes export-ignore
|
|
||||||
README.md export-ignore
|
|
||||||
/spec export-ignore
|
|
||||||
Gemfile export-ignore
|
|
||||||
Gemfile.lock export-ignore
|
|
||||||
.travis.yml export-ignore
|
|
||||||
2
.gitignore
vendored
2
.gitignore
vendored
@@ -1 +1,3 @@
|
|||||||
/tmp
|
/tmp
|
||||||
|
!*ctags*
|
||||||
|
tags
|
||||||
|
|||||||
16
.travis.yml
16
.travis.yml
@@ -1,11 +1,7 @@
|
|||||||
language: ruby
|
language: vim
|
||||||
rvm:
|
|
||||||
- 2.6
|
|
||||||
sudo: false
|
|
||||||
addons:
|
|
||||||
apt:
|
|
||||||
packages:
|
|
||||||
- vim-gtk
|
|
||||||
before_script:
|
before_script:
|
||||||
- "./build"
|
- sudo add-apt-repository ppa:jonathonf/vim -y
|
||||||
script: xvfb-run bundle exec rspec --format=documentation
|
- sudo apt-get update -q
|
||||||
|
- sudo apt-get install -y vim
|
||||||
|
- vim --version
|
||||||
|
script: ./test
|
||||||
|
|||||||
28
Gemfile.lock
28
Gemfile.lock
@@ -1,28 +0,0 @@
|
|||||||
GEM
|
|
||||||
remote: https://rubygems.org/
|
|
||||||
specs:
|
|
||||||
diff-lcs (1.3)
|
|
||||||
rspec (3.8.0)
|
|
||||||
rspec-core (~> 3.8.0)
|
|
||||||
rspec-expectations (~> 3.8.0)
|
|
||||||
rspec-mocks (~> 3.8.0)
|
|
||||||
rspec-core (3.8.0)
|
|
||||||
rspec-support (~> 3.8.0)
|
|
||||||
rspec-expectations (3.8.2)
|
|
||||||
diff-lcs (>= 1.2.0, < 2.0)
|
|
||||||
rspec-support (~> 3.8.0)
|
|
||||||
rspec-mocks (3.8.0)
|
|
||||||
diff-lcs (>= 1.2.0, < 2.0)
|
|
||||||
rspec-support (~> 3.8.0)
|
|
||||||
rspec-support (3.8.0)
|
|
||||||
vimrunner (0.3.4)
|
|
||||||
|
|
||||||
PLATFORMS
|
|
||||||
ruby
|
|
||||||
|
|
||||||
DEPENDENCIES
|
|
||||||
rspec
|
|
||||||
vimrunner
|
|
||||||
|
|
||||||
BUNDLED WITH
|
|
||||||
1.16.2
|
|
||||||
50
README.md
50
README.md
@@ -1,6 +1,6 @@
|
|||||||

|

|
||||||
|
|
||||||
[![Build Status][travis-img-url]][travis-url] []()
|
[![Build Status][travis-img-url]][travis-url] []()
|
||||||
|
|
||||||
[travis-img-url]: https://travis-ci.org/sheerun/vim-polyglot.svg
|
[travis-img-url]: https://travis-ci.org/sheerun/vim-polyglot.svg
|
||||||
[travis-url]: https://travis-ci.org/sheerun/vim-polyglot
|
[travis-url]: https://travis-ci.org/sheerun/vim-polyglot
|
||||||
@@ -10,13 +10,13 @@ A collection of language packs for Vim.
|
|||||||
> One to rule them all, one to find them, one to bring them all and in the darkness bind them.
|
> One to rule them all, one to find them, one to bring them all and in the darkness bind them.
|
||||||
|
|
||||||
- It **won't affect your startup time**, as scripts are loaded only on demand\*.
|
- It **won't affect your startup time**, as scripts are loaded only on demand\*.
|
||||||
- It **installs and updates 120+ times faster** than the <!--Package Count-->147<!--/Package Count--> packages it consists of.
|
- It **installs and updates 120+ times faster** than the <!--Package Count-->157<!--/Package Count--> packages it consists of.
|
||||||
- Solid syntax and indentation support (other features skipped). Only the best language packs.
|
- Solid syntax and indentation support (other features skipped). Only the best language packs.
|
||||||
- All unnecessary files are ignored (like enormous documentation from php support).
|
- All unnecessary files are ignored (like enormous documentation from php support).
|
||||||
- No support for esoteric languages, only most popular ones (modern too, like `slim`).
|
- No support for esoteric languages, only most popular ones (modern too, like `slim`).
|
||||||
- Each build is tested by automated vimrunner script on CI. See `spec` directory.
|
- Each build is tested by automated vimrunner script on CI. See `spec` directory.
|
||||||
|
|
||||||
\*To be completely honest, concatenated `ftdetect` script takes up to `17ms` to load.
|
\*To be completely honest, optimized `ftdetect` script takes up to `19ms` to load.
|
||||||
|
|
||||||
## Installation
|
## Installation
|
||||||
|
|
||||||
@@ -47,12 +47,13 @@ If you need full functionality of any plugin, please use it directly with your p
|
|||||||
<!--Language Packs-->
|
<!--Language Packs-->
|
||||||
- [acpiasl](https://github.com/martinlroth/vim-acpi-asl) (syntax)
|
- [acpiasl](https://github.com/martinlroth/vim-acpi-asl) (syntax)
|
||||||
- [ansible](https://github.com/pearofducks/ansible-vim) (syntax, indent, ftplugin)
|
- [ansible](https://github.com/pearofducks/ansible-vim) (syntax, indent, ftplugin)
|
||||||
- [apiblueprint](https://github.com/sheerun/apiblueprint.vim) (syntax)
|
- [apiblueprint](https://github.com/sheerun/apiblueprint.vim) (syntax, ctags)
|
||||||
- [applescript](https://github.com/mityu/vim-applescript) (syntax, indent)
|
- [applescript](https://github.com/mityu/vim-applescript) (syntax, indent)
|
||||||
- [arduino](https://github.com/sudar/vim-arduino-syntax) (syntax, indent)
|
- [arduino](https://github.com/sudar/vim-arduino-syntax) (syntax, indent)
|
||||||
- [asciidoc](https://github.com/asciidoc/vim-asciidoc) (syntax)
|
- [asciidoc](https://github.com/asciidoc/vim-asciidoc) (syntax)
|
||||||
- [autohotkey](https://github.com/hnamikaw/vim-autohotkey) (indent)
|
- [autohotkey](https://github.com/hnamikaw/vim-autohotkey) (indent)
|
||||||
- [blade](https://github.com/jwalton512/vim-blade) (syntax, indent, ftplugin)
|
- [blade](https://github.com/jwalton512/vim-blade) (syntax, indent, ftplugin)
|
||||||
|
- [brewfile](https://github.com/bfontaine/Brewfile.vim) (syntax)
|
||||||
- [c++11](https://github.com/octol/vim-cpp-enhanced-highlight) (syntax)
|
- [c++11](https://github.com/octol/vim-cpp-enhanced-highlight) (syntax)
|
||||||
- [c/c++](https://github.com/vim-jp/vim-cpp) (syntax)
|
- [c/c++](https://github.com/vim-jp/vim-cpp) (syntax)
|
||||||
- [caddyfile](https://github.com/isobit/vim-caddyfile) (syntax, indent, ftplugin)
|
- [caddyfile](https://github.com/isobit/vim-caddyfile) (syntax, indent, ftplugin)
|
||||||
@@ -72,14 +73,16 @@ If you need full functionality of any plugin, please use it directly with your p
|
|||||||
- [dlang](https://github.com/JesseKPhillips/d.vim) (syntax, indent)
|
- [dlang](https://github.com/JesseKPhillips/d.vim) (syntax, indent)
|
||||||
- [dockerfile](https://github.com/ekalinin/Dockerfile.vim) (syntax, indent, ftplugin)
|
- [dockerfile](https://github.com/ekalinin/Dockerfile.vim) (syntax, indent, ftplugin)
|
||||||
- [elixir](https://github.com/elixir-lang/vim-elixir) (syntax, indent, compiler, autoload, ftplugin)
|
- [elixir](https://github.com/elixir-lang/vim-elixir) (syntax, indent, compiler, autoload, ftplugin)
|
||||||
- [elm](https://github.com/ElmCast/elm-vim) (syntax, indent, autoload, ftplugin)
|
- [elm](https://github.com/andys8/vim-elm-syntax) (syntax, indent)
|
||||||
- [emberscript](https://github.com/yalesov/vim-ember-script) (syntax, indent, ftplugin)
|
- [emberscript](https://github.com/yalesov/vim-ember-script) (syntax, indent, ftplugin)
|
||||||
- [emblem](https://github.com/yalesov/vim-emblem) (syntax, indent, ftplugin)
|
- [emblem](https://github.com/yalesov/vim-emblem) (syntax, indent, ftplugin)
|
||||||
- [erlang](https://github.com/vim-erlang/vim-erlang-runtime) (syntax, indent)
|
- [erlang](https://github.com/vim-erlang/vim-erlang-runtime) (syntax, indent)
|
||||||
|
- [fennel](https://github.com/bakpakin/fennel.vim) (syntax, indent, ftplugin)
|
||||||
- [ferm](https://github.com/vim-scripts/ferm.vim) (syntax)
|
- [ferm](https://github.com/vim-scripts/ferm.vim) (syntax)
|
||||||
- [fish](https://github.com/georgewitteman/vim-fish) (syntax, indent, compiler, autoload, ftplugin)
|
- [fish](https://github.com/georgewitteman/vim-fish) (syntax, indent, compiler, autoload, ftplugin)
|
||||||
- [flatbuffers](https://github.com/dcharbon/vim-flatbuffers) (syntax)
|
- [flatbuffers](https://github.com/dcharbon/vim-flatbuffers) (syntax)
|
||||||
- [fsharp](https://github.com/fsharp/vim-fsharp) (syntax, indent)
|
- [fsharp](https://github.com/ionide/Ionide-vim) (syntax, indent)
|
||||||
|
- [gdscript](https://github.com/calviken/vim-gdscript3) (syntax, indent)
|
||||||
- [git](https://github.com/tpope/vim-git) (syntax, indent, ftplugin)
|
- [git](https://github.com/tpope/vim-git) (syntax, indent, ftplugin)
|
||||||
- [glsl](https://github.com/tikhomirov/vim-glsl) (syntax, indent)
|
- [glsl](https://github.com/tikhomirov/vim-glsl) (syntax, indent)
|
||||||
- [gmpl](https://github.com/maelvalais/gmpl.vim) (syntax)
|
- [gmpl](https://github.com/maelvalais/gmpl.vim) (syntax)
|
||||||
@@ -87,10 +90,8 @@ If you need full functionality of any plugin, please use it directly with your p
|
|||||||
- [go](https://github.com/fatih/vim-go) (syntax, compiler, indent)
|
- [go](https://github.com/fatih/vim-go) (syntax, compiler, indent)
|
||||||
- [gradle](https://github.com/tfnico/vim-gradle) (compiler)
|
- [gradle](https://github.com/tfnico/vim-gradle) (compiler)
|
||||||
- [graphql](https://github.com/jparise/vim-graphql) (syntax, indent, autoload, ftplugin, after)
|
- [graphql](https://github.com/jparise/vim-graphql) (syntax, indent, autoload, ftplugin, after)
|
||||||
- [groovy-indent](https://github.com/vim-scripts/groovyindent-unix) (indent)
|
|
||||||
- [groovy](https://github.com/vim-scripts/groovy.vim) (syntax)
|
|
||||||
- [haml](https://github.com/sheerun/vim-haml) (syntax, indent, compiler, ftplugin)
|
- [haml](https://github.com/sheerun/vim-haml) (syntax, indent, compiler, ftplugin)
|
||||||
- [handlebars](https://github.com/mustache/vim-mustache-handlebars) (syntax, indent, ftplugin)
|
- [handlebars](https://github.com/sheerun/vim-mustache-handlebars) (syntax, indent, ftplugin)
|
||||||
- [haproxy](https://github.com/CH-DanReif/haproxy.vim) (syntax)
|
- [haproxy](https://github.com/CH-DanReif/haproxy.vim) (syntax)
|
||||||
- [haskell](https://github.com/neovimhaskell/haskell-vim) (syntax, indent, ftplugin)
|
- [haskell](https://github.com/neovimhaskell/haskell-vim) (syntax, indent, ftplugin)
|
||||||
- [haxe](https://github.com/yaymukund/vim-haxe) (syntax)
|
- [haxe](https://github.com/yaymukund/vim-haxe) (syntax)
|
||||||
@@ -99,19 +100,21 @@ If you need full functionality of any plugin, please use it directly with your p
|
|||||||
- [hive](https://github.com/zebradil/hive.vim) (syntax, ftplugin)
|
- [hive](https://github.com/zebradil/hive.vim) (syntax, ftplugin)
|
||||||
- [html5](https://github.com/othree/html5.vim) (syntax, indent, autoload, ftplugin)
|
- [html5](https://github.com/othree/html5.vim) (syntax, indent, autoload, ftplugin)
|
||||||
- [i3](https://github.com/mboughaba/i3config.vim) (syntax, ftplugin)
|
- [i3](https://github.com/mboughaba/i3config.vim) (syntax, ftplugin)
|
||||||
|
- [icalenadr](https://github.com/chutzpah/icalendar.vim) (syntax)
|
||||||
- [idris](https://github.com/idris-hackers/idris-vim) (syntax, indent, ftplugin)
|
- [idris](https://github.com/idris-hackers/idris-vim) (syntax, indent, ftplugin)
|
||||||
- [ion](https://github.com/vmchale/ion-vim) (syntax, ftplugin)
|
- [ion](https://github.com/vmchale/ion-vim) (syntax, ftplugin)
|
||||||
- [jasmine](https://github.com/glanotte/vim-jasmine) (syntax)
|
|
||||||
- [javascript](https://github.com/pangloss/vim-javascript) (syntax, indent, compiler, ftplugin, extras)
|
- [javascript](https://github.com/pangloss/vim-javascript) (syntax, indent, compiler, ftplugin, extras)
|
||||||
- [jenkins](https://github.com/martinda/Jenkinsfile-vim-syntax) (syntax, indent)
|
- [jenkins](https://github.com/martinda/Jenkinsfile-vim-syntax) (syntax, indent)
|
||||||
- [jinja](https://github.com/lepture/vim-jinja) (syntax, indent)
|
- [jinja](https://github.com/lepture/vim-jinja) (syntax, indent)
|
||||||
|
- [jq](https://github.com/vito-c/jq.vim) (syntax, ftplugin)
|
||||||
- [json5](https://github.com/GutenYe/json5.vim) (syntax)
|
- [json5](https://github.com/GutenYe/json5.vim) (syntax)
|
||||||
- [json](https://github.com/elzr/vim-json) (syntax, indent, ftplugin)
|
- [json](https://github.com/elzr/vim-json) (syntax, indent, ftplugin)
|
||||||
|
- [jsonnet](https://github.com/google/vim-jsonnet) (syntax, autoload, ftplugin)
|
||||||
- [jst](https://github.com/briancollins/vim-jst) (syntax, indent)
|
- [jst](https://github.com/briancollins/vim-jst) (syntax, indent)
|
||||||
- [jsx](https://github.com/MaxMEllon/vim-jsx-pretty) (autoload, after)
|
- [jsx](https://github.com/MaxMEllon/vim-jsx-pretty) (autoload, after)
|
||||||
- [julia](https://github.com/JuliaEditorSupport/julia-vim) (syntax, indent, autoload, ftplugin)
|
- [julia](https://github.com/JuliaEditorSupport/julia-vim) (syntax, indent, autoload, ftplugin)
|
||||||
- [kotlin](https://github.com/udalov/kotlin-vim) (syntax, indent, ftplugin)
|
- [kotlin](https://github.com/udalov/kotlin-vim) (syntax, indent, ftplugin)
|
||||||
- [latex](https://github.com/LaTeX-Box-Team/LaTeX-Box) (syntax, indent, ftplugin)
|
- [ledger](https://github.com/ledger/vim-ledger) (syntax, compiler, indent)
|
||||||
- [less](https://github.com/groenewege/vim-less) (syntax, indent, ftplugin)
|
- [less](https://github.com/groenewege/vim-less) (syntax, indent, ftplugin)
|
||||||
- [lilypond](https://github.com/anowlcalledjosh/vim-lilypond) (syntax, indent, compiler, ftplugin)
|
- [lilypond](https://github.com/anowlcalledjosh/vim-lilypond) (syntax, indent, compiler, ftplugin)
|
||||||
- [livescript](https://github.com/gkz/vim-ls) (syntax, indent, compiler, ftplugin)
|
- [livescript](https://github.com/gkz/vim-ls) (syntax, indent, compiler, ftplugin)
|
||||||
@@ -136,10 +139,10 @@ If you need full functionality of any plugin, please use it directly with your p
|
|||||||
- [php](https://github.com/StanAngeloff/php.vim) (syntax)
|
- [php](https://github.com/StanAngeloff/php.vim) (syntax)
|
||||||
- [plantuml](https://github.com/aklt/plantuml-syntax) (syntax, indent, ftplugin)
|
- [plantuml](https://github.com/aklt/plantuml-syntax) (syntax, indent, ftplugin)
|
||||||
- [pony](https://github.com/jakwings/vim-pony) (syntax, indent, autoload, ftplugin)
|
- [pony](https://github.com/jakwings/vim-pony) (syntax, indent, autoload, ftplugin)
|
||||||
- [powershell](https://github.com/PProvost/vim-ps1) (syntax, indent, ftplugin)
|
- [powershell](https://github.com/PProvost/vim-ps1) (syntax, indent, compiler, ftplugin)
|
||||||
- [protobuf](https://github.com/uarun/vim-protobuf) (syntax, indent)
|
- [protobuf](https://github.com/uarun/vim-protobuf) (syntax, indent)
|
||||||
- [pug](https://github.com/digitaltoad/vim-pug) (syntax, indent, ftplugin)
|
- [pug](https://github.com/digitaltoad/vim-pug) (syntax, indent, ftplugin)
|
||||||
- [puppet](https://github.com/rodjek/vim-puppet) (syntax, indent, autoload, ftplugin)
|
- [puppet](https://github.com/rodjek/vim-puppet) (syntax, indent, autoload, ftplugin, ctags)
|
||||||
- [purescript](https://github.com/purescript-contrib/purescript-vim) (syntax, indent, ftplugin)
|
- [purescript](https://github.com/purescript-contrib/purescript-vim) (syntax, indent, ftplugin)
|
||||||
- [python-compiler](https://github.com/aliev/vim-compiler-python) (compiler, autoload)
|
- [python-compiler](https://github.com/aliev/vim-compiler-python) (compiler, autoload)
|
||||||
- [python-indent](https://github.com/Vimjas/vim-python-pep8-indent) (indent)
|
- [python-indent](https://github.com/Vimjas/vim-python-pep8-indent) (indent)
|
||||||
@@ -149,24 +152,29 @@ If you need full functionality of any plugin, please use it directly with your p
|
|||||||
- [r-lang](https://github.com/vim-scripts/R.vim) (syntax)
|
- [r-lang](https://github.com/vim-scripts/R.vim) (syntax)
|
||||||
- [racket](https://github.com/wlangstroth/vim-racket) (syntax, indent, ftplugin)
|
- [racket](https://github.com/wlangstroth/vim-racket) (syntax, indent, ftplugin)
|
||||||
- [ragel](https://github.com/jneen/ragel.vim) (syntax)
|
- [ragel](https://github.com/jneen/ragel.vim) (syntax)
|
||||||
|
- [raku](https://github.com/Raku/vim-raku) (syntax, indent, ftplugin)
|
||||||
- [raml](https://github.com/IN3D/vim-raml) (syntax, ftplugin)
|
- [raml](https://github.com/IN3D/vim-raml) (syntax, ftplugin)
|
||||||
|
- [razor](https://github.com/adamclerk/vim-razor) (syntax, indent, ftplugin)
|
||||||
- [reason](https://github.com/reasonml-editor/vim-reason-plus) (syntax, indent)
|
- [reason](https://github.com/reasonml-editor/vim-reason-plus) (syntax, indent)
|
||||||
- [rspec](https://github.com/sheerun/rspec.vim) (syntax)
|
- [requirements](https://github.com/raimon49/requirements.txt.vim) (syntax, autoload)
|
||||||
|
- [rspec](https://github.com/keith/rspec.vim) (syntax)
|
||||||
- [rst](https://github.com/marshallward/vim-restructuredtext) (syntax, indent, autoload, ftplugin)
|
- [rst](https://github.com/marshallward/vim-restructuredtext) (syntax, indent, autoload, ftplugin)
|
||||||
- [ruby](https://github.com/vim-ruby/vim-ruby) (syntax, indent, compiler, autoload, ftplugin)
|
- [ruby](https://github.com/vim-ruby/vim-ruby) (syntax, indent, compiler, autoload, ftplugin)
|
||||||
- [rust](https://github.com/rust-lang/rust.vim) (syntax, indent, compiler, autoload, ftplugin)
|
- [rust](https://github.com/rust-lang/rust.vim) (syntax, indent, compiler, autoload, ftplugin, ctags)
|
||||||
- [sbt](https://github.com/derekwyatt/vim-sbt) (syntax)
|
- [sbt](https://github.com/derekwyatt/vim-sbt) (syntax)
|
||||||
- [scala](https://github.com/derekwyatt/vim-scala) (syntax, indent, compiler, ftplugin)
|
- [scala](https://github.com/derekwyatt/vim-scala) (syntax, indent, compiler, ftplugin, ctags)
|
||||||
- [scss](https://github.com/cakebaker/scss-syntax.vim) (syntax, indent, ftplugin)
|
- [scss](https://github.com/cakebaker/scss-syntax.vim) (syntax, indent, ftplugin)
|
||||||
|
- [sh](https://github.com/arzg/vim-sh) (syntax)
|
||||||
- [slim](https://github.com/slim-template/vim-slim) (syntax, indent, ftplugin)
|
- [slim](https://github.com/slim-template/vim-slim) (syntax, indent, ftplugin)
|
||||||
- [slime](https://github.com/slime-lang/vim-slime-syntax) (syntax, indent)
|
- [slime](https://github.com/slime-lang/vim-slime-syntax) (syntax, indent)
|
||||||
- [smt2](https://github.com/bohlender/vim-smt2) (syntax, autoload, ftplugin)
|
- [smt2](https://github.com/bohlender/vim-smt2) (syntax, autoload, ftplugin)
|
||||||
- [solidity](https://github.com/tomlion/vim-solidity) (syntax, indent, ftplugin)
|
- [solidity](https://github.com/tomlion/vim-solidity) (syntax, indent, ftplugin)
|
||||||
|
- [sql](https://github.com/shmup/vim-sql-syntax) (syntax)
|
||||||
- [stylus](https://github.com/wavded/vim-stylus) (syntax, indent, ftplugin)
|
- [stylus](https://github.com/wavded/vim-stylus) (syntax, indent, ftplugin)
|
||||||
- [svelte](https://github.com/evanleck/vim-svelte) (syntax, indent)
|
- [svelte](https://github.com/evanleck/vim-svelte#main) (syntax, indent, ftplugin)
|
||||||
- [svg-indent](https://github.com/jasonshell/vim-svg-indent) (indent)
|
- [svg-indent](https://github.com/jasonshell/vim-svg-indent) (indent)
|
||||||
- [svg](https://github.com/vim-scripts/svg.vim) (syntax)
|
- [svg](https://github.com/vim-scripts/svg.vim) (syntax)
|
||||||
- [swift](https://github.com/keith/swift.vim) (syntax, indent, ftplugin)
|
- [swift](https://github.com/keith/swift.vim) (syntax, indent, compiler, ftplugin, ctags)
|
||||||
- [sxhkd](https://github.com/baskerville/vim-sxhkdrc) (syntax)
|
- [sxhkd](https://github.com/baskerville/vim-sxhkdrc) (syntax)
|
||||||
- [systemd](https://github.com/wgwoods/vim-systemd-syntax) (syntax, ftplugin)
|
- [systemd](https://github.com/wgwoods/vim-systemd-syntax) (syntax, ftplugin)
|
||||||
- [terraform](https://github.com/hashivim/vim-terraform) (syntax, indent, autoload, ftplugin)
|
- [terraform](https://github.com/hashivim/vim-terraform) (syntax, indent, autoload, ftplugin)
|
||||||
@@ -177,7 +185,8 @@ If you need full functionality of any plugin, please use it directly with your p
|
|||||||
- [toml](https://github.com/cespare/vim-toml) (syntax, ftplugin)
|
- [toml](https://github.com/cespare/vim-toml) (syntax, ftplugin)
|
||||||
- [tptp](https://github.com/c-cube/vim-tptp) (syntax)
|
- [tptp](https://github.com/c-cube/vim-tptp) (syntax)
|
||||||
- [twig](https://github.com/lumiliet/vim-twig) (syntax, indent, ftplugin)
|
- [twig](https://github.com/lumiliet/vim-twig) (syntax, indent, ftplugin)
|
||||||
- [typescript](https://github.com/HerringtonDarkholme/yats.vim) (syntax, indent, compiler, ftplugin)
|
- [typescript](https://github.com/HerringtonDarkholme/yats.vim) (syntax, indent, compiler, ftplugin, ctags)
|
||||||
|
- [unison](https://github.com/unisonweb/unison#trunk) (syntax)
|
||||||
- [v](https://github.com/ollykel/v-vim) (syntax, indent, ftplugin)
|
- [v](https://github.com/ollykel/v-vim) (syntax, indent, ftplugin)
|
||||||
- [vala](https://github.com/arrufat/vala.vim) (syntax, indent, ftplugin)
|
- [vala](https://github.com/arrufat/vala.vim) (syntax, indent, ftplugin)
|
||||||
- [vbnet](https://github.com/vim-scripts/vbnet.vim) (syntax)
|
- [vbnet](https://github.com/vim-scripts/vbnet.vim) (syntax)
|
||||||
@@ -191,7 +200,8 @@ If you need full functionality of any plugin, please use it directly with your p
|
|||||||
- [yaml](https://github.com/stephpy/vim-yaml) (syntax, ftplugin)
|
- [yaml](https://github.com/stephpy/vim-yaml) (syntax, ftplugin)
|
||||||
- [yard](https://github.com/sheerun/vim-yardoc) (syntax)
|
- [yard](https://github.com/sheerun/vim-yardoc) (syntax)
|
||||||
- [zephir](https://github.com/xwsoul/vim-zephir) (syntax)
|
- [zephir](https://github.com/xwsoul/vim-zephir) (syntax)
|
||||||
- [zig](https://github.com/ziglang/zig.vim) (syntax, autoload, ftplugin)
|
- [zig](https://github.com/ziglang/zig.vim) (syntax, indent, autoload, ftplugin)
|
||||||
|
- [zinit](https://github.com/zinit-zsh/zplugin-vim-syntax) (syntax)
|
||||||
<!--/Language Packs-->
|
<!--/Language Packs-->
|
||||||
|
|
||||||
## Updating
|
## Updating
|
||||||
|
|||||||
@@ -39,11 +39,11 @@ if exists("loaded_matchup")
|
|||||||
let b:match_skip = 's:comment\|string'
|
let b:match_skip = 's:comment\|string'
|
||||||
endif
|
endif
|
||||||
|
|
||||||
let b:original_commentstring = &l:commentstring
|
let b:jsx_pretty_old_cms = &l:commentstring
|
||||||
|
|
||||||
augroup jsx_comment
|
augroup jsx_comment
|
||||||
autocmd! CursorMoved <buffer>
|
autocmd! CursorMoved <buffer>
|
||||||
autocmd CursorMoved <buffer> call jsx_pretty#comment#update_commentstring(b:original_commentstring)
|
autocmd CursorMoved <buffer> call jsx_pretty#comment#update_commentstring(b:jsx_pretty_old_cms)
|
||||||
augroup end
|
augroup end
|
||||||
|
|
||||||
setlocal suffixesadd+=.jsx
|
setlocal suffixesadd+=.jsx
|
||||||
|
|||||||
@@ -57,7 +57,7 @@ function! s:is_section_delim(line, func_delim) abort
|
|||||||
return 0
|
return 0
|
||||||
endif
|
endif
|
||||||
let kind = sec[0]
|
let kind = sec[0]
|
||||||
return kind == s:KIND_BLOCK_PREC || kind == s:KIND_BLOCK_FOLLOW || kind == func_delim
|
return kind == s:KIND_BLOCK_PREC || kind == s:KIND_BLOCK_FOLLOW || kind == a:func_delim
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! s:next_section(stop_func_begin) abort
|
function! s:next_section(stop_func_begin) abort
|
||||||
@@ -85,11 +85,16 @@ function! s:prev_section(stop_func_begin) abort
|
|||||||
endwhile
|
endwhile
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
|
nnoremap <buffer><Plug>(llvm-next-section-begin) :<C-u>call <SID>next_section(1)<CR>
|
||||||
|
nnoremap <buffer><Plug>(llvm-prev-section-begin) :<C-u>call <SID>prev_section(1)<CR>
|
||||||
|
nnoremap <buffer><Plug>(llvm-next-section-end) :<C-u>call <SID>next_section(0)<CR>
|
||||||
|
nnoremap <buffer><Plug>(llvm-prev-section-end) :<C-u>call <SID>prev_section(0)<CR>
|
||||||
|
|
||||||
if !g:llvm_ext_no_mapping
|
if !g:llvm_ext_no_mapping
|
||||||
nnoremap <buffer><silent>]] :<C-u>call <SID>next_section(1)<CR>
|
nmap <buffer><silent>]] <Plug>(llvm-next-section-begin)
|
||||||
nnoremap <buffer><silent>[[ :<C-u>call <SID>prev_section(1)<CR>
|
nmap <buffer><silent>[[ <Plug>(llvm-prev-section-begin)
|
||||||
nnoremap <buffer><silent>][ :<C-u>call <SID>next_section(0)<CR>
|
nmap <buffer><silent>][ <Plug>(llvm-next-section-end)
|
||||||
nnoremap <buffer><silent>[] :<C-u>call <SID>prev_section(0)<CR>
|
nmap <buffer><silent>[] <Plug>(llvm-prev-section-end)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
function! s:function_range_at(linum) abort
|
function! s:function_range_at(linum) abort
|
||||||
@@ -222,9 +227,12 @@ function! s:move_to_following_block() abort
|
|||||||
endtry
|
endtry
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
|
nnoremap <buffer><Plug>(llvm-move-block-prev) :<C-u>call <SID>move_to_pred_block()<CR>
|
||||||
|
nnoremap <buffer><Plug>(llvm-move-block-next) :<C-u>call <SID>move_to_following_block()<CR>
|
||||||
|
|
||||||
if !g:llvm_ext_no_mapping
|
if !g:llvm_ext_no_mapping
|
||||||
nnoremap <buffer><silent>[b :<C-u>call <SID>move_to_pred_block()<CR>
|
nmap <buffer><silent>[b <Plug>(llvm-move-block-prev)
|
||||||
nnoremap <buffer><silent>]b :<C-u>call <SID>move_to_following_block()<CR>
|
nmap <buffer><silent>]b <Plug>(llvm-move-block-next)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
function! s:get_func_identifiers(line) abort
|
function! s:get_func_identifiers(line) abort
|
||||||
@@ -438,8 +446,10 @@ function! s:goto_definition() abort
|
|||||||
echom "No definition for '" . ident . "' found"
|
echom "No definition for '" . ident . "' found"
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
|
nnoremap <buffer><Plug>(llvm-goto-definition) :<C-u>call <SID>goto_definition()<CR>
|
||||||
|
|
||||||
if !g:llvm_ext_no_mapping
|
if !g:llvm_ext_no_mapping
|
||||||
nnoremap <buffer><silent>K :<C-u>call <SID>goto_definition()<CR>
|
nmap <buffer><silent>K <Plug>(llvm-goto-definition)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
function! s:run_lli(...) abort
|
function! s:run_lli(...) abort
|
||||||
|
|||||||
@@ -1,205 +0,0 @@
|
|||||||
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'markdown') == -1
|
|
||||||
|
|
||||||
" vim: ts=4 sw=4:
|
|
||||||
" folding for Markdown headers, both styles (atx- and setex-)
|
|
||||||
" http://daringfireball.net/projects/markdown/syntax#header
|
|
||||||
"
|
|
||||||
" this code can be placed in file
|
|
||||||
" $HOME/.vim/after/ftplugin/markdown.vim
|
|
||||||
"
|
|
||||||
" original version from Steve Losh's gist: https://gist.github.com/1038710
|
|
||||||
|
|
||||||
function! s:is_mkdCode(lnum)
|
|
||||||
let name = synIDattr(synID(a:lnum, 1, 0), 'name')
|
|
||||||
return (name =~ '^mkd\%(Code$\|Snippet\)' || name != '' && name !~ '^\%(mkd\|html\)')
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
if get(g:, "vim_markdown_folding_style_pythonic", 0)
|
|
||||||
function! Foldexpr_markdown(lnum)
|
|
||||||
let l1 = getline(a:lnum)
|
|
||||||
"~~~~~ keep track of fenced code blocks ~~~~~
|
|
||||||
"If we hit a code block fence
|
|
||||||
if l1 =~ '````*' || l1 =~ '\~\~\~\~*'
|
|
||||||
" toggle the variable that says if we're in a code block
|
|
||||||
if b:fenced_block == 0
|
|
||||||
let b:fenced_block = 1
|
|
||||||
elseif b:fenced_block == 1
|
|
||||||
let b:fenced_block = 0
|
|
||||||
endif
|
|
||||||
" else, if we're caring about front matter
|
|
||||||
elseif g:vim_markdown_frontmatter == 1
|
|
||||||
" if we're in front matter and not on line 1
|
|
||||||
if b:front_matter == 1 && a:lnum > 2
|
|
||||||
let l0 = getline(a:lnum-1)
|
|
||||||
" if the previous line fenced front matter
|
|
||||||
if l0 == '---'
|
|
||||||
" we must not be in front matter
|
|
||||||
let b:front_matter = 0
|
|
||||||
endif
|
|
||||||
" else, if we're on line one
|
|
||||||
elseif a:lnum == 1
|
|
||||||
" if we hit a front matter fence
|
|
||||||
if l1 == '---'
|
|
||||||
" we're in the front matter
|
|
||||||
let b:front_matter = 1
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
|
|
||||||
" if we're in a code block or front matter
|
|
||||||
if b:fenced_block == 1 || b:front_matter == 1
|
|
||||||
if a:lnum == 1
|
|
||||||
" fold any 'preamble'
|
|
||||||
return '>1'
|
|
||||||
else
|
|
||||||
" keep previous foldlevel
|
|
||||||
return '='
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
|
|
||||||
let l2 = getline(a:lnum+1)
|
|
||||||
" if the next line starts with two or more '='
|
|
||||||
" and is not code
|
|
||||||
if l2 =~ '^==\+\s*' && !s:is_mkdCode(a:lnum+1)
|
|
||||||
" next line is underlined (level 1)
|
|
||||||
return '>0'
|
|
||||||
" else, if the nex line starts with two or more '-'
|
|
||||||
" and is not code
|
|
||||||
elseif l2 =~ '^--\+\s*' && !s:is_mkdCode(a:lnum+1)
|
|
||||||
" next line is underlined (level 2)
|
|
||||||
return '>1'
|
|
||||||
endif
|
|
||||||
|
|
||||||
"if we're on a non-code line starting with a pound sign
|
|
||||||
if l1 =~ '^#' && !s:is_mkdCode(a:lnum)
|
|
||||||
" set the fold level to the number of hashes -1
|
|
||||||
" return '>'.(matchend(l1, '^#\+') - 1)
|
|
||||||
" set the fold level to the number of hashes
|
|
||||||
return '>'.(matchend(l1, '^#\+'))
|
|
||||||
" else, if we're on line 1
|
|
||||||
elseif a:lnum == 1
|
|
||||||
" fold any 'preamble'
|
|
||||||
return '>1'
|
|
||||||
else
|
|
||||||
" keep previous foldlevel
|
|
||||||
return '='
|
|
||||||
endif
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
function! Foldtext_markdown()
|
|
||||||
let line = getline(v:foldstart)
|
|
||||||
let has_numbers = &number || &relativenumber
|
|
||||||
let nucolwidth = &fdc + has_numbers * &numberwidth
|
|
||||||
let windowwidth = winwidth(0) - nucolwidth - 6
|
|
||||||
let foldedlinecount = v:foldend - v:foldstart
|
|
||||||
let line = strpart(line, 0, windowwidth - 2 -len(foldedlinecount))
|
|
||||||
let line = substitute(line, '\%("""\|''''''\)', '', '')
|
|
||||||
let fillcharcount = windowwidth - len(line) - len(foldedlinecount) + 1
|
|
||||||
return line . ' ' . repeat("-", fillcharcount) . ' ' . foldedlinecount
|
|
||||||
endfunction
|
|
||||||
else " vim_markdown_folding_style_pythonic == 0
|
|
||||||
function! Foldexpr_markdown(lnum)
|
|
||||||
if (a:lnum == 1)
|
|
||||||
let l0 = ''
|
|
||||||
else
|
|
||||||
let l0 = getline(a:lnum-1)
|
|
||||||
endif
|
|
||||||
|
|
||||||
" keep track of fenced code blocks
|
|
||||||
if l0 =~ '````*' || l0 =~ '\~\~\~\~*'
|
|
||||||
if b:fenced_block == 0
|
|
||||||
let b:fenced_block = 1
|
|
||||||
elseif b:fenced_block == 1
|
|
||||||
let b:fenced_block = 0
|
|
||||||
endif
|
|
||||||
elseif g:vim_markdown_frontmatter == 1
|
|
||||||
if b:front_matter == 1
|
|
||||||
if l0 == '---'
|
|
||||||
let b:front_matter = 0
|
|
||||||
endif
|
|
||||||
elseif a:lnum == 2
|
|
||||||
if l0 == '---'
|
|
||||||
let b:front_matter = 1
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
|
|
||||||
if b:fenced_block == 1 || b:front_matter == 1
|
|
||||||
" keep previous foldlevel
|
|
||||||
return '='
|
|
||||||
endif
|
|
||||||
|
|
||||||
let l2 = getline(a:lnum+1)
|
|
||||||
if l2 =~ '^==\+\s*' && !s:is_mkdCode(a:lnum+1)
|
|
||||||
" next line is underlined (level 1)
|
|
||||||
return '>1'
|
|
||||||
elseif l2 =~ '^--\+\s*' && !s:is_mkdCode(a:lnum+1)
|
|
||||||
" next line is underlined (level 2)
|
|
||||||
if s:vim_markdown_folding_level >= 2
|
|
||||||
return '>1'
|
|
||||||
else
|
|
||||||
return '>2'
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
|
|
||||||
let l1 = getline(a:lnum)
|
|
||||||
if l1 =~ '^#' && !s:is_mkdCode(a:lnum)
|
|
||||||
" fold level according to option
|
|
||||||
if s:vim_markdown_folding_level == 1 || matchend(l1, '^#\+') > s:vim_markdown_folding_level
|
|
||||||
if a:lnum == line('$')
|
|
||||||
return matchend(l1, '^#\+') - 1
|
|
||||||
else
|
|
||||||
return -1
|
|
||||||
endif
|
|
||||||
else
|
|
||||||
" headers are not folded
|
|
||||||
return 0
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
|
|
||||||
if l0 =~ '^#' && !s:is_mkdCode(a:lnum-1)
|
|
||||||
" previous line starts with hashes
|
|
||||||
return '>'.matchend(l0, '^#\+')
|
|
||||||
else
|
|
||||||
" keep previous foldlevel
|
|
||||||
return '='
|
|
||||||
endif
|
|
||||||
endfunction
|
|
||||||
endif
|
|
||||||
|
|
||||||
|
|
||||||
let b:fenced_block = 0
|
|
||||||
let b:front_matter = 0
|
|
||||||
let s:vim_markdown_folding_level = get(g:, "vim_markdown_folding_level", 1)
|
|
||||||
|
|
||||||
function! s:MarkdownSetupFolding()
|
|
||||||
if !get(g:, "vim_markdown_folding_disabled", 0)
|
|
||||||
if get(g:, "vim_markdown_folding_style_pythonic", 0)
|
|
||||||
if get(g:, "vim_markdown_override_foldtext", 1)
|
|
||||||
setlocal foldtext=Foldtext_markdown()
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
setlocal foldexpr=Foldexpr_markdown(v:lnum)
|
|
||||||
setlocal foldmethod=expr
|
|
||||||
endif
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
function! s:MarkdownSetupFoldLevel()
|
|
||||||
if get(g:, "vim_markdown_folding_style_pythonic", 0)
|
|
||||||
" set default foldlevel
|
|
||||||
execute "setlocal foldlevel=".s:vim_markdown_folding_level
|
|
||||||
endif
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
call s:MarkdownSetupFoldLevel()
|
|
||||||
call s:MarkdownSetupFolding()
|
|
||||||
|
|
||||||
augroup Mkd
|
|
||||||
" These autocmds need to be kept in sync with the autocmds calling
|
|
||||||
" s:MarkdownRefreshSyntax in ftplugin/markdown.vim.
|
|
||||||
autocmd BufWinEnter,BufWritePost <buffer> call s:MarkdownSetupFolding()
|
|
||||||
autocmd InsertEnter,InsertLeave <buffer> call s:MarkdownSetupFolding()
|
|
||||||
autocmd CursorHold,CursorHoldI <buffer> call s:MarkdownSetupFolding()
|
|
||||||
augroup END
|
|
||||||
|
|
||||||
endif
|
|
||||||
@@ -20,11 +20,11 @@ if exists("loaded_matchup")
|
|||||||
let b:match_skip = 's:comment\|string'
|
let b:match_skip = 's:comment\|string'
|
||||||
endif
|
endif
|
||||||
|
|
||||||
let b:original_commentstring = &l:commentstring
|
let b:jsx_pretty_old_cms = &l:commentstring
|
||||||
|
|
||||||
augroup jsx_comment
|
augroup jsx_comment
|
||||||
autocmd! CursorMoved <buffer>
|
autocmd! CursorMoved <buffer>
|
||||||
autocmd CursorMoved <buffer> call jsx_pretty#comment#update_commentstring(b:original_commentstring)
|
autocmd CursorMoved <buffer> call jsx_pretty#comment#update_commentstring(b:jsx_pretty_old_cms)
|
||||||
augroup end
|
augroup end
|
||||||
|
|
||||||
setlocal suffixesadd+=.tsx
|
setlocal suffixesadd+=.tsx
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
if !exists('g:polyglot_disabled') || !(index(g:polyglot_disabled, 'typescript') != -1 || index(g:polyglot_disabled, 'typescript') != -1 || index(g:polyglot_disabled, 'jsx') != -1)
|
if !exists('g:polyglot_disabled') || !(index(g:polyglot_disabled, 'typescript') != -1 || index(g:polyglot_disabled, 'typescript') != -1 || index(g:polyglot_disabled, 'jsx') != -1)
|
||||||
|
|
||||||
source <sfile>:h/typescript.vim
|
source <sfile>:h/tsx.vim
|
||||||
|
|
||||||
endif
|
endif
|
||||||
|
|||||||
@@ -25,6 +25,8 @@ if exists('s:did_indent')
|
|||||||
let b:did_indent = s:did_indent
|
let b:did_indent = s:did_indent
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
runtime! indent/typescript.vim
|
||||||
|
|
||||||
setlocal indentexpr=GetJsxIndent()
|
setlocal indentexpr=GetJsxIndent()
|
||||||
setlocal indentkeys=0.,0{,0},0),0],0?,0\*,0\,,!^F,:,<:>,o,O,e,<>>,=*/
|
setlocal indentkeys=0.,0{,0},0),0],0?,0\*,0\,,!^F,:,<:>,o,O,e,<>>,=*/
|
||||||
|
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
if !exists('g:polyglot_disabled') || !(index(g:polyglot_disabled, 'typescript') != -1 || index(g:polyglot_disabled, 'typescript') != -1 || index(g:polyglot_disabled, 'jsx') != -1)
|
if !exists('g:polyglot_disabled') || !(index(g:polyglot_disabled, 'typescript') != -1 || index(g:polyglot_disabled, 'typescript') != -1 || index(g:polyglot_disabled, 'jsx') != -1)
|
||||||
|
|
||||||
source <sfile>:h/typescript.vim
|
source <sfile>:h/tsx.vim
|
||||||
|
|
||||||
endif
|
endif
|
||||||
|
|||||||
@@ -1,5 +1,28 @@
|
|||||||
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'graphql') == -1
|
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'graphql') == -1
|
||||||
|
|
||||||
|
" Copyright (c) 2016-2020 Jon Parise <jon@indelible.org>
|
||||||
|
"
|
||||||
|
" Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
" of this software and associated documentation files (the "Software"), to
|
||||||
|
" deal in the Software without restriction, including without limitation the
|
||||||
|
" rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||||
|
" sell copies of the Software, and to permit persons to whom the Software is
|
||||||
|
" furnished to do so, subject to the following conditions:
|
||||||
|
"
|
||||||
|
" The above copyright notice and this permission notice shall be included in
|
||||||
|
" all copies or substantial portions of the Software.
|
||||||
|
"
|
||||||
|
" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
" IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
" FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
" AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
" LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||||
|
" FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||||
|
" IN THE SOFTWARE.
|
||||||
|
"
|
||||||
|
" Language: GraphQL
|
||||||
|
" Maintainer: Jon Parise <jon@indelible.org>
|
||||||
|
|
||||||
if exists('b:current_syntax')
|
if exists('b:current_syntax')
|
||||||
let s:current_syntax = b:current_syntax
|
let s:current_syntax = b:current_syntax
|
||||||
unlet b:current_syntax
|
unlet b:current_syntax
|
||||||
@@ -11,17 +34,31 @@ endif
|
|||||||
|
|
||||||
let s:tags = '\%(' . join(graphql#javascript_tags(), '\|') . '\)'
|
let s:tags = '\%(' . join(graphql#javascript_tags(), '\|') . '\)'
|
||||||
|
|
||||||
exec 'syntax region graphqlTemplateString start=+' . s:tags . '\@20<=`+ skip=+\\`+ end=+`+ contains=@GraphQLSyntax,jsTemplateExpression,jsSpecial extend'
|
if graphql#has_syntax_group('jsTemplateExpression')
|
||||||
exec 'syntax match graphqlTaggedTemplate +' . s:tags . '\ze`+ nextgroup=graphqlTemplateString'
|
" pangloss/vim-javascript
|
||||||
|
exec 'syntax region graphqlTemplateString start=+' . s:tags . '\@20<=`+ skip=+\\\\\|\\`+ end=+`+ contains=@GraphQLSyntax,jsTemplateExpression,jsSpecial extend'
|
||||||
|
exec 'syntax match graphqlTaggedTemplate +' . s:tags . '\ze`+ nextgroup=graphqlTemplateString'
|
||||||
|
syntax region graphqlTemplateExpression start=+${+ end=+}+ contained contains=jsTemplateExpression containedin=graphqlFold keepend
|
||||||
|
|
||||||
" Support expression interpolation ((${...})) inside template strings.
|
hi def link graphqlTemplateString jsTemplateString
|
||||||
syntax region graphqlTemplateExpression start=+${+ end=+}+ contained contains=jsTemplateExpression containedin=graphqlFold keepend
|
hi def link graphqlTaggedTemplate jsTaggedTemplate
|
||||||
|
hi def link graphqlTemplateExpression jsTemplateExpression
|
||||||
|
|
||||||
hi def link graphqlTemplateString jsTemplateString
|
syn cluster jsExpression add=graphqlTaggedTemplate
|
||||||
hi def link graphqlTaggedTemplate jsTaggedTemplate
|
syn cluster graphqlTaggedTemplate add=graphqlTemplateString
|
||||||
hi def link graphqlTemplateExpression jsTemplateExpression
|
elseif graphql#has_syntax_group('javaScriptStringT')
|
||||||
|
" runtime/syntax/javascript.vim
|
||||||
|
exec 'syntax region graphqlTemplateString start=+' . s:tags . '\@20<=`+ skip=+\\\\\|\\`+ end=+`+ contains=@GraphQLSyntax,javaScriptSpecial,javaScriptEmbed,@htmlPreproc extend'
|
||||||
|
exec 'syntax match graphqlTaggedTemplate +' . s:tags . '\ze`+ nextgroup=graphqlTemplateString'
|
||||||
|
syntax region graphqlTemplateExpression start=+${+ end=+}+ contained contains=@javaScriptEmbededExpr containedin=graphqlFold keepend
|
||||||
|
|
||||||
syn cluster jsExpression add=graphqlTaggedTemplate
|
hi def link graphqlTemplateString javaScriptStringT
|
||||||
syn cluster graphqlTaggedTemplate add=graphqlTemplateString
|
hi def link graphqlTaggedTemplate javaScriptEmbed
|
||||||
|
hi def link graphqlTemplateExpression javaScriptEmbed
|
||||||
|
|
||||||
|
syn cluster htmlJavaScript add=graphqlTaggedTemplate
|
||||||
|
syn cluster javaScriptEmbededExpr add=graphqlTaggedTemplate
|
||||||
|
syn cluster graphqlTaggedTemplate add=graphqlTemplateString
|
||||||
|
endif
|
||||||
|
|
||||||
endif
|
endif
|
||||||
|
|||||||
5
after/syntax/javascriptreact/graphql.vim
Normal file
5
after/syntax/javascriptreact/graphql.vim
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'graphql') == -1
|
||||||
|
|
||||||
|
runtime! after/syntax/javascript/graphql.vim
|
||||||
|
|
||||||
|
endif
|
||||||
@@ -4,7 +4,7 @@ let s:highlight_close_tag = get(g:, 'vim_jsx_pretty_highlight_close_tag', 0)
|
|||||||
|
|
||||||
" detect jsx region
|
" detect jsx region
|
||||||
syntax region jsxRegion
|
syntax region jsxRegion
|
||||||
\ start=+\%(\%(\_[([,?:=+\-*/>{}]\|<\s\+\|&&\|||\|=>\|\<return\|\<default\|\<await\|\<yield\)\_s*\)\@<=<\_s*\%(>\|\z(\%(script\|T\s*>\s*(\)\@!\<[_$A-Za-z][-:._$A-Za-z0-9]*\>\)\%(\_s*\%([-+*)\]}&|?,]\|/\%([/*]\|\_s*>\)\@!\)\)\@!\)+
|
\ start=+\%(\%(\_[([,?:=+\-*/>{}]\|<\s\+\|&&\|||\|=>\|\<return\|\<default\|\<await\|\<yield\)\_s*\)\@<=<\_s*\%(>\|\z(\%(script\|\s*\<T\>\)\@!\<[_$A-Za-z][-:._$A-Za-z0-9]*\>\)\%(\_s*\%([-+*)\]}&|?,]\|/\%([/*]\|\_s*>\)\@!\)\)\@!\)+
|
||||||
\ end=++
|
\ end=++
|
||||||
\ contains=jsxElement
|
\ contains=jsxElement
|
||||||
|
|
||||||
@@ -20,7 +20,7 @@ syntax region jsxTag
|
|||||||
\ matchgroup=NONE
|
\ matchgroup=NONE
|
||||||
\ end=+\%(/\_s*>\)\@=+
|
\ end=+\%(/\_s*>\)\@=+
|
||||||
\ contained
|
\ contained
|
||||||
\ contains=jsxOpenTag,jsxAttrib,jsxEscapeJs,jsxSpreadOperator,jsComment,@javascriptComments,javaScriptLineComment,javaScriptComment,typescriptLineComment,typescriptComment
|
\ contains=jsxOpenTag,jsxAttrib,jsxExpressionBlock,jsxSpreadOperator,jsComment,@javascriptComments,javaScriptLineComment,javaScriptComment,typescriptLineComment,typescriptComment
|
||||||
\ keepend
|
\ keepend
|
||||||
\ extend
|
\ extend
|
||||||
\ skipwhite
|
\ skipwhite
|
||||||
@@ -39,7 +39,7 @@ syntax region jsxElement
|
|||||||
\ start=+<\_s*\%(>\|\${\|\z(\<[-:._$A-Za-z0-9]\+\>\)\)+
|
\ start=+<\_s*\%(>\|\${\|\z(\<[-:._$A-Za-z0-9]\+\>\)\)+
|
||||||
\ end=+/\_s*>+
|
\ end=+/\_s*>+
|
||||||
\ end=+<\_s*/\_s*\z1\_s*>+
|
\ end=+<\_s*/\_s*\z1\_s*>+
|
||||||
\ contains=jsxElement,jsxTag,jsxEscapeJs,jsxComment,jsxCloseTag,@Spell
|
\ contains=jsxElement,jsxTag,jsxExpressionBlock,jsxComment,jsxCloseTag,@Spell
|
||||||
\ keepend
|
\ keepend
|
||||||
\ extend
|
\ extend
|
||||||
\ contained
|
\ contained
|
||||||
@@ -66,13 +66,13 @@ exe 'syntax region jsxOpenTag
|
|||||||
|
|
||||||
" <tag key={this.props.key}>
|
" <tag key={this.props.key}>
|
||||||
" ~~~~~~~~~~~~~~~~
|
" ~~~~~~~~~~~~~~~~
|
||||||
syntax region jsxEscapeJs
|
syntax region jsxExpressionBlock
|
||||||
\ matchgroup=jsxBraces
|
\ matchgroup=jsxBraces
|
||||||
\ start=+{+
|
\ start=+{+
|
||||||
\ end=+}+
|
\ end=+}+
|
||||||
\ contained
|
\ contained
|
||||||
\ extend
|
\ extend
|
||||||
\ contains=@jsExpression,jsSpreadExpression,@javascriptExpression,javascriptSpreadOp,@javaScriptEmbededExpr,@typescriptExpression,typescriptObjectSpread
|
\ contains=@jsExpression,jsSpreadExpression,@javascriptExpression,javascriptSpreadOp,@javaScriptEmbededExpr,@typescriptExpression,typescriptObjectSpread,jsComment,@javascriptComments,javaScriptLineComment,javaScriptComment,typescriptLineComment,typescriptComment
|
||||||
|
|
||||||
" <foo.bar>
|
" <foo.bar>
|
||||||
" ~
|
" ~
|
||||||
@@ -84,7 +84,7 @@ syntax match jsxNamespace +:+ contained
|
|||||||
|
|
||||||
" <tag id="sample">
|
" <tag id="sample">
|
||||||
" ~
|
" ~
|
||||||
syntax match jsxEqual +=+ contained skipwhite skipempty nextgroup=jsxString,jsxEscapeJs,jsxRegion
|
syntax match jsxEqual +=+ contained skipwhite skipempty nextgroup=jsxString,jsxExpressionBlock,jsxRegion
|
||||||
|
|
||||||
" <tag />
|
" <tag />
|
||||||
" ~~
|
" ~~
|
||||||
@@ -154,10 +154,10 @@ if s:enable_tagged_jsx
|
|||||||
\ end=+`+
|
\ end=+`+
|
||||||
\ extend
|
\ extend
|
||||||
\ contained
|
\ contained
|
||||||
\ contains=jsxElement,jsxEscapeJs
|
\ contains=jsxElement,jsxExpressionBlock
|
||||||
\ transparent
|
\ transparent
|
||||||
|
|
||||||
syntax region jsxEscapeJs
|
syntax region jsxExpressionBlock
|
||||||
\ matchgroup=jsxBraces
|
\ matchgroup=jsxBraces
|
||||||
\ start=+\${+
|
\ start=+\${+
|
||||||
\ end=+}+
|
\ end=+}+
|
||||||
@@ -171,14 +171,14 @@ if s:enable_tagged_jsx
|
|||||||
\ matchgroup=NONE
|
\ matchgroup=NONE
|
||||||
\ end=+}\@1<=+
|
\ end=+}\@1<=+
|
||||||
\ contained
|
\ contained
|
||||||
\ contains=jsxEscapeJs
|
\ contains=jsxExpressionBlock
|
||||||
\ skipwhite
|
\ skipwhite
|
||||||
\ skipempty
|
\ skipempty
|
||||||
\ nextgroup=jsxAttrib,jsxSpreadOperator
|
\ nextgroup=jsxAttrib,jsxSpreadOperator
|
||||||
|
|
||||||
syntax keyword jsxAttribKeyword class contained
|
syntax keyword jsxAttribKeyword class contained
|
||||||
|
|
||||||
syntax match jsxSpreadOperator +\.\.\.+ contained nextgroup=jsxEscapeJs skipwhite
|
syntax match jsxSpreadOperator +\.\.\.+ contained nextgroup=jsxExpressionBlock skipwhite
|
||||||
|
|
||||||
syntax match jsxCloseTag +<//>+ contained
|
syntax match jsxCloseTag +<//>+ contained
|
||||||
|
|
||||||
|
|||||||
@@ -2,17 +2,13 @@ if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'mathematica') =
|
|||||||
|
|
||||||
"Vim conceal file
|
"Vim conceal file
|
||||||
" Language: Mathematica
|
" Language: Mathematica
|
||||||
" Maintainer: Voldikss <dyzplus@gmail.com>
|
" Maintainer: R. Menon <rsmenon@icloud.com>
|
||||||
" Last Change: 2019 Jan 23 by Voldikss
|
" Last Change: Feb 25, 2013
|
||||||
" Source: https://github.com/voldikss/vim-mma/after/syntax/mma.vim
|
|
||||||
" Credits:
|
|
||||||
" Rsmenon: https://github.com/rsmenon
|
|
||||||
|
|
||||||
if (exists('g:mma_candy') && g:mma_candy == 0) || !has('conceal') || &enc != 'utf-8'
|
if (exists('g:mma_candy') && g:mma_candy == 0) || !has('conceal') || &enc != 'utf-8'
|
||||||
finish
|
finish
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
|
||||||
"These are fairly safe and straightforward conceals
|
"These are fairly safe and straightforward conceals
|
||||||
if exists('g:mma_candy') && g:mma_candy > 0
|
if exists('g:mma_candy') && g:mma_candy > 0
|
||||||
"Rules
|
"Rules
|
||||||
|
|||||||
37
after/syntax/reason/graphql.vim
Normal file
37
after/syntax/reason/graphql.vim
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'graphql') == -1
|
||||||
|
|
||||||
|
" Copyright (c) 2016-2020 Jon Parise <jon@indelible.org>
|
||||||
|
"
|
||||||
|
" Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
" of this software and associated documentation files (the "Software"), to
|
||||||
|
" deal in the Software without restriction, including without limitation the
|
||||||
|
" rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||||
|
" sell copies of the Software, and to permit persons to whom the Software is
|
||||||
|
" furnished to do so, subject to the following conditions:
|
||||||
|
"
|
||||||
|
" The above copyright notice and this permission notice shall be included in
|
||||||
|
" all copies or substantial portions of the Software.
|
||||||
|
"
|
||||||
|
" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
" IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
" FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
" AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
" LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||||
|
" FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||||
|
" IN THE SOFTWARE.
|
||||||
|
"
|
||||||
|
" Language: GraphQL
|
||||||
|
" Maintainer: Jon Parise <jon@indelible.org>
|
||||||
|
|
||||||
|
if exists('b:current_syntax')
|
||||||
|
let s:current_syntax = b:current_syntax
|
||||||
|
unlet b:current_syntax
|
||||||
|
endif
|
||||||
|
syn include @GraphQLSyntax syntax/graphql.vim
|
||||||
|
if exists('s:current_syntax')
|
||||||
|
let b:current_syntax = s:current_syntax
|
||||||
|
endif
|
||||||
|
|
||||||
|
syntax region graphqlMultilineString matchgroup=reasonMultilineString start=+graphql\_s*\zs{|+ end=+|}+ contains=@GraphQLSyntax,reasonEscape,reasonEscapeUnicode,reasonEscapeError,reasonStringContinuation keepend
|
||||||
|
|
||||||
|
endif
|
||||||
@@ -9,26 +9,183 @@ if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'rspec') == -1
|
|||||||
runtime! syntax/ruby.vim
|
runtime! syntax/ruby.vim
|
||||||
unlet! b:current_syntax
|
unlet! b:current_syntax
|
||||||
|
|
||||||
syntax keyword rspecGroupMethods context describe example it its let it_should_behave_like shared_examples_for subject it_behaves_like pending specify When Then Given Invariant feature scenario given
|
setlocal commentstring=#\ %s
|
||||||
highlight link rspecGroupMethods Type
|
|
||||||
|
|
||||||
syntax keyword rspecBeforeAndAfter after after_suite_parts append_after append_before before before_suite_parts prepend_after prepend_before around
|
syntax keyword rspecGroupMethods
|
||||||
highlight link rspecBeforeAndAfter Statement
|
\ aggregate_failures
|
||||||
|
\ context
|
||||||
|
\ describe
|
||||||
|
\ example
|
||||||
|
\ feature
|
||||||
|
\ fcontext
|
||||||
|
\ fdescribe
|
||||||
|
\ fexample
|
||||||
|
\ fit
|
||||||
|
\ focus
|
||||||
|
\ fspecify
|
||||||
|
\ Given
|
||||||
|
\ given\!
|
||||||
|
\ include_context
|
||||||
|
\ include_examples
|
||||||
|
\ Invariant
|
||||||
|
\ it
|
||||||
|
\ it_behaves_like
|
||||||
|
\ it_should_behave_like
|
||||||
|
\ its
|
||||||
|
\ let
|
||||||
|
\ let\!
|
||||||
|
\ pending
|
||||||
|
\ scenario
|
||||||
|
\ shared_examples
|
||||||
|
\ shared_examples_for
|
||||||
|
\ skip
|
||||||
|
\ specify
|
||||||
|
\ subject
|
||||||
|
\ Then
|
||||||
|
\ When
|
||||||
|
|
||||||
syntax keyword rspecMocks double mock stub stub_chain
|
syntax keyword rspecBeforeAndAfter
|
||||||
highlight link rspecMocks Constant
|
\ after
|
||||||
|
\ after_suite_parts
|
||||||
|
\ append_after
|
||||||
|
\ append_before
|
||||||
|
\ around
|
||||||
|
\ before
|
||||||
|
\ before_suite_parts
|
||||||
|
\ prepend_after
|
||||||
|
\ prepend_before
|
||||||
|
|
||||||
syntax keyword rspecMockMethods and_raise and_return and_throw and_yield build_child called_max_times expected_args invoke matches
|
syntax keyword rspecMocks
|
||||||
highlight link rspecMockMethods Function
|
\ double
|
||||||
|
\ instance_double
|
||||||
|
\ instance_spy
|
||||||
|
\ mock
|
||||||
|
\ spy
|
||||||
|
\ stub
|
||||||
|
\ stub_chain
|
||||||
|
\ stub_const
|
||||||
|
|
||||||
syntax keyword rspecKeywords should should_not should_not_receive should_receive
|
syntax keyword rspecMockMethods
|
||||||
highlight link rspecKeywords Constant
|
\ and_call_original
|
||||||
|
\ and_raise
|
||||||
|
\ and_return
|
||||||
|
\ and_throw
|
||||||
|
\ and_yield
|
||||||
|
\ build_child
|
||||||
|
\ called_max_times
|
||||||
|
\ expected_args
|
||||||
|
\ invoke
|
||||||
|
\ matches
|
||||||
|
|
||||||
|
syntax keyword rspecKeywords
|
||||||
|
\ should
|
||||||
|
\ should_not
|
||||||
|
\ should_not_receive
|
||||||
|
\ should_receive
|
||||||
|
|
||||||
|
syntax keyword rspecMatchers
|
||||||
|
\ all
|
||||||
|
\ allow
|
||||||
|
\ allow_any_instance_of
|
||||||
|
\ assigns
|
||||||
|
\ be
|
||||||
|
\ change
|
||||||
|
\ described_class
|
||||||
|
\ eq
|
||||||
|
\ eql
|
||||||
|
\ equal
|
||||||
|
\ errors_on
|
||||||
|
\ exist
|
||||||
|
\ expect
|
||||||
|
\ expect_any_instance_of
|
||||||
|
\ have
|
||||||
|
\ have_at_least
|
||||||
|
\ have_at_most
|
||||||
|
\ have_exactly
|
||||||
|
\ include
|
||||||
|
\ is_expected
|
||||||
|
\ match
|
||||||
|
\ match_array
|
||||||
|
\ matcher
|
||||||
|
\ not_to
|
||||||
|
\ raise_error
|
||||||
|
\ raise_exception
|
||||||
|
\ receive
|
||||||
|
\ receive_messages
|
||||||
|
\ receive_message_chain
|
||||||
|
\ respond_to
|
||||||
|
\ satisfy
|
||||||
|
\ throw_symbol
|
||||||
|
\ to
|
||||||
|
\ to_not
|
||||||
|
\ when
|
||||||
|
\ wrap_expectation
|
||||||
|
|
||||||
|
" rspec-mongoid exclusive matchers
|
||||||
|
syntax keyword rspecMatchers
|
||||||
|
\ accept_nested_attributes_for
|
||||||
|
\ belong_to
|
||||||
|
\ custom_validate
|
||||||
|
\ embed_many
|
||||||
|
\ embed_one
|
||||||
|
\ validate_associated
|
||||||
|
\ validate_exclusion_of
|
||||||
|
\ validate_format_of
|
||||||
|
\ validate_inclusion_of
|
||||||
|
\ validate_length_of
|
||||||
|
|
||||||
|
" shoulda matchers
|
||||||
|
syntax keyword rspecMatchers
|
||||||
|
\ allow_mass_assignment_of
|
||||||
|
\ allow_value
|
||||||
|
\ ensure_exclusion_of
|
||||||
|
\ ensure_length_of
|
||||||
|
\ have_secure_password
|
||||||
|
\ validate_absence_of
|
||||||
|
\ validate_acceptance_of
|
||||||
|
\ validate_confirmation_of
|
||||||
|
\ validate_numericality_of
|
||||||
|
\ validate_presence_of
|
||||||
|
\ validate_uniqueness_of
|
||||||
|
|
||||||
|
syntax keyword rspecMessageExpectation
|
||||||
|
\ advise
|
||||||
|
\ any_args
|
||||||
|
\ any_number_of_times
|
||||||
|
\ anything
|
||||||
|
\ at_least
|
||||||
|
\ at_most
|
||||||
|
\ exactly
|
||||||
|
\ expected_messages_received
|
||||||
|
\ generate_error
|
||||||
|
\ hash_including
|
||||||
|
\ hash_not_including
|
||||||
|
\ ignoring_args
|
||||||
|
\ instance_of
|
||||||
|
\ matches_at_least_count
|
||||||
|
\ matches_at_most_count
|
||||||
|
\ matches_exact_count
|
||||||
|
\ matches_name_but_not_args
|
||||||
|
\ negative_expectation_for
|
||||||
|
\ never
|
||||||
|
\ no_args
|
||||||
|
\ once
|
||||||
|
\ ordered
|
||||||
|
\ similar_messages
|
||||||
|
\ times
|
||||||
|
\ twice
|
||||||
|
\ verify_messages_received
|
||||||
|
\ with
|
||||||
|
|
||||||
syntax keyword rspecMatchers be change eql equal exist expect have have_at_least have_at_most have_exactly include match matcher raise_error raise_exception respond_to satisfy throw_symbol to to_not not_to when wrap_expectation
|
|
||||||
syntax match rspecMatchers /\<\(be\|have\)_\w\+\>/
|
syntax match rspecMatchers /\<\(be\|have\)_\w\+\>/
|
||||||
highlight link rspecMatchers Function
|
syntax match rspecGroupMethods /\.describe/
|
||||||
|
|
||||||
syntax keyword rspecMessageExpectation advise any_args any_number_of_times anything at_least at_most exactly expected_messages_received generate_error hash_including hash_not_including ignoring_args instance_of matches_at_least_count matches_at_most_count matches_exact_count matches_name_but_not_args negative_expectation_for never no_args once ordered similar_messages times twice verify_messages_received with
|
highlight link rspecGroupMethods Statement
|
||||||
|
highlight link rspecBeforeAndAfter Identifier
|
||||||
|
highlight link rspecMocks Constant
|
||||||
|
highlight link rspecMockMethods Function
|
||||||
|
highlight link rspecKeywords Constant
|
||||||
|
highlight link rspecMatchers Function
|
||||||
highlight link rspecMessageExpectation Function
|
highlight link rspecMessageExpectation Function
|
||||||
|
|
||||||
let b:current_syntax = 'rspec'
|
let b:current_syntax = 'rspec'
|
||||||
|
|||||||
@@ -1,13 +0,0 @@
|
|||||||
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
|
|
||||||
syn region texRefZone matchgroup=texStatement start="\\\(label\|\)c\(page\|\)ref{" end="}\|%stopzone\>" contains=@texRefGroup
|
|
||||||
|
|
||||||
" adds support for listings package
|
|
||||||
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,28 +1,63 @@
|
|||||||
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'graphql') == -1
|
if !exists('g:polyglot_disabled') || !(index(g:polyglot_disabled, 'typescript') != -1 || index(g:polyglot_disabled, 'typescript') != -1 || index(g:polyglot_disabled, 'jsx') != -1)
|
||||||
|
|
||||||
|
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
|
||||||
|
" Vim syntax file
|
||||||
|
"
|
||||||
|
" Language: javascript.jsx
|
||||||
|
" Maintainer: MaxMellon <maxmellon1994@gmail.com>
|
||||||
|
" Depends: leafgarland/typescript-vim
|
||||||
|
"
|
||||||
|
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
|
||||||
|
|
||||||
|
if get(g:, 'vim_jsx_pretty_disable_tsx', 0)
|
||||||
|
finish
|
||||||
|
endif
|
||||||
|
|
||||||
|
let s:jsx_cpo = &cpo
|
||||||
|
set cpo&vim
|
||||||
|
|
||||||
|
syntax case match
|
||||||
|
|
||||||
" GraphQL Support
|
|
||||||
if exists('b:current_syntax')
|
if exists('b:current_syntax')
|
||||||
let s:current_syntax = b:current_syntax
|
let s:current_syntax = b:current_syntax
|
||||||
unlet b:current_syntax
|
unlet b:current_syntax
|
||||||
endif
|
endif
|
||||||
syn include @GraphQLSyntax syntax/graphql.vim
|
|
||||||
if exists('s:current_syntax')
|
if exists('s:current_syntax')
|
||||||
let b:current_syntax = s:current_syntax
|
let b:current_syntax = s:current_syntax
|
||||||
endif
|
endif
|
||||||
|
|
||||||
let s:tags = '\%(' . join(graphql#javascript_tags(), '\|') . '\)'
|
" refine the typescript line comment
|
||||||
|
syntax region typescriptLineComment start=+//+ end=/$/ contains=@Spell,typescriptCommentTodo,typescriptRef extend keepend
|
||||||
|
|
||||||
exec 'syntax region graphqlTemplateString start=+' . s:tags . '\@20<=`+ skip=+\\`+ end=+`+ contains=@GraphQLSyntax,typescriptTemplateSubstitution extend'
|
for syntax_name in ['tsxRegion', 'tsxFragment']
|
||||||
exec 'syntax match graphqlTaggedTemplate +' . s:tags . '\ze`+ nextgroup=graphqlTemplateString'
|
if hlexists(syntax_name)
|
||||||
|
exe 'syntax clear ' . syntax_name
|
||||||
|
endif
|
||||||
|
endfor
|
||||||
|
|
||||||
" Support expression interpolation ((${...})) inside template strings.
|
if !hlexists('typescriptTypeCast')
|
||||||
syntax region graphqlTemplateExpression start=+${+ end=+}+ contained contains=typescriptTemplateSubstitution containedin=graphqlFold keepend
|
" add a typescriptBlock group for typescript
|
||||||
|
syntax region typescriptBlock
|
||||||
|
\ matchgroup=typescriptBraces
|
||||||
|
\ start="{"
|
||||||
|
\ end="}"
|
||||||
|
\ contained
|
||||||
|
\ extend
|
||||||
|
\ contains=@typescriptExpression,typescriptBlock
|
||||||
|
\ fold
|
||||||
|
hi def link typescriptTypeBrackets typescriptOpSymbols
|
||||||
|
endif
|
||||||
|
|
||||||
hi def link graphqlTemplateString typescriptTemplate
|
runtime syntax/jsx_pretty.vim
|
||||||
hi def link graphqlTemplateExpression typescriptTemplateSubstitution
|
syntax cluster typescriptExpression add=jsxRegion,typescriptParens
|
||||||
|
" Fix type casting ambiguity with JSX syntax
|
||||||
|
syntax match typescriptTypeBrackets +[<>]+ contained
|
||||||
|
syntax match typescriptTypeCast +<\([_$A-Za-z0-9]\+\)>\%(\s*\%([_$A-Za-z0-9]\+\s*;\?\|(\)\%(\_[^<]*</\1>\)\@!\)\@=+ contains=typescriptTypeBrackets,@typescriptType,typescriptType nextgroup=@typescriptExpression
|
||||||
|
|
||||||
syn cluster typescriptExpression add=graphqlTaggedTemplate
|
let b:current_syntax = 'typescript.tsx'
|
||||||
syn cluster graphqlTaggedTemplate add=graphqlTemplateString
|
|
||||||
|
|
||||||
|
let &cpo = s:jsx_cpo
|
||||||
|
unlet s:jsx_cpo
|
||||||
|
|
||||||
endif
|
endif
|
||||||
|
|||||||
@@ -1,60 +0,0 @@
|
|||||||
if !exists('g:polyglot_disabled') || !(index(g:polyglot_disabled, 'typescript') != -1 || index(g:polyglot_disabled, 'typescript') != -1 || index(g:polyglot_disabled, 'jsx') != -1)
|
|
||||||
|
|
||||||
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
|
|
||||||
" Vim syntax file
|
|
||||||
"
|
|
||||||
" Language: javascript.jsx
|
|
||||||
" Maintainer: MaxMellon <maxmellon1994@gmail.com>
|
|
||||||
" Depends: leafgarland/typescript-vim
|
|
||||||
"
|
|
||||||
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
|
|
||||||
|
|
||||||
if get(g:, 'vim_jsx_pretty_disable_tsx', 0)
|
|
||||||
finish
|
|
||||||
endif
|
|
||||||
|
|
||||||
let s:jsx_cpo = &cpo
|
|
||||||
set cpo&vim
|
|
||||||
|
|
||||||
syntax case match
|
|
||||||
|
|
||||||
if exists('b:current_syntax')
|
|
||||||
let s:current_syntax = b:current_syntax
|
|
||||||
unlet b:current_syntax
|
|
||||||
endif
|
|
||||||
|
|
||||||
if exists('s:current_syntax')
|
|
||||||
let b:current_syntax = s:current_syntax
|
|
||||||
endif
|
|
||||||
|
|
||||||
" refine the typescript line comment
|
|
||||||
syntax region typescriptLineComment start=+//+ end=/$/ contains=@Spell,typescriptCommentTodo,typescriptRef extend keepend
|
|
||||||
|
|
||||||
for syntax_name in ['tsxRegion', 'tsxFragment']
|
|
||||||
if hlexists(syntax_name)
|
|
||||||
exe 'syntax clear ' . syntax_name
|
|
||||||
endif
|
|
||||||
endfor
|
|
||||||
|
|
||||||
if !hlexists('typescriptTypeCast')
|
|
||||||
" add a typescriptBlock group for typescript
|
|
||||||
syntax region typescriptBlock
|
|
||||||
\ matchgroup=typescriptBraces
|
|
||||||
\ start="{"
|
|
||||||
\ end="}"
|
|
||||||
\ contained
|
|
||||||
\ extend
|
|
||||||
\ contains=@typescriptExpression,typescriptBlock
|
|
||||||
\ fold
|
|
||||||
endif
|
|
||||||
|
|
||||||
syntax cluster typescriptExpression add=jsxRegion,typescriptParens
|
|
||||||
|
|
||||||
runtime syntax/jsx_pretty.vim
|
|
||||||
|
|
||||||
let b:current_syntax = 'typescript.tsx'
|
|
||||||
|
|
||||||
let &cpo = s:jsx_cpo
|
|
||||||
unlet s:jsx_cpo
|
|
||||||
|
|
||||||
endif
|
|
||||||
@@ -1,5 +1,28 @@
|
|||||||
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'graphql') == -1
|
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'graphql') == -1
|
||||||
|
|
||||||
|
" Copyright (c) 2016-2020 Jon Parise <jon@indelible.org>
|
||||||
|
"
|
||||||
|
" Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
" of this software and associated documentation files (the "Software"), to
|
||||||
|
" deal in the Software without restriction, including without limitation the
|
||||||
|
" rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||||
|
" sell copies of the Software, and to permit persons to whom the Software is
|
||||||
|
" furnished to do so, subject to the following conditions:
|
||||||
|
"
|
||||||
|
" The above copyright notice and this permission notice shall be included in
|
||||||
|
" all copies or substantial portions of the Software.
|
||||||
|
"
|
||||||
|
" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
" IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
" FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
" AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
" LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||||
|
" FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||||
|
" IN THE SOFTWARE.
|
||||||
|
"
|
||||||
|
" Language: GraphQL
|
||||||
|
" Maintainer: Jon Parise <jon@indelible.org>
|
||||||
|
|
||||||
if exists('b:current_syntax')
|
if exists('b:current_syntax')
|
||||||
let s:current_syntax = b:current_syntax
|
let s:current_syntax = b:current_syntax
|
||||||
unlet b:current_syntax
|
unlet b:current_syntax
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
if !exists('g:polyglot_disabled') || !(index(g:polyglot_disabled, 'typescript') != -1 || index(g:polyglot_disabled, 'typescript') != -1 || index(g:polyglot_disabled, 'jsx') != -1)
|
if !exists('g:polyglot_disabled') || !(index(g:polyglot_disabled, 'typescript') != -1 || index(g:polyglot_disabled, 'typescript') != -1 || index(g:polyglot_disabled, 'jsx') != -1)
|
||||||
|
|
||||||
source <sfile>:h/typescript.vim
|
source <sfile>:h/tsx.vim
|
||||||
|
|
||||||
endif
|
endif
|
||||||
|
|||||||
5
after/syntax/typescriptreact/graphql.vim
Normal file
5
after/syntax/typescriptreact/graphql.vim
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'graphql') == -1
|
||||||
|
|
||||||
|
runtime! after/syntax/typescript/graphql.vim
|
||||||
|
|
||||||
|
endif
|
||||||
5
after/syntax/vue/graphql.vim
Normal file
5
after/syntax/vue/graphql.vim
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'graphql') == -1
|
||||||
|
|
||||||
|
runtime! after/syntax/javascript/graphql.vim
|
||||||
|
|
||||||
|
endif
|
||||||
@@ -42,8 +42,8 @@ syn keyword yamlConstant NULL Null null NONE None none NIL Nil nil
|
|||||||
syn keyword yamlConstant TRUE True true YES Yes yes ON On on
|
syn keyword yamlConstant TRUE True true YES Yes yes ON On on
|
||||||
syn keyword yamlConstant FALSE False false NO No no OFF Off off
|
syn keyword yamlConstant FALSE False false NO No no OFF Off off
|
||||||
|
|
||||||
syn match yamlKey "^\s*\zs[^ \t\"]\+\ze\s*:"
|
syn match yamlKey "^\s*\zs[^ \t\"\'#]\+\ze\s*:"
|
||||||
syn match yamlKey "^\s*-\s*\zs[^ \t\"\']\+\ze\s*:"
|
syn match yamlKey "^\s*-\s*\zs[^ \t\"\'#]\+\ze\s*:"
|
||||||
syn match yamlAnchor "&\S\+"
|
syn match yamlAnchor "&\S\+"
|
||||||
syn match yamlAlias "*\S\+"
|
syn match yamlAlias "*\S\+"
|
||||||
|
|
||||||
|
|||||||
126
after/syntax/zsh.vim
Normal file
126
after/syntax/zsh.vim
Normal file
@@ -0,0 +1,126 @@
|
|||||||
|
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'zinit') == -1
|
||||||
|
|
||||||
|
" Copyright (c) 2019 Sebastian Gniazdowski
|
||||||
|
"
|
||||||
|
" Syntax highlighting for Zinit commands in any file of type `zsh'.
|
||||||
|
" It adds definitions for the Zinit syntax to the ones from the
|
||||||
|
" existing zsh.vim definitions-file.
|
||||||
|
|
||||||
|
" Main Zinit command.
|
||||||
|
" Should be the only TOP rule for the whole syntax.
|
||||||
|
syntax match ZinitCommand /\<zinit\>\s/me=e-1
|
||||||
|
\ skipwhite
|
||||||
|
\ nextgroup=ZinitSubCommands,ZinitPluginSubCommands,ZinitSnippetSubCommands
|
||||||
|
\ contains=ZinitSubCommands,ZinitPluginSubCommands,ZinitSnippetSubCommands
|
||||||
|
|
||||||
|
" TODO: add options for e.g. light
|
||||||
|
syntax match ZinitSubCommands /\s\<\%(ice\|compinit\|env-whitelist\|cdreplay\|cdclear\|update\)\>\s/ms=s+1,me=e-1
|
||||||
|
\ contained
|
||||||
|
|
||||||
|
syntax match ZinitPluginSubCommands /\s\<\%(light\|load\)\>\s/ms=s+1,me=e-1
|
||||||
|
\ skipwhite nextgroup=ZinitPlugin1,ZinitPlugin2,ZinitPlugin3
|
||||||
|
\ contains=ZinitPlugin1,ZinitPlugin2,ZinitPlugin3
|
||||||
|
|
||||||
|
syntax match ZinitSnippetSubCommands /\s\<\%(snippet\)\>\s/ms=s+1,me=e-1
|
||||||
|
\ skipwhite
|
||||||
|
\ nextgroup=ZinitSnippetShorthands1,ZinitSnippetShorthands2
|
||||||
|
\ contains=ZinitSnippetShorthands1,ZinitSnippetShorthands2
|
||||||
|
|
||||||
|
" "user/plugin"
|
||||||
|
syntax match ZinitPlugin1 /\s["]\%([!-_]*\%(\/[!-_]\+\)\+\|[!-_]\+\)["]/ms=s+1,hs=s+2,he=e-1
|
||||||
|
\ contained
|
||||||
|
\ nextgroup=ZinitTrailingWhiteSpace
|
||||||
|
\ contains=ZinitTrailingWhiteSpace
|
||||||
|
|
||||||
|
" 'user/plugin'
|
||||||
|
syntax match ZinitPlugin2 /\s[']\%([!-_]*\%(\/[!-_]\+\)\+\|[!-_]\+\)[']/ms=s+1,hs=s+2,he=e-1
|
||||||
|
\ contained
|
||||||
|
\ nextgroup=ZinitTrailingWhiteSpace
|
||||||
|
\ contains=ZinitTrailingWhiteSpace
|
||||||
|
|
||||||
|
" user/plugin
|
||||||
|
syntax match ZinitPlugin3 /\s\%([!-_]*\%(\/[!-_]\+\)\+\|[!-_]\+\)/ms=s+1,me=e+2
|
||||||
|
\ contained
|
||||||
|
\ nextgroup=ZinitTrailingWhiteSpace
|
||||||
|
\ contains=ZinitTrailingWhiteSpace
|
||||||
|
|
||||||
|
" OMZ:: or PZT::
|
||||||
|
" TODO: 'OMZ:: or 'PZT::
|
||||||
|
syntax match ZinitSnippetShorthands1 /\s\<\%(\%(OMZ\|PZT\)\>::\|\)/hs=s+1,he=e-2
|
||||||
|
\ contained
|
||||||
|
\ skipwhite
|
||||||
|
\ nextgroup=ZinitSnippetUrl1,ZinitSnippetUrl2
|
||||||
|
\ contains=ZinitSnippetUrl1,ZinitSnippetUrl2
|
||||||
|
|
||||||
|
" "OMZ:: or "PZT::
|
||||||
|
syntax match ZinitSnippetShorthands2 /\s["]\%(\%(OMZ\|PZT\)\>::\|\)/hs=s+2,he=e-2
|
||||||
|
\ contained
|
||||||
|
\ skipwhite
|
||||||
|
\ nextgroup=ZinitSnippetUrl3,ZinitSnippetUrl4
|
||||||
|
\ contains=ZinitSnippetUrl3,ZinitSnippetUrl4
|
||||||
|
|
||||||
|
syntax match ZinitSnippetUrl3 /\<\%(http:\/\/\|https:\/\/\|ftp:\/\/\|\$HOME\|\/\)[!-_]\+\%(\/[!-_]\+\)*\/\?["]/he=e-1
|
||||||
|
\ contained
|
||||||
|
\ nextgroup=ZinitTrailingWhiteSpace
|
||||||
|
\ contains=ZinitTrailingWhiteSpace
|
||||||
|
|
||||||
|
" TODO: Fix ZinitTrailingWhiteSpace not matching
|
||||||
|
syntax match ZinitSnippetUrl4 /\%(\%(OMZ\|PZT\)::\)[!-_]\+\%(\/[!-_]\+\)*\/\?["]/hs=s+5,he=e-1
|
||||||
|
\ contained
|
||||||
|
\ nextgroup=ZinitTrailingWhiteSpace
|
||||||
|
\ contains=ZinitTrailingWhiteSpace
|
||||||
|
|
||||||
|
" http://… or https://… or ftp://… or $HOME/… or /…
|
||||||
|
" TODO: Fix $HOME/… and /… not matching
|
||||||
|
syntax match ZinitSnippetUrl1 /\<\%(http:\/\/\|https:\/\/\|ftp:\/\/\|\$HOME\|\/\)[!-_]\+\%(\/[!-_]\+\)*\/\?/
|
||||||
|
\ contained
|
||||||
|
\ nextgroup=ZinitTrailingWhiteSpace
|
||||||
|
\ contains=ZinitTrailingWhiteSpace
|
||||||
|
|
||||||
|
" TODO: Fix ZinitTrailingWhiteSpace not matching
|
||||||
|
syntax match ZinitSnippetUrl2 /\<\%(\%(OMZ\|PZT\)::\)[!-_]\+\%(\/[!-_]\+\)*\/\?/hs=s+5
|
||||||
|
\ contained
|
||||||
|
\ nextgroup=ZinitTrailingWhiteSpace
|
||||||
|
\ contains=ZinitTrailingWhiteSpace
|
||||||
|
|
||||||
|
syntax match ZinitTrailingWhiteSpace /[[:space:]]\+$/ contained
|
||||||
|
|
||||||
|
" TODO: differentiate the no-value ices
|
||||||
|
" TODO: use contained
|
||||||
|
syntax match ZinitIceSubCommand /\sice\s/ms=s+1,me=e-1 nextgroup=ZinitIceModifiers
|
||||||
|
syntax match ZinitIceModifiers /\s\<\%(svn\|proto\|from\|teleid\|bindmap\|cloneopts\|id-as\|depth\|if\|wait\|load\)\>/ms=s+1
|
||||||
|
syntax match ZinitIceModifiers /\s\<\%(unload\|blockf\|on-update-of\|subscribe\|pick\|bpick\|src\|as\|ver\|silent\)\>/ms=s+1
|
||||||
|
syntax match ZinitIceModifiers /\s\<\%(lucid\|notify\|mv\|cp\|atinit\|atclone\|atload\|atpull\|nocd\|run-atpull\|has\)\>/ms=s+1
|
||||||
|
syntax match ZinitIceModifiers /\s\<\%(cloneonly\|make\|service\|trackbinds\|multisrc\|compile\|nocompile\)\>/ms=s+1
|
||||||
|
syntax match ZinitIceModifiers /\s\<\%(nocompletions\|reset-prompt\|wrap-track\|reset\|aliases\|sh\|bash\|ksh\|csh\)\>/ms=s+1
|
||||||
|
syntax match ZinitIceModifiers /\s\<\%(\\!sh\|!sh\|\\!bash\|!bash\|\\!ksh\|!ksh\|\\!csh\|!csh\)\>/ms=s+1
|
||||||
|
syntax match ZinitIceModifiers /\s\<\%(blockf\|silent\|lucid\|trackbinds\|cloneonly\|nocd\|run-atpull\)\>/ms=s+1
|
||||||
|
syntax match ZinitIceModifiers /\s\<\%(\|sh\|\!sh\|bash\|\!bash\|ksh\|\!ksh\|csh\|\!csh\)\>/ms=s+1
|
||||||
|
syntax match ZinitIceModifiers /\s\<\%(nocompletions\|svn\|aliases\|trigger-load\)\>/ms=s+1
|
||||||
|
syntax match ZinitIceModifiers /\s\<\%(light-mode\|is-snippet\|countdown\|ps-on-unload\|ps-on-update\)\>/ms=s+1
|
||||||
|
|
||||||
|
" Include also ices added by the existing annexes
|
||||||
|
syntax match ZinitIceModifiers /\s\<\%(test\|zman\|submod\|dl\|patch\|fbin\|sbin\|fsrc\|ferc\|fmod\|gem\|node\|rustup\|cargo\)\>/ms=s+1
|
||||||
|
|
||||||
|
" Additional Zsh and Zinit functions
|
||||||
|
syntax match ZshAndZinitFunctions /\<\%(compdef\|compinit\|zpcdreplay\|zpcdclear\|zpcompinit\|zpcompdef\)\>/
|
||||||
|
|
||||||
|
" Link
|
||||||
|
highlight def link ZshAndZinitFunctions Keyword
|
||||||
|
highlight def link ZinitCommand Statement
|
||||||
|
highlight def link ZinitSubCommands Title
|
||||||
|
highlight def link ZinitPluginSubCommands Title
|
||||||
|
highlight def link ZinitSnippetSubCommands Title
|
||||||
|
highlight def link ZinitIceModifiers Type
|
||||||
|
highlight def link ZinitSnippetShorthands1 Keyword
|
||||||
|
highlight def link ZinitSnippetShorthands2 Keyword
|
||||||
|
highlight def link ZinitPlugin1 Macro
|
||||||
|
highlight def link ZinitPlugin2 Macro
|
||||||
|
highlight def link ZinitPlugin3 Macro
|
||||||
|
highlight def link ZinitSnippetUrl1 Macro
|
||||||
|
highlight def link ZinitSnippetUrl2 Macro
|
||||||
|
highlight def link ZinitSnippetUrl3 Macro
|
||||||
|
highlight def link ZinitSnippetUrl4 Macro
|
||||||
|
highlight def link ZinitTrailingWhiteSpace Error
|
||||||
|
|
||||||
|
endif
|
||||||
@@ -13,6 +13,9 @@ function! s:L2U_Setup()
|
|||||||
if !has_key(b:, "l2u_enabled")
|
if !has_key(b:, "l2u_enabled")
|
||||||
let b:l2u_enabled = 0
|
let b:l2u_enabled = 0
|
||||||
endif
|
endif
|
||||||
|
if !has_key(b:, "l2u_autodetect_enable")
|
||||||
|
let b:l2u_autodetect_enable = 1
|
||||||
|
endif
|
||||||
|
|
||||||
" Did we install the L2U tab mappings?
|
" Did we install the L2U tab mappings?
|
||||||
if !has_key(b:, "l2u_tab_set")
|
if !has_key(b:, "l2u_tab_set")
|
||||||
@@ -92,34 +95,39 @@ endfunction
|
|||||||
" Each time the filetype changes, we may need to enable or
|
" Each time the filetype changes, we may need to enable or
|
||||||
" disable the LaTeX-to-Unicode functionality
|
" disable the LaTeX-to-Unicode functionality
|
||||||
function! LaTeXtoUnicode#Refresh()
|
function! LaTeXtoUnicode#Refresh()
|
||||||
|
|
||||||
call s:L2U_Setup()
|
call s:L2U_Setup()
|
||||||
|
|
||||||
|
" skip if manually overridden
|
||||||
|
if !b:l2u_autodetect_enable
|
||||||
|
return ''
|
||||||
|
endif
|
||||||
|
|
||||||
" by default, LaTeX-to-Unicode is only active on julia files
|
" by default, LaTeX-to-Unicode is only active on julia files
|
||||||
let file_types = s:L2U_file_type_regex(get(g:, "latex_to_unicode_file_types", "julia"))
|
let file_types = s:L2U_file_type_regex(get(g:, "latex_to_unicode_file_types", "julia"))
|
||||||
let file_types_blacklist = s:L2U_file_type_regex(get(g:, "latex_to_unicode_file_types_blacklist", "$^"))
|
let file_types_blacklist = s:L2U_file_type_regex(get(g:, "latex_to_unicode_file_types_blacklist", "$^"))
|
||||||
|
|
||||||
if match(&filetype, file_types) < 0 || match(&filetype, file_types_blacklist) >= 0
|
if match(&filetype, file_types) < 0 || match(&filetype, file_types_blacklist) >= 0
|
||||||
if b:l2u_enabled
|
if b:l2u_enabled
|
||||||
call LaTeXtoUnicode#Disable()
|
call LaTeXtoUnicode#Disable(1)
|
||||||
else
|
else
|
||||||
return
|
return ''
|
||||||
endif
|
endif
|
||||||
elseif !b:l2u_enabled
|
elseif !b:l2u_enabled
|
||||||
call LaTeXtoUnicode#Enable()
|
call LaTeXtoUnicode#Enable(1)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! LaTeXtoUnicode#Enable()
|
function! LaTeXtoUnicode#Enable(...)
|
||||||
|
let auto_set = a:0 > 0 ? a:1 : 0
|
||||||
|
|
||||||
if b:l2u_enabled
|
if b:l2u_enabled
|
||||||
return
|
return ''
|
||||||
end
|
end
|
||||||
|
|
||||||
call s:L2U_ResetLastCompletionInfo()
|
call s:L2U_ResetLastCompletionInfo()
|
||||||
|
|
||||||
let b:l2u_enabled = 1
|
let b:l2u_enabled = 1
|
||||||
|
let b:l2u_autodetect_enable = auto_set
|
||||||
|
|
||||||
" If we're editing the first file upon opening vim, this will only init the
|
" If we're editing the first file upon opening vim, this will only init the
|
||||||
" command line mode mapping, and the full initialization will be performed by
|
" command line mode mapping, and the full initialization will be performed by
|
||||||
@@ -127,18 +135,18 @@ function! LaTeXtoUnicode#Enable()
|
|||||||
" Otherwise, if we're opening a file from within a running vim session, this
|
" Otherwise, if we're opening a file from within a running vim session, this
|
||||||
" will actually initialize all the LaTeX-to-Unicode substitutions.
|
" will actually initialize all the LaTeX-to-Unicode substitutions.
|
||||||
call LaTeXtoUnicode#Init()
|
call LaTeXtoUnicode#Init()
|
||||||
|
return ''
|
||||||
return
|
|
||||||
|
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! LaTeXtoUnicode#Disable()
|
function! LaTeXtoUnicode#Disable(...)
|
||||||
|
let auto_set = a:0 > 0 ? a:1 : 0
|
||||||
if !b:l2u_enabled
|
if !b:l2u_enabled
|
||||||
return
|
return ''
|
||||||
endif
|
endif
|
||||||
let b:l2u_enabled = 0
|
let b:l2u_enabled = 0
|
||||||
|
let b:l2u_autodetect_enable = auto_set
|
||||||
call LaTeXtoUnicode#Init()
|
call LaTeXtoUnicode#Init()
|
||||||
return
|
return ''
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
" Translate old options to their new equivalents
|
" Translate old options to their new equivalents
|
||||||
@@ -246,7 +254,6 @@ function! LaTeXtoUnicode#omnifunc(findstart, base)
|
|||||||
endif
|
endif
|
||||||
let b:l2u_in_fallback = 0
|
let b:l2u_in_fallback = 0
|
||||||
" set info for the callback
|
" set info for the callback
|
||||||
let b:l2u_tab_completing = 1
|
|
||||||
let b:l2u_found_completion = 1
|
let b:l2u_found_completion = 1
|
||||||
" analyse current line
|
" analyse current line
|
||||||
let col1 = col('.')
|
let col1 = col('.')
|
||||||
@@ -375,6 +382,7 @@ function! LaTeXtoUnicode#Tab()
|
|||||||
endif
|
endif
|
||||||
" reset the in_fallback info
|
" reset the in_fallback info
|
||||||
let b:l2u_in_fallback = 0
|
let b:l2u_in_fallback = 0
|
||||||
|
let b:l2u_tab_completing = 1
|
||||||
" temporary change to completeopt to use the `longest` setting, which is
|
" temporary change to completeopt to use the `longest` setting, which is
|
||||||
" probably the only one which makes sense given that the goal of the
|
" probably the only one which makes sense given that the goal of the
|
||||||
" completion is to substitute the final string
|
" completion is to substitute the final string
|
||||||
@@ -383,7 +391,8 @@ function! LaTeXtoUnicode#Tab()
|
|||||||
set completeopt-=noinsert
|
set completeopt-=noinsert
|
||||||
" invoke omnicompletion; failure to perform LaTeX-to-Unicode completion is
|
" invoke omnicompletion; failure to perform LaTeX-to-Unicode completion is
|
||||||
" handled by the CompleteDone autocommand.
|
" handled by the CompleteDone autocommand.
|
||||||
return "\<C-X>\<C-O>"
|
call feedkeys("\<C-X>\<C-O>", 'n')
|
||||||
|
return ""
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
" This function is called at every CompleteDone event, and is meant to handle
|
" This function is called at every CompleteDone event, and is meant to handle
|
||||||
@@ -409,7 +418,7 @@ function! LaTeXtoUnicode#FallbackCallback()
|
|||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
" This is the function that performs the substitution in command-line mode
|
" This is the function that performs the substitution in command-line mode
|
||||||
function! LaTeXtoUnicode#CmdTab(triggeredbytab)
|
function! LaTeXtoUnicode#CmdTab(trigger)
|
||||||
" first stage
|
" first stage
|
||||||
" analyse command line
|
" analyse command line
|
||||||
let col1 = getcmdpos() - 1
|
let col1 = getcmdpos() - 1
|
||||||
@@ -418,10 +427,12 @@ function! LaTeXtoUnicode#CmdTab(triggeredbytab)
|
|||||||
let b:l2u_singlebslash = (match(l[0:col1-1], '\\$') >= 0)
|
let b:l2u_singlebslash = (match(l[0:col1-1], '\\$') >= 0)
|
||||||
" completion not found
|
" completion not found
|
||||||
if col0 == -1
|
if col0 == -1
|
||||||
if a:triggeredbytab
|
if a:trigger == &wildchar
|
||||||
call feedkeys("\<Tab>", 'nt') " fall-back to the default <Tab>
|
call feedkeys(nr2char(a:trigger), 'nt') " fall-back to the default wildchar
|
||||||
|
elseif a:trigger == char2nr("\<S-Tab>")
|
||||||
|
call feedkeys("\<S-Tab>", 'nt') " fall-back to the default <S-Tab>
|
||||||
endif
|
endif
|
||||||
return l
|
return ''
|
||||||
endif
|
endif
|
||||||
let base = l[col0 : col1-1]
|
let base = l[col0 : col1-1]
|
||||||
" search for matches
|
" search for matches
|
||||||
@@ -430,39 +441,28 @@ function! LaTeXtoUnicode#CmdTab(triggeredbytab)
|
|||||||
for k in keys(g:l2u_symbols_dict)
|
for k in keys(g:l2u_symbols_dict)
|
||||||
if k ==# base
|
if k ==# base
|
||||||
let exact_match = 1
|
let exact_match = 1
|
||||||
endif
|
break
|
||||||
if len(k) >= len(base) && k[0 : len(base)-1] ==# base
|
elseif len(k) >= len(base) && k[0 : len(base)-1] ==# base
|
||||||
call add(partmatches, k)
|
call add(partmatches, k)
|
||||||
endif
|
endif
|
||||||
endfor
|
endfor
|
||||||
if len(partmatches) == 0
|
if !exact_match && len(partmatches) == 0
|
||||||
if a:triggeredbytab
|
" no matches, call fallbacks
|
||||||
call feedkeys("\<Tab>", 'nt') " fall-back to the default <Tab>
|
if a:trigger == &wildchar
|
||||||
|
call feedkeys(nr2char(a:trigger), 'nt') " fall-back to the default wildchar
|
||||||
|
elseif a:trigger == char2nr("\<S-Tab>")
|
||||||
|
call feedkeys("\<S-Tab>", 'nt') " fall-back to the default <S-Tab>
|
||||||
endif
|
endif
|
||||||
return l
|
elseif exact_match
|
||||||
endif
|
" exact matches are replaced with Unicode
|
||||||
" exact matches are replaced with Unicode
|
|
||||||
if exact_match
|
|
||||||
let unicode = g:l2u_symbols_dict[base]
|
let unicode = g:l2u_symbols_dict[base]
|
||||||
if col0 > 0
|
call feedkeys(repeat("\b", len(base)) . unicode, 'nt')
|
||||||
let pre = l[0 : col0 - 1]
|
|
||||||
else
|
|
||||||
let pre = ''
|
|
||||||
endif
|
|
||||||
let posdiff = col1-col0 - len(unicode)
|
|
||||||
call setcmdpos(col1 - posdiff + 1)
|
|
||||||
return pre . unicode . l[col1 : -1]
|
|
||||||
endif
|
|
||||||
" no exact match: complete with the longest common prefix
|
|
||||||
let common = s:L2U_longest_common_prefix(partmatches)
|
|
||||||
if col0 > 0
|
|
||||||
let pre = l[0 : col0 - 1]
|
|
||||||
else
|
else
|
||||||
let pre = ''
|
" no exact match: complete with the longest common prefix
|
||||||
|
let common = s:L2U_longest_common_prefix(partmatches)
|
||||||
|
call feedkeys(common[len(base):], 'nt')
|
||||||
endif
|
endif
|
||||||
let posdiff = col1-col0 - len(common)
|
return ''
|
||||||
call setcmdpos(col1 - posdiff + 1)
|
|
||||||
return pre . common . l[col1 : -1]
|
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
" Setup the L2U tab mapping
|
" Setup the L2U tab mapping
|
||||||
@@ -473,7 +473,8 @@ function! s:L2U_SetTab(wait_insert_enter)
|
|||||||
let b:l2u_cmdtab_keys = [b:l2u_cmdtab_keys]
|
let b:l2u_cmdtab_keys = [b:l2u_cmdtab_keys]
|
||||||
endif
|
endif
|
||||||
for k in b:l2u_cmdtab_keys
|
for k in b:l2u_cmdtab_keys
|
||||||
exec 'cnoremap <buffer> '.k.' <C-\>eLaTeXtoUnicode#CmdTab('.(k ==? '<Tab>').')<CR>'
|
exec 'let trigger = char2nr("'.(k[0] == '<' ? '\' : '').k.'")'
|
||||||
|
exec 'cnoremap <buffer><expr> '.k.' LaTeXtoUnicode#CmdTab('.trigger.')'
|
||||||
endfor
|
endfor
|
||||||
let b:l2u_cmdtab_set = 1
|
let b:l2u_cmdtab_set = 1
|
||||||
endif
|
endif
|
||||||
@@ -637,6 +638,7 @@ function! LaTeXtoUnicode#Init(...)
|
|||||||
call s:L2U_SetTab(wait_insert_enter)
|
call s:L2U_SetTab(wait_insert_enter)
|
||||||
call s:L2U_SetAutoSub(wait_insert_enter)
|
call s:L2U_SetAutoSub(wait_insert_enter)
|
||||||
call s:L2U_SetKeymap()
|
call s:L2U_SetKeymap()
|
||||||
|
return ''
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! LaTeXtoUnicode#Toggle()
|
function! LaTeXtoUnicode#Toggle()
|
||||||
@@ -648,7 +650,7 @@ function! LaTeXtoUnicode#Toggle()
|
|||||||
call LaTeXtoUnicode#Enable()
|
call LaTeXtoUnicode#Enable()
|
||||||
echo "LaTeX-to-Unicode enabled"
|
echo "LaTeX-to-Unicode enabled"
|
||||||
endif
|
endif
|
||||||
return
|
return ''
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
endif
|
endif
|
||||||
|
|||||||
@@ -1,14 +1,16 @@
|
|||||||
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'rust') == -1
|
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'rust') == -1
|
||||||
|
|
||||||
function! cargo#Load()
|
function! cargo#Load()
|
||||||
" Utility call to get this script loaded, for debugging
|
" Utility call to get this script loaded, for debugging
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! cargo#cmd(args)
|
function! cargo#cmd(args) abort
|
||||||
" Trim trailing spaces. This is necessary since :terminal command parses
|
" Trim trailing spaces. This is necessary since :terminal command parses
|
||||||
" trailing spaces as an empty argument.
|
" trailing spaces as an empty argument.
|
||||||
let args = substitute(a:args, '\s\+$', '', '')
|
let args = substitute(a:args, '\s\+$', '', '')
|
||||||
if has('terminal')
|
if exists('g:cargo_shell_command_runner')
|
||||||
|
let cmd = g:cargo_shell_command_runner
|
||||||
|
elseif has('terminal')
|
||||||
let cmd = 'terminal'
|
let cmd = 'terminal'
|
||||||
elseif has('nvim')
|
elseif has('nvim')
|
||||||
let cmd = 'noautocmd new | terminal'
|
let cmd = 'noautocmd new | terminal'
|
||||||
@@ -67,6 +69,10 @@ function! cargo#build(args)
|
|||||||
call cargo#cmd("build " . a:args)
|
call cargo#cmd("build " . a:args)
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
|
function! cargo#check(args)
|
||||||
|
call cargo#cmd("check " . a:args)
|
||||||
|
endfunction
|
||||||
|
|
||||||
function! cargo#clean(args)
|
function! cargo#clean(args)
|
||||||
call cargo#cmd("clean " . a:args)
|
call cargo#cmd("clean " . a:args)
|
||||||
endfunction
|
endfunction
|
||||||
@@ -96,6 +102,22 @@ function! cargo#bench(args)
|
|||||||
call cargo#cmd("bench " . a:args)
|
call cargo#cmd("bench " . a:args)
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
|
function! cargo#update(args)
|
||||||
|
call cargo#cmd("update " . a:args)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! cargo#search(args)
|
||||||
|
call cargo#cmd("search " . a:args)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! cargo#publish(args)
|
||||||
|
call cargo#cmd("publish " . a:args)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! cargo#install(args)
|
||||||
|
call cargo#cmd("install " . a:args)
|
||||||
|
endfunction
|
||||||
|
|
||||||
function! cargo#runtarget(args)
|
function! cargo#runtarget(args)
|
||||||
let l:filename = expand('%:p')
|
let l:filename = expand('%:p')
|
||||||
let l:read_manifest = system('cargo read-manifest')
|
let l:read_manifest = system('cargo read-manifest')
|
||||||
|
|||||||
1044
autoload/crystal/indent.vim
Normal file
1044
autoload/crystal/indent.vim
Normal file
File diff suppressed because it is too large
Load Diff
@@ -1,48 +1,47 @@
|
|||||||
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'crystal') == -1
|
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'crystal') == -1
|
||||||
|
|
||||||
let s:save_cpo = &cpo
|
|
||||||
set cpo&vim
|
|
||||||
|
|
||||||
let s:V = vital#crystal#new()
|
let s:V = vital#crystal#new()
|
||||||
let s:P = s:V.import('Process')
|
let s:P = s:V.import('Process')
|
||||||
let s:C = s:V.import('ColorEcho')
|
let s:C = s:V.import('ColorEcho')
|
||||||
|
|
||||||
|
let s:IS_WINDOWS = has('win32')
|
||||||
|
|
||||||
if exists('*json_decode')
|
if exists('*json_decode')
|
||||||
function! s:decode_json(text) abort
|
function! s:decode_json(text) abort
|
||||||
return json_decode(a:text)
|
return json_decode(a:text)
|
||||||
endfunction
|
endfunction
|
||||||
else
|
else
|
||||||
let s:J = s:V.import('Web.JSON')
|
let s:J = s:V.import('Web.JSON')
|
||||||
function! s:decode_json(text) abort
|
function! s:decode_json(text) abort
|
||||||
return s:J.decode(a:text)
|
return s:J.decode(a:text)
|
||||||
endfunction
|
endfunction
|
||||||
endif
|
endif
|
||||||
|
|
||||||
function! s:echo_error(msg, ...) abort
|
function! s:echo_error(msg, ...) abort
|
||||||
echohl ErrorMsg
|
echohl ErrorMsg
|
||||||
if a:0 == 0
|
if a:0 == 0
|
||||||
echomsg a:msg
|
echomsg a:msg
|
||||||
else
|
else
|
||||||
echomsg call('printf', [a:msg] + a:000)
|
echomsg call('printf', [a:msg] + a:000)
|
||||||
endif
|
endif
|
||||||
echohl None
|
echohl None
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! s:run_cmd(cmd) abort
|
function! s:run_cmd(cmd) abort
|
||||||
if !executable(g:crystal_compiler_command)
|
if !executable(g:crystal_compiler_command)
|
||||||
throw "vim-crystal: Error: '" . g:crystal_compiler_command . "' command is not found."
|
throw "vim-crystal: Error: '" . g:crystal_compiler_command . "' command is not found."
|
||||||
endif
|
endif
|
||||||
return s:P.system(a:cmd)
|
return s:P.system(a:cmd)
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! s:find_root_by(search_dir, d) abort
|
function! s:find_root_by(search_dir, d) abort
|
||||||
let found_dir = finddir(a:search_dir, a:d . ';')
|
let found_dir = finddir(a:search_dir, a:d . ';')
|
||||||
if found_dir ==# ''
|
if found_dir ==# ''
|
||||||
return ''
|
return ''
|
||||||
endif
|
endif
|
||||||
|
|
||||||
" Note: ':h:h' for {root}/{search_dir}/ -> {root}/{search_dir} -> {root}
|
" Note: ':h:h' for {root}/{search_dir}/ -> {root}/{search_dir} -> {root}
|
||||||
return fnamemodify(found_dir, ':p:h:h')
|
return fnamemodify(found_dir, ':p:h:h')
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
" Search the root directory containing a 'spec/' and a 'src/' directories.
|
" Search the root directory containing a 'spec/' and a 'src/' directories.
|
||||||
@@ -51,301 +50,318 @@ endfunction
|
|||||||
" compiler has a 'cr_sources/src/spec/' directory that would otherwise give the root
|
" compiler has a 'cr_sources/src/spec/' directory that would otherwise give the root
|
||||||
" directory as 'cr_source/src/' instead of 'cr_sources/'.
|
" directory as 'cr_source/src/' instead of 'cr_sources/'.
|
||||||
function! s:find_root_by_spec_and_src(d) abort
|
function! s:find_root_by_spec_and_src(d) abort
|
||||||
" Search for 'spec/'
|
" Search for 'spec/'
|
||||||
let root = s:find_root_by('spec', a:d)
|
let root = s:find_root_by('spec', a:d)
|
||||||
" Check that 'src/' is also there
|
" Check that 'src/' is also there
|
||||||
if root !=# '' && isdirectory(root . '/src')
|
if root !=# '' && isdirectory(root . '/src')
|
||||||
return root
|
return root
|
||||||
endif
|
endif
|
||||||
|
|
||||||
" Search for 'src/'
|
" Search for 'src/'
|
||||||
let root = s:find_root_by('src', a:d)
|
let root = s:find_root_by('src', a:d)
|
||||||
" Check that 'spec/' is also there
|
" Check that 'spec/' is also there
|
||||||
if root !=# '' && isdirectory(root . '/spec')
|
if root !=# '' && isdirectory(root . '/spec')
|
||||||
return root
|
return root
|
||||||
endif
|
endif
|
||||||
|
|
||||||
" Cannot find a directory containing both 'src/' and 'spec/'
|
" Cannot find a directory containing both 'src/' and 'spec/'
|
||||||
return ''
|
return ''
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! crystal_lang#entrypoint_for(file_path) abort
|
function! crystal_lang#entrypoint_for(file_path) abort
|
||||||
let parent_dir = fnamemodify(a:file_path, ':p:h')
|
let parent_dir = fnamemodify(a:file_path, ':p:h')
|
||||||
let root_dir = s:find_root_by_spec_and_src(parent_dir)
|
let root_dir = s:find_root_by_spec_and_src(parent_dir)
|
||||||
if root_dir ==# ''
|
if root_dir ==# ''
|
||||||
" No spec directory found. No need to make temporary file
|
" No spec directory found. No need to make temporary file
|
||||||
return a:file_path
|
return a:file_path
|
||||||
endif
|
endif
|
||||||
|
|
||||||
let required_spec_path = get(b:, 'crystal_required_spec_path', get(g:, 'crystal_required_spec_path', ''))
|
let required_spec_path = get(b:, 'crystal_required_spec_path', get(g:, 'crystal_required_spec_path', ''))
|
||||||
if required_spec_path !=# ''
|
if required_spec_path !=# ''
|
||||||
let require_spec_str = './' . required_spec_path
|
let require_spec_str = './' . required_spec_path
|
||||||
else
|
else
|
||||||
let require_spec_str = './spec/**'
|
let require_spec_str = './spec/**'
|
||||||
endif
|
endif
|
||||||
|
|
||||||
let temp_name = root_dir . '/__vim-crystal-temporary-entrypoint-' . fnamemodify(a:file_path, ':t')
|
let temp_name = root_dir . '/__vim-crystal-temporary-entrypoint-' . fnamemodify(a:file_path, ':t')
|
||||||
let contents = [
|
let contents = [
|
||||||
\ 'require "spec"',
|
\ 'require "spec"',
|
||||||
\ 'require "' . require_spec_str . '"',
|
\ 'require "' . require_spec_str . '"',
|
||||||
\ printf('require "./%s"', fnamemodify(a:file_path, ':p')[strlen(root_dir)+1 : ])
|
\ printf('require "./%s"', fnamemodify(a:file_path, ':p')[strlen(root_dir)+1 : ])
|
||||||
\ ]
|
\ ]
|
||||||
|
|
||||||
let result = writefile(contents, temp_name)
|
let result = writefile(contents, temp_name)
|
||||||
if result == -1
|
if result == -1
|
||||||
" Note: When writefile() failed
|
" Note: When writefile() failed
|
||||||
return a:file_path
|
return a:file_path
|
||||||
endif
|
endif
|
||||||
|
|
||||||
return temp_name
|
return temp_name
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! crystal_lang#tool(name, file, pos, option_str) abort
|
function! crystal_lang#tool(name, file, pos, option_str) abort
|
||||||
let entrypoint = crystal_lang#entrypoint_for(a:file)
|
let entrypoint = crystal_lang#entrypoint_for(a:file)
|
||||||
let cmd = printf(
|
let cmd = printf(
|
||||||
\ '%s tool %s --no-color %s --cursor %s:%d:%d %s',
|
\ '%s tool %s --no-color %s --cursor %s:%d:%d %s',
|
||||||
\ g:crystal_compiler_command,
|
\ g:crystal_compiler_command,
|
||||||
\ a:name,
|
\ a:name,
|
||||||
\ a:option_str,
|
\ a:option_str,
|
||||||
\ a:file,
|
\ a:file,
|
||||||
\ a:pos[1],
|
\ a:pos[1],
|
||||||
\ a:pos[2],
|
\ a:pos[2],
|
||||||
\ entrypoint
|
\ entrypoint
|
||||||
\ )
|
\ )
|
||||||
|
|
||||||
try
|
try
|
||||||
let output = s:run_cmd(cmd)
|
let output = s:run_cmd(cmd)
|
||||||
return {'failed': s:P.get_last_status(), 'output': output}
|
return {'failed': s:P.get_last_status(), 'output': output}
|
||||||
finally
|
finally
|
||||||
" Note:
|
" Note:
|
||||||
" If the entry point is temporary file, delete it finally.
|
" If the entry point is temporary file, delete it finally.
|
||||||
if a:file !=# entrypoint
|
if a:file !=# entrypoint
|
||||||
call delete(entrypoint)
|
call delete(entrypoint)
|
||||||
endif
|
endif
|
||||||
endtry
|
endtry
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
" `pos` is assumed a returned value from getpos()
|
" `pos` is assumed a returned value from getpos()
|
||||||
function! crystal_lang#impl(file, pos, option_str) abort
|
function! crystal_lang#impl(file, pos, option_str) abort
|
||||||
return crystal_lang#tool('implementations', a:file, a:pos, a:option_str)
|
return crystal_lang#tool('implementations', a:file, a:pos, a:option_str)
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! s:jump_to_impl(impl) abort
|
function! s:jump_to_impl(impl) abort
|
||||||
execute 'edit' a:impl.filename
|
execute 'edit' a:impl.filename
|
||||||
call cursor(a:impl.line, a:impl.column)
|
call cursor(a:impl.line, a:impl.column)
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! crystal_lang#jump_to_definition(file, pos) abort
|
function! crystal_lang#jump_to_definition(file, pos) abort
|
||||||
echo 'analyzing definitions under cursor...'
|
echo 'analyzing definitions under cursor...'
|
||||||
|
|
||||||
let cmd_result = crystal_lang#impl(a:file, a:pos, '--format json')
|
let cmd_result = crystal_lang#impl(a:file, a:pos, '--format json')
|
||||||
if cmd_result.failed
|
if cmd_result.failed
|
||||||
return s:echo_error(cmd_result.output)
|
return s:echo_error(cmd_result.output)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
let impl = s:decode_json(cmd_result.output)
|
let impl = s:decode_json(cmd_result.output)
|
||||||
if impl.status !=# 'ok'
|
if impl.status !=# 'ok'
|
||||||
return s:echo_error(impl.message)
|
return s:echo_error(impl.message)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
if len(impl.implementations) == 1
|
if len(impl.implementations) == 1
|
||||||
call s:jump_to_impl(impl.implementations[0])
|
call s:jump_to_impl(impl.implementations[0])
|
||||||
return
|
return
|
||||||
endif
|
endif
|
||||||
|
|
||||||
let message = "Multiple definitions detected. Choose a number\n\n"
|
let message = "Multiple definitions detected. Choose a number\n\n"
|
||||||
for idx in range(len(impl.implementations))
|
for idx in range(len(impl.implementations))
|
||||||
let i = impl.implementations[idx]
|
let i = impl.implementations[idx]
|
||||||
let message .= printf("[%d] %s:%d:%d\n", idx, i.filename, i.line, i.column)
|
let message .= printf("[%d] %s:%d:%d\n", idx, i.filename, i.line, i.column)
|
||||||
endfor
|
endfor
|
||||||
let message .= "\n"
|
let message .= "\n"
|
||||||
let idx = str2nr(input(message, "\n> "))
|
let idx = str2nr(input(message, "\n> "))
|
||||||
call s:jump_to_impl(impl.implementations[idx])
|
call s:jump_to_impl(impl.implementations[idx])
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! crystal_lang#context(file, pos, option_str) abort
|
function! crystal_lang#context(file, pos, option_str) abort
|
||||||
return crystal_lang#tool('context', a:file, a:pos, a:option_str)
|
return crystal_lang#tool('context', a:file, a:pos, a:option_str)
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! crystal_lang#type_hierarchy(file, option_str) abort
|
function! crystal_lang#type_hierarchy(file, option_str) abort
|
||||||
let cmd = printf(
|
let cmd = printf(
|
||||||
\ '%s tool hierarchy --no-color %s %s',
|
\ '%s tool hierarchy --no-color %s %s',
|
||||||
\ g:crystal_compiler_command,
|
\ g:crystal_compiler_command,
|
||||||
\ a:option_str,
|
\ a:option_str,
|
||||||
\ a:file
|
\ a:file
|
||||||
\ )
|
\ )
|
||||||
|
|
||||||
return s:run_cmd(cmd)
|
return s:run_cmd(cmd)
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! s:find_completion_start() abort
|
function! s:find_completion_start() abort
|
||||||
let c = col('.')
|
let c = col('.')
|
||||||
if c <= 1
|
if c <= 1
|
||||||
return -1
|
return -1
|
||||||
endif
|
endif
|
||||||
|
|
||||||
let line = getline('.')[:c-2]
|
let line = getline('.')[:c-2]
|
||||||
return match(line, '\w\+$')
|
return match(line, '\w\+$')
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! crystal_lang#complete(findstart, base) abort
|
function! crystal_lang#complete(findstart, base) abort
|
||||||
if a:findstart
|
if a:findstart
|
||||||
return s:find_completion_start()
|
return s:find_completion_start()
|
||||||
endif
|
endif
|
||||||
|
|
||||||
let cmd_result = crystal_lang#context(expand('%'), getpos('.'), '--format json')
|
let cmd_result = crystal_lang#context(expand('%'), getpos('.'), '--format json')
|
||||||
if cmd_result.failed
|
if cmd_result.failed
|
||||||
return
|
return
|
||||||
endif
|
endif
|
||||||
|
|
||||||
let contexts = s:decode_json(cmd_result.output)
|
let contexts = s:decode_json(cmd_result.output)
|
||||||
if contexts.status !=# 'ok'
|
if contexts.status !=# 'ok'
|
||||||
return
|
return
|
||||||
endif
|
endif
|
||||||
|
|
||||||
let candidates = []
|
let candidates = []
|
||||||
|
|
||||||
for c in contexts.contexts
|
for c in contexts.contexts
|
||||||
for [name, desc] in items(c)
|
for [name, desc] in items(c)
|
||||||
let candidates += [{
|
let candidates += [{
|
||||||
\ 'word': name,
|
\ 'word': name,
|
||||||
\ 'menu': ': ' . desc . ' [var]',
|
\ 'menu': ': ' . desc . ' [var]',
|
||||||
\ }]
|
\ }]
|
||||||
endfor
|
|
||||||
endfor
|
endfor
|
||||||
|
endfor
|
||||||
|
|
||||||
return candidates
|
return candidates
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! crystal_lang#get_spec_switched_path(absolute_path) abort
|
function! crystal_lang#get_spec_switched_path(absolute_path) abort
|
||||||
let base = fnamemodify(a:absolute_path, ':t:r')
|
let base = fnamemodify(a:absolute_path, ':t:r')
|
||||||
|
|
||||||
" TODO: Make cleverer
|
" TODO: Make cleverer
|
||||||
if base =~# '_spec$'
|
if base =~# '_spec$'
|
||||||
let parent = fnamemodify(substitute(a:absolute_path, '/spec/', '/src/', ''), ':h')
|
let parent = fnamemodify(substitute(a:absolute_path, '/spec/', '/src/', ''), ':h')
|
||||||
return parent . '/' . matchstr(base, '.\+\ze_spec$') . '.cr'
|
return parent . '/' . matchstr(base, '.\+\ze_spec$') . '.cr'
|
||||||
else
|
else
|
||||||
let parent = fnamemodify(substitute(a:absolute_path, '/src/', '/spec/', ''), ':h')
|
let parent = fnamemodify(substitute(a:absolute_path, '/src/', '/spec/', ''), ':h')
|
||||||
return parent . '/' . base . '_spec.cr'
|
return parent . '/' . base . '_spec.cr'
|
||||||
endif
|
endif
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! crystal_lang#switch_spec_file(...) abort
|
function! crystal_lang#switch_spec_file(...) abort
|
||||||
let path = a:0 == 0 ? expand('%:p') : fnamemodify(a:1, ':p')
|
let path = a:0 == 0 ? expand('%:p') : fnamemodify(a:1, ':p')
|
||||||
if path !~# '.cr$'
|
if path !~# '.cr$'
|
||||||
return s:echo_error('Not crystal source file: ' . path)
|
return s:echo_error('Not crystal source file: ' . path)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
execute 'edit!' crystal_lang#get_spec_switched_path(path)
|
execute 'edit!' crystal_lang#get_spec_switched_path(path)
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! s:run_spec(root, path, ...) abort
|
function! s:run_spec(root, path, ...) abort
|
||||||
" Note:
|
" Note:
|
||||||
" `crystal spec` can't understand absolute path.
|
" `crystal spec` can't understand absolute path.
|
||||||
let cmd = printf(
|
let cmd = printf(
|
||||||
\ '%s spec %s%s',
|
\ '%s spec %s%s',
|
||||||
\ g:crystal_compiler_command,
|
\ g:crystal_compiler_command,
|
||||||
\ a:path,
|
\ a:path,
|
||||||
\ a:0 == 0 ? '' : (':' . a:1)
|
\ a:0 == 0 ? '' : (':' . a:1)
|
||||||
\ )
|
\ )
|
||||||
|
|
||||||
let saved_cwd = getcwd()
|
let saved_cwd = getcwd()
|
||||||
let cd = haslocaldir() ? 'lcd' : 'cd'
|
let cd = haslocaldir() ? 'lcd' : 'cd'
|
||||||
try
|
try
|
||||||
execute cd a:root
|
execute cd a:root
|
||||||
call s:C.echo(s:run_cmd(cmd))
|
call s:C.echo(s:run_cmd(cmd))
|
||||||
finally
|
finally
|
||||||
execute cd saved_cwd
|
execute cd saved_cwd
|
||||||
endtry
|
endtry
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! crystal_lang#run_all_spec(...) abort
|
function! crystal_lang#run_all_spec(...) abort
|
||||||
let path = a:0 == 0 ? expand('%:p:h') : a:1
|
let path = a:0 == 0 ? expand('%:p:h') : a:1
|
||||||
let root_path = s:find_root_by_spec_and_src(path)
|
let root_path = s:find_root_by_spec_and_src(path)
|
||||||
if root_path ==# ''
|
if root_path ==# ''
|
||||||
return s:echo_error("'spec' directory is not found")
|
return s:echo_error("'spec' directory is not found")
|
||||||
endif
|
endif
|
||||||
call s:run_spec(root_path, 'spec')
|
call s:run_spec(root_path, 'spec')
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! crystal_lang#run_current_spec(...) abort
|
function! crystal_lang#run_current_spec(...) abort
|
||||||
" /foo/bar/src/poyo.cr
|
" /foo/bar/src/poyo.cr
|
||||||
let path = a:0 == 0 ? expand('%:p') : fnamemodify(a:1, ':p')
|
let path = a:0 == 0 ? expand('%:p') : fnamemodify(a:1, ':p')
|
||||||
if path !~# '.cr$'
|
if path !~# '.cr$'
|
||||||
return s:echo_error('Not crystal source file: ' . path)
|
return s:echo_error('Not crystal source file: ' . path)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
" /foo/bar/src
|
" /foo/bar/src
|
||||||
let source_dir = fnamemodify(path, ':h')
|
let source_dir = fnamemodify(path, ':h')
|
||||||
|
|
||||||
" /foo/bar
|
" /foo/bar
|
||||||
let root_dir = s:find_root_by_spec_and_src(source_dir)
|
let root_dir = s:find_root_by_spec_and_src(source_dir)
|
||||||
if root_dir ==# ''
|
if root_dir ==# ''
|
||||||
return s:echo_error("Root directory with 'src/' and 'spec/' not found")
|
return s:echo_error("Root directory with 'src/' and 'spec/' not found")
|
||||||
endif
|
endif
|
||||||
|
|
||||||
" src
|
" src
|
||||||
let rel_path = source_dir[strlen(root_dir)+1 : ]
|
let rel_path = source_dir[strlen(root_dir)+1 : ]
|
||||||
|
|
||||||
if path =~# '_spec.cr$'
|
if path =~# '_spec.cr$'
|
||||||
call s:run_spec(root_dir, path[strlen(root_dir)+1 : ], line('.'))
|
call s:run_spec(root_dir, path[strlen(root_dir)+1 : ], line('.'))
|
||||||
else
|
else
|
||||||
let spec_path = substitute(rel_path, '^src', 'spec', '') . '/' . fnamemodify(path, ':t:r') . '_spec.cr'
|
let spec_path = substitute(rel_path, '^src', 'spec', '') . '/' . fnamemodify(path, ':t:r') . '_spec.cr'
|
||||||
if !filereadable(root_dir . '/' . spec_path)
|
if !filereadable(root_dir . '/' . spec_path)
|
||||||
return s:echo_error('Error: Could not find a spec source corresponding to ' . 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
|
endif
|
||||||
|
call s:run_spec(root_dir, spec_path)
|
||||||
|
endif
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! crystal_lang#format_string(code, ...) abort
|
function! crystal_lang#format_string(code, ...) abort
|
||||||
let cmd = printf(
|
if s:IS_WINDOWS
|
||||||
\ '%s tool format --no-color %s -',
|
let redirect = '2> nul'
|
||||||
\ g:crystal_compiler_command,
|
else
|
||||||
\ get(a:, 1, '')
|
let redirect = '2>/dev/null'
|
||||||
\ )
|
endif
|
||||||
let output = s:P.system(cmd, a:code)
|
let cmd = printf(
|
||||||
if s:P.get_last_status()
|
\ '%s tool format --no-color %s - %s',
|
||||||
throw 'vim-crystal: Error on formatting: ' . output
|
\ g:crystal_compiler_command,
|
||||||
endif
|
\ get(a:, 1, ''),
|
||||||
return output
|
\ redirect,
|
||||||
|
\ )
|
||||||
|
let output = s:P.system(cmd, a:code)
|
||||||
|
if s:P.get_last_status()
|
||||||
|
throw 'vim-crystal: Error on formatting with command: ' . cmd
|
||||||
|
endif
|
||||||
|
return output
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
" crystal_lang#format(option_str [, on_save])
|
" crystal_lang#format(option_str [, on_save])
|
||||||
function! crystal_lang#format(option_str, ...) abort
|
function! crystal_lang#format(option_str, ...) abort
|
||||||
if !executable(g:crystal_compiler_command)
|
let on_save = a:0 > 0 ? a:1 : 0
|
||||||
" Finish command silently
|
|
||||||
return
|
if !executable(g:crystal_compiler_command)
|
||||||
|
if on_save
|
||||||
|
" Finish command silently on save
|
||||||
|
return
|
||||||
|
else
|
||||||
|
throw 'vim-crystal: Command for formatting is not executable: ' . g:crystal_compiler_command
|
||||||
endif
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
let on_save = a:0 > 0 ? a:1 : 0
|
let before = join(getline(1, '$'), "\n")
|
||||||
|
try
|
||||||
let before = join(getline(1, '$'), "\n")
|
|
||||||
let formatted = crystal_lang#format_string(before, a:option_str)
|
let formatted = crystal_lang#format_string(before, a:option_str)
|
||||||
if !on_save
|
catch /^vim-crystal: /
|
||||||
let after = substitute(formatted, '\n$', '', '')
|
echohl ErrorMsg
|
||||||
if before ==# after
|
echomsg v:exception . ': Your code was not formatted. Exception was thrown at ' . v:throwpoint
|
||||||
return
|
echohl None
|
||||||
endif
|
return
|
||||||
endif
|
endtry
|
||||||
|
|
||||||
let view_save = winsaveview()
|
if !on_save
|
||||||
let pos_save = getpos('.')
|
let after = substitute(formatted, '\n$', '', '')
|
||||||
let lines = split(formatted, '\n')
|
if before ==# after
|
||||||
silent! undojoin
|
return
|
||||||
if line('$') > len(lines)
|
|
||||||
execute len(lines) . ',$delete' '_'
|
|
||||||
endif
|
endif
|
||||||
call setline(1, lines)
|
endif
|
||||||
call winrestview(view_save)
|
|
||||||
call setpos('.', pos_save)
|
let view_save = winsaveview()
|
||||||
|
let pos_save = getpos('.')
|
||||||
|
let lines = split(formatted, '\n')
|
||||||
|
silent! undojoin
|
||||||
|
if line('$') > len(lines)
|
||||||
|
execute len(lines) . ',$delete' '_'
|
||||||
|
endif
|
||||||
|
call setline(1, lines)
|
||||||
|
call winrestview(view_save)
|
||||||
|
call setpos('.', pos_save)
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! crystal_lang#expand(file, pos, ...) abort
|
function! crystal_lang#expand(file, pos, ...) abort
|
||||||
return crystal_lang#tool('expand', a:file, a:pos, get(a:, 1, ''))
|
return crystal_lang#tool('expand', a:file, a:pos, get(a:, 1, ''))
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
let &cpo = s:save_cpo
|
" vim: sw=2 sts=2 et:
|
||||||
unlet s:save_cpo
|
|
||||||
|
|
||||||
endif
|
endif
|
||||||
|
|||||||
@@ -69,6 +69,10 @@ fu! csv#Init(start, end, ...) "{{{3
|
|||||||
else
|
else
|
||||||
let b:csv_cmt = split(g:csv_comment, '%s')
|
let b:csv_cmt = split(g:csv_comment, '%s')
|
||||||
endif
|
endif
|
||||||
|
" Make sure it is a list with 2 chars
|
||||||
|
if b:csv_cmt == []
|
||||||
|
let b:csv_cmt = ["", ""]
|
||||||
|
endif
|
||||||
|
|
||||||
if empty(b:delimiter) && !exists("b:csv_fixed_width")
|
if empty(b:delimiter) && !exists("b:csv_fixed_width")
|
||||||
call csv#Warn("No delimiter found. See :h csv-delimiter to set it manually!")
|
call csv#Warn("No delimiter found. See :h csv-delimiter to set it manually!")
|
||||||
@@ -122,7 +126,7 @@ fu! csv#Init(start, end, ...) "{{{3
|
|||||||
" Enable vartabs for tab delimited files
|
" Enable vartabs for tab delimited files
|
||||||
if b:delimiter=="\t" && has("vartabs")&& !exists("b:csv_fixed_width_cols")
|
if b:delimiter=="\t" && has("vartabs")&& !exists("b:csv_fixed_width_cols")
|
||||||
if get(b:, 'col_width', []) ==# []
|
if get(b:, 'col_width', []) ==# []
|
||||||
call csv#CalculateColumnWidth('')
|
call csv#CalculateColumnWidth(line('$'), 1)
|
||||||
endif
|
endif
|
||||||
let &l:vts=join(b:col_width, ',')
|
let &l:vts=join(b:col_width, ',')
|
||||||
let g:csv_no_conceal=1
|
let g:csv_no_conceal=1
|
||||||
@@ -263,7 +267,7 @@ fu! csv#GetPat(colnr, maxcolnr, pat, allowmore) "{{{3
|
|||||||
" Allow space in front of the pattern, so that it works correctly
|
" Allow space in front of the pattern, so that it works correctly
|
||||||
" even if :Arrange Col has been used #100
|
" even if :Arrange Col has been used #100
|
||||||
return '^' . csv#GetColPat(a:colnr - 1,0) .
|
return '^' . csv#GetColPat(a:colnr - 1,0) .
|
||||||
\ '\s*\zs' . a:pat . '\ze' . (a:allowmore ? '' : '$')
|
\ '.*\zs' . a:pat . '\ze' . (a:allowmore ? '' : '$')
|
||||||
else
|
else
|
||||||
return '\%' . b:csv_fixed_width_cols[-1] .
|
return '\%' . b:csv_fixed_width_cols[-1] .
|
||||||
\ 'c\zs' . a:pat . '\ze' . (a:allowmore ? '' : '$')
|
\ 'c\zs' . a:pat . '\ze' . (a:allowmore ? '' : '$')
|
||||||
@@ -500,7 +504,7 @@ fu! csv#WColumn(...) "{{{3
|
|||||||
" Return on which column the cursor is
|
" Return on which column the cursor is
|
||||||
let _cur = getpos('.')
|
let _cur = getpos('.')
|
||||||
if !exists("b:csv_fixed_width_cols")
|
if !exists("b:csv_fixed_width_cols")
|
||||||
if line('.') > 1 && mode('') != 'n'
|
if line('.') > 1 && mode('') != 'n' && empty(getline('.')[0:col('.')-1])
|
||||||
" in insert mode, get line from above, just in case the current
|
" in insert mode, get line from above, just in case the current
|
||||||
" line is empty
|
" line is empty
|
||||||
let line = getline(line('.')-1)
|
let line = getline(line('.')-1)
|
||||||
@@ -574,7 +578,7 @@ fu! csv#MaxColumns(...) "{{{3
|
|||||||
return len(b:csv_fixed_width_cols)
|
return len(b:csv_fixed_width_cols)
|
||||||
endif
|
endif
|
||||||
endfu
|
endfu
|
||||||
fu! csv#ColWidth(colnr, ...) "{{{3
|
fu! csv#ColWidth(colnr, row, silent) "{{{3
|
||||||
" if a:1 is given, specifies the row, for which to calculate the width
|
" if a:1 is given, specifies the row, for which to calculate the width
|
||||||
"
|
"
|
||||||
" Return the width of a column
|
" Return the width of a column
|
||||||
@@ -586,14 +590,13 @@ fu! csv#ColWidth(colnr, ...) "{{{3
|
|||||||
if !exists("b:csv_fixed_width_cols")
|
if !exists("b:csv_fixed_width_cols")
|
||||||
if !exists("b:csv_list")
|
if !exists("b:csv_list")
|
||||||
" only check first 10000 lines, to be faster
|
" only check first 10000 lines, to be faster
|
||||||
let last = line('$')
|
let last = a:row
|
||||||
if exists("a:1") && !empty(a:1)
|
|
||||||
let last = a:1
|
|
||||||
endif
|
|
||||||
if !get(b:, 'csv_arrange_use_all_rows', 0)
|
if !get(b:, 'csv_arrange_use_all_rows', 0)
|
||||||
if last > 10000
|
if last > 10000
|
||||||
let last = 10000
|
let last = 10000
|
||||||
call csv#Warn('File too large, only checking the first 10000 rows for the width')
|
if !a:silent
|
||||||
|
call csv#Warn('File too large, only checking the first 10000 rows for the width')
|
||||||
|
endif
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
let b:csv_list=getline(skipfirst+1,last)
|
let b:csv_list=getline(skipfirst+1,last)
|
||||||
@@ -636,8 +639,12 @@ fu! csv#ArrangeCol(first, last, bang, limit, ...) range "{{{3
|
|||||||
return
|
return
|
||||||
endif
|
endif
|
||||||
let cur=winsaveview()
|
let cur=winsaveview()
|
||||||
|
" be sure, that b:col_width is actually valid
|
||||||
|
if exists("b:col_width") && eval(join(b:col_width, '+')) == 0
|
||||||
|
unlet! b:col_width
|
||||||
|
endif
|
||||||
" Force recalculation of Column width
|
" Force recalculation of Column width
|
||||||
let row = exists("a:1") ? a:1 : ''
|
let row = exists("a:1") && !empty(a:1) ? a:1 : line('$')
|
||||||
if a:bang || !empty(row)
|
if a:bang || !empty(row)
|
||||||
if a:bang && exists("b:col_width")
|
if a:bang && exists("b:col_width")
|
||||||
" Unarrange, so that if csv_arrange_align has changed
|
" Unarrange, so that if csv_arrange_align has changed
|
||||||
@@ -671,7 +678,7 @@ fu! csv#ArrangeCol(first, last, bang, limit, ...) range "{{{3
|
|||||||
endif
|
endif
|
||||||
|
|
||||||
if !exists("b:col_width")
|
if !exists("b:col_width")
|
||||||
call csv#CalculateColumnWidth(row)
|
call csv#CalculateColumnWidth(row, 1)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
" abort on empty file
|
" abort on empty file
|
||||||
@@ -750,11 +757,15 @@ fu! csv#UnArrangeCol(match) "{{{3
|
|||||||
" Strip leading white space, also trims empty recordcsv#
|
" Strip leading white space, also trims empty recordcsv#
|
||||||
return substitute(a:match, '\%(^ \+\)\|\%( \+\ze'.b:delimiter. '\?$\)', '', 'g')
|
return substitute(a:match, '\%(^ \+\)\|\%( \+\ze'.b:delimiter. '\?$\)', '', 'g')
|
||||||
endfu
|
endfu
|
||||||
fu! csv#CalculateColumnWidth(row) "{{{3
|
fu! csv#CalculateColumnWidth(row, silent) "{{{3
|
||||||
" Internal function, not called from external,
|
" Internal function, not called from external,
|
||||||
" does not work with fixed width columns
|
" does not work with fixed width columns
|
||||||
" row for the row for which to calculate the width
|
" row for the row for which to calculate the width
|
||||||
let b:col_width=[]
|
let b:col_width=[]
|
||||||
|
if has( 'vartabs' ) && b:delimiter == "\t"
|
||||||
|
let vts_save=&vts
|
||||||
|
set vts=
|
||||||
|
endif
|
||||||
try
|
try
|
||||||
if exists("b:csv_headerline")
|
if exists("b:csv_headerline")
|
||||||
if line('.') < b:csv_headerline
|
if line('.') < b:csv_headerline
|
||||||
@@ -763,7 +774,7 @@ fu! csv#CalculateColumnWidth(row) "{{{3
|
|||||||
endif
|
endif
|
||||||
let s:max_cols=csv#MaxColumns(line('.'))
|
let s:max_cols=csv#MaxColumns(line('.'))
|
||||||
for i in range(1,s:max_cols)
|
for i in range(1,s:max_cols)
|
||||||
call add(b:col_width, csv#ColWidth(i, a:row))
|
call add(b:col_width, csv#ColWidth(i, a:row, a:silent))
|
||||||
endfor
|
endfor
|
||||||
catch /csv:no_col/
|
catch /csv:no_col/
|
||||||
call csv#Warn("Error: getting Column numbers, aborting!")
|
call csv#Warn("Error: getting Column numbers, aborting!")
|
||||||
@@ -773,6 +784,9 @@ fu! csv#CalculateColumnWidth(row) "{{{3
|
|||||||
" delete buffer content in variable b:csv_list,
|
" delete buffer content in variable b:csv_list,
|
||||||
" this was only necessary for calculating the max width
|
" this was only necessary for calculating the max width
|
||||||
unlet! b:csv_list s:columnize_count s:decimal_column
|
unlet! b:csv_list s:columnize_count s:decimal_column
|
||||||
|
if has( 'vartabs' ) && b:delimiter == "\t"
|
||||||
|
let &vts=vts_save
|
||||||
|
endif
|
||||||
endfu
|
endfu
|
||||||
fu! csv#Columnize(field) "{{{3
|
fu! csv#Columnize(field) "{{{3
|
||||||
" Internal function, not called from external,
|
" Internal function, not called from external,
|
||||||
@@ -1053,7 +1067,7 @@ fu! csv#MoveCol(forward, line, ...) "{{{3
|
|||||||
let maxcol=csv#MaxColumns(line('.'))
|
let maxcol=csv#MaxColumns(line('.'))
|
||||||
let cpos=getpos('.')[2]
|
let cpos=getpos('.')[2]
|
||||||
if !exists("b:csv_fixed_width_cols")
|
if !exists("b:csv_fixed_width_cols")
|
||||||
let curwidth=CSVWidth()
|
let curwidth=CSVWidth(1)
|
||||||
call search(b:col, 'bc', line('.'))
|
call search(b:col, 'bc', line('.'))
|
||||||
endif
|
endif
|
||||||
let spos=getpos('.')[2]
|
let spos=getpos('.')[2]
|
||||||
@@ -1146,7 +1160,7 @@ fu! csv#MoveCol(forward, line, ...) "{{{3
|
|||||||
" leave the column (if the next column is shorter)
|
" leave the column (if the next column is shorter)
|
||||||
if !exists("b:csv_fixed_width_cols")
|
if !exists("b:csv_fixed_width_cols")
|
||||||
let a = getpos('.')
|
let a = getpos('.')
|
||||||
if CSVWidth() == curwidth
|
if CSVWidth(1) == curwidth
|
||||||
let a[2]+= cpos-spos
|
let a[2]+= cpos-spos
|
||||||
endif
|
endif
|
||||||
else
|
else
|
||||||
@@ -1159,7 +1173,7 @@ fu! csv#MoveCol(forward, line, ...) "{{{3
|
|||||||
" Move to the correct screen column
|
" Move to the correct screen column
|
||||||
if !exists("b:csv_fixed_width_cols")
|
if !exists("b:csv_fixed_width_cols")
|
||||||
let a = getpos('.')
|
let a = getpos('.')
|
||||||
if CSVWidth() == curwidth
|
if CSVWidth(1) == curwidth
|
||||||
let a[2]+= cpos-spos
|
let a[2]+= cpos-spos
|
||||||
endif
|
endif
|
||||||
else
|
else
|
||||||
@@ -1493,10 +1507,10 @@ fu! csv#AvgColumn(list) "{{{3
|
|||||||
endfor
|
endfor
|
||||||
if has("float")
|
if has("float")
|
||||||
let b:csv_result = printf("%.2f", sum/cnt)
|
let b:csv_result = printf("%.2f", sum/cnt)
|
||||||
return b:csv_result
|
return str2float(b:csv_result)
|
||||||
else
|
else
|
||||||
let b:csv_result = printf("%s", sum/cnt)
|
let b:csv_result = printf("%s", sum/cnt)
|
||||||
return sum/cnt
|
return b:csv_result + 0
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
endfu
|
endfu
|
||||||
@@ -1529,7 +1543,7 @@ fu! csv#VarianceColumn(list, is_population) "{{{3
|
|||||||
let cnt = cnt-1
|
let cnt = cnt-1
|
||||||
endif
|
endif
|
||||||
if has("float")
|
if has("float")
|
||||||
let b:csv_result = printf("%.2f", sum/cnt)
|
let b:csv_result = printf("%." . get(b:, 'csv_accuracy', get(g:, 'csv_accuracy', 2)) . "f", sum/cnt)
|
||||||
return b:csv_result
|
return b:csv_result
|
||||||
else
|
else
|
||||||
let b:csv_result = printf("%s", sum/cnt)
|
let b:csv_result = printf("%s", sum/cnt)
|
||||||
@@ -1835,7 +1849,7 @@ fu! csv#ProcessFieldValue(field) "{{{3
|
|||||||
|
|
||||||
if a == b:delimiter
|
if a == b:delimiter
|
||||||
try
|
try
|
||||||
let a=repeat(' ', csv#ColWidth(col))
|
let a=repeat(' ', csv#ColWidth(col, line('$'), 1))
|
||||||
catch
|
catch
|
||||||
" no-op
|
" no-op
|
||||||
endtry
|
endtry
|
||||||
@@ -1942,8 +1956,12 @@ fu! csv#CheckHeaderLine() "{{{3
|
|||||||
endfu
|
endfu
|
||||||
fu! csv#AnalyzeColumn(...) "{{{3
|
fu! csv#AnalyzeColumn(...) "{{{3
|
||||||
let maxcolnr = csv#MaxColumns()
|
let maxcolnr = csv#MaxColumns()
|
||||||
if len(a:000) == 1
|
let topn = 5
|
||||||
|
if len(a:000) > 0
|
||||||
let colnr = a:1
|
let colnr = a:1
|
||||||
|
if len(a:000) == 2
|
||||||
|
let topn = a:2
|
||||||
|
endif
|
||||||
else
|
else
|
||||||
let colnr = csv#WColumn()
|
let colnr = csv#WColumn()
|
||||||
endif
|
endif
|
||||||
@@ -1971,8 +1989,8 @@ fu! csv#AnalyzeColumn(...) "{{{3
|
|||||||
let max_items = reverse(sort(values(res), s:csv_numeric_sort ? 'n' : 'csv#CSVSortValues'))
|
let max_items = reverse(sort(values(res), s:csv_numeric_sort ? 'n' : 'csv#CSVSortValues'))
|
||||||
" What about the minimum 5 items?
|
" What about the minimum 5 items?
|
||||||
let count_items = keys(res)
|
let count_items = keys(res)
|
||||||
if len(max_items) > 5
|
if len(max_items) > topn
|
||||||
call remove(max_items, 5, -1)
|
call remove(max_items, topn, -1)
|
||||||
call map(max_items, 'printf(''\V%s\m'', escape(v:val, ''\\''))')
|
call map(max_items, 'printf(''\V%s\m'', escape(v:val, ''\\''))')
|
||||||
call filter(res, 'v:val =~ ''^''.join(max_items, ''\|'').''$''')
|
call filter(res, 'v:val =~ ''^''.join(max_items, ''\|'').''$''')
|
||||||
endif
|
endif
|
||||||
@@ -2134,7 +2152,7 @@ fu! csv#NewRecord(line1, line2, count) "{{{3
|
|||||||
if !exists("b:col_width")
|
if !exists("b:col_width")
|
||||||
" Best guess width
|
" Best guess width
|
||||||
if exists("b:csv_fixed_width_cols")
|
if exists("b:csv_fixed_width_cols")
|
||||||
let record .= printf("%*s", csv#ColWidth(item),
|
let record .= printf("%*s", csv#ColWidth(item, line('$'), 1),
|
||||||
\ b:delimiter)
|
\ b:delimiter)
|
||||||
else
|
else
|
||||||
let record .= printf("%20s", b:delimiter)
|
let record .= printf("%20s", b:delimiter)
|
||||||
@@ -2249,7 +2267,7 @@ fu! csv#CommandDefinitions() "{{{3
|
|||||||
\ ':echo csv#EvalColumn(<q-args>, "csv#SmplStdDevColumn", <line1>,<line2>)',
|
\ ':echo csv#EvalColumn(<q-args>, "csv#SmplStdDevColumn", <line1>,<line2>)',
|
||||||
\ '-nargs=? -range=% -complete=custom,csv#SortComplete')
|
\ '-nargs=? -range=% -complete=custom,csv#SortComplete')
|
||||||
call csv#LocalCmd("PopStdCol",
|
call csv#LocalCmd("PopStdCol",
|
||||||
\ ':echo csv#EvalColumn(<q-args>, "csv#SmplStdDevColumn", <line1>,<line2>)',
|
\ ':echo csv#EvalColumn(<q-args>, "csv#PopStdDevColumn", <line1>,<line2>)',
|
||||||
\ '-nargs=? -range=% -complete=custom,csv#SortComplete')
|
\ '-nargs=? -range=% -complete=custom,csv#SortComplete')
|
||||||
call csv#LocalCmd("UnArrangeColumn",
|
call csv#LocalCmd("UnArrangeColumn",
|
||||||
\':call csv#PrepUnArrangeCol(<line1>, <line2>)',
|
\':call csv#PrepUnArrangeCol(<line1>, <line2>)',
|
||||||
@@ -2297,8 +2315,8 @@ fu! csv#CommandDefinitions() "{{{3
|
|||||||
\ '-bang -nargs=? -range=%')
|
\ '-bang -nargs=? -range=%')
|
||||||
call csv#LocalCmd("Filters", ':call csv#OutputFilters(<bang>0)',
|
call csv#LocalCmd("Filters", ':call csv#OutputFilters(<bang>0)',
|
||||||
\ '-nargs=0 -bang')
|
\ '-nargs=0 -bang')
|
||||||
call csv#LocalCmd("Analyze", ':call csv#AnalyzeColumn(<args>)',
|
call csv#LocalCmd("Analyze", ':call csv#AnalyzeColumn(<f-args>)',
|
||||||
\ '-nargs=?')
|
\ '-nargs=*' )
|
||||||
call csv#LocalCmd("VertFold", ':call csv#Vertfold(<bang>0,<q-args>)',
|
call csv#LocalCmd("VertFold", ':call csv#Vertfold(<bang>0,<q-args>)',
|
||||||
\ '-bang -nargs=? -range=% -complete=custom,csv#SortComplete')
|
\ '-bang -nargs=? -range=% -complete=custom,csv#SortComplete')
|
||||||
call csv#LocalCmd("CSVFixed", ':call csv#InitCSVFixedWidth()', '')
|
call csv#LocalCmd("CSVFixed", ':call csv#InitCSVFixedWidth()', '')
|
||||||
@@ -2332,7 +2350,7 @@ fu! csv#ColumnWidth()
|
|||||||
endfu
|
endfu
|
||||||
|
|
||||||
fu! csv#Map(map, name, definition, ...) "{{{3
|
fu! csv#Map(map, name, definition, ...) "{{{3
|
||||||
let keyname = substitute(a:name, '[<>]', '', 'g')
|
let keyname = substitute(substitute(a:name, '[<>]', '', 'g'), '-', '_', 'g')
|
||||||
let expr = (exists("a:1") && a:1 == 'expr' ? '<expr>' : '')
|
let expr = (exists("a:1") && a:1 == 'expr' ? '<expr>' : '')
|
||||||
if !get(g:, "csv_nomap_". tolower(keyname), 0)
|
if !get(g:, "csv_nomap_". tolower(keyname), 0)
|
||||||
" All mappings are buffer local
|
" All mappings are buffer local
|
||||||
@@ -3145,7 +3163,9 @@ fu! CSVCount(col, fmt, first, last, ...) "{{{3
|
|||||||
unlet! s:additional['distinct']
|
unlet! s:additional['distinct']
|
||||||
return (empty(result) ? 0 : result)
|
return (empty(result) ? 0 : result)
|
||||||
endfu
|
endfu
|
||||||
fu! CSVWidth() "{{{3
|
fu! CSVWidth(...) "{{{3
|
||||||
|
" do not output any warning
|
||||||
|
let silent = get(a:000, 0, 1)
|
||||||
" does not work with fixed width columns
|
" does not work with fixed width columns
|
||||||
if exists("b:csv_fixed_width_cols")
|
if exists("b:csv_fixed_width_cols")
|
||||||
let c = getline(1,'$')
|
let c = getline(1,'$')
|
||||||
@@ -3164,7 +3184,7 @@ fu! CSVWidth() "{{{3
|
|||||||
" Add width for last column
|
" Add width for last column
|
||||||
call add(width, max-y+1)
|
call add(width, max-y+1)
|
||||||
else
|
else
|
||||||
call csv#CalculateColumnWidth('')
|
call csv#CalculateColumnWidth(line('$'), silent)
|
||||||
let width=map(copy(b:col_width), 'v:val-1')
|
let width=map(copy(b:col_width), 'v:val-1')
|
||||||
endif
|
endif
|
||||||
return width
|
return width
|
||||||
|
|||||||
@@ -27,12 +27,16 @@ function! s:clearQfList(reason) abort
|
|||||||
endif
|
endif
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! dart#fmt(q_args) abort
|
function! dart#fmt(...) abort
|
||||||
let cmd = s:FindDartFmt()
|
let l:dartfmt = s:FindDartFmt()
|
||||||
if type(cmd) != type('') | return | endif
|
if type(l:dartfmt) != type('') | return | endif
|
||||||
let buffer_content = getline(1, '$')
|
let buffer_content = getline(1, '$')
|
||||||
let args = '--stdin-name '.expand('%').' '.a:q_args
|
let l:cmd = [l:dartfmt, '--stdin-name', shellescape(expand('%'))]
|
||||||
let lines = systemlist(printf('%s %s', cmd, args), join(buffer_content, "\n"))
|
if exists('g:dartfmt_options')
|
||||||
|
call extend(l:cmd, g:dartfmt_options)
|
||||||
|
endif
|
||||||
|
call extend(l:cmd, a:000)
|
||||||
|
let lines = systemlist(join(l:cmd), join(buffer_content, "\n"))
|
||||||
" TODO(https://github.com/dart-lang/sdk/issues/38507) - Remove once the
|
" TODO(https://github.com/dart-lang/sdk/issues/38507) - Remove once the
|
||||||
" tool no longer emits this line on SDK upgrades.
|
" tool no longer emits this line on SDK upgrades.
|
||||||
if lines[-1] ==# 'Isolate creation failed'
|
if lines[-1] ==# 'Isolate creation failed'
|
||||||
@@ -86,7 +90,7 @@ endfunction
|
|||||||
" If the path cannot be resolved, or is not a package: uri, returns the
|
" If the path cannot be resolved, or is not a package: uri, returns the
|
||||||
" original.
|
" original.
|
||||||
function! dart#resolveUri(uri) abort
|
function! dart#resolveUri(uri) abort
|
||||||
if a:uri !~ 'package:'
|
if a:uri !~# 'package:'
|
||||||
return a:uri
|
return a:uri
|
||||||
endif
|
endif
|
||||||
let package_name = substitute(a:uri, 'package:\(\w\+\)\/.*', '\1', '')
|
let package_name = substitute(a:uri, 'package:\(\w\+\)\/.*', '\1', '')
|
||||||
@@ -118,20 +122,20 @@ function! s:PackageMap() abort
|
|||||||
let lines = readfile(dot_packages)
|
let lines = readfile(dot_packages)
|
||||||
let map = {}
|
let map = {}
|
||||||
for line in lines
|
for line in lines
|
||||||
if line =~ '\s*#'
|
if line =~# '\s*#'
|
||||||
continue
|
continue
|
||||||
endif
|
endif
|
||||||
let package = substitute(line, ':.*$', '', '')
|
let package = substitute(line, ':.*$', '', '')
|
||||||
let lib_dir = substitute(line, '^[^:]*:', '', '')
|
let lib_dir = substitute(line, '^[^:]*:', '', '')
|
||||||
if lib_dir =~ 'file:/'
|
if lib_dir =~# 'file:/'
|
||||||
let lib_dir = substitute(lib_dir, 'file://', '', '')
|
let lib_dir = substitute(lib_dir, 'file://', '', '')
|
||||||
if lib_dir =~ '/[A-Z]:/'
|
if lib_dir =~# '/[A-Z]:/'
|
||||||
let lib_dir = lib_dir[1:]
|
let lib_dir = lib_dir[1:]
|
||||||
endif
|
endif
|
||||||
else
|
else
|
||||||
let lib_dir = resolve(dot_packages_dir.'/'.lib_dir)
|
let lib_dir = resolve(dot_packages_dir.'/'.lib_dir)
|
||||||
endif
|
endif
|
||||||
if lib_dir =~ '/$'
|
if lib_dir =~# '/$'
|
||||||
let lib_dir = lib_dir[:len(lib_dir) - 2]
|
let lib_dir = lib_dir[:len(lib_dir) - 2]
|
||||||
endif
|
endif
|
||||||
let map[package] = lib_dir
|
let map[package] = lib_dir
|
||||||
@@ -141,7 +145,7 @@ endfunction
|
|||||||
|
|
||||||
" Toggle whether dartfmt is run on save or not.
|
" Toggle whether dartfmt is run on save or not.
|
||||||
function! dart#ToggleFormatOnSave() abort
|
function! dart#ToggleFormatOnSave() abort
|
||||||
if get(g:, "dart_format_on_save", 0)
|
if get(g:, 'dart_format_on_save', 0)
|
||||||
let g:dart_format_on_save = 0
|
let g:dart_format_on_save = 0
|
||||||
return
|
return
|
||||||
endif
|
endif
|
||||||
|
|||||||
36
autoload/ecrystal.vim
Normal file
36
autoload/ecrystal.vim
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'crystal') == -1
|
||||||
|
|
||||||
|
let s:ecrystal_extensions = {
|
||||||
|
\ 'cr': 'crystal',
|
||||||
|
\ 'yml': 'yaml',
|
||||||
|
\ 'js': 'javascript',
|
||||||
|
\ 'txt': 'text',
|
||||||
|
\ 'md': 'markdown'
|
||||||
|
\ }
|
||||||
|
|
||||||
|
if exists('g:ecrystal_extensions')
|
||||||
|
call extend(s:ecrystal_extensions, g:ecrystal_extensions, 'force')
|
||||||
|
endif
|
||||||
|
|
||||||
|
function! ecrystal#SetSubtype() abort
|
||||||
|
if exists('b:ecrystal_subtype')
|
||||||
|
return
|
||||||
|
endif
|
||||||
|
|
||||||
|
let b:ecrystal_subtype = matchstr(substitute(expand('%:t'), '\c\%(\.ecr\)\+$', '', ''), '\.\zs\w\+\%(\ze+\w\+\)\=$')
|
||||||
|
|
||||||
|
let b:ecrystal_subtype = get(s:ecrystal_extensions, b:ecrystal_subtype, b:ecrystal_subtype)
|
||||||
|
|
||||||
|
if b:ecrystal_subtype ==# ''
|
||||||
|
let b:ecrystal_subtype = get(g:, 'ecrystal_default_subtype', 'html')
|
||||||
|
endif
|
||||||
|
|
||||||
|
if b:ecrystal_subtype !=# ''
|
||||||
|
exec 'setlocal filetype=ecrystal.' . b:ecrystal_subtype
|
||||||
|
exec 'setlocal syntax=ecrystal.' . b:ecrystal_subtype
|
||||||
|
endif
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" vim: sw=2 sts=2 et:
|
||||||
|
|
||||||
|
endif
|
||||||
385
autoload/elm.vim
385
autoload/elm.vim
@@ -1,385 +0,0 @@
|
|||||||
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'elm') == -1
|
|
||||||
|
|
||||||
let s:errors = []
|
|
||||||
|
|
||||||
function! s:elmOracle(...) abort
|
|
||||||
let l:project = finddir('elm-stuff/..', '.;')
|
|
||||||
if len(l:project) == 0
|
|
||||||
echoerr '`elm-stuff` not found! run `elm-package install` for autocomplete.'
|
|
||||||
return []
|
|
||||||
endif
|
|
||||||
|
|
||||||
let l:filename = expand('%:p')
|
|
||||||
|
|
||||||
if a:0 == 0
|
|
||||||
let l:oldiskeyword = &iskeyword
|
|
||||||
" Some non obvious values used in 'iskeyword':
|
|
||||||
" @ = all alpha
|
|
||||||
" 48-57 = numbers 0 to 9
|
|
||||||
" @-@ = character @
|
|
||||||
" 124 = |
|
|
||||||
setlocal iskeyword=@,48-57,@-@,_,-,~,!,#,$,%,&,*,+,=,<,>,/,?,.,\\,124,^
|
|
||||||
let l:word = expand('<cword>')
|
|
||||||
let &iskeyword = l:oldiskeyword
|
|
||||||
else
|
|
||||||
let l:word = a:1
|
|
||||||
endif
|
|
||||||
|
|
||||||
let l:infos = elm#Oracle(l:filename, l:word)
|
|
||||||
if v:shell_error != 0
|
|
||||||
call elm#util#EchoError("elm-oracle failed:\n\n", l:infos)
|
|
||||||
return []
|
|
||||||
endif
|
|
||||||
|
|
||||||
let l:d = split(l:infos, '\n')
|
|
||||||
if len(l:d) > 0
|
|
||||||
return elm#util#DecodeJSON(l:d[0])
|
|
||||||
endif
|
|
||||||
|
|
||||||
return []
|
|
||||||
endf
|
|
||||||
|
|
||||||
" Vim command to format Elm files with elm-format
|
|
||||||
function! elm#Format() abort
|
|
||||||
" check for elm-format
|
|
||||||
if elm#util#CheckBin('elm-format', 'https://github.com/avh4/elm-format') ==# ''
|
|
||||||
return
|
|
||||||
endif
|
|
||||||
|
|
||||||
" save cursor position, folds and many other things
|
|
||||||
let l:curw = {}
|
|
||||||
try
|
|
||||||
mkview!
|
|
||||||
catch
|
|
||||||
let l:curw = winsaveview()
|
|
||||||
endtry
|
|
||||||
|
|
||||||
" save our undo file to be restored after we are done.
|
|
||||||
let l:tmpundofile = tempname()
|
|
||||||
exe 'wundo! ' . l:tmpundofile
|
|
||||||
|
|
||||||
" write current unsaved buffer to a temporary file
|
|
||||||
let l:tmpname = tempname() . '.elm'
|
|
||||||
call writefile(getline(1, '$'), l:tmpname)
|
|
||||||
|
|
||||||
" call elm-format on the temporary file
|
|
||||||
let l:out = system('elm-format ' . l:tmpname . ' --output ' . l:tmpname)
|
|
||||||
|
|
||||||
" if there is no error
|
|
||||||
if v:shell_error == 0
|
|
||||||
try | silent undojoin | catch | endtry
|
|
||||||
|
|
||||||
" replace current file with temp file, then reload buffer
|
|
||||||
let l:old_fileformat = &fileformat
|
|
||||||
call rename(l:tmpname, expand('%'))
|
|
||||||
silent edit!
|
|
||||||
let &fileformat = l:old_fileformat
|
|
||||||
let &syntax = &syntax
|
|
||||||
elseif g:elm_format_fail_silently == 0
|
|
||||||
call elm#util#EchoLater('EchoError', 'elm-format:', l:out)
|
|
||||||
endif
|
|
||||||
|
|
||||||
" save our undo history
|
|
||||||
silent! exe 'rundo ' . l:tmpundofile
|
|
||||||
call delete(l:tmpundofile)
|
|
||||||
|
|
||||||
" restore our cursor/windows positions, folds, etc..
|
|
||||||
if empty(l:curw)
|
|
||||||
silent! loadview
|
|
||||||
else
|
|
||||||
call winrestview(l:curw)
|
|
||||||
endif
|
|
||||||
endf
|
|
||||||
|
|
||||||
" Query elm-oracle and echo the type and docs for the word under the cursor.
|
|
||||||
function! elm#ShowDocs() abort
|
|
||||||
" check for the elm-oracle binary
|
|
||||||
if elm#util#CheckBin('elm-oracle', 'https://github.com/elmcast/elm-oracle') ==# ''
|
|
||||||
return
|
|
||||||
endif
|
|
||||||
|
|
||||||
let l:response = s:elmOracle()
|
|
||||||
|
|
||||||
if len(l:response) > 0
|
|
||||||
let l:info = l:response[0]
|
|
||||||
redraws! | echohl Identifier | echon l:info.fullName | echohl None | echon ' : ' | echohl Function | echon l:info.signature | echohl None | echon "\n\n" . l:info.comment
|
|
||||||
else
|
|
||||||
call elm#util#Echo('elm-oracle:', '...no match found')
|
|
||||||
endif
|
|
||||||
endf
|
|
||||||
|
|
||||||
" Query elm-oracle and open the docs for the word under the cursor.
|
|
||||||
function! elm#BrowseDocs() abort
|
|
||||||
" check for the elm-oracle binary
|
|
||||||
if elm#util#CheckBin('elm-oracle', 'https://github.com/elmcast/elm-oracle') ==# ''
|
|
||||||
return
|
|
||||||
endif
|
|
||||||
|
|
||||||
let l:response = s:elmOracle()
|
|
||||||
|
|
||||||
if len(l:response) > 0
|
|
||||||
let l:info = l:response[0]
|
|
||||||
call elm#util#OpenBrowser(l:info.href)
|
|
||||||
else
|
|
||||||
call elm#util#Echo('elm-oracle:', '...no match found')
|
|
||||||
endif
|
|
||||||
endf
|
|
||||||
|
|
||||||
|
|
||||||
function! elm#Syntastic(input) abort
|
|
||||||
let l:fixes = []
|
|
||||||
|
|
||||||
let l:bin = 'elm-make'
|
|
||||||
let l:format = '--report=json'
|
|
||||||
let l:input = shellescape(a:input)
|
|
||||||
let l:output = '--output=' . shellescape(syntastic#util#DevNull())
|
|
||||||
let l:command = l:bin . ' ' . l:format . ' ' . l:input . ' ' . l:output
|
|
||||||
let l:reports = s:ExecuteInRoot(l:command)
|
|
||||||
|
|
||||||
for l:report in split(l:reports, '\n')
|
|
||||||
if l:report[0] ==# '['
|
|
||||||
for l:error in elm#util#DecodeJSON(l:report)
|
|
||||||
if g:elm_syntastic_show_warnings == 0 && l:error.type ==? 'warning'
|
|
||||||
else
|
|
||||||
if a:input == l:error.file
|
|
||||||
call add(s:errors, l:error)
|
|
||||||
call add(l:fixes, {'filename': l:error.file,
|
|
||||||
\'valid': 1,
|
|
||||||
\'bufnr': bufnr('%'),
|
|
||||||
\'type': (l:error.type ==? 'error') ? 'E' : 'W',
|
|
||||||
\'lnum': l:error.region.start.line,
|
|
||||||
\'col': l:error.region.start.column,
|
|
||||||
\'text': l:error.overview})
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
endfor
|
|
||||||
endif
|
|
||||||
endfor
|
|
||||||
|
|
||||||
return l:fixes
|
|
||||||
endf
|
|
||||||
|
|
||||||
function! elm#Build(input, output, show_warnings) abort
|
|
||||||
let s:errors = []
|
|
||||||
let l:fixes = []
|
|
||||||
let l:rawlines = []
|
|
||||||
|
|
||||||
let l:bin = 'elm-make'
|
|
||||||
let l:format = '--report=json'
|
|
||||||
let l:input = shellescape(a:input)
|
|
||||||
let l:output = '--output=' . shellescape(a:output)
|
|
||||||
let l:command = l:bin . ' ' . l:format . ' ' . l:input . ' ' . l:output
|
|
||||||
let l:reports = s:ExecuteInRoot(l:command)
|
|
||||||
|
|
||||||
for l:report in split(l:reports, '\n')
|
|
||||||
if l:report[0] ==# '['
|
|
||||||
for l:error in elm#util#DecodeJSON(l:report)
|
|
||||||
if a:show_warnings == 0 && l:error.type ==? 'warning'
|
|
||||||
else
|
|
||||||
call add(s:errors, l:error)
|
|
||||||
call add(l:fixes, {'filename': l:error.file,
|
|
||||||
\'valid': 1,
|
|
||||||
\'type': (l:error.type ==? 'error') ? 'E' : 'W',
|
|
||||||
\'lnum': l:error.region.start.line,
|
|
||||||
\'col': l:error.region.start.column,
|
|
||||||
\'text': l:error.overview})
|
|
||||||
endif
|
|
||||||
endfor
|
|
||||||
else
|
|
||||||
call add(l:rawlines, l:report)
|
|
||||||
endif
|
|
||||||
endfor
|
|
||||||
|
|
||||||
let l:details = join(l:rawlines, "\n")
|
|
||||||
let l:lines = split(l:details, "\n")
|
|
||||||
if !empty(l:lines)
|
|
||||||
let l:overview = l:lines[0]
|
|
||||||
else
|
|
||||||
let l:overview = ''
|
|
||||||
endif
|
|
||||||
|
|
||||||
if l:details ==# '' || l:details =~? '^Successfully.*'
|
|
||||||
else
|
|
||||||
call add(s:errors, {'overview': l:details, 'details': l:details})
|
|
||||||
call add(l:fixes, {'filename': expand('%', 1),
|
|
||||||
\'valid': 1,
|
|
||||||
\'type': 'E',
|
|
||||||
\'lnum': 0,
|
|
||||||
\'col': 0,
|
|
||||||
\'text': l:overview})
|
|
||||||
endif
|
|
||||||
|
|
||||||
return l:fixes
|
|
||||||
endf
|
|
||||||
|
|
||||||
" Make the given file, or the current file if none is given.
|
|
||||||
function! elm#Make(...) abort
|
|
||||||
if elm#util#CheckBin('elm-make', 'http://elm-lang.org/install') ==# ''
|
|
||||||
return
|
|
||||||
endif
|
|
||||||
|
|
||||||
call elm#util#Echo('elm-make:', 'building...')
|
|
||||||
|
|
||||||
let l:input = (a:0 == 0) ? expand('%:p') : a:1
|
|
||||||
let l:fixes = elm#Build(l:input, g:elm_make_output_file, g:elm_make_show_warnings)
|
|
||||||
|
|
||||||
if len(l:fixes) > 0
|
|
||||||
call elm#util#EchoWarning('', 'found ' . len(l:fixes) . ' errors')
|
|
||||||
|
|
||||||
call setqflist(l:fixes, 'r')
|
|
||||||
cwindow
|
|
||||||
|
|
||||||
if get(g:, 'elm_jump_to_error', 1)
|
|
||||||
ll 1
|
|
||||||
endif
|
|
||||||
else
|
|
||||||
call elm#util#EchoSuccess('', 'Sucessfully compiled')
|
|
||||||
|
|
||||||
call setqflist([])
|
|
||||||
cwindow
|
|
||||||
endif
|
|
||||||
endf
|
|
||||||
|
|
||||||
" Show the detail of the current error in the quickfix window.
|
|
||||||
function! elm#ErrorDetail() abort
|
|
||||||
if !empty(filter(tabpagebuflist(), 'getbufvar(v:val, "&buftype") ==? "quickfix"'))
|
|
||||||
exec ':copen'
|
|
||||||
let l:linenr = line('.')
|
|
||||||
exec ':wincmd p'
|
|
||||||
if len(s:errors) > 0
|
|
||||||
let l:detail = s:errors[l:linenr-1].details
|
|
||||||
if l:detail ==# ''
|
|
||||||
let l:detail = s:errors[l:linenr-1].overview
|
|
||||||
endif
|
|
||||||
echo l:detail
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
endf
|
|
||||||
|
|
||||||
" Open the elm repl in a subprocess.
|
|
||||||
function! elm#Repl() abort
|
|
||||||
" check for the elm-repl binary
|
|
||||||
if elm#util#CheckBin('elm-repl', 'http://elm-lang.org/install') ==# ''
|
|
||||||
return
|
|
||||||
endif
|
|
||||||
|
|
||||||
if has('nvim')
|
|
||||||
term('elm-repl')
|
|
||||||
else
|
|
||||||
!elm-repl
|
|
||||||
endif
|
|
||||||
endf
|
|
||||||
|
|
||||||
function! elm#Oracle(filepath, word) abort
|
|
||||||
let l:bin = 'elm-oracle'
|
|
||||||
let l:filepath = shellescape(a:filepath)
|
|
||||||
let l:word = shellescape(a:word)
|
|
||||||
let l:command = l:bin . ' ' . l:filepath . ' ' . l:word
|
|
||||||
return s:ExecuteInRoot(l:command)
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
let s:fullComplete = ''
|
|
||||||
|
|
||||||
" Complete the current token using elm-oracle
|
|
||||||
function! elm#Complete(findstart, base) abort
|
|
||||||
" a:base is unused, but the callback function for completion expects 2 arguments
|
|
||||||
if a:findstart
|
|
||||||
let l:line = getline('.')
|
|
||||||
|
|
||||||
let l:idx = col('.') - 1
|
|
||||||
let l:start = 0
|
|
||||||
while l:idx > 0 && l:line[l:idx - 1] =~# '[a-zA-Z0-9_\.]'
|
|
||||||
if l:line[l:idx - 1] ==# '.' && l:start == 0
|
|
||||||
let l:start = l:idx
|
|
||||||
endif
|
|
||||||
let l:idx -= 1
|
|
||||||
endwhile
|
|
||||||
|
|
||||||
if l:start == 0
|
|
||||||
let l:start = l:idx
|
|
||||||
endif
|
|
||||||
|
|
||||||
let s:fullComplete = l:line[l:idx : col('.')-2]
|
|
||||||
|
|
||||||
return l:start
|
|
||||||
else
|
|
||||||
" check for the elm-oracle binary
|
|
||||||
if elm#util#CheckBin('elm-oracle', 'https://github.com/elmcast/elm-oracle') ==# ''
|
|
||||||
return []
|
|
||||||
endif
|
|
||||||
|
|
||||||
let l:res = []
|
|
||||||
let l:response = s:elmOracle(s:fullComplete)
|
|
||||||
|
|
||||||
let l:detailed = get(g:, 'elm_detailed_complete', 0)
|
|
||||||
|
|
||||||
for l:r in l:response
|
|
||||||
let l:menu = ''
|
|
||||||
if l:detailed
|
|
||||||
let l:menu = ': ' . l:r.signature
|
|
||||||
endif
|
|
||||||
call add(l:res, {'word': l:r.name, 'menu': l:menu})
|
|
||||||
endfor
|
|
||||||
|
|
||||||
return l:res
|
|
||||||
endif
|
|
||||||
endf
|
|
||||||
|
|
||||||
" If the current buffer contains a consoleRunner, run elm-test with it.
|
|
||||||
" Otherwise run elm-test in the root of your project which deafults to
|
|
||||||
" running 'elm-test tests/TestRunner'.
|
|
||||||
function! elm#Test() abort
|
|
||||||
if elm#util#CheckBin('elm-test', 'https://github.com/rtfeldman/node-elm-test') ==# ''
|
|
||||||
return
|
|
||||||
endif
|
|
||||||
|
|
||||||
if match(getline(1, '$'), 'consoleRunner') < 0
|
|
||||||
let l:out = s:ExecuteInRoot('elm-test')
|
|
||||||
call elm#util#EchoSuccess('elm-test', l:out)
|
|
||||||
else
|
|
||||||
let l:filepath = shellescape(expand('%:p'))
|
|
||||||
let l:out = s:ExecuteInRoot('elm-test ' . l:filepath)
|
|
||||||
call elm#util#EchoSuccess('elm-test', l:out)
|
|
||||||
endif
|
|
||||||
endf
|
|
||||||
|
|
||||||
" Returns the closest parent with an elm-package.json file.
|
|
||||||
function! elm#FindRootDirectory() abort
|
|
||||||
let l:elm_root = getbufvar('%', 'elmRoot')
|
|
||||||
if empty(l:elm_root)
|
|
||||||
let l:current_file = expand('%:p')
|
|
||||||
let l:dir_current_file = fnameescape(fnamemodify(l:current_file, ':h'))
|
|
||||||
let l:old_match = findfile('elm-package.json', l:dir_current_file . ';')
|
|
||||||
let l:new_match = findfile('elm.json', l:dir_current_file . ';')
|
|
||||||
if !empty(l:new_match)
|
|
||||||
let l:elm_root = fnamemodify(l:new_match, ':p:h')
|
|
||||||
elseif !empty(l:old_match)
|
|
||||||
let l:elm_root = fnamemodify(l:old_match, ':p:h')
|
|
||||||
else
|
|
||||||
let l:elm_root = ''
|
|
||||||
endif
|
|
||||||
|
|
||||||
if !empty(l:elm_root)
|
|
||||||
call setbufvar('%', 'elmRoot', l:elm_root)
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
return l:elm_root
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" Executes a command in the project directory.
|
|
||||||
function! s:ExecuteInRoot(cmd) abort
|
|
||||||
let l:cd = exists('*haslocaldir') && haslocaldir() ? 'lcd ' : 'cd '
|
|
||||||
let l:current_dir = getcwd()
|
|
||||||
let l:root_dir = elm#FindRootDirectory()
|
|
||||||
|
|
||||||
try
|
|
||||||
execute l:cd . fnameescape(l:root_dir)
|
|
||||||
let l:out = system(a:cmd)
|
|
||||||
finally
|
|
||||||
execute l:cd . fnameescape(l:current_dir)
|
|
||||||
endtry
|
|
||||||
|
|
||||||
return l:out
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
endif
|
|
||||||
@@ -1,184 +0,0 @@
|
|||||||
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'elm') == -1
|
|
||||||
|
|
||||||
" IsWin returns 1 if current OS is Windows or 0 otherwise
|
|
||||||
fun! elm#util#IsWin() abort
|
|
||||||
let l:win = ['win16', 'win32', 'win32unix', 'win64', 'win95']
|
|
||||||
for l:w in l:win
|
|
||||||
if (has(l:w))
|
|
||||||
return 1
|
|
||||||
endif
|
|
||||||
endfor
|
|
||||||
|
|
||||||
return 0
|
|
||||||
endf
|
|
||||||
|
|
||||||
fun! elm#util#CheckBin(bin, url) abort
|
|
||||||
let l:binpath = substitute(a:bin, '^\s*\(.\{-}\)\s*$', '\1', '')
|
|
||||||
|
|
||||||
if executable(l:binpath)
|
|
||||||
return l:binpath
|
|
||||||
endif
|
|
||||||
|
|
||||||
call elm#util#EchoWarning('elm-vim:', 'could not find ' . l:binpath . ' [' . a:url . ']')
|
|
||||||
|
|
||||||
return ''
|
|
||||||
endf
|
|
||||||
|
|
||||||
" Determines the browser command to use
|
|
||||||
fun! s:get_browser_command() abort
|
|
||||||
let l:elm_browser_command = get(g:, 'elm_browser_command', '')
|
|
||||||
if l:elm_browser_command ==? ''
|
|
||||||
if elm#util#IsWin()
|
|
||||||
let l:elm_browser_command = '!start rundll32 url.dll,FileProtocolHandler %URL%'
|
|
||||||
elseif has('mac') || has('macunix') || has('gui_macvim') || system('uname') =~? '^darwin'
|
|
||||||
let l:elm_browser_command = 'open %URL%'
|
|
||||||
elseif executable('xdg-open')
|
|
||||||
let l:elm_browser_command = 'xdg-open %URL%'
|
|
||||||
elseif executable('firefox')
|
|
||||||
let l:elm_browser_command = 'firefox %URL% &'
|
|
||||||
else
|
|
||||||
let l:elm_browser_command = ''
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
return l:elm_browser_command
|
|
||||||
endf
|
|
||||||
|
|
||||||
" OpenBrowser opens a url in the default browser
|
|
||||||
fun! elm#util#OpenBrowser(url) abort
|
|
||||||
let l:cmd = s:get_browser_command()
|
|
||||||
if len(l:cmd) == 0
|
|
||||||
redraw
|
|
||||||
echohl WarningMsg
|
|
||||||
echo "It seems that you don't have general web browser. Open URL below."
|
|
||||||
echohl None
|
|
||||||
echo a:url
|
|
||||||
return
|
|
||||||
endif
|
|
||||||
if l:cmd =~? '^!'
|
|
||||||
let l:cmd = substitute(l:cmd, '%URL%', '\=shellescape(a:url)', 'g')
|
|
||||||
silent! exec l:cmd
|
|
||||||
elseif l:cmd =~# '^:[A-Z]'
|
|
||||||
let l:cmd = substitute(l:cmd, '%URL%', '\=a:url', 'g')
|
|
||||||
exec l:cmd
|
|
||||||
else
|
|
||||||
let l:cmd = substitute(l:cmd, '%URL%', '\=shellescape(a:url)', 'g')
|
|
||||||
call system(l:cmd)
|
|
||||||
endif
|
|
||||||
endf
|
|
||||||
|
|
||||||
" DecodeJSON decodes a string of json into a viml object
|
|
||||||
fun! elm#util#DecodeJSON(s) abort
|
|
||||||
let l:true = 1
|
|
||||||
let l:false = 0
|
|
||||||
let l:null = 0
|
|
||||||
return eval(a:s)
|
|
||||||
endf
|
|
||||||
|
|
||||||
" Remove ANSI escape characters used for highlighting purposes
|
|
||||||
fun! s:strip_color(msg) abort
|
|
||||||
return substitute(a:msg, '\e\[[0-9;]\+[mK]', '', 'g')
|
|
||||||
endf
|
|
||||||
|
|
||||||
" Print functions
|
|
||||||
fun! elm#util#Echo(title, msg) abort
|
|
||||||
redraws! | echon a:title . ' ' | echohl Identifier | echon s:strip_color(a:msg) | echohl None
|
|
||||||
endf
|
|
||||||
|
|
||||||
fun! elm#util#EchoSuccess(title, msg) abort
|
|
||||||
redraws! | echon a:title . ' ' | echohl Function | echon s:strip_color(a:msg) | echohl None
|
|
||||||
endf
|
|
||||||
|
|
||||||
fun! elm#util#EchoWarning(title, msg) abort
|
|
||||||
redraws! | echon a:title . ' ' | echohl WarningMsg | echon s:strip_color(a:msg) | echohl None
|
|
||||||
endf
|
|
||||||
|
|
||||||
fun! elm#util#EchoError(title, msg) abort
|
|
||||||
redraws! | echon a:title . ' ' | echohl ErrorMsg | echon s:strip_color(a:msg) | echohl None
|
|
||||||
endf
|
|
||||||
|
|
||||||
fun! elm#util#EchoLater(func_name, title, msg) abort
|
|
||||||
let s:echo_func_name = a:func_name
|
|
||||||
let s:echo_title = a:title
|
|
||||||
let s:echo_msg = a:msg
|
|
||||||
endf
|
|
||||||
|
|
||||||
fun! elm#util#EchoStored() abort
|
|
||||||
if exists('s:echo_func_name') && exists('s:echo_title') && exists('s:echo_msg')
|
|
||||||
call elm#util#{s:echo_func_name}(s:echo_title, s:echo_msg)
|
|
||||||
unlet s:echo_func_name
|
|
||||||
unlet s:echo_title
|
|
||||||
unlet s:echo_msg
|
|
||||||
endif
|
|
||||||
endf
|
|
||||||
|
|
||||||
function! elm#util#GoToModule(name)
|
|
||||||
if empty(a:name) | return | endif
|
|
||||||
if empty(matchstr(a:name, '^Native\.'))
|
|
||||||
let l:extension = '.elm'
|
|
||||||
else
|
|
||||||
let l:extension = '.js'
|
|
||||||
endif
|
|
||||||
let l:rel_path = substitute(a:name, '\.', '/', 'g') . l:extension
|
|
||||||
let l:root = elm#FindRootDirectory()
|
|
||||||
|
|
||||||
let l:module_file = s:findLocalModule(l:rel_path, l:root)
|
|
||||||
if !filereadable(l:module_file)
|
|
||||||
let l:module_file = s:findDependencyModule(l:rel_path, l:root)
|
|
||||||
endif
|
|
||||||
|
|
||||||
if filereadable(l:module_file)
|
|
||||||
exec 'edit ' . fnameescape(l:module_file)
|
|
||||||
else
|
|
||||||
return s:error("Can't find module \"" . a:name . "\"")
|
|
||||||
endif
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
function! s:findLocalModule(rel_path, root)
|
|
||||||
let l:old_match = findfile('elm-package.json', a:root . ';')
|
|
||||||
let l:new_match = findfile('elm.json', a:root . ';')
|
|
||||||
if !empty(l:new_match)
|
|
||||||
let l:package_json = l:new_match
|
|
||||||
elseif !empty(l:old_match)
|
|
||||||
let l:package_json = l:old_match
|
|
||||||
endif
|
|
||||||
if exists('*json_decode')
|
|
||||||
let l:package = json_decode(readfile(l:package_json))
|
|
||||||
let l:source_roots = l:package['source-directories']
|
|
||||||
else
|
|
||||||
" This is a fallback for vim's which do not support json_decode.
|
|
||||||
" It simply only looks in the 'src' subdirectory and fails otherwise.
|
|
||||||
let l:source_roots = ['src']
|
|
||||||
end
|
|
||||||
for l:source_root in l:source_roots
|
|
||||||
let l:file_path = a:root . '/' . l:source_root . '/' . a:rel_path
|
|
||||||
if !filereadable(l:file_path)
|
|
||||||
continue
|
|
||||||
endif
|
|
||||||
return l:file_path
|
|
||||||
endfor
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
function! s:findDependencyModule(rel_path, root)
|
|
||||||
" If we are a dependency ourselves, we need to check our siblings.
|
|
||||||
" This is because elm package doesn't install dependencies recursively.
|
|
||||||
let l:root = substitute(a:root, '\/elm-stuff/packages.\+$', '', '')
|
|
||||||
|
|
||||||
" We naively craws the dependencies dir for any fitting module name.
|
|
||||||
" If it exists, we'll find it. If multiple filenames match,
|
|
||||||
" there's a chance we return the wrong one.
|
|
||||||
let l:module_paths = glob(l:root . '/elm-stuff/packages/**/' . a:rel_path, 0, 1)
|
|
||||||
if len(l:module_paths) > 0
|
|
||||||
return l:module_paths[0]
|
|
||||||
endif
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" Using the built-in :echoerr prints a stacktrace, which isn't that nice.
|
|
||||||
" From: https://github.com/moll/vim-node/blob/master/autoload/node.vim
|
|
||||||
function! s:error(msg)
|
|
||||||
echohl ErrorMsg
|
|
||||||
echomsg a:msg
|
|
||||||
echohl NONE
|
|
||||||
let v:errmsg = a:msg
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
endif
|
|
||||||
@@ -1,25 +1,43 @@
|
|||||||
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'fish') == -1
|
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'fish') == -1
|
||||||
|
|
||||||
function! fish#Indent()
|
function! fish#Indent()
|
||||||
let l:shiftwidth = shiftwidth()
|
|
||||||
let l:prevlnum = prevnonblank(v:lnum - 1)
|
let l:prevlnum = prevnonblank(v:lnum - 1)
|
||||||
if l:prevlnum ==# 0
|
if l:prevlnum ==# 0
|
||||||
return 0
|
return 0
|
||||||
endif
|
endif
|
||||||
let l:indent = 0
|
|
||||||
let l:prevline = getline(l:prevlnum)
|
let l:prevline = getline(l:prevlnum)
|
||||||
if l:prevline =~# '\v^\s*switch>'
|
|
||||||
return indent(l:prevlnum) + l:shiftwidth
|
|
||||||
elseif l:prevline =~# '\v^\s*%(begin|if|else|while|for|function|case)>'
|
|
||||||
let l:indent = l:shiftwidth
|
|
||||||
endif
|
|
||||||
let l:line = getline(v:lnum)
|
let l:line = getline(v:lnum)
|
||||||
if l:line =~# '\v^\s*end>'
|
let l:shiftwidth = shiftwidth()
|
||||||
return indent(l:prevlnum) - (l:indent ==# 0 ? l:shiftwidth : l:indent)
|
let l:previndent = indent(l:prevlnum)
|
||||||
elseif l:line =~# '\v^\s*%(case|else)>'
|
let l:indent = l:previndent
|
||||||
return indent(l:prevlnum) - l:shiftwidth
|
if l:prevline =~# '\v^\s*%(begin|if|else|while|for|function|switch|case)>'
|
||||||
|
let l:indent += l:shiftwidth
|
||||||
endif
|
endif
|
||||||
return indent(l:prevlnum) + l:indent
|
if l:line =~# '\v^\s*end>'
|
||||||
|
let l:indent -= l:shiftwidth
|
||||||
|
" If we're inside a case, dedent twice because it ends the switch.
|
||||||
|
if l:prevline =~# '\v^\s*case>'
|
||||||
|
" Previous line starts the case.
|
||||||
|
let l:indent -= l:shiftwidth
|
||||||
|
else
|
||||||
|
" Scan back to a dedented line to find whether we're in a case.
|
||||||
|
let l:i = l:prevlnum
|
||||||
|
while l:i >= 1 && indent(l:i) >= l:previndent
|
||||||
|
let l:i = prevnonblank(l:i - 1)
|
||||||
|
endwhile
|
||||||
|
if indent(l:i) < l:previndent && getline(l:i) =~# '\v^\s*case>'
|
||||||
|
let l:indent -= l:shiftwidth
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
elseif l:line =~# '\v^\s*else>'
|
||||||
|
let l:indent -= l:shiftwidth
|
||||||
|
elseif l:prevline !~# '\v^\s*switch>' && l:line =~# '\v^\s*case>'
|
||||||
|
let l:indent -= l:shiftwidth
|
||||||
|
endif
|
||||||
|
if l:indent < 0
|
||||||
|
return 0
|
||||||
|
endif
|
||||||
|
return l:indent
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! fish#Format()
|
function! fish#Format()
|
||||||
@@ -54,7 +72,7 @@ function! fish#Complete(findstart, base)
|
|||||||
let l:completions =
|
let l:completions =
|
||||||
\ system('fish -c "complete -C'.shellescape(a:base).'"')
|
\ system('fish -c "complete -C'.shellescape(a:base).'"')
|
||||||
let l:cmd = substitute(a:base, '\v\S+$', '', '')
|
let l:cmd = substitute(a:base, '\v\S+$', '', '')
|
||||||
for l:line in split(l:completions, '\n')
|
for l:line in filter(split(l:completions, '\n'), 'len(v:val)')
|
||||||
let l:tokens = split(l:line, '\t')
|
let l:tokens = split(l:line, '\t')
|
||||||
call add(l:results, {'word': l:cmd.l:tokens[0],
|
call add(l:results, {'word': l:cmd.l:tokens[0],
|
||||||
\'abbr': l:tokens[0],
|
\'abbr': l:tokens[0],
|
||||||
|
|||||||
@@ -60,7 +60,10 @@ function! go#config#SetTermCloseOnExit(value) abort
|
|||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! go#config#TermEnabled() abort
|
function! go#config#TermEnabled() abort
|
||||||
return has('nvim') && get(g:, 'go_term_enabled', 0)
|
" nvim always support
|
||||||
|
" vim will support if terminal feature exists
|
||||||
|
let l:support = has('nvim') || has('terminal')
|
||||||
|
return support && get(g:, 'go_term_enabled', 0)
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! go#config#SetTermEnabled(value) abort
|
function! go#config#SetTermEnabled(value) abort
|
||||||
@@ -84,7 +87,18 @@ function! go#config#StatuslineDuration() abort
|
|||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! go#config#SnippetEngine() abort
|
function! go#config#SnippetEngine() abort
|
||||||
return get(g:, 'go_snippet_engine', 'automatic')
|
let l:engine = get(g:, 'go_snippet_engine', 'automatic')
|
||||||
|
if l:engine is? "automatic"
|
||||||
|
if get(g:, 'did_plugin_ultisnips') is 1
|
||||||
|
let l:engine = 'ultisnips'
|
||||||
|
elseif get(g:, 'loaded_neosnippet') is 1
|
||||||
|
let l:engine = 'neosnippet'
|
||||||
|
elseif get(g:, 'loaded_minisnip') is 1
|
||||||
|
let l:engine = 'minisnip'
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
return l:engine
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! go#config#PlayBrowserCommand() abort
|
function! go#config#PlayBrowserCommand() abort
|
||||||
@@ -151,30 +165,13 @@ function! go#config#SetGuruScope(scope) abort
|
|||||||
endif
|
endif
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! go#config#GocodeUnimportedPackages() abort
|
|
||||||
return get(g:, 'go_gocode_unimported_packages', 0)
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
let s:sock_type = (has('win32') || has('win64')) ? 'tcp' : 'unix'
|
|
||||||
function! go#config#GocodeSocketType() abort
|
|
||||||
return get(g:, 'go_gocode_socket_type', s:sock_type)
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
function! go#config#GocodeProposeBuiltins() abort
|
|
||||||
return get(g:, 'go_gocode_propose_builtins', 1)
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
function! go#config#GocodeProposeSource() abort
|
|
||||||
return get(g:, 'go_gocode_propose_source', 0)
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
function! go#config#EchoCommandInfo() abort
|
function! go#config#EchoCommandInfo() abort
|
||||||
return get(g:, 'go_echo_command_info', 1)
|
return get(g:, 'go_echo_command_info', 1)
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! go#config#DocUrl() abort
|
function! go#config#DocUrl() abort
|
||||||
let godoc_url = get(g:, 'go_doc_url', 'https://godoc.org')
|
let godoc_url = get(g:, 'go_doc_url', 'https://pkg.go.dev')
|
||||||
if godoc_url isnot 'https://godoc.org'
|
if godoc_url isnot 'https://pkg.go.dev'
|
||||||
" strip last '/' character if available
|
" strip last '/' character if available
|
||||||
let last_char = strlen(godoc_url) - 1
|
let last_char = strlen(godoc_url) - 1
|
||||||
if godoc_url[last_char] == '/'
|
if godoc_url[last_char] == '/'
|
||||||
@@ -252,6 +249,10 @@ function! go#config#AddtagsTransform() abort
|
|||||||
return get(g:, 'go_addtags_transform', "snakecase")
|
return get(g:, 'go_addtags_transform', "snakecase")
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
|
function! go#config#AddtagsSkipUnexported() abort
|
||||||
|
return get(g:, 'go_addtags_skip_unexported', 0)
|
||||||
|
endfunction
|
||||||
|
|
||||||
function! go#config#TemplateAutocreate() abort
|
function! go#config#TemplateAutocreate() abort
|
||||||
return get(g:, "go_template_autocreate", 1)
|
return get(g:, "go_template_autocreate", 1)
|
||||||
endfunction
|
endfunction
|
||||||
@@ -265,23 +266,11 @@ function! go#config#MetalinterCommand() abort
|
|||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! go#config#MetalinterAutosaveEnabled() abort
|
function! go#config#MetalinterAutosaveEnabled() abort
|
||||||
let l:default_enabled = ["vet", "golint"]
|
return get(g:, "go_metalinter_autosave_enabled", ["govet", "golint"])
|
||||||
|
|
||||||
if go#config#MetalinterCommand() == "golangci-lint"
|
|
||||||
let l:default_enabled = ["govet", "golint"]
|
|
||||||
endif
|
|
||||||
|
|
||||||
return get(g:, "go_metalinter_autosave_enabled", default_enabled)
|
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! go#config#MetalinterEnabled() abort
|
function! go#config#MetalinterEnabled() abort
|
||||||
let l:default_enabled = ["vet", "golint", "errcheck"]
|
return get(g:, "go_metalinter_enabled", ["vet", "golint", "errcheck"])
|
||||||
|
|
||||||
if go#config#MetalinterCommand() == "golangci-lint"
|
|
||||||
let l:default_enabled = ["govet", "golint"]
|
|
||||||
endif
|
|
||||||
|
|
||||||
return get(g:, "go_metalinter_enabled", default_enabled)
|
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! go#config#GolintBin() abort
|
function! go#config#GolintBin() abort
|
||||||
@@ -308,6 +297,10 @@ function! go#config#FmtAutosave() abort
|
|||||||
return get(g:, "go_fmt_autosave", 1)
|
return get(g:, "go_fmt_autosave", 1)
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
|
function! go#config#ImportsAutosave() abort
|
||||||
|
return get(g:, 'go_imports_autosave', 0)
|
||||||
|
endfunction
|
||||||
|
|
||||||
function! go#config#SetFmtAutosave(value) abort
|
function! go#config#SetFmtAutosave(value) abort
|
||||||
let g:go_fmt_autosave = a:value
|
let g:go_fmt_autosave = a:value
|
||||||
endfunction
|
endfunction
|
||||||
@@ -352,8 +345,12 @@ function! go#config#FmtCommand() abort
|
|||||||
return get(g:, "go_fmt_command", "gofmt")
|
return get(g:, "go_fmt_command", "gofmt")
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
|
function! go#config#ImportsMode() abort
|
||||||
|
return get(g:, "go_imports_mode", "goimports")
|
||||||
|
endfunction
|
||||||
|
|
||||||
function! go#config#FmtOptions() abort
|
function! go#config#FmtOptions() abort
|
||||||
return get(g:, "go_fmt_options", {})
|
return get(b:, "go_fmt_options", get(g:, "go_fmt_options", {}))
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! go#config#FmtFailSilently() abort
|
function! go#config#FmtFailSilently() abort
|
||||||
@@ -368,13 +365,13 @@ function! go#config#PlayOpenBrowser() abort
|
|||||||
return get(g:, "go_play_open_browser", 1)
|
return get(g:, "go_play_open_browser", 1)
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! go#config#GorenameCommand() abort
|
function! go#config#RenameCommand() abort
|
||||||
" delegate to go#config#GorenameBin for backwards compatability.
|
" delegate to go#config#GorenameBin for backwards compatability.
|
||||||
return get(g:, "go_gorename_command", go#config#GorenameBin())
|
return get(g:, "go_rename_command", go#config#GorenameBin())
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! go#config#GorenameBin() abort
|
function! go#config#GorenameBin() abort
|
||||||
return get(g:, "go_gorename_bin", "gorename")
|
return get(g:, "go_gorename_bin", "gopls")
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! go#config#GorenamePrefill() abort
|
function! go#config#GorenamePrefill() abort
|
||||||
@@ -480,6 +477,10 @@ function! go#config#HighlightDebug() abort
|
|||||||
return get(g:, 'go_highlight_debug', 1)
|
return get(g:, 'go_highlight_debug', 1)
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
|
function! go#config#DebugBreakpointSignText() abort
|
||||||
|
return get(g:, 'go_debug_breakpoint_sign_text', '>')
|
||||||
|
endfunction
|
||||||
|
|
||||||
function! go#config#FoldEnable(...) abort
|
function! go#config#FoldEnable(...) abort
|
||||||
if a:0 > 0
|
if a:0 > 0
|
||||||
return index(go#config#FoldEnable(), a:1) > -1
|
return index(go#config#FoldEnable(), a:1) > -1
|
||||||
@@ -495,6 +496,10 @@ function! go#config#CodeCompletionEnabled() abort
|
|||||||
return get(g:, "go_code_completion_enabled", 1)
|
return get(g:, "go_code_completion_enabled", 1)
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
|
function! go#config#CodeCompletionIcase() abort
|
||||||
|
return get(g:, "go_code_completion_icase", 0)
|
||||||
|
endfunction
|
||||||
|
|
||||||
function! go#config#Updatetime() abort
|
function! go#config#Updatetime() abort
|
||||||
let go_updatetime = get(g:, 'go_updatetime', 800)
|
let go_updatetime = get(g:, 'go_updatetime', 800)
|
||||||
return go_updatetime == 0 ? &updatetime : go_updatetime
|
return go_updatetime == 0 ? &updatetime : go_updatetime
|
||||||
@@ -504,26 +509,57 @@ function! go#config#ReferrersMode() abort
|
|||||||
return get(g:, 'go_referrers_mode', 'gopls')
|
return get(g:, 'go_referrers_mode', 'gopls')
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
|
function! go#config#ImplementsMode() abort
|
||||||
|
return get(g:, 'go_implements_mode', 'guru')
|
||||||
|
endfunction
|
||||||
|
|
||||||
function! go#config#GoplsCompleteUnimported() abort
|
function! go#config#GoplsCompleteUnimported() abort
|
||||||
return get(g:, 'go_gopls_complete_unimported', 0)
|
return get(g:, 'go_gopls_complete_unimported', v:null)
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! go#config#GoplsDeepCompletion() abort
|
function! go#config#GoplsDeepCompletion() abort
|
||||||
return get(g:, 'go_gopls_deep_completion', 1)
|
return get(g:, 'go_gopls_deep_completion', v:null)
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! go#config#GoplsFuzzyMatching() abort
|
function! go#config#GoplsMatcher() abort
|
||||||
return get(g:, 'go_gopls_fuzzy_matching', 1)
|
if !exists('g:go_gopls_matcher') && get(g:, 'g:go_gopls_fuzzy_matching', v:null) is 1
|
||||||
|
return 'fuzzy'
|
||||||
|
endif
|
||||||
|
return get(g:, 'go_gopls_matcher', v:null)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! go#config#GoplsStaticCheck() abort
|
||||||
|
return get(g:, 'go_gopls_staticcheck', v:null)
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! go#config#GoplsUsePlaceholders() abort
|
function! go#config#GoplsUsePlaceholders() abort
|
||||||
return get(g:, 'go_gopls_use_placeholders', 0)
|
return get(g:, 'go_gopls_use_placeholders', v:null)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! go#config#GoplsTempModfile() abort
|
||||||
|
return get(g:, 'go_gopls_temp_modfile', v:null)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! go#config#GoplsAnalyses() abort
|
||||||
|
return get(g:, 'go_gopls_analyses', v:null)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! go#config#GoplsLocal() abort
|
||||||
|
return get(g:, 'go_gopls_local', v:null)
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! go#config#GoplsEnabled() abort
|
function! go#config#GoplsEnabled() abort
|
||||||
return get(g:, 'go_gopls_enabled', 1)
|
return get(g:, 'go_gopls_enabled', 1)
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
|
function! go#config#DiagnosticsEnabled() abort
|
||||||
|
return get(g:, 'go_diagnostics_enabled', 0)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! go#config#GoplsOptions() abort
|
||||||
|
return get(g:, 'go_gopls_options', ['-remote=auto'])
|
||||||
|
endfunction
|
||||||
|
|
||||||
" Set the default value. A value of "1" is a shortcut for this, for
|
" Set the default value. A value of "1" is a shortcut for this, for
|
||||||
" compatibility reasons.
|
" compatibility reasons.
|
||||||
if exists("g:go_gorename_prefill") && g:go_gorename_prefill == 1
|
if exists("g:go_gorename_prefill") && g:go_gorename_prefill == 1
|
||||||
|
|||||||
@@ -1,13 +1,36 @@
|
|||||||
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'graphql') == -1
|
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'graphql') == -1
|
||||||
|
|
||||||
" Vim plugin
|
" Copyright (c) 2016-2020 Jon Parise <jon@indelible.org>
|
||||||
|
"
|
||||||
|
" Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
" of this software and associated documentation files (the "Software"), to
|
||||||
|
" deal in the Software without restriction, including without limitation the
|
||||||
|
" rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||||
|
" sell copies of the Software, and to permit persons to whom the Software is
|
||||||
|
" furnished to do so, subject to the following conditions:
|
||||||
|
"
|
||||||
|
" The above copyright notice and this permission notice shall be included in
|
||||||
|
" all copies or substantial portions of the Software.
|
||||||
|
"
|
||||||
|
" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
" IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
" FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
" AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
" LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||||
|
" FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||||
|
" IN THE SOFTWARE.
|
||||||
|
"
|
||||||
" Language: GraphQL
|
" Language: GraphQL
|
||||||
" Maintainer: Jon Parise <jon@indelible.org>
|
" Maintainer: Jon Parise <jon@indelible.org>
|
||||||
|
|
||||||
if exists('g:autoloaded_graphql')
|
function! graphql#has_syntax_group(group) abort
|
||||||
finish
|
try
|
||||||
endif
|
silent execute 'silent highlight ' . a:group
|
||||||
let g:autoloaded_graphql = 1
|
catch
|
||||||
|
return v:false
|
||||||
|
endtry
|
||||||
|
return v:true
|
||||||
|
endfunction
|
||||||
|
|
||||||
function! graphql#javascript_tags() abort
|
function! graphql#javascript_tags() abort
|
||||||
return get(g:, 'graphql_javascript_tags', ['gql', 'graphql', 'Relay.QL'])
|
return get(g:, 'graphql_javascript_tags', ['gql', 'graphql', 'Relay.QL'])
|
||||||
|
|||||||
129
autoload/jsonnet.vim
Normal file
129
autoload/jsonnet.vim
Normal file
@@ -0,0 +1,129 @@
|
|||||||
|
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'jsonnet') == -1
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
" Options.
|
||||||
|
|
||||||
|
if !exists("g:jsonnet_command")
|
||||||
|
let g:jsonnet_command = "jsonnet"
|
||||||
|
endif
|
||||||
|
|
||||||
|
if !exists("g:jsonnet_fmt_command")
|
||||||
|
let g:jsonnet_fmt_command = "jsonnetfmt"
|
||||||
|
endif
|
||||||
|
|
||||||
|
if !exists('g:jsonnet_fmt_options')
|
||||||
|
let g:jsonnet_fmt_options = ''
|
||||||
|
endif
|
||||||
|
|
||||||
|
if !exists('g:jsonnet_fmt_fail_silently')
|
||||||
|
let g:jsonnet_fmt_fail_silently = 1
|
||||||
|
endif
|
||||||
|
|
||||||
|
|
||||||
|
" System runs a shell command. It will reset the shell to /bin/sh for Unix-like
|
||||||
|
" systems if it is executable.
|
||||||
|
function! jsonnet#System(str, ...)
|
||||||
|
let l:shell = &shell
|
||||||
|
if executable('/bin/sh')
|
||||||
|
let &shell = '/bin/sh'
|
||||||
|
endif
|
||||||
|
|
||||||
|
try
|
||||||
|
let l:output = call("system", [a:str] + a:000)
|
||||||
|
return l:output
|
||||||
|
finally
|
||||||
|
let &shell = l:shell
|
||||||
|
endtry
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
|
||||||
|
" CheckBinPath checks whether the given binary exists or not and returns the
|
||||||
|
" path of the binary. It returns an empty string if it doesn't exists.
|
||||||
|
function! jsonnet#CheckBinPath(binName)
|
||||||
|
|
||||||
|
if executable(a:binName)
|
||||||
|
if exists('*exepath')
|
||||||
|
let binPath = exepath(a:binName)
|
||||||
|
return binPath
|
||||||
|
else
|
||||||
|
return a:binName
|
||||||
|
endif
|
||||||
|
else
|
||||||
|
echo "vim-jsonnet: could not find '" . a:binName . "'."
|
||||||
|
return ""
|
||||||
|
endif
|
||||||
|
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" Format calls `jsonnetfmt ... ` on the file and replaces the file with the
|
||||||
|
" auto formatted version. Does some primitive error checking of the
|
||||||
|
" jsonnetfmt command too.
|
||||||
|
function! jsonnet#Format()
|
||||||
|
|
||||||
|
" Save cursor position and many other things.
|
||||||
|
let l:curw = winsaveview()
|
||||||
|
|
||||||
|
" Write current unsaved buffer to a temp file
|
||||||
|
let l:tmpname = tempname()
|
||||||
|
call writefile(getline(1, '$'), l:tmpname)
|
||||||
|
|
||||||
|
" get the command first so we can test it
|
||||||
|
let l:binName = g:jsonnet_fmt_command
|
||||||
|
|
||||||
|
" check if the user has installed command binary.
|
||||||
|
let l:binPath = jsonnet#CheckBinPath(l:binName)
|
||||||
|
if empty(l:binPath)
|
||||||
|
return
|
||||||
|
endif
|
||||||
|
|
||||||
|
|
||||||
|
" Populate the final command.
|
||||||
|
let l:command = l:binPath
|
||||||
|
" The inplace modification is default. Makes file management easier
|
||||||
|
let l:command = l:command . ' -i '
|
||||||
|
let l:command = l:command . g:jsonnet_fmt_options
|
||||||
|
|
||||||
|
" Execute the compiled jsonnetfmt command and save the return value
|
||||||
|
let l:out = jsonnet#System(l:command . " " . l:tmpname)
|
||||||
|
let l:errorCode = v:shell_error
|
||||||
|
|
||||||
|
if l:errorCode == 0
|
||||||
|
" The format command succeeded Move the formatted temp file over the
|
||||||
|
" current file and restore other settings
|
||||||
|
|
||||||
|
" stop undo recording
|
||||||
|
try | silent undojoin | catch | endtry
|
||||||
|
|
||||||
|
let l:originalFileFormat = &fileformat
|
||||||
|
if exists("*getfperm")
|
||||||
|
" save old file permissions
|
||||||
|
let l:originalFPerm = getfperm(expand('%'))
|
||||||
|
endif
|
||||||
|
" Overwrite current file with the formatted temp file
|
||||||
|
call rename(l:tmpname, expand('%'))
|
||||||
|
|
||||||
|
if exists("*setfperm") && l:originalFPerm != ''
|
||||||
|
call setfperm(expand('%'), l:originalFPerm)
|
||||||
|
endif
|
||||||
|
" the file has been changed outside of vim, enable reedit
|
||||||
|
silent edit!
|
||||||
|
let &fileformat = l:originalFileFormat
|
||||||
|
let &syntax = &syntax
|
||||||
|
elseif g:jsonnet_fmt_fail_silently == 0
|
||||||
|
" FixMe: We could leverage the errors coming from the `jsonnetfmt` and
|
||||||
|
" give immediate feedback to the user at every save time.
|
||||||
|
" Our inspiration, vim-go, opens a new list below the current edit
|
||||||
|
" window and shows the errors (the output of the fmt command).
|
||||||
|
" We are not sure whether this is desired in the vim-jsonnet community
|
||||||
|
" or not. Nevertheless, this else block is a suitable place to benefit
|
||||||
|
" from the `jsonnetfmt` errors.
|
||||||
|
endif
|
||||||
|
|
||||||
|
" Restore our cursor/windows positions.
|
||||||
|
call winrestview(l:curw)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
endif
|
||||||
@@ -1,20 +1,20 @@
|
|||||||
if !exists('g:polyglot_disabled') || !(index(g:polyglot_disabled, 'typescript') != -1 || index(g:polyglot_disabled, 'typescript') != -1 || index(g:polyglot_disabled, 'jsx') != -1)
|
if !exists('g:polyglot_disabled') || !(index(g:polyglot_disabled, 'typescript') != -1 || index(g:polyglot_disabled, 'typescript') != -1 || index(g:polyglot_disabled, 'jsx') != -1)
|
||||||
|
|
||||||
function! jsx_pretty#comment#update_commentstring(original)
|
function! jsx_pretty#comment#update_commentstring(original)
|
||||||
let syn_current = s:syn_name(line('.'), col('.'))
|
let line = getline(".")
|
||||||
let syn_start = s:syn_name(line('.'), 1)
|
let col = col('.')
|
||||||
|
if line !~# '^\s*$' && line[: col - 1] =~# '^\s*$' " skip indent
|
||||||
|
let col = indent('.') + 1
|
||||||
|
endif
|
||||||
|
let syn_start = s:syn_name(line('.'), col)
|
||||||
let save_cursor = getcurpos()
|
let save_cursor = getcurpos()
|
||||||
|
|
||||||
if syn_start =~? '^jsx'
|
if syn_start =~? '^jsx'
|
||||||
let line = getline(".")
|
|
||||||
let start = len(matchstr(line, '^\s*'))
|
|
||||||
let syn_name = s:syn_name(line('.'), start + 1)
|
|
||||||
|
|
||||||
if line =~ '^\s*//'
|
if line =~ '^\s*//'
|
||||||
let &l:commentstring = '// %s'
|
let &l:commentstring = '// %s'
|
||||||
elseif s:syn_contains(line('.'), col('.'), 'jsxTaggedRegion')
|
elseif s:syn_contains(line('.'), col, 'jsxTaggedRegion')
|
||||||
let &l:commentstring = '<!-- %s -->'
|
let &l:commentstring = '<!-- %s -->'
|
||||||
elseif syn_name =~? '^jsxAttrib'
|
elseif syn_start =~? '^jsxAttrib'
|
||||||
let &l:commentstring = '// %s'
|
let &l:commentstring = '// %s'
|
||||||
else
|
else
|
||||||
let &l:commentstring = '{/* %s */}'
|
let &l:commentstring = '{/* %s */}'
|
||||||
|
|||||||
@@ -70,9 +70,9 @@ function s:is_jsx_element(syntax)
|
|||||||
return a:syntax =~? 'jsxElement'
|
return a:syntax =~? 'jsxElement'
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
" Whether the specified syntax group is the jsxEscapeJs
|
" Whether the specified syntax group is the jsxExpressionBlock
|
||||||
function s:is_jsx_escape(syntax)
|
function s:is_jsx_expression(syntax)
|
||||||
return a:syntax =~? 'jsxEscapeJs'
|
return a:syntax =~? 'jsxExpressionBlock'
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
" Whether the specified syntax group is the jsxBraces
|
" Whether the specified syntax group is the jsxBraces
|
||||||
@@ -191,7 +191,7 @@ endfunction
|
|||||||
" - jsxRegion
|
" - jsxRegion
|
||||||
" - jsxTaggedRegion
|
" - jsxTaggedRegion
|
||||||
" - jsxElement
|
" - jsxElement
|
||||||
" - jsxEscapeJs
|
" - jsxExpressionBlock
|
||||||
" - Other
|
" - Other
|
||||||
function s:syntax_context(lnum)
|
function s:syntax_context(lnum)
|
||||||
let start_col = s:start_col(a:lnum)
|
let start_col = s:start_col(a:lnum)
|
||||||
@@ -201,9 +201,9 @@ function s:syntax_context(lnum)
|
|||||||
let i = 0
|
let i = 0
|
||||||
|
|
||||||
for syntax_name in reversed
|
for syntax_name in reversed
|
||||||
" If the current line is jsxEscapeJs and not starts with jsxBraces
|
" If the current line is jsxExpressionBlock and not starts with jsxBraces
|
||||||
if s:is_jsx_escape(syntax_name)
|
if s:is_jsx_expression(syntax_name)
|
||||||
return 'jsxEscapeJs'
|
return 'jsxExpressionBlock'
|
||||||
endif
|
endif
|
||||||
|
|
||||||
if s:is_jsx_region(syntax_name)
|
if s:is_jsx_region(syntax_name)
|
||||||
@@ -287,7 +287,7 @@ function! jsx_pretty#indent#get(js_indent)
|
|||||||
endif
|
endif
|
||||||
|
|
||||||
return s:jsx_indent_element(v:lnum)
|
return s:jsx_indent_element(v:lnum)
|
||||||
elseif syntax_context == 'jsxEscapeJs'
|
elseif syntax_context == 'jsxExpressionBlock'
|
||||||
let prev_lnum = s:prev_lnum(v:lnum)
|
let prev_lnum = s:prev_lnum(v:lnum)
|
||||||
let prev_line = s:trim(getline(prev_lnum))
|
let prev_line = s:trim(getline(prev_lnum))
|
||||||
|
|
||||||
|
|||||||
@@ -1,30 +1,11 @@
|
|||||||
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'julia') == -1
|
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'julia') == -1
|
||||||
|
|
||||||
function! julia#set_syntax_version(jvers)
|
function! julia#set_syntax_version(jvers)
|
||||||
if &filetype != "julia"
|
echo "The julia#set_syntax_version function is deprecated"
|
||||||
echo "Not a Julia file"
|
|
||||||
return
|
|
||||||
endif
|
|
||||||
syntax clear
|
|
||||||
let b:julia_syntax_version = a:jvers
|
|
||||||
set filetype=julia
|
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! julia#toggle_deprecated_syntax()
|
function! julia#toggle_deprecated_syntax()
|
||||||
if &filetype != "julia"
|
echo "The julia#toggle_deprecated_syntax function is deprecated"
|
||||||
echo "Not a Julia file"
|
|
||||||
return
|
|
||||||
endif
|
|
||||||
syntax clear
|
|
||||||
let hd = get(b:, "julia_syntax_highlight_deprecated",
|
|
||||||
\ get(g:, "julia_syntax_highlight_deprecated", 0))
|
|
||||||
let b:julia_syntax_highlight_deprecated = hd ? 0 : 1
|
|
||||||
set filetype=julia
|
|
||||||
if b:julia_syntax_highlight_deprecated
|
|
||||||
echo "Highlighting of deprecated syntax enabled"
|
|
||||||
else
|
|
||||||
echo "Highlighting of deprecated syntax disabled"
|
|
||||||
endif
|
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
if exists("loaded_matchit")
|
if exists("loaded_matchit")
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'julia') == -1
|
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'julia') == -1
|
||||||
|
|
||||||
" This file is autogenerated from the script 'generate_latex_symbols_table.jl'
|
" This file is autogenerated from the script 'generate_latex_symbols_table.jl'
|
||||||
" The symbols are based on Julia version 1.3.0-DEV.263
|
" The symbols are based on Julia version 1.5.0-DEV.67
|
||||||
|
|
||||||
scriptencoding utf-8
|
scriptencoding utf-8
|
||||||
|
|
||||||
@@ -658,7 +658,9 @@ function! julia_latex_symbols#get_dict()
|
|||||||
\ '\nequiv': '≢',
|
\ '\nequiv': '≢',
|
||||||
\ '\Equiv': '≣',
|
\ '\Equiv': '≣',
|
||||||
\ '\le': '≤',
|
\ '\le': '≤',
|
||||||
|
\ '\leq': '≤',
|
||||||
\ '\ge': '≥',
|
\ '\ge': '≥',
|
||||||
|
\ '\geq': '≥',
|
||||||
\ '\leqq': '≦',
|
\ '\leqq': '≦',
|
||||||
\ '\geqq': '≧',
|
\ '\geqq': '≧',
|
||||||
\ '\lneqq': '≨',
|
\ '\lneqq': '≨',
|
||||||
|
|||||||
36
autoload/requirements.vim
Normal file
36
autoload/requirements.vim
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'requirements') == -1
|
||||||
|
|
||||||
|
" the Requirements File Format syntax support for Vim
|
||||||
|
" Version: 1.5.3
|
||||||
|
" Author: raimon <raimon49@hotmail.com>
|
||||||
|
" License: MIT LICENSE
|
||||||
|
" The MIT License (MIT)
|
||||||
|
"
|
||||||
|
" Copyright (c) 2015 raimon
|
||||||
|
"
|
||||||
|
" Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
" of this software and associated documentation files (the "Software"), to deal
|
||||||
|
" in the Software without restriction, including without limitation the rights
|
||||||
|
" to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
" copies of the Software, and to permit persons to whom the Software is
|
||||||
|
" furnished to do so, subject to the following conditions:
|
||||||
|
"
|
||||||
|
" The above copyright notice and this permission notice shall be included in all
|
||||||
|
" copies or substantial portions of the Software.
|
||||||
|
"
|
||||||
|
" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
" IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
" FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
" AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
" LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
" OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
" SOFTWARE.
|
||||||
|
|
||||||
|
let s:save_cpo = &cpo
|
||||||
|
set cpo&vim
|
||||||
|
|
||||||
|
let &cpo = s:save_cpo
|
||||||
|
unlet s:save_cpo
|
||||||
|
" vim: et sw=4 ts=4 sts=4:
|
||||||
|
|
||||||
|
endif
|
||||||
@@ -502,13 +502,8 @@ class VimRubyCompletion
|
|||||||
return if rails_base == nil
|
return if rails_base == nil
|
||||||
$:.push rails_base unless $:.index( rails_base )
|
$:.push rails_base unless $:.index( rails_base )
|
||||||
|
|
||||||
rails_config = rails_base + "config/"
|
bootfile = rails_base + "config/boot.rb"
|
||||||
rails_lib = rails_base + "lib/"
|
envfile = rails_base + "config/environment.rb"
|
||||||
$:.push rails_config unless $:.index( rails_config )
|
|
||||||
$:.push rails_lib unless $:.index( rails_lib )
|
|
||||||
|
|
||||||
bootfile = rails_config + "boot.rb"
|
|
||||||
envfile = rails_config + "environment.rb"
|
|
||||||
if File.exists?( bootfile ) && File.exists?( envfile )
|
if File.exists?( bootfile ) && File.exists?( envfile )
|
||||||
begin
|
begin
|
||||||
require bootfile
|
require bootfile
|
||||||
|
|||||||
@@ -501,7 +501,15 @@ function! s:SearchTestFunctionNameUnderCursor() abort
|
|||||||
|
|
||||||
" Search the end of test function (closing brace) to ensure that the
|
" Search the end of test function (closing brace) to ensure that the
|
||||||
" cursor position is within function definition
|
" cursor position is within function definition
|
||||||
normal! %
|
if maparg('<Plug>(MatchitNormalForward)') ==# ''
|
||||||
|
keepjumps normal! %
|
||||||
|
else
|
||||||
|
" Prefer matchit.vim official plugin to native % since the plugin
|
||||||
|
" provides better behavior than original % (#391)
|
||||||
|
" To load the plugin, run:
|
||||||
|
" :packadd matchit
|
||||||
|
execute 'keepjumps' 'normal' "\<Plug>(MatchitNormalForward)"
|
||||||
|
endif
|
||||||
if line('.') < cursor_line
|
if line('.') < cursor_line
|
||||||
return ''
|
return ''
|
||||||
endif
|
endif
|
||||||
@@ -543,21 +551,20 @@ function! rust#Test(mods, winsize, all, options) abort
|
|||||||
let saved = getpos('.')
|
let saved = getpos('.')
|
||||||
try
|
try
|
||||||
let func_name = s:SearchTestFunctionNameUnderCursor()
|
let func_name = s:SearchTestFunctionNameUnderCursor()
|
||||||
if func_name ==# ''
|
|
||||||
echohl ErrorMsg
|
|
||||||
echomsg 'No test function was found under the cursor. Please add ! to command if you want to run all tests'
|
|
||||||
echohl None
|
|
||||||
return
|
|
||||||
endif
|
|
||||||
if a:options ==# ''
|
|
||||||
execute cmd . 'cargo test --manifest-path' manifest func_name
|
|
||||||
else
|
|
||||||
execute cmd . 'cargo test --manifest-path' manifest func_name a:options
|
|
||||||
endif
|
|
||||||
return
|
|
||||||
finally
|
finally
|
||||||
call setpos('.', saved)
|
call setpos('.', saved)
|
||||||
endtry
|
endtry
|
||||||
|
if func_name ==# ''
|
||||||
|
echohl ErrorMsg
|
||||||
|
echomsg 'No test function was found under the cursor. Please add ! to command if you want to run all tests'
|
||||||
|
echohl None
|
||||||
|
return
|
||||||
|
endif
|
||||||
|
if a:options ==# ''
|
||||||
|
execute cmd . 'cargo test --manifest-path' manifest func_name
|
||||||
|
else
|
||||||
|
execute cmd . 'cargo test --manifest-path' manifest func_name a:options
|
||||||
|
endif
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
" }}}1
|
" }}}1
|
||||||
|
|||||||
@@ -62,18 +62,19 @@ function! s:RustfmtWriteMode()
|
|||||||
endif
|
endif
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! s:RustfmtConfig()
|
function! s:RustfmtConfigOptions()
|
||||||
let l:rustfmt_toml = findfile('rustfmt.toml', expand('%:p:h') . ';')
|
let l:rustfmt_toml = findfile('rustfmt.toml', expand('%:p:h') . ';')
|
||||||
if l:rustfmt_toml !=# ''
|
if l:rustfmt_toml !=# ''
|
||||||
return '--config-path '.l:rustfmt_toml
|
return '--config-path '.fnamemodify(l:rustfmt_toml, ":p")
|
||||||
endif
|
endif
|
||||||
|
|
||||||
let l:_rustfmt_toml = findfile('.rustfmt.toml', expand('%:p:h') . ';')
|
let l:_rustfmt_toml = findfile('.rustfmt.toml', expand('%:p:h') . ';')
|
||||||
if l:_rustfmt_toml !=# ''
|
if l:_rustfmt_toml !=# ''
|
||||||
return '--config-path '.l:_rustfmt_toml
|
return '--config-path '.fnamemodify(l:_rustfmt_toml, ":p")
|
||||||
endif
|
endif
|
||||||
|
|
||||||
return ''
|
" Default to edition 2018 in case no rustfmt.toml was found.
|
||||||
|
return '--edition 2018'
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! s:RustfmtCommandRange(filename, line1, line2)
|
function! s:RustfmtCommandRange(filename, line1, line2)
|
||||||
@@ -84,7 +85,7 @@ function! s:RustfmtCommandRange(filename, line1, line2)
|
|||||||
|
|
||||||
let l:arg = {"file": shellescape(a:filename), "range": [a:line1, a:line2]}
|
let l:arg = {"file": shellescape(a:filename), "range": [a:line1, a:line2]}
|
||||||
let l:write_mode = s:RustfmtWriteMode()
|
let l:write_mode = s:RustfmtWriteMode()
|
||||||
let l:rustfmt_config = s:RustfmtConfig()
|
let l:rustfmt_config = s:RustfmtConfigOptions()
|
||||||
|
|
||||||
" FIXME: When --file-lines gets to be stable, add version range checking
|
" FIXME: When --file-lines gets to be stable, add version range checking
|
||||||
" accordingly.
|
" accordingly.
|
||||||
@@ -98,14 +99,9 @@ function! s:RustfmtCommandRange(filename, line1, line2)
|
|||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! s:RustfmtCommand()
|
function! s:RustfmtCommand()
|
||||||
if g:rustfmt_emit_files
|
let write_mode = g:rustfmt_emit_files ? '--emit=stdout' : '--write-mode=display'
|
||||||
let l:write_mode = "--emit=stdout"
|
let config = s:RustfmtConfigOptions()
|
||||||
else
|
return join([g:rustfmt_command, write_mode, config, g:rustfmt_options])
|
||||||
let l:write_mode = "--write-mode=display"
|
|
||||||
endif
|
|
||||||
" rustfmt will pick on the right config on its own due to the
|
|
||||||
" current directory change.
|
|
||||||
return g:rustfmt_command . " ". l:write_mode . " " . g:rustfmt_options
|
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! s:DeleteLines(start, end) abort
|
function! s:DeleteLines(start, end) abort
|
||||||
|
|||||||
@@ -1,26 +1,39 @@
|
|||||||
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'terraform') == -1
|
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'terraform') == -1
|
||||||
|
|
||||||
|
let s:cpo_save = &cpoptions
|
||||||
|
set cpoptions&vim
|
||||||
|
|
||||||
" Ensure no conflict with arguments from the environment
|
" Ensure no conflict with arguments from the environment
|
||||||
let $TF_CLI_ARGS_fmt=''
|
let $TF_CLI_ARGS_fmt=''
|
||||||
|
|
||||||
function! terraform#fmt()
|
function! terraform#fmt() abort
|
||||||
if !filereadable(expand('%:p'))
|
" Save the view.
|
||||||
return
|
let curw = winsaveview()
|
||||||
endif
|
|
||||||
let l:curw = winsaveview()
|
|
||||||
" Make a fake change so that the undo point is right.
|
" Make a fake change so that the undo point is right.
|
||||||
normal! ix
|
normal! ix
|
||||||
normal! "_x
|
normal! "_x
|
||||||
|
|
||||||
|
" Execute `terraform fmt`, redirecting stderr to a temporary file.
|
||||||
|
let tmpfile = tempname()
|
||||||
|
let shellredir_save = &shellredir
|
||||||
|
let &shellredir = '>%s 2>'.tmpfile
|
||||||
silent execute '%!terraform fmt -no-color -'
|
silent execute '%!terraform fmt -no-color -'
|
||||||
|
let &shellredir = shellredir_save
|
||||||
|
|
||||||
|
" If there was an error, undo any changes and show stderr.
|
||||||
if v:shell_error != 0
|
if v:shell_error != 0
|
||||||
let output = getline(1, '$')
|
|
||||||
silent undo
|
silent undo
|
||||||
|
let output = readfile(tmpfile)
|
||||||
echo join(output, "\n")
|
echo join(output, "\n")
|
||||||
endif
|
endif
|
||||||
call winrestview(l:curw)
|
|
||||||
|
" Delete the temporary file, and restore the view.
|
||||||
|
call delete(tmpfile)
|
||||||
|
call winrestview(curw)
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! terraform#align()
|
function! terraform#align() abort
|
||||||
let p = '^.*=[^>]*$'
|
let p = '^.*=[^>]*$'
|
||||||
if exists(':Tabularize') && getline('.') =~# '^.*=' && (getline(line('.')-1) =~# p || getline(line('.')+1) =~# p)
|
if exists(':Tabularize') && getline('.') =~# '^.*=' && (getline(line('.')-1) =~# p || getline(line('.')+1) =~# p)
|
||||||
let column = strlen(substitute(getline('.')[0:col('.')],'[^=]','','g'))
|
let column = strlen(substitute(getline('.')[0:col('.')],'[^=]','','g'))
|
||||||
@@ -31,8 +44,8 @@ function! terraform#align()
|
|||||||
endif
|
endif
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! terraform#commands(ArgLead, CmdLine, CursorPos)
|
function! terraform#commands(ArgLead, CmdLine, CursorPos) abort
|
||||||
let l:commands = [
|
let commands = [
|
||||||
\ 'apply',
|
\ 'apply',
|
||||||
\ 'console',
|
\ 'console',
|
||||||
\ 'destroy',
|
\ 'destroy',
|
||||||
@@ -42,6 +55,8 @@ function! terraform#commands(ArgLead, CmdLine, CursorPos)
|
|||||||
\ 'graph',
|
\ 'graph',
|
||||||
\ 'import',
|
\ 'import',
|
||||||
\ 'init',
|
\ 'init',
|
||||||
|
\ 'login',
|
||||||
|
\ 'logout',
|
||||||
\ 'output',
|
\ 'output',
|
||||||
\ 'plan',
|
\ 'plan',
|
||||||
\ 'providers',
|
\ 'providers',
|
||||||
@@ -58,7 +73,10 @@ function! terraform#commands(ArgLead, CmdLine, CursorPos)
|
|||||||
\ 'push',
|
\ 'push',
|
||||||
\ 'state'
|
\ 'state'
|
||||||
\ ]
|
\ ]
|
||||||
return join(l:commands, "\n")
|
return join(commands, "\n")
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
|
let &cpoptions = s:cpo_save
|
||||||
|
unlet s:cpo_save
|
||||||
|
|
||||||
endif
|
endif
|
||||||
|
|||||||
@@ -10,8 +10,6 @@ execute join(['function! vital#_crystal#ColorEcho#import() abort', printf("retur
|
|||||||
delfunction s:_SID
|
delfunction s:_SID
|
||||||
" ___vital___
|
" ___vital___
|
||||||
scriptencoding utf-8
|
scriptencoding utf-8
|
||||||
let s:save_cpo = &cpo
|
|
||||||
set cpo&vim
|
|
||||||
|
|
||||||
function! s:_is_available() abort
|
function! s:_is_available() abort
|
||||||
if has('gui_running')
|
if has('gui_running')
|
||||||
@@ -185,7 +183,4 @@ function! s:echo(str) abort
|
|||||||
call echorizer.echo()
|
call echorizer.echo()
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
let &cpo = s:save_cpo
|
|
||||||
unlet s:save_cpo
|
|
||||||
|
|
||||||
endif
|
endif
|
||||||
|
|||||||
@@ -11,9 +11,6 @@ delfunction s:_SID
|
|||||||
" ___vital___
|
" ___vital___
|
||||||
" Utilities for list.
|
" Utilities for list.
|
||||||
|
|
||||||
let s:save_cpo = &cpo
|
|
||||||
set cpo&vim
|
|
||||||
|
|
||||||
function! s:pop(list) abort
|
function! s:pop(list) abort
|
||||||
return remove(a:list, -1)
|
return remove(a:list, -1)
|
||||||
endfunction
|
endfunction
|
||||||
@@ -460,9 +457,6 @@ function! s:combinations(list, r) abort
|
|||||||
return result
|
return result
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
let &cpo = s:save_cpo
|
|
||||||
unlet s:save_cpo
|
|
||||||
|
|
||||||
" vim:set et ts=2 sts=2 sw=2 tw=0:
|
" vim:set et ts=2 sts=2 sw=2 tw=0:
|
||||||
|
|
||||||
endif
|
endif
|
||||||
|
|||||||
@@ -11,9 +11,6 @@ delfunction s:_SID
|
|||||||
" ___vital___
|
" ___vital___
|
||||||
" Utilities for string.
|
" Utilities for string.
|
||||||
|
|
||||||
let s:save_cpo = &cpo
|
|
||||||
set cpo&vim
|
|
||||||
|
|
||||||
function! s:_vital_loaded(V) abort
|
function! s:_vital_loaded(V) abort
|
||||||
let s:V = a:V
|
let s:V = a:V
|
||||||
let s:L = s:V.import('Data.List')
|
let s:L = s:V.import('Data.List')
|
||||||
@@ -624,8 +621,6 @@ function! s:split_posix_text(text, ...) abort
|
|||||||
return split(text, newline, 1)
|
return split(text, newline, 1)
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
let &cpo = s:save_cpo
|
|
||||||
unlet s:save_cpo
|
|
||||||
" vim:set et ts=2 sts=2 sw=2 tw=0:
|
" vim:set et ts=2 sts=2 sw=2 tw=0:
|
||||||
|
|
||||||
endif
|
endif
|
||||||
|
|||||||
@@ -15,9 +15,6 @@ delfunction s:_SID
|
|||||||
" FIXME: This module name should be Vital.System ?
|
" FIXME: This module name should be Vital.System ?
|
||||||
" But the name has been already taken.
|
" 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.
|
" FIXME: Unfortunately, can't use s:_vital_loaded() for this purpose.
|
||||||
" Because these variables are used when this script file is loaded.
|
" Because these variables are used when this script file is loaded.
|
||||||
@@ -169,9 +166,6 @@ else
|
|||||||
endif
|
endif
|
||||||
|
|
||||||
|
|
||||||
let &cpo = s:save_cpo
|
|
||||||
unlet s:save_cpo
|
|
||||||
|
|
||||||
" vim:set et ts=2 sts=2 sw=2 tw=0:
|
" vim:set et ts=2 sts=2 sw=2 tw=0:
|
||||||
|
|
||||||
endif
|
endif
|
||||||
|
|||||||
@@ -9,8 +9,6 @@ endfunction
|
|||||||
execute join(['function! vital#_crystal#Web#JSON#import() abort', printf("return map({'decode': '', '_vital_depends': '', '_vital_created': '', 'encode': '', '_vital_loaded': ''}, \"vital#_crystal#function('<SNR>%s_' . v:key)\")", s:_SID()), 'endfunction'], "\n")
|
execute join(['function! vital#_crystal#Web#JSON#import() abort', printf("return map({'decode': '', '_vital_depends': '', '_vital_created': '', 'encode': '', '_vital_loaded': ''}, \"vital#_crystal#function('<SNR>%s_' . v:key)\")", s:_SID()), 'endfunction'], "\n")
|
||||||
delfunction s:_SID
|
delfunction s:_SID
|
||||||
" ___vital___
|
" ___vital___
|
||||||
let s:save_cpo = &cpo
|
|
||||||
set cpo&vim
|
|
||||||
|
|
||||||
function! s:_true() abort
|
function! s:_true() abort
|
||||||
return 1
|
return 1
|
||||||
@@ -174,9 +172,6 @@ function! s:_encode_dict(val, settings) abort
|
|||||||
endfunction
|
endfunction
|
||||||
" @vimlint(EVL102, 0, l:ns)
|
" @vimlint(EVL102, 0, l:ns)
|
||||||
|
|
||||||
let &cpo = s:save_cpo
|
|
||||||
unlet s:save_cpo
|
|
||||||
|
|
||||||
" vim:set et ts=2 sts=2 sw=2 tw=0:
|
" vim:set et ts=2 sts=2 sw=2 tw=0:
|
||||||
|
|
||||||
endif
|
endif
|
||||||
|
|||||||
@@ -131,6 +131,7 @@ let attributes_value = {
|
|||||||
\ 'label': ['Text', ''],
|
\ 'label': ['Text', ''],
|
||||||
\ 'lang': ['Lang Tag', ''],
|
\ 'lang': ['Lang Tag', ''],
|
||||||
\ 'list': ['ID', ''],
|
\ 'list': ['ID', ''],
|
||||||
|
\ 'loading': ['eager/lazy', ''],
|
||||||
\ 'loop': ['Bool', ''],
|
\ 'loop': ['Bool', ''],
|
||||||
\ 'low': ['Number', ''],
|
\ 'low': ['Number', ''],
|
||||||
\ 'manifest': ['URL', ''],
|
\ 'manifest': ['URL', ''],
|
||||||
@@ -588,11 +589,11 @@ let g:xmldata_html5 = {
|
|||||||
\ ],
|
\ ],
|
||||||
\ 'iframe': [
|
\ 'iframe': [
|
||||||
\ [],
|
\ [],
|
||||||
\ extend(copy(global_attributes), {'src': [], 'srcdoc': [], 'name': [], 'width': [], 'height': [], 'sandbox': ['allow-same-origin', 'allow-forms', 'allow-scripts'], 'seamless': ['seamless', ''], 'referrerpolicy': referrerpolicy, 'allowfullscreen': [], 'allowpaymentrequest': [], 'allowpresentation': [], 'allowusermedia': []})
|
\ extend(copy(global_attributes), {'src': [], 'srcdoc': [], 'name': [], 'width': [], 'height': [], 'sandbox': ['allow-same-origin', 'allow-forms', 'allow-scripts'], 'seamless': ['seamless', ''], 'referrerpolicy': referrerpolicy, 'allowfullscreen': [], 'allowpaymentrequest': [], 'allowpresentation': [], 'allowusermedia': [], 'loading': ['eager', 'lazy']})
|
||||||
\ ],
|
\ ],
|
||||||
\ 'img': [
|
\ 'img': [
|
||||||
\ [],
|
\ [],
|
||||||
\ extend(copy(global_attributes), {'src': [], 'alt': [], 'height': [], 'width': [], 'decoding': ['async', 'sync', 'auto'], 'usemap': [], 'ismap': ['ismap', ''], 'referrerpolicy': referrerpolicy, 'crossorigin': ['anonymous', 'use-credentials']})
|
\ extend(copy(global_attributes), {'src': [], 'alt': [], 'height': [], 'width': [], 'decoding': ['async', 'sync', 'auto'], 'usemap': [], 'ismap': ['ismap', ''], 'referrerpolicy': referrerpolicy, 'crossorigin': ['anonymous', 'use-credentials'], 'loading': ['eager', 'lazy']})
|
||||||
\ ],
|
\ ],
|
||||||
\ 'input': [
|
\ 'input': [
|
||||||
\ [],
|
\ [],
|
||||||
|
|||||||
82
build
82
build
@@ -1,12 +1,12 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
set -E
|
set -eo pipefail
|
||||||
|
|
||||||
DIRS="syntax indent compiler autoload ftplugin after/syntax after/indent after/ftplugin"
|
DIRS="syntax indent compiler autoload ftplugin ctags after/syntax after/indent after/ftplugin"
|
||||||
# shellcheck disable=SC2034
|
# shellcheck disable=SC2034
|
||||||
DIRS_BASIC="syntax compiler indent after/syntax after/indent"
|
DIRS_BASIC="syntax compiler indent after/syntax after/indent"
|
||||||
# shellcheck disable=SC2034
|
# shellcheck disable=SC2034
|
||||||
DIRS_ALL="syntax indent compiler autoload ftplugin after extras"
|
DIRS_ALL="syntax indent compiler autoload ftplugin after extras ctags"
|
||||||
# shellcheck disable=SC2034
|
# shellcheck disable=SC2034
|
||||||
DIRS_SYNTAX="syntax indent after/syntax after/indent"
|
DIRS_SYNTAX="syntax indent after/syntax after/indent"
|
||||||
# shellcheck disable=SC2034
|
# shellcheck disable=SC2034
|
||||||
@@ -28,7 +28,7 @@ download() {
|
|||||||
repo="$(awk -F\# '{print $1}' <<<"$path")"
|
repo="$(awk -F\# '{print $1}' <<<"$path")"
|
||||||
branch="$(awk -F\# '{print $2}' <<<"$path")"
|
branch="$(awk -F\# '{print $2}' <<<"$path")"
|
||||||
rm -rf "$dir"
|
rm -rf "$dir"
|
||||||
(mkdir -p "$dir" && curl --silent -L "https://codeload.github.com/$repo/tar.gz/${branch:-master}" | tar -zx -C "$dir" --strip 1 && printf '.') &
|
(mkdir -p "$dir" && curl --silent -fL "https://codeload.github.com/$repo/tar.gz/${branch:-master}" | tar -zx -C "$dir" --strip 1 && printf '.' || echo "Failed to download: $repo") &
|
||||||
done
|
done
|
||||||
|
|
||||||
wait
|
wait
|
||||||
@@ -37,8 +37,6 @@ download() {
|
|||||||
extract() {
|
extract() {
|
||||||
echo
|
echo
|
||||||
|
|
||||||
cat config.vim >> tmp/polyglot.vim
|
|
||||||
|
|
||||||
for pack in $1; do
|
for pack in $1; do
|
||||||
name="$(cut -d ':' -f 1 <<<"$pack")"
|
name="$(cut -d ':' -f 1 <<<"$pack")"
|
||||||
path="$(cut -d ':' -f 2 <<<"$pack")"
|
path="$(cut -d ':' -f 2 <<<"$pack")"
|
||||||
@@ -66,28 +64,8 @@ extract() {
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
output "${subdirs##, })"$'\n'
|
output "${subdirs##, })"$'\n'
|
||||||
|
|
||||||
if (echo "julia coffee-script elixir fish git plantuml scala swift jinja" | grep -qF "$name"); then
|
|
||||||
echo "Skipping ftdetect installation of $name" >&2
|
|
||||||
continue
|
|
||||||
fi
|
|
||||||
|
|
||||||
[ -d "${dir}${subtree:-/}ftdetect" ] && for f in "${dir}${subtree:-/}ftdetect/"*; do
|
|
||||||
cat <<EOF >> tmp/polyglot.vim
|
|
||||||
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, '${pack%%:*}') == -1
|
|
||||||
augroup filetypedetect
|
|
||||||
" ${pack%%:*}, from ${f##*/ftdetect/} in ${pack#*:}
|
|
||||||
$(cat "${f}")
|
|
||||||
augroup end
|
|
||||||
endif
|
|
||||||
|
|
||||||
EOF
|
|
||||||
done
|
|
||||||
|
|
||||||
done
|
done
|
||||||
|
|
||||||
mv tmp/polyglot.vim ftdetect/
|
|
||||||
|
|
||||||
for pack in $1; do
|
for pack in $1; do
|
||||||
name="$(cut -d ':' -f 1 <<<"$pack")"
|
name="$(cut -d ':' -f 1 <<<"$pack")"
|
||||||
path="$(cut -d ':' -f 2 <<<"$pack")"
|
path="$(cut -d ':' -f 2 <<<"$pack")"
|
||||||
@@ -101,7 +79,7 @@ EOF
|
|||||||
}
|
}
|
||||||
|
|
||||||
copy_dir() {
|
copy_dir() {
|
||||||
find "$1/$2" \( -name '*.vim' -o -name '*.vital' \) -print0 | while read -r -d $'\0' file; do
|
find "$1/$2" \( -name '*.vim' -o -name '*.vital' -o -name '*.ctags' \) -print0 | while read -r -d $'\0' file; do
|
||||||
copy_file "$1" "$file" "$3"
|
copy_file "$1" "$file" "$3"
|
||||||
done
|
done
|
||||||
}
|
}
|
||||||
@@ -124,14 +102,16 @@ copy_file() {
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
mkdir -p "${file_path}"
|
mkdir -p "${file_path}"
|
||||||
touch "$file_in_dst"
|
|
||||||
|
|
||||||
# Use comma instead of / to handle cases like c/c++
|
(
|
||||||
if [[ "${package_name}" == "jsx" ]]; then
|
if [[ "${package_name}" == "jsx" ]]; then
|
||||||
sed -e "s,%%PACK%%,${package_name}," -e "/%%CONTENT%%/{r ${file_in_tmp}" -e "d;}" plugin_guard_jsx.vim.template >> "$file_in_dst"
|
printf "if !exists('g:polyglot_disabled') || !(index(g:polyglot_disabled, 'typescript') != -1 || index(g:polyglot_disabled, 'typescript') != -1 || index(g:polyglot_disabled, 'jsx') != -1)\n\n"
|
||||||
else
|
else
|
||||||
sed -e "s,%%PACK%%,${package_name}," -e "/%%CONTENT%%/{r ${file_in_tmp}" -e "d;}" plugin_guard.vim.template >> "$file_in_dst"
|
printf "if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, '$package_name') == -1\n\n"
|
||||||
fi
|
fi
|
||||||
|
cat "$file_in_tmp"
|
||||||
|
printf "\nendif\n"
|
||||||
|
) >> "$file_in_dst"
|
||||||
}
|
}
|
||||||
|
|
||||||
update_readme() {
|
update_readme() {
|
||||||
@@ -167,6 +147,7 @@ PACKS="
|
|||||||
asciidoc:asciidoc/vim-asciidoc
|
asciidoc:asciidoc/vim-asciidoc
|
||||||
autohotkey:hnamikaw/vim-autohotkey
|
autohotkey:hnamikaw/vim-autohotkey
|
||||||
blade:jwalton512/vim-blade
|
blade:jwalton512/vim-blade
|
||||||
|
brewfile:bfontaine/Brewfile.vim
|
||||||
c++11:octol/vim-cpp-enhanced-highlight
|
c++11:octol/vim-cpp-enhanced-highlight
|
||||||
c/c++:vim-jp/vim-cpp
|
c/c++:vim-jp/vim-cpp
|
||||||
caddyfile:isobit/vim-caddyfile
|
caddyfile:isobit/vim-caddyfile
|
||||||
@@ -186,14 +167,16 @@ PACKS="
|
|||||||
dlang:JesseKPhillips/d.vim
|
dlang:JesseKPhillips/d.vim
|
||||||
dockerfile:ekalinin/Dockerfile.vim
|
dockerfile:ekalinin/Dockerfile.vim
|
||||||
elixir:elixir-lang/vim-elixir
|
elixir:elixir-lang/vim-elixir
|
||||||
elm:ElmCast/elm-vim
|
elm:andys8/vim-elm-syntax
|
||||||
emberscript:yalesov/vim-ember-script
|
emberscript:yalesov/vim-ember-script
|
||||||
emblem:yalesov/vim-emblem
|
emblem:yalesov/vim-emblem
|
||||||
erlang:vim-erlang/vim-erlang-runtime
|
erlang:vim-erlang/vim-erlang-runtime
|
||||||
|
fennel:bakpakin/fennel.vim
|
||||||
ferm:vim-scripts/ferm.vim
|
ferm:vim-scripts/ferm.vim
|
||||||
fish:georgewitteman/vim-fish
|
fish:georgewitteman/vim-fish
|
||||||
flatbuffers:dcharbon/vim-flatbuffers
|
flatbuffers:dcharbon/vim-flatbuffers
|
||||||
fsharp:fsharp/vim-fsharp:_BASIC
|
fsharp:ionide/Ionide-vim:_BASIC
|
||||||
|
gdscript:calviken/vim-gdscript3:_SYNTAX
|
||||||
git:tpope/vim-git
|
git:tpope/vim-git
|
||||||
glsl:tikhomirov/vim-glsl:_NOAFTER
|
glsl:tikhomirov/vim-glsl:_NOAFTER
|
||||||
gmpl:maelvalais/gmpl.vim
|
gmpl:maelvalais/gmpl.vim
|
||||||
@@ -201,10 +184,8 @@ PACKS="
|
|||||||
go:fatih/vim-go:_BASIC
|
go:fatih/vim-go:_BASIC
|
||||||
graphql:jparise/vim-graphql:_ALL
|
graphql:jparise/vim-graphql:_ALL
|
||||||
gradle:tfnico/vim-gradle
|
gradle:tfnico/vim-gradle
|
||||||
groovy:vim-scripts/groovy.vim
|
|
||||||
groovy-indent:vim-scripts/groovyindent-unix
|
|
||||||
haml:sheerun/vim-haml
|
haml:sheerun/vim-haml
|
||||||
handlebars:mustache/vim-mustache-handlebars
|
handlebars:sheerun/vim-mustache-handlebars
|
||||||
haproxy:CH-DanReif/haproxy.vim
|
haproxy:CH-DanReif/haproxy.vim
|
||||||
haskell:neovimhaskell/haskell-vim
|
haskell:neovimhaskell/haskell-vim
|
||||||
haxe:yaymukund/vim-haxe
|
haxe:yaymukund/vim-haxe
|
||||||
@@ -213,19 +194,21 @@ PACKS="
|
|||||||
hive:zebradil/hive.vim
|
hive:zebradil/hive.vim
|
||||||
html5:othree/html5.vim
|
html5:othree/html5.vim
|
||||||
i3:mboughaba/i3config.vim
|
i3:mboughaba/i3config.vim
|
||||||
|
icalenadr:chutzpah/icalendar.vim
|
||||||
idris:idris-hackers/idris-vim
|
idris:idris-hackers/idris-vim
|
||||||
ion:vmchale/ion-vim
|
ion:vmchale/ion-vim
|
||||||
jasmine:glanotte/vim-jasmine
|
|
||||||
javascript:pangloss/vim-javascript:_JAVASCRIPT
|
javascript:pangloss/vim-javascript:_JAVASCRIPT
|
||||||
jenkins:martinda/Jenkinsfile-vim-syntax
|
jenkins:martinda/Jenkinsfile-vim-syntax
|
||||||
jinja:lepture/vim-jinja
|
jinja:lepture/vim-jinja
|
||||||
|
jq:vito-c/jq.vim
|
||||||
json5:GutenYe/json5.vim
|
json5:GutenYe/json5.vim
|
||||||
json:elzr/vim-json
|
json:elzr/vim-json
|
||||||
|
jsonnet:google/vim-jsonnet
|
||||||
jst:briancollins/vim-jst
|
jst:briancollins/vim-jst
|
||||||
jsx:MaxMEllon/vim-jsx-pretty:_ALL
|
jsx:MaxMEllon/vim-jsx-pretty:_ALL
|
||||||
julia:JuliaEditorSupport/julia-vim
|
julia:JuliaEditorSupport/julia-vim
|
||||||
kotlin:udalov/kotlin-vim
|
kotlin:udalov/kotlin-vim
|
||||||
latex:LaTeX-Box-Team/LaTeX-Box
|
ledger:ledger/vim-ledger:_BASIC
|
||||||
less:groenewege/vim-less:_NOAFTER
|
less:groenewege/vim-less:_NOAFTER
|
||||||
lilypond:anowlcalledjosh/vim-lilypond
|
lilypond:anowlcalledjosh/vim-lilypond
|
||||||
livescript:gkz/vim-ls
|
livescript:gkz/vim-ls
|
||||||
@@ -233,7 +216,7 @@ PACKS="
|
|||||||
log:MTDL9/vim-log-highlighting
|
log:MTDL9/vim-log-highlighting
|
||||||
lua:tbastos/vim-lua
|
lua:tbastos/vim-lua
|
||||||
mako:sophacles/vim-bundle-mako
|
mako:sophacles/vim-bundle-mako
|
||||||
markdown:plasticboy/vim-markdown
|
markdown:plasticboy/vim-markdown:_NOAFTER
|
||||||
mathematica:voldikss/vim-mma
|
mathematica:voldikss/vim-mma
|
||||||
mdx:jxnblk/vim-mdx-js
|
mdx:jxnblk/vim-mdx-js
|
||||||
meson:mesonbuild/meson:_ALL:/data/syntax-highlighting/vim/
|
meson:mesonbuild/meson:_ALL:/data/syntax-highlighting/vim/
|
||||||
@@ -263,21 +246,26 @@ PACKS="
|
|||||||
r-lang:vim-scripts/R.vim:_BASIC
|
r-lang:vim-scripts/R.vim:_BASIC
|
||||||
racket:wlangstroth/vim-racket
|
racket:wlangstroth/vim-racket
|
||||||
ragel:jneen/ragel.vim
|
ragel:jneen/ragel.vim
|
||||||
|
raku:Raku/vim-raku
|
||||||
raml:IN3D/vim-raml
|
raml:IN3D/vim-raml
|
||||||
|
razor:adamclerk/vim-razor
|
||||||
reason:reasonml-editor/vim-reason-plus
|
reason:reasonml-editor/vim-reason-plus
|
||||||
rspec:sheerun/rspec.vim
|
requirements:raimon49/requirements.txt.vim
|
||||||
|
rspec:keith/rspec.vim
|
||||||
rst:marshallward/vim-restructuredtext
|
rst:marshallward/vim-restructuredtext
|
||||||
ruby:vim-ruby/vim-ruby
|
ruby:vim-ruby/vim-ruby
|
||||||
rust:rust-lang/rust.vim
|
rust:rust-lang/rust.vim
|
||||||
sbt:derekwyatt/vim-sbt
|
sbt:derekwyatt/vim-sbt
|
||||||
scala:derekwyatt/vim-scala
|
scala:derekwyatt/vim-scala
|
||||||
scss:cakebaker/scss-syntax.vim
|
scss:cakebaker/scss-syntax.vim
|
||||||
|
sh:arzg/vim-sh
|
||||||
slim:slim-template/vim-slim
|
slim:slim-template/vim-slim
|
||||||
slime:slime-lang/vim-slime-syntax
|
slime:slime-lang/vim-slime-syntax
|
||||||
smt2:bohlender/vim-smt2
|
smt2:bohlender/vim-smt2
|
||||||
solidity:tomlion/vim-solidity
|
solidity:tomlion/vim-solidity
|
||||||
|
sql:shmup/vim-sql-syntax
|
||||||
stylus:wavded/vim-stylus
|
stylus:wavded/vim-stylus
|
||||||
svelte:evanleck/vim-svelte
|
svelte:evanleck/vim-svelte#main
|
||||||
svg-indent:jasonshell/vim-svg-indent
|
svg-indent:jasonshell/vim-svg-indent
|
||||||
svg:vim-scripts/svg.vim
|
svg:vim-scripts/svg.vim
|
||||||
swift:keith/swift.vim
|
swift:keith/swift.vim
|
||||||
@@ -292,6 +280,7 @@ PACKS="
|
|||||||
tptp:c-cube/vim-tptp
|
tptp:c-cube/vim-tptp
|
||||||
twig:lumiliet/vim-twig
|
twig:lumiliet/vim-twig
|
||||||
typescript:HerringtonDarkholme/yats.vim
|
typescript:HerringtonDarkholme/yats.vim
|
||||||
|
unison:unisonweb/unison#trunk:_ALL:/editor-support/vim/
|
||||||
v:ollykel/v-vim
|
v:ollykel/v-vim
|
||||||
vala:arrufat/vala.vim
|
vala:arrufat/vala.vim
|
||||||
vbnet:vim-scripts/vbnet.vim
|
vbnet:vim-scripts/vbnet.vim
|
||||||
@@ -306,14 +295,17 @@ PACKS="
|
|||||||
yard:sheerun/vim-yardoc
|
yard:sheerun/vim-yardoc
|
||||||
zephir:xwsoul/vim-zephir
|
zephir:xwsoul/vim-zephir
|
||||||
zig:ziglang/zig.vim
|
zig:ziglang/zig.vim
|
||||||
|
zinit:zinit-zsh/zplugin-vim-syntax
|
||||||
"
|
"
|
||||||
|
|
||||||
|
python3 build.py
|
||||||
|
|
||||||
rm -rf tmp
|
rm -rf tmp
|
||||||
rm -rf "${DIRS_RM[@]}"
|
|
||||||
mkdir tmp
|
mkdir tmp
|
||||||
|
|
||||||
printf "Downloading packs..."
|
printf "Downloading packs..."
|
||||||
download "$(sed '/^#/d' <<<"$PACKS")"
|
download "$(sed '/^#/d' <<<"$PACKS")"
|
||||||
|
rm -rf "${DIRS_RM[@]}"
|
||||||
extract "$(sed '/^#/d' <<<"$PACKS")"
|
extract "$(sed '/^#/d' <<<"$PACKS")"
|
||||||
update_readme
|
update_readme
|
||||||
|
|
||||||
|
|||||||
269
build.py
Executable file
269
build.py
Executable file
@@ -0,0 +1,269 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
|
import yaml
|
||||||
|
import urllib.request as request
|
||||||
|
|
||||||
|
url = 'https://raw.githubusercontent.com/github/linguist/master/lib/linguist/languages.yml'
|
||||||
|
data = yaml.safe_load(request.urlopen(url))
|
||||||
|
|
||||||
|
lines = []
|
||||||
|
|
||||||
|
def language(name,
|
||||||
|
filetype=None,
|
||||||
|
polyglot=None,
|
||||||
|
extensions=None,
|
||||||
|
filenames=None,
|
||||||
|
syntax=None,
|
||||||
|
outer_filetype=None,
|
||||||
|
custom_set=None,
|
||||||
|
compound=False,
|
||||||
|
extra_extensions=[],
|
||||||
|
extra_filenames=[],
|
||||||
|
ignored_extensions=[]
|
||||||
|
):
|
||||||
|
language = data.get(name, {})
|
||||||
|
filetype_name = filetype or name.lower().replace(" ", "")
|
||||||
|
polyglot_name = polyglot or filetype_name
|
||||||
|
lines.append(f"if index(g:polyglot_disabled, '{polyglot_name}') == -1")
|
||||||
|
if syntax != None:
|
||||||
|
syntax = " syntax=" + syntax
|
||||||
|
else:
|
||||||
|
syntax = ""
|
||||||
|
if extensions == None:
|
||||||
|
extensions = language.get("extensions", [])
|
||||||
|
if filenames == None:
|
||||||
|
filenames = language.get("filenames", [])
|
||||||
|
if custom_set == None:
|
||||||
|
custom_set = f"set ft={filetype_name}{syntax}"
|
||||||
|
for ext in sorted(list(set(extensions + extra_extensions) - set(ignored_extensions))):
|
||||||
|
if outer_filetype != None:
|
||||||
|
lines.append(f" au BufNewFile *.*{ext} execute \"do BufNewFile filetypedetect \" . expand(\"<afile>:r\") | {outer_filetype}")
|
||||||
|
lines.append(f" au BufReadPre *.*{ext} execute \"do BufRead filetypedetect \" . expand(\"<afile>:r\") | {outer_filetype}")
|
||||||
|
lines.append(f" au BufNewFile,BufRead *{ext} {custom_set}")
|
||||||
|
for fn in sorted(filenames + extra_filenames):
|
||||||
|
if fn[0] == ".":
|
||||||
|
fn = "{.,}" + fn[1:]
|
||||||
|
lines.append(f" au BufNewFile,BufRead {fn} {custom_set}")
|
||||||
|
lines.append("endif")
|
||||||
|
lines.append("")
|
||||||
|
|
||||||
|
|
||||||
|
lines.append("""" don't spam the user when Vim is started in Vi compatibility mode
|
||||||
|
let s:cpo_save = &cpo
|
||||||
|
set cpo&vim
|
||||||
|
|
||||||
|
if !exists('g:polyglot_disabled')
|
||||||
|
let g:polyglot_disabled = []
|
||||||
|
endif
|
||||||
|
|
||||||
|
function! s:SetDefault(name, value)
|
||||||
|
if !exists(a:name)
|
||||||
|
let {a:name} = a:value
|
||||||
|
endif
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
call s:SetDefault('g:markdown_enable_spell_checking', 0)
|
||||||
|
call s:SetDefault('g:markdown_enable_input_abbreviations', 0)
|
||||||
|
call s:SetDefault('g:markdown_enable_mappings', 0)
|
||||||
|
|
||||||
|
" Enable jsx syntax by default
|
||||||
|
call s:SetDefault('g:jsx_ext_required', 0)
|
||||||
|
|
||||||
|
" Make csv loading faster
|
||||||
|
call s:SetDefault('g:csv_start', 1)
|
||||||
|
call s:SetDefault('g:csv_end', 2)
|
||||||
|
|
||||||
|
" Disable json concealing by default
|
||||||
|
call s:SetDefault('g:vim_json_syntax_conceal', 0)
|
||||||
|
|
||||||
|
call s:SetDefault('g:filetype_euphoria', 'elixir')
|
||||||
|
|
||||||
|
if !exists('g:python_highlight_all')
|
||||||
|
call s:SetDefault('g:python_highlight_builtins', 1)
|
||||||
|
call s:SetDefault('g:python_highlight_builtin_objs', 1)
|
||||||
|
call s:SetDefault('g:python_highlight_builtin_types', 1)
|
||||||
|
call s:SetDefault('g:python_highlight_builtin_funcs', 1)
|
||||||
|
call s:SetDefault('g:python_highlight_builtin_funcs_kwarg', 1)
|
||||||
|
call s:SetDefault('g:python_highlight_exceptions', 1)
|
||||||
|
call s:SetDefault('g:python_highlight_string_formatting', 1)
|
||||||
|
call s:SetDefault('g:python_highlight_string_format', 1)
|
||||||
|
call s:SetDefault('g:python_highlight_string_templates', 1)
|
||||||
|
call s:SetDefault('g:python_highlight_indent_errors', 1)
|
||||||
|
call s:SetDefault('g:python_highlight_space_errors', 1)
|
||||||
|
call s:SetDefault('g:python_highlight_doctests', 1)
|
||||||
|
call s:SetDefault('g:python_highlight_func_calls', 1)
|
||||||
|
call s:SetDefault('g:python_highlight_class_vars', 1)
|
||||||
|
call s:SetDefault('g:python_highlight_operators', 1)
|
||||||
|
call s:SetDefault('g:python_highlight_file_headers_as_comments', 1)
|
||||||
|
call s:SetDefault('g:python_slow_sync', 1)
|
||||||
|
endif
|
||||||
|
""")
|
||||||
|
|
||||||
|
language("ASL", polyglot="acpiasl", extensions=[".asl", ".dsl"])
|
||||||
|
language("API Blueprint")
|
||||||
|
language("AppleScript")
|
||||||
|
language("Processing", filetype="arduino", extra_extensions=[".ino"])
|
||||||
|
language("AsciiDoc")
|
||||||
|
language("Blade")
|
||||||
|
language("Caddyfile", extensions=["Caddyfile"])
|
||||||
|
language("Carp", extensions=[".carp"])
|
||||||
|
language("CoffeeScript", polyglot="coffee-script", filetype="coffee", extra_extensions=[".coffeekup", '.ck'])
|
||||||
|
language("Literate CoffeeScript", polyglot="coffee-script", filetype="litcoffee", extra_extensions=[".coffee.md"])
|
||||||
|
language("Clojure")
|
||||||
|
language("CQL", extensions=[".cql"])
|
||||||
|
language("Cryptol", extensions=[".cry", ".cyl", ".lcry", ".lcyl"])
|
||||||
|
language("Crystal", extra_filenames=["Projectfile"])
|
||||||
|
language("HTML+ECR", polyglot="crystal", filetype="ecrystal")
|
||||||
|
language("CSV", extra_extensions=[".tsv", ".dat", ".tab"])
|
||||||
|
language("Gherkin", filetype="cucumber", extra_extensions=[".story"])
|
||||||
|
language("Cue", filetype="cuesheet", extensions=[".cue"], polyglot="cue")
|
||||||
|
language("Dart")
|
||||||
|
language("Dhall")
|
||||||
|
language("D", polyglot="dlang")
|
||||||
|
language("D", polyglot="dlang", filetype="dcov", extensions=[".lst"])
|
||||||
|
language("D", polyglot="dlang", filetype="dd", extensions=[".dd"])
|
||||||
|
language("D", polyglot="dlang", filetype="ddoc", extensions=[".ddoc"])
|
||||||
|
language("D", polyglot="dlang", filetype="dsdl", extensions=[".sdl"])
|
||||||
|
language("Dockerfile", extra_extensions=[".dock", ".Dockerfile"], extra_filenames=["dockerfile", "Dockerfile*"], filetype="Dockerfile", polyglot="dockerfile")
|
||||||
|
language("Dockerfile", extensions=[], filenames=["docker-compose*.yaml", "docker-compose*.yml"], filetype="yaml.docker-compose", polyglot="dockerfile")
|
||||||
|
language("Elixir")
|
||||||
|
language("HTML+EEX", polyglot="elixir", filetype="elixir", extra_extensions=[".leex"])
|
||||||
|
language("Elm")
|
||||||
|
language("EmberScript", filetype="ember-script", polyglot="emberscript")
|
||||||
|
language("Emblem", extensions=[".emblem"], filetype="emblem")
|
||||||
|
language("Erlang", extra_extensions=[".app", ".yaws"])
|
||||||
|
language("Ferm", extensions=[".ferm"], filenames=["ferm.conf"], filetype="ferm")
|
||||||
|
language("fish")
|
||||||
|
language("YAML", extra_filenames=["fish_history", "fish_read_history"])
|
||||||
|
language("Flatbuffers", extensions=[".fbs"], filetype="fbs", polyglot="flatbuffers")
|
||||||
|
language("GDScript", filetype="gdscript3", polyglot="gdscript")
|
||||||
|
language("GLSL", extra_extensions=[".comp"])
|
||||||
|
language("F#", polyglot="fsharp", filetype="fsharp")
|
||||||
|
language("Git Config", polyglot="git", filetype="gitconfig", extra_filenames=["*.git/config", "*/.config/git/config", "*.git/modules/**/config", "gitconfig"])
|
||||||
|
language("Git Rebase", polyglot="git", filetype="gitrebase", filenames=["git-rebase-todo"])
|
||||||
|
language("Git Send Email", polyglot="git", filetype="gitsendemail", filenames=[".gitsendemail.*"])
|
||||||
|
language("Git Commit", polyglot="git", filetype="gitcommit", filenames=["COMMIT_EDIT_MSG", "TAG_EDIT_MSG", "MERGE_MSG", "MSG"])
|
||||||
|
language("Gnu MathProg", polyglot="gmpl", filetype="gmpl", extensions=[".mod"])
|
||||||
|
language("Go")
|
||||||
|
language("Go Mod", filetype="gomod", filenames=["go.mod"], polyglot="go")
|
||||||
|
language("Go Template", filetype="gohtmltmpl", extensions=[".tmpl"], polyglot="go")
|
||||||
|
language("Assembly", filetype="asm", polyglot="assembly")
|
||||||
|
language("GraphQL")
|
||||||
|
language("Gradle", filetype="groovy", polyglot="gradle")
|
||||||
|
language("Haml", extra_extensions=[".hamlc", ".hamlbars"])
|
||||||
|
language("Handlebars", filetype="mustache", polyglot="handlebars", extra_extensions=[".hulk", ".hjs", ".mustache", ".njk"])
|
||||||
|
language("HTML+Django", polyglot="jinja", filetype="jinja.html", ignored_extensions=[".mustache", ".njk"], extra_extensions=[".j2"])
|
||||||
|
language("HAProxy")
|
||||||
|
language("Haskell", extra_extensions=[".bpk", ".hsig"])
|
||||||
|
language("Haxe")
|
||||||
|
language("HCL", extra_extensions=[".nomad"], extra_filenames=["Appfile"])
|
||||||
|
language("Helm", extra_filenames=["*/templates/*.yaml", "*/templates/*.tpl"])
|
||||||
|
language("HiveQL", polyglot="hive", filetype="hive")
|
||||||
|
language("I3", extensions=[".i3.config"], filenames=["i3.config"], filetype="i3config", polyglot="i3")
|
||||||
|
language("HiveQL", polyglot="hive", filetype="hive")
|
||||||
|
language("iCalendar", polyglot="icalendar", filetype="icalendar", extensions=[".ics"])
|
||||||
|
language("Idris", extra_filenames=["idris-response"])
|
||||||
|
language("Ion", extensions=[".ion"], filenames=["~/.config/ion/initrc"])
|
||||||
|
language("JavaScript")
|
||||||
|
language("Flow", polyglot="javascript", filetype="flow", extensions=[".flow"])
|
||||||
|
language("Jenkinsfile", polyglot="jenkins", extensions=[".jenkinsfile", ".Jenkinsfile"], filenames=["Jenkinsfile*"], filetype="Jenkinsfile")
|
||||||
|
language("JSON5")
|
||||||
|
language("JSON", extra_extensions=[".jsonp", ".template"])
|
||||||
|
language("EJS", filetype="jst", extra_extensions=[".jst", ".djs", ".hamljs", ".ect"])
|
||||||
|
language("JSX", filetype="javascriptreact", polyglot="jsx")
|
||||||
|
language("Julia")
|
||||||
|
language("Kotlin")
|
||||||
|
language("Ledger", extensions=[".ldg", ".ledger", ".journal"])
|
||||||
|
language("Less")
|
||||||
|
language("LilyPond")
|
||||||
|
language("LiveScript")
|
||||||
|
language("LLVM")
|
||||||
|
language("Tablegen", polyglot="llvm", extensions=[".td"], filetype="tablegen")
|
||||||
|
language("Mako", outer_filetype="let b:mako_outer_lang = &filetype")
|
||||||
|
language("Log", extensions=[".log"], filenames=["*_log"])
|
||||||
|
language("Markdown", ignored_extensions=[".mdx"])
|
||||||
|
language("Mdx", extensions=[".mdx"], polyglot="mdx", filetype="markdown.mdx")
|
||||||
|
language("Mathematica", filetype="mma")
|
||||||
|
language("Meson")
|
||||||
|
language("Dosini", extensions=[".wrap"], filetype="dosini", polyglot="meson")
|
||||||
|
language("MoonScript", filetype="moon", polyglot="moon")
|
||||||
|
language("Nginx", extra_extensions=[".nginx"], extra_filenames=["*/etc/nginx/*", "*/usr/local/nginx/conf/*", "*/nginx/*.conf", "nginx*.conf", "*nginx.conf"])
|
||||||
|
language("Nim")
|
||||||
|
language("Nix")
|
||||||
|
language("OCaml", extra_extensions=[".mlt", ".mlp", ".mlip", ".mli.cppo", ".ml.cppo"])
|
||||||
|
language("OMake", extensions=[".om"], filenames=["OMakefile", "OMakeroot", "Omakeroot.in"], polyglot="ocaml", filetype="omake")
|
||||||
|
language("OPam", extensions=[".opam", ".opam.template"], filenames=["opam"], filetype="opam", polyglot="ocaml")
|
||||||
|
language("Oasis", filenames=["_oasis"], polyglot="ocaml", filetype="oasis")
|
||||||
|
language("OpenCL")
|
||||||
|
language("Perl")
|
||||||
|
language("PLpgSQL", filetype="sql", ignored_extensions=[".sql"], custom_set="let b:sql_type_override='pgsql' | set ft=sql", polyglot="pgsql")
|
||||||
|
language("PlantUML", extra_extensions=[".uml", ".pu"])
|
||||||
|
language("Pony")
|
||||||
|
language("PowerShell", extra_extensions=[".pssc"])
|
||||||
|
language("Ps1XML", extensions=[".ps1xml"], polyglot="powershell", filetype="ps1xml")
|
||||||
|
language("Protocol Buffer", polyglot="protobuf", filetype="proto")
|
||||||
|
language("Pug")
|
||||||
|
language("Puppet")
|
||||||
|
language("Embedded Puppet", polyglot="puppet", filetype="embeddedpuppet", extensions=[".epp"])
|
||||||
|
language("PureScript")
|
||||||
|
language("QMake")
|
||||||
|
language("QML")
|
||||||
|
language("Racket")
|
||||||
|
language("Raku", extra_extensions=[".rakudoc", ".rakutest", ".raku", ".rakumod", ".pod6", ".t6"])
|
||||||
|
language("RAML")
|
||||||
|
language("HTML+Razor", filetype="razor", polyglot="razor")
|
||||||
|
language("Reason")
|
||||||
|
language("Merlin", filetype="merlin", polyglot="razor", filenames=[".merlin"])
|
||||||
|
language("Ruby", extra_extensions=[".rxml", ".rjs", ".rant", ".axlsx", ".cap", ".opal"], extra_filenames=["Rantfile", ".autotest", "Cheffile", "KitchenSink", "Routefile"])
|
||||||
|
language("HTML+ERB", polyglot="ruby", filetype="eruby", extra_extensions=[".rhtml"])
|
||||||
|
# Needs to be after ruby
|
||||||
|
language("RSpec", filenames=["*_spec.rb"], polyglot="rspec", filetype="ruby", syntax="rspec")
|
||||||
|
language("Rust")
|
||||||
|
language("Scala", ignored_extensions=[".sbt"])
|
||||||
|
language("Scala SBT", filetype="sbt.scala", extensions=[".sbt"], polyglot="scala")
|
||||||
|
language("SCSS")
|
||||||
|
language("Slim")
|
||||||
|
language("Slime", extensions=[".slime"])
|
||||||
|
language("SMT", filetype="smt2")
|
||||||
|
language("Solidity", extra_extensions=[".sol"])
|
||||||
|
language("Stylus", extra_extensions=[".stylus"])
|
||||||
|
language("Svelte")
|
||||||
|
language("Swift")
|
||||||
|
language("Sxhkd", extensions=[".sxhkdrc"], filetype="sxhkdrc", polyglot="sxhkd")
|
||||||
|
language("Systemd", extensions=[".automount", ".mount", ".path", ".service", ".socket", ".swap", ".target", ".timer"])
|
||||||
|
language("HCL", filetype="terraform", polyglot="terraform")
|
||||||
|
language("Textile")
|
||||||
|
language("Thrift")
|
||||||
|
language("Tmux", filenames=[".tmux.conf"])
|
||||||
|
language("TOML", extra_filenames=["Pipfile", "*/.cargo/config", "*/.cargo/credentials"])
|
||||||
|
language("TPTP", extensions=[".p", ".tptp", ".ax"])
|
||||||
|
language("Twig", ignored_extensions=[".xml.twig"], filetype="html.twig", polyglot="twig")
|
||||||
|
language("Twig XML", extensions=[".xml.twig"], filetype="xml.twig", polyglot="twig")
|
||||||
|
language("TypeScript")
|
||||||
|
language("TSX", filetype="typescriptreact", polyglot="typescript")
|
||||||
|
language("XML", extra_extensions=[".cdxml"], ignored_extensions=[".ts", ".tsx"])
|
||||||
|
language("V")
|
||||||
|
language("Vala", extra_extensions=[".valadoc"])
|
||||||
|
language("Visual Basic .NET", filetype="vbnet", polyglot="vbnet")
|
||||||
|
language("VCL")
|
||||||
|
language("Vifm", extensions=[".vifm"], filenames=["vifmrc", "*vifm/colors/*"])
|
||||||
|
language("Vifm Rename", filetype="vifm-rename", filenames=["vifm.rename*"], polyglot="vifm")
|
||||||
|
language("Velocity", extensions=[".vm"], filetype="velocity")
|
||||||
|
language("Vue", extra_extensions=[".wpy"])
|
||||||
|
language("XDC", extensions=[".xdc"])
|
||||||
|
language("Zig", extra_extensions=[".zir"])
|
||||||
|
language("Zir", extensions=[".zir"], polyglot="zig", filetype="zir")
|
||||||
|
language("Jsonnet")
|
||||||
|
language("Fennel", extensions=[".fnl"])
|
||||||
|
language("mcfunction")
|
||||||
|
language("JSONiq", extra_filenames=[".jqrc"], filetype="jq", polyglot="jq")
|
||||||
|
language("Requirements", extensions=[".pip"], filenames=["*requirements.{txt,in}", "*require.{txt,in}", "constraints.{txt,in}"])
|
||||||
|
|
||||||
|
lines.append('" restore Vi compatibility settings')
|
||||||
|
lines.append('let &cpo = s:cpo_save')
|
||||||
|
lines.append('unlet s:cpo_save')
|
||||||
|
|
||||||
|
f = open("ftdetect/polyglot.vim", "w")
|
||||||
|
f.write("\n".join(lines))
|
||||||
|
f.close()
|
||||||
|
|
||||||
@@ -3,7 +3,7 @@ if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'haml') == -1
|
|||||||
" Vim compiler file
|
" Vim compiler file
|
||||||
" Compiler: Haml
|
" Compiler: Haml
|
||||||
" Maintainer: Tim Pope <vimNOSPAM@tpope.org>
|
" Maintainer: Tim Pope <vimNOSPAM@tpope.org>
|
||||||
" Last Change: 2013 May 30
|
" Last Change: 2016 Aug 29
|
||||||
|
|
||||||
if exists("current_compiler")
|
if exists("current_compiler")
|
||||||
finish
|
finish
|
||||||
|
|||||||
36
compiler/ledger.vim
Normal file
36
compiler/ledger.vim
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'ledger') == -1
|
||||||
|
|
||||||
|
" Vim Compiler File
|
||||||
|
" Compiler: ledger
|
||||||
|
" by Johann Klähn; Use according to the terms of the GPL>=2.
|
||||||
|
" vim:ts=2:sw=2:sts=2:foldmethod=marker
|
||||||
|
|
||||||
|
scriptencoding utf-8
|
||||||
|
|
||||||
|
if exists('current_compiler') || !exists('g:ledger_bin')
|
||||||
|
finish
|
||||||
|
endif
|
||||||
|
|
||||||
|
let current_compiler = g:ledger_bin
|
||||||
|
|
||||||
|
if exists(':CompilerSet') != 2
|
||||||
|
command -nargs=* CompilerSet setlocal <args>
|
||||||
|
endif
|
||||||
|
|
||||||
|
if !exists('g:ledger_main')
|
||||||
|
let g:ledger_main = '%'
|
||||||
|
endif
|
||||||
|
|
||||||
|
if !g:ledger_is_hledger
|
||||||
|
" Capture Ledger errors (%-C ignores all lines between "While parsing..." and "Error:..."):
|
||||||
|
CompilerSet errorformat=%EWhile\ parsing\ file\ \"%f\"\\,\ line\ %l:,%ZError:\ %m,%-C%.%#
|
||||||
|
" Capture Ledger warnings:
|
||||||
|
CompilerSet errorformat+=%tarning:\ \"%f\"\\,\ line\ %l:\ %m
|
||||||
|
" Skip all other lines:
|
||||||
|
CompilerSet errorformat+=%-G%.%#
|
||||||
|
exe 'CompilerSet makeprg='.substitute(g:ledger_bin, ' ', '\\ ', 'g').'\ -f\ ' . shellescape(expand(g:ledger_main)) . '\ '.substitute(g:ledger_extra_options, ' ', '\\ ', 'g').'\ source\ ' . shellescape(expand(g:ledger_main))
|
||||||
|
else
|
||||||
|
exe 'CompilerSet makeprg=('.substitute(g:ledger_bin, ' ', '\\ ', 'g').'\ -f\ ' . shellescape(expand(g:ledger_main)) . '\ print\ '.substitute(g:ledger_extra_options, ' ', '\\ ', 'g').'\ >\ /dev/null)'
|
||||||
|
endif
|
||||||
|
|
||||||
|
endif
|
||||||
@@ -5,9 +5,9 @@ if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'ocaml') == -1
|
|||||||
" Maintainer: Markus Mottl <markus.mottl@gmail.com>
|
" Maintainer: Markus Mottl <markus.mottl@gmail.com>
|
||||||
" URL: http://www.ocaml.info/vim/compiler/ocaml.vim
|
" URL: http://www.ocaml.info/vim/compiler/ocaml.vim
|
||||||
" Last Change:
|
" Last Change:
|
||||||
|
" 2020 Mar 28 - Improved error format (Thomas Leonard)
|
||||||
" 2017 Nov 26 - Improved error format (Markus Mottl)
|
" 2017 Nov 26 - Improved error format (Markus Mottl)
|
||||||
" 2013 Aug 27 - Added a new OCaml error format (Markus Mottl)
|
" 2013 Aug 27 - Added a new OCaml error format (Markus Mottl)
|
||||||
" 2013 Jun 30 - Initial version (Marc Weber)
|
|
||||||
"
|
"
|
||||||
" Marc Weber's comments:
|
" Marc Weber's comments:
|
||||||
" Setting makeprg doesn't make sense, because there is ocamlc, ocamlopt,
|
" Setting makeprg doesn't make sense, because there is ocamlc, ocamlopt,
|
||||||
@@ -33,6 +33,7 @@ let s:cpo_save = &cpo
|
|||||||
set cpo&vim
|
set cpo&vim
|
||||||
|
|
||||||
CompilerSet errorformat =
|
CompilerSet errorformat =
|
||||||
|
\%EFile\ \"%f\"\\,\ lines\ %*\\d-%l\\,\ characters\ %c-%*\\d:,
|
||||||
\%EFile\ \"%f\"\\,\ line\ %l\\,\ characters\ %c-%*\\d:,
|
\%EFile\ \"%f\"\\,\ line\ %l\\,\ characters\ %c-%*\\d:,
|
||||||
\%EFile\ \"%f\"\\,\ line\ %l\\,\ characters\ %c-%*\\d\ %.%#,
|
\%EFile\ \"%f\"\\,\ line\ %l\\,\ characters\ %c-%*\\d\ %.%#,
|
||||||
\%EFile\ \"%f\"\\,\ line\ %l\\,\ character\ %c:%m,
|
\%EFile\ \"%f\"\\,\ line\ %l\\,\ character\ %c:%m,
|
||||||
|
|||||||
87
compiler/powershell.vim
Normal file
87
compiler/powershell.vim
Normal file
@@ -0,0 +1,87 @@
|
|||||||
|
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'powershell') == -1
|
||||||
|
|
||||||
|
" Compiler: powershell
|
||||||
|
" Run ps1 scripts in powershell and process their output. Quickly jump through
|
||||||
|
" stack traces and see script output in the quickfix.
|
||||||
|
|
||||||
|
if exists("current_compiler")
|
||||||
|
finish
|
||||||
|
endif
|
||||||
|
let current_compiler = "powershell"
|
||||||
|
|
||||||
|
if exists(":CompilerSet") != 2 " older Vim always used :setlocal
|
||||||
|
command -nargs=* CompilerSet setlocal <args>
|
||||||
|
endif
|
||||||
|
|
||||||
|
let s:cpo_save = &cpo
|
||||||
|
set cpo-=C
|
||||||
|
|
||||||
|
if !exists("g:ps1_makeprg_cmd")
|
||||||
|
if executable('pwsh')
|
||||||
|
" pwsh is the future
|
||||||
|
let g:ps1_makeprg_cmd = 'pwsh'
|
||||||
|
elseif executable('pwsh.exe')
|
||||||
|
let g:ps1_makeprg_cmd = 'pwsh.exe'
|
||||||
|
elseif executable('powershell.exe')
|
||||||
|
let g:ps1_makeprg_cmd = 'powershell.exe'
|
||||||
|
else
|
||||||
|
let g:ps1_makeprg_cmd = ''
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
if !executable(g:ps1_makeprg_cmd)
|
||||||
|
echoerr "To use the powershell compiler, please set g:ps1_makeprg_cmd to the powershell executable!"
|
||||||
|
endif
|
||||||
|
|
||||||
|
" Show CategoryInfo, FullyQualifiedErrorId, etc?
|
||||||
|
let g:ps1_efm_show_error_categories = get(g:, 'ps1_efm_show_error_categories', 0)
|
||||||
|
|
||||||
|
" Use absolute path because powershell requires explicit relative paths
|
||||||
|
" (./file.ps1 is okay, but # expands to file.ps1)
|
||||||
|
let &l:makeprg = g:ps1_makeprg_cmd .' %:p:S'
|
||||||
|
|
||||||
|
" Parse file, line, char from callstacks:
|
||||||
|
" Write-Ouput : The term 'Write-Ouput' is not recognized as the name of a
|
||||||
|
" cmdlet, function, script file, or operable program. Check the spelling
|
||||||
|
" of the name, or if a path was included, verify that the path is correct
|
||||||
|
" and try again.
|
||||||
|
" At C:\script.ps1:11 char:5
|
||||||
|
" + Write-Ouput $content
|
||||||
|
" + ~~~~~~~~~~~
|
||||||
|
" + CategoryInfo : ObjectNotFound: (Write-Ouput:String) [], CommandNotFoundException
|
||||||
|
" + FullyQualifiedErrorId : CommandNotFoundException
|
||||||
|
|
||||||
|
" Showing error in context with underlining.
|
||||||
|
CompilerSet errorformat=%+G+%m
|
||||||
|
" Error summary.
|
||||||
|
CompilerSet errorformat+=%E%*\\S\ :\ %m
|
||||||
|
" Error location.
|
||||||
|
CompilerSet errorformat+=%CAt\ %f:%l\ char:%c
|
||||||
|
" Errors that span multiple lines (may be wrapped to width of terminal).
|
||||||
|
CompilerSet errorformat+=%C%m
|
||||||
|
" Ignore blank/whitespace-only lines.
|
||||||
|
CompilerSet errorformat+=%Z\\s%#
|
||||||
|
|
||||||
|
if g:ps1_efm_show_error_categories
|
||||||
|
CompilerSet errorformat^=%+G\ \ \ \ +\ %.%#\\s%#:\ %m
|
||||||
|
else
|
||||||
|
CompilerSet errorformat^=%-G\ \ \ \ +\ %.%#\\s%#:\ %m
|
||||||
|
endif
|
||||||
|
|
||||||
|
|
||||||
|
" Parse file, line, char from of parse errors:
|
||||||
|
" At C:\script.ps1:22 char:16
|
||||||
|
" + Stop-Process -Name "invalidprocess
|
||||||
|
" + ~~~~~~~~~~~~~~~
|
||||||
|
" The string is missing the terminator: ".
|
||||||
|
" + CategoryInfo : ParserError: (:) [], ParseException
|
||||||
|
" + FullyQualifiedErrorId : TerminatorExpectedAtEndOfString
|
||||||
|
CompilerSet errorformat+=At\ %f:%l\ char:%c
|
||||||
|
|
||||||
|
|
||||||
|
let &cpo = s:cpo_save
|
||||||
|
unlet s:cpo_save
|
||||||
|
|
||||||
|
" vim:set sw=2 sts=2:
|
||||||
|
|
||||||
|
endif
|
||||||
@@ -26,7 +26,7 @@ else
|
|||||||
if has('patch-7.4.191')
|
if has('patch-7.4.191')
|
||||||
CompilerSet makeprg=rustc\ \%:S
|
CompilerSet makeprg=rustc\ \%:S
|
||||||
else
|
else
|
||||||
CompilerSet makeprg=rustc\ \%
|
CompilerSet makeprg=rustc\ \"%\"
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
|||||||
43
compiler/swift.vim
Normal file
43
compiler/swift.vim
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'swift') == -1
|
||||||
|
|
||||||
|
" Vim compiler file
|
||||||
|
" Compiler: Swift Compiler
|
||||||
|
" Maintainer: Ayman Bagabas <ayman.bagabas@gmail.com>
|
||||||
|
" Latest Revision: 2020 Feb 16
|
||||||
|
|
||||||
|
if exists("current_compiler")
|
||||||
|
finish
|
||||||
|
endif
|
||||||
|
let current_compiler = "swiftc"
|
||||||
|
|
||||||
|
" vint: -ProhibitAbbreviationOption
|
||||||
|
let s:save_cpo = &cpo
|
||||||
|
set cpo&vim
|
||||||
|
" vint: +ProhibitAbbreviationOption
|
||||||
|
|
||||||
|
if exists(":CompilerSet") != 2
|
||||||
|
command -nargs=* CompilerSet setlocal <args>
|
||||||
|
endif
|
||||||
|
|
||||||
|
if has('patch-7.4.191')
|
||||||
|
CompilerSet makeprg=swiftc\ \%:S
|
||||||
|
else
|
||||||
|
CompilerSet makeprg=swiftc\ \%
|
||||||
|
endif
|
||||||
|
|
||||||
|
CompilerSet errorformat=
|
||||||
|
\%E%f:%l:%c:\ %trror:\ %m,
|
||||||
|
\%W%f:%l:%c:\ %tarning:\ %m,
|
||||||
|
\%I%f:%l:%c:\ note:\ %m,
|
||||||
|
\%E%f:%l:\ %trror:\ %m,
|
||||||
|
\%W%f:%l:\ %tarning:\ %m,
|
||||||
|
\%I%f:%l:\ note:\ %m,
|
||||||
|
|
||||||
|
" vint: -ProhibitAbbreviationOption
|
||||||
|
let &cpo = s:save_cpo
|
||||||
|
unlet s:save_cpo
|
||||||
|
" vint: +ProhibitAbbreviationOption
|
||||||
|
|
||||||
|
" vim: set et sw=4 sts=4 ts=8:
|
||||||
|
|
||||||
|
endif
|
||||||
82
config.vim
82
config.vim
@@ -1,82 +0,0 @@
|
|||||||
" Enable jsx syntax by default
|
|
||||||
if !exists('g:jsx_ext_required')
|
|
||||||
let g:jsx_ext_required = 0
|
|
||||||
endif
|
|
||||||
|
|
||||||
" Make csv loading faster
|
|
||||||
if !exists('g:csv_start')
|
|
||||||
let g:csv_start = 1
|
|
||||||
endif
|
|
||||||
if !exists('g:csv_end')
|
|
||||||
let g:csv_end = 2
|
|
||||||
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'
|
|
||||||
|
|
||||||
augroup filetypedetect
|
|
||||||
autocmd BufNewFile,BufReadPost *.vb setlocal filetype=vbnet
|
|
||||||
augroup END
|
|
||||||
|
|
||||||
let g:python_highlight_all = 1
|
|
||||||
|
|
||||||
augroup filetypedetect
|
|
||||||
if v:version < 704
|
|
||||||
" NOTE: this line fixes an issue with the default system-wide lisp ftplugin
|
|
||||||
" which didn't define b:undo_ftplugin on older Vim versions
|
|
||||||
" (*.jl files are recognized as lisp)
|
|
||||||
autocmd BufRead,BufNewFile *.jl let b:undo_ftplugin = "setlocal comments< define< formatoptions< iskeyword< lisp<"
|
|
||||||
endif
|
|
||||||
|
|
||||||
autocmd BufRead,BufNewFile *.jl set filetype=julia
|
|
||||||
|
|
||||||
" coffeescript
|
|
||||||
autocmd BufNewFile,BufRead *.coffee set filetype=coffee
|
|
||||||
autocmd BufNewFile,BufRead *Cakefile set filetype=coffee
|
|
||||||
autocmd BufNewFile,BufRead *.coffeekup,*.ck set filetype=coffee
|
|
||||||
autocmd BufNewFile,BufRead *._coffee set filetype=coffee
|
|
||||||
autocmd BufNewFile,BufRead *.litcoffee set filetype=litcoffee
|
|
||||||
autocmd BufNewFile,BufRead *.coffee.md set filetype=litcoffee
|
|
||||||
|
|
||||||
|
|
||||||
" elixir
|
|
||||||
au BufRead,BufNewFile *.ex,*.exs set filetype=elixir
|
|
||||||
au BufRead,BufNewFile *.eex,*.leex set filetype=eelixir
|
|
||||||
au BufRead,BufNewFile mix.lock set filetype=elixir
|
|
||||||
|
|
||||||
" fish
|
|
||||||
autocmd BufRead,BufNewFile *.fish setfiletype fish
|
|
||||||
autocmd BufRead fish_funced_*_*.fish call search('^$')
|
|
||||||
autocmd BufRead,BufNewFile ~/.config/fish/fish_{read_,}history setfiletype yaml
|
|
||||||
autocmd BufRead,BufNewFile ~/.config/fish/fishd.* setlocal readonly
|
|
||||||
autocmd BufNewFile ~/.config/fish/functions/*.fish
|
|
||||||
\ call append(0, ['function '.expand('%:t:r'),
|
|
||||||
\'',
|
|
||||||
\'end']) |
|
|
||||||
\ 2
|
|
||||||
|
|
||||||
" git
|
|
||||||
autocmd BufNewFile,BufRead *.git/{,modules/**/,worktrees/*/}{COMMIT_EDIT,TAG_EDIT,MERGE_,}MSG set ft=gitcommit
|
|
||||||
autocmd BufNewFile,BufRead *.git/config,.gitconfig,gitconfig,.gitmodules set ft=gitconfig
|
|
||||||
autocmd BufNewFile,BufRead */.config/git/config set ft=gitconfig
|
|
||||||
autocmd BufNewFile,BufRead *.git/modules/**/config set ft=gitconfig
|
|
||||||
autocmd BufNewFile,BufRead git-rebase-todo set ft=gitrebase
|
|
||||||
autocmd BufNewFile,BufRead .gitsendemail.* set ft=gitsendemail
|
|
||||||
|
|
||||||
" plantuml
|
|
||||||
autocmd BufRead,BufNewFile *.pu,*.uml,*.plantuml,*.puml setfiletype plantuml | set filetype=plantuml
|
|
||||||
|
|
||||||
" scala
|
|
||||||
au BufRead,BufNewFile *.scala,*.sc set filetype=scala
|
|
||||||
au BufRead,BufNewFile *.sbt setfiletype sbt.scala
|
|
||||||
|
|
||||||
" swift
|
|
||||||
autocmd BufNewFile,BufRead *.swift set filetype=swift
|
|
||||||
|
|
||||||
"jinja
|
|
||||||
autocmd BufNewFile,BufRead *.jinja2,*.j2,*.jinja,*.nunjucks,*.nunjs,*.njk set ft=jinja
|
|
||||||
augroup END
|
|
||||||
16
ctags/puppet.ctags
Normal file
16
ctags/puppet.ctags
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'puppet') == -1
|
||||||
|
|
||||||
|
--langdef=puppet
|
||||||
|
--langmap=puppet:.pp
|
||||||
|
--regex-puppet=/^[[:space:]]*class[[:space:]]*([a-z][a-zA-Z0-9_:\-]+)/\1/c,class/
|
||||||
|
--regex-puppet=/^[[:space:]]*site[[:space:]]*([a-zA-Z0-9_\-]+)/\1/s,site/
|
||||||
|
--regex-puppet=/^[[:space:]]*node[[:space:]]*[\'|\"]*([a-zA-Z0-9_\.\-]+)[\'|\"]*/\1/n,node/
|
||||||
|
--regex-puppet=/^[[:space:]]*define[[:space:]]*([a-z][a-zA-Z0-9_:\-]+)/\1/d,definition/
|
||||||
|
--regex-puppet=/^[[:space:]]*(include|require)[[:space:]]*([a-zA-Z0-9_:]+)/\1 \2/i,include/
|
||||||
|
--regex-puppet=/^[[:space:]]*([\$][a-zA-Z0-9_:]+)[[:space:]]*=/\1/v,variable/
|
||||||
|
--regex-puppet=/^[[:space:]]*[~|\-]?>?[[:space:]]*([a-z][a-zA-Z0-9_:]+)[[:space:]]*\{ *(.*):/\1[\2]/r,resource/
|
||||||
|
--regex-puppet=/([A-Z][a-zA-Z0-9_:]+)[[:space:]]*\{/\1/f,default/
|
||||||
|
--regex-puppet=/^[[:space:]]*type[[:space:]]*([A-Z][a-zA-Z0-9_:]*)[[:space:]]*=/\1/t,type/
|
||||||
|
--regex-puppet=/^[[:space:]]*function[[:space:]]*([a-zA-Z0-9_:]*)[[:space:]]*/\1/u,function/
|
||||||
|
|
||||||
|
endif
|
||||||
16
ctags/puppet_u.ctags
Normal file
16
ctags/puppet_u.ctags
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'puppet') == -1
|
||||||
|
|
||||||
|
--langdef=puppet
|
||||||
|
--map-puppet=+.pp
|
||||||
|
--regex-puppet=/^[[:space:]]*node[[:space:]]*[\'|\"]*([a-zA-Z0-9_\.\-]+)[\'|\"]*/\1/n,node/{scope=set}
|
||||||
|
--regex-puppet=/^[[:space:]]*class[[:space:]]*([a-z][a-zA-Z0-9_:\-]+)[[:space:]]*\{*/\1/c,class,classes/{scope=set}
|
||||||
|
--regex-puppet=/^[[:space:]]*define[[:space:]]*([a-z][a-zA-Z0-9_:\-]+)/\1/d,definition/{scope=set}
|
||||||
|
--regex-puppet=/^[[:space:]]*(include|require)[[:space:]]*([a-zA-Z0-9_:]+)/\1 \2/i,include,includes/{scope=ref}
|
||||||
|
--regex-puppet=/^[[:space:]]*[~|\-]?>?[[:space:]]*([a-z][a-zA-Z0-9_:]+)[[:space:]]*\{[[:space:]]*(.*):/\1[\2]/r,resource/{scope=ref}
|
||||||
|
--regex-puppet=/^[[:space:]]*([\$][a-zA-Z0-9_:]+)[[:space:]]*=/\1/v,variable/{scope=ref}
|
||||||
|
--regex-puppet=/([A-Z][a-zA-Z0-9_:]+)[[:space:]]*\{/\1/f,default/
|
||||||
|
--regex-puppet=/^[[:space:]]*site[[:space:]]*([a-zA-Z0-9_\-]+)/\1/s,site/
|
||||||
|
--regex-puppet=/^[[:space:]]*type[[:space:]]*([A-Z][a-zA-Z0-9_:]*)[[:space:]]*=/\1/t,type/
|
||||||
|
--regex-puppet=/^[[:space:]]*function[[:space:]]*([a-zA-Z0-9_:]*)[[:space:]]*/\1/u,function/
|
||||||
|
|
||||||
|
endif
|
||||||
15
ctags/rust.ctags
Normal file
15
ctags/rust.ctags
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'rust') == -1
|
||||||
|
|
||||||
|
--langdef=Rust
|
||||||
|
--langmap=Rust:.rs
|
||||||
|
--regex-Rust=/^[ \t]*(#\[[^\]]\][ \t]*)*(pub[ \t]+)?(extern[ \t]+)?("[^"]+"[ \t]+)?(unsafe[ \t]+)?fn[ \t]+([a-zA-Z0-9_]+)/\6/f,functions,function definitions/
|
||||||
|
--regex-Rust=/^[ \t]*(pub[ \t]+)?type[ \t]+([a-zA-Z0-9_]+)/\2/T,types,type definitions/
|
||||||
|
--regex-Rust=/^[ \t]*(pub[ \t]+)?enum[ \t]+([a-zA-Z0-9_]+)/\2/g,enum,enumeration names/
|
||||||
|
--regex-Rust=/^[ \t]*(pub[ \t]+)?struct[ \t]+([a-zA-Z0-9_]+)/\2/s,structure names/
|
||||||
|
--regex-Rust=/^[ \t]*(pub[ \t]+)?mod[ \t]+([a-zA-Z0-9_]+)/\2/m,modules,module names/
|
||||||
|
--regex-Rust=/^[ \t]*(pub[ \t]+)?(static|const)[ \t]+([a-zA-Z0-9_]+)/\3/c,consts,static constants/
|
||||||
|
--regex-Rust=/^[ \t]*(pub[ \t]+)?trait[ \t]+([a-zA-Z0-9_]+)/\2/t,traits,traits/
|
||||||
|
--regex-Rust=/^[ \t]*(pub[ \t]+)?impl([ \t\n]*<[^>]*>)?[ \t]+(([a-zA-Z0-9_:]+)[ \t]*(<[^>]*>)?[ \t]+(for)[ \t]+)?([a-zA-Z0-9_]+)/\4 \6 \7/i,impls,trait implementations/
|
||||||
|
--regex-Rust=/^[ \t]*macro_rules![ \t]+([a-zA-Z0-9_]+)/\1/d,macros,macro definitions/
|
||||||
|
|
||||||
|
endif
|
||||||
17
ctags/scala.ctags
Normal file
17
ctags/scala.ctags
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'scala') == -1
|
||||||
|
|
||||||
|
--langdef=scala
|
||||||
|
--langmap=scala:.scala
|
||||||
|
|
||||||
|
--regex-scala=/^[ \t]*((abstract|final|sealed|implicit|lazy)[ \t]*)*(private[^ ]*|protected)?[ \t]*class[ \t]+([a-zA-Z0-9_]+)/\4/c,classes/
|
||||||
|
--regex-scala=/^[ \t]*((abstract|final|sealed|implicit|lazy)[ \t]*)*(private[^ ]*|protected)?[ \t]*object[ \t]+([a-zA-Z0-9_]+)/\4/o,objects/
|
||||||
|
--regex-scala=/^[ \t]*((abstract|final|sealed|implicit|lazy)[ \t]*)*(private[^ ]*|protected)?[ \t]*((abstract|final|sealed|implicit|lazy)[ \t ]*)*case class[ \t ]+([a-zA-Z0-9_]+)/\6/C,case classes/
|
||||||
|
--regex-scala=/^[ \t]*((abstract|final|sealed|implicit|lazy)[ \t]*)*(private[^ ]*|protected)?[ \t]*case object[ \t]+([a-zA-Z0-9_]+)/\4/O,case objects/
|
||||||
|
--regex-scala=/^[ \t]*((abstract|final|sealed|implicit|lazy)[ \t]*)*(private[^ ]*|protected)?[ \t]*trait[ \t]+([a-zA-Z0-9_]+)/\4/t,traits/
|
||||||
|
--regex-scala=/^[ \t]*type[ \t]+([a-zA-Z0-9_]+)/\1/T,types/
|
||||||
|
--regex-scala=/^[ \t]*((abstract|final|sealed|implicit|lazy|override|private[^ ]*(\[[a-z]*\])*|protected)[ \t]*)*def[ \t]+([a-zA-Z0-9_]+)/\4/m,methods/
|
||||||
|
--regex-scala=/^[ \t]*((abstract|final|sealed|implicit|lazy|override|private[^ ]*|protected)[ \t]*)*val[ \t]+([a-zA-Z0-9_]+)/\3/V,values/
|
||||||
|
--regex-scala=/^[ \t]*((abstract|final|sealed|implicit|lazy|override|private[^ ]*|protected)[ \t]*)*var[ \t]+([a-zA-Z0-9_]+)/\3/v,variables/
|
||||||
|
--regex-scala=/^[ \t]*package[ \t]+([a-zA-Z0-9_.]+)/\1/p,packages/
|
||||||
|
|
||||||
|
endif
|
||||||
17
ctags/typescript.ctags
Normal file
17
ctags/typescript.ctags
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'typescript') == -1
|
||||||
|
|
||||||
|
--langdef=typescript
|
||||||
|
--langmap=typescript:.ts
|
||||||
|
--regex-typescript=/^[ \t]*(export)?[ \t]*class[ \t]+([a-zA-Z0-9_]+)/\2/c,classes/
|
||||||
|
--regex-typescript=/^[ \t]*(export)?[ \t]*abstract class[ \t]+([a-zA-Z0-9_]+)/\2/a,abstract classes/
|
||||||
|
--regex-typescript=/^[ \t]*(export)?[ \t]*module[ \t]+([a-zA-Z0-9_]+)/\2/n,modules/
|
||||||
|
--regex-typescript=/^[ \t]*(export)?[ \t]*type[ \t]+([a-zA-Z0-9_]+)/\2/t,types/
|
||||||
|
--regex-typescript=/^[ \t]*(export)?[ \t]*namespace[ \t]+([a-zA-Z0-9_]+)/\2/n,modules/
|
||||||
|
--regex-typescript=/^[ \t]*(export)?[ \t]*function[ \t]+([a-zA-Z0-9_]+)/\2/f,functions/
|
||||||
|
--regex-typescript=/^[ \t]*export[ \t]+(var|const|let)[ \t]+([a-zA-Z0-9_]+)/\1/v,variables/
|
||||||
|
--regex-typescript=/^[ \t]*var[ \t]+([a-zA-Z0-9_]+)[ \t]*=[ \t]*function[ \t]*\(\)/\1/l,varlambdas/
|
||||||
|
--regex-typescript=/^[ \t]*(export)?[ \t]*(public|private)[ \t]+(static|readonly)?[ \t]*([a-zA-Z0-9_]+)/\4/m,members/
|
||||||
|
--regex-typescript=/^[ \t]*(export)?[ \t]*interface[ \t]+([a-zA-Z0-9_]+)/\2/i,interfaces/
|
||||||
|
--regex-typescript=/^[ \t]*(export)?[ \t]*enum[ \t]+([a-zA-Z0-9_]+)/\2/e,enums/
|
||||||
|
|
||||||
|
endif
|
||||||
25
doc/vim-polyglot.txt
Normal file
25
doc/vim-polyglot.txt
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
*vim-polyglot* Vim Polyglot
|
||||||
|
|
||||||
|
===============================================================================
|
||||||
|
*vim-polyglot-introduction*
|
||||||
|
Introduction ~
|
||||||
|
|
||||||
|
Vim Polyglot is a solid language pack for vim. No configuration needed.
|
||||||
|
|
||||||
|
Please make sure you have `syntax on` in your `.vimrc`
|
||||||
|
|
||||||
|
|
||||||
|
===============================================================================
|
||||||
|
DISABLING LANGUAGE PACKS *vim-polyglot-disabled*
|
||||||
|
|
||||||
|
|
||||||
|
Individual language packs can be disabled by setting `g:polyglot_disabled`:
|
||||||
|
|
||||||
|
>
|
||||||
|
" ~/.vimrc, declare this variable before polyglot is loaded let
|
||||||
|
g:polyglot_disabled = ['css']
|
||||||
|
<
|
||||||
|
|
||||||
|
Note that disabling languages won't make in general your vim startup any faster
|
||||||
|
/ slower (only for specific file type). Vim-polyglot is selection of language
|
||||||
|
plugins that are loaded only on demand.
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -5,68 +5,45 @@ if exists('b:did_ftplugin')
|
|||||||
endif
|
endif
|
||||||
let b:did_ftplugin = 1
|
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 comments=:#
|
||||||
setlocal commentstring=#\ %s
|
setlocal commentstring=#\ %s
|
||||||
setlocal suffixesadd=.cr
|
setlocal suffixesadd=.cr
|
||||||
|
|
||||||
" Set format for quickfix window
|
" Set format for quickfix window
|
||||||
setlocal errorformat=
|
setlocal errorformat=
|
||||||
\%ESyntax\ error\ in\ line\ %l:\ %m,
|
\%ESyntax\ error\ in\ line\ %l:\ %m,
|
||||||
\%ESyntax\ error\ in\ %f:%l:\ %m,
|
\%ESyntax\ error\ in\ %f:%l:\ %m,
|
||||||
\%EError\ in\ %f:%l:\ %m,
|
\%EError\ in\ %f:%l:\ %m,
|
||||||
\%C%p^,
|
\%C%p^,
|
||||||
\%-C%.%#
|
\%-C%.%#
|
||||||
|
|
||||||
let g:crystal_compiler_command = get(g:, 'crystal_compiler_command', 'crystal')
|
let g:crystal_compiler_command = get(g:, 'crystal_compiler_command', 'crystal')
|
||||||
let g:crystal_auto_format = get(g:, 'crystal_auto_format', 0)
|
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=* 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=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=* 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=* CrystalHierarchy echo crystal_lang#type_hierarchy(expand('%'), <q-args>)
|
||||||
command! -buffer -nargs=? CrystalSpecSwitch call crystal_lang#switch_spec_file(<f-args>)
|
command! -buffer -nargs=? CrystalSpecSwitch call crystal_lang#switch_spec_file(<f-args>)
|
||||||
command! -buffer -nargs=? CrystalSpecRunAll call crystal_lang#run_all_spec(<f-args>)
|
command! -buffer -nargs=? CrystalSpecRunAll call crystal_lang#run_all_spec(<f-args>)
|
||||||
command! -buffer -nargs=? CrystalSpecRunCurrent call crystal_lang#run_current_spec(<f-args>)
|
command! -buffer -nargs=? CrystalSpecRunCurrent call crystal_lang#run_current_spec(<f-args>)
|
||||||
command! -buffer -nargs=* -bar CrystalFormat call crystal_lang#format(<q-args>, 0)
|
command! -buffer -nargs=* -bar CrystalFormat call crystal_lang#format(<q-args>, 0)
|
||||||
command! -buffer -nargs=* CrystalExpand echo crystal_lang#expand(expand('%'), getpos('.'), <q-args>).output
|
command! -buffer -nargs=* CrystalExpand echo crystal_lang#expand(expand('%'), getpos('.'), <q-args>).output
|
||||||
|
|
||||||
nnoremap <buffer><Plug>(crystal-jump-to-definition) :<C-u>CrystalDef<CR>
|
nnoremap <buffer><Plug>(crystal-jump-to-definition) :<C-u>CrystalDef<CR>
|
||||||
nnoremap <buffer><Plug>(crystal-show-context) :<C-u>CrystalContext<CR>
|
nnoremap <buffer><Plug>(crystal-show-context) :<C-u>CrystalContext<CR>
|
||||||
nnoremap <buffer><Plug>(crystal-spec-switch) :<C-u>CrystalSpecSwitch<CR>
|
nnoremap <buffer><Plug>(crystal-spec-switch) :<C-u>CrystalSpecSwitch<CR>
|
||||||
nnoremap <buffer><Plug>(crystal-spec-run-all) :<C-u>CrystalSpecRunAll<CR>
|
nnoremap <buffer><Plug>(crystal-spec-run-all) :<C-u>CrystalSpecRunAll<CR>
|
||||||
nnoremap <buffer><Plug>(crystal-spec-run-current) :<C-u>CrystalSpecRunCurrent<CR>
|
nnoremap <buffer><Plug>(crystal-spec-run-current) :<C-u>CrystalSpecRunCurrent<CR>
|
||||||
nnoremap <buffer><Plug>(crystal-format) :<C-u>CrystalFormat<CR>
|
nnoremap <buffer><Plug>(crystal-format) :<C-u>CrystalFormat<CR>
|
||||||
|
|
||||||
augroup plugin-ft-crystal
|
augroup plugin-ft-crystal
|
||||||
autocmd BufWritePre <buffer> if g:crystal_auto_format | call crystal_lang#format('', 1) | endif
|
autocmd BufWritePre <buffer> if g:crystal_auto_format | call crystal_lang#format('', 1) | endif
|
||||||
augroup END
|
augroup END
|
||||||
|
|
||||||
if get(g:, 'crystal_define_mappings', 1)
|
if get(g:, 'crystal_define_mappings', 1)
|
||||||
nmap <buffer>gd <Plug>(crystal-jump-to-definition)
|
nmap <buffer>gd <Plug>(crystal-jump-to-definition)
|
||||||
nmap <buffer>gc <Plug>(crystal-show-context)
|
nmap <buffer>gc <Plug>(crystal-show-context)
|
||||||
nmap <buffer>gss <Plug>(crystal-spec-switch)
|
nmap <buffer>gss <Plug>(crystal-spec-switch)
|
||||||
nmap <buffer>gsa <Plug>(crystal-spec-run-all)
|
nmap <buffer>gsa <Plug>(crystal-spec-run-all)
|
||||||
nmap <buffer>gsc <Plug>(crystal-spec-run-current)
|
nmap <buffer>gsc <Plug>(crystal-spec-run-current)
|
||||||
@@ -76,9 +53,33 @@ if &l:ofu ==# ''
|
|||||||
setlocal omnifunc=crystal_lang#complete
|
setlocal omnifunc=crystal_lang#complete
|
||||||
endif
|
endif
|
||||||
|
|
||||||
let &cpo = s:save_cpo
|
" Options for vim-matchit
|
||||||
unlet s:save_cpo
|
if exists('g:loaded_matchit') && !exists('b:match_words')
|
||||||
|
let b:match_ignorecase = 0
|
||||||
|
|
||||||
" vim: nowrap sw=2 sts=2 ts=8:
|
let b:match_words =
|
||||||
|
\ '\<\%(if\|unless\|case\|while\|until\|for\|do\|class\|module\|struct\|lib\|macro\|ifdef\|def\|begin\|enum\|annotation\)\>=\@!' .
|
||||||
|
\ ':' .
|
||||||
|
\ '\<\%(else\|elsif\|ensure\|when\|in\|rescue\|break\|next\)\>' .
|
||||||
|
\ ':' .
|
||||||
|
\ '\<end\>' .
|
||||||
|
\ ',{:},\[:\],(:)'
|
||||||
|
|
||||||
|
let b:match_skip =
|
||||||
|
\ 'synIDattr(synID(line("."), col("."), 0), "name") =~# ''' .
|
||||||
|
\ '\<crystal\%(String\|StringDelimiter\|ASCIICode\|Escape\|' .
|
||||||
|
\ 'Interpolation\|NoInterpolation\|Comment\|Documentation\|' .
|
||||||
|
\ 'ConditionalModifier\|' .
|
||||||
|
\ 'Function\|BlockArgument\|KeywordAsMethod\|ClassVariable\|' .
|
||||||
|
\ 'InstanceVariable\|GlobalVariable\|Symbol\)\>'''
|
||||||
|
endif
|
||||||
|
|
||||||
|
" Options for jiangmiao/auto-pairs
|
||||||
|
if exists('g:AutoPairsLoaded')
|
||||||
|
let b:AutoPairs = { '{%': '%}' }
|
||||||
|
call extend(b:AutoPairs, g:AutoPairs, 'force')
|
||||||
|
endif
|
||||||
|
|
||||||
|
" vim: sw=2 sts=2 et:
|
||||||
|
|
||||||
endif
|
endif
|
||||||
|
|||||||
@@ -11,9 +11,7 @@ set smarttab
|
|||||||
|
|
||||||
if exists('g:dhall_use_ctags')
|
if exists('g:dhall_use_ctags')
|
||||||
if g:dhall_use_ctags == 1
|
if g:dhall_use_ctags == 1
|
||||||
augroup dhall
|
autocmd BufWritePost *.dhall silent !ctags -R .
|
||||||
autocmd BufWritePost *.dhall silent !ctags -R .
|
|
||||||
augroup END
|
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
|
|
||||||
@@ -26,14 +24,24 @@ endfunction
|
|||||||
|
|
||||||
if exists('g:dhall_strip_whitespace')
|
if exists('g:dhall_strip_whitespace')
|
||||||
if g:dhall_strip_whitespace == 1
|
if g:dhall_strip_whitespace == 1
|
||||||
augroup dhall
|
au BufWritePre *.dhall silent! call StripTrailingWhitespace()
|
||||||
au BufWritePre *.dhall silent! call StripTrailingWhitespace()
|
|
||||||
augroup END
|
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
|
|
||||||
augroup dhall
|
function! DhallFormat()
|
||||||
au BufNewFile,BufRead *.dhall setl shiftwidth=2
|
let cursor = getpos('.')
|
||||||
augroup END
|
exec 'normal! gg'
|
||||||
|
exec 'silent !dhall format --inplace ' . expand('%')
|
||||||
|
exec 'e'
|
||||||
|
call setpos('.', cursor)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
if exists('g:dhall_format')
|
||||||
|
if g:dhall_format == 1
|
||||||
|
au BufWritePost *.dhall call DhallFormat()
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
au BufNewFile,BufRead *.dhall setl shiftwidth=2
|
||||||
|
|
||||||
endif
|
endif
|
||||||
|
|||||||
@@ -11,6 +11,4 @@ set lisp
|
|||||||
setl commentstring=;\ %s
|
setl commentstring=;\ %s
|
||||||
setl comments=:;
|
setl comments=:;
|
||||||
|
|
||||||
setl iskeyword+=#,?,.,/
|
|
||||||
|
|
||||||
endif
|
endif
|
||||||
100
ftplugin/ecrystal.vim
Normal file
100
ftplugin/ecrystal.vim
Normal file
@@ -0,0 +1,100 @@
|
|||||||
|
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'crystal') == -1
|
||||||
|
|
||||||
|
if exists('b:did_ftplugin')
|
||||||
|
finish
|
||||||
|
endif
|
||||||
|
|
||||||
|
" Define some defaults in case the included ftplugins don't set them.
|
||||||
|
let s:comments = ''
|
||||||
|
let s:shiftwidth = ''
|
||||||
|
let s:undo_ftplugin = ''
|
||||||
|
let s:browsefilter = 'All Files (*.*)\t*.*\n'
|
||||||
|
let s:match_words = ''
|
||||||
|
|
||||||
|
call ecrystal#SetSubtype()
|
||||||
|
|
||||||
|
if b:ecrystal_subtype !=# ''
|
||||||
|
exe 'runtime! ftplugin/'.b:ecrystal_subtype.'.vim ftplugin/'.b:ecrystal_subtype.'_*.vim ftplugin/'.b:ecrystal_subtype.'/*.vim'
|
||||||
|
unlet! b:did_ftplugin
|
||||||
|
|
||||||
|
" Keep the comments for this filetype
|
||||||
|
let s:comments = escape(&comments, ' \')
|
||||||
|
|
||||||
|
" Keep the shiftwidth for this filetype
|
||||||
|
let s:shiftwidth = &shiftwidth
|
||||||
|
|
||||||
|
" Override our defaults if these were set by an included ftplugin.
|
||||||
|
if exists('b:undo_ftplugin')
|
||||||
|
let s:undo_ftplugin = b:undo_ftplugin
|
||||||
|
unlet b:undo_ftplugin
|
||||||
|
endif
|
||||||
|
if exists('b:browsefilter')
|
||||||
|
let s:browsefilter = b:browsefilter
|
||||||
|
unlet b:browsefilter
|
||||||
|
endif
|
||||||
|
if exists('b:match_words')
|
||||||
|
let s:match_words = b:match_words
|
||||||
|
unlet b:match_words
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
runtime! ftplugin/crystal.vim ftplugin/crystal_*.vim ftplugin/crystal/*.vim
|
||||||
|
let b:did_ftplugin = 1
|
||||||
|
|
||||||
|
" Combine the new set of values with those previously included.
|
||||||
|
if exists('b:undo_ftplugin')
|
||||||
|
let s:undo_ftplugin = b:undo_ftplugin . ' | ' . s:undo_ftplugin
|
||||||
|
endif
|
||||||
|
if exists ('b:browsefilter')
|
||||||
|
let s:browsefilter = substitute(b:browsefilter,'\cAll Files (\*\.\*)\t\*\.\*\n','','') . s:browsefilter
|
||||||
|
endif
|
||||||
|
if exists('b:match_words')
|
||||||
|
let s:match_words = b:match_words . ',' . s:match_words
|
||||||
|
endif
|
||||||
|
|
||||||
|
" Change the browse dialog on Win32 to show mainly eCrystal-related files
|
||||||
|
if has('gui_win32')
|
||||||
|
let b:browsefilter='eCrystal Files (*.ecr)\t*.ecr\n' . s:browsefilter
|
||||||
|
endif
|
||||||
|
|
||||||
|
" Load the combined list of match_words for matchit.vim
|
||||||
|
if exists('loaded_matchit')
|
||||||
|
let b:match_words = s:match_words
|
||||||
|
endif
|
||||||
|
|
||||||
|
" Define additional pairs for jiangmiao/auto-pairs
|
||||||
|
if exists('AutoPairsLoaded')
|
||||||
|
let b:AutoPairs = {
|
||||||
|
\ '<%': '%>',
|
||||||
|
\ '<%=': '%>',
|
||||||
|
\ '<%#': '%>',
|
||||||
|
\ '<%-': '-%>',
|
||||||
|
\ '<%-=': '-%>',
|
||||||
|
\ '<%-#': '-%>',
|
||||||
|
\ }
|
||||||
|
|
||||||
|
call extend(b:AutoPairs, g:AutoPairs, 'force')
|
||||||
|
endif
|
||||||
|
|
||||||
|
" Load the subtype's vim-endwise settings
|
||||||
|
if exists('loaded_endwise') && b:ecrystal_subtype !=# ''
|
||||||
|
exec 'doautocmd endwise FileType ' . b:ecrystal_subtype
|
||||||
|
endif
|
||||||
|
|
||||||
|
" Start RagTag
|
||||||
|
if exists('loaded_ragtag')
|
||||||
|
call RagtagInit()
|
||||||
|
endif
|
||||||
|
|
||||||
|
exec 'setlocal comments='.s:comments
|
||||||
|
exec 'setlocal shiftwidth='.s:shiftwidth
|
||||||
|
setlocal commentstring=<%#%s%>
|
||||||
|
|
||||||
|
setlocal suffixesadd=.ecr
|
||||||
|
|
||||||
|
let b:undo_ftplugin = 'setlocal comments< commentstring< shiftwidth<' .
|
||||||
|
\ '| unlet! b:browsefilter b:match_words ' .
|
||||||
|
\ '| unlet! b:AutoPairs ' .
|
||||||
|
\ '| ' . s:undo_ftplugin
|
||||||
|
|
||||||
|
endif
|
||||||
113
ftplugin/elm.vim
113
ftplugin/elm.vim
@@ -1,113 +0,0 @@
|
|||||||
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'elm') == -1
|
|
||||||
|
|
||||||
" plugin for Elm (http://elm-lang.org/)
|
|
||||||
|
|
||||||
if exists('b:did_ftplugin')
|
|
||||||
finish
|
|
||||||
endif
|
|
||||||
|
|
||||||
let b:did_ftplugin = 1
|
|
||||||
|
|
||||||
" Settings
|
|
||||||
if !exists('g:elm_jump_to_error')
|
|
||||||
let g:elm_jump_to_error = 0
|
|
||||||
endif
|
|
||||||
|
|
||||||
if !exists('g:elm_make_output_file')
|
|
||||||
let g:elm_make_output_file = 'elm.js'
|
|
||||||
endif
|
|
||||||
|
|
||||||
if !exists('g:elm_make_show_warnings')
|
|
||||||
let g:elm_make_show_warnings = 0
|
|
||||||
endif
|
|
||||||
|
|
||||||
if !exists('g:elm_syntastic_show_warnings')
|
|
||||||
let g:elm_syntastic_show_warnings = 0
|
|
||||||
endif
|
|
||||||
|
|
||||||
if !exists('g:elm_format_autosave')
|
|
||||||
let g:elm_format_autosave = 1
|
|
||||||
endif
|
|
||||||
|
|
||||||
if !exists('g:elm_format_fail_silently')
|
|
||||||
let g:elm_format_fail_silently = 0
|
|
||||||
endif
|
|
||||||
|
|
||||||
if !exists('g:elm_setup_keybindings')
|
|
||||||
let g:elm_setup_keybindings = 1
|
|
||||||
endif
|
|
||||||
|
|
||||||
setlocal omnifunc=elm#Complete
|
|
||||||
|
|
||||||
setlocal comments=:--
|
|
||||||
setlocal commentstring=--\ %s
|
|
||||||
|
|
||||||
" Commands
|
|
||||||
command -buffer -nargs=? -complete=file ElmMake call elm#Make(<f-args>)
|
|
||||||
command -buffer ElmMakeMain call elm#Make("Main.elm")
|
|
||||||
command -buffer -nargs=? -complete=file ElmTest call elm#Test(<f-args>)
|
|
||||||
command -buffer ElmRepl call elm#Repl()
|
|
||||||
command -buffer ElmErrorDetail call elm#ErrorDetail()
|
|
||||||
command -buffer ElmShowDocs call elm#ShowDocs()
|
|
||||||
command -buffer ElmBrowseDocs call elm#BrowseDocs()
|
|
||||||
command -buffer ElmFormat call elm#Format()
|
|
||||||
|
|
||||||
" Commands cleanup
|
|
||||||
let b:undo_ftplugin = "
|
|
||||||
\ delcommand ElmMake
|
|
||||||
\|delcommand ElmMakeMain
|
|
||||||
\|delcommand ElmTest
|
|
||||||
\|delcommand ElmRepl
|
|
||||||
\|delcommand ElmErrorDetail
|
|
||||||
\|delcommand ElmShowDocs
|
|
||||||
\|delcommand ElmBrowseDocs
|
|
||||||
\|delcommand ElmFormat
|
|
||||||
\"
|
|
||||||
|
|
||||||
if get(g:, 'elm_setup_keybindings', 1)
|
|
||||||
nmap <buffer> <LocalLeader>m <Plug>(elm-make)
|
|
||||||
nmap <buffer> <LocalLeader>b <Plug>(elm-make-main)
|
|
||||||
nmap <buffer> <LocalLeader>t <Plug>(elm-test)
|
|
||||||
nmap <buffer> <LocalLeader>r <Plug>(elm-repl)
|
|
||||||
nmap <buffer> <LocalLeader>e <Plug>(elm-error-detail)
|
|
||||||
nmap <buffer> <LocalLeader>d <Plug>(elm-show-docs)
|
|
||||||
nmap <buffer> <LocalLeader>w <Plug>(elm-browse-docs)
|
|
||||||
endif
|
|
||||||
|
|
||||||
" Better gf command
|
|
||||||
nmap <buffer> gf :call elm#util#GoToModule(expand('<cfile>'))<CR>
|
|
||||||
|
|
||||||
" Elm code formatting on save
|
|
||||||
if get(g:, 'elm_format_autosave', 1)
|
|
||||||
augroup elmFormat
|
|
||||||
autocmd!
|
|
||||||
autocmd BufWritePre *.elm call elm#Format()
|
|
||||||
autocmd BufWritePost *.elm call elm#util#EchoStored()
|
|
||||||
augroup END
|
|
||||||
endif
|
|
||||||
if has('win32')
|
|
||||||
set viewdir=$HOME/vimfiles/views/
|
|
||||||
endif
|
|
||||||
|
|
||||||
" Enable go to file under cursor from module name
|
|
||||||
" Based on: https://github.com/elixir-lang/vim-elixir/blob/bd66ed134319d1e390f3331e8c4d525109f762e8/ftplugin/elixir.vim#L22-L56
|
|
||||||
function! GetElmFilename(word)
|
|
||||||
let l:word = a:word
|
|
||||||
|
|
||||||
" replace module dots with slash
|
|
||||||
let l:word = substitute(l:word,'\.','/','g')
|
|
||||||
|
|
||||||
return l:word
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
let &l:path =
|
|
||||||
\ join([
|
|
||||||
\ elm#FindRootDirectory().'/src',
|
|
||||||
\ elm#FindRootDirectory().'/elm-stuff/packages/**/src',
|
|
||||||
\ &g:path
|
|
||||||
\ ], ',')
|
|
||||||
setlocal includeexpr=GetElmFilename(v:fname)
|
|
||||||
setlocal include=^\\s*import\\s\\+
|
|
||||||
setlocal suffixesadd=.elm
|
|
||||||
|
|
||||||
endif
|
|
||||||
@@ -1,24 +0,0 @@
|
|||||||
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'elm') == -1
|
|
||||||
|
|
||||||
if !executable('ctags')
|
|
||||||
finish
|
|
||||||
elseif globpath(&runtimepath, 'plugin/tagbar.vim') ==? ''
|
|
||||||
finish
|
|
||||||
endif
|
|
||||||
|
|
||||||
function! s:SetTagbar()
|
|
||||||
if !exists('g:tagbar_type_elm')
|
|
||||||
let g:tagbar_type_elm = {
|
|
||||||
\ 'ctagstype' : 'elm',
|
|
||||||
\ 'kinds' : [
|
|
||||||
\ 'c:constants',
|
|
||||||
\ 'f:functions',
|
|
||||||
\ 'p:ports'
|
|
||||||
\ ]
|
|
||||||
\ }
|
|
||||||
endif
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
call s:SetTagbar()
|
|
||||||
|
|
||||||
endif
|
|
||||||
@@ -119,7 +119,7 @@ endif
|
|||||||
" TODO: comments=
|
" TODO: comments=
|
||||||
setlocal commentstring=<%#%s%>
|
setlocal commentstring=<%#%s%>
|
||||||
|
|
||||||
let b:undo_ftplugin = "setl cms< "
|
let b:undo_ftplugin = "setl cms< " .
|
||||||
\ " | unlet! b:browsefilter b:match_words | " . s:undo_ftplugin
|
\ " | unlet! b:browsefilter b:match_words | " . s:undo_ftplugin
|
||||||
|
|
||||||
let &cpo = s:save_cpo
|
let &cpo = s:save_cpo
|
||||||
|
|||||||
30
ftplugin/fennel.vim
Normal file
30
ftplugin/fennel.vim
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'fennel') == -1
|
||||||
|
|
||||||
|
" Vim filetype plugin file
|
||||||
|
" Language: FENNEL
|
||||||
|
" Maintainer: Calvin Rose
|
||||||
|
|
||||||
|
if exists("b:did_ftplugin")
|
||||||
|
finish
|
||||||
|
endif
|
||||||
|
let b:did_ftplugin = 1
|
||||||
|
|
||||||
|
let s:cpo_save = &cpo
|
||||||
|
set cpo&vim
|
||||||
|
|
||||||
|
"setlocal iskeyword+=!,_,%,?,-,*,!,+,/,=,<,>,.,:,$,^
|
||||||
|
setlocal iskeyword=!,$,%,#,*,+,-,.,/,:,<,=,>,?,_,a-z,A-Z,48-57,128-247,124,126,38,94
|
||||||
|
|
||||||
|
" There will be false positives, but this is better than missing the whole set
|
||||||
|
" of user-defined def* definitions.
|
||||||
|
setlocal define=\\v[(/]def(ault)@!\\S*
|
||||||
|
|
||||||
|
" Remove 't' from 'formatoptions' to avoid auto-wrapping code.
|
||||||
|
setlocal formatoptions-=t
|
||||||
|
|
||||||
|
setlocal comments=n:;
|
||||||
|
setlocal commentstring=;\ %s
|
||||||
|
|
||||||
|
let &cpo = s:cpo_save
|
||||||
|
|
||||||
|
endif
|
||||||
@@ -7,7 +7,6 @@ setlocal foldexpr=fish#Fold()
|
|||||||
setlocal formatoptions+=ron1
|
setlocal formatoptions+=ron1
|
||||||
setlocal formatoptions-=t
|
setlocal formatoptions-=t
|
||||||
setlocal include=\\v^\\s*\\.>
|
setlocal include=\\v^\\s*\\.>
|
||||||
setlocal iskeyword=@,48-57,-,_,.,/
|
|
||||||
setlocal suffixesadd^=.fish
|
setlocal suffixesadd^=.fish
|
||||||
|
|
||||||
" Use the 'j' format option when available.
|
" Use the 'j' format option when available.
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'git') == -1
|
|||||||
" Vim filetype plugin
|
" Vim filetype plugin
|
||||||
" Language: generic git output
|
" Language: generic git output
|
||||||
" Maintainer: Tim Pope <vimNOSPAM@tpope.org>
|
" Maintainer: Tim Pope <vimNOSPAM@tpope.org>
|
||||||
" Last Change: 2016 Aug 29
|
" Last Change: 2019 Dec 05
|
||||||
|
|
||||||
" Only do this when not done yet for this buffer
|
" Only do this when not done yet for this buffer
|
||||||
if (exists("b:did_ftplugin"))
|
if (exists("b:did_ftplugin"))
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'git') == -1
|
|||||||
" Vim filetype plugin
|
" Vim filetype plugin
|
||||||
" Language: git commit file
|
" Language: git commit file
|
||||||
" Maintainer: Tim Pope <vimNOSPAM@tpope.org>
|
" Maintainer: Tim Pope <vimNOSPAM@tpope.org>
|
||||||
" Last Change: 2016 Aug 29
|
" Last Change: 2019 Dec 05
|
||||||
|
|
||||||
" Only do this when not done yet for this buffer
|
" Only do this when not done yet for this buffer
|
||||||
if (exists("b:did_ftplugin"))
|
if (exists("b:did_ftplugin"))
|
||||||
@@ -14,6 +14,7 @@ runtime! ftplugin/git.vim
|
|||||||
let b:did_ftplugin = 1
|
let b:did_ftplugin = 1
|
||||||
|
|
||||||
setlocal comments=:# commentstring=#\ %s
|
setlocal comments=:# commentstring=#\ %s
|
||||||
|
setlocal include=^\+\+\+
|
||||||
setlocal nomodeline tabstop=8 formatoptions+=tl textwidth=72
|
setlocal nomodeline tabstop=8 formatoptions+=tl textwidth=72
|
||||||
setlocal formatoptions-=c formatoptions-=r formatoptions-=o formatoptions-=q formatoptions+=n
|
setlocal formatoptions-=c formatoptions-=r formatoptions-=o formatoptions-=q formatoptions+=n
|
||||||
setlocal formatlistpat+=\\\|^\\s*[-*+]\\s\\+
|
setlocal formatlistpat+=\\\|^\\s*[-*+]\\s\\+
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'git') == -1
|
|||||||
" Vim filetype plugin
|
" Vim filetype plugin
|
||||||
" Language: git rebase --interactive
|
" Language: git rebase --interactive
|
||||||
" Maintainer: Tim Pope <vimNOSPAM@tpope.org>
|
" Maintainer: Tim Pope <vimNOSPAM@tpope.org>
|
||||||
" Last Change: 2016 Aug 29
|
" Last Change: 2019 Dec 05
|
||||||
|
|
||||||
" Only do this when not done yet for this buffer
|
" Only do this when not done yet for this buffer
|
||||||
if (exists("b:did_ftplugin"))
|
if (exists("b:did_ftplugin"))
|
||||||
|
|||||||
@@ -1,6 +1,25 @@
|
|||||||
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'graphql') == -1
|
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'graphql') == -1
|
||||||
|
|
||||||
" Vim filetype plugin
|
" Copyright (c) 2016-2020 Jon Parise <jon@indelible.org>
|
||||||
|
"
|
||||||
|
" Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
" of this software and associated documentation files (the "Software"), to
|
||||||
|
" deal in the Software without restriction, including without limitation the
|
||||||
|
" rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||||
|
" sell copies of the Software, and to permit persons to whom the Software is
|
||||||
|
" furnished to do so, subject to the following conditions:
|
||||||
|
"
|
||||||
|
" The above copyright notice and this permission notice shall be included in
|
||||||
|
" all copies or substantial portions of the Software.
|
||||||
|
"
|
||||||
|
" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
" IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
" FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
" AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
" LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||||
|
" FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||||
|
" IN THE SOFTWARE.
|
||||||
|
"
|
||||||
" Language: GraphQL
|
" Language: GraphQL
|
||||||
" Maintainer: Jon Parise <jon@indelible.org>
|
" Maintainer: Jon Parise <jon@indelible.org>
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, '%%PACK%%') == -1
|
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'jq') == -1
|
||||||
|
|
||||||
%%CONTENT%%
|
setlocal commentstring=#%s
|
||||||
|
|
||||||
endif
|
endif
|
||||||
13
ftplugin/jsonnet.vim
Normal file
13
ftplugin/jsonnet.vim
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'jsonnet') == -1
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
" -- fmt
|
||||||
|
command! -nargs=0 JsonnetFmt call jsonnet#Format()
|
||||||
|
|
||||||
|
setlocal commentstring=//\ %s
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
endif
|
||||||
@@ -25,19 +25,23 @@ let b:julia_vim_loaded = 1
|
|||||||
|
|
||||||
let b:undo_ftplugin = "setlocal include< suffixesadd< comments< commentstring<"
|
let b:undo_ftplugin = "setlocal include< suffixesadd< comments< commentstring<"
|
||||||
\ . " define< fo< shiftwidth< expandtab< indentexpr< indentkeys< cinoptions< omnifunc<"
|
\ . " define< fo< shiftwidth< expandtab< indentexpr< indentkeys< cinoptions< omnifunc<"
|
||||||
|
\ . " | unlet! b:commentary_format"
|
||||||
|
\ . " | unlet! b:smartcomment_force_linemode"
|
||||||
\ . " | unlet! b:julia_vim_loaded"
|
\ . " | unlet! b:julia_vim_loaded"
|
||||||
|
|
||||||
" MatchIt plugin support
|
" MatchIt plugin support
|
||||||
if exists("loaded_matchit")
|
if exists("loaded_matchit")
|
||||||
let b:match_ignorecase = 0
|
let b:match_ignorecase = 0
|
||||||
|
|
||||||
" note: begin_keywords must contain all blocks in order
|
" note: begin_keywords must contain all blocks, in order
|
||||||
" for nested-structures-skipping to work properly
|
" for nested-structures-skipping to work properly
|
||||||
let b:julia_begin_keywords = '\%(\%(\.\s*\)\@<!\|\%(@\s*.\s*\)\@<=\)\<\%(\%(staged\)\?function\|macro\|begin\|mutable\s\+struct\|\%(mutable\s\+\)\@<!struct\|\%(abstract\|primitive\)\s\+type\|\%(\(abstract\|primitive\)\s\+\)\@<!type\|immutable\|let\|do\|\%(bare\)\?module\|quote\|if\|for\|while\|try\)\>'
|
" note: 'mutable struct' and 'struct' are defined separately because
|
||||||
|
" using \? puts the cursor on 'struct' instead of 'mutable' for some reason
|
||||||
|
let b:julia_begin_keywords = '\%(\%(\.\s*\)\@<!\|\%(@\s*.\s*\)\@<=\)\<\%(function\|macro\|begin\|mutable\s\+struct\|\%(mutable\s\+\)\@<!struct\|\%(abstract\|primitive\)\s\+type\|let\|do\|\%(bare\)\?module\|quote\|if\|for\|while\|try\)\>'
|
||||||
" note: the following regex not only recognizes macros, but also local/global keywords.
|
" note: the following regex not only recognizes macros, but also local/global keywords.
|
||||||
" the purpose is recognizing things like `@inline myfunction()`
|
" the purpose is recognizing things like `@inline myfunction()`
|
||||||
" or `global myfunction(...)` etc, for matchit and block movement functionality
|
" or `global myfunction(...)` etc, for matchit and block movement functionality
|
||||||
let s:macro_regex = '\%(@\%(#\@!\S\)\+\|\<\%(local\|global\)\)\s\+'
|
let s:macro_regex = '\%(@\%([#(]\@!\S\)\+\|\<\%(local\|global\)\)\s\+'
|
||||||
let s:nomacro = '\%(' . s:macro_regex . '\)\@<!'
|
let s:nomacro = '\%(' . s:macro_regex . '\)\@<!'
|
||||||
let s:yesmacro = s:nomacro . '\%('. s:macro_regex . '\)\+'
|
let s:yesmacro = s:nomacro . '\%('. s:macro_regex . '\)\+'
|
||||||
let b:julia_begin_keywordsm = '\%(' . s:yesmacro . b:julia_begin_keywords . '\)\|'
|
let b:julia_begin_keywordsm = '\%(' . s:yesmacro . b:julia_begin_keywords . '\)\|'
|
||||||
@@ -74,10 +78,10 @@ if exists("loaded_matchit")
|
|||||||
let b:match_words = 'JuliaGetMatchWords()'
|
let b:match_words = 'JuliaGetMatchWords()'
|
||||||
|
|
||||||
" we need to skip everything within comments, strings and
|
" we need to skip everything within comments, strings and
|
||||||
" the 'end' keyword when it is used as a range rather than as
|
" the 'begin' and 'end' keywords when they are used as a range rather than as
|
||||||
" the end of a block
|
" the delimiter of a block
|
||||||
let b:match_skip = 'synIDattr(synID(line("."),col("."),1),"name") =~ '
|
let b:match_skip = 'synIDattr(synID(line("."),col("."),1),"name") =~ '
|
||||||
\ . '"\\<julia\\%(Comprehension\\%(For\\|If\\)\\|RangeEnd\\|SymbolS\\?\\|Comment[LM]\\|\\%([bv]\\|ip\\|MIME\\|Shell\\|Doc\\)\\?String\\|RegEx\\)\\>"'
|
\ . '"\\<julia\\%(Comprehension\\%(For\\|If\\)\\|RangeKeyword\\|SymbolS\\?\\|Comment[LM]\\|\\%([bsvr]\\|ip\\|MIME\\|big\\|raw\\|test\\|html\\|int128\\|Printf\\|Shell\\|Doc\\)\\?String\\|StringPrefixed\\|RegEx\\)\\>"'
|
||||||
|
|
||||||
let b:undo_ftplugin = b:undo_ftplugin
|
let b:undo_ftplugin = b:undo_ftplugin
|
||||||
\ . " | unlet! b:match_words b:match_skip b:match_ignorecase"
|
\ . " | unlet! b:match_words b:match_skip b:match_ignorecase"
|
||||||
@@ -92,6 +96,10 @@ if exists("loaded_matchit")
|
|||||||
|
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
" Some plugin-specific tweaks for commenting
|
||||||
|
let b:commentary_format = "# %s" " for tpope/vim-commentary
|
||||||
|
let b:smartcomment_force_linemode = 1 " for carlobaldassi/vim-smartcomment
|
||||||
|
|
||||||
if has("gui_win32")
|
if has("gui_win32")
|
||||||
let b:browsefilter = "Julia Source Files (*.jl)\t*.jl\n"
|
let b:browsefilter = "Julia Source Files (*.jl)\t*.jl\n"
|
||||||
let b:undo_ftplugin = b:undo_ftplugin . " | unlet! b:browsefilter"
|
let b:undo_ftplugin = b:undo_ftplugin . " | unlet! b:browsefilter"
|
||||||
|
|||||||
@@ -1,417 +0,0 @@
|
|||||||
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'latex') == -1
|
|
||||||
|
|
||||||
" LaTeX Box common functions
|
|
||||||
|
|
||||||
" Error Format {{{
|
|
||||||
" Note: The error formats assume we're using the -file-line-error with
|
|
||||||
" [pdf]latex.
|
|
||||||
" Note: See |errorformat-LaTeX| for more info.
|
|
||||||
|
|
||||||
" Check for options
|
|
||||||
if !exists("g:LatexBox_show_warnings")
|
|
||||||
let g:LatexBox_show_warnings=1
|
|
||||||
endif
|
|
||||||
if !exists("g:LatexBox_ignore_warnings")
|
|
||||||
let g:LatexBox_ignore_warnings =
|
|
||||||
\['Underfull',
|
|
||||||
\ 'Overfull',
|
|
||||||
\ 'specifier changed to']
|
|
||||||
endif
|
|
||||||
|
|
||||||
" Standard error message formats
|
|
||||||
" Note: We consider statements that starts with "!" as errors
|
|
||||||
setlocal efm=%E!\ LaTeX\ %trror:\ %m
|
|
||||||
setlocal efm+=%E%f:%l:\ %m
|
|
||||||
setlocal efm+=%E!\ %m
|
|
||||||
|
|
||||||
" More info for undefined control sequences
|
|
||||||
setlocal efm+=%Z<argument>\ %m
|
|
||||||
|
|
||||||
" More info for some errors
|
|
||||||
setlocal efm+=%Cl.%l\ %m
|
|
||||||
|
|
||||||
" Show or ignore warnings
|
|
||||||
if g:LatexBox_show_warnings
|
|
||||||
" Parse biblatex warnings
|
|
||||||
setlocal efm+=%-C(biblatex)%.%#in\ t%.%#
|
|
||||||
setlocal efm+=%-C(biblatex)%.%#Please\ v%.%#
|
|
||||||
setlocal efm+=%-C(biblatex)%.%#LaTeX\ a%.%#
|
|
||||||
setlocal efm+=%-Z(biblatex)%m
|
|
||||||
|
|
||||||
" Parse hyperref warnings
|
|
||||||
setlocal efm+=%-C(hyperref)%.%#on\ input\ line\ %l.
|
|
||||||
|
|
||||||
for w in g:LatexBox_ignore_warnings
|
|
||||||
let warning = escape(substitute(w, '[\,]', '%\\\\&', 'g'), ' ')
|
|
||||||
exe 'setlocal efm+=%-G%.%#'. warning .'%.%#'
|
|
||||||
endfor
|
|
||||||
setlocal efm+=%+WLaTeX\ %.%#Warning:\ %.%#line\ %l%.%#
|
|
||||||
setlocal efm+=%+W%.%#\ at\ lines\ %l--%*\\d
|
|
||||||
setlocal efm+=%+WLaTeX\ %.%#Warning:\ %m
|
|
||||||
setlocal efm+=%+W%.%#Warning:\ %m
|
|
||||||
else
|
|
||||||
setlocal efm+=%-WLaTeX\ %.%#Warning:\ %.%#line\ %l%.%#
|
|
||||||
setlocal efm+=%-W%.%#\ at\ lines\ %l--%*\\d
|
|
||||||
setlocal efm+=%-WLaTeX\ %.%#Warning:\ %m
|
|
||||||
setlocal efm+=%-W%.%#Warning:\ %m
|
|
||||||
endif
|
|
||||||
|
|
||||||
" Push file to file stack
|
|
||||||
setlocal efm+=%+P**%f
|
|
||||||
setlocal efm+=%+P**\"%f\"
|
|
||||||
|
|
||||||
" Ignore unmatched lines
|
|
||||||
setlocal efm+=%-G%.%#
|
|
||||||
" }}}
|
|
||||||
|
|
||||||
" Vim Windows {{{
|
|
||||||
|
|
||||||
" Type of split, "new" for horiz. "vnew" for vert.
|
|
||||||
if !exists('g:LatexBox_split_type')
|
|
||||||
let g:LatexBox_split_type = "vnew"
|
|
||||||
endif
|
|
||||||
|
|
||||||
" Length of vertical splits
|
|
||||||
if !exists('g:LatexBox_split_length')
|
|
||||||
let g:LatexBox_split_length = 15
|
|
||||||
endif
|
|
||||||
|
|
||||||
" Width of horizontal splits
|
|
||||||
if !exists('g:LatexBox_split_width')
|
|
||||||
let g:LatexBox_split_width = 30
|
|
||||||
endif
|
|
||||||
|
|
||||||
" Where splits appear
|
|
||||||
if !exists('g:LatexBox_split_side')
|
|
||||||
let g:LatexBox_split_side = "aboveleft"
|
|
||||||
endif
|
|
||||||
|
|
||||||
" Resize when split?
|
|
||||||
if !exists('g:LatexBox_split_resize')
|
|
||||||
let g:LatexBox_split_resize = 0
|
|
||||||
endif
|
|
||||||
|
|
||||||
" Toggle help info
|
|
||||||
if !exists('g:LatexBox_toc_hidehelp')
|
|
||||||
let g:LatexBox_toc_hidehelp = 0
|
|
||||||
endif
|
|
||||||
" }}}
|
|
||||||
|
|
||||||
" Filename utilities {{{
|
|
||||||
function! LatexBox_GetMainTexFile()
|
|
||||||
|
|
||||||
" 1. check for the b:main_tex_file variable
|
|
||||||
if exists('b:main_tex_file') && filereadable(b:main_tex_file)
|
|
||||||
return b:main_tex_file
|
|
||||||
endif
|
|
||||||
|
|
||||||
|
|
||||||
" 2. scan the first few lines of the file for root = filename
|
|
||||||
for linenum in range(1,5)
|
|
||||||
let linecontents = getline(linenum)
|
|
||||||
if linecontents =~ 'root\s*='
|
|
||||||
" Remove everything but the filename
|
|
||||||
let b:main_tex_file = substitute(linecontents,
|
|
||||||
\ '.*root\s*=\s*', "", "")
|
|
||||||
let b:main_tex_file = substitute(b:main_tex_file, '\s*$', "", "")
|
|
||||||
" Prepend current directory if this isn't an absolute path
|
|
||||||
if b:main_tex_file !~ '^/'
|
|
||||||
let b:main_tex_file = expand('%:p:h') . '/' . b:main_tex_file
|
|
||||||
endif
|
|
||||||
let b:main_tex_file = fnamemodify(b:main_tex_file, ":p")
|
|
||||||
if b:main_tex_file !~ '\.tex$'
|
|
||||||
let b:main_tex_file .= '.tex'
|
|
||||||
endif
|
|
||||||
return b:main_tex_file
|
|
||||||
endif
|
|
||||||
endfor
|
|
||||||
|
|
||||||
" 3. scan current file for "\begin{document}"
|
|
||||||
if &filetype == 'tex' && search('\m\C\\begin\_\s*{document}', 'nw') != 0
|
|
||||||
return expand('%:p')
|
|
||||||
endif
|
|
||||||
|
|
||||||
" 4. use 'main.tex' if it exists in the same directory (and is readable)
|
|
||||||
let s:main_dot_tex_file=expand('%:p:h') . '/main.tex'
|
|
||||||
if filereadable(s:main_dot_tex_file)
|
|
||||||
let b:main_tex_file=s:main_dot_tex_file
|
|
||||||
return b:main_tex_file
|
|
||||||
endif
|
|
||||||
|
|
||||||
" 5. borrow the Vim-Latex-Suite method of finding it
|
|
||||||
if LatexBox_GetMainFileName() != expand('%:p')
|
|
||||||
let b:main_tex_file = LatexBox_GetMainFileName()
|
|
||||||
return b:main_tex_file
|
|
||||||
endif
|
|
||||||
|
|
||||||
" 6. prompt for file with completion
|
|
||||||
let b:main_tex_file = s:PromptForMainFile()
|
|
||||||
return b:main_tex_file
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
function! s:PromptForMainFile()
|
|
||||||
let saved_dir = getcwd()
|
|
||||||
execute 'cd ' . fnameescape(expand('%:p:h'))
|
|
||||||
|
|
||||||
" Prompt for file
|
|
||||||
let l:file = ''
|
|
||||||
while !filereadable(l:file)
|
|
||||||
let l:file = input('main LaTeX file: ', '', 'file')
|
|
||||||
if l:file !~ '\.tex$'
|
|
||||||
let l:file .= '.tex'
|
|
||||||
endif
|
|
||||||
endwhile
|
|
||||||
let l:file = fnamemodify(l:file, ':p')
|
|
||||||
|
|
||||||
" Make persistent
|
|
||||||
let l:persistent = ''
|
|
||||||
while l:persistent !~ '\v^(y|n)'
|
|
||||||
let l:persistent = input('make choice persistent? (y, n) ')
|
|
||||||
if l:persistent == 'y'
|
|
||||||
call writefile([], l:file . '.latexmain')
|
|
||||||
endif
|
|
||||||
endwhile
|
|
||||||
|
|
||||||
execute 'cd ' . fnameescape(saved_dir)
|
|
||||||
return l:file
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" Return the directory of the main tex file
|
|
||||||
function! LatexBox_GetTexRoot()
|
|
||||||
return fnamemodify(LatexBox_GetMainTexFile(), ':h')
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
function! LatexBox_GetBuildBasename(with_dir)
|
|
||||||
" 1. Check for g:LatexBox_jobname
|
|
||||||
if exists('g:LatexBox_jobname')
|
|
||||||
return g:LatexBox_jobname
|
|
||||||
endif
|
|
||||||
|
|
||||||
" 2. Get the basename from the main tex file
|
|
||||||
if a:with_dir
|
|
||||||
return fnamemodify(LatexBox_GetMainTexFile(), ':r')
|
|
||||||
else
|
|
||||||
return fnamemodify(LatexBox_GetMainTexFile(), ':t:r')
|
|
||||||
endif
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
function! LatexBox_GetAuxFile()
|
|
||||||
" 1. check for b:build_dir variable
|
|
||||||
if exists('b:build_dir') && isdirectory(b:build_dir)
|
|
||||||
return b:build_dir . '/' . LatexBox_GetBuildBasename(0) . '.aux'
|
|
||||||
endif
|
|
||||||
|
|
||||||
" 2. check for g:LatexBox_build_dir variable
|
|
||||||
if exists('g:LatexBox_build_dir') && isdirectory(g:LatexBox_build_dir)
|
|
||||||
return g:LatexBox_build_dir . '/' . LatexBox_GetBuildBasename(0) . '.aux'
|
|
||||||
endif
|
|
||||||
|
|
||||||
" 3. use the base name of main tex file
|
|
||||||
return LatexBox_GetBuildBasename(1) . '.aux'
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
function! LatexBox_GetLogFile()
|
|
||||||
" 1. check for b:build_dir variable
|
|
||||||
if exists('b:build_dir') && isdirectory(b:build_dir)
|
|
||||||
return b:build_dir . '/' . LatexBox_GetBuildBasename(0) . '.log'
|
|
||||||
endif
|
|
||||||
|
|
||||||
" 2. check for g:LatexBox_build_dir variable
|
|
||||||
if exists('g:LatexBox_build_dir') && isdirectory(g:LatexBox_build_dir)
|
|
||||||
return g:LatexBox_build_dir . '/' . LatexBox_GetBuildBasename(0) . '.log'
|
|
||||||
endif
|
|
||||||
|
|
||||||
" 3. use the base name of main tex file
|
|
||||||
return LatexBox_GetBuildBasename(1) . '.log'
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
function! LatexBox_GetOutputFile()
|
|
||||||
" 1. check for b:build_dir variable
|
|
||||||
if exists('b:build_dir') && isdirectory(b:build_dir)
|
|
||||||
return b:build_dir . '/' . LatexBox_GetBuildBasename(0)
|
|
||||||
\ . '.' . g:LatexBox_output_type
|
|
||||||
endif
|
|
||||||
|
|
||||||
" 2. check for g:LatexBox_build_dir variable
|
|
||||||
if exists('g:LatexBox_build_dir') && isdirectory(g:LatexBox_build_dir)
|
|
||||||
return g:LatexBox_build_dir . '/' . LatexBox_GetBuildBasename(0)
|
|
||||||
\ . '.' . g:LatexBox_output_type
|
|
||||||
endif
|
|
||||||
|
|
||||||
" 3. use the base name of main tex file
|
|
||||||
return LatexBox_GetBuildBasename(1) . '.' . g:LatexBox_output_type
|
|
||||||
endfunction
|
|
||||||
" }}}
|
|
||||||
|
|
||||||
" View Output {{{
|
|
||||||
|
|
||||||
" Default pdf viewer
|
|
||||||
if !exists('g:LatexBox_viewer')
|
|
||||||
" On windows, 'running' a file will open it with the default program
|
|
||||||
let s:viewer = ''
|
|
||||||
if has('unix')
|
|
||||||
" echo -n necessary as uname -s will append \n otherwise
|
|
||||||
let s:uname = system('echo -n $(uname -s)')
|
|
||||||
if s:uname == "Darwin"
|
|
||||||
let s:viewer = 'open'
|
|
||||||
else
|
|
||||||
let s:viewer = 'xdg-open'
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
let g:LatexBox_viewer = s:viewer
|
|
||||||
endif
|
|
||||||
|
|
||||||
function! LatexBox_View(...)
|
|
||||||
let lvargs = join(a:000, ' ')
|
|
||||||
let outfile = LatexBox_GetOutputFile()
|
|
||||||
if !filereadable(outfile)
|
|
||||||
echomsg fnamemodify(outfile, ':.') . ' is not readable'
|
|
||||||
return
|
|
||||||
endif
|
|
||||||
let cmd = g:LatexBox_viewer . ' ' . lvargs . ' ' . shellescape(outfile)
|
|
||||||
if has('win32')
|
|
||||||
let cmd = '!start /b ' . cmd . ' >nul'
|
|
||||||
else
|
|
||||||
let cmd = '!' . cmd . ' '
|
|
||||||
if fnamemodify(&shell, ':t') ==# 'fish'
|
|
||||||
let cmd .= ' >/dev/null ^/dev/null &'
|
|
||||||
else
|
|
||||||
let cmd .= ' &>/dev/null &'
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
silent execute cmd
|
|
||||||
if !has("gui_running")
|
|
||||||
redraw!
|
|
||||||
endif
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
command! -nargs=* LatexView call LatexBox_View('<args>')
|
|
||||||
" }}}
|
|
||||||
|
|
||||||
" In Comment {{{
|
|
||||||
|
|
||||||
" LatexBox_InComment([line], [col])
|
|
||||||
" return true if inside comment
|
|
||||||
function! LatexBox_InComment(...)
|
|
||||||
let line = a:0 >= 1 ? a:1 : line('.')
|
|
||||||
let col = a:0 >= 2 ? a:2 : col('.')
|
|
||||||
return synIDattr(synID(line, col, 0), "name") =~# '^texComment'
|
|
||||||
endfunction
|
|
||||||
" }}}
|
|
||||||
|
|
||||||
" Get Current Environment {{{
|
|
||||||
|
|
||||||
" LatexBox_GetCurrentEnvironment([with_pos])
|
|
||||||
" Returns:
|
|
||||||
" - environment
|
|
||||||
" if with_pos is not given
|
|
||||||
" - [envirnoment, lnum_begin, cnum_begin, lnum_end, cnum_end]
|
|
||||||
" if with_pos is nonzero
|
|
||||||
function! LatexBox_GetCurrentEnvironment(...)
|
|
||||||
if a:0 > 0
|
|
||||||
let with_pos = a:1
|
|
||||||
else
|
|
||||||
let with_pos = 0
|
|
||||||
endif
|
|
||||||
|
|
||||||
let begin_pat = '\C\\begin\_\s*{[^}]*}\|\\\@<!\\\[\|\\\@<!\\('
|
|
||||||
let end_pat = '\C\\end\_\s*{[^}]*}\|\\\@<!\\\]\|\\\@<!\\)'
|
|
||||||
let saved_pos = getpos('.')
|
|
||||||
|
|
||||||
" move to the left until on a backslash
|
|
||||||
let [bufnum, lnum, cnum, off] = getpos('.')
|
|
||||||
let line = getline(lnum)
|
|
||||||
while cnum > 1 && line[cnum - 1] != '\'
|
|
||||||
let cnum -= 1
|
|
||||||
endwhile
|
|
||||||
call cursor(lnum, cnum)
|
|
||||||
|
|
||||||
" match begin/end pairs but skip comments
|
|
||||||
let flags = 'bnW'
|
|
||||||
if strpart(getline('.'), col('.') - 1) =~ '^\%(' . begin_pat . '\)'
|
|
||||||
let flags .= 'c'
|
|
||||||
endif
|
|
||||||
let [lnum1, cnum1] = searchpairpos(begin_pat, '', end_pat, flags,
|
|
||||||
\ 'LatexBox_InComment()')
|
|
||||||
|
|
||||||
let env = ''
|
|
||||||
|
|
||||||
if lnum1
|
|
||||||
let line = strpart(getline(lnum1), cnum1 - 1)
|
|
||||||
|
|
||||||
if empty(env)
|
|
||||||
let env = matchstr(line, '^\C\\begin\_\s*{\zs[^}]*\ze}')
|
|
||||||
endif
|
|
||||||
if empty(env)
|
|
||||||
let env = matchstr(line, '^\\\[')
|
|
||||||
endif
|
|
||||||
if empty(env)
|
|
||||||
let env = matchstr(line, '^\\(')
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
|
|
||||||
if with_pos == 1
|
|
||||||
let flags = 'nW'
|
|
||||||
if !(lnum1 == lnum && cnum1 == cnum)
|
|
||||||
let flags .= 'c'
|
|
||||||
endif
|
|
||||||
|
|
||||||
let [lnum2, cnum2] = searchpairpos(begin_pat, '', end_pat, flags,
|
|
||||||
\ 'LatexBox_InComment()')
|
|
||||||
|
|
||||||
call setpos('.', saved_pos)
|
|
||||||
return [env, lnum1, cnum1, lnum2, cnum2]
|
|
||||||
else
|
|
||||||
call setpos('.', saved_pos)
|
|
||||||
return env
|
|
||||||
endif
|
|
||||||
endfunction
|
|
||||||
" }}}
|
|
||||||
|
|
||||||
" Tex To Tree {{{
|
|
||||||
" stores nested braces in a tree structure
|
|
||||||
function! LatexBox_TexToTree(str)
|
|
||||||
let tree = []
|
|
||||||
let i1 = 0
|
|
||||||
let i2 = -1
|
|
||||||
let depth = 0
|
|
||||||
while i2 < len(a:str)
|
|
||||||
let i2 = match(a:str, '[{}]', i2 + 1)
|
|
||||||
if i2 < 0
|
|
||||||
let i2 = len(a:str)
|
|
||||||
endif
|
|
||||||
if i2 >= len(a:str) || a:str[i2] == '{'
|
|
||||||
if depth == 0
|
|
||||||
let item = substitute(strpart(a:str, i1, i2 - i1),
|
|
||||||
\ '^\s*\|\s*$', '', 'g')
|
|
||||||
if !empty(item)
|
|
||||||
call add(tree, item)
|
|
||||||
endif
|
|
||||||
let i1 = i2 + 1
|
|
||||||
endif
|
|
||||||
let depth += 1
|
|
||||||
else
|
|
||||||
let depth -= 1
|
|
||||||
if depth == 0
|
|
||||||
call add(tree, LatexBox_TexToTree(strpart(a:str, i1, i2 - i1)))
|
|
||||||
let i1 = i2 + 1
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
endwhile
|
|
||||||
return tree
|
|
||||||
endfunction
|
|
||||||
" }}}
|
|
||||||
|
|
||||||
" Tree To Tex {{{
|
|
||||||
function! LatexBox_TreeToTex(tree)
|
|
||||||
if type(a:tree) == type('')
|
|
||||||
return a:tree
|
|
||||||
else
|
|
||||||
return '{' . join(map(a:tree, 'LatexBox_TreeToTex(v:val)'), '') . '}'
|
|
||||||
endif
|
|
||||||
endfunction
|
|
||||||
" }}}
|
|
||||||
|
|
||||||
" vim:fdm=marker:ff=unix:noet:ts=4:sw=4
|
|
||||||
|
|
||||||
endif
|
|
||||||
@@ -1,936 +0,0 @@
|
|||||||
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'latex') == -1
|
|
||||||
|
|
||||||
" LaTeX Box completion
|
|
||||||
|
|
||||||
setlocal omnifunc=LatexBox_Complete
|
|
||||||
|
|
||||||
" <SID> Wrap {{{
|
|
||||||
function! s:GetSID()
|
|
||||||
return matchstr(expand('<sfile>'), '\zs<SNR>\d\+_\ze.*$')
|
|
||||||
endfunction
|
|
||||||
let s:SID = s:GetSID()
|
|
||||||
function! s:SIDWrap(func)
|
|
||||||
return s:SID . a:func
|
|
||||||
endfunction
|
|
||||||
" }}}
|
|
||||||
|
|
||||||
" Completion {{{
|
|
||||||
if !exists('g:LatexBox_completion_close_braces')
|
|
||||||
let g:LatexBox_completion_close_braces = 1
|
|
||||||
endif
|
|
||||||
if !exists('g:LatexBox_bibtex_wild_spaces')
|
|
||||||
let g:LatexBox_bibtex_wild_spaces = 1
|
|
||||||
endif
|
|
||||||
|
|
||||||
if !exists('g:LatexBox_cite_pattern')
|
|
||||||
let g:LatexBox_cite_pattern = '\C\\\a*cite\a*\*\?\(\[[^\]]*\]\)*\_\s*{'
|
|
||||||
endif
|
|
||||||
if !exists('g:LatexBox_ref_pattern')
|
|
||||||
let g:LatexBox_ref_pattern = '\C\\v\?\(eq\|page\|[cC]\|labelc\|name\|auto\)\?ref\*\?\_\s*{'
|
|
||||||
endif
|
|
||||||
|
|
||||||
if !exists('g:LatexBox_completion_environments')
|
|
||||||
let g:LatexBox_completion_environments = [
|
|
||||||
\ {'word': 'itemize', 'menu': 'bullet list' },
|
|
||||||
\ {'word': 'enumerate', 'menu': 'numbered list' },
|
|
||||||
\ {'word': 'description', 'menu': 'description' },
|
|
||||||
\ {'word': 'center', 'menu': 'centered text' },
|
|
||||||
\ {'word': 'figure', 'menu': 'floating figure' },
|
|
||||||
\ {'word': 'table', 'menu': 'floating table' },
|
|
||||||
\ {'word': 'equation', 'menu': 'equation (numbered)' },
|
|
||||||
\ {'word': 'align', 'menu': 'aligned equations (numbered)' },
|
|
||||||
\ {'word': 'align*', 'menu': 'aligned equations' },
|
|
||||||
\ {'word': 'document' },
|
|
||||||
\ {'word': 'abstract' },
|
|
||||||
\ ]
|
|
||||||
endif
|
|
||||||
|
|
||||||
if !exists('g:LatexBox_completion_commands')
|
|
||||||
let g:LatexBox_completion_commands = [
|
|
||||||
\ {'word': '\begin{' },
|
|
||||||
\ {'word': '\end{' },
|
|
||||||
\ {'word': '\item' },
|
|
||||||
\ {'word': '\label{' },
|
|
||||||
\ {'word': '\ref{' },
|
|
||||||
\ {'word': '\eqref{eq:' },
|
|
||||||
\ {'word': '\cite{' },
|
|
||||||
\ {'word': '\chapter{' },
|
|
||||||
\ {'word': '\section{' },
|
|
||||||
\ {'word': '\subsection{' },
|
|
||||||
\ {'word': '\subsubsection{' },
|
|
||||||
\ {'word': '\paragraph{' },
|
|
||||||
\ {'word': '\nonumber' },
|
|
||||||
\ {'word': '\bibliography' },
|
|
||||||
\ {'word': '\bibliographystyle' },
|
|
||||||
\ ]
|
|
||||||
endif
|
|
||||||
|
|
||||||
if !exists('g:LatexBox_complete_inlineMath')
|
|
||||||
let g:LatexBox_complete_inlineMath = 0
|
|
||||||
endif
|
|
||||||
|
|
||||||
if !exists('g:LatexBox_eq_env_patterns')
|
|
||||||
let g:LatexBox_eq_env_patterns = 'equation\|gather\|multiline\|align\|flalign\|alignat\|eqnarray'
|
|
||||||
endif
|
|
||||||
|
|
||||||
" }}}
|
|
||||||
|
|
||||||
"LatexBox_kpsewhich {{{
|
|
||||||
function! LatexBox_kpsewhich(file)
|
|
||||||
let old_dir = getcwd()
|
|
||||||
execute 'lcd ' . fnameescape(LatexBox_GetTexRoot())
|
|
||||||
let out = system('kpsewhich "' . a:file . '"')
|
|
||||||
|
|
||||||
" If kpsewhich has found something, it returns a non-empty string with a
|
|
||||||
" newline at the end; otherwise the string is empty
|
|
||||||
if len(out)
|
|
||||||
" Remove the trailing newline
|
|
||||||
let out = fnamemodify(out[:-2], ':p')
|
|
||||||
endif
|
|
||||||
|
|
||||||
execute 'lcd ' . fnameescape(old_dir)
|
|
||||||
|
|
||||||
return out
|
|
||||||
endfunction
|
|
||||||
"}}}
|
|
||||||
|
|
||||||
" Omni Completion {{{
|
|
||||||
|
|
||||||
let s:completion_type = ''
|
|
||||||
|
|
||||||
function! LatexBox_Complete(findstart, base)
|
|
||||||
if a:findstart
|
|
||||||
" return the starting position of the word
|
|
||||||
let line = getline('.')
|
|
||||||
let pos = col('.') - 1
|
|
||||||
while pos > 0 && line[pos - 1] !~ '\\\|{'
|
|
||||||
let pos -= 1
|
|
||||||
endwhile
|
|
||||||
|
|
||||||
let line_start = line[:pos-1]
|
|
||||||
if line_start =~ '\m\C\\begin\_\s*{$'
|
|
||||||
let s:completion_type = 'begin'
|
|
||||||
elseif line_start =~ '\m\C\\end\_\s*{$'
|
|
||||||
let s:completion_type = 'end'
|
|
||||||
elseif line_start =~ '\m' . g:LatexBox_ref_pattern . '$'
|
|
||||||
let s:completion_type = 'ref'
|
|
||||||
elseif line_start =~ '\m' . g:LatexBox_cite_pattern . '$'
|
|
||||||
let s:completion_type = 'bib'
|
|
||||||
" check for multiple citations
|
|
||||||
let pos = col('.') - 1
|
|
||||||
while pos > 0 && line[pos - 1] !~ '{\|,'
|
|
||||||
let pos -= 1
|
|
||||||
endwhile
|
|
||||||
elseif s:LatexBox_complete_inlineMath_or_not()
|
|
||||||
let s:completion_type = 'inlineMath'
|
|
||||||
let pos = s:eq_pos
|
|
||||||
else
|
|
||||||
let s:completion_type = 'command'
|
|
||||||
if line[pos - 1] == '\'
|
|
||||||
let pos -= 1
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
return pos
|
|
||||||
else
|
|
||||||
" return suggestions in an array
|
|
||||||
let suggestions = []
|
|
||||||
|
|
||||||
if s:completion_type == 'begin'
|
|
||||||
" suggest known environments
|
|
||||||
for entry in g:LatexBox_completion_environments
|
|
||||||
if entry.word =~ '^' . escape(a:base, '\')
|
|
||||||
if g:LatexBox_completion_close_braces && !s:NextCharsMatch('^}')
|
|
||||||
" add trailing '}'
|
|
||||||
let entry = copy(entry)
|
|
||||||
let entry.abbr = entry.word
|
|
||||||
let entry.word = entry.word . '}'
|
|
||||||
endif
|
|
||||||
call add(suggestions, entry)
|
|
||||||
endif
|
|
||||||
endfor
|
|
||||||
elseif s:completion_type == 'end'
|
|
||||||
" suggest known environments
|
|
||||||
let env = LatexBox_GetCurrentEnvironment()
|
|
||||||
if env != ''
|
|
||||||
if g:LatexBox_completion_close_braces && !s:NextCharsMatch('^\s*[,}]')
|
|
||||||
call add(suggestions, {'word': env . '}', 'abbr': env})
|
|
||||||
else
|
|
||||||
call add(suggestions, env)
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
elseif s:completion_type == 'command'
|
|
||||||
" suggest known commands
|
|
||||||
for entry in g:LatexBox_completion_commands
|
|
||||||
if entry.word =~ '^' . escape(a:base, '\')
|
|
||||||
" do not display trailing '{'
|
|
||||||
if entry.word =~ '{'
|
|
||||||
let entry.abbr = entry.word[0:-2]
|
|
||||||
endif
|
|
||||||
call add(suggestions, entry)
|
|
||||||
endif
|
|
||||||
endfor
|
|
||||||
elseif s:completion_type == 'ref'
|
|
||||||
let suggestions = s:CompleteLabels(a:base)
|
|
||||||
elseif s:completion_type == 'bib'
|
|
||||||
" suggest BibTeX entries
|
|
||||||
let suggestions = LatexBox_BibComplete(a:base)
|
|
||||||
elseif s:completion_type == 'inlineMath'
|
|
||||||
let suggestions = s:LatexBox_inlineMath_completion(a:base)
|
|
||||||
endif
|
|
||||||
if !has('gui_running')
|
|
||||||
redraw!
|
|
||||||
endif
|
|
||||||
return suggestions
|
|
||||||
endif
|
|
||||||
endfunction
|
|
||||||
" }}}
|
|
||||||
|
|
||||||
" BibTeX search {{{
|
|
||||||
|
|
||||||
" find the \bibliography{...} commands
|
|
||||||
" the optional argument is the file name to be searched
|
|
||||||
|
|
||||||
function! s:FindBibData(...)
|
|
||||||
if a:0 == 0
|
|
||||||
let file = LatexBox_GetMainTexFile()
|
|
||||||
else
|
|
||||||
let file = a:1
|
|
||||||
endif
|
|
||||||
|
|
||||||
if !filereadable(file)
|
|
||||||
return []
|
|
||||||
endif
|
|
||||||
let lines = readfile(file)
|
|
||||||
let bibdata_list = []
|
|
||||||
|
|
||||||
"
|
|
||||||
" Search for added bibliographies
|
|
||||||
"
|
|
||||||
let bibliography_cmds = [
|
|
||||||
\ '\\bibliography',
|
|
||||||
\ '\\addbibresource',
|
|
||||||
\ '\\addglobalbib',
|
|
||||||
\ '\\addsectionbib',
|
|
||||||
\ ]
|
|
||||||
for cmd in bibliography_cmds
|
|
||||||
let filtered = filter(copy(lines),
|
|
||||||
\ 'v:val =~ ''\C' . cmd . '\s*{[^}]\+}''')
|
|
||||||
let files = map(filtered,
|
|
||||||
\ 'matchstr(v:val, ''\C' . cmd . '\s*{\zs[^}]\+\ze}'')')
|
|
||||||
for file in files
|
|
||||||
let bibdata_list += map(split(file, ','),
|
|
||||||
\ 'fnamemodify(v:val, '':r'')')
|
|
||||||
endfor
|
|
||||||
endfor
|
|
||||||
|
|
||||||
"
|
|
||||||
" Also search included files
|
|
||||||
"
|
|
||||||
for input in filter(lines,
|
|
||||||
\ 'v:val =~ ''\C\\\%(input\|include\)\s*{[^}]\+}''')
|
|
||||||
let bibdata_list += s:FindBibData(LatexBox_kpsewhich(
|
|
||||||
\ matchstr(input,
|
|
||||||
\ '\C\\\%(input\|include\)\s*{\zs[^}]\+\ze}')))
|
|
||||||
endfor
|
|
||||||
|
|
||||||
return bibdata_list
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
let s:bstfile = expand('<sfile>:p:h') . '/vimcomplete'
|
|
||||||
|
|
||||||
function! LatexBox_BibSearch(regexp)
|
|
||||||
let res = []
|
|
||||||
|
|
||||||
" Find data from bib files
|
|
||||||
let bibdata = join(s:FindBibData(), ',')
|
|
||||||
if bibdata != ''
|
|
||||||
|
|
||||||
" write temporary aux file
|
|
||||||
let tmpbase = LatexBox_GetTexRoot() . '/_LatexBox_BibComplete'
|
|
||||||
let auxfile = tmpbase . '.aux'
|
|
||||||
let bblfile = tmpbase . '.bbl'
|
|
||||||
let blgfile = tmpbase . '.blg'
|
|
||||||
|
|
||||||
call writefile(['\citation{*}', '\bibstyle{' . s:bstfile . '}',
|
|
||||||
\ '\bibdata{' . bibdata . '}'], auxfile)
|
|
||||||
|
|
||||||
if has('win32')
|
|
||||||
let l:old_shellslash = &l:shellslash
|
|
||||||
setlocal noshellslash
|
|
||||||
call system('cd ' . shellescape(LatexBox_GetTexRoot()) .
|
|
||||||
\ ' & bibtex -terse '
|
|
||||||
\ . fnamemodify(auxfile, ':t') . ' >nul')
|
|
||||||
let &l:shellslash = l:old_shellslash
|
|
||||||
else
|
|
||||||
call system('cd ' . shellescape(LatexBox_GetTexRoot()) .
|
|
||||||
\ ' ; bibtex -terse '
|
|
||||||
\ . fnamemodify(auxfile, ':t') . ' >/dev/null')
|
|
||||||
endif
|
|
||||||
|
|
||||||
let lines = split(substitute(join(readfile(bblfile), "\n"),
|
|
||||||
\ '\n\n\@!\(\s\=\)\s*\|{\|}', '\1', 'g'), "\n")
|
|
||||||
|
|
||||||
for line in filter(lines, 'v:val =~ a:regexp')
|
|
||||||
let matches = matchlist(line,
|
|
||||||
\ '^\(.*\)||\(.*\)||\(.*\)||\(.*\)||\(.*\)')
|
|
||||||
if !empty(matches) && !empty(matches[1])
|
|
||||||
let s:type_length = max([s:type_length,
|
|
||||||
\ len(matches[2]) + 3])
|
|
||||||
call add(res, {
|
|
||||||
\ 'key': matches[1],
|
|
||||||
\ 'type': matches[2],
|
|
||||||
\ 'author': matches[3],
|
|
||||||
\ 'year': matches[4],
|
|
||||||
\ 'title': matches[5],
|
|
||||||
\ })
|
|
||||||
endif
|
|
||||||
endfor
|
|
||||||
|
|
||||||
call delete(auxfile)
|
|
||||||
call delete(bblfile)
|
|
||||||
call delete(blgfile)
|
|
||||||
endif
|
|
||||||
|
|
||||||
" Find data from 'thebibliography' environments
|
|
||||||
let lines = readfile(LatexBox_GetMainTexFile())
|
|
||||||
if match(lines, '\C\\begin{thebibliography}') >= 0
|
|
||||||
for line in filter(filter(lines, 'v:val =~ ''\C\\bibitem'''),
|
|
||||||
\ 'v:val =~ a:regexp')
|
|
||||||
let match = matchlist(line, '\\bibitem{\([^}]*\)')[1]
|
|
||||||
call add(res, {
|
|
||||||
\ 'key': match,
|
|
||||||
\ 'type': '',
|
|
||||||
\ 'author': '',
|
|
||||||
\ 'year': '',
|
|
||||||
\ 'title': match,
|
|
||||||
\ })
|
|
||||||
endfor
|
|
||||||
endif
|
|
||||||
|
|
||||||
return res
|
|
||||||
endfunction
|
|
||||||
" }}}
|
|
||||||
|
|
||||||
" BibTeX completion {{{
|
|
||||||
let s:type_length=0
|
|
||||||
function! LatexBox_BibComplete(regexp)
|
|
||||||
|
|
||||||
" treat spaces as '.*' if needed
|
|
||||||
if g:LatexBox_bibtex_wild_spaces
|
|
||||||
"let regexp = substitute(a:regexp, '\s\+', '.*', 'g')
|
|
||||||
let regexp = '.*' . substitute(a:regexp, '\s\+', '\\\&.*', 'g')
|
|
||||||
else
|
|
||||||
let regexp = a:regexp
|
|
||||||
endif
|
|
||||||
|
|
||||||
let res = []
|
|
||||||
let s:type_length = 4
|
|
||||||
for m in LatexBox_BibSearch(regexp)
|
|
||||||
let type = m['type'] == '' ? '[-]' : '[' . m['type'] . '] '
|
|
||||||
let type = printf('%-' . s:type_length . 's', type)
|
|
||||||
let auth = m['author'] == '' ? '' : m['author'][:20] . ' '
|
|
||||||
let auth = substitute(auth, '\~', ' ', 'g')
|
|
||||||
let auth = substitute(auth, ',.*\ze', ' et al. ', '')
|
|
||||||
let year = m['year'] == '' ? '' : '(' . m['year'] . ')'
|
|
||||||
let w = { 'word': m['key'],
|
|
||||||
\ 'abbr': type . auth . year,
|
|
||||||
\ 'menu': m['title'] }
|
|
||||||
|
|
||||||
" close braces if needed
|
|
||||||
if g:LatexBox_completion_close_braces && !s:NextCharsMatch('^\s*[,}]')
|
|
||||||
let w.word = w.word . '}'
|
|
||||||
endif
|
|
||||||
|
|
||||||
call add(res, w)
|
|
||||||
endfor
|
|
||||||
return res
|
|
||||||
endfunction
|
|
||||||
" }}}
|
|
||||||
|
|
||||||
" ExtractLabels {{{
|
|
||||||
" Generate list of \newlabel commands in current buffer.
|
|
||||||
"
|
|
||||||
" Searches the current buffer for commands of the form
|
|
||||||
" \newlabel{name}{{number}{page}.*
|
|
||||||
" and returns list of [ name, number, page ] tuples.
|
|
||||||
function! s:ExtractLabels()
|
|
||||||
call cursor(1,1)
|
|
||||||
|
|
||||||
let matches = []
|
|
||||||
let [lblline, lblbegin] = searchpos( '\\newlabel{', 'ecW' )
|
|
||||||
|
|
||||||
while [lblline, lblbegin] != [0,0]
|
|
||||||
let [nln, nameend] = searchpairpos( '{', '', '}', 'W' )
|
|
||||||
if nln != lblline
|
|
||||||
let [lblline, lblbegin] = searchpos( '\\newlabel{', 'ecW' )
|
|
||||||
continue
|
|
||||||
endif
|
|
||||||
let curname = strpart( getline( lblline ), lblbegin, nameend - lblbegin - 1 )
|
|
||||||
|
|
||||||
" Ignore cref entries (because they are duplicates)
|
|
||||||
if curname =~# "@cref$"
|
|
||||||
let [lblline, lblbegin] = searchpos( '\\newlabel{', 'ecW' )
|
|
||||||
continue
|
|
||||||
endif
|
|
||||||
|
|
||||||
if 0 == search( '\m{\w*{', 'ce', lblline )
|
|
||||||
let [lblline, lblbegin] = searchpos( '\\newlabel{', 'ecW' )
|
|
||||||
continue
|
|
||||||
endif
|
|
||||||
|
|
||||||
let numberbegin = getpos('.')[2]
|
|
||||||
let [nln, numberend] = searchpairpos( '{', '', '}', 'W' )
|
|
||||||
if nln != lblline
|
|
||||||
let [lblline, lblbegin] = searchpos( '\\newlabel{', 'ecW' )
|
|
||||||
continue
|
|
||||||
endif
|
|
||||||
let curnumber = strpart( getline( lblline ), numberbegin, numberend - numberbegin - 1 )
|
|
||||||
|
|
||||||
if 0 == search( '\m\w*{', 'ce', lblline )
|
|
||||||
let [lblline, lblbegin] = searchpos( '\\newlabel{', 'ecW' )
|
|
||||||
continue
|
|
||||||
endif
|
|
||||||
|
|
||||||
let pagebegin = getpos('.')[2]
|
|
||||||
let [nln, pageend] = searchpairpos( '{', '', '}', 'W' )
|
|
||||||
if nln != lblline
|
|
||||||
let [lblline, lblbegin] = searchpos( '\\newlabel{', 'ecW' )
|
|
||||||
continue
|
|
||||||
endif
|
|
||||||
let curpage = strpart( getline( lblline ), pagebegin, pageend - pagebegin - 1 )
|
|
||||||
|
|
||||||
let matches += [ [ curname, curnumber, curpage ] ]
|
|
||||||
|
|
||||||
let [lblline, lblbegin] = searchpos( '\\newlabel{', 'ecW' )
|
|
||||||
endwhile
|
|
||||||
|
|
||||||
return matches
|
|
||||||
endfunction
|
|
||||||
"}}}
|
|
||||||
|
|
||||||
" ExtractInputs {{{
|
|
||||||
" Generate list of \@input commands in current buffer.
|
|
||||||
"
|
|
||||||
" Searches the current buffer for \@input{file} entries and
|
|
||||||
" returns list of all files.
|
|
||||||
function! s:ExtractInputs()
|
|
||||||
call cursor(1,1)
|
|
||||||
|
|
||||||
let matches = []
|
|
||||||
let [inline, inbegin] = searchpos( '\\@input{', 'ecW' )
|
|
||||||
|
|
||||||
while [inline, inbegin] != [0,0]
|
|
||||||
let [nln, inend] = searchpairpos( '{', '', '}', 'W' )
|
|
||||||
if nln != inline
|
|
||||||
let [inline, inbegin] = searchpos( '\\@input{', 'ecW' )
|
|
||||||
continue
|
|
||||||
endif
|
|
||||||
let matches += [ LatexBox_kpsewhich(strpart( getline( inline ), inbegin, inend - inbegin - 1 )) ]
|
|
||||||
|
|
||||||
let [inline, inbegin] = searchpos( '\\@input{', 'ecW' )
|
|
||||||
endwhile
|
|
||||||
|
|
||||||
" Remove empty strings for nonexistant .aux files
|
|
||||||
return filter(matches, 'v:val != ""')
|
|
||||||
endfunction
|
|
||||||
"}}}
|
|
||||||
|
|
||||||
" LabelCache {{{
|
|
||||||
" Cache of all labels.
|
|
||||||
"
|
|
||||||
" LabelCache is a dictionary mapping filenames to tuples
|
|
||||||
" [ time, labels, inputs ]
|
|
||||||
" where
|
|
||||||
" * time is modification time of the cache entry
|
|
||||||
" * labels is a list like returned by ExtractLabels
|
|
||||||
" * inputs is a list like returned by ExtractInputs
|
|
||||||
let s:LabelCache = {}
|
|
||||||
"}}}
|
|
||||||
|
|
||||||
" GetLabelCache {{{
|
|
||||||
" Extract labels from LabelCache and update it.
|
|
||||||
"
|
|
||||||
" Compares modification time of each entry in the label
|
|
||||||
" cache and updates it, if necessary. During traversal of
|
|
||||||
" the LabelCache, all current labels are collected and
|
|
||||||
" returned.
|
|
||||||
function! s:GetLabelCache(file)
|
|
||||||
if !filereadable(a:file)
|
|
||||||
return []
|
|
||||||
endif
|
|
||||||
|
|
||||||
if !has_key(s:LabelCache , a:file) || s:LabelCache[a:file][0] != getftime(a:file)
|
|
||||||
" Open file in temporary split window for label extraction.
|
|
||||||
let main_tex_file = LatexBox_GetMainTexFile()
|
|
||||||
silent execute '1sp +let\ b:main_tex_file=main_tex_file|let\ labels=s:ExtractLabels()|let\ inputs=s:ExtractInputs()|quit! ' . fnameescape(a:file)
|
|
||||||
let s:LabelCache[a:file] = [ getftime(a:file), labels, inputs ]
|
|
||||||
endif
|
|
||||||
|
|
||||||
" We need to create a copy of s:LabelCache[fid][1], otherwise all inputs'
|
|
||||||
" labels would be added to the current file's label cache upon each
|
|
||||||
" completion call, leading to duplicates/triplicates/etc. and decreased
|
|
||||||
" performance.
|
|
||||||
" Also, because we don't anything with the list besides matching copies,
|
|
||||||
" we can get away with a shallow copy for now.
|
|
||||||
let labels = copy(s:LabelCache[a:file][1])
|
|
||||||
|
|
||||||
for input in s:LabelCache[a:file][2]
|
|
||||||
let labels += s:GetLabelCache(input)
|
|
||||||
endfor
|
|
||||||
|
|
||||||
return labels
|
|
||||||
endfunction
|
|
||||||
"}}}
|
|
||||||
|
|
||||||
" Complete Labels {{{
|
|
||||||
function! s:CompleteLabels(regex)
|
|
||||||
let labels = s:GetLabelCache(LatexBox_GetAuxFile())
|
|
||||||
|
|
||||||
let matches = filter( copy(labels), 'match(v:val[0], "' . a:regex . '") != -1' )
|
|
||||||
if empty(matches)
|
|
||||||
" also try to match label and number
|
|
||||||
let regex_split = split(a:regex)
|
|
||||||
if len(regex_split) > 1
|
|
||||||
let base = regex_split[0]
|
|
||||||
let number = escape(join(regex_split[1:], ' '), '.')
|
|
||||||
let matches = filter( copy(labels), 'match(v:val[0], "' . base . '") != -1 && match(v:val[1], "' . number . '") != -1' )
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
if empty(matches)
|
|
||||||
" also try to match number
|
|
||||||
let matches = filter( copy(labels), 'match(v:val[1], "' . a:regex . '") != -1' )
|
|
||||||
endif
|
|
||||||
|
|
||||||
let suggestions = []
|
|
||||||
for m in matches
|
|
||||||
let entry = {'word': m[0], 'menu': printf("%7s [p. %s]", '('.m[1].')', m[2])}
|
|
||||||
if g:LatexBox_completion_close_braces && !s:NextCharsMatch('^\s*[,}]')
|
|
||||||
" add trailing '}'
|
|
||||||
let entry = copy(entry)
|
|
||||||
let entry.abbr = entry.word
|
|
||||||
let entry.word = entry.word . '}'
|
|
||||||
endif
|
|
||||||
call add(suggestions, entry)
|
|
||||||
endfor
|
|
||||||
|
|
||||||
return suggestions
|
|
||||||
endfunction
|
|
||||||
" }}}
|
|
||||||
|
|
||||||
" Complete Inline Math Or Not {{{
|
|
||||||
" Return 1, when cursor is in a math env:
|
|
||||||
" 1, there is a single $ in the current line on the left of cursor
|
|
||||||
" 2, there is an open-eq-env on/above the current line
|
|
||||||
" (open-eq-env : \(, \[, and \begin{eq-env} )
|
|
||||||
" Return 0, when cursor is not in a math env
|
|
||||||
function! s:LatexBox_complete_inlineMath_or_not()
|
|
||||||
|
|
||||||
" switch of inline math completion feature
|
|
||||||
if g:LatexBox_complete_inlineMath == 0
|
|
||||||
return 0
|
|
||||||
endif
|
|
||||||
|
|
||||||
" env names that can't appear in an eq env
|
|
||||||
if !exists('s:LatexBox_doc_structure_patterns')
|
|
||||||
let s:LatexBox_doc_structure_patterns = '\%(' . '\\begin\s*{document}\|' .
|
|
||||||
\ '\\\%(chapter\|section\|subsection\|subsubsection\)\*\?\s*{' . '\)'
|
|
||||||
endif
|
|
||||||
|
|
||||||
if !exists('s:LatexBox_eq_env_open_patterns')
|
|
||||||
let s:LatexBox_eq_env_open_patterns = ['\\(','\\\[']
|
|
||||||
endif
|
|
||||||
if !exists('s:LatexBox_eq_env_close_patterns')
|
|
||||||
let s:LatexBox_eq_env_close_patterns = ['\\)','\\\]']
|
|
||||||
endif
|
|
||||||
|
|
||||||
let notcomment = '\%(\%(\\\@<!\%(\\\\\)*\)\@<=%.*\)\@<!'
|
|
||||||
|
|
||||||
let lnum_saved = line('.')
|
|
||||||
let cnum_saved = col('.') -1
|
|
||||||
|
|
||||||
let line = getline('.')
|
|
||||||
let line_start_2_cnum_saved = line[:cnum_saved]
|
|
||||||
|
|
||||||
" determine whether there is a single $ before cursor
|
|
||||||
let cursor_dollar_pair = 0
|
|
||||||
while matchend(line_start_2_cnum_saved, '\$[^$]\+\$', cursor_dollar_pair) >= 0
|
|
||||||
" find the end of dollar pair
|
|
||||||
let cursor_dollar_pair = matchend(line_start_2_cnum_saved, '\$[^$]\+\$', cursor_dollar_pair)
|
|
||||||
endwhile
|
|
||||||
" find single $ after cursor_dollar_pair
|
|
||||||
let cursor_single_dollar = matchend(line_start_2_cnum_saved, '\$', cursor_dollar_pair)
|
|
||||||
|
|
||||||
" if single $ is found
|
|
||||||
if cursor_single_dollar >= 0
|
|
||||||
" check whether $ is in \(...\), \[...\], or \begin{eq}...\end{eq}
|
|
||||||
|
|
||||||
" check current line,
|
|
||||||
" search for LatexBox_eq_env_close_patterns: \[ and \(
|
|
||||||
let lnum = line('.')
|
|
||||||
for i in range(0, (len(s:LatexBox_eq_env_open_patterns)-1))
|
|
||||||
call cursor(lnum_saved, cnum_saved)
|
|
||||||
let cnum_close = searchpos(''. s:LatexBox_eq_env_close_patterns[i].'', 'cbW', lnum_saved)[1]
|
|
||||||
let cnum_open = matchend(line_start_2_cnum_saved, s:LatexBox_eq_env_open_patterns[i], cnum_close)
|
|
||||||
if cnum_open >= 0
|
|
||||||
let s:eq_dollar_parenthesis_bracket_empty = ''
|
|
||||||
let s:eq_pos = cursor_single_dollar - 1
|
|
||||||
return 1
|
|
||||||
end
|
|
||||||
endfor
|
|
||||||
|
|
||||||
" check the lines above
|
|
||||||
" search for s:LatexBox_doc_structure_patterns, and end-of-math-env
|
|
||||||
let lnum -= 1
|
|
||||||
while lnum > 0
|
|
||||||
let line = getline(lnum)
|
|
||||||
if line =~ notcomment . '\(' . s:LatexBox_doc_structure_patterns .
|
|
||||||
\ '\|' . '\\end\s*{\(' . g:LatexBox_eq_env_patterns . '\)\*\?}\)'
|
|
||||||
" when s:LatexBox_doc_structure_patterns or g:LatexBox_eq_env_patterns
|
|
||||||
" are found first, complete math, leave with $ at both sides
|
|
||||||
let s:eq_dollar_parenthesis_bracket_empty = '$'
|
|
||||||
let s:eq_pos = cursor_single_dollar
|
|
||||||
break
|
|
||||||
elseif line =~ notcomment . '\\begin\s*{\(' . g:LatexBox_eq_env_patterns . '\)\*\?}'
|
|
||||||
" g:LatexBox_eq_env_patterns is found, complete math, remove $
|
|
||||||
let s:eq_dollar_parenthesis_bracket_empty = ''
|
|
||||||
let s:eq_pos = cursor_single_dollar - 1
|
|
||||||
break
|
|
||||||
endif
|
|
||||||
let lnum -= 1
|
|
||||||
endwhile
|
|
||||||
|
|
||||||
return 1
|
|
||||||
else
|
|
||||||
" no $ is found, then search for \( or \[ in current line
|
|
||||||
" 1, whether there is \(
|
|
||||||
call cursor(lnum_saved, cnum_saved)
|
|
||||||
let cnum_parenthesis_close = searchpos('\\)', 'cbW', lnum_saved)[1]
|
|
||||||
let cnum_parenthesis_open = matchend(line_start_2_cnum_saved, '\\(', cnum_parenthesis_close)
|
|
||||||
if cnum_parenthesis_open >= 0
|
|
||||||
let s:eq_dollar_parenthesis_bracket_empty = '\)'
|
|
||||||
let s:eq_pos = cnum_parenthesis_open
|
|
||||||
return 1
|
|
||||||
end
|
|
||||||
|
|
||||||
" 2, whether there is \[
|
|
||||||
call cursor(lnum_saved, cnum_saved)
|
|
||||||
let cnum_bracket_close = searchpos('\\\]', 'cbW', lnum_saved)[1]
|
|
||||||
let cnum_bracket_open = matchend(line_start_2_cnum_saved, '\\\[', cnum_bracket_close)
|
|
||||||
if cnum_bracket_open >= 0
|
|
||||||
let s:eq_dollar_parenthesis_bracket_empty = '\]'
|
|
||||||
let s:eq_pos = cnum_bracket_open
|
|
||||||
return 1
|
|
||||||
end
|
|
||||||
|
|
||||||
" not inline math completion
|
|
||||||
return 0
|
|
||||||
endif
|
|
||||||
|
|
||||||
endfunction
|
|
||||||
" }}}
|
|
||||||
|
|
||||||
" Complete inline euqation{{{
|
|
||||||
function! s:LatexBox_inlineMath_completion(regex, ...)
|
|
||||||
|
|
||||||
if a:0 == 0
|
|
||||||
let file = LatexBox_GetMainTexFile()
|
|
||||||
else
|
|
||||||
let file = a:1
|
|
||||||
endif
|
|
||||||
|
|
||||||
if empty(glob(file, 1))
|
|
||||||
return ''
|
|
||||||
endif
|
|
||||||
|
|
||||||
if empty(s:eq_dollar_parenthesis_bracket_empty)
|
|
||||||
let inline_pattern1 = '\$\s*\(' . escape(substitute(a:regex[1:], '^\s\+', '', ""), '\.*^') . '[^$]*\)\s*\$'
|
|
||||||
let inline_pattern2 = '\\(\s*\(' . escape(substitute(a:regex[1:], '^\s\+', '', ""), '\.*^') . '.*\)\s*\\)'
|
|
||||||
else
|
|
||||||
let inline_pattern1 = '\$\s*\(' . escape(substitute(a:regex, '^\s\+', '', ""), '\.*^') . '[^$]*\)\s*\$'
|
|
||||||
let inline_pattern2 = '\\(\s*\(' . escape(substitute(a:regex, '^\s\+', '', ""), '\.*^') . '.*\)\s*\\)'
|
|
||||||
endif
|
|
||||||
|
|
||||||
|
|
||||||
let suggestions = []
|
|
||||||
let line_num = 0
|
|
||||||
for line in readfile(file)
|
|
||||||
let line_num = line_num + 1
|
|
||||||
|
|
||||||
let suggestions += s:LatexBox_inlineMath_mathlist(line,inline_pattern1 , line_num) + s:LatexBox_inlineMath_mathlist( line,inline_pattern2, line_num)
|
|
||||||
|
|
||||||
" search for included files
|
|
||||||
let included_file = matchstr(line, '^\\@input{\zs[^}]*\ze}')
|
|
||||||
if included_file != ''
|
|
||||||
let included_file = LatexBox_kpsewhich(included_file)
|
|
||||||
call extend(suggestions, s:LatexBox_inlineMath_completion(a:regex, included_file))
|
|
||||||
endif
|
|
||||||
endfor
|
|
||||||
|
|
||||||
return suggestions
|
|
||||||
endfunction
|
|
||||||
" }}}
|
|
||||||
|
|
||||||
" Search for inline maths {{{
|
|
||||||
" search for $ ... $ and \( ... \) in each line
|
|
||||||
function! s:LatexBox_inlineMath_mathlist(line,inline_pattern, line_num)
|
|
||||||
let col_start = 0
|
|
||||||
let suggestions = []
|
|
||||||
while 1
|
|
||||||
let matches = matchlist(a:line, a:inline_pattern, col_start)
|
|
||||||
if !empty(matches)
|
|
||||||
|
|
||||||
" show line number of inline math
|
|
||||||
let entry = {'word': matches[1], 'menu': '[' . a:line_num . ']'}
|
|
||||||
|
|
||||||
if s:eq_dollar_parenthesis_bracket_empty != ''
|
|
||||||
let entry = copy(entry)
|
|
||||||
let entry.abbr = entry.word
|
|
||||||
let entry.word = entry.word . s:eq_dollar_parenthesis_bracket_empty
|
|
||||||
endif
|
|
||||||
call add(suggestions, entry)
|
|
||||||
|
|
||||||
" update col_start
|
|
||||||
let col_start = matchend(a:line, a:inline_pattern, col_start)
|
|
||||||
else
|
|
||||||
break
|
|
||||||
endif
|
|
||||||
endwhile
|
|
||||||
|
|
||||||
return suggestions
|
|
||||||
endfunction
|
|
||||||
" }}}
|
|
||||||
|
|
||||||
" Close Current Environment {{{
|
|
||||||
function! s:CloseCurEnv()
|
|
||||||
" first, try with \left/\right pairs
|
|
||||||
let [lnum, cnum] = searchpairpos('\C\\left\>', '', '\C\\right\>', 'bnW', 'LatexBox_InComment()')
|
|
||||||
if lnum
|
|
||||||
let line = strpart(getline(lnum), cnum - 1)
|
|
||||||
let bracket = matchstr(line, '^\\left\zs\((\|\[\|\\{\||\|\.\)\ze')
|
|
||||||
for [open, close] in [['(', ')'], ['\[', '\]'], ['\\{', '\\}'], ['|', '|'], ['\.', '|']]
|
|
||||||
let bracket = substitute(bracket, open, close, 'g')
|
|
||||||
endfor
|
|
||||||
return '\right' . bracket
|
|
||||||
endif
|
|
||||||
|
|
||||||
" second, try with environments
|
|
||||||
let env = LatexBox_GetCurrentEnvironment()
|
|
||||||
if env == '\['
|
|
||||||
return '\]'
|
|
||||||
elseif env == '\('
|
|
||||||
return '\)'
|
|
||||||
elseif env != ''
|
|
||||||
return '\end{' . env . '}'
|
|
||||||
endif
|
|
||||||
return ''
|
|
||||||
endfunction
|
|
||||||
" }}}
|
|
||||||
|
|
||||||
" Wrap Selection {{{
|
|
||||||
function! s:WrapSelection(wrapper)
|
|
||||||
keepjumps normal! `>a}
|
|
||||||
execute 'keepjumps normal! `<i\' . a:wrapper . '{'
|
|
||||||
endfunction
|
|
||||||
" }}}
|
|
||||||
|
|
||||||
" Wrap Selection in Environment with Prompt {{{
|
|
||||||
function! s:PromptEnvWrapSelection(...)
|
|
||||||
let env = input('environment: ', '', 'customlist,' . s:SIDWrap('GetEnvironmentList'))
|
|
||||||
if empty(env)
|
|
||||||
return
|
|
||||||
endif
|
|
||||||
" LaTeXBox's custom indentation can interfere with environment
|
|
||||||
" insertion when environments are indented (common for nested
|
|
||||||
" environments). Temporarily disable it for this operation:
|
|
||||||
let ieOld = &indentexpr
|
|
||||||
setlocal indentexpr=""
|
|
||||||
if visualmode() ==# 'V'
|
|
||||||
execute 'keepjumps normal! `>o\end{' . env . '}'
|
|
||||||
execute 'keepjumps normal! `<O\begin{' . env . '}'
|
|
||||||
" indent and format, if requested.
|
|
||||||
if a:0 && a:1
|
|
||||||
normal! gv>
|
|
||||||
normal! gvgq
|
|
||||||
endif
|
|
||||||
else
|
|
||||||
execute 'keepjumps normal! `>a\end{' . env . '}'
|
|
||||||
execute 'keepjumps normal! `<i\begin{' . env . '}'
|
|
||||||
endif
|
|
||||||
exe "setlocal indentexpr=" . ieOld
|
|
||||||
endfunction
|
|
||||||
" }}}
|
|
||||||
|
|
||||||
" List Labels with Prompt {{{
|
|
||||||
function! s:PromptLabelList(...)
|
|
||||||
" Check if window already exists
|
|
||||||
let winnr = bufwinnr(bufnr('LaTeX Labels'))
|
|
||||||
if winnr >= 0
|
|
||||||
if a:0 == 0
|
|
||||||
silent execute winnr . 'wincmd w'
|
|
||||||
else
|
|
||||||
" Supplying an argument to this function causes toggling instead
|
|
||||||
" of jumping to the labels window
|
|
||||||
if g:LatexBox_split_resize
|
|
||||||
silent exe "set columns-=" . g:LatexBox_split_width
|
|
||||||
endif
|
|
||||||
silent execute 'bwipeout' . bufnr('LaTeX Labels')
|
|
||||||
endif
|
|
||||||
return
|
|
||||||
endif
|
|
||||||
|
|
||||||
" Get label suggestions
|
|
||||||
let regexp = input('filter labels with regexp: ', '')
|
|
||||||
let labels = s:CompleteLabels(regexp)
|
|
||||||
|
|
||||||
let calling_buf = bufnr('%')
|
|
||||||
|
|
||||||
" Create labels window and set local settings
|
|
||||||
if g:LatexBox_split_resize
|
|
||||||
silent exe "set columns+=" . g:LatexBox_split_width
|
|
||||||
endif
|
|
||||||
silent exe g:LatexBox_split_side g:LatexBox_split_width . 'vnew LaTeX\ Labels'
|
|
||||||
let b:toc = []
|
|
||||||
let b:toc_numbers = 1
|
|
||||||
let b:calling_win = bufwinnr(calling_buf)
|
|
||||||
setlocal filetype=latextoc
|
|
||||||
|
|
||||||
" Add label entries and jump to the closest section
|
|
||||||
for entry in labels
|
|
||||||
let number = matchstr(entry['menu'], '^\s*(\zs[^)]\+\ze)')
|
|
||||||
let page = matchstr(entry['menu'], '^[^)]*)\s*\[\zs[^]]\+\ze\]')
|
|
||||||
let e = {'file': bufname(calling_buf),
|
|
||||||
\ 'level': 'label',
|
|
||||||
\ 'number': number,
|
|
||||||
\ 'text': entry['abbr'],
|
|
||||||
\ 'page': page}
|
|
||||||
call add(b:toc, e)
|
|
||||||
if b:toc_numbers
|
|
||||||
call append('$', e['number'] . "\t" . e['text'])
|
|
||||||
else
|
|
||||||
call append('$', e['text'])
|
|
||||||
endif
|
|
||||||
endfor
|
|
||||||
if !g:LatexBox_toc_hidehelp
|
|
||||||
call append('$', "")
|
|
||||||
call append('$', "<Esc>/q: close")
|
|
||||||
call append('$', "<Space>: jump")
|
|
||||||
call append('$', "<Enter>: jump and close")
|
|
||||||
call append('$', "s: hide numbering")
|
|
||||||
endif
|
|
||||||
0delete _
|
|
||||||
|
|
||||||
" Lock buffer
|
|
||||||
setlocal nomodifiable
|
|
||||||
endfunction
|
|
||||||
" }}}
|
|
||||||
|
|
||||||
" Change Environment {{{
|
|
||||||
function! s:ChangeEnvPrompt()
|
|
||||||
|
|
||||||
let [env, lnum, cnum, lnum2, cnum2] = LatexBox_GetCurrentEnvironment(1)
|
|
||||||
|
|
||||||
let new_env = input('change ' . env . ' for: ', '', 'customlist,' . s:SIDWrap('GetEnvironmentList'))
|
|
||||||
if empty(new_env)
|
|
||||||
return
|
|
||||||
endif
|
|
||||||
|
|
||||||
if new_env == '\[' || new_env == '['
|
|
||||||
let begin = '\['
|
|
||||||
let end = '\]'
|
|
||||||
elseif new_env == '\(' || new_env == '('
|
|
||||||
let begin = '\('
|
|
||||||
let end = '\)'
|
|
||||||
else
|
|
||||||
let l:begin = '\begin{' . new_env . '}'
|
|
||||||
let l:end = '\end{' . new_env . '}'
|
|
||||||
endif
|
|
||||||
|
|
||||||
if env == '\[' || env == '\('
|
|
||||||
let line = getline(lnum2)
|
|
||||||
let line = strpart(line, 0, cnum2 - 1) . l:end . strpart(line, cnum2 + 1)
|
|
||||||
call setline(lnum2, line)
|
|
||||||
|
|
||||||
let line = getline(lnum)
|
|
||||||
let line = strpart(line, 0, cnum - 1) . l:begin . strpart(line, cnum + 1)
|
|
||||||
call setline(lnum, line)
|
|
||||||
else
|
|
||||||
let line = getline(lnum2)
|
|
||||||
let line = strpart(line, 0, cnum2 - 1) . l:end . strpart(line, cnum2 + len(env) + 5)
|
|
||||||
call setline(lnum2, line)
|
|
||||||
|
|
||||||
let line = getline(lnum)
|
|
||||||
let line = strpart(line, 0, cnum - 1) . l:begin . strpart(line, cnum + len(env) + 7)
|
|
||||||
call setline(lnum, line)
|
|
||||||
endif
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
function! s:GetEnvironmentList(lead, cmdline, pos)
|
|
||||||
let suggestions = []
|
|
||||||
for entry in g:LatexBox_completion_environments
|
|
||||||
let env = entry.word
|
|
||||||
if env =~ '^' . a:lead
|
|
||||||
call add(suggestions, env)
|
|
||||||
endif
|
|
||||||
endfor
|
|
||||||
return suggestions
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
function! s:LatexToggleStarEnv()
|
|
||||||
let [env, lnum, cnum, lnum2, cnum2] = LatexBox_GetCurrentEnvironment(1)
|
|
||||||
|
|
||||||
if env == '\('
|
|
||||||
return
|
|
||||||
elseif env == '\['
|
|
||||||
let begin = '\begin{equation}'
|
|
||||||
let end = '\end{equation}'
|
|
||||||
elseif env[-1:] == '*'
|
|
||||||
let begin = '\begin{' . env[:-2] . '}'
|
|
||||||
let end = '\end{' . env[:-2] . '}'
|
|
||||||
else
|
|
||||||
let begin = '\begin{' . env . '*}'
|
|
||||||
let end = '\end{' . env . '*}'
|
|
||||||
endif
|
|
||||||
|
|
||||||
if env == '\['
|
|
||||||
let line = getline(lnum2)
|
|
||||||
let line = strpart(line, 0, cnum2 - 1) . l:end . strpart(line, cnum2 + 1)
|
|
||||||
call setline(lnum2, line)
|
|
||||||
|
|
||||||
let line = getline(lnum)
|
|
||||||
let line = strpart(line, 0, cnum - 1) . l:begin . strpart(line, cnum + 1)
|
|
||||||
call setline(lnum, line)
|
|
||||||
else
|
|
||||||
let line = getline(lnum2)
|
|
||||||
let line = strpart(line, 0, cnum2 - 1) . l:end . strpart(line, cnum2 + len(env) + 5)
|
|
||||||
call setline(lnum2, line)
|
|
||||||
|
|
||||||
let line = getline(lnum)
|
|
||||||
let line = strpart(line, 0, cnum - 1) . l:begin . strpart(line, cnum + len(env) + 7)
|
|
||||||
call setline(lnum, line)
|
|
||||||
endif
|
|
||||||
endfunction
|
|
||||||
" }}}
|
|
||||||
|
|
||||||
" Next Charaters Match {{{
|
|
||||||
function! s:NextCharsMatch(regex)
|
|
||||||
let rest_of_line = strpart(getline('.'), col('.') - 1)
|
|
||||||
return rest_of_line =~ a:regex
|
|
||||||
endfunction
|
|
||||||
" }}}
|
|
||||||
|
|
||||||
" Mappings {{{
|
|
||||||
inoremap <silent> <Plug>LatexCloseCurEnv <C-R>=<SID>CloseCurEnv()<CR>
|
|
||||||
vnoremap <silent> <Plug>LatexWrapSelection :<c-u>call <SID>WrapSelection('')<CR>i
|
|
||||||
vnoremap <silent> <Plug>LatexEnvWrapSelection :<c-u>call <SID>PromptEnvWrapSelection()<CR>
|
|
||||||
vnoremap <silent> <Plug>LatexEnvWrapFmtSelection :<c-u>call <SID>PromptEnvWrapSelection(1)<CR>
|
|
||||||
nnoremap <silent> <Plug>LatexChangeEnv :call <SID>ChangeEnvPrompt()<CR>
|
|
||||||
nnoremap <silent> <Plug>LatexToggleStarEnv :call <SID>LatexToggleStarEnv()<CR>
|
|
||||||
" }}}
|
|
||||||
|
|
||||||
" Commands {{{
|
|
||||||
command! LatexLabels call <SID>PromptLabelList()
|
|
||||||
" }}}
|
|
||||||
|
|
||||||
" vim:fdm=marker:ff=unix:noet:ts=4:sw=4
|
|
||||||
|
|
||||||
endif
|
|
||||||
@@ -1,66 +0,0 @@
|
|||||||
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'latex') == -1
|
|
||||||
|
|
||||||
" LatexBox_GetMainFileName: gets the name of the main file being compiled. {{{
|
|
||||||
" Description: returns the full path name of the main file.
|
|
||||||
" This function checks for the existence of a .latexmain file
|
|
||||||
" which might point to the location of a "main" latex file.
|
|
||||||
" If .latexmain exists, then return the full path name of the
|
|
||||||
" file being pointed to by it.
|
|
||||||
"
|
|
||||||
" Otherwise, return the full path name of the current buffer.
|
|
||||||
"
|
|
||||||
" You can supply an optional "modifier" argument to the
|
|
||||||
" function, which will optionally modify the file name before
|
|
||||||
" returning.
|
|
||||||
" NOTE: From version 1.6 onwards, this function always trims
|
|
||||||
" away the .latexmain part of the file name before applying the
|
|
||||||
" modifier argument.
|
|
||||||
" NOTE: This function is copied from the Latex-Suite project!
|
|
||||||
function! LatexBox_GetMainFileName(...)
|
|
||||||
if a:0 > 0
|
|
||||||
let modifier = a:1
|
|
||||||
else
|
|
||||||
let modifier = ':p'
|
|
||||||
endif
|
|
||||||
|
|
||||||
let s:origdir = fnameescape(getcwd())
|
|
||||||
|
|
||||||
let dirmodifier = '%:p:h'
|
|
||||||
let dirLast = fnameescape(expand(dirmodifier))
|
|
||||||
exe 'cd '.dirLast
|
|
||||||
|
|
||||||
" move up the directory tree until we find a .latexmain file.
|
|
||||||
" TODO: Should we be doing this recursion by default, or should there be a
|
|
||||||
" setting?
|
|
||||||
while glob('*.latexmain',1) == ''
|
|
||||||
let dirmodifier = dirmodifier.':h'
|
|
||||||
let dirNew = fnameescape(expand(dirmodifier))
|
|
||||||
" break from the loop if we cannot go up any further.
|
|
||||||
if dirNew == dirLast
|
|
||||||
break
|
|
||||||
endif
|
|
||||||
let dirLast = dirNew
|
|
||||||
exe 'cd '.dirLast
|
|
||||||
endwhile
|
|
||||||
|
|
||||||
let lheadfile = glob('*.latexmain',1)
|
|
||||||
if lheadfile != ''
|
|
||||||
" Remove the trailing .latexmain part of the filename... We never want
|
|
||||||
" that.
|
|
||||||
let lheadfile = fnamemodify(substitute(lheadfile, '\.latexmain$', '', ''), modifier)
|
|
||||||
else
|
|
||||||
" If we cannot find any main file, just modify the filename of the
|
|
||||||
" current buffer.
|
|
||||||
let lheadfile = expand('%'.modifier)
|
|
||||||
endif
|
|
||||||
|
|
||||||
exe 'cd '.s:origdir
|
|
||||||
|
|
||||||
" NOTE: The caller of this function needs to escape the file name with
|
|
||||||
" fnameescape() . The reason its not done here is that escaping is not
|
|
||||||
" safe if this file is to be used as part of an external command on
|
|
||||||
" certain platforms.
|
|
||||||
return lheadfile
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
endif
|
|
||||||
@@ -1,382 +0,0 @@
|
|||||||
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'latex') == -1
|
|
||||||
|
|
||||||
" Folding support for LaTeX
|
|
||||||
|
|
||||||
"
|
|
||||||
" Options
|
|
||||||
" g:LatexBox_Folding - Turn on/off folding
|
|
||||||
" g:LatexBox_fold_text - Turn on/off LatexBox fold text function
|
|
||||||
" g:LatexBox_fold_preamble - Turn on/off folding of preamble
|
|
||||||
" g:LatexBox_fold_parts - Define parts (eq. appendix, frontmatter) to fold
|
|
||||||
" g:LatexBox_fold_sections - Define section levels to fold
|
|
||||||
" g:LatexBox_fold_envs - Turn on/off folding of environments
|
|
||||||
" g:LatexBox_fold_toc - Turn on/off folding of TOC
|
|
||||||
" g:LatexBox_fold_toc_levels - Set max TOC fold level
|
|
||||||
"
|
|
||||||
" {{{1 Initialize options to default values.
|
|
||||||
if !exists('g:LatexBox_Folding')
|
|
||||||
let g:LatexBox_Folding=0
|
|
||||||
endif
|
|
||||||
if !exists('g:LatexBox_fold_text')
|
|
||||||
let g:LatexBox_fold_text=1
|
|
||||||
endif
|
|
||||||
if !exists('g:LatexBox_fold_preamble')
|
|
||||||
let g:LatexBox_fold_preamble=1
|
|
||||||
endif
|
|
||||||
if !exists('g:LatexBox_fold_envs')
|
|
||||||
let g:LatexBox_fold_envs=1
|
|
||||||
endif
|
|
||||||
if !exists('g:LatexBox_fold_envs_force')
|
|
||||||
let g:LatexBox_fold_envs_force = []
|
|
||||||
endif
|
|
||||||
if !exists('g:LatexBox_fold_parts')
|
|
||||||
let g:LatexBox_fold_parts=[
|
|
||||||
\ "appendix",
|
|
||||||
\ "frontmatter",
|
|
||||||
\ "mainmatter",
|
|
||||||
\ "backmatter"
|
|
||||||
\ ]
|
|
||||||
endif
|
|
||||||
if !exists('g:LatexBox_fold_sections')
|
|
||||||
let g:LatexBox_fold_sections=[
|
|
||||||
\ "part",
|
|
||||||
\ "chapter",
|
|
||||||
\ "section",
|
|
||||||
\ "subsection",
|
|
||||||
\ "subsubsection"
|
|
||||||
\ ]
|
|
||||||
endif
|
|
||||||
if !exists('g:LatexBox_fold_toc')
|
|
||||||
let g:LatexBox_fold_toc=0
|
|
||||||
endif
|
|
||||||
if !exists('g:LatexBox_fold_toc_levels')
|
|
||||||
let g:LatexBox_fold_toc_levels=1
|
|
||||||
endif
|
|
||||||
if !exists('g:LatexBox_fold_automatic')
|
|
||||||
let g:LatexBox_fold_automatic=1
|
|
||||||
endif
|
|
||||||
" }}}1
|
|
||||||
|
|
||||||
if g:LatexBox_Folding == 0
|
|
||||||
finish
|
|
||||||
endif
|
|
||||||
|
|
||||||
" {{{1 Set folding options for vim
|
|
||||||
setl foldexpr=LatexBox_FoldLevel(v:lnum)
|
|
||||||
if g:LatexBox_fold_text == 1
|
|
||||||
setl foldtext=LatexBox_FoldText()
|
|
||||||
endif
|
|
||||||
if g:LatexBox_fold_automatic == 1
|
|
||||||
setl foldmethod=expr
|
|
||||||
|
|
||||||
"
|
|
||||||
" The foldexpr function returns "=" for most lines, which means it can become
|
|
||||||
" slow for large files. The following is a hack that is based on this reply to
|
|
||||||
" a discussion on the Vim Developer list:
|
|
||||||
" http://permalink.gmane.org/gmane.editors.vim.devel/14100
|
|
||||||
"
|
|
||||||
augroup FastFold
|
|
||||||
autocmd!
|
|
||||||
autocmd InsertEnter *.tex if !&diff | setlocal foldmethod=manual | endif
|
|
||||||
autocmd InsertLeave *.tex if !&diff | setlocal foldmethod=expr | endif
|
|
||||||
augroup end
|
|
||||||
else
|
|
||||||
setl foldmethod=manual
|
|
||||||
endif
|
|
||||||
|
|
||||||
function! LatexBox_FoldOnDemand()
|
|
||||||
setl foldmethod=expr
|
|
||||||
normal! zx
|
|
||||||
setl foldmethod=manual
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
command! LatexFold call LatexBox_FoldOnDemand()
|
|
||||||
|
|
||||||
" {{{1 LatexBox_FoldLevel help functions
|
|
||||||
|
|
||||||
" This function parses the tex file to find the sections that are to be folded
|
|
||||||
" and their levels, and then predefines the patterns for optimized folding.
|
|
||||||
function! s:FoldSectionLevels()
|
|
||||||
" Initialize
|
|
||||||
let level = 1
|
|
||||||
let foldsections = []
|
|
||||||
|
|
||||||
" If we use two or more of the *matter commands, we need one more foldlevel
|
|
||||||
let nparts = 0
|
|
||||||
for part in g:LatexBox_fold_parts
|
|
||||||
let i = 1
|
|
||||||
while i < line("$")
|
|
||||||
if getline(i) =~ '^\s*\\' . part . '\>'
|
|
||||||
let nparts += 1
|
|
||||||
break
|
|
||||||
endif
|
|
||||||
let i += 1
|
|
||||||
endwhile
|
|
||||||
if nparts > 1
|
|
||||||
let level = 2
|
|
||||||
break
|
|
||||||
endif
|
|
||||||
endfor
|
|
||||||
|
|
||||||
" Combine sections and levels, but ignore unused section commands: If we
|
|
||||||
" don't use the part command, then chapter should have the highest
|
|
||||||
" level. If we don't use the chapter command, then section should be the
|
|
||||||
" highest level. And so on.
|
|
||||||
let ignore = 1
|
|
||||||
for part in g:LatexBox_fold_sections
|
|
||||||
" For each part, check if it is used in the file. We start adding the
|
|
||||||
" part patterns to the fold sections array whenever we find one.
|
|
||||||
let partpattern = '^\s*\(\\\|% Fake\)' . part . '\>'
|
|
||||||
if ignore
|
|
||||||
let i = 1
|
|
||||||
while i < line("$")
|
|
||||||
if getline(i) =~# partpattern
|
|
||||||
call insert(foldsections, [partpattern, level])
|
|
||||||
let level += 1
|
|
||||||
let ignore = 0
|
|
||||||
break
|
|
||||||
endif
|
|
||||||
let i += 1
|
|
||||||
endwhile
|
|
||||||
else
|
|
||||||
call insert(foldsections, [partpattern, level])
|
|
||||||
let level += 1
|
|
||||||
endif
|
|
||||||
endfor
|
|
||||||
|
|
||||||
return foldsections
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" {{{1 LatexBox_FoldLevel
|
|
||||||
|
|
||||||
" Parse file to dynamically set the sectioning fold levels
|
|
||||||
let b:LatexBox_FoldSections = s:FoldSectionLevels()
|
|
||||||
|
|
||||||
" Optimize by predefine common patterns
|
|
||||||
let s:notbslash = '\%(\\\@<!\%(\\\\\)*\)\@<='
|
|
||||||
let s:notcomment = '\%(\%(\\\@<!\%(\\\\\)*\)\@<=%.*\)\@<!'
|
|
||||||
let s:envbeginpattern = s:notcomment . s:notbslash . '\\begin\s*{.\{-}}'
|
|
||||||
let s:envendpattern = s:notcomment . s:notbslash . '\\end\s*{.\{-}}'
|
|
||||||
let s:foldparts = '^\s*\\\%(' . join(g:LatexBox_fold_parts, '\|') . '\)'
|
|
||||||
let s:folded = '\(% Fake\|\\\(document\|begin\|end\|paragraph\|'
|
|
||||||
\ . 'front\|main\|back\|app\|sub\|section\|chapter\|part\)\)'
|
|
||||||
|
|
||||||
function! LatexBox_FoldLevel(lnum)
|
|
||||||
" Check for normal lines first (optimization)
|
|
||||||
let line = getline(a:lnum)
|
|
||||||
if line !~ s:folded
|
|
||||||
return "="
|
|
||||||
endif
|
|
||||||
|
|
||||||
" Fold preamble
|
|
||||||
if g:LatexBox_fold_preamble == 1
|
|
||||||
if line =~# s:notcomment . s:notbslash . '\s*\\documentclass'
|
|
||||||
return ">1"
|
|
||||||
elseif line =~# s:notcomment . s:notbslash . '\s*\\begin\s*{\s*document\s*}'
|
|
||||||
return "0"
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
|
|
||||||
" Fold parts (\frontmatter, \mainmatter, \backmatter, and \appendix)
|
|
||||||
if line =~# s:foldparts
|
|
||||||
return ">1"
|
|
||||||
endif
|
|
||||||
|
|
||||||
" Fold chapters and sections
|
|
||||||
for [part, level] in b:LatexBox_FoldSections
|
|
||||||
if line =~# part
|
|
||||||
return ">" . level
|
|
||||||
endif
|
|
||||||
endfor
|
|
||||||
|
|
||||||
" Never fold \end{document}
|
|
||||||
if line =~# '^\s*\\end{document}'
|
|
||||||
return 0
|
|
||||||
endif
|
|
||||||
|
|
||||||
" Fold environments
|
|
||||||
if line =~# s:envbeginpattern && line =~# s:envendpattern
|
|
||||||
" If the begin and end pattern are on the same line , do not fold
|
|
||||||
return "="
|
|
||||||
else
|
|
||||||
if line =~# s:envbeginpattern
|
|
||||||
if g:LatexBox_fold_envs == 1
|
|
||||||
return "a1"
|
|
||||||
else
|
|
||||||
let env = matchstr(line,'\\begin\*\?{\zs\w*\*\?\ze}')
|
|
||||||
if index(g:LatexBox_fold_envs_force, env) >= 0
|
|
||||||
return "a1"
|
|
||||||
else
|
|
||||||
return "="
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
elseif line =~# s:envendpattern
|
|
||||||
if g:LatexBox_fold_envs == 1
|
|
||||||
return "s1"
|
|
||||||
else
|
|
||||||
let env = matchstr(line,'\\end\*\?{\zs\w*\*\?\ze}')
|
|
||||||
if index(g:LatexBox_fold_envs_force, env) >= 0
|
|
||||||
return "s1"
|
|
||||||
else
|
|
||||||
return "="
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
|
|
||||||
" Return foldlevel of previous line
|
|
||||||
return "="
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" {{{1 LatexBox_FoldText help functions
|
|
||||||
function! s:LabelEnv()
|
|
||||||
let i = v:foldend
|
|
||||||
while i >= v:foldstart
|
|
||||||
if getline(i) =~ '^\s*\\label'
|
|
||||||
return matchstr(getline(i), '^\s*\\label{\zs.*\ze}')
|
|
||||||
end
|
|
||||||
let i -= 1
|
|
||||||
endwhile
|
|
||||||
return ""
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
function! s:CaptionEnv()
|
|
||||||
let i = v:foldend
|
|
||||||
while i >= v:foldstart
|
|
||||||
if getline(i) =~ '^\s*\\caption'
|
|
||||||
return matchstr(getline(i), '^\s*\\caption\(\[.*\]\)\?{\zs.\+')
|
|
||||||
end
|
|
||||||
let i -= 1
|
|
||||||
endwhile
|
|
||||||
return ""
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
function! s:CaptionTable()
|
|
||||||
let i = v:foldstart
|
|
||||||
while i <= v:foldend
|
|
||||||
if getline(i) =~ '^\s*\\caption'
|
|
||||||
return matchstr(getline(i), '^\s*\\caption\(\[.*\]\)\?{\zs.\+')
|
|
||||||
end
|
|
||||||
let i += 1
|
|
||||||
endwhile
|
|
||||||
return ""
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
function! s:CaptionFrame(line)
|
|
||||||
" Test simple variants first
|
|
||||||
let caption1 = matchstr(a:line,'\\begin\*\?{.*}{\zs.\+\ze}')
|
|
||||||
let caption2 = matchstr(a:line,'\\begin\*\?{.*}{\zs.\+')
|
|
||||||
|
|
||||||
if len(caption1) > 0
|
|
||||||
return caption1
|
|
||||||
elseif len(caption2) > 0
|
|
||||||
return caption2
|
|
||||||
else
|
|
||||||
let i = v:foldstart
|
|
||||||
while i <= v:foldend
|
|
||||||
if getline(i) =~ '^\s*\\frametitle'
|
|
||||||
return matchstr(getline(i),
|
|
||||||
\ '^\s*\\frametitle\(\[.*\]\)\?{\zs.\+')
|
|
||||||
end
|
|
||||||
let i += 1
|
|
||||||
endwhile
|
|
||||||
|
|
||||||
return ""
|
|
||||||
endif
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
function! LatexBox_FoldText_title()
|
|
||||||
let line = getline(v:foldstart)
|
|
||||||
let title = 'Not defined'
|
|
||||||
|
|
||||||
" Preamble
|
|
||||||
if line =~ '\s*\\documentclass'
|
|
||||||
return "Preamble"
|
|
||||||
endif
|
|
||||||
|
|
||||||
" Parts, sections and fakesections
|
|
||||||
let sections = '\(\(sub\)*\(section\|paragraph\)\|part\|chapter\)'
|
|
||||||
let secpat1 = '^\s*\\' . sections . '\*\?\s*{'
|
|
||||||
let secpat2 = '^\s*\\' . sections . '\*\?\s*\['
|
|
||||||
if line =~ '\\frontmatter'
|
|
||||||
let title = "Frontmatter"
|
|
||||||
elseif line =~ '\\mainmatter'
|
|
||||||
let title = "Mainmatter"
|
|
||||||
elseif line =~ '\\backmatter'
|
|
||||||
let title = "Backmatter"
|
|
||||||
elseif line =~ '\\appendix'
|
|
||||||
let title = "Appendix"
|
|
||||||
elseif line =~ secpat1 . '.*}'
|
|
||||||
let title = matchstr(line, secpat1 . '\zs.\{-}\ze}')
|
|
||||||
elseif line =~ secpat1
|
|
||||||
let title = matchstr(line, secpat1 . '\zs.*')
|
|
||||||
elseif line =~ secpat2 . '.*\]'
|
|
||||||
let title = matchstr(line, secpat2 . '\zs.\{-}\ze\]')
|
|
||||||
elseif line =~ secpat2
|
|
||||||
let title = matchstr(line, secpat2 . '\zs.*')
|
|
||||||
elseif line =~ 'Fake' . sections . ':'
|
|
||||||
let title = matchstr(line,'Fake' . sections . ':\s*\zs.*')
|
|
||||||
elseif line =~ 'Fake' . sections
|
|
||||||
let title = matchstr(line, 'Fake' . sections)
|
|
||||||
endif
|
|
||||||
|
|
||||||
" Environments
|
|
||||||
if line =~ '\\begin'
|
|
||||||
" Capture environment name
|
|
||||||
let env = matchstr(line,'\\begin\*\?{\zs\w*\*\?\ze}')
|
|
||||||
|
|
||||||
" Set caption based on type of environment
|
|
||||||
if env == 'frame'
|
|
||||||
let label = ''
|
|
||||||
let caption = s:CaptionFrame(line)
|
|
||||||
elseif env == 'table'
|
|
||||||
let label = s:LabelEnv()
|
|
||||||
let caption = s:CaptionTable()
|
|
||||||
else
|
|
||||||
let label = s:LabelEnv()
|
|
||||||
let caption = s:CaptionEnv()
|
|
||||||
endif
|
|
||||||
|
|
||||||
" If no caption found, check for a caption comment
|
|
||||||
if caption == ''
|
|
||||||
let caption = matchstr(line,'\\begin\*\?{.*}\s*%\s*\zs.*')
|
|
||||||
endif
|
|
||||||
|
|
||||||
" Create title based on caption and label
|
|
||||||
if caption . label == ''
|
|
||||||
let title = env
|
|
||||||
elseif label == ''
|
|
||||||
let title = printf('%-12s%s', env . ':',
|
|
||||||
\ substitute(caption, '}\s*$', '',''))
|
|
||||||
elseif caption == ''
|
|
||||||
let title = printf('%-12s%56s', env, '(' . label . ')')
|
|
||||||
else
|
|
||||||
let title = printf('%-12s%-30s %21s', env . ':',
|
|
||||||
\ strpart(substitute(caption, '}\s*$', '',''),0,34),
|
|
||||||
\ '(' . label . ')')
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
|
|
||||||
return title
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" {{{1 LatexBox_FoldText
|
|
||||||
function! LatexBox_FoldText()
|
|
||||||
let nlines = v:foldend - v:foldstart + 1
|
|
||||||
let title = strpart(LatexBox_FoldText_title(), 0, 68)
|
|
||||||
let level = ''
|
|
||||||
|
|
||||||
" Fold level
|
|
||||||
let level = strpart(repeat('-', v:foldlevel-1) . '*',0,3)
|
|
||||||
if v:foldlevel > 3
|
|
||||||
let level = strpart(level, 1) . v:foldlevel
|
|
||||||
endif
|
|
||||||
let level = printf('%-3s', level)
|
|
||||||
|
|
||||||
return printf('%-3s %-68s #%5d', level, title, nlines)
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" {{{1 Footer
|
|
||||||
" vim:fdm=marker:ff=unix:ts=4:sw=4
|
|
||||||
|
|
||||||
endif
|
|
||||||
@@ -1,558 +0,0 @@
|
|||||||
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'latex') == -1
|
|
||||||
|
|
||||||
" LaTeX Box latexmk functions
|
|
||||||
|
|
||||||
" Options and variables {{{
|
|
||||||
|
|
||||||
if !exists('g:LatexBox_latexmk_options')
|
|
||||||
let g:LatexBox_latexmk_options = ''
|
|
||||||
endif
|
|
||||||
if !exists('g:LatexBox_latexmk_env')
|
|
||||||
let g:LatexBox_latexmk_env = ''
|
|
||||||
endif
|
|
||||||
if !exists('g:LatexBox_latexmk_async')
|
|
||||||
let g:LatexBox_latexmk_async = 0
|
|
||||||
endif
|
|
||||||
if !exists('g:LatexBox_latexmk_preview_continuously')
|
|
||||||
let g:LatexBox_latexmk_preview_continuously = 0
|
|
||||||
endif
|
|
||||||
if !exists('g:LatexBox_output_type')
|
|
||||||
let g:LatexBox_output_type = 'pdf'
|
|
||||||
endif
|
|
||||||
if !exists('g:LatexBox_autojump')
|
|
||||||
let g:LatexBox_autojump = 0
|
|
||||||
endif
|
|
||||||
if ! exists('g:LatexBox_quickfix')
|
|
||||||
let g:LatexBox_quickfix = 1
|
|
||||||
endif
|
|
||||||
if ! exists('g:LatexBox_personal_latexmkrc')
|
|
||||||
let g:LatexBox_personal_latexmkrc = 0
|
|
||||||
endif
|
|
||||||
|
|
||||||
" }}}
|
|
||||||
|
|
||||||
" Process ID management (used for asynchronous and continuous mode) {{{
|
|
||||||
|
|
||||||
" A dictionary of latexmk PID's (basename: pid)
|
|
||||||
if !exists('g:latexmk_running_pids')
|
|
||||||
let g:latexmk_running_pids = {}
|
|
||||||
endif
|
|
||||||
|
|
||||||
" Set PID {{{
|
|
||||||
function! s:LatexmkSetPID(basename, pid)
|
|
||||||
let g:latexmk_running_pids[a:basename] = a:pid
|
|
||||||
endfunction
|
|
||||||
" }}}
|
|
||||||
|
|
||||||
" kill_latexmk_process {{{
|
|
||||||
function! s:kill_latexmk_process(pid)
|
|
||||||
if has('win32')
|
|
||||||
silent execute '!taskkill /PID ' . a:pid . ' /T /F'
|
|
||||||
else
|
|
||||||
if g:LatexBox_latexmk_async
|
|
||||||
" vim-server mode
|
|
||||||
let pids = []
|
|
||||||
let tmpfile = tempname()
|
|
||||||
silent execute '!ps x -o pgid,pid > ' . tmpfile
|
|
||||||
for line in readfile(tmpfile)
|
|
||||||
let new_pid = matchstr(line, '^\s*' . a:pid . '\s\+\zs\d\+\ze')
|
|
||||||
if !empty(new_pid)
|
|
||||||
call add(pids, new_pid)
|
|
||||||
endif
|
|
||||||
endfor
|
|
||||||
call delete(tmpfile)
|
|
||||||
if !empty(pids)
|
|
||||||
silent execute '!kill ' . join(pids)
|
|
||||||
endif
|
|
||||||
else
|
|
||||||
" single background process
|
|
||||||
silent execute '!kill ' . a:pid
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
if !has('gui_running')
|
|
||||||
redraw!
|
|
||||||
endif
|
|
||||||
endfunction
|
|
||||||
" }}}
|
|
||||||
|
|
||||||
" kill_all_latexmk_processes {{{
|
|
||||||
function! s:kill_all_latexmk_processes()
|
|
||||||
for pid in values(g:latexmk_running_pids)
|
|
||||||
call s:kill_latexmk_process(pid)
|
|
||||||
endfor
|
|
||||||
endfunction
|
|
||||||
" }}}
|
|
||||||
|
|
||||||
" }}}
|
|
||||||
|
|
||||||
" Setup for vim-server {{{
|
|
||||||
function! s:SIDWrap(func)
|
|
||||||
if !exists('s:SID')
|
|
||||||
let s:SID = matchstr(expand('<sfile>'), '\zs<SNR>\d\+_\ze.*$')
|
|
||||||
endif
|
|
||||||
return s:SID . a:func
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
function! s:LatexmkCallback(basename, status)
|
|
||||||
" Only remove the pid if not in continuous mode
|
|
||||||
if !g:LatexBox_latexmk_preview_continuously
|
|
||||||
call remove(g:latexmk_running_pids, a:basename)
|
|
||||||
endif
|
|
||||||
call LatexBox_LatexErrors(a:status, a:basename)
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
function! s:setup_vim_server()
|
|
||||||
if !exists('g:vim_program')
|
|
||||||
|
|
||||||
" attempt autodetection of vim executable
|
|
||||||
let g:vim_program = ''
|
|
||||||
if has('win32')
|
|
||||||
" Just drop through to the default for windows
|
|
||||||
else
|
|
||||||
if match(&shell, '\(bash\|zsh\)$') >= 0
|
|
||||||
let ppid = '$PPID'
|
|
||||||
else
|
|
||||||
let ppid = '$$'
|
|
||||||
endif
|
|
||||||
|
|
||||||
let tmpfile = tempname()
|
|
||||||
silent execute '!ps -o command= -p ' . ppid . ' > ' . tmpfile
|
|
||||||
for line in readfile(tmpfile)
|
|
||||||
let line = matchstr(line, '^\S\+\>')
|
|
||||||
if !empty(line) && executable(line)
|
|
||||||
let g:vim_program = line . ' -g'
|
|
||||||
break
|
|
||||||
endif
|
|
||||||
endfor
|
|
||||||
call delete(tmpfile)
|
|
||||||
endif
|
|
||||||
|
|
||||||
if empty(g:vim_program)
|
|
||||||
if has('gui_macvim')
|
|
||||||
let g:vim_program
|
|
||||||
\ = '/Applications/MacVim.app/Contents/MacOS/Vim -g'
|
|
||||||
else
|
|
||||||
let g:vim_program = v:progname
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
endfunction
|
|
||||||
" }}}
|
|
||||||
|
|
||||||
" Latexmk {{{
|
|
||||||
|
|
||||||
function! LatexBox_Latexmk(force)
|
|
||||||
" Define often used names
|
|
||||||
let basepath = LatexBox_GetBuildBasename(1)
|
|
||||||
let basename = fnamemodify(basepath, ':t')
|
|
||||||
let texroot = shellescape(LatexBox_GetTexRoot())
|
|
||||||
let mainfile = fnameescape(fnamemodify(LatexBox_GetMainTexFile(), ':t'))
|
|
||||||
|
|
||||||
" Check if latexmk is installed
|
|
||||||
if !executable('latexmk')
|
|
||||||
echomsg "Error: LaTeX-Box relies on latexmk for compilation, but it" .
|
|
||||||
\ " is not installed!"
|
|
||||||
return
|
|
||||||
endif
|
|
||||||
|
|
||||||
" Check if already running
|
|
||||||
if has_key(g:latexmk_running_pids, basepath)
|
|
||||||
echomsg "latexmk is already running for `" . basename . "'"
|
|
||||||
return
|
|
||||||
endif
|
|
||||||
|
|
||||||
" Set wrap width in log file
|
|
||||||
let max_print_line = 2000
|
|
||||||
if has('win32')
|
|
||||||
let env = 'set max_print_line=' . max_print_line . ' & '
|
|
||||||
elseif match(&shell, '/tcsh$') >= 0
|
|
||||||
let env = 'setenv max_print_line ' . max_print_line . '; '
|
|
||||||
else
|
|
||||||
if fnamemodify(&shell, ':t') ==# 'fish'
|
|
||||||
let env = 'set max_print_line ' . max_print_line . '; and '
|
|
||||||
else
|
|
||||||
let env = 'max_print_line=' . max_print_line
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
|
|
||||||
" Set environment options
|
|
||||||
let env .= ' ' . g:LatexBox_latexmk_env . ' '
|
|
||||||
|
|
||||||
" Set latexmk command with options
|
|
||||||
if has('win32')
|
|
||||||
" Make sure to switch drive as well as directory
|
|
||||||
let cmd = 'cd /D ' . texroot . ' && '
|
|
||||||
else
|
|
||||||
if fnamemodify(&shell, ':t') ==# 'fish'
|
|
||||||
let cmd = 'cd ' . texroot . '; and '
|
|
||||||
else
|
|
||||||
let cmd = 'cd ' . texroot . ' && '
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
let cmd .= env . ' latexmk'
|
|
||||||
if ! g:LatexBox_personal_latexmkrc
|
|
||||||
let cmd .= ' -' . g:LatexBox_output_type
|
|
||||||
endif
|
|
||||||
let cmd .= ' -quiet '
|
|
||||||
let cmd .= g:LatexBox_latexmk_options
|
|
||||||
if a:force
|
|
||||||
let cmd .= ' -g'
|
|
||||||
endif
|
|
||||||
if g:LatexBox_latexmk_preview_continuously
|
|
||||||
let cmd .= ' -pvc'
|
|
||||||
endif
|
|
||||||
let cmd .= ' -e ' . shellescape('$pdflatex =~ s/ / -file-line-error /')
|
|
||||||
let cmd .= ' -e ' . shellescape('$latex =~ s/ / -file-line-error /')
|
|
||||||
if g:LatexBox_latexmk_preview_continuously
|
|
||||||
let cmd .= ' -e ' . shellescape('$success_cmd = $ENV{SUCCESSCMD}')
|
|
||||||
let cmd .= ' -e ' . shellescape('$failure_cmd = $ENV{FAILURECMD}')
|
|
||||||
endif
|
|
||||||
let cmd .= ' ' . mainfile
|
|
||||||
|
|
||||||
" Redirect output to null
|
|
||||||
if has('win32')
|
|
||||||
let cmd .= ' >nul'
|
|
||||||
else
|
|
||||||
if fnamemodify(&shell, ':t') ==# 'fish'
|
|
||||||
let cmd .= ' >/dev/null ^/dev/null'
|
|
||||||
else
|
|
||||||
let cmd .= ' &>/dev/null'
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
|
|
||||||
if g:LatexBox_latexmk_async
|
|
||||||
" Check if VIM server exists
|
|
||||||
if empty(v:servername)
|
|
||||||
echoerr "cannot run latexmk in background without a VIM server"
|
|
||||||
echoerr "set g:LatexBox_latexmk_async to 0 to change compiling mode"
|
|
||||||
return
|
|
||||||
endif
|
|
||||||
|
|
||||||
" Start vim server if necessary
|
|
||||||
call s:setup_vim_server()
|
|
||||||
|
|
||||||
let setpidfunc = s:SIDWrap('LatexmkSetPID')
|
|
||||||
let callbackfunc = s:SIDWrap('LatexmkCallback')
|
|
||||||
if has('win32')
|
|
||||||
let vim_program = substitute(g:vim_program,
|
|
||||||
\ 'gvim\.exe$', 'vim.exe', '')
|
|
||||||
|
|
||||||
" Define callback to set the pid
|
|
||||||
let callsetpid = setpidfunc . '(''' . basepath . ''', %CMDPID%)'
|
|
||||||
let vimsetpid = vim_program . ' --servername ' . v:servername
|
|
||||||
\ . ' --remote-expr ' . shellescape(callsetpid)
|
|
||||||
|
|
||||||
" Define callback after latexmk is finished
|
|
||||||
let callback = callbackfunc . '(''' . basepath . ''', %LATEXERR%)'
|
|
||||||
let vimcmd = vim_program . ' --servername ' . v:servername
|
|
||||||
\ . ' --remote-expr ' . shellescape(callback)
|
|
||||||
let scallback = callbackfunc . '(''' . basepath . ''', 0)'
|
|
||||||
let svimcmd = vim_program . ' --servername ' . v:servername
|
|
||||||
\ . ' --remote-expr ' . shellescape(scallback)
|
|
||||||
let fcallback = callbackfunc . '(''' . basepath . ''', 1)'
|
|
||||||
let fvimcmd = vim_program . ' --servername ' . v:servername
|
|
||||||
\ . ' --remote-expr ' . shellescape(fcallback)
|
|
||||||
|
|
||||||
let asyncbat = tempname() . '.bat'
|
|
||||||
if g:LatexBox_latexmk_preview_continuously
|
|
||||||
call writefile(['setlocal',
|
|
||||||
\ 'set T=%TEMP%\sthUnique.tmp',
|
|
||||||
\ 'wmic process where (Name="WMIC.exe" AND CommandLine LIKE "%%%TIME%%%") '
|
|
||||||
\ . 'get ParentProcessId /value | find "ParentProcessId" >%T%',
|
|
||||||
\ 'set /P A=<%T%',
|
|
||||||
\ 'set CMDPID=%A:~16% & del %T%',
|
|
||||||
\ vimsetpid,
|
|
||||||
\ 'set SUCCESSCMD='.svimcmd,
|
|
||||||
\ 'set FAILURECMD='.fvimcmd,
|
|
||||||
\ cmd,
|
|
||||||
\ 'endlocal'], asyncbat)
|
|
||||||
else
|
|
||||||
call writefile(['setlocal',
|
|
||||||
\ 'set T=%TEMP%\sthUnique.tmp',
|
|
||||||
\ 'wmic process where (Name="WMIC.exe" AND CommandLine LIKE "%%%TIME%%%") '
|
|
||||||
\ . 'get ParentProcessId /value | find "ParentProcessId" >%T%',
|
|
||||||
\ 'set /P A=<%T%',
|
|
||||||
\ 'set CMDPID=%A:~16% & del %T%',
|
|
||||||
\ vimsetpid,
|
|
||||||
\ cmd,
|
|
||||||
\ 'set LATEXERR=%ERRORLEVEL%',
|
|
||||||
\ vimcmd,
|
|
||||||
\ 'endlocal'], asyncbat)
|
|
||||||
endif
|
|
||||||
|
|
||||||
" Define command
|
|
||||||
let cmd = '!start /b ' . asyncbat . ' & del ' . asyncbat
|
|
||||||
else
|
|
||||||
" Define callback to set the pid
|
|
||||||
let callsetpid = shellescape(setpidfunc).'"(\"'.basepath.'\",$$)"'
|
|
||||||
let vimsetpid = g:vim_program . ' --servername ' . v:servername
|
|
||||||
\ . ' --remote-expr ' . callsetpid
|
|
||||||
|
|
||||||
" Define callback after latexmk is finished
|
|
||||||
let callback = shellescape(callbackfunc).'"(\"'.basepath.'\",$?)"'
|
|
||||||
let vimcmd = g:vim_program . ' --servername ' . v:servername
|
|
||||||
\ . ' --remote-expr ' . callback
|
|
||||||
let scallback = shellescape(callbackfunc).'"(\"'.basepath.'\",0)"'
|
|
||||||
let svimcmd = g:vim_program . ' --servername ' . v:servername
|
|
||||||
\ . ' --remote-expr ' . scallback
|
|
||||||
let fcallback = shellescape(callbackfunc).'"(\"'.basepath.'\",1)"'
|
|
||||||
let fvimcmd = g:vim_program . ' --servername ' . v:servername
|
|
||||||
\ . ' --remote-expr ' . fcallback
|
|
||||||
|
|
||||||
" Define command
|
|
||||||
" Note: Here we escape '%' because it may be given as a user option
|
|
||||||
" through g:LatexBox_latexmk_options, for instance with
|
|
||||||
" g:Latex..._options = "-pdflatex='pdflatex -synctex=1 \%O \%S'"
|
|
||||||
if g:LatexBox_latexmk_preview_continuously
|
|
||||||
let cmd = vimsetpid . ' ; '
|
|
||||||
\ . 'export SUCCESSCMD=' . shellescape(svimcmd) . ' '
|
|
||||||
\ . ' FAILURECMD=' . shellescape(fvimcmd) . ' ; '
|
|
||||||
\ . escape(cmd, '%')
|
|
||||||
else
|
|
||||||
let cmd = vimsetpid . ' ; ' . escape(cmd, '%') . ' ; ' . vimcmd
|
|
||||||
endif
|
|
||||||
let cmd = '! (' . cmd . ') >/dev/null &'
|
|
||||||
endif
|
|
||||||
|
|
||||||
if g:LatexBox_latexmk_preview_continuously
|
|
||||||
echo 'Compiling to ' . g:LatexBox_output_type
|
|
||||||
\ . ' with continuous preview.'
|
|
||||||
else
|
|
||||||
echo 'Compiling to ' . g:LatexBox_output_type . ' ...'
|
|
||||||
endif
|
|
||||||
silent execute cmd
|
|
||||||
else
|
|
||||||
if g:LatexBox_latexmk_preview_continuously
|
|
||||||
if has('win32')
|
|
||||||
let cmd = '!start /b cmd /s /c "' . cmd . '"'
|
|
||||||
else
|
|
||||||
let cmd = '!' . cmd . ' &'
|
|
||||||
endif
|
|
||||||
echo 'Compiling to ' . g:LatexBox_output_type . ' ...'
|
|
||||||
silent execute cmd
|
|
||||||
|
|
||||||
" Save PID in order to be able to kill the process when wanted.
|
|
||||||
if has('win32')
|
|
||||||
let tmpfile = tempname()
|
|
||||||
let pidcmd = 'cmd /c "wmic process where '
|
|
||||||
\ . '(CommandLine LIKE "latexmk\%'.mainfile.'\%") '
|
|
||||||
\ . 'get ProcessId /value | find "ProcessId" '
|
|
||||||
\ . '>'.tmpfile.' "'
|
|
||||||
silent execute '! ' . pidcmd
|
|
||||||
let pids = readfile(tmpfile)
|
|
||||||
let pid = strpart(pids[0], 10)
|
|
||||||
let g:latexmk_running_pids[basepath] = pid
|
|
||||||
else
|
|
||||||
let pid = substitute(system('pgrep -f "perl.*'
|
|
||||||
\ . mainfile . '" | head -n 1'),'\D','','')
|
|
||||||
let g:latexmk_running_pids[basepath] = pid
|
|
||||||
endif
|
|
||||||
else
|
|
||||||
" Execute command and check for errors
|
|
||||||
echo 'Compiling to ' . g:LatexBox_output_type . ' ... (async off!)'
|
|
||||||
call system(cmd)
|
|
||||||
call LatexBox_LatexErrors(v:shell_error)
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
|
|
||||||
" Redraw screen if necessary
|
|
||||||
if !has("gui_running")
|
|
||||||
redraw!
|
|
||||||
endif
|
|
||||||
endfunction
|
|
||||||
" }}}
|
|
||||||
|
|
||||||
" LatexmkClean {{{
|
|
||||||
function! LatexBox_LatexmkClean(cleanall)
|
|
||||||
" Check if latexmk is installed
|
|
||||||
if !executable('latexmk')
|
|
||||||
echomsg "Error: LaTeX-Box relies on latexmk for compilation, but it" .
|
|
||||||
\ " is not installed!"
|
|
||||||
return
|
|
||||||
endif
|
|
||||||
|
|
||||||
let basename = LatexBox_GetBuildBasename(1)
|
|
||||||
|
|
||||||
if has_key(g:latexmk_running_pids, basename)
|
|
||||||
echomsg "don't clean when latexmk is running"
|
|
||||||
return
|
|
||||||
endif
|
|
||||||
|
|
||||||
if has('win32')
|
|
||||||
let cmd = 'cd /D ' . shellescape(LatexBox_GetTexRoot()) . ' & '
|
|
||||||
else
|
|
||||||
let cmd = 'cd ' . shellescape(LatexBox_GetTexRoot()) . ';'
|
|
||||||
endif
|
|
||||||
if a:cleanall
|
|
||||||
let cmd .= 'latexmk -C '
|
|
||||||
else
|
|
||||||
let cmd .= 'latexmk -c '
|
|
||||||
endif
|
|
||||||
let cmd .= shellescape(LatexBox_GetMainTexFile())
|
|
||||||
if has('win32')
|
|
||||||
let cmd .= ' >nul'
|
|
||||||
else
|
|
||||||
let cmd .= ' >&/dev/null'
|
|
||||||
endif
|
|
||||||
|
|
||||||
call system(cmd)
|
|
||||||
if !has('gui_running')
|
|
||||||
redraw!
|
|
||||||
endif
|
|
||||||
|
|
||||||
echomsg "latexmk clean finished"
|
|
||||||
endfunction
|
|
||||||
" }}}
|
|
||||||
|
|
||||||
" LatexErrors {{{
|
|
||||||
function! LatexBox_LatexErrors(status, ...)
|
|
||||||
if a:0 >= 1
|
|
||||||
let log = a:1 . '.log'
|
|
||||||
else
|
|
||||||
let log = LatexBox_GetLogFile()
|
|
||||||
endif
|
|
||||||
|
|
||||||
cclose
|
|
||||||
|
|
||||||
" set cwd to expand error file correctly
|
|
||||||
let l:cwd = fnamemodify(getcwd(), ':p')
|
|
||||||
execute 'lcd ' . fnameescape(LatexBox_GetTexRoot())
|
|
||||||
try
|
|
||||||
if g:LatexBox_autojump
|
|
||||||
execute 'cfile ' . fnameescape(log)
|
|
||||||
else
|
|
||||||
execute 'cgetfile ' . fnameescape(log)
|
|
||||||
endif
|
|
||||||
finally
|
|
||||||
" restore cwd
|
|
||||||
execute 'lcd ' . fnameescape(l:cwd)
|
|
||||||
endtry
|
|
||||||
|
|
||||||
" Always open window if started by LatexErrors command
|
|
||||||
if a:status < 0
|
|
||||||
botright copen
|
|
||||||
else
|
|
||||||
" Only open window when an error/warning is detected
|
|
||||||
if g:LatexBox_quickfix >= 3
|
|
||||||
\ ? s:log_contains_error(log)
|
|
||||||
\ : g:LatexBox_quickfix > 0
|
|
||||||
belowright cw
|
|
||||||
if g:LatexBox_quickfix == 2 || g:LatexBox_quickfix == 4
|
|
||||||
wincmd p
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
redraw
|
|
||||||
|
|
||||||
" Write status message to screen
|
|
||||||
if a:status > 0 || len(getqflist())>1
|
|
||||||
if s:log_contains_error(log)
|
|
||||||
let l:status_msg = ' ... failed!'
|
|
||||||
else
|
|
||||||
let l:status_msg = ' ... there were warnings!'
|
|
||||||
endif
|
|
||||||
else
|
|
||||||
let l:status_msg = ' ... success!'
|
|
||||||
endif
|
|
||||||
echomsg 'Compiling to ' . g:LatexBox_output_type . l:status_msg
|
|
||||||
endif
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" Redefine uniq() for compatibility with older Vim versions (< 7.4.218)
|
|
||||||
function! s:uniq(list)
|
|
||||||
if exists('*uniq')
|
|
||||||
return uniq(a:list)
|
|
||||||
elseif len(a:list) <= 1
|
|
||||||
return a:list
|
|
||||||
endif
|
|
||||||
|
|
||||||
let last_element = get(a:list,0)
|
|
||||||
let uniq_list = [last_element]
|
|
||||||
|
|
||||||
for i in range(1, len(a:list)-1)
|
|
||||||
let next_element = get(a:list, i)
|
|
||||||
if last_element == next_element
|
|
||||||
continue
|
|
||||||
endif
|
|
||||||
let last_element = next_element
|
|
||||||
call add(uniq_list, next_element)
|
|
||||||
endfor
|
|
||||||
return uniq_list
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
function! s:log_contains_error(file)
|
|
||||||
let lines = readfile(a:file)
|
|
||||||
let lines = filter(lines, 'v:val =~ ''^.*:\d\+: ''')
|
|
||||||
let lines = s:uniq(map(lines, 'matchstr(v:val, ''^.*\ze:\d\+:'')'))
|
|
||||||
let lines = filter(lines, 'filereadable(fnameescape(v:val))')
|
|
||||||
return len(lines) > 0
|
|
||||||
endfunction
|
|
||||||
" }}}
|
|
||||||
|
|
||||||
" LatexmkStatus {{{
|
|
||||||
function! LatexBox_LatexmkStatus(detailed)
|
|
||||||
if a:detailed
|
|
||||||
if empty(g:latexmk_running_pids)
|
|
||||||
echo "latexmk is not running"
|
|
||||||
else
|
|
||||||
let plist = ""
|
|
||||||
for [basename, pid] in items(g:latexmk_running_pids)
|
|
||||||
if !empty(plist)
|
|
||||||
let plist .= '; '
|
|
||||||
endif
|
|
||||||
let plist .= fnamemodify(basename, ':t') . ':' . pid
|
|
||||||
endfor
|
|
||||||
echo "latexmk is running (" . plist . ")"
|
|
||||||
endif
|
|
||||||
else
|
|
||||||
let basename = LatexBox_GetBuildBasename(1)
|
|
||||||
if has_key(g:latexmk_running_pids, basename)
|
|
||||||
echo "latexmk is running"
|
|
||||||
else
|
|
||||||
echo "latexmk is not running"
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
endfunction
|
|
||||||
" }}}
|
|
||||||
|
|
||||||
" LatexmkStop {{{
|
|
||||||
function! LatexBox_LatexmkStop(silent)
|
|
||||||
if empty(g:latexmk_running_pids)
|
|
||||||
if !a:silent
|
|
||||||
let basepath = LatexBox_GetBuildBasename(1)
|
|
||||||
let basename = fnamemodify(basepath, ':t')
|
|
||||||
echoerr "latexmk is not running for `" . basename . "'"
|
|
||||||
endif
|
|
||||||
else
|
|
||||||
let basepath = LatexBox_GetBuildBasename(1)
|
|
||||||
let basename = fnamemodify(basepath, ':t')
|
|
||||||
if has_key(g:latexmk_running_pids, basepath)
|
|
||||||
call s:kill_latexmk_process(g:latexmk_running_pids[basepath])
|
|
||||||
call remove(g:latexmk_running_pids, basepath)
|
|
||||||
if !a:silent
|
|
||||||
echomsg "latexmk stopped for `" . basename . "'"
|
|
||||||
endif
|
|
||||||
elseif !a:silent
|
|
||||||
echoerr "latexmk is not running for `" . basename . "'"
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
endfunction
|
|
||||||
" }}}
|
|
||||||
|
|
||||||
" Commands {{{
|
|
||||||
|
|
||||||
command! -bang Latexmk call LatexBox_Latexmk(<q-bang> == "!")
|
|
||||||
command! -bang LatexmkClean call LatexBox_LatexmkClean(<q-bang> == "!")
|
|
||||||
command! -bang LatexmkStatus call LatexBox_LatexmkStatus(<q-bang> == "!")
|
|
||||||
command! LatexmkStop call LatexBox_LatexmkStop(0)
|
|
||||||
command! LatexErrors call LatexBox_LatexErrors(-1)
|
|
||||||
|
|
||||||
if g:LatexBox_latexmk_async || g:LatexBox_latexmk_preview_continuously
|
|
||||||
autocmd BufUnload <buffer> call LatexBox_LatexmkStop(1)
|
|
||||||
autocmd VimLeave * call <SID>kill_all_latexmk_processes()
|
|
||||||
endif
|
|
||||||
|
|
||||||
" }}}
|
|
||||||
|
|
||||||
" vim:fdm=marker:ff=unix:noet:ts=4:sw=4
|
|
||||||
|
|
||||||
endif
|
|
||||||
@@ -1,110 +0,0 @@
|
|||||||
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'latex') == -1
|
|
||||||
|
|
||||||
" LaTeX Box mappings
|
|
||||||
|
|
||||||
if exists("g:LatexBox_no_mappings")
|
|
||||||
finish
|
|
||||||
endif
|
|
||||||
|
|
||||||
" latexmk {{{
|
|
||||||
noremap <buffer> <LocalLeader>ll :Latexmk<CR>
|
|
||||||
noremap <buffer> <LocalLeader>lL :Latexmk!<CR>
|
|
||||||
noremap <buffer> <LocalLeader>lc :LatexmkClean<CR>
|
|
||||||
noremap <buffer> <LocalLeader>lC :LatexmkClean!<CR>
|
|
||||||
noremap <buffer> <LocalLeader>lg :LatexmkStatus<CR>
|
|
||||||
noremap <buffer> <LocalLeader>lG :LatexmkStatus!<CR>
|
|
||||||
noremap <buffer> <LocalLeader>lk :LatexmkStop<CR>
|
|
||||||
noremap <buffer> <LocalLeader>le :LatexErrors<CR>
|
|
||||||
" }}}
|
|
||||||
|
|
||||||
" View {{{
|
|
||||||
noremap <buffer> <LocalLeader>lv :LatexView<CR>
|
|
||||||
" }}}
|
|
||||||
|
|
||||||
" TOC {{{
|
|
||||||
noremap <silent> <buffer> <LocalLeader>lt :LatexTOC<CR>
|
|
||||||
" }}}
|
|
||||||
|
|
||||||
" List of labels {{{
|
|
||||||
noremap <silent> <buffer> <LocalLeader>lj :LatexLabels<CR>
|
|
||||||
" }}}
|
|
||||||
|
|
||||||
" Folding {{{
|
|
||||||
if g:LatexBox_Folding == 1
|
|
||||||
noremap <buffer> <LocalLeader>lf :LatexFold<CR>
|
|
||||||
endif
|
|
||||||
" }}}
|
|
||||||
|
|
||||||
" Jump to match {{{
|
|
||||||
if !exists('g:LatexBox_loaded_matchparen')
|
|
||||||
nmap <buffer> % <Plug>LatexBox_JumpToMatch
|
|
||||||
vmap <buffer> % <Plug>LatexBox_JumpToMatch
|
|
||||||
omap <buffer> % <Plug>LatexBox_JumpToMatch
|
|
||||||
endif
|
|
||||||
" }}}
|
|
||||||
|
|
||||||
" Define text objects {{{
|
|
||||||
vmap <buffer> ie <Plug>LatexBox_SelectCurrentEnvInner
|
|
||||||
vmap <buffer> ae <Plug>LatexBox_SelectCurrentEnvOuter
|
|
||||||
onoremap <buffer> ie :normal vie<CR>
|
|
||||||
onoremap <buffer> ae :normal vae<CR>
|
|
||||||
vmap <buffer> i$ <Plug>LatexBox_SelectInlineMathInner
|
|
||||||
vmap <buffer> a$ <Plug>LatexBox_SelectInlineMathOuter
|
|
||||||
onoremap <buffer> i$ :normal vi$<CR>
|
|
||||||
onoremap <buffer> a$ :normal va$<CR>
|
|
||||||
" }}}
|
|
||||||
|
|
||||||
" Jump between sections {{{
|
|
||||||
function! s:LatexBoxNextSection(type, backwards, visual)
|
|
||||||
" Restore visual mode if desired
|
|
||||||
if a:visual
|
|
||||||
normal! gv
|
|
||||||
endif
|
|
||||||
|
|
||||||
" For the [] and ][ commands we move up or down before the search
|
|
||||||
if a:type == 1
|
|
||||||
if a:backwards
|
|
||||||
normal! k
|
|
||||||
else
|
|
||||||
normal! j
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
|
|
||||||
" Define search pattern and do the search while preserving "/
|
|
||||||
let save_search = @/
|
|
||||||
let flags = 'W'
|
|
||||||
if a:backwards
|
|
||||||
let flags = 'b' . flags
|
|
||||||
endif
|
|
||||||
let notcomment = '\%(\%(\\\@<!\%(\\\\\)*\)\@<=%.*\)\@<!'
|
|
||||||
let pattern = notcomment . '\v\s*\\(' . join([
|
|
||||||
\ '(sub)*section',
|
|
||||||
\ 'chapter',
|
|
||||||
\ 'part',
|
|
||||||
\ 'appendix',
|
|
||||||
\ '(front|back|main)matter'], '|') . ')>'
|
|
||||||
call search(pattern, flags)
|
|
||||||
let @/ = save_search
|
|
||||||
|
|
||||||
" For the [] and ][ commands we move down or up after the search
|
|
||||||
if a:type == 1
|
|
||||||
if a:backwards
|
|
||||||
normal! j
|
|
||||||
else
|
|
||||||
normal! k
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
endfunction
|
|
||||||
noremap <buffer> <silent> ]] :call <SID>LatexBoxNextSection(0,0,0)<CR>
|
|
||||||
noremap <buffer> <silent> ][ :call <SID>LatexBoxNextSection(1,0,0)<CR>
|
|
||||||
noremap <buffer> <silent> [] :call <SID>LatexBoxNextSection(1,1,0)<CR>
|
|
||||||
noremap <buffer> <silent> [[ :call <SID>LatexBoxNextSection(0,1,0)<CR>
|
|
||||||
vnoremap <buffer> <silent> ]] :<c-u>call <SID>LatexBoxNextSection(0,0,1)<CR>
|
|
||||||
vnoremap <buffer> <silent> ][ :<c-u>call <SID>LatexBoxNextSection(1,0,1)<CR>
|
|
||||||
vnoremap <buffer> <silent> [] :<c-u>call <SID>LatexBoxNextSection(1,1,1)<CR>
|
|
||||||
vnoremap <buffer> <silent> [[ :<c-u>call <SID>LatexBoxNextSection(0,1,1)<CR>
|
|
||||||
" }}}
|
|
||||||
|
|
||||||
" vim:fdm=marker:ff=unix:noet:ts=4:sw=4
|
|
||||||
|
|
||||||
endif
|
|
||||||
@@ -1,548 +0,0 @@
|
|||||||
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'latex') == -1
|
|
||||||
|
|
||||||
" LaTeX Box motion functions
|
|
||||||
|
|
||||||
" Motion options {{{
|
|
||||||
" Opening and closing patterns
|
|
||||||
if !exists('g:LatexBox_open_pats')
|
|
||||||
let g:LatexBox_open_pats = [ '\\{','{','\\(','(','\\\[','\[',
|
|
||||||
\ '\\begin\s*{.\{-}}', '\\left\s*\%([^\\]\|\\.\|\\\a*\)']
|
|
||||||
let g:LatexBox_close_pats = [ '\\}','}','\\)',')','\\\]','\]',
|
|
||||||
\ '\\end\s*{.\{-}}', '\\right\s*\%([^\\]\|\\.\|\\\a*\)']
|
|
||||||
endif
|
|
||||||
" }}}
|
|
||||||
|
|
||||||
" HasSyntax {{{
|
|
||||||
" s:HasSyntax(syntaxName, [line], [col])
|
|
||||||
function! s:HasSyntax(syntaxName, ...)
|
|
||||||
let line = a:0 >= 1 ? a:1 : line('.')
|
|
||||||
let col = a:0 >= 2 ? a:2 : col('.')
|
|
||||||
return index(map(synstack(line, col),
|
|
||||||
\ 'synIDattr(v:val, "name") == "' . a:syntaxName . '"'),
|
|
||||||
\ 1) >= 0
|
|
||||||
endfunction
|
|
||||||
" }}}
|
|
||||||
|
|
||||||
" Search and Skip Comments {{{
|
|
||||||
" s:SearchAndSkipComments(pattern, [flags], [stopline])
|
|
||||||
function! s:SearchAndSkipComments(pat, ...)
|
|
||||||
let flags = a:0 >= 1 ? a:1 : ''
|
|
||||||
let stopline = a:0 >= 2 ? a:2 : 0
|
|
||||||
let saved_pos = getpos('.')
|
|
||||||
|
|
||||||
" search once
|
|
||||||
let ret = search(a:pat, flags, stopline)
|
|
||||||
|
|
||||||
if ret
|
|
||||||
" do not match at current position if inside comment
|
|
||||||
let flags = substitute(flags, 'c', '', 'g')
|
|
||||||
|
|
||||||
" keep searching while in comment
|
|
||||||
while LatexBox_InComment()
|
|
||||||
let ret = search(a:pat, flags, stopline)
|
|
||||||
if !ret
|
|
||||||
break
|
|
||||||
endif
|
|
||||||
endwhile
|
|
||||||
endif
|
|
||||||
|
|
||||||
if !ret
|
|
||||||
" if no match found, restore position
|
|
||||||
call setpos('.', saved_pos)
|
|
||||||
endif
|
|
||||||
|
|
||||||
return ret
|
|
||||||
endfunction
|
|
||||||
" }}}
|
|
||||||
|
|
||||||
" Finding Matching Pair {{{
|
|
||||||
function! s:FindMatchingPair(mode)
|
|
||||||
|
|
||||||
if a:mode =~ 'h\|i'
|
|
||||||
2match none
|
|
||||||
elseif a:mode == 'v'
|
|
||||||
normal! gv
|
|
||||||
endif
|
|
||||||
|
|
||||||
if LatexBox_InComment() | return | endif
|
|
||||||
|
|
||||||
" open/close pairs (dollars signs are treated apart)
|
|
||||||
let dollar_pat = '\$'
|
|
||||||
let notbslash = '\%(\\\@<!\%(\\\\\)*\)\@<='
|
|
||||||
let notcomment = '\%(\%(\\\@<!\%(\\\\\)*\)\@<=%.*\)\@<!'
|
|
||||||
let anymatch = '\('
|
|
||||||
\ . join(g:LatexBox_open_pats + g:LatexBox_close_pats, '\|')
|
|
||||||
\ . '\|' . dollar_pat . '\)'
|
|
||||||
|
|
||||||
let lnum = line('.')
|
|
||||||
let cnum = searchpos('\A', 'cbnW', lnum)[1]
|
|
||||||
" if the previous char is a backslash
|
|
||||||
if strpart(getline(lnum), cnum-2, 1) == '\'
|
|
||||||
let cnum = cnum-1
|
|
||||||
endif
|
|
||||||
let delim = matchstr(getline(lnum), '\C^'. anymatch , cnum - 1)
|
|
||||||
|
|
||||||
if empty(delim) || strlen(delim)+cnum-1< col('.')
|
|
||||||
if a:mode =~ 'n\|v\|o'
|
|
||||||
" if not found, search forward
|
|
||||||
let cnum = match(getline(lnum), '\C'. anymatch , col('.') - 1) + 1
|
|
||||||
if cnum == 0 | return | endif
|
|
||||||
call cursor(lnum, cnum)
|
|
||||||
let delim = matchstr(getline(lnum), '\C^'. anymatch , cnum - 1)
|
|
||||||
elseif a:mode =~ 'i'
|
|
||||||
" if not found, move one char bacward and search
|
|
||||||
let cnum = searchpos('\A', 'bnW', lnum)[1]
|
|
||||||
" if the previous char is a backslash
|
|
||||||
if strpart(getline(lnum), cnum-2, 1) == '\'
|
|
||||||
let cnum = cnum-1
|
|
||||||
endif
|
|
||||||
let delim = matchstr(getline(lnum), '\C^'. anymatch , cnum - 1)
|
|
||||||
if empty(delim) || strlen(delim)+cnum< col('.') | return | endif
|
|
||||||
elseif a:mode =~ 'h'
|
|
||||||
return
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
|
|
||||||
if delim =~ '^\$'
|
|
||||||
|
|
||||||
" match $-pairs
|
|
||||||
" check if next character is in inline math
|
|
||||||
let [lnum0, cnum0] = searchpos('.', 'nW')
|
|
||||||
if lnum0 && s:HasSyntax('texMathZoneX', lnum0, cnum0)
|
|
||||||
let [lnum2, cnum2] = searchpos(notcomment . notbslash. dollar_pat, 'nW', line('w$')*(a:mode =~ 'h\|i') , 200)
|
|
||||||
else
|
|
||||||
let [lnum2, cnum2] = searchpos('\%(\%'. lnum . 'l\%' . cnum . 'c\)\@!'. notcomment . notbslash . dollar_pat, 'bnW', line('w0')*(a:mode =~ 'h\|i') , 200)
|
|
||||||
endif
|
|
||||||
|
|
||||||
if a:mode =~ 'h\|i'
|
|
||||||
execute '2match MatchParen /\%(\%' . lnum . 'l\%' . cnum . 'c\$' . '\|\%' . lnum2 . 'l\%' . cnum2 . 'c\$\)/'
|
|
||||||
elseif a:mode =~ 'n\|v\|o'
|
|
||||||
call cursor(lnum2,cnum2)
|
|
||||||
endif
|
|
||||||
|
|
||||||
else
|
|
||||||
" match other pairs
|
|
||||||
for i in range(len(g:LatexBox_open_pats))
|
|
||||||
let open_pat = notbslash . g:LatexBox_open_pats[i]
|
|
||||||
let close_pat = notbslash . g:LatexBox_close_pats[i]
|
|
||||||
|
|
||||||
if delim =~# '^' . open_pat
|
|
||||||
" if on opening pattern, search for closing pattern
|
|
||||||
let [lnum2, cnum2] = searchpairpos('\C' . open_pat, '', '\C'
|
|
||||||
\ . close_pat, 'nW', 'LatexBox_InComment()',
|
|
||||||
\ line('w$')*(a:mode =~ 'h\|i') , 200)
|
|
||||||
if a:mode =~ 'h\|i'
|
|
||||||
execute '2match MatchParen /\%(\%' . lnum . 'l\%' . cnum
|
|
||||||
\ . 'c' . g:LatexBox_open_pats[i] . '\|\%'
|
|
||||||
\ . lnum2 . 'l\%' . cnum2 . 'c'
|
|
||||||
\ . g:LatexBox_close_pats[i] . '\)/'
|
|
||||||
elseif a:mode =~ 'n\|v\|o'
|
|
||||||
call cursor(lnum2,cnum2)
|
|
||||||
if strlen(close_pat)>1 && a:mode =~ 'o'
|
|
||||||
call cursor(lnum2, matchend(getline('.'), '\C'
|
|
||||||
\ . close_pat, col('.')-1))
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
break
|
|
||||||
elseif delim =~# '^' . close_pat
|
|
||||||
" if on closing pattern, search for opening pattern
|
|
||||||
let [lnum2, cnum2] = searchpairpos('\C' . open_pat, '',
|
|
||||||
\ '\C\%(\%'. lnum . 'l\%' . cnum . 'c\)\@!'
|
|
||||||
\ . close_pat, 'bnW', 'LatexBox_InComment()',
|
|
||||||
\ line('w0')*(a:mode =~ 'h\|i') , 200)
|
|
||||||
if a:mode =~ 'h\|i'
|
|
||||||
execute '2match MatchParen /\%(\%' . lnum2 . 'l\%' . cnum2
|
|
||||||
\ . 'c' . g:LatexBox_open_pats[i] . '\|\%'
|
|
||||||
\ . lnum . 'l\%' . cnum . 'c'
|
|
||||||
\ . g:LatexBox_close_pats[i] . '\)/'
|
|
||||||
elseif a:mode =~ 'n\|v\|o'
|
|
||||||
call cursor(lnum2,cnum2)
|
|
||||||
endif
|
|
||||||
break
|
|
||||||
endif
|
|
||||||
endfor
|
|
||||||
|
|
||||||
endif
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" Allow to disable functionality if desired
|
|
||||||
if !exists('g:LatexBox_loaded_matchparen')
|
|
||||||
" Disable matchparen autocommands
|
|
||||||
augroup LatexBox_HighlightPairs
|
|
||||||
autocmd BufEnter * if !exists("g:loaded_matchparen") || !g:loaded_matchparen | runtime plugin/matchparen.vim | endif
|
|
||||||
autocmd BufEnter *.tex 3match none | unlet! g:loaded_matchparen | au! matchparen
|
|
||||||
autocmd! CursorMoved *.tex call s:FindMatchingPair('h')
|
|
||||||
autocmd! CursorMovedI *.tex call s:FindMatchingPair('i')
|
|
||||||
augroup END
|
|
||||||
endif
|
|
||||||
|
|
||||||
" Use LatexBox'es FindMatchingPair as '%' (enable jump between e.g. $'s)
|
|
||||||
nnoremap <silent> <Plug>LatexBox_JumpToMatch :call <SID>FindMatchingPair('n')<CR>
|
|
||||||
vnoremap <silent> <Plug>LatexBox_JumpToMatch :call <SID>FindMatchingPair('v')<CR>
|
|
||||||
onoremap <silent> <Plug>LatexBox_JumpToMatch v:call <SID>FindMatchingPair('o')<CR>
|
|
||||||
|
|
||||||
" }}}
|
|
||||||
|
|
||||||
" select inline math {{{
|
|
||||||
" s:SelectInlineMath(seltype)
|
|
||||||
" where seltype is either 'inner' or 'outer'
|
|
||||||
function! s:SelectInlineMath(seltype)
|
|
||||||
|
|
||||||
let dollar_pat = '\\\@<!\$'
|
|
||||||
|
|
||||||
if s:HasSyntax('texMathZoneX')
|
|
||||||
call s:SearchAndSkipComments(dollar_pat, 'cbW')
|
|
||||||
elseif getline('.')[col('.') - 1] == '$'
|
|
||||||
call s:SearchAndSkipComments(dollar_pat, 'bW')
|
|
||||||
else
|
|
||||||
return
|
|
||||||
endif
|
|
||||||
|
|
||||||
if a:seltype == 'inner'
|
|
||||||
normal! l
|
|
||||||
endif
|
|
||||||
|
|
||||||
if visualmode() ==# 'V'
|
|
||||||
normal! V
|
|
||||||
else
|
|
||||||
normal! v
|
|
||||||
endif
|
|
||||||
|
|
||||||
call s:SearchAndSkipComments(dollar_pat, 'W')
|
|
||||||
|
|
||||||
if a:seltype == 'inner'
|
|
||||||
normal! h
|
|
||||||
endif
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
vnoremap <silent> <Plug>LatexBox_SelectInlineMathInner
|
|
||||||
\ :<C-U>call <SID>SelectInlineMath('inner')<CR>
|
|
||||||
vnoremap <silent> <Plug>LatexBox_SelectInlineMathOuter
|
|
||||||
\ :<C-U>call <SID>SelectInlineMath('outer')<CR>
|
|
||||||
" }}}
|
|
||||||
|
|
||||||
" select current environment {{{
|
|
||||||
function! s:SelectCurrentEnv(seltype)
|
|
||||||
let [env, lnum, cnum, lnum2, cnum2] = LatexBox_GetCurrentEnvironment(1)
|
|
||||||
call cursor(lnum, cnum)
|
|
||||||
if a:seltype == 'inner'
|
|
||||||
if env =~ '^\'
|
|
||||||
call search('\\.\_\s*\S', 'eW')
|
|
||||||
else
|
|
||||||
call search('}\(\_\s*\[\_[^]]*\]\)\?\_\s*\S', 'eW')
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
if visualmode() ==# 'V'
|
|
||||||
normal! V
|
|
||||||
else
|
|
||||||
normal! v
|
|
||||||
endif
|
|
||||||
call cursor(lnum2, cnum2)
|
|
||||||
if a:seltype == 'inner'
|
|
||||||
call search('\S\_\s*', 'bW')
|
|
||||||
else
|
|
||||||
if env =~ '^\'
|
|
||||||
normal! l
|
|
||||||
else
|
|
||||||
call search('}', 'eW')
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
endfunction
|
|
||||||
vnoremap <silent> <Plug>LatexBox_SelectCurrentEnvInner :<C-U>call <SID>SelectCurrentEnv('inner')<CR>
|
|
||||||
vnoremap <silent> <Plug>LatexBox_SelectCurrentEnvOuter :<C-U>call <SID>SelectCurrentEnv('outer')<CR>
|
|
||||||
" }}}
|
|
||||||
|
|
||||||
" Jump to the next braces {{{
|
|
||||||
"
|
|
||||||
function! LatexBox_JumpToNextBraces(backward)
|
|
||||||
let flags = ''
|
|
||||||
if a:backward
|
|
||||||
normal h
|
|
||||||
let flags .= 'b'
|
|
||||||
else
|
|
||||||
let flags .= 'c'
|
|
||||||
endif
|
|
||||||
if search('[][}{]', flags) > 0
|
|
||||||
normal l
|
|
||||||
endif
|
|
||||||
let prev = strpart(getline('.'), col('.') - 2, 1)
|
|
||||||
let next = strpart(getline('.'), col('.') - 1, 1)
|
|
||||||
if next =~ '[]}]' && prev !~ '[][{}]'
|
|
||||||
return "\<Right>"
|
|
||||||
else
|
|
||||||
return ''
|
|
||||||
endif
|
|
||||||
endfunction
|
|
||||||
" }}}
|
|
||||||
|
|
||||||
" Table of Contents {{{
|
|
||||||
|
|
||||||
" Special UTF-8 conversion
|
|
||||||
function! s:ConvertBack(line)
|
|
||||||
let line = a:line
|
|
||||||
if exists('g:LatexBox_plaintext_toc')
|
|
||||||
"
|
|
||||||
" Substitute stuff like '\IeC{\"u}' to plain 'u'
|
|
||||||
"
|
|
||||||
let line = substitute(line, '\\IeC\s*{\\.\(.\)}', '\1', 'g')
|
|
||||||
else
|
|
||||||
"
|
|
||||||
" Substitute stuff like '\IeC{\"u}' to corresponding unicode symbols
|
|
||||||
"
|
|
||||||
for [pat, symbol] in s:ConvBackPats
|
|
||||||
let line = substitute(line, pat, symbol, 'g')
|
|
||||||
endfor
|
|
||||||
endif
|
|
||||||
return line
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
function! s:ReadTOC(auxfile, texfile, ...)
|
|
||||||
let texfile = a:texfile
|
|
||||||
let prefix = fnamemodify(a:auxfile, ':p:h')
|
|
||||||
|
|
||||||
if a:0 != 2
|
|
||||||
let toc = []
|
|
||||||
let fileindices = { texfile : [] }
|
|
||||||
else
|
|
||||||
let toc = a:1
|
|
||||||
let fileindices = a:2
|
|
||||||
let fileindices[ texfile ] = []
|
|
||||||
endif
|
|
||||||
|
|
||||||
for line in readfile(a:auxfile)
|
|
||||||
let included = matchstr(line, '^\\@input{\zs[^}]*\ze}')
|
|
||||||
if included != ''
|
|
||||||
" append the input TOX to `toc` and `fileindices`
|
|
||||||
let newaux = prefix . '/' . included
|
|
||||||
let newtex = fnamemodify(newaux, ':r') . '.tex'
|
|
||||||
call s:ReadTOC(newaux, newtex, toc, fileindices)
|
|
||||||
continue
|
|
||||||
endif
|
|
||||||
|
|
||||||
" Parse statements like:
|
|
||||||
" \@writefile{toc}{\contentsline {section}{\numberline {secnum}Section Title}{pagenumber}}
|
|
||||||
" \@writefile{toc}{\contentsline {section}{\tocsection {}{1}{Section Title}}{pagenumber}}
|
|
||||||
" \@writefile{toc}{\contentsline {section}{\numberline {secnum}Section Title}{pagenumber}{otherstuff}}
|
|
||||||
|
|
||||||
let line = matchstr(line,
|
|
||||||
\ '\\@writefile{toc}{\\contentsline\s*\zs.*\ze}\s*$')
|
|
||||||
if empty(line)
|
|
||||||
continue
|
|
||||||
endif
|
|
||||||
|
|
||||||
let tree = LatexBox_TexToTree(s:ConvertBack(line))
|
|
||||||
|
|
||||||
if len(tree) < 3
|
|
||||||
" unknown entry type: just skip it
|
|
||||||
continue
|
|
||||||
endif
|
|
||||||
|
|
||||||
" parse level
|
|
||||||
let level = tree[0][0]
|
|
||||||
" parse page
|
|
||||||
if !empty(tree[2])
|
|
||||||
let page = tree[2][0]
|
|
||||||
else
|
|
||||||
let page = ''
|
|
||||||
endif
|
|
||||||
" parse section number
|
|
||||||
let secnum = ''
|
|
||||||
let tree = tree[1]
|
|
||||||
if len(tree) > 3 && empty(tree[1])
|
|
||||||
call remove(tree, 1)
|
|
||||||
endif
|
|
||||||
if len(tree) > 1 && type(tree[0]) == type("") && tree[0] =~ '^\\\(\(chapter\)\?numberline\|tocsection\)'
|
|
||||||
let secnum = LatexBox_TreeToTex(tree[1])
|
|
||||||
let secnum = substitute(secnum, '\\\S\+\s', '', 'g')
|
|
||||||
let secnum = substitute(secnum, '\\\S\+{\(.\{-}\)}', '\1', 'g')
|
|
||||||
let secnum = substitute(secnum, '^{\+\|}\+$', '', 'g')
|
|
||||||
call remove(tree, 1)
|
|
||||||
endif
|
|
||||||
" parse section title
|
|
||||||
let text = LatexBox_TreeToTex(tree)
|
|
||||||
let text = substitute(text, '^{\+\|}\+$', '', 'g')
|
|
||||||
let text = substitute(text, '\m^\\\(no\)\?\(chapter\)\?numberline\s*', '', '')
|
|
||||||
let text = substitute(text, '\*', '', 'g')
|
|
||||||
|
|
||||||
" add TOC entry
|
|
||||||
call add(fileindices[texfile], len(toc))
|
|
||||||
call add(toc, {'file': texfile,
|
|
||||||
\ 'level': level,
|
|
||||||
\ 'number': secnum,
|
|
||||||
\ 'text': text,
|
|
||||||
\ 'page': page})
|
|
||||||
endfor
|
|
||||||
|
|
||||||
return [toc, fileindices]
|
|
||||||
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
function! LatexBox_TOC(...)
|
|
||||||
|
|
||||||
" Check if window already exists
|
|
||||||
let winnr = bufwinnr(bufnr('LaTeX TOC'))
|
|
||||||
" Two types of splits, horizontal and vertical
|
|
||||||
let l:hori = "new"
|
|
||||||
let l:vert = "vnew"
|
|
||||||
|
|
||||||
" Set General Vars and initialize size
|
|
||||||
let l:type = g:LatexBox_split_type
|
|
||||||
let l:size = 10
|
|
||||||
|
|
||||||
" Size detection
|
|
||||||
if l:type == l:hori
|
|
||||||
let l:size = g:LatexBox_split_length
|
|
||||||
elseif l:type == l:vert
|
|
||||||
let l:size = g:LatexBox_split_width
|
|
||||||
endif
|
|
||||||
|
|
||||||
if winnr >= 0
|
|
||||||
if a:0 == 0
|
|
||||||
silent execute winnr . 'wincmd w'
|
|
||||||
else
|
|
||||||
" Supplying an argument to this function causes toggling instead
|
|
||||||
" of jumping to the TOC window
|
|
||||||
if g:LatexBox_split_resize
|
|
||||||
silent exe "set columns-=" . l:size
|
|
||||||
endif
|
|
||||||
silent execute 'bwipeout' . bufnr('LaTeX TOC')
|
|
||||||
endif
|
|
||||||
return
|
|
||||||
endif
|
|
||||||
" Read TOC
|
|
||||||
let [toc, fileindices] = s:ReadTOC(LatexBox_GetAuxFile(),
|
|
||||||
\ LatexBox_GetMainTexFile())
|
|
||||||
let calling_buf = bufnr('%')
|
|
||||||
|
|
||||||
" Find closest section in current buffer
|
|
||||||
let closest_index = s:FindClosestSection(toc,fileindices)
|
|
||||||
|
|
||||||
" Create TOC window and set local settings
|
|
||||||
if g:LatexBox_split_resize
|
|
||||||
silent exe "set columns+=" . l:size
|
|
||||||
endif
|
|
||||||
silent exe g:LatexBox_split_side l:size . l:type . ' LaTeX\ TOC'
|
|
||||||
|
|
||||||
let b:toc = toc
|
|
||||||
let b:toc_numbers = 1
|
|
||||||
let b:calling_win = bufwinnr(calling_buf)
|
|
||||||
setlocal filetype=latextoc
|
|
||||||
|
|
||||||
" Add TOC entries and jump to the closest section
|
|
||||||
for entry in toc
|
|
||||||
call append('$', entry['number'] . "\t" . entry['text'])
|
|
||||||
endfor
|
|
||||||
if !g:LatexBox_toc_hidehelp
|
|
||||||
call append('$', "")
|
|
||||||
call append('$', "<Esc>/q: close")
|
|
||||||
call append('$', "<Space>: jump")
|
|
||||||
call append('$', "<Enter>: jump and close")
|
|
||||||
call append('$', "s: hide numbering")
|
|
||||||
endif
|
|
||||||
0delete _
|
|
||||||
|
|
||||||
execute 'normal! ' . (closest_index + 1) . 'G'
|
|
||||||
|
|
||||||
" Lock buffer
|
|
||||||
setlocal nomodifiable
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" Binary search for the closest section
|
|
||||||
" return the index of the TOC entry
|
|
||||||
function! s:FindClosestSection(toc, fileindices)
|
|
||||||
let file = expand('%:p')
|
|
||||||
if !has_key(a:fileindices, file)
|
|
||||||
return 0
|
|
||||||
endif
|
|
||||||
|
|
||||||
let imax = len(a:fileindices[file])
|
|
||||||
if imax > 0
|
|
||||||
let imin = 0
|
|
||||||
while imin < imax - 1
|
|
||||||
let i = (imax + imin) / 2
|
|
||||||
let tocindex = a:fileindices[file][i]
|
|
||||||
let entry = a:toc[tocindex]
|
|
||||||
let titlestr = entry['text']
|
|
||||||
let titlestr = escape(titlestr, '\')
|
|
||||||
let titlestr = substitute(titlestr, ' ', '\\_\\s\\+', 'g')
|
|
||||||
let [lnum, cnum] = searchpos('\\' . entry['level'] . '\_\s*{' . titlestr . '}', 'nW')
|
|
||||||
if lnum
|
|
||||||
let imax = i
|
|
||||||
else
|
|
||||||
let imin = i
|
|
||||||
endif
|
|
||||||
endwhile
|
|
||||||
return a:fileindices[file][imin]
|
|
||||||
else
|
|
||||||
return 0
|
|
||||||
endif
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
let s:ConvBackPats = map([
|
|
||||||
\ ['\\''A}' , 'Á'],
|
|
||||||
\ ['\\`A}' , 'À'],
|
|
||||||
\ ['\\^A}' , 'À'],
|
|
||||||
\ ['\\¨A}' , 'Ä'],
|
|
||||||
\ ['\\"A}' , 'Ä'],
|
|
||||||
\ ['\\''a}' , 'á'],
|
|
||||||
\ ['\\`a}' , 'à'],
|
|
||||||
\ ['\\^a}' , 'à'],
|
|
||||||
\ ['\\¨a}' , 'ä'],
|
|
||||||
\ ['\\"a}' , 'ä'],
|
|
||||||
\ ['\\''E}' , 'É'],
|
|
||||||
\ ['\\`E}' , 'È'],
|
|
||||||
\ ['\\^E}' , 'Ê'],
|
|
||||||
\ ['\\¨E}' , 'Ë'],
|
|
||||||
\ ['\\"E}' , 'Ë'],
|
|
||||||
\ ['\\''e}' , 'é'],
|
|
||||||
\ ['\\`e}' , 'è'],
|
|
||||||
\ ['\\^e}' , 'ê'],
|
|
||||||
\ ['\\¨e}' , 'ë'],
|
|
||||||
\ ['\\"e}' , 'ë'],
|
|
||||||
\ ['\\''I}' , 'Í'],
|
|
||||||
\ ['\\`I}' , 'Î'],
|
|
||||||
\ ['\\^I}' , 'Ì'],
|
|
||||||
\ ['\\¨I}' , 'Ï'],
|
|
||||||
\ ['\\"I}' , 'Ï'],
|
|
||||||
\ ['\\''i}' , 'í'],
|
|
||||||
\ ['\\`i}' , 'î'],
|
|
||||||
\ ['\\^i}' , 'ì'],
|
|
||||||
\ ['\\¨i}' , 'ï'],
|
|
||||||
\ ['\\"i}' , 'ï'],
|
|
||||||
\ ['\\''{\?\\i }' , 'í'],
|
|
||||||
\ ['\\''O}' , 'Ó'],
|
|
||||||
\ ['\\`O}' , 'Ò'],
|
|
||||||
\ ['\\^O}' , 'Ô'],
|
|
||||||
\ ['\\¨O}' , 'Ö'],
|
|
||||||
\ ['\\"O}' , 'Ö'],
|
|
||||||
\ ['\\''o}' , 'ó'],
|
|
||||||
\ ['\\`o}' , 'ò'],
|
|
||||||
\ ['\\^o}' , 'ô'],
|
|
||||||
\ ['\\¨o}' , 'ö'],
|
|
||||||
\ ['\\"o}' , 'ö'],
|
|
||||||
\ ['\\''U}' , 'Ú'],
|
|
||||||
\ ['\\`U}' , 'Ù'],
|
|
||||||
\ ['\\^U}' , 'Û'],
|
|
||||||
\ ['\\¨U}' , 'Ü'],
|
|
||||||
\ ['\\"U}' , 'Ü'],
|
|
||||||
\ ['\\''u}' , 'ú'],
|
|
||||||
\ ['\\`u}' , 'ù'],
|
|
||||||
\ ['\\^u}' , 'û'],
|
|
||||||
\ ['\\¨u}' , 'ü'],
|
|
||||||
\ ['\\"u}' , 'ü'],
|
|
||||||
\ ['\\`N}' , 'Ǹ'],
|
|
||||||
\ ['\\\~N}' , 'Ñ'],
|
|
||||||
\ ['\\''n}' , 'ń'],
|
|
||||||
\ ['\\`n}' , 'ǹ'],
|
|
||||||
\ ['\\\~n}' , 'ñ'],
|
|
||||||
\], '[''\C\(\\IeC\s*{\)\?'' . v:val[0], v:val[1]]')
|
|
||||||
" }}}
|
|
||||||
|
|
||||||
" TOC Command {{{
|
|
||||||
command! LatexTOC call LatexBox_TOC()
|
|
||||||
command! LatexTOCToggle call LatexBox_TOC(1)
|
|
||||||
" }}}
|
|
||||||
|
|
||||||
" vim:fdm=marker:ff=unix:noet:ts=4:sw=4
|
|
||||||
|
|
||||||
endif
|
|
||||||
@@ -1,206 +0,0 @@
|
|||||||
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'latex') == -1
|
|
||||||
|
|
||||||
" {{{1 Settings
|
|
||||||
setlocal buftype=nofile
|
|
||||||
setlocal bufhidden=wipe
|
|
||||||
setlocal nobuflisted
|
|
||||||
setlocal noswapfile
|
|
||||||
setlocal nowrap
|
|
||||||
setlocal nospell
|
|
||||||
setlocal cursorline
|
|
||||||
setlocal nonumber
|
|
||||||
setlocal nolist
|
|
||||||
setlocal tabstop=8
|
|
||||||
setlocal cole=0
|
|
||||||
setlocal cocu=nvic
|
|
||||||
if g:LatexBox_fold_toc
|
|
||||||
setlocal foldmethod=expr
|
|
||||||
setlocal foldexpr=TOCFoldLevel(v:lnum)
|
|
||||||
setlocal foldtext=TOCFoldText()
|
|
||||||
endif
|
|
||||||
" }}}1
|
|
||||||
|
|
||||||
" {{{1 Functions
|
|
||||||
" {{{2 TOCClose
|
|
||||||
function! s:TOCClose()
|
|
||||||
if g:LatexBox_split_resize
|
|
||||||
silent exe "set columns-=" . g:LatexBox_split_width
|
|
||||||
endif
|
|
||||||
bwipeout
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" {{{2 TOCToggleNumbers
|
|
||||||
function! s:TOCToggleNumbers()
|
|
||||||
if b:toc_numbers
|
|
||||||
setlocal conceallevel=3
|
|
||||||
let b:toc_numbers = 0
|
|
||||||
else
|
|
||||||
setlocal conceallevel=0
|
|
||||||
let b:toc_numbers = 1
|
|
||||||
endif
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" {{{2 EscapeTitle
|
|
||||||
function! s:EscapeTitle(titlestr)
|
|
||||||
let titlestr = substitute(a:titlestr, '\\[a-zA-Z@]*\>\s*{\?', '.*', 'g')
|
|
||||||
let titlestr = substitute(titlestr, '}', '', 'g')
|
|
||||||
let titlestr = substitute(titlestr, '\%(\.\*\s*\)\{2,}', '.*', 'g')
|
|
||||||
return titlestr
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" {{{2 TOCActivate
|
|
||||||
function! s:TOCActivate(close)
|
|
||||||
let n = getpos('.')[1] - 1
|
|
||||||
|
|
||||||
if n >= len(b:toc)
|
|
||||||
return
|
|
||||||
endif
|
|
||||||
|
|
||||||
let entry = b:toc[n]
|
|
||||||
|
|
||||||
let titlestr = s:EscapeTitle(entry['text'])
|
|
||||||
|
|
||||||
" Search for duplicates
|
|
||||||
"
|
|
||||||
let i=0
|
|
||||||
let entry_hash = entry['level'].titlestr
|
|
||||||
let duplicates = 0
|
|
||||||
while i<n
|
|
||||||
let i_entry = b:toc[n]
|
|
||||||
let i_hash = b:toc[i]['level'].s:EscapeTitle(b:toc[i]['text'])
|
|
||||||
if i_hash == entry_hash
|
|
||||||
let duplicates += 1
|
|
||||||
endif
|
|
||||||
let i += 1
|
|
||||||
endwhile
|
|
||||||
let toc_bnr = bufnr('%')
|
|
||||||
let toc_wnr = winnr()
|
|
||||||
|
|
||||||
execute b:calling_win . 'wincmd w'
|
|
||||||
|
|
||||||
let root = fnamemodify(entry['file'], ':h') . '/'
|
|
||||||
let files = [entry['file']]
|
|
||||||
for line in filter(readfile(entry['file']), 'v:val =~ ''\\input{''')
|
|
||||||
let file = matchstr(line, '{\zs.\{-}\ze\(\.tex\)\?}') . '.tex'
|
|
||||||
if file[0] != '/'
|
|
||||||
let file = root . file
|
|
||||||
endif
|
|
||||||
call add(files, file)
|
|
||||||
endfor
|
|
||||||
|
|
||||||
" Find section in buffer (or inputted files)
|
|
||||||
if entry['level'] == 'label'
|
|
||||||
let re = '\(\\label\_\s*{\|label\s*=\s*\)' . titlestr . '\>'
|
|
||||||
else
|
|
||||||
let re = '\\' . entry['level'] . '\_\s*{' . titlestr . '}'
|
|
||||||
endif
|
|
||||||
call s:TOCFindMatch(re, duplicates, files)
|
|
||||||
|
|
||||||
if a:close
|
|
||||||
if g:LatexBox_split_resize
|
|
||||||
silent exe "set columns-=" . g:LatexBox_split_width
|
|
||||||
endif
|
|
||||||
execute 'bwipeout ' . toc_bnr
|
|
||||||
else
|
|
||||||
execute toc_wnr . 'wincmd w'
|
|
||||||
endif
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" {{{2 TOCFindMatch
|
|
||||||
function! s:TOCFindMatch(strsearch,duplicates,files)
|
|
||||||
if len(a:files) == 0
|
|
||||||
echoerr "Could not find: " . a:strsearch
|
|
||||||
return
|
|
||||||
endif
|
|
||||||
|
|
||||||
call s:TOCOpenBuf(a:files[0])
|
|
||||||
let dups = a:duplicates
|
|
||||||
|
|
||||||
" Skip duplicates
|
|
||||||
while dups > 0
|
|
||||||
if search(a:strsearch, 'w')
|
|
||||||
let dups -= 1
|
|
||||||
else
|
|
||||||
break
|
|
||||||
endif
|
|
||||||
endwhile
|
|
||||||
|
|
||||||
if search(a:strsearch, 'w')
|
|
||||||
normal! zv
|
|
||||||
return
|
|
||||||
endif
|
|
||||||
|
|
||||||
call s:TOCFindMatch(a:strsearch,dups,a:files[1:])
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" {{{2 TOCFoldLevel
|
|
||||||
function! TOCFoldLevel(lnum)
|
|
||||||
let line = getline(a:lnum)
|
|
||||||
let match_s1 = line =~# '^\w\+\s'
|
|
||||||
let match_s2 = line =~# '^\w\+\.\w\+\s'
|
|
||||||
let match_s3 = line =~# '^\w\+\.\w\+\.\w\+\s'
|
|
||||||
|
|
||||||
if g:LatexBox_fold_toc_levels >= 3
|
|
||||||
if match_s3
|
|
||||||
return ">3"
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
|
|
||||||
if g:LatexBox_fold_toc_levels >= 2
|
|
||||||
if match_s2
|
|
||||||
return ">2"
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
|
|
||||||
if match_s1
|
|
||||||
return ">1"
|
|
||||||
endif
|
|
||||||
|
|
||||||
" Don't fold options
|
|
||||||
if line =~# '^\s*$'
|
|
||||||
return 0
|
|
||||||
endif
|
|
||||||
|
|
||||||
" Return previous fold level
|
|
||||||
return "="
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" {{{2 TOCFoldText
|
|
||||||
function! TOCFoldText()
|
|
||||||
let parts = matchlist(getline(v:foldstart), '^\(.*\)\t\(.*\)$')
|
|
||||||
return printf('%-8s%-72s', parts[1], parts[2])
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" {{{2 TOCOpenBuf
|
|
||||||
function! s:TOCOpenBuf(file)
|
|
||||||
|
|
||||||
let bnr = bufnr(a:file)
|
|
||||||
if bnr == -1
|
|
||||||
execute 'badd ' . a:file
|
|
||||||
let bnr = bufnr(a:file)
|
|
||||||
endif
|
|
||||||
execute 'buffer! ' . bnr
|
|
||||||
normal! gg
|
|
||||||
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" }}}1
|
|
||||||
|
|
||||||
" {{{1 Mappings
|
|
||||||
nnoremap <buffer> <silent> s :call <SID>TOCToggleNumbers()<CR>
|
|
||||||
nnoremap <buffer> <silent> q :call <SID>TOCClose()<CR>
|
|
||||||
nnoremap <buffer> <silent> <Esc> :call <SID>TOCClose()<CR>
|
|
||||||
nnoremap <buffer> <silent> <Space> :call <SID>TOCActivate(0)<CR>
|
|
||||||
nnoremap <buffer> <silent> <CR> :call <SID>TOCActivate(1)<CR>
|
|
||||||
nnoremap <buffer> <silent> <leftrelease> :call <SID>TOCActivate(0)<cr>
|
|
||||||
nnoremap <buffer> <silent> <2-leftmouse> :call <SID>TOCActivate(1)<cr>
|
|
||||||
nnoremap <buffer> <silent> G G4k
|
|
||||||
nnoremap <buffer> <silent> <Esc>OA k
|
|
||||||
nnoremap <buffer> <silent> <Esc>OB j
|
|
||||||
nnoremap <buffer> <silent> <Esc>OC l
|
|
||||||
nnoremap <buffer> <silent> <Esc>OD h
|
|
||||||
" }}}1
|
|
||||||
|
|
||||||
" vim:fdm=marker:ff=unix:et:ts=4:sw=4
|
|
||||||
|
|
||||||
endif
|
|
||||||
@@ -2,7 +2,7 @@ if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'vifm') == -1
|
|||||||
|
|
||||||
" Mail file type extension to pick files for attachments via vifm
|
" Mail file type extension to pick files for attachments via vifm
|
||||||
" Maintainer: xaizek <xaizek@posteo.net>
|
" Maintainer: xaizek <xaizek@posteo.net>
|
||||||
" Last Change: January 02, 2018
|
" Last Change: June 22, 2020
|
||||||
|
|
||||||
" Insert attachment picked via vifm after 'Subject' header
|
" Insert attachment picked via vifm after 'Subject' header
|
||||||
function! s:AddMailAttachments()
|
function! s:AddMailAttachments()
|
||||||
@@ -43,9 +43,7 @@ endfunction
|
|||||||
|
|
||||||
function! s:HandleRunResults(exitcode, listf)
|
function! s:HandleRunResults(exitcode, listf)
|
||||||
if a:exitcode != 0
|
if a:exitcode != 0
|
||||||
echohl WarningMsg
|
echoerr 'Got non-zero code from vifm: ' . a:exitcode
|
||||||
echo 'Got non-zero code from vifm: ' . a:exitcode
|
|
||||||
echohl None
|
|
||||||
call delete(a:listf)
|
call delete(a:listf)
|
||||||
return
|
return
|
||||||
endif
|
endif
|
||||||
@@ -54,7 +52,7 @@ function! s:HandleRunResults(exitcode, listf)
|
|||||||
|
|
||||||
if filereadable(a:listf) && l:insert_pos != 0
|
if filereadable(a:listf) && l:insert_pos != 0
|
||||||
for line in readfile(a:listf)
|
for line in readfile(a:listf)
|
||||||
call append(l:insert_pos, 'Attach: '.line)
|
call append(l:insert_pos, 'Attach: '.escape(line, " "))
|
||||||
let l:insert_pos += 1
|
let l:insert_pos += 1
|
||||||
endfor
|
endfor
|
||||||
endif
|
endif
|
||||||
|
|||||||
@@ -156,6 +156,58 @@ function! s:GetHeaderLevel(...)
|
|||||||
endif
|
endif
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
|
" Return list of headers and their levels.
|
||||||
|
"
|
||||||
|
function! s:GetHeaderList()
|
||||||
|
let l:bufnr = bufnr('%')
|
||||||
|
let l:fenced_block = 0
|
||||||
|
let l:front_matter = 0
|
||||||
|
let l:header_list = []
|
||||||
|
let l:vim_markdown_frontmatter = get(g:, "vim_markdown_frontmatter", 0)
|
||||||
|
for i in range(1, line('$'))
|
||||||
|
let l:lineraw = getline(i)
|
||||||
|
let l:l1 = getline(i+1)
|
||||||
|
let l:line = substitute(l:lineraw, "#", "\\\#", "g")
|
||||||
|
" exclude lines in fenced code blocks
|
||||||
|
if l:line =~ '````*' || l:line =~ '\~\~\~\~*'
|
||||||
|
if l:fenced_block == 0
|
||||||
|
let l:fenced_block = 1
|
||||||
|
elseif l:fenced_block == 1
|
||||||
|
let l:fenced_block = 0
|
||||||
|
endif
|
||||||
|
" exclude lines in frontmatters
|
||||||
|
elseif l:vim_markdown_frontmatter == 1
|
||||||
|
if l:front_matter == 1
|
||||||
|
if l:line == '---'
|
||||||
|
let l:front_matter = 0
|
||||||
|
endif
|
||||||
|
elseif i == 1
|
||||||
|
if l:line == '---'
|
||||||
|
let l:front_matter = 1
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
" match line against header regex
|
||||||
|
if join(getline(i, i + 1), "\n") =~ s:headersRegexp && l:line =~ '^\S'
|
||||||
|
let l:is_header = 1
|
||||||
|
else
|
||||||
|
let l:is_header = 0
|
||||||
|
endif
|
||||||
|
if l:is_header == 1 && l:fenced_block == 0 && l:front_matter == 0
|
||||||
|
" remove hashes from atx headers
|
||||||
|
if match(l:line, "^#") > -1
|
||||||
|
let l:line = substitute(l:line, '\v^#*[ ]*', '', '')
|
||||||
|
let l:line = substitute(l:line, '\v[ ]*#*$', '', '')
|
||||||
|
endif
|
||||||
|
" append line to list
|
||||||
|
let l:level = s:GetHeaderLevel(i)
|
||||||
|
let l:item = {'level': l:level, 'text': l:line, 'lnum': i, 'bufnr': bufnr}
|
||||||
|
let l:header_list = l:header_list + [l:item]
|
||||||
|
endif
|
||||||
|
endfor
|
||||||
|
return l:header_list
|
||||||
|
endfunction
|
||||||
|
|
||||||
" Returns the level of the header at the given line.
|
" Returns the level of the header at the given line.
|
||||||
"
|
"
|
||||||
" If there is no header at the given line, returns `0`.
|
" If there is no header at the given line, returns `0`.
|
||||||
@@ -177,6 +229,7 @@ endfunction
|
|||||||
function! s:MoveToParentHeader()
|
function! s:MoveToParentHeader()
|
||||||
let l:linenum = s:GetParentHeaderLineNumber()
|
let l:linenum = s:GetParentHeaderLineNumber()
|
||||||
if l:linenum != 0
|
if l:linenum != 0
|
||||||
|
call setpos("''", getpos('.'))
|
||||||
call cursor(l:linenum, 1)
|
call cursor(l:linenum, 1)
|
||||||
else
|
else
|
||||||
echo 'no parent header'
|
echo 'no parent header'
|
||||||
@@ -305,65 +358,38 @@ function! s:Toc(...)
|
|||||||
endif
|
endif
|
||||||
|
|
||||||
|
|
||||||
let l:bufnr = bufnr('%')
|
|
||||||
let l:cursor_line = line('.')
|
let l:cursor_line = line('.')
|
||||||
let l:cursor_header = 0
|
let l:cursor_header = 0
|
||||||
let l:fenced_block = 0
|
let l:header_list = s:GetHeaderList()
|
||||||
let l:front_matter = 0
|
let l:indented_header_list = []
|
||||||
let l:header_list = []
|
|
||||||
let l:header_max_len = 0
|
|
||||||
let l:vim_markdown_toc_autofit = get(g:, "vim_markdown_toc_autofit", 0)
|
|
||||||
let l:vim_markdown_frontmatter = get(g:, "vim_markdown_frontmatter", 0)
|
|
||||||
for i in range(1, line('$'))
|
|
||||||
let l:lineraw = getline(i)
|
|
||||||
let l:l1 = getline(i+1)
|
|
||||||
let l:line = substitute(l:lineraw, "#", "\\\#", "g")
|
|
||||||
if l:line =~ '````*' || l:line =~ '\~\~\~\~*'
|
|
||||||
if l:fenced_block == 0
|
|
||||||
let l:fenced_block = 1
|
|
||||||
elseif l:fenced_block == 1
|
|
||||||
let l:fenced_block = 0
|
|
||||||
endif
|
|
||||||
elseif l:vim_markdown_frontmatter == 1
|
|
||||||
if l:front_matter == 1
|
|
||||||
if l:line == '---'
|
|
||||||
let l:front_matter = 0
|
|
||||||
endif
|
|
||||||
elseif i == 1
|
|
||||||
if l:line == '---'
|
|
||||||
let l:front_matter = 1
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
if l:line =~ '^#\+' || (l:l1 =~ '^=\+\s*$' || l:l1 =~ '^-\+\s*$') && l:line =~ '^\S'
|
|
||||||
let l:is_header = 1
|
|
||||||
else
|
|
||||||
let l:is_header = 0
|
|
||||||
endif
|
|
||||||
if l:is_header == 1 && l:fenced_block == 0 && l:front_matter == 0
|
|
||||||
" append line to location list
|
|
||||||
let l:item = {'lnum': i, 'text': l:line, 'valid': 1, 'bufnr': l:bufnr, 'col': 1}
|
|
||||||
let l:header_list = l:header_list + [l:item]
|
|
||||||
" set header number of the cursor position
|
|
||||||
if l:cursor_header == 0
|
|
||||||
if i == l:cursor_line
|
|
||||||
let l:cursor_header = len(l:header_list)
|
|
||||||
elseif i > l:cursor_line
|
|
||||||
let l:cursor_header = len(l:header_list) - 1
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
" keep track of the longest header size (heading level + title)
|
|
||||||
let l:total_len = stridx(l:line, ' ') + strdisplaywidth(l:line)
|
|
||||||
if l:total_len > l:header_max_len
|
|
||||||
let l:header_max_len = l:total_len
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
endfor
|
|
||||||
call setloclist(0, l:header_list)
|
|
||||||
if len(l:header_list) == 0
|
if len(l:header_list) == 0
|
||||||
echom "Toc: No headers."
|
echom "Toc: No headers."
|
||||||
return
|
return
|
||||||
endif
|
endif
|
||||||
|
let l:header_max_len = 0
|
||||||
|
let l:vim_markdown_toc_autofit = get(g:, "vim_markdown_toc_autofit", 0)
|
||||||
|
for h in l:header_list
|
||||||
|
" set header number of the cursor position
|
||||||
|
if l:cursor_header == 0
|
||||||
|
let l:header_line = h.lnum
|
||||||
|
if l:header_line == l:cursor_line
|
||||||
|
let l:cursor_header = index(l:header_list, h) + 1
|
||||||
|
elseif l:header_line > l:cursor_line
|
||||||
|
let l:cursor_header = index(l:header_list, h)
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
" indent header based on level
|
||||||
|
let l:text = repeat(' ', h.level-1) . h.text
|
||||||
|
" keep track of the longest header size (heading level + title)
|
||||||
|
let l:total_len = strdisplaywidth(l:text)
|
||||||
|
if l:total_len > l:header_max_len
|
||||||
|
let l:header_max_len = l:total_len
|
||||||
|
endif
|
||||||
|
" append indented line to list
|
||||||
|
let l:item = {'lnum': h.lnum, 'text': l:text, 'valid': 1, 'bufnr': h.bufnr, 'col': 1}
|
||||||
|
let l:indented_header_list = l:indented_header_list + [l:item]
|
||||||
|
endfor
|
||||||
|
call setloclist(0, l:indented_header_list)
|
||||||
|
|
||||||
if l:window_type ==# 'horizontal'
|
if l:window_type ==# 'horizontal'
|
||||||
lopen
|
lopen
|
||||||
@@ -371,7 +397,8 @@ function! s:Toc(...)
|
|||||||
vertical lopen
|
vertical lopen
|
||||||
" auto-fit toc window when possible to shrink it
|
" auto-fit toc window when possible to shrink it
|
||||||
if (&columns/2) > l:header_max_len && l:vim_markdown_toc_autofit == 1
|
if (&columns/2) > l:header_max_len && l:vim_markdown_toc_autofit == 1
|
||||||
execute 'vertical resize ' . (l:header_max_len + 1)
|
" header_max_len + 1 space for first header + 3 spaces for line numbers
|
||||||
|
execute 'vertical resize ' . (l:header_max_len + 1 + 3)
|
||||||
else
|
else
|
||||||
execute 'vertical resize ' . (&columns/2)
|
execute 'vertical resize ' . (&columns/2)
|
||||||
endif
|
endif
|
||||||
@@ -384,27 +411,84 @@ function! s:Toc(...)
|
|||||||
for i in range(1, line('$'))
|
for i in range(1, line('$'))
|
||||||
" this is the location-list data for the current item
|
" this is the location-list data for the current item
|
||||||
let d = getloclist(0)[i-1]
|
let d = getloclist(0)[i-1]
|
||||||
" atx headers
|
call setline(i, d.text)
|
||||||
if match(d.text, "^#") > -1
|
|
||||||
let l:level = len(matchstr(d.text, '#*', 'g'))-1
|
|
||||||
let d.text = substitute(d.text, '\v^#*[ ]*', '', '')
|
|
||||||
let d.text = substitute(d.text, '\v[ ]*#*$', '', '')
|
|
||||||
" setex headers
|
|
||||||
else
|
|
||||||
let l:next_line = getbufline(d.bufnr, d.lnum+1)
|
|
||||||
if match(l:next_line, "=") > -1
|
|
||||||
let l:level = 0
|
|
||||||
elseif match(l:next_line, "-") > -1
|
|
||||||
let l:level = 1
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
call setline(i, repeat(' ', l:level). d.text)
|
|
||||||
endfor
|
endfor
|
||||||
setlocal nomodified
|
setlocal nomodified
|
||||||
setlocal nomodifiable
|
setlocal nomodifiable
|
||||||
execute 'normal! ' . l:cursor_header . 'G'
|
execute 'normal! ' . l:cursor_header . 'G'
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
|
function! s:InsertToc(format, ...)
|
||||||
|
if a:0 > 0
|
||||||
|
if type(a:1) != type(0)
|
||||||
|
echohl WarningMsg
|
||||||
|
echomsg '[vim-markdown] Invalid argument, must be an integer >= 2.'
|
||||||
|
echohl None
|
||||||
|
return
|
||||||
|
endif
|
||||||
|
let l:max_level = a:1
|
||||||
|
if l:max_level < 2
|
||||||
|
echohl WarningMsg
|
||||||
|
echomsg '[vim-markdown] Maximum level cannot be smaller than 2.'
|
||||||
|
echohl None
|
||||||
|
return
|
||||||
|
endif
|
||||||
|
else
|
||||||
|
let l:max_level = 0
|
||||||
|
endif
|
||||||
|
|
||||||
|
let l:toc = []
|
||||||
|
let l:header_list = s:GetHeaderList()
|
||||||
|
if len(l:header_list) == 0
|
||||||
|
echom "InsertToc: No headers."
|
||||||
|
return
|
||||||
|
endif
|
||||||
|
|
||||||
|
if a:format ==# 'numbers'
|
||||||
|
let l:h2_count = 0
|
||||||
|
for header in l:header_list
|
||||||
|
if header.level == 2
|
||||||
|
let l:h2_count += 1
|
||||||
|
endif
|
||||||
|
endfor
|
||||||
|
let l:max_h2_number_len = strlen(string(l:h2_count))
|
||||||
|
else
|
||||||
|
let l:max_h2_number_len = 0
|
||||||
|
endif
|
||||||
|
|
||||||
|
let l:h2_count = 0
|
||||||
|
for header in l:header_list
|
||||||
|
let l:level = header.level
|
||||||
|
if l:level == 1
|
||||||
|
" skip level-1 headers
|
||||||
|
continue
|
||||||
|
elseif l:max_level != 0 && l:level > l:max_level
|
||||||
|
" skip unwanted levels
|
||||||
|
continue
|
||||||
|
elseif l:level == 2
|
||||||
|
" list of level-2 headers can be bullets or numbers
|
||||||
|
if a:format ==# 'bullets'
|
||||||
|
let l:indent = ''
|
||||||
|
let l:marker = '* '
|
||||||
|
else
|
||||||
|
let l:h2_count += 1
|
||||||
|
let l:number_len = strlen(string(l:h2_count))
|
||||||
|
let l:indent = repeat(' ', l:max_h2_number_len - l:number_len)
|
||||||
|
let l:marker = l:h2_count . '. '
|
||||||
|
endif
|
||||||
|
else
|
||||||
|
let l:indent = repeat(' ', l:max_h2_number_len + 2 * (l:level - 2))
|
||||||
|
let l:marker = '* '
|
||||||
|
endif
|
||||||
|
let l:text = '[' . header.text . ']'
|
||||||
|
let l:link = '(#' . substitute(tolower(header.text), '\v[ ]+', '-', 'g') . ')'
|
||||||
|
let l:line = l:indent . l:marker . l:text . l:link
|
||||||
|
let l:toc = l:toc + [l:line]
|
||||||
|
endfor
|
||||||
|
|
||||||
|
call append(line('.'), l:toc)
|
||||||
|
endfunction
|
||||||
|
|
||||||
" Convert Setex headers in range `line1 .. line2` to Atx.
|
" Convert Setex headers in range `line1 .. line2` to Atx.
|
||||||
"
|
"
|
||||||
" Return the number of conversions.
|
" Return the number of conversions.
|
||||||
@@ -681,6 +765,8 @@ command! -buffer Toc call s:Toc()
|
|||||||
command! -buffer Toch call s:Toc('horizontal')
|
command! -buffer Toch call s:Toc('horizontal')
|
||||||
command! -buffer Tocv call s:Toc('vertical')
|
command! -buffer Tocv call s:Toc('vertical')
|
||||||
command! -buffer Toct call s:Toc('tab')
|
command! -buffer Toct call s:Toc('tab')
|
||||||
|
command! -buffer -nargs=? InsertToc call s:InsertToc('bullets', <args>)
|
||||||
|
command! -buffer -nargs=? InsertNToc call s:InsertToc('numbers', <args>)
|
||||||
|
|
||||||
" Heavily based on vim-notes - http://peterodding.com/code/vim/notes/
|
" Heavily based on vim-notes - http://peterodding.com/code/vim/notes/
|
||||||
if exists('g:vim_markdown_fenced_languages')
|
if exists('g:vim_markdown_fenced_languages')
|
||||||
@@ -704,7 +790,7 @@ function! s:MarkdownHighlightSources(force)
|
|||||||
" Look for code blocks in the current file
|
" Look for code blocks in the current file
|
||||||
let filetypes = {}
|
let filetypes = {}
|
||||||
for line in getline(1, '$')
|
for line in getline(1, '$')
|
||||||
let ft = matchstr(line, '```\s*\zs[0-9A-Za-z_+-]*')
|
let ft = matchstr(line, '```\s*\zs[0-9A-Za-z_+-]*\ze.*')
|
||||||
if !empty(ft) && ft !~ '^\d*$' | let filetypes[ft] = 1 | endif
|
if !empty(ft) && ft !~ '^\d*$' | let filetypes[ft] = 1 | endif
|
||||||
endfor
|
endfor
|
||||||
if !exists('b:mkd_known_filetypes')
|
if !exists('b:mkd_known_filetypes')
|
||||||
@@ -735,7 +821,7 @@ function! s:MarkdownHighlightSources(force)
|
|||||||
else
|
else
|
||||||
let include = '@' . toupper(filetype)
|
let include = '@' . toupper(filetype)
|
||||||
endif
|
endif
|
||||||
let command = 'syntax region %s matchgroup=%s start="^\s*```\s*%s$" matchgroup=%s end="\s*```$" keepend contains=%s%s'
|
let command = 'syntax region %s matchgroup=%s start="^\s*```\s*%s.*$" matchgroup=%s end="\s*```$" keepend contains=%s%s'
|
||||||
execute printf(command, group, startgroup, ft, endgroup, include, has('conceal') && get(g:, 'vim_markdown_conceal', 1) && get(g:, 'vim_markdown_conceal_code_blocks', 1) ? ' concealends' : '')
|
execute printf(command, group, startgroup, ft, endgroup, include, has('conceal') && get(g:, 'vim_markdown_conceal', 1) && get(g:, 'vim_markdown_conceal_code_blocks', 1) ? ' concealends' : '')
|
||||||
execute printf('syntax cluster mkdNonListItem add=%s', group)
|
execute printf('syntax cluster mkdNonListItem add=%s', group)
|
||||||
|
|
||||||
|
|||||||
@@ -40,7 +40,8 @@ let s:cposet=&cpoptions
|
|||||||
set cpo&vim
|
set cpo&vim
|
||||||
|
|
||||||
" Comment string
|
" Comment string
|
||||||
setlocal comments=
|
setlocal comments=sr:(*\ ,mb:\ ,ex:*)
|
||||||
|
setlocal comments^=sr:(**,mb:\ \ ,ex:*)
|
||||||
setlocal commentstring=(*%s*)
|
setlocal commentstring=(*%s*)
|
||||||
|
|
||||||
" Add mappings, unless the user didn't want this.
|
" Add mappings, unless the user didn't want this.
|
||||||
|
|||||||
@@ -30,8 +30,30 @@ if has("gui_win32")
|
|||||||
\ "All Files (*.*)\t*.*\n"
|
\ "All Files (*.*)\t*.*\n"
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
" Look up keywords by Get-Help:
|
||||||
|
" check for PowerShell Core in Windows, Linux or MacOS
|
||||||
|
if executable('pwsh') | let s:pwsh_cmd = 'pwsh'
|
||||||
|
" on Windows Subsystem for Linux, check for PowerShell Core in Windows
|
||||||
|
elseif exists('$WSLENV') && executable('pwsh.exe') | let s:pwsh_cmd = 'pwsh.exe'
|
||||||
|
" check for PowerShell <= 5.1 in Windows
|
||||||
|
elseif executable('powershell.exe') | let s:pwsh_cmd = 'powershell.exe'
|
||||||
|
endif
|
||||||
|
|
||||||
|
if exists('s:pwsh_cmd')
|
||||||
|
if !has('gui_running') && executable('less') &&
|
||||||
|
\ !(exists('$ConEmuBuild') && &term =~? '^xterm')
|
||||||
|
" For exclusion of ConEmu, see https://github.com/Maximus5/ConEmu/issues/2048
|
||||||
|
command! -buffer -nargs=1 GetHelp silent exe '!' . s:pwsh_cmd . ' -NoLogo -NoProfile -NonInteractive -ExecutionPolicy RemoteSigned -Command Get-Help -Full "<args>" | ' . (has('unix') ? 'LESS= less' : 'less') | redraw!
|
||||||
|
elseif has('terminal')
|
||||||
|
command! -buffer -nargs=1 GetHelp silent exe 'term ' . s:pwsh_cmd . ' -NoLogo -NoProfile -NonInteractive -ExecutionPolicy RemoteSigned -Command Get-Help -Full "<args>"' . (executable('less') ? ' | less' : '')
|
||||||
|
else
|
||||||
|
command! -buffer -nargs=1 GetHelp echo system(s:pwsh_cmd . ' -NoLogo -NoProfile -NonInteractive -ExecutionPolicy RemoteSigned -Command Get-Help -Full <args>')
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
setlocal keywordprg=:GetHelp
|
||||||
|
|
||||||
" Undo the stuff we changed
|
" Undo the stuff we changed
|
||||||
let b:undo_ftplugin = "setlocal tw< cms< fo<" .
|
let b:undo_ftplugin = "setlocal tw< cms< fo< iskeyword< keywordprg<" .
|
||||||
\ " | unlet! b:browsefilter"
|
\ " | unlet! b:browsefilter"
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user