mirror of
https://github.com/sheerun/vim-polyglot.git
synced 2025-11-09 12:03:53 -05:00
Compare commits
38 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
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 |
1
.gitignore
vendored
1
.gitignore
vendored
@@ -1 +1,2 @@
|
|||||||
/tmp
|
/tmp
|
||||||
|
!*ctags*
|
||||||
|
|||||||
36
README.md
36
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,7 +10,7 @@ A collection of language packs for Vim.
|
|||||||
> One to rule them all, one to find them, one to bring them all and in the darkness bind them.
|
> One to rule them all, one to find them, one to bring them all and in the darkness bind them.
|
||||||
|
|
||||||
- It **won't affect your startup time**, as scripts are loaded only on demand\*.
|
- It **won't affect your startup time**, as scripts are loaded only on demand\*.
|
||||||
- It **installs and updates 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-->149<!--/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`).
|
||||||
@@ -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,15 @@ 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)
|
||||||
- [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, ftplugin)
|
||||||
- [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,8 +89,6 @@ 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/mustache/vim-mustache-handlebars) (syntax, indent, ftplugin)
|
||||||
- [haproxy](https://github.com/CH-DanReif/haproxy.vim) (syntax)
|
- [haproxy](https://github.com/CH-DanReif/haproxy.vim) (syntax)
|
||||||
@@ -101,7 +101,6 @@ If you need full functionality of any plugin, please use it directly with your p
|
|||||||
- [i3](https://github.com/mboughaba/i3config.vim) (syntax, ftplugin)
|
- [i3](https://github.com/mboughaba/i3config.vim) (syntax, ftplugin)
|
||||||
- [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)
|
||||||
@@ -111,7 +110,7 @@ If you need full functionality of any plugin, please use it directly with your p
|
|||||||
- [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 +135,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 +148,26 @@ 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)
|
- [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)
|
||||||
- [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)
|
||||||
- [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) (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 +178,7 @@ 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)
|
||||||
- [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)
|
||||||
@@ -192,6 +193,7 @@ If you need full functionality of any plugin, please use it directly with your p
|
|||||||
- [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, 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
|
||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
endif
|
call feedkeys(nr2char(a:trigger), 'nt') " fall-back to the default wildchar
|
||||||
return l
|
elseif a:trigger == char2nr("\<S-Tab>")
|
||||||
|
call feedkeys("\<S-Tab>", 'nt') " fall-back to the default <S-Tab>
|
||||||
endif
|
endif
|
||||||
|
elseif exact_match
|
||||||
" 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
|
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
|
" no exact match: complete with the longest common prefix
|
||||||
let common = s:L2U_longest_common_prefix(partmatches)
|
let common = s:L2U_longest_common_prefix(partmatches)
|
||||||
if col0 > 0
|
call feedkeys(common[len(base):], 'nt')
|
||||||
let pre = l[0 : col0 - 1]
|
|
||||||
else
|
|
||||||
let pre = ''
|
|
||||||
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
|
||||||
|
|||||||
@@ -4,11 +4,13 @@ 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')
|
||||||
|
|||||||
367
autoload/crystal/indent.vim
Normal file
367
autoload/crystal/indent.vim
Normal file
@@ -0,0 +1,367 @@
|
|||||||
|
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'crystal') == -1
|
||||||
|
|
||||||
|
" Variables {{{1
|
||||||
|
" =========
|
||||||
|
|
||||||
|
" Regex of syntax group names that are strings or characters.
|
||||||
|
let g:crystal#indent#syng_string =
|
||||||
|
\ '\<crystal\%(String\|Interpolation\|NoInterpolation\|StringEscape\|CharLiteral\|ASCIICode\)\>'
|
||||||
|
lockvar g:crystal#indent#syng_string
|
||||||
|
|
||||||
|
" Regex of syntax group names that are strings, characters, symbols,
|
||||||
|
" regexps, or comments.
|
||||||
|
let g:crystal#indent#syng_strcom =
|
||||||
|
\ g:crystal#indent#syng_string.'\|' .
|
||||||
|
\ '\<crystal\%(Regexp\|RegexpEscape\|Symbol\|Comment\)\>'
|
||||||
|
lockvar g:crystal#indent#syng_strcom
|
||||||
|
|
||||||
|
" Expression used to check whether we should skip a match with searchpair().
|
||||||
|
let g:crystal#indent#skip_expr =
|
||||||
|
\ 'synIDattr(synID(line("."), col("."), 1), "name") =~# "'.g:crystal#indent#syng_strcom.'"'
|
||||||
|
lockvar g:crystal#indent#skip_expr
|
||||||
|
|
||||||
|
" Regex for the start of a line:
|
||||||
|
" start of line + whitespace + optional opening macro delimiter
|
||||||
|
let g:crystal#indent#sol = '^\s*\zs\%(\\\={%\s*\)\='
|
||||||
|
lockvar g:crystal#indent#sol
|
||||||
|
|
||||||
|
" Regex for the end of a line:
|
||||||
|
" whitespace + optional closing macro delimiter + whitespace +
|
||||||
|
" optional comment + end of line
|
||||||
|
let g:crystal#indent#eol = '\s*\%(%}\)\=\ze\s*\%(#.*\)\=$'
|
||||||
|
lockvar g:crystal#indent#eol
|
||||||
|
|
||||||
|
" Regex that defines blocks.
|
||||||
|
let g:crystal#indent#block_regex =
|
||||||
|
\ '\%(\<do\>\|%\@1<!{\)\s*\%(|[^|]*|\)\='.g:crystal#indent#eol
|
||||||
|
lockvar g:crystal#indent#block_regex
|
||||||
|
|
||||||
|
" Regex that defines the start-match for the 'end' keyword.
|
||||||
|
" NOTE: This *should* properly match the 'do' only at the end of the
|
||||||
|
" line
|
||||||
|
let g:crystal#indent#end_start_regex =
|
||||||
|
\ g:crystal#indent#sol .
|
||||||
|
\ '\%(' .
|
||||||
|
\ '\%(\<\%(private\|protected\)\s\+\)\=' .
|
||||||
|
\ '\%(\<\%(abstract\s\+\)\=\%(class\|struct\)\>\|\<\%(def\|module\|macro\|lib\|enum\)\>\)' .
|
||||||
|
\ '\|' .
|
||||||
|
\ '\<\%(if\|unless\|while\|until\|case\|begin\|for\|union\)\>' .
|
||||||
|
\ '\)' .
|
||||||
|
\ '\|' .
|
||||||
|
\ g:crystal#indent#block_regex
|
||||||
|
lockvar g:crystal#indent#end_start_regex
|
||||||
|
|
||||||
|
" Regex that defines the middle-match for the 'end' keyword.
|
||||||
|
let g:crystal#indent#end_middle_regex =
|
||||||
|
\ g:crystal#indent#sol .
|
||||||
|
\ '\<\%(else\|elsif\|rescue\|ensure\|when\)\>'
|
||||||
|
lockvar g:crystal#indent#end_middle_regex
|
||||||
|
|
||||||
|
" Regex that defines the end-match for the 'end' keyword.
|
||||||
|
let g:crystal#indent#end_end_regex =
|
||||||
|
\ g:crystal#indent#sol .
|
||||||
|
\ '\<end\>'
|
||||||
|
lockvar g:crystal#indent#end_end_regex
|
||||||
|
|
||||||
|
" Regex used for words that add a level of indent.
|
||||||
|
let g:crystal#indent#crystal_indent_keywords =
|
||||||
|
\ g:crystal#indent#end_start_regex .
|
||||||
|
\ '\|' .
|
||||||
|
\ g:crystal#indent#end_middle_regex
|
||||||
|
lockvar g:crystal#indent#crystal_indent_keywords
|
||||||
|
|
||||||
|
" Regex used for words that remove a level of indent.
|
||||||
|
let g:crystal#indent#crystal_deindent_keywords =
|
||||||
|
\ g:crystal#indent#end_middle_regex .
|
||||||
|
\ '\|' .
|
||||||
|
\ g:crystal#indent#end_end_regex
|
||||||
|
lockvar g:crystal#indent#crystal_deindent_keywords
|
||||||
|
|
||||||
|
" Regex that defines a type declaration
|
||||||
|
let g:crystal#indent#crystal_type_declaration =
|
||||||
|
\ '@\=\h\k*\s\+:\s\+\S.*'
|
||||||
|
lockvar g:crystal#indent#crystal_type_declaration
|
||||||
|
|
||||||
|
" Regex that defines continuation lines, not including (, {, or [.
|
||||||
|
let g:crystal#indent#non_bracket_continuation_regex =
|
||||||
|
\ '\%(' .
|
||||||
|
\ '[\\.,:/%+\-=~<>&^]' .
|
||||||
|
\ '\|' .
|
||||||
|
\ '\%(\%(\<do\>\|%\@1<!{\)\s*|[^|]*\)\@<!|' .
|
||||||
|
\ '\|' .
|
||||||
|
\ '\W?' .
|
||||||
|
\ '\|' .
|
||||||
|
\ '\<\%(if\|unless\)\>' .
|
||||||
|
\ '\|' .
|
||||||
|
\ '\%('.g:crystal#indent#crystal_type_declaration.'\h\k*\)\@<!\*' .
|
||||||
|
\ '\)' .
|
||||||
|
\ g:crystal#indent#eol
|
||||||
|
lockvar g:crystal#indent#non_bracket_continuation_regex
|
||||||
|
|
||||||
|
" Regex that defines bracket continuations
|
||||||
|
let g:crystal#indent#bracket_continuation_regex = '%\@1<!\%([({[]\)\s*\%(#.*\)\=$'
|
||||||
|
lockvar g:crystal#indent#bracket_continuation_regex
|
||||||
|
|
||||||
|
" Regex that defines continuation lines.
|
||||||
|
let g:crystal#indent#continuation_regex =
|
||||||
|
\ g:crystal#indent#non_bracket_continuation_regex .
|
||||||
|
\ '\|' .
|
||||||
|
\ g:crystal#indent#bracket_continuation_regex
|
||||||
|
lockvar g:crystal#indent#continuation_regex
|
||||||
|
|
||||||
|
" Regex that defines end of bracket continuation followed by another continuation
|
||||||
|
let g:crystal#indent#bracket_switch_continuation_regex =
|
||||||
|
\ '^\([^(]\+\zs).\+\)\+'.g:crystal#indent#continuation_regex
|
||||||
|
lockvar g:crystal#indent#bracket_switch_continuation_regex
|
||||||
|
|
||||||
|
" Regex that defines continuable keywords
|
||||||
|
let g:crystal#indent#continuable_regex =
|
||||||
|
\ '\%(^\s*\|[=,*/%+\-|;{]\|<<\|>>\|:\s\)\s*\zs' .
|
||||||
|
\ '\<\%(if\|for\|while\|until\|unless\):\@!\>'
|
||||||
|
lockvar g:crystal#indent#continuable_regex
|
||||||
|
|
||||||
|
" Regex that defines the first part of a splat pattern
|
||||||
|
let g:crystal#indent#splat_regex = '[[,(]\s*\*\s*\%(#.*\)\=$'
|
||||||
|
lockvar g:crystal#indent#splat_regex
|
||||||
|
|
||||||
|
let g:crystal#indent#block_continuation_regex = '^\s*[^])}\t ].*'.g:crystal#indent#block_regex
|
||||||
|
lockvar g:crystal#indent#block_continuation_regex
|
||||||
|
|
||||||
|
" Regex that describes a leading operator (only a method call's dot for now)
|
||||||
|
let g:crystal#indent#leading_operator_regex = '^\s*[.]'
|
||||||
|
lockvar g:crystal#indent#leading_operator_regex
|
||||||
|
|
||||||
|
" Auxiliary Functions {{{1
|
||||||
|
" ===================
|
||||||
|
|
||||||
|
" Check if the character at lnum:col is inside a string, comment, or is ascii.
|
||||||
|
function! crystal#indent#IsInStringOrComment(lnum, col) abort
|
||||||
|
return synIDattr(synID(a:lnum, a:col, 1), 'name') =~# g:crystal#indent#syng_strcom
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" Check if the character at lnum:col is inside a string or character.
|
||||||
|
function! crystal#indent#IsInString(lnum, col) abort
|
||||||
|
return synIDattr(synID(a:lnum, a:col, 1), 'name') =~# g:crystal#indent#syng_string
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" Check if the character at lnum:col is inside a string or regexp
|
||||||
|
" delimiter
|
||||||
|
function! crystal#indent#IsInStringDelimiter(lnum, col) abort
|
||||||
|
return synIDattr(synID(a:lnum, a:col, 1), 'name') =~# '\<crystal\%(StringDelimiter\|RegexpDelimiter\)\>'
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" Find line above 'lnum' that isn't empty, in a comment, or in a string.
|
||||||
|
function! crystal#indent#PrevNonBlankNonString(lnum) abort
|
||||||
|
let lnum = prevnonblank(a:lnum)
|
||||||
|
|
||||||
|
while lnum > 0
|
||||||
|
let line = getline(lnum)
|
||||||
|
let start = match(line, '\S')
|
||||||
|
|
||||||
|
if !crystal#indent#IsInStringOrComment(lnum, start + 1)
|
||||||
|
break
|
||||||
|
endif
|
||||||
|
|
||||||
|
let lnum = prevnonblank(lnum - 1)
|
||||||
|
endwhile
|
||||||
|
|
||||||
|
return lnum
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" Find line above 'lnum' that started the continuation 'lnum' may be part of.
|
||||||
|
function! crystal#indent#GetMSL(lnum) abort
|
||||||
|
" Start on the line we're at and use its indent.
|
||||||
|
let msl = a:lnum
|
||||||
|
let msl_body = getline(msl)
|
||||||
|
let lnum = crystal#indent#PrevNonBlankNonString(a:lnum - 1)
|
||||||
|
|
||||||
|
while lnum > 0
|
||||||
|
" If we have a continuation line, or we're in a string, use line as MSL.
|
||||||
|
" Otherwise, terminate search as we have found our MSL already.
|
||||||
|
let line = getline(lnum)
|
||||||
|
|
||||||
|
if crystal#indent#Match(msl, g:crystal#indent#leading_operator_regex)
|
||||||
|
" If the current line starts with a leading operator, keep its indent
|
||||||
|
" and keep looking for an MSL.
|
||||||
|
let msl = lnum
|
||||||
|
elseif crystal#indent#Match(lnum, g:crystal#indent#splat_regex)
|
||||||
|
" If the above line looks like the "*" of a splat, use the current one's
|
||||||
|
" indentation.
|
||||||
|
"
|
||||||
|
" Example:
|
||||||
|
" Hash[*
|
||||||
|
" method_call do
|
||||||
|
" something
|
||||||
|
"
|
||||||
|
return msl
|
||||||
|
elseif crystal#indent#Match(lnum, g:crystal#indent#non_bracket_continuation_regex) &&
|
||||||
|
\ crystal#indent#Match(msl, g:crystal#indent#non_bracket_continuation_regex)
|
||||||
|
" If the current line is a non-bracket continuation and so is the
|
||||||
|
" previous one, keep its indent and continue looking for an MSL.
|
||||||
|
"
|
||||||
|
" Example:
|
||||||
|
" method_call one,
|
||||||
|
" two,
|
||||||
|
" three
|
||||||
|
"
|
||||||
|
let msl = lnum
|
||||||
|
elseif crystal#indent#Match(lnum, g:crystal#indent#non_bracket_continuation_regex) &&
|
||||||
|
\ (
|
||||||
|
\ crystal#indent#Match(msl, g:crystal#indent#bracket_continuation_regex) ||
|
||||||
|
\ crystal#indent#Match(msl, g:crystal#indent#block_continuation_regex)
|
||||||
|
\ )
|
||||||
|
" If the current line is a bracket continuation or a block-starter, but
|
||||||
|
" the previous is a non-bracket one, respect the previous' indentation,
|
||||||
|
" and stop here.
|
||||||
|
"
|
||||||
|
" Example:
|
||||||
|
" method_call one,
|
||||||
|
" two {
|
||||||
|
" three
|
||||||
|
"
|
||||||
|
return lnum
|
||||||
|
elseif crystal#indent#Match(lnum, g:crystal#indent#bracket_continuation_regex) &&
|
||||||
|
\ (
|
||||||
|
\ crystal#indent#Match(msl, g:crystal#indent#bracket_continuation_regex) ||
|
||||||
|
\ crystal#indent#Match(msl, g:crystal#indent#block_continuation_regex)
|
||||||
|
\ )
|
||||||
|
" If both lines are bracket continuations (the current may also be a
|
||||||
|
" block-starter), use the current one's and stop here
|
||||||
|
"
|
||||||
|
" Example:
|
||||||
|
" method_call(
|
||||||
|
" other_method_call(
|
||||||
|
" foo
|
||||||
|
return msl
|
||||||
|
elseif crystal#indent#Match(lnum, g:crystal#indent#block_regex) &&
|
||||||
|
\ !crystal#indent#Match(msl, g:crystal#indent#continuation_regex) &&
|
||||||
|
\ !crystal#indent#Match(msl, g:crystal#indent#block_continuation_regex)
|
||||||
|
" If the previous line is a block-starter and the current one is
|
||||||
|
" mostly ordinary, use the current one as the MSL.
|
||||||
|
"
|
||||||
|
" Example:
|
||||||
|
" method_call do
|
||||||
|
" something
|
||||||
|
" something_else
|
||||||
|
return msl
|
||||||
|
else
|
||||||
|
let col = match(line, g:crystal#indent#continuation_regex) + 1
|
||||||
|
|
||||||
|
if (col > 0 && !crystal#indent#IsInStringOrComment(lnum, col))
|
||||||
|
\ || crystal#indent#IsInString(lnum, strlen(line))
|
||||||
|
let msl = lnum
|
||||||
|
else
|
||||||
|
break
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
let msl_body = getline(msl)
|
||||||
|
let lnum = crystal#indent#PrevNonBlankNonString(lnum - 1)
|
||||||
|
endwhile
|
||||||
|
|
||||||
|
return msl
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" Check if line 'lnum' has more opening brackets than closing ones.
|
||||||
|
function! crystal#indent#ExtraBrackets(lnum) abort
|
||||||
|
let opening = {'parentheses': [], 'braces': [], 'brackets': []}
|
||||||
|
let closing = {'parentheses': [], 'braces': [], 'brackets': []}
|
||||||
|
|
||||||
|
let line = getline(a:lnum)
|
||||||
|
let pos = match(line, '[][(){}]', 0)
|
||||||
|
|
||||||
|
" Save any encountered opening brackets, and remove them once a matching
|
||||||
|
" closing one has been found. If a closing bracket shows up that doesn't
|
||||||
|
" close anything, save it for later.
|
||||||
|
while pos != -1
|
||||||
|
if !crystal#indent#IsInStringOrComment(a:lnum, pos + 1)
|
||||||
|
if line[pos] ==# '('
|
||||||
|
call add(opening.parentheses, {'type': '(', 'pos': pos})
|
||||||
|
elseif line[pos] ==# ')'
|
||||||
|
if empty(opening.parentheses)
|
||||||
|
call add(closing.parentheses, {'type': ')', 'pos': pos})
|
||||||
|
else
|
||||||
|
let opening.parentheses = opening.parentheses[0:-2]
|
||||||
|
endif
|
||||||
|
elseif line[pos] ==# '{'
|
||||||
|
call add(opening.braces, {'type': '{', 'pos': pos})
|
||||||
|
elseif line[pos] ==# '}'
|
||||||
|
if empty(opening.braces)
|
||||||
|
call add(closing.braces, {'type': '}', 'pos': pos})
|
||||||
|
else
|
||||||
|
let opening.braces = opening.braces[0:-2]
|
||||||
|
endif
|
||||||
|
elseif line[pos] ==# '['
|
||||||
|
call add(opening.brackets, {'type': '[', 'pos': pos})
|
||||||
|
elseif line[pos] ==# ']'
|
||||||
|
if empty(opening.brackets)
|
||||||
|
call add(closing.brackets, {'type': ']', 'pos': pos})
|
||||||
|
else
|
||||||
|
let opening.brackets = opening.brackets[0:-2]
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
let pos = match(line, '[][(){}]', pos + 1)
|
||||||
|
endwhile
|
||||||
|
|
||||||
|
" Find the rightmost brackets, since they're the ones that are important in
|
||||||
|
" both opening and closing cases
|
||||||
|
let rightmost_opening = {'type': '(', 'pos': -1}
|
||||||
|
let rightmost_closing = {'type': ')', 'pos': -1}
|
||||||
|
|
||||||
|
for opening in opening.parentheses + opening.braces + opening.brackets
|
||||||
|
if opening.pos > rightmost_opening.pos
|
||||||
|
let rightmost_opening = opening
|
||||||
|
endif
|
||||||
|
endfor
|
||||||
|
|
||||||
|
for closing in closing.parentheses + closing.braces + closing.brackets
|
||||||
|
if closing.pos > rightmost_closing.pos
|
||||||
|
let rightmost_closing = closing
|
||||||
|
endif
|
||||||
|
endfor
|
||||||
|
|
||||||
|
return [rightmost_opening, rightmost_closing]
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! crystal#indent#Match(lnum, regex) abort
|
||||||
|
let regex = '\C'.a:regex
|
||||||
|
|
||||||
|
let line = getline(a:lnum)
|
||||||
|
let col = match(line, regex) + 1
|
||||||
|
|
||||||
|
while col &&
|
||||||
|
\ crystal#indent#IsInStringOrComment(a:lnum, col) ||
|
||||||
|
\ crystal#indent#IsInStringDelimiter(a:lnum, col)
|
||||||
|
let col = match(line, regex, col) + 1
|
||||||
|
endwhile
|
||||||
|
|
||||||
|
return col
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" Locates the containing class/module/struct/enum/lib's definition line,
|
||||||
|
" ignoring nested classes along the way.
|
||||||
|
function! crystal#indent#FindContainingClass() abort
|
||||||
|
let saved_position = getcurpos()
|
||||||
|
|
||||||
|
while searchpair(
|
||||||
|
\ g:crystal#indent#end_start_regex,
|
||||||
|
\ g:crystal#indent#end_middle_regex,
|
||||||
|
\ g:crystal#indent#end_end_regex,
|
||||||
|
\ 'bWz',
|
||||||
|
\ g:crystal#indent#skip_expr) > 0
|
||||||
|
if expand('<cword>') =~# '\<\%(class\|module\|struct\|enum\|lib\)\>'
|
||||||
|
let found_lnum = line('.')
|
||||||
|
call setpos('.', saved_position)
|
||||||
|
return found_lnum
|
||||||
|
endif
|
||||||
|
endwhile
|
||||||
|
|
||||||
|
call setpos('.', saved_position)
|
||||||
|
return 0
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" vim: sw=2 sts=2 et:
|
||||||
|
|
||||||
|
endif
|
||||||
@@ -7,6 +7,8 @@ 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)
|
||||||
@@ -299,29 +301,47 @@ function! crystal_lang#run_current_spec(...) abort
|
|||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! crystal_lang#format_string(code, ...) abort
|
function! crystal_lang#format_string(code, ...) abort
|
||||||
|
if s:IS_WINDOWS
|
||||||
|
let redirect = '2> nul'
|
||||||
|
else
|
||||||
|
let redirect = '2>/dev/null'
|
||||||
|
endif
|
||||||
let cmd = printf(
|
let cmd = printf(
|
||||||
\ '%s tool format --no-color %s -',
|
\ '%s tool format --no-color %s - %s',
|
||||||
\ g:crystal_compiler_command,
|
\ g:crystal_compiler_command,
|
||||||
\ get(a:, 1, '')
|
\ get(a:, 1, ''),
|
||||||
|
\ redirect,
|
||||||
\ )
|
\ )
|
||||||
let output = s:P.system(cmd, a:code)
|
let output = s:P.system(cmd, a:code)
|
||||||
if s:P.get_last_status()
|
if s:P.get_last_status()
|
||||||
throw 'vim-crystal: Error on formatting: ' . output
|
throw 'vim-crystal: Error on formatting with command: ' . cmd
|
||||||
endif
|
endif
|
||||||
return output
|
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)
|
|
||||||
" Finish command silently
|
|
||||||
return
|
|
||||||
endif
|
|
||||||
|
|
||||||
let on_save = a:0 > 0 ? a:1 : 0
|
let on_save = a:0 > 0 ? a:1 : 0
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
let before = join(getline(1, '$'), "\n")
|
let before = join(getline(1, '$'), "\n")
|
||||||
|
try
|
||||||
let formatted = crystal_lang#format_string(before, a:option_str)
|
let formatted = crystal_lang#format_string(before, a:option_str)
|
||||||
|
catch /^vim-crystal: /
|
||||||
|
echohl ErrorMsg
|
||||||
|
echomsg v:exception . ': Your code was not formatted. Exception was thrown at ' . v:throwpoint
|
||||||
|
echohl None
|
||||||
|
return
|
||||||
|
endtry
|
||||||
|
|
||||||
if !on_save
|
if !on_save
|
||||||
let after = substitute(formatted, '\n$', '', '')
|
let after = substitute(formatted, '\n$', '', '')
|
||||||
if before ==# after
|
if before ==# after
|
||||||
@@ -348,4 +368,6 @@ endfunction
|
|||||||
let &cpo = s:save_cpo
|
let &cpo = s:save_cpo
|
||||||
unlet s:save_cpo
|
unlet s:save_cpo
|
||||||
|
|
||||||
|
" vim: sw=2 sts=2 et:
|
||||||
|
|
||||||
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
|
||||||
@@ -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,16 +590,15 @@ 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
|
||||||
|
if !a:silent
|
||||||
call csv#Warn('File too large, only checking the first 10000 rows for the width')
|
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)
|
||||||
let pat = '^\s*\V'. escape(b:csv_cmt[0], '\\')
|
let pat = '^\s*\V'. escape(b:csv_cmt[0], '\\')
|
||||||
call filter(b:csv_list, 'v:val !~ pat')
|
call filter(b:csv_list, 'v:val !~ pat')
|
||||||
@@ -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
|
||||||
@@ -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
|
||||||
@@ -2134,7 +2148,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)
|
||||||
@@ -2332,7 +2346,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 +3159,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 +3180,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
|
||||||
|
|||||||
@@ -86,7 +86,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 +118,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 +141,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
|
|
||||||
@@ -54,7 +54,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,23 +165,6 @@ 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
|
||||||
@@ -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
|
||||||
@@ -308,6 +309,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 +357,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,9 +377,9 @@ 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
|
||||||
@@ -480,6 +489,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
|
||||||
@@ -504,26 +517,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', [])
|
||||||
|
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'])
|
||||||
|
|||||||
@@ -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': '≨',
|
||||||
|
|||||||
@@ -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,6 +551,9 @@ 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()
|
||||||
|
finally
|
||||||
|
call setpos('.', saved)
|
||||||
|
endtry
|
||||||
if func_name ==# ''
|
if func_name ==# ''
|
||||||
echohl ErrorMsg
|
echohl ErrorMsg
|
||||||
echomsg 'No test function was found under the cursor. Please add ! to command if you want to run all tests'
|
echomsg 'No test function was found under the cursor. Please add ! to command if you want to run all tests'
|
||||||
@@ -554,10 +565,6 @@ function! rust#Test(mods, winsize, all, options) abort
|
|||||||
else
|
else
|
||||||
execute cmd . 'cargo test --manifest-path' manifest func_name a:options
|
execute cmd . 'cargo test --manifest-path' manifest func_name a:options
|
||||||
endif
|
endif
|
||||||
return
|
|
||||||
finally
|
|
||||||
call setpos('.', saved)
|
|
||||||
endtry
|
|
||||||
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',
|
||||||
@@ -58,7 +71,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
|
||||||
|
|||||||
46
build
46
build
@@ -2,11 +2,11 @@
|
|||||||
|
|
||||||
set -E
|
set -E
|
||||||
|
|
||||||
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
|
||||||
@@ -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
|
||||||
}
|
}
|
||||||
@@ -167,6 +145,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 +165,15 @@ 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
|
||||||
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
|
||||||
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,8 +181,6 @@ 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:mustache/vim-mustache-handlebars
|
||||||
haproxy:CH-DanReif/haproxy.vim
|
haproxy:CH-DanReif/haproxy.vim
|
||||||
@@ -215,7 +193,6 @@ PACKS="
|
|||||||
i3:mboughaba/i3config.vim
|
i3:mboughaba/i3config.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
|
||||||
@@ -225,7 +202,7 @@ PACKS="
|
|||||||
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 +210,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,9 +240,11 @@ 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
|
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
|
||||||
@@ -306,6 +285,7 @@ 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
|
||||||
"
|
"
|
||||||
|
|
||||||
rm -rf tmp
|
rm -rf tmp
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
32
compiler/ledger.vim
Normal file
32
compiler/ledger.vim
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
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 !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\ %\ '.substitute(g:ledger_extra_options, ' ', '\\ ', 'g').'\ source\ %'
|
||||||
|
else
|
||||||
|
exe 'CompilerSet makeprg=('.substitute(g:ledger_bin, ' ', '\\ ', 'g').'\ -f\ %\ 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
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -5,6 +5,11 @@ if exists('b:did_ftplugin')
|
|||||||
endif
|
endif
|
||||||
let b:did_ftplugin = 1
|
let b:did_ftplugin = 1
|
||||||
|
|
||||||
|
" This file is loaded on 'ecrystal' filetype
|
||||||
|
if &filetype !=# 'crystal'
|
||||||
|
finish
|
||||||
|
endif
|
||||||
|
|
||||||
let s:save_cpo = &cpo
|
let s:save_cpo = &cpo
|
||||||
set cpo&vim
|
set cpo&vim
|
||||||
|
|
||||||
@@ -76,9 +81,14 @@ if &l:ofu ==# ''
|
|||||||
setlocal omnifunc=crystal_lang#complete
|
setlocal omnifunc=crystal_lang#complete
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
if exists('AutoPairsLoaded')
|
||||||
|
let b:AutoPairs = { '{%': '%}' }
|
||||||
|
call extend(b:AutoPairs, g:AutoPairs, 'force')
|
||||||
|
endif
|
||||||
|
|
||||||
let &cpo = s:save_cpo
|
let &cpo = s:save_cpo
|
||||||
unlet s:save_cpo
|
unlet s:save_cpo
|
||||||
|
|
||||||
" vim: nowrap sw=2 sts=2 ts=8:
|
" vim: sw=2 sts=2 et:
|
||||||
|
|
||||||
endif
|
endif
|
||||||
|
|||||||
@@ -32,6 +32,22 @@ if exists('g:dhall_strip_whitespace')
|
|||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
function! DhallFormat()
|
||||||
|
let cursor = getpos('.')
|
||||||
|
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
|
||||||
|
augroup dhall
|
||||||
|
au BufWritePost *.dhall call DhallFormat()
|
||||||
|
augroup END
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
augroup dhall
|
augroup dhall
|
||||||
au BufNewFile,BufRead *.dhall setl shiftwidth=2
|
au BufNewFile,BufRead *.dhall setl shiftwidth=2
|
||||||
augroup END
|
augroup END
|
||||||
|
|||||||
@@ -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
|
|
||||||
@@ -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.
|
||||||
|
|||||||
107
ftplugin/gdscript3.vim
Normal file
107
ftplugin/gdscript3.vim
Normal file
@@ -0,0 +1,107 @@
|
|||||||
|
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'gdscript') == -1
|
||||||
|
|
||||||
|
setlocal commentstring=#\ %s
|
||||||
|
|
||||||
|
if exists("g:gdscript3_loaded")
|
||||||
|
finish
|
||||||
|
endif
|
||||||
|
let g:gdscript3_loaded=1
|
||||||
|
|
||||||
|
if !has("python3") && !has("python")
|
||||||
|
finish
|
||||||
|
endif
|
||||||
|
|
||||||
|
if has("python3")
|
||||||
|
let s:pyfile_cmd = "py3file"
|
||||||
|
let s:py_cmd = "py3"
|
||||||
|
else
|
||||||
|
let s:pyfile_cmd = "pyfile"
|
||||||
|
let s:py_cmd = "py"
|
||||||
|
endif
|
||||||
|
|
||||||
|
execute s:pyfile_cmd . " " . expand('<sfile>:p:h') . "/../python/init.py"
|
||||||
|
|
||||||
|
fun! GDScriptComplete(findstart, base)
|
||||||
|
if a:findstart == 1
|
||||||
|
let line = getline('.')
|
||||||
|
let start = col('.') - 1
|
||||||
|
" Treat '-' as part of the word when completing in a string.
|
||||||
|
if synIDattr(synID(line('.'), col('.')-1, 1), 'name') ==# "gdString"
|
||||||
|
let pattern = '[-a-zA-Z0-9_]'
|
||||||
|
else
|
||||||
|
let pattern = '[a-zA-Z0-9_]'
|
||||||
|
endif
|
||||||
|
while start > 0 && line[start - 1] =~ pattern
|
||||||
|
let start -= 1
|
||||||
|
endwhile
|
||||||
|
return start
|
||||||
|
else
|
||||||
|
execute s:py_cmd . " gdscript_complete()"
|
||||||
|
if exists("gdscript_completions")
|
||||||
|
return gdscript_completions
|
||||||
|
else
|
||||||
|
return []
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
endfun
|
||||||
|
set omnifunc=GDScriptComplete
|
||||||
|
|
||||||
|
" Configure for common completion frameworks.
|
||||||
|
|
||||||
|
" Deoplete
|
||||||
|
if &rtp =~ 'deoplete.nvim'
|
||||||
|
call deoplete#custom#option('sources', {
|
||||||
|
\ 'gdscript3': ['omni'],
|
||||||
|
\ })
|
||||||
|
call deoplete#custom#var('omni', 'input_patterns', {
|
||||||
|
\ 'gdscript3': [
|
||||||
|
\ '\.|\w+',
|
||||||
|
\ '\bextends\s+',
|
||||||
|
\ '\bexport\(',
|
||||||
|
\ '\bfunc\s+',
|
||||||
|
\ '"res://[^"]*'
|
||||||
|
\ ]
|
||||||
|
\ })
|
||||||
|
endif
|
||||||
|
|
||||||
|
" SuperTab
|
||||||
|
let g:SuperTabDefaultCompletionType = "<c-x><c-o>"
|
||||||
|
|
||||||
|
" YouCompleteMe
|
||||||
|
if !exists('g:ycm_semantic_triggers')
|
||||||
|
let g:ycm_semantic_triggers = {}
|
||||||
|
endif
|
||||||
|
let g:ycm_semantic_triggers.gdscript3 = [
|
||||||
|
\'re!\w+',
|
||||||
|
\'.',
|
||||||
|
\'re!\bextends\s+',
|
||||||
|
\'re!\bexport\(',
|
||||||
|
\'re!\bfunc\s+',
|
||||||
|
\'re!"res://[^"]*'
|
||||||
|
\]
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
" Configure echodoc
|
||||||
|
if &rtp =~ 'echodoc'
|
||||||
|
let s:echodoc_dict = { "name": "gdscript3", "rank": 9 }
|
||||||
|
fun! s:echodoc_dict.search(text)
|
||||||
|
execute s:py_cmd . " echodoc_search()"
|
||||||
|
if exists("echodoc_search_result")
|
||||||
|
return echodoc_search_result
|
||||||
|
else
|
||||||
|
return []
|
||||||
|
endif
|
||||||
|
endfun
|
||||||
|
call echodoc#register('gdscript3', s:echodoc_dict)
|
||||||
|
|
||||||
|
" Reset echodoc cache when exiting insert mode.
|
||||||
|
" This fixes an issue where the function signature wouldn't re-appear
|
||||||
|
" after exiting and re-entering insert mode.
|
||||||
|
au InsertLeave * let b:prev_echodoc = []
|
||||||
|
endif
|
||||||
|
|
||||||
|
" Configure Syntastic checker
|
||||||
|
let g:syntastic_gdscript3_checkers = ['godot_server']
|
||||||
|
|
||||||
|
endif
|
||||||
@@ -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>
|
||||||
|
|
||||||
|
|||||||
5
ftplugin/gsl.vim
Normal file
5
ftplugin/gsl.vim
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'gdscript') == -1
|
||||||
|
|
||||||
|
setlocal commentstring=//\ %s
|
||||||
|
|
||||||
|
endif
|
||||||
@@ -31,13 +31,15 @@ let b:undo_ftplugin = "setlocal include< suffixesadd< comments< commentstring<"
|
|||||||
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 +76,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"
|
||||||
|
|||||||
@@ -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
|
|
||||||
@@ -54,7 +54,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
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -55,8 +55,6 @@ endfunction
|
|||||||
|
|
||||||
vnoremap <buffer> K :call <SID>Racket_visual_doc()<cr>
|
vnoremap <buffer> K :call <SID>Racket_visual_doc()<cr>
|
||||||
|
|
||||||
nnoremap <buffer> <f9> :!racket -t %<cr>
|
|
||||||
|
|
||||||
"setl commentstring=;;%s
|
"setl commentstring=;;%s
|
||||||
setl commentstring=#\|\ %s\ \|#
|
setl commentstring=#\|\ %s\ \|#
|
||||||
|
|
||||||
|
|||||||
147
ftplugin/raku.vim
Normal file
147
ftplugin/raku.vim
Normal file
@@ -0,0 +1,147 @@
|
|||||||
|
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'raku') == -1
|
||||||
|
|
||||||
|
" Vim filetype plugin file
|
||||||
|
" Language: Raku
|
||||||
|
" Maintainer: vim-perl <vim-perl@googlegroups.com>
|
||||||
|
" Homepage: https://github.com/vim-perl/vim-perl6
|
||||||
|
" Bugs/requests: https://github.com/vim-perl/vim-perl6/issues
|
||||||
|
" Last Change: {{LAST_CHANGE}}
|
||||||
|
" Contributors: Hinrik Örn Sigurðsson <hinrik.sig@gmail.com>
|
||||||
|
"
|
||||||
|
" Based on ftplugin/perl.vim by Dan Sharp <dwsharp at hotmail dot com>
|
||||||
|
|
||||||
|
if exists("b:did_ftplugin") | finish | endif
|
||||||
|
let b:did_ftplugin = 1
|
||||||
|
|
||||||
|
" Make sure the continuation lines below do not cause problems in
|
||||||
|
" compatibility mode.
|
||||||
|
let s:save_cpo = &cpo
|
||||||
|
set cpo-=C
|
||||||
|
|
||||||
|
setlocal formatoptions-=t
|
||||||
|
setlocal formatoptions+=crqol
|
||||||
|
setlocal keywordprg=p6doc
|
||||||
|
|
||||||
|
setlocal comments=:#\|,:#=,:#
|
||||||
|
setlocal commentstring=#%s
|
||||||
|
|
||||||
|
" Provided by Ned Konz <ned at bike-nomad dot com>
|
||||||
|
"---------------------------------------------
|
||||||
|
setlocal include=\\<\\(use\\\|require\\)\\>
|
||||||
|
setlocal includeexpr=substitute(v:fname,'::','/','g')
|
||||||
|
setlocal suffixesadd=.pm6,.pm,.raku,.rakutest,.t6
|
||||||
|
setlocal define=[^A-Za-z_]
|
||||||
|
|
||||||
|
" The following line changes a global variable but is necessary to make
|
||||||
|
" gf and similar commands work. Thanks to Andrew Pimlott for pointing out
|
||||||
|
" the problem. If this causes a " problem for you, add an
|
||||||
|
" after/ftplugin/raku.vim file that contains
|
||||||
|
" set isfname-=:
|
||||||
|
set isfname+=:
|
||||||
|
setlocal iskeyword=@,48-57,_,192-255,-
|
||||||
|
|
||||||
|
" Set this once, globally.
|
||||||
|
if !exists("perlpath")
|
||||||
|
if executable("perl6")
|
||||||
|
try
|
||||||
|
if &shellxquote != '"'
|
||||||
|
let perlpath = system('perl6 -e "@*INC.join(q/,/).say"')
|
||||||
|
else
|
||||||
|
let perlpath = system("perl6 -e '@*INC.join(q/,/).say'")
|
||||||
|
endif
|
||||||
|
let perlpath = substitute(perlpath,',.$',',,','')
|
||||||
|
catch /E145:/
|
||||||
|
let perlpath = ".,,"
|
||||||
|
endtry
|
||||||
|
else
|
||||||
|
" If we can't call perl to get its path, just default to using the
|
||||||
|
" current directory and the directory of the current file.
|
||||||
|
let perlpath = ".,,"
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
" Append perlpath to the existing path value, if it is set. Since we don't
|
||||||
|
" use += to do it because of the commas in perlpath, we have to handle the
|
||||||
|
" global / local settings, too.
|
||||||
|
if &l:path == ""
|
||||||
|
if &g:path == ""
|
||||||
|
let &l:path=perlpath
|
||||||
|
else
|
||||||
|
let &l:path=&g:path.",".perlpath
|
||||||
|
endif
|
||||||
|
else
|
||||||
|
let &l:path=&l:path.",".perlpath
|
||||||
|
endif
|
||||||
|
"---------------------------------------------
|
||||||
|
|
||||||
|
" Convert ascii-based ops into their single-character unicode equivalent
|
||||||
|
if get(g:, 'raku_unicode_abbrevs', 0)
|
||||||
|
iabbrev <buffer> !(<) ⊄
|
||||||
|
iabbrev <buffer> !(<=) ⊈
|
||||||
|
iabbrev <buffer> !(>) ⊅
|
||||||
|
iabbrev <buffer> !(>=) ⊉
|
||||||
|
iabbrev <buffer> !(cont) ∌
|
||||||
|
iabbrev <buffer> !(elem) ∉
|
||||||
|
iabbrev <buffer> != ≠
|
||||||
|
iabbrev <buffer> (&) ∩
|
||||||
|
iabbrev <buffer> (+) ⊎
|
||||||
|
iabbrev <buffer> (-) ∖
|
||||||
|
iabbrev <buffer> (.) ⊍
|
||||||
|
iabbrev <buffer> (<) ⊂
|
||||||
|
iabbrev <buffer> (<+) ≼
|
||||||
|
iabbrev <buffer> (<=) ⊆
|
||||||
|
iabbrev <buffer> (>) ⊃
|
||||||
|
iabbrev <buffer> (>+) ≽
|
||||||
|
iabbrev <buffer> (>=) ⊇
|
||||||
|
iabbrev <buffer> (\|) ∪
|
||||||
|
iabbrev <buffer> (^) ⊖
|
||||||
|
iabbrev <buffer> (atomic) ⚛
|
||||||
|
iabbrev <buffer> (cont) ∋
|
||||||
|
iabbrev <buffer> (elem) ∈
|
||||||
|
iabbrev <buffer> * ×
|
||||||
|
iabbrev <buffer> **0 ⁰
|
||||||
|
iabbrev <buffer> **1 ¹
|
||||||
|
iabbrev <buffer> **2 ²
|
||||||
|
iabbrev <buffer> **3 ³
|
||||||
|
iabbrev <buffer> **4 ⁴
|
||||||
|
iabbrev <buffer> **5 ⁵
|
||||||
|
iabbrev <buffer> **6 ⁶
|
||||||
|
iabbrev <buffer> **7 ⁷
|
||||||
|
iabbrev <buffer> **8 ⁸
|
||||||
|
iabbrev <buffer> **9 ⁹
|
||||||
|
iabbrev <buffer> ... …
|
||||||
|
iabbrev <buffer> / ÷
|
||||||
|
iabbrev <buffer> << «
|
||||||
|
iabbrev <buffer> <<[=]<< «=«
|
||||||
|
iabbrev <buffer> <<[=]>> «=»
|
||||||
|
iabbrev <buffer> <= ≤
|
||||||
|
iabbrev <buffer> =~= ≅
|
||||||
|
iabbrev <buffer> >= ≥
|
||||||
|
iabbrev <buffer> >> »
|
||||||
|
iabbrev <buffer> >>[=]<< »=«
|
||||||
|
iabbrev <buffer> >>[=]>> »=»
|
||||||
|
iabbrev <buffer> Inf ∞
|
||||||
|
iabbrev <buffer> atomic-add-fetch ⚛+=
|
||||||
|
iabbrev <buffer> atomic-assign ⚛=
|
||||||
|
iabbrev <buffer> atomic-fetch ⚛
|
||||||
|
iabbrev <buffer> atomic-dec-fetch --⚛
|
||||||
|
iabbrev <buffer> atomic-fetch-dec ⚛--
|
||||||
|
iabbrev <buffer> atomic-fetch-inc ⚛++
|
||||||
|
iabbrev <buffer> atomic-inc-fetch ++⚛
|
||||||
|
iabbrev <buffer> atomic-sub-fetch ⚛−=
|
||||||
|
iabbrev <buffer> e 𝑒
|
||||||
|
iabbrev <buffer> o ∘
|
||||||
|
iabbrev <buffer> pi π
|
||||||
|
iabbrev <buffer> set() ∅
|
||||||
|
iabbrev <buffer> tau τ
|
||||||
|
endif
|
||||||
|
|
||||||
|
" Undo the stuff we changed.
|
||||||
|
let b:undo_ftplugin = "setlocal fo< com< cms< inc< inex< def< isf< isk< kp< path<" .
|
||||||
|
\ " | unlet! b:browsefilter"
|
||||||
|
|
||||||
|
" Restore the saved compatibility options.
|
||||||
|
let &cpo = s:save_cpo
|
||||||
|
unlet s:save_cpo
|
||||||
|
|
||||||
|
endif
|
||||||
10
ftplugin/razor.vim
Normal file
10
ftplugin/razor.vim
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'razor') == -1
|
||||||
|
|
||||||
|
if exists("b:did_ftplugin")
|
||||||
|
finish
|
||||||
|
endif
|
||||||
|
let b:did_ftplugin = 1
|
||||||
|
|
||||||
|
" vim:set sw=2:
|
||||||
|
|
||||||
|
endif
|
||||||
@@ -5,7 +5,7 @@ if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'rst') == -1
|
|||||||
" Maintainer: Marshall Ward <marshall.ward@gmail.com>
|
" Maintainer: Marshall Ward <marshall.ward@gmail.com>
|
||||||
" Original Maintainer: Nikolai Weibull <now@bitwi.se>
|
" Original Maintainer: Nikolai Weibull <now@bitwi.se>
|
||||||
" Website: https://github.com/marshallward/vim-restructuredtext
|
" Website: https://github.com/marshallward/vim-restructuredtext
|
||||||
" Latest Revision: 2018-12-29
|
" Latest Revision: 2020-03-31
|
||||||
|
|
||||||
if exists("b:did_ftplugin")
|
if exists("b:did_ftplugin")
|
||||||
finish
|
finish
|
||||||
|
|||||||
@@ -113,7 +113,7 @@ else
|
|||||||
if !exists('g:ruby_default_path')
|
if !exists('g:ruby_default_path')
|
||||||
if has("ruby") && has("win32")
|
if has("ruby") && has("win32")
|
||||||
ruby ::VIM::command( 'let g:ruby_default_path = split("%s",",")' % $:.join(%q{,}) )
|
ruby ::VIM::command( 'let g:ruby_default_path = split("%s",",")' % $:.join(%q{,}) )
|
||||||
elseif executable('ruby')
|
elseif executable('ruby') && !empty($HOME)
|
||||||
let g:ruby_default_path = s:query_path($HOME)
|
let g:ruby_default_path = s:query_path($HOME)
|
||||||
else
|
else
|
||||||
let g:ruby_default_path = map(split($RUBYLIB,':'), 'v:val ==# "." ? "" : v:val')
|
let g:ruby_default_path = map(split($RUBYLIB,':'), 'v:val ==# "." ? "" : v:val')
|
||||||
|
|||||||
@@ -123,7 +123,7 @@ command! -nargs=* -buffer RustEmitAsm call rust#Emit("asm", <q-args>)
|
|||||||
command! -range=% RustPlay :call rust#Play(<count>, <line1>, <line2>, <f-args>)
|
command! -range=% RustPlay :call rust#Play(<count>, <line1>, <line2>, <f-args>)
|
||||||
|
|
||||||
" See |:RustFmt| for docs
|
" See |:RustFmt| for docs
|
||||||
command! -buffer RustFmt call rustfmt#Format()
|
command! -bar -buffer RustFmt call rustfmt#Format()
|
||||||
|
|
||||||
" See |:RustFmtRange| for docs
|
" See |:RustFmtRange| for docs
|
||||||
command! -range -buffer RustFmtRange call rustfmt#FormatRange(<line1>, <line2>)
|
command! -range -buffer RustFmtRange call rustfmt#FormatRange(<line1>, <line2>)
|
||||||
|
|||||||
47
ftplugin/svelte.vim
Normal file
47
ftplugin/svelte.vim
Normal file
@@ -0,0 +1,47 @@
|
|||||||
|
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'svelte') == -1
|
||||||
|
|
||||||
|
" Vim filetype plugin
|
||||||
|
" Language: Svelte 3 (HTML/JavaScript)
|
||||||
|
" Author: Evan Lecklider <evan@lecklider.com>
|
||||||
|
" Maintainer: Evan Lecklide <evan@lecklider.com>
|
||||||
|
" URL: https://github.com/evanleck/vim-svelte
|
||||||
|
if (exists('b:did_ftplugin'))
|
||||||
|
finish
|
||||||
|
endif
|
||||||
|
let b:did_ftplugin = 1
|
||||||
|
|
||||||
|
" Matchit support
|
||||||
|
if exists('loaded_matchit') && !exists('b:match_words')
|
||||||
|
let b:match_ignorecase = 0
|
||||||
|
|
||||||
|
" In order:
|
||||||
|
"
|
||||||
|
" 1. Svelte control flow keywords.
|
||||||
|
" 2. Parens.
|
||||||
|
" 3-5. HTML tags pulled from Vim itself.
|
||||||
|
"
|
||||||
|
" https://github.com/vim/vim/blob/5259275347667a90fb88d8ea74331f88ad68edfc/runtime/ftplugin/html.vim#L29-L35
|
||||||
|
let b:match_words =
|
||||||
|
\ '#\%(if\|await\|each\)\>:\:\%(else\|catch\|then\)\>:\/\%(if\|await\|each\)\>,' .
|
||||||
|
\ '{:},' .
|
||||||
|
\ '<\@<=[ou]l\>[^>]*\%(>\|$\):<\@<=li\>:<\@<=/[ou]l>,' .
|
||||||
|
\ '<\@<=dl\>[^>]*\%(>\|$\):<\@<=d[td]\>:<\@<=/dl>,' .
|
||||||
|
\ '<\@<=\([^/][^ \t>]*\)[^>]*\%(>\|$\):<\@<=/\1>'
|
||||||
|
endif
|
||||||
|
|
||||||
|
" ALE fixing and linting.
|
||||||
|
if exists('g:loaded_ale')
|
||||||
|
if !exists('b:ale_fixers')
|
||||||
|
let b:ale_fixers = ['eslint', 'prettier', 'prettier_standard']
|
||||||
|
endif
|
||||||
|
|
||||||
|
if !exists('b:ale_linter_aliases')
|
||||||
|
let b:ale_linter_aliases = ['css', 'javascript']
|
||||||
|
endif
|
||||||
|
|
||||||
|
if !exists('b:ale_linters')
|
||||||
|
let b:ale_linters = ['stylelint', 'eslint']
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
endif
|
||||||
@@ -1,37 +0,0 @@
|
|||||||
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'latex') == -1
|
|
||||||
|
|
||||||
" LaTeX Box plugin for Vim
|
|
||||||
" Maintainer: David Munger
|
|
||||||
" Email: mungerd@gmail.com
|
|
||||||
" Version: 0.9.6
|
|
||||||
|
|
||||||
if exists('*fnameescape')
|
|
||||||
function! s:FNameEscape(s)
|
|
||||||
return fnameescape(a:s)
|
|
||||||
endfunction
|
|
||||||
else
|
|
||||||
function! s:FNameEscape(s)
|
|
||||||
return a:s
|
|
||||||
endfunction
|
|
||||||
endif
|
|
||||||
|
|
||||||
if !exists('b:LatexBox_loaded')
|
|
||||||
|
|
||||||
let prefix = expand('<sfile>:p:h') . '/latex-box/'
|
|
||||||
|
|
||||||
execute 'source ' . s:FNameEscape(prefix . 'common.vim')
|
|
||||||
execute 'source ' . s:FNameEscape(prefix . 'complete.vim')
|
|
||||||
execute 'source ' . s:FNameEscape(prefix . 'motion.vim')
|
|
||||||
execute 'source ' . s:FNameEscape(prefix . 'latexmk.vim')
|
|
||||||
execute 'source ' . s:FNameEscape(prefix . 'folding.vim')
|
|
||||||
" added by AH to add main.tex file finder
|
|
||||||
execute 'source ' . s:FNameEscape(prefix . 'findmain.vim')
|
|
||||||
execute 'source ' . s:FNameEscape(prefix . 'mappings.vim')
|
|
||||||
|
|
||||||
let b:LatexBox_loaded = 1
|
|
||||||
|
|
||||||
endif
|
|
||||||
|
|
||||||
" vim:fdm=marker:ff=unix:noet:ts=4:sw=4
|
|
||||||
|
|
||||||
endif
|
|
||||||
@@ -10,6 +10,10 @@ if exists("loaded_matchit") && !exists('b:tsx_match_words')
|
|||||||
\ : b:tsx_match_words
|
\ : b:tsx_match_words
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
" Comment formatting
|
||||||
|
setlocal comments=s1:/*,mb:*,ex:*/,://
|
||||||
|
setlocal formatoptions-=t formatoptions+=croql
|
||||||
|
|
||||||
set suffixesadd+=.tsx
|
set suffixesadd+=.tsx
|
||||||
|
|
||||||
endif
|
endif
|
||||||
|
|||||||
@@ -5,8 +5,23 @@ if exists('b:did_ftplugin')
|
|||||||
endif
|
endif
|
||||||
let b:did_ftplugin = 1
|
let b:did_ftplugin = 1
|
||||||
|
|
||||||
|
" Set 'formatoptions' to break comment lines but not other lines,
|
||||||
|
" and insert the comment leader when hitting <CR> or using "o".
|
||||||
|
setlocal formatoptions=t formatoptions+=croql
|
||||||
|
" j was only added in 7.3.541, so stop complaints about its nonexistence
|
||||||
|
" Where it makes sense, remove a comment leader when joining lines.
|
||||||
|
silent! setlocal formatoptions+=j
|
||||||
|
|
||||||
setlocal efm=%f:%l.%c-%[%^:]%#:\ %t%[%^:]%#:\ %m
|
setlocal efm=%f:%l.%c-%[%^:]%#:\ %t%[%^:]%#:\ %m
|
||||||
|
|
||||||
|
setlocal comments=sO:*\ -,mO:*\ \ ,exO:*/,s1:/*,mb:*,ex:*/,:O//
|
||||||
|
setlocal commentstring=//%s
|
||||||
|
|
||||||
|
" When the matchit plugin is loaded, this makes the % command skip parens and
|
||||||
|
" braces in comments.
|
||||||
|
let b:match_words = '^\s*#\s*if\(\|def\|ndef\)\>:^\s*#\s*elif\>:^\s*#\s*else\>:^\s*#\s*endif\>'
|
||||||
|
let b:match_skip = 's:comment\|string\|character\|special'
|
||||||
|
|
||||||
" Insert a CCode attribute for the symbol below the cursor
|
" Insert a CCode attribute for the symbol below the cursor
|
||||||
" https://wiki.gnome.org/Projects/Vala/LegacyBindings
|
" https://wiki.gnome.org/Projects/Vala/LegacyBindings
|
||||||
function! CCode() abort
|
function! CCode() abort
|
||||||
@@ -22,8 +37,15 @@ endfunction
|
|||||||
command! -buffer -bar CCode call CCode()
|
command! -buffer -bar CCode call CCode()
|
||||||
command! -buffer -bar ValaCodingStyle call ValaCodingStyle()
|
command! -buffer -bar ValaCodingStyle call ValaCodingStyle()
|
||||||
|
|
||||||
if get(g:, 'vala_syntax_folding_enabled', 1)
|
if get(g:, 'vala_syntax_folding_enabled', 0)
|
||||||
setlocal foldmethod=syntax
|
setlocal foldmethod=syntax
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
" filter files in the browse dialog
|
||||||
|
if (has("browsefilter")) && !exists("b:browsefilter")
|
||||||
|
let b:browsefilter = "Vala Source Files (*.vala)\t*.vala\n" .
|
||||||
|
\ "Vala Vapi Files (*.vapi)\t*.vapi\n" .
|
||||||
|
\ "All Files (*.*)\t*.*\n"
|
||||||
|
endif
|
||||||
|
|
||||||
endif
|
endif
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ setlocal tabstop=4
|
|||||||
setlocal shiftwidth=4
|
setlocal shiftwidth=4
|
||||||
|
|
||||||
setlocal suffixesadd=.zig
|
setlocal suffixesadd=.zig
|
||||||
|
setlocal suffixesadd=.zir
|
||||||
setlocal commentstring=//\ %s
|
setlocal commentstring=//\ %s
|
||||||
setlocal makeprg=zig\ build
|
setlocal makeprg=zig\ build
|
||||||
|
|
||||||
|
|||||||
@@ -6,430 +6,78 @@ if exists('b:did_indent')
|
|||||||
endif
|
endif
|
||||||
let b:did_indent = 1
|
let b:did_indent = 1
|
||||||
|
|
||||||
if !exists('g:crystal_indent_access_modifier_style')
|
|
||||||
" Possible values: "normal", "indent", "outdent"
|
|
||||||
let g:crystal_indent_access_modifier_style = 'normal'
|
|
||||||
endif
|
|
||||||
|
|
||||||
setlocal nosmartindent
|
setlocal nosmartindent
|
||||||
|
|
||||||
" Now, set up our indentation expression and keys that trigger it.
|
" Now, set up our indentation expression and keys that trigger it.
|
||||||
setlocal indentexpr=GetCrystalIndent(v:lnum)
|
setlocal indentexpr=GetCrystalIndent(v:lnum)
|
||||||
setlocal indentkeys=0{,0},0),0],!^F,o,O,e,:,.
|
setlocal indentkeys=0{,0},0),0],!^F,o,O,e,:,.
|
||||||
setlocal indentkeys+==end,=else,=elsif,=when,=ensure,=rescue,==begin,==end
|
setlocal indentkeys+==end,=else,=elsif,=when,=ensure,=rescue
|
||||||
setlocal indentkeys+==private,=protected,=public
|
setlocal indentkeys+==private,=protected
|
||||||
|
|
||||||
|
let s:cpo_save = &cpo
|
||||||
|
set cpo&vim
|
||||||
|
|
||||||
" Only define the function once.
|
" Only define the function once.
|
||||||
if exists('*GetCrystalIndent')
|
if exists('*GetCrystalIndent')
|
||||||
finish
|
finish
|
||||||
endif
|
endif
|
||||||
|
|
||||||
let s:cpo_save = &cpo
|
" Return the value of a single shift-width
|
||||||
set cpo&vim
|
if exists('*shiftwidth')
|
||||||
|
let s:sw = function('shiftwidth')
|
||||||
|
else
|
||||||
|
function s:sw()
|
||||||
|
return &shiftwidth
|
||||||
|
endfunction
|
||||||
|
endif
|
||||||
|
|
||||||
" 1. Variables {{{1
|
" GetCrystalIndent Function {{{1
|
||||||
" ============
|
|
||||||
|
|
||||||
" Regex of syntax group names that are or delimit strings/symbols or are comments.
|
|
||||||
let s:syng_strcom = '\<crystal\%(Regexp\|RegexpDelimiter\|RegexpEscape' .
|
|
||||||
\ '\|Symbol\|String\|StringDelimiter\|StringEscape\|ASCIICode' .
|
|
||||||
\ '\|Interpolation\|InterpolationDelimiter\|NoInterpolation\|Comment\|Documentation\)\>'
|
|
||||||
|
|
||||||
" Regex of syntax group names that are strings.
|
|
||||||
let s:syng_string =
|
|
||||||
\ '\<crystal\%(String\|Interpolation\|NoInterpolation\|StringEscape\)\>'
|
|
||||||
|
|
||||||
" Regex of syntax group names that are strings or documentation.
|
|
||||||
let s:syng_stringdoc =
|
|
||||||
\'\<crystal\%(String\|Interpolation\|NoInterpolation\|StringEscape\|Documentation\)\>'
|
|
||||||
|
|
||||||
" Expression used to check whether we should skip a match with searchpair().
|
|
||||||
let s:skip_expr =
|
|
||||||
\ "synIDattr(synID(line('.'),col('.'),1),'name') =~ '".s:syng_strcom."'"
|
|
||||||
|
|
||||||
" Regex used for words that, at the start of a line, add a level of indent.
|
|
||||||
let s:crystal_indent_keywords =
|
|
||||||
\ '^\s*\zs\<\%(module\|\%(private\s\+\)\=\%(abstract\s\+\)\=\%(class\|struct\)\|enum\|if' .
|
|
||||||
\ '\|for\|macro\|while\|until\|else\|elsif\|case\|when\|unless\|begin\|ensure\|rescue\|lib' .
|
|
||||||
\ '\|\%(protected\|private\)\=\s*def\):\@!\>' .
|
|
||||||
\ '\|\%([=,*/%+-]\|<<\|>>\|:\s\)\s*\zs' .
|
|
||||||
\ '\<\%(if\|for\|while\|until\|case\|unless\|begin\):\@!\>' .
|
|
||||||
\ '\|{%\s*\<\%(if\|for\|while\|until\|lib\|case\|unless\|begin\|else\|elsif\|when\)'
|
|
||||||
|
|
||||||
" Regex used for words that, at the start of a line, remove a level of indent.
|
|
||||||
let s:crystal_deindent_keywords =
|
|
||||||
\ '^\s*\zs\<\%(ensure\|else\|rescue\|elsif\|when\|end\):\@!\>' .
|
|
||||||
\ '\|{%\s*\<\%(ensure\|else\|rescue\|elsif\|when\|end\)\>'
|
|
||||||
|
|
||||||
" Regex that defines the start-match for the 'end' keyword.
|
|
||||||
" TODO: the do here should be restricted somewhat (only at end of line)?
|
|
||||||
let s:end_start_regex =
|
|
||||||
\ '{%\s*\<\%(if\|for\|while\|until\|unless\|begin\|lib\)\>\|' .
|
|
||||||
\ '\C\%(^\s*\|[=,*/%+\-|;{]\|<<\|>>\|:\s\)\s*\zs' .
|
|
||||||
\ '\<\%(module\|\%(private\s\+\)\=\%(abstract\s\+\)\=\%(class\|struct\)\|enum\|macro\|if\|for\|while\|until\|case\|unless\|begin\|lib' .
|
|
||||||
\ '\|\%(protected\|private\)\=\s*def\):\@!\>' .
|
|
||||||
\ '\|\%(^\|[^.:@$]\)\@<=\<do:\@!\>'
|
|
||||||
|
|
||||||
" Regex that defines the middle-match for the 'end' keyword.
|
|
||||||
let s:end_middle_regex =
|
|
||||||
\ '{%\s*\<\%(ensure\|else\|when\|elsif\)\>\s*%}\|' .
|
|
||||||
\ '\<\%(ensure\|else\|\%(\%(^\|;\)\s*\)\@<=\<rescue:\@!\>\|when\|elsif\):\@!\>'
|
|
||||||
|
|
||||||
" Regex that defines the end-match for the 'end' keyword.
|
|
||||||
let s:end_end_regex = '\%(^\|[^.:@$]\)\@<=\<end:\@!\>\|{%\s*\<\%(end\)\>'
|
|
||||||
|
|
||||||
" Expression used for searchpair() call for finding match for 'end' keyword.
|
|
||||||
let s:end_skip_expr = s:skip_expr .
|
|
||||||
\ ' || (expand("<cword>") == "do"' .
|
|
||||||
\ ' && getline(".") =~ "^\\s*\\<\\(while\\|until\\|for\\):\\@!\\>")'
|
|
||||||
|
|
||||||
" Regex that defines continuation lines, not including (, {, or [.
|
|
||||||
let s:non_bracket_continuation_regex = '\%([\\.,:*/%+]\|\<and\|\<or\|\%(<%\)\@<![=-]\|\W[|&?]\|||\|&&\)\s*\%(#.*\)\=$'
|
|
||||||
|
|
||||||
" Regex that defines continuation lines.
|
|
||||||
let s:continuation_regex =
|
|
||||||
\ '\%(%\@<![({[\\.,:*/%+]\|\<and\|\<or\|\%(<%\)\@<![=-]\|\W[|&?]\|||\|&&\)\s*\%(#.*\)\=$'
|
|
||||||
|
|
||||||
" Regex that defines continuable keywords
|
|
||||||
let s:continuable_regex =
|
|
||||||
\ '\C\%(^\s*\|[=,*/%+\-|;{]\|<<\|>>\|:\s\)\s*\zs' .
|
|
||||||
\ '\<\%(if\|for\|while\|until\|unless\):\@!\>'
|
|
||||||
|
|
||||||
" Regex that defines bracket continuations
|
|
||||||
let s:bracket_continuation_regex = '%\@<!\%([({[]\)\s*\%(#.*\)\=$'
|
|
||||||
|
|
||||||
" Regex that defines end of bracket continuation followed by another continuation
|
|
||||||
let s:bracket_switch_continuation_regex = '^\([^(]\+\zs).\+\)\+'.s:continuation_regex
|
|
||||||
|
|
||||||
" Regex that defines the first part of a splat pattern
|
|
||||||
let s:splat_regex = '[[,(]\s*\*\s*\%(#.*\)\=$'
|
|
||||||
|
|
||||||
" Regex that defines blocks.
|
|
||||||
"
|
|
||||||
" Note that there's a slight problem with this regex and s:continuation_regex.
|
|
||||||
" Code like this will be matched by both:
|
|
||||||
"
|
|
||||||
" method_call do |(a, b)|
|
|
||||||
"
|
|
||||||
" The reason is that the pipe matches a hanging "|" operator.
|
|
||||||
"
|
|
||||||
let s:block_regex =
|
|
||||||
\ '\%(\<do:\@!\>\|%\@<!{\)\s*\%(|\s*(*\s*\%([*@&]\=\h\w*,\=\s*\)\%(,\s*(*\s*[*@&]\=\h\w*\s*)*\s*\)*|\)\=\s*\%(#.*\)\=$'
|
|
||||||
|
|
||||||
let s:block_continuation_regex = '^\s*[^])}\t ].*'.s:block_regex
|
|
||||||
|
|
||||||
" Regex that describes a leading operator (only a method call's dot for now)
|
|
||||||
let s:leading_operator_regex = '^\s*[.]'
|
|
||||||
|
|
||||||
" Regex that describes all indent access modifiers
|
|
||||||
let s:access_modifier_regex = '\C^\s*\%(public\|protected\|private\)\s*\%(#.*\)\=$'
|
|
||||||
|
|
||||||
" 2. Auxiliary Functions {{{1
|
|
||||||
" ======================
|
|
||||||
|
|
||||||
" Check if the character at lnum:col is inside a string, comment, or is ascii.
|
|
||||||
function s:IsInStringOrComment(lnum, col)
|
|
||||||
return synIDattr(synID(a:lnum, a:col, 1), 'name') =~# s:syng_strcom
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" Check if the character at lnum:col is inside a string.
|
|
||||||
function s:IsInString(lnum, col)
|
|
||||||
return synIDattr(synID(a:lnum, a:col, 1), 'name') =~# s:syng_string
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" Check if the character at lnum:col is inside a string or documentation.
|
|
||||||
function s:IsInStringOrDocumentation(lnum, col)
|
|
||||||
return synIDattr(synID(a:lnum, a:col, 1), 'name') =~# s:syng_stringdoc
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" Check if the character at lnum:col is inside a string delimiter
|
|
||||||
function s:IsInStringDelimiter(lnum, col)
|
|
||||||
return synIDattr(synID(a:lnum, a:col, 1), 'name') ==# 'crystalStringDelimiter'
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" Find line above 'lnum' that isn't empty, in a comment, or in a string.
|
|
||||||
function s:PrevNonBlankNonString(lnum)
|
|
||||||
let in_block = 0
|
|
||||||
let lnum = prevnonblank(a:lnum)
|
|
||||||
while lnum > 0
|
|
||||||
" Go in and out of blocks comments as necessary.
|
|
||||||
" If the line isn't empty (with opt. comment) or in a string, end search.
|
|
||||||
let line = getline(lnum)
|
|
||||||
if line =~# '^=begin'
|
|
||||||
if in_block
|
|
||||||
let in_block = 0
|
|
||||||
else
|
|
||||||
break
|
|
||||||
endif
|
|
||||||
elseif !in_block && line =~# '^=end'
|
|
||||||
let in_block = 1
|
|
||||||
elseif !in_block && line !~# '^\s*#.*$' && !(s:IsInStringOrComment(lnum, 1)
|
|
||||||
\ && s:IsInStringOrComment(lnum, strlen(line)))
|
|
||||||
break
|
|
||||||
endif
|
|
||||||
let lnum = prevnonblank(lnum - 1)
|
|
||||||
endwhile
|
|
||||||
return lnum
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" Find line above 'lnum' that started the continuation 'lnum' may be part of.
|
|
||||||
function s:GetMSL(lnum)
|
|
||||||
" Start on the line we're at and use its indent.
|
|
||||||
let msl = a:lnum
|
|
||||||
let msl_body = getline(msl)
|
|
||||||
let lnum = s:PrevNonBlankNonString(a:lnum - 1)
|
|
||||||
while lnum > 0
|
|
||||||
" If we have a continuation line, or we're in a string, use line as MSL.
|
|
||||||
" Otherwise, terminate search as we have found our MSL already.
|
|
||||||
let line = getline(lnum)
|
|
||||||
|
|
||||||
if s:Match(msl, s:leading_operator_regex)
|
|
||||||
" If the current line starts with a leading operator, keep its indent
|
|
||||||
" and keep looking for an MSL.
|
|
||||||
let msl = lnum
|
|
||||||
elseif s:Match(lnum, s:splat_regex)
|
|
||||||
" If the above line looks like the "*" of a splat, use the current one's
|
|
||||||
" indentation.
|
|
||||||
"
|
|
||||||
" Example:
|
|
||||||
" Hash[*
|
|
||||||
" method_call do
|
|
||||||
" something
|
|
||||||
"
|
|
||||||
return msl
|
|
||||||
elseif s:Match(lnum, s:non_bracket_continuation_regex) &&
|
|
||||||
\ s:Match(msl, s:non_bracket_continuation_regex)
|
|
||||||
" If the current line is a non-bracket continuation and so is the
|
|
||||||
" previous one, keep its indent and continue looking for an MSL.
|
|
||||||
"
|
|
||||||
" Example:
|
|
||||||
" method_call one,
|
|
||||||
" two,
|
|
||||||
" three
|
|
||||||
"
|
|
||||||
let msl = lnum
|
|
||||||
elseif s:Match(lnum, s:non_bracket_continuation_regex) &&
|
|
||||||
\ (s:Match(msl, s:bracket_continuation_regex) || s:Match(msl, s:block_continuation_regex))
|
|
||||||
" If the current line is a bracket continuation or a block-starter, but
|
|
||||||
" the previous is a non-bracket one, respect the previous' indentation,
|
|
||||||
" and stop here.
|
|
||||||
"
|
|
||||||
" Example:
|
|
||||||
" method_call one,
|
|
||||||
" two {
|
|
||||||
" three
|
|
||||||
"
|
|
||||||
return lnum
|
|
||||||
elseif s:Match(lnum, s:bracket_continuation_regex) &&
|
|
||||||
\ (s:Match(msl, s:bracket_continuation_regex) || s:Match(msl, s:block_continuation_regex))
|
|
||||||
" If both lines are bracket continuations (the current may also be a
|
|
||||||
" block-starter), use the current one's and stop here
|
|
||||||
"
|
|
||||||
" Example:
|
|
||||||
" method_call(
|
|
||||||
" other_method_call(
|
|
||||||
" foo
|
|
||||||
return msl
|
|
||||||
elseif s:Match(lnum, s:block_regex) &&
|
|
||||||
\ !s:Match(msl, s:continuation_regex) &&
|
|
||||||
\ !s:Match(msl, s:block_continuation_regex)
|
|
||||||
" If the previous line is a block-starter and the current one is
|
|
||||||
" mostly ordinary, use the current one as the MSL.
|
|
||||||
"
|
|
||||||
" Example:
|
|
||||||
" method_call do
|
|
||||||
" something
|
|
||||||
" something_else
|
|
||||||
return msl
|
|
||||||
else
|
|
||||||
let col = match(line, s:continuation_regex) + 1
|
|
||||||
if (col > 0 && !s:IsInStringOrComment(lnum, col))
|
|
||||||
\ || s:IsInString(lnum, strlen(line))
|
|
||||||
let msl = lnum
|
|
||||||
else
|
|
||||||
break
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
|
|
||||||
let msl_body = getline(msl)
|
|
||||||
let lnum = s:PrevNonBlankNonString(lnum - 1)
|
|
||||||
endwhile
|
|
||||||
return msl
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" Check if line 'lnum' has more opening brackets than closing ones.
|
|
||||||
function s:ExtraBrackets(lnum)
|
|
||||||
let opening = {'parentheses': [], 'braces': [], 'brackets': []}
|
|
||||||
let closing = {'parentheses': [], 'braces': [], 'brackets': []}
|
|
||||||
|
|
||||||
let line = getline(a:lnum)
|
|
||||||
let pos = match(line, '[][(){}]', 0)
|
|
||||||
|
|
||||||
" Save any encountered opening brackets, and remove them once a matching
|
|
||||||
" closing one has been found. If a closing bracket shows up that doesn't
|
|
||||||
" close anything, save it for later.
|
|
||||||
while pos != -1
|
|
||||||
if !s:IsInStringOrComment(a:lnum, pos + 1)
|
|
||||||
if line[pos] ==# '('
|
|
||||||
call add(opening.parentheses, {'type': '(', 'pos': pos})
|
|
||||||
elseif line[pos] ==# ')'
|
|
||||||
if empty(opening.parentheses)
|
|
||||||
call add(closing.parentheses, {'type': ')', 'pos': pos})
|
|
||||||
else
|
|
||||||
let opening.parentheses = opening.parentheses[0:-2]
|
|
||||||
endif
|
|
||||||
elseif line[pos] ==# '{'
|
|
||||||
call add(opening.braces, {'type': '{', 'pos': pos})
|
|
||||||
elseif line[pos] ==# '}'
|
|
||||||
if empty(opening.braces)
|
|
||||||
call add(closing.braces, {'type': '}', 'pos': pos})
|
|
||||||
else
|
|
||||||
let opening.braces = opening.braces[0:-2]
|
|
||||||
endif
|
|
||||||
elseif line[pos] ==# '['
|
|
||||||
call add(opening.brackets, {'type': '[', 'pos': pos})
|
|
||||||
elseif line[pos] ==# ']'
|
|
||||||
if empty(opening.brackets)
|
|
||||||
call add(closing.brackets, {'type': ']', 'pos': pos})
|
|
||||||
else
|
|
||||||
let opening.brackets = opening.brackets[0:-2]
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
|
|
||||||
let pos = match(line, '[][(){}]', pos + 1)
|
|
||||||
endwhile
|
|
||||||
|
|
||||||
" Find the rightmost brackets, since they're the ones that are important in
|
|
||||||
" both opening and closing cases
|
|
||||||
let rightmost_opening = {'type': '(', 'pos': -1}
|
|
||||||
let rightmost_closing = {'type': ')', 'pos': -1}
|
|
||||||
|
|
||||||
for opening in opening.parentheses + opening.braces + opening.brackets
|
|
||||||
if opening.pos > rightmost_opening.pos
|
|
||||||
let rightmost_opening = opening
|
|
||||||
endif
|
|
||||||
endfor
|
|
||||||
|
|
||||||
for closing in closing.parentheses + closing.braces + closing.brackets
|
|
||||||
if closing.pos > rightmost_closing.pos
|
|
||||||
let rightmost_closing = closing
|
|
||||||
endif
|
|
||||||
endfor
|
|
||||||
|
|
||||||
return [rightmost_opening, rightmost_closing]
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
function s:Match(lnum, regex)
|
|
||||||
let line = getline(a:lnum)
|
|
||||||
let offset = match(line, '\C'.a:regex)
|
|
||||||
let col = offset + 1
|
|
||||||
|
|
||||||
while offset > -1 && s:IsInStringOrComment(a:lnum, col)
|
|
||||||
let offset = match(line, '\C'.a:regex, offset + 1)
|
|
||||||
let col = offset + 1
|
|
||||||
endwhile
|
|
||||||
|
|
||||||
if offset > -1
|
|
||||||
return col
|
|
||||||
else
|
|
||||||
return 0
|
|
||||||
endif
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" Locates the containing class/module's definition line, ignoring nested classes
|
|
||||||
" along the way.
|
|
||||||
"
|
|
||||||
function! s:FindContainingClass()
|
|
||||||
let saved_position = getpos('.')
|
|
||||||
|
|
||||||
while searchpair(s:end_start_regex, s:end_middle_regex, s:end_end_regex, 'bW',
|
|
||||||
\ s:end_skip_expr) > 0
|
|
||||||
if expand('<cword>') =~# '\<class\|module\>'
|
|
||||||
let found_lnum = line('.')
|
|
||||||
call setpos('.', saved_position)
|
|
||||||
return found_lnum
|
|
||||||
endif
|
|
||||||
endwhile
|
|
||||||
|
|
||||||
call setpos('.', saved_position)
|
|
||||||
return 0
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" 3. GetCrystalIndent Function {{{1
|
|
||||||
" =========================
|
" =========================
|
||||||
|
|
||||||
function GetCrystalIndent(...)
|
function GetCrystalIndent(...)
|
||||||
" 3.1. Setup {{{2
|
" Setup {{{2
|
||||||
" ----------
|
" -----
|
||||||
|
|
||||||
" The value of a single shift-width
|
|
||||||
if exists('*shiftwidth')
|
|
||||||
let sw = shiftwidth()
|
|
||||||
else
|
|
||||||
let sw = &sw
|
|
||||||
endif
|
|
||||||
|
|
||||||
" For the current line, use the first argument if given, else v:lnum
|
" For the current line, use the first argument if given, else v:lnum
|
||||||
let clnum = a:0 ? a:1 : v:lnum
|
let clnum = a:0 ? a:1 : v:lnum
|
||||||
|
|
||||||
" Set up variables for restoring position in file. Could use clnum here.
|
" Set up variables for restoring position in file
|
||||||
let vcol = col('.')
|
let vcol = col('.')
|
||||||
|
|
||||||
" 3.2. Work on the current line {{{2
|
" Work on the current line {{{2
|
||||||
" -----------------------------
|
" ------------------------
|
||||||
|
|
||||||
" Get the current line.
|
" Get the current line.
|
||||||
let line = getline(clnum)
|
let line = getline(clnum)
|
||||||
let ind = -1
|
let ind = -1
|
||||||
|
|
||||||
" If this line is an access modifier keyword, align according to the closest
|
|
||||||
" class declaration.
|
|
||||||
if g:crystal_indent_access_modifier_style ==? 'indent'
|
|
||||||
if s:Match(clnum, s:access_modifier_regex)
|
|
||||||
let class_line = s:FindContainingClass()
|
|
||||||
if class_line > 0
|
|
||||||
return indent(class_line) + sw
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
elseif g:crystal_indent_access_modifier_style ==? 'outdent'
|
|
||||||
if s:Match(clnum, s:access_modifier_regex)
|
|
||||||
let class_line = s:FindContainingClass()
|
|
||||||
if class_line > 0
|
|
||||||
return indent(class_line)
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
|
|
||||||
" If we got a closing bracket on an empty line, find its match and indent
|
" If we got a closing bracket on an empty line, find its match and indent
|
||||||
" according to it. For parentheses we indent to its column - 1, for the
|
" according to it. For parentheses we indent to its column - 1, for the
|
||||||
" others we indent to the containing line's MSL's level. Return -1 if fail.
|
" others we indent to the containing line's MSL's level. Return -1 if fail.
|
||||||
let col = matchend(line, '^\s*[]})]')
|
let col = matchend(line, '^\s*[]})]')
|
||||||
if col > 0 && !s:IsInStringOrComment(clnum, col)
|
if col > 0 && !crystal#indent#IsInStringOrComment(clnum, col)
|
||||||
call cursor(clnum, col)
|
call cursor(clnum, col)
|
||||||
let bs = strpart('(){}[]', stridx(')}]', line[col - 1]) * 2, 2)
|
let bs = strpart('(){}[]', stridx(')}]', line[col - 1]) * 2, 2)
|
||||||
if searchpair(escape(bs[0], '\['), '', bs[1], 'bW', s:skip_expr) > 0
|
if searchpair(escape(bs[0], '\['), '', bs[1], 'bW', g:crystal#indent#skip_expr)
|
||||||
if line[col-1] ==# ')' && col('.') != col('$') - 1
|
if line[col-1] ==# ')' && col('.') != col('$') - 1
|
||||||
let ind = virtcol('.') - 1
|
let ind = virtcol('.') - 1
|
||||||
else
|
else
|
||||||
let ind = indent(s:GetMSL(line('.')))
|
let ind = indent(crystal#indent#GetMSL(line('.')))
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
return ind
|
return ind
|
||||||
endif
|
endif
|
||||||
|
|
||||||
" If we have a =begin or =end set indent to first column.
|
|
||||||
if match(line, '^\s*\%(=begin\|=end\)$') != -1
|
|
||||||
return 0
|
|
||||||
endif
|
|
||||||
|
|
||||||
" If we have a deindenting keyword, find its match and indent to its level.
|
" If we have a deindenting keyword, find its match and indent to its level.
|
||||||
" TODO: this is messy
|
" TODO: this is messy
|
||||||
if s:Match(clnum, s:crystal_deindent_keywords)
|
if crystal#indent#Match(clnum, g:crystal#indent#crystal_deindent_keywords)
|
||||||
call cursor(clnum, 1)
|
call cursor(clnum, 1)
|
||||||
if searchpair(s:end_start_regex, s:end_middle_regex, s:end_end_regex, 'bW',
|
if searchpair(
|
||||||
\ s:end_skip_expr) > 0
|
\ g:crystal#indent#end_start_regex,
|
||||||
let msl = s:GetMSL(line('.'))
|
\ g:crystal#indent#end_middle_regex,
|
||||||
|
\ g:crystal#indent#end_end_regex,
|
||||||
|
\ 'bW', g:crystal#indent#skip_expr)
|
||||||
|
let msl = crystal#indent#GetMSL(line('.'))
|
||||||
let line = getline(line('.'))
|
let line = getline(line('.'))
|
||||||
|
|
||||||
if strpart(line, 0, col('.') - 1) =~# '=\s*$' &&
|
if strpart(line, 0, col('.') - 1) =~# '=\s*$' &&
|
||||||
@@ -448,29 +96,29 @@ function GetCrystalIndent(...)
|
|||||||
return ind
|
return ind
|
||||||
endif
|
endif
|
||||||
|
|
||||||
" If we are in a multi-line string or line-comment, don't do anything to it.
|
" If we are in a multi-line string, don't do anything to it.
|
||||||
if s:IsInStringOrDocumentation(clnum, matchend(line, '^\s*') + 1)
|
if crystal#indent#IsInString(clnum, matchend(line, '^\s*') + 1)
|
||||||
return indent('.')
|
return indent('.')
|
||||||
endif
|
endif
|
||||||
|
|
||||||
" If we are at the closing delimiter of a "<<" heredoc-style string, set the
|
" If we are at the closing delimiter of a "<<" heredoc-style string, set the
|
||||||
" indent to 0.
|
" indent to 0.
|
||||||
if line =~# '^\k\+\s*$'
|
if line =~# '^\k\+\s*$'
|
||||||
\ && s:IsInStringDelimiter(clnum, 1)
|
\ && crystal#indent#IsInStringDelimiter(clnum, 1)
|
||||||
\ && search('\V<<'.line, 'nbW') > 0
|
\ && search('\V<<'.line, 'nbW')
|
||||||
return 0
|
return 0
|
||||||
endif
|
endif
|
||||||
|
|
||||||
" If the current line starts with a leading operator, add a level of indent.
|
" If the current line starts with a leading operator, add a level of indent.
|
||||||
if s:Match(clnum, s:leading_operator_regex)
|
if crystal#indent#Match(clnum, g:crystal#indent#leading_operator_regex)
|
||||||
return indent(s:GetMSL(clnum)) + sw
|
return indent(crystal#indent#GetMSL(clnum)) + s:sw()
|
||||||
endif
|
endif
|
||||||
|
|
||||||
" 3.3. Work on the previous line. {{{2
|
" Work on the previous line. {{{2
|
||||||
" -------------------------------
|
" --------------------------
|
||||||
|
|
||||||
" Find a non-blank, non-multi-line string line above the current line.
|
" Find a non-blank, non-multi-line string line above the current line.
|
||||||
let lnum = s:PrevNonBlankNonString(clnum - 1)
|
let lnum = crystal#indent#PrevNonBlankNonString(clnum - 1)
|
||||||
|
|
||||||
" If the line is empty and inside a string, use the previous line.
|
" If the line is empty and inside a string, use the previous line.
|
||||||
if line =~# '^\s*$' && lnum != prevnonblank(clnum - 1)
|
if line =~# '^\s*$' && lnum != prevnonblank(clnum - 1)
|
||||||
@@ -486,33 +134,34 @@ function GetCrystalIndent(...)
|
|||||||
let line = getline(lnum)
|
let line = getline(lnum)
|
||||||
let ind = indent(lnum)
|
let ind = indent(lnum)
|
||||||
|
|
||||||
if s:Match(lnum, s:continuable_regex) && s:Match(lnum, s:continuation_regex)
|
if crystal#indent#Match(lnum, g:crystal#indent#continuable_regex) &&
|
||||||
return indent(s:GetMSL(lnum)) + sw + sw
|
\ crystal#indent#Match(lnum, g:crystal#indent#continuation_regex)
|
||||||
|
return indent(crystal#indent#GetMSL(lnum)) + s:sw() * 2
|
||||||
endif
|
endif
|
||||||
|
|
||||||
" If the previous line ended with a block opening, add a level of indent.
|
" If the previous line ended with a block opening, add a level of indent.
|
||||||
if s:Match(lnum, s:block_regex)
|
if crystal#indent#Match(lnum, g:crystal#indent#block_regex)
|
||||||
let msl = s:GetMSL(lnum)
|
let msl = crystal#indent#GetMSL(lnum)
|
||||||
|
|
||||||
if getline(msl) =~# '=\s*\(#.*\)\=$'
|
if getline(msl) =~# '=\s*\(#.*\)\=$'
|
||||||
" in the case of assignment to the msl, align to the starting line,
|
" in the case of assignment to the msl, align to the starting line,
|
||||||
" not to the msl
|
" not to the msl
|
||||||
let ind = indent(lnum) + sw
|
let ind = indent(lnum) + s:sw()
|
||||||
else
|
else
|
||||||
let ind = indent(msl) + sw
|
let ind = indent(msl) + s:sw()
|
||||||
endif
|
endif
|
||||||
return ind
|
return ind
|
||||||
endif
|
endif
|
||||||
|
|
||||||
" If the previous line started with a leading operator, use its MSL's level
|
" If the previous line started with a leading operator, use its MSL's level
|
||||||
" of indent
|
" of indent
|
||||||
if s:Match(lnum, s:leading_operator_regex)
|
if crystal#indent#Match(lnum, g:crystal#indent#leading_operator_regex)
|
||||||
return indent(s:GetMSL(lnum))
|
return indent(crystal#indent#GetMSL(lnum))
|
||||||
endif
|
endif
|
||||||
|
|
||||||
" If the previous line ended with the "*" of a splat, add a level of indent
|
" If the previous line ended with the "*" of a splat, add a level of indent
|
||||||
if line =~ s:splat_regex
|
if line =~ g:crystal#indent#splat_regex
|
||||||
return indent(lnum) + sw
|
return indent(lnum) + s:sw()
|
||||||
endif
|
endif
|
||||||
|
|
||||||
" If the previous line contained unclosed opening brackets and we are still
|
" If the previous line contained unclosed opening brackets and we are still
|
||||||
@@ -521,26 +170,26 @@ function GetCrystalIndent(...)
|
|||||||
"
|
"
|
||||||
" If it contained hanging closing brackets, find the rightmost one, find its
|
" If it contained hanging closing brackets, find the rightmost one, find its
|
||||||
" match and indent according to that.
|
" match and indent according to that.
|
||||||
if line =~# '[[({]' || line =~# '[])}]\s*\%(#.*\)\=$'
|
if line =~# '[[({]' || line =~# '[])]\s*\%(#.*\)\=$'
|
||||||
let [opening, closing] = s:ExtraBrackets(lnum)
|
let [opening, closing] = crystal#indent#ExtraBrackets(lnum)
|
||||||
|
|
||||||
if opening.pos != -1
|
if opening.pos != -1
|
||||||
if opening.type ==# '(' && searchpair('(', '', ')', 'bW', s:skip_expr) > 0
|
if opening.type ==# '(' && searchpair('(', '', ')', 'bW', g:crystal#indent#skip_expr)
|
||||||
if col('.') + 1 == col('$')
|
if col('.') + 1 == col('$')
|
||||||
return ind + sw
|
return ind + s:sw()
|
||||||
else
|
else
|
||||||
return virtcol('.')
|
return virtcol('.')
|
||||||
endif
|
endif
|
||||||
else
|
else
|
||||||
let nonspace = matchend(line, '\S', opening.pos + 1) - 1
|
let nonspace = matchend(line, '\S', opening.pos + 1) - 1
|
||||||
return nonspace > 0 ? nonspace : ind + sw
|
return nonspace > 0 ? nonspace : ind + s:sw()
|
||||||
endif
|
endif
|
||||||
elseif closing.pos != -1
|
elseif closing.pos != -1
|
||||||
call cursor(lnum, closing.pos + 1)
|
call cursor(lnum, closing.pos + 1)
|
||||||
normal! %
|
keepjumps normal! %
|
||||||
|
|
||||||
if s:Match(line('.'), s:crystal_indent_keywords)
|
if crystal#indent#Match(line('.'), g:crystal#indent#crystal_indent_keywords)
|
||||||
return indent('.') + sw
|
return indent('.') + s:sw()
|
||||||
else
|
else
|
||||||
return indent('.')
|
return indent('.')
|
||||||
endif
|
endif
|
||||||
@@ -551,14 +200,18 @@ function GetCrystalIndent(...)
|
|||||||
|
|
||||||
" If the previous line ended with an "end", match that "end"s beginning's
|
" If the previous line ended with an "end", match that "end"s beginning's
|
||||||
" indent.
|
" indent.
|
||||||
let col = s:Match(lnum, '\%(^\|[^.:@$]\)\<end\>\s*\%(#.*\)\=$')
|
let col = crystal#indent#Match(lnum, g:crystal#indent#end_end_regex)
|
||||||
if col > 0
|
if col
|
||||||
call cursor(lnum, col)
|
call cursor(lnum, col)
|
||||||
if searchpair(s:end_start_regex, '', s:end_end_regex, 'bW',
|
if searchpair(
|
||||||
\ s:end_skip_expr) > 0
|
\ g:crystal#indent#end_start_regex,
|
||||||
|
\ g:crystal#indent#end_middle_regex,
|
||||||
|
\ g:crystal#indent#end_end_regex,
|
||||||
|
\ 'bW',
|
||||||
|
\ g:crystal#indent#skip_expr)
|
||||||
let n = line('.')
|
let n = line('.')
|
||||||
let ind = indent('.')
|
let ind = indent('.')
|
||||||
let msl = s:GetMSL(n)
|
let msl = crystal#indent#GetMSL(n)
|
||||||
if msl != n
|
if msl != n
|
||||||
let ind = indent(msl)
|
let ind = indent(msl)
|
||||||
end
|
end
|
||||||
@@ -566,34 +219,35 @@ function GetCrystalIndent(...)
|
|||||||
endif
|
endif
|
||||||
end
|
end
|
||||||
|
|
||||||
let col = s:Match(lnum, s:crystal_indent_keywords)
|
let col = crystal#indent#Match(lnum, g:crystal#indent#crystal_indent_keywords)
|
||||||
if col > 0
|
if col
|
||||||
call cursor(lnum, col)
|
call cursor(lnum, col)
|
||||||
let ind = virtcol('.') - 1 + sw
|
let ind = virtcol('.') - 1 + s:sw()
|
||||||
" TODO: make this better (we need to count them) (or, if a searchpair
|
" TODO: make this better (we need to count them) (or, if a searchpair
|
||||||
" fails, we know that something is lacking an end and thus we indent a
|
" fails, we know that something is lacking an end and thus we indent a
|
||||||
" level
|
" level
|
||||||
if s:Match(lnum, s:end_end_regex)
|
if crystal#indent#Match(lnum, g:crystal#indent#end_end_regex)
|
||||||
let ind = indent('.')
|
let ind = indent('.')
|
||||||
endif
|
endif
|
||||||
return ind
|
return ind
|
||||||
endif
|
endif
|
||||||
|
|
||||||
" 3.4. Work on the MSL line. {{{2
|
" Work on the MSL line. {{{2
|
||||||
" --------------------------
|
" ---------------------
|
||||||
|
|
||||||
" Set up variables to use and search for MSL to the previous line.
|
" Set up variables to use and search for MSL to the previous line.
|
||||||
let p_lnum = lnum
|
let p_lnum = lnum
|
||||||
let lnum = s:GetMSL(lnum)
|
let lnum = crystal#indent#GetMSL(lnum)
|
||||||
|
|
||||||
" If the previous line wasn't a MSL.
|
" If the previous line wasn't a MSL.
|
||||||
if p_lnum != lnum
|
if p_lnum != lnum
|
||||||
" If previous line ends bracket and begins non-bracket continuation decrease indent by 1.
|
" If previous line ends bracket and begins non-bracket continuation decrease indent by 1.
|
||||||
if s:Match(p_lnum, s:bracket_switch_continuation_regex)
|
if crystal#indent#Match(p_lnum, g:crystal#indent#bracket_switch_continuation_regex)
|
||||||
return ind - 1
|
return ind - 1
|
||||||
" If previous line is a continuation return its indent.
|
" If previous line is a continuation return its indent.
|
||||||
" TODO: the || s:IsInString() thing worries me a bit.
|
" TODO: the || crystal#indent#IsInString() thing worries me a bit.
|
||||||
elseif s:Match(p_lnum, s:non_bracket_continuation_regex) || s:IsInString(p_lnum,strlen(line))
|
elseif crystal#indent#Match(p_lnum, g:crystal#indent#non_bracket_continuation_regex) ||
|
||||||
|
\ crystal#indent#IsInString(p_lnum,strlen(line))
|
||||||
return ind
|
return ind
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
@@ -605,19 +259,21 @@ function GetCrystalIndent(...)
|
|||||||
" If the MSL line had an indenting keyword in it, add a level of indent.
|
" If the MSL line had an indenting keyword in it, add a level of indent.
|
||||||
" TODO: this does not take into account contrived things such as
|
" TODO: this does not take into account contrived things such as
|
||||||
" module Foo; class Bar; end
|
" module Foo; class Bar; end
|
||||||
if s:Match(lnum, s:crystal_indent_keywords)
|
if crystal#indent#Match(lnum, g:crystal#indent#crystal_indent_keywords)
|
||||||
let ind = msl_ind + sw
|
let ind = msl_ind + s:sw()
|
||||||
if s:Match(lnum, s:end_end_regex)
|
if crystal#indent#Match(lnum, g:crystal#indent#end_end_regex)
|
||||||
let ind = ind - sw
|
let ind = ind - s:sw()
|
||||||
endif
|
endif
|
||||||
return ind
|
return ind
|
||||||
endif
|
endif
|
||||||
|
|
||||||
" If the previous line ended with [*+/.,-=], but wasn't a block ending or a
|
" If the previous line ended with an operator -- but wasn't a block
|
||||||
" closing bracket, indent one extra level.
|
" ending, closing bracket, or type declaration -- indent one extra
|
||||||
if s:Match(lnum, s:non_bracket_continuation_regex) && !s:Match(lnum, '^\s*\([\])}]\|end\)')
|
" level.
|
||||||
|
if crystal#indent#Match(lnum, g:crystal#indent#non_bracket_continuation_regex) &&
|
||||||
|
\ !crystal#indent#Match(lnum, '^\s*\([\])}]\|end\)')
|
||||||
if lnum == p_lnum
|
if lnum == p_lnum
|
||||||
let ind = msl_ind + sw
|
let ind = msl_ind + s:sw()
|
||||||
else
|
else
|
||||||
let ind = msl_ind
|
let ind = msl_ind
|
||||||
endif
|
endif
|
||||||
|
|||||||
@@ -160,8 +160,8 @@ function! s:find_start_of_block(lnum, types, skip, multiple) abort
|
|||||||
else
|
else
|
||||||
let re_skip = ''
|
let re_skip = ''
|
||||||
endif
|
endif
|
||||||
let lnum = a:lnum
|
let last_indent = indent(a:lnum) + 1
|
||||||
let last_indent = indent(lnum) + 1
|
let lnum = a:lnum - 1
|
||||||
while lnum > 0 && last_indent > 0
|
while lnum > 0 && last_indent > 0
|
||||||
let indent = indent(lnum)
|
let indent = indent(lnum)
|
||||||
if indent < last_indent
|
if indent < last_indent
|
||||||
@@ -262,7 +262,7 @@ function! s:indent_like_block(lnum)
|
|||||||
endif
|
endif
|
||||||
|
|
||||||
let [blocks, skip] = blocks_ignore
|
let [blocks, skip] = blocks_ignore
|
||||||
let indents = s:find_start_of_block(a:lnum - 1, blocks, skip, multiple)
|
let indents = s:find_start_of_block(a:lnum, blocks, skip, multiple)
|
||||||
if empty(indents)
|
if empty(indents)
|
||||||
return -1
|
return -1
|
||||||
endif
|
endif
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ setlocal indentexpr=DartIndent()
|
|||||||
|
|
||||||
let b:undo_indent = 'setl cin< cino<'
|
let b:undo_indent = 'setl cin< cino<'
|
||||||
|
|
||||||
if exists("*DartIndent")
|
if exists('*DartIndent')
|
||||||
finish
|
finish
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
|||||||
481
indent/ecrystal.vim
Normal file
481
indent/ecrystal.vim
Normal file
@@ -0,0 +1,481 @@
|
|||||||
|
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'crystal') == -1
|
||||||
|
|
||||||
|
" Setup {{{1
|
||||||
|
" =====
|
||||||
|
|
||||||
|
if exists('b:did_indent')
|
||||||
|
finish
|
||||||
|
endif
|
||||||
|
|
||||||
|
call ecrystal#SetSubtype()
|
||||||
|
|
||||||
|
if b:ecrystal_subtype !=# ''
|
||||||
|
exec 'runtime! indent/'.b:ecrystal_subtype.'.vim'
|
||||||
|
unlet! b:did_indent
|
||||||
|
endif
|
||||||
|
|
||||||
|
if &l:indentexpr ==# ''
|
||||||
|
if &l:cindent
|
||||||
|
let &l:indentexpr = 'cindent(v:lnum)'
|
||||||
|
else
|
||||||
|
let &l:indentexpr = 'indent(prevnonblank(v:lnum - 1))'
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
let b:ecrystal_subtype_indentexpr = &l:indentexpr
|
||||||
|
|
||||||
|
" Should we use folding?
|
||||||
|
if has('folding') && get(g:, 'ecrystal_fold', 0)
|
||||||
|
setlocal foldmethod=expr
|
||||||
|
setlocal foldexpr=GetEcrystalFold()
|
||||||
|
endif
|
||||||
|
|
||||||
|
" Should closing control tags be aligned with their corresponding
|
||||||
|
" opening tags?
|
||||||
|
if !exists('b:ecrystal_align_end')
|
||||||
|
if exists('g:ecrystal_align_end')
|
||||||
|
let b:ecrystal_align_end = g:ecrystal_align_end
|
||||||
|
else
|
||||||
|
let b:ecrystal_align_end = b:ecrystal_subtype !=# 'html' && b:ecrystal_subtype !=# 'xml'
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
" Should multiline tags be indented?
|
||||||
|
if !exists('b:ecrystal_indent_multiline')
|
||||||
|
let b:ecrystal_indent_multiline = get(g:, 'ecrystal_indent_multiline', 1)
|
||||||
|
endif
|
||||||
|
|
||||||
|
if b:ecrystal_indent_multiline
|
||||||
|
runtime! indent/crystal.vim
|
||||||
|
unlet! b:did_indent
|
||||||
|
setlocal indentexpr<
|
||||||
|
endif
|
||||||
|
|
||||||
|
setlocal indentexpr=GetEcrystalIndent()
|
||||||
|
setlocal indentkeys+=<>>,=end,=else,=elsif,=rescue,=ensure,=when
|
||||||
|
|
||||||
|
let b:did_indent = 1
|
||||||
|
|
||||||
|
" Only define the function once.
|
||||||
|
if exists('*GetEcrystalIndent')
|
||||||
|
finish
|
||||||
|
endif
|
||||||
|
|
||||||
|
" Helper variables and functions {{{1
|
||||||
|
" ==============================
|
||||||
|
|
||||||
|
let s:ecr_open = '<%%\@!'
|
||||||
|
let s:ecr_close = '%>'
|
||||||
|
|
||||||
|
let s:ecr_control_open = '<%%\@!-\=[=#]\@!'
|
||||||
|
let s:ecr_comment_open = '<%%\@!-\=#'
|
||||||
|
|
||||||
|
let s:ecr_indent_regex =
|
||||||
|
\ '\<\%(if\|unless\|else\|elsif\|case\|for\|when\|while\|until\|begin\|do\|rescue\|ensure\|' .
|
||||||
|
\ 'class\|module\|struct\|lib\|enum\|union\)\>'
|
||||||
|
|
||||||
|
let s:ecr_dedent_regex =
|
||||||
|
\ '\<\%(end\|else\|elsif\|when\|rescue\|ensure\)\>'
|
||||||
|
|
||||||
|
" Return the value of a single shift-width
|
||||||
|
if exists('*shiftwidth')
|
||||||
|
let s:sw = function('shiftwidth')
|
||||||
|
else
|
||||||
|
function s:sw()
|
||||||
|
return &shiftwidth
|
||||||
|
endfunction
|
||||||
|
endif
|
||||||
|
|
||||||
|
" Does the given pattern match at the given position?
|
||||||
|
function! s:MatchAt(lnum, col, pattern) abort
|
||||||
|
let idx = a:col - 1
|
||||||
|
return match(getline(a:lnum), a:pattern, idx) == idx
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" Does the given pattern match at the cursor's position?
|
||||||
|
function! s:MatchCursor(pattern) abort
|
||||||
|
return s:MatchAt(line('.'), col('.'), a:pattern)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" Is the cell at the given position part of a tag? If so, return the
|
||||||
|
" position of the opening delimiter.
|
||||||
|
function! s:MatchECR(...) abort
|
||||||
|
if a:0
|
||||||
|
let lnum = a:1
|
||||||
|
let col = a:2
|
||||||
|
|
||||||
|
call cursor(lnum, col)
|
||||||
|
endif
|
||||||
|
|
||||||
|
let pos = getcurpos()
|
||||||
|
|
||||||
|
try
|
||||||
|
let flags = s:MatchCursor(s:ecr_open) ? 'bcWz' : 'bWz'
|
||||||
|
|
||||||
|
let [open_lnum, open_col] = searchpairpos(
|
||||||
|
\ s:ecr_open, '', s:ecr_close,
|
||||||
|
\ flags, g:crystal#indent#skip_expr)
|
||||||
|
finally
|
||||||
|
call setpos('.', pos)
|
||||||
|
endtry
|
||||||
|
|
||||||
|
return [open_lnum, open_col]
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" If the cell at the given position is part of a control tag, return the
|
||||||
|
" respective positions of the opening and closing delimiters for that
|
||||||
|
" tag.
|
||||||
|
function! s:MatchECRControl(...) abort
|
||||||
|
let pos = getcurpos()
|
||||||
|
|
||||||
|
if a:0
|
||||||
|
let lnum = a:1
|
||||||
|
let col = a:2
|
||||||
|
|
||||||
|
call cursor(lnum, col)
|
||||||
|
else
|
||||||
|
let [lnum, col] = [line('.'), col('.')]
|
||||||
|
endif
|
||||||
|
|
||||||
|
let open = { 'lnum': 0, 'col': 0 }
|
||||||
|
let close = { 'lnum': 0, 'col': 0 }
|
||||||
|
|
||||||
|
let [open.lnum, open.col] = s:MatchECR(lnum, col)
|
||||||
|
|
||||||
|
if !open.lnum
|
||||||
|
call setpos('.', pos)
|
||||||
|
return [open, close]
|
||||||
|
endif
|
||||||
|
|
||||||
|
call cursor(open.lnum, open.col)
|
||||||
|
|
||||||
|
if !s:MatchCursor(s:ecr_control_open)
|
||||||
|
let open.lnum = 0
|
||||||
|
let open.col = 0
|
||||||
|
|
||||||
|
call setpos('.', pos)
|
||||||
|
return [open, close]
|
||||||
|
endif
|
||||||
|
|
||||||
|
let [close.lnum, close.col] = searchpairpos(
|
||||||
|
\ s:ecr_control_open, '', s:ecr_close,
|
||||||
|
\ 'Wz', g:crystal#indent#skip_expr)
|
||||||
|
|
||||||
|
call setpos('.', pos)
|
||||||
|
return [open, close]
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" Determine whether or not the control tag at the given position starts
|
||||||
|
" an indent.
|
||||||
|
function! s:ECRIndent(...) abort
|
||||||
|
if a:0
|
||||||
|
if type(a:1) == 0
|
||||||
|
let [open, close] = s:MatchECRControl(a:1, a:2)
|
||||||
|
elseif type(a:1) == 4
|
||||||
|
let [open, close] = [a:1, a:2]
|
||||||
|
endif
|
||||||
|
else
|
||||||
|
let [open, close] = s:MatchECRControl()
|
||||||
|
endif
|
||||||
|
|
||||||
|
let result = 0
|
||||||
|
|
||||||
|
if !open.lnum
|
||||||
|
return result
|
||||||
|
endif
|
||||||
|
|
||||||
|
let pos = getcurpos()
|
||||||
|
|
||||||
|
call cursor(open.lnum, open.col)
|
||||||
|
|
||||||
|
" Find each Crystal keyword that starts an indent; if any of them do
|
||||||
|
" not have a corresponding ending keyword, then this tag starts an
|
||||||
|
" indent.
|
||||||
|
while search(s:ecr_indent_regex, 'z', close.lnum)
|
||||||
|
let [lnum, col] = [line('.'), col('.')]
|
||||||
|
|
||||||
|
if lnum == close.lnum && col > close.col
|
||||||
|
break
|
||||||
|
endif
|
||||||
|
|
||||||
|
if crystal#indent#IsInStringOrComment(lnum, col)
|
||||||
|
continue
|
||||||
|
endif
|
||||||
|
|
||||||
|
let [end_lnum, end_col] = searchpairpos(
|
||||||
|
\ g:crystal#indent#end_start_regex,
|
||||||
|
\ g:crystal#indent#end_middle_regex,
|
||||||
|
\ g:crystal#indent#end_end_regex,
|
||||||
|
\ 'nz',
|
||||||
|
\ g:crystal#indent#skip_expr,
|
||||||
|
\ close.lnum)
|
||||||
|
|
||||||
|
if end_lnum
|
||||||
|
if end_lnum == close.lnum && end_col > close.col
|
||||||
|
let result = 1
|
||||||
|
endif
|
||||||
|
else
|
||||||
|
let result = 1
|
||||||
|
endif
|
||||||
|
|
||||||
|
if result
|
||||||
|
break
|
||||||
|
endif
|
||||||
|
endwhile
|
||||||
|
|
||||||
|
call setpos('.', pos)
|
||||||
|
return result
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" Determine if the control tag at the given position ends an indent or
|
||||||
|
" not.
|
||||||
|
function! s:ECRDedent(...) abort
|
||||||
|
if a:0
|
||||||
|
if type(a:1) == 0
|
||||||
|
let [open, close] = s:MatchECRControl(a:1, a:2)
|
||||||
|
elseif type(a:1) == 4
|
||||||
|
let [open, close] = [a:1, a:2]
|
||||||
|
endif
|
||||||
|
else
|
||||||
|
let [open, close] = s:MatchECRControl()
|
||||||
|
endif
|
||||||
|
|
||||||
|
let result = 0
|
||||||
|
|
||||||
|
if !open.lnum
|
||||||
|
return result
|
||||||
|
endif
|
||||||
|
|
||||||
|
let pos = getcurpos()
|
||||||
|
|
||||||
|
call cursor(open.lnum, open.col)
|
||||||
|
|
||||||
|
" Find each Crystal keyword that ends an indent; if any of them do not
|
||||||
|
" have a corresponding starting keyword, then this tag ends an indent
|
||||||
|
while search(s:ecr_dedent_regex, 'z', close.lnum)
|
||||||
|
let [lnum, col] = [line('.'), col('.')]
|
||||||
|
|
||||||
|
if lnum == close.lnum && col > close.col
|
||||||
|
break
|
||||||
|
endif
|
||||||
|
|
||||||
|
if crystal#indent#IsInStringOrComment(lnum, col)
|
||||||
|
continue
|
||||||
|
endif
|
||||||
|
|
||||||
|
let [begin_lnum, begin_col] = searchpairpos(
|
||||||
|
\ g:crystal#indent#end_start_regex,
|
||||||
|
\ g:crystal#indent#end_middle_regex,
|
||||||
|
\ g:crystal#indent#end_end_regex,
|
||||||
|
\ 'bnz',
|
||||||
|
\ g:crystal#indent#skip_expr,
|
||||||
|
\ open.lnum)
|
||||||
|
|
||||||
|
if begin_lnum
|
||||||
|
if begin_lnum == open.lnum && begin_col < open.col
|
||||||
|
let result = 1
|
||||||
|
endif
|
||||||
|
else
|
||||||
|
let result = 1
|
||||||
|
endif
|
||||||
|
|
||||||
|
if result
|
||||||
|
break
|
||||||
|
endif
|
||||||
|
endwhile
|
||||||
|
|
||||||
|
call setpos('.', pos)
|
||||||
|
return result
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" Find and match a control tag in the given line, if one exists.
|
||||||
|
function! s:FindECRControl(...) abort
|
||||||
|
let lnum = a:0 ? a:1 : line('.')
|
||||||
|
|
||||||
|
let open = { 'lnum': 0, 'col': 0 }
|
||||||
|
let close = { 'lnum': 0, 'col': 0 }
|
||||||
|
|
||||||
|
let pos = getcurpos()
|
||||||
|
|
||||||
|
call cursor(lnum, 1)
|
||||||
|
|
||||||
|
while search(s:ecr_control_open, 'cz', lnum)
|
||||||
|
let [open, close] = s:MatchECRControl()
|
||||||
|
|
||||||
|
if open.lnum
|
||||||
|
break
|
||||||
|
endif
|
||||||
|
endwhile
|
||||||
|
|
||||||
|
call setpos('.', pos)
|
||||||
|
return [open, close]
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" Find and match the previous control tag.
|
||||||
|
"
|
||||||
|
" This takes two arguments: the first is the line to start searching
|
||||||
|
" from (exclusive); the second is the line to stop searching at
|
||||||
|
" (inclusive).
|
||||||
|
function! s:FindPrevECRControl(...) abort
|
||||||
|
if a:0 == 0
|
||||||
|
let start = line('.')
|
||||||
|
let stop = 1
|
||||||
|
elseif a:0 == 1
|
||||||
|
let start = a:1
|
||||||
|
let stop = 1
|
||||||
|
elseif a:0 == 2
|
||||||
|
let start = a:1
|
||||||
|
let stop = a:2
|
||||||
|
endif
|
||||||
|
|
||||||
|
let open = { 'lnum': 0, 'col': 0 }
|
||||||
|
let close = { 'lnum': 0, 'col': 0 }
|
||||||
|
|
||||||
|
let pos = getcurpos()
|
||||||
|
|
||||||
|
call cursor(start, 1)
|
||||||
|
|
||||||
|
let [lnum, col] = searchpos(s:ecr_close, 'bWz', stop)
|
||||||
|
|
||||||
|
if !lnum
|
||||||
|
call setpos('.', pos)
|
||||||
|
return [open, close]
|
||||||
|
endif
|
||||||
|
|
||||||
|
let [open, close] = s:MatchECRControl()
|
||||||
|
|
||||||
|
while !open.lnum
|
||||||
|
let [lnum, col] = searchpos(s:ecr_close, 'bWz', stop)
|
||||||
|
|
||||||
|
if !lnum
|
||||||
|
break
|
||||||
|
endif
|
||||||
|
|
||||||
|
let [open, close] = s:MatchECRControl()
|
||||||
|
endwhile
|
||||||
|
|
||||||
|
call setpos('.', pos)
|
||||||
|
return [open, close]
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" GetEcrystalIndent {{{1
|
||||||
|
" =================
|
||||||
|
|
||||||
|
function! GetEcrystalIndent() abort
|
||||||
|
let prev_lnum = prevnonblank(v:lnum - 1)
|
||||||
|
|
||||||
|
if b:ecrystal_indent_multiline
|
||||||
|
let [open_tag_lnum, open_tag_col] = s:MatchECR()
|
||||||
|
else
|
||||||
|
let open_tag_lnum = 0
|
||||||
|
endif
|
||||||
|
|
||||||
|
if open_tag_lnum && open_tag_lnum < v:lnum
|
||||||
|
" If we are inside a multiline eCrystal tag...
|
||||||
|
|
||||||
|
let ind = indent(open_tag_lnum)
|
||||||
|
|
||||||
|
" If this line has a closing delimiter that isn't inside a string or
|
||||||
|
" comment, then we are done with this tag
|
||||||
|
if crystal#indent#Match(v:lnum, s:ecr_close)
|
||||||
|
return ind
|
||||||
|
endif
|
||||||
|
|
||||||
|
" All tag contents will have at least one indent
|
||||||
|
let ind += s:sw()
|
||||||
|
|
||||||
|
if open_tag_lnum == prev_lnum
|
||||||
|
" If this is the first line after the opening delimiter, then one
|
||||||
|
" indent is enough
|
||||||
|
return ind
|
||||||
|
elseif s:MatchAt(open_tag_lnum, open_tag_col, s:ecr_comment_open)[0]
|
||||||
|
" eCrystal comments shouldn't be indented any further
|
||||||
|
return ind
|
||||||
|
else
|
||||||
|
" Else, fall back to Crystal indentation...
|
||||||
|
let crystal_ind = GetCrystalIndent()
|
||||||
|
|
||||||
|
" But only if it isn't less than the default indentation for this
|
||||||
|
" tag
|
||||||
|
return crystal_ind < ind ? ind : crystal_ind
|
||||||
|
endif
|
||||||
|
else
|
||||||
|
let [prev_ecr_open, prev_ecr_close] = s:FindPrevECRControl(v:lnum, prev_lnum)
|
||||||
|
let [curr_ecr_open, curr_ecr_close] = s:FindECRControl()
|
||||||
|
|
||||||
|
let prev_is_ecr = prev_ecr_open.lnum != 0
|
||||||
|
let curr_is_ecr = curr_ecr_open.lnum != 0
|
||||||
|
|
||||||
|
let shift = 0
|
||||||
|
|
||||||
|
if prev_is_ecr
|
||||||
|
if s:ECRIndent(prev_ecr_open, prev_ecr_close)
|
||||||
|
let shift = 1
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
if curr_is_ecr
|
||||||
|
if s:ECRDedent(curr_ecr_open, curr_ecr_close)
|
||||||
|
if !b:ecrystal_align_end
|
||||||
|
let shift = shift ? 0 : -1
|
||||||
|
else
|
||||||
|
" Find the nearest previous control tag that starts an indent
|
||||||
|
" and align this one with that one
|
||||||
|
let end_tags = 0
|
||||||
|
|
||||||
|
let [open, close] = s:FindPrevECRControl()
|
||||||
|
|
||||||
|
while open.lnum
|
||||||
|
if s:ECRIndent(open, close)
|
||||||
|
if end_tags
|
||||||
|
let end_tags -= 1
|
||||||
|
else
|
||||||
|
return indent(open.lnum)
|
||||||
|
endif
|
||||||
|
elseif s:ECRDedent(open, close)
|
||||||
|
let end_tags += 1
|
||||||
|
endif
|
||||||
|
|
||||||
|
let [open, close] = s:FindPrevECRControl(open.lnum)
|
||||||
|
endwhile
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
if shift
|
||||||
|
return indent(prev_lnum) + s:sw() * shift
|
||||||
|
else
|
||||||
|
exec 'return ' . b:ecrystal_subtype_indentexpr
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" GetEcrystalFold {{{1
|
||||||
|
" ===============
|
||||||
|
|
||||||
|
function! GetEcrystalFold() abort
|
||||||
|
let fold = '='
|
||||||
|
|
||||||
|
let col = crystal#indent#Match(v:lnum, s:ecr_control_open)
|
||||||
|
|
||||||
|
if col
|
||||||
|
let [open, close] = s:MatchECRControl(v:lnum, col)
|
||||||
|
|
||||||
|
let starts_indent = s:ECRIndent(open, close)
|
||||||
|
let ends_indent = s:ECRDedent(open, close)
|
||||||
|
|
||||||
|
if starts_indent && !ends_indent
|
||||||
|
let fold = 'a1'
|
||||||
|
elseif ends_indent && !starts_indent
|
||||||
|
let fold = 's1'
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
return fold
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" }}}
|
||||||
|
|
||||||
|
" vim:fdm=marker
|
||||||
|
|
||||||
|
endif
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'elm') == -1
|
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'elm') == -1
|
||||||
|
|
||||||
" indentation for Elm (http://elm-lang.org/)
|
" indentation for Elm (https://elm-lang.org/)
|
||||||
|
|
||||||
" Only load this indent file when no other was loaded.
|
" Only load this indent file when no other was loaded.
|
||||||
if exists('b:did_indent')
|
if exists('b:did_indent')
|
||||||
@@ -17,6 +17,7 @@ setlocal nosmartindent
|
|||||||
|
|
||||||
" Comment formatting
|
" Comment formatting
|
||||||
setlocal comments=s1fl:{-,mb:\ ,ex:-},:--
|
setlocal comments=s1fl:{-,mb:\ ,ex:-},:--
|
||||||
|
setlocal commentstring=--\ %s
|
||||||
|
|
||||||
" Only define the function once.
|
" Only define the function once.
|
||||||
if exists('*GetElmIndent')
|
if exists('*GetElmIndent')
|
||||||
@@ -83,7 +84,7 @@ function! GetElmIndent()
|
|||||||
|
|
||||||
" Align bindings with the parent in.
|
" Align bindings with the parent in.
|
||||||
elseif l:lline =~# '^\s*in\>'
|
elseif l:lline =~# '^\s*in\>'
|
||||||
return l:ind + 4
|
return l:ind
|
||||||
|
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
|||||||
204
indent/gdscript3.vim
Normal file
204
indent/gdscript3.vim
Normal file
@@ -0,0 +1,204 @@
|
|||||||
|
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'gdscript') == -1
|
||||||
|
|
||||||
|
" Vim indent file
|
||||||
|
" Language: Python
|
||||||
|
" Maintainer: Bram Moolenaar <Bram@vim.org>
|
||||||
|
" Original Author: David Bustos <bustos@caltech.edu>
|
||||||
|
" Last Change: 2013 Jul 9
|
||||||
|
|
||||||
|
" Modified for GDScript
|
||||||
|
|
||||||
|
" Only load this indent file when no other was loaded.
|
||||||
|
if exists("b:did_indent")
|
||||||
|
finish
|
||||||
|
endif
|
||||||
|
let b:did_indent = 1
|
||||||
|
|
||||||
|
" Some preliminary settings
|
||||||
|
setlocal nolisp " Make sure lisp indenting doesn't supersede us
|
||||||
|
setlocal autoindent " indentexpr isn't much help otherwise
|
||||||
|
|
||||||
|
setlocal indentexpr=GetPythonIndent(v:lnum)
|
||||||
|
setlocal indentkeys+=<:>,=elif
|
||||||
|
|
||||||
|
" Only define the function once.
|
||||||
|
if exists("*GetPythonIndent")
|
||||||
|
finish
|
||||||
|
endif
|
||||||
|
let s:keepcpo= &cpo
|
||||||
|
set cpo&vim
|
||||||
|
|
||||||
|
" Come here when loading the script the first time.
|
||||||
|
|
||||||
|
let s:maxoff = 50 " maximum number of lines to look backwards for ()
|
||||||
|
|
||||||
|
function GetPythonIndent(lnum)
|
||||||
|
|
||||||
|
" If this line is explicitly joined: If the previous line was also joined,
|
||||||
|
" line it up with that one, otherwise add two 'shiftwidth'
|
||||||
|
if getline(a:lnum - 1) =~ '\\$'
|
||||||
|
if a:lnum > 1 && getline(a:lnum - 2) =~ '\\$'
|
||||||
|
return indent(a:lnum - 1)
|
||||||
|
endif
|
||||||
|
return indent(a:lnum - 1) + (exists("g:pyindent_continue") ? eval(g:pyindent_continue) : (shiftwidth() * 2))
|
||||||
|
endif
|
||||||
|
|
||||||
|
" If the start of the line is in a string don't change the indent.
|
||||||
|
if has('syntax_items')
|
||||||
|
\ && synIDattr(synID(a:lnum, 1, 1), "name") =~ "String$"
|
||||||
|
return -1
|
||||||
|
endif
|
||||||
|
|
||||||
|
" Search backwards for the previous non-empty line.
|
||||||
|
let plnum = prevnonblank(v:lnum - 1)
|
||||||
|
|
||||||
|
if plnum == 0
|
||||||
|
" This is the first non-empty line, use zero indent.
|
||||||
|
return 0
|
||||||
|
endif
|
||||||
|
|
||||||
|
" If the previous line is inside parenthesis, use the indent of the starting
|
||||||
|
" line.
|
||||||
|
" Trick: use the non-existing "dummy" variable to break out of the loop when
|
||||||
|
" going too far back.
|
||||||
|
call cursor(plnum, 1)
|
||||||
|
let parlnum = searchpair('(\|{\|\[', '', ')\|}\|\]', 'nbW',
|
||||||
|
\ "line('.') < " . (plnum - s:maxoff) . " ? dummy :"
|
||||||
|
\ . " synIDattr(synID(line('.'), col('.'), 1), 'name')"
|
||||||
|
\ . " =~ '\\(Comment\\|Todo\\|String\\)$'")
|
||||||
|
if parlnum > 0
|
||||||
|
let plindent = indent(parlnum)
|
||||||
|
let plnumstart = parlnum
|
||||||
|
else
|
||||||
|
let plindent = indent(plnum)
|
||||||
|
let plnumstart = plnum
|
||||||
|
endif
|
||||||
|
|
||||||
|
|
||||||
|
" When inside parenthesis: If at the first line below the parenthesis add
|
||||||
|
" two 'shiftwidth', otherwise same as previous line.
|
||||||
|
" i = (a
|
||||||
|
" + b
|
||||||
|
" + c)
|
||||||
|
call cursor(a:lnum, 1)
|
||||||
|
let p = searchpair('(\|{\|\[', '', ')\|}\|\]', 'bW',
|
||||||
|
\ "line('.') < " . (a:lnum - s:maxoff) . " ? dummy :"
|
||||||
|
\ . " synIDattr(synID(line('.'), col('.'), 1), 'name')"
|
||||||
|
\ . " =~ '\\(Comment\\|Todo\\|String\\)$'")
|
||||||
|
if p > 0
|
||||||
|
if p == plnum
|
||||||
|
" When the start is inside parenthesis, only indent one 'shiftwidth'.
|
||||||
|
let pp = searchpair('(\|{\|\[', '', ')\|}\|\]', 'bW',
|
||||||
|
\ "line('.') < " . (a:lnum - s:maxoff) . " ? dummy :"
|
||||||
|
\ . " synIDattr(synID(line('.'), col('.'), 1), 'name')"
|
||||||
|
\ . " =~ '\\(Comment\\|Todo\\|String\\)$'")
|
||||||
|
if pp > 0
|
||||||
|
return indent(plnum) + (exists("g:pyindent_nested_paren") ? eval(g:pyindent_nested_paren) : shiftwidth())
|
||||||
|
endif
|
||||||
|
return indent(plnum) + (exists("g:pyindent_open_paren") ? eval(g:pyindent_open_paren) : (shiftwidth() * 2))
|
||||||
|
endif
|
||||||
|
if plnumstart == p
|
||||||
|
return indent(plnum)
|
||||||
|
endif
|
||||||
|
return plindent
|
||||||
|
endif
|
||||||
|
|
||||||
|
|
||||||
|
" Get the line and remove a trailing comment.
|
||||||
|
" Use syntax highlighting attributes when possible.
|
||||||
|
let pline = getline(plnum)
|
||||||
|
let pline_len = strlen(pline)
|
||||||
|
if has('syntax_items')
|
||||||
|
" If the last character in the line is a comment, do a binary search for
|
||||||
|
" the start of the comment. synID() is slow, a linear search would take
|
||||||
|
" too long on a long line.
|
||||||
|
if synIDattr(synID(plnum, pline_len, 1), "name") =~ "\\(Comment\\|Todo\\)$"
|
||||||
|
let min = 1
|
||||||
|
let max = pline_len
|
||||||
|
while min < max
|
||||||
|
let col = (min + max) / 2
|
||||||
|
if synIDattr(synID(plnum, col, 1), "name") =~ "\\(Comment\\|Todo\\)$"
|
||||||
|
let max = col
|
||||||
|
else
|
||||||
|
let min = col + 1
|
||||||
|
endif
|
||||||
|
endwhile
|
||||||
|
let pline = strpart(pline, 0, min - 1)
|
||||||
|
endif
|
||||||
|
else
|
||||||
|
let col = 0
|
||||||
|
while col < pline_len
|
||||||
|
if pline[col] == '#'
|
||||||
|
let pline = strpart(pline, 0, col)
|
||||||
|
break
|
||||||
|
endif
|
||||||
|
let col = col + 1
|
||||||
|
endwhile
|
||||||
|
endif
|
||||||
|
|
||||||
|
" If the previous line ended with a colon, indent this line
|
||||||
|
if pline =~ ':\s*$'
|
||||||
|
return plindent + shiftwidth()
|
||||||
|
endif
|
||||||
|
|
||||||
|
" If the previous line was a stop-execution statement...
|
||||||
|
if getline(plnum) =~ '^\s*\(break\|continue\|return\|pass\)\>'
|
||||||
|
" See if the user has already dedented
|
||||||
|
if indent(a:lnum) > indent(plnum) - shiftwidth()
|
||||||
|
" If not, recommend one dedent
|
||||||
|
return indent(plnum) - shiftwidth()
|
||||||
|
endif
|
||||||
|
" Otherwise, trust the user
|
||||||
|
return -1
|
||||||
|
endif
|
||||||
|
|
||||||
|
" If the current line begins with a keyword that lines up with "try"
|
||||||
|
" if getline(a:lnum) =~ '^\s*\(except\|finally\)\>'
|
||||||
|
" let lnum = a:lnum - 1
|
||||||
|
" while lnum >= 1
|
||||||
|
" if getline(lnum) =~ '^\s*\(try\|except\)\>'
|
||||||
|
" let ind = indent(lnum)
|
||||||
|
" if ind >= indent(a:lnum)
|
||||||
|
" return -1 " indent is already less than this
|
||||||
|
" endif
|
||||||
|
" return ind " line up with previous try or except
|
||||||
|
" endif
|
||||||
|
" let lnum = lnum - 1
|
||||||
|
" endwhile
|
||||||
|
" return -1 " no matching "try"!
|
||||||
|
" endif
|
||||||
|
|
||||||
|
" If the current line begins with a header keyword, dedent
|
||||||
|
if getline(a:lnum) =~ '^\s*\(elif\|else\)\>'
|
||||||
|
|
||||||
|
" Unless the previous line was a one-liner
|
||||||
|
if getline(plnumstart) =~ '^\s*\(for\|if\)\>'
|
||||||
|
return plindent
|
||||||
|
endif
|
||||||
|
|
||||||
|
" Or the user has already dedented
|
||||||
|
if indent(a:lnum) <= plindent - shiftwidth()
|
||||||
|
return -1
|
||||||
|
endif
|
||||||
|
|
||||||
|
return plindent - shiftwidth()
|
||||||
|
endif
|
||||||
|
|
||||||
|
" When after a () construct we probably want to go back to the start line.
|
||||||
|
" a = (b
|
||||||
|
" + c)
|
||||||
|
" here
|
||||||
|
if parlnum > 0
|
||||||
|
return plindent
|
||||||
|
endif
|
||||||
|
|
||||||
|
return -1
|
||||||
|
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
let &cpo = s:keepcpo
|
||||||
|
unlet s:keepcpo
|
||||||
|
|
||||||
|
" vim:sw=2
|
||||||
|
|
||||||
|
endif
|
||||||
@@ -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 indent file
|
" 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,167 +0,0 @@
|
|||||||
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'groovy-indent') == -1
|
|
||||||
|
|
||||||
" Vim indent file
|
|
||||||
" Language: Groovy
|
|
||||||
" Maintainer: Toby Allsopp <toby.allsopp@peace.com> (resigned)
|
|
||||||
" Last Change: 2005 Mar 28
|
|
||||||
|
|
||||||
" Only load this indent file when no other was loaded.
|
|
||||||
if exists("b:did_indent")
|
|
||||||
finish
|
|
||||||
endif
|
|
||||||
let b:did_indent = 1
|
|
||||||
|
|
||||||
" Indent Groovy anonymous classes correctly.
|
|
||||||
setlocal cindent cinoptions& cinoptions+=j1
|
|
||||||
|
|
||||||
" The "extends" and "implements" lines start off with the wrong indent.
|
|
||||||
setlocal indentkeys& indentkeys+=0=extends indentkeys+=0=implements
|
|
||||||
|
|
||||||
" Set the function to do the work.
|
|
||||||
setlocal indentexpr=GetGroovyIndent()
|
|
||||||
|
|
||||||
let b:undo_indent = "set cin< cino< indentkeys< indentexpr<"
|
|
||||||
|
|
||||||
" Only define the function once.
|
|
||||||
if exists("*GetGroovyIndent")
|
|
||||||
finish
|
|
||||||
endif
|
|
||||||
|
|
||||||
function! SkipGroovyBlanksAndComments(startline)
|
|
||||||
let lnum = a:startline
|
|
||||||
while lnum > 1
|
|
||||||
let lnum = prevnonblank(lnum)
|
|
||||||
if getline(lnum) =~ '\*/\s*$'
|
|
||||||
while getline(lnum) !~ '/\*' && lnum > 1
|
|
||||||
let lnum = lnum - 1
|
|
||||||
endwhile
|
|
||||||
if getline(lnum) =~ '^\s*/\*'
|
|
||||||
let lnum = lnum - 1
|
|
||||||
else
|
|
||||||
break
|
|
||||||
endif
|
|
||||||
elseif getline(lnum) =~ '^\s*//'
|
|
||||||
let lnum = lnum - 1
|
|
||||||
else
|
|
||||||
break
|
|
||||||
endif
|
|
||||||
endwhile
|
|
||||||
return lnum
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
function GetGroovyIndent()
|
|
||||||
|
|
||||||
" Groovy is just like C; use the built-in C indenting and then correct a few
|
|
||||||
" specific cases.
|
|
||||||
let theIndent = cindent(v:lnum)
|
|
||||||
|
|
||||||
" If we're in the middle of a comment then just trust cindent
|
|
||||||
if getline(v:lnum) =~ '^\s*\*'
|
|
||||||
return theIndent
|
|
||||||
endif
|
|
||||||
|
|
||||||
|
|
||||||
" find start of previous line, in case it was a continuation line
|
|
||||||
let lnum = SkipGroovyBlanksAndComments(v:lnum - 1)
|
|
||||||
let prev = lnum
|
|
||||||
while prev > 1
|
|
||||||
let next_prev = SkipGroovyBlanksAndComments(prev - 1)
|
|
||||||
if getline(next_prev) !~ ',\s*$'
|
|
||||||
break
|
|
||||||
endif
|
|
||||||
let prev = next_prev
|
|
||||||
endwhile
|
|
||||||
|
|
||||||
|
|
||||||
" Try to align "throws" lines for methods and "extends" and "implements" for
|
|
||||||
" classes.
|
|
||||||
if getline(v:lnum) =~ '^\s*\(extends\|implements\)\>'
|
|
||||||
\ && getline(lnum) !~ '^\s*\(extends\|implements\)\>'
|
|
||||||
let theIndent = theIndent + &sw
|
|
||||||
endif
|
|
||||||
|
|
||||||
" correct for continuation lines of "throws", "implements" and "extends"
|
|
||||||
let cont_kw = matchstr(getline(prev),
|
|
||||||
\ '^\s*\zs\(throws\|implements\|extends\)\>\ze.*,\s*$')
|
|
||||||
if strlen(cont_kw) > 0
|
|
||||||
let amount = strlen(cont_kw) + 1
|
|
||||||
if getline(lnum) !~ ',\s*$'
|
|
||||||
let theIndent = theIndent - (amount + &sw)
|
|
||||||
if theIndent < 0
|
|
||||||
let theIndent = 0
|
|
||||||
endif
|
|
||||||
elseif prev == lnum
|
|
||||||
let theIndent = theIndent + amount
|
|
||||||
if cont_kw ==# 'throws'
|
|
||||||
let theIndent = theIndent + &sw
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
elseif getline(prev) =~ '^\s*\(throws\|implements\|extends\)\>'
|
|
||||||
\ && (getline(prev) =~ '{\s*$'
|
|
||||||
\ || getline(v:lnum) =~ '^\s*{\s*$')
|
|
||||||
let theIndent = theIndent - &sw
|
|
||||||
endif
|
|
||||||
|
|
||||||
" When the line starts with a }, try aligning it with the matching {,
|
|
||||||
" skipping over "throws", "extends" and "implements" clauses.
|
|
||||||
if getline(v:lnum) =~ '^\s*}\s*\(//.*\|/\*.*\)\=$'
|
|
||||||
call cursor(v:lnum, 1)
|
|
||||||
silent normal %
|
|
||||||
let lnum = line('.')
|
|
||||||
if lnum < v:lnum
|
|
||||||
while lnum > 1
|
|
||||||
let next_lnum = SkipGroovyBlanksAndComments(lnum - 1)
|
|
||||||
if getline(lnum) !~ '^\s*\(throws\|extends\|implements\)\>'
|
|
||||||
\ && getline(next_lnum) !~ ',\s*$'
|
|
||||||
break
|
|
||||||
endif
|
|
||||||
let lnum = prevnonblank(next_lnum)
|
|
||||||
endwhile
|
|
||||||
return indent(lnum)
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
|
|
||||||
" Below a line starting with "}" never indent more. Needed for a method
|
|
||||||
" below a method with an indented "throws" clause.
|
|
||||||
let lnum = SkipGroovyBlanksAndComments(v:lnum - 1)
|
|
||||||
if getline(lnum) =~ '^\s*}\s*\(//.*\|/\*.*\)\=$' && indent(lnum) < theIndent
|
|
||||||
let theIndent = indent(lnum)
|
|
||||||
endif
|
|
||||||
|
|
||||||
" Fixed several indent problem
|
|
||||||
if theIndent > indent(lnum)
|
|
||||||
" if no '{ -> ( if else' , then same indent as previous line
|
|
||||||
if getline(lnum) !~ '[\{>\(]\s*$' && getline(lnum) !~ '\s*\(if\|else\)\s*'
|
|
||||||
let theIndent = indent(lnum)
|
|
||||||
endif
|
|
||||||
|
|
||||||
" if last line end with (
|
|
||||||
if getline(lnum) =~ '[\(]\s*$'
|
|
||||||
let theIndent = indent(lnum) + &sw
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
|
|
||||||
" indent the ')' line with ( line
|
|
||||||
if getline(v:lnum) =~ '^\s*)'
|
|
||||||
call cursor(v:lnum, 1)
|
|
||||||
silent normal %
|
|
||||||
let lnum = line('.')
|
|
||||||
if lnum < v:lnum
|
|
||||||
while lnum > 1
|
|
||||||
let next_lnum = SkipGroovyBlanksAndComments(lnum - 1)
|
|
||||||
if getline(lnum) !~ '^\s*\(throws\|extends\|implements\)\>'
|
|
||||||
\ && getline(next_lnum) !~ ',\s*$'
|
|
||||||
break
|
|
||||||
endif
|
|
||||||
let lnum = prevnonblank(next_lnum)
|
|
||||||
endwhile
|
|
||||||
return indent(lnum)
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
|
|
||||||
return theIndent
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" vi: sw=2 et
|
|
||||||
|
|
||||||
endif
|
|
||||||
@@ -3,7 +3,7 @@ if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'haml') == -1
|
|||||||
" Vim indent file
|
" Vim indent file
|
||||||
" Language: Haml
|
" Language: Haml
|
||||||
" Maintainer: Tim Pope <vimNOSPAM@tpope.org>
|
" Maintainer: Tim Pope <vimNOSPAM@tpope.org>
|
||||||
" Last Change: 2016 Aug 29
|
" Last Change: 2017 Jun 13
|
||||||
|
|
||||||
if exists("b:did_indent")
|
if exists("b:did_indent")
|
||||||
finish
|
finish
|
||||||
@@ -39,7 +39,7 @@ function! GetHamlIndent()
|
|||||||
let line = substitute(line,'^\s\+','','')
|
let line = substitute(line,'^\s\+','','')
|
||||||
let indent = indent(lnum)
|
let indent = indent(lnum)
|
||||||
let cindent = indent(v:lnum)
|
let cindent = indent(v:lnum)
|
||||||
let sw = exists('*shiftwidth') ? shiftwidth() : &sw
|
let sw = shiftwidth()
|
||||||
if cline =~# '\v^-\s*%(elsif|else|when)>'
|
if cline =~# '\v^-\s*%(elsif|else|when)>'
|
||||||
let indent = cindent < indent ? cindent : indent - sw
|
let indent = cindent < indent ? cindent : indent - sw
|
||||||
endif
|
endif
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ if exists("*GetJuliaIndent")
|
|||||||
finish
|
finish
|
||||||
endif
|
endif
|
||||||
|
|
||||||
let s:skipPatterns = '\<julia\%(Comprehension\%(For\|If\)\|RangeEnd\|Comment[LM]\|\%([bsv]\|ip\|big\|MIME\|Shell\|Printf\|Doc\)\=String\|RegEx\|SymbolS\?\)\>'
|
let s:skipPatterns = '\<julia\%(Comprehension\%(For\|If\)\|RangeKeyword\|Comment[LM]\|\%([bsv]\|ip\|big\|MIME\|Shell\|Printf\|Doc\)\=String\|RegEx\|SymbolS\?\)\>'
|
||||||
|
|
||||||
function JuliaMatch(lnum, str, regex, st, ...)
|
function JuliaMatch(lnum, str, regex, st, ...)
|
||||||
let s = a:st
|
let s = a:st
|
||||||
@@ -50,9 +50,8 @@ function GetJuliaNestingStruct(lnum, ...)
|
|||||||
let e = a:0 > 1 ? a:2 : -1
|
let e = a:0 > 1 ? a:2 : -1
|
||||||
let blocks_stack = []
|
let blocks_stack = []
|
||||||
let num_closed_blocks = 0
|
let num_closed_blocks = 0
|
||||||
let tt = get(b:, 'julia_syntax_version', 10) == 6 ? '\|\%(\%(abstract\|primitive\)\s\+\)\@<!type' : ''
|
|
||||||
while 1
|
while 1
|
||||||
let fb = JuliaMatch(a:lnum, line, '@\@<!\<\%(if\|else\%(if\)\?\|while\|for\|try\|catch\|finally\|\%(staged\)\?function\|macro\|begin\|mutable\s\+struct\|\%(mutable\s\+\)\@<!struct\|\%(abstract\|primitive\)\s\+type\|immutable\|let\|\%(bare\)\?module\|quote\|do'.tt.'\)\>', s, e)
|
let fb = JuliaMatch(a:lnum, line, '@\@<!\<\%(if\|else\%(if\)\?\|while\|for\|try\|catch\|finally\|\%(staged\)\?function\|macro\|begin\|mutable\s\+struct\|\%(mutable\s\+\)\@<!struct\|\%(abstract\|primitive\)\s\+type\|immutable\|let\|\%(bare\)\?module\|quote\|do\)\>', s, e)
|
||||||
let fe = JuliaMatch(a:lnum, line, '@\@<!\<end\>', s, e)
|
let fe = JuliaMatch(a:lnum, line, '@\@<!\<end\>', s, e)
|
||||||
|
|
||||||
if fb < 0 && fe < 0
|
if fb < 0 && fe < 0
|
||||||
@@ -134,7 +133,7 @@ function GetJuliaNestingStruct(lnum, ...)
|
|||||||
continue
|
continue
|
||||||
endif
|
endif
|
||||||
|
|
||||||
let i = JuliaMatch(a:lnum, line, '@\@<!\<\%(while\|for\|\%(staged\)\?function\|macro\|begin\|\%(mutable\s\+\)\?struct\|\%(abstract\|primitive\)\s\+type\|immutable\|let\|quote\|do'.tt.'\)\>', s)
|
let i = JuliaMatch(a:lnum, line, '@\@<!\<\%(while\|for\|\%(staged\)\?function\|macro\|begin\|\%(mutable\s\+\)\?struct\|\%(abstract\|primitive\)\s\+type\|immutable\|let\|quote\|do\)\>', s)
|
||||||
if i >= 0 && i == fb
|
if i >= 0 && i == fb
|
||||||
if match(line, '\C\<\%(mutable\|abstract\|primitive\)', i) != -1
|
if match(line, '\C\<\%(mutable\|abstract\|primitive\)', i) != -1
|
||||||
let s = i+11
|
let s = i+11
|
||||||
@@ -317,11 +316,17 @@ function GetJuliaIndent()
|
|||||||
" Second scenario: some multiline bracketed expression was closed in the
|
" Second scenario: some multiline bracketed expression was closed in the
|
||||||
" previous line. But since we know we are still in a bracketed expression,
|
" previous line. But since we know we are still in a bracketed expression,
|
||||||
" we need to find the line where the bracket was open
|
" we need to find the line where the bracket was open
|
||||||
elseif last_closed_bracket != -1 " && exists("loaded_matchit")
|
elseif last_closed_bracket != -1
|
||||||
" we use the % command to skip back (this is buggy without matchit, and
|
" we use the % command to skip back (tries to ues matchit if possible,
|
||||||
" is potentially a disaster if % got remapped)
|
" otherwise resorts to vim's default, which is buggy but better than
|
||||||
|
" nothing)
|
||||||
call cursor(lnum, last_closed_bracket)
|
call cursor(lnum, last_closed_bracket)
|
||||||
|
let percmap = maparg("%", "n")
|
||||||
|
if exists("g:loaded_matchit") && percmap =~# 'Match\%(it\|_wrapper\)'
|
||||||
normal %
|
normal %
|
||||||
|
else
|
||||||
|
normal! %
|
||||||
|
end
|
||||||
if line(".") == lnum
|
if line(".") == lnum
|
||||||
" something wrong here, give up
|
" something wrong here, give up
|
||||||
let ind = indent(lnum)
|
let ind = indent(lnum)
|
||||||
@@ -365,23 +370,13 @@ function GetJuliaIndent()
|
|||||||
|
|
||||||
" Analyse the reference line
|
" Analyse the reference line
|
||||||
let [num_open_blocks, num_closed_blocks] = GetJuliaNestingStruct(lnum, st, lim)
|
let [num_open_blocks, num_closed_blocks] = GetJuliaNestingStruct(lnum, st, lim)
|
||||||
|
" Increase indentation for each newly opened block in the reference line
|
||||||
" Increase indentation for each newly opened block
|
let ind += shiftwidth() * num_open_blocks
|
||||||
" in the reference line
|
|
||||||
while num_open_blocks > 0
|
|
||||||
let ind += &sw
|
|
||||||
let num_open_blocks -= 1
|
|
||||||
endwhile
|
|
||||||
|
|
||||||
" Analyse the current line
|
" Analyse the current line
|
||||||
let [num_open_blocks, num_closed_blocks] = GetJuliaNestingStruct(v:lnum)
|
let [num_open_blocks, num_closed_blocks] = GetJuliaNestingStruct(v:lnum)
|
||||||
|
" Decrease indentation for each closed block in the current line
|
||||||
" Decrease indentation for each closed block
|
let ind -= shiftwidth() * num_closed_blocks
|
||||||
" in the current line
|
|
||||||
while num_closed_blocks > 0
|
|
||||||
let ind -= &sw
|
|
||||||
let num_closed_blocks -= 1
|
|
||||||
endwhile
|
|
||||||
|
|
||||||
return ind
|
return ind
|
||||||
endfunction
|
endfunction
|
||||||
|
|||||||
52
indent/ledger.vim
Normal file
52
indent/ledger.vim
Normal file
@@ -0,0 +1,52 @@
|
|||||||
|
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'ledger') == -1
|
||||||
|
|
||||||
|
" Vim filetype indent file
|
||||||
|
" filetype: 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('b:did_indent')
|
||||||
|
finish
|
||||||
|
endif
|
||||||
|
let b:did_indent = 1
|
||||||
|
|
||||||
|
setl autoindent
|
||||||
|
setl indentexpr=GetLedgerIndent()
|
||||||
|
|
||||||
|
if exists('*GetLedgerIndent')
|
||||||
|
finish
|
||||||
|
endif
|
||||||
|
|
||||||
|
function GetLedgerIndent(...)
|
||||||
|
" You can pass in a line number when calling this function manually.
|
||||||
|
let lnum = a:0 > 0 ? a:1 : v:lnum
|
||||||
|
" If this line is empty look at (the indentation of) the last line.
|
||||||
|
" Note that inside of a transaction no blank lines are allowed.
|
||||||
|
let line = getline(lnum)
|
||||||
|
let prev = getline(lnum - 1)
|
||||||
|
|
||||||
|
if line =~# '^\s\+\S'
|
||||||
|
" Lines that already are indented (→postings, sub-directives) keep their indentation.
|
||||||
|
return &shiftwidth
|
||||||
|
elseif line =~# '^\s*$'
|
||||||
|
" Current line is empty, try to guess its type based on the previous line.
|
||||||
|
if prev =~# '^\([[:digit:]~=]\|\s\+\S\)'
|
||||||
|
" This is very likely a posting or a sub-directive.
|
||||||
|
" While lines following the start of a transaction are automatically
|
||||||
|
" indented you will have to indent the first line following a
|
||||||
|
" pre-declaration manually. This makes it easier to type long lists of
|
||||||
|
" 'account' pre-declarations without sub-directives, for example.
|
||||||
|
return &shiftwidth
|
||||||
|
else
|
||||||
|
return 0
|
||||||
|
endif
|
||||||
|
else
|
||||||
|
" Everything else is not indented:
|
||||||
|
" start of transactions, pre-declarations, apply/end-lines
|
||||||
|
return 0
|
||||||
|
endif
|
||||||
|
endf
|
||||||
|
|
||||||
|
endif
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user