mirror of
https://github.com/sheerun/vim-polyglot.git
synced 2025-11-08 11:33:52 -05:00
Compare commits
68 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
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 | ||
|
|
4d8423c962 | ||
|
|
e204a7223b | ||
|
|
7a0f2d974f | ||
|
|
15aeea662e | ||
|
|
d15651463a | ||
|
|
0c79dd3e73 | ||
|
|
4e95df7c7e | ||
|
|
31c55b85a0 | ||
|
|
199846c6d8 | ||
|
|
f95026252c | ||
|
|
4f3df59be7 | ||
|
|
26790941f6 | ||
|
|
fbc2af9e82 | ||
|
|
d4f252565a | ||
|
|
48e07bc501 | ||
|
|
c8897c9c18 | ||
|
|
34eb36e6d1 | ||
|
|
84ec4eedcd | ||
|
|
66b769328c | ||
|
|
ae18284e5a | ||
|
|
e3024f21fc | ||
|
|
31d757fc7b | ||
|
|
556c56d185 | ||
|
|
fe84062992 | ||
|
|
8742443e69 | ||
|
|
832dfece76 | ||
|
|
933e42ea1f | ||
|
|
cdd6d73e39 | ||
|
|
a48874df4c | ||
|
|
21849c2e18 | ||
|
|
664aa988f6 | ||
|
|
3ddca5da46 | ||
|
|
140430ffb7 |
1
.gitignore
vendored
1
.gitignore
vendored
@@ -1 +1,2 @@
|
||||
/tmp
|
||||
!*ctags*
|
||||
|
||||
62
README.md
62
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-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.
|
||||
|
||||
- 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-->145<!--/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.
|
||||
- All unnecessary files are ignored (like enormous documentation from php support).
|
||||
- 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-->
|
||||
- [acpiasl](https://github.com/martinlroth/vim-acpi-asl) (syntax)
|
||||
- [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)
|
||||
- [arduino](https://github.com/sudar/vim-arduino-syntax) (syntax, indent)
|
||||
- [asciidoc](https://github.com/asciidoc/vim-asciidoc) (syntax)
|
||||
- [autohotkey](https://github.com/hnamikaw/vim-autohotkey) (indent)
|
||||
- [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/c++](https://github.com/vim-jp/vim-cpp) (syntax)
|
||||
- [caddyfile](https://github.com/isobit/vim-caddyfile) (syntax, indent, ftplugin)
|
||||
@@ -68,47 +69,48 @@ If you need full functionality of any plugin, please use it directly with your p
|
||||
- [cucumber](https://github.com/tpope/vim-cucumber) (syntax, indent, compiler, ftplugin)
|
||||
- [cue](https://github.com/mgrabovsky/vim-cuesheet) (syntax)
|
||||
- [dart](https://github.com/dart-lang/dart-vim-plugin) (syntax, indent, autoload, ftplugin)
|
||||
- [dhall](https://github.com/vmchale/dhall-vim) (syntax, ftplugin)
|
||||
- [dlang](https://github.com/JesseKPhillips/d.vim) (syntax, indent)
|
||||
- [dockerfile](https://github.com/ekalinin/Dockerfile.vim) (syntax, indent, 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)
|
||||
- [emblem](https://github.com/yalesov/vim-emblem) (syntax, indent, ftplugin)
|
||||
- [erlang](https://github.com/vim-erlang/vim-erlang-runtime) (syntax, indent)
|
||||
- [ferm](https://github.com/vim-scripts/ferm.vim) (syntax)
|
||||
- [fish](https://github.com/dag/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)
|
||||
- [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)
|
||||
- [glsl](https://github.com/tikhomirov/vim-glsl) (syntax, indent)
|
||||
- [gmpl](https://github.com/maelvalais/gmpl.vim) (syntax)
|
||||
- [gnuplot](https://github.com/vim-scripts/gnuplot-syntax-highlighting) (syntax)
|
||||
- [go](https://github.com/fatih/vim-go) (syntax, compiler, indent)
|
||||
- [gradle](https://github.com/tfnico/vim-gradle) (compiler)
|
||||
- [groovy-indent](https://github.com/vim-scripts/groovyindent-unix) (indent)
|
||||
- [groovy](https://github.com/vim-scripts/groovy.vim) (syntax)
|
||||
- [graphql](https://github.com/jparise/vim-graphql) (syntax, indent, autoload, ftplugin, after)
|
||||
- [haml](https://github.com/sheerun/vim-haml) (syntax, indent, compiler, ftplugin)
|
||||
- [handlebars](https://github.com/mustache/vim-mustache-handlebars) (syntax, indent, ftplugin)
|
||||
- [haproxy](https://github.com/CH-DanReif/haproxy.vim) (syntax)
|
||||
- [haskell](https://github.com/neovimhaskell/haskell-vim) (syntax, indent, ftplugin)
|
||||
- [haxe](https://github.com/yaymukund/vim-haxe) (syntax)
|
||||
- [hcl](https://github.com/b4b4r07/vim-hcl) (syntax, indent, ftplugin)
|
||||
- [helm](https://github.com/towolf/vim-helm) (syntax)
|
||||
- [hive](https://github.com/zebradil/hive.vim) (syntax, ftplugin)
|
||||
- [html5](https://github.com/othree/html5.vim) (syntax, indent, autoload, ftplugin)
|
||||
- [i3](https://github.com/mboughaba/i3config.vim) (syntax, ftplugin)
|
||||
- [idris](https://github.com/idris-hackers/idris-vim) (syntax, indent, 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)
|
||||
- [jenkins](https://github.com/martinda/Jenkinsfile-vim-syntax) (syntax, indent)
|
||||
- [jinja](https://github.com/lepture/vim-jinja) (syntax, indent)
|
||||
- [json5](https://github.com/GutenYe/json5.vim) (syntax)
|
||||
- [json](https://github.com/elzr/vim-json) (syntax, indent, ftplugin)
|
||||
- [jst](https://github.com/briancollins/vim-jst) (syntax, indent)
|
||||
- [jsx](https://github.com/MaxMEllon/vim-jsx-pretty) (autoload, syntax, indent, ftplugin)
|
||||
- [jsx](https://github.com/MaxMEllon/vim-jsx-pretty) (autoload, after)
|
||||
- [julia](https://github.com/JuliaEditorSupport/julia-vim) (syntax, indent, autoload, ftplugin)
|
||||
- [kotlin](https://github.com/udalov/kotlin-vim) (syntax, indent, ftplugin)
|
||||
- [latex](https://github.com/LaTeX-Box-Team/LaTeX-Box) (syntax, indent, ftplugin)
|
||||
- [latex](https://github.com/lervag/vimtex) (indent, compiler, autoload, ftplugin, syntax)
|
||||
- [less](https://github.com/groenewege/vim-less) (syntax, indent, ftplugin)
|
||||
- [lilypond](https://github.com/anowlcalledjosh/vim-lilypond) (syntax, indent, compiler, ftplugin)
|
||||
- [livescript](https://github.com/gkz/vim-ls) (syntax, indent, compiler, ftplugin)
|
||||
@@ -116,7 +118,7 @@ If you need full functionality of any plugin, please use it directly with your p
|
||||
- [log](https://github.com/MTDL9/vim-log-highlighting) (syntax)
|
||||
- [lua](https://github.com/tbastos/vim-lua) (syntax, indent)
|
||||
- [mako](https://github.com/sophacles/vim-bundle-mako) (syntax, indent, ftplugin)
|
||||
- [markdown](https://github.com/plasticboy/vim-markdown) (syntax, indent)
|
||||
- [markdown](https://github.com/plasticboy/vim-markdown) (syntax, indent, ftplugin)
|
||||
- [mathematica](https://github.com/voldikss/vim-mma) (syntax, ftplugin)
|
||||
- [mdx](https://github.com/jxnblk/vim-mdx-js) (syntax)
|
||||
- [meson](https://github.com/mesonbuild/meson) (syntax, indent, ftplugin)
|
||||
@@ -126,58 +128,59 @@ If you need full functionality of any plugin, please use it directly with your p
|
||||
- [nix](https://github.com/LnL7/vim-nix) (syntax, indent, compiler, ftplugin)
|
||||
- [objc](https://github.com/b4winckler/vim-objc) (ftplugin, syntax, indent)
|
||||
- [ocaml](https://github.com/rgrinberg/vim-ocaml) (syntax, indent, compiler, ftplugin)
|
||||
- [octave](https://github.com/vim-scripts/octave.vim--) (syntax)
|
||||
- [octave](https://github.com/McSinyx/vim-octave) (syntax, indent)
|
||||
- [opencl](https://github.com/petRUShka/vim-opencl) (syntax, indent, ftplugin)
|
||||
- [perl](https://github.com/vim-perl/vim-perl) (syntax, indent, ftplugin)
|
||||
- [pgsql](https://github.com/lifepillar/pgsql.vim) (syntax, indent)
|
||||
- [php](https://github.com/StanAngeloff/php.vim) (syntax)
|
||||
- [plantuml](https://github.com/aklt/plantuml-syntax) (syntax, indent, 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)
|
||||
- [pug](https://github.com/digitaltoad/vim-pug) (syntax, indent, ftplugin)
|
||||
- [puppet](https://github.com/voxpupuli/vim-puppet) (syntax, indent, ftplugin)
|
||||
- [puppet](https://github.com/rodjek/vim-puppet) (syntax, indent, autoload, ftplugin, ctags)
|
||||
- [purescript](https://github.com/purescript-contrib/purescript-vim) (syntax, indent, ftplugin)
|
||||
- [python-compiler](https://github.com/aliev/vim-compiler-python) (compiler, autoload)
|
||||
- [python-indent](https://github.com/Vimjas/vim-python-pep8-indent) (indent)
|
||||
- [python](https://github.com/vim-python/python-syntax) (syntax)
|
||||
- [qmake](https://github.com/artoj/qmake-syntax-vim) (syntax)
|
||||
- [qml](https://github.com/peterhoeg/vim-qml) (syntax, indent, ftplugin)
|
||||
- [r-lang](https://github.com/vim-scripts/R.vim) (syntax, ftplugin)
|
||||
- [r-lang](https://github.com/vim-scripts/R.vim) (syntax)
|
||||
- [racket](https://github.com/wlangstroth/vim-racket) (syntax, indent, ftplugin)
|
||||
- [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)
|
||||
- [razor](https://github.com/adamclerk/vim-razor) (syntax, indent, ftplugin)
|
||||
- [reason](https://github.com/reasonml-editor/vim-reason-plus) (syntax, indent)
|
||||
- [rego](https://github.com/tsandall/vim-rego) (syntax)
|
||||
- [rspec](https://github.com/sheerun/rspec.vim) (syntax)
|
||||
- [rst](https://github.com/marshallward/vim-restructuredtext) (syntax, autoload, ftplugin)
|
||||
- [rspec](https://github.com/keith/rspec.vim) (syntax)
|
||||
- [rst](https://github.com/marshallward/vim-restructuredtext) (syntax, indent, 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)
|
||||
- [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)
|
||||
- [slim](https://github.com/slim-template/vim-slim) (syntax, indent, ftplugin)
|
||||
- [slime](https://github.com/slime-lang/vim-slime-syntax) (syntax, indent)
|
||||
- [smt2](https://github.com/bohlender/vim-smt2) (syntax, autoload, ftplugin)
|
||||
- [solidity](https://github.com/tomlion/vim-solidity) (syntax, indent, ftplugin)
|
||||
- [styled-components](https://github.com/styled-components/vim-styled-components#main) (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](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)
|
||||
- [systemd](https://github.com/wgwoods/vim-systemd-syntax) (syntax)
|
||||
- [systemd](https://github.com/wgwoods/vim-systemd-syntax) (syntax, ftplugin)
|
||||
- [terraform](https://github.com/hashivim/vim-terraform) (syntax, indent, autoload, ftplugin)
|
||||
- [textile](https://github.com/timcharper/textile.vim) (syntax, ftplugin)
|
||||
- [thrift](https://github.com/solarnz/thrift.vim) (syntax)
|
||||
- [tmux](https://github.com/ericpruitt/tmux.vim) ()
|
||||
- [tmux](https://github.com/ericpruitt/tmux.vim) (syntax, ftplugin)
|
||||
- [tomdoc](https://github.com/wellbredgrapefruit/tomdoc.vim) (syntax)
|
||||
- [toml](https://github.com/cespare/vim-toml) (syntax, ftplugin)
|
||||
- [tptp](https://github.com/c-cube/vim-tptp) (syntax)
|
||||
- [twig](https://github.com/lumiliet/vim-twig) (syntax, indent, ftplugin)
|
||||
- [typescript](https://github.com/leafgarland/typescript-vim) (syntax, indent, compiler, ftplugin)
|
||||
- [vala](https://github.com/arrufat/vala.vim) (syntax, indent)
|
||||
- [typescript](https://github.com/HerringtonDarkholme/yats.vim) (syntax, indent, compiler, ftplugin, ctags)
|
||||
- [v](https://github.com/ollykel/v-vim) (syntax, indent, ftplugin)
|
||||
- [vala](https://github.com/arrufat/vala.vim) (syntax, indent, ftplugin)
|
||||
- [vbnet](https://github.com/vim-scripts/vbnet.vim) (syntax)
|
||||
- [vcl](https://github.com/smerrill/vcl-vim-plugin) (syntax)
|
||||
- [vifm](https://github.com/vifm/vifm.vim) (syntax, autoload, ftplugin)
|
||||
@@ -190,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)
|
||||
- [zephir](https://github.com/xwsoul/vim-zephir) (syntax)
|
||||
- [zig](https://github.com/ziglang/zig.vim) (syntax, autoload, ftplugin)
|
||||
- [zinit](https://github.com/zinit-zsh/zplugin-vim-syntax) (syntax)
|
||||
<!--/Language Packs-->
|
||||
|
||||
## Updating
|
||||
@@ -203,7 +207,7 @@ Please make sure you have `syntax on` in your `.vimrc`, otherwise syntax files a
|
||||
Individual language packs can be disabled by setting `g:polyglot_disabled` as follows:
|
||||
|
||||
```viml
|
||||
" ~/.vimrc
|
||||
" ~/.vimrc, declare this variable before polyglot is loaded
|
||||
let g:polyglot_disabled = ['css']
|
||||
```
|
||||
|
||||
|
||||
@@ -1,6 +0,0 @@
|
||||
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'rspec') == -1
|
||||
|
||||
autocmd BufReadPost,BufNewFile *_spec.rb set syntax=rspec
|
||||
autocmd BufReadPost,BufNewFile *_spec.rb setlocal commentstring=#\ %s
|
||||
|
||||
endif
|
||||
@@ -1,7 +1,7 @@
|
||||
if exists('g:polyglot_disabled') && index(g:polyglot_disabled, 'haskell') != -1
|
||||
finish
|
||||
endif
|
||||
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'haskell') == -1
|
||||
|
||||
setlocal comments=s1fl:{-,mb:-,ex:-},:--
|
||||
setlocal iskeyword+=-,.,*
|
||||
setlocal commentstring=--\ %s
|
||||
|
||||
endif
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
if exists('g:polyglot_disabled') && index(g:polyglot_disabled, 'cjsx') != -1
|
||||
finish
|
||||
endif
|
||||
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'cjsx') == -1
|
||||
|
||||
if exists("loaded_matchit")
|
||||
let b:match_ignorecase = 0
|
||||
let b:match_words = '(:),\[:\],{:},<:>,' .
|
||||
\ '<\@<=\([^/][^ \t>]*\)[^>]*\%(>\|$\):<\@<=/\1>'
|
||||
endif
|
||||
|
||||
endif
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
if exists('g:polyglot_disabled') && index(g:polyglot_disabled, 'haskell') != -1
|
||||
finish
|
||||
endif
|
||||
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'haskell') == -1
|
||||
|
||||
setlocal comments=s1fl:{-,mb:\ \ ,ex:-},:--
|
||||
setlocal iskeyword+='
|
||||
|
||||
endif
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
if exists('g:polyglot_disabled') && index(g:polyglot_disabled, 'idris') != -1
|
||||
finish
|
||||
endif
|
||||
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'idris') == -1
|
||||
|
||||
setlocal iskeyword+='
|
||||
|
||||
endif
|
||||
|
||||
@@ -1,6 +1,4 @@
|
||||
if exists('g:polyglot_disabled') && index(g:polyglot_disabled, 'javascript') != -1
|
||||
finish
|
||||
endif
|
||||
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'javascript') == -1
|
||||
|
||||
" Vim filetype plugin file
|
||||
" Language: JavaScript
|
||||
@@ -14,9 +12,9 @@ if exists('b:undo_ftplugin')
|
||||
else
|
||||
let b:undo_ftplugin = 'setlocal iskeyword< suffixesadd<'
|
||||
endif
|
||||
if exists('g:polyglot_disabled') && index(g:polyglot_disabled, 'jsx') != -1
|
||||
finish
|
||||
|
||||
endif
|
||||
if !exists('g:polyglot_disabled') || !(index(g:polyglot_disabled, 'typescript') != -1 || index(g:polyglot_disabled, 'typescript') != -1 || index(g:polyglot_disabled, 'jsx') != -1)
|
||||
|
||||
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
|
||||
" Vim ftplugin file
|
||||
@@ -41,48 +39,13 @@ if exists("loaded_matchup")
|
||||
let b:match_skip = 's:comment\|string'
|
||||
endif
|
||||
|
||||
let b:original_commentstring = &l:commentstring
|
||||
let b:jsx_pretty_old_cms = &l:commentstring
|
||||
|
||||
augroup jsx_comment
|
||||
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
|
||||
|
||||
setlocal suffixesadd+=.jsx
|
||||
if exists('g:polyglot_disabled') && index(g:polyglot_disabled, 'styled-components') != -1
|
||||
finish
|
||||
endif
|
||||
|
||||
" Vim filetype plugin file
|
||||
" Language: styled-components (js/ts)
|
||||
" Maintainer: Karl Fleischmann <fleischmann.karl@gmail.com>
|
||||
" URL: https://github.com/styled-components/vim-styled-components
|
||||
|
||||
fu! s:GetSyntaxNames(lnum, cnum)
|
||||
return map(synstack(a:lnum, a:cnum), 'synIDattr(v:val, "name")')
|
||||
endfu
|
||||
|
||||
" re-implement SynSOL of vim-jsx
|
||||
fu! s:SynSOL(lnum)
|
||||
return s:GetSyntaxNames(a:lnum, 1)
|
||||
endfu
|
||||
|
||||
"" Return whether the current line is a jsTemplateString
|
||||
fu! IsStyledDefinition(lnum)
|
||||
" iterate through all syntax items in the given line
|
||||
for item in s:SynSOL(a:lnum)
|
||||
" if syntax-item is a jsTemplateString return 1 - true
|
||||
" `==#` is a match case comparison of the item
|
||||
if item ==# 'styledDefinition'
|
||||
return 1
|
||||
endif
|
||||
endfor
|
||||
|
||||
" fallback to 0 - false
|
||||
return 0
|
||||
endfu
|
||||
|
||||
if exists('&ofu')
|
||||
let b:prevofu=&ofu
|
||||
setl omnifunc=styledcomplete#CompleteSC
|
||||
|
||||
endif
|
||||
|
||||
5
after/ftplugin/javascriptreact.vim
Normal file
5
after/ftplugin/javascriptreact.vim
Normal file
@@ -0,0 +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)
|
||||
|
||||
source <sfile>:h/javascript.vim
|
||||
|
||||
endif
|
||||
@@ -1,6 +1,4 @@
|
||||
if exists('g:polyglot_disabled') && index(g:polyglot_disabled, 'llvm') != -1
|
||||
finish
|
||||
endif
|
||||
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'llvm') == -1
|
||||
|
||||
" Copyright (c) 2018 rhysd
|
||||
"
|
||||
@@ -59,7 +57,7 @@ function! s:is_section_delim(line, func_delim) abort
|
||||
return 0
|
||||
endif
|
||||
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
|
||||
|
||||
function! s:next_section(stop_func_begin) abort
|
||||
@@ -87,11 +85,16 @@ function! s:prev_section(stop_func_begin) abort
|
||||
endwhile
|
||||
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
|
||||
nnoremap <buffer><silent>]] :<C-u>call <SID>next_section(1)<CR>
|
||||
nnoremap <buffer><silent>[[ :<C-u>call <SID>prev_section(1)<CR>
|
||||
nnoremap <buffer><silent>][ :<C-u>call <SID>next_section(0)<CR>
|
||||
nnoremap <buffer><silent>[] :<C-u>call <SID>prev_section(0)<CR>
|
||||
nmap <buffer><silent>]] <Plug>(llvm-next-section-begin)
|
||||
nmap <buffer><silent>[[ <Plug>(llvm-prev-section-begin)
|
||||
nmap <buffer><silent>][ <Plug>(llvm-next-section-end)
|
||||
nmap <buffer><silent>[] <Plug>(llvm-prev-section-end)
|
||||
endif
|
||||
|
||||
function! s:function_range_at(linum) abort
|
||||
@@ -224,9 +227,12 @@ function! s:move_to_following_block() abort
|
||||
endtry
|
||||
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
|
||||
nnoremap <buffer><silent>[b :<C-u>call <SID>move_to_pred_block()<CR>
|
||||
nnoremap <buffer><silent>]b :<C-u>call <SID>move_to_following_block()<CR>
|
||||
nmap <buffer><silent>[b <Plug>(llvm-move-block-prev)
|
||||
nmap <buffer><silent>]b <Plug>(llvm-move-block-next)
|
||||
endif
|
||||
|
||||
function! s:get_func_identifiers(line) abort
|
||||
@@ -440,8 +446,10 @@ function! s:goto_definition() abort
|
||||
echom "No definition for '" . ident . "' found"
|
||||
endfunction
|
||||
|
||||
nnoremap <buffer><Plug>(llvm-goto-definition) :<C-u>call <SID>goto_definition()<CR>
|
||||
|
||||
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
|
||||
|
||||
function! s:run_lli(...) abort
|
||||
@@ -475,3 +483,5 @@ endfunction
|
||||
if !exists(':LLI')
|
||||
command! -buffer -nargs=? -bar -complete=file LLI call <SID>run_lli(<f-args>)
|
||||
endif
|
||||
|
||||
endif
|
||||
|
||||
@@ -1,20 +1,11 @@
|
||||
if exists('g:polyglot_disabled') && index(g:polyglot_disabled, 'puppet') != -1
|
||||
finish
|
||||
endif
|
||||
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'puppet') == -1
|
||||
|
||||
if !exists('g:puppet_align_hashes')
|
||||
let g:puppet_align_hashes = 1
|
||||
endif
|
||||
|
||||
if g:puppet_align_hashes && exists(':Tabularize')
|
||||
inoremap <buffer> <silent> > ><Esc>:call <SID>puppetalign()<CR>a
|
||||
function! s:puppetalign()
|
||||
let p = '^\s*\w+\s*[=+]>.*$'
|
||||
let column = strlen(substitute(getline('.')[0:col('.')],'\([^=]\|=[^>]\)','','g'))
|
||||
let position = strlen(matchstr(getline('.')[0:col('.')],'.*=>\s*\zs.*'))
|
||||
Tabularize /=>/l1
|
||||
normal! 0
|
||||
echo repeat('\([^=]\|=[^>]\)*=>',column).'\s\{-\}'.repeat('.',position)
|
||||
call search(repeat('\([^=]\|=[^>]\)*=>',column).'\s\{-\}'.repeat('.',position),'ce',line('.'))
|
||||
endfunction
|
||||
if g:puppet_align_hashes
|
||||
inoremap <buffer> <silent> => =><Esc>:call puppet#align#AlignHashrockets()<CR>$a
|
||||
endif
|
||||
|
||||
endif
|
||||
|
||||
20
after/ftplugin/tex.vim
Normal file
20
after/ftplugin/tex.vim
Normal file
@@ -0,0 +1,20 @@
|
||||
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'latex') == -1
|
||||
|
||||
" vimtex - LaTeX plugin for Vim
|
||||
"
|
||||
" Maintainer: Karl Yngve Lervåg
|
||||
" Email: karl.yngve@gmail.com
|
||||
"
|
||||
|
||||
if !get(g:, 'vimtex_enabled', 1)
|
||||
finish
|
||||
endif
|
||||
|
||||
if exists('b:did_ftplugin_vimtex')
|
||||
finish
|
||||
endif
|
||||
let b:did_ftplugin_vimtex = 1
|
||||
|
||||
call vimtex#check_plugin_clash()
|
||||
|
||||
endif
|
||||
@@ -1,9 +1,12 @@
|
||||
if exists('g:polyglot_disabled') && index(g:polyglot_disabled, 'jsx') != -1
|
||||
finish
|
||||
endif
|
||||
if !exists('g:polyglot_disabled') || !(index(g:polyglot_disabled, 'typescript') != -1 || index(g:polyglot_disabled, 'typescript') != -1 || index(g:polyglot_disabled, 'jsx') != -1)
|
||||
|
||||
" modified from html.vim
|
||||
" For matchit plugin
|
||||
|
||||
if get(g:, 'vim_jsx_pretty_disable_tsx', 0)
|
||||
finish
|
||||
endif
|
||||
|
||||
if exists("loaded_matchit")
|
||||
let b:match_ignorecase = 0
|
||||
let b:match_words = '(:),\[:\],{:},<:>,' .
|
||||
@@ -17,11 +20,13 @@ if exists("loaded_matchup")
|
||||
let b:match_skip = 's:comment\|string'
|
||||
endif
|
||||
|
||||
let b:original_commentstring = &l:commentstring
|
||||
let b:jsx_pretty_old_cms = &l:commentstring
|
||||
|
||||
augroup jsx_comment
|
||||
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
|
||||
|
||||
setlocal suffixesadd+=.tsx
|
||||
|
||||
endif
|
||||
5
after/ftplugin/typescriptreact.vim
Normal file
5
after/ftplugin/typescriptreact.vim
Normal file
@@ -0,0 +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)
|
||||
|
||||
source <sfile>:h/tsx.vim
|
||||
|
||||
endif
|
||||
@@ -1,6 +1,4 @@
|
||||
if exists('g:polyglot_disabled') && index(g:polyglot_disabled, 'yaml') != -1
|
||||
finish
|
||||
endif
|
||||
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'yaml') == -1
|
||||
|
||||
" Vim indent file
|
||||
" Language: Yaml
|
||||
@@ -9,3 +7,5 @@ endif
|
||||
" URL: https://github.com/hjpbarcelos
|
||||
setlocal autoindent sw=2 ts=2 expandtab
|
||||
" vim:set sw=2:
|
||||
|
||||
endif
|
||||
|
||||
@@ -1,6 +1,4 @@
|
||||
if exists('g:polyglot_disabled') && index(g:polyglot_disabled, 'jsx') != -1
|
||||
finish
|
||||
endif
|
||||
if !exists('g:polyglot_disabled') || !(index(g:polyglot_disabled, 'typescript') != -1 || index(g:polyglot_disabled, 'typescript') != -1 || index(g:polyglot_disabled, 'jsx') != -1)
|
||||
|
||||
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
|
||||
" Vim indent file
|
||||
@@ -23,7 +21,7 @@ if exists('s:did_indent')
|
||||
endif
|
||||
|
||||
setlocal indentexpr=GetJsxIndent()
|
||||
setlocal indentkeys=0{,0},0),0],0\,,!^F,o,O,e,*<Return>,<>>,<<>,/
|
||||
setlocal indentkeys=0.,0{,0},0),0],0?,0\*,0\,,!^F,:,<:>,o,O,e,<>>,=*/
|
||||
|
||||
function! GetJsxIndent()
|
||||
return jsx_pretty#indent#get(function('GetJavascriptIndent'))
|
||||
@@ -31,176 +29,5 @@ endfunction
|
||||
|
||||
let &cpo = s:keepcpo
|
||||
unlet s:keepcpo
|
||||
if exists('g:polyglot_disabled') && index(g:polyglot_disabled, 'styled-components') != -1
|
||||
finish
|
||||
|
||||
endif
|
||||
|
||||
" Vim syntax file
|
||||
" Language: styled-components (js/ts)
|
||||
" Maintainer: Karl Fleischmann <fleischmann.karl@gmail.com>
|
||||
" URL: https://github.com/styled-components/vim-styled-components
|
||||
|
||||
" initialize variable to check, if the indentation expression is run
|
||||
" multiple times in a row, which indicates an infinite recursion
|
||||
let s:is_recursion = 0
|
||||
|
||||
" store current indentexpr for later
|
||||
let b:js_ts_indent=&indentexpr
|
||||
|
||||
" set indentexpr for this filetype (styled-components)
|
||||
setlocal indentexpr=GetStyledIndent()
|
||||
|
||||
" add the following keys to trigger reindenting, when in insert mode
|
||||
" - *; - Indent and insert on press of ';' key.
|
||||
" - *<:> - Indent and insert on press of ':' key.
|
||||
set indentkeys+=*;,*<:>,*<Return>
|
||||
|
||||
fu! s:GetSyntaxNames(lnum, cnum)
|
||||
return map(synstack(a:lnum, a:cnum), 'synIDattr(v:val, "name")')
|
||||
endfu
|
||||
|
||||
" re-implement SynSOL of vim-jsx
|
||||
" TODO: add dependency to the readme and remove duplicate implementation
|
||||
fu! s:SynSOL(lnum)
|
||||
return s:GetSyntaxNames(a:lnum, 1)
|
||||
endfu
|
||||
|
||||
" re-implement SynEOL of vim-jsx
|
||||
" TODO: add dependency to the readme and remove duplicate implementation
|
||||
fu! s:SynEOL(lnum, offset)
|
||||
let l:lnum = prevnonblank(a:lnum)
|
||||
let l:col = strlen(getline(l:lnum))
|
||||
|
||||
return s:GetSyntaxNames(l:lnum, l:col + a:offset)
|
||||
endfu
|
||||
|
||||
|
||||
"" Return whether the current line is a jsTemplateString
|
||||
fu! s:IsStyledDefinition(lnum)
|
||||
" iterate through all syntax items in the given line
|
||||
for item in s:SynSOL(a:lnum)
|
||||
" if syntax-item is a jsTemplateString return 1 - true
|
||||
" `==#` is a match case comparison of the item
|
||||
if item ==# 'styledDefinition'
|
||||
return 1
|
||||
endif
|
||||
endfor
|
||||
|
||||
" fallback to 0 - false
|
||||
return 0
|
||||
endfu
|
||||
|
||||
"" Count occurences of `str` at the beginning of the given `lnum` line
|
||||
fu! s:CountOccurencesInSOL(lnum, str)
|
||||
let l:occurence = 0
|
||||
|
||||
" iterate through all items in the given line
|
||||
for item in s:SynSOL(a:lnum)
|
||||
" if the syntax-item equals the given str increment the counter
|
||||
" `==?` is a case isensitive equal operation
|
||||
if item ==? a:str
|
||||
let l:occurence += 1
|
||||
endif
|
||||
endfor
|
||||
|
||||
" return the accumulated count of occurences
|
||||
return l:occurence
|
||||
endfu
|
||||
|
||||
"" Count occurences of `str` at the end of the given `lnum` line
|
||||
fu! s:CountOccurencesInEOL(lnum, str, offset)
|
||||
let l:occurence = 0
|
||||
|
||||
" iterate through all items in the given line
|
||||
for item in s:SynEOL(a:lnum, a:offset)
|
||||
" if the syntax-item equals the given str increment the counter
|
||||
" `==?` is a case insensitive equal operation
|
||||
if item == a:str
|
||||
let l:occurence += 1
|
||||
endif
|
||||
endfor
|
||||
|
||||
" return the accumulated count of occurences
|
||||
return l:occurence
|
||||
endfu
|
||||
|
||||
"" Get the indentation of the current line
|
||||
fu! GetStyledIndent()
|
||||
if s:IsStyledDefinition(v:lnum)
|
||||
let l:baseIndent = 0
|
||||
|
||||
" find last non-styled line
|
||||
let l:cnum = v:lnum
|
||||
while s:IsStyledDefinition(l:cnum)
|
||||
let l:cnum -= 1
|
||||
endwhile
|
||||
|
||||
" get indentation of the last non-styled line as base indentation
|
||||
let l:baseIndent = indent(l:cnum)
|
||||
|
||||
" incrementally build indentation based on current indentation
|
||||
" - one shiftwidth for the styled definition region
|
||||
" - one shiftwidth per open nested definition region
|
||||
let l:styledIndent = &sw
|
||||
let l:styledIndent += min([
|
||||
\ s:CountOccurencesInSOL(v:lnum, 'styledNestedRegion'),
|
||||
\ s:CountOccurencesInEOL(v:lnum, 'styledNestedRegion', 0)
|
||||
\ ]) * &sw
|
||||
|
||||
" decrease indentation by one shiftwidth, if the styled definition
|
||||
" region ends on the current line
|
||||
" - either directly via styled definition region, or
|
||||
" - if the very last
|
||||
if s:CountOccurencesInEOL(v:lnum, 'styledDefinition', 1) == 0
|
||||
let l:styledIndent -= &sw
|
||||
endif
|
||||
|
||||
" return the base indentation
|
||||
" (for nested styles inside classes/objects/etc.) plus the actual
|
||||
" indentation inside the styled definition region
|
||||
return l:baseIndent + l:styledIndent
|
||||
elseif len(b:js_ts_indent)
|
||||
let l:result = 0
|
||||
let l:offset = 0
|
||||
|
||||
" increase indentation by one shiftwidth, if the last line ended on a
|
||||
" styledXmlRegion and this line does not continue with it
|
||||
" this is a fix for an incorrectly indented xml prop after a
|
||||
" glamor-styled styledXmlRegion
|
||||
if s:CountOccurencesInEOL(v:lnum-1, 'styledXmlRegion', 0) == 1 &&
|
||||
\ s:CountOccurencesInSOL(v:lnum, 'styledXmlRegion') == 0
|
||||
let l:offset = &sw
|
||||
endif
|
||||
|
||||
" make sure `GetStyledIndent` and `GetJsxIndent` don't infinitely
|
||||
" recurse by incrementing a counter variable, before evaluating the
|
||||
" stored indent expression
|
||||
if s:is_recursion == 0
|
||||
let s:is_recursion = 1
|
||||
let l:result = eval(b:js_ts_indent)
|
||||
endif
|
||||
|
||||
" `is_recursion` being 0 at this point indicates, that
|
||||
" `eval(b:js_ts_indent)` did itself evaluate it's stored indentexpr
|
||||
" and thus it can be assumed, that the current line should be
|
||||
" indented as JS
|
||||
if s:is_recursion == 0
|
||||
" use one of `GetJavascriptIndent` or `GetJsIndent` if existing
|
||||
" fallback to cindent, if not
|
||||
if exists('*GetJavascriptIndent')
|
||||
let l:result = GetJavascriptIndent()
|
||||
elseif exists('*GetJsIndent')
|
||||
let l:result = GetJsIndent()
|
||||
else
|
||||
let l:result = cindent(v:lnum)
|
||||
endif
|
||||
endif
|
||||
|
||||
" reset `is_recursion` counter and return the indentation value
|
||||
let s:is_recursion = 0
|
||||
return l:result + l:offset
|
||||
endif
|
||||
|
||||
" if all else fails indent according to C-syntax
|
||||
return cindent(v:lnum)
|
||||
endfu
|
||||
|
||||
5
after/indent/javascriptreact.vim
Normal file
5
after/indent/javascriptreact.vim
Normal file
@@ -0,0 +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)
|
||||
|
||||
source <sfile>:h/javascript.vim
|
||||
|
||||
endif
|
||||
@@ -1,173 +0,0 @@
|
||||
if exists('g:polyglot_disabled') && index(g:polyglot_disabled, 'styled-components') != -1
|
||||
finish
|
||||
endif
|
||||
|
||||
" Vim syntax file
|
||||
" Language: styled-components (js/ts)
|
||||
" Maintainer: Karl Fleischmann <fleischmann.karl@gmail.com>
|
||||
" URL: https://github.com/styled-components/vim-styled-components
|
||||
|
||||
" initialize variable to check, if the indentation expression is run
|
||||
" multiple times in a row, which indicates an infinite recursion
|
||||
let s:is_recursion = 0
|
||||
|
||||
" store current indentexpr for later
|
||||
let b:js_ts_indent=&indentexpr
|
||||
|
||||
" set indentexpr for this filetype (styled-components)
|
||||
setlocal indentexpr=GetStyledIndent()
|
||||
|
||||
" add the following keys to trigger reindenting, when in insert mode
|
||||
" - *; - Indent and insert on press of ';' key.
|
||||
" - *<:> - Indent and insert on press of ':' key.
|
||||
set indentkeys+=*;,*<:>,*<Return>
|
||||
|
||||
fu! s:GetSyntaxNames(lnum, cnum)
|
||||
return map(synstack(a:lnum, a:cnum), 'synIDattr(v:val, "name")')
|
||||
endfu
|
||||
|
||||
" re-implement SynSOL of vim-jsx
|
||||
" TODO: add dependency to the readme and remove duplicate implementation
|
||||
fu! s:SynSOL(lnum)
|
||||
return s:GetSyntaxNames(a:lnum, 1)
|
||||
endfu
|
||||
|
||||
" re-implement SynEOL of vim-jsx
|
||||
" TODO: add dependency to the readme and remove duplicate implementation
|
||||
fu! s:SynEOL(lnum, offset)
|
||||
let l:lnum = prevnonblank(a:lnum)
|
||||
let l:col = strlen(getline(l:lnum))
|
||||
|
||||
return s:GetSyntaxNames(l:lnum, l:col + a:offset)
|
||||
endfu
|
||||
|
||||
|
||||
"" Return whether the current line is a jsTemplateString
|
||||
fu! s:IsStyledDefinition(lnum)
|
||||
" iterate through all syntax items in the given line
|
||||
for item in s:SynSOL(a:lnum)
|
||||
" if syntax-item is a jsTemplateString return 1 - true
|
||||
" `==#` is a match case comparison of the item
|
||||
if item ==# 'styledDefinition'
|
||||
return 1
|
||||
endif
|
||||
endfor
|
||||
|
||||
" fallback to 0 - false
|
||||
return 0
|
||||
endfu
|
||||
|
||||
"" Count occurences of `str` at the beginning of the given `lnum` line
|
||||
fu! s:CountOccurencesInSOL(lnum, str)
|
||||
let l:occurence = 0
|
||||
|
||||
" iterate through all items in the given line
|
||||
for item in s:SynSOL(a:lnum)
|
||||
" if the syntax-item equals the given str increment the counter
|
||||
" `==?` is a case isensitive equal operation
|
||||
if item ==? a:str
|
||||
let l:occurence += 1
|
||||
endif
|
||||
endfor
|
||||
|
||||
" return the accumulated count of occurences
|
||||
return l:occurence
|
||||
endfu
|
||||
|
||||
"" Count occurences of `str` at the end of the given `lnum` line
|
||||
fu! s:CountOccurencesInEOL(lnum, str, offset)
|
||||
let l:occurence = 0
|
||||
|
||||
" iterate through all items in the given line
|
||||
for item in s:SynEOL(a:lnum, a:offset)
|
||||
" if the syntax-item equals the given str increment the counter
|
||||
" `==?` is a case insensitive equal operation
|
||||
if item == a:str
|
||||
let l:occurence += 1
|
||||
endif
|
||||
endfor
|
||||
|
||||
" return the accumulated count of occurences
|
||||
return l:occurence
|
||||
endfu
|
||||
|
||||
"" Get the indentation of the current line
|
||||
fu! GetStyledIndent()
|
||||
if s:IsStyledDefinition(v:lnum)
|
||||
let l:baseIndent = 0
|
||||
|
||||
" find last non-styled line
|
||||
let l:cnum = v:lnum
|
||||
while s:IsStyledDefinition(l:cnum)
|
||||
let l:cnum -= 1
|
||||
endwhile
|
||||
|
||||
" get indentation of the last non-styled line as base indentation
|
||||
let l:baseIndent = indent(l:cnum)
|
||||
|
||||
" incrementally build indentation based on current indentation
|
||||
" - one shiftwidth for the styled definition region
|
||||
" - one shiftwidth per open nested definition region
|
||||
let l:styledIndent = &sw
|
||||
let l:styledIndent += min([
|
||||
\ s:CountOccurencesInSOL(v:lnum, 'styledNestedRegion'),
|
||||
\ s:CountOccurencesInEOL(v:lnum, 'styledNestedRegion', 0)
|
||||
\ ]) * &sw
|
||||
|
||||
" decrease indentation by one shiftwidth, if the styled definition
|
||||
" region ends on the current line
|
||||
" - either directly via styled definition region, or
|
||||
" - if the very last
|
||||
if s:CountOccurencesInEOL(v:lnum, 'styledDefinition', 1) == 0
|
||||
let l:styledIndent -= &sw
|
||||
endif
|
||||
|
||||
" return the base indentation
|
||||
" (for nested styles inside classes/objects/etc.) plus the actual
|
||||
" indentation inside the styled definition region
|
||||
return l:baseIndent + l:styledIndent
|
||||
elseif len(b:js_ts_indent)
|
||||
let l:result = 0
|
||||
let l:offset = 0
|
||||
|
||||
" increase indentation by one shiftwidth, if the last line ended on a
|
||||
" styledXmlRegion and this line does not continue with it
|
||||
" this is a fix for an incorrectly indented xml prop after a
|
||||
" glamor-styled styledXmlRegion
|
||||
if s:CountOccurencesInEOL(v:lnum-1, 'styledXmlRegion', 0) == 1 &&
|
||||
\ s:CountOccurencesInSOL(v:lnum, 'styledXmlRegion') == 0
|
||||
let l:offset = &sw
|
||||
endif
|
||||
|
||||
" make sure `GetStyledIndent` and `GetJsxIndent` don't infinitely
|
||||
" recurse by incrementing a counter variable, before evaluating the
|
||||
" stored indent expression
|
||||
if s:is_recursion == 0
|
||||
let s:is_recursion = 1
|
||||
let l:result = eval(b:js_ts_indent)
|
||||
endif
|
||||
|
||||
" `is_recursion` being 0 at this point indicates, that
|
||||
" `eval(b:js_ts_indent)` did itself evaluate it's stored indentexpr
|
||||
" and thus it can be assumed, that the current line should be
|
||||
" indented as JS
|
||||
if s:is_recursion == 0
|
||||
" use one of `GetJavascriptIndent` or `GetJsIndent` if existing
|
||||
" fallback to cindent, if not
|
||||
if exists('*GetJavascriptIndent')
|
||||
let l:result = GetJavascriptIndent()
|
||||
elseif exists('*GetJsIndent')
|
||||
let l:result = GetJsIndent()
|
||||
else
|
||||
let l:result = cindent(v:lnum)
|
||||
endif
|
||||
endif
|
||||
|
||||
" reset `is_recursion` counter and return the indentation value
|
||||
let s:is_recursion = 0
|
||||
return l:result + l:offset
|
||||
endif
|
||||
|
||||
" if all else fails indent according to C-syntax
|
||||
return cindent(v:lnum)
|
||||
endfu
|
||||
@@ -1,6 +1,4 @@
|
||||
if exists('g:polyglot_disabled') && index(g:polyglot_disabled, 'objc') != -1
|
||||
finish
|
||||
endif
|
||||
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'objc') == -1
|
||||
|
||||
" Vim indent file
|
||||
" Language: Objective-C
|
||||
@@ -95,3 +93,5 @@ endfunction
|
||||
" Restore 'cpo' options
|
||||
let &cpo = s:save_cpo
|
||||
unlet s:save_cpo
|
||||
|
||||
endif
|
||||
|
||||
40
after/indent/tsx.vim
Normal file
40
after/indent/tsx.vim
Normal file
@@ -0,0 +1,40 @@
|
||||
if !exists('g:polyglot_disabled') || !(index(g:polyglot_disabled, 'typescript') != -1 || index(g:polyglot_disabled, 'typescript') != -1 || index(g:polyglot_disabled, 'jsx') != -1)
|
||||
|
||||
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
|
||||
" Vim indent file
|
||||
"
|
||||
" Language: typescript.jsx
|
||||
" Maintainer: MaxMellon <maxmellon1994@gmail.com>
|
||||
" Depends: leafgarland/typescript-vim
|
||||
"
|
||||
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
|
||||
|
||||
if get(g:, 'vim_jsx_pretty_disable_tsx', 0)
|
||||
finish
|
||||
endif
|
||||
|
||||
if exists('b:did_indent')
|
||||
let s:did_indent = b:did_indent
|
||||
unlet b:did_indent
|
||||
endif
|
||||
|
||||
let s:keepcpo = &cpo
|
||||
set cpo&vim
|
||||
|
||||
if exists('s:did_indent')
|
||||
let b:did_indent = s:did_indent
|
||||
endif
|
||||
|
||||
runtime! indent/typescript.vim
|
||||
|
||||
setlocal indentexpr=GetJsxIndent()
|
||||
setlocal indentkeys=0.,0{,0},0),0],0?,0\*,0\,,!^F,:,<:>,o,O,e,<>>,=*/
|
||||
|
||||
function! GetJsxIndent()
|
||||
return jsx_pretty#indent#get(function('GetTypescriptIndent'))
|
||||
endfunction
|
||||
|
||||
let &cpo = s:keepcpo
|
||||
unlet s:keepcpo
|
||||
|
||||
endif
|
||||
@@ -1,207 +0,0 @@
|
||||
if exists('g:polyglot_disabled') && index(g:polyglot_disabled, 'jsx') != -1
|
||||
finish
|
||||
endif
|
||||
|
||||
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
|
||||
" Vim indent file
|
||||
"
|
||||
" Language: typescript.jsx
|
||||
" Maintainer: MaxMellon <maxmellon1994@gmail.com>
|
||||
" Depends: leafgarland/typescript-vim
|
||||
"
|
||||
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
|
||||
|
||||
if exists('b:did_indent')
|
||||
let s:did_indent = b:did_indent
|
||||
unlet b:did_indent
|
||||
endif
|
||||
|
||||
let s:keepcpo = &cpo
|
||||
set cpo&vim
|
||||
|
||||
if exists('s:did_indent')
|
||||
let b:did_indent = s:did_indent
|
||||
endif
|
||||
|
||||
setlocal indentexpr=GetJsxIndent()
|
||||
setlocal indentkeys=0{,0},0),0],0\,,!^F,o,O,e,*<Return>,<>>,<<>,/
|
||||
|
||||
function! GetJsxIndent()
|
||||
return jsx_pretty#indent#get(function('GetTypescriptIndent'))
|
||||
endfunction
|
||||
|
||||
let &cpo = s:keepcpo
|
||||
unlet s:keepcpo
|
||||
if exists('g:polyglot_disabled') && index(g:polyglot_disabled, 'styled-components') != -1
|
||||
finish
|
||||
endif
|
||||
|
||||
" Vim syntax file
|
||||
" Language: styled-components (js/ts)
|
||||
" Maintainer: Karl Fleischmann <fleischmann.karl@gmail.com>
|
||||
" URL: https://github.com/styled-components/vim-styled-components
|
||||
|
||||
" initialize variable to check, if the indentation expression is run
|
||||
" multiple times in a row, which indicates an infinite recursion
|
||||
let s:is_recursion = 0
|
||||
|
||||
" store current indentexpr for later
|
||||
let b:js_ts_indent=&indentexpr
|
||||
|
||||
" set indentexpr for this filetype (styled-components)
|
||||
setlocal indentexpr=GetStyledIndent()
|
||||
|
||||
" add the following keys to trigger reindenting, when in insert mode
|
||||
" - *; - Indent and insert on press of ';' key.
|
||||
" - *<:> - Indent and insert on press of ':' key.
|
||||
set indentkeys+=*;,*<:>,*<Return>
|
||||
|
||||
fu! s:GetSyntaxNames(lnum, cnum)
|
||||
return map(synstack(a:lnum, a:cnum), 'synIDattr(v:val, "name")')
|
||||
endfu
|
||||
|
||||
" re-implement SynSOL of vim-jsx
|
||||
" TODO: add dependency to the readme and remove duplicate implementation
|
||||
fu! s:SynSOL(lnum)
|
||||
return s:GetSyntaxNames(a:lnum, 1)
|
||||
endfu
|
||||
|
||||
" re-implement SynEOL of vim-jsx
|
||||
" TODO: add dependency to the readme and remove duplicate implementation
|
||||
fu! s:SynEOL(lnum, offset)
|
||||
let l:lnum = prevnonblank(a:lnum)
|
||||
let l:col = strlen(getline(l:lnum))
|
||||
|
||||
return s:GetSyntaxNames(l:lnum, l:col + a:offset)
|
||||
endfu
|
||||
|
||||
|
||||
"" Return whether the current line is a jsTemplateString
|
||||
fu! s:IsStyledDefinition(lnum)
|
||||
" iterate through all syntax items in the given line
|
||||
for item in s:SynSOL(a:lnum)
|
||||
" if syntax-item is a jsTemplateString return 1 - true
|
||||
" `==#` is a match case comparison of the item
|
||||
if item ==# 'styledDefinition'
|
||||
return 1
|
||||
endif
|
||||
endfor
|
||||
|
||||
" fallback to 0 - false
|
||||
return 0
|
||||
endfu
|
||||
|
||||
"" Count occurences of `str` at the beginning of the given `lnum` line
|
||||
fu! s:CountOccurencesInSOL(lnum, str)
|
||||
let l:occurence = 0
|
||||
|
||||
" iterate through all items in the given line
|
||||
for item in s:SynSOL(a:lnum)
|
||||
" if the syntax-item equals the given str increment the counter
|
||||
" `==?` is a case isensitive equal operation
|
||||
if item ==? a:str
|
||||
let l:occurence += 1
|
||||
endif
|
||||
endfor
|
||||
|
||||
" return the accumulated count of occurences
|
||||
return l:occurence
|
||||
endfu
|
||||
|
||||
"" Count occurences of `str` at the end of the given `lnum` line
|
||||
fu! s:CountOccurencesInEOL(lnum, str, offset)
|
||||
let l:occurence = 0
|
||||
|
||||
" iterate through all items in the given line
|
||||
for item in s:SynEOL(a:lnum, a:offset)
|
||||
" if the syntax-item equals the given str increment the counter
|
||||
" `==?` is a case insensitive equal operation
|
||||
if item == a:str
|
||||
let l:occurence += 1
|
||||
endif
|
||||
endfor
|
||||
|
||||
" return the accumulated count of occurences
|
||||
return l:occurence
|
||||
endfu
|
||||
|
||||
"" Get the indentation of the current line
|
||||
fu! GetStyledIndent()
|
||||
if s:IsStyledDefinition(v:lnum)
|
||||
let l:baseIndent = 0
|
||||
|
||||
" find last non-styled line
|
||||
let l:cnum = v:lnum
|
||||
while s:IsStyledDefinition(l:cnum)
|
||||
let l:cnum -= 1
|
||||
endwhile
|
||||
|
||||
" get indentation of the last non-styled line as base indentation
|
||||
let l:baseIndent = indent(l:cnum)
|
||||
|
||||
" incrementally build indentation based on current indentation
|
||||
" - one shiftwidth for the styled definition region
|
||||
" - one shiftwidth per open nested definition region
|
||||
let l:styledIndent = &sw
|
||||
let l:styledIndent += min([
|
||||
\ s:CountOccurencesInSOL(v:lnum, 'styledNestedRegion'),
|
||||
\ s:CountOccurencesInEOL(v:lnum, 'styledNestedRegion', 0)
|
||||
\ ]) * &sw
|
||||
|
||||
" decrease indentation by one shiftwidth, if the styled definition
|
||||
" region ends on the current line
|
||||
" - either directly via styled definition region, or
|
||||
" - if the very last
|
||||
if s:CountOccurencesInEOL(v:lnum, 'styledDefinition', 1) == 0
|
||||
let l:styledIndent -= &sw
|
||||
endif
|
||||
|
||||
" return the base indentation
|
||||
" (for nested styles inside classes/objects/etc.) plus the actual
|
||||
" indentation inside the styled definition region
|
||||
return l:baseIndent + l:styledIndent
|
||||
elseif len(b:js_ts_indent)
|
||||
let l:result = 0
|
||||
let l:offset = 0
|
||||
|
||||
" increase indentation by one shiftwidth, if the last line ended on a
|
||||
" styledXmlRegion and this line does not continue with it
|
||||
" this is a fix for an incorrectly indented xml prop after a
|
||||
" glamor-styled styledXmlRegion
|
||||
if s:CountOccurencesInEOL(v:lnum-1, 'styledXmlRegion', 0) == 1 &&
|
||||
\ s:CountOccurencesInSOL(v:lnum, 'styledXmlRegion') == 0
|
||||
let l:offset = &sw
|
||||
endif
|
||||
|
||||
" make sure `GetStyledIndent` and `GetJsxIndent` don't infinitely
|
||||
" recurse by incrementing a counter variable, before evaluating the
|
||||
" stored indent expression
|
||||
if s:is_recursion == 0
|
||||
let s:is_recursion = 1
|
||||
let l:result = eval(b:js_ts_indent)
|
||||
endif
|
||||
|
||||
" `is_recursion` being 0 at this point indicates, that
|
||||
" `eval(b:js_ts_indent)` did itself evaluate it's stored indentexpr
|
||||
" and thus it can be assumed, that the current line should be
|
||||
" indented as JS
|
||||
if s:is_recursion == 0
|
||||
" use one of `GetJavascriptIndent` or `GetJsIndent` if existing
|
||||
" fallback to cindent, if not
|
||||
if exists('*GetJavascriptIndent')
|
||||
let l:result = GetJavascriptIndent()
|
||||
elseif exists('*GetJsIndent')
|
||||
let l:result = GetJsIndent()
|
||||
else
|
||||
let l:result = cindent(v:lnum)
|
||||
endif
|
||||
endif
|
||||
|
||||
" reset `is_recursion` counter and return the indentation value
|
||||
let s:is_recursion = 0
|
||||
return l:result + l:offset
|
||||
endif
|
||||
|
||||
" if all else fails indent according to C-syntax
|
||||
return cindent(v:lnum)
|
||||
endfu
|
||||
5
after/indent/typescriptreact.vim
Normal file
5
after/indent/typescriptreact.vim
Normal file
@@ -0,0 +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)
|
||||
|
||||
source <sfile>:h/tsx.vim
|
||||
|
||||
endif
|
||||
@@ -1,6 +1,4 @@
|
||||
if exists('g:polyglot_disabled') && index(g:polyglot_disabled, 'c++11') != -1
|
||||
finish
|
||||
endif
|
||||
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'c++11') == -1
|
||||
|
||||
" Vim syntax file
|
||||
" Language: C Additions
|
||||
@@ -38,6 +36,19 @@ if exists('g:cpp_member_variable_highlight') && g:cpp_member_variable_highlight
|
||||
hi def link cCustomMemVar Function
|
||||
endif
|
||||
|
||||
" -----------------------------------------------------------------------------
|
||||
" Highlight POSIX functions.
|
||||
" -----------------------------------------------------------------------------
|
||||
if exists('g:cpp_posix_standard') && g:cpp_posix_standard
|
||||
syn keyword cPOSIXFunction socket accept bind connect getsockname
|
||||
syn keyword cPOSIXFunction listen recv recvfrom recvmsg
|
||||
syn keyword cPOSIXFunction send sendto sendmsg setsockopt socketpair
|
||||
syn keyword cPOSIXFunction htonl htons ntohl ntohs
|
||||
syn keyword cPOSIXFunction inet_ntop inet_pton getaddrinfo
|
||||
syn keyword cPOSIXFunction poll select pselect
|
||||
hi def link cPOSIXFunction Function
|
||||
endif
|
||||
|
||||
" -----------------------------------------------------------------------------
|
||||
" Source: aftersyntaxc.vim
|
||||
" -----------------------------------------------------------------------------
|
||||
@@ -306,3 +317,5 @@ hi def link cBoolean Boolean
|
||||
"hi def link cDelimiter Delimiter
|
||||
" foldmethod=syntax fix, courtesy of Ivan Freitas
|
||||
"hi def link cBraces Delimiter
|
||||
|
||||
endif
|
||||
|
||||
@@ -1,6 +1,4 @@
|
||||
if exists('g:polyglot_disabled') && index(g:polyglot_disabled, 'cjsx') != -1
|
||||
finish
|
||||
endif
|
||||
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'cjsx') == -1
|
||||
|
||||
if exists('b:current_syntax')
|
||||
let s:current_syntax=b:current_syntax
|
||||
@@ -29,3 +27,5 @@ hi def link cjsxTagName Function
|
||||
hi def link cjsxEntity Statement
|
||||
hi def link cjsxEntityPunct Type
|
||||
hi def link cjsxAttribProperty Type
|
||||
|
||||
endif
|
||||
|
||||
@@ -1,12 +1,10 @@
|
||||
if exists('g:polyglot_disabled') && index(g:polyglot_disabled, 'c++11') != -1
|
||||
finish
|
||||
endif
|
||||
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'c++11') == -1
|
||||
|
||||
" Vim syntax file
|
||||
" Language: C++ Additions
|
||||
" Maintainer: Jon Haggblad <jon@haeggblad.com>
|
||||
" URL: http://www.haeggblad.com
|
||||
" Last Change: 1 Feb 2018
|
||||
" Last Change: 29 Jun 2019
|
||||
" Version: 0.6
|
||||
" Changelog:
|
||||
" 0.1 - initial version.
|
||||
@@ -635,21 +633,19 @@ syntax keyword cppSTLios unitbuf
|
||||
syntax keyword cppSTLios uppercase
|
||||
"syntax keyword cppSTLios ws
|
||||
syntax keyword cppSTLiterator back_insert_iterator
|
||||
syntax keyword cppSTLiterator bidirectional_iterator
|
||||
syntax keyword cppSTLiterator const_iterator
|
||||
syntax keyword cppSTLiterator const_reverse_iterator
|
||||
syntax keyword cppSTLiterator forward_iterator
|
||||
syntax keyword cppSTLiterator front_insert_iterator
|
||||
syntax keyword cppSTLiterator input_iterator
|
||||
syntax keyword cppSTLiterator insert_iterator
|
||||
syntax keyword cppSTLiterator istreambuf_iterator
|
||||
syntax keyword cppSTLiterator istream_iterator
|
||||
syntax keyword cppSTLiterator ostreambuf_iterator
|
||||
syntax keyword cppSTLiterator ostream_iterator
|
||||
syntax keyword cppSTLiterator iterator
|
||||
syntax keyword cppSTLiterator ostream_iterator
|
||||
syntax keyword cppSTLiterator output_iterator
|
||||
syntax keyword cppSTLiterator random_access_iterator
|
||||
syntax keyword cppSTLiterator raw_storage_iterator
|
||||
syntax keyword cppSTLiterator reverse_bidirectional_iterator
|
||||
syntax keyword cppSTLiterator move_iterator
|
||||
syntax keyword cppSTLiterator reverse_iterator
|
||||
syntax keyword cppSTLiterator_tag bidirectional_iterator_tag
|
||||
syntax keyword cppSTLiterator_tag forward_iterator_tag
|
||||
@@ -964,6 +960,12 @@ if !exists("cpp_no_cpp11")
|
||||
syntax keyword cppSTLtype atomic_uintmax_t
|
||||
syntax keyword cppSTLconstant ATOMIC_FLAG_INIT
|
||||
syntax keyword cppSTLenum memory_order
|
||||
syntax keyword cppSTLtype memory_order_relaxed
|
||||
syntax keyword cppSTLtype memory_order_consume
|
||||
syntax keyword cppSTLtype memory_order_acquire
|
||||
syntax keyword cppSTLtype memory_order_release
|
||||
syntax keyword cppSTLtype memory_order_acq_rel
|
||||
syntax keyword cppSTLtype memory_order_seq_cst
|
||||
syntax keyword cppSTLfunction is_lock_free
|
||||
syntax keyword cppSTLfunction compare_exchange_weak
|
||||
syntax keyword cppSTLfunction compare_exchange_strong
|
||||
@@ -1589,6 +1591,8 @@ endif " C++14
|
||||
|
||||
|
||||
if !exists("cpp_no_cpp17")
|
||||
syntax keyword cppSTLnamespace pmr
|
||||
|
||||
" algorithm
|
||||
syntax keyword cppSTLfunction clamp
|
||||
syntax keyword cppSTLfunction for_each_n
|
||||
@@ -1981,84 +1985,278 @@ endif " C++17
|
||||
|
||||
|
||||
if !exists("cpp_no_cpp20")
|
||||
syntax keyword cppType char8_t
|
||||
syntax keyword cppStatement co_yield co_return co_await
|
||||
syntax keyword cppStorageClass consteval
|
||||
syntax keyword cppSTLnamespace ranges
|
||||
|
||||
" algorithm
|
||||
syntax keyword cppSTLfunction shift_left
|
||||
syntax keyword cppSTLfunction shift_right
|
||||
syntax keyword cppSTLfunction lexicographical_compare_three_way
|
||||
|
||||
" bit
|
||||
syntax keyword cppSTLcast bit_cast
|
||||
syntax keyword cppSTLfunction ispow2
|
||||
syntax keyword cppSTLfunction ceil2
|
||||
syntax keyword cppSTLfunction floor2
|
||||
syntax keyword cppSTLfunction log2p1
|
||||
syntax keyword cppSTLfunction rotl
|
||||
syntax keyword cppSTLfunction rotr
|
||||
syntax keyword cppSTLfunction countl_zero
|
||||
syntax keyword cppSTLfunction countl_one
|
||||
syntax keyword cppSTLfunction countr_zero
|
||||
syntax keyword cppSTLfunction countr_one
|
||||
syntax keyword cppSTLfunction popcount
|
||||
syntax keyword cppSTLtype endian
|
||||
|
||||
" compare
|
||||
syntax keyword cppSTLtype weak_equality
|
||||
syntax keyword cppSTLtype strong_equality
|
||||
syntax keyword cppSTLtype partial_ordering
|
||||
syntax keyword cppSTLtype weak_ordering
|
||||
syntax keyword cppSTLtype strong_ordering
|
||||
syntax keyword cppSTLtype common_comparison_category
|
||||
syntax keyword cppSTLtype compare_three_way_result
|
||||
syntax keyword cppSTLtype compare_three_way
|
||||
syntax keyword cppSTLtype strong_order
|
||||
syntax keyword cppSTLtype weak_order
|
||||
syntax keyword cppSTLtype parital_order
|
||||
syntax keyword cppSTLtype compare_strong_order_fallback
|
||||
syntax keyword cppSTLtype compare_weak_order_fallback
|
||||
syntax keyword cppSTLtype compare_parital_order_fallback
|
||||
syntax keyword cppSTLfunction is_eq
|
||||
syntax keyword cppSTLfunction is_neq
|
||||
syntax keyword cppSTLfunction is_lt
|
||||
syntax keyword cppSTLfunction is_lteq
|
||||
syntax keyword cppSTLfunction is_gt
|
||||
syntax keyword cppSTLfunction is_gteq
|
||||
|
||||
" format
|
||||
syntax keyword cppSTLtype formatter
|
||||
syntax keyword cppSTLtype basic_format_parse_context
|
||||
syntax keyword cppSTLtype format_parse_context
|
||||
syntax keyword cppSTLtype wformat_parse_context
|
||||
syntax keyword cppSTLtype basic_format_context
|
||||
syntax keyword cppSTLtype format_context
|
||||
syntax keyword cppSTLtype wformat_context
|
||||
syntax keyword cppSTLtype basic_format_arg
|
||||
syntax keyword cppSTLtype basic_format_args
|
||||
syntax keyword cppSTLtype format_args
|
||||
syntax keyword cppSTLtype wformat_args
|
||||
syntax keyword cppSTLtype format_args_t
|
||||
syntax keyword cppSTLtype format_error
|
||||
syntax keyword cppSTLfuntion format
|
||||
syntax keyword cppSTLfuntion format_to
|
||||
syntax keyword cppSTLfuntion format_to_n
|
||||
syntax keyword cppSTLfuntion formatted_size
|
||||
syntax keyword cppSTLfuntion vformat
|
||||
syntax keyword cppSTLfuntion vformat_to
|
||||
syntax keyword cppSTLfuntion visit_format_arg
|
||||
syntax keyword cppSTLfuntion make_format_args
|
||||
syntax keyword cppSTLfuntion make_wformat_args
|
||||
|
||||
" iterator
|
||||
syntax keyword cppSTLtype default_sentinel_t unreachable_sentinel_t
|
||||
syntax keyword cppSTLiterator common_iterator
|
||||
syntax keyword cppSTLiterator counted_iterator
|
||||
syntax keyword cppSTLiterator_tag contiguous_iterator_tag
|
||||
|
||||
" memory
|
||||
syntax keyword cppSTLfunction to_address
|
||||
syntax keyword cppSTLfunction assume_aligned
|
||||
syntax keyword cppSTLfunction make_unique_default_init
|
||||
syntax keyword cppSTLfunction allocate_shared_default_init
|
||||
|
||||
" source_location
|
||||
syntax keyword cppSTLtype source_location
|
||||
|
||||
" span
|
||||
syntax keyword cppSTLtype span
|
||||
syntax keyword cppSTLfunction as_bytes
|
||||
syntax keyword cppSTLfunction as_writable_bytes
|
||||
syntax keyword cppSTLconstant dynamic_extent
|
||||
|
||||
" syncstream
|
||||
syntax keyword cppSTLtype basic_syncbuf
|
||||
syntax keyword cppSTLtype basic_osyncstream
|
||||
syntax keyword cppSTLtype syncbuf
|
||||
syntax keyword cppSTLtype wsyncbuf
|
||||
syntax keyword cppSTLtype osyncstream
|
||||
syntax keyword cppSTLtype wosyncstream
|
||||
|
||||
" type_traits
|
||||
syntax keyword cppSTLtype remove_cvref remove_cvref_t
|
||||
syntax keyword cppSTLtype common_reference common_reference_t
|
||||
syntax keyword cppSTLfunction is_constant_evaluated
|
||||
syntax keyword cppSTLfunction is_pointer_interconvertible
|
||||
syntax keyword cppSTLfunction is_corresponding_member
|
||||
syntax keyword cppSTLtype is_nothrow_convertible
|
||||
syntax keyword cppSTLbool is_nothrow_convertible_v
|
||||
syntax keyword cppSTLtype is_layout_compatible
|
||||
syntax keyword cppSTLbool is_layout_compatible_v
|
||||
syntax keyword cppSTLtype is_bounded_array
|
||||
syntax keyword cppSTLbool is_bounded_array_v
|
||||
syntax keyword cppSTLtype is_unbounded_array
|
||||
syntax keyword cppSTLbool is_unbounded_array_v
|
||||
syntax keyword cppSTLtype is_pointer_interconvertible_base_of
|
||||
syntax keyword cppSTLbool is_pointer_interconvertible_base_of_v
|
||||
syntax keyword cppSTLtype has_strong_structural_equality
|
||||
syntax keyword cppSTLbool has_strong_structural_equality_v
|
||||
|
||||
" version
|
||||
" TODO
|
||||
endif
|
||||
|
||||
|
||||
if exists('g:cpp_concepts_highlight') && g:cpp_concepts_highlight
|
||||
if exists('g:cpp_concepts_highlight')
|
||||
syntax keyword cppStatement concept
|
||||
syntax keyword cppStorageClass requires
|
||||
syntax keyword cppSTLtype DefaultConstructible
|
||||
syntax keyword cppSTLtype MoveConstructible
|
||||
syntax keyword cppSTLtype CopyConstructible
|
||||
syntax keyword cppSTLtype MoveAssignable
|
||||
syntax keyword cppSTLtype CopyAssignable
|
||||
syntax keyword cppSTLtype Destructible
|
||||
syntax keyword cppSTLtype TriviallyCopyable
|
||||
syntax keyword cppSTLtype TrivialType
|
||||
syntax keyword cppSTLtype StandardLayoutType
|
||||
syntax keyword cppSTLtype PODType
|
||||
syntax keyword cppSTLtype EqualityComparable
|
||||
syntax keyword cppSTLtype LessThanComparable
|
||||
syntax keyword cppSTLtype Swappable
|
||||
syntax keyword cppSTLtype ValueSwappable
|
||||
syntax keyword cppSTLtype NullablePointer
|
||||
syntax keyword cppSTLtype Hash
|
||||
syntax keyword cppSTLtype Allocator
|
||||
syntax keyword cppSTLtype FunctionObject
|
||||
syntax keyword cppSTLtype Callable
|
||||
syntax keyword cppSTLtype Predicate
|
||||
syntax keyword cppSTLtype BinaryPredicate
|
||||
syntax keyword cppSTLtype Compare
|
||||
syntax keyword cppSTLtype Container
|
||||
syntax keyword cppSTLtype ReversibleContainer
|
||||
syntax keyword cppSTLtype AllocatorAwareContainer
|
||||
syntax keyword cppSTLtype SequenceContainer
|
||||
syntax keyword cppSTLtype ContiguousContainer
|
||||
syntax keyword cppSTLtype AssociativeContainer
|
||||
syntax keyword cppSTLtype UnorderedAssociativeContainer
|
||||
syntax keyword cppSTLtype DefaultInsertable
|
||||
syntax keyword cppSTLtype CopyInsertable
|
||||
syntax keyword cppSTLtype CopyInsertable
|
||||
syntax keyword cppSTLtype MoveInsertable
|
||||
syntax keyword cppSTLtype EmplaceConstructible
|
||||
syntax keyword cppSTLtype Erasable
|
||||
syntax keyword cppSTLtype Iterator
|
||||
syntax keyword cppSTLtype InputIterator
|
||||
syntax keyword cppSTLtype OutputIterator
|
||||
syntax keyword cppSTLtype ForwardIterator
|
||||
syntax keyword cppSTLtype BidirectionalIterator
|
||||
syntax keyword cppSTLtype RandomAccessIterator
|
||||
syntax keyword cppSTLtype ContiguousIterator
|
||||
syntax keyword cppSTLtype UnformattedInputFunction
|
||||
syntax keyword cppSTLtype FormattedInputFunction
|
||||
syntax keyword cppSTLtype UnformattedOutputFunction
|
||||
syntax keyword cppSTLtype FormattedOutputFunction
|
||||
syntax keyword cppSTLtype SeedSequence
|
||||
syntax keyword cppSTLtype UniformRandomBitGenerator
|
||||
syntax keyword cppSTLtype RandomNumberEngine
|
||||
syntax keyword cppSTLtype RandomNumberEngineAdaptor
|
||||
syntax keyword cppSTLtype RandomNumberDistribution
|
||||
syntax keyword cppSTLtype BasicLockable
|
||||
syntax keyword cppSTLtype Lockable
|
||||
syntax keyword cppSTLtype TimedLockable
|
||||
syntax keyword cppSTLtype Mutex
|
||||
syntax keyword cppSTLtype TimedMutex
|
||||
syntax keyword cppSTLtype SharedMutex
|
||||
syntax keyword cppSTLtype SharedTimedMutex
|
||||
syntax keyword cppSTLtype UnaryTypeTrait
|
||||
syntax keyword cppSTLtype BinaryTypeTrait
|
||||
syntax keyword cppSTLtype TransformationTrait
|
||||
syntax keyword cppSTLtype Clock
|
||||
syntax keyword cppSTLtype TrivialClock
|
||||
syntax keyword cppSTLtype CharTraits
|
||||
syntax keyword cppSTLtype pos_type
|
||||
syntax keyword cppSTLtype off_type
|
||||
syntax keyword cppSTLtype BitmaskType
|
||||
syntax keyword cppSTLtype NumericType
|
||||
syntax keyword cppSTLtype RegexTraits
|
||||
syntax keyword cppSTLtype LiteralType
|
||||
|
||||
if g:cpp_concepts_highlight == 1
|
||||
syntax keyword cppSTLconcept DefaultConstructible
|
||||
syntax keyword cppSTLconcept MoveConstructible
|
||||
syntax keyword cppSTLconcept CopyConstructible
|
||||
syntax keyword cppSTLconcept MoveAssignable
|
||||
syntax keyword cppSTLconcept CopyAssignable
|
||||
syntax keyword cppSTLconcept Destructible
|
||||
syntax keyword cppSTLconcept TriviallyCopyable
|
||||
syntax keyword cppSTLconcept TrivialType
|
||||
syntax keyword cppSTLconcept StandardLayoutType
|
||||
syntax keyword cppSTLconcept PODType
|
||||
syntax keyword cppSTLconcept EqualityComparable
|
||||
syntax keyword cppSTLconcept LessThanComparable
|
||||
syntax keyword cppSTLconcept Swappable
|
||||
syntax keyword cppSTLconcept ValueSwappable
|
||||
syntax keyword cppSTLconcept NullablePointer
|
||||
syntax keyword cppSTLconcept Hash
|
||||
syntax keyword cppSTLconcept Allocator
|
||||
syntax keyword cppSTLconcept FunctionObject
|
||||
syntax keyword cppSTLconcept Callable
|
||||
syntax keyword cppSTLconcept Predicate
|
||||
syntax keyword cppSTLconcept BinaryPredicate
|
||||
syntax keyword cppSTLconcept Compare
|
||||
syntax keyword cppSTLconcept Container
|
||||
syntax keyword cppSTLconcept ReversibleContainer
|
||||
syntax keyword cppSTLconcept AllocatorAwareContainer
|
||||
syntax keyword cppSTLconcept SequenceContainer
|
||||
syntax keyword cppSTLconcept ContiguousContainer
|
||||
syntax keyword cppSTLconcept AssociativeContainer
|
||||
syntax keyword cppSTLconcept UnorderedAssociativeContainer
|
||||
syntax keyword cppSTLconcept DefaultInsertable
|
||||
syntax keyword cppSTLconcept CopyInsertable
|
||||
syntax keyword cppSTLconcept CopyInsertable
|
||||
syntax keyword cppSTLconcept MoveInsertable
|
||||
syntax keyword cppSTLconcept EmplaceConstructible
|
||||
syntax keyword cppSTLconcept Erasable
|
||||
syntax keyword cppSTLconcept Iterator
|
||||
syntax keyword cppSTLconcept InputIterator
|
||||
syntax keyword cppSTLconcept OutputIterator
|
||||
syntax keyword cppSTLconcept ForwardIterator
|
||||
syntax keyword cppSTLconcept BidirectionalIterator
|
||||
syntax keyword cppSTLconcept RandomAccessIterator
|
||||
syntax keyword cppSTLconcept ContiguousIterator
|
||||
syntax keyword cppSTLconcept UnformattedInputFunction
|
||||
syntax keyword cppSTLconcept FormattedInputFunction
|
||||
syntax keyword cppSTLconcept UnformattedOutputFunction
|
||||
syntax keyword cppSTLconcept FormattedOutputFunction
|
||||
syntax keyword cppSTLconcept SeedSequence
|
||||
syntax keyword cppSTLconcept UniformRandomBitGenerator
|
||||
syntax keyword cppSTLconcept RandomNumberEngine
|
||||
syntax keyword cppSTLconcept RandomNumberEngineAdaptor
|
||||
syntax keyword cppSTLconcept RandomNumberDistribution
|
||||
syntax keyword cppSTLconcept BasicLockable
|
||||
syntax keyword cppSTLconcept Lockable
|
||||
syntax keyword cppSTLconcept TimedLockable
|
||||
syntax keyword cppSTLconcept Mutex
|
||||
syntax keyword cppSTLconcept TimedMutex
|
||||
syntax keyword cppSTLconcept SharedMutex
|
||||
syntax keyword cppSTLconcept SharedTimedMutex
|
||||
syntax keyword cppSTLconcept UnaryTypeTrait
|
||||
syntax keyword cppSTLconcept BinaryTypeTrait
|
||||
syntax keyword cppSTLconcept TransformationTrait
|
||||
syntax keyword cppSTLconcept Clock
|
||||
syntax keyword cppSTLconcept TrivialClock
|
||||
syntax keyword cppSTLconcept CharTraits
|
||||
syntax keyword cppSTLconcept pos_type
|
||||
syntax keyword cppSTLconcept off_type
|
||||
syntax keyword cppSTLconcept BitmaskType
|
||||
syntax keyword cppSTLconcept NumericType
|
||||
syntax keyword cppSTLconcept RegexTraits
|
||||
syntax keyword cppSTLconcept LiteralType
|
||||
elseif g:cpp_concepts_highlight == 2
|
||||
syntax keyword cppSTLconcept same_as
|
||||
syntax keyword cppSTLconcept derived_from
|
||||
syntax keyword cppSTLconcept convertible_to
|
||||
syntax keyword cppSTLconcept common_reference_with
|
||||
syntax keyword cppSTLconcept common_with
|
||||
syntax keyword cppSTLconcept integral
|
||||
syntax keyword cppSTLconcept signed_integral
|
||||
syntax keyword cppSTLconcept unsigned_integral
|
||||
syntax keyword cppSTLconcept assignable_from
|
||||
syntax keyword cppSTLconcept swappable
|
||||
syntax keyword cppSTLconcept swappable_with
|
||||
syntax keyword cppSTLconcept destructible
|
||||
syntax keyword cppSTLconcept constructible_from
|
||||
syntax keyword cppSTLconcept default_constructible
|
||||
syntax keyword cppSTLconcept move_constructible
|
||||
syntax keyword cppSTLconcept copy_constructible
|
||||
syntax keyword cppSTLconcept boolean
|
||||
syntax keyword cppSTLconcept equality_comparable
|
||||
syntax keyword cppSTLconcept equality_comparable_with
|
||||
syntax keyword cppSTLconcept totally_ordered
|
||||
syntax keyword cppSTLconcept totally_ordered_with
|
||||
syntax keyword cppSTLconcept movable
|
||||
syntax keyword cppSTLconcept copyable
|
||||
syntax keyword cppSTLconcept semiregular
|
||||
syntax keyword cppSTLconcept regular
|
||||
syntax keyword cppSTLconcept invocable
|
||||
syntax keyword cppSTLconcept regular_invocable
|
||||
syntax keyword cppSTLconcept predicate
|
||||
syntax keyword cppSTLconcept relation
|
||||
syntax keyword cppSTLconcept strict_weak_order
|
||||
syntax keyword cppSTLconcept readable
|
||||
syntax keyword cppSTLconcept writable
|
||||
syntax keyword cppSTLconcept weakly_incrementable
|
||||
syntax keyword cppSTLconcept incrementable
|
||||
syntax keyword cppSTLconcept input_or_output_iterator
|
||||
syntax keyword cppSTLconcept sentinal_for
|
||||
syntax keyword cppSTLconcept sized_sentinal_for
|
||||
syntax keyword cppSTLconcept input_iterator
|
||||
syntax keyword cppSTLconcept output_iterator
|
||||
syntax keyword cppSTLconcept forward_iterator
|
||||
syntax keyword cppSTLconcept bidirectional_iterator
|
||||
syntax keyword cppSTLconcept random_access_iterator
|
||||
syntax keyword cppSTLconcept input_iterator
|
||||
syntax keyword cppSTLconcept output_iterator
|
||||
syntax keyword cppSTLconcept bidirectional_iterator
|
||||
syntax keyword cppSTLconcept random_access_iterator
|
||||
syntax keyword cppSTLconcept contiguous_iterator
|
||||
syntax keyword cppSTLconcept indirectly_unary_invocable
|
||||
syntax keyword cppSTLconcept indirectly_regular_unary_invocable
|
||||
syntax keyword cppSTLconcept indirect_unary_predicate
|
||||
syntax keyword cppSTLconcept indirect_relation
|
||||
syntax keyword cppSTLconcept indirect_strict_weak_order
|
||||
syntax keyword cppSTLconcept indirectly_movable
|
||||
syntax keyword cppSTLconcept indirectly_movable_storable
|
||||
syntax keyword cppSTLconcept indirectly_copyable
|
||||
syntax keyword cppSTLconcept indirectly_copyable_storable
|
||||
syntax keyword cppSTLconcept indirectly_swappable
|
||||
syntax keyword cppSTLconcept indirectly_comparable
|
||||
syntax keyword cppSTLconcept permutable
|
||||
syntax keyword cppSTLconcept mergeable
|
||||
syntax keyword cppSTLconcept sortable
|
||||
syntax keyword cppSTLconcept range
|
||||
syntax keyword cppSTLconcept sized_range
|
||||
syntax keyword cppSTLconcept output_range
|
||||
syntax keyword cppSTLconcept input_range
|
||||
syntax keyword cppSTLconcept bidirectional_range
|
||||
syntax keyword cppSTLconcept random_access_range
|
||||
syntax keyword cppSTLconcept contiguous_range
|
||||
syntax keyword cppSTLconcept common_range
|
||||
syntax keyword cppSTLconcept viewable_range
|
||||
syntax keyword cppSTLconcept uniform_random_bit_generator
|
||||
endif
|
||||
endif " C++ concepts
|
||||
|
||||
|
||||
@@ -2088,9 +2286,12 @@ if version >= 508 || !exists("did_cpp_syntax_inits")
|
||||
HiLink cppSTLiterator Typedef
|
||||
HiLink cppSTLiterator_tag Typedef
|
||||
HiLink cppSTLenum Typedef
|
||||
HiLink cppSTLconcept Typedef
|
||||
HiLink cppSTLios Function
|
||||
HiLink cppSTLcast Statement " be consistent with official syntax
|
||||
HiLink cppRawString String
|
||||
HiLink cppRawDelimiter Delimiter
|
||||
delcommand HiLink
|
||||
endif
|
||||
|
||||
endif
|
||||
|
||||
17
after/syntax/haskell.vim
Normal file
17
after/syntax/haskell.vim
Normal file
@@ -0,0 +1,17 @@
|
||||
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'dhall') == -1
|
||||
|
||||
" store and remove current syntax value
|
||||
let old_syntax = b:current_syntax
|
||||
unlet b:current_syntax
|
||||
|
||||
syn include @dhall syntax/dhall.vim
|
||||
unlet b:current_syntax
|
||||
|
||||
syn region dhallBlock matchgroup=quasiQuote start=/\[\$\?staticDhallExpression|/ end=/|\]/ contains=@dhall
|
||||
|
||||
hi def link quasiQuote Underlined
|
||||
|
||||
" restore current syntax value
|
||||
let b:current_syntax = old_syntax
|
||||
|
||||
endif
|
||||
@@ -1,6 +1,4 @@
|
||||
if exists('g:polyglot_disabled') && index(g:polyglot_disabled, 'scala') != -1
|
||||
finish
|
||||
endif
|
||||
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'scala') == -1
|
||||
|
||||
" Extends standard help syntax with highlighting of Scala code.
|
||||
"
|
||||
@@ -16,3 +14,5 @@ if has('conceal')
|
||||
else
|
||||
syntax region rgnScala matchgroup=Ignore start='!sc!' end='!/sc!' contains=@ScalaCode
|
||||
endif
|
||||
|
||||
endif
|
||||
|
||||
@@ -1,6 +1,4 @@
|
||||
if exists('g:polyglot_disabled') && index(g:polyglot_disabled, 'html5') != -1
|
||||
finish
|
||||
endif
|
||||
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'html5') == -1
|
||||
|
||||
" Vim syntax file
|
||||
" Language: HTML (version 5.1)
|
||||
@@ -14,3 +12,5 @@ endif
|
||||
" https://github.com/w3c/html/issues/694
|
||||
syntax region htmlComment start=+<!--+ end=+-->+ contains=@Spell
|
||||
syntax region htmlComment start=+<!DOCTYPE+ keepend end=+>+
|
||||
|
||||
endif
|
||||
|
||||
@@ -1,6 +1,4 @@
|
||||
if exists('g:polyglot_disabled') && index(g:polyglot_disabled, 'idris') != -1
|
||||
finish
|
||||
endif
|
||||
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'idris') == -1
|
||||
|
||||
" This script allows for unicode concealing of certain characters
|
||||
" For instance -> goes to →
|
||||
@@ -80,3 +78,5 @@ hi link idrNiceOperator Operator
|
||||
hi! link Conceal Operator
|
||||
setlocal conceallevel=2
|
||||
|
||||
|
||||
endif
|
||||
|
||||
@@ -1,6 +1,4 @@
|
||||
if exists('g:polyglot_disabled') && index(g:polyglot_disabled, 'jsx') != -1
|
||||
finish
|
||||
endif
|
||||
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
|
||||
@@ -24,294 +22,38 @@ if exists('s:current_syntax')
|
||||
let b:current_syntax = s:current_syntax
|
||||
endif
|
||||
|
||||
if hlexists("jsNoise") " pangloss/vim-javascript
|
||||
if hlexists("jsDebugger") || hlexists("jsNoise") " yuezk/vim-js or pangloss/vim-javascript
|
||||
syntax cluster jsExpression add=jsxRegion
|
||||
elseif hlexists("javascriptOpSymbols") " othree/yajs.vim
|
||||
" refine the javascript line comment
|
||||
syntax region javascriptLineComment start=+//+ end=/$/ contains=@Spell,javascriptCommentTodo extend keepend
|
||||
syntax cluster javascriptValue add=jsxRegion
|
||||
syntax cluster javascriptNoReserved add=jsxElement,jsxTag
|
||||
|
||||
" add support to arrow function which returns a tagged template string, e.g.
|
||||
" () => html`<div></div>`
|
||||
syntax cluster afterArrowFunc add=javascriptTagRef
|
||||
else " build-in javascript syntax
|
||||
" refine the javascript line comment
|
||||
syntax region javaScriptLineComment start=+//+ end=/$/ contains=@Spell,javascriptCommentTodo extend keepend
|
||||
|
||||
" refine the template string syntax
|
||||
syntax region javaScriptEmbed matchgroup=javaScriptEmbedBraces start=+\${+ end=+}+ contained contains=@javaScriptEmbededExpr
|
||||
|
||||
" add a javaScriptBlock group for build-in syntax
|
||||
syntax region javaScriptBlockBuildIn
|
||||
\ contained
|
||||
syntax region javaScriptBlock
|
||||
\ matchgroup=javaScriptBraces
|
||||
\ start="{"
|
||||
\ end="}"
|
||||
\ contained
|
||||
\ extend
|
||||
\ contains=javaScriptBlockBuildIn,@javaScriptEmbededExpr,javaScript.*
|
||||
\ contains=javaScriptBlock,@javaScriptEmbededExpr,javaScript.*
|
||||
\ fold
|
||||
syntax cluster javaScriptEmbededExpr add=jsxRegion
|
||||
|
||||
" refine the template string syntax
|
||||
syntax region javaScriptStringT start=+`+ skip=+\\\\\|\\`+ end=+`+ contains=javaScriptSpecial,javaScriptEmbed,@htmlPreproc extend
|
||||
syntax region javaScriptEmbed matchgroup=javaScriptEmbedBraces start=+\${+ end=+}+ contained contains=@javaScriptEmbededExpr,javaScript.*
|
||||
syntax cluster javaScriptEmbededExpr add=jsxRegion,javaScript.*
|
||||
endif
|
||||
|
||||
" because this is autoloaded, when developing you're going to need to source
|
||||
" the autoload/jsx_pretty/*.vim file manually, or restart vim
|
||||
call jsx_pretty#syntax#highlight()
|
||||
runtime syntax/jsx_pretty.vim
|
||||
|
||||
let b:current_syntax = 'javascript.jsx'
|
||||
|
||||
let &cpo = s:jsx_cpo
|
||||
unlet s:jsx_cpo
|
||||
if exists('g:polyglot_disabled') && index(g:polyglot_disabled, 'styled-components') != -1
|
||||
finish
|
||||
endif
|
||||
|
||||
" Vim syntax file
|
||||
" Language: styled-components (js/ts)
|
||||
" Maintainer: Karl Fleischmann <fleischmann.karl@gmail.com>
|
||||
" URL: https://github.com/styled-components/vim-styled-components
|
||||
|
||||
if exists("b:current_syntax")
|
||||
let s:current_syntax=b:current_syntax
|
||||
unlet b:current_syntax
|
||||
endif
|
||||
|
||||
|
||||
" fix for "-" before cssPositioningProp
|
||||
" - needs to be above CSS include to not match cssVendor definitions
|
||||
syn region cssCustomPositioningPrefix contained
|
||||
\ start='-' end='\%(\s\{-}:\)\@='
|
||||
\ contains=cssPositioningProp
|
||||
|
||||
" introduce CSS cluster from built-in (or single third party syntax file)
|
||||
syn include @CSS syntax/css.vim
|
||||
|
||||
" try to include CSS3 definitions from multiple files
|
||||
" this is only possible on vim version above 7
|
||||
if v:version >= 700
|
||||
try
|
||||
syn include @CSS3 syntax/css/*.vim
|
||||
catch
|
||||
endtry
|
||||
endif
|
||||
|
||||
" TODO: include react-native keywords
|
||||
|
||||
" define custom cssAttrRegion
|
||||
" - add ",", "`" and "{" to the end characters
|
||||
" - add "cssPseudoClassId" to it's containing elements
|
||||
" this will incorrectly highlight pseudo elements incorrectly used as
|
||||
" attributes but correctly highlight actual attributes
|
||||
syn region cssCustomAttrRegion contained
|
||||
\ start=":" end="\ze\%(;\|)\|{\|}\|`\)"
|
||||
\ contains=css.*Attr,cssColor,cssImportant,cssValue.*,cssFunction,
|
||||
\ cssString.*,cssURL,cssComment,cssUnicodeEscape,cssVendor,
|
||||
\ cssError,cssAttrComma,cssNoise,cssPseudoClassId,
|
||||
\ jsTemplateExpression,
|
||||
\ typescriptInterpolation,typescriptTemplateSubstitution
|
||||
syn region cssCustomAttrRegion contained
|
||||
\ start="transition\s*:" end="\ze\%(;\|)\|{\|}\|`\)"
|
||||
\ contains=css.*Prop,css.*Attr,cssColor,cssImportant,cssValue.*,
|
||||
\ cssFunction,cssString.*,cssURL,cssComment,cssUnicodeEscape,
|
||||
\ cssVendor,cssError,cssAttrComma,cssNoise,cssPseudoClassId,
|
||||
\ jsTemplateExpression,
|
||||
\ typescriptInterpolation,typescriptTemplateSubstitution
|
||||
|
||||
" define custom css elements to not utilize cssDefinition
|
||||
syn region cssCustomMediaBlock contained fold transparent matchgroup=cssBraces
|
||||
\ start="{" end="}"
|
||||
\ contains=css.*Attr,css.*Prop,cssComment,cssValue.*,cssColor,cssURL,
|
||||
\ cssImportant,cssError,cssStringQ,cssStringQQ,cssFunction,
|
||||
\ cssUnicodeEscape,cssVendor,cssTagName,cssClassName,
|
||||
\ cssIdentifier,cssPseudoClass,cssSelectorOp,cssSelectorOp2,
|
||||
\ cssAttributeSelector
|
||||
syn region cssCustomPageWrap contained transparent matchgroup=cssBraces
|
||||
\ start="{" end="}"
|
||||
\ contains=cssPageMargin,cssPageProp,cssCustomAttrRegion,css.*Prop,
|
||||
\ cssComment,cssValue.*,cssColor,cssURL,cssImportant,cssError,
|
||||
\ cssStringQ,cssStringQQ,cssFunction,cssUnicodeEscape,cssVendor,
|
||||
\ cssHacks
|
||||
syn match cssCustomPageMargin contained skipwhite skipnl
|
||||
\ "@\%(\%(top\|left\|right\|bottom\)-\%(left\|center\|right\|middle\|bottom\)\)\%(-corner\)\="
|
||||
syn match cssCustomKeyFrameSelector "\%(\d*%\|\<from\>\|\<to\>\)" contained
|
||||
\ skipwhite skipnl
|
||||
|
||||
" define css include customly to overwrite nextgroup
|
||||
syn region cssInclude start="@media\>" end="\ze{" skipwhite skipnl
|
||||
\ contains=cssMediaProp,cssValueLength,cssMediaKeyword,cssValueInteger,
|
||||
\ cssMediaMediaAttr,cssVencor,cssMediaType,cssIncludeKeyword,
|
||||
\ cssMediaComma,cssComment
|
||||
\ nextgroup=cssCustomMediaBlock
|
||||
|
||||
" define all non-contained css definitions
|
||||
syn cluster CSSTop
|
||||
\ contains=cssTagName,cssSelectorOp,cssAttributeSelector,cssClassName,
|
||||
\ cssBraces,cssIdentifier,cssIncludeKeyword,cssPage,cssKeyFrame,
|
||||
\ cssFontDescriptor,cssAttrComma,cssPseudoClass,cssUnicodeEscape
|
||||
|
||||
" custom highlights for styled components
|
||||
" - "&" inside top level
|
||||
" - cssTagName inside of jsStrings inside of styledPrefix regions
|
||||
" TODO: override highlighting of cssTagName with more subtle one
|
||||
syn match styledAmpersand contained "&"
|
||||
syn region styledTagNameString matchgroup=jsString contained
|
||||
\ start=+'+ end=+'+ skip=+\\\%(\'\|$\)+
|
||||
\ contains=cssTagName
|
||||
syn region styledTagNameString matchgroup=jsString contained
|
||||
\ start=+"+ end=+"+ skip=+\\\%(\"\|$\)+
|
||||
\ contains=cssTagName
|
||||
syn region styledTagNameString matchgroup=jsString contained
|
||||
\ start=+`+ end=+`+ skip=+\\\%(\`\|$\)+
|
||||
\ contains=cssTagName
|
||||
|
||||
" define custom API sections that trigger the styledDefinition highlighting
|
||||
syn match styledPrefix "\<styled\>\.\k\+"
|
||||
\ transparent fold
|
||||
\ nextgroup=styledDefinition
|
||||
\ contains=cssTagName,javascriptTagRef
|
||||
\ containedin=jsFuncBlock
|
||||
syn match styledPrefix "\.\<attrs\>\s*(\%(\n\|\s\|.\)\{-})"
|
||||
\ transparent fold extend
|
||||
\ nextgroup=styledDefinition
|
||||
\ contains=jsObject,jsParen
|
||||
\ containedin=jsFuncBlock
|
||||
syn match styledPrefix "\.\<extend\>"
|
||||
\ transparent fold
|
||||
\ nextgroup=styledDefinition
|
||||
\ containedin=jsFuncBlock
|
||||
|
||||
" define custom API section, that contains typescript annotations
|
||||
" this is structurally similar to `jsFuncCall`, but allows type
|
||||
" annotations (delimited by brackets (e.g. "<>")) between `styled` and
|
||||
" the function call parenthesis
|
||||
syn match styledTypescriptPrefix
|
||||
\ "\<styled\><\%(\[\|\]\|{\|}\||\|&\|:\|;\|,\|?\|'\|\"\|\k\|\s\|\n\)\+>(\%('\k\+'\|\"\k\+\"\|\k\+\))"
|
||||
\ transparent fold
|
||||
\ nextgroup=styledDefinition
|
||||
\ contains=cssTagName,
|
||||
\ typescriptBraces,typescriptOpSymbols,typescriptEndColons,
|
||||
\ typescriptParens,typescriptStringS,@typescriptType,
|
||||
\ typescriptType,
|
||||
\ styledTagNameString
|
||||
syn match styledTypescriptPrefix
|
||||
\ "\<styled\>\%((\%('\k\+'\|\"\k\+\"\|\k\+\))\|\.\k\+\)<\%(\[\|\]\|{\|}\||\|&\|:\|;\|,\|?\|'\|\"\|\k\|\s\|\n\)\+>"
|
||||
\ transparent fold
|
||||
\ nextgroup=styledDefinition
|
||||
\ contains=cssTagName,
|
||||
\ typescriptBraces,typescriptOpSymbols,typescriptEndColons,
|
||||
\ typescriptParens,typescriptStringS,@typescriptType,
|
||||
\ typescriptType,
|
||||
\ styledTagNameString
|
||||
syn match styledTypescriptPrefix "\.\<attrs\>\s*(\%(\n\|\s\|.\)\{-})<\%(\[\|\]\|{\|}\||\|&\|:\|;\|,\|?\|'\|\"\|\k\|\s\|\n\)\+>"
|
||||
\ transparent fold extend
|
||||
\ nextgroup=styledDefinition
|
||||
\ contains=cssTagName,
|
||||
\ typescriptBraces,typescriptOpSymbols,typescriptEndColons,
|
||||
\ typescriptParens,typescriptStringS,@typescriptType,
|
||||
\ typescriptType,
|
||||
\ styledTagNameString
|
||||
syn match styledTypescriptPrefix "\.\<extend\><\%(\[\|\]\|{\|}\||\|&\|:\|;\|,\|?\|'\|\"\|\k\|\s\|\n\)\+>"
|
||||
\ transparent fold extend
|
||||
\ nextgroup=styledDefinition
|
||||
\ contains=cssTagName,
|
||||
\ typescriptBraces,typescriptOpSymbols,typescriptEndColons,
|
||||
\ typescriptParens,typescriptStringS,@typescriptType,
|
||||
\ typescriptType,
|
||||
\ styledTagNameString
|
||||
|
||||
" define emotion css prop
|
||||
" to bypass problems from top-level defined xml/js definitions, this
|
||||
" plugin re-defines keywords/noise for highlighting inside of the custom
|
||||
" xmlAttrib definition
|
||||
syn keyword styledXmlRegionKeyword css contained
|
||||
syn match styledXmlRegionNoise "\%(=\|{\|}\)" contained
|
||||
" only include styledDefinitions inside of xmlAttribs, that are wrapped
|
||||
" in `css={}` regions, `keepend` is necessary to correctly break on the
|
||||
" higher-level xmlAttrib region end
|
||||
syn region styledXmlRegion
|
||||
\ start="\<css\>={" end="}"
|
||||
\ keepend fold
|
||||
\ containedin=xmlAttrib
|
||||
\ contains=styledXmlRegionKeyword,styledXmlRegionNoise,styledDefinition
|
||||
|
||||
" define nested region for indenting
|
||||
syn region styledNestedRegion contained transparent
|
||||
\ matchgroup=cssBraces
|
||||
\ start="{" end="}"
|
||||
|
||||
" re-define cssError to be highlighted correctly in styledNestedRegion
|
||||
syn match cssError contained "{@<>"
|
||||
|
||||
" extend javascript matches to trigger styledDefinition highlighting
|
||||
syn match jsTaggedTemplate extend
|
||||
\ "\<css\>\|\<keyframes\>\|\<injectGlobal\>\|\<fontFace\>\|\<createGlobalStyle\>"
|
||||
\ nextgroup=styledDefinition
|
||||
syn match jsFuncCall "\<styled\>\s*(.\+)" transparent
|
||||
\ nextgroup=styledDefinition
|
||||
syn match jsFuncCall "\<styled\>\s*(\%('\k\+'\|\"\k\+\"\|`\k\+`\))"
|
||||
\ contains=styledTagNameString
|
||||
\ nextgroup=styledDefinition
|
||||
syn match jsFuncCall "\<styled\>\s*(\%('\k\+'\|\"\k\+\"\|`\k\+`\))<\%(\[\|\]\|{\|}\||\|&\|:\|;\|,\|?\|'\|\"\|\k\|\s\|\n\)\+>"
|
||||
\ contains=typescriptBraces,typescriptOpSymbols,typescriptEndColons,
|
||||
\ typescriptParens,typescriptStringS,@typescriptType,
|
||||
\ typescriptType,
|
||||
\ styledTagNameString
|
||||
\ nextgroup=styledDefinition
|
||||
syn match jsFuncCall "\.\<withComponent\>\s*(\%('\k\+'\|\"\k\+\"\|`\k\+`\))"
|
||||
\ contains=styledTagNameString
|
||||
syn match jsFuncCall "\<dc\>\s*(\%('\k\+'\|\"\k\+\"\|`\k\+`\))\%((\)\@="
|
||||
\ contains=styledTagNameString
|
||||
\ nextgroup=styledDefinitionArgument
|
||||
|
||||
" inject css highlighting into custom jsTemplateString region
|
||||
" - use `extend` to not end all nested jsTemplateExpression on the first
|
||||
" closing one
|
||||
syn region styledDefinition contained transparent fold extend
|
||||
\ start="`" end="`" skip="\\\%(`\|$\)"
|
||||
\ contains=@CSSTop,
|
||||
\ css.*Prop,cssValue.*,cssColor,cssUrl,cssImportant,cssError,
|
||||
\ cssStringQ,cssStringQQ,cssFunction,cssUnicodeEscape,cssVendor,
|
||||
\ cssHacks,
|
||||
\ cssCustom.*,
|
||||
\ jsComment,jsTemplateExpression,
|
||||
\ typescriptInterpolation,typescriptTemplateSubstitution,
|
||||
\ styledAmpersand,styledNestedRegion
|
||||
syn region styledDefinitionArgument contained transparent start=+(+ end=+)+
|
||||
\ contains=styledDefinition
|
||||
|
||||
syn cluster typescriptValue add=styledPrefix,jsFuncCall,styledTypescriptPrefix
|
||||
|
||||
""" yajs specific extensions
|
||||
" define template tag keywords, that trigger styledDefinitions again to be
|
||||
" contained in and also do contain the `javascriptTagRef` region
|
||||
syn match javascriptTagRefStyledPrefix transparent fold
|
||||
\ "\<css\>\|\<keyframes\>\|\<injectGlobal\>\|\<fontFace\>\|\<createGlobalStyle\>"
|
||||
\ containedin=javascriptTagRef
|
||||
\ contains=javascriptTagRef
|
||||
\ nextgroup=styledDefinition
|
||||
" extend the yajs clusters to include the previously and extraneously defined
|
||||
" styled-related matches
|
||||
syn cluster javascriptExpression
|
||||
\ add=styledPrefix,jsFuncCall,javascriptTagRefStyledPrefix
|
||||
syn cluster javascriptAfterIdentifier add=styledPrefix,jsFuncCall
|
||||
|
||||
""" yats specific extensions
|
||||
" extend typescriptIdentifierName to allow styledDefinitions in their
|
||||
" tagged templates
|
||||
syn match typescriptIdentifierName extend
|
||||
\ "\<css\>\|\<keyframes\>\|\<injectGlobal\>\|\<fontFace\>\|\<createGlobalStyle\>"
|
||||
\ nextgroup=styledDefinition
|
||||
|
||||
" color the custom highlight elements
|
||||
hi def link cssCustomKeyFrameSelector Constant
|
||||
hi def link cssCustomPositioningPrefix StorageClass
|
||||
hi def link styledAmpersand Special
|
||||
|
||||
hi def link styledXmlRegionKeyword Type
|
||||
hi def link styledXmlRegionNoise Noise
|
||||
hi def link styledXmlRegion String
|
||||
|
||||
|
||||
if exists("s:current_syntax")
|
||||
let b:current_syntax=s:current_syntax
|
||||
|
||||
endif
|
||||
|
||||
64
after/syntax/javascript/graphql.vim
Normal file
64
after/syntax/javascript/graphql.vim
Normal file
@@ -0,0 +1,64 @@
|
||||
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'graphql') == -1
|
||||
|
||||
" Copyright (c) 2016-2020 Jon Parise <jon@indelible.org>
|
||||
"
|
||||
" Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
" of this software and associated documentation files (the "Software"), to
|
||||
" deal in the Software without restriction, including without limitation the
|
||||
" rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
" sell copies of the Software, and to permit persons to whom the Software is
|
||||
" furnished to do so, subject to the following conditions:
|
||||
"
|
||||
" The above copyright notice and this permission notice shall be included in
|
||||
" all copies or substantial portions of the Software.
|
||||
"
|
||||
" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
" IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
" FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
" AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
" LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
" FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
" IN THE SOFTWARE.
|
||||
"
|
||||
" Language: GraphQL
|
||||
" Maintainer: Jon Parise <jon@indelible.org>
|
||||
|
||||
if exists('b:current_syntax')
|
||||
let s:current_syntax = b:current_syntax
|
||||
unlet b:current_syntax
|
||||
endif
|
||||
syn include @GraphQLSyntax syntax/graphql.vim
|
||||
if exists('s:current_syntax')
|
||||
let b:current_syntax = s:current_syntax
|
||||
endif
|
||||
|
||||
let s:tags = '\%(' . join(graphql#javascript_tags(), '\|') . '\)'
|
||||
|
||||
if graphql#has_syntax_group('jsTemplateExpression')
|
||||
" 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
|
||||
|
||||
hi def link graphqlTemplateString jsTemplateString
|
||||
hi def link graphqlTaggedTemplate jsTaggedTemplate
|
||||
hi def link graphqlTemplateExpression jsTemplateExpression
|
||||
|
||||
syn cluster jsExpression add=graphqlTaggedTemplate
|
||||
syn cluster graphqlTaggedTemplate add=graphqlTemplateString
|
||||
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
|
||||
|
||||
hi def link graphqlTemplateString javaScriptStringT
|
||||
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
|
||||
5
after/syntax/javascriptreact.vim
Normal file
5
after/syntax/javascriptreact.vim
Normal file
@@ -0,0 +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)
|
||||
|
||||
source <sfile>:h/javascript.vim
|
||||
|
||||
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
|
||||
225
after/syntax/jsx_pretty.vim
Normal file
225
after/syntax/jsx_pretty.vim
Normal file
@@ -0,0 +1,225 @@
|
||||
if !exists('g:polyglot_disabled') || !(index(g:polyglot_disabled, 'typescript') != -1 || index(g:polyglot_disabled, 'typescript') != -1 || index(g:polyglot_disabled, 'jsx') != -1)
|
||||
|
||||
let s:highlight_close_tag = get(g:, 'vim_jsx_pretty_highlight_close_tag', 0)
|
||||
|
||||
" detect jsx region
|
||||
syntax region jsxRegion
|
||||
\ start=+\%(\%(\_[([,?:=+\-*/>{}]\|<\s\+\|&&\|||\|=>\|\<return\|\<default\|\<await\|\<yield\)\_s*\)\@<=<\_s*\%(>\|\z(\%(script\|T\s*>\s*(\)\@!\<[_$A-Za-z][-:._$A-Za-z0-9]*\>\)\%(\_s*\%([-+*)\]}&|?,]\|/\%([/*]\|\_s*>\)\@!\)\)\@!\)+
|
||||
\ end=++
|
||||
\ contains=jsxElement
|
||||
|
||||
" <tag id="sample">
|
||||
" ~~~~~~~~~~~~~~~~~
|
||||
" and self close tag
|
||||
" <tag id="sample" />
|
||||
" ~~~~~~~~~~~~~~~~~~~
|
||||
syntax region jsxTag
|
||||
\ start=+<+
|
||||
\ matchgroup=jsxOpenPunct
|
||||
\ end=+>+
|
||||
\ matchgroup=NONE
|
||||
\ end=+\%(/\_s*>\)\@=+
|
||||
\ contained
|
||||
\ contains=jsxOpenTag,jsxAttrib,jsxExpressionBlock,jsxSpreadOperator,jsComment,@javascriptComments,javaScriptLineComment,javaScriptComment,typescriptLineComment,typescriptComment
|
||||
\ keepend
|
||||
\ extend
|
||||
\ skipwhite
|
||||
\ skipempty
|
||||
\ nextgroup=jsxCloseString
|
||||
|
||||
" <tag></tag>
|
||||
" ~~~~~~~~~~~
|
||||
" and fragment
|
||||
" <></>
|
||||
" ~~~~~
|
||||
" and self close tag
|
||||
" <tag />
|
||||
" ~~~~~~~
|
||||
syntax region jsxElement
|
||||
\ start=+<\_s*\%(>\|\${\|\z(\<[-:._$A-Za-z0-9]\+\>\)\)+
|
||||
\ end=+/\_s*>+
|
||||
\ end=+<\_s*/\_s*\z1\_s*>+
|
||||
\ contains=jsxElement,jsxTag,jsxExpressionBlock,jsxComment,jsxCloseTag,@Spell
|
||||
\ keepend
|
||||
\ extend
|
||||
\ contained
|
||||
\ fold
|
||||
|
||||
" <tag key={this.props.key}>
|
||||
" ~~~~
|
||||
" and fragment start tag
|
||||
" <>
|
||||
" ~~
|
||||
exe 'syntax region jsxOpenTag
|
||||
\ matchgroup=jsxOpenPunct
|
||||
\ start=+<+
|
||||
\ end=+>+
|
||||
\ matchgroup=NONE
|
||||
\ end=+\>+
|
||||
\ contained
|
||||
\ contains=jsxTagName
|
||||
\ nextgroup=jsxAttrib
|
||||
\ skipwhite
|
||||
\ skipempty
|
||||
\ ' .(s:highlight_close_tag ? 'transparent' : '')
|
||||
|
||||
|
||||
" <tag key={this.props.key}>
|
||||
" ~~~~~~~~~~~~~~~~
|
||||
syntax region jsxExpressionBlock
|
||||
\ matchgroup=jsxBraces
|
||||
\ start=+{+
|
||||
\ end=+}+
|
||||
\ contained
|
||||
\ extend
|
||||
\ contains=@jsExpression,jsSpreadExpression,@javascriptExpression,javascriptSpreadOp,@javaScriptEmbededExpr,@typescriptExpression,typescriptObjectSpread,jsComment,@javascriptComments,javaScriptLineComment,javaScriptComment,typescriptLineComment,typescriptComment
|
||||
|
||||
" <foo.bar>
|
||||
" ~
|
||||
syntax match jsxDot +\.+ contained
|
||||
|
||||
" <foo:bar>
|
||||
" ~
|
||||
syntax match jsxNamespace +:+ contained
|
||||
|
||||
" <tag id="sample">
|
||||
" ~
|
||||
syntax match jsxEqual +=+ contained skipwhite skipempty nextgroup=jsxString,jsxExpressionBlock,jsxRegion
|
||||
|
||||
" <tag />
|
||||
" ~~
|
||||
syntax match jsxCloseString +/\_s*>+ contained
|
||||
|
||||
" </tag>
|
||||
" ~~~~~~
|
||||
" and fragment close tag
|
||||
" </>
|
||||
" ~~~
|
||||
syntax region jsxCloseTag
|
||||
\ matchgroup=jsxClosePunct
|
||||
\ start=+<\_s*/+
|
||||
\ end=+>+
|
||||
\ contained
|
||||
\ contains=jsxTagName
|
||||
|
||||
" <tag key={this.props.key}>
|
||||
" ~~~
|
||||
syntax match jsxAttrib
|
||||
\ +\<[_$A-Za-z][-:_$A-Za-z0-9]*\>+
|
||||
\ contained
|
||||
\ nextgroup=jsxEqual
|
||||
\ skipwhite
|
||||
\ skipempty
|
||||
\ contains=jsxAttribKeyword,jsxNamespace
|
||||
|
||||
" <MyComponent ...>
|
||||
" ~~~~~~~~~~~
|
||||
" NOT
|
||||
" <someCamel ...>
|
||||
" ~~~~~
|
||||
exe 'syntax match jsxComponentName
|
||||
\ +\<[_$]\?[A-Z][-_$A-Za-z0-9]*\>+
|
||||
\ contained
|
||||
\ ' .(s:highlight_close_tag ? 'transparent' : '')
|
||||
|
||||
" <tag key={this.props.key}>
|
||||
" ~~~
|
||||
exe 'syntax match jsxTagName
|
||||
\ +\<[-:._$A-Za-z0-9]\+\>+
|
||||
\ contained
|
||||
\ contains=jsxComponentName,jsxDot,jsxNamespace
|
||||
\ nextgroup=jsxAttrib
|
||||
\ skipempty
|
||||
\ skipwhite
|
||||
\ ' .(s:highlight_close_tag ? 'transparent' : '')
|
||||
|
||||
" <tag id="sample">
|
||||
" ~~~~~~~~
|
||||
" and
|
||||
" <tag id='sample'>
|
||||
" ~~~~~~~~
|
||||
syntax region jsxString start=+\z(["']\)+ skip=+\\\\\|\\\z1\|\\\n+ end=+\z1+ contained contains=@Spell
|
||||
|
||||
let s:tags = get(g:, 'vim_jsx_pretty_template_tags', ['html', 'jsx'])
|
||||
let s:enable_tagged_jsx = !empty(s:tags)
|
||||
|
||||
" add support to JSX inside the tagged template string
|
||||
" https://github.com/developit/htm
|
||||
if s:enable_tagged_jsx
|
||||
exe 'syntax match jsxRegion +\%(' . join(s:tags, '\|') . '\)\%(\_s*`\)\@=+ contains=jsTemplateStringTag,jsTaggedTemplate,javascriptTagRef skipwhite skipempty nextgroup=jsxTaggedRegion'
|
||||
|
||||
syntax region jsxTaggedRegion
|
||||
\ matchgroup=jsxBackticks
|
||||
\ start=+`+
|
||||
\ end=+`+
|
||||
\ extend
|
||||
\ contained
|
||||
\ contains=jsxElement,jsxExpressionBlock
|
||||
\ transparent
|
||||
|
||||
syntax region jsxExpressionBlock
|
||||
\ matchgroup=jsxBraces
|
||||
\ start=+\${+
|
||||
\ end=+}+
|
||||
\ extend
|
||||
\ contained
|
||||
\ contains=@jsExpression,jsSpreadExpression,@javascriptExpression,javascriptSpreadOp,@javaScriptEmbededExpr,@typescriptExpression,typescriptObjectSpread
|
||||
|
||||
syntax region jsxOpenTag
|
||||
\ matchgroup=jsxOpenPunct
|
||||
\ start=+<\%(\${\)\@=+
|
||||
\ matchgroup=NONE
|
||||
\ end=+}\@1<=+
|
||||
\ contained
|
||||
\ contains=jsxExpressionBlock
|
||||
\ skipwhite
|
||||
\ skipempty
|
||||
\ nextgroup=jsxAttrib,jsxSpreadOperator
|
||||
|
||||
syntax keyword jsxAttribKeyword class contained
|
||||
|
||||
syntax match jsxSpreadOperator +\.\.\.+ contained nextgroup=jsxExpressionBlock skipwhite
|
||||
|
||||
syntax match jsxCloseTag +<//>+ contained
|
||||
|
||||
syntax match jsxComment +<!--\_.\{-}-->+
|
||||
endif
|
||||
|
||||
" Highlight the tag name
|
||||
highlight def link jsxTag Function
|
||||
highlight def link jsxTagName Identifier
|
||||
highlight def link jsxComponentName Function
|
||||
|
||||
highlight def link jsxAttrib Type
|
||||
highlight def link jsxAttribKeyword jsxAttrib
|
||||
highlight def link jsxString String
|
||||
highlight def link jsxComment Comment
|
||||
|
||||
highlight def link jsxDot Operator
|
||||
highlight def link jsxNamespace Operator
|
||||
highlight def link jsxEqual Operator
|
||||
highlight def link jsxSpreadOperator Operator
|
||||
highlight def link jsxBraces Special
|
||||
|
||||
if s:highlight_close_tag
|
||||
highlight def link jsxCloseString Identifier
|
||||
highlight def link jsxOpenPunct jsxTag
|
||||
else
|
||||
" Highlight the jsxCloseString (i.e. />), jsxPunct (i.e. <,>) and jsxCloseTag (i.e. <//>)
|
||||
highlight def link jsxCloseString Comment
|
||||
highlight def link jsxOpenPunct jsxPunct
|
||||
endif
|
||||
|
||||
highlight def link jsxPunct jsxCloseString
|
||||
highlight def link jsxClosePunct jsxPunct
|
||||
highlight def link jsxCloseTag jsxCloseString
|
||||
|
||||
let s:vim_jsx_pretty_colorful_config = get(g:, 'vim_jsx_pretty_colorful_config', 0)
|
||||
|
||||
if s:vim_jsx_pretty_colorful_config == 1
|
||||
highlight def link jsObjectKey Label
|
||||
highlight def link jsArrowFuncArgs Type
|
||||
highlight def link jsFuncArgs Type
|
||||
endif
|
||||
|
||||
endif
|
||||
@@ -1,6 +1,4 @@
|
||||
if exists('g:polyglot_disabled') && index(g:polyglot_disabled, 'llvm') != -1
|
||||
finish
|
||||
endif
|
||||
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'llvm') == -1
|
||||
|
||||
" Copyright (c) 2018 rhysd
|
||||
"
|
||||
@@ -24,3 +22,5 @@ endif
|
||||
|
||||
syn keyword llvmKeyword attributes
|
||||
syn match llvmNoName /#\d\+\>/
|
||||
|
||||
endif
|
||||
|
||||
@@ -1,6 +1,4 @@
|
||||
if exists('g:polyglot_disabled') && index(g:polyglot_disabled, 'mdx') != -1
|
||||
finish
|
||||
endif
|
||||
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'mdx') == -1
|
||||
|
||||
|
||||
" based on mxw/vim-jsx
|
||||
@@ -43,3 +41,5 @@ syn cluster jsExpression add=jsxRegion
|
||||
|
||||
" Allow jsxRegion to contain reserved words.
|
||||
syn cluster javascriptNoReserved add=jsxRegion
|
||||
|
||||
endif
|
||||
|
||||
@@ -1,20 +1,14 @@
|
||||
if exists('g:polyglot_disabled') && index(g:polyglot_disabled, 'mathematica') != -1
|
||||
finish
|
||||
endif
|
||||
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'mathematica') == -1
|
||||
|
||||
"Vim conceal file
|
||||
" Language: Mathematica
|
||||
" Maintainer: Voldikss <dyzplus@gmail.com>
|
||||
" Last Change: 2019 Jan 23 by Voldikss
|
||||
" Source: https://github.com/voldikss/vim-mma/after/syntax/mma.vim
|
||||
" Credits:
|
||||
" Rsmenon: https://github.com/rsmenon
|
||||
" Maintainer: R. Menon <rsmenon@icloud.com>
|
||||
" Last Change: Feb 25, 2013
|
||||
|
||||
if (exists('g:mma_candy') && g:mma_candy == 0) || !has('conceal') || &enc != 'utf-8'
|
||||
finish
|
||||
endif
|
||||
|
||||
|
||||
"These are fairly safe and straightforward conceals
|
||||
if exists('g:mma_candy') && g:mma_candy > 0
|
||||
"Rules
|
||||
@@ -1448,3 +1442,5 @@ endif
|
||||
hi! link Conceal Normal
|
||||
setlocal conceallevel=2
|
||||
|
||||
|
||||
endif
|
||||
|
||||
@@ -1,6 +1,4 @@
|
||||
if exists('g:polyglot_disabled') && index(g:polyglot_disabled, 'objc') != -1
|
||||
finish
|
||||
endif
|
||||
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'objc') == -1
|
||||
|
||||
" ARC type modifiers
|
||||
syn keyword objcTypeModifier __bridge __bridge_retained __bridge_transfer __autoreleasing __strong __weak __unsafe_unretained
|
||||
@@ -21,3 +19,5 @@ syn match objcDirective "@property\|@synthesize\|@dynamic\|@package"
|
||||
|
||||
" Highlight property attributes as if they were type modifiers
|
||||
hi def link objcPropertyAttribute objcTypeModifier
|
||||
|
||||
endif
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
if exists('g:polyglot_disabled') && index(g:polyglot_disabled, 'reason') != -1
|
||||
finish
|
||||
endif
|
||||
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'reason') == -1
|
||||
|
||||
|
||||
endif
|
||||
|
||||
@@ -1,6 +1,4 @@
|
||||
if exists('g:polyglot_disabled') && index(g:polyglot_disabled, 'rspec') != -1
|
||||
finish
|
||||
endif
|
||||
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'rspec') == -1
|
||||
|
||||
"
|
||||
" An rspec syntax file
|
||||
@@ -11,26 +9,185 @@ endif
|
||||
runtime! syntax/ruby.vim
|
||||
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
|
||||
highlight link rspecGroupMethods Type
|
||||
setlocal commentstring=#\ %s
|
||||
|
||||
syntax keyword rspecBeforeAndAfter after after_suite_parts append_after append_before before before_suite_parts prepend_after prepend_before around
|
||||
highlight link rspecBeforeAndAfter Statement
|
||||
syntax keyword rspecGroupMethods
|
||||
\ 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
|
||||
highlight link rspecMocks Constant
|
||||
syntax keyword rspecBeforeAndAfter
|
||||
\ 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
|
||||
highlight link rspecMockMethods Function
|
||||
syntax keyword rspecMocks
|
||||
\ double
|
||||
\ instance_double
|
||||
\ instance_spy
|
||||
\ mock
|
||||
\ spy
|
||||
\ stub
|
||||
\ stub_chain
|
||||
\ stub_const
|
||||
|
||||
syntax keyword rspecKeywords should should_not should_not_receive should_receive
|
||||
highlight link rspecKeywords Constant
|
||||
syntax keyword rspecMockMethods
|
||||
\ 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\+\>/
|
||||
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
|
||||
|
||||
let b:current_syntax = 'rspec'
|
||||
|
||||
endif
|
||||
|
||||
@@ -1,6 +1,4 @@
|
||||
if exists('g:polyglot_disabled') && index(g:polyglot_disabled, 'yard') != -1
|
||||
finish
|
||||
endif
|
||||
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'yard') == -1
|
||||
|
||||
" Ruby syntax extensions for highlighting YARD documentation.
|
||||
"
|
||||
@@ -128,3 +126,5 @@ hi def link yardParametricType yardComment
|
||||
hi def link yardArrow yardComment
|
||||
hi def link yardHashAngle yardComment
|
||||
hi def link yardHashCurly yardComment
|
||||
|
||||
endif
|
||||
|
||||
@@ -1,6 +1,4 @@
|
||||
if exists('g:polyglot_disabled') && index(g:polyglot_disabled, 'rust') != -1
|
||||
finish
|
||||
endif
|
||||
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'rust') == -1
|
||||
|
||||
scriptencoding utf-8
|
||||
|
||||
@@ -43,3 +41,5 @@ if !get(g:, 'rust_conceal_mod_path', 0)
|
||||
endif
|
||||
|
||||
" vim: set et sw=4 sts=4 ts=8:
|
||||
|
||||
endif
|
||||
|
||||
@@ -1,13 +1,11 @@
|
||||
if exists('g:polyglot_disabled') && index(g:polyglot_disabled, 'latex') != -1
|
||||
finish
|
||||
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'latex') == -1
|
||||
|
||||
" vimtex - LaTeX plugin for Vim
|
||||
"
|
||||
" Maintainer: Karl Yngve Lervåg
|
||||
" Email: karl.yngve@gmail.com
|
||||
"
|
||||
|
||||
call vimtex#syntax#init()
|
||||
|
||||
endif
|
||||
|
||||
" 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*\(\[.*\]\)\={.\{-}}"
|
||||
|
||||
63
after/syntax/tsx.vim
Normal file
63
after/syntax/tsx.vim
Normal file
@@ -0,0 +1,63 @@
|
||||
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
|
||||
hi def link typescriptTypeBrackets typescriptOpSymbols
|
||||
endif
|
||||
|
||||
runtime syntax/jsx_pretty.vim
|
||||
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
|
||||
|
||||
let b:current_syntax = 'typescript.tsx'
|
||||
|
||||
let &cpo = s:jsx_cpo
|
||||
unlet s:jsx_cpo
|
||||
|
||||
endif
|
||||
@@ -1,303 +0,0 @@
|
||||
if exists('g:polyglot_disabled') && index(g:polyglot_disabled, 'jsx') != -1
|
||||
finish
|
||||
endif
|
||||
|
||||
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
|
||||
" Vim syntax file
|
||||
"
|
||||
" Language: javascript.jsx
|
||||
" Maintainer: MaxMellon <maxmellon1994@gmail.com>
|
||||
" Depends: leafgarland/typescript-vim
|
||||
"
|
||||
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
|
||||
|
||||
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
|
||||
|
||||
" add a typescriptBlock group for typescript
|
||||
syntax region typescriptBlock
|
||||
\ contained
|
||||
\ matchgroup=typescriptBraces
|
||||
\ start="{"
|
||||
\ end="}"
|
||||
\ extend
|
||||
\ contains=@typescriptAll,@typescriptExpression,typescriptBlock
|
||||
\ fold
|
||||
|
||||
" because this is autoloaded, when developing you're going to need to source
|
||||
" the autoload/jsx_pretty/*.vim file manually, or restart vim
|
||||
call jsx_pretty#syntax#highlight()
|
||||
|
||||
syntax cluster typescriptExpression add=jsxRegion
|
||||
|
||||
let b:current_syntax = 'typescript.tsx'
|
||||
|
||||
let &cpo = s:jsx_cpo
|
||||
unlet s:jsx_cpo
|
||||
if exists('g:polyglot_disabled') && index(g:polyglot_disabled, 'styled-components') != -1
|
||||
finish
|
||||
endif
|
||||
|
||||
" Vim syntax file
|
||||
" Language: styled-components (js/ts)
|
||||
" Maintainer: Karl Fleischmann <fleischmann.karl@gmail.com>
|
||||
" URL: https://github.com/styled-components/vim-styled-components
|
||||
|
||||
if exists("b:current_syntax")
|
||||
let s:current_syntax=b:current_syntax
|
||||
unlet b:current_syntax
|
||||
endif
|
||||
|
||||
|
||||
" fix for "-" before cssPositioningProp
|
||||
" - needs to be above CSS include to not match cssVendor definitions
|
||||
syn region cssCustomPositioningPrefix contained
|
||||
\ start='-' end='\%(\s\{-}:\)\@='
|
||||
\ contains=cssPositioningProp
|
||||
|
||||
" introduce CSS cluster from built-in (or single third party syntax file)
|
||||
syn include @CSS syntax/css.vim
|
||||
|
||||
" try to include CSS3 definitions from multiple files
|
||||
" this is only possible on vim version above 7
|
||||
if v:version >= 700
|
||||
try
|
||||
syn include @CSS3 syntax/css/*.vim
|
||||
catch
|
||||
endtry
|
||||
endif
|
||||
|
||||
" TODO: include react-native keywords
|
||||
|
||||
" define custom cssAttrRegion
|
||||
" - add ",", "`" and "{" to the end characters
|
||||
" - add "cssPseudoClassId" to it's containing elements
|
||||
" this will incorrectly highlight pseudo elements incorrectly used as
|
||||
" attributes but correctly highlight actual attributes
|
||||
syn region cssCustomAttrRegion contained
|
||||
\ start=":" end="\ze\%(;\|)\|{\|}\|`\)"
|
||||
\ contains=css.*Attr,cssColor,cssImportant,cssValue.*,cssFunction,
|
||||
\ cssString.*,cssURL,cssComment,cssUnicodeEscape,cssVendor,
|
||||
\ cssError,cssAttrComma,cssNoise,cssPseudoClassId,
|
||||
\ jsTemplateExpression,
|
||||
\ typescriptInterpolation,typescriptTemplateSubstitution
|
||||
syn region cssCustomAttrRegion contained
|
||||
\ start="transition\s*:" end="\ze\%(;\|)\|{\|}\|`\)"
|
||||
\ contains=css.*Prop,css.*Attr,cssColor,cssImportant,cssValue.*,
|
||||
\ cssFunction,cssString.*,cssURL,cssComment,cssUnicodeEscape,
|
||||
\ cssVendor,cssError,cssAttrComma,cssNoise,cssPseudoClassId,
|
||||
\ jsTemplateExpression,
|
||||
\ typescriptInterpolation,typescriptTemplateSubstitution
|
||||
|
||||
" define custom css elements to not utilize cssDefinition
|
||||
syn region cssCustomMediaBlock contained fold transparent matchgroup=cssBraces
|
||||
\ start="{" end="}"
|
||||
\ contains=css.*Attr,css.*Prop,cssComment,cssValue.*,cssColor,cssURL,
|
||||
\ cssImportant,cssError,cssStringQ,cssStringQQ,cssFunction,
|
||||
\ cssUnicodeEscape,cssVendor,cssTagName,cssClassName,
|
||||
\ cssIdentifier,cssPseudoClass,cssSelectorOp,cssSelectorOp2,
|
||||
\ cssAttributeSelector
|
||||
syn region cssCustomPageWrap contained transparent matchgroup=cssBraces
|
||||
\ start="{" end="}"
|
||||
\ contains=cssPageMargin,cssPageProp,cssCustomAttrRegion,css.*Prop,
|
||||
\ cssComment,cssValue.*,cssColor,cssURL,cssImportant,cssError,
|
||||
\ cssStringQ,cssStringQQ,cssFunction,cssUnicodeEscape,cssVendor,
|
||||
\ cssHacks
|
||||
syn match cssCustomPageMargin contained skipwhite skipnl
|
||||
\ "@\%(\%(top\|left\|right\|bottom\)-\%(left\|center\|right\|middle\|bottom\)\)\%(-corner\)\="
|
||||
syn match cssCustomKeyFrameSelector "\%(\d*%\|\<from\>\|\<to\>\)" contained
|
||||
\ skipwhite skipnl
|
||||
|
||||
" define css include customly to overwrite nextgroup
|
||||
syn region cssInclude start="@media\>" end="\ze{" skipwhite skipnl
|
||||
\ contains=cssMediaProp,cssValueLength,cssMediaKeyword,cssValueInteger,
|
||||
\ cssMediaMediaAttr,cssVencor,cssMediaType,cssIncludeKeyword,
|
||||
\ cssMediaComma,cssComment
|
||||
\ nextgroup=cssCustomMediaBlock
|
||||
|
||||
" define all non-contained css definitions
|
||||
syn cluster CSSTop
|
||||
\ contains=cssTagName,cssSelectorOp,cssAttributeSelector,cssClassName,
|
||||
\ cssBraces,cssIdentifier,cssIncludeKeyword,cssPage,cssKeyFrame,
|
||||
\ cssFontDescriptor,cssAttrComma,cssPseudoClass,cssUnicodeEscape
|
||||
|
||||
" custom highlights for styled components
|
||||
" - "&" inside top level
|
||||
" - cssTagName inside of jsStrings inside of styledPrefix regions
|
||||
" TODO: override highlighting of cssTagName with more subtle one
|
||||
syn match styledAmpersand contained "&"
|
||||
syn region styledTagNameString matchgroup=jsString contained
|
||||
\ start=+'+ end=+'+ skip=+\\\%(\'\|$\)+
|
||||
\ contains=cssTagName
|
||||
syn region styledTagNameString matchgroup=jsString contained
|
||||
\ start=+"+ end=+"+ skip=+\\\%(\"\|$\)+
|
||||
\ contains=cssTagName
|
||||
syn region styledTagNameString matchgroup=jsString contained
|
||||
\ start=+`+ end=+`+ skip=+\\\%(\`\|$\)+
|
||||
\ contains=cssTagName
|
||||
|
||||
" define custom API sections that trigger the styledDefinition highlighting
|
||||
syn match styledPrefix "\<styled\>\.\k\+"
|
||||
\ transparent fold
|
||||
\ nextgroup=styledDefinition
|
||||
\ contains=cssTagName,javascriptTagRef
|
||||
\ containedin=jsFuncBlock
|
||||
syn match styledPrefix "\.\<attrs\>\s*(\%(\n\|\s\|.\)\{-})"
|
||||
\ transparent fold extend
|
||||
\ nextgroup=styledDefinition
|
||||
\ contains=jsObject,jsParen
|
||||
\ containedin=jsFuncBlock
|
||||
syn match styledPrefix "\.\<extend\>"
|
||||
\ transparent fold
|
||||
\ nextgroup=styledDefinition
|
||||
\ containedin=jsFuncBlock
|
||||
|
||||
" define custom API section, that contains typescript annotations
|
||||
" this is structurally similar to `jsFuncCall`, but allows type
|
||||
" annotations (delimited by brackets (e.g. "<>")) between `styled` and
|
||||
" the function call parenthesis
|
||||
syn match styledTypescriptPrefix
|
||||
\ "\<styled\><\%(\[\|\]\|{\|}\||\|&\|:\|;\|,\|?\|'\|\"\|\k\|\s\|\n\)\+>(\%('\k\+'\|\"\k\+\"\|\k\+\))"
|
||||
\ transparent fold
|
||||
\ nextgroup=styledDefinition
|
||||
\ contains=cssTagName,
|
||||
\ typescriptBraces,typescriptOpSymbols,typescriptEndColons,
|
||||
\ typescriptParens,typescriptStringS,@typescriptType,
|
||||
\ typescriptType,
|
||||
\ styledTagNameString
|
||||
syn match styledTypescriptPrefix
|
||||
\ "\<styled\>\%((\%('\k\+'\|\"\k\+\"\|\k\+\))\|\.\k\+\)<\%(\[\|\]\|{\|}\||\|&\|:\|;\|,\|?\|'\|\"\|\k\|\s\|\n\)\+>"
|
||||
\ transparent fold
|
||||
\ nextgroup=styledDefinition
|
||||
\ contains=cssTagName,
|
||||
\ typescriptBraces,typescriptOpSymbols,typescriptEndColons,
|
||||
\ typescriptParens,typescriptStringS,@typescriptType,
|
||||
\ typescriptType,
|
||||
\ styledTagNameString
|
||||
syn match styledTypescriptPrefix "\.\<attrs\>\s*(\%(\n\|\s\|.\)\{-})<\%(\[\|\]\|{\|}\||\|&\|:\|;\|,\|?\|'\|\"\|\k\|\s\|\n\)\+>"
|
||||
\ transparent fold extend
|
||||
\ nextgroup=styledDefinition
|
||||
\ contains=cssTagName,
|
||||
\ typescriptBraces,typescriptOpSymbols,typescriptEndColons,
|
||||
\ typescriptParens,typescriptStringS,@typescriptType,
|
||||
\ typescriptType,
|
||||
\ styledTagNameString
|
||||
syn match styledTypescriptPrefix "\.\<extend\><\%(\[\|\]\|{\|}\||\|&\|:\|;\|,\|?\|'\|\"\|\k\|\s\|\n\)\+>"
|
||||
\ transparent fold extend
|
||||
\ nextgroup=styledDefinition
|
||||
\ contains=cssTagName,
|
||||
\ typescriptBraces,typescriptOpSymbols,typescriptEndColons,
|
||||
\ typescriptParens,typescriptStringS,@typescriptType,
|
||||
\ typescriptType,
|
||||
\ styledTagNameString
|
||||
|
||||
" define emotion css prop
|
||||
" to bypass problems from top-level defined xml/js definitions, this
|
||||
" plugin re-defines keywords/noise for highlighting inside of the custom
|
||||
" xmlAttrib definition
|
||||
syn keyword styledXmlRegionKeyword css contained
|
||||
syn match styledXmlRegionNoise "\%(=\|{\|}\)" contained
|
||||
" only include styledDefinitions inside of xmlAttribs, that are wrapped
|
||||
" in `css={}` regions, `keepend` is necessary to correctly break on the
|
||||
" higher-level xmlAttrib region end
|
||||
syn region styledXmlRegion
|
||||
\ start="\<css\>={" end="}"
|
||||
\ keepend fold
|
||||
\ containedin=xmlAttrib
|
||||
\ contains=styledXmlRegionKeyword,styledXmlRegionNoise,styledDefinition
|
||||
|
||||
" define nested region for indenting
|
||||
syn region styledNestedRegion contained transparent
|
||||
\ matchgroup=cssBraces
|
||||
\ start="{" end="}"
|
||||
|
||||
" re-define cssError to be highlighted correctly in styledNestedRegion
|
||||
syn match cssError contained "{@<>"
|
||||
|
||||
" extend javascript matches to trigger styledDefinition highlighting
|
||||
syn match jsTaggedTemplate extend
|
||||
\ "\<css\>\|\<keyframes\>\|\<injectGlobal\>\|\<fontFace\>\|\<createGlobalStyle\>"
|
||||
\ nextgroup=styledDefinition
|
||||
syn match jsFuncCall "\<styled\>\s*(.\+)" transparent
|
||||
\ nextgroup=styledDefinition
|
||||
syn match jsFuncCall "\<styled\>\s*(\%('\k\+'\|\"\k\+\"\|`\k\+`\))"
|
||||
\ contains=styledTagNameString
|
||||
\ nextgroup=styledDefinition
|
||||
syn match jsFuncCall "\<styled\>\s*(\%('\k\+'\|\"\k\+\"\|`\k\+`\))<\%(\[\|\]\|{\|}\||\|&\|:\|;\|,\|?\|'\|\"\|\k\|\s\|\n\)\+>"
|
||||
\ contains=typescriptBraces,typescriptOpSymbols,typescriptEndColons,
|
||||
\ typescriptParens,typescriptStringS,@typescriptType,
|
||||
\ typescriptType,
|
||||
\ styledTagNameString
|
||||
\ nextgroup=styledDefinition
|
||||
syn match jsFuncCall "\.\<withComponent\>\s*(\%('\k\+'\|\"\k\+\"\|`\k\+`\))"
|
||||
\ contains=styledTagNameString
|
||||
syn match jsFuncCall "\<dc\>\s*(\%('\k\+'\|\"\k\+\"\|`\k\+`\))\%((\)\@="
|
||||
\ contains=styledTagNameString
|
||||
\ nextgroup=styledDefinitionArgument
|
||||
|
||||
" inject css highlighting into custom jsTemplateString region
|
||||
" - use `extend` to not end all nested jsTemplateExpression on the first
|
||||
" closing one
|
||||
syn region styledDefinition contained transparent fold extend
|
||||
\ start="`" end="`" skip="\\\%(`\|$\)"
|
||||
\ contains=@CSSTop,
|
||||
\ css.*Prop,cssValue.*,cssColor,cssUrl,cssImportant,cssError,
|
||||
\ cssStringQ,cssStringQQ,cssFunction,cssUnicodeEscape,cssVendor,
|
||||
\ cssHacks,
|
||||
\ cssCustom.*,
|
||||
\ jsComment,jsTemplateExpression,
|
||||
\ typescriptInterpolation,typescriptTemplateSubstitution,
|
||||
\ styledAmpersand,styledNestedRegion
|
||||
syn region styledDefinitionArgument contained transparent start=+(+ end=+)+
|
||||
\ contains=styledDefinition
|
||||
|
||||
syn cluster typescriptValue add=styledPrefix,jsFuncCall,styledTypescriptPrefix
|
||||
|
||||
""" yajs specific extensions
|
||||
" define template tag keywords, that trigger styledDefinitions again to be
|
||||
" contained in and also do contain the `javascriptTagRef` region
|
||||
syn match javascriptTagRefStyledPrefix transparent fold
|
||||
\ "\<css\>\|\<keyframes\>\|\<injectGlobal\>\|\<fontFace\>\|\<createGlobalStyle\>"
|
||||
\ containedin=javascriptTagRef
|
||||
\ contains=javascriptTagRef
|
||||
\ nextgroup=styledDefinition
|
||||
" extend the yajs clusters to include the previously and extraneously defined
|
||||
" styled-related matches
|
||||
syn cluster javascriptExpression
|
||||
\ add=styledPrefix,jsFuncCall,javascriptTagRefStyledPrefix
|
||||
syn cluster javascriptAfterIdentifier add=styledPrefix,jsFuncCall
|
||||
|
||||
""" yats specific extensions
|
||||
" extend typescriptIdentifierName to allow styledDefinitions in their
|
||||
" tagged templates
|
||||
syn match typescriptIdentifierName extend
|
||||
\ "\<css\>\|\<keyframes\>\|\<injectGlobal\>\|\<fontFace\>\|\<createGlobalStyle\>"
|
||||
\ nextgroup=styledDefinition
|
||||
|
||||
" color the custom highlight elements
|
||||
hi def link cssCustomKeyFrameSelector Constant
|
||||
hi def link cssCustomPositioningPrefix StorageClass
|
||||
hi def link styledAmpersand Special
|
||||
|
||||
hi def link styledXmlRegionKeyword Type
|
||||
hi def link styledXmlRegionNoise Noise
|
||||
hi def link styledXmlRegion String
|
||||
|
||||
|
||||
if exists("s:current_syntax")
|
||||
let b:current_syntax=s:current_syntax
|
||||
endif
|
||||
49
after/syntax/typescript/graphql.vim
Normal file
49
after/syntax/typescript/graphql.vim
Normal file
@@ -0,0 +1,49 @@
|
||||
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'graphql') == -1
|
||||
|
||||
" Copyright (c) 2016-2020 Jon Parise <jon@indelible.org>
|
||||
"
|
||||
" Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
" of this software and associated documentation files (the "Software"), to
|
||||
" deal in the Software without restriction, including without limitation the
|
||||
" rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
" sell copies of the Software, and to permit persons to whom the Software is
|
||||
" furnished to do so, subject to the following conditions:
|
||||
"
|
||||
" The above copyright notice and this permission notice shall be included in
|
||||
" all copies or substantial portions of the Software.
|
||||
"
|
||||
" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
" IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
" FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
" AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
" LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
" FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
" IN THE SOFTWARE.
|
||||
"
|
||||
" Language: GraphQL
|
||||
" Maintainer: Jon Parise <jon@indelible.org>
|
||||
|
||||
if exists('b:current_syntax')
|
||||
let s:current_syntax = b:current_syntax
|
||||
unlet b:current_syntax
|
||||
endif
|
||||
syn include @GraphQLSyntax syntax/graphql.vim
|
||||
if exists('s:current_syntax')
|
||||
let b:current_syntax = s:current_syntax
|
||||
endif
|
||||
|
||||
let s:tags = '\%(' . join(graphql#javascript_tags(), '\|') . '\)'
|
||||
|
||||
exec 'syntax region graphqlTemplateString start=+' . s:tags . '\@20<=`+ skip=+\\`+ end=+`+ contains=@GraphQLSyntax,typescriptTemplateSubstitution extend'
|
||||
exec 'syntax match graphqlTaggedTemplate +' . s:tags . '\ze`+ nextgroup=graphqlTemplateString'
|
||||
|
||||
" Support expression interpolation ((${...})) inside template strings.
|
||||
syntax region graphqlTemplateExpression start=+${+ end=+}+ contained contains=typescriptTemplateSubstitution containedin=graphqlFold keepend
|
||||
|
||||
hi def link graphqlTemplateString typescriptTemplate
|
||||
hi def link graphqlTemplateExpression typescriptTemplateSubstitution
|
||||
|
||||
syn cluster typescriptExpression add=graphqlTaggedTemplate
|
||||
syn cluster graphqlTaggedTemplate add=graphqlTemplateString
|
||||
|
||||
endif
|
||||
5
after/syntax/typescriptreact.vim
Normal file
5
after/syntax/typescriptreact.vim
Normal file
@@ -0,0 +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)
|
||||
|
||||
source <sfile>:h/tsx.vim
|
||||
|
||||
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
|
||||
@@ -1,6 +1,4 @@
|
||||
if exists('g:polyglot_disabled') && index(g:polyglot_disabled, 'yaml') != -1
|
||||
finish
|
||||
endif
|
||||
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'yaml') == -1
|
||||
|
||||
" To make this file do stuff, add something like the following (without the
|
||||
" leading ") to your ~/.vimrc:
|
||||
@@ -44,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 FALSE False false NO No no OFF Off off
|
||||
|
||||
syn match yamlKey "^\s*\zs[^ \t\"]\+\ze\s*:"
|
||||
syn match yamlKey "^\s*-\s*\zs[^ \t\"\']\+\ze\s*:"
|
||||
syn match yamlKey "^\s*\zs[^ \t\"\'#]\+\ze\s*:"
|
||||
syn match yamlKey "^\s*-\s*\zs[^ \t\"\'#]\+\ze\s*:"
|
||||
syn match yamlAnchor "&\S\+"
|
||||
syn match yamlAlias "*\S\+"
|
||||
|
||||
@@ -63,3 +61,5 @@ hi link yamlInline Operator
|
||||
hi link yamlBlock Operator
|
||||
hi link yamlString String
|
||||
hi link yamlEscape Special
|
||||
|
||||
endif
|
||||
|
||||
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
|
||||
@@ -1,6 +1,4 @@
|
||||
if exists('g:polyglot_disabled') && index(g:polyglot_disabled, 'julia') != -1
|
||||
finish
|
||||
endif
|
||||
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'julia') == -1
|
||||
|
||||
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
|
||||
" Support for LaTex-to-Unicode conversion as in the Julia REPL "
|
||||
@@ -15,6 +13,9 @@ function! s:L2U_Setup()
|
||||
if !has_key(b:, "l2u_enabled")
|
||||
let b:l2u_enabled = 0
|
||||
endif
|
||||
if !has_key(b:, "l2u_autodetect_enable")
|
||||
let b:l2u_autodetect_enable = 1
|
||||
endif
|
||||
|
||||
" Did we install the L2U tab mappings?
|
||||
if !has_key(b:, "l2u_tab_set")
|
||||
@@ -94,34 +95,39 @@ endfunction
|
||||
" Each time the filetype changes, we may need to enable or
|
||||
" disable the LaTeX-to-Unicode functionality
|
||||
function! LaTeXtoUnicode#Refresh()
|
||||
|
||||
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
|
||||
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", "$^"))
|
||||
|
||||
if match(&filetype, file_types) < 0 || match(&filetype, file_types_blacklist) >= 0
|
||||
if b:l2u_enabled
|
||||
call LaTeXtoUnicode#Disable()
|
||||
call LaTeXtoUnicode#Disable(1)
|
||||
else
|
||||
return
|
||||
return ''
|
||||
endif
|
||||
elseif !b:l2u_enabled
|
||||
call LaTeXtoUnicode#Enable()
|
||||
call LaTeXtoUnicode#Enable(1)
|
||||
endif
|
||||
|
||||
endfunction
|
||||
|
||||
function! LaTeXtoUnicode#Enable()
|
||||
function! LaTeXtoUnicode#Enable(...)
|
||||
let auto_set = a:0 > 0 ? a:1 : 0
|
||||
|
||||
if b:l2u_enabled
|
||||
return
|
||||
return ''
|
||||
end
|
||||
|
||||
call s:L2U_ResetLastCompletionInfo()
|
||||
|
||||
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
|
||||
" command line mode mapping, and the full initialization will be performed by
|
||||
@@ -129,18 +135,18 @@ function! LaTeXtoUnicode#Enable()
|
||||
" Otherwise, if we're opening a file from within a running vim session, this
|
||||
" will actually initialize all the LaTeX-to-Unicode substitutions.
|
||||
call LaTeXtoUnicode#Init()
|
||||
|
||||
return
|
||||
|
||||
return ''
|
||||
endfunction
|
||||
|
||||
function! LaTeXtoUnicode#Disable()
|
||||
function! LaTeXtoUnicode#Disable(...)
|
||||
let auto_set = a:0 > 0 ? a:1 : 0
|
||||
if !b:l2u_enabled
|
||||
return
|
||||
return ''
|
||||
endif
|
||||
let b:l2u_enabled = 0
|
||||
let b:l2u_autodetect_enable = auto_set
|
||||
call LaTeXtoUnicode#Init()
|
||||
return
|
||||
return ''
|
||||
endfunction
|
||||
|
||||
" Translate old options to their new equivalents
|
||||
@@ -248,7 +254,6 @@ function! LaTeXtoUnicode#omnifunc(findstart, base)
|
||||
endif
|
||||
let b:l2u_in_fallback = 0
|
||||
" set info for the callback
|
||||
let b:l2u_tab_completing = 1
|
||||
let b:l2u_found_completion = 1
|
||||
" analyse current line
|
||||
let col1 = col('.')
|
||||
@@ -377,6 +382,7 @@ function! LaTeXtoUnicode#Tab()
|
||||
endif
|
||||
" reset the in_fallback info
|
||||
let b:l2u_in_fallback = 0
|
||||
let b:l2u_tab_completing = 1
|
||||
" temporary change to completeopt to use the `longest` setting, which is
|
||||
" probably the only one which makes sense given that the goal of the
|
||||
" completion is to substitute the final string
|
||||
@@ -385,7 +391,8 @@ function! LaTeXtoUnicode#Tab()
|
||||
set completeopt-=noinsert
|
||||
" invoke omnicompletion; failure to perform LaTeX-to-Unicode completion is
|
||||
" handled by the CompleteDone autocommand.
|
||||
return "\<C-X>\<C-O>"
|
||||
call feedkeys("\<C-X>\<C-O>", 'n')
|
||||
return ""
|
||||
endfunction
|
||||
|
||||
" This function is called at every CompleteDone event, and is meant to handle
|
||||
@@ -411,7 +418,7 @@ function! LaTeXtoUnicode#FallbackCallback()
|
||||
endfunction
|
||||
|
||||
" This is the function that performs the substitution in command-line mode
|
||||
function! LaTeXtoUnicode#CmdTab(triggeredbytab)
|
||||
function! LaTeXtoUnicode#CmdTab(trigger)
|
||||
" first stage
|
||||
" analyse command line
|
||||
let col1 = getcmdpos() - 1
|
||||
@@ -420,10 +427,12 @@ function! LaTeXtoUnicode#CmdTab(triggeredbytab)
|
||||
let b:l2u_singlebslash = (match(l[0:col1-1], '\\$') >= 0)
|
||||
" completion not found
|
||||
if col0 == -1
|
||||
if a:triggeredbytab
|
||||
call feedkeys("\<Tab>", 'nt') " fall-back to the default <Tab>
|
||||
if a:trigger == &wildchar
|
||||
call feedkeys(nr2char(a:trigger), 'nt') " fall-back to the default wildchar
|
||||
elseif a:trigger == char2nr("\<S-Tab>")
|
||||
call feedkeys("\<S-Tab>", 'nt') " fall-back to the default <S-Tab>
|
||||
endif
|
||||
return l
|
||||
return ''
|
||||
endif
|
||||
let base = l[col0 : col1-1]
|
||||
" search for matches
|
||||
@@ -432,39 +441,28 @@ function! LaTeXtoUnicode#CmdTab(triggeredbytab)
|
||||
for k in keys(g:l2u_symbols_dict)
|
||||
if k ==# base
|
||||
let exact_match = 1
|
||||
endif
|
||||
if len(k) >= len(base) && k[0 : len(base)-1] ==# base
|
||||
break
|
||||
elseif len(k) >= len(base) && k[0 : len(base)-1] ==# base
|
||||
call add(partmatches, k)
|
||||
endif
|
||||
endfor
|
||||
if len(partmatches) == 0
|
||||
if a:triggeredbytab
|
||||
call feedkeys("\<Tab>", 'nt') " fall-back to the default <Tab>
|
||||
if !exact_match && len(partmatches) == 0
|
||||
" no matches, call fallbacks
|
||||
if a:trigger == &wildchar
|
||||
call feedkeys(nr2char(a:trigger), 'nt') " fall-back to the default wildchar
|
||||
elseif a:trigger == char2nr("\<S-Tab>")
|
||||
call feedkeys("\<S-Tab>", 'nt') " fall-back to the default <S-Tab>
|
||||
endif
|
||||
return l
|
||||
endif
|
||||
" exact matches are replaced with Unicode
|
||||
if exact_match
|
||||
elseif exact_match
|
||||
" exact matches are replaced with Unicode
|
||||
let unicode = g:l2u_symbols_dict[base]
|
||||
if col0 > 0
|
||||
let pre = l[0 : col0 - 1]
|
||||
else
|
||||
let pre = ''
|
||||
endif
|
||||
let posdiff = col1-col0 - len(unicode)
|
||||
call setcmdpos(col1 - posdiff + 1)
|
||||
return pre . unicode . l[col1 : -1]
|
||||
endif
|
||||
" no exact match: complete with the longest common prefix
|
||||
let common = s:L2U_longest_common_prefix(partmatches)
|
||||
if col0 > 0
|
||||
let pre = l[0 : col0 - 1]
|
||||
call feedkeys(repeat("\b", len(base)) . unicode, 'nt')
|
||||
else
|
||||
let pre = ''
|
||||
" no exact match: complete with the longest common prefix
|
||||
let common = s:L2U_longest_common_prefix(partmatches)
|
||||
call feedkeys(common[len(base):], 'nt')
|
||||
endif
|
||||
let posdiff = col1-col0 - len(common)
|
||||
call setcmdpos(col1 - posdiff + 1)
|
||||
return pre . common . l[col1 : -1]
|
||||
return ''
|
||||
endfunction
|
||||
|
||||
" Setup the L2U tab mapping
|
||||
@@ -475,7 +473,8 @@ function! s:L2U_SetTab(wait_insert_enter)
|
||||
let b:l2u_cmdtab_keys = [b:l2u_cmdtab_keys]
|
||||
endif
|
||||
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
|
||||
let b:l2u_cmdtab_set = 1
|
||||
endif
|
||||
@@ -639,6 +638,7 @@ function! LaTeXtoUnicode#Init(...)
|
||||
call s:L2U_SetTab(wait_insert_enter)
|
||||
call s:L2U_SetAutoSub(wait_insert_enter)
|
||||
call s:L2U_SetKeymap()
|
||||
return ''
|
||||
endfunction
|
||||
|
||||
function! LaTeXtoUnicode#Toggle()
|
||||
@@ -650,5 +650,7 @@ function! LaTeXtoUnicode#Toggle()
|
||||
call LaTeXtoUnicode#Enable()
|
||||
echo "LaTeX-to-Unicode enabled"
|
||||
endif
|
||||
return
|
||||
return ''
|
||||
endfunction
|
||||
|
||||
endif
|
||||
|
||||
@@ -1,6 +1,4 @@
|
||||
if exists('g:polyglot_disabled') && index(g:polyglot_disabled, 'rst') != -1
|
||||
finish
|
||||
endif
|
||||
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'rst') == -1
|
||||
|
||||
" Author: Antony Lee <anntzer.lee@gmail.com>
|
||||
" Description: Helper functions for reStructuredText syntax folding
|
||||
@@ -64,3 +62,5 @@ function RstFold#GetRstFoldText()
|
||||
let text = thisline =~ '^\([=`:.''"~^_*+#-]\)\1\+$' ? getline(v:foldstart + 1) : thisline
|
||||
return indent . text
|
||||
endfunction
|
||||
|
||||
endif
|
||||
|
||||
@@ -1,13 +1,23 @@
|
||||
if exists('g:polyglot_disabled') && index(g:polyglot_disabled, 'rust') != -1
|
||||
finish
|
||||
endif
|
||||
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'rust') == -1
|
||||
|
||||
function! cargo#Load()
|
||||
function! cargo#Load()
|
||||
" Utility call to get this script loaded, for debugging
|
||||
endfunction
|
||||
|
||||
function! cargo#cmd(args)
|
||||
execute "! cargo" a:args
|
||||
function! cargo#cmd(args) abort
|
||||
" Trim trailing spaces. This is necessary since :terminal command parses
|
||||
" trailing spaces as an empty argument.
|
||||
let args = substitute(a:args, '\s\+$', '', '')
|
||||
if exists('g:cargo_shell_command_runner')
|
||||
let cmd = g:cargo_shell_command_runner
|
||||
elseif has('terminal')
|
||||
let cmd = 'terminal'
|
||||
elseif has('nvim')
|
||||
let cmd = 'noautocmd new | terminal'
|
||||
else
|
||||
let cmd = '!'
|
||||
endif
|
||||
execute cmd 'cargo' args
|
||||
endfunction
|
||||
|
||||
function! s:nearest_cargo(...) abort
|
||||
@@ -59,6 +69,10 @@ function! cargo#build(args)
|
||||
call cargo#cmd("build " . a:args)
|
||||
endfunction
|
||||
|
||||
function! cargo#check(args)
|
||||
call cargo#cmd("check " . a:args)
|
||||
endfunction
|
||||
|
||||
function! cargo#clean(args)
|
||||
call cargo#cmd("clean " . a:args)
|
||||
endfunction
|
||||
@@ -88,6 +102,22 @@ function! cargo#bench(args)
|
||||
call cargo#cmd("bench " . a:args)
|
||||
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)
|
||||
let l:filename = expand('%:p')
|
||||
let l:read_manifest = system('cargo read-manifest')
|
||||
@@ -117,3 +147,5 @@ function! cargo#runtarget(args)
|
||||
endfunction
|
||||
|
||||
" vim: set et sw=4 sts=4 ts=8:
|
||||
|
||||
endif
|
||||
|
||||
@@ -1,6 +1,4 @@
|
||||
if exists('g:polyglot_disabled') && index(g:polyglot_disabled, 'rust') != -1
|
||||
finish
|
||||
endif
|
||||
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'rust') == -1
|
||||
|
||||
function! cargo#quickfix#CmdPre() abort
|
||||
if &filetype ==# 'rust' && get(b:, 'current_compiler', '') ==# 'cargo'
|
||||
@@ -28,3 +26,5 @@ function! cargo#quickfix#CmdPost() abort
|
||||
endfunction
|
||||
|
||||
" vim: set et sw=4 sts=4 ts=8:
|
||||
|
||||
endif
|
||||
|
||||
@@ -1,6 +1,4 @@
|
||||
if exists('g:polyglot_disabled') && index(g:polyglot_disabled, 'clojure') != -1
|
||||
finish
|
||||
endif
|
||||
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'clojure') == -1
|
||||
|
||||
" Vim completion script
|
||||
" Language: Clojure
|
||||
@@ -24,3 +22,5 @@ function! clojurecomplete#Complete(findstart, base)
|
||||
endfunction
|
||||
|
||||
" vim:sts=8:sw=8:ts=8:noet
|
||||
|
||||
endif
|
||||
|
||||
@@ -1,6 +1,4 @@
|
||||
if exists('g:polyglot_disabled') && index(g:polyglot_disabled, 'coffee-script') != -1
|
||||
finish
|
||||
endif
|
||||
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'coffee-script') == -1
|
||||
|
||||
" Language: CoffeeScript
|
||||
" Maintainer: Mick Koch <mick@kochm.co>
|
||||
@@ -56,3 +54,5 @@ function! coffee#CoffeeSetUpErrorFormat()
|
||||
\%f:%l:%c:\ error:\ %m,
|
||||
\%-G%.%#
|
||||
endfunction
|
||||
|
||||
endif
|
||||
|
||||
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
|
||||
@@ -1,6 +1,4 @@
|
||||
if exists('g:polyglot_disabled') && index(g:polyglot_disabled, 'crystal') != -1
|
||||
finish
|
||||
endif
|
||||
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'crystal') == -1
|
||||
|
||||
let s:save_cpo = &cpo
|
||||
set cpo&vim
|
||||
@@ -9,42 +7,44 @@ let s:V = vital#crystal#new()
|
||||
let s:P = s:V.import('Process')
|
||||
let s:C = s:V.import('ColorEcho')
|
||||
|
||||
let s:IS_WINDOWS = has('win32')
|
||||
|
||||
if exists('*json_decode')
|
||||
function! s:decode_json(text) abort
|
||||
return json_decode(a:text)
|
||||
endfunction
|
||||
function! s:decode_json(text) abort
|
||||
return json_decode(a:text)
|
||||
endfunction
|
||||
else
|
||||
let s:J = s:V.import('Web.JSON')
|
||||
function! s:decode_json(text) abort
|
||||
return s:J.decode(a:text)
|
||||
endfunction
|
||||
let s:J = s:V.import('Web.JSON')
|
||||
function! s:decode_json(text) abort
|
||||
return s:J.decode(a:text)
|
||||
endfunction
|
||||
endif
|
||||
|
||||
function! s:echo_error(msg, ...) abort
|
||||
echohl ErrorMsg
|
||||
if a:0 == 0
|
||||
echomsg a:msg
|
||||
else
|
||||
echomsg call('printf', [a:msg] + a:000)
|
||||
endif
|
||||
echohl None
|
||||
echohl ErrorMsg
|
||||
if a:0 == 0
|
||||
echomsg a:msg
|
||||
else
|
||||
echomsg call('printf', [a:msg] + a:000)
|
||||
endif
|
||||
echohl None
|
||||
endfunction
|
||||
|
||||
function! s:run_cmd(cmd) abort
|
||||
if !executable(g:crystal_compiler_command)
|
||||
throw "vim-crystal: Error: '" . g:crystal_compiler_command . "' command is not found."
|
||||
endif
|
||||
return s:P.system(a:cmd)
|
||||
if !executable(g:crystal_compiler_command)
|
||||
throw "vim-crystal: Error: '" . g:crystal_compiler_command . "' command is not found."
|
||||
endif
|
||||
return s:P.system(a:cmd)
|
||||
endfunction
|
||||
|
||||
function! s:find_root_by(search_dir, d) abort
|
||||
let found_dir = finddir(a:search_dir, a:d . ';')
|
||||
if found_dir ==# ''
|
||||
return ''
|
||||
endif
|
||||
let found_dir = finddir(a:search_dir, a:d . ';')
|
||||
if found_dir ==# ''
|
||||
return ''
|
||||
endif
|
||||
|
||||
" Note: ':h:h' for {root}/{search_dir}/ -> {root}/{search_dir} -> {root}
|
||||
return fnamemodify(found_dir, ':p:h:h')
|
||||
" Note: ':h:h' for {root}/{search_dir}/ -> {root}/{search_dir} -> {root}
|
||||
return fnamemodify(found_dir, ':p:h:h')
|
||||
endfunction
|
||||
|
||||
" Search the root directory containing a 'spec/' and a 'src/' directories.
|
||||
@@ -53,292 +53,321 @@ endfunction
|
||||
" compiler has a 'cr_sources/src/spec/' directory that would otherwise give the root
|
||||
" directory as 'cr_source/src/' instead of 'cr_sources/'.
|
||||
function! s:find_root_by_spec_and_src(d) abort
|
||||
" Search for 'spec/'
|
||||
let root = s:find_root_by('spec', a:d)
|
||||
" Check that 'src/' is also there
|
||||
if root !=# '' && isdirectory(root . '/src')
|
||||
return root
|
||||
endif
|
||||
" Search for 'spec/'
|
||||
let root = s:find_root_by('spec', a:d)
|
||||
" Check that 'src/' is also there
|
||||
if root !=# '' && isdirectory(root . '/src')
|
||||
return root
|
||||
endif
|
||||
|
||||
" Search for 'src/'
|
||||
let root = s:find_root_by('src', a:d)
|
||||
" Check that 'spec/' is also there
|
||||
if root !=# '' && isdirectory(root . '/spec')
|
||||
return root
|
||||
endif
|
||||
" Search for 'src/'
|
||||
let root = s:find_root_by('src', a:d)
|
||||
" Check that 'spec/' is also there
|
||||
if root !=# '' && isdirectory(root . '/spec')
|
||||
return root
|
||||
endif
|
||||
|
||||
" Cannot find a directory containing both 'src/' and 'spec/'
|
||||
return ''
|
||||
" Cannot find a directory containing both 'src/' and 'spec/'
|
||||
return ''
|
||||
endfunction
|
||||
|
||||
function! crystal_lang#entrypoint_for(file_path) abort
|
||||
let parent_dir = fnamemodify(a:file_path, ':p:h')
|
||||
let root_dir = s:find_root_by_spec_and_src(parent_dir)
|
||||
if root_dir ==# ''
|
||||
" No spec directory found. No need to make temporary file
|
||||
return a:file_path
|
||||
endif
|
||||
let parent_dir = fnamemodify(a:file_path, ':p:h')
|
||||
let root_dir = s:find_root_by_spec_and_src(parent_dir)
|
||||
if root_dir ==# ''
|
||||
" No spec directory found. No need to make temporary file
|
||||
return a:file_path
|
||||
endif
|
||||
|
||||
let temp_name = root_dir . '/__vim-crystal-temporary-entrypoint-' . fnamemodify(a:file_path, ':t')
|
||||
let contents = [
|
||||
\ 'require "spec"',
|
||||
\ 'require "./spec/**"',
|
||||
\ printf('require "./%s"', fnamemodify(a:file_path, ':p')[strlen(root_dir)+1 : ])
|
||||
\ ]
|
||||
let required_spec_path = get(b:, 'crystal_required_spec_path', get(g:, 'crystal_required_spec_path', ''))
|
||||
if required_spec_path !=# ''
|
||||
let require_spec_str = './' . required_spec_path
|
||||
else
|
||||
let require_spec_str = './spec/**'
|
||||
endif
|
||||
|
||||
let result = writefile(contents, temp_name)
|
||||
if result == -1
|
||||
" Note: When writefile() failed
|
||||
return a:file_path
|
||||
endif
|
||||
let temp_name = root_dir . '/__vim-crystal-temporary-entrypoint-' . fnamemodify(a:file_path, ':t')
|
||||
let contents = [
|
||||
\ 'require "spec"',
|
||||
\ 'require "' . require_spec_str . '"',
|
||||
\ printf('require "./%s"', fnamemodify(a:file_path, ':p')[strlen(root_dir)+1 : ])
|
||||
\ ]
|
||||
|
||||
return temp_name
|
||||
let result = writefile(contents, temp_name)
|
||||
if result == -1
|
||||
" Note: When writefile() failed
|
||||
return a:file_path
|
||||
endif
|
||||
|
||||
return temp_name
|
||||
endfunction
|
||||
|
||||
function! crystal_lang#tool(name, file, pos, option_str) abort
|
||||
let entrypoint = crystal_lang#entrypoint_for(a:file)
|
||||
let cmd = printf(
|
||||
\ '%s tool %s --no-color %s --cursor %s:%d:%d %s',
|
||||
\ g:crystal_compiler_command,
|
||||
\ a:name,
|
||||
\ a:option_str,
|
||||
\ a:file,
|
||||
\ a:pos[1],
|
||||
\ a:pos[2],
|
||||
\ entrypoint
|
||||
\ )
|
||||
let entrypoint = crystal_lang#entrypoint_for(a:file)
|
||||
let cmd = printf(
|
||||
\ '%s tool %s --no-color %s --cursor %s:%d:%d %s',
|
||||
\ g:crystal_compiler_command,
|
||||
\ a:name,
|
||||
\ a:option_str,
|
||||
\ a:file,
|
||||
\ a:pos[1],
|
||||
\ a:pos[2],
|
||||
\ entrypoint
|
||||
\ )
|
||||
|
||||
try
|
||||
let output = s:run_cmd(cmd)
|
||||
return {'failed': s:P.get_last_status(), 'output': output}
|
||||
finally
|
||||
" Note:
|
||||
" If the entry point is temporary file, delete it finally.
|
||||
if a:file !=# entrypoint
|
||||
call delete(entrypoint)
|
||||
endif
|
||||
endtry
|
||||
try
|
||||
let output = s:run_cmd(cmd)
|
||||
return {'failed': s:P.get_last_status(), 'output': output}
|
||||
finally
|
||||
" Note:
|
||||
" If the entry point is temporary file, delete it finally.
|
||||
if a:file !=# entrypoint
|
||||
call delete(entrypoint)
|
||||
endif
|
||||
endtry
|
||||
endfunction
|
||||
|
||||
" `pos` is assumed a returned value from getpos()
|
||||
function! crystal_lang#impl(file, pos, option_str) abort
|
||||
return crystal_lang#tool('implementations', a:file, a:pos, a:option_str)
|
||||
return crystal_lang#tool('implementations', a:file, a:pos, a:option_str)
|
||||
endfunction
|
||||
|
||||
function! s:jump_to_impl(impl) abort
|
||||
execute 'edit' a:impl.filename
|
||||
call cursor(a:impl.line, a:impl.column)
|
||||
execute 'edit' a:impl.filename
|
||||
call cursor(a:impl.line, a:impl.column)
|
||||
endfunction
|
||||
|
||||
function! crystal_lang#jump_to_definition(file, pos) abort
|
||||
echo 'analyzing definitions under cursor...'
|
||||
echo 'analyzing definitions under cursor...'
|
||||
|
||||
let cmd_result = crystal_lang#impl(a:file, a:pos, '--format json')
|
||||
if cmd_result.failed
|
||||
return s:echo_error(cmd_result.output)
|
||||
endif
|
||||
let cmd_result = crystal_lang#impl(a:file, a:pos, '--format json')
|
||||
if cmd_result.failed
|
||||
return s:echo_error(cmd_result.output)
|
||||
endif
|
||||
|
||||
let impl = s:decode_json(cmd_result.output)
|
||||
if impl.status !=# 'ok'
|
||||
return s:echo_error(impl.message)
|
||||
endif
|
||||
let impl = s:decode_json(cmd_result.output)
|
||||
if impl.status !=# 'ok'
|
||||
return s:echo_error(impl.message)
|
||||
endif
|
||||
|
||||
if len(impl.implementations) == 1
|
||||
call s:jump_to_impl(impl.implementations[0])
|
||||
return
|
||||
endif
|
||||
if len(impl.implementations) == 1
|
||||
call s:jump_to_impl(impl.implementations[0])
|
||||
return
|
||||
endif
|
||||
|
||||
let message = "Multiple definitions detected. Choose a number\n\n"
|
||||
for idx in range(len(impl.implementations))
|
||||
let i = impl.implementations[idx]
|
||||
let message .= printf("[%d] %s:%d:%d\n", idx, i.filename, i.line, i.column)
|
||||
endfor
|
||||
let message .= "\n"
|
||||
let idx = str2nr(input(message, "\n> "))
|
||||
call s:jump_to_impl(impl.implementations[idx])
|
||||
let message = "Multiple definitions detected. Choose a number\n\n"
|
||||
for idx in range(len(impl.implementations))
|
||||
let i = impl.implementations[idx]
|
||||
let message .= printf("[%d] %s:%d:%d\n", idx, i.filename, i.line, i.column)
|
||||
endfor
|
||||
let message .= "\n"
|
||||
let idx = str2nr(input(message, "\n> "))
|
||||
call s:jump_to_impl(impl.implementations[idx])
|
||||
endfunction
|
||||
|
||||
function! crystal_lang#context(file, pos, option_str) abort
|
||||
return crystal_lang#tool('context', a:file, a:pos, a:option_str)
|
||||
return crystal_lang#tool('context', a:file, a:pos, a:option_str)
|
||||
endfunction
|
||||
|
||||
function! crystal_lang#type_hierarchy(file, option_str) abort
|
||||
let cmd = printf(
|
||||
\ '%s tool hierarchy --no-color %s %s',
|
||||
\ g:crystal_compiler_command,
|
||||
\ a:option_str,
|
||||
\ a:file
|
||||
\ )
|
||||
let cmd = printf(
|
||||
\ '%s tool hierarchy --no-color %s %s',
|
||||
\ g:crystal_compiler_command,
|
||||
\ a:option_str,
|
||||
\ a:file
|
||||
\ )
|
||||
|
||||
return s:run_cmd(cmd)
|
||||
return s:run_cmd(cmd)
|
||||
endfunction
|
||||
|
||||
function! s:find_completion_start() abort
|
||||
let c = col('.')
|
||||
if c <= 1
|
||||
return -1
|
||||
endif
|
||||
let c = col('.')
|
||||
if c <= 1
|
||||
return -1
|
||||
endif
|
||||
|
||||
let line = getline('.')[:c-2]
|
||||
return match(line, '\w\+$')
|
||||
let line = getline('.')[:c-2]
|
||||
return match(line, '\w\+$')
|
||||
endfunction
|
||||
|
||||
function! crystal_lang#complete(findstart, base) abort
|
||||
if a:findstart
|
||||
return s:find_completion_start()
|
||||
endif
|
||||
if a:findstart
|
||||
return s:find_completion_start()
|
||||
endif
|
||||
|
||||
let cmd_result = crystal_lang#context(expand('%'), getpos('.'), '--format json')
|
||||
if cmd_result.failed
|
||||
return
|
||||
endif
|
||||
let cmd_result = crystal_lang#context(expand('%'), getpos('.'), '--format json')
|
||||
if cmd_result.failed
|
||||
return
|
||||
endif
|
||||
|
||||
let contexts = s:decode_json(cmd_result.output)
|
||||
if contexts.status !=# 'ok'
|
||||
return
|
||||
endif
|
||||
let contexts = s:decode_json(cmd_result.output)
|
||||
if contexts.status !=# 'ok'
|
||||
return
|
||||
endif
|
||||
|
||||
let candidates = []
|
||||
let candidates = []
|
||||
|
||||
for c in contexts.contexts
|
||||
for [name, desc] in items(c)
|
||||
let candidates += [{
|
||||
\ 'word': name,
|
||||
\ 'menu': ': ' . desc . ' [var]',
|
||||
\ }]
|
||||
endfor
|
||||
for c in contexts.contexts
|
||||
for [name, desc] in items(c)
|
||||
let candidates += [{
|
||||
\ 'word': name,
|
||||
\ 'menu': ': ' . desc . ' [var]',
|
||||
\ }]
|
||||
endfor
|
||||
endfor
|
||||
|
||||
return candidates
|
||||
return candidates
|
||||
endfunction
|
||||
|
||||
function! crystal_lang#get_spec_switched_path(absolute_path) abort
|
||||
let base = fnamemodify(a:absolute_path, ':t:r')
|
||||
let base = fnamemodify(a:absolute_path, ':t:r')
|
||||
|
||||
" TODO: Make cleverer
|
||||
if base =~# '_spec$'
|
||||
let parent = fnamemodify(substitute(a:absolute_path, '/spec/', '/src/', ''), ':h')
|
||||
return parent . '/' . matchstr(base, '.\+\ze_spec$') . '.cr'
|
||||
else
|
||||
let parent = fnamemodify(substitute(a:absolute_path, '/src/', '/spec/', ''), ':h')
|
||||
return parent . '/' . base . '_spec.cr'
|
||||
endif
|
||||
" TODO: Make cleverer
|
||||
if base =~# '_spec$'
|
||||
let parent = fnamemodify(substitute(a:absolute_path, '/spec/', '/src/', ''), ':h')
|
||||
return parent . '/' . matchstr(base, '.\+\ze_spec$') . '.cr'
|
||||
else
|
||||
let parent = fnamemodify(substitute(a:absolute_path, '/src/', '/spec/', ''), ':h')
|
||||
return parent . '/' . base . '_spec.cr'
|
||||
endif
|
||||
endfunction
|
||||
|
||||
function! crystal_lang#switch_spec_file(...) abort
|
||||
let path = a:0 == 0 ? expand('%:p') : fnamemodify(a:1, ':p')
|
||||
if path !~# '.cr$'
|
||||
return s:echo_error('Not crystal source file: ' . path)
|
||||
endif
|
||||
let path = a:0 == 0 ? expand('%:p') : fnamemodify(a:1, ':p')
|
||||
if path !~# '.cr$'
|
||||
return s:echo_error('Not crystal source file: ' . path)
|
||||
endif
|
||||
|
||||
execute 'edit!' crystal_lang#get_spec_switched_path(path)
|
||||
execute 'edit!' crystal_lang#get_spec_switched_path(path)
|
||||
endfunction
|
||||
|
||||
function! s:run_spec(root, path, ...) abort
|
||||
" Note:
|
||||
" `crystal spec` can't understand absolute path.
|
||||
let cmd = printf(
|
||||
\ '%s spec %s%s',
|
||||
\ g:crystal_compiler_command,
|
||||
\ a:path,
|
||||
\ a:0 == 0 ? '' : (':' . a:1)
|
||||
\ )
|
||||
" Note:
|
||||
" `crystal spec` can't understand absolute path.
|
||||
let cmd = printf(
|
||||
\ '%s spec %s%s',
|
||||
\ g:crystal_compiler_command,
|
||||
\ a:path,
|
||||
\ a:0 == 0 ? '' : (':' . a:1)
|
||||
\ )
|
||||
|
||||
let saved_cwd = getcwd()
|
||||
let cd = haslocaldir() ? 'lcd' : 'cd'
|
||||
try
|
||||
execute cd a:root
|
||||
call s:C.echo(s:run_cmd(cmd))
|
||||
finally
|
||||
execute cd saved_cwd
|
||||
endtry
|
||||
let saved_cwd = getcwd()
|
||||
let cd = haslocaldir() ? 'lcd' : 'cd'
|
||||
try
|
||||
execute cd a:root
|
||||
call s:C.echo(s:run_cmd(cmd))
|
||||
finally
|
||||
execute cd saved_cwd
|
||||
endtry
|
||||
endfunction
|
||||
|
||||
function! crystal_lang#run_all_spec(...) abort
|
||||
let path = a:0 == 0 ? expand('%:p:h') : a:1
|
||||
let root_path = s:find_root_by_spec_and_src(path)
|
||||
if root_path ==# ''
|
||||
return s:echo_error("'spec' directory is not found")
|
||||
endif
|
||||
call s:run_spec(root_path, 'spec')
|
||||
let path = a:0 == 0 ? expand('%:p:h') : a:1
|
||||
let root_path = s:find_root_by_spec_and_src(path)
|
||||
if root_path ==# ''
|
||||
return s:echo_error("'spec' directory is not found")
|
||||
endif
|
||||
call s:run_spec(root_path, 'spec')
|
||||
endfunction
|
||||
|
||||
function! crystal_lang#run_current_spec(...) abort
|
||||
" /foo/bar/src/poyo.cr
|
||||
let path = a:0 == 0 ? expand('%:p') : fnamemodify(a:1, ':p')
|
||||
if path !~# '.cr$'
|
||||
return s:echo_error('Not crystal source file: ' . path)
|
||||
endif
|
||||
|
||||
" /foo/bar/src
|
||||
let source_dir = fnamemodify(path, ':h')
|
||||
|
||||
" /foo/bar
|
||||
let root_dir = s:find_root_by_spec_and_src(source_dir)
|
||||
if root_dir ==# ''
|
||||
return s:echo_error("Root directory with 'src/' and 'spec/' not found")
|
||||
endif
|
||||
|
||||
" src
|
||||
let rel_path = source_dir[strlen(root_dir)+1 : ]
|
||||
|
||||
if path =~# '_spec.cr$'
|
||||
call s:run_spec(root_dir, path[strlen(root_dir)+1 : ], line('.'))
|
||||
else
|
||||
let spec_path = substitute(rel_path, '^src', 'spec', '') . '/' . fnamemodify(path, ':t:r') . '_spec.cr'
|
||||
if !filereadable(root_dir . '/' . spec_path)
|
||||
return s:echo_error('Error: Could not find a spec source corresponding to ' . path)
|
||||
endif
|
||||
call s:run_spec(root_dir, spec_path)
|
||||
" /foo/bar/src/poyo.cr
|
||||
let path = a:0 == 0 ? expand('%:p') : fnamemodify(a:1, ':p')
|
||||
if path !~# '.cr$'
|
||||
return s:echo_error('Not crystal source file: ' . path)
|
||||
endif
|
||||
|
||||
" /foo/bar/src
|
||||
let source_dir = fnamemodify(path, ':h')
|
||||
|
||||
" /foo/bar
|
||||
let root_dir = s:find_root_by_spec_and_src(source_dir)
|
||||
if root_dir ==# ''
|
||||
return s:echo_error("Root directory with 'src/' and 'spec/' not found")
|
||||
endif
|
||||
|
||||
" src
|
||||
let rel_path = source_dir[strlen(root_dir)+1 : ]
|
||||
|
||||
if path =~# '_spec.cr$'
|
||||
call s:run_spec(root_dir, path[strlen(root_dir)+1 : ], line('.'))
|
||||
else
|
||||
let spec_path = substitute(rel_path, '^src', 'spec', '') . '/' . fnamemodify(path, ':t:r') . '_spec.cr'
|
||||
if !filereadable(root_dir . '/' . spec_path)
|
||||
return s:echo_error('Error: Could not find a spec source corresponding to ' . path)
|
||||
endif
|
||||
call s:run_spec(root_dir, spec_path)
|
||||
endif
|
||||
endfunction
|
||||
|
||||
function! crystal_lang#format_string(code, ...) abort
|
||||
let cmd = printf(
|
||||
\ '%s tool format --no-color %s -',
|
||||
\ g:crystal_compiler_command,
|
||||
\ get(a:, 1, '')
|
||||
\ )
|
||||
let output = s:P.system(cmd, a:code)
|
||||
if s:P.get_last_status()
|
||||
throw 'vim-crystal: Error on formatting: ' . output
|
||||
endif
|
||||
return output
|
||||
if s:IS_WINDOWS
|
||||
let redirect = '2> nul'
|
||||
else
|
||||
let redirect = '2>/dev/null'
|
||||
endif
|
||||
let cmd = printf(
|
||||
\ '%s tool format --no-color %s - %s',
|
||||
\ g:crystal_compiler_command,
|
||||
\ get(a:, 1, ''),
|
||||
\ redirect,
|
||||
\ )
|
||||
let output = s:P.system(cmd, a:code)
|
||||
if s:P.get_last_status()
|
||||
throw 'vim-crystal: Error on formatting with command: ' . cmd
|
||||
endif
|
||||
return output
|
||||
endfunction
|
||||
|
||||
" crystal_lang#format(option_str [, on_save])
|
||||
function! crystal_lang#format(option_str, ...) abort
|
||||
if !executable(g:crystal_compiler_command)
|
||||
" Finish command silently
|
||||
return
|
||||
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 on_save = a:0 > 0 ? a:1 : 0
|
||||
|
||||
let before = join(getline(1, '$'), "\n")
|
||||
let before = join(getline(1, '$'), "\n")
|
||||
try
|
||||
let formatted = crystal_lang#format_string(before, a:option_str)
|
||||
if !on_save
|
||||
let after = substitute(formatted, '\n$', '', '')
|
||||
if before ==# after
|
||||
return
|
||||
endif
|
||||
endif
|
||||
catch /^vim-crystal: /
|
||||
echohl ErrorMsg
|
||||
echomsg v:exception . ': Your code was not formatted. Exception was thrown at ' . v:throwpoint
|
||||
echohl None
|
||||
return
|
||||
endtry
|
||||
|
||||
let view_save = winsaveview()
|
||||
let pos_save = getpos('.')
|
||||
let lines = split(formatted, '\n')
|
||||
silent! undojoin
|
||||
if line('$') > len(lines)
|
||||
execute len(lines) . ',$delete' '_'
|
||||
if !on_save
|
||||
let after = substitute(formatted, '\n$', '', '')
|
||||
if before ==# after
|
||||
return
|
||||
endif
|
||||
call setline(1, lines)
|
||||
call winrestview(view_save)
|
||||
call setpos('.', pos_save)
|
||||
endif
|
||||
|
||||
let view_save = winsaveview()
|
||||
let pos_save = getpos('.')
|
||||
let lines = split(formatted, '\n')
|
||||
silent! undojoin
|
||||
if line('$') > len(lines)
|
||||
execute len(lines) . ',$delete' '_'
|
||||
endif
|
||||
call setline(1, lines)
|
||||
call winrestview(view_save)
|
||||
call setpos('.', pos_save)
|
||||
endfunction
|
||||
|
||||
function! crystal_lang#expand(file, pos, ...) abort
|
||||
return crystal_lang#tool('expand', a:file, a:pos, get(a:, 1, ''))
|
||||
return crystal_lang#tool('expand', a:file, a:pos, get(a:, 1, ''))
|
||||
endfunction
|
||||
|
||||
let &cpo = s:save_cpo
|
||||
unlet s:save_cpo
|
||||
|
||||
" vim: sw=2 sts=2 et:
|
||||
|
||||
endif
|
||||
|
||||
@@ -1,6 +1,4 @@
|
||||
if exists('g:polyglot_disabled') && index(g:polyglot_disabled, 'csv') != -1
|
||||
finish
|
||||
endif
|
||||
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'csv') == -1
|
||||
|
||||
" Filetype plugin for editing CSV files. "{{{1
|
||||
" Author: Christian Brabandt <cb@256bit.org>
|
||||
@@ -71,6 +69,10 @@ fu! csv#Init(start, end, ...) "{{{3
|
||||
else
|
||||
let b:csv_cmt = split(g:csv_comment, '%s')
|
||||
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")
|
||||
call csv#Warn("No delimiter found. See :h csv-delimiter to set it manually!")
|
||||
@@ -124,7 +126,7 @@ fu! csv#Init(start, end, ...) "{{{3
|
||||
" Enable vartabs for tab delimited files
|
||||
if b:delimiter=="\t" && has("vartabs")&& !exists("b:csv_fixed_width_cols")
|
||||
if get(b:, 'col_width', []) ==# []
|
||||
call csv#CalculateColumnWidth('')
|
||||
call csv#CalculateColumnWidth(line('$'), 1)
|
||||
endif
|
||||
let &l:vts=join(b:col_width, ',')
|
||||
let g:csv_no_conceal=1
|
||||
@@ -576,7 +578,7 @@ fu! csv#MaxColumns(...) "{{{3
|
||||
return len(b:csv_fixed_width_cols)
|
||||
endif
|
||||
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
|
||||
"
|
||||
" Return the width of a column
|
||||
@@ -588,14 +590,13 @@ fu! csv#ColWidth(colnr, ...) "{{{3
|
||||
if !exists("b:csv_fixed_width_cols")
|
||||
if !exists("b:csv_list")
|
||||
" only check first 10000 lines, to be faster
|
||||
let last = line('$')
|
||||
if exists("a:1") && !empty(a:1)
|
||||
let last = a:1
|
||||
endif
|
||||
let last = a:row
|
||||
if !get(b:, 'csv_arrange_use_all_rows', 0)
|
||||
if last > 10000
|
||||
let last = 10000
|
||||
call csv#Warn('File too large, only checking the first 10000 rows for the width')
|
||||
if !a:silent
|
||||
call csv#Warn('File too large, only checking the first 10000 rows for the width')
|
||||
endif
|
||||
endif
|
||||
endif
|
||||
let b:csv_list=getline(skipfirst+1,last)
|
||||
@@ -638,8 +639,12 @@ fu! csv#ArrangeCol(first, last, bang, limit, ...) range "{{{3
|
||||
return
|
||||
endif
|
||||
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
|
||||
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 && exists("b:col_width")
|
||||
" Unarrange, so that if csv_arrange_align has changed
|
||||
@@ -673,7 +678,7 @@ fu! csv#ArrangeCol(first, last, bang, limit, ...) range "{{{3
|
||||
endif
|
||||
|
||||
if !exists("b:col_width")
|
||||
call csv#CalculateColumnWidth(row)
|
||||
call csv#CalculateColumnWidth(row, 1)
|
||||
endif
|
||||
|
||||
" abort on empty file
|
||||
@@ -752,11 +757,15 @@ fu! csv#UnArrangeCol(match) "{{{3
|
||||
" Strip leading white space, also trims empty recordcsv#
|
||||
return substitute(a:match, '\%(^ \+\)\|\%( \+\ze'.b:delimiter. '\?$\)', '', 'g')
|
||||
endfu
|
||||
fu! csv#CalculateColumnWidth(row) "{{{3
|
||||
fu! csv#CalculateColumnWidth(row, silent) "{{{3
|
||||
" Internal function, not called from external,
|
||||
" does not work with fixed width columns
|
||||
" row for the row for which to calculate the width
|
||||
let b:col_width=[]
|
||||
if has( 'vartabs' ) && b:delimiter == "\t"
|
||||
let vts_save=&vts
|
||||
set vts=
|
||||
endif
|
||||
try
|
||||
if exists("b:csv_headerline")
|
||||
if line('.') < b:csv_headerline
|
||||
@@ -765,7 +774,7 @@ fu! csv#CalculateColumnWidth(row) "{{{3
|
||||
endif
|
||||
let s:max_cols=csv#MaxColumns(line('.'))
|
||||
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
|
||||
catch /csv:no_col/
|
||||
call csv#Warn("Error: getting Column numbers, aborting!")
|
||||
@@ -775,6 +784,9 @@ fu! csv#CalculateColumnWidth(row) "{{{3
|
||||
" delete buffer content in variable b:csv_list,
|
||||
" this was only necessary for calculating the max width
|
||||
unlet! b:csv_list s:columnize_count s:decimal_column
|
||||
if has( 'vartabs' ) && b:delimiter == "\t"
|
||||
let &vts=vts_save
|
||||
endif
|
||||
endfu
|
||||
fu! csv#Columnize(field) "{{{3
|
||||
" Internal function, not called from external,
|
||||
@@ -1055,7 +1067,7 @@ fu! csv#MoveCol(forward, line, ...) "{{{3
|
||||
let maxcol=csv#MaxColumns(line('.'))
|
||||
let cpos=getpos('.')[2]
|
||||
if !exists("b:csv_fixed_width_cols")
|
||||
let curwidth=CSVWidth()
|
||||
let curwidth=CSVWidth(1)
|
||||
call search(b:col, 'bc', line('.'))
|
||||
endif
|
||||
let spos=getpos('.')[2]
|
||||
@@ -1148,7 +1160,7 @@ fu! csv#MoveCol(forward, line, ...) "{{{3
|
||||
" leave the column (if the next column is shorter)
|
||||
if !exists("b:csv_fixed_width_cols")
|
||||
let a = getpos('.')
|
||||
if CSVWidth() == curwidth
|
||||
if CSVWidth(1) == curwidth
|
||||
let a[2]+= cpos-spos
|
||||
endif
|
||||
else
|
||||
@@ -1161,7 +1173,7 @@ fu! csv#MoveCol(forward, line, ...) "{{{3
|
||||
" Move to the correct screen column
|
||||
if !exists("b:csv_fixed_width_cols")
|
||||
let a = getpos('.')
|
||||
if CSVWidth() == curwidth
|
||||
if CSVWidth(1) == curwidth
|
||||
let a[2]+= cpos-spos
|
||||
endif
|
||||
else
|
||||
@@ -1837,7 +1849,7 @@ fu! csv#ProcessFieldValue(field) "{{{3
|
||||
|
||||
if a == b:delimiter
|
||||
try
|
||||
let a=repeat(' ', csv#ColWidth(col))
|
||||
let a=repeat(' ', csv#ColWidth(col, line('$'), 1))
|
||||
catch
|
||||
" no-op
|
||||
endtry
|
||||
@@ -2136,7 +2148,7 @@ fu! csv#NewRecord(line1, line2, count) "{{{3
|
||||
if !exists("b:col_width")
|
||||
" Best guess width
|
||||
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)
|
||||
else
|
||||
let record .= printf("%20s", b:delimiter)
|
||||
@@ -2334,7 +2346,7 @@ fu! csv#ColumnWidth()
|
||||
endfu
|
||||
|
||||
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>' : '')
|
||||
if !get(g:, "csv_nomap_". tolower(keyname), 0)
|
||||
" All mappings are buffer local
|
||||
@@ -3147,7 +3159,9 @@ fu! CSVCount(col, fmt, first, last, ...) "{{{3
|
||||
unlet! s:additional['distinct']
|
||||
return (empty(result) ? 0 : result)
|
||||
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
|
||||
if exists("b:csv_fixed_width_cols")
|
||||
let c = getline(1,'$')
|
||||
@@ -3166,7 +3180,7 @@ fu! CSVWidth() "{{{3
|
||||
" Add width for last column
|
||||
call add(width, max-y+1)
|
||||
else
|
||||
call csv#CalculateColumnWidth('')
|
||||
call csv#CalculateColumnWidth(line('$'), silent)
|
||||
let width=map(copy(b:col_width), 'v:val-1')
|
||||
endif
|
||||
return width
|
||||
@@ -3189,3 +3203,5 @@ endfun
|
||||
|
||||
" Vim Modeline " {{{2
|
||||
" vim: set foldmethod=marker et sw=0 sts=-1 ts=4:
|
||||
|
||||
endif
|
||||
|
||||
@@ -1,6 +1,4 @@
|
||||
if exists('g:polyglot_disabled') && index(g:polyglot_disabled, 'dart') != -1
|
||||
finish
|
||||
endif
|
||||
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'dart') == -1
|
||||
|
||||
|
||||
function! s:error(text) abort
|
||||
@@ -30,61 +28,56 @@ function! s:clearQfList(reason) abort
|
||||
endfunction
|
||||
|
||||
function! dart#fmt(q_args) abort
|
||||
if executable('dartfmt')
|
||||
let buffer_content = join(getline(1, '$'), "\n")
|
||||
let args = '--stdin-name '.expand('%').' '.a:q_args
|
||||
let joined_lines = system(printf('dartfmt %s', args), buffer_content)
|
||||
if buffer_content ==# joined_lines[:-2]
|
||||
call s:clearQfList('dartfmt')
|
||||
return
|
||||
endif
|
||||
if 0 == v:shell_error
|
||||
let win_view = winsaveview()
|
||||
let lines = split(joined_lines, "\n")
|
||||
silent keepjumps call setline(1, lines)
|
||||
if line('$') > len(lines)
|
||||
silent keepjumps execute string(len(lines)+1).',$ delete'
|
||||
endif
|
||||
call winrestview(win_view)
|
||||
call s:clearQfList('dartfmt')
|
||||
else
|
||||
let errors = split(joined_lines, "\n")[2:]
|
||||
let error_format = '%Aline %l\, column %c of %f: %m,%C%.%#'
|
||||
call s:cexpr(error_format, errors, 'dartfmt')
|
||||
endif
|
||||
else
|
||||
call s:error('cannot execute binary file: dartfmt')
|
||||
let cmd = s:FindDartFmt()
|
||||
if type(cmd) != type('') | return | endif
|
||||
let buffer_content = getline(1, '$')
|
||||
let args = '--stdin-name '.expand('%').' '.a:q_args
|
||||
let lines = systemlist(printf('%s %s', cmd, args), join(buffer_content, "\n"))
|
||||
" TODO(https://github.com/dart-lang/sdk/issues/38507) - Remove once the
|
||||
" tool no longer emits this line on SDK upgrades.
|
||||
if lines[-1] ==# 'Isolate creation failed'
|
||||
let lines = lines[:-2]
|
||||
endif
|
||||
if buffer_content == lines
|
||||
call s:clearQfList('dartfmt')
|
||||
return
|
||||
endif
|
||||
if 0 == v:shell_error
|
||||
let win_view = winsaveview()
|
||||
silent keepjumps call setline(1, lines)
|
||||
if line('$') > len(lines)
|
||||
silent keepjumps execute string(len(lines)+1).',$ delete'
|
||||
endif
|
||||
call winrestview(win_view)
|
||||
call s:clearQfList('dartfmt')
|
||||
else
|
||||
let errors = lines[2:]
|
||||
let error_format = '%Aline %l\, column %c of %f: %m,%C%.%#'
|
||||
call s:cexpr(error_format, errors, 'dartfmt')
|
||||
endif
|
||||
endfunction
|
||||
|
||||
function! s:FindDartFmt() abort
|
||||
if executable('dartfmt') | return 'dartfmt' | endif
|
||||
if executable('flutter')
|
||||
let l:flutter_cmd = resolve(exepath('flutter'))
|
||||
let l:bin = fnamemodify(l:flutter_cmd, ':h')
|
||||
let l:dartfmt = l:bin.'/cache/dart-sdk/bin/dartfmt'
|
||||
if executable(l:dartfmt) | return l:dartfmt | endif
|
||||
endif
|
||||
call s:error('Cannot find a `dartfmt` command')
|
||||
endfunction
|
||||
|
||||
function! dart#analyzer(q_args) abort
|
||||
if executable('dartanalyzer')
|
||||
let path = expand('%:p:gs:\:/:')
|
||||
if filereadable(path)
|
||||
let command = printf('dartanalyzer %s %s', a:q_args, shellescape(path))
|
||||
let lines = systemlist(command)
|
||||
call s:cexpr('%m (%f\, line %l\, col %c)', lines, 'dartanalyzer')
|
||||
else
|
||||
call s:error(printf('cannot read a file: "%s"', path))
|
||||
endif
|
||||
else
|
||||
call s:error('cannot execute binary file: dartanalyzer')
|
||||
endif
|
||||
call s:error('DartAnalyzer support has been removed. '.
|
||||
\'If this broke your workflow please comment on '.
|
||||
\'https://github.com/dart-lang/dart-vim-plugin/issues/89')
|
||||
endfunction
|
||||
|
||||
function! dart#tojs(q_args) abort
|
||||
if executable('dart2js')
|
||||
let path = expand('%:p:gs:\:/:')
|
||||
if filereadable(path)
|
||||
let command = printf('dart2js %s %s', a:q_args, shellescape(path))
|
||||
let lines = systemlist(command)
|
||||
call s:cexpr('%m (%f\, line %l\, col %c)', lines, 'dart2js')
|
||||
else
|
||||
call s:error(printf('cannot read a file: "%s"', path))
|
||||
endif
|
||||
else
|
||||
call s:error('cannot execute binary file: dartanalyzer')
|
||||
endif
|
||||
call s:error('Dart2JS support has been removed. '.
|
||||
\'If this broke your workflow please comment on '.
|
||||
\'https://github.com/dart-lang/dart-vim-plugin/issues/89')
|
||||
endfunction
|
||||
|
||||
" Finds the path to `uri`.
|
||||
@@ -93,7 +86,7 @@ endfunction
|
||||
" If the path cannot be resolved, or is not a package: uri, returns the
|
||||
" original.
|
||||
function! dart#resolveUri(uri) abort
|
||||
if a:uri !~ 'package:'
|
||||
if a:uri !~# 'package:'
|
||||
return a:uri
|
||||
endif
|
||||
let package_name = substitute(a:uri, 'package:\(\w\+\)\/.*', '\1', '')
|
||||
@@ -125,20 +118,20 @@ function! s:PackageMap() abort
|
||||
let lines = readfile(dot_packages)
|
||||
let map = {}
|
||||
for line in lines
|
||||
if line =~ '\s*#'
|
||||
if line =~# '\s*#'
|
||||
continue
|
||||
endif
|
||||
let package = substitute(line, ':.*$', '', '')
|
||||
let lib_dir = substitute(line, '^[^:]*:', '', '')
|
||||
if lib_dir =~ 'file:/'
|
||||
if 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:]
|
||||
endif
|
||||
else
|
||||
let lib_dir = resolve(dot_packages_dir.'/'.lib_dir)
|
||||
endif
|
||||
if lib_dir =~ '/$'
|
||||
if lib_dir =~# '/$'
|
||||
let lib_dir = lib_dir[:len(lib_dir) - 2]
|
||||
endif
|
||||
let map[package] = lib_dir
|
||||
@@ -148,7 +141,7 @@ endfunction
|
||||
|
||||
" Toggle whether dartfmt is run on save or not.
|
||||
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
|
||||
return
|
||||
endif
|
||||
@@ -186,3 +179,5 @@ function! dart#setModifiable() abort
|
||||
setlocal nomodifiable
|
||||
endif
|
||||
endfunction
|
||||
|
||||
endif
|
||||
|
||||
@@ -1,6 +1,4 @@
|
||||
if exists('g:polyglot_disabled') && index(g:polyglot_disabled, 'elixir') != -1
|
||||
finish
|
||||
endif
|
||||
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'elixir') == -1
|
||||
|
||||
let s:path = expand('<sfile>:h')
|
||||
let s:cmd = join(['mix', 'run', '--no-start', '--no-compile', shellescape(s:path.'/get_repos.exs')])
|
||||
@@ -22,3 +20,5 @@ endfunction
|
||||
function! db#adapter#ecto#complete_opaque(url) abort
|
||||
return map(s:repo_list(), 'v:val[0]')
|
||||
endfunction
|
||||
|
||||
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
|
||||
@@ -1,6 +1,4 @@
|
||||
if exists('g:polyglot_disabled') && index(g:polyglot_disabled, 'elixir') != -1
|
||||
finish
|
||||
endif
|
||||
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'elixir') == -1
|
||||
|
||||
if !exists("g:elixir_indent_max_lookbehind")
|
||||
let g:elixir_indent_max_lookbehind = 30
|
||||
@@ -25,6 +23,7 @@ function! elixir#indent#indent(lnum)
|
||||
|
||||
let handlers = [
|
||||
\'top_of_file',
|
||||
\'starts_with_string_continuation',
|
||||
\'following_trailing_binary_operator',
|
||||
\'starts_with_pipe',
|
||||
\'starts_with_binary_operator',
|
||||
@@ -35,9 +34,14 @@ function! elixir#indent#indent(lnum)
|
||||
\]
|
||||
for handler in handlers
|
||||
call s:debug('testing handler elixir#indent#handle_'.handler)
|
||||
let context = {'lnum': lnum, 'text': text, 'prev_nb_lnum': prev_nb_lnum, 'prev_nb_text': prev_nb_text}
|
||||
let context = {'lnum': lnum, 'text': text, 'first_nb_char_idx': match(text, '\w'), 'prev_nb_lnum': prev_nb_lnum, 'prev_nb_text': prev_nb_text}
|
||||
let indent = function('elixir#indent#handle_'.handler)(context)
|
||||
if indent != -1
|
||||
if indent == -2
|
||||
" Keep indent the same
|
||||
call s:debug('line '.lnum.': elixir#indent#handle_'.handler.' returned -2; returning indent of -1')
|
||||
call cursor(curs_lnum, curs_col)
|
||||
return -1
|
||||
elseif indent != -1
|
||||
call s:debug('line '.lnum.': elixir#indent#handle_'.handler.' returned '.indent)
|
||||
call cursor(curs_lnum, curs_col)
|
||||
return indent
|
||||
@@ -102,7 +106,11 @@ endfunction
|
||||
" Returns 0 or 1 based on whether or not the given line number and column
|
||||
" number pair is a string or comment
|
||||
function! s:is_string_or_comment(line, col)
|
||||
return synIDattr(synID(a:line, a:col, 1), "name") =~ '\%(String\|Comment\)'
|
||||
return s:syntax_name(a:line, a:col) =~ '\%(String\|Comment\)'
|
||||
endfunction
|
||||
|
||||
function! s:syntax_name(line, col)
|
||||
return synIDattr(synID(a:line, a:col, 1), "name")
|
||||
endfunction
|
||||
|
||||
" Skip expression for searchpair. Returns 0 or 1 based on whether the value
|
||||
@@ -158,6 +166,14 @@ function! elixir#indent#handle_top_of_file(context)
|
||||
end
|
||||
endfunction
|
||||
|
||||
function! elixir#indent#handle_starts_with_string_continuation(context)
|
||||
if s:syntax_name(a:context.lnum, a:context.first_nb_char_idx) =~ '\(String\|Comment\)$'
|
||||
return -2
|
||||
else
|
||||
return -1
|
||||
end
|
||||
endfunction
|
||||
|
||||
function! elixir#indent#handle_follow_prev_nb(context)
|
||||
return s:get_base_indent(a:context.prev_nb_lnum, a:context.prev_nb_text)
|
||||
endfunction
|
||||
@@ -345,3 +361,5 @@ function! elixir#indent#handle_inside_generic_block(context)
|
||||
return -1
|
||||
endif
|
||||
endfunction
|
||||
|
||||
endif
|
||||
|
||||
@@ -1,6 +1,4 @@
|
||||
if exists('g:polyglot_disabled') && index(g:polyglot_disabled, 'elixir') != -1
|
||||
finish
|
||||
endif
|
||||
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'elixir') == -1
|
||||
|
||||
function! elixir#util#get_filename(word) abort
|
||||
let word = a:word
|
||||
@@ -26,3 +24,5 @@ function! elixir#util#get_filename(word) abort
|
||||
|
||||
return word
|
||||
endfunction
|
||||
|
||||
endif
|
||||
|
||||
385
autoload/elm.vim
385
autoload/elm.vim
@@ -1,385 +0,0 @@
|
||||
if exists('g:polyglot_disabled') && index(g:polyglot_disabled, 'elm') != -1
|
||||
finish
|
||||
endif
|
||||
|
||||
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
|
||||
@@ -1,184 +0,0 @@
|
||||
if exists('g:polyglot_disabled') && index(g:polyglot_disabled, 'elm') != -1
|
||||
finish
|
||||
endif
|
||||
|
||||
" 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
|
||||
@@ -1,6 +1,4 @@
|
||||
if exists('g:polyglot_disabled') && index(g:polyglot_disabled, 'fish') != -1
|
||||
finish
|
||||
endif
|
||||
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'fish') == -1
|
||||
|
||||
function! fish#Indent()
|
||||
let l:shiftwidth = shiftwidth()
|
||||
@@ -11,15 +9,15 @@ function! fish#Indent()
|
||||
let l:indent = 0
|
||||
let l:prevline = getline(l:prevlnum)
|
||||
if l:prevline =~# '\v^\s*switch>'
|
||||
let l:indent = l:shiftwidth * 2
|
||||
return indent(l:prevlnum) + l:shiftwidth
|
||||
elseif l:prevline =~# '\v^\s*%(begin|if|else|while|for|function|case)>'
|
||||
let l:indent = l:shiftwidth
|
||||
endif
|
||||
let l:line = getline(v:lnum)
|
||||
if l:line =~# '\v^\s*end>'
|
||||
return indent(v:lnum) - (l:indent ==# 0 ? l:shiftwidth : l:indent)
|
||||
return indent(l:prevlnum) - (l:indent ==# 0 ? l:shiftwidth : l:indent)
|
||||
elseif l:line =~# '\v^\s*%(case|else)>'
|
||||
return indent(v:lnum) - l:shiftwidth
|
||||
return indent(l:prevlnum) - l:shiftwidth
|
||||
endif
|
||||
return indent(l:prevlnum) + l:indent
|
||||
endfunction
|
||||
@@ -56,7 +54,7 @@ function! fish#Complete(findstart, base)
|
||||
let l:completions =
|
||||
\ system('fish -c "complete -C'.shellescape(a:base).'"')
|
||||
let l:cmd = substitute(a:base, '\v\S+$', '', '')
|
||||
for l:line in split(l:completions, '\n')
|
||||
for l:line in filter(split(l:completions, '\n'), 'len(v:val)')
|
||||
let l:tokens = split(l:line, '\t')
|
||||
call add(l:results, {'word': l:cmd.l:tokens[0],
|
||||
\'abbr': l:tokens[0],
|
||||
@@ -69,3 +67,5 @@ endfunction
|
||||
function! fish#errorformat()
|
||||
return '%Afish: %m,%-G%*\\ ^,%-Z%f (line %l):%s'
|
||||
endfunction
|
||||
|
||||
endif
|
||||
|
||||
@@ -1,6 +1,4 @@
|
||||
if exists('g:polyglot_disabled') && index(g:polyglot_disabled, 'go') != -1
|
||||
finish
|
||||
endif
|
||||
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'go') == -1
|
||||
|
||||
" don't spam the user when Vim is started in Vi compatibility mode
|
||||
let s:cpo_save = &cpo
|
||||
@@ -18,10 +16,6 @@ function! go#config#VersionWarning() abort
|
||||
return get(g:, 'go_version_warning', 1)
|
||||
endfunction
|
||||
|
||||
function! go#config#NullModuleWarning() abort
|
||||
return get(g:, 'go_null_module_warning', 1)
|
||||
endfunction
|
||||
|
||||
function! go#config#BuildTags() abort
|
||||
return get(g:, 'go_build_tags', '')
|
||||
endfunction
|
||||
@@ -29,10 +23,12 @@ endfunction
|
||||
function! go#config#SetBuildTags(value) abort
|
||||
if a:value is ''
|
||||
silent! unlet g:go_build_tags
|
||||
call go#lsp#ResetWorkspaceDirectories()
|
||||
return
|
||||
endif
|
||||
|
||||
let g:go_build_tags = a:value
|
||||
call go#lsp#ResetWorkspaceDirectories()
|
||||
endfunction
|
||||
|
||||
function! go#config#TestTimeout() abort
|
||||
@@ -55,8 +51,19 @@ function! go#config#TermMode() abort
|
||||
return get(g:, 'go_term_mode', 'vsplit')
|
||||
endfunction
|
||||
|
||||
function! go#config#TermCloseOnExit() abort
|
||||
return get(g:, 'go_term_close_on_exit', 1)
|
||||
endfunction
|
||||
|
||||
function! go#config#SetTermCloseOnExit(value) abort
|
||||
let g:go_term_close_on_exit = a:value
|
||||
endfunction
|
||||
|
||||
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
|
||||
|
||||
function! go#config#SetTermEnabled(value) abort
|
||||
@@ -80,7 +87,18 @@ function! go#config#StatuslineDuration() abort
|
||||
endfunction
|
||||
|
||||
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
|
||||
|
||||
function! go#config#PlayBrowserCommand() abort
|
||||
@@ -147,23 +165,6 @@ function! go#config#SetGuruScope(scope) abort
|
||||
endif
|
||||
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
|
||||
return get(g:, 'go_echo_command_info', 1)
|
||||
endfunction
|
||||
@@ -203,9 +204,10 @@ endfunction
|
||||
|
||||
function! go#config#DebugWindows() abort
|
||||
return get(g:, 'go_debug_windows', {
|
||||
\ 'stack': 'leftabove 20vnew',
|
||||
\ 'out': 'botright 10new',
|
||||
\ 'vars': 'leftabove 30vnew',
|
||||
\ 'stack': 'leftabove 20new',
|
||||
\ 'goroutines': 'botright 10new',
|
||||
\ 'out': 'botright 5new',
|
||||
\ }
|
||||
\ )
|
||||
|
||||
@@ -222,7 +224,7 @@ function! go#config#DebugCommands() abort
|
||||
endfunction
|
||||
|
||||
function! go#config#DebugLogOutput() abort
|
||||
return get(g:, 'go_debug_log_output', 'debugger, rpc')
|
||||
return get(g:, 'go_debug_log_output', 'debugger,rpc')
|
||||
endfunction
|
||||
|
||||
function! go#config#LspLog() abort
|
||||
@@ -247,6 +249,10 @@ function! go#config#AddtagsTransform() abort
|
||||
return get(g:, 'go_addtags_transform', "snakecase")
|
||||
endfunction
|
||||
|
||||
function! go#config#AddtagsSkipUnexported() abort
|
||||
return get(g:, 'go_addtags_skip_unexported', 0)
|
||||
endfunction
|
||||
|
||||
function! go#config#TemplateAutocreate() abort
|
||||
return get(g:, "go_template_autocreate", 1)
|
||||
endfunction
|
||||
@@ -256,7 +262,7 @@ function! go#config#SetTemplateAutocreate(value) abort
|
||||
endfunction
|
||||
|
||||
function! go#config#MetalinterCommand() abort
|
||||
return get(g:, "go_metalinter_command", "gometalinter")
|
||||
return get(g:, "go_metalinter_command", "golangci-lint")
|
||||
endfunction
|
||||
|
||||
function! go#config#MetalinterAutosaveEnabled() abort
|
||||
@@ -279,10 +285,6 @@ function! go#config#MetalinterEnabled() abort
|
||||
return get(g:, "go_metalinter_enabled", default_enabled)
|
||||
endfunction
|
||||
|
||||
function! go#config#MetalinterDisabled() abort
|
||||
return get(g:, "go_metalinter_disabled", [])
|
||||
endfunction
|
||||
|
||||
function! go#config#GolintBin() abort
|
||||
return get(g:, "go_golint_bin", "golint")
|
||||
endfunction
|
||||
@@ -307,6 +309,10 @@ function! go#config#FmtAutosave() abort
|
||||
return get(g:, "go_fmt_autosave", 1)
|
||||
endfunction
|
||||
|
||||
function! go#config#ImportsAutosave() abort
|
||||
return get(g:, 'go_imports_autosave', 0)
|
||||
endfunction
|
||||
|
||||
function! go#config#SetFmtAutosave(value) abort
|
||||
let g:go_fmt_autosave = a:value
|
||||
endfunction
|
||||
@@ -351,8 +357,12 @@ function! go#config#FmtCommand() abort
|
||||
return get(g:, "go_fmt_command", "gofmt")
|
||||
endfunction
|
||||
|
||||
function! go#config#ImportsMode() abort
|
||||
return get(g:, "go_imports_mode", "goimports")
|
||||
endfunction
|
||||
|
||||
function! go#config#FmtOptions() abort
|
||||
return get(g:, "go_fmt_options", {})
|
||||
return get(b:, "go_fmt_options", get(g:, "go_fmt_options", {}))
|
||||
endfunction
|
||||
|
||||
function! go#config#FmtFailSilently() abort
|
||||
@@ -367,6 +377,11 @@ function! go#config#PlayOpenBrowser() abort
|
||||
return get(g:, "go_play_open_browser", 1)
|
||||
endfunction
|
||||
|
||||
function! go#config#RenameCommand() abort
|
||||
" delegate to go#config#GorenameBin for backwards compatability.
|
||||
return get(g:, "go_rename_command", go#config#GorenameBin())
|
||||
endfunction
|
||||
|
||||
function! go#config#GorenameBin() abort
|
||||
return get(g:, "go_gorename_bin", "gorename")
|
||||
endfunction
|
||||
@@ -462,10 +477,22 @@ function! go#config#HighlightVariableDeclarations() abort
|
||||
return get(g:, 'go_highlight_variable_declarations', 0)
|
||||
endfunction
|
||||
|
||||
function! go#config#HighlightDiagnosticErrors() abort
|
||||
return get(g:, 'go_highlight_diagnostic_errors', 1)
|
||||
endfunction
|
||||
|
||||
function! go#config#HighlightDiagnosticWarnings() abort
|
||||
return get(g:, 'go_highlight_diagnostic_warnings', 1)
|
||||
endfunction
|
||||
|
||||
function! go#config#HighlightDebug() abort
|
||||
return get(g:, 'go_highlight_debug', 1)
|
||||
endfunction
|
||||
|
||||
function! go#config#DebugBreakpointSignText() abort
|
||||
return get(g:, 'go_debug_breakpoint_sign_text', '>')
|
||||
endfunction
|
||||
|
||||
function! go#config#FoldEnable(...) abort
|
||||
if a:0 > 0
|
||||
return index(go#config#FoldEnable(), a:1) > -1
|
||||
@@ -481,6 +508,66 @@ function! go#config#CodeCompletionEnabled() abort
|
||||
return get(g:, "go_code_completion_enabled", 1)
|
||||
endfunction
|
||||
|
||||
function! go#config#Updatetime() abort
|
||||
let go_updatetime = get(g:, 'go_updatetime', 800)
|
||||
return go_updatetime == 0 ? &updatetime : go_updatetime
|
||||
endfunction
|
||||
|
||||
function! go#config#ReferrersMode() abort
|
||||
return get(g:, 'go_referrers_mode', 'gopls')
|
||||
endfunction
|
||||
|
||||
function! go#config#ImplementsMode() abort
|
||||
return get(g:, 'go_implements_mode', 'guru')
|
||||
endfunction
|
||||
|
||||
function! go#config#GoplsCompleteUnimported() abort
|
||||
return get(g:, 'go_gopls_complete_unimported', v:null)
|
||||
endfunction
|
||||
|
||||
function! go#config#GoplsDeepCompletion() abort
|
||||
return get(g:, 'go_gopls_deep_completion', v:null)
|
||||
endfunction
|
||||
|
||||
function! go#config#GoplsMatcher() abort
|
||||
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
|
||||
|
||||
function! go#config#GoplsUsePlaceholders() abort
|
||||
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
|
||||
|
||||
function! go#config#GoplsEnabled() abort
|
||||
return get(g:, 'go_gopls_enabled', 1)
|
||||
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
|
||||
" compatibility reasons.
|
||||
if exists("g:go_gorename_prefill") && g:go_gorename_prefill == 1
|
||||
@@ -492,3 +579,5 @@ let &cpo = s:cpo_save
|
||||
unlet s:cpo_save
|
||||
|
||||
" vim: sw=2 ts=2 et
|
||||
|
||||
endif
|
||||
|
||||
39
autoload/graphql.vim
Normal file
39
autoload/graphql.vim
Normal file
@@ -0,0 +1,39 @@
|
||||
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>
|
||||
|
||||
function! graphql#has_syntax_group(group) abort
|
||||
try
|
||||
silent execute 'silent highlight ' . a:group
|
||||
catch
|
||||
return v:false
|
||||
endtry
|
||||
return v:true
|
||||
endfunction
|
||||
|
||||
function! graphql#javascript_tags() abort
|
||||
return get(g:, 'graphql_javascript_tags', ['gql', 'graphql', 'Relay.QL'])
|
||||
endfunction
|
||||
|
||||
endif
|
||||
158
autoload/health/vimtex.vim
Normal file
158
autoload/health/vimtex.vim
Normal file
@@ -0,0 +1,158 @@
|
||||
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'latex') == -1
|
||||
|
||||
function! health#vimtex#check() abort
|
||||
call vimtex#init_options()
|
||||
|
||||
call health#report_start('vimtex')
|
||||
|
||||
call s:check_general()
|
||||
call s:check_plugin_clash()
|
||||
call s:check_view()
|
||||
call s:check_compiler()
|
||||
endfunction
|
||||
|
||||
function! s:check_general() abort " {{{1
|
||||
if !has('nvim') || v:version < 800
|
||||
call health#report_warn('vimtex works best with Vim 8 or neovim')
|
||||
else
|
||||
call health#report_ok('Vim version should have full support!')
|
||||
endif
|
||||
|
||||
if !executable('bibtex')
|
||||
call health#report_warn('bibtex is not executable, so bibtex completions are disabled.')
|
||||
endif
|
||||
endfunction
|
||||
|
||||
" }}}1
|
||||
|
||||
function! s:check_compiler() abort " {{{1
|
||||
if !g:vimtex_compiler_enabled | return | endif
|
||||
|
||||
if !executable(g:vimtex_compiler_method)
|
||||
let l:ind = ' '
|
||||
call health#report_error(printf(
|
||||
\ '|g:vimtex_compiler_method| (`%s`) is not executable!',
|
||||
\ g:vimtex_compiler_method))
|
||||
return
|
||||
endif
|
||||
|
||||
let l:ok = 1
|
||||
if !executable(g:vimtex_compiler_progname)
|
||||
call health#report_warn(printf(
|
||||
\ '|g:vimtex_compiler_progname| (`%s`) is not executable!',
|
||||
\ g:vimtex_compiler_progname))
|
||||
let l:ok = 0
|
||||
endif
|
||||
|
||||
if has('nvim')
|
||||
\ && fnamemodify(g:vimtex_compiler_progname, ':t') !=# 'nvr'
|
||||
call health#report_warn('Compiler callbacks will not work!', [
|
||||
\ '`neovim-remote` / `nvr` is required for callbacks to work with neovim',
|
||||
\ "Please also set |g:vimtex_compiler_progname| = 'nvr'",
|
||||
\ 'For more info, see :help |vimtex-faq-neovim|',
|
||||
\])
|
||||
let l:ok = 0
|
||||
endif
|
||||
|
||||
if l:ok
|
||||
call health#report_ok('Compiler should work!')
|
||||
endif
|
||||
endfunction
|
||||
|
||||
" }}}1
|
||||
|
||||
function! s:check_plugin_clash() abort " {{{1
|
||||
let l:scriptnames = split(execute('scriptnames'), "\n")
|
||||
|
||||
let l:latexbox = !empty(filter(copy(l:scriptnames), "v:val =~# 'latex-box'"))
|
||||
if l:latexbox
|
||||
call health#report_warn('Conflicting plugin detected: LaTeX-Box')
|
||||
call health#report_info('vimtex does not work as expected when LaTeX-Box is installed!')
|
||||
call health#report_info('Please disable or remove it to use vimtex!')
|
||||
endif
|
||||
endfunction
|
||||
|
||||
" }}}1
|
||||
|
||||
function! s:check_view() abort " {{{1
|
||||
call s:check_view_{g:vimtex_view_method}()
|
||||
|
||||
if executable('xdotool') && !executable('pstree')
|
||||
call health#report_warn('pstree is not available',
|
||||
\ 'vimtex#view#reverse_goto is better if pstree is available.')
|
||||
endif
|
||||
endfunction
|
||||
|
||||
" }}}1
|
||||
function! s:check_view_general() abort " {{{1
|
||||
if executable(g:vimtex_view_general_viewer)
|
||||
call health#report_ok('General viewer should work properly!')
|
||||
else
|
||||
call health#report_error(
|
||||
\ 'Selected viewer is not executable!',
|
||||
\ '- Selection: ' . g:vimtex_view_general_viewer,
|
||||
\ '- Please see :h g:vimtex_view_general_viewer')
|
||||
endif
|
||||
endfunction
|
||||
|
||||
" }}}1
|
||||
function! s:check_view_zathura() abort " {{{1
|
||||
let l:ok = 1
|
||||
|
||||
if !executable('zathura')
|
||||
call health#report_error('Zathura is not executable!')
|
||||
let l:ok = 0
|
||||
endif
|
||||
|
||||
if !executable('xdotool')
|
||||
call health#report_warn('Zathura requires xdotool for forward search!')
|
||||
let l:ok = 0
|
||||
endif
|
||||
|
||||
if l:ok
|
||||
call health#report_ok('Zathura should work properly!')
|
||||
endif
|
||||
endfunction
|
||||
|
||||
" }}}1
|
||||
function! s:check_view_mupdf() abort " {{{1
|
||||
let l:ok = 1
|
||||
|
||||
if !executable('mupdf')
|
||||
call health#report_error('MuPDF is not executable!')
|
||||
let l:ok = 0
|
||||
endif
|
||||
|
||||
if !executable('xdotool')
|
||||
call health#report_warn('MuPDF requires xdotool for forward search!')
|
||||
let l:ok = 0
|
||||
endif
|
||||
|
||||
if !executable('synctex')
|
||||
call health#report_warn('MuPDF requires synctex for forward search!')
|
||||
let l:ok = 0
|
||||
endif
|
||||
|
||||
if l:ok
|
||||
call health#report_ok('MuPDF should work properly!')
|
||||
endif
|
||||
endfunction
|
||||
|
||||
" }}}1
|
||||
function! s:check_view_skim() abort " {{{1
|
||||
let l:cmd = join([
|
||||
\ 'osascript -e ',
|
||||
\ '''tell application "Finder" to POSIX path of ',
|
||||
\ '(get application file id (id of application "Skim") as alias)''',
|
||||
\])
|
||||
|
||||
if system(l:cmd)
|
||||
call health#report_error('Skim is not installed!')
|
||||
else
|
||||
call health#report_ok('Skim viewer should work!')
|
||||
endif
|
||||
endfunction
|
||||
|
||||
" }}}1
|
||||
|
||||
endif
|
||||
@@ -1,6 +1,4 @@
|
||||
if exists('g:polyglot_disabled') && index(g:polyglot_disabled, 'html5') != -1
|
||||
finish
|
||||
endif
|
||||
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'html5') == -1
|
||||
|
||||
" Vim completion script
|
||||
" Language: HTML and XHTML
|
||||
@@ -843,3 +841,5 @@ function! htmlcomplete#CheckDoctype() " {{{
|
||||
endfunction
|
||||
" }}}
|
||||
" vim:set foldmethod=marker:
|
||||
|
||||
endif
|
||||
|
||||
@@ -1,22 +1,20 @@
|
||||
if exists('g:polyglot_disabled') && index(g:polyglot_disabled, 'jsx') != -1
|
||||
finish
|
||||
endif
|
||||
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)
|
||||
let syn_current = s:syn_name(line('.'), col('.'))
|
||||
let syn_start = s:syn_name(line('.'), 1)
|
||||
let line = getline(".")
|
||||
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()
|
||||
|
||||
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*//'
|
||||
let &l:commentstring = '// %s'
|
||||
elseif s:syn_contains(line('.'), col('.'), 'jsxTaggedRegion')
|
||||
elseif s:syn_contains(line('.'), col, 'jsxTaggedRegion')
|
||||
let &l:commentstring = '<!-- %s -->'
|
||||
elseif syn_name =~? '^jsxAttrib'
|
||||
elseif syn_start =~? '^jsxAttrib'
|
||||
let &l:commentstring = '// %s'
|
||||
else
|
||||
let &l:commentstring = '{/* %s */}'
|
||||
@@ -39,3 +37,5 @@ function! s:syn_contains(lnum, cnum, syn_name)
|
||||
let syn_names = map(stack, 'synIDattr(v:val, "name")')
|
||||
return index(syn_names, a:syn_name) >= 0
|
||||
endfunction
|
||||
|
||||
endif
|
||||
|
||||
@@ -1,6 +1,4 @@
|
||||
if exists('g:polyglot_disabled') && index(g:polyglot_disabled, 'jsx') != -1
|
||||
finish
|
||||
endif
|
||||
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('*shiftwidth')
|
||||
function! s:sw()
|
||||
@@ -12,202 +10,297 @@ else
|
||||
endfunction
|
||||
endif
|
||||
|
||||
" Get the syntax group of start of line
|
||||
function! s:syn_sol(lnum)
|
||||
let line = getline(a:lnum)
|
||||
let sol = matchstr(line, '^\s*')
|
||||
return map(synstack(a:lnum, len(sol) + 1), 'synIDattr(v:val, "name")')
|
||||
" Regexp for the start tag
|
||||
let s:start_tag = '<\_s*\%(>\|\${\|\%(\<[-:._$A-Za-z0-9]\+\>\)\)'
|
||||
" Regexp for the end tag
|
||||
let s:end_tag = '\%(<\_s*/\_s*\%(\<[-:._$A-Za-z0-9]\+\>\)\_s*>\|/\_s*>\)'
|
||||
|
||||
function s:trim(line)
|
||||
return substitute(a:line, '^\s*\|\s*$', '', 'g')
|
||||
endfunction
|
||||
|
||||
" Get the syntax group of end of line
|
||||
function! s:syn_eol(lnum)
|
||||
let lnum = prevnonblank(a:lnum)
|
||||
let col = strlen(getline(lnum))
|
||||
return map(synstack(lnum, col), 'synIDattr(v:val, "name")')
|
||||
" Get the syntax stack at the given position
|
||||
function s:syntax_stack_at(lnum, col)
|
||||
return map(synstack(a:lnum, a:col), 'synIDattr(v:val, "name")')
|
||||
endfunction
|
||||
|
||||
function! s:prev_indent(lnum)
|
||||
let lnum = prevnonblank(a:lnum - 1)
|
||||
return indent(lnum)
|
||||
" Get the syntax at the given position
|
||||
function s:syntax_at(lnum, col)
|
||||
return synIDattr(synID(a:lnum, a:col, 1), 'name')
|
||||
endfunction
|
||||
|
||||
function! s:prev_line(lnum)
|
||||
let lnum = prevnonblank(a:lnum - 1)
|
||||
return substitute(getline(lnum), '^\s*\|\s*$', '', 'g')
|
||||
" Get the start col of the non-space charactor
|
||||
function s:start_col(lnum)
|
||||
return len(matchstr(getline(a:lnum), '^\s*')) + 1
|
||||
endfunction
|
||||
|
||||
function! s:syn_attr_jsx(synattr)
|
||||
return a:synattr =~? "^jsx"
|
||||
" Get the start syntax of a given line number
|
||||
function s:start_syntax(lnum)
|
||||
return s:syntax_at(a:lnum, s:start_col(a:lnum))
|
||||
endfunction
|
||||
|
||||
function! s:syn_xmlish(syns)
|
||||
return s:syn_attr_jsx(get(a:syns, -1))
|
||||
" The skip function for searchpair
|
||||
function s:skip_if_not(current_lnum, ...)
|
||||
" Skip the match in current line
|
||||
if line('.') == a:current_lnum
|
||||
return 1
|
||||
endif
|
||||
|
||||
let syntax = s:syntax_at(line('.'), col('.'))
|
||||
return syntax !~? join(a:000, '\|')
|
||||
endfunction
|
||||
|
||||
function! s:syn_jsx_element(syns)
|
||||
return get(a:syns, -1) =~? 'jsxElement'
|
||||
" Whether the specified stytax group is the opening tag
|
||||
function s:is_opening_tag(syntax)
|
||||
return a:syntax =~? 'jsxOpenPunct'
|
||||
endfunction
|
||||
|
||||
function! s:syn_js_comment(syns)
|
||||
return get(a:syns, -1) =~? 'Comment$'
|
||||
" Whether the specified stytax group is the closing tag
|
||||
function s:is_closing_tag(syntax)
|
||||
return a:syntax =~? 'jsxClose'
|
||||
endfunction
|
||||
|
||||
function! s:syn_jsx_escapejs(syns)
|
||||
return get(a:syns, -1) =~? '\(\(js\(Template\)\?\|javaScript\(Embed\)\?\|typescript\)Braces\|javascriptTemplateSB\|typescriptInterpolationDelimiter\)' &&
|
||||
\ (get(a:syns, -2) =~? 'jsxEscapeJs' ||
|
||||
\ get(a:syns, -3) =~? 'jsxEscapeJs')
|
||||
" Whether the specified syntax group is the jsxRegion
|
||||
function s:is_jsx_region(syntax)
|
||||
return a:syntax =~? 'jsxRegion'
|
||||
endfunction
|
||||
|
||||
function! s:syn_jsx_attrib(syns)
|
||||
return len(filter(copy(a:syns), 'v:val =~? "jsxAttrib"'))
|
||||
" Whether the specified syntax group is the jsxElement
|
||||
function s:is_jsx_element(syntax)
|
||||
return a:syntax =~? 'jsxElement'
|
||||
endfunction
|
||||
|
||||
" Whether the specified syntax group is the jsxExpressionBlock
|
||||
function s:is_jsx_expression(syntax)
|
||||
return a:syntax =~? 'jsxExpressionBlock'
|
||||
endfunction
|
||||
|
||||
" Whether the specified syntax group is the jsxBraces
|
||||
function s:is_jsx_brace(syntax)
|
||||
return a:syntax =~? 'jsxBraces'
|
||||
endfunction
|
||||
|
||||
" Whether the specified syntax group is the jsxComment
|
||||
function s:is_jsx_comment(syntax)
|
||||
return a:syntax =~? 'jsxComment'
|
||||
endfunction
|
||||
|
||||
" Whether the specified line is comment related syntax
|
||||
function s:is_comment(syntax)
|
||||
return a:syntax =~? 'comment'
|
||||
endfunction
|
||||
|
||||
" Whether the specified syntax group is the jsxComment
|
||||
function s:is_jsx_backticks(syntax)
|
||||
return a:syntax =~? 'jsxBackticks'
|
||||
endfunction
|
||||
|
||||
" Get the prvious line number
|
||||
function s:prev_lnum(lnum)
|
||||
return prevnonblank(a:lnum - 1)
|
||||
endfunction
|
||||
|
||||
" Whether the given pos is the parent of the given element who has
|
||||
" element_count jsxElement syntax
|
||||
function s:is_parent_element(pos, element_count)
|
||||
let syntax_stack = s:syntax_stack_at(a:pos[0], a:pos[1])
|
||||
return s:is_opening_tag(syntax_stack[-1]) &&
|
||||
\ count(syntax_stack, 'jsxElement') <= a:element_count
|
||||
endfunction
|
||||
|
||||
" Compute the indention of the trail punct
|
||||
function s:jsx_indent_trail_punct(lnum)
|
||||
let pair_line = searchpair('<', '', '>', 'bW', 's:skip_if_not(a:lnum, "jsxOpenPunct", "jsxClose")')
|
||||
return indent(pair_line)
|
||||
endfunction
|
||||
|
||||
" Compute the indention of the closing tag
|
||||
function s:jsx_indent_closing_tag(lnum)
|
||||
let pair_line = searchpair(s:start_tag, '', s:end_tag, 'bW', 's:skip_if_not(a:lnum, "jsxOpenPunct", "jsxClose")')
|
||||
return pair_line ? indent(pair_line) : indent(a:lnum)
|
||||
endfunction
|
||||
|
||||
" Compute the indentation of the jsxElement
|
||||
function s:jsx_indent_element(lnum)
|
||||
let syntax_stack = s:syntax_stack_at(a:lnum, s:start_col(a:lnum))
|
||||
let syntax_name = syntax_stack[-1]
|
||||
let element_count = count(syntax_stack, 'jsxElement')
|
||||
|
||||
if s:trim(getline(a:lnum)) =~ '^>'
|
||||
return s:jsx_indent_trail_punct(a:lnum)
|
||||
endif
|
||||
|
||||
" If current tag is closing tag
|
||||
if s:is_closing_tag(syntax_name)
|
||||
return s:jsx_indent_closing_tag(a:lnum)
|
||||
endif
|
||||
|
||||
" Normalize the jsxElement count for opening tag
|
||||
if s:is_opening_tag(syntax_name)
|
||||
" <div>
|
||||
" <div></div> <-- jsxRegion->jsxElement->jsxElement->jsxTag->jsxOpenTag->jsxOpenPunct
|
||||
" </div>
|
||||
if s:is_jsx_element(syntax_stack[-4]) && s:is_jsx_element(syntax_stack[-5])
|
||||
let element_count = element_count - 1
|
||||
endif
|
||||
endif
|
||||
|
||||
let start_time = localtime()
|
||||
let pos = searchpos(s:start_tag, 'bW')
|
||||
|
||||
while !s:is_parent_element(pos, element_count)
|
||||
if localtime() - start_time >= 0.5
|
||||
return -1
|
||||
endif
|
||||
let pos = searchpos(s:start_tag, 'bW')
|
||||
endwhile
|
||||
|
||||
return indent(pos[0]) + s:sw()
|
||||
endfunction
|
||||
|
||||
" Compute the indentation of the comment
|
||||
function s:jsx_indent_comment(lnum)
|
||||
let line = s:trim(getline(a:lnum))
|
||||
|
||||
if s:is_jsx_comment(s:start_syntax(a:lnum))
|
||||
if line =~ '^<!--' || line =~ '^-->'
|
||||
return s:jsx_indent_element(a:lnum)
|
||||
else
|
||||
return s:jsx_indent_element(a:lnum) + s:sw()
|
||||
endif
|
||||
else
|
||||
if line =~ '^/\*' || line =~ '^//'
|
||||
return s:jsx_indent_element(a:lnum)
|
||||
else
|
||||
return s:jsx_indent_element(a:lnum) + 1
|
||||
endif
|
||||
endif
|
||||
endfunction
|
||||
|
||||
" Compute the indentation of jsxBackticks
|
||||
function s:jsx_indent_backticks(lnum)
|
||||
let tags = get(g:, 'vim_jsx_pretty_template_tags', ['html', 'jsx'])
|
||||
let start_tag = '\%(' . join(tags, '\|') . '\)`'
|
||||
let end_tag = '\%(' . join(tags, '\|') . '\)\@<!`'
|
||||
let pair_line = searchpair(start_tag, '', end_tag, 'bW', 's:skip_if_not(a:lnum)')
|
||||
|
||||
return indent(pair_line)
|
||||
endfunction
|
||||
|
||||
" Syntax context types:
|
||||
" - jsxRegion
|
||||
" - jsxTaggedRegion
|
||||
" - jsxElement
|
||||
" - jsxExpressionBlock
|
||||
" - Other
|
||||
function s:syntax_context(lnum)
|
||||
let start_col = s:start_col(a:lnum)
|
||||
let syntax_stack = s:syntax_stack_at(a:lnum, start_col)
|
||||
let start_syntax = syntax_stack[-1]
|
||||
let reversed = reverse(syntax_stack)
|
||||
let i = 0
|
||||
|
||||
for syntax_name in reversed
|
||||
" If the current line is jsxExpressionBlock and not starts with jsxBraces
|
||||
if s:is_jsx_expression(syntax_name)
|
||||
return 'jsxExpressionBlock'
|
||||
endif
|
||||
|
||||
if s:is_jsx_region(syntax_name)
|
||||
return 'jsxRegion'
|
||||
endif
|
||||
|
||||
if s:is_jsx_element(syntax_name)
|
||||
" If current line starts with the opening tag
|
||||
if s:is_opening_tag(start_syntax) || s:is_closing_tag(start_syntax)
|
||||
" And the next syntax is jsxRegion
|
||||
if s:is_jsx_region(reversed[i+1])
|
||||
return 'jsxRegion'
|
||||
elseif reversed[i+1] =~ 'jsxTaggedRegion'
|
||||
return 'jsxTaggedRegion'
|
||||
else
|
||||
return 'jsxElement'
|
||||
endif
|
||||
elseif reversed[i+1] =~ 'jsxTaggedRegion'
|
||||
return 'jsxTaggedRegion'
|
||||
else
|
||||
return 'jsxElement'
|
||||
endif
|
||||
endif
|
||||
|
||||
let i = i + 1
|
||||
endfor
|
||||
|
||||
return 'Other'
|
||||
endfunction
|
||||
|
||||
let s:start_tag = '<\s*\([-:_\.\$0-9A-Za-z]\+\|>\)'
|
||||
" match `/end_tag>` and `//>`
|
||||
let s:end_tag = '/\%(\s*[-:_\.\$0-9A-Za-z]*\s*\|/\)>'
|
||||
let s:opfirst = '^' . get(g:,'javascript_opfirst',
|
||||
\ '\C\%([<>=,.?^%|/&]\|\([-:+]\)\1\@!\|\*\+\|!=\|in\%(stanceof\)\=\>\)')
|
||||
|
||||
function! jsx_pretty#indent#get(js_indent)
|
||||
let lnum = v:lnum
|
||||
let line = substitute(getline(lnum), '^\s*\|\s*$', '', 'g')
|
||||
let current_syn = s:syn_sol(lnum)
|
||||
let current_syn_eol = s:syn_eol(lnum)
|
||||
let prev_syn_sol = s:syn_sol(lnum - 1)
|
||||
let prev_syn_eol = s:syn_eol(lnum - 1)
|
||||
let prev_line = s:prev_line(lnum)
|
||||
let prev_ind = s:prev_indent(lnum)
|
||||
let line = s:trim(getline(v:lnum))
|
||||
let start_syntax = s:start_syntax(v:lnum)
|
||||
|
||||
if s:syn_xmlish(current_syn)
|
||||
if s:is_jsx_backticks(start_syntax)
|
||||
return s:jsx_indent_backticks(v:lnum)
|
||||
endif
|
||||
|
||||
" {
|
||||
" <div></div>
|
||||
" ##} <--
|
||||
if s:syn_jsx_element(current_syn) && line =~ '}$'
|
||||
let pair_line = searchpair('{', '', '}', 'b')
|
||||
return indent(pair_line)
|
||||
elseif line =~ '^-->$'
|
||||
if prev_line =~ '^<!--'
|
||||
return prev_ind
|
||||
else
|
||||
return prev_ind - s:sw()
|
||||
endif
|
||||
elseif prev_line =~ '-->$'
|
||||
return prev_ind
|
||||
" close tag </tag> or /> including </>
|
||||
elseif prev_line =~ s:end_tag . '$'
|
||||
if line =~ '^<\s*' . s:end_tag
|
||||
return prev_ind - s:sw()
|
||||
elseif s:syn_jsx_attrib(prev_syn_sol)
|
||||
return prev_ind - s:sw()
|
||||
else
|
||||
return prev_ind
|
||||
endif
|
||||
elseif line =~ '^\(>\|/\s*>\)'
|
||||
if prev_line =~ '^<'
|
||||
return prev_ind
|
||||
else
|
||||
return prev_ind - s:sw()
|
||||
endif
|
||||
elseif prev_line =~ '^\(<\|>\)' &&
|
||||
\ (s:syn_xmlish(prev_syn_eol) || s:syn_js_comment(prev_syn_eol))
|
||||
if line =~ '^<\s*' . s:end_tag
|
||||
return prev_ind
|
||||
else
|
||||
return prev_ind + s:sw()
|
||||
endif
|
||||
elseif line =~ '^<\s*' . s:end_tag
|
||||
if !s:syn_xmlish(prev_syn_sol)
|
||||
if s:syn_jsx_escapejs(prev_syn_eol)
|
||||
\ || s:syn_jsx_escapejs(prev_syn_sol)
|
||||
return prev_ind - s:sw()
|
||||
else
|
||||
return prev_ind
|
||||
endif
|
||||
elseif prev_line =~ '^\<return'
|
||||
return prev_ind
|
||||
else
|
||||
return prev_ind - s:sw()
|
||||
endif
|
||||
elseif !s:syn_xmlish(prev_syn_eol)
|
||||
if prev_line =~ '\(&&\|||\|=>\|[([{]\|`\)$'
|
||||
" <div>
|
||||
" {
|
||||
" }
|
||||
" </div>
|
||||
if line =~ '^[)\]}]'
|
||||
return prev_ind
|
||||
else
|
||||
return prev_ind + s:sw()
|
||||
endif
|
||||
else
|
||||
return prev_ind
|
||||
endif
|
||||
elseif !s:syn_xmlish(prev_syn_sol)
|
||||
if prev_line =~ '^\<\(return\|default\|await\|yield\)'
|
||||
if line !~ '^/\s*>' || line !~ '^<\s*' . s:end_tag
|
||||
return prev_ind + s:sw()
|
||||
else
|
||||
return prev_ind
|
||||
endif
|
||||
else
|
||||
return prev_ind
|
||||
endif
|
||||
if s:is_jsx_brace(start_syntax)
|
||||
return s:jsx_indent_element(v:lnum)
|
||||
endif
|
||||
|
||||
if s:is_opening_tag(start_syntax) && line =~ '^>'
|
||||
return s:jsx_indent_trail_punct(v:lnum)
|
||||
endif
|
||||
|
||||
let syntax_context = s:syntax_context(v:lnum)
|
||||
|
||||
if syntax_context == 'jsxRegion'
|
||||
if s:is_closing_tag(start_syntax)
|
||||
return s:jsx_indent_closing_tag(v:lnum)
|
||||
endif
|
||||
|
||||
let prev_lnum = s:prev_lnum(v:lnum)
|
||||
let prev_line = s:trim(getline(prev_lnum))
|
||||
|
||||
if prev_line =~ '[([{=?]$'
|
||||
return indent(prev_lnum) + s:sw()
|
||||
elseif prev_line =~ '[:|&<>]$' &&
|
||||
\ s:trim(getline(s:prev_lnum(prev_lnum))) !~ '[?:|&<>]$'
|
||||
return indent(prev_lnum) + s:sw()
|
||||
else
|
||||
return prev_ind
|
||||
return indent(prev_lnum)
|
||||
endif
|
||||
elseif s:syn_jsx_escapejs(current_syn)
|
||||
if line =~ '^}'
|
||||
let char = getline('.')[col('.') - 1]
|
||||
" When pressing enter after the }, keep the indent
|
||||
if char != '}' && search('}', 'b', lnum)
|
||||
return indent(lnum)
|
||||
else
|
||||
let pair_line = searchpair('{', '', '}', 'bW')
|
||||
return indent(pair_line)
|
||||
endif
|
||||
elseif line =~ '^{' || line =~ '^\${'
|
||||
if s:syn_jsx_escapejs(prev_syn_eol)
|
||||
\ || s:syn_jsx_attrib(prev_syn_sol)
|
||||
return prev_ind
|
||||
elseif s:syn_xmlish(prev_syn_eol) && (prev_line =~ s:end_tag || prev_line =~ '-->$')
|
||||
return prev_ind
|
||||
else
|
||||
return prev_ind + s:sw()
|
||||
endif
|
||||
elseif syntax_context == 'jsxTaggedRegion'
|
||||
if s:is_closing_tag(start_syntax)
|
||||
return s:jsx_indent_closing_tag(v:lnum)
|
||||
elseif s:is_jsx_comment(start_syntax)
|
||||
return s:jsx_indent_comment(v:lnum)
|
||||
else
|
||||
return indent(s:prev_lnum(v:lnum)) + s:sw()
|
||||
endif
|
||||
elseif s:syn_jsx_escapejs(current_syn_eol)
|
||||
let pair_line = searchpair('{', '', '}', 'bW')
|
||||
return indent(pair_line)
|
||||
elseif line =~ '^/[/*]' " js comment in jsx tag
|
||||
if get(prev_syn_sol, -1) =~ 'Punct'
|
||||
return prev_ind + s:sw()
|
||||
elseif synIDattr(synID(lnum - 1, 1, 1), 'name') =~ 'jsxTag'
|
||||
return prev_ind
|
||||
elseif syntax_context == 'jsxElement'
|
||||
if s:is_jsx_comment(start_syntax)
|
||||
return s:jsx_indent_comment(v:lnum)
|
||||
endif
|
||||
|
||||
if s:is_comment(start_syntax)
|
||||
return s:jsx_indent_comment(v:lnum)
|
||||
endif
|
||||
|
||||
return s:jsx_indent_element(v:lnum)
|
||||
elseif syntax_context == 'jsxExpressionBlock'
|
||||
let prev_lnum = s:prev_lnum(v:lnum)
|
||||
let prev_line = s:trim(getline(prev_lnum))
|
||||
|
||||
if line =~ '^?'
|
||||
return indent(prev_lnum) + s:sw()
|
||||
elseif line =~ '^:'
|
||||
return indent(prev_lnum)
|
||||
else
|
||||
return a:js_indent()
|
||||
endif
|
||||
else
|
||||
let ind = a:js_indent()
|
||||
|
||||
" Issue #68
|
||||
" return (<div>
|
||||
" |<div>)
|
||||
if prev_line =~ '^\<return' && line =~ '^<\s*' . s:end_tag
|
||||
return prev_ind
|
||||
endif
|
||||
|
||||
" If current syntax is not a jsx syntax group
|
||||
if s:syn_xmlish(prev_syn_eol) && line !~ '^[)\]}]'
|
||||
let sol = matchstr(line, s:opfirst)
|
||||
if sol is ''
|
||||
" Fix javascript continue indent
|
||||
return ind - s:sw()
|
||||
else
|
||||
return ind
|
||||
endif
|
||||
endif
|
||||
return ind
|
||||
endif
|
||||
|
||||
return a:js_indent()
|
||||
endfunction
|
||||
|
||||
endif
|
||||
|
||||
@@ -1,218 +0,0 @@
|
||||
if exists('g:polyglot_disabled') && index(g:polyglot_disabled, 'jsx') != -1
|
||||
finish
|
||||
endif
|
||||
|
||||
function! jsx_pretty#syntax#highlight()
|
||||
|
||||
let s:highlight_close_tag = get(g:, 'vim_jsx_pretty_highlight_close_tag', 0)
|
||||
|
||||
" <tag id="sample">
|
||||
" ~~~~~~~~~~~~~~~~~
|
||||
" and self close tag
|
||||
" <tag id="sample" />
|
||||
" ~~~~~~~~~~~~~~~~~~~
|
||||
syntax region jsxTag
|
||||
\ start=+<+
|
||||
\ matchgroup=jsxOpenPunct
|
||||
\ end=+>+
|
||||
\ matchgroup=NONE
|
||||
\ end=+\(/\_s*>\)\@=+
|
||||
\ contained
|
||||
\ contains=jsxOpenTag,jsxEscapeJs,jsxAttrib,jsComment,@javascriptComments,javaScriptLineComment,javaScriptComment,typescriptLineComment,typescriptComment,jsxSpreadOperator
|
||||
\ keepend
|
||||
\ extend
|
||||
|
||||
" <tag></tag>
|
||||
" ~~~~~~~~~~~
|
||||
" and fragment
|
||||
" <></>
|
||||
" ~~~~~
|
||||
" and self close tag
|
||||
" <tag />
|
||||
" ~~~~~~~
|
||||
syntax region jsxElement
|
||||
\ start=+<\_s*\(>\|\${\|\z(\<[-:_\.\$0-9A-Za-z]\+\>\)\)+
|
||||
\ end=+/\_s*>+
|
||||
\ end=+<\_s*/\_s*\z1\_s*>+
|
||||
\ contains=jsxElement,jsxEscapeJs,jsxTag,jsxComment,jsxCloseString,jsxCloseTag,@Spell
|
||||
\ keepend
|
||||
\ extend
|
||||
\ contained
|
||||
\ fold
|
||||
|
||||
" detect jsx region
|
||||
syntax region jsxRegion
|
||||
\ start=+\(\(\_[([,?:=+\-*/<>{}]\|&&\|||\|=>\|\<return\|\<default\|\<await\|\<yield\)\_s*\)\@<=<\_s*\(>\|\z(\(script\)\@!\<[_\$A-Za-z][-:_\.\$0-9A-Za-z]*\>\)\(\_s*\([-+*)\]}&|?]\|/\([/*]\|\_s*>\)\@!\)\)\@!\)+
|
||||
\ end=++
|
||||
\ contains=jsxElement
|
||||
|
||||
" <tag key={this.props.key}>
|
||||
" ~~~~~~~~~~~~~~~~
|
||||
syntax region jsxEscapeJs
|
||||
\ start=+{+
|
||||
\ end=++
|
||||
\ extend
|
||||
\ contained
|
||||
\ contains=jsBlock,javascriptBlock,javaScriptBlockBuildIn,typescriptBlock
|
||||
|
||||
" <tag key={this.props.key}>
|
||||
" ~~~~
|
||||
" and fragment start tag
|
||||
" <>
|
||||
" ~~
|
||||
exe 'syntax region jsxOpenTag
|
||||
\ matchgroup=jsxOpenPunct
|
||||
\ start=+<+
|
||||
\ end=+>+
|
||||
\ matchgroup=NONE
|
||||
\ end=+\>+
|
||||
\ contained
|
||||
\ contains=jsxTagName
|
||||
\ nextgroup=jsxAttrib
|
||||
\ skipwhite
|
||||
\ skipempty ' .(s:highlight_close_tag ? 'transparent' : '')
|
||||
|
||||
" <foo.bar>
|
||||
" ~
|
||||
syntax match jsxDot +\.+ contained display
|
||||
|
||||
" <foo:bar>
|
||||
" ~
|
||||
syntax match jsxNamespace +:+ contained display
|
||||
|
||||
" <tag id="sample">
|
||||
" ~
|
||||
syntax match jsxEqual +=+ contained display nextgroup=jsxString,jsxEscapeJs,jsxRegion skipwhite
|
||||
|
||||
" <tag />
|
||||
" ~~
|
||||
syntax match jsxCloseString +/\_s*>+ contained
|
||||
|
||||
" </tag>
|
||||
" ~~~~~~
|
||||
" and fragment close tag
|
||||
" </>
|
||||
" ~~~
|
||||
syntax region jsxCloseTag
|
||||
\ matchgroup=jsxClosePunct
|
||||
\ start=+<\_s*/+
|
||||
\ end=+>+
|
||||
\ contained
|
||||
\ contains=jsxTagName
|
||||
|
||||
" <tag key={this.props.key}>
|
||||
" ~~~
|
||||
syntax match jsxAttrib
|
||||
\ +\<[-A-Za-z_][-:_\$0-9A-Za-z]*\>+
|
||||
\ contained
|
||||
\ nextgroup=jsxEqual
|
||||
\ skipwhite
|
||||
\ skipempty
|
||||
\ contains=jsxAttribKeyword
|
||||
\ display
|
||||
|
||||
" <MyComponent ...>
|
||||
" ~~~~~~~~~~~
|
||||
" NOT
|
||||
" <someCamel ...>
|
||||
" ~~~~~
|
||||
exe 'syntax match jsxComponentName
|
||||
\ +\<[A-Z][\$0-9A-Za-z]\+\>+
|
||||
\ contained
|
||||
\ display ' .(s:highlight_close_tag ? 'transparent' : '')
|
||||
|
||||
" <tag key={this.props.key}>
|
||||
" ~~~
|
||||
exe 'syntax match jsxTagName
|
||||
\ +\<[-:_\.\$0-9A-Za-z]\+\>+
|
||||
\ contained
|
||||
\ contains=jsxComponentName,jsxDot,jsxNamespace
|
||||
\ nextgroup=jsxAttrib
|
||||
\ skipempty
|
||||
\ skipwhite
|
||||
\ display ' .(s:highlight_close_tag ? 'transparent' : '')
|
||||
|
||||
" <tag id="sample">
|
||||
" ~~~~~~~~
|
||||
" and
|
||||
" <tag id='sample'>
|
||||
" ~~~~~~~~
|
||||
syntax region jsxString start=+\z(["']\)+ skip=+\\\%(\z1\|$\)+ end=+\z1+ contained contains=@Spell display
|
||||
|
||||
let s:tags = get(g:, 'vim_jsx_pretty_template_tags', ['html', 'raw'])
|
||||
let s:enable_tagged_jsx = !empty(s:tags)
|
||||
|
||||
" add support to JSX inside the tagged template string
|
||||
" https://github.com/developit/htm
|
||||
if s:enable_tagged_jsx
|
||||
exe 'syntax region jsxTaggedRegion
|
||||
\ start=+\%('. join(s:tags, '\|') .'\)\@<=`+ms=s+1
|
||||
\ end=+`+me=e-1
|
||||
\ extend
|
||||
\ contained
|
||||
\ containedin=jsTemplateString,javascriptTemplate,javaScriptStringT,typescriptStringB
|
||||
\ contains=jsxElement'
|
||||
|
||||
syntax region jsxEscapeJs
|
||||
\ start=+\${+
|
||||
\ end=++
|
||||
\ extend
|
||||
\ contained
|
||||
\ contains=jsTemplateExpression,javascriptTemplateSubstitution,javaScriptEmbed,typescriptInterpolation
|
||||
|
||||
syntax region jsxOpenTag
|
||||
\ matchgroup=jsxOpenPunct
|
||||
\ start=+<\%(\${\)\@=+
|
||||
\ matchgroup=NONE
|
||||
\ end=++
|
||||
\ contained
|
||||
\ contains=jsxEscapeJs
|
||||
\ nextgroup=jsxAttrib,jsxSpreadOperator
|
||||
\ skipwhite
|
||||
\ skipempty
|
||||
|
||||
syntax keyword jsxAttribKeyword class contained display
|
||||
|
||||
syntax match jsxSpreadOperator +\.\.\.+ contained display nextgroup=jsxEscapeJs skipwhite
|
||||
|
||||
syntax match jsxCloseTag +<//>+ display
|
||||
|
||||
syntax match jsxComment +<!--\_.\{-}-->+ display
|
||||
endif
|
||||
|
||||
" Highlight the tag name
|
||||
highlight def link jsxTag Function
|
||||
highlight def link jsxTagName Identifier
|
||||
highlight def link jsxComponentName Function
|
||||
|
||||
highlight def link jsxAttrib Type
|
||||
highlight def link jsxAttribKeyword jsxAttrib
|
||||
highlight def link jsxEqual Operator
|
||||
highlight def link jsxString String
|
||||
highlight def link jsxDot Operator
|
||||
highlight def link jsxNamespace Operator
|
||||
|
||||
" Highlight the jsxCloseString (i.e. />), jsxPunct (i.e. <,>) and jsxCloseTag (i.e. <//>)
|
||||
highlight def link jsxCloseString Comment
|
||||
highlight def link jsxPunct jsxCloseString
|
||||
highlight def link jsxOpenPunct jsxPunct
|
||||
highlight def link jsxClosePunct jsxPunct
|
||||
highlight def link jsxCloseTag jsxCloseString
|
||||
|
||||
highlight def link jsxComment Comment
|
||||
highlight def link jsxSpreadOperator Operator
|
||||
|
||||
if s:highlight_close_tag
|
||||
highlight! def link jsxOpenPunct jsxTag
|
||||
highlight! def link jsxCloseString Identifier
|
||||
endif
|
||||
|
||||
let s:vim_jsx_pretty_colorful_config = get(g:, 'vim_jsx_pretty_colorful_config', 0)
|
||||
|
||||
if s:vim_jsx_pretty_colorful_config == 1
|
||||
highlight def link jsObjectKey Label
|
||||
highlight def link jsArrowFuncArgs Type
|
||||
highlight def link jsFuncArgs Type
|
||||
endif
|
||||
|
||||
endfunction
|
||||
@@ -1,32 +1,11 @@
|
||||
if exists('g:polyglot_disabled') && index(g:polyglot_disabled, 'julia') != -1
|
||||
finish
|
||||
endif
|
||||
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'julia') == -1
|
||||
|
||||
function! julia#set_syntax_version(jvers)
|
||||
if &filetype != "julia"
|
||||
echo "Not a Julia file"
|
||||
return
|
||||
endif
|
||||
syntax clear
|
||||
let b:julia_syntax_version = a:jvers
|
||||
set filetype=julia
|
||||
echo "The julia#set_syntax_version function is deprecated"
|
||||
endfunction
|
||||
|
||||
function! julia#toggle_deprecated_syntax()
|
||||
if &filetype != "julia"
|
||||
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
|
||||
echo "The julia#toggle_deprecated_syntax function is deprecated"
|
||||
endfunction
|
||||
|
||||
if exists("loaded_matchit")
|
||||
@@ -186,3 +165,5 @@ function! julia#gotodefinition()
|
||||
return
|
||||
endfunction
|
||||
|
||||
endif
|
||||
|
||||
|
||||
@@ -1,6 +1,4 @@
|
||||
if exists('g:polyglot_disabled') && index(g:polyglot_disabled, 'julia') != -1
|
||||
finish
|
||||
endif
|
||||
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'julia') == -1
|
||||
|
||||
" path to the julia binary to communicate with
|
||||
if has('win32') || has('win64')
|
||||
@@ -244,3 +242,5 @@ function! s:likely(str) abort
|
||||
let output = systemlist(cmd)
|
||||
return split(matchstr(output[0], '\C^search: \zs.*'))
|
||||
endfunction
|
||||
|
||||
endif
|
||||
|
||||
@@ -1,6 +1,4 @@
|
||||
if exists('g:polyglot_disabled') && index(g:polyglot_disabled, 'julia') != -1
|
||||
finish
|
||||
endif
|
||||
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'julia') == -1
|
||||
|
||||
" Facilities for moving around Julia blocks (e.g. if/end, function/end etc.)
|
||||
" (AKA a collection of horrible hacks)
|
||||
@@ -796,3 +794,5 @@ function! s:cursor_moved(...)
|
||||
let b:jlblk_did_select = b:jlblk_doing_select
|
||||
let b:jlblk_doing_select = 0
|
||||
endfunction
|
||||
|
||||
endif
|
||||
|
||||
@@ -1,9 +1,7 @@
|
||||
if exists('g:polyglot_disabled') && index(g:polyglot_disabled, 'julia') != -1
|
||||
finish
|
||||
endif
|
||||
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'julia') == -1
|
||||
|
||||
" 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
|
||||
|
||||
@@ -660,7 +658,9 @@ function! julia_latex_symbols#get_dict()
|
||||
\ '\nequiv': '≢',
|
||||
\ '\Equiv': '≣',
|
||||
\ '\le': '≤',
|
||||
\ '\leq': '≤',
|
||||
\ '\ge': '≥',
|
||||
\ '\geq': '≥',
|
||||
\ '\leqq': '≦',
|
||||
\ '\geqq': '≧',
|
||||
\ '\lneqq': '≨',
|
||||
@@ -3332,3 +3332,5 @@ function! julia_latex_symbols#get_dict()
|
||||
\ '\:baggage_claim:': '🛄',
|
||||
\ '\:left_luggage:': '🛅'}
|
||||
endfunction
|
||||
|
||||
endif
|
||||
|
||||
@@ -1,6 +1,4 @@
|
||||
if exists('g:polyglot_disabled') && index(g:polyglot_disabled, 'pony') != -1
|
||||
finish
|
||||
endif
|
||||
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'pony') == -1
|
||||
|
||||
" Vim plugin file
|
||||
" Language: Pony
|
||||
@@ -534,3 +532,5 @@ endfunction
|
||||
|
||||
let &cpo = s:cpo_save
|
||||
unlet s:cpo_save
|
||||
|
||||
endif
|
||||
|
||||
72
autoload/puppet/align.vim
Normal file
72
autoload/puppet/align.vim
Normal file
@@ -0,0 +1,72 @@
|
||||
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'puppet') == -1
|
||||
|
||||
function! puppet#align#IndentLevel(lnum)
|
||||
return indent(a:lnum) / &shiftwidth
|
||||
endfunction
|
||||
|
||||
function! puppet#align#LinesInBlock(lnum)
|
||||
let lines = []
|
||||
let indent_level = puppet#align#IndentLevel(a:lnum)
|
||||
|
||||
let marker = a:lnum - 1
|
||||
while marker >= 1
|
||||
let line_text = getline(marker)
|
||||
let line_indent = puppet#align#IndentLevel(marker)
|
||||
|
||||
if line_text =~? '\v\S'
|
||||
if line_indent < indent_level
|
||||
break
|
||||
elseif line_indent == indent_level
|
||||
call add(lines, marker)
|
||||
endif
|
||||
endif
|
||||
|
||||
let marker -= 1
|
||||
endwhile
|
||||
|
||||
let marker = a:lnum
|
||||
while marker <= line('$')
|
||||
let line_text = getline(marker)
|
||||
let line_indent = puppet#align#IndentLevel(marker)
|
||||
|
||||
if line_text =~? '\v\S'
|
||||
if line_indent < indent_level
|
||||
break
|
||||
elseif line_indent == indent_level
|
||||
call add(lines, marker)
|
||||
endif
|
||||
endif
|
||||
|
||||
let marker += 1
|
||||
endwhile
|
||||
|
||||
return lines
|
||||
endfunction
|
||||
|
||||
""
|
||||
" Format lines with hashrocket (=>)
|
||||
" @param a:1 a line where function should search for first hashrocket
|
||||
" expression, if param is not given, line with active cursor is used
|
||||
function! puppet#align#AlignHashrockets(...) abort
|
||||
let l:lnum = get(a:, 1, line('.'))
|
||||
let lines_in_block = puppet#align#LinesInBlock(l:lnum)
|
||||
let max_left_len = 0
|
||||
let indent_str = printf('%' . indent(l:lnum) . 's', '')
|
||||
|
||||
for line_num in lines_in_block
|
||||
let data = matchlist(getline(line_num), '^\s*\(.\{-}\S\)\s*=>\s*\(.*\)$')
|
||||
if !empty(data)
|
||||
let max_left_len = max([max_left_len, strlen(data[1])])
|
||||
endif
|
||||
endfor
|
||||
|
||||
for line_num in lines_in_block
|
||||
let data = matchlist(getline(line_num), '^\s*\(.\{-}\S\)\s*=>\s*\(.*\)$')
|
||||
if !empty(data)
|
||||
let new_line = printf('%s%-' . max_left_len . 's => %s', indent_str, data[1], data[2])
|
||||
call setline(line_num, new_line)
|
||||
endif
|
||||
endfor
|
||||
endfunction
|
||||
|
||||
endif
|
||||
40
autoload/puppet/ctags.vim
Normal file
40
autoload/puppet/ctags.vim
Normal file
@@ -0,0 +1,40 @@
|
||||
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'puppet') == -1
|
||||
|
||||
|
||||
if !exists('s:ctags_type')
|
||||
let s:ctags_type = 0
|
||||
endif
|
||||
|
||||
let s:ctags_options_dir = expand('<sfile>:p:h:h:h') . '/ctags/'
|
||||
|
||||
" Return full path to option file for ctags application
|
||||
function! puppet#ctags#OptionFile()
|
||||
|
||||
if puppet#ctags#Type() == 'universal'
|
||||
let l:ctags_options = 'puppet_u.ctags'
|
||||
else
|
||||
let l:ctags_options = 'puppet.ctags'
|
||||
endif
|
||||
return s:ctags_options_dir . l:ctags_options
|
||||
endfunction
|
||||
|
||||
" Return type of installed ctags application,
|
||||
" can be 'universal' or 'exuberant'
|
||||
function! puppet#ctags#Type()
|
||||
|
||||
if !s:ctags_type
|
||||
let l:version = system('ctags --version')
|
||||
if l:version =~ 'Universal Ctags'
|
||||
let s:ctags_type = 'universal'
|
||||
elseif l:version =~ 'Exuberant Ctags'
|
||||
let s:ctags_type = 'exuberant'
|
||||
else
|
||||
echoerr 'Unknown version of Ctags'
|
||||
endif
|
||||
endif
|
||||
|
||||
return s:ctags_type
|
||||
endfunction
|
||||
|
||||
|
||||
endif
|
||||
74
autoload/puppet/format.vim
Normal file
74
autoload/puppet/format.vim
Normal file
@@ -0,0 +1,74 @@
|
||||
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'puppet') == -1
|
||||
|
||||
"
|
||||
" Simple format using puppet's l:indents and align hashrockets function
|
||||
function! puppet#format#Format() abort
|
||||
let l:start_lnum = v:lnum
|
||||
let l:end_lnum = v:lnum + v:count - 1
|
||||
" Don't modify indentation or alignment if called by textwidth. We'll only
|
||||
" let the fallback function do its thing in this case so that textwidth
|
||||
" still performs the expected feature.
|
||||
if mode() !~# '[iR]'
|
||||
call puppet#format#Indention(l:start_lnum, l:end_lnum)
|
||||
call puppet#format#Hashrocket(l:start_lnum, l:end_lnum)
|
||||
endif
|
||||
call puppet#format#Fallback(l:start_lnum, l:end_lnum)
|
||||
" explicitly avoid falling back to default formatting
|
||||
return 0
|
||||
endfunction
|
||||
|
||||
""
|
||||
" Format hashrockets expressions in every line in range start_lnum and
|
||||
" end_lnum, both ends included
|
||||
"
|
||||
" TODO way of using AlignHashrockets function is ineffective, because it
|
||||
" formats same lines again and again, find better way to do it
|
||||
function! puppet#format#Hashrocket(start_lnum, end_lnum) abort
|
||||
let l:lnum = a:start_lnum
|
||||
while l:lnum <= a:end_lnum
|
||||
call puppet#align#AlignHashrockets(l:lnum)
|
||||
let l:lnum += 1
|
||||
endwhile
|
||||
endfunction
|
||||
|
||||
""
|
||||
" Format indention in every line in range start_lnum and end_lnum, both ends
|
||||
" included
|
||||
"
|
||||
function! puppet#format#Indention(start_lnum, end_lnum) abort
|
||||
execute 'normal! ' . a:start_lnum . 'gg=' . a:end_lnum . 'gg'
|
||||
endfunction
|
||||
|
||||
""
|
||||
" Use internal vim default autoformat method for every line in range, only
|
||||
" lines which exeed &widthline are formated
|
||||
"
|
||||
function! puppet#format#Fallback(start_lnum, end_lnum) abort
|
||||
" We shouldn't wrap lines based on textwidth if it is disabled
|
||||
if &textwidth == 0
|
||||
return
|
||||
endif
|
||||
|
||||
" I'm using it to check if autoformat expand range
|
||||
let l:eof_lnum = line('$')
|
||||
let l:lnum = a:start_lnum
|
||||
let l:end_lnum = a:end_lnum
|
||||
|
||||
while l:lnum <= l:end_lnum
|
||||
if strlen(getline(l:lnum)) > &textwidth
|
||||
call cursor(l:lnum)
|
||||
execute 'normal! gww'
|
||||
" Checking if autoformat expand number of lines if yes, I will extend
|
||||
" range too
|
||||
if l:eof_lnum < line('$')
|
||||
let l:end_lnum += line('$') - l:eof_lnum
|
||||
let l:eof_lnum = line('$')
|
||||
endif
|
||||
endif
|
||||
let l:lnum += 1
|
||||
endwhile
|
||||
|
||||
endfunction
|
||||
|
||||
|
||||
endif
|
||||
@@ -1,6 +1,4 @@
|
||||
if exists('g:polyglot_disabled') && index(g:polyglot_disabled, 'python-compiler') != -1
|
||||
finish
|
||||
endif
|
||||
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'python-compiler') == -1
|
||||
|
||||
" Sometimes Python issues debugging messages
|
||||
" which don't belong to a call stack context
|
||||
@@ -19,3 +17,5 @@ function! python#utils#fix_qflist() " {{{
|
||||
call setqflist(l:traceback)
|
||||
endif
|
||||
endfunction " }}}
|
||||
|
||||
endif
|
||||
|
||||
@@ -1,6 +1,4 @@
|
||||
if exists('g:polyglot_disabled') && index(g:polyglot_disabled, 'ruby') != -1
|
||||
finish
|
||||
endif
|
||||
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'ruby') == -1
|
||||
|
||||
" Vim completion script
|
||||
" Language: Ruby
|
||||
@@ -504,13 +502,8 @@ class VimRubyCompletion
|
||||
return if rails_base == nil
|
||||
$:.push rails_base unless $:.index( rails_base )
|
||||
|
||||
rails_config = rails_base + "config/"
|
||||
rails_lib = rails_base + "lib/"
|
||||
$:.push rails_config unless $:.index( rails_config )
|
||||
$:.push rails_lib unless $:.index( rails_lib )
|
||||
|
||||
bootfile = rails_config + "boot.rb"
|
||||
envfile = rails_config + "environment.rb"
|
||||
bootfile = rails_base + "config/boot.rb"
|
||||
envfile = rails_base + "config/environment.rb"
|
||||
if File.exists?( bootfile ) && File.exists?( envfile )
|
||||
begin
|
||||
require bootfile
|
||||
@@ -878,3 +871,5 @@ call s:DefRuby()
|
||||
"}}} ruby-side code
|
||||
|
||||
" vim:tw=78:sw=4:ts=8:et:fdm=marker:ft=vim:norl:
|
||||
|
||||
endif
|
||||
|
||||
@@ -1,8 +1,5 @@
|
||||
if exists('g:polyglot_disabled') && index(g:polyglot_disabled, 'rust') != -1
|
||||
finish
|
||||
endif
|
||||
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'rust') == -1
|
||||
|
||||
" Author: Kevin Ballard
|
||||
" Description: Helper functions for Rust commands/mappings
|
||||
" Last Modified: May 27, 2014
|
||||
" For bugs, patches and license go to https://github.com/rust-lang/rust.vim
|
||||
@@ -400,10 +397,19 @@ function! s:RmDir(path)
|
||||
echoerr 'Attempted to delete empty path'
|
||||
return 0
|
||||
elseif a:path ==# '/' || a:path ==# $HOME
|
||||
echoerr 'Attempted to delete protected path: ' . a:path
|
||||
let l:path = expand(a:path)
|
||||
if l:path ==# '/' || l:path ==# $HOME
|
||||
echoerr 'Attempted to delete protected path: ' . a:path
|
||||
return 0
|
||||
endif
|
||||
endif
|
||||
|
||||
if !isdirectory(a:path)
|
||||
return 0
|
||||
endif
|
||||
return system("rm -rf " . shellescape(a:path))
|
||||
|
||||
" delete() returns 0 when removing file successfully
|
||||
return delete(a:path, 'rf') == 0
|
||||
endfunction
|
||||
|
||||
" Executes {cmd} with the cwd set to {pwd}, without changing Vim's cwd.
|
||||
@@ -495,7 +501,15 @@ function! s:SearchTestFunctionNameUnderCursor() abort
|
||||
|
||||
" Search the end of test function (closing brace) to ensure that the
|
||||
" 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
|
||||
return ''
|
||||
endif
|
||||
@@ -503,14 +517,23 @@ function! s:SearchTestFunctionNameUnderCursor() abort
|
||||
return matchstr(getline(test_func_line), '\m\C^\s*fn\s\+\zs\h\w*')
|
||||
endfunction
|
||||
|
||||
function! rust#Test(all, options) abort
|
||||
function! rust#Test(mods, winsize, all, options) abort
|
||||
let manifest = findfile('Cargo.toml', expand('%:p:h') . ';')
|
||||
if manifest ==# ''
|
||||
return rust#Run(1, '--test ' . a:options)
|
||||
endif
|
||||
|
||||
if exists(':terminal')
|
||||
let cmd = 'terminal '
|
||||
" <count> defaults to 0, but we prefer an empty string
|
||||
let winsize = a:winsize ? a:winsize : ''
|
||||
|
||||
if has('terminal')
|
||||
if has('patch-8.0.910')
|
||||
let cmd = printf('%s noautocmd %snew | terminal ++curwin ', a:mods, winsize)
|
||||
else
|
||||
let cmd = printf('%s terminal ', a:mods)
|
||||
endif
|
||||
elseif has('nvim')
|
||||
let cmd = printf('%s noautocmd %snew | terminal ', a:mods, winsize)
|
||||
else
|
||||
let cmd = '!'
|
||||
let manifest = shellescape(manifest)
|
||||
@@ -528,23 +551,24 @@ function! rust#Test(all, options) abort
|
||||
let saved = getpos('.')
|
||||
try
|
||||
let func_name = s:SearchTestFunctionNameUnderCursor()
|
||||
if func_name ==# ''
|
||||
echohl ErrorMsg
|
||||
echo 'No test function was found under the cursor. Please add ! to command if you want to run all tests'
|
||||
echohl None
|
||||
return
|
||||
endif
|
||||
if a:options ==# ''
|
||||
execute cmd . 'cargo test --manifest-path' manifest func_name
|
||||
else
|
||||
execute cmd . 'cargo test --manifest-path' manifest func_name a:options
|
||||
endif
|
||||
return
|
||||
finally
|
||||
call setpos('.', saved)
|
||||
endtry
|
||||
if func_name ==# ''
|
||||
echohl ErrorMsg
|
||||
echomsg 'No test function was found under the cursor. Please add ! to command if you want to run all tests'
|
||||
echohl None
|
||||
return
|
||||
endif
|
||||
if a:options ==# ''
|
||||
execute cmd . 'cargo test --manifest-path' manifest func_name
|
||||
else
|
||||
execute cmd . 'cargo test --manifest-path' manifest func_name a:options
|
||||
endif
|
||||
endfunction
|
||||
|
||||
" }}}1
|
||||
|
||||
" vim: set et sw=4 sts=4 ts=8:
|
||||
|
||||
endif
|
||||
|
||||
@@ -1,10 +1,9 @@
|
||||
if exists('g:polyglot_disabled') && index(g:polyglot_disabled, 'rust') != -1
|
||||
finish
|
||||
endif
|
||||
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'rust') == -1
|
||||
|
||||
" For debugging, inspired by https://github.com/w0rp/rust/blob/master/autoload/rust/debugging.vim
|
||||
|
||||
let s:global_variable_list = [
|
||||
\ '_rustfmt_autosave_because_of_config',
|
||||
\ 'ftplugin_rust_source_path',
|
||||
\ 'loaded_syntastic_rust_cargo_checker',
|
||||
\ 'loaded_syntastic_rust_filetype',
|
||||
@@ -32,7 +31,6 @@ let s:global_variable_list = [
|
||||
\ 'rustc_makeprg_no_percent',
|
||||
\ 'rustc_path',
|
||||
\ 'rustfmt_autosave',
|
||||
\ 'rustfmt_autosave_because_of_config',
|
||||
\ 'rustfmt_autosave_if_config_present',
|
||||
\ 'rustfmt_command',
|
||||
\ 'rustfmt_emit_files',
|
||||
@@ -48,7 +46,9 @@ endfunction
|
||||
|
||||
function! s:EchoGlobalVariables() abort
|
||||
for l:key in s:global_variable_list
|
||||
call s:Echo('let g:' . l:key . ' = ' . string(get(g:, l:key, v:null)))
|
||||
if l:key !~# '^_'
|
||||
call s:Echo('let g:' . l:key . ' = ' . string(get(g:, l:key, v:null)))
|
||||
endif
|
||||
|
||||
if has_key(b:, l:key)
|
||||
call s:Echo('let b:' . l:key . ' = ' . string(b:[l:key]))
|
||||
@@ -103,3 +103,5 @@ function! rust#debugging#InfoToFile(filename) abort
|
||||
endfunction
|
||||
|
||||
" vim: set et sw=4 sts=4 ts=8:
|
||||
|
||||
endif
|
||||
|
||||
@@ -1,6 +1,4 @@
|
||||
if exists('g:polyglot_disabled') && index(g:polyglot_disabled, 'rust') != -1
|
||||
finish
|
||||
endif
|
||||
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'rust') == -1
|
||||
|
||||
let s:delimitMate_extra_excluded_regions = ',rustLifetimeCandidate,rustGenericLifetimeCandidate'
|
||||
|
||||
@@ -46,3 +44,5 @@ endfunction
|
||||
|
||||
" vim: set et sw=4 sts=4 ts=8:
|
||||
|
||||
|
||||
endif
|
||||
|
||||
22
autoload/rust/tags.vim
Normal file
22
autoload/rust/tags.vim
Normal file
@@ -0,0 +1,22 @@
|
||||
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'rust') == -1
|
||||
|
||||
" Tagbar support code, for the sake of not automatically overriding its
|
||||
" configuration in case Universal Ctags is detected.
|
||||
|
||||
let s:ctags_is_uctags = 0
|
||||
let s:checked_ctags = 0
|
||||
|
||||
function! rust#tags#IsUCtags() abort
|
||||
if s:checked_ctags == 0
|
||||
let l:ctags_bin = get(g:, 'tagbar_ctags_bin', 'ctags')
|
||||
if system(l:ctags_bin.' --version') =~? 'universal ctags'
|
||||
let s:ctags_is_uctags = 1
|
||||
endif
|
||||
let s:checked_ctags = 1
|
||||
endif
|
||||
return s:ctags_is_uctags
|
||||
endfunction
|
||||
|
||||
" vim: set et sw=4 sts=4 ts=8:
|
||||
|
||||
endif
|
||||
@@ -1,6 +1,4 @@
|
||||
if exists('g:polyglot_disabled') && index(g:polyglot_disabled, 'rust') != -1
|
||||
finish
|
||||
endif
|
||||
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'rust') == -1
|
||||
|
||||
" Author: Stephen Sugden <stephen@stephensugden.com>
|
||||
"
|
||||
@@ -64,18 +62,19 @@ function! s:RustfmtWriteMode()
|
||||
endif
|
||||
endfunction
|
||||
|
||||
function! s:RustfmtConfig()
|
||||
function! s:RustfmtConfigOptions()
|
||||
let l:rustfmt_toml = findfile('rustfmt.toml', expand('%:p:h') . ';')
|
||||
if l:rustfmt_toml !=# ''
|
||||
return '--config-path '.l:rustfmt_toml
|
||||
return '--config-path '.fnamemodify(l:rustfmt_toml, ":p")
|
||||
endif
|
||||
|
||||
let l:_rustfmt_toml = findfile('.rustfmt.toml', expand('%:p:h') . ';')
|
||||
if l:_rustfmt_toml !=# ''
|
||||
return '--config-path '.l:_rustfmt_toml
|
||||
return '--config-path '.fnamemodify(l:_rustfmt_toml, ":p")
|
||||
endif
|
||||
|
||||
return ''
|
||||
" Default to edition 2018 in case no rustfmt.toml was found.
|
||||
return '--edition 2018'
|
||||
endfunction
|
||||
|
||||
function! s:RustfmtCommandRange(filename, line1, line2)
|
||||
@@ -86,7 +85,7 @@ function! s:RustfmtCommandRange(filename, line1, line2)
|
||||
|
||||
let l:arg = {"file": shellescape(a:filename), "range": [a:line1, a:line2]}
|
||||
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
|
||||
" accordingly.
|
||||
@@ -100,21 +99,16 @@ function! s:RustfmtCommandRange(filename, line1, line2)
|
||||
endfunction
|
||||
|
||||
function! s:RustfmtCommand()
|
||||
if g:rustfmt_emit_files
|
||||
let l:write_mode = "--emit=stdout"
|
||||
else
|
||||
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
|
||||
let write_mode = g:rustfmt_emit_files ? '--emit=stdout' : '--write-mode=display'
|
||||
let config = s:RustfmtConfigOptions()
|
||||
return join([g:rustfmt_command, write_mode, config, g:rustfmt_options])
|
||||
endfunction
|
||||
|
||||
function! s:DeleteLines(start, end) abort
|
||||
silent! execute a:start . ',' . a:end . 'delete _'
|
||||
endfunction
|
||||
|
||||
function! s:RunRustfmt(command, tmpname, fail_silently)
|
||||
function! s:RunRustfmt(command, tmpname, from_writepre)
|
||||
mkview!
|
||||
|
||||
let l:stderr_tmpname = tempname()
|
||||
@@ -151,8 +145,10 @@ function! s:RunRustfmt(command, tmpname, fail_silently)
|
||||
|
||||
let l:open_lwindow = 0
|
||||
if v:shell_error == 0
|
||||
" remove undo point caused via BufWritePre
|
||||
try | silent undojoin | catch | endtry
|
||||
if a:from_writepre
|
||||
" remove undo point caused via BufWritePre
|
||||
try | silent undojoin | catch | endtry
|
||||
endif
|
||||
|
||||
if a:tmpname ==# ''
|
||||
let l:content = l:out
|
||||
@@ -172,7 +168,7 @@ function! s:RunRustfmt(command, tmpname, fail_silently)
|
||||
call setloclist(0, [])
|
||||
let l:open_lwindow = 1
|
||||
endif
|
||||
elseif g:rustfmt_fail_silently == 0 && a:fail_silently == 0
|
||||
elseif g:rustfmt_fail_silently == 0 && !a:from_writepre
|
||||
" otherwise get the errors and put them in the location list
|
||||
let l:errors = []
|
||||
|
||||
@@ -226,12 +222,12 @@ function! rustfmt#FormatRange(line1, line2)
|
||||
let l:tmpname = tempname()
|
||||
call writefile(getline(1, '$'), l:tmpname)
|
||||
let command = s:RustfmtCommandRange(l:tmpname, a:line1, a:line2)
|
||||
call s:RunRustfmt(command, l:tmpname, 0)
|
||||
call s:RunRustfmt(command, l:tmpname, v:false)
|
||||
call delete(l:tmpname)
|
||||
endfunction
|
||||
|
||||
function! rustfmt#Format()
|
||||
call s:RunRustfmt(s:RustfmtCommand(), '', 0)
|
||||
call s:RunRustfmt(s:RustfmtCommand(), '', v:false)
|
||||
endfunction
|
||||
|
||||
function! rustfmt#Cmd()
|
||||
@@ -246,7 +242,12 @@ function! rustfmt#PreWrite()
|
||||
if rust#GetConfigVar('rustfmt_autosave_if_config_present', 0)
|
||||
if findfile('rustfmt.toml', '.;') !=# '' || findfile('.rustfmt.toml', '.;') !=# ''
|
||||
let b:rustfmt_autosave = 1
|
||||
let b:rustfmt_autosave_because_of_config = 1
|
||||
let b:_rustfmt_autosave_because_of_config = 1
|
||||
endif
|
||||
else
|
||||
if has_key(b:, '_rustfmt_autosave_because_of_config')
|
||||
unlet b:_rustfmt_autosave_because_of_config
|
||||
unlet b:rustfmt_autosave
|
||||
endif
|
||||
endif
|
||||
|
||||
@@ -254,8 +255,10 @@ function! rustfmt#PreWrite()
|
||||
return
|
||||
endif
|
||||
|
||||
call s:RunRustfmt(s:RustfmtCommand(), '', 1)
|
||||
call s:RunRustfmt(s:RustfmtCommand(), '', v:true)
|
||||
endfunction
|
||||
|
||||
|
||||
" vim: set et sw=4 sts=4 ts=8:
|
||||
|
||||
endif
|
||||
|
||||
@@ -1,6 +1,4 @@
|
||||
if exists('g:polyglot_disabled') && index(g:polyglot_disabled, 'smt2') != -1
|
||||
finish
|
||||
endif
|
||||
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'smt2') == -1
|
||||
|
||||
" Invokes the solver on current file
|
||||
function! smt2#RunSolver()
|
||||
@@ -32,3 +30,5 @@ function! smt2#PrintSolverVersion()
|
||||
silent !clear
|
||||
execute "!" . g:smt2_solver_command . " " . g:smt2_solver_version_switch
|
||||
endfunction
|
||||
|
||||
endif
|
||||
|
||||
@@ -1,25 +1,80 @@
|
||||
if exists('g:polyglot_disabled') && index(g:polyglot_disabled, 'terraform') != -1
|
||||
finish
|
||||
endif
|
||||
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'terraform') == -1
|
||||
|
||||
" Adapted from vim-hclfmt:
|
||||
" https://github.com/fatih/vim-hclfmt/blob/master/autoload/fmt.vim
|
||||
function! terraform#fmt()
|
||||
if !filereadable(expand('%:p'))
|
||||
return
|
||||
let s:cpo_save = &cpoptions
|
||||
set cpoptions&vim
|
||||
|
||||
" Ensure no conflict with arguments from the environment
|
||||
let $TF_CLI_ARGS_fmt=''
|
||||
|
||||
function! terraform#fmt() abort
|
||||
" Save the view.
|
||||
let curw = winsaveview()
|
||||
|
||||
" Make a fake change so that the undo point is right.
|
||||
normal! ix
|
||||
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 -'
|
||||
let &shellredir = shellredir_save
|
||||
|
||||
" If there was an error, undo any changes and show stderr.
|
||||
if v:shell_error != 0
|
||||
silent undo
|
||||
let output = readfile(tmpfile)
|
||||
echo join(output, "\n")
|
||||
endif
|
||||
let l:curw = winsaveview()
|
||||
let l:tmpfile = tempname() . '.tf'
|
||||
call writefile(getline(1, '$'), l:tmpfile)
|
||||
let output = system('terraform fmt -write ' . l:tmpfile)
|
||||
if v:shell_error == 0
|
||||
try | silent undojoin | catch | endtry
|
||||
call rename(l:tmpfile, resolve(expand('%')))
|
||||
silent edit!
|
||||
let &syntax = &syntax
|
||||
else
|
||||
echo output
|
||||
call delete(l:tmpfile)
|
||||
endif
|
||||
call winrestview(l:curw)
|
||||
|
||||
" Delete the temporary file, and restore the view.
|
||||
call delete(tmpfile)
|
||||
call winrestview(curw)
|
||||
endfunction
|
||||
|
||||
function! terraform#align() abort
|
||||
let p = '^.*=[^>]*$'
|
||||
if exists(':Tabularize') && getline('.') =~# '^.*=' && (getline(line('.')-1) =~# p || getline(line('.')+1) =~# p)
|
||||
let column = strlen(substitute(getline('.')[0:col('.')],'[^=]','','g'))
|
||||
let position = strlen(matchstr(getline('.')[0:col('.')],'.*=\s*\zs.*'))
|
||||
Tabularize/=/l1
|
||||
normal! 0
|
||||
call search(repeat('[^=]*=',column).'\s\{-\}'.repeat('.',position),'ce',line('.'))
|
||||
endif
|
||||
endfunction
|
||||
|
||||
function! terraform#commands(ArgLead, CmdLine, CursorPos) abort
|
||||
let commands = [
|
||||
\ 'apply',
|
||||
\ 'console',
|
||||
\ 'destroy',
|
||||
\ 'env',
|
||||
\ 'fmt',
|
||||
\ 'get',
|
||||
\ 'graph',
|
||||
\ 'import',
|
||||
\ 'init',
|
||||
\ 'output',
|
||||
\ 'plan',
|
||||
\ 'providers',
|
||||
\ 'refresh',
|
||||
\ 'show',
|
||||
\ 'taint',
|
||||
\ 'untaint',
|
||||
\ 'validate',
|
||||
\ 'version',
|
||||
\ 'workspace',
|
||||
\ '0.12upgrade',
|
||||
\ 'debug',
|
||||
\ 'force-unlock',
|
||||
\ 'push',
|
||||
\ 'state'
|
||||
\ ]
|
||||
return join(commands, "\n")
|
||||
endfunction
|
||||
|
||||
let &cpoptions = s:cpo_save
|
||||
unlet s:cpo_save
|
||||
|
||||
endif
|
||||
|
||||
87
autoload/unite/sources/vimtex.vim
Normal file
87
autoload/unite/sources/vimtex.vim
Normal file
@@ -0,0 +1,87 @@
|
||||
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'latex') == -1
|
||||
|
||||
" vimtex - LaTeX plugin for Vim
|
||||
"
|
||||
" Maintainer: Karl Yngve Lervåg
|
||||
" Email: karl.yngve@gmail.com
|
||||
"
|
||||
|
||||
let s:save_cpo = &cpo
|
||||
set cpo&vim
|
||||
|
||||
let s:source = {
|
||||
\ 'name' : 'vimtex',
|
||||
\ 'sorters' : 'sorter_nothing',
|
||||
\ 'default_kind' : 'jump_list',
|
||||
\ 'syntax' : 'uniteSource__vimtex',
|
||||
\ 'entries' : [],
|
||||
\ 'maxlevel' : 1,
|
||||
\ 'hooks' : {},
|
||||
\}
|
||||
|
||||
function! s:source.gather_candidates(args, context) abort " {{{1
|
||||
if exists('b:vimtex')
|
||||
let s:source.entries = vimtex#parser#toc()
|
||||
let s:source.maxlevel = max(map(copy(s:source.entries), 'v:val.level'))
|
||||
endif
|
||||
return map(copy(s:source.entries),
|
||||
\ 's:create_candidate(v:val, s:source.maxlevel)')
|
||||
endfunction
|
||||
|
||||
" }}}1
|
||||
function! s:source.hooks.on_syntax(args, context) abort " {{{1
|
||||
syntax match VimtexTocSecs /.* @\d$/
|
||||
\ contains=VimtexTocNum,VimtexTocTag,@Tex
|
||||
\ contained containedin=uniteSource__vimtex
|
||||
syntax match VimtexTocSec0 /.* @0$/
|
||||
\ contains=VimtexTocNum,VimtexTocTag,@Tex
|
||||
\ contained containedin=uniteSource__vimtex
|
||||
syntax match VimtexTocSec1 /.* @1$/
|
||||
\ contains=VimtexTocNum,VimtexTocTag,@Tex
|
||||
\ contained containedin=uniteSource__vimtex
|
||||
syntax match VimtexTocSec2 /.* @2$/
|
||||
\ contains=VimtexTocNum,VimtexTocTag,@Tex
|
||||
\ contained containedin=uniteSource__vimtex
|
||||
syntax match VimtexTocSec3 /.* @3$/
|
||||
\ contains=VimtexTocNum,VimtexTocTag,@Tex
|
||||
\ contained containedin=uniteSource__vimtex
|
||||
syntax match VimtexTocSec4 /.* @4$/
|
||||
\ contains=VimtexTocNum,VimtexTocTag,@Tex
|
||||
\ contained containedin=uniteSource__vimtex
|
||||
syntax match VimtexTocNum
|
||||
\ /\%69v\%(\%([A-Z]\+\>\|\d\+\)\%(\.\d\+\)*\)\?\s*@\d$/
|
||||
\ contains=VimtexTocLevel
|
||||
\ contained containedin=VimtexTocSec[0-9*]
|
||||
syntax match VimtexTocTag
|
||||
\ /\[.\]\s*@\d$/
|
||||
\ contains=VimtexTocLevel
|
||||
\ contained containedin=VimtexTocSec[0-9*]
|
||||
syntax match VimtexTocLevel
|
||||
\ /@\d$/ conceal
|
||||
\ contained containedin=VimtexTocNum,VimtexTocTag
|
||||
endfunction
|
||||
|
||||
" }}}1
|
||||
|
||||
function! s:create_candidate(entry, maxlevel) abort " {{{1
|
||||
let level = a:maxlevel - a:entry.level
|
||||
let title = printf('%-65S%-10s',
|
||||
\ strpart(repeat(' ', 2*level) . a:entry.title, 0, 60),
|
||||
\ b:vimtex.toc.print_number(a:entry.number))
|
||||
return {
|
||||
\ 'word' : title,
|
||||
\ 'abbr' : title . ' @' . level,
|
||||
\ 'action__path' : a:entry.file,
|
||||
\ 'action__line' : get(a:entry, 'line', 0),
|
||||
\ }
|
||||
endfunction
|
||||
|
||||
" }}}1
|
||||
|
||||
function! unite#sources#vimtex#define() abort
|
||||
return s:source
|
||||
endfunction
|
||||
|
||||
let &cpo = s:save_cpo
|
||||
|
||||
endif
|
||||
@@ -1,6 +1,4 @@
|
||||
if exists('g:polyglot_disabled') && index(g:polyglot_disabled, 'vifm') != -1
|
||||
finish
|
||||
endif
|
||||
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'vifm') == -1
|
||||
|
||||
" common functions for vifm command-line editing buffer filetype plugins
|
||||
" Maintainer: xaizek <xaizek@posteo.net>
|
||||
@@ -16,3 +14,5 @@ function! vifm#edit#Init()
|
||||
" Start buffer editing in insert mode
|
||||
startinsert
|
||||
endfunction
|
||||
|
||||
endif
|
||||
|
||||
@@ -1,6 +1,4 @@
|
||||
if exists('g:polyglot_disabled') && index(g:polyglot_disabled, 'vifm') != -1
|
||||
finish
|
||||
endif
|
||||
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'vifm') == -1
|
||||
|
||||
" common functions for vifm plugin related to globals
|
||||
" Maintainer: xaizek <xaizek@posteo.net>
|
||||
@@ -33,3 +31,5 @@ function! vifm#globals#Init()
|
||||
let g:vifm_embed_term = has('gui_running')
|
||||
endif
|
||||
endfunction
|
||||
|
||||
endif
|
||||
|
||||
705
autoload/vimtex.vim
Normal file
705
autoload/vimtex.vim
Normal file
@@ -0,0 +1,705 @@
|
||||
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'latex') == -1
|
||||
|
||||
" vimtex - LaTeX plugin for Vim
|
||||
"
|
||||
" Maintainer: Karl Yngve Lervåg
|
||||
" Email: karl.yngve@gmail.com
|
||||
"
|
||||
|
||||
function! vimtex#init() abort " {{{1
|
||||
call vimtex#init_options()
|
||||
|
||||
call s:init_highlights()
|
||||
call s:init_state()
|
||||
call s:init_buffer()
|
||||
call s:init_default_mappings()
|
||||
|
||||
if exists('#User#VimtexEventInitPost')
|
||||
doautocmd <nomodeline> User VimtexEventInitPost
|
||||
endif
|
||||
|
||||
augroup vimtex_main
|
||||
autocmd!
|
||||
autocmd VimLeave * call s:quit()
|
||||
augroup END
|
||||
endfunction
|
||||
|
||||
" }}}1
|
||||
function! vimtex#init_options() abort " {{{1
|
||||
call s:init_option('vimtex_compiler_enabled', 1)
|
||||
call s:init_option('vimtex_compiler_method', 'latexmk')
|
||||
call s:init_option('vimtex_compiler_progname',
|
||||
\ has('nvim') && executable('nvr')
|
||||
\ ? 'nvr'
|
||||
\ : get(v:, 'progpath', get(v:, 'progname', '')))
|
||||
call s:init_option('vimtex_compiler_callback_hooks', [])
|
||||
call s:init_option('vimtex_compiler_latexmk_engines', {})
|
||||
call s:init_option('vimtex_compiler_latexrun_engines', {})
|
||||
|
||||
call s:init_option('vimtex_complete_enabled', 1)
|
||||
call s:init_option('vimtex_complete_close_braces', 0)
|
||||
call s:init_option('vimtex_complete_ignore_case', &ignorecase)
|
||||
call s:init_option('vimtex_complete_smart_case', &smartcase)
|
||||
call s:init_option('vimtex_complete_bib', {
|
||||
\ 'simple': 0,
|
||||
\ 'menu_fmt': '[@type] @author_short (@year), "@title"',
|
||||
\ 'abbr_fmt': '',
|
||||
\ 'custom_patterns': [],
|
||||
\})
|
||||
call s:init_option('vimtex_complete_ref', {
|
||||
\ 'custom_patterns': [],
|
||||
\})
|
||||
|
||||
call s:init_option('vimtex_delim_timeout', 300)
|
||||
call s:init_option('vimtex_delim_insert_timeout', 60)
|
||||
call s:init_option('vimtex_delim_stopline', 500)
|
||||
|
||||
call s:init_option('vimtex_include_search_enabled', 1)
|
||||
|
||||
call s:init_option('vimtex_doc_enabled', 1)
|
||||
call s:init_option('vimtex_doc_handlers', [])
|
||||
|
||||
call s:init_option('vimtex_echo_verbose_input', 1)
|
||||
|
||||
call s:init_option('vimtex_env_change_autofill', 0)
|
||||
|
||||
if &diff
|
||||
let g:vimtex_fold_enabled = 0
|
||||
else
|
||||
call s:init_option('vimtex_fold_enabled', 0)
|
||||
endif
|
||||
call s:init_option('vimtex_fold_manual', 0)
|
||||
call s:init_option('vimtex_fold_levelmarker', '*')
|
||||
call s:init_option('vimtex_fold_types', {})
|
||||
call s:init_option('vimtex_fold_types_defaults', {
|
||||
\ 'preamble' : {},
|
||||
\ 'comments' : { 'enabled' : 0 },
|
||||
\ 'envs' : {
|
||||
\ 'blacklist' : [],
|
||||
\ 'whitelist' : [],
|
||||
\ },
|
||||
\ 'env_options' : {},
|
||||
\ 'markers' : {},
|
||||
\ 'sections' : {
|
||||
\ 'parse_levels' : 0,
|
||||
\ 'sections' : [
|
||||
\ 'part',
|
||||
\ 'chapter',
|
||||
\ 'section',
|
||||
\ 'subsection',
|
||||
\ 'subsubsection',
|
||||
\ ],
|
||||
\ 'parts' : [
|
||||
\ 'appendix',
|
||||
\ 'frontmatter',
|
||||
\ 'mainmatter',
|
||||
\ 'backmatter',
|
||||
\ ],
|
||||
\ },
|
||||
\ 'cmd_single' : {
|
||||
\ 'cmds' : [
|
||||
\ 'hypersetup',
|
||||
\ 'tikzset',
|
||||
\ 'pgfplotstableread',
|
||||
\ 'lstset',
|
||||
\ ],
|
||||
\ },
|
||||
\ 'cmd_single_opt' : {
|
||||
\ 'cmds' : [
|
||||
\ 'usepackage',
|
||||
\ 'includepdf',
|
||||
\ ],
|
||||
\ },
|
||||
\ 'cmd_multi' : {
|
||||
\ 'cmds' : [
|
||||
\ '%(re)?new%(command|environment)',
|
||||
\ 'providecommand',
|
||||
\ 'presetkeys',
|
||||
\ 'Declare%(Multi|Auto)?CiteCommand',
|
||||
\ 'Declare%(Index)?%(Field|List|Name)%(Format|Alias)',
|
||||
\ ],
|
||||
\ },
|
||||
\ 'cmd_addplot' : {
|
||||
\ 'cmds' : [
|
||||
\ 'addplot[+3]?',
|
||||
\ ],
|
||||
\ },
|
||||
\})
|
||||
|
||||
call s:init_option('vimtex_format_enabled', 0)
|
||||
|
||||
call s:init_option('vimtex_imaps_enabled', 1)
|
||||
call s:init_option('vimtex_imaps_disabled', [])
|
||||
call s:init_option('vimtex_imaps_list', [
|
||||
\ { 'lhs' : '0', 'rhs' : '\emptyset' },
|
||||
\ { 'lhs' : '6', 'rhs' : '\partial' },
|
||||
\ { 'lhs' : '8', 'rhs' : '\infty' },
|
||||
\ { 'lhs' : '=', 'rhs' : '\equiv' },
|
||||
\ { 'lhs' : '\', 'rhs' : '\setminus' },
|
||||
\ { 'lhs' : '.', 'rhs' : '\cdot' },
|
||||
\ { 'lhs' : '*', 'rhs' : '\times' },
|
||||
\ { 'lhs' : '<', 'rhs' : '\langle' },
|
||||
\ { 'lhs' : '>', 'rhs' : '\rangle' },
|
||||
\ { 'lhs' : 'H', 'rhs' : '\hbar' },
|
||||
\ { 'lhs' : '+', 'rhs' : '\dagger' },
|
||||
\ { 'lhs' : '[', 'rhs' : '\subseteq' },
|
||||
\ { 'lhs' : ']', 'rhs' : '\supseteq' },
|
||||
\ { 'lhs' : '(', 'rhs' : '\subset' },
|
||||
\ { 'lhs' : ')', 'rhs' : '\supset' },
|
||||
\ { 'lhs' : 'A', 'rhs' : '\forall' },
|
||||
\ { 'lhs' : 'E', 'rhs' : '\exists' },
|
||||
\ { 'lhs' : 'jj', 'rhs' : '\downarrow' },
|
||||
\ { 'lhs' : 'jJ', 'rhs' : '\Downarrow' },
|
||||
\ { 'lhs' : 'jk', 'rhs' : '\uparrow' },
|
||||
\ { 'lhs' : 'jK', 'rhs' : '\Uparrow' },
|
||||
\ { 'lhs' : 'jh', 'rhs' : '\leftarrow' },
|
||||
\ { 'lhs' : 'jH', 'rhs' : '\Leftarrow' },
|
||||
\ { 'lhs' : 'jl', 'rhs' : '\rightarrow' },
|
||||
\ { 'lhs' : 'jL', 'rhs' : '\Rightarrow' },
|
||||
\ { 'lhs' : 'a', 'rhs' : '\alpha' },
|
||||
\ { 'lhs' : 'b', 'rhs' : '\beta' },
|
||||
\ { 'lhs' : 'c', 'rhs' : '\chi' },
|
||||
\ { 'lhs' : 'd', 'rhs' : '\delta' },
|
||||
\ { 'lhs' : 'e', 'rhs' : '\epsilon' },
|
||||
\ { 'lhs' : 'f', 'rhs' : '\phi' },
|
||||
\ { 'lhs' : 'g', 'rhs' : '\gamma' },
|
||||
\ { 'lhs' : 'h', 'rhs' : '\eta' },
|
||||
\ { 'lhs' : 'i', 'rhs' : '\iota' },
|
||||
\ { 'lhs' : 'k', 'rhs' : '\kappa' },
|
||||
\ { 'lhs' : 'l', 'rhs' : '\lambda' },
|
||||
\ { 'lhs' : 'm', 'rhs' : '\mu' },
|
||||
\ { 'lhs' : 'n', 'rhs' : '\nu' },
|
||||
\ { 'lhs' : 'p', 'rhs' : '\pi' },
|
||||
\ { 'lhs' : 'q', 'rhs' : '\theta' },
|
||||
\ { 'lhs' : 'r', 'rhs' : '\rho' },
|
||||
\ { 'lhs' : 's', 'rhs' : '\sigma' },
|
||||
\ { 'lhs' : 't', 'rhs' : '\tau' },
|
||||
\ { 'lhs' : 'y', 'rhs' : '\psi' },
|
||||
\ { 'lhs' : 'u', 'rhs' : '\upsilon' },
|
||||
\ { 'lhs' : 'w', 'rhs' : '\omega' },
|
||||
\ { 'lhs' : 'z', 'rhs' : '\zeta' },
|
||||
\ { 'lhs' : 'x', 'rhs' : '\xi' },
|
||||
\ { 'lhs' : 'G', 'rhs' : '\Gamma' },
|
||||
\ { 'lhs' : 'D', 'rhs' : '\Delta' },
|
||||
\ { 'lhs' : 'F', 'rhs' : '\Phi' },
|
||||
\ { 'lhs' : 'G', 'rhs' : '\Gamma' },
|
||||
\ { 'lhs' : 'L', 'rhs' : '\Lambda' },
|
||||
\ { 'lhs' : 'P', 'rhs' : '\Pi' },
|
||||
\ { 'lhs' : 'Q', 'rhs' : '\Theta' },
|
||||
\ { 'lhs' : 'S', 'rhs' : '\Sigma' },
|
||||
\ { 'lhs' : 'U', 'rhs' : '\Upsilon' },
|
||||
\ { 'lhs' : 'W', 'rhs' : '\Omega' },
|
||||
\ { 'lhs' : 'X', 'rhs' : '\Xi' },
|
||||
\ { 'lhs' : 'Y', 'rhs' : '\Psi' },
|
||||
\ { 'lhs' : 've', 'rhs' : '\varepsilon' },
|
||||
\ { 'lhs' : 'vf', 'rhs' : '\varphi' },
|
||||
\ { 'lhs' : 'vk', 'rhs' : '\varkappa' },
|
||||
\ { 'lhs' : 'vq', 'rhs' : '\vartheta' },
|
||||
\ { 'lhs' : 'vr', 'rhs' : '\varrho' },
|
||||
\ { 'lhs' : '/', 'rhs' : 'vimtex#imaps#style_math("slashed")', 'expr' : 1, 'leader' : '#'},
|
||||
\ { 'lhs' : 'b', 'rhs' : 'vimtex#imaps#style_math("mathbf")', 'expr' : 1, 'leader' : '#'},
|
||||
\ { 'lhs' : 'f', 'rhs' : 'vimtex#imaps#style_math("mathfrak")', 'expr' : 1, 'leader' : '#'},
|
||||
\ { 'lhs' : 'c', 'rhs' : 'vimtex#imaps#style_math("mathcal")', 'expr' : 1, 'leader' : '#'},
|
||||
\ { 'lhs' : '-', 'rhs' : 'vimtex#imaps#style_math("overline")', 'expr' : 1, 'leader' : '#'},
|
||||
\ { 'lhs' : 'B', 'rhs' : 'vimtex#imaps#style_math("mathbb")', 'expr' : 1, 'leader' : '#'},
|
||||
\])
|
||||
|
||||
call s:init_option('vimtex_mappings_enabled', 1)
|
||||
call s:init_option('vimtex_mappings_disable', {})
|
||||
|
||||
call s:init_option('vimtex_matchparen_enabled', 1)
|
||||
call s:init_option('vimtex_motion_enabled', 1)
|
||||
|
||||
call s:init_option('vimtex_labels_enabled', 1)
|
||||
call s:init_option('vimtex_labels_refresh_always', 1)
|
||||
|
||||
call s:init_option('vimtex_parser_bib_backend', 'bibtex')
|
||||
|
||||
call s:init_option('vimtex_quickfix_enabled', 1)
|
||||
call s:init_option('vimtex_quickfix_method', 'latexlog')
|
||||
call s:init_option('vimtex_quickfix_autojump', '0')
|
||||
call s:init_option('vimtex_quickfix_ignore_filters', [])
|
||||
call s:init_option('vimtex_quickfix_mode', '2')
|
||||
call s:init_option('vimtex_quickfix_open_on_warning', '1')
|
||||
call s:init_option('vimtex_quickfix_blgparser', {})
|
||||
call s:init_option('vimtex_quickfix_autoclose_after_keystrokes', '0')
|
||||
|
||||
call s:init_option('vimtex_syntax_enabled', 1)
|
||||
call s:init_option('vimtex_syntax_nested', {
|
||||
\ 'aliases' : {
|
||||
\ 'C' : 'c',
|
||||
\ 'csharp' : 'cs',
|
||||
\ },
|
||||
\ 'ignored' : {
|
||||
\ 'cs' : [
|
||||
\ 'csBraces',
|
||||
\ ],
|
||||
\ 'python' : [
|
||||
\ 'pythonEscape',
|
||||
\ 'pythonBEscape',
|
||||
\ 'pythonBytesEscape',
|
||||
\ ],
|
||||
\ 'java' : [
|
||||
\ 'javaError',
|
||||
\ ],
|
||||
\ 'haskell' : [
|
||||
\ 'hsVarSym',
|
||||
\ ],
|
||||
\ }
|
||||
\})
|
||||
call s:init_option('vimtex_syntax_autoload_packages', ['amsmath'])
|
||||
|
||||
call s:init_option('vimtex_texcount_custom_arg', '')
|
||||
|
||||
call s:init_option('vimtex_text_obj_enabled', 1)
|
||||
call s:init_option('vimtex_text_obj_variant', 'auto')
|
||||
call s:init_option('vimtex_text_obj_linewise_operators', ['d', 'y'])
|
||||
|
||||
call s:init_option('vimtex_toc_enabled', 1)
|
||||
call s:init_option('vimtex_toc_custom_matchers', [])
|
||||
call s:init_option('vimtex_toc_show_preamble', 1)
|
||||
call s:init_option('vimtex_toc_todo_labels', {
|
||||
\ 'TODO': 'TODO: ',
|
||||
\ 'FIXME': 'FIXME: '
|
||||
\})
|
||||
call s:init_option('vimtex_toc_config', {
|
||||
\ 'name' : 'Table of contents (vimtex)',
|
||||
\ 'mode' : 1,
|
||||
\ 'fold_enable' : 0,
|
||||
\ 'fold_level_start' : -1,
|
||||
\ 'hide_line_numbers' : 1,
|
||||
\ 'hotkeys_enabled' : 0,
|
||||
\ 'hotkeys' : 'abcdeilmnopuvxyz',
|
||||
\ 'hotkeys_leader' : ';',
|
||||
\ 'layer_status' : {
|
||||
\ 'content': 1,
|
||||
\ 'label': 1,
|
||||
\ 'todo': 1,
|
||||
\ 'include': 1,
|
||||
\ },
|
||||
\ 'layer_keys' : {
|
||||
\ 'content': 'C',
|
||||
\ 'label': 'L',
|
||||
\ 'todo': 'T',
|
||||
\ 'include': 'I',
|
||||
\ },
|
||||
\ 'resize' : 0,
|
||||
\ 'refresh_always' : 1,
|
||||
\ 'show_help' : 1,
|
||||
\ 'show_numbers' : 1,
|
||||
\ 'split_pos' : 'vert leftabove',
|
||||
\ 'split_width' : 30,
|
||||
\ 'tocdepth' : 3,
|
||||
\ 'todo_sorted' : 1,
|
||||
\})
|
||||
|
||||
call s:init_option('vimtex_view_enabled', 1)
|
||||
call s:init_option('vimtex_view_automatic', 1)
|
||||
call s:init_option('vimtex_view_method', 'general')
|
||||
call s:init_option('vimtex_view_use_temp_files', 0)
|
||||
call s:init_option('vimtex_view_forward_search_on_start', 1)
|
||||
|
||||
" OS dependent defaults
|
||||
let l:os = vimtex#util#get_os()
|
||||
if l:os ==# 'win'
|
||||
if executable('SumatraPDF')
|
||||
call s:init_option('vimtex_view_general_viewer', 'SumatraPDF')
|
||||
call s:init_option('vimtex_view_general_options',
|
||||
\ '-reuse-instance -forward-search @tex @line @pdf')
|
||||
call s:init_option('vimtex_view_general_options_latexmk',
|
||||
\ 'reuse-instance')
|
||||
elseif executable('mupdf')
|
||||
call s:init_option('vimtex_view_general_viewer', 'mupdf')
|
||||
else
|
||||
call s:init_option('vimtex_view_general_viewer', '')
|
||||
endif
|
||||
else
|
||||
call s:init_option('vimtex_view_general_viewer', get({
|
||||
\ 'linux' : 'xdg-open',
|
||||
\ 'mac' : 'open',
|
||||
\ 'win' : 'start',
|
||||
\}, l:os, ''))
|
||||
call s:init_option('vimtex_view_general_options', '@pdf')
|
||||
call s:init_option('vimtex_view_general_options_latexmk', '')
|
||||
endif
|
||||
|
||||
call s:init_option('vimtex_view_mupdf_options', '')
|
||||
call s:init_option('vimtex_view_mupdf_send_keys', '')
|
||||
call s:init_option('vimtex_view_skim_activate', 0)
|
||||
call s:init_option('vimtex_view_skim_reading_bar', 1)
|
||||
call s:init_option('vimtex_view_zathura_options', '')
|
||||
call s:init_option('vimtex_view_zathura_check_libsynctex', 1)
|
||||
endfunction
|
||||
|
||||
" }}}1
|
||||
function! vimtex#check_plugin_clash() abort " {{{1
|
||||
let l:scriptnames = vimtex#util#command('scriptnames')
|
||||
|
||||
let l:latexbox = !empty(filter(copy(l:scriptnames), "v:val =~# 'latex-box'"))
|
||||
if l:latexbox
|
||||
call vimtex#log#warning([
|
||||
\ 'Conflicting plugin detected: LaTeX-Box',
|
||||
\ 'vimtex does not work as expected when LaTeX-Box is installed!',
|
||||
\ 'Please disable or remove it to use vimtex!',
|
||||
\])
|
||||
endif
|
||||
endfunction
|
||||
|
||||
" }}}1
|
||||
|
||||
function! s:init_option(option, default) abort " {{{1
|
||||
let l:option = 'g:' . a:option
|
||||
if !exists(l:option)
|
||||
let {l:option} = a:default
|
||||
elseif type(a:default) == type({})
|
||||
call vimtex#util#extend_recursive({l:option}, a:default, 'keep')
|
||||
endif
|
||||
endfunction
|
||||
|
||||
" }}}1
|
||||
function! s:init_highlights() abort " {{{1
|
||||
for [l:name, l:target] in [
|
||||
\ ['VimtexImapsArrow', 'Comment'],
|
||||
\ ['VimtexImapsLhs', 'ModeMsg'],
|
||||
\ ['VimtexImapsRhs', 'ModeMsg'],
|
||||
\ ['VimtexImapsWrapper', 'Type'],
|
||||
\ ['VimtexInfo', 'Question'],
|
||||
\ ['VimtexInfoTitle', 'PreProc'],
|
||||
\ ['VimtexInfoKey', 'PreProc'],
|
||||
\ ['VimtexInfoValue', 'Statement'],
|
||||
\ ['VimtexInfoOther', 'Normal'],
|
||||
\ ['VimtexMsg', 'ModeMsg'],
|
||||
\ ['VimtexSuccess', 'Statement'],
|
||||
\ ['VimtexTocHelp', 'helpVim'],
|
||||
\ ['VimtexTocHelpKey', 'ModeMsg'],
|
||||
\ ['VimtexTocHelpLayerOn', 'Statement'],
|
||||
\ ['VimtexTocHelpLayerOff', 'Comment'],
|
||||
\ ['VimtexTocTodo', 'Todo'],
|
||||
\ ['VimtexTocNum', 'Number'],
|
||||
\ ['VimtexTocSec0', 'Title'],
|
||||
\ ['VimtexTocSec1', 'Normal'],
|
||||
\ ['VimtexTocSec2', 'helpVim'],
|
||||
\ ['VimtexTocSec3', 'NonText'],
|
||||
\ ['VimtexTocSec4', 'Comment'],
|
||||
\ ['VimtexTocHotkey', 'Comment'],
|
||||
\ ['VimtexTocLabelsSecs', 'Statement'],
|
||||
\ ['VimtexTocLabelsEq', 'PreProc'],
|
||||
\ ['VimtexTocLabelsFig', 'Identifier'],
|
||||
\ ['VimtexTocLabelsTab', 'String'],
|
||||
\ ['VimtexTocIncl', 'Number'],
|
||||
\ ['VimtexTocInclPath', 'Normal'],
|
||||
\ ['VimtexWarning', 'WarningMsg'],
|
||||
\ ['VimtexError', 'ErrorMsg'],
|
||||
\]
|
||||
if !hlexists(l:name)
|
||||
silent execute 'highlight default link' l:name l:target
|
||||
endif
|
||||
endfor
|
||||
endfunction
|
||||
|
||||
" }}}1
|
||||
function! s:init_state() abort " {{{1
|
||||
call vimtex#state#init()
|
||||
call vimtex#state#init_local()
|
||||
endfunction
|
||||
|
||||
" }}}1
|
||||
function! s:init_buffer() abort " {{{1
|
||||
" Set Vim options
|
||||
for l:suf in [
|
||||
\ '.sty',
|
||||
\ '.cls',
|
||||
\ '.log',
|
||||
\ '.aux',
|
||||
\ '.bbl',
|
||||
\ '.out',
|
||||
\ '.blg',
|
||||
\ '.brf',
|
||||
\ '.cb',
|
||||
\ '.dvi',
|
||||
\ '.fdb_latexmk',
|
||||
\ '.fls',
|
||||
\ '.idx',
|
||||
\ '.ilg',
|
||||
\ '.ind',
|
||||
\ '.inx',
|
||||
\ '.pdf',
|
||||
\ '.synctex.gz',
|
||||
\ '.toc',
|
||||
\ ]
|
||||
execute 'set suffixes+=' . l:suf
|
||||
endfor
|
||||
setlocal suffixesadd=.sty,.tex,.cls
|
||||
setlocal comments=sO:%\ -,mO:%\ \ ,eO:%%,:%
|
||||
setlocal commentstring=%%s
|
||||
setlocal iskeyword+=:
|
||||
setlocal includeexpr=vimtex#include#expr()
|
||||
let &l:include = g:vimtex#re#tex_include
|
||||
let &l:define = '\\\([egx]\|char\|mathchar\|count\|dimen\|muskip\|skip'
|
||||
let &l:define .= '\|toks\)\=def\|\\font\|\\\(future\)\=let'
|
||||
let &l:define .= '\|\\new\(count\|dimen\|skip'
|
||||
let &l:define .= '\|muskip\|box\|toks\|read\|write\|fam\|insert\)'
|
||||
let &l:define .= '\|\\\(re\)\=new\(boolean\|command\|counter\|environment'
|
||||
let &l:define .= '\|font\|if\|length\|savebox'
|
||||
let &l:define .= '\|theorem\(style\)\=\)\s*\*\=\s*{\='
|
||||
let &l:define .= '\|DeclareMathOperator\s*{\=\s*'
|
||||
|
||||
" Define autocommands
|
||||
augroup vimtex_buffers
|
||||
autocmd! * <buffer>
|
||||
autocmd BufFilePre <buffer> call s:filename_changed_pre()
|
||||
autocmd BufFilePost <buffer> call s:filename_changed_post()
|
||||
autocmd BufUnload <buffer> call s:buffer_deleted('unload')
|
||||
autocmd BufWipeout <buffer> call s:buffer_deleted('wipe')
|
||||
augroup END
|
||||
|
||||
" Initialize buffer settings for sub modules
|
||||
for l:mod in s:modules
|
||||
if index(get(b:vimtex, 'disabled_modules', []), l:mod) >= 0 | continue | endif
|
||||
|
||||
try
|
||||
call vimtex#{l:mod}#init_buffer()
|
||||
catch /E117.*#init_/
|
||||
catch /E127.*vimtex#profile#/
|
||||
endtry
|
||||
endfor
|
||||
endfunction
|
||||
|
||||
" }}}1
|
||||
function! s:init_default_mappings() abort " {{{1
|
||||
if !g:vimtex_mappings_enabled | return | endif
|
||||
|
||||
function! s:map(mode, lhs, rhs, ...) abort
|
||||
if !hasmapto(a:rhs, a:mode)
|
||||
\ && index(get(g:vimtex_mappings_disable, a:mode, []), a:lhs) < 0
|
||||
\ && (empty(maparg(a:lhs, a:mode)) || a:0 > 0)
|
||||
silent execute a:mode . 'map <silent><nowait><buffer>' a:lhs a:rhs
|
||||
endif
|
||||
endfunction
|
||||
|
||||
call s:map('n', '<localleader>li', '<plug>(vimtex-info)')
|
||||
call s:map('n', '<localleader>lI', '<plug>(vimtex-info-full)')
|
||||
call s:map('n', '<localleader>lx', '<plug>(vimtex-reload)')
|
||||
call s:map('n', '<localleader>lX', '<plug>(vimtex-reload-state)')
|
||||
call s:map('n', '<localleader>ls', '<plug>(vimtex-toggle-main)')
|
||||
call s:map('n', '<localleader>lq', '<plug>(vimtex-log)')
|
||||
|
||||
call s:map('n', 'ds$', '<plug>(vimtex-env-delete-math)')
|
||||
call s:map('n', 'cs$', '<plug>(vimtex-env-change-math)')
|
||||
call s:map('n', 'dse', '<plug>(vimtex-env-delete)')
|
||||
call s:map('n', 'cse', '<plug>(vimtex-env-change)')
|
||||
call s:map('n', 'tse', '<plug>(vimtex-env-toggle-star)')
|
||||
|
||||
call s:map('n', 'dsc', '<plug>(vimtex-cmd-delete)')
|
||||
call s:map('n', 'csc', '<plug>(vimtex-cmd-change)')
|
||||
call s:map('n', 'tsc', '<plug>(vimtex-cmd-toggle-star)')
|
||||
call s:map('n', 'tsf', '<plug>(vimtex-cmd-toggle-frac)')
|
||||
call s:map('x', 'tsf', '<plug>(vimtex-cmd-toggle-frac)')
|
||||
call s:map('i', '<F7>', '<plug>(vimtex-cmd-create)')
|
||||
call s:map('n', '<F7>', '<plug>(vimtex-cmd-create)')
|
||||
call s:map('x', '<F7>', '<plug>(vimtex-cmd-create)')
|
||||
|
||||
call s:map('n', 'dsd', '<plug>(vimtex-delim-delete)')
|
||||
call s:map('n', 'csd', '<plug>(vimtex-delim-change-math)')
|
||||
call s:map('n', 'tsd', '<plug>(vimtex-delim-toggle-modifier)')
|
||||
call s:map('x', 'tsd', '<plug>(vimtex-delim-toggle-modifier)')
|
||||
call s:map('n', 'tsD', '<plug>(vimtex-delim-toggle-modifier-reverse)')
|
||||
call s:map('x', 'tsD', '<plug>(vimtex-delim-toggle-modifier-reverse)')
|
||||
call s:map('i', ']]', '<plug>(vimtex-delim-close)')
|
||||
|
||||
if g:vimtex_compiler_enabled
|
||||
call s:map('n', '<localleader>ll', '<plug>(vimtex-compile)')
|
||||
call s:map('n', '<localleader>lo', '<plug>(vimtex-compile-output)')
|
||||
call s:map('n', '<localleader>lL', '<plug>(vimtex-compile-selected)')
|
||||
call s:map('x', '<localleader>lL', '<plug>(vimtex-compile-selected)')
|
||||
call s:map('n', '<localleader>lk', '<plug>(vimtex-stop)')
|
||||
call s:map('n', '<localleader>lK', '<plug>(vimtex-stop-all)')
|
||||
call s:map('n', '<localleader>le', '<plug>(vimtex-errors)')
|
||||
call s:map('n', '<localleader>lc', '<plug>(vimtex-clean)')
|
||||
call s:map('n', '<localleader>lC', '<plug>(vimtex-clean-full)')
|
||||
call s:map('n', '<localleader>lg', '<plug>(vimtex-status)')
|
||||
call s:map('n', '<localleader>lG', '<plug>(vimtex-status-all)')
|
||||
endif
|
||||
|
||||
if g:vimtex_motion_enabled
|
||||
" These are forced in order to overwrite matchit mappings
|
||||
call s:map('n', '%', '<plug>(vimtex-%)', 1)
|
||||
call s:map('x', '%', '<plug>(vimtex-%)', 1)
|
||||
call s:map('o', '%', '<plug>(vimtex-%)', 1)
|
||||
|
||||
call s:map('n', ']]', '<plug>(vimtex-]])')
|
||||
call s:map('n', '][', '<plug>(vimtex-][)')
|
||||
call s:map('n', '[]', '<plug>(vimtex-[])')
|
||||
call s:map('n', '[[', '<plug>(vimtex-[[)')
|
||||
call s:map('x', ']]', '<plug>(vimtex-]])')
|
||||
call s:map('x', '][', '<plug>(vimtex-][)')
|
||||
call s:map('x', '[]', '<plug>(vimtex-[])')
|
||||
call s:map('x', '[[', '<plug>(vimtex-[[)')
|
||||
call s:map('o', ']]', '<plug>(vimtex-]])')
|
||||
call s:map('o', '][', '<plug>(vimtex-][)')
|
||||
call s:map('o', '[]', '<plug>(vimtex-[])')
|
||||
call s:map('o', '[[', '<plug>(vimtex-[[)')
|
||||
|
||||
call s:map('n', ']M', '<plug>(vimtex-]M)')
|
||||
call s:map('n', ']m', '<plug>(vimtex-]m)')
|
||||
call s:map('n', '[M', '<plug>(vimtex-[M)')
|
||||
call s:map('n', '[m', '<plug>(vimtex-[m)')
|
||||
call s:map('x', ']M', '<plug>(vimtex-]M)')
|
||||
call s:map('x', ']m', '<plug>(vimtex-]m)')
|
||||
call s:map('x', '[M', '<plug>(vimtex-[M)')
|
||||
call s:map('x', '[m', '<plug>(vimtex-[m)')
|
||||
call s:map('o', ']M', '<plug>(vimtex-]M)')
|
||||
call s:map('o', ']m', '<plug>(vimtex-]m)')
|
||||
call s:map('o', '[M', '<plug>(vimtex-[M)')
|
||||
call s:map('o', '[m', '<plug>(vimtex-[m)')
|
||||
|
||||
call s:map('n', ']/', '<plug>(vimtex-]/)')
|
||||
call s:map('n', ']*', '<plug>(vimtex-]*)')
|
||||
call s:map('n', '[/', '<plug>(vimtex-[/)')
|
||||
call s:map('n', '[*', '<plug>(vimtex-[*)')
|
||||
call s:map('x', ']/', '<plug>(vimtex-]/)')
|
||||
call s:map('x', ']*', '<plug>(vimtex-]*)')
|
||||
call s:map('x', '[/', '<plug>(vimtex-[/)')
|
||||
call s:map('x', '[*', '<plug>(vimtex-[*)')
|
||||
call s:map('o', ']/', '<plug>(vimtex-]/)')
|
||||
call s:map('o', ']*', '<plug>(vimtex-]*)')
|
||||
call s:map('o', '[/', '<plug>(vimtex-[/)')
|
||||
call s:map('o', '[*', '<plug>(vimtex-[*)')
|
||||
endif
|
||||
|
||||
if g:vimtex_text_obj_enabled
|
||||
call s:map('x', 'id', '<plug>(vimtex-id)')
|
||||
call s:map('x', 'ad', '<plug>(vimtex-ad)')
|
||||
call s:map('o', 'id', '<plug>(vimtex-id)')
|
||||
call s:map('o', 'ad', '<plug>(vimtex-ad)')
|
||||
call s:map('x', 'i$', '<plug>(vimtex-i$)')
|
||||
call s:map('x', 'a$', '<plug>(vimtex-a$)')
|
||||
call s:map('o', 'i$', '<plug>(vimtex-i$)')
|
||||
call s:map('o', 'a$', '<plug>(vimtex-a$)')
|
||||
call s:map('x', 'iP', '<plug>(vimtex-iP)')
|
||||
call s:map('x', 'aP', '<plug>(vimtex-aP)')
|
||||
call s:map('o', 'iP', '<plug>(vimtex-iP)')
|
||||
call s:map('o', 'aP', '<plug>(vimtex-aP)')
|
||||
call s:map('x', 'im', '<plug>(vimtex-im)')
|
||||
call s:map('x', 'am', '<plug>(vimtex-am)')
|
||||
call s:map('o', 'im', '<plug>(vimtex-im)')
|
||||
call s:map('o', 'am', '<plug>(vimtex-am)')
|
||||
|
||||
if vimtex#text_obj#targets#enabled()
|
||||
call vimtex#text_obj#targets#init()
|
||||
|
||||
" These are handled explicitly to avoid conflict with gitgutter
|
||||
call s:map('x', 'ic', '<plug>(vimtex-targets-i)c')
|
||||
call s:map('x', 'ac', '<plug>(vimtex-targets-a)c')
|
||||
call s:map('o', 'ic', '<plug>(vimtex-targets-i)c')
|
||||
call s:map('o', 'ac', '<plug>(vimtex-targets-a)c')
|
||||
else
|
||||
if g:vimtex_text_obj_variant ==# 'targets'
|
||||
call vimtex#log#warning(
|
||||
\ "Ignoring g:vimtex_text_obj_variant = 'targets'"
|
||||
\ . " because 'g:loaded_targets' does not exist or is 0.")
|
||||
endif
|
||||
let g:vimtex_text_obj_variant = 'vimtex'
|
||||
|
||||
call s:map('x', 'ie', '<plug>(vimtex-ie)')
|
||||
call s:map('x', 'ae', '<plug>(vimtex-ae)')
|
||||
call s:map('o', 'ie', '<plug>(vimtex-ie)')
|
||||
call s:map('o', 'ae', '<plug>(vimtex-ae)')
|
||||
call s:map('x', 'ic', '<plug>(vimtex-ic)')
|
||||
call s:map('x', 'ac', '<plug>(vimtex-ac)')
|
||||
call s:map('o', 'ic', '<plug>(vimtex-ic)')
|
||||
call s:map('o', 'ac', '<plug>(vimtex-ac)')
|
||||
endif
|
||||
endif
|
||||
|
||||
if g:vimtex_toc_enabled
|
||||
call s:map('n', '<localleader>lt', '<plug>(vimtex-toc-open)')
|
||||
call s:map('n', '<localleader>lT', '<plug>(vimtex-toc-toggle)')
|
||||
endif
|
||||
|
||||
if has_key(b:vimtex, 'viewer')
|
||||
call s:map('n', '<localleader>lv', '<plug>(vimtex-view)')
|
||||
if has_key(b:vimtex.viewer, 'reverse_search')
|
||||
call s:map('n', '<localleader>lr', '<plug>(vimtex-reverse-search)')
|
||||
endif
|
||||
endif
|
||||
|
||||
if g:vimtex_imaps_enabled
|
||||
call s:map('n', '<localleader>lm', '<plug>(vimtex-imaps-list)')
|
||||
endif
|
||||
|
||||
if g:vimtex_doc_enabled
|
||||
call s:map('n', 'K', '<plug>(vimtex-doc-package)')
|
||||
endif
|
||||
endfunction
|
||||
|
||||
" }}}1
|
||||
|
||||
function! s:filename_changed_pre() abort " {{{1
|
||||
let s:filename_changed = expand('%:p') ==# b:vimtex.tex
|
||||
endfunction
|
||||
|
||||
" }}}1
|
||||
function! s:filename_changed_post() abort " {{{1
|
||||
if s:filename_changed
|
||||
let l:base_old = b:vimtex.base
|
||||
let b:vimtex.tex = fnamemodify(expand('%'), ':p')
|
||||
let b:vimtex.base = fnamemodify(b:vimtex.tex, ':t')
|
||||
let b:vimtex.name = fnamemodify(b:vimtex.tex, ':t:r')
|
||||
|
||||
call vimtex#log#warning('Filename change detected')
|
||||
call vimtex#log#info('Old filename: ' . l:base_old)
|
||||
call vimtex#log#info('New filename: ' . b:vimtex.base)
|
||||
|
||||
if has_key(b:vimtex, 'compiler')
|
||||
if b:vimtex.compiler.is_running()
|
||||
call vimtex#log#warning('Compilation stopped!')
|
||||
call vimtex#compiler#stop()
|
||||
endif
|
||||
let b:vimtex.compiler.target = b:vimtex.base
|
||||
let b:vimtex.compiler.target_path = b:vimtex.tex
|
||||
endif
|
||||
endif
|
||||
endfunction
|
||||
|
||||
" }}}1
|
||||
function! s:buffer_deleted(reason) abort " {{{1
|
||||
"
|
||||
" We need a simple cache of buffer ids because a buffer unload might clear
|
||||
" buffer variables, so that a subsequent buffer wipe will not trigger a full
|
||||
" cleanup. By caching the buffer id, we should avoid this issue.
|
||||
"
|
||||
let s:buffer_cache = get(s:, 'buffer_cache', {})
|
||||
let l:file = expand('<afile>')
|
||||
|
||||
if !has_key(s:buffer_cache, l:file)
|
||||
let s:buffer_cache[l:file] = getbufvar(l:file, 'vimtex_id', -1)
|
||||
endif
|
||||
|
||||
if a:reason ==# 'wipe'
|
||||
call vimtex#state#cleanup(s:buffer_cache[l:file])
|
||||
call remove(s:buffer_cache, l:file)
|
||||
endif
|
||||
endfunction
|
||||
|
||||
" }}}1
|
||||
function! s:quit() abort " {{{1
|
||||
for l:state in vimtex#state#list_all()
|
||||
call l:state.cleanup()
|
||||
endfor
|
||||
|
||||
call vimtex#cache#write_all()
|
||||
endfunction
|
||||
|
||||
" }}}1
|
||||
|
||||
|
||||
" {{{1 Initialize module
|
||||
|
||||
let s:modules = map(
|
||||
\ glob(fnamemodify(expand('<sfile>'), ':r') . '/*.vim', 0, 1),
|
||||
\ 'fnamemodify(v:val, '':t:r'')')
|
||||
|
||||
" }}}1
|
||||
|
||||
endif
|
||||
179
autoload/vimtex/cache.vim
Normal file
179
autoload/vimtex/cache.vim
Normal file
@@ -0,0 +1,179 @@
|
||||
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'latex') == -1
|
||||
|
||||
" vimtex - LaTeX plugin for Vim
|
||||
"
|
||||
" Maintainer: Karl Yngve Lervåg
|
||||
" Email: karl.yngve@gmail.com
|
||||
"
|
||||
|
||||
function! vimtex#cache#open(name, ...) abort " {{{1
|
||||
let l:opts = a:0 > 0 ? a:1 : {}
|
||||
let l:name = get(l:opts, 'local') ? s:local_name(a:name) : a:name
|
||||
|
||||
let s:caches = get(s:, 'caches', {})
|
||||
if has_key(s:caches, l:name)
|
||||
return s:caches[l:name]
|
||||
endif
|
||||
|
||||
let s:caches[l:name] = s:cache.init(l:name, l:opts)
|
||||
return s:caches[l:name]
|
||||
endfunction
|
||||
|
||||
" }}}1
|
||||
function! vimtex#cache#close(name) abort " {{{1
|
||||
let s:caches = get(s:, 'caches', {})
|
||||
|
||||
" Try global name first, then local name
|
||||
let l:name = a:name
|
||||
if !has_key(s:caches, l:name)
|
||||
let l:name = s:local_name(l:name)
|
||||
endif
|
||||
if !has_key(s:caches, l:name) | return | endif
|
||||
|
||||
let l:cache = s:caches[l:name]
|
||||
call l:cache.write()
|
||||
unlet s:caches[l:name]
|
||||
endfunction
|
||||
|
||||
" }}}1
|
||||
function! vimtex#cache#wrap(Func, name, ...) abort " {{{1
|
||||
if !has('lambda')
|
||||
throw 'error: vimtex#cache#wrap requires +lambda'
|
||||
endif
|
||||
|
||||
let l:opts = a:0 > 0 ? a:1 : {}
|
||||
let l:cache = vimtex#cache#open(a:name, l:opts)
|
||||
|
||||
function! CachedFunc(key) closure
|
||||
if l:cache.has(a:key)
|
||||
return l:cache.get(a:key)
|
||||
else
|
||||
return l:cache.set(a:key, a:Func(a:key))
|
||||
endif
|
||||
endfunction
|
||||
|
||||
return function('CachedFunc')
|
||||
endfunction
|
||||
|
||||
" }}}1
|
||||
function! vimtex#cache#clear(name, local) abort " {{{1
|
||||
let l:cache = vimtex#cache#open(a:name, {'local': a:local})
|
||||
|
||||
call l:cache.read()
|
||||
if !empty(l:cache.data)
|
||||
let l:cache.data = {}
|
||||
call l:cache.write()
|
||||
endif
|
||||
endfunction
|
||||
|
||||
" }}}1
|
||||
function! vimtex#cache#write_all() abort " {{{1
|
||||
for l:cache in values(get(s:, 'caches', {}))
|
||||
call l:cache.write()
|
||||
endfor
|
||||
endfunction
|
||||
|
||||
" }}}1
|
||||
|
||||
let s:cache = {}
|
||||
|
||||
function! s:cache.init(name, opts) dict abort " {{{1
|
||||
let new = deepcopy(self)
|
||||
unlet new.init
|
||||
|
||||
let l:root = get(g:, 'vimtex_cache_root', $HOME . '/.cache/vimtex')
|
||||
if !isdirectory(l:root)
|
||||
call mkdir(l:root, 'p')
|
||||
endif
|
||||
|
||||
let new.name = a:name
|
||||
let new.path = l:root . '/' . a:name . '.json'
|
||||
let new.local = get(a:opts, 'local')
|
||||
let new.persistent = get(a:opts, 'persistent',
|
||||
\ get(g:, 'vimtex_cache_persistent', 1))
|
||||
|
||||
if has_key(a:opts, 'default')
|
||||
let new.default = a:opts.default
|
||||
endif
|
||||
|
||||
let new.data = {}
|
||||
let new.ftime = -1
|
||||
let new.modified = 0
|
||||
|
||||
return new
|
||||
endfunction
|
||||
|
||||
" }}}1
|
||||
function! s:cache.get(key) dict abort " {{{1
|
||||
call self.read()
|
||||
|
||||
if has_key(self, 'default') && !has_key(self.data, a:key)
|
||||
let self.data[a:key] = deepcopy(self.default)
|
||||
endif
|
||||
|
||||
return get(self.data, a:key)
|
||||
endfunction
|
||||
|
||||
" }}}1
|
||||
function! s:cache.has(key) dict abort " {{{1
|
||||
call self.read()
|
||||
|
||||
return has_key(self.data, a:key)
|
||||
endfunction
|
||||
|
||||
" }}}1
|
||||
function! s:cache.set(key, value) dict abort " {{{1
|
||||
call self.read()
|
||||
|
||||
let self.data[a:key] = a:value
|
||||
let self.modified = 1
|
||||
call self.write()
|
||||
|
||||
return a:value
|
||||
endfunction
|
||||
|
||||
" }}}1
|
||||
function! s:cache.write() dict abort " {{{1
|
||||
if !self.persistent
|
||||
let self.modified = 0
|
||||
return
|
||||
endif
|
||||
|
||||
if !self.modified | return | endif
|
||||
|
||||
call self.read()
|
||||
call writefile([json_encode(self.data)], self.path)
|
||||
let self.ftime = getftime(self.path)
|
||||
let self.modified = 0
|
||||
endfunction
|
||||
|
||||
" }}}1
|
||||
function! s:cache.read() dict abort " {{{1
|
||||
if !self.persistent | return | endif
|
||||
|
||||
if getftime(self.path) > self.ftime
|
||||
let self.ftime = getftime(self.path)
|
||||
call extend(self.data,
|
||||
\ json_decode(join(readfile(self.path))), 'keep')
|
||||
endif
|
||||
endfunction
|
||||
|
||||
" }}}1
|
||||
|
||||
"
|
||||
" Utility functions
|
||||
"
|
||||
function! s:local_name(name) abort " {{{1
|
||||
let l:filename = exists('b:vimtex.tex')
|
||||
\ ? fnamemodify(b:vimtex.tex, ':r')
|
||||
\ : expand('%:p:r')
|
||||
let l:filename = substitute(l:filename, '\s\+', '_', 'g')
|
||||
let l:filename = substitute(l:filename, '\/', '%', 'g')
|
||||
let l:filename = substitute(l:filename, '\\', '%', 'g')
|
||||
let l:filename = substitute(l:filename, ':', '%', 'g')
|
||||
return a:name . l:filename
|
||||
endfunction
|
||||
|
||||
" }}}1
|
||||
|
||||
endif
|
||||
718
autoload/vimtex/cmd.vim
Normal file
718
autoload/vimtex/cmd.vim
Normal file
@@ -0,0 +1,718 @@
|
||||
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'latex') == -1
|
||||
|
||||
" vimtex - LaTeX plugin for Vim
|
||||
"
|
||||
" Maintainer: Karl Yngve Lervåg
|
||||
" Email: karl.yngve@gmail.com
|
||||
"
|
||||
|
||||
function! vimtex#cmd#init_buffer() abort " {{{1
|
||||
nnoremap <silent><buffer> <plug>(vimtex-cmd-delete)
|
||||
\ :<c-u>call <sid>operator_setup('delete')<bar>normal! g@l<cr>
|
||||
|
||||
nnoremap <silent><buffer> <plug>(vimtex-cmd-change)
|
||||
\ :<c-u>call <sid>operator_setup('change')<bar>normal! g@l<cr>
|
||||
|
||||
inoremap <silent><buffer> <plug>(vimtex-cmd-create)
|
||||
\ <c-r>=vimtex#cmd#create_insert()<cr>
|
||||
|
||||
nnoremap <silent><buffer> <plug>(vimtex-cmd-create)
|
||||
\ :<c-u>call <sid>operator_setup('create')<bar>normal! g@l<cr>
|
||||
|
||||
xnoremap <silent><buffer> <plug>(vimtex-cmd-create)
|
||||
\ :<c-u>call vimtex#cmd#create_visual()<cr>
|
||||
|
||||
nnoremap <silent><buffer> <plug>(vimtex-cmd-toggle-star)
|
||||
\ :<c-u>call <sid>operator_setup('toggle_star')<bar>normal! g@l<cr>
|
||||
|
||||
nnoremap <silent><buffer> <plug>(vimtex-cmd-toggle-frac)
|
||||
\ :<c-u>call <sid>operator_setup('toggle_frac')<bar>normal! g@l<cr>
|
||||
|
||||
xnoremap <silent><buffer> <plug>(vimtex-cmd-toggle-frac)
|
||||
\ :<c-u>call vimtex#cmd#toggle_frac_visual()<cr>
|
||||
endfunction
|
||||
|
||||
" }}}1
|
||||
|
||||
function! vimtex#cmd#change(new_name) abort " {{{1
|
||||
let l:cmd = vimtex#cmd#get_current()
|
||||
if empty(l:cmd) | return | endif
|
||||
|
||||
let l:old_name = l:cmd.name
|
||||
let l:lnum = l:cmd.pos_start.lnum
|
||||
let l:cnum = l:cmd.pos_start.cnum
|
||||
|
||||
" Get new command name
|
||||
let l:new_name = substitute(a:new_name, '^\\', '', '')
|
||||
if empty(l:new_name) | return | endif
|
||||
|
||||
" Update current position
|
||||
let l:save_pos = vimtex#pos#get_cursor()
|
||||
if strlen(l:new_name) < strlen(l:old_name)
|
||||
let l:col = searchpos('\\\k', 'bcnW')[1] + strlen(l:new_name)
|
||||
if l:col < l:save_pos[2]
|
||||
let l:save_pos[2] = l:col
|
||||
endif
|
||||
endif
|
||||
|
||||
" Perform the change
|
||||
let l:line = getline(l:lnum)
|
||||
call setline(l:lnum,
|
||||
\ strpart(l:line, 0, l:cnum)
|
||||
\ . l:new_name
|
||||
\ . strpart(l:line, l:cnum + strlen(l:old_name) - 1))
|
||||
|
||||
" Restore cursor position
|
||||
cal vimtex#pos#set_cursor(l:save_pos)
|
||||
endfunction
|
||||
|
||||
function! vimtex#cmd#delete(...) abort " {{{1
|
||||
if a:0 > 0
|
||||
let l:cmd = call('vimtex#cmd#get_at', a:000)
|
||||
else
|
||||
let l:cmd = vimtex#cmd#get_current()
|
||||
endif
|
||||
if empty(l:cmd) | return | endif
|
||||
|
||||
" Save current position
|
||||
let l:save_pos = vimtex#pos#get_cursor()
|
||||
let l:lnum_cur = l:save_pos[1]
|
||||
let l:cnum_cur = l:save_pos[2]
|
||||
|
||||
" Remove closing bracket (if exactly one argument)
|
||||
if len(l:cmd.args) == 1
|
||||
let l:lnum = l:cmd.args[0].close.lnum
|
||||
let l:cnum = l:cmd.args[0].close.cnum
|
||||
let l:line = getline(l:lnum)
|
||||
call setline(l:lnum,
|
||||
\ strpart(l:line, 0, l:cnum - 1)
|
||||
\ . strpart(l:line, l:cnum))
|
||||
|
||||
let l:cnum2 = l:cmd.args[0].open.cnum
|
||||
endif
|
||||
|
||||
" Remove command (and possibly the opening bracket)
|
||||
let l:lnum = l:cmd.pos_start.lnum
|
||||
let l:cnum = l:cmd.pos_start.cnum
|
||||
let l:cnum2 = get(l:, 'cnum2', l:cnum + strlen(l:cmd.name) - 1)
|
||||
let l:line = getline(l:lnum)
|
||||
call setline(l:lnum,
|
||||
\ strpart(l:line, 0, l:cnum - 1)
|
||||
\ . strpart(l:line, l:cnum2))
|
||||
|
||||
" Restore appropriate cursor position
|
||||
if l:lnum_cur == l:lnum
|
||||
if l:cnum_cur > l:cnum2
|
||||
let l:save_pos[2] -= l:cnum2 - l:cnum + 1
|
||||
else
|
||||
let l:save_pos[2] -= l:cnum_cur - l:cnum
|
||||
endif
|
||||
endif
|
||||
cal vimtex#pos#set_cursor(l:save_pos)
|
||||
endfunction
|
||||
|
||||
function! vimtex#cmd#delete_all(...) abort " {{{1
|
||||
if a:0 > 0
|
||||
let l:cmd = call('vimtex#cmd#get_at', a:000)
|
||||
else
|
||||
let l:cmd = vimtex#cmd#get_current()
|
||||
endif
|
||||
if empty(l:cmd) | return | endif
|
||||
|
||||
call vimtex#pos#set_cursor(l:cmd.pos_start)
|
||||
normal! v
|
||||
call vimtex#pos#set_cursor(l:cmd.pos_end)
|
||||
normal! d
|
||||
endfunction
|
||||
|
||||
function! vimtex#cmd#create_insert() abort " {{{1
|
||||
if mode() !=# 'i' | return | endif
|
||||
|
||||
let l:re = '\v%(^|\A)\zs\a+\ze%(\A|$)'
|
||||
let l:c0 = col('.') - 1
|
||||
|
||||
let [l:l1, l:c1] = searchpos(l:re, 'bcn', line('.'))
|
||||
let l:c1 -= 1
|
||||
let l:line = getline(l:l1)
|
||||
let l:match = matchstr(l:line, l:re, l:c1)
|
||||
let l:c2 = l:c1 + strlen(l:match)
|
||||
|
||||
if l:c0 > l:c2
|
||||
call vimtex#log#warning('Could not create command')
|
||||
return ''
|
||||
endif
|
||||
|
||||
let l:strpart1 = strpart(l:line, 0, l:c1)
|
||||
let l:strpart2 = '\' . strpart(l:match, 0, l:c0 - l:c1) . '{'
|
||||
let l:strpart3 = strpart(l:line, l:c0)
|
||||
call setline(l:l1, l:strpart1 . l:strpart2 . l:strpart3)
|
||||
|
||||
call vimtex#pos#set_cursor(l:l1, l:c2+3)
|
||||
return ''
|
||||
endfunction
|
||||
|
||||
" }}}1
|
||||
function! vimtex#cmd#create(cmd, visualmode) abort " {{{1
|
||||
if empty(a:cmd) | return | endif
|
||||
|
||||
" Avoid autoindent (disable indentkeys)
|
||||
let l:save_indentkeys = &l:indentkeys
|
||||
setlocal indentkeys=
|
||||
|
||||
if a:visualmode
|
||||
let l:pos_start = getpos("'<")
|
||||
let l:pos_end = getpos("'>")
|
||||
|
||||
if visualmode() ==# ''
|
||||
normal! gvA}
|
||||
execute 'normal! gvI\' . a:cmd . '{'
|
||||
|
||||
let l:pos_end[2] += strlen(a:cmd) + 3
|
||||
else
|
||||
normal! `>a}
|
||||
normal! `<
|
||||
execute 'normal! i\' . a:cmd . '{'
|
||||
|
||||
let l:pos_end[2] +=
|
||||
\ l:pos_end[1] == l:pos_start[1] ? strlen(a:cmd) + 3 : 1
|
||||
endif
|
||||
|
||||
call vimtex#pos#set_cursor(l:pos_end)
|
||||
else
|
||||
let l:pos = vimtex#pos#get_cursor()
|
||||
let l:save_reg = getreg('"')
|
||||
let l:pos[2] += strlen(a:cmd) + 2
|
||||
execute 'normal! ciw\' . a:cmd . '{"}'
|
||||
call setreg('"', l:save_reg)
|
||||
call vimtex#pos#set_cursor(l:pos)
|
||||
endif
|
||||
|
||||
" Restore indentkeys setting
|
||||
let &l:indentkeys = l:save_indentkeys
|
||||
endfunction
|
||||
|
||||
" }}}1
|
||||
function! vimtex#cmd#create_visual() abort " {{{1
|
||||
let l:cmd = vimtex#echo#input({
|
||||
\ 'info' :
|
||||
\ ['Create command: ', ['VimtexWarning', '(empty to cancel)']],
|
||||
\})
|
||||
let l:cmd = substitute(l:cmd, '^\\', '', '')
|
||||
call vimtex#cmd#create(l:cmd, 1)
|
||||
endfunction
|
||||
|
||||
" }}}1
|
||||
function! vimtex#cmd#toggle_star() abort " {{{1
|
||||
let l:cmd = vimtex#cmd#get_current()
|
||||
if empty(l:cmd) | return | endif
|
||||
|
||||
let l:old_name = l:cmd.name
|
||||
let l:lnum = l:cmd.pos_start.lnum
|
||||
let l:cnum = l:cmd.pos_start.cnum
|
||||
|
||||
" Set new command name
|
||||
if match(l:old_name, '\*$') == -1
|
||||
let l:new_name = l:old_name.'*'
|
||||
else
|
||||
let l:new_name = strpart(l:old_name, 0, strlen(l:old_name)-1)
|
||||
endif
|
||||
let l:new_name = substitute(l:new_name, '^\\', '', '')
|
||||
if empty(l:new_name) | return | endif
|
||||
|
||||
" Update current position
|
||||
let l:save_pos = vimtex#pos#get_cursor()
|
||||
let l:save_pos[2] += strlen(l:new_name) - strlen(l:old_name) + 1
|
||||
|
||||
" Perform the change
|
||||
let l:line = getline(l:lnum)
|
||||
call setline(l:lnum,
|
||||
\ strpart(l:line, 0, l:cnum)
|
||||
\ . l:new_name
|
||||
\ . strpart(l:line, l:cnum + strlen(l:old_name) - 1))
|
||||
|
||||
" Restore cursor position
|
||||
cal vimtex#pos#set_cursor(l:save_pos)
|
||||
endfunction
|
||||
|
||||
" }}}1
|
||||
function! vimtex#cmd#toggle_frac() abort " {{{1
|
||||
let l:frac = s:get_frac_cmd()
|
||||
if empty(l:frac)
|
||||
let l:frac = s:get_frac_inline()
|
||||
endif
|
||||
if empty(l:frac) | return | endif
|
||||
|
||||
let l:lnum = line('.')
|
||||
let l:line = getline(l:lnum)
|
||||
call setline(l:lnum,
|
||||
\ strpart(l:line, 0, l:frac.col_start)
|
||||
\ . l:frac.text_toggled
|
||||
\ . strpart(l:line, l:frac.col_end+1))
|
||||
endfunction
|
||||
|
||||
" }}}1
|
||||
function! vimtex#cmd#toggle_frac_visual() abort " {{{1
|
||||
let l:save_reg = getreg('a')
|
||||
normal! gv"ay
|
||||
let l:selected = substitute(getreg('a'), '\n\s*', ' ', '')
|
||||
call setreg('a', l:save_reg)
|
||||
|
||||
let l:frac = s:get_frac_inline_visual(l:selected)
|
||||
if empty(l:frac)
|
||||
let l:frac = s:get_frac_cmd_visual(l:selected)
|
||||
endif
|
||||
|
||||
if empty(l:frac) | return | endif
|
||||
|
||||
let l:save_reg = getreg('a')
|
||||
call setreg('a', l:frac.text_toggled)
|
||||
normal! gv"ap
|
||||
call setreg('a', l:save_reg)
|
||||
endfunction
|
||||
|
||||
" }}}1
|
||||
|
||||
function! s:get_frac_cmd() abort " {{{1
|
||||
let l:save_pos = vimtex#pos#get_cursor()
|
||||
while 1
|
||||
let l:cmd = s:get_cmd('prev')
|
||||
if empty(l:cmd) || l:cmd.pos_start.lnum < line('.')
|
||||
call vimtex#pos#set_cursor(l:save_pos)
|
||||
return {}
|
||||
endif
|
||||
|
||||
if l:cmd.name ==# '\frac'
|
||||
break
|
||||
endif
|
||||
|
||||
call vimtex#pos#set_cursor(vimtex#pos#prev(l:cmd.pos_start))
|
||||
endwhile
|
||||
call vimtex#pos#set_cursor(l:save_pos)
|
||||
|
||||
let l:frac = {
|
||||
\ 'type': 'cmd',
|
||||
\ 'col_start': l:cmd.pos_start.cnum - 1,
|
||||
\ 'col_end': l:cmd.pos_end.cnum - 1,
|
||||
\}
|
||||
|
||||
if len(l:cmd.args) >= 2
|
||||
let l:consume = []
|
||||
let l:frac.denominator = l:cmd.args[0].text
|
||||
let l:frac.numerator = l:cmd.args[1].text
|
||||
elseif len(l:cmd.args) == 1
|
||||
let l:consume = ['numerator']
|
||||
let l:frac.denominator = l:cmd.args[0].text
|
||||
let l:frac.numerator = ''
|
||||
else
|
||||
let l:consume = ['denominator', 'numerator']
|
||||
let l:frac.denominator = ''
|
||||
let l:frac.numerator = ''
|
||||
endif
|
||||
|
||||
" Handle unfinished cases
|
||||
let l:line = getline('.')
|
||||
let l:pos = l:frac.col_end + 1
|
||||
for l:key in l:consume
|
||||
let l:part = strpart(l:line, l:frac.col_end + 1)
|
||||
|
||||
let l:blurp = matchstr(l:part, '^\s*{[^}]*}')
|
||||
if !empty(l:blurp)
|
||||
let l:frac[l:key] = vimtex#util#trim(l:blurp)[1:-2]
|
||||
let l:frac.col_end += len(l:blurp)
|
||||
continue
|
||||
endif
|
||||
|
||||
let l:blurp = matchstr(l:part, '^\s*\w')
|
||||
if !empty(l:blurp)
|
||||
let l:frac[l:key] = vimtex#util#trim(l:blurp)
|
||||
let l:frac.col_end += len(l:blurp)
|
||||
endif
|
||||
endfor
|
||||
|
||||
" Abort if \frac region does not cover cursor
|
||||
if l:frac.col_end < col('.') | return {} | endif
|
||||
|
||||
let l:frac.text = strpart(getline('.'),
|
||||
\ l:frac.col_start, l:frac.col_end - l:frac.col_start + 1)
|
||||
|
||||
return s:get_frac_cmd_aux(l:frac)
|
||||
endfunction
|
||||
|
||||
" }}}1
|
||||
function! s:get_frac_cmd_visual(selected) abort " {{{1
|
||||
let l:matches = matchlist(a:selected, '^\s*\\frac\s*{\(.*\)}\s*{\(.*\)}\s*$')
|
||||
if empty(l:matches) | return {} | endif
|
||||
|
||||
let l:frac = {
|
||||
\ 'type': 'cmd',
|
||||
\ 'text': a:selected,
|
||||
\ 'denominator': l:matches[1],
|
||||
\ 'numerator': l:matches[2],
|
||||
\}
|
||||
|
||||
return s:get_frac_cmd_aux(l:frac)
|
||||
endfunction
|
||||
|
||||
" }}}1
|
||||
function! s:get_frac_cmd_aux(frac) abort " {{{1
|
||||
let l:denominator = (a:frac.denominator =~# '^\\\?\w*$')
|
||||
\ ? a:frac.denominator
|
||||
\ : '(' . a:frac.denominator . ')'
|
||||
|
||||
let l:numerator = (a:frac.numerator =~# '^\\\?\w*$')
|
||||
\ ? a:frac.numerator
|
||||
\ : '(' . a:frac.numerator . ')'
|
||||
|
||||
let a:frac.text_toggled = l:denominator . '/' . l:numerator
|
||||
|
||||
return a:frac
|
||||
endfunction
|
||||
|
||||
" }}}1
|
||||
function! s:get_frac_inline() abort " {{{1
|
||||
let l:line = getline('.')
|
||||
let l:col = col('.') - 1
|
||||
|
||||
let l:pos_after = -1
|
||||
let l:pos_before = -1
|
||||
while 1
|
||||
let l:pos_before = l:pos_after
|
||||
let l:pos_after = match(l:line, '\/', l:pos_after+1)
|
||||
if l:pos_after < 0 || l:pos_after >= l:col | break | endif
|
||||
endwhile
|
||||
|
||||
if l:pos_after == -1 && l:pos_before == -1
|
||||
return {}
|
||||
endif
|
||||
|
||||
let l:positions = []
|
||||
if l:pos_before > 0
|
||||
let l:positions += [l:pos_before]
|
||||
endif
|
||||
if l:pos_after > 0
|
||||
let l:positions += [l:pos_after]
|
||||
endif
|
||||
|
||||
for l:pos in l:positions
|
||||
let l:frac = {'type': 'inline'}
|
||||
|
||||
"
|
||||
" Parse numerator
|
||||
"
|
||||
let l:before = strpart(l:line, 0, l:pos)
|
||||
if l:before =~# ')\s*$'
|
||||
let l:pos_before = s:get_inline_limit(l:before, -1) - 1
|
||||
let l:parens = strpart(l:before, l:pos_before)
|
||||
else
|
||||
let l:pos_before = match(l:before, '\s*$')
|
||||
let l:parens = ''
|
||||
endif
|
||||
|
||||
let l:before = strpart(l:line, 0, l:pos_before)
|
||||
let l:atoms = matchstr(l:before, '\(\\(\)\?\zs[^-$(){} ]*$')
|
||||
let l:pos_before = l:pos_before - strlen(l:atoms)
|
||||
let l:frac.numerator = s:get_inline_trim(l:atoms . l:parens)
|
||||
let l:frac.col_start = l:pos_before
|
||||
|
||||
"
|
||||
" Parse denominator
|
||||
"
|
||||
let l:after = strpart(l:line, l:pos+1)
|
||||
let l:atoms = l:after =~# '^\s*[^$()} ]*\\)'
|
||||
\ ? matchstr(l:after, '^\s*[^$()} ]*\ze\\)')
|
||||
\ : matchstr(l:after, '^\s*[^$()} ]*')
|
||||
let l:pos_after = l:pos + strlen(l:atoms)
|
||||
let l:after = strpart(l:line, l:pos_after+1)
|
||||
if l:after =~# '^('
|
||||
let l:index = s:get_inline_limit(l:after, 1)
|
||||
let l:pos_after = l:pos_after + l:index + 1
|
||||
let l:parens = strpart(l:after, 0, l:index+1)
|
||||
else
|
||||
let l:parens = ''
|
||||
endif
|
||||
let l:frac.denominator = s:get_inline_trim(l:atoms . l:parens)
|
||||
let l:frac.col_end = l:pos_after
|
||||
|
||||
"
|
||||
" Combine/Parse inline and frac expressions
|
||||
"
|
||||
let l:frac.text = strpart(l:line,
|
||||
\ l:frac.col_start,
|
||||
\ l:frac.col_end - l:frac.col_start + 1)
|
||||
let l:frac.text_toggled = printf('\frac{%s}{%s}',
|
||||
\ l:frac.numerator, l:frac.denominator)
|
||||
|
||||
"
|
||||
" Accept result if the range contains the cursor column
|
||||
"
|
||||
if l:col >= l:frac.col_start && l:col <= l:frac.col_end
|
||||
return l:frac
|
||||
endif
|
||||
endfor
|
||||
|
||||
return {}
|
||||
endfunction
|
||||
|
||||
" }}}1
|
||||
function! s:get_frac_inline_visual(selected) abort " {{{1
|
||||
let l:parts = split(a:selected, '/')
|
||||
if len(l:parts) != 2 | return {} | endif
|
||||
|
||||
let l:frac = {
|
||||
\ 'type': 'inline',
|
||||
\ 'text': a:selected,
|
||||
\ 'numerator': s:get_inline_trim(l:parts[0]),
|
||||
\ 'denominator': s:get_inline_trim(l:parts[1]),
|
||||
\}
|
||||
|
||||
let l:frac.text_toggled = printf('\frac{%s}{%s}',
|
||||
\ l:frac.numerator, l:frac.denominator)
|
||||
|
||||
return l:frac
|
||||
endfunction
|
||||
|
||||
" }}}1
|
||||
function! s:get_inline_limit(str, dir) abort " {{{1
|
||||
if a:dir > 0
|
||||
let l:open = '('
|
||||
let l:string = a:str
|
||||
else
|
||||
let l:open = ')'
|
||||
let l:string = join(reverse(split(a:str, '\zs')), '')
|
||||
endif
|
||||
|
||||
let idx = -1
|
||||
let depth = 0
|
||||
|
||||
while idx < len(l:string)
|
||||
let idx = match(l:string, '[()]', idx + 1)
|
||||
if idx < 0
|
||||
let idx = len(l:string)
|
||||
endif
|
||||
if idx >= len(l:string) || l:string[idx] ==# l:open
|
||||
let depth += 1
|
||||
else
|
||||
let depth -= 1
|
||||
if depth == 0
|
||||
return a:dir < 0 ? len(a:str) - idx : idx
|
||||
endif
|
||||
endif
|
||||
endwhile
|
||||
|
||||
return -1
|
||||
endfunction
|
||||
|
||||
" }}}1
|
||||
function! s:get_inline_trim(str) abort " {{{1
|
||||
let l:str = vimtex#util#trim(a:str)
|
||||
return substitute(l:str, '^(\(.*\))$', '\1', '')
|
||||
endfunction
|
||||
|
||||
" }}}1
|
||||
|
||||
function! vimtex#cmd#get_next() abort " {{{1
|
||||
return s:get_cmd('next')
|
||||
endfunction
|
||||
|
||||
" }}}1
|
||||
function! vimtex#cmd#get_prev() abort " {{{1
|
||||
return s:get_cmd('prev')
|
||||
endfunction
|
||||
|
||||
" }}}1
|
||||
function! vimtex#cmd#get_current() abort " {{{1
|
||||
let l:save_pos = vimtex#pos#get_cursor()
|
||||
let l:pos_val_cursor = vimtex#pos#val(l:save_pos)
|
||||
|
||||
let l:depth = 3
|
||||
while l:depth > 0
|
||||
let l:depth -= 1
|
||||
let l:cmd = s:get_cmd('prev')
|
||||
if empty(l:cmd) | break | endif
|
||||
|
||||
let l:pos_val = vimtex#pos#val(l:cmd.pos_end)
|
||||
if l:pos_val >= l:pos_val_cursor
|
||||
call vimtex#pos#set_cursor(l:save_pos)
|
||||
return l:cmd
|
||||
else
|
||||
call vimtex#pos#set_cursor(vimtex#pos#prev(l:cmd.pos_start))
|
||||
endif
|
||||
endwhile
|
||||
|
||||
call vimtex#pos#set_cursor(l:save_pos)
|
||||
|
||||
return {}
|
||||
endfunction
|
||||
|
||||
" }}}1
|
||||
function! vimtex#cmd#get_at(...) abort " {{{1
|
||||
let l:pos_saved = vimtex#pos#get_cursor()
|
||||
call call('vimtex#pos#set_cursor', a:000)
|
||||
let l:cmd = vimtex#cmd#get_current()
|
||||
call vimtex#pos#set_cursor(l:pos_saved)
|
||||
return l:cmd
|
||||
endfunction
|
||||
|
||||
" }}}1
|
||||
|
||||
function! s:operator_setup(operator) abort " {{{1
|
||||
let s:operator = a:operator
|
||||
let &opfunc = s:snr() . 'operator_function'
|
||||
|
||||
" Ask for user input if necessary/relevant
|
||||
if s:operator ==# 'change'
|
||||
let l:current = vimtex#cmd#get_current()
|
||||
if empty(l:current) | return | endif
|
||||
|
||||
let s:operator_cmd_name = substitute(vimtex#echo#input({
|
||||
\ 'info' : ['Change command: ', ['VimtexWarning', l:current.name]],
|
||||
\}), '^\\', '', '')
|
||||
elseif s:operator ==# 'create'
|
||||
let s:operator_cmd_name = substitute(vimtex#echo#input({
|
||||
\ 'info' : ['Create command: ', ['VimtexWarning', '(empty to cancel)']],
|
||||
\}), '^\\', '', '')
|
||||
endif
|
||||
endfunction
|
||||
|
||||
" }}}1
|
||||
function! s:operator_function(_) abort " {{{1
|
||||
let l:name = get(s:, 'operator_cmd_name', '')
|
||||
|
||||
execute 'call vimtex#cmd#' . {
|
||||
\ 'change': 'change(l:name)',
|
||||
\ 'create': 'create(l:name, 0)',
|
||||
\ 'delete': 'delete()',
|
||||
\ 'toggle_star': 'toggle_star()',
|
||||
\ 'toggle_frac': 'toggle_frac()',
|
||||
\ }[s:operator]
|
||||
endfunction
|
||||
|
||||
" }}}1
|
||||
function! s:snr() abort " {{{1
|
||||
return matchstr(expand('<sfile>'), '<SNR>\d\+_')
|
||||
endfunction
|
||||
|
||||
" }}}1
|
||||
|
||||
function! s:get_cmd(direction) abort " {{{1
|
||||
let [lnum, cnum, match] = s:get_cmd_name(a:direction ==# 'next')
|
||||
if lnum == 0 | return {} | endif
|
||||
|
||||
let res = {
|
||||
\ 'name' : match,
|
||||
\ 'text' : '',
|
||||
\ 'pos_start' : { 'lnum' : lnum, 'cnum' : cnum },
|
||||
\ 'pos_end' : { 'lnum' : lnum, 'cnum' : cnum + strlen(match) - 1 },
|
||||
\ 'args' : [],
|
||||
\}
|
||||
|
||||
" Environments always start with environment name and allows option
|
||||
" afterwords
|
||||
if res.name ==# '\begin'
|
||||
let arg = s:get_cmd_part('{', res.pos_end)
|
||||
if empty(arg) | return res | endif
|
||||
|
||||
call add(res.args, arg)
|
||||
let res.pos_end.lnum = arg.close.lnum
|
||||
let res.pos_end.cnum = arg.close.cnum
|
||||
endif
|
||||
|
||||
" Get overlay specification
|
||||
let res.overlay = s:get_cmd_overlay(res.pos_end.lnum, res.pos_end.cnum)
|
||||
if !empty(res.overlay)
|
||||
let res.pos_end.lnum = res.overlay.close.lnum
|
||||
let res.pos_end.cnum = res.overlay.close.cnum
|
||||
endif
|
||||
|
||||
" Get options
|
||||
let res.opt = s:get_cmd_part('[', res.pos_end)
|
||||
if !empty(res.opt)
|
||||
let res.pos_end.lnum = res.opt.close.lnum
|
||||
let res.pos_end.cnum = res.opt.close.cnum
|
||||
endif
|
||||
|
||||
" Get arguments
|
||||
let arg = s:get_cmd_part('{', res.pos_end)
|
||||
while !empty(arg)
|
||||
call add(res.args, arg)
|
||||
let res.pos_end.lnum = arg.close.lnum
|
||||
let res.pos_end.cnum = arg.close.cnum
|
||||
let arg = s:get_cmd_part('{', res.pos_end)
|
||||
endwhile
|
||||
|
||||
" Include entire cmd text
|
||||
let res.text = s:text_between(res.pos_start, res.pos_end, 1)
|
||||
|
||||
return res
|
||||
endfunction
|
||||
|
||||
" }}}1
|
||||
function! s:get_cmd_name(next) abort " {{{1
|
||||
let [l:lnum, l:cnum] = searchpos('\v\\\a+\*?', a:next ? 'nW' : 'cbnW')
|
||||
let l:match = matchstr(getline(l:lnum), '^\v\\\a*\*?', l:cnum-1)
|
||||
return [l:lnum, l:cnum, l:match]
|
||||
endfunction
|
||||
|
||||
" }}}1
|
||||
function! s:get_cmd_part(part, start_pos) abort " {{{1
|
||||
let l:save_pos = vimtex#pos#get_cursor()
|
||||
call vimtex#pos#set_cursor(a:start_pos)
|
||||
let l:open = vimtex#delim#get_next('delim_tex', 'open')
|
||||
call vimtex#pos#set_cursor(l:save_pos)
|
||||
|
||||
"
|
||||
" Ensure that the delimiter
|
||||
" 1) exists,
|
||||
" 2) is of the right type,
|
||||
" 3) and is the next non-whitespace character.
|
||||
"
|
||||
if empty(l:open)
|
||||
\ || l:open.match !=# a:part
|
||||
\ || strlen(substitute(
|
||||
\ s:text_between(a:start_pos, l:open), '\_s', '', 'g')) != 0
|
||||
return {}
|
||||
endif
|
||||
|
||||
let l:close = vimtex#delim#get_matching(l:open)
|
||||
if empty(l:close)
|
||||
return {}
|
||||
endif
|
||||
|
||||
return {
|
||||
\ 'open' : l:open,
|
||||
\ 'close' : l:close,
|
||||
\ 'text' : s:text_between(l:open, l:close),
|
||||
\}
|
||||
endfunction
|
||||
|
||||
" }}}1
|
||||
function! s:get_cmd_overlay(lnum, cnum) abort " {{{1
|
||||
let l:match = matchstr(getline(a:lnum), '^\s*[^>]*>', a:cnum)
|
||||
|
||||
return empty(l:match)
|
||||
\ ? {}
|
||||
\ : {
|
||||
\ 'open' : {'lnum' : a:lnum, 'cnum' : a:cnum + 1},
|
||||
\ 'close' : {'lnum' : a:lnum, 'cnum' : a:cnum + strlen(l:match)},
|
||||
\ 'text' : l:match
|
||||
\ }
|
||||
endfunction
|
||||
|
||||
" }}}1
|
||||
|
||||
function! s:text_between(p1, p2, ...) abort " {{{1
|
||||
let [l1, c1] = [a:p1.lnum, a:p1.cnum - (a:0 > 0)]
|
||||
let [l2, c2] = [a:p2.lnum, a:p2.cnum - (a:0 <= 0)]
|
||||
|
||||
let lines = getline(l1, l2)
|
||||
if !empty(lines)
|
||||
let lines[0] = strpart(lines[0], c1)
|
||||
let lines[-1] = strpart(lines[-1], 0,
|
||||
\ l1 == l2 ? c2 - c1 : c2)
|
||||
endif
|
||||
return join(lines, "\n")
|
||||
endfunction
|
||||
|
||||
" }}}1
|
||||
|
||||
endif
|
||||
334
autoload/vimtex/compiler.vim
Normal file
334
autoload/vimtex/compiler.vim
Normal file
@@ -0,0 +1,334 @@
|
||||
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'latex') == -1
|
||||
|
||||
" vimtex - LaTeX plugin for Vim
|
||||
"
|
||||
" Maintainer: Karl Yngve Lervåg
|
||||
" Email: karl.yngve@gmail.com
|
||||
"
|
||||
|
||||
function! vimtex#compiler#init_buffer() abort " {{{1
|
||||
if !g:vimtex_compiler_enabled | return | endif
|
||||
|
||||
" Define commands
|
||||
command! -buffer VimtexCompile call vimtex#compiler#compile()
|
||||
command! -buffer -bang VimtexCompileSS call vimtex#compiler#compile_ss()
|
||||
command! -buffer -range VimtexCompileSelected <line1>,<line2>call vimtex#compiler#compile_selected('cmd')
|
||||
command! -buffer VimtexCompileOutput call vimtex#compiler#output()
|
||||
command! -buffer VimtexStop call vimtex#compiler#stop()
|
||||
command! -buffer VimtexStopAll call vimtex#compiler#stop_all()
|
||||
command! -buffer -bang VimtexClean call vimtex#compiler#clean(<q-bang> == "!")
|
||||
command! -buffer -bang VimtexStatus call vimtex#compiler#status(<q-bang> == "!")
|
||||
|
||||
" Define mappings
|
||||
nnoremap <buffer> <plug>(vimtex-compile) :call vimtex#compiler#compile()<cr>
|
||||
nnoremap <buffer> <plug>(vimtex-compile-ss) :call vimtex#compiler#compile_ss()<cr>
|
||||
nnoremap <buffer> <plug>(vimtex-compile-selected) :set opfunc=vimtex#compiler#compile_selected<cr>g@
|
||||
xnoremap <buffer> <plug>(vimtex-compile-selected) :<c-u>call vimtex#compiler#compile_selected('visual')<cr>
|
||||
nnoremap <buffer> <plug>(vimtex-compile-output) :call vimtex#compiler#output()<cr>
|
||||
nnoremap <buffer> <plug>(vimtex-stop) :call vimtex#compiler#stop()<cr>
|
||||
nnoremap <buffer> <plug>(vimtex-stop-all) :call vimtex#compiler#stop_all()<cr>
|
||||
nnoremap <buffer> <plug>(vimtex-clean) :call vimtex#compiler#clean(0)<cr>
|
||||
nnoremap <buffer> <plug>(vimtex-clean-full) :call vimtex#compiler#clean(1)<cr>
|
||||
nnoremap <buffer> <plug>(vimtex-status) :call vimtex#compiler#status(0)<cr>
|
||||
nnoremap <buffer> <plug>(vimtex-status-all) :call vimtex#compiler#status(1)<cr>
|
||||
endfunction
|
||||
|
||||
" }}}1
|
||||
function! vimtex#compiler#init_state(state) abort " {{{1
|
||||
if !g:vimtex_compiler_enabled | return | endif
|
||||
|
||||
try
|
||||
let l:options = {
|
||||
\ 'root': a:state.root,
|
||||
\ 'target' : a:state.base,
|
||||
\ 'target_path' : a:state.tex,
|
||||
\ 'tex_program' : a:state.tex_program,
|
||||
\}
|
||||
let a:state.compiler
|
||||
\ = vimtex#compiler#{g:vimtex_compiler_method}#init(l:options)
|
||||
catch /vimtex: Requirements not met/
|
||||
call vimtex#log#error('Compiler was not initialized!')
|
||||
catch /E117/
|
||||
call vimtex#log#error(
|
||||
\ 'Invalid compiler: ' . g:vimtex_compiler_method,
|
||||
\ 'Please see :h g:vimtex_compiler_method')
|
||||
endtry
|
||||
endfunction
|
||||
|
||||
" }}}1
|
||||
|
||||
function! vimtex#compiler#callback(status) abort " {{{1
|
||||
if exists('b:vimtex') && get(b:vimtex.compiler, 'silence_next_callback')
|
||||
let b:vimtex.compiler.silence_next_callback = 0
|
||||
return
|
||||
endif
|
||||
|
||||
call vimtex#qf#open(0)
|
||||
redraw
|
||||
|
||||
if exists('s:output')
|
||||
call s:output.update()
|
||||
endif
|
||||
|
||||
if a:status
|
||||
call vimtex#log#info('Compilation completed')
|
||||
else
|
||||
call vimtex#log#warning('Compilation failed!')
|
||||
endif
|
||||
|
||||
if a:status && exists('b:vimtex')
|
||||
call b:vimtex.parse_packages()
|
||||
call vimtex#syntax#load#packages()
|
||||
endif
|
||||
|
||||
for l:hook in g:vimtex_compiler_callback_hooks
|
||||
if exists('*' . l:hook)
|
||||
execute 'call' l:hook . '(' . a:status . ')'
|
||||
endif
|
||||
endfor
|
||||
|
||||
return ''
|
||||
endfunction
|
||||
|
||||
" }}}1
|
||||
|
||||
function! vimtex#compiler#compile() abort " {{{1
|
||||
if get(b:vimtex.compiler, 'continuous')
|
||||
if b:vimtex.compiler.is_running()
|
||||
call vimtex#compiler#stop()
|
||||
else
|
||||
call b:vimtex.compiler.start()
|
||||
let b:vimtex.compiler.check_timer = s:check_if_running_start()
|
||||
endif
|
||||
else
|
||||
call b:vimtex.compiler.start_single()
|
||||
endif
|
||||
endfunction
|
||||
|
||||
" }}}1
|
||||
function! vimtex#compiler#compile_ss() abort " {{{1
|
||||
call b:vimtex.compiler.start_single()
|
||||
endfunction
|
||||
|
||||
" }}}1
|
||||
function! vimtex#compiler#compile_selected(type) abort range " {{{1
|
||||
let l:file = vimtex#parser#selection_to_texfile(a:type)
|
||||
if empty(l:file) | return | endif
|
||||
|
||||
" Create and initialize temporary compiler
|
||||
let l:options = {
|
||||
\ 'root' : l:file.root,
|
||||
\ 'target' : l:file.base,
|
||||
\ 'target_path' : l:file.tex,
|
||||
\ 'backend' : 'process',
|
||||
\ 'tex_program' : b:vimtex.tex_program,
|
||||
\ 'background' : 1,
|
||||
\ 'continuous' : 0,
|
||||
\ 'callback' : 0,
|
||||
\}
|
||||
let l:compiler = vimtex#compiler#{g:vimtex_compiler_method}#init(l:options)
|
||||
|
||||
call vimtex#log#toggle_verbose()
|
||||
call l:compiler.start()
|
||||
|
||||
" Check if successful
|
||||
if vimtex#qf#inquire(l:file.base)
|
||||
call vimtex#log#toggle_verbose()
|
||||
call vimtex#log#warning('Compiling selected lines ... failed!')
|
||||
botright cwindow
|
||||
return
|
||||
else
|
||||
call l:compiler.clean(0)
|
||||
call b:vimtex.viewer.view(l:file.pdf)
|
||||
call vimtex#log#toggle_verbose()
|
||||
call vimtex#log#info('Compiling selected lines ... done')
|
||||
endif
|
||||
endfunction
|
||||
|
||||
" }}}1
|
||||
function! vimtex#compiler#output() abort " {{{1
|
||||
let l:file = get(b:vimtex.compiler, 'output', '')
|
||||
if empty(l:file)
|
||||
call vimtex#log#warning('No output exists!')
|
||||
return
|
||||
endif
|
||||
|
||||
" If window already open, then go there
|
||||
if exists('s:output')
|
||||
if bufwinnr(l:file) == s:output.winnr
|
||||
execute s:output.winnr . 'wincmd w'
|
||||
return
|
||||
else
|
||||
call s:output.destroy()
|
||||
endif
|
||||
endif
|
||||
|
||||
" Create new output window
|
||||
silent execute 'split' l:file
|
||||
|
||||
" Create the output object
|
||||
let s:output = {}
|
||||
let s:output.name = l:file
|
||||
let s:output.bufnr = bufnr('%')
|
||||
let s:output.winnr = bufwinnr('%')
|
||||
function! s:output.update() dict abort
|
||||
if bufwinnr(self.name) != self.winnr
|
||||
return
|
||||
endif
|
||||
|
||||
if mode() ==? 'v' || mode() ==# "\<c-v>"
|
||||
return
|
||||
endif
|
||||
|
||||
" Go to last line of file if it is not the current window
|
||||
if bufwinnr('%') != self.winnr
|
||||
let l:return = bufwinnr('%')
|
||||
execute 'keepalt' self.winnr . 'wincmd w'
|
||||
edit
|
||||
normal! Gzb
|
||||
execute 'keepalt' l:return . 'wincmd w'
|
||||
redraw
|
||||
endif
|
||||
endfunction
|
||||
function! s:output.destroy() dict abort
|
||||
autocmd! vimtex_output_window
|
||||
augroup! vimtex_output_window
|
||||
unlet s:output
|
||||
endfunction
|
||||
|
||||
" Better automatic update
|
||||
augroup vimtex_output_window
|
||||
autocmd!
|
||||
autocmd BufDelete <buffer> call s:output.destroy()
|
||||
autocmd BufEnter * call s:output.update()
|
||||
autocmd FocusGained * call s:output.update()
|
||||
autocmd CursorHold * call s:output.update()
|
||||
autocmd CursorHoldI * call s:output.update()
|
||||
autocmd CursorMoved * call s:output.update()
|
||||
autocmd CursorMovedI * call s:output.update()
|
||||
augroup END
|
||||
|
||||
" Set some mappings
|
||||
nnoremap <silent><nowait><buffer> q :bwipeout<cr>
|
||||
if has('nvim') || has('gui_running')
|
||||
nnoremap <silent><nowait><buffer> <esc> :bwipeout<cr>
|
||||
endif
|
||||
|
||||
" Set some buffer options
|
||||
setlocal autoread
|
||||
setlocal nomodifiable
|
||||
setlocal bufhidden=wipe
|
||||
endfunction
|
||||
|
||||
" }}}1
|
||||
function! vimtex#compiler#stop() abort " {{{1
|
||||
call b:vimtex.compiler.stop()
|
||||
silent! call timer_stop(b:vimtex.compiler.check_timer)
|
||||
endfunction
|
||||
|
||||
" }}}1
|
||||
function! vimtex#compiler#stop_all() abort " {{{1
|
||||
for l:state in vimtex#state#list_all()
|
||||
if exists('l:state.compiler.is_running')
|
||||
\ && l:state.compiler.is_running()
|
||||
call l:state.compiler.stop()
|
||||
endif
|
||||
endfor
|
||||
endfunction
|
||||
|
||||
" }}}1
|
||||
function! vimtex#compiler#clean(full) abort " {{{1
|
||||
call b:vimtex.compiler.clean(a:full)
|
||||
|
||||
if empty(b:vimtex.compiler.build_dir) | return | endif
|
||||
sleep 100m
|
||||
|
||||
" Remove auxilliary output directories if they are empty
|
||||
let l:build_dir = (vimtex#paths#is_abs(b:vimtex.compiler.build_dir)
|
||||
\ ? '' : b:vimtex.root . '/')
|
||||
\ . b:vimtex.compiler.build_dir
|
||||
let l:tree = glob(l:build_dir . '/**/*', 0, 1)
|
||||
let l:files = filter(copy(l:tree), 'filereadable(v:val)')
|
||||
if !empty(l:files) | return | endif
|
||||
|
||||
for l:dir in sort(l:tree) + [l:build_dir]
|
||||
call delete(l:dir, 'd')
|
||||
endfor
|
||||
endfunction
|
||||
|
||||
" }}}1
|
||||
function! vimtex#compiler#status(detailed) abort " {{{1
|
||||
if a:detailed
|
||||
let l:running = []
|
||||
for l:data in vimtex#state#list_all()
|
||||
if l:data.compiler.is_running()
|
||||
let l:name = l:data.tex
|
||||
if len(l:name) >= winwidth('.') - 20
|
||||
let l:name = '...' . l:name[-winwidth('.')+23:]
|
||||
endif
|
||||
call add(l:running, printf('%-6s %s',
|
||||
\ string(l:data.compiler.get_pid()) . ':', l:name))
|
||||
endif
|
||||
endfor
|
||||
|
||||
if empty(l:running)
|
||||
call vimtex#log#warning('Compiler is not running!')
|
||||
else
|
||||
call vimtex#log#info('Compiler is running', l:running)
|
||||
endif
|
||||
else
|
||||
if b:vimtex.compiler.is_running()
|
||||
call vimtex#log#info('Compiler is running')
|
||||
else
|
||||
call vimtex#log#warning('Compiler is not running!')
|
||||
endif
|
||||
endif
|
||||
endfunction
|
||||
|
||||
" }}}1
|
||||
|
||||
|
||||
let s:check_timers = {}
|
||||
function! s:check_if_running_start() abort " {{{1
|
||||
if !exists('*timer_start') | return -1 | endif
|
||||
|
||||
let l:timer = timer_start(50, function('s:check_if_running'), {'repeat': 20})
|
||||
|
||||
let s:check_timers[l:timer] = {
|
||||
\ 'compiler' : b:vimtex.compiler,
|
||||
\ 'vimtex_id' : b:vimtex_id,
|
||||
\}
|
||||
|
||||
return l:timer
|
||||
endfunction
|
||||
|
||||
" }}}1
|
||||
function! s:check_if_running(timer) abort " {{{1
|
||||
if s:check_timers[a:timer].compiler.is_running() | return | endif
|
||||
|
||||
call timer_stop(a:timer)
|
||||
|
||||
if get(b:, 'vimtex_id', -1) == s:check_timers[a:timer].vimtex_id
|
||||
call vimtex#compiler#output()
|
||||
endif
|
||||
call vimtex#log#error('Compiler did not start successfully!')
|
||||
|
||||
unlet s:check_timers[a:timer].compiler.check_timer
|
||||
unlet s:check_timers[a:timer]
|
||||
endfunction
|
||||
|
||||
" }}}1
|
||||
|
||||
|
||||
" {{{1 Initialize module
|
||||
|
||||
if !g:vimtex_compiler_enabled | finish | endif
|
||||
|
||||
augroup vimtex_compiler
|
||||
autocmd!
|
||||
autocmd VimLeave * call vimtex#compiler#stop_all()
|
||||
augroup END
|
||||
|
||||
" }}}1
|
||||
|
||||
endif
|
||||
218
autoload/vimtex/compiler/arara.vim
Normal file
218
autoload/vimtex/compiler/arara.vim
Normal file
@@ -0,0 +1,218 @@
|
||||
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'latex') == -1
|
||||
|
||||
" vimtex - LaTeX plugin for Vim
|
||||
"
|
||||
" Maintainer: Karl Yngve Lervåg
|
||||
" Email: karl.yngve@gmail.com
|
||||
"
|
||||
|
||||
function! vimtex#compiler#arara#init(options) abort " {{{1
|
||||
let l:compiler = deepcopy(s:compiler)
|
||||
|
||||
call l:compiler.init(extend(a:options,
|
||||
\ get(g:, 'vimtex_compiler_arara', {}), 'keep'))
|
||||
|
||||
return l:compiler
|
||||
endfunction
|
||||
|
||||
" }}}1
|
||||
|
||||
let s:compiler = {
|
||||
\ 'name' : 'arara',
|
||||
\ 'backend' : has('nvim') ? 'nvim'
|
||||
\ : v:version >= 800 ? 'jobs' : 'process',
|
||||
\ 'root' : '',
|
||||
\ 'target' : '',
|
||||
\ 'target_path' : '',
|
||||
\ 'background' : 1,
|
||||
\ 'output' : tempname(),
|
||||
\ 'options' : ['--log'],
|
||||
\}
|
||||
|
||||
function! s:compiler.init(options) abort dict " {{{1
|
||||
call extend(self, a:options)
|
||||
|
||||
if !executable('arara')
|
||||
call vimtex#log#warning('arara is not executable!')
|
||||
throw 'vimtex: Requirements not met'
|
||||
endif
|
||||
|
||||
call extend(self, deepcopy(s:compiler_{self.backend}))
|
||||
|
||||
" Processes run with the new jobs api will not run in the foreground
|
||||
if self.backend !=# 'process'
|
||||
let self.background = 1
|
||||
endif
|
||||
endfunction
|
||||
|
||||
" }}}1
|
||||
|
||||
function! s:compiler.build_cmd() abort dict " {{{1
|
||||
let l:cmd = 'arara'
|
||||
|
||||
for l:opt in self.options
|
||||
let l:cmd .= ' ' . l:opt
|
||||
endfor
|
||||
|
||||
return l:cmd . ' ' . vimtex#util#shellescape(self.target)
|
||||
endfunction
|
||||
|
||||
" }}}1
|
||||
function! s:compiler.cleanup() abort dict " {{{1
|
||||
" Pass
|
||||
endfunction
|
||||
|
||||
" }}}1
|
||||
function! s:compiler.pprint_items() abort dict " {{{1
|
||||
let l:configuration = []
|
||||
|
||||
if self.backend ==# 'process'
|
||||
call add(l:configuration, ['background', self.background])
|
||||
endif
|
||||
|
||||
call add(l:configuration, ['arara options', self.options])
|
||||
|
||||
let l:list = []
|
||||
call add(l:list, ['backend', self.backend])
|
||||
if self.background
|
||||
call add(l:list, ['output', self.output])
|
||||
endif
|
||||
|
||||
if self.target_path !=# b:vimtex.tex
|
||||
call add(l:list, ['root', self.root])
|
||||
call add(l:list, ['target', self.target_path])
|
||||
endif
|
||||
|
||||
call add(l:list, ['configuration', l:configuration])
|
||||
|
||||
if has_key(self, 'process')
|
||||
call add(l:list, ['process', self.process])
|
||||
endif
|
||||
|
||||
if has_key(self, 'job')
|
||||
call add(l:list, ['cmd', self.cmd])
|
||||
endif
|
||||
|
||||
return l:list
|
||||
endfunction
|
||||
|
||||
" }}}1
|
||||
|
||||
function! s:compiler.clean(...) abort dict " {{{1
|
||||
call vimtex#log#warning('Clean not implemented for arara')
|
||||
endfunction
|
||||
|
||||
" }}}1
|
||||
function! s:compiler.start(...) abort dict " {{{1
|
||||
call self.exec()
|
||||
|
||||
if self.background
|
||||
call vimtex#log#info('Compiler started in background')
|
||||
else
|
||||
call vimtex#compiler#callback(!vimtex#qf#inquire(self.target))
|
||||
endif
|
||||
endfunction
|
||||
|
||||
" }}}1
|
||||
function! s:compiler.start_single() abort dict " {{{1
|
||||
call self.start()
|
||||
endfunction
|
||||
|
||||
" }}}1
|
||||
function! s:compiler.stop() abort dict " {{{1
|
||||
" Pass
|
||||
endfunction
|
||||
|
||||
" }}}1
|
||||
function! s:compiler.is_running() abort dict " {{{1
|
||||
return 0
|
||||
endfunction
|
||||
|
||||
" }}}1
|
||||
function! s:compiler.kill() abort dict " {{{1
|
||||
" Pass
|
||||
endfunction
|
||||
|
||||
" }}}1
|
||||
function! s:compiler.get_pid() abort dict " {{{1
|
||||
return 0
|
||||
endfunction
|
||||
|
||||
" }}}1
|
||||
|
||||
let s:compiler_process = {}
|
||||
function! s:compiler_process.exec() abort dict " {{{1
|
||||
let self.process = vimtex#process#new()
|
||||
let self.process.name = 'arara'
|
||||
let self.process.background = self.background
|
||||
let self.process.workdir = self.root
|
||||
let self.process.output = self.output
|
||||
let self.process.cmd = self.build_cmd()
|
||||
call self.process.run()
|
||||
endfunction
|
||||
|
||||
" }}}1
|
||||
|
||||
let s:compiler_jobs = {}
|
||||
function! s:compiler_jobs.exec() abort dict " {{{1
|
||||
let self.cmd = self.build_cmd()
|
||||
let l:cmd = has('win32')
|
||||
\ ? 'cmd /s /c "' . self.cmd . '"'
|
||||
\ : ['sh', '-c', self.cmd]
|
||||
let l:options = {
|
||||
\ 'out_io' : 'file',
|
||||
\ 'err_io' : 'file',
|
||||
\ 'out_name' : self.output,
|
||||
\ 'err_name' : self.output,
|
||||
\}
|
||||
|
||||
let s:cb_target = self.target_path !=# b:vimtex.tex ? self.target_path : ''
|
||||
let l:options.exit_cb = function('s:callback')
|
||||
|
||||
call vimtex#paths#pushd(self.root)
|
||||
let self.job = job_start(l:cmd, l:options)
|
||||
call vimtex#paths#popd()
|
||||
endfunction
|
||||
|
||||
" }}}1
|
||||
function! s:callback(ch, msg) abort " {{{1
|
||||
call vimtex#compiler#callback(!vimtex#qf#inquire(s:cb_target))
|
||||
endfunction
|
||||
|
||||
" }}}1
|
||||
|
||||
let s:compiler_nvim = {}
|
||||
function! s:compiler_nvim.exec() abort dict " {{{1
|
||||
let self.cmd = self.build_cmd()
|
||||
let l:cmd = has('win32')
|
||||
\ ? 'cmd /s /c "' . self.cmd . '"'
|
||||
\ : ['sh', '-c', self.cmd]
|
||||
|
||||
let l:shell = {
|
||||
\ 'on_stdout' : function('s:callback_nvim_output'),
|
||||
\ 'on_stderr' : function('s:callback_nvim_output'),
|
||||
\ 'on_exit' : function('s:callback_nvim_exit'),
|
||||
\ 'cwd' : self.root,
|
||||
\ 'target' : self.target_path,
|
||||
\ 'output' : self.output,
|
||||
\}
|
||||
|
||||
let self.job = jobstart(l:cmd, l:shell)
|
||||
endfunction
|
||||
|
||||
" }}}1
|
||||
function! s:callback_nvim_output(id, data, event) abort dict " {{{1
|
||||
if !empty(a:data)
|
||||
call writefile(filter(a:data, '!empty(v:val)'), self.output, 'a')
|
||||
endif
|
||||
endfunction
|
||||
|
||||
" }}}1
|
||||
function! s:callback_nvim_exit(id, data, event) abort dict " {{{1
|
||||
let l:target = self.target !=# b:vimtex.tex ? self.target : ''
|
||||
call vimtex#compiler#callback(!vimtex#qf#inquire(l:target))
|
||||
endfunction
|
||||
|
||||
" }}}1
|
||||
|
||||
endif
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user