mirror of
https://github.com/sheerun/vim-polyglot.git
synced 2025-11-08 11:33:52 -05:00
Compare commits
312 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
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 | ||
|
|
d527002849 | ||
|
|
15727e7eb0 | ||
|
|
6b169212f8 | ||
|
|
2edc785a5e | ||
|
|
445e026010 | ||
|
|
fca45b2c2b | ||
|
|
ebf9ec9d62 | ||
|
|
9caa678708 | ||
|
|
8f2a71643a | ||
|
|
af763ef221 | ||
|
|
5ded0682bd | ||
|
|
26c678b08d | ||
|
|
17ecfbdabc | ||
|
|
0217fb50fe | ||
|
|
5023da62ec | ||
|
|
957228cc25 | ||
|
|
7aae831309 | ||
|
|
671078ef6c | ||
|
|
aebef2c2e7 | ||
|
|
e8245dbf17 | ||
|
|
9fd5c11a20 | ||
|
|
679ccf0303 | ||
|
|
eacf785f5a | ||
|
|
83bd298476 | ||
|
|
415261dd1f | ||
|
|
4d18a5e5dd | ||
|
|
a55b6aa3aa | ||
|
|
1d45a6d4f0 | ||
|
|
420a65e9b0 | ||
|
|
2254b83675 | ||
|
|
12755e3583 | ||
|
|
cbad6b1e0a | ||
|
|
fabb550c17 | ||
|
|
9d9ed14485 | ||
|
|
5005f1e27a | ||
|
|
571f76e6b6 | ||
|
|
e4f906d9a5 | ||
|
|
8b3a563bd0 | ||
|
|
0475f2b8d1 | ||
|
|
1d9a032a66 | ||
|
|
86721731c7 | ||
|
|
6f7257ade2 | ||
|
|
25ed6ff970 | ||
|
|
521220f389 | ||
|
|
b4cb58661e | ||
|
|
ebf81f7369 | ||
|
|
b69fbad1af | ||
|
|
fc272a0aa2 | ||
|
|
65f090faef | ||
|
|
58f9b8cd02 | ||
|
|
1ba88cc7d8 | ||
|
|
ca2fbfe038 | ||
|
|
b06535a1c6 | ||
|
|
2c59360e01 | ||
|
|
4f0bde6d67 | ||
|
|
833b2fadd5 | ||
|
|
efa1a55dc7 | ||
|
|
63922a1d1e | ||
|
|
0cd0b7f894 | ||
|
|
ec5884b1d0 | ||
|
|
92f779dc77 | ||
|
|
9d887c4b38 | ||
|
|
edfcded9fd | ||
|
|
c39dff0b10 | ||
|
|
288b0d2423 | ||
|
|
1597b7b766 | ||
|
|
ed677c34d5 | ||
|
|
c161994e96 | ||
|
|
f238378221 | ||
|
|
0d5f661cfd | ||
|
|
e99f88ff00 | ||
|
|
cad135aa01 | ||
|
|
678fc65514 | ||
|
|
aad3df96e7 | ||
|
|
629a1e1c93 | ||
|
|
d43b70d939 | ||
|
|
ec1c943069 | ||
|
|
fd74d8b2b1 | ||
|
|
055f7710b6 | ||
|
|
33f610feb7 | ||
|
|
d4da7817ba | ||
|
|
f05b47874b | ||
|
|
d362dca9b3 | ||
|
|
1f34e0adcf | ||
|
|
1832acfbe7 | ||
|
|
a26134de3c | ||
|
|
e2404449e4 | ||
|
|
dc8b2f45de | ||
|
|
aa5502c32e | ||
|
|
e13e64d9c4 | ||
|
|
17a69ab565 | ||
|
|
da27f4c529 | ||
|
|
cdd0ef41a6 | ||
|
|
4be5fd3094 | ||
|
|
bde56bc8f7 | ||
|
|
d9b11ed072 | ||
|
|
565b8b8a2c | ||
|
|
9f13bb7354 | ||
|
|
7408b2a34a | ||
|
|
faf6999c44 | ||
|
|
e9fc23a0c1 | ||
|
|
3e0c887365 | ||
|
|
b4d7993e7e | ||
|
|
fb8c5fa8e9 | ||
|
|
ddc64d8db2 | ||
|
|
98f90bced5 | ||
|
|
cab6866e21 | ||
|
|
a7e2b8a700 | ||
|
|
96c5c20e41 | ||
|
|
18efda3933 | ||
|
|
bfc6ed9fba | ||
|
|
58709c49f6 | ||
|
|
3d5b784fa5 | ||
|
|
cef5e2d931 | ||
|
|
17ad302c54 | ||
|
|
1541356fe1 | ||
|
|
f3556c1eca | ||
|
|
4855e5ee82 | ||
|
|
bb85059bac | ||
|
|
11f53253ad | ||
|
|
9fe009095a | ||
|
|
dce9e8dec5 | ||
|
|
30c87b73de | ||
|
|
1713d35f06 | ||
|
|
5ddfa1ac28 | ||
|
|
dbe9bc927f | ||
|
|
d219055bc8 | ||
|
|
0e9041f29a | ||
|
|
a0b8a6e77f | ||
|
|
a61ab44810 | ||
|
|
dd4b5cbdd6 | ||
|
|
27903c5b86 | ||
|
|
d5e38fa97b | ||
|
|
7673a61990 | ||
|
|
6a12aa87f4 | ||
|
|
5b77877888 | ||
|
|
8148255ef1 | ||
|
|
40ddf334c9 | ||
|
|
7e10428cd6 | ||
|
|
6a4fe34e61 | ||
|
|
4cd5566b40 | ||
|
|
8b3418cab8 | ||
|
|
9bfde7574a | ||
|
|
8eab5f5403 | ||
|
|
d5b9c4ae84 | ||
|
|
7dd2e11698 | ||
|
|
9197c69900 | ||
|
|
c7dfe2f626 | ||
|
|
af87010071 | ||
|
|
ef369d45a5 | ||
|
|
64938393bd | ||
|
|
79fce146dd | ||
|
|
ef4435cffc | ||
|
|
c2a7f363c6 | ||
|
|
0134940f23 | ||
|
|
8bb259b1f6 | ||
|
|
466f20b12e | ||
|
|
461de4cc21 | ||
|
|
ba75890936 | ||
|
|
0801eac01a | ||
|
|
9f735b1fe7 | ||
|
|
fbeb019a85 | ||
|
|
6e9529be4e | ||
|
|
462bb76e06 | ||
|
|
8002795088 | ||
|
|
7404993f0c | ||
|
|
b7e2b0cad3 | ||
|
|
cc868aee51 | ||
|
|
39036a553f | ||
|
|
e685e4b431 | ||
|
|
e404a658b1 | ||
|
|
74652b465d | ||
|
|
7575da2064 | ||
|
|
9b23910103 | ||
|
|
98e021e969 | ||
|
|
b8d9939329 | ||
|
|
0244e228fa | ||
|
|
ab61d2ac8e | ||
|
|
f42e1f477c | ||
|
|
3019afa721 | ||
|
|
cb574b283f | ||
|
|
b9ce3df4cd | ||
|
|
f028cfae59 | ||
|
|
041ab2d237 | ||
|
|
acd25ccf95 | ||
|
|
7dd62806a0 | ||
|
|
6a823fb3af | ||
|
|
11f34624aa | ||
|
|
1422f7a75c | ||
|
|
b17b5d4d9f | ||
|
|
bd824d9407 | ||
|
|
c3233deb70 | ||
|
|
bf188c4a51 | ||
|
|
a5857b81c2 | ||
|
|
7a32eec6d1 | ||
|
|
c69562f864 | ||
|
|
40c54bc12b | ||
|
|
44b3d860cb | ||
|
|
5a65ffe66d | ||
|
|
b9dae8fbab | ||
|
|
84593f2d7f | ||
|
|
22f6f3b6d3 | ||
|
|
8cd62b9eab | ||
|
|
93e3f020a9 | ||
|
|
81ccd02032 | ||
|
|
2ae1aab49b | ||
|
|
554ae93ef1 | ||
|
|
7a29850ae9 | ||
|
|
c200e7a0c5 | ||
|
|
5529a5e8e2 | ||
|
|
905031eb95 | ||
|
|
76d23a21e6 | ||
|
|
5dd1a7e839 | ||
|
|
bc098370c1 | ||
|
|
b07b46bc0c | ||
|
|
b0823d2068 | ||
|
|
b4a6290b42 | ||
|
|
c324a086b2 | ||
|
|
2bde381723 | ||
|
|
61390f5885 | ||
|
|
f8a0fb37bf | ||
|
|
13fe6ad758 | ||
|
|
78427e4c22 | ||
|
|
829ab22723 | ||
|
|
a8d08c8a49 | ||
|
|
7679a92627 | ||
|
|
ad44c4f7a3 | ||
|
|
3c56c1c7cd | ||
|
|
d4e83d706f | ||
|
|
c47dc02849 | ||
|
|
841cb535df | ||
|
|
e5b26a7308 | ||
|
|
b4b054ebf5 | ||
|
|
08ea94e011 | ||
|
|
ba7a783c7f | ||
|
|
f58692a641 | ||
|
|
0dc7696c89 | ||
|
|
5658b62b7a | ||
|
|
938a2f1667 | ||
|
|
303b3f1b43 | ||
|
|
bf84973173 | ||
|
|
89728a486d | ||
|
|
ae3a0d72cc | ||
|
|
3475a2df67 | ||
|
|
ac42e00864 | ||
|
|
0293cf8346 | ||
|
|
8c139a4546 | ||
|
|
47a036761a | ||
|
|
d2c90dad0a | ||
|
|
7ac92eac0f | ||
|
|
7800dae776 | ||
|
|
a39c9013cc | ||
|
|
25d2786cae | ||
|
|
1f1e821192 | ||
|
|
ae882e85f8 | ||
|
|
aec5e42bdb | ||
|
|
a0c79360ed | ||
|
|
2d3b20bc68 | ||
|
|
a6b0efd530 | ||
|
|
0de043adbc | ||
|
|
67fcbd2a86 | ||
|
|
c925c92217 | ||
|
|
852d25b307 | ||
|
|
4d8ff4eabc | ||
|
|
d6bc08610b | ||
|
|
c154d82557 | ||
|
|
cf1e53bc39 | ||
|
|
92ab75408d | ||
|
|
f977779693 | ||
|
|
4033ac02d0 | ||
|
|
9ab9275f66 | ||
|
|
1c80c4bb08 | ||
|
|
548653cafe | ||
|
|
ee6b1ea157 | ||
|
|
12db3dafc5 | ||
|
|
d1e95cbc98 | ||
|
|
7ffa793f19 |
1
.gitattributes
vendored
1
.gitattributes
vendored
@@ -1,6 +1,5 @@
|
|||||||
.gitignore export-ignore
|
.gitignore export-ignore
|
||||||
.gitattributes export-ignore
|
.gitattributes export-ignore
|
||||||
build export-ignore
|
|
||||||
README.md export-ignore
|
README.md export-ignore
|
||||||
/spec export-ignore
|
/spec export-ignore
|
||||||
Gemfile export-ignore
|
Gemfile export-ignore
|
||||||
|
|||||||
18
.github/ISSUE_TEMPLATE/add-language.md
vendored
Normal file
18
.github/ISSUE_TEMPLATE/add-language.md
vendored
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
---
|
||||||
|
name: Add language
|
||||||
|
about: Add support for new language
|
||||||
|
title: ''
|
||||||
|
labels: ''
|
||||||
|
assignees: ''
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<!--- vim-polyglot accepts only lightweight, maintained github-hosted vim plugins -->
|
||||||
|
|
||||||
|
**GitHub repository url**
|
||||||
|
|
||||||
|
|
||||||
|
**Is this plugin well maintained?**
|
||||||
|
|
||||||
|
|
||||||
|
**Is this plugin lightweight? (no advanced functionality, just indent and syntax support)**
|
||||||
20
.github/ISSUE_TEMPLATE/add-support-for-language.md
vendored
Normal file
20
.github/ISSUE_TEMPLATE/add-support-for-language.md
vendored
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
---
|
||||||
|
name: Add support for language
|
||||||
|
about: ''
|
||||||
|
title: ''
|
||||||
|
labels: ''
|
||||||
|
assignees: ''
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Is your feature request related to a problem? Please describe.**
|
||||||
|
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
|
||||||
|
|
||||||
|
**Describe the solution you'd like**
|
||||||
|
A clear and concise description of what you want to happen.
|
||||||
|
|
||||||
|
**Describe alternatives you've considered**
|
||||||
|
A clear and concise description of any alternative solutions or features you've considered.
|
||||||
|
|
||||||
|
**Additional context**
|
||||||
|
Add any other context or screenshots about the feature request here.
|
||||||
16
.github/ISSUE_TEMPLATE/bug_report.md
vendored
Normal file
16
.github/ISSUE_TEMPLATE/bug_report.md
vendored
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
---
|
||||||
|
name: Bug report
|
||||||
|
about: Report vim-polyglot bug
|
||||||
|
title: ''
|
||||||
|
labels: ''
|
||||||
|
assignees: ''
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<!-- Vim-polyglot is not responsible for bugs of plugins it uses. Please report only bugs that happen when plugin is used as part of vim-polyglot and doesn't happen when just install the plugin -->
|
||||||
|
|
||||||
|
**Does this bug happen when you install plugin without vim-polyglot?**
|
||||||
|
|
||||||
|
**Describe the bug:**
|
||||||
|
|
||||||
|
**To Reproduce:**
|
||||||
13
.travis.yml
13
.travis.yml
@@ -1,8 +1,11 @@
|
|||||||
language: ruby
|
language: ruby
|
||||||
rvm:
|
rvm:
|
||||||
- 1.9.3
|
- 2.6
|
||||||
before_install: sudo apt-get install vim-gtk
|
sudo: false
|
||||||
|
addons:
|
||||||
|
apt:
|
||||||
|
packages:
|
||||||
|
- vim-gtk
|
||||||
before_script:
|
before_script:
|
||||||
- "export DISPLAY=:99.0"
|
- "./build"
|
||||||
- "sh -e /etc/init.d/xvfb start"
|
script: xvfb-run bundle exec rspec --format=documentation
|
||||||
script: bundle exec rspec --format=documentation
|
|
||||||
|
|||||||
28
Gemfile.lock
28
Gemfile.lock
@@ -1,16 +1,21 @@
|
|||||||
GEM
|
GEM
|
||||||
remote: https://rubygems.org/
|
remote: https://rubygems.org/
|
||||||
specs:
|
specs:
|
||||||
diff-lcs (1.1.3)
|
diff-lcs (1.3)
|
||||||
rspec (2.12.0)
|
rspec (3.8.0)
|
||||||
rspec-core (~> 2.12.0)
|
rspec-core (~> 3.8.0)
|
||||||
rspec-expectations (~> 2.12.0)
|
rspec-expectations (~> 3.8.0)
|
||||||
rspec-mocks (~> 2.12.0)
|
rspec-mocks (~> 3.8.0)
|
||||||
rspec-core (2.12.2)
|
rspec-core (3.8.0)
|
||||||
rspec-expectations (2.12.1)
|
rspec-support (~> 3.8.0)
|
||||||
diff-lcs (~> 1.1.3)
|
rspec-expectations (3.8.2)
|
||||||
rspec-mocks (2.12.0)
|
diff-lcs (>= 1.2.0, < 2.0)
|
||||||
vimrunner (0.3.0)
|
rspec-support (~> 3.8.0)
|
||||||
|
rspec-mocks (3.8.0)
|
||||||
|
diff-lcs (>= 1.2.0, < 2.0)
|
||||||
|
rspec-support (~> 3.8.0)
|
||||||
|
rspec-support (3.8.0)
|
||||||
|
vimrunner (0.3.4)
|
||||||
|
|
||||||
PLATFORMS
|
PLATFORMS
|
||||||
ruby
|
ruby
|
||||||
@@ -18,3 +23,6 @@ PLATFORMS
|
|||||||
DEPENDENCIES
|
DEPENDENCIES
|
||||||
rspec
|
rspec
|
||||||
vimrunner
|
vimrunner
|
||||||
|
|
||||||
|
BUNDLED WITH
|
||||||
|
1.16.2
|
||||||
|
|||||||
259
README.md
259
README.md
@@ -1,104 +1,227 @@
|
|||||||
# vim-polyglot [![Build Status][travis-img-url]][travis-url]
|

|
||||||
|
|
||||||
[travis-img-url]: https://travis-ci.org/sheerun/vim-polyglot.png
|
[![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
|
[travis-url]: https://travis-ci.org/sheerun/vim-polyglot
|
||||||
|
|
||||||
A collection of language packs for Vim.
|
A collection of language packs for Vim.
|
||||||
|
|
||||||
> One to rule them all, one to find them, one to bring them all and in the darkness bind them.
|
> One to rule them all, one to find them, one to bring them all and in the darkness bind them.
|
||||||
|
|
||||||
- It **won't affect your startup time**, as scripts are loaded only on demand\*.
|
- It **won't affect your startup time**, as scripts are loaded only on demand\*.
|
||||||
- It **installs 50+ times faster** than 50+ packages it consist of.
|
- It **installs and updates 120+ times faster** than the <!--Package Count-->147<!--/Package Count--> packages it consists of.
|
||||||
- Solid syntax and indentation support. Only the best language packs.
|
- Solid syntax and indentation support (other features skipped). Only the best language packs.
|
||||||
- All unnecessary files are ignored (like enormous documentation from php support).
|
- All unnecessary files are ignored (like enormous documentation from php support).
|
||||||
- No support for esoteric languages, only most popular ones (modern too, like `slim`).
|
- No support for esoteric languages, only most popular ones (modern too, like `slim`).
|
||||||
- Each build is tested by automated vimrunner script on CI. See `spec` directory.
|
- Each build is tested by automated vimrunner script on CI. See `spec` directory.
|
||||||
|
|
||||||
\*To be completely honest, concatenated `ftdetect` script takes around `3ms` to load.
|
\*To be completely honest, concatenated `ftdetect` script takes up to `17ms` to load.
|
||||||
|
|
||||||
## Installation
|
## Installation
|
||||||
|
|
||||||
1. Install pathogen, Vundle or NeoBundle package manager.
|
1. Install [Pathogen](https://github.com/tpope/vim-pathogen), [Vundle](https://github.com/VundleVim/Vundle.vim), [NeoBundle](https://github.com/Shougo/neobundle.vim), or [Plug](https://github.com/junegunn/vim-plug) package manager for Vim.
|
||||||
2. Use this repository as submodule or package.
|
2. Use this repository as submodule or package.
|
||||||
|
|
||||||
|
For example when using [Plug](https://github.com/junegunn/vim-plug):
|
||||||
|
|
||||||
|
```
|
||||||
|
Plug 'sheerun/vim-polyglot'
|
||||||
|
```
|
||||||
|
|
||||||
Optionally download one of the [releases](https://github.com/sheerun/vim-polyglot/releases) and unpack it directly under `~/.vim` directory.
|
Optionally download one of the [releases](https://github.com/sheerun/vim-polyglot/releases) and unpack it directly under `~/.vim` directory.
|
||||||
|
|
||||||
|
You can also use Vim 8 built-in package manager:
|
||||||
|
|
||||||
|
```
|
||||||
|
mkdir -p ~/.vim/pack/default/start
|
||||||
|
git clone https://github.com/sheerun/vim-polyglot ~/.vim/pack/default/start/vim-polyglot
|
||||||
|
```
|
||||||
|
|
||||||
|
NOTE: Not all features of listed language packs are available. We strip them from functionality slowing vim startup in general (for example we ignore `plugins` folder that is loaded regardless of file type, use `ftplugin` instead).
|
||||||
|
|
||||||
|
If you need full functionality of any plugin, please use it directly with your plugin manager.
|
||||||
|
|
||||||
## Language packs
|
## Language packs
|
||||||
|
|
||||||
- [arduino](https://github.com/sudar/vim-arduino-syntax) (syntax, indent, ftdetect)
|
<!--Language Packs-->
|
||||||
- [blade](https://github.com/xsbeats/vim-blade) (syntax, ftdetect)
|
- [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)
|
||||||
|
- [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)
|
||||||
- [c++11](https://github.com/octol/vim-cpp-enhanced-highlight) (syntax)
|
- [c++11](https://github.com/octol/vim-cpp-enhanced-highlight) (syntax)
|
||||||
- [c/c++](https://github.com/vim-jp/cpp-vim) (syntax)
|
- [c/c++](https://github.com/vim-jp/vim-cpp) (syntax)
|
||||||
- [c-extensions](https://github.com/kergoth/aftersyntaxc.vim) (syntax)
|
- [caddyfile](https://github.com/isobit/vim-caddyfile) (syntax, indent, ftplugin)
|
||||||
- [clojure](https://github.com/guns/vim-clojure-static) (syntax, indent, autoload, ftplugin, ftdetect)
|
- [carp](https://github.com/hellerve/carp-vim) (syntax)
|
||||||
- [coffee-script](https://github.com/kchmck/vim-coffee-script) (syntax, indent, compiler, autoload, ftplugin, ftdetect)
|
- [cjsx](https://github.com/mtscout6/vim-cjsx) (syntax, ftplugin)
|
||||||
- [css](https://github.com/JulesWang/css.vim) (syntax)
|
- [clojure](https://github.com/guns/vim-clojure-static) (syntax, indent, autoload, ftplugin)
|
||||||
- [cucumber](https://github.com/tpope/vim-cucumber) (syntax, indent, compiler, ftplugin, ftdetect)
|
- [cmake](https://github.com/pboettch/vim-cmake-syntax) (syntax, indent)
|
||||||
- [dockerfile](https://github.com/honza/dockerfile.vim) (syntax, ftdetect)
|
- [coffee-script](https://github.com/kchmck/vim-coffee-script) (syntax, compiler, indent, autoload, ftplugin)
|
||||||
- [elixir](https://github.com/elixir-lang/vim-elixir) (syntax, indent, compiler, ftplugin, ftdetect)
|
- [cql](https://github.com/elubow/cql-vim) (syntax)
|
||||||
- [emberscript](https://github.com/heartsentwined/vim-ember-script) (syntax, indent, ftplugin, ftdetect)
|
- [cryptol](https://github.com/victoredwardocallaghan/cryptol.vim) (syntax, compiler, ftplugin)
|
||||||
- [emblem](https://github.com/heartsentwined/vim-emblem) (syntax, indent, ftplugin, ftdetect)
|
- [crystal](https://github.com/rhysd/vim-crystal) (syntax, indent, autoload, ftplugin)
|
||||||
- [erlang](https://github.com/hcs42/vim-erlang-runtime) (syntax, indent)
|
- [csv](https://github.com/chrisbra/csv.vim) (syntax, autoload, ftplugin)
|
||||||
- [git](https://github.com/tpope/vim-git) (syntax, indent, ftplugin, ftdetect)
|
- [cucumber](https://github.com/tpope/vim-cucumber) (syntax, indent, compiler, ftplugin)
|
||||||
- [go](https://github.com/fatih/vim-go) (syntax, indent, ftdetect)
|
- [cue](https://github.com/mgrabovsky/vim-cuesheet) (syntax)
|
||||||
- [haml](https://github.com/tpope/vim-haml) (syntax, indent, compiler, ftplugin, ftdetect)
|
- [dart](https://github.com/dart-lang/dart-vim-plugin) (syntax, indent, autoload, ftplugin)
|
||||||
- [handlebars](https://github.com/mustache/vim-mustache-handlebars) (syntax, ftplugin, ftdetect)
|
- [dhall](https://github.com/vmchale/dhall-vim) (syntax, ftplugin)
|
||||||
- [haskell](https://github.com/travitch/hasksyn) (syntax, indent, ftplugin)
|
- [dlang](https://github.com/JesseKPhillips/d.vim) (syntax, indent)
|
||||||
- [haxe](https://github.com/yaymukund/vim-haxe) (syntax, ftdetect)
|
- [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)
|
||||||
|
- [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/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)
|
||||||
|
- [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)
|
||||||
|
- [graphql](https://github.com/jparise/vim-graphql) (syntax, indent, autoload, ftplugin, after)
|
||||||
|
- [groovy-indent](https://github.com/vim-scripts/groovyindent-unix) (indent)
|
||||||
|
- [groovy](https://github.com/vim-scripts/groovy.vim) (syntax)
|
||||||
|
- [haml](https://github.com/sheerun/vim-haml) (syntax, indent, compiler, ftplugin)
|
||||||
|
- [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)
|
- [html5](https://github.com/othree/html5.vim) (syntax, indent, autoload, ftplugin)
|
||||||
- [jade](https://github.com/digitaltoad/vim-jade) (syntax, indent, ftplugin, ftdetect)
|
- [i3](https://github.com/mboughaba/i3config.vim) (syntax, ftplugin)
|
||||||
- [jasmine](https://github.com/glanotte/vim-jasmine) (syntax, ftdetect)
|
- [idris](https://github.com/idris-hackers/idris-vim) (syntax, indent, ftplugin)
|
||||||
- [javascript](https://github.com/pangloss/vim-javascript) (syntax, indent, ftdetect)
|
- [ion](https://github.com/vmchale/ion-vim) (syntax, ftplugin)
|
||||||
- [json](https://github.com/leshill/vim-json) (syntax, ftdetect)
|
- [jasmine](https://github.com/glanotte/vim-jasmine) (syntax)
|
||||||
- [jst](https://github.com/briancollins/vim-jst) (syntax, indent, ftdetect)
|
- [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, 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/LaTeX-Box-Team/LaTeX-Box) (syntax, indent, ftplugin)
|
||||||
- [less](https://github.com/groenewege/vim-less) (syntax, indent, ftplugin, ftdetect)
|
- [less](https://github.com/groenewege/vim-less) (syntax, indent, ftplugin)
|
||||||
- [liquid](https://github.com/tpope/vim-liquid) (syntax, indent, ftplugin, ftdetect)
|
- [lilypond](https://github.com/anowlcalledjosh/vim-lilypond) (syntax, indent, compiler, ftplugin)
|
||||||
- [markdown](https://github.com/tpope/vim-markdown) (syntax, ftplugin, ftdetect)
|
- [livescript](https://github.com/gkz/vim-ls) (syntax, indent, compiler, ftplugin)
|
||||||
- [nginx](https://github.com/mutewinter/nginx.vim) (syntax, ftdetect)
|
- [llvm](https://github.com/rhysd/vim-llvm) (syntax, indent, ftplugin)
|
||||||
- [ocaml](https://github.com/jrk/vim-ocaml) (syntax, indent, ftplugin)
|
- [log](https://github.com/MTDL9/vim-log-highlighting) (syntax)
|
||||||
- [octave](https://github.com/vim-scripts/octave.vim--) (syntax)
|
- [lua](https://github.com/tbastos/vim-lua) (syntax, indent)
|
||||||
- [opencl](https://github.com/petRUShka/vim-opencl) (syntax, indent, ftplugin, ftdetect)
|
- [mako](https://github.com/sophacles/vim-bundle-mako) (syntax, indent, ftplugin)
|
||||||
- [perl](https://github.com/vim-perl/vim-perl) (syntax, indent, ftplugin, ftdetect)
|
- [markdown](https://github.com/gabrielelana/vim-markdown) (syntax, autoload, 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)
|
||||||
|
- [moonscript](https://github.com/leafo/moonscript-vim) (syntax, indent, ftplugin)
|
||||||
|
- [nginx](https://github.com/chr4/nginx.vim) (syntax, indent, ftplugin)
|
||||||
|
- [nim](https://github.com/zah/nim.vim) (syntax, compiler, indent)
|
||||||
|
- [nix](https://github.com/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/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)
|
- [php](https://github.com/StanAngeloff/php.vim) (syntax)
|
||||||
- [puppet](https://github.com/rodjek/vim-puppet) (syntax, indent, ftplugin, ftdetect)
|
- [plantuml](https://github.com/aklt/plantuml-syntax) (syntax, indent, ftplugin)
|
||||||
- [powershell](https://github.com/Persistent13/vim-ps1) (syntax, indent, ftplugin, ftdetect)
|
- [pony](https://github.com/jakwings/vim-pony) (syntax, indent, autoload, ftplugin)
|
||||||
- [protobuf](https://github.com/uarun/vim-protobuf) (syntax, ftdetect)
|
- [powershell](https://github.com/PProvost/vim-ps1) (syntax, indent, ftplugin)
|
||||||
- [python](https://github.com/mitsuhiko/vim-python-combined) (syntax, indent)
|
- [protobuf](https://github.com/uarun/vim-protobuf) (syntax, indent)
|
||||||
- [r-lang](https://github.com/vim-scripts/R.vim) (syntax, ftplugin)
|
- [pug](https://github.com/digitaltoad/vim-pug) (syntax, indent, ftplugin)
|
||||||
- [rspec](https://github.com/sheerun/rspec.vim) (syntax, ftdetect)
|
- [puppet](https://github.com/rodjek/vim-puppet) (syntax, indent, autoload, ftplugin)
|
||||||
- [ruby](https://github.com/vim-ruby/vim-ruby) (syntax, indent, compiler, autoload, ftplugin, ftdetect)
|
- [purescript](https://github.com/purescript-contrib/purescript-vim) (syntax, indent, ftplugin)
|
||||||
- [rust](https://github.com/wting/rust.vim) (syntax, indent, compiler, autoload, ftplugin, ftdetect)
|
- [python-compiler](https://github.com/aliev/vim-compiler-python) (compiler, autoload)
|
||||||
- [sbt](https://github.com/derekwyatt/vim-sbt) (syntax, ftdetect)
|
- [python-indent](https://github.com/Vimjas/vim-python-pep8-indent) (indent)
|
||||||
- [scala](https://github.com/derekwyatt/vim-scala) (syntax, indent, ftplugin, ftdetect)
|
- [python](https://github.com/vim-python/python-syntax) (syntax)
|
||||||
- [slim](https://github.com/slim-template/vim-slim) (syntax, indent, ftdetect)
|
- [qmake](https://github.com/artoj/qmake-syntax-vim) (syntax)
|
||||||
- [stylus](https://github.com/wavded/vim-stylus) (syntax, indent, ftplugin, ftdetect)
|
- [qml](https://github.com/peterhoeg/vim-qml) (syntax, indent, ftplugin)
|
||||||
- [systemd](https://github.com/kurayama/systemd-vim-syntax) (syntax, ftdetect)
|
- [r-lang](https://github.com/vim-scripts/R.vim) (syntax)
|
||||||
- [swift](https://github.com/toyamarinyon/vim-swift) (syntax, indent, ftdetect)
|
- [racket](https://github.com/wlangstroth/vim-racket) (syntax, indent, ftplugin)
|
||||||
- [textile](https://github.com/timcharper/textile.vim) (syntax, ftplugin, ftdetect)
|
- [ragel](https://github.com/jneen/ragel.vim) (syntax)
|
||||||
- [tmux](https://github.com/tejr/vim-tmux) (syntax, ftdetect)
|
- [raml](https://github.com/IN3D/vim-raml) (syntax, ftplugin)
|
||||||
- [tomdoc](https://github.com/duwanis/tomdoc.vim) (syntax)
|
- [reason](https://github.com/reasonml-editor/vim-reason-plus) (syntax, indent)
|
||||||
- [typescript](https://github.com/leafgarland/typescript-vim) (syntax, compiler, ftplugin, ftdetect)
|
- [rspec](https://github.com/sheerun/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)
|
||||||
|
- [sbt](https://github.com/derekwyatt/vim-sbt) (syntax)
|
||||||
|
- [scala](https://github.com/derekwyatt/vim-scala) (syntax, indent, compiler, ftplugin)
|
||||||
|
- [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)
|
||||||
|
- [stylus](https://github.com/wavded/vim-stylus) (syntax, indent, ftplugin)
|
||||||
|
- [svelte](https://github.com/evanleck/vim-svelte) (syntax, indent)
|
||||||
|
- [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)
|
||||||
|
- [sxhkd](https://github.com/baskerville/vim-sxhkdrc) (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) (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/HerringtonDarkholme/yats.vim) (syntax, indent, compiler, ftplugin)
|
||||||
|
- [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)
|
- [vbnet](https://github.com/vim-scripts/vbnet.vim) (syntax)
|
||||||
- [thrift](https://github.com/solarnz/thrift.vim) (syntax, ftdetect)
|
- [vcl](https://github.com/smerrill/vcl-vim-plugin) (syntax)
|
||||||
- [toml](https://github.com/cespare/vim-toml) (syntax, ftplugin, ftdetect)
|
- [vifm](https://github.com/vifm/vifm.vim) (syntax, autoload, ftplugin)
|
||||||
- [twig](https://github.com/beyondwords/vim-twig) (syntax, ftplugin, ftdetect)
|
- [vm](https://github.com/lepture/vim-velocity) (syntax, indent)
|
||||||
|
- [vue](https://github.com/posva/vim-vue) (syntax, indent, ftplugin)
|
||||||
|
- [xdc](https://github.com/amal-khailtash/vim-xdc-syntax) (syntax)
|
||||||
- [xls](https://github.com/vim-scripts/XSLT-syntax) (syntax)
|
- [xls](https://github.com/vim-scripts/XSLT-syntax) (syntax)
|
||||||
|
- [xml](https://github.com/amadeus/vim-xml) (syntax)
|
||||||
|
- [yaml](https://github.com/stephpy/vim-yaml) (syntax, ftplugin)
|
||||||
- [yard](https://github.com/sheerun/vim-yardoc) (syntax)
|
- [yard](https://github.com/sheerun/vim-yardoc) (syntax)
|
||||||
- [vala](https://github.com/tkztmk/vim-vala) (syntax, indent, ftdetect)
|
- [zephir](https://github.com/xwsoul/vim-zephir) (syntax)
|
||||||
- [vm](https://github.com/lepture/vim-velocity) (syntax, indent, ftdetect)
|
- [zig](https://github.com/ziglang/zig.vim) (syntax, autoload, ftplugin)
|
||||||
- [css-color](https://github.com/ap/vim-css-color) (autoload, syntax)
|
<!--/Language Packs-->
|
||||||
|
|
||||||
|
## Updating
|
||||||
|
|
||||||
|
You can either wait for new patch release with updates or run the `./build` script by yourself.
|
||||||
|
|
||||||
|
## Troubleshooting
|
||||||
|
|
||||||
|
Please make sure you have `syntax on` in your `.vimrc`, otherwise syntax files are not loaded at all.
|
||||||
|
|
||||||
|
Individual language packs can be disabled by setting `g:polyglot_disabled` as follows:
|
||||||
|
|
||||||
|
```viml
|
||||||
|
" ~/.vimrc, declare this variable before polyglot is loaded
|
||||||
|
let g:polyglot_disabled = ['css']
|
||||||
|
```
|
||||||
|
|
||||||
|
Note that disabling languages won't make in general your vim startup any faster / slower (only for specific file type). Vim-polyglot is selection of language plugins that are loaded only on demand.
|
||||||
|
|
||||||
## Contributing
|
## Contributing
|
||||||
|
|
||||||
Language packs are periodically updated using automated `build` script.
|
Language packs are periodically updated using automated `build` script.
|
||||||
|
|
||||||
Feel free to add your language, and send pull-request.
|
Feel free to add your language, and send pull-request. In your pull request, please include:
|
||||||
|
1. How you chose the particular repo from which to pull support for this language.
|
||||||
|
2. An updated https://github.com/sheerun/vim-polyglot/blob/master/build .
|
||||||
|
3. If at all possible, absolutely nothing else (in particular, please don't run `build` and include that in your PR).
|
||||||
|
|
||||||
|
The easier it is to validate that the new language won't do anything wacky, the faster it'll be merged. In particular, languages that utilize global plugins (loaded for every filetype), or plugins with dangerous features (like `call` based on the contents of a file being edited), will never be merged, as they will be slow or dangerous, respectively.
|
||||||
|
|
||||||
## License
|
## License
|
||||||
|
|
||||||
See linked repositories for detailed license information.
|
See linked repositories for detailed license information.
|
||||||
|
|
||||||
|
|
||||||
[](https://bitdeli.com/free "Bitdeli Badge")
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,2 +0,0 @@
|
|||||||
autocmd BufReadPost,BufNewFile *_spec.rb set syntax=rspec
|
|
||||||
autocmd BufReadPost,BufNewFile *_spec.rb setlocal commentstring=#\ %s
|
|
||||||
7
after/ftplugin/cabal.vim
Normal file
7
after/ftplugin/cabal.vim
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'haskell') == -1
|
||||||
|
|
||||||
|
setlocal comments=s1fl:{-,mb:-,ex:-},:--
|
||||||
|
setlocal iskeyword+=-,.,*
|
||||||
|
setlocal commentstring=--\ %s
|
||||||
|
|
||||||
|
endif
|
||||||
9
after/ftplugin/coffee.vim
Normal file
9
after/ftplugin/coffee.vim
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'cjsx') == -1
|
||||||
|
|
||||||
|
if exists("loaded_matchit")
|
||||||
|
let b:match_ignorecase = 0
|
||||||
|
let b:match_words = '(:),\[:\],{:},<:>,' .
|
||||||
|
\ '<\@<=\([^/][^ \t>]*\)[^>]*\%(>\|$\):<\@<=/\1>'
|
||||||
|
endif
|
||||||
|
|
||||||
|
endif
|
||||||
@@ -1,9 +1,6 @@
|
|||||||
" Vim ftplugin file
|
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'haskell') == -1
|
||||||
" Language: Haskell
|
|
||||||
" Maintainer: Tristan Ravitch
|
|
||||||
|
|
||||||
" I don't fully understand what the vim-default ftplugin does, but I do know
|
setlocal comments=s1fl:{-,mb:\ \ ,ex:-},:--
|
||||||
" that the three-part comment entry really messes up this indenter (I also
|
setlocal iskeyword+='
|
||||||
" hate the leading '-'s it puts in on each line). Disable it here.
|
|
||||||
setlocal comments&
|
endif
|
||||||
setlocal comments=:--
|
|
||||||
|
|||||||
5
after/ftplugin/idris.vim
Normal file
5
after/ftplugin/idris.vim
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'idris') == -1
|
||||||
|
|
||||||
|
setlocal iskeyword+='
|
||||||
|
|
||||||
|
endif
|
||||||
51
after/ftplugin/javascript.vim
Normal file
51
after/ftplugin/javascript.vim
Normal file
@@ -0,0 +1,51 @@
|
|||||||
|
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'javascript') == -1
|
||||||
|
|
||||||
|
" Vim filetype plugin file
|
||||||
|
" Language: JavaScript
|
||||||
|
" Maintainer: vim-javascript community
|
||||||
|
" URL: https://github.com/pangloss/vim-javascript
|
||||||
|
|
||||||
|
setlocal iskeyword+=$ suffixesadd+=.js
|
||||||
|
|
||||||
|
if exists('b:undo_ftplugin')
|
||||||
|
let b:undo_ftplugin .= ' | setlocal iskeyword< suffixesadd<'
|
||||||
|
else
|
||||||
|
let b:undo_ftplugin = 'setlocal iskeyword< suffixesadd<'
|
||||||
|
endif
|
||||||
|
|
||||||
|
endif
|
||||||
|
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
|
||||||
|
"
|
||||||
|
" Language: javascript.jsx
|
||||||
|
" Maintainer: MaxMEllon <maxmellon1994@gmail.com>
|
||||||
|
"
|
||||||
|
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
|
||||||
|
|
||||||
|
" modified from html.vim
|
||||||
|
" For matchit plugin
|
||||||
|
if exists("loaded_matchit")
|
||||||
|
let b:match_ignorecase = 0
|
||||||
|
let b:match_words = '(:),\[:\],{:},<:>,' .
|
||||||
|
\ '<\@<=\([^/][^ \t>]*\)[^>]*\%(>\|$\):<\@<=/\1>'
|
||||||
|
endif
|
||||||
|
|
||||||
|
" For andymass/vim-matchup plugin
|
||||||
|
if exists("loaded_matchup")
|
||||||
|
setlocal matchpairs=(:),{:},[:],<:>
|
||||||
|
let b:match_words = '<\@<=\([^/][^ \t>]*\)\g{hlend}[^>]*\%(/\@<!>\|$\):<\@<=/\1>'
|
||||||
|
let b:match_skip = 's:comment\|string'
|
||||||
|
endif
|
||||||
|
|
||||||
|
let b:original_commentstring = &l:commentstring
|
||||||
|
|
||||||
|
augroup jsx_comment
|
||||||
|
autocmd! CursorMoved <buffer>
|
||||||
|
autocmd CursorMoved <buffer> call jsx_pretty#comment#update_commentstring(b:original_commentstring)
|
||||||
|
augroup end
|
||||||
|
|
||||||
|
setlocal suffixesadd+=.jsx
|
||||||
|
|
||||||
|
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
|
||||||
477
after/ftplugin/llvm.vim
Normal file
477
after/ftplugin/llvm.vim
Normal file
@@ -0,0 +1,477 @@
|
|||||||
|
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'llvm') == -1
|
||||||
|
|
||||||
|
" Copyright (c) 2018 rhysd
|
||||||
|
"
|
||||||
|
" 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.
|
||||||
|
|
||||||
|
if get(g:, 'llvm_extends_official', 1) == 0
|
||||||
|
finish
|
||||||
|
endif
|
||||||
|
|
||||||
|
let g:llvm_ext_no_mapping = get(g:, 'llvm_ext_no_mapping', 0)
|
||||||
|
let g:llvm_ext_lli_executable = get(g:, 'llvm_ext_lli_executable', 'lli')
|
||||||
|
|
||||||
|
let s:KIND_BLOCK_PREC = 0
|
||||||
|
let s:KIND_BLOCK_FOLLOW = 1
|
||||||
|
let s:KIND_FUNC_BEGIN = 2
|
||||||
|
let s:KIND_FUNC_END = 3
|
||||||
|
|
||||||
|
function! s:section_delim_at(lnum) abort
|
||||||
|
let line = getline(a:lnum)
|
||||||
|
let m = matchlist(line, '^\([^:]\+\):\%( \+; preds = \(%.\+\)\)\=$')
|
||||||
|
if !empty(m)
|
||||||
|
if m[2] ==# ''
|
||||||
|
return [s:KIND_BLOCK_PREC, m[1]]
|
||||||
|
else
|
||||||
|
return [s:KIND_BLOCK_FOLLOW, m[1], split(m[2], ',\s*')]
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
if line =~# '^}$'
|
||||||
|
return [s:KIND_FUNC_END]
|
||||||
|
endif
|
||||||
|
if line =~# '^define\>'
|
||||||
|
return [s:KIND_FUNC_BEGIN]
|
||||||
|
endif
|
||||||
|
return []
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:is_section_delim(line, func_delim) abort
|
||||||
|
let sec = s:section_delim_at(a:line)
|
||||||
|
if empty(sec)
|
||||||
|
return 0
|
||||||
|
endif
|
||||||
|
let kind = sec[0]
|
||||||
|
return kind == s:KIND_BLOCK_PREC || kind == s:KIND_BLOCK_FOLLOW || kind == func_delim
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:next_section(stop_func_begin) abort
|
||||||
|
let func_delim = a:stop_func_begin ? s:KIND_FUNC_BEGIN : s:KIND_FUNC_END
|
||||||
|
let last = line('$') - 1
|
||||||
|
let line = line('.')
|
||||||
|
while line < last
|
||||||
|
let line += 1
|
||||||
|
if s:is_section_delim(line, func_delim)
|
||||||
|
call cursor(line, col('.'))
|
||||||
|
return
|
||||||
|
endif
|
||||||
|
endwhile
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:prev_section(stop_func_begin) abort
|
||||||
|
let func_delim = a:stop_func_begin ? s:KIND_FUNC_BEGIN : s:KIND_FUNC_END
|
||||||
|
let line = line('.')
|
||||||
|
while line > 1
|
||||||
|
let line -= 1
|
||||||
|
if s:is_section_delim(line, func_delim)
|
||||||
|
call cursor(line, col('.'))
|
||||||
|
return
|
||||||
|
endif
|
||||||
|
endwhile
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
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>
|
||||||
|
endif
|
||||||
|
|
||||||
|
function! s:function_range_at(linum) abort
|
||||||
|
let line = a:linum
|
||||||
|
while line >= 1
|
||||||
|
let s = getline(line)
|
||||||
|
if s =~# '^define\>'
|
||||||
|
let start = line
|
||||||
|
break
|
||||||
|
elseif s =~# '^}$'
|
||||||
|
return []
|
||||||
|
endif
|
||||||
|
let line -= 1
|
||||||
|
endwhile
|
||||||
|
if line < 1
|
||||||
|
return []
|
||||||
|
endif
|
||||||
|
|
||||||
|
let line = a:linum
|
||||||
|
let last = line('$')
|
||||||
|
while line <= last
|
||||||
|
let s = getline(line)
|
||||||
|
if s =~# '^}$'
|
||||||
|
let end = line
|
||||||
|
break
|
||||||
|
elseif s =~# '^define\>'
|
||||||
|
return []
|
||||||
|
endif
|
||||||
|
let line += 1
|
||||||
|
endwhile
|
||||||
|
if line > last
|
||||||
|
return []
|
||||||
|
endif
|
||||||
|
|
||||||
|
return [start, end]
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:blocks_graph_at(linum) abort
|
||||||
|
let func_range = s:function_range_at(a:linum)
|
||||||
|
if empty(func_range)
|
||||||
|
return {}
|
||||||
|
endif
|
||||||
|
let line = func_range[0] + 1
|
||||||
|
let last = func_range[1] - 1
|
||||||
|
let graph = {}
|
||||||
|
while line <= last
|
||||||
|
let block = s:section_delim_at(line)
|
||||||
|
if empty(block)
|
||||||
|
let line += 1
|
||||||
|
continue
|
||||||
|
endif
|
||||||
|
let block_name = '%' . block[1]
|
||||||
|
if block[0] == s:KIND_BLOCK_PREC
|
||||||
|
let graph[block_name] = {'line': line, 'follows': [], 'preds': []}
|
||||||
|
elseif block[0] == s:KIND_BLOCK_FOLLOW
|
||||||
|
let graph[block_name] = {'line': line, 'follows': [], 'preds': block[2]}
|
||||||
|
for follow in block[2]
|
||||||
|
call add(graph[follow].follows, block_name)
|
||||||
|
endfor
|
||||||
|
else
|
||||||
|
echoerr 'unreachable'
|
||||||
|
endif
|
||||||
|
let line += 1
|
||||||
|
endwhile
|
||||||
|
return graph
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:find_pred_block(linum) abort
|
||||||
|
let sec = s:section_delim_at(a:linum)
|
||||||
|
if empty(sec) || sec[0] != s:KIND_BLOCK_PREC && sec[0] != s:KIND_BLOCK_FOLLOW
|
||||||
|
throw 'No block is starting at line ' . a:linum
|
||||||
|
endif
|
||||||
|
if sec[0] != s:KIND_BLOCK_FOLLOW
|
||||||
|
throw printf("Block '%s' has no pred block", sec[1])
|
||||||
|
endif
|
||||||
|
let block_name = '%' . sec[1]
|
||||||
|
let pred_block = sec[2][0]
|
||||||
|
|
||||||
|
let graph = s:blocks_graph_at(a:linum)
|
||||||
|
if empty(graph)
|
||||||
|
throw 'No block is found in function at line ' . a:linum
|
||||||
|
endif
|
||||||
|
|
||||||
|
if !has_key(graph, pred_block)
|
||||||
|
throw printf("Block '%s' (pred block of '%s') not found in function", pred_block, block_name)
|
||||||
|
endif
|
||||||
|
return graph[pred_block]
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:move_to_pred_block() abort
|
||||||
|
try
|
||||||
|
let b = s:find_pred_block(line('.'))
|
||||||
|
call cursor(b.line, col('.'))
|
||||||
|
catch
|
||||||
|
echohl ErrorMsg | echom v:exception | echohl None
|
||||||
|
endtry
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:find_following_block(linum) abort
|
||||||
|
let sec = s:section_delim_at(a:linum)
|
||||||
|
if empty(sec) || sec[0] != s:KIND_BLOCK_PREC && sec[0] != s:KIND_BLOCK_FOLLOW
|
||||||
|
throw 'No block is starting at line ' . a:linum
|
||||||
|
endif
|
||||||
|
let block_name = '%' . sec[1]
|
||||||
|
|
||||||
|
let graph = s:blocks_graph_at(a:linum)
|
||||||
|
if empty(graph)
|
||||||
|
throw 'No block is found in function at line ' . a:linum
|
||||||
|
endif
|
||||||
|
|
||||||
|
let follows = graph[block_name].follows
|
||||||
|
if empty(follows)
|
||||||
|
throw printf("Block '%s' has no following block", block_name)
|
||||||
|
endif
|
||||||
|
|
||||||
|
echom printf("Block '%s' has %d following blocks: %s", block_name, len(follows), join(follows, ', '))
|
||||||
|
|
||||||
|
if !has_key(graph, follows[0])
|
||||||
|
throw printf("Block '%s' is not defined in function at line %d", follows[0], a:linum)
|
||||||
|
endif
|
||||||
|
return graph[follows[0]]
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:move_to_following_block() abort
|
||||||
|
try
|
||||||
|
let b = s:find_following_block(line('.'))
|
||||||
|
call cursor(b.line, col('.'))
|
||||||
|
catch
|
||||||
|
echohl ErrorMsg | echom v:exception | echohl None
|
||||||
|
endtry
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
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>
|
||||||
|
endif
|
||||||
|
|
||||||
|
function! s:get_func_identifiers(line) abort
|
||||||
|
let idx = stridx(a:line, '@')
|
||||||
|
if idx == -1
|
||||||
|
" Invalid signature
|
||||||
|
return []
|
||||||
|
endif
|
||||||
|
|
||||||
|
" e.g. define internal i32 @foo(...) { -> @foo(...) {
|
||||||
|
let sig = a:line[idx:]
|
||||||
|
|
||||||
|
let idx = stridx(sig, '(')
|
||||||
|
if idx == -1
|
||||||
|
" Invalid signature
|
||||||
|
return []
|
||||||
|
endif
|
||||||
|
|
||||||
|
" @foo(...) { -> @foo
|
||||||
|
let idents = [sig[:idx-1]]
|
||||||
|
|
||||||
|
" @foo(...) { -> ...) {
|
||||||
|
let params = sig[idx+1:]
|
||||||
|
|
||||||
|
let idx = strridx(sig, ')')
|
||||||
|
if idx == -1
|
||||||
|
return idents
|
||||||
|
endif
|
||||||
|
|
||||||
|
" ...) { -> ...
|
||||||
|
let params = params[:idx-1]
|
||||||
|
|
||||||
|
" Gather parameters in function signature
|
||||||
|
while params !=# ''
|
||||||
|
let m = matchlist(params, '^[^%]*\(%\%("[^"]\+"\|[[:alnum:]_.]\+\)\)\s*\(.*\)$')
|
||||||
|
if empty(m)
|
||||||
|
break
|
||||||
|
endif
|
||||||
|
let idents += [m[1]]
|
||||||
|
let params = m[2]
|
||||||
|
endwhile
|
||||||
|
|
||||||
|
return idents
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:get_identifiers(line) abort
|
||||||
|
" Registers and type defs
|
||||||
|
let m = matchlist(a:line, '^\s*\(%\S\+\)\s\+=')
|
||||||
|
if !empty(m)
|
||||||
|
return [m[1]]
|
||||||
|
endif
|
||||||
|
|
||||||
|
" Constants
|
||||||
|
let m = matchlist(a:line, '^\(@\S\+\)\s\+=.\+\<constant\>')
|
||||||
|
if !empty(m)
|
||||||
|
return [m[1]]
|
||||||
|
endif
|
||||||
|
|
||||||
|
" Labels for basic blocks
|
||||||
|
let m = matchlist(a:line, '^\([^:]\+\):\%(\s\+; preds = .\+\)\=$')
|
||||||
|
if !empty(m)
|
||||||
|
return ['%' . m[1]]
|
||||||
|
endif
|
||||||
|
|
||||||
|
" Meta variables
|
||||||
|
let m = matchlist(a:line, '^\(!\S\+\)\s\+=')
|
||||||
|
if !empty(m)
|
||||||
|
return [m[1]]
|
||||||
|
endif
|
||||||
|
|
||||||
|
" Attributes
|
||||||
|
let m = matchlist(a:line, '^attributes\s\+\(#\d\+\)\s\+=')
|
||||||
|
if !empty(m)
|
||||||
|
return [m[1]]
|
||||||
|
endif
|
||||||
|
|
||||||
|
if a:line =~# '^\%(declare\|define\)\>'
|
||||||
|
return s:get_func_identifiers(a:line)
|
||||||
|
endif
|
||||||
|
|
||||||
|
return []
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:extract_identifier(word) abort
|
||||||
|
if strlen(a:word) <= 1
|
||||||
|
return ''
|
||||||
|
endif
|
||||||
|
|
||||||
|
let prefix = a:word[0]
|
||||||
|
if prefix ==# '@' || prefix ==# '%' || prefix ==# '!'
|
||||||
|
if prefix ==# '!' && a:word[1] ==# '{'
|
||||||
|
return ''
|
||||||
|
endif
|
||||||
|
|
||||||
|
if a:word[1] == '"'
|
||||||
|
let idx = stridx(a:word, '"', 2)
|
||||||
|
if idx == -1
|
||||||
|
return ''
|
||||||
|
endif
|
||||||
|
" @"foo" or %"foo"
|
||||||
|
return a:word[:idx]
|
||||||
|
else
|
||||||
|
" @foo or %foo
|
||||||
|
return matchstr(a:word, '^[@%!][[:alnum:]_.]\+')
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
if prefix ==# '#'
|
||||||
|
return matchstr(a:word, '^#\d\+')
|
||||||
|
endif
|
||||||
|
|
||||||
|
return ''
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:jump_to_identifier_at(linum, ident) abort
|
||||||
|
let line = getline(a:linum)
|
||||||
|
let column = stridx(line, a:ident) + 1
|
||||||
|
if column == 0
|
||||||
|
let column = col('.')
|
||||||
|
endif
|
||||||
|
call cursor(a:linum, column)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:browser_open_command() abort
|
||||||
|
if exists('g:llvm_ext_browser_open_command')
|
||||||
|
return g:llvm_ext_browser_open_command
|
||||||
|
endif
|
||||||
|
if exists('s:browser_opener')
|
||||||
|
return s:browser_opener
|
||||||
|
endif
|
||||||
|
let s:browser_opener = ''
|
||||||
|
if has('mac')
|
||||||
|
let s:browser_opener = 'open'
|
||||||
|
elseif has('win32') || has('win64')
|
||||||
|
let s:browser_opener = 'cmd /q /c start ""'
|
||||||
|
else
|
||||||
|
for cmd in ['xdg-open', 'chromium', 'google-chrome', 'firefox']
|
||||||
|
if executable(cmd)
|
||||||
|
let s:browser_opener = cmd
|
||||||
|
break
|
||||||
|
endif
|
||||||
|
endfor
|
||||||
|
endif
|
||||||
|
return s:browser_opener
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:open_browser(url) abort
|
||||||
|
let cmd = s:browser_open_command()
|
||||||
|
if cmd ==# ''
|
||||||
|
throw "Failed to open a browser. I don't know how to open a browser: Please set g:llvm_ext_browser_open_command"
|
||||||
|
endif
|
||||||
|
let cmdline = cmd . ' ' . shellescape(a:url)
|
||||||
|
let out = system(cmdline)
|
||||||
|
if v:shell_error
|
||||||
|
throw printf("Failed to open a browser with command '%s': %s", cmdline, out)
|
||||||
|
endif
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:goto_definition() abort
|
||||||
|
" Open language reference manual under the cursor in browser
|
||||||
|
let syn_name = synIDattr(synID(line('.'),col('.'),1),'name')
|
||||||
|
if syn_name ==# 'llvmStatement'
|
||||||
|
let word = expand('<cword>')
|
||||||
|
if word !=# ''
|
||||||
|
try
|
||||||
|
" Open browser assuming a word under the cursor is an instruction
|
||||||
|
call s:open_browser('https://llvm.org/docs/LangRef.html#' . word . '-instruction')
|
||||||
|
catch /^Failed to open a browser/
|
||||||
|
echohl ErrorMsg | echom v:exception | echohl None
|
||||||
|
endtry
|
||||||
|
endif
|
||||||
|
return
|
||||||
|
endif
|
||||||
|
|
||||||
|
" XXX: This does not support identifiers which contains spaces
|
||||||
|
let word = expand('<cWORD>')
|
||||||
|
if word ==# ''
|
||||||
|
echom 'No identifier found under the cursor'
|
||||||
|
return
|
||||||
|
endif
|
||||||
|
let ident = s:extract_identifier(word)
|
||||||
|
if ident ==# ''
|
||||||
|
echom 'No identifier found under the cursor'
|
||||||
|
return
|
||||||
|
endif
|
||||||
|
|
||||||
|
" Definition tends to be near its usages. Look back at first.
|
||||||
|
let line = line('.')
|
||||||
|
while line > 0
|
||||||
|
for found in s:get_identifiers(getline(line))
|
||||||
|
if ident ==# found
|
||||||
|
call s:jump_to_identifier_at(line, ident)
|
||||||
|
return
|
||||||
|
endif
|
||||||
|
endfor
|
||||||
|
let line -= 1
|
||||||
|
endwhile
|
||||||
|
|
||||||
|
let line = line('.') + 1
|
||||||
|
let last = line('$')
|
||||||
|
while line <= last
|
||||||
|
for found in s:get_identifiers(getline(line))
|
||||||
|
if ident ==# found
|
||||||
|
call s:jump_to_identifier_at(line, ident)
|
||||||
|
return
|
||||||
|
endif
|
||||||
|
endfor
|
||||||
|
let line += 1
|
||||||
|
endwhile
|
||||||
|
|
||||||
|
echom "No definition for '" . ident . "' found"
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
if !g:llvm_ext_no_mapping
|
||||||
|
nnoremap <buffer><silent>K :<C-u>call <SID>goto_definition()<CR>
|
||||||
|
endif
|
||||||
|
|
||||||
|
function! s:run_lli(...) abort
|
||||||
|
if !has('job') || !has('channel') || !has('terminal')
|
||||||
|
echohl ErrorMsg
|
||||||
|
echomsg ':LLI requires terminal feature. Please update your Vim to 8.0+'
|
||||||
|
echohl None
|
||||||
|
return
|
||||||
|
endif
|
||||||
|
|
||||||
|
if !executable(g:llvm_ext_lli_executable)
|
||||||
|
echohl ErrorMsg
|
||||||
|
echomsg g:llvm_ext_lli_executable . ' is not executable. Please set g:llvm_ext_lli_executable'
|
||||||
|
echohl None
|
||||||
|
return
|
||||||
|
endif
|
||||||
|
|
||||||
|
if a:0 > 0
|
||||||
|
let bufnr = term_start([g:llvm_ext_lli_executable, a:1])
|
||||||
|
echo 'Run lli in termnal buffer(' . bufnr . ')'
|
||||||
|
return
|
||||||
|
endif
|
||||||
|
|
||||||
|
let tmpfile = tempname()
|
||||||
|
call writefile(getline(1, '$'), tmpfile)
|
||||||
|
let Cleanup = {ch -> filereadable(tmpfile) ? delete(tmpfile) : 0}
|
||||||
|
let bufnr = term_start([g:llvm_ext_lli_executable, tmpfile], {'close_cb': Cleanup, 'exit_cb': Cleanup})
|
||||||
|
echo 'Run lli in termnal buffer(' . bufnr . ')'
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
if !exists(':LLI')
|
||||||
|
command! -buffer -nargs=? -bar -complete=file LLI call <SID>run_lli(<f-args>)
|
||||||
|
endif
|
||||||
|
|
||||||
|
endif
|
||||||
@@ -1,16 +1,11 @@
|
|||||||
|
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'puppet') == -1
|
||||||
|
|
||||||
if !exists('g:puppet_align_hashes')
|
if !exists('g:puppet_align_hashes')
|
||||||
let g:puppet_align_hashes = 1
|
let g:puppet_align_hashes = 1
|
||||||
endif
|
endif
|
||||||
|
|
||||||
if g:puppet_align_hashes && exists(':Tabularize')
|
if g:puppet_align_hashes
|
||||||
inoremap <buffer> <silent> > ><Esc>:call <SID>puppetalign()<CR>a
|
inoremap <buffer> <silent> => =><Esc>:call puppet#align#AlignHashrockets()<CR>$a
|
||||||
function! s:puppetalign()
|
endif
|
||||||
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
|
|
||||||
endif
|
endif
|
||||||
|
|||||||
32
after/ftplugin/typescript.vim
Normal file
32
after/ftplugin/typescript.vim
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
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 = '(:),\[:\],{:},<:>,' .
|
||||||
|
\ '<\@<=\([^/][^ \t>]*\)[^>]*\%(>\|$\):<\@<=/\1>'
|
||||||
|
endif
|
||||||
|
|
||||||
|
" For andymass/vim-matchup plugin
|
||||||
|
if exists("loaded_matchup")
|
||||||
|
setlocal matchpairs=(:),{:},[:],<:>
|
||||||
|
let b:match_words = '<\@<=\([^/][^ \t>]*\)\g{hlend}[^>]*\%(/\@<!>\|$\):<\@<=/\1>'
|
||||||
|
let b:match_skip = 's:comment\|string'
|
||||||
|
endif
|
||||||
|
|
||||||
|
let b:original_commentstring = &l:commentstring
|
||||||
|
|
||||||
|
augroup jsx_comment
|
||||||
|
autocmd! CursorMoved <buffer>
|
||||||
|
autocmd CursorMoved <buffer> call jsx_pretty#comment#update_commentstring(b:original_commentstring)
|
||||||
|
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/typescript.vim
|
||||||
|
|
||||||
|
endif
|
||||||
11
after/ftplugin/yaml.vim
Normal file
11
after/ftplugin/yaml.vim
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'yaml') == -1
|
||||||
|
|
||||||
|
" Vim indent file
|
||||||
|
" Language: Yaml
|
||||||
|
" Author: Henrique Barcelos
|
||||||
|
" Date: 2014-10-08
|
||||||
|
" URL: https://github.com/hjpbarcelos
|
||||||
|
setlocal autoindent sw=2 ts=2 expandtab
|
||||||
|
" vim:set sw=2:
|
||||||
|
|
||||||
|
endif
|
||||||
@@ -1,33 +0,0 @@
|
|||||||
" Language: CoffeeScript
|
|
||||||
" Maintainer: Mick Koch <mick@kochm.co>
|
|
||||||
" URL: http://github.com/kchmck/vim-coffee-script
|
|
||||||
" License: WTFPL
|
|
||||||
|
|
||||||
" Load the coffee and html indent functions.
|
|
||||||
silent! unlet b:did_indent
|
|
||||||
runtime indent/coffee.vim
|
|
||||||
let s:coffeeIndentExpr = &l:indentexpr
|
|
||||||
|
|
||||||
" Load html last so it can overwrite coffee settings.
|
|
||||||
silent! unlet b:did_indent
|
|
||||||
runtime indent/html.vim
|
|
||||||
let s:htmlIndentExpr = &l:indentexpr
|
|
||||||
|
|
||||||
" Inject our wrapper indent function.
|
|
||||||
setlocal indentexpr=GetCoffeeHtmlIndent(v:lnum)
|
|
||||||
|
|
||||||
function! GetCoffeeHtmlIndent(curlinenum)
|
|
||||||
" See if we're inside a coffeescript block.
|
|
||||||
let scriptlnum = searchpair('<script [^>]*type="text/coffeescript"[^>]*>', '',
|
|
||||||
\ '</script>', 'bWn')
|
|
||||||
let prevlnum = prevnonblank(a:curlinenum)
|
|
||||||
|
|
||||||
" If we're in the script block and the previous line isn't the script tag
|
|
||||||
" itself, use coffee indenting.
|
|
||||||
if scriptlnum && scriptlnum != prevlnum
|
|
||||||
exec 'return ' s:coffeeIndentExpr
|
|
||||||
endif
|
|
||||||
|
|
||||||
" Otherwise use html indenting.
|
|
||||||
exec 'return ' s:htmlIndentExpr
|
|
||||||
endfunction
|
|
||||||
33
after/indent/javascript.vim
Normal file
33
after/indent/javascript.vim
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
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: javascript.jsx
|
||||||
|
" Maintainer: MaxMellon <maxmellon1994@gmail.com>
|
||||||
|
"
|
||||||
|
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
|
||||||
|
|
||||||
|
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],0?,0\*,0\,,!^F,:,<:>,o,O,e,<>>,=*/
|
||||||
|
|
||||||
|
function! GetJsxIndent()
|
||||||
|
return jsx_pretty#indent#get(function('GetJavascriptIndent'))
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
let &cpo = s:keepcpo
|
||||||
|
unlet s:keepcpo
|
||||||
|
|
||||||
|
endif
|
||||||
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
|
||||||
97
after/indent/objc.vim
Normal file
97
after/indent/objc.vim
Normal file
@@ -0,0 +1,97 @@
|
|||||||
|
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'objc') == -1
|
||||||
|
|
||||||
|
" Vim indent file
|
||||||
|
" Language: Objective-C
|
||||||
|
" Maintainer: Bjorn Winckler <bjorn.winckler@gmail.com>
|
||||||
|
" Last Change: 2012 Jan 01
|
||||||
|
|
||||||
|
" Ensure 'cpo' is set to Vim default values and restore later
|
||||||
|
let s:save_cpo = &cpo
|
||||||
|
set cpo&vim
|
||||||
|
|
||||||
|
" Only load this indent file when no other was loaded.
|
||||||
|
"if exists("b:did_indent")
|
||||||
|
" finish
|
||||||
|
"endif
|
||||||
|
"let b:did_indent = 1
|
||||||
|
"setlocal cindent
|
||||||
|
|
||||||
|
setl indentkeys=0{,0},:,0#,!^F,o,O,e,<:>
|
||||||
|
|
||||||
|
setlocal indentexpr=GetObjCIndentImproved()
|
||||||
|
|
||||||
|
" Top level statements which should not be indented, and which should not
|
||||||
|
" cause next (non-blank) line to be indented either.
|
||||||
|
let s:topLev = '^\s*@\%(class\|end\|implementation\|interface\|protocol\|\)\>'
|
||||||
|
|
||||||
|
function! GetObjCIndentImproved()
|
||||||
|
" NOTE: Ignore leading white space to avoid having to deal with space vs.
|
||||||
|
" tab issues. Rely on the indent() function instead.
|
||||||
|
let thisLine = substitute(getline(v:lnum), '^\s*', '', '')
|
||||||
|
|
||||||
|
if thisLine =~# s:topLev || getline(prevnonblank(v:lnum - 1)) =~# s:topLev
|
||||||
|
return 0
|
||||||
|
endif
|
||||||
|
|
||||||
|
" If current line looks like an argument to a message dispatch, then line
|
||||||
|
" up colon with previous line. This will indent the second line so that
|
||||||
|
" the colons line up in
|
||||||
|
"
|
||||||
|
" [obj firstParameter:value
|
||||||
|
" paramB:value2];
|
||||||
|
"
|
||||||
|
" but it will not line up colons in
|
||||||
|
"
|
||||||
|
" if ([obj something:here])
|
||||||
|
" [obj other:here];
|
||||||
|
"
|
||||||
|
let thisColon = match(thisLine, '^\s*\K\k*\zs:')
|
||||||
|
if thisColon > 0
|
||||||
|
let prevLine = substitute(getline(v:lnum - 1), '^\s*', '', '')
|
||||||
|
let prevColon = match(prevLine, ':')
|
||||||
|
if prevColon > 0
|
||||||
|
" Try to align colons, always making sure line is indented at least
|
||||||
|
" one shiftwidth more than the indentation at the beginning of the
|
||||||
|
" message. Avoids situations like this:
|
||||||
|
"
|
||||||
|
" if ([obj a:x
|
||||||
|
" aLongParameter:y])
|
||||||
|
"
|
||||||
|
let [lnum,lcol] = searchpairpos('\[', '', '\]', 'b', 0,
|
||||||
|
\ max([1, v:lnum - 10]))
|
||||||
|
let minInd = &sw + (lnum > 0 ? indent(lnum) : 0)
|
||||||
|
let alignedInd = indent(v:lnum - 1) + prevColon - thisColon
|
||||||
|
return alignedInd > minInd ? alignedInd : minInd
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
let prevLnum = v:lnum - 1
|
||||||
|
let ind = indent(prevLnum)
|
||||||
|
|
||||||
|
" Indent one shiftwidth after opening block, e.g.:
|
||||||
|
"
|
||||||
|
" call_func_with_block(param, ^{
|
||||||
|
" do_stuff();
|
||||||
|
" });
|
||||||
|
"
|
||||||
|
let blockPat = '\^\s*\(([^)]*)\)\?\s*{$'
|
||||||
|
if thisLine =~ '^}'
|
||||||
|
norm '^%'
|
||||||
|
if getline(".") =~ blockPat
|
||||||
|
return indent(".")
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
if getline(prevLnum) =~ blockPat
|
||||||
|
return ind + &sw
|
||||||
|
endif
|
||||||
|
|
||||||
|
return cindent(v:lnum)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
|
||||||
|
" Restore 'cpo' options
|
||||||
|
let &cpo = s:save_cpo
|
||||||
|
unlet s:save_cpo
|
||||||
|
|
||||||
|
endif
|
||||||
38
after/indent/typescript.vim
Normal file
38
after/indent/typescript.vim
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
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
|
||||||
|
|
||||||
|
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
|
||||||
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/typescript.vim
|
||||||
|
|
||||||
|
endif
|
||||||
@@ -1,3 +1,5 @@
|
|||||||
|
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'c++11') == -1
|
||||||
|
|
||||||
" Vim syntax file
|
" Vim syntax file
|
||||||
" Language: C Additions
|
" Language: C Additions
|
||||||
" Maintainer: Jon Haggblad <jon@haeggblad.com>
|
" Maintainer: Jon Haggblad <jon@haeggblad.com>
|
||||||
@@ -18,9 +20,34 @@
|
|||||||
" -----------------------------------------------------------------------------
|
" -----------------------------------------------------------------------------
|
||||||
" Highlight function names.
|
" Highlight function names.
|
||||||
" -----------------------------------------------------------------------------
|
" -----------------------------------------------------------------------------
|
||||||
syn match cCustomParen "(" contains=cParen contains=cCppParen
|
if !exists('g:cpp_no_function_highlight')
|
||||||
syn match cCustomFunc "\w\+\s*(\@=" contains=cCustomParen
|
syn match cCustomParen transparent "(" contains=cParen contains=cCppParen
|
||||||
hi def link cCustomFunc Function
|
syn match cCustomFunc "\w\+\s*(\@=" contains=cCustomParen
|
||||||
|
hi def link cCustomFunc Function
|
||||||
|
endif
|
||||||
|
|
||||||
|
" -----------------------------------------------------------------------------
|
||||||
|
" Highlight member variable names.
|
||||||
|
" -----------------------------------------------------------------------------
|
||||||
|
if exists('g:cpp_member_variable_highlight') && g:cpp_member_variable_highlight
|
||||||
|
syn match cCustomDot "\." contained
|
||||||
|
syn match cCustomPtr "->" contained
|
||||||
|
syn match cCustomMemVar "\(\.\|->\)\h\w*" contains=cCustomDot,cCustomPtr
|
||||||
|
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
|
" Source: aftersyntaxc.vim
|
||||||
@@ -72,7 +99,8 @@ syn keyword cAnsiFunction wcstombs mbstowcs wctomb
|
|||||||
syn keyword cAnsiFunction mbtowc mblen lldiv
|
syn keyword cAnsiFunction mbtowc mblen lldiv
|
||||||
syn keyword cAnsiFunction ldiv div llabs
|
syn keyword cAnsiFunction ldiv div llabs
|
||||||
syn keyword cAnsiFunction labs abs qsort
|
syn keyword cAnsiFunction labs abs qsort
|
||||||
syn keyword cAnsiFunction bsearch system getenv
|
"syn keyword cAnsiFunction bsearch system getenv
|
||||||
|
syn keyword cAnsiFunction bsearch getenv
|
||||||
syn keyword cAnsiFunction exit atexit abort
|
syn keyword cAnsiFunction exit atexit abort
|
||||||
syn keyword cAnsiFunction realloc malloc free
|
syn keyword cAnsiFunction realloc malloc free
|
||||||
syn keyword cAnsiFunction calloc srand rand
|
syn keyword cAnsiFunction calloc srand rand
|
||||||
@@ -289,3 +317,5 @@ hi def link cBoolean Boolean
|
|||||||
"hi def link cDelimiter Delimiter
|
"hi def link cDelimiter Delimiter
|
||||||
" foldmethod=syntax fix, courtesy of Ivan Freitas
|
" foldmethod=syntax fix, courtesy of Ivan Freitas
|
||||||
"hi def link cBraces Delimiter
|
"hi def link cBraces Delimiter
|
||||||
|
|
||||||
|
endif
|
||||||
|
|||||||
31
after/syntax/coffee.vim
Normal file
31
after/syntax/coffee.vim
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'cjsx') == -1
|
||||||
|
|
||||||
|
if exists('b:current_syntax')
|
||||||
|
let s:current_syntax=b:current_syntax
|
||||||
|
unlet b:current_syntax
|
||||||
|
endif
|
||||||
|
|
||||||
|
if exists('s:current_syntax')
|
||||||
|
let b:current_syntax=s:current_syntax
|
||||||
|
endif
|
||||||
|
|
||||||
|
syn match cjsxEntity contained "&[^; \t]*;" contains=cjsxEntityPunct
|
||||||
|
syn match cjsxEntityPunct contained "[&.;]"
|
||||||
|
|
||||||
|
syn match cjsxAttribProperty /[A-Za-z_][A-Za-z0-9_-]*/ contained
|
||||||
|
syn region cjsxAttrib start=/\s[A-Za-z_][A-Za-z0-9_-]/hs=s+1 end=/=/ end=/\s[A-Za-z_]/me=e-2 end=+[/>]+me=e-1 contained contains=cjsxAttribProperty
|
||||||
|
|
||||||
|
syn region cjsxBody start=+[^/]>+ms=s+2 start=/>/ms=s+1 end=+<\/+me=e-2 contained contains=cjsxElement,coffeeCurlies,cjsxEntity
|
||||||
|
|
||||||
|
syn region cjsxElement start=/<@\=[A-Za-z_][A-Za-z0-9-_\.]*/ end=/\/>/ end=/<\/@\=[A-Za-z_][A-Za-z0-9-_\.]*>/ contains=cjsxOpenTag,cjsxBody,coffeeCurlies,coffeeString,cjsxAttrib,coffeeNumber,coffeeFloat
|
||||||
|
|
||||||
|
syn cluster coffeeAll add=cjsxElement
|
||||||
|
|
||||||
|
" The default highlighting.
|
||||||
|
hi def link cjsxElement Function
|
||||||
|
hi def link cjsxTagName Function
|
||||||
|
hi def link cjsxEntity Statement
|
||||||
|
hi def link cjsxEntityPunct Type
|
||||||
|
hi def link cjsxAttribProperty Type
|
||||||
|
|
||||||
|
endif
|
||||||
1900
after/syntax/cpp.vim
1900
after/syntax/cpp.vim
File diff suppressed because it is too large
Load Diff
@@ -1,6 +0,0 @@
|
|||||||
" Language: Colorful CSS Color Preview
|
|
||||||
" Author: Aristotle Pagaltzis <pagaltzis@gmx.de>
|
|
||||||
|
|
||||||
if !( has('gui_running') || &t_Co==256 ) | finish | endif
|
|
||||||
|
|
||||||
call css_color#init('css', 'extended', 'cssMediaBlock,cssFunction,cssDefinition,cssAttrRegion,cssComment')
|
|
||||||
@@ -1,13 +0,0 @@
|
|||||||
" Language: CoffeeScript
|
|
||||||
" Maintainer: Sven Felix Oberquelle <Svelix.Github@gmail.com>
|
|
||||||
" URL: http://github.com/kchmck/vim-coffee-script
|
|
||||||
" License: WTFPL
|
|
||||||
|
|
||||||
" Inherit coffee from html so coffeeComment isn't redefined and given higher
|
|
||||||
" priority than hamlInterpolation.
|
|
||||||
syn cluster hamlCoffeescript contains=@htmlCoffeeScript
|
|
||||||
syn region hamlCoffeescriptFilter matchgroup=hamlFilter
|
|
||||||
\ start="^\z(\s*\):coffee\z(script\)\?\s*$"
|
|
||||||
\ end="^\%(\z1 \| *$\)\@!"
|
|
||||||
\ contains=@hamlCoffeeScript,hamlInterpolation
|
|
||||||
\ keepend
|
|
||||||
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,3 +1,5 @@
|
|||||||
|
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'scala') == -1
|
||||||
|
|
||||||
" Extends standard help syntax with highlighting of Scala code.
|
" Extends standard help syntax with highlighting of Scala code.
|
||||||
"
|
"
|
||||||
" Place code between !sc! and !/sc! delimiters. These will be hidden if Vim is
|
" Place code between !sc! and !/sc! delimiters. These will be hidden if Vim is
|
||||||
@@ -12,3 +14,5 @@ if has('conceal')
|
|||||||
else
|
else
|
||||||
syntax region rgnScala matchgroup=Ignore start='!sc!' end='!/sc!' contains=@ScalaCode
|
syntax region rgnScala matchgroup=Ignore start='!sc!' end='!/sc!' contains=@ScalaCode
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
endif
|
||||||
|
|||||||
@@ -1,44 +1,16 @@
|
|||||||
" Language: CoffeeScript
|
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'html5') == -1
|
||||||
" Maintainer: Mick Koch <mick@kochm.co>
|
|
||||||
" URL: http://github.com/kchmck/vim-coffee-script
|
" Vim syntax file
|
||||||
" License: WTFPL
|
" Language: HTML (version 5.1)
|
||||||
|
" Last Change: 2017 Feb 15
|
||||||
|
" License: Public domain
|
||||||
|
" (but let me know if you like :) )
|
||||||
|
"
|
||||||
|
" Maintainer: Kao, Wei-Ko(othree) ( othree AT gmail DOT com )
|
||||||
|
|
||||||
|
" Comment
|
||||||
|
" https://github.com/w3c/html/issues/694
|
||||||
|
syntax region htmlComment start=+<!--+ end=+-->+ contains=@Spell
|
||||||
|
syntax region htmlComment start=+<!DOCTYPE+ keepend end=+>+
|
||||||
|
|
||||||
" Syntax highlighting for text/coffeescript script tags
|
|
||||||
syn include @htmlCoffeeScript syntax/coffee.vim
|
|
||||||
syn region coffeeScript start=#<script [^>]*type="text/coffeescript"[^>]*>#
|
|
||||||
\ end=#</script>#me=s-1 keepend
|
|
||||||
\ contains=@htmlCoffeeScript,htmlScriptTag,@htmlPreproc
|
|
||||||
\ containedin=htmlHead
|
|
||||||
if !exists("g:less_html_style_tags")
|
|
||||||
let g:less_html_style_tags = 1
|
|
||||||
endif
|
endif
|
||||||
|
|
||||||
if !g:less_html_style_tags
|
|
||||||
finish
|
|
||||||
endif
|
|
||||||
|
|
||||||
" Unset (but preserve) so that less will run.
|
|
||||||
if exists("b:current_syntax")
|
|
||||||
let s:pre_less_cur_syn = b:current_syntax
|
|
||||||
unlet b:current_syntax
|
|
||||||
endif
|
|
||||||
|
|
||||||
" Inspired by code from github.com/kchmck/vim-coffee-script
|
|
||||||
" and the html syntax file included with vim 7.4.
|
|
||||||
|
|
||||||
syn include @htmlLess syntax/less.vim
|
|
||||||
|
|
||||||
" We have to explicitly add to htmlHead (containedin) as that region specifies 'contains'.
|
|
||||||
syn region lessStyle start=+<style [^>]*type *=[^>]*text/less[^>]*>+ keepend end=+</style>+ contains=@htmlLess,htmlTag,htmlEndTag,htmlCssStyleComment,@htmlPreproc containedin=htmlHead
|
|
||||||
|
|
||||||
" Reset since 'less' isn't really the current_syntax.
|
|
||||||
if exists("s:pre_less_cur_syn")
|
|
||||||
let b:current_syntax = s:pre_less_cur_syn
|
|
||||||
endif
|
|
||||||
" Language: Colorful CSS Color Preview
|
|
||||||
" Author: Aristotle Pagaltzis <pagaltzis@gmx.de>
|
|
||||||
|
|
||||||
if !( has('gui_running') || &t_Co==256 ) | finish | endif
|
|
||||||
|
|
||||||
" default html syntax should already be including the css syntax
|
|
||||||
syn cluster colorableGroup add=htmlString,htmlCommentPart
|
|
||||||
|
|||||||
82
after/syntax/idris.vim
Normal file
82
after/syntax/idris.vim
Normal file
@@ -0,0 +1,82 @@
|
|||||||
|
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'idris') == -1
|
||||||
|
|
||||||
|
" This script allows for unicode concealing of certain characters
|
||||||
|
" For instance -> goes to →
|
||||||
|
"
|
||||||
|
" It needs vim >= 7.3, set nocompatible, set enc=utf-8
|
||||||
|
"
|
||||||
|
" If you want to turn this on, let g:idris_conceal = 1
|
||||||
|
|
||||||
|
if !exists('g:idris_conceal') || !has('conceal') || &enc != 'utf-8'
|
||||||
|
finish
|
||||||
|
endif
|
||||||
|
|
||||||
|
" vim: set fenc=utf-8:
|
||||||
|
syntax match idrNiceOperator "\\\ze[[:alpha:][:space:]_([]" conceal cchar=λ
|
||||||
|
syntax match idrNiceOperator "<-" conceal cchar=←
|
||||||
|
syntax match idrNiceOperator "->" conceal cchar=→
|
||||||
|
syntax match idrNiceOperator "\<sum\>" conceal cchar=∑
|
||||||
|
syntax match idrNiceOperator "\<product\>" conceal cchar=∏
|
||||||
|
syntax match idrNiceOperator "\<sqrt\>" conceal cchar=√
|
||||||
|
syntax match idrNiceOperator "\<pi\>" conceal cchar=π
|
||||||
|
syntax match idrNiceOperator "==" conceal cchar=≡
|
||||||
|
syntax match idrNiceOperator "\/=" conceal cchar=≠
|
||||||
|
|
||||||
|
|
||||||
|
let s:extraConceal = 1
|
||||||
|
|
||||||
|
let s:doubleArrow = 1
|
||||||
|
" Set this to 0 to use the more technically correct arrow from bar
|
||||||
|
|
||||||
|
" Some windows font don't support some of the characters,
|
||||||
|
" so if they are the main font, we don't load them :)
|
||||||
|
if has("win32")
|
||||||
|
let s:incompleteFont = [ 'Consolas'
|
||||||
|
\ , 'Lucida Console'
|
||||||
|
\ , 'Courier New'
|
||||||
|
\ ]
|
||||||
|
let s:mainfont = substitute( &guifont, '^\([^:,]\+\).*', '\1', '')
|
||||||
|
for s:fontName in s:incompleteFont
|
||||||
|
if s:mainfont ==? s:fontName
|
||||||
|
let s:extraConceal = 0
|
||||||
|
break
|
||||||
|
endif
|
||||||
|
endfor
|
||||||
|
endif
|
||||||
|
|
||||||
|
if s:extraConceal
|
||||||
|
syntax match idrNiceOperator "Void" conceal cchar=⊥
|
||||||
|
|
||||||
|
" Match greater than and lower than w/o messing with Kleisli composition
|
||||||
|
syntax match idrNiceOperator "<=\ze[^<]" conceal cchar=≤
|
||||||
|
syntax match idrNiceOperator ">=\ze[^>]" conceal cchar=≥
|
||||||
|
|
||||||
|
if s:doubleArrow
|
||||||
|
syntax match idrNiceOperator "=>" conceal cchar=⇒
|
||||||
|
else
|
||||||
|
syntax match idrNiceOperator "=>" conceal cchar=↦
|
||||||
|
endif
|
||||||
|
|
||||||
|
syntax match idrNiceOperator "=\zs<<" conceal cchar=«
|
||||||
|
|
||||||
|
syntax match idrNiceOperator "++" conceal cchar=⧺
|
||||||
|
syntax match idrNiceOperator "::" conceal cchar=∷
|
||||||
|
syntax match idrNiceOperator "-<" conceal cchar=↢
|
||||||
|
syntax match idrNiceOperator ">-" conceal cchar=↣
|
||||||
|
syntax match idrNiceOperator "-<<" conceal cchar=⤛
|
||||||
|
syntax match idrNiceOperator ">>-" conceal cchar=⤜
|
||||||
|
|
||||||
|
" Only replace the dot, avoid taking spaces around.
|
||||||
|
syntax match idrNiceOperator /\s\.\s/ms=s+1,me=e-1 conceal cchar=∘
|
||||||
|
syntax match idrNiceOperator "\.\." conceal cchar=‥
|
||||||
|
|
||||||
|
syntax match idrNiceOperator "`elem`" conceal cchar=∈
|
||||||
|
syntax match idrNiceOperator "`notElem`" conceal cchar=∉
|
||||||
|
endif
|
||||||
|
|
||||||
|
hi link idrNiceOperator Operator
|
||||||
|
hi! link Conceal Operator
|
||||||
|
setlocal conceallevel=2
|
||||||
|
|
||||||
|
|
||||||
|
endif
|
||||||
59
after/syntax/javascript.vim
Normal file
59
after/syntax/javascript.vim
Normal file
@@ -0,0 +1,59 @@
|
|||||||
|
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>
|
||||||
|
"
|
||||||
|
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
|
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
|
||||||
|
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 javaScriptBlock
|
||||||
|
\ matchgroup=javaScriptBraces
|
||||||
|
\ start="{"
|
||||||
|
\ end="}"
|
||||||
|
\ contained
|
||||||
|
\ extend
|
||||||
|
\ contains=javaScriptBlock,@javaScriptEmbededExpr,javaScript.*
|
||||||
|
\ fold
|
||||||
|
|
||||||
|
syntax cluster javaScriptEmbededExpr add=jsxRegion,javaScript.*
|
||||||
|
endif
|
||||||
|
|
||||||
|
runtime syntax/jsx_pretty.vim
|
||||||
|
|
||||||
|
let b:current_syntax = 'javascript.jsx'
|
||||||
|
|
||||||
|
let &cpo = s:jsx_cpo
|
||||||
|
unlet s:jsx_cpo
|
||||||
|
|
||||||
|
endif
|
||||||
27
after/syntax/javascript/graphql.vim
Normal file
27
after/syntax/javascript/graphql.vim
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'graphql') == -1
|
||||||
|
|
||||||
|
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,jsTemplateExpression,jsSpecial extend'
|
||||||
|
exec 'syntax match graphqlTaggedTemplate +' . s:tags . '\ze`+ nextgroup=graphqlTemplateString'
|
||||||
|
|
||||||
|
" Support expression interpolation ((${...})) inside template strings.
|
||||||
|
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
|
||||||
|
|
||||||
|
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
|
||||||
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
|
||||||
|
|
||||||
|
" <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,13 +0,0 @@
|
|||||||
" Language: Colorful CSS Color Preview
|
|
||||||
" Author: Aristotle Pagaltzis <pagaltzis@gmx.de>
|
|
||||||
|
|
||||||
if !( has('gui_running') || &t_Co==256 ) | finish | endif
|
|
||||||
|
|
||||||
" variable | property | multiline | end-of-line | plugin
|
|
||||||
" -----------------------+----------------+----------------+-------------+---------
|
|
||||||
" lessCssAttribute | lessCssComment | lessComment | https://github.com/genoma/vim-less
|
|
||||||
" lessAttribute | lessCssComment | lessComment | https://github.com/KohPoll/vim-less
|
|
||||||
" lessVariableValue | lessDefinition | cssComment | lessComment | https://github.com/groenewege/vim-less
|
|
||||||
" lessVariableDefinition | cssDefinition | cssComment | lessComment | https://github.com/lunaru/vim-less
|
|
||||||
|
|
||||||
call css_color#init('css', 'extended', 'lessVariableValue,lessVariableDefinition,lessDefinition,lessCssAttribute,lessAttribute,cssDefinition,cssComment,lessCssComment,lessComment')
|
|
||||||
26
after/syntax/llvm.vim
Normal file
26
after/syntax/llvm.vim
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'llvm') == -1
|
||||||
|
|
||||||
|
" Copyright (c) 2018 rhysd
|
||||||
|
"
|
||||||
|
" 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.
|
||||||
|
|
||||||
|
syn keyword llvmKeyword attributes
|
||||||
|
syn match llvmNoName /#\d\+\>/
|
||||||
|
|
||||||
|
endif
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
" Language: Colorful CSS Color Preview
|
|
||||||
" Author: Aristotle Pagaltzis <pagaltzis@gmx.de>
|
|
||||||
|
|
||||||
if !( has('gui_running') || &t_Co==256 ) | finish | endif
|
|
||||||
|
|
||||||
call css_color#init('hex', 'extended', 'luaComment,luaString')
|
|
||||||
45
after/syntax/mdx.vim
Normal file
45
after/syntax/mdx.vim
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'mdx') == -1
|
||||||
|
|
||||||
|
|
||||||
|
" based on mxw/vim-jsx
|
||||||
|
|
||||||
|
if exists('b:current_syntax')
|
||||||
|
let s:current_syntax=b:current_syntax
|
||||||
|
unlet b:current_syntax
|
||||||
|
endif
|
||||||
|
syn include @XMLSyntax syntax/xml.vim
|
||||||
|
if exists('s:current_syntax')
|
||||||
|
let b:current_syntax=s:current_syntax
|
||||||
|
endif
|
||||||
|
|
||||||
|
" JSX attributes should color as JS. Note the trivial end pattern; we let
|
||||||
|
" jsBlock take care of ending the region.
|
||||||
|
syn region xmlString contained start=+{+ end=++ contains=jsBlock,javascriptBlock
|
||||||
|
|
||||||
|
" JSX child blocks behave just like JSX attributes, except that (a) they are
|
||||||
|
" syntactically distinct, and (b) they need the syn-extend argument, or else
|
||||||
|
" nested XML end-tag patterns may end the outer jsxRegion.
|
||||||
|
syn region jsxChild contained start=+{+ end=++ contains=jsBlock,javascriptBlock
|
||||||
|
\ extend
|
||||||
|
|
||||||
|
" Highlight JSX regions as XML; recursively match.
|
||||||
|
"
|
||||||
|
" Note that we prohibit JSX tags from having a < or word character immediately
|
||||||
|
" preceding it, to avoid conflicts with, respectively, the left shift operator
|
||||||
|
" and generic Flow type annotations (http://flowtype.org/).
|
||||||
|
syn region jsxRegion
|
||||||
|
\ contains=@Spell,@XMLSyntax,jsxRegion,jsxChild,jsBlock,javascriptBlock
|
||||||
|
\ start=+\%(<\|\w\)\@<!<\z([a-zA-Z][a-zA-Z0-9:\-.]*\)+
|
||||||
|
\ skip=+<!--\_.\{-}-->+
|
||||||
|
\ end=+</\z1\_\s\{-}>+
|
||||||
|
\ end=+/>+
|
||||||
|
\ keepend
|
||||||
|
\ extend
|
||||||
|
|
||||||
|
" Add jsxRegion to the lowest-level JS syntax cluster.
|
||||||
|
syn cluster jsExpression add=jsxRegion
|
||||||
|
|
||||||
|
" Allow jsxRegion to contain reserved words.
|
||||||
|
syn cluster javascriptNoReserved add=jsxRegion
|
||||||
|
|
||||||
|
endif
|
||||||
1450
after/syntax/mma.vim
Normal file
1450
after/syntax/mma.vim
Normal file
File diff suppressed because it is too large
Load Diff
@@ -1,6 +0,0 @@
|
|||||||
" Language: Colorful CSS Color Preview
|
|
||||||
" Author: Aristotle Pagaltzis <pagaltzis@gmx.de>
|
|
||||||
|
|
||||||
if !( has('gui_running') || &t_Co==256 ) | finish | endif
|
|
||||||
|
|
||||||
call css_color#init('hex', 'extended', 'moonComment,moonString')
|
|
||||||
23
after/syntax/objc.vim
Normal file
23
after/syntax/objc.vim
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'objc') == -1
|
||||||
|
|
||||||
|
" ARC type modifiers
|
||||||
|
syn keyword objcTypeModifier __bridge __bridge_retained __bridge_transfer __autoreleasing __strong __weak __unsafe_unretained
|
||||||
|
|
||||||
|
" Block modifiers
|
||||||
|
syn keyword objcTypeModifier __block
|
||||||
|
|
||||||
|
" Remote messaging modifiers
|
||||||
|
syn keyword objcTypeModifier byref
|
||||||
|
|
||||||
|
" Property keywords - these are only highlighted inside '@property (...)'
|
||||||
|
syn keyword objcPropertyAttribute contained getter setter readwrite readonly strong weak copy assign retain nonatomic
|
||||||
|
syn match objcProperty display "^\s*@property\>\s*([^)]*)" contains=objcPropertyAttribute
|
||||||
|
|
||||||
|
" The @property directive must be defined after objcProperty or it won't be
|
||||||
|
" highlighted
|
||||||
|
syn match objcDirective "@property\|@synthesize\|@dynamic\|@package"
|
||||||
|
|
||||||
|
" Highlight property attributes as if they were type modifiers
|
||||||
|
hi def link objcPropertyAttribute objcTypeModifier
|
||||||
|
|
||||||
|
endif
|
||||||
4
after/syntax/reason.vim
Normal file
4
after/syntax/reason.vim
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'reason') == -1
|
||||||
|
|
||||||
|
|
||||||
|
endif
|
||||||
@@ -1,3 +1,5 @@
|
|||||||
|
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'rspec') == -1
|
||||||
|
|
||||||
"
|
"
|
||||||
" An rspec syntax file
|
" An rspec syntax file
|
||||||
" Originally from http://www.vim.org/scripts/script.php?script_id=2286
|
" Originally from http://www.vim.org/scripts/script.php?script_id=2286
|
||||||
@@ -30,3 +32,5 @@ syntax keyword rspecMessageExpectation advise any_args any_number_of_times anyth
|
|||||||
highlight link rspecMessageExpectation Function
|
highlight link rspecMessageExpectation Function
|
||||||
|
|
||||||
let b:current_syntax = 'rspec'
|
let b:current_syntax = 'rspec'
|
||||||
|
|
||||||
|
endif
|
||||||
|
|||||||
@@ -1,3 +1,5 @@
|
|||||||
|
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'yard') == -1
|
||||||
|
|
||||||
" Ruby syntax extensions for highlighting YARD documentation.
|
" Ruby syntax extensions for highlighting YARD documentation.
|
||||||
"
|
"
|
||||||
" Author: Joel Holdbrooks <https://github.com/noprompt>
|
" Author: Joel Holdbrooks <https://github.com/noprompt>
|
||||||
@@ -124,3 +126,5 @@ hi def link yardParametricType yardComment
|
|||||||
hi def link yardArrow yardComment
|
hi def link yardArrow yardComment
|
||||||
hi def link yardHashAngle yardComment
|
hi def link yardHashAngle yardComment
|
||||||
hi def link yardHashCurly yardComment
|
hi def link yardHashCurly yardComment
|
||||||
|
|
||||||
|
endif
|
||||||
|
|||||||
@@ -1,10 +1,14 @@
|
|||||||
if !exists('g:rust_conceal') || !has('conceal') || &enc != 'utf-8'
|
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'rust') == -1
|
||||||
finish
|
|
||||||
|
scriptencoding utf-8
|
||||||
|
|
||||||
|
if !get(g:, 'rust_conceal', 0) || !has('conceal') || &encoding !=# 'utf-8'
|
||||||
|
finish
|
||||||
endif
|
endif
|
||||||
|
|
||||||
" For those who don't want to see `::`...
|
" For those who don't want to see `::`...
|
||||||
if exists('g:rust_conceal_mod_path')
|
if get(g:, 'rust_conceal_mod_path', 0)
|
||||||
syn match rustNiceOperator "::" conceal cchar=ㆍ
|
syn match rustNiceOperator "::" conceal cchar=ㆍ
|
||||||
endif
|
endif
|
||||||
|
|
||||||
syn match rustRightArrowHead contained ">" conceal cchar=
|
syn match rustRightArrowHead contained ">" conceal cchar=
|
||||||
@@ -18,7 +22,7 @@ syn match rustNiceOperator "=>" contains=rustFatRightArrowHead,rustFatRightArrow
|
|||||||
syn match rustNiceOperator /\<\@!_\(_*\>\)\@=/ conceal cchar=′
|
syn match rustNiceOperator /\<\@!_\(_*\>\)\@=/ conceal cchar=′
|
||||||
|
|
||||||
" For those who don't want to see `pub`...
|
" For those who don't want to see `pub`...
|
||||||
if exists('g:rust_conceal_pub')
|
if get(g:, 'rust_conceal_pub', 0)
|
||||||
syn match rustPublicSigil contained "pu" conceal cchar=*
|
syn match rustPublicSigil contained "pu" conceal cchar=*
|
||||||
syn match rustPublicRest contained "b" conceal cchar=
|
syn match rustPublicRest contained "b" conceal cchar=
|
||||||
syn match rustNiceOperator "pub " contains=rustPublicSigil,rustPublicRest
|
syn match rustNiceOperator "pub " contains=rustPublicSigil,rustPublicRest
|
||||||
@@ -26,6 +30,16 @@ endif
|
|||||||
|
|
||||||
hi link rustNiceOperator Operator
|
hi link rustNiceOperator Operator
|
||||||
|
|
||||||
if !exists('g:rust_conceal_mod_path')
|
if !get(g:, 'rust_conceal_mod_path', 0)
|
||||||
hi! link Conceal Operator
|
hi! link Conceal Operator
|
||||||
|
|
||||||
|
augroup rust.vim.after
|
||||||
|
autocmd!
|
||||||
|
" And keep it after a colorscheme change
|
||||||
|
autocmd ColorScheme <buffer> hi! link Conceal Operator
|
||||||
|
augroup END
|
||||||
|
endif
|
||||||
|
|
||||||
|
" vim: set et sw=4 sts=4 ts=8:
|
||||||
|
|
||||||
endif
|
endif
|
||||||
|
|||||||
@@ -1,6 +0,0 @@
|
|||||||
" Language: Colorful CSS Color Preview
|
|
||||||
" Author: Aristotle Pagaltzis <pagaltzis@gmx.de>
|
|
||||||
|
|
||||||
if !( has('gui_running') || &t_Co==256 ) | finish | endif
|
|
||||||
|
|
||||||
call css_color#init('css', 'extended', 'sassCssAttribute,sassComment,sassCssComment')
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
" Language: Colorful CSS Color Preview
|
|
||||||
" Author: Aristotle Pagaltzis <pagaltzis@gmx.de>
|
|
||||||
|
|
||||||
if !( has('gui_running') || &t_Co==256 ) | finish | endif
|
|
||||||
|
|
||||||
call css_color#init('css', 'extended', 'scssAttribute,scssComment,scssVariableValue,sassCssAttribute,cssComment')
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
" Language: Colorful CSS Color Preview
|
|
||||||
" Author: Aristotle Pagaltzis <pagaltzis@gmx.de>
|
|
||||||
|
|
||||||
if !( has('gui_running') || &t_Co==256 ) | finish | endif
|
|
||||||
|
|
||||||
call css_color#init('css', 'extended', 'stylusCssAttribute,stylusComment,cssComment')
|
|
||||||
@@ -1,3 +1,5 @@
|
|||||||
|
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'latex') == -1
|
||||||
|
|
||||||
" adds support for cleverref package
|
" adds support for cleverref package
|
||||||
" \Cref, \cref, \cpageref, \labelcref, \labelcpageref
|
" \Cref, \cref, \cpageref, \labelcref, \labelcpageref
|
||||||
syn region texRefZone matchgroup=texStatement start="\\Cref{" end="}\|%stopzone\>" contains=@texRefGroup
|
syn region texRefZone matchgroup=texStatement start="\\Cref{" end="}\|%stopzone\>" contains=@texRefGroup
|
||||||
@@ -7,3 +9,5 @@ syn region texRefZone matchgroup=texStatement start="\\\(label\|\)c\(page\|\)re
|
|||||||
syn region texZone start="\\begin{lstlisting}" end="\\end{lstlisting}\|%stopzone\>"
|
syn region texZone start="\\begin{lstlisting}" end="\\end{lstlisting}\|%stopzone\>"
|
||||||
syn match texInputFile "\\lstinputlisting\s*\(\[.*\]\)\={.\{-}}" contains=texStatement,texInputCurlies,texInputFileOpt
|
syn match texInputFile "\\lstinputlisting\s*\(\[.*\]\)\={.\{-}}" contains=texStatement,texInputCurlies,texInputFileOpt
|
||||||
syn match texZone "\\lstinline\s*\(\[.*\]\)\={.\{-}}"
|
syn match texZone "\\lstinline\s*\(\[.*\]\)\={.\{-}}"
|
||||||
|
|
||||||
|
endif
|
||||||
|
|||||||
28
after/syntax/tsx.vim
Normal file
28
after/syntax/tsx.vim
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'graphql') == -1
|
||||||
|
|
||||||
|
" GraphQL Support
|
||||||
|
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
|
||||||
60
after/syntax/typescript.vim
Normal file
60
after/syntax/typescript.vim
Normal file
@@ -0,0 +1,60 @@
|
|||||||
|
if !exists('g:polyglot_disabled') || !(index(g:polyglot_disabled, 'typescript') != -1 || index(g:polyglot_disabled, 'typescript') != -1 || index(g:polyglot_disabled, 'jsx') != -1)
|
||||||
|
|
||||||
|
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
|
||||||
|
" Vim syntax file
|
||||||
|
"
|
||||||
|
" Language: javascript.jsx
|
||||||
|
" Maintainer: MaxMellon <maxmellon1994@gmail.com>
|
||||||
|
" Depends: leafgarland/typescript-vim
|
||||||
|
"
|
||||||
|
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
|
||||||
|
|
||||||
|
if get(g:, 'vim_jsx_pretty_disable_tsx', 0)
|
||||||
|
finish
|
||||||
|
endif
|
||||||
|
|
||||||
|
let s:jsx_cpo = &cpo
|
||||||
|
set cpo&vim
|
||||||
|
|
||||||
|
syntax case match
|
||||||
|
|
||||||
|
if exists('b:current_syntax')
|
||||||
|
let s:current_syntax = b:current_syntax
|
||||||
|
unlet b:current_syntax
|
||||||
|
endif
|
||||||
|
|
||||||
|
if exists('s:current_syntax')
|
||||||
|
let b:current_syntax = s:current_syntax
|
||||||
|
endif
|
||||||
|
|
||||||
|
" refine the typescript line comment
|
||||||
|
syntax region typescriptLineComment start=+//+ end=/$/ contains=@Spell,typescriptCommentTodo,typescriptRef extend keepend
|
||||||
|
|
||||||
|
for syntax_name in ['tsxRegion', 'tsxFragment']
|
||||||
|
if hlexists(syntax_name)
|
||||||
|
exe 'syntax clear ' . syntax_name
|
||||||
|
endif
|
||||||
|
endfor
|
||||||
|
|
||||||
|
if !hlexists('typescriptTypeCast')
|
||||||
|
" add a typescriptBlock group for typescript
|
||||||
|
syntax region typescriptBlock
|
||||||
|
\ matchgroup=typescriptBraces
|
||||||
|
\ start="{"
|
||||||
|
\ end="}"
|
||||||
|
\ contained
|
||||||
|
\ extend
|
||||||
|
\ contains=@typescriptExpression,typescriptBlock
|
||||||
|
\ fold
|
||||||
|
endif
|
||||||
|
|
||||||
|
syntax cluster typescriptExpression add=jsxRegion,typescriptParens
|
||||||
|
|
||||||
|
runtime syntax/jsx_pretty.vim
|
||||||
|
|
||||||
|
let b:current_syntax = 'typescript.tsx'
|
||||||
|
|
||||||
|
let &cpo = s:jsx_cpo
|
||||||
|
unlet s:jsx_cpo
|
||||||
|
|
||||||
|
endif
|
||||||
26
after/syntax/typescript/graphql.vim
Normal file
26
after/syntax/typescript/graphql.vim
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'graphql') == -1
|
||||||
|
|
||||||
|
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/typescript.vim
|
||||||
|
|
||||||
|
endif
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
" Language: Colorful CSS Color Preview
|
|
||||||
" Author: Aristotle Pagaltzis <pagaltzis@gmx.de>
|
|
||||||
|
|
||||||
if !( has('gui_running') || &t_Co==256 ) | finish | endif
|
|
||||||
|
|
||||||
call css_color#init('hex', 'none', 'vimHiGuiRgb,vimComment,vimLineComment')
|
|
||||||
65
after/syntax/yaml.vim
Normal file
65
after/syntax/yaml.vim
Normal file
@@ -0,0 +1,65 @@
|
|||||||
|
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'yaml') == -1
|
||||||
|
|
||||||
|
" To make this file do stuff, add something like the following (without the
|
||||||
|
" leading ") to your ~/.vimrc:
|
||||||
|
" au BufNewFile,BufRead *.yaml,*.yml so ~/src/PyYaml/YAML.vim
|
||||||
|
|
||||||
|
" Vim syntax/macro file
|
||||||
|
" Language: YAML
|
||||||
|
" Author: Igor Vergeichik <iverg@mail.ru>
|
||||||
|
" Sponsor: Tom Sawyer <transami@transami.net>
|
||||||
|
" Stayven: Ryan King <jking@panoptic.com>
|
||||||
|
" Copyright (c) 2002 Tom Saywer
|
||||||
|
|
||||||
|
" Add an item to a gangly list:
|
||||||
|
"map , o<bs><bs><bs><bs>-<esc>o
|
||||||
|
" Convert to Canonical form:
|
||||||
|
"map \c :%!python -c 'from yaml.redump import redump; import sys; print redump(sys.stdin.read()).rstrip()'
|
||||||
|
|
||||||
|
if version < 600
|
||||||
|
syntax clear
|
||||||
|
endif
|
||||||
|
syntax clear
|
||||||
|
|
||||||
|
syn match yamlInline "[\[\]\{\}]"
|
||||||
|
syn match yamlBlock "[>|]\d\?[+-]"
|
||||||
|
|
||||||
|
syn region yamlComment start="\#" end="$"
|
||||||
|
syn match yamlIndicator "#YAML:\S\+"
|
||||||
|
|
||||||
|
syn region yamlString start="\(^\|\s\|\[\|\,\|\-\)\@<='" end="'" skip="\\'"
|
||||||
|
syn region yamlString start='"' end='"' skip='\\"' contains=yamlEscape
|
||||||
|
syn region yamlString matchgroup=yamlBlock start=/[>|]\s*\n\+\z(\s\+\)\S/rs=s+1 skip=/^\%(\z1\S\|^$\)/ end=/^\z1\@!.*/me=s-1
|
||||||
|
syn region yamlString matchgroup=yamlBlock start=/[>|]\(\d\|[+-]\)\s*\n\+\z(\s\+\)\S/rs=s+2 skip=/^\%(\z1\S\|^$\)/ end=/^\z1\@!.*/me=s-1
|
||||||
|
syn region yamlString matchgroup=yamlBlock start=/[>|]\d\(\d\|[+-]\)\s*\n\+\z(\s\+\)\S/rs=s+3 skip=/^\%(\z1\S\|^$\)/ end=/^\z1\@!.*/me=s-1
|
||||||
|
syn match yamlEscape +\\[abfnrtv'"\\]+ contained
|
||||||
|
syn match yamlEscape "\\\o\o\=\o\=" contained
|
||||||
|
syn match yamlEscape "\\x\x\+" contained
|
||||||
|
|
||||||
|
syn match yamlType "!\S\+"
|
||||||
|
|
||||||
|
syn keyword yamlConstant NULL Null null NONE None none NIL Nil nil
|
||||||
|
syn keyword yamlConstant TRUE True true YES Yes yes ON On on
|
||||||
|
syn keyword yamlConstant FALSE False false NO No no OFF Off off
|
||||||
|
|
||||||
|
syn match yamlKey "^\s*\zs[^ \t\"]\+\ze\s*:"
|
||||||
|
syn match yamlKey "^\s*-\s*\zs[^ \t\"\']\+\ze\s*:"
|
||||||
|
syn match yamlAnchor "&\S\+"
|
||||||
|
syn match yamlAlias "*\S\+"
|
||||||
|
|
||||||
|
" Setup the highlighting links
|
||||||
|
|
||||||
|
hi link yamlConstant Keyword
|
||||||
|
hi link yamlIndicator PreCondit
|
||||||
|
hi link yamlAnchor Function
|
||||||
|
hi link yamlAlias Function
|
||||||
|
hi link yamlKey Identifier
|
||||||
|
hi link yamlType Type
|
||||||
|
|
||||||
|
hi link yamlComment Comment
|
||||||
|
hi link yamlInline Operator
|
||||||
|
hi link yamlBlock Operator
|
||||||
|
hi link yamlString String
|
||||||
|
hi link yamlEscape Special
|
||||||
|
|
||||||
|
endif
|
||||||
654
autoload/LaTeXtoUnicode.vim
Normal file
654
autoload/LaTeXtoUnicode.vim
Normal file
@@ -0,0 +1,654 @@
|
|||||||
|
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'julia') == -1
|
||||||
|
|
||||||
|
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
|
||||||
|
" Support for LaTex-to-Unicode conversion as in the Julia REPL "
|
||||||
|
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
|
||||||
|
|
||||||
|
function! s:L2U_Setup()
|
||||||
|
|
||||||
|
call s:L2U_SetupGlobal()
|
||||||
|
|
||||||
|
" Keep track of whether LaTeX-to-Unicode is activated
|
||||||
|
" (used when filetype changes)
|
||||||
|
if !has_key(b:, "l2u_enabled")
|
||||||
|
let b:l2u_enabled = 0
|
||||||
|
endif
|
||||||
|
|
||||||
|
" Did we install the L2U tab mappings?
|
||||||
|
if !has_key(b:, "l2u_tab_set")
|
||||||
|
let b:l2u_tab_set = 0
|
||||||
|
endif
|
||||||
|
if !has_key(b:, "l2u_cmdtab_set")
|
||||||
|
let b:l2u_cmdtab_set = 0
|
||||||
|
endif
|
||||||
|
if !has_key(b:, "l2u_keymap_set")
|
||||||
|
let b:l2u_keymap_set = 0
|
||||||
|
endif
|
||||||
|
|
||||||
|
" Did we activate the L2U as-you-type substitutions?
|
||||||
|
if !has_key(b:, "l2u_autosub_set")
|
||||||
|
let b:l2u_autosub_set = 0
|
||||||
|
endif
|
||||||
|
|
||||||
|
" Following are some flags used to pass information between the function which
|
||||||
|
" attempts the LaTeX-to-Unicode completion and the fallback function
|
||||||
|
|
||||||
|
" Was a (possibly partial) completion found?
|
||||||
|
let b:l2u_found_completion = 0
|
||||||
|
" Is the cursor just after a single backslash
|
||||||
|
let b:l2u_singlebslash = 0
|
||||||
|
" Backup value of the completeopt settings
|
||||||
|
" (since we temporarily add the 'longest' setting while
|
||||||
|
" attempting LaTeX-to-Unicode)
|
||||||
|
let b:l2u_backup_commpleteopt = &completeopt
|
||||||
|
" Are we in the middle of a L2U tab completion?
|
||||||
|
let b:l2u_tab_completing = 0
|
||||||
|
" Are we calling the tab fallback?
|
||||||
|
let b:l2u_in_fallback = 0
|
||||||
|
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:L2U_SetupGlobal()
|
||||||
|
|
||||||
|
" Initialization of global and script-local variables
|
||||||
|
" is only performed once
|
||||||
|
if get(g:, "l2u_did_global_setup", 0)
|
||||||
|
return
|
||||||
|
endif
|
||||||
|
|
||||||
|
let g:l2u_did_global_setup = 1
|
||||||
|
|
||||||
|
let g:l2u_symbols_dict = julia_latex_symbols#get_dict()
|
||||||
|
|
||||||
|
call s:L2U_deprecated_options()
|
||||||
|
|
||||||
|
if v:version < 704
|
||||||
|
let g:latex_to_unicode_tab = 0
|
||||||
|
let g:latex_to_unicode_auto = 0
|
||||||
|
endif
|
||||||
|
|
||||||
|
" YouCompleteMe and neocomplcache/neocomplete/deoplete plug-ins do not work well
|
||||||
|
" with LaTeX symbols suggestions
|
||||||
|
if exists("g:loaded_youcompleteme") ||
|
||||||
|
\ exists("g:loaded_neocomplcache") ||
|
||||||
|
\ exists("g:loaded_neocomplete") ||
|
||||||
|
\ exists("g:loaded_deoplete")
|
||||||
|
let g:latex_to_unicode_suggestions = 0
|
||||||
|
endif
|
||||||
|
|
||||||
|
" A hack to forcibly get out of completion mode: feed
|
||||||
|
" this string with feedkeys()
|
||||||
|
if has("win32") || has("win64")
|
||||||
|
let s:l2u_esc_sequence = "\u0006"
|
||||||
|
else
|
||||||
|
let s:l2u_esc_sequence = "\u0091\b"
|
||||||
|
end
|
||||||
|
|
||||||
|
" Trigger for the previous mapping of <Tab>
|
||||||
|
let s:l2u_fallback_trigger = "\u0091L2UFallbackTab"
|
||||||
|
|
||||||
|
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()
|
||||||
|
|
||||||
|
" 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()
|
||||||
|
else
|
||||||
|
return
|
||||||
|
endif
|
||||||
|
elseif !b:l2u_enabled
|
||||||
|
call LaTeXtoUnicode#Enable()
|
||||||
|
endif
|
||||||
|
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! LaTeXtoUnicode#Enable()
|
||||||
|
|
||||||
|
if b:l2u_enabled
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
call s:L2U_ResetLastCompletionInfo()
|
||||||
|
|
||||||
|
let b:l2u_enabled = 1
|
||||||
|
|
||||||
|
" 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
|
||||||
|
" the autocmd triggered by InsertEnter, defined in /ftdetect.vim.
|
||||||
|
" 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
|
||||||
|
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! LaTeXtoUnicode#Disable()
|
||||||
|
if !b:l2u_enabled
|
||||||
|
return
|
||||||
|
endif
|
||||||
|
let b:l2u_enabled = 0
|
||||||
|
call LaTeXtoUnicode#Init()
|
||||||
|
return
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" Translate old options to their new equivalents
|
||||||
|
function! s:L2U_deprecated_options()
|
||||||
|
for [new, old] in [["latex_to_unicode_tab", "julia_latex_to_unicode"],
|
||||||
|
\ ["latex_to_unicode_auto", "julia_auto_latex_to_unicode"],
|
||||||
|
\ ["latex_to_unicode_suggestions", "julia_latex_suggestions_enabled"],
|
||||||
|
\ ["latex_to_unicode_eager", "julia_latex_to_unicode_eager"]]
|
||||||
|
if !has_key(g:, new) && has_key(g:, old)
|
||||||
|
exec "let g:" . new . " = g:" . old
|
||||||
|
endif
|
||||||
|
endfor
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:L2U_file_type_regex(ft)
|
||||||
|
if type(a:ft) == 3
|
||||||
|
let file_types = "\\%(" . join(a:ft, "\\|") . "\\)"
|
||||||
|
elseif type(a:ft) == 1
|
||||||
|
let file_types = a:ft
|
||||||
|
else
|
||||||
|
echoerr "invalid file_type specification"
|
||||||
|
endif
|
||||||
|
return "^" . file_types . "$"
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" Some data used to keep track of the previous completion attempt.
|
||||||
|
" Used to detect
|
||||||
|
" 1) if we just attempted the same completion, or
|
||||||
|
" 2) if backspace was just pressed while completing
|
||||||
|
" This function initializes and resets the required info
|
||||||
|
|
||||||
|
function! s:L2U_ResetLastCompletionInfo()
|
||||||
|
let b:l2u_completed_once = 0
|
||||||
|
let b:l2u_bs_while_completing = 0
|
||||||
|
let b:l2u_last_compl = {
|
||||||
|
\ 'line': '',
|
||||||
|
\ 'col0': -1,
|
||||||
|
\ 'col1': -1,
|
||||||
|
\ }
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" This function only detects whether an exact match is found for a LaTeX
|
||||||
|
" symbol in front of the cursor
|
||||||
|
function! s:L2U_ismatch()
|
||||||
|
let col1 = col('.')
|
||||||
|
let l = getline('.')
|
||||||
|
let col0 = match(l[0:col1-2], '\\[^[:space:]\\]\+$')
|
||||||
|
if col0 == -1
|
||||||
|
return 0
|
||||||
|
endif
|
||||||
|
let base = l[col0 : col1-1]
|
||||||
|
return has_key(g:l2u_symbols_dict, base)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" Helper function to sort suggestion entries
|
||||||
|
function! s:L2U_partmatches_sort(p1, p2)
|
||||||
|
return a:p1.word > a:p2.word ? 1 : a:p1.word < a:p2.word ? -1 : 0
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" Helper function to fix display of Unicode compose characters
|
||||||
|
" in the suggestions menu (they are displayed on top of '◌')
|
||||||
|
function! s:L2U_fix_compose_chars(uni)
|
||||||
|
let u = matchstr(a:uni, '^.')
|
||||||
|
let isc = ("\u0300" <= u && u <= "\u036F") ||
|
||||||
|
\ ("\u1DC0" <= u && u <= "\u1DFF") ||
|
||||||
|
\ ("\u20D0" <= u && u <= "\u20FF") ||
|
||||||
|
\ ("\uFE20" <= u && u <= "\uFE2F")
|
||||||
|
return isc ? "\u25CC" . a:uni : a:uni
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" Helper function to find the longest common prefix among
|
||||||
|
" partial completion matches (used when suggestions are disabled
|
||||||
|
" and in command line mode)
|
||||||
|
function! s:L2U_longest_common_prefix(partmatches)
|
||||||
|
let common = a:partmatches[0]
|
||||||
|
for i in range(1, len(a:partmatches)-1)
|
||||||
|
let p = a:partmatches[i]
|
||||||
|
if len(p) < len(common)
|
||||||
|
let common = common[0 : len(p)-1]
|
||||||
|
endif
|
||||||
|
for j in range(1, len(common)-1)
|
||||||
|
if p[j] != common[j]
|
||||||
|
let common = common[0 : j-1]
|
||||||
|
break
|
||||||
|
endif
|
||||||
|
endfor
|
||||||
|
endfor
|
||||||
|
return common
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" Omnicompletion function. Besides the usual two-stage omnifunc behaviour,
|
||||||
|
" it has the following peculiar features:
|
||||||
|
" *) keeps track of the previous completion attempt
|
||||||
|
" *) sets some info to be used by the fallback function
|
||||||
|
" *) either returns a list of completions if a partial match is found, or a
|
||||||
|
" Unicode char if an exact match is found
|
||||||
|
" *) forces its way out of completion mode through a hack in some cases
|
||||||
|
function! LaTeXtoUnicode#omnifunc(findstart, base)
|
||||||
|
if a:findstart
|
||||||
|
" first stage
|
||||||
|
" avoid infinite loop if the fallback happens to call omnicompletion
|
||||||
|
if b:l2u_in_fallback
|
||||||
|
let b:l2u_in_fallback = 0
|
||||||
|
return -3
|
||||||
|
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('.')
|
||||||
|
let l = getline('.')
|
||||||
|
let col0 = match(l[0:col1-2], '\\[^[:space:]\\]\+$')
|
||||||
|
" compare with previous completion attempt
|
||||||
|
let b:l2u_bs_while_completing = 0
|
||||||
|
let b:l2u_completed_once = 0
|
||||||
|
if col0 == b:l2u_last_compl['col0']
|
||||||
|
let prevl = b:l2u_last_compl['line']
|
||||||
|
if col1 == b:l2u_last_compl['col1'] && l ==# prevl
|
||||||
|
let b:l2u_completed_once = 1
|
||||||
|
elseif col1 == b:l2u_last_compl['col1'] - 1 && l ==# prevl[0 : col1-2] . prevl[col1 : -1]
|
||||||
|
let b:l2u_bs_while_completing = 1
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
" store completion info for next attempt
|
||||||
|
let b:l2u_last_compl['col0'] = col0
|
||||||
|
let b:l2u_last_compl['col1'] = col1
|
||||||
|
let b:l2u_last_compl['line'] = l
|
||||||
|
" is the cursor right after a backslash?
|
||||||
|
let b:l2u_singlebslash = (match(l[0:col1-2], '\\$') >= 0)
|
||||||
|
" completion not found
|
||||||
|
if col0 == -1
|
||||||
|
let b:l2u_found_completion = 0
|
||||||
|
call feedkeys(s:l2u_esc_sequence, 'n')
|
||||||
|
let col0 = -2
|
||||||
|
endif
|
||||||
|
return col0
|
||||||
|
else
|
||||||
|
" read settings (eager mode is implicit when suggestions are disabled)
|
||||||
|
let suggestions = get(g:, "latex_to_unicode_suggestions", 1)
|
||||||
|
let eager = get(g:, "latex_to_unicode_eager", 1) || !suggestions
|
||||||
|
" search for matches
|
||||||
|
let partmatches = []
|
||||||
|
let exact_match = 0
|
||||||
|
for k in keys(g:l2u_symbols_dict)
|
||||||
|
if k ==# a:base
|
||||||
|
let exact_match = 1
|
||||||
|
endif
|
||||||
|
if len(k) >= len(a:base) && k[0 : len(a:base)-1] ==# a:base
|
||||||
|
let menu = s:L2U_fix_compose_chars(g:l2u_symbols_dict[k])
|
||||||
|
if suggestions
|
||||||
|
call add(partmatches, {'word': k, 'menu': menu})
|
||||||
|
else
|
||||||
|
call add(partmatches, k)
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
endfor
|
||||||
|
" exact matches are replaced with Unicode
|
||||||
|
" exceptions:
|
||||||
|
" *) we reached an exact match by pressing backspace while completing
|
||||||
|
" *) the exact match is one among many, and the eager setting is
|
||||||
|
" disabled, and it's the first time this completion is attempted
|
||||||
|
if exact_match && !b:l2u_bs_while_completing && (len(partmatches) == 1 || eager || b:l2u_completed_once)
|
||||||
|
" the completion is successful: reset the last completion info...
|
||||||
|
call s:L2U_ResetLastCompletionInfo()
|
||||||
|
" ...force our way out of completion mode...
|
||||||
|
call feedkeys(s:l2u_esc_sequence, 'n')
|
||||||
|
" ...return the Unicode symbol
|
||||||
|
return [g:l2u_symbols_dict[a:base]]
|
||||||
|
endif
|
||||||
|
if !empty(partmatches)
|
||||||
|
" here, only partial matches were found; either keep just the longest
|
||||||
|
" common prefix, or pass them on
|
||||||
|
if !suggestions
|
||||||
|
let partmatches = [s:L2U_longest_common_prefix(partmatches)]
|
||||||
|
else
|
||||||
|
call sort(partmatches, "s:L2U_partmatches_sort")
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
if empty(partmatches)
|
||||||
|
call feedkeys(s:l2u_esc_sequence, 'n')
|
||||||
|
let b:l2u_found_completion = 0
|
||||||
|
endif
|
||||||
|
return partmatches
|
||||||
|
endif
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! LaTeXtoUnicode#PutLiteral(k)
|
||||||
|
call feedkeys(a:k, 'ni')
|
||||||
|
return ''
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" Function which saves the current insert-mode mapping of a key sequence `s`
|
||||||
|
" and associates it with another key sequence `k` (e.g. stores the current
|
||||||
|
" <Tab> mapping into the Fallback trigger)
|
||||||
|
function! s:L2U_SetFallbackMapping(s, k)
|
||||||
|
let mmdict = maparg(a:s, 'i', 0, 1)
|
||||||
|
if empty(mmdict)
|
||||||
|
exe 'inoremap <buffer> ' . a:k . ' ' . a:s
|
||||||
|
return
|
||||||
|
endif
|
||||||
|
let rhs = mmdict["rhs"]
|
||||||
|
if rhs =~# '^<Plug>L2U'
|
||||||
|
return
|
||||||
|
endif
|
||||||
|
let pre = '<buffer>'
|
||||||
|
if mmdict["silent"]
|
||||||
|
let pre = pre . '<silent>'
|
||||||
|
endif
|
||||||
|
if mmdict["expr"]
|
||||||
|
let pre = pre . '<expr>'
|
||||||
|
endif
|
||||||
|
if mmdict["noremap"]
|
||||||
|
let cmd = 'inoremap '
|
||||||
|
else
|
||||||
|
let cmd = 'imap '
|
||||||
|
" This is a nasty hack used to prevent infinite recursion. It's not a
|
||||||
|
" general solution.
|
||||||
|
if mmdict["expr"]
|
||||||
|
let rhs = substitute(rhs, '\c' . a:s, "\<C-R>=LaTeXtoUnicode#PutLiteral('" . a:s . "')\<CR>", 'g')
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
exe cmd . pre . ' ' . a:k . ' ' . rhs
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" This is the function which is mapped to <Tab>
|
||||||
|
function! LaTeXtoUnicode#Tab()
|
||||||
|
" the <Tab> is passed through to the fallback mapping if the completion
|
||||||
|
" menu is present, and it hasn't been raised by the L2U tab, and there
|
||||||
|
" isn't an exact match before the cursor when suggestions are disabled
|
||||||
|
if pumvisible() && !b:l2u_tab_completing && (get(g:, "latex_to_unicode_suggestions", 1) || !s:L2U_ismatch())
|
||||||
|
call feedkeys(s:l2u_fallback_trigger)
|
||||||
|
return ''
|
||||||
|
endif
|
||||||
|
" reset the in_fallback info
|
||||||
|
let b:l2u_in_fallback = 0
|
||||||
|
" 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
|
||||||
|
let b:l2u_backup_commpleteopt = &completeopt
|
||||||
|
set completeopt+=longest
|
||||||
|
set completeopt-=noinsert
|
||||||
|
" invoke omnicompletion; failure to perform LaTeX-to-Unicode completion is
|
||||||
|
" handled by the CompleteDone autocommand.
|
||||||
|
return "\<C-X>\<C-O>"
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" This function is called at every CompleteDone event, and is meant to handle
|
||||||
|
" the failures of LaTeX-to-Unicode completion by calling a fallback
|
||||||
|
function! LaTeXtoUnicode#FallbackCallback()
|
||||||
|
if !b:l2u_tab_completing
|
||||||
|
" completion was not initiated by L2U, nothing to do
|
||||||
|
return
|
||||||
|
else
|
||||||
|
" completion was initiated by L2U, restore completeopt
|
||||||
|
let &completeopt = b:l2u_backup_commpleteopt
|
||||||
|
endif
|
||||||
|
" at this point L2U tab completion is over
|
||||||
|
let b:l2u_tab_completing = 0
|
||||||
|
" if the completion was successful do nothing
|
||||||
|
if b:l2u_found_completion == 1 || b:l2u_singlebslash == 1
|
||||||
|
return
|
||||||
|
endif
|
||||||
|
" fallback
|
||||||
|
let b:l2u_in_fallback = 1
|
||||||
|
call feedkeys(s:l2u_fallback_trigger)
|
||||||
|
return
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" This is the function that performs the substitution in command-line mode
|
||||||
|
function! LaTeXtoUnicode#CmdTab(triggeredbytab)
|
||||||
|
" first stage
|
||||||
|
" analyse command line
|
||||||
|
let col1 = getcmdpos() - 1
|
||||||
|
let l = getcmdline()
|
||||||
|
let col0 = match(l[0:col1-1], '\\[^[:space:]\\]\+$')
|
||||||
|
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>
|
||||||
|
endif
|
||||||
|
return l
|
||||||
|
endif
|
||||||
|
let base = l[col0 : col1-1]
|
||||||
|
" search for matches
|
||||||
|
let partmatches = []
|
||||||
|
let exact_match = 0
|
||||||
|
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
|
||||||
|
call add(partmatches, k)
|
||||||
|
endif
|
||||||
|
endfor
|
||||||
|
if len(partmatches) == 0
|
||||||
|
if a:triggeredbytab
|
||||||
|
call feedkeys("\<Tab>", 'nt') " fall-back to the default <Tab>
|
||||||
|
endif
|
||||||
|
return l
|
||||||
|
endif
|
||||||
|
" exact matches are replaced with Unicode
|
||||||
|
if exact_match
|
||||||
|
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]
|
||||||
|
else
|
||||||
|
let pre = ''
|
||||||
|
endif
|
||||||
|
let posdiff = col1-col0 - len(common)
|
||||||
|
call setcmdpos(col1 - posdiff + 1)
|
||||||
|
return pre . common . l[col1 : -1]
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" Setup the L2U tab mapping
|
||||||
|
function! s:L2U_SetTab(wait_insert_enter)
|
||||||
|
if !b:l2u_cmdtab_set && get(g:, "latex_to_unicode_tab", 1) && b:l2u_enabled
|
||||||
|
let b:l2u_cmdtab_keys = get(g:, "latex_to_unicode_cmd_mapping", ['<Tab>','<S-Tab>'])
|
||||||
|
if type(b:l2u_cmdtab_keys) != type([]) " avoid using v:t_list for backward compatibility
|
||||||
|
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>'
|
||||||
|
endfor
|
||||||
|
let b:l2u_cmdtab_set = 1
|
||||||
|
endif
|
||||||
|
if b:l2u_tab_set
|
||||||
|
return
|
||||||
|
endif
|
||||||
|
" g:did_insert_enter is set from an autocommand in ftdetect
|
||||||
|
if a:wait_insert_enter && !get(g:, "did_insert_enter", 0)
|
||||||
|
return
|
||||||
|
endif
|
||||||
|
if !get(g:, "latex_to_unicode_tab", 1) || !b:l2u_enabled
|
||||||
|
return
|
||||||
|
endif
|
||||||
|
|
||||||
|
" Backup the previous omnifunc (the check is probably not really needed)
|
||||||
|
if get(b:, "prev_omnifunc", "") != "LaTeXtoUnicode#omnifunc"
|
||||||
|
let b:prev_omnifunc = &omnifunc
|
||||||
|
endif
|
||||||
|
setlocal omnifunc=LaTeXtoUnicode#omnifunc
|
||||||
|
|
||||||
|
call s:L2U_SetFallbackMapping('<Tab>', s:l2u_fallback_trigger)
|
||||||
|
imap <buffer> <Tab> <Plug>L2UTab
|
||||||
|
inoremap <buffer><expr> <Plug>L2UTab LaTeXtoUnicode#Tab()
|
||||||
|
|
||||||
|
augroup L2UTab
|
||||||
|
autocmd! * <buffer>
|
||||||
|
" Every time a completion finishes, the fallback may be invoked
|
||||||
|
autocmd CompleteDone <buffer> call LaTeXtoUnicode#FallbackCallback()
|
||||||
|
augroup END
|
||||||
|
|
||||||
|
let b:l2u_tab_set = 1
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" Revert the LaTeX-to-Unicode tab mapping settings
|
||||||
|
function! s:L2U_UnsetTab()
|
||||||
|
if b:l2u_cmdtab_set
|
||||||
|
for k in b:l2u_cmdtab_keys
|
||||||
|
exec 'cunmap <buffer> '.k
|
||||||
|
endfor
|
||||||
|
let b:l2u_cmdtab_set = 0
|
||||||
|
endif
|
||||||
|
if !b:l2u_tab_set
|
||||||
|
return
|
||||||
|
endif
|
||||||
|
exec "setlocal omnifunc=" . get(b:, "prev_omnifunc", "")
|
||||||
|
iunmap <buffer> <Tab>
|
||||||
|
if empty(maparg("<Tab>", "i"))
|
||||||
|
call s:L2U_SetFallbackMapping(s:l2u_fallback_trigger, '<Tab>')
|
||||||
|
endif
|
||||||
|
iunmap <buffer> <Plug>L2UTab
|
||||||
|
exe 'iunmap <buffer> ' . s:l2u_fallback_trigger
|
||||||
|
augroup L2UTab
|
||||||
|
autocmd! * <buffer>
|
||||||
|
augroup END
|
||||||
|
let b:l2u_tab_set = 0
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" Function which looks for viable LaTeX-to-Unicode supstitutions as you type
|
||||||
|
function! LaTeXtoUnicode#AutoSub(...)
|
||||||
|
let vc = a:0 == 0 ? v:char : a:1
|
||||||
|
let col1 = col('.')
|
||||||
|
let lnum = line('.')
|
||||||
|
if col1 == 1
|
||||||
|
if a:0 > 1
|
||||||
|
call feedkeys(a:2, 'n')
|
||||||
|
endif
|
||||||
|
return ''
|
||||||
|
endif
|
||||||
|
let bs = (vc != "\n")
|
||||||
|
let l = getline(lnum)[0 : col1-1-bs] . v:char
|
||||||
|
let col0 = match(l, '\\\%([_^]\?[A-Za-z]\+\%' . col1 . 'c\%([^A-Za-z]\|$\)\|[_^]\%([0-9()=+-]\)\%' . col1 .'c\%(.\|$\)\)')
|
||||||
|
if col0 == -1
|
||||||
|
if a:0 > 1
|
||||||
|
call feedkeys(a:2, 'n')
|
||||||
|
endif
|
||||||
|
return ''
|
||||||
|
endif
|
||||||
|
let base = l[col0 : -1-bs]
|
||||||
|
let unicode = get(g:l2u_symbols_dict, base, '')
|
||||||
|
if empty(unicode)
|
||||||
|
if a:0 > 1
|
||||||
|
call feedkeys(a:2, 'n')
|
||||||
|
endif
|
||||||
|
return ''
|
||||||
|
endif
|
||||||
|
call feedkeys("\<C-G>u", 'n')
|
||||||
|
call feedkeys(repeat("\b", len(base) + bs) . unicode . vc . s:l2u_esc_sequence, 'nt')
|
||||||
|
call feedkeys("\<C-G>u", 'n')
|
||||||
|
return ''
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" Setup the auto as-you-type LaTeX-to-Unicode substitution
|
||||||
|
function! s:L2U_SetAutoSub(wait_insert_enter)
|
||||||
|
if b:l2u_autosub_set
|
||||||
|
return
|
||||||
|
endif
|
||||||
|
" g:did_insert_enter is set from an autocommand in ftdetect
|
||||||
|
if a:wait_insert_enter && !get(g:, "did_insert_enter", 0)
|
||||||
|
return
|
||||||
|
endif
|
||||||
|
if !get(g:, "latex_to_unicode_auto", 0) || !b:l2u_enabled
|
||||||
|
return
|
||||||
|
endif
|
||||||
|
" Viable substitutions are searched at every character insertion via the
|
||||||
|
" autocmd InsertCharPre. The <Enter> key does not seem to be catched in
|
||||||
|
" this way though, so we use a mapping for that case.
|
||||||
|
imap <buffer> <CR> <Plug>L2UAutoSub
|
||||||
|
inoremap <buffer><expr> <Plug>L2UAutoSub LaTeXtoUnicode#AutoSub("\n", "\<CR>")
|
||||||
|
|
||||||
|
augroup L2UAutoSub
|
||||||
|
autocmd! * <buffer>
|
||||||
|
autocmd InsertCharPre <buffer> call LaTeXtoUnicode#AutoSub()
|
||||||
|
augroup END
|
||||||
|
|
||||||
|
let b:l2u_autosub_set = 1
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" Revert the auto LaTeX-to-Unicode settings
|
||||||
|
function! s:L2U_UnsetAutoSub()
|
||||||
|
if !b:l2u_autosub_set
|
||||||
|
return
|
||||||
|
endif
|
||||||
|
|
||||||
|
iunmap <buffer> <CR>
|
||||||
|
iunmap <buffer> <Plug>L2UAutoSub
|
||||||
|
augroup L2UAutoSub
|
||||||
|
autocmd! * <buffer>
|
||||||
|
augroup END
|
||||||
|
let b:l2u_autosub_set = 0
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:L2U_SetKeymap()
|
||||||
|
if !b:l2u_keymap_set && get(g:, "latex_to_unicode_keymap", 0) && b:l2u_enabled
|
||||||
|
setlocal keymap=latex2unicode
|
||||||
|
let b:l2u_keymap_set = 1
|
||||||
|
endif
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:L2U_UnsetKeymap()
|
||||||
|
if !b:l2u_keymap_set
|
||||||
|
return
|
||||||
|
endif
|
||||||
|
setlocal keymap=
|
||||||
|
let b:l2u_keymap_set = 0
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" Initialization. Can be used to re-init when global settings have changed.
|
||||||
|
function! LaTeXtoUnicode#Init(...)
|
||||||
|
let wait_insert_enter = a:0 > 0 ? a:1 : 1
|
||||||
|
|
||||||
|
if !wait_insert_enter
|
||||||
|
augroup L2UInit
|
||||||
|
autocmd!
|
||||||
|
augroup END
|
||||||
|
endif
|
||||||
|
|
||||||
|
call s:L2U_UnsetTab()
|
||||||
|
call s:L2U_UnsetAutoSub()
|
||||||
|
call s:L2U_UnsetKeymap()
|
||||||
|
|
||||||
|
call s:L2U_SetTab(wait_insert_enter)
|
||||||
|
call s:L2U_SetAutoSub(wait_insert_enter)
|
||||||
|
call s:L2U_SetKeymap()
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! LaTeXtoUnicode#Toggle()
|
||||||
|
call s:L2U_Setup()
|
||||||
|
if b:l2u_enabled
|
||||||
|
call LaTeXtoUnicode#Disable()
|
||||||
|
echo "LaTeX-to-Unicode disabled"
|
||||||
|
else
|
||||||
|
call LaTeXtoUnicode#Enable()
|
||||||
|
echo "LaTeX-to-Unicode enabled"
|
||||||
|
endif
|
||||||
|
return
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
endif
|
||||||
66
autoload/RstFold.vim
Normal file
66
autoload/RstFold.vim
Normal file
@@ -0,0 +1,66 @@
|
|||||||
|
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
|
||||||
|
" Last Modified: 2018-12-29
|
||||||
|
|
||||||
|
function s:CacheRstFold()
|
||||||
|
if !g:rst_fold_enabled
|
||||||
|
return
|
||||||
|
endif
|
||||||
|
|
||||||
|
let closure = {'header_types': {}, 'max_level': 0, 'levels': {}}
|
||||||
|
function closure.Process(match) dict
|
||||||
|
let curline = getcurpos()[1]
|
||||||
|
if has_key(self.levels, curline - 1)
|
||||||
|
" For over+under-lined headers, the regex will match both at the
|
||||||
|
" overline and at the title itself; in that case, skip the second match.
|
||||||
|
return
|
||||||
|
endif
|
||||||
|
let lines = split(a:match, '\n')
|
||||||
|
let key = repeat(lines[-1][0], len(lines))
|
||||||
|
if !has_key(self.header_types, key)
|
||||||
|
let self.max_level += 1
|
||||||
|
let self.header_types[key] = self.max_level
|
||||||
|
endif
|
||||||
|
let self.levels[curline] = self.header_types[key]
|
||||||
|
endfunction
|
||||||
|
let save_cursor = getcurpos()
|
||||||
|
let save_mark = getpos("'[")
|
||||||
|
silent keeppatterns %s/\v^%(%(([=`:.'"~^_*+#-])\1+\n)?.{1,2}\n([=`:.'"~^_*+#-])\2+)|%(%(([=`:.''"~^_*+#-])\3{2,}\n)?.{3,}\n([=`:.''"~^_*+#-])\4{2,})$/\=closure.Process(submatch(0))/gn
|
||||||
|
call setpos('.', save_cursor)
|
||||||
|
call setpos("'[", save_mark)
|
||||||
|
let b:RstFoldCache = closure.levels
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function RstFold#GetRstFold()
|
||||||
|
if !g:rst_fold_enabled
|
||||||
|
return
|
||||||
|
endif
|
||||||
|
|
||||||
|
if !has_key(b:, 'RstFoldCache')
|
||||||
|
call s:CacheRstFold()
|
||||||
|
endif
|
||||||
|
if has_key(b:RstFoldCache, v:lnum)
|
||||||
|
return '>' . b:RstFoldCache[v:lnum]
|
||||||
|
else
|
||||||
|
return '='
|
||||||
|
endif
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function RstFold#GetRstFoldText()
|
||||||
|
if !g:rst_fold_enabled
|
||||||
|
return
|
||||||
|
endif
|
||||||
|
|
||||||
|
if !has_key(b:, 'RstFoldCache')
|
||||||
|
call s:CacheRstFold()
|
||||||
|
endif
|
||||||
|
let indent = repeat(' ', b:RstFoldCache[v:foldstart] - 1)
|
||||||
|
let thisline = getline(v:foldstart)
|
||||||
|
" For over+under-lined headers, skip the overline.
|
||||||
|
let text = thisline =~ '^\([=`:.''"~^_*+#-]\)\1\+$' ? getline(v:foldstart + 1) : thisline
|
||||||
|
return indent . text
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
endif
|
||||||
129
autoload/cargo.vim
Normal file
129
autoload/cargo.vim
Normal file
@@ -0,0 +1,129 @@
|
|||||||
|
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'rust') == -1
|
||||||
|
|
||||||
|
function! cargo#Load()
|
||||||
|
" Utility call to get this script loaded, for debugging
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! cargo#cmd(args)
|
||||||
|
" Trim trailing spaces. This is necessary since :terminal command parses
|
||||||
|
" trailing spaces as an empty argument.
|
||||||
|
let args = substitute(a:args, '\s\+$', '', '')
|
||||||
|
if 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
|
||||||
|
" If the second argument is not specified, the first argument determines
|
||||||
|
" whether we will start from the current directory or the directory of the
|
||||||
|
" current buffer, otherwise, we start with the provided path on the
|
||||||
|
" second argument.
|
||||||
|
|
||||||
|
let l:is_getcwd = get(a:, 1, 0)
|
||||||
|
if l:is_getcwd
|
||||||
|
let l:starting_path = get(a:, 2, getcwd())
|
||||||
|
else
|
||||||
|
let l:starting_path = get(a:, 2, expand('%:p:h'))
|
||||||
|
endif
|
||||||
|
|
||||||
|
return findfile('Cargo.toml', l:starting_path . ';')
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! cargo#nearestCargo(is_getcwd) abort
|
||||||
|
return s:nearest_cargo(a:is_getcwd)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! cargo#nearestWorkspaceCargo(is_getcwd) abort
|
||||||
|
let l:nearest = s:nearest_cargo(a:is_getcwd)
|
||||||
|
while l:nearest !=# ''
|
||||||
|
for l:line in readfile(l:nearest, '', 0x100)
|
||||||
|
if l:line =~# '\V[workspace]'
|
||||||
|
return l:nearest
|
||||||
|
endif
|
||||||
|
endfor
|
||||||
|
let l:next = fnamemodify(l:nearest, ':p:h:h')
|
||||||
|
let l:nearest = s:nearest_cargo(0, l:next)
|
||||||
|
endwhile
|
||||||
|
return ''
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! cargo#nearestRootCargo(is_getcwd) abort
|
||||||
|
" Try to find a workspace Cargo.toml, and if not found, take the nearest
|
||||||
|
" regular Cargo.toml
|
||||||
|
let l:workspace_cargo = cargo#nearestWorkspaceCargo(a:is_getcwd)
|
||||||
|
if l:workspace_cargo !=# ''
|
||||||
|
return l:workspace_cargo
|
||||||
|
endif
|
||||||
|
return s:nearest_cargo(a:is_getcwd)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
|
||||||
|
function! cargo#build(args)
|
||||||
|
call cargo#cmd("build " . a:args)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! cargo#clean(args)
|
||||||
|
call cargo#cmd("clean " . a:args)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! cargo#doc(args)
|
||||||
|
call cargo#cmd("doc " . a:args)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! cargo#new(args)
|
||||||
|
call cargo#cmd("new " . a:args)
|
||||||
|
cd `=a:args`
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! cargo#init(args)
|
||||||
|
call cargo#cmd("init " . a:args)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! cargo#run(args)
|
||||||
|
call cargo#cmd("run " . a:args)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! cargo#test(args)
|
||||||
|
call cargo#cmd("test " . a:args)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! cargo#bench(args)
|
||||||
|
call cargo#cmd("bench " . a:args)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! cargo#runtarget(args)
|
||||||
|
let l:filename = expand('%:p')
|
||||||
|
let l:read_manifest = system('cargo read-manifest')
|
||||||
|
let l:metadata = json_decode(l:read_manifest)
|
||||||
|
let l:targets = get(l:metadata, 'targets', [])
|
||||||
|
let l:did_run = 0
|
||||||
|
for l:target in l:targets
|
||||||
|
let l:src_path = get(l:target, 'src_path', '')
|
||||||
|
let l:kinds = get(l:target, 'kind', [])
|
||||||
|
let l:name = get(l:target, 'name', '')
|
||||||
|
if l:src_path == l:filename
|
||||||
|
if index(l:kinds, 'example') != -1
|
||||||
|
let l:did_run = 1
|
||||||
|
call cargo#run("--example " . shellescape(l:name) . " " . a:args)
|
||||||
|
return
|
||||||
|
elseif index(l:kinds, 'bin') != -1
|
||||||
|
let l:did_run = 1
|
||||||
|
call cargo#run("--bin " . shellescape(l:name) . " " . a:args)
|
||||||
|
return
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
endfor
|
||||||
|
if l:did_run != 1
|
||||||
|
call cargo#run(a:args)
|
||||||
|
return
|
||||||
|
endif
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" vim: set et sw=4 sts=4 ts=8:
|
||||||
|
|
||||||
|
endif
|
||||||
30
autoload/cargo/quickfix.vim
Normal file
30
autoload/cargo/quickfix.vim
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'rust') == -1
|
||||||
|
|
||||||
|
function! cargo#quickfix#CmdPre() abort
|
||||||
|
if &filetype ==# 'rust' && get(b:, 'current_compiler', '') ==# 'cargo'
|
||||||
|
" Preserve the current directory, and 'lcd' to the nearest Cargo file.
|
||||||
|
let b:rust_compiler_cargo_qf_has_lcd = haslocaldir()
|
||||||
|
let b:rust_compiler_cargo_qf_prev_cd = getcwd()
|
||||||
|
let b:rust_compiler_cargo_qf_prev_cd_saved = 1
|
||||||
|
let l:nearest = fnamemodify(cargo#nearestRootCargo(0), ':h')
|
||||||
|
execute 'lchdir! '.l:nearest
|
||||||
|
else
|
||||||
|
let b:rust_compiler_cargo_qf_prev_cd_saved = 0
|
||||||
|
endif
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! cargo#quickfix#CmdPost() abort
|
||||||
|
if exists("b:rust_compiler_cargo_qf_prev_cd_saved") && b:rust_compiler_cargo_qf_prev_cd_saved
|
||||||
|
" Restore the current directory.
|
||||||
|
if b:rust_compiler_cargo_qf_has_lcd
|
||||||
|
execute 'lchdir! '.b:rust_compiler_cargo_qf_prev_cd
|
||||||
|
else
|
||||||
|
execute 'chdir! '.b:rust_compiler_cargo_qf_prev_cd
|
||||||
|
endif
|
||||||
|
let b:rust_compiler_cargo_qf_prev_cd_saved = 0
|
||||||
|
endif
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" vim: set et sw=4 sts=4 ts=8:
|
||||||
|
|
||||||
|
endif
|
||||||
File diff suppressed because one or more lines are too long
@@ -1,3 +1,5 @@
|
|||||||
|
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'coffee-script') == -1
|
||||||
|
|
||||||
" Language: CoffeeScript
|
" Language: CoffeeScript
|
||||||
" Maintainer: Mick Koch <mick@kochm.co>
|
" Maintainer: Mick Koch <mick@kochm.co>
|
||||||
" URL: http://github.com/kchmck/vim-coffee-script
|
" URL: http://github.com/kchmck/vim-coffee-script
|
||||||
@@ -52,3 +54,5 @@ function! coffee#CoffeeSetUpErrorFormat()
|
|||||||
\%f:%l:%c:\ error:\ %m,
|
\%f:%l:%c:\ error:\ %m,
|
||||||
\%-G%.%#
|
\%-G%.%#
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
|
endif
|
||||||
|
|||||||
351
autoload/crystal_lang.vim
Normal file
351
autoload/crystal_lang.vim
Normal file
@@ -0,0 +1,351 @@
|
|||||||
|
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'crystal') == -1
|
||||||
|
|
||||||
|
let s:save_cpo = &cpo
|
||||||
|
set cpo&vim
|
||||||
|
|
||||||
|
let s:V = vital#crystal#new()
|
||||||
|
let s:P = s:V.import('Process')
|
||||||
|
let s:C = s:V.import('ColorEcho')
|
||||||
|
|
||||||
|
if exists('*json_decode')
|
||||||
|
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
|
||||||
|
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
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:run_cmd(cmd) abort
|
||||||
|
if !executable(g:crystal_compiler_command)
|
||||||
|
throw "vim-crystal: Error: '" . g:crystal_compiler_command . "' command is not found."
|
||||||
|
endif
|
||||||
|
return s:P.system(a:cmd)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:find_root_by(search_dir, d) abort
|
||||||
|
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')
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" Search the root directory containing a 'spec/' and a 'src/' directories.
|
||||||
|
"
|
||||||
|
" Searching for the 'spec/' directory is not enough: for example the crystal
|
||||||
|
" 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 '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 ''
|
||||||
|
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 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 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 : ])
|
||||||
|
\ ]
|
||||||
|
|
||||||
|
let result = writefile(contents, temp_name)
|
||||||
|
if result == -1
|
||||||
|
" Note: When writefile() failed
|
||||||
|
return a:file_path
|
||||||
|
endif
|
||||||
|
|
||||||
|
return temp_name
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! crystal_lang#tool(name, file, pos, option_str) abort
|
||||||
|
let entrypoint = crystal_lang#entrypoint_for(a:file)
|
||||||
|
let cmd = printf(
|
||||||
|
\ '%s tool %s --no-color %s --cursor %s:%d:%d %s',
|
||||||
|
\ g:crystal_compiler_command,
|
||||||
|
\ a:name,
|
||||||
|
\ a:option_str,
|
||||||
|
\ a:file,
|
||||||
|
\ a:pos[1],
|
||||||
|
\ a:pos[2],
|
||||||
|
\ entrypoint
|
||||||
|
\ )
|
||||||
|
|
||||||
|
try
|
||||||
|
let output = s:run_cmd(cmd)
|
||||||
|
return {'failed': s:P.get_last_status(), 'output': output}
|
||||||
|
finally
|
||||||
|
" Note:
|
||||||
|
" If the entry point is temporary file, delete it finally.
|
||||||
|
if a:file !=# entrypoint
|
||||||
|
call delete(entrypoint)
|
||||||
|
endif
|
||||||
|
endtry
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" `pos` is assumed a returned value from getpos()
|
||||||
|
function! crystal_lang#impl(file, pos, option_str) abort
|
||||||
|
return crystal_lang#tool('implementations', a:file, a:pos, a:option_str)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:jump_to_impl(impl) abort
|
||||||
|
execute 'edit' a:impl.filename
|
||||||
|
call cursor(a:impl.line, a:impl.column)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! crystal_lang#jump_to_definition(file, pos) abort
|
||||||
|
echo 'analyzing definitions under cursor...'
|
||||||
|
|
||||||
|
let cmd_result = crystal_lang#impl(a:file, a:pos, '--format json')
|
||||||
|
if cmd_result.failed
|
||||||
|
return s:echo_error(cmd_result.output)
|
||||||
|
endif
|
||||||
|
|
||||||
|
let impl = s: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
|
||||||
|
|
||||||
|
let message = "Multiple definitions detected. Choose a number\n\n"
|
||||||
|
for idx in range(len(impl.implementations))
|
||||||
|
let i = impl.implementations[idx]
|
||||||
|
let message .= printf("[%d] %s:%d:%d\n", idx, i.filename, i.line, i.column)
|
||||||
|
endfor
|
||||||
|
let message .= "\n"
|
||||||
|
let idx = str2nr(input(message, "\n> "))
|
||||||
|
call s:jump_to_impl(impl.implementations[idx])
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! crystal_lang#context(file, pos, option_str) abort
|
||||||
|
return crystal_lang#tool('context', a:file, a:pos, a:option_str)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! crystal_lang#type_hierarchy(file, option_str) abort
|
||||||
|
let cmd = printf(
|
||||||
|
\ '%s tool hierarchy --no-color %s %s',
|
||||||
|
\ g:crystal_compiler_command,
|
||||||
|
\ a:option_str,
|
||||||
|
\ a:file
|
||||||
|
\ )
|
||||||
|
|
||||||
|
return s:run_cmd(cmd)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:find_completion_start() abort
|
||||||
|
let c = col('.')
|
||||||
|
if c <= 1
|
||||||
|
return -1
|
||||||
|
endif
|
||||||
|
|
||||||
|
let line = getline('.')[:c-2]
|
||||||
|
return match(line, '\w\+$')
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! crystal_lang#complete(findstart, base) abort
|
||||||
|
if a:findstart
|
||||||
|
return s:find_completion_start()
|
||||||
|
endif
|
||||||
|
|
||||||
|
let cmd_result = crystal_lang#context(expand('%'), getpos('.'), '--format json')
|
||||||
|
if cmd_result.failed
|
||||||
|
return
|
||||||
|
endif
|
||||||
|
|
||||||
|
let contexts = s:decode_json(cmd_result.output)
|
||||||
|
if contexts.status !=# 'ok'
|
||||||
|
return
|
||||||
|
endif
|
||||||
|
|
||||||
|
let candidates = []
|
||||||
|
|
||||||
|
for c in contexts.contexts
|
||||||
|
for [name, desc] in items(c)
|
||||||
|
let candidates += [{
|
||||||
|
\ 'word': name,
|
||||||
|
\ 'menu': ': ' . desc . ' [var]',
|
||||||
|
\ }]
|
||||||
|
endfor
|
||||||
|
endfor
|
||||||
|
|
||||||
|
return candidates
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! crystal_lang#get_spec_switched_path(absolute_path) abort
|
||||||
|
let base = fnamemodify(a:absolute_path, ':t:r')
|
||||||
|
|
||||||
|
" TODO: Make cleverer
|
||||||
|
if base =~# '_spec$'
|
||||||
|
let parent = fnamemodify(substitute(a:absolute_path, '/spec/', '/src/', ''), ':h')
|
||||||
|
return parent . '/' . matchstr(base, '.\+\ze_spec$') . '.cr'
|
||||||
|
else
|
||||||
|
let parent = fnamemodify(substitute(a:absolute_path, '/src/', '/spec/', ''), ':h')
|
||||||
|
return parent . '/' . base . '_spec.cr'
|
||||||
|
endif
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! crystal_lang#switch_spec_file(...) abort
|
||||||
|
let path = a:0 == 0 ? expand('%:p') : fnamemodify(a:1, ':p')
|
||||||
|
if path !~# '.cr$'
|
||||||
|
return s:echo_error('Not crystal source file: ' . path)
|
||||||
|
endif
|
||||||
|
|
||||||
|
execute 'edit!' crystal_lang#get_spec_switched_path(path)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:run_spec(root, path, ...) abort
|
||||||
|
" Note:
|
||||||
|
" `crystal spec` can't understand absolute path.
|
||||||
|
let cmd = printf(
|
||||||
|
\ '%s spec %s%s',
|
||||||
|
\ g:crystal_compiler_command,
|
||||||
|
\ a:path,
|
||||||
|
\ a:0 == 0 ? '' : (':' . a:1)
|
||||||
|
\ )
|
||||||
|
|
||||||
|
let saved_cwd = getcwd()
|
||||||
|
let cd = haslocaldir() ? 'lcd' : 'cd'
|
||||||
|
try
|
||||||
|
execute cd a:root
|
||||||
|
call s:C.echo(s:run_cmd(cmd))
|
||||||
|
finally
|
||||||
|
execute cd saved_cwd
|
||||||
|
endtry
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! crystal_lang#run_all_spec(...) abort
|
||||||
|
let path = a:0 == 0 ? expand('%:p:h') : a:1
|
||||||
|
let root_path = s:find_root_by_spec_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)
|
||||||
|
endif
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! crystal_lang#format_string(code, ...) abort
|
||||||
|
let cmd = printf(
|
||||||
|
\ '%s tool format --no-color %s -',
|
||||||
|
\ g:crystal_compiler_command,
|
||||||
|
\ get(a:, 1, '')
|
||||||
|
\ )
|
||||||
|
let output = s:P.system(cmd, a:code)
|
||||||
|
if s:P.get_last_status()
|
||||||
|
throw 'vim-crystal: Error on formatting: ' . output
|
||||||
|
endif
|
||||||
|
return output
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" crystal_lang#format(option_str [, on_save])
|
||||||
|
function! crystal_lang#format(option_str, ...) abort
|
||||||
|
if !executable(g:crystal_compiler_command)
|
||||||
|
" Finish command silently
|
||||||
|
return
|
||||||
|
endif
|
||||||
|
|
||||||
|
let on_save = a:0 > 0 ? a:1 : 0
|
||||||
|
|
||||||
|
let before = join(getline(1, '$'), "\n")
|
||||||
|
let formatted = crystal_lang#format_string(before, a:option_str)
|
||||||
|
if !on_save
|
||||||
|
let after = substitute(formatted, '\n$', '', '')
|
||||||
|
if before ==# after
|
||||||
|
return
|
||||||
|
endif
|
||||||
|
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, ''))
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
let &cpo = s:save_cpo
|
||||||
|
unlet s:save_cpo
|
||||||
|
|
||||||
|
endif
|
||||||
@@ -1,572 +0,0 @@
|
|||||||
" Language: Colorful CSS Color Preview
|
|
||||||
" Author: Aristotle Pagaltzis <pagaltzis@gmx.de>
|
|
||||||
" Commit: $Format:%H$
|
|
||||||
" Licence: The MIT License (MIT)
|
|
||||||
|
|
||||||
if v:version < 700
|
|
||||||
echoerr printf('Vim 7 is required for css-color (this is only %d.%d)',v:version/100,v:version%100)
|
|
||||||
finish
|
|
||||||
endif
|
|
||||||
|
|
||||||
if !( has('gui_running') || &t_Co==256 ) | finish | endif
|
|
||||||
|
|
||||||
function! s:rgb2color(r,g,b)
|
|
||||||
" Convert 80% -> 204, 100% -> 255, etc.
|
|
||||||
let rgb = map( [a:r,a:g,a:b], 'v:val =~ "%$" ? ( 255 * v:val ) / 100 : v:val' )
|
|
||||||
return printf( '%02x%02x%02x', rgb[0], rgb[1], rgb[2] )
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
function! s:hsl2color(h,s,l)
|
|
||||||
" Convert 80% -> 0.8, 100% -> 1.0, etc.
|
|
||||||
let [s,l] = map( [a:s, a:l], 'v:val =~ "%$" ? v:val / 100.0 : v:val + 0.0' )
|
|
||||||
" algorithm transcoded to vim from http://www.w3.org/TR/css3-color/#hsl-color
|
|
||||||
let hh = ( a:h % 360 ) / 360.0
|
|
||||||
let m2 = l <= 0.5 ? l * ( s + 1 ) : l + s - l * s
|
|
||||||
let m1 = l * 2 - m2
|
|
||||||
let rgb = []
|
|
||||||
for h in [ hh + (1/3.0), hh, hh - (1/3.0) ]
|
|
||||||
let h = h < 0 ? h + 1 : h > 1 ? h - 1 : h
|
|
||||||
let v =
|
|
||||||
\ h * 6 < 1 ? m1 + ( m2 - m1 ) * h * 6 :
|
|
||||||
\ h * 2 < 1 ? m2 :
|
|
||||||
\ h * 3 < 2 ? m1 + ( m2 - m1 ) * ( 2/3.0 - h ) * 6 :
|
|
||||||
\ m1
|
|
||||||
if v > 1.0 | return '' | endif
|
|
||||||
let rgb += [ float2nr( 255 * v ) ]
|
|
||||||
endfor
|
|
||||||
return printf( '%02x%02x%02x', rgb[0], rgb[1], rgb[2] )
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
let s:hex={}
|
|
||||||
for i in range(0, 255)
|
|
||||||
let s:hex[ printf( '%02x', i ) ] = i
|
|
||||||
endfor
|
|
||||||
|
|
||||||
if has('gui_running')
|
|
||||||
let s:is_gui = 1
|
|
||||||
else
|
|
||||||
let s:is_gui = 0
|
|
||||||
|
|
||||||
" preset 16 vt100 colors
|
|
||||||
let s:xtermcolor = [
|
|
||||||
\ [ 0x00, 0x00, 0x00, 0 ],
|
|
||||||
\ [ 0xCD, 0x00, 0x00, 1 ],
|
|
||||||
\ [ 0x00, 0xCD, 0x00, 2 ],
|
|
||||||
\ [ 0xCD, 0xCD, 0x00, 3 ],
|
|
||||||
\ [ 0x00, 0x00, 0xEE, 4 ],
|
|
||||||
\ [ 0xCD, 0x00, 0xCD, 5 ],
|
|
||||||
\ [ 0x00, 0xCD, 0xCD, 6 ],
|
|
||||||
\ [ 0xE5, 0xE5, 0xE5, 7 ],
|
|
||||||
\ [ 0x7F, 0x7F, 0x7F, 8 ],
|
|
||||||
\ [ 0xFF, 0x00, 0x00, 9 ],
|
|
||||||
\ [ 0x00, 0xFF, 0x00, 10 ],
|
|
||||||
\ [ 0xFF, 0xFF, 0x00, 11 ],
|
|
||||||
\ [ 0x5C, 0x5C, 0xFF, 12 ],
|
|
||||||
\ [ 0xFF, 0x00, 0xFF, 13 ],
|
|
||||||
\ [ 0x00, 0xFF, 0xFF, 14 ],
|
|
||||||
\ [ 0xFF, 0xFF, 0xFF, 15 ]]
|
|
||||||
" grayscale ramp
|
|
||||||
" (value is 8+10*lum for lum in 0..23)
|
|
||||||
let s:xtermcolor += [
|
|
||||||
\ [ 0x08, 0x08, 0x08, 232 ],
|
|
||||||
\ [ 0x12, 0x12, 0x12, 233 ],
|
|
||||||
\ [ 0x1C, 0x1C, 0x1C, 234 ],
|
|
||||||
\ [ 0x26, 0x26, 0x26, 235 ],
|
|
||||||
\ [ 0x30, 0x30, 0x30, 236 ],
|
|
||||||
\ [ 0x3A, 0x3A, 0x3A, 237 ],
|
|
||||||
\ [ 0x44, 0x44, 0x44, 238 ],
|
|
||||||
\ [ 0x4E, 0x4E, 0x4E, 239 ],
|
|
||||||
\ [ 0x58, 0x58, 0x58, 240 ],
|
|
||||||
\ [ 0x62, 0x62, 0x62, 241 ],
|
|
||||||
\ [ 0x6C, 0x6C, 0x6C, 242 ],
|
|
||||||
\ [ 0x76, 0x76, 0x76, 243 ],
|
|
||||||
\ [ 0x80, 0x80, 0x80, 244 ],
|
|
||||||
\ [ 0x8A, 0x8A, 0x8A, 245 ],
|
|
||||||
\ [ 0x94, 0x94, 0x94, 246 ],
|
|
||||||
\ [ 0x9E, 0x9E, 0x9E, 247 ],
|
|
||||||
\ [ 0xA8, 0xA8, 0xA8, 248 ],
|
|
||||||
\ [ 0xB2, 0xB2, 0xB2, 249 ],
|
|
||||||
\ [ 0xBC, 0xBC, 0xBC, 250 ],
|
|
||||||
\ [ 0xC6, 0xC6, 0xC6, 251 ],
|
|
||||||
\ [ 0xD0, 0xD0, 0xD0, 252 ],
|
|
||||||
\ [ 0xDA, 0xDA, 0xDA, 253 ],
|
|
||||||
\ [ 0xE4, 0xE4, 0xE4, 254 ],
|
|
||||||
\ [ 0xEE, 0xEE, 0xEE, 255 ]]
|
|
||||||
|
|
||||||
" the 6 values used in the xterm color cube
|
|
||||||
" 0 95 135 175 215 255
|
|
||||||
let s:cubergb = [ 0x00, 0x5F, 0x87, 0xAF, 0xD7, 0xFF ]
|
|
||||||
|
|
||||||
" 0..255 mapped to 0..5 based on the color cube values
|
|
||||||
let s:xvquant = repeat([0],48)
|
|
||||||
\ + repeat([1],68)
|
|
||||||
\ + repeat([2],40)
|
|
||||||
\ + repeat([3],40)
|
|
||||||
\ + repeat([4],40)
|
|
||||||
\ + repeat([5],20)
|
|
||||||
" tweak the mapping for the exact matches (0 and 1 already correct)
|
|
||||||
let s:xvquant[s:cubergb[2]] = 2
|
|
||||||
let s:xvquant[s:cubergb[3]] = 3
|
|
||||||
let s:xvquant[s:cubergb[4]] = 4
|
|
||||||
let s:xvquant[s:cubergb[5]] = 5
|
|
||||||
|
|
||||||
" selects the nearest xterm color for a rgb value like #FF0000
|
|
||||||
function! s:rgb2xterm(color)
|
|
||||||
let best_match=0
|
|
||||||
let smallest_distance = 10000000000
|
|
||||||
let color = tolower(a:color)
|
|
||||||
let r = s:hex[color[0:1]]
|
|
||||||
let g = s:hex[color[2:3]]
|
|
||||||
let b = s:hex[color[4:5]]
|
|
||||||
|
|
||||||
let vr = s:xvquant[r]
|
|
||||||
let vg = s:xvquant[g]
|
|
||||||
let vb = s:xvquant[b]
|
|
||||||
let cidx = vr * 36 + vg * 6 + vb + 16
|
|
||||||
let ccol = [ s:cubergb[vr], s:cubergb[vg], s:cubergb[vb], cidx ]
|
|
||||||
|
|
||||||
for [tr,tg,tb,idx] in [ ccol ] + s:xtermcolor
|
|
||||||
let dr = tr - r
|
|
||||||
let dg = tg - g
|
|
||||||
let db = tb - b
|
|
||||||
let distance = dr*dr + dg*dg + db*db
|
|
||||||
if distance == 0 | return idx | endif
|
|
||||||
if distance > smallest_distance | continue | endif
|
|
||||||
let smallest_distance = distance
|
|
||||||
let best_match = idx
|
|
||||||
endfor
|
|
||||||
return best_match
|
|
||||||
endfunction
|
|
||||||
endif
|
|
||||||
|
|
||||||
let s:pattern_color = {}
|
|
||||||
let s:color_fg = {}
|
|
||||||
let s:color_bg = {}
|
|
||||||
let [s:hi_cmd, s:black, s:white] = s:is_gui
|
|
||||||
\ ? ['hi %s guibg=#%s guifg=%s', '#000000', '#ffffff']
|
|
||||||
\ : ['hi %s ctermbg=%s ctermfg=%s', 0, 15]
|
|
||||||
function! s:create_syn_match()
|
|
||||||
|
|
||||||
let pattern = submatch(0)
|
|
||||||
|
|
||||||
if has_key( b:has_pattern_syn, pattern ) | return | endif
|
|
||||||
let b:has_pattern_syn[pattern] = 1
|
|
||||||
|
|
||||||
let rgb_color = get( s:pattern_color, pattern, '' )
|
|
||||||
|
|
||||||
if ! strlen( rgb_color )
|
|
||||||
let hexcolor = submatch(1)
|
|
||||||
let funcname = submatch(2)
|
|
||||||
|
|
||||||
if funcname == 'rgb'
|
|
||||||
let rgb_color = s:rgb2color(submatch(3),submatch(4),submatch(5))
|
|
||||||
elseif funcname == 'hsl'
|
|
||||||
let rgb_color = s:hsl2color(submatch(3),submatch(4),submatch(5))
|
|
||||||
elseif strlen(hexcolor) == 6
|
|
||||||
let rgb_color = tolower(hexcolor)
|
|
||||||
elseif strlen(hexcolor) == 3
|
|
||||||
let rgb_color = substitute(tolower(hexcolor), '\(.\)', '\1\1', 'g')
|
|
||||||
else
|
|
||||||
throw 'css_color: create_syn_match invoked on bad match data'
|
|
||||||
endif
|
|
||||||
|
|
||||||
let s:pattern_color[pattern] = rgb_color
|
|
||||||
endif
|
|
||||||
|
|
||||||
let group = 'BG' . rgb_color
|
|
||||||
|
|
||||||
if ! has_key( b:has_color_hi, rgb_color )
|
|
||||||
" check GUI flag early here to avoid pure-overhead caching
|
|
||||||
let syn_bg = s:is_gui ? rgb_color : get( s:color_bg, rgb_color, '' )
|
|
||||||
if ! strlen(syn_bg)
|
|
||||||
let syn_bg = s:rgb2xterm(rgb_color)
|
|
||||||
let s:color_bg[rgb_color] = syn_bg
|
|
||||||
endif
|
|
||||||
|
|
||||||
let syn_fg = get( s:color_fg, rgb_color, '' )
|
|
||||||
if ! strlen(syn_fg)
|
|
||||||
let r = s:hex[rgb_color[0:1]]
|
|
||||||
let g = s:hex[rgb_color[2:3]]
|
|
||||||
let b = s:hex[rgb_color[4:5]]
|
|
||||||
let syn_fg = r*30 + g*59 + b*11 > 12000 ? s:black : s:white
|
|
||||||
let s:color_fg[rgb_color] = syn_fg
|
|
||||||
endif
|
|
||||||
|
|
||||||
exe printf( s:hi_cmd, group, syn_bg, syn_fg )
|
|
||||||
let b:has_color_hi[rgb_color] = 1
|
|
||||||
endif
|
|
||||||
|
|
||||||
" iff pattern ends on word character, require word break to match
|
|
||||||
if pattern =~ '\>$' | let pattern .= '\>' | endif
|
|
||||||
exe 'syn match' group '/'.escape(pattern, '/').'/ contained containedin=@colorableGroup'
|
|
||||||
|
|
||||||
return ''
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
function! s:clear_matches()
|
|
||||||
if exists('w:color_match_id')
|
|
||||||
call filter(w:color_match_id, 'matchdelete(v:val)')
|
|
||||||
unlet w:color_match_id
|
|
||||||
endif
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
function! s:create_matches()
|
|
||||||
if ! &l:cursorline | return | endif
|
|
||||||
" adds matches based that duplicate the highlighted colors on the current line
|
|
||||||
let lnr = line('.')
|
|
||||||
let group = ''
|
|
||||||
let groupstart = 0
|
|
||||||
let endcol = col('$')
|
|
||||||
let w:color_match_id = []
|
|
||||||
for col in range( 1, endcol )
|
|
||||||
let nextgroup = col < endcol ? synIDattr( synID( lnr, col, 1 ), 'name' ) : ''
|
|
||||||
if group == nextgroup | continue | endif
|
|
||||||
if group =~ '^BG\x\{6}$'
|
|
||||||
let regex = '\%'.lnr.'l\%'.groupstart.'c'.repeat( '.', col - groupstart )
|
|
||||||
let match = matchadd( group, regex, -1 )
|
|
||||||
let w:color_match_id += [ match ]
|
|
||||||
endif
|
|
||||||
let group = nextgroup
|
|
||||||
let groupstart = col
|
|
||||||
endfor
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
let s:_hexcolor = '#\(\x\{3}\|\x\{6}\)\>' " submatch 1
|
|
||||||
let s:_funcname = '\(rgb\|hsl\)a\?' " submatch 2
|
|
||||||
let s:_ws_ = '\s*'
|
|
||||||
let s:_numval = s:_ws_ . '\(\d\{1,3}%\?\)' " submatch 3,4,5
|
|
||||||
let s:_listsep = s:_ws_ . ','
|
|
||||||
let s:_otherargs_ = '\%(,[^)]*\)\?'
|
|
||||||
let s:_funcexpr = s:_funcname . '[(]' . s:_numval . s:_listsep . s:_numval . s:_listsep . s:_numval . s:_ws_ . s:_otherargs_ . '[)]'
|
|
||||||
let s:_csscolor = s:_hexcolor . '\|' . s:_funcexpr
|
|
||||||
" N.B. these substitute() calls are here just for the side effect
|
|
||||||
" of invoking s:create_syn_match during substitution -- because
|
|
||||||
" match() and friends do not allow finding all matches in a single
|
|
||||||
" scan without examining the start of the string over and over
|
|
||||||
function! s:parse_css_screen()
|
|
||||||
call substitute( join( getline('w0','w$'), "\n" ), s:_csscolor, '\=s:create_syn_match()', 'g' )
|
|
||||||
call s:clear_matches()
|
|
||||||
call s:create_matches()
|
|
||||||
endfunction
|
|
||||||
function! s:parse_hex_screen()
|
|
||||||
call substitute( join( getline('w0','w$'), "\n" ), s:_hexcolor, '\=s:create_syn_match()', 'g' )
|
|
||||||
call s:clear_matches()
|
|
||||||
call s:create_matches()
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
|
|
||||||
|
|
||||||
function! css_color#init(type, keywords, groups)
|
|
||||||
exe 'syn cluster colorableGroup contains=' . a:groups
|
|
||||||
|
|
||||||
let b:has_color_hi = {}
|
|
||||||
let b:has_pattern_syn = {}
|
|
||||||
|
|
||||||
augroup CSSColor
|
|
||||||
autocmd! * <buffer>
|
|
||||||
exe 'autocmd CursorMoved,CursorMovedI <buffer> call s:parse_'.a:type.'_screen()'
|
|
||||||
autocmd BufWinEnter <buffer> call s:create_matches()
|
|
||||||
autocmd BufWinLeave <buffer> call s:clear_matches()
|
|
||||||
augroup END
|
|
||||||
|
|
||||||
exe 'call s:parse_'.a:type.'_screen()'
|
|
||||||
|
|
||||||
if a:keywords == 'none' | return | endif
|
|
||||||
|
|
||||||
syn case ignore
|
|
||||||
|
|
||||||
" W3C basic colors
|
|
||||||
|
|
||||||
hi BG000000 guibg=#000000 guifg=#FFFFFF ctermbg=16 ctermfg=231
|
|
||||||
hi BGc0c0c0 guibg=#C0C0C0 guifg=#000000 ctermbg=250 ctermfg=16
|
|
||||||
hi BG808080 guibg=#808080 guifg=#000000 ctermbg=244 ctermfg=16
|
|
||||||
hi BGffffff guibg=#FFFFFF guifg=#000000 ctermbg=231 ctermfg=16
|
|
||||||
hi BG800000 guibg=#800000 guifg=#FFFFFF ctermbg=88 ctermfg=231
|
|
||||||
hi BGff0000 guibg=#FF0000 guifg=#FFFFFF ctermbg=196 ctermfg=231
|
|
||||||
hi BG800080 guibg=#800080 guifg=#FFFFFF ctermbg=240 ctermfg=231
|
|
||||||
hi BGff00ff guibg=#FF00FF guifg=#FFFFFF ctermbg=13 ctermfg=231
|
|
||||||
hi BG008000 guibg=#008000 guifg=#FFFFFF ctermbg=2 ctermfg=231
|
|
||||||
hi BG00ff00 guibg=#00FF00 guifg=#000000 ctermbg=10 ctermfg=16
|
|
||||||
hi BG808000 guibg=#808000 guifg=#FFFFFF ctermbg=240 ctermfg=231
|
|
||||||
hi BGffff00 guibg=#FFFF00 guifg=#000000 ctermbg=11 ctermfg=16
|
|
||||||
hi BG000080 guibg=#000080 guifg=#FFFFFF ctermbg=235 ctermfg=231
|
|
||||||
hi BG0000ff guibg=#0000FF guifg=#FFFFFF ctermbg=4 ctermfg=231
|
|
||||||
hi BG008080 guibg=#008080 guifg=#FFFFFF ctermbg=30 ctermfg=231
|
|
||||||
hi BG00ffff guibg=#00FFFF guifg=#000000 ctermbg=51 ctermfg=16
|
|
||||||
|
|
||||||
syn keyword BG000000 black contained containedin=@colorableGroup
|
|
||||||
syn keyword BGc0c0c0 silver contained containedin=@colorableGroup
|
|
||||||
syn keyword BG808080 gray contained containedin=@colorableGroup
|
|
||||||
syn match BGffffff "\c\<white\(-\)\@!\>" contained containedin=@colorableGroup
|
|
||||||
syn keyword BG800000 maroon contained containedin=@colorableGroup
|
|
||||||
syn keyword BGff0000 red contained containedin=@colorableGroup
|
|
||||||
syn keyword BG800080 purple contained containedin=@colorableGroup
|
|
||||||
syn keyword BGff00ff fuchsia contained containedin=@colorableGroup
|
|
||||||
syn keyword BG008000 green contained containedin=@colorableGroup
|
|
||||||
syn keyword BG00ff00 lime contained containedin=@colorableGroup
|
|
||||||
syn keyword BG808000 olive contained containedin=@colorableGroup
|
|
||||||
syn keyword BGffff00 yellow contained containedin=@colorableGroup
|
|
||||||
syn keyword BG000080 navy contained containedin=@colorableGroup
|
|
||||||
syn keyword BG0000ff blue contained containedin=@colorableGroup
|
|
||||||
syn keyword BG008080 teal contained containedin=@colorableGroup
|
|
||||||
syn keyword BG00ffff aqua contained containedin=@colorableGroup
|
|
||||||
|
|
||||||
if a:keywords == 'basic' | return | endif
|
|
||||||
|
|
||||||
" W3C extended colors
|
|
||||||
|
|
||||||
hi BG00008b guibg=#00008B guifg=#FFFFFF ctermbg=4 ctermfg=231
|
|
||||||
hi BG0000cd guibg=#0000CD guifg=#FFFFFF ctermbg=4 ctermfg=231
|
|
||||||
hi BG006400 guibg=#006400 guifg=#FFFFFF ctermbg=235 ctermfg=231
|
|
||||||
hi BG008b8b guibg=#008B8B guifg=#FFFFFF ctermbg=30 ctermfg=231
|
|
||||||
hi BG00bfff guibg=#00BFFF guifg=#000000 ctermbg=6 ctermfg=16
|
|
||||||
hi BG00ced1 guibg=#00CED1 guifg=#000000 ctermbg=6 ctermfg=16
|
|
||||||
hi BG00fa9a guibg=#00FA9A guifg=#000000 ctermbg=6 ctermfg=16
|
|
||||||
hi BG00ff7f guibg=#00FF7F guifg=#000000 ctermbg=6 ctermfg=16
|
|
||||||
hi BG191970 guibg=#191970 guifg=#FFFFFF ctermbg=237 ctermfg=231
|
|
||||||
hi BG1e90ff guibg=#1E90FF guifg=#000000 ctermbg=12 ctermfg=16
|
|
||||||
hi BG20b2aa guibg=#20B2AA guifg=#000000 ctermbg=37 ctermfg=16
|
|
||||||
hi BG228b22 guibg=#228B22 guifg=#FFFFFF ctermbg=2 ctermfg=231
|
|
||||||
hi BG2e8b57 guibg=#2E8B57 guifg=#FFFFFF ctermbg=240 ctermfg=231
|
|
||||||
hi BG2f4f4f guibg=#2F4F4F guifg=#FFFFFF ctermbg=238 ctermfg=231
|
|
||||||
hi BG32cd32 guibg=#32CD32 guifg=#000000 ctermbg=2 ctermfg=16
|
|
||||||
hi BG3cb371 guibg=#3CB371 guifg=#000000 ctermbg=71 ctermfg=16
|
|
||||||
hi BG40e0d0 guibg=#40E0D0 guifg=#000000 ctermbg=80 ctermfg=16
|
|
||||||
hi BG4169e1 guibg=#4169E1 guifg=#FFFFFF ctermbg=12 ctermfg=231
|
|
||||||
hi BG4682b4 guibg=#4682B4 guifg=#FFFFFF ctermbg=67 ctermfg=231
|
|
||||||
hi BG483d8b guibg=#483D8B guifg=#FFFFFF ctermbg=240 ctermfg=231
|
|
||||||
hi BG48d1cc guibg=#48D1CC guifg=#000000 ctermbg=80 ctermfg=16
|
|
||||||
hi BG4b0082 guibg=#4B0082 guifg=#FFFFFF ctermbg=238 ctermfg=231
|
|
||||||
hi BG556b2f guibg=#556B2F guifg=#FFFFFF ctermbg=239 ctermfg=231
|
|
||||||
hi BG5f9ea0 guibg=#5F9EA0 guifg=#000000 ctermbg=73 ctermfg=16
|
|
||||||
hi BG6495ed guibg=#6495ED guifg=#000000 ctermbg=12 ctermfg=16
|
|
||||||
hi BG66cdaa guibg=#66CDAA guifg=#000000 ctermbg=79 ctermfg=16
|
|
||||||
hi BG696969 guibg=#696969 guifg=#FFFFFF ctermbg=242 ctermfg=231
|
|
||||||
hi BG6a5acd guibg=#6A5ACD guifg=#FFFFFF ctermbg=12 ctermfg=231
|
|
||||||
hi BG6b8e23 guibg=#6B8E23 guifg=#FFFFFF ctermbg=241 ctermfg=231
|
|
||||||
hi BG708090 guibg=#708090 guifg=#000000 ctermbg=66 ctermfg=16
|
|
||||||
hi BG778899 guibg=#778899 guifg=#000000 ctermbg=102 ctermfg=16
|
|
||||||
hi BG7b68ee guibg=#7B68EE guifg=#000000 ctermbg=12 ctermfg=16
|
|
||||||
hi BG7cfc00 guibg=#7CFC00 guifg=#000000 ctermbg=3 ctermfg=16
|
|
||||||
hi BG7fff00 guibg=#7FFF00 guifg=#000000 ctermbg=3 ctermfg=16
|
|
||||||
hi BG7fffd4 guibg=#7FFFD4 guifg=#000000 ctermbg=122 ctermfg=16
|
|
||||||
hi BG87ceeb guibg=#87CEEB guifg=#000000 ctermbg=117 ctermfg=16
|
|
||||||
hi BG87cefa guibg=#87CEFA guifg=#000000 ctermbg=117 ctermfg=16
|
|
||||||
hi BG8a2be2 guibg=#8A2BE2 guifg=#FFFFFF ctermbg=12 ctermfg=231
|
|
||||||
hi BG8b0000 guibg=#8B0000 guifg=#FFFFFF ctermbg=88 ctermfg=231
|
|
||||||
hi BG8b008b guibg=#8B008B guifg=#FFFFFF ctermbg=5 ctermfg=231
|
|
||||||
hi BG8b4513 guibg=#8B4513 guifg=#FFFFFF ctermbg=94 ctermfg=231
|
|
||||||
hi BG8fbc8f guibg=#8FBC8F guifg=#000000 ctermbg=108 ctermfg=16
|
|
||||||
hi BG90ee90 guibg=#90EE90 guifg=#000000 ctermbg=249 ctermfg=16
|
|
||||||
hi BG9370d8 guibg=#9370D8 guifg=#000000 ctermbg=12 ctermfg=16
|
|
||||||
hi BG9400d3 guibg=#9400D3 guifg=#FFFFFF ctermbg=5 ctermfg=231
|
|
||||||
hi BG98fb98 guibg=#98FB98 guifg=#000000 ctermbg=250 ctermfg=16
|
|
||||||
hi BG9932cc guibg=#9932CC guifg=#FFFFFF ctermbg=5 ctermfg=231
|
|
||||||
hi BG9acd32 guibg=#9ACD32 guifg=#000000 ctermbg=3 ctermfg=16
|
|
||||||
hi BGa0522d guibg=#A0522D guifg=#FFFFFF ctermbg=130 ctermfg=231
|
|
||||||
hi BGa52a2a guibg=#A52A2A guifg=#FFFFFF ctermbg=124 ctermfg=231
|
|
||||||
hi BGa9a9a9 guibg=#A9A9A9 guifg=#000000 ctermbg=248 ctermfg=16
|
|
||||||
hi BGadd8e6 guibg=#ADD8E6 guifg=#000000 ctermbg=152 ctermfg=16
|
|
||||||
hi BGadff2f guibg=#ADFF2F guifg=#000000 ctermbg=3 ctermfg=16
|
|
||||||
hi BGafeeee guibg=#AFEEEE guifg=#000000 ctermbg=159 ctermfg=16
|
|
||||||
hi BGb0c4de guibg=#B0C4DE guifg=#000000 ctermbg=152 ctermfg=16
|
|
||||||
hi BGb0e0e6 guibg=#B0E0E6 guifg=#000000 ctermbg=152 ctermfg=16
|
|
||||||
hi BGb22222 guibg=#B22222 guifg=#FFFFFF ctermbg=124 ctermfg=231
|
|
||||||
hi BGb8860b guibg=#B8860B guifg=#000000 ctermbg=3 ctermfg=16
|
|
||||||
hi BGba55d3 guibg=#BA55D3 guifg=#000000 ctermbg=5 ctermfg=16
|
|
||||||
hi BGbc8f8f guibg=#BC8F8F guifg=#000000 ctermbg=138 ctermfg=16
|
|
||||||
hi BGbdb76b guibg=#BDB76B guifg=#000000 ctermbg=247 ctermfg=16
|
|
||||||
hi BGc71585 guibg=#C71585 guifg=#FFFFFF ctermbg=5 ctermfg=231
|
|
||||||
hi BGcd5c5c guibg=#CD5C5C guifg=#000000 ctermbg=167 ctermfg=16
|
|
||||||
hi BGcd853f guibg=#CD853F guifg=#000000 ctermbg=173 ctermfg=16
|
|
||||||
hi BGd2691e guibg=#D2691E guifg=#000000 ctermbg=166 ctermfg=16
|
|
||||||
hi BGd2b48c guibg=#D2B48C guifg=#000000 ctermbg=180 ctermfg=16
|
|
||||||
hi BGd3d3d3 guibg=#D3D3D3 guifg=#000000 ctermbg=252 ctermfg=16
|
|
||||||
hi BGd87093 guibg=#D87093 guifg=#000000 ctermbg=168 ctermfg=16
|
|
||||||
hi BGd8bfd8 guibg=#D8BFD8 guifg=#000000 ctermbg=252 ctermfg=16
|
|
||||||
hi BGda70d6 guibg=#DA70D6 guifg=#000000 ctermbg=249 ctermfg=16
|
|
||||||
hi BGdaa520 guibg=#DAA520 guifg=#000000 ctermbg=3 ctermfg=16
|
|
||||||
hi BGdc143c guibg=#DC143C guifg=#FFFFFF ctermbg=161 ctermfg=231
|
|
||||||
hi BGdcdcdc guibg=#DCDCDC guifg=#000000 ctermbg=253 ctermfg=16
|
|
||||||
hi BGdda0dd guibg=#DDA0DD guifg=#000000 ctermbg=182 ctermfg=16
|
|
||||||
hi BGdeb887 guibg=#DEB887 guifg=#000000 ctermbg=180 ctermfg=16
|
|
||||||
hi BGe0ffff guibg=#E0FFFF guifg=#000000 ctermbg=195 ctermfg=16
|
|
||||||
hi BGe6e6fa guibg=#E6E6FA guifg=#000000 ctermbg=255 ctermfg=16
|
|
||||||
hi BGe9967a guibg=#E9967A guifg=#000000 ctermbg=174 ctermfg=16
|
|
||||||
hi BGee82ee guibg=#EE82EE guifg=#000000 ctermbg=251 ctermfg=16
|
|
||||||
hi BGeee8aa guibg=#EEE8AA guifg=#000000 ctermbg=223 ctermfg=16
|
|
||||||
hi BGf08080 guibg=#F08080 guifg=#000000 ctermbg=210 ctermfg=16
|
|
||||||
hi BGf0e68c guibg=#F0E68C guifg=#000000 ctermbg=222 ctermfg=16
|
|
||||||
hi BGf0f8ff guibg=#F0F8FF guifg=#000000 ctermbg=15 ctermfg=16
|
|
||||||
hi BGf0fff0 guibg=#F0FFF0 guifg=#000000 ctermbg=255 ctermfg=16
|
|
||||||
hi BGf0ffff guibg=#F0FFFF guifg=#000000 ctermbg=15 ctermfg=16
|
|
||||||
hi BGf4a460 guibg=#F4A460 guifg=#000000 ctermbg=215 ctermfg=16
|
|
||||||
hi BGf5deb3 guibg=#F5DEB3 guifg=#000000 ctermbg=223 ctermfg=16
|
|
||||||
hi BGf5f5dc guibg=#F5F5DC guifg=#000000 ctermbg=255 ctermfg=16
|
|
||||||
hi BGf5f5f5 guibg=#F5F5F5 guifg=#000000 ctermbg=255 ctermfg=16
|
|
||||||
hi BGf5fffa guibg=#F5FFFA guifg=#000000 ctermbg=15 ctermfg=16
|
|
||||||
hi BGf8f8ff guibg=#F8F8FF guifg=#000000 ctermbg=15 ctermfg=16
|
|
||||||
hi BGfa8072 guibg=#FA8072 guifg=#000000 ctermbg=209 ctermfg=16
|
|
||||||
hi BGfaebd7 guibg=#FAEBD7 guifg=#000000 ctermbg=7 ctermfg=16
|
|
||||||
hi BGfaf0e6 guibg=#FAF0E6 guifg=#000000 ctermbg=255 ctermfg=16
|
|
||||||
hi BGfafad2 guibg=#FAFAD2 guifg=#000000 ctermbg=255 ctermfg=16
|
|
||||||
hi BGfdf5e6 guibg=#FDF5E6 guifg=#000000 ctermbg=255 ctermfg=16
|
|
||||||
hi BGff1493 guibg=#FF1493 guifg=#FFFFFF ctermbg=5 ctermfg=231
|
|
||||||
hi BGff4500 guibg=#FF4500 guifg=#FFFFFF ctermbg=9 ctermfg=231
|
|
||||||
hi BGff6347 guibg=#FF6347 guifg=#000000 ctermbg=203 ctermfg=16
|
|
||||||
hi BGff69b4 guibg=#FF69B4 guifg=#000000 ctermbg=205 ctermfg=16
|
|
||||||
hi BGff7f50 guibg=#FF7F50 guifg=#000000 ctermbg=209 ctermfg=16
|
|
||||||
hi BGff8c00 guibg=#FF8C00 guifg=#000000 ctermbg=3 ctermfg=16
|
|
||||||
hi BGffa07a guibg=#FFA07A guifg=#000000 ctermbg=216 ctermfg=16
|
|
||||||
hi BGffa500 guibg=#FFA500 guifg=#000000 ctermbg=3 ctermfg=16
|
|
||||||
hi BGffb6c1 guibg=#FFB6C1 guifg=#000000 ctermbg=217 ctermfg=16
|
|
||||||
hi BGffc0cb guibg=#FFC0CB guifg=#000000 ctermbg=218 ctermfg=16
|
|
||||||
hi BGffd700 guibg=#FFD700 guifg=#000000 ctermbg=11 ctermfg=16
|
|
||||||
hi BGffdab9 guibg=#FFDAB9 guifg=#000000 ctermbg=223 ctermfg=16
|
|
||||||
hi BGffdead guibg=#FFDEAD guifg=#000000 ctermbg=223 ctermfg=16
|
|
||||||
hi BGffe4b5 guibg=#FFE4B5 guifg=#000000 ctermbg=223 ctermfg=16
|
|
||||||
hi BGffe4c4 guibg=#FFE4C4 guifg=#000000 ctermbg=224 ctermfg=16
|
|
||||||
hi BGffe4e1 guibg=#FFE4E1 guifg=#000000 ctermbg=224 ctermfg=16
|
|
||||||
hi BGffebcd guibg=#FFEBCD guifg=#000000 ctermbg=7 ctermfg=16
|
|
||||||
hi BGffefd5 guibg=#FFEFD5 guifg=#000000 ctermbg=255 ctermfg=16
|
|
||||||
hi BGfff0f5 guibg=#FFF0F5 guifg=#000000 ctermbg=15 ctermfg=16
|
|
||||||
hi BGfff5ee guibg=#FFF5EE guifg=#000000 ctermbg=255 ctermfg=16
|
|
||||||
hi BGfff8dc guibg=#FFF8DC guifg=#000000 ctermbg=255 ctermfg=16
|
|
||||||
hi BGfffacd guibg=#FFFACD guifg=#000000 ctermbg=255 ctermfg=16
|
|
||||||
hi BGfffaf0 guibg=#FFFAF0 guifg=#000000 ctermbg=15 ctermfg=16
|
|
||||||
hi BGfffafa guibg=#FFFAFA guifg=#000000 ctermbg=15 ctermfg=16
|
|
||||||
hi BGffffe0 guibg=#FFFFE0 guifg=#000000 ctermbg=255 ctermfg=16
|
|
||||||
hi BGfffff0 guibg=#FFFFF0 guifg=#000000 ctermbg=15 ctermfg=16
|
|
||||||
|
|
||||||
syn keyword BGf0f8ff AliceBlue contained containedin=@colorableGroup
|
|
||||||
syn keyword BGfaebd7 AntiqueWhite contained containedin=@colorableGroup
|
|
||||||
syn keyword BG7fffd4 Aquamarine contained containedin=@colorableGroup
|
|
||||||
syn keyword BGf0ffff Azure contained containedin=@colorableGroup
|
|
||||||
syn keyword BGf5f5dc Beige contained containedin=@colorableGroup
|
|
||||||
syn keyword BGffe4c4 Bisque contained containedin=@colorableGroup
|
|
||||||
syn keyword BGffebcd BlanchedAlmond contained containedin=@colorableGroup
|
|
||||||
syn keyword BG8a2be2 BlueViolet contained containedin=@colorableGroup
|
|
||||||
syn keyword BGa52a2a Brown contained containedin=@colorableGroup
|
|
||||||
syn keyword BGdeb887 BurlyWood contained containedin=@colorableGroup
|
|
||||||
syn keyword BG5f9ea0 CadetBlue contained containedin=@colorableGroup
|
|
||||||
syn keyword BG7fff00 Chartreuse contained containedin=@colorableGroup
|
|
||||||
syn keyword BGd2691e Chocolate contained containedin=@colorableGroup
|
|
||||||
syn keyword BGff7f50 Coral contained containedin=@colorableGroup
|
|
||||||
syn keyword BG6495ed CornflowerBlue contained containedin=@colorableGroup
|
|
||||||
syn keyword BGfff8dc Cornsilk contained containedin=@colorableGroup
|
|
||||||
syn keyword BGdc143c Crimson contained containedin=@colorableGroup
|
|
||||||
syn keyword BG00ffff Cyan contained containedin=@colorableGroup
|
|
||||||
syn keyword BG00008b DarkBlue contained containedin=@colorableGroup
|
|
||||||
syn keyword BG008b8b DarkCyan contained containedin=@colorableGroup
|
|
||||||
syn keyword BGb8860b DarkGoldenRod contained containedin=@colorableGroup
|
|
||||||
syn keyword BGa9a9a9 DarkGray contained containedin=@colorableGroup
|
|
||||||
syn keyword BG006400 DarkGreen contained containedin=@colorableGroup
|
|
||||||
syn keyword BGa9a9a9 DarkGrey contained containedin=@colorableGroup
|
|
||||||
syn keyword BGbdb76b DarkKhaki contained containedin=@colorableGroup
|
|
||||||
syn keyword BG8b008b DarkMagenta contained containedin=@colorableGroup
|
|
||||||
syn keyword BG556b2f DarkOliveGreen contained containedin=@colorableGroup
|
|
||||||
syn keyword BG9932cc DarkOrchid contained containedin=@colorableGroup
|
|
||||||
syn keyword BG8b0000 DarkRed contained containedin=@colorableGroup
|
|
||||||
syn keyword BGe9967a DarkSalmon contained containedin=@colorableGroup
|
|
||||||
syn keyword BG8fbc8f DarkSeaGreen contained containedin=@colorableGroup
|
|
||||||
syn keyword BG483d8b DarkSlateBlue contained containedin=@colorableGroup
|
|
||||||
syn keyword BG2f4f4f DarkSlateGray contained containedin=@colorableGroup
|
|
||||||
syn keyword BG2f4f4f DarkSlateGrey contained containedin=@colorableGroup
|
|
||||||
syn keyword BG00ced1 DarkTurquoise contained containedin=@colorableGroup
|
|
||||||
syn keyword BG9400d3 DarkViolet contained containedin=@colorableGroup
|
|
||||||
syn keyword BGff8c00 Darkorange contained containedin=@colorableGroup
|
|
||||||
syn keyword BGff1493 DeepPink contained containedin=@colorableGroup
|
|
||||||
syn keyword BG00bfff DeepSkyBlue contained containedin=@colorableGroup
|
|
||||||
syn keyword BG696969 DimGray contained containedin=@colorableGroup
|
|
||||||
syn keyword BG696969 DimGrey contained containedin=@colorableGroup
|
|
||||||
syn keyword BG1e90ff DodgerBlue contained containedin=@colorableGroup
|
|
||||||
syn keyword BGb22222 FireBrick contained containedin=@colorableGroup
|
|
||||||
syn keyword BGfffaf0 FloralWhite contained containedin=@colorableGroup
|
|
||||||
syn keyword BG228b22 ForestGreen contained containedin=@colorableGroup
|
|
||||||
syn keyword BGdcdcdc Gainsboro contained containedin=@colorableGroup
|
|
||||||
syn keyword BGf8f8ff GhostWhite contained containedin=@colorableGroup
|
|
||||||
syn keyword BGffd700 Gold contained containedin=@colorableGroup
|
|
||||||
syn keyword BGdaa520 GoldenRod contained containedin=@colorableGroup
|
|
||||||
syn keyword BGadff2f GreenYellow contained containedin=@colorableGroup
|
|
||||||
syn keyword BG808080 Grey contained containedin=@colorableGroup
|
|
||||||
syn keyword BGf0fff0 HoneyDew contained containedin=@colorableGroup
|
|
||||||
syn keyword BGff69b4 HotPink contained containedin=@colorableGroup
|
|
||||||
syn keyword BGcd5c5c IndianRed contained containedin=@colorableGroup
|
|
||||||
syn keyword BG4b0082 Indigo contained containedin=@colorableGroup
|
|
||||||
syn keyword BGfffff0 Ivory contained containedin=@colorableGroup
|
|
||||||
syn keyword BGf0e68c Khaki contained containedin=@colorableGroup
|
|
||||||
syn keyword BGe6e6fa Lavender contained containedin=@colorableGroup
|
|
||||||
syn keyword BGfff0f5 LavenderBlush contained containedin=@colorableGroup
|
|
||||||
syn keyword BG7cfc00 LawnGreen contained containedin=@colorableGroup
|
|
||||||
syn keyword BGfffacd LemonChiffon contained containedin=@colorableGroup
|
|
||||||
syn keyword BGadd8e6 LightBlue contained containedin=@colorableGroup
|
|
||||||
syn keyword BGf08080 LightCoral contained containedin=@colorableGroup
|
|
||||||
syn keyword BGe0ffff LightCyan contained containedin=@colorableGroup
|
|
||||||
syn keyword BGfafad2 LightGoldenRodYellow contained containedin=@colorableGroup
|
|
||||||
syn keyword BGd3d3d3 LightGray contained containedin=@colorableGroup
|
|
||||||
syn keyword BG90ee90 LightGreen contained containedin=@colorableGroup
|
|
||||||
syn keyword BGd3d3d3 LightGrey contained containedin=@colorableGroup
|
|
||||||
syn keyword BGffb6c1 LightPink contained containedin=@colorableGroup
|
|
||||||
syn keyword BGffa07a LightSalmon contained containedin=@colorableGroup
|
|
||||||
syn keyword BG20b2aa LightSeaGreen contained containedin=@colorableGroup
|
|
||||||
syn keyword BG87cefa LightSkyBlue contained containedin=@colorableGroup
|
|
||||||
syn keyword BG778899 LightSlateGray contained containedin=@colorableGroup
|
|
||||||
syn keyword BG778899 LightSlateGrey contained containedin=@colorableGroup
|
|
||||||
syn keyword BGb0c4de LightSteelBlue contained containedin=@colorableGroup
|
|
||||||
syn keyword BGffffe0 LightYellow contained containedin=@colorableGroup
|
|
||||||
syn keyword BG32cd32 LimeGreen contained containedin=@colorableGroup
|
|
||||||
syn keyword BGfaf0e6 Linen contained containedin=@colorableGroup
|
|
||||||
syn keyword BGff00ff Magenta contained containedin=@colorableGroup
|
|
||||||
syn keyword BG66cdaa MediumAquaMarine contained containedin=@colorableGroup
|
|
||||||
syn keyword BG0000cd MediumBlue contained containedin=@colorableGroup
|
|
||||||
syn keyword BGba55d3 MediumOrchid contained containedin=@colorableGroup
|
|
||||||
syn keyword BG9370d8 MediumPurple contained containedin=@colorableGroup
|
|
||||||
syn keyword BG3cb371 MediumSeaGreen contained containedin=@colorableGroup
|
|
||||||
syn keyword BG7b68ee MediumSlateBlue contained containedin=@colorableGroup
|
|
||||||
syn keyword BG00fa9a MediumSpringGreen contained containedin=@colorableGroup
|
|
||||||
syn keyword BG48d1cc MediumTurquoise contained containedin=@colorableGroup
|
|
||||||
syn keyword BGc71585 MediumVioletRed contained containedin=@colorableGroup
|
|
||||||
syn keyword BG191970 MidnightBlue contained containedin=@colorableGroup
|
|
||||||
syn keyword BGf5fffa MintCream contained containedin=@colorableGroup
|
|
||||||
syn keyword BGffe4e1 MistyRose contained containedin=@colorableGroup
|
|
||||||
syn keyword BGffe4b5 Moccasin contained containedin=@colorableGroup
|
|
||||||
syn keyword BGffdead NavajoWhite contained containedin=@colorableGroup
|
|
||||||
syn keyword BGfdf5e6 OldLace contained containedin=@colorableGroup
|
|
||||||
syn keyword BG6b8e23 OliveDrab contained containedin=@colorableGroup
|
|
||||||
syn keyword BGffa500 Orange contained containedin=@colorableGroup
|
|
||||||
syn keyword BGff4500 OrangeRed contained containedin=@colorableGroup
|
|
||||||
syn keyword BGda70d6 Orchid contained containedin=@colorableGroup
|
|
||||||
syn keyword BGeee8aa PaleGoldenRod contained containedin=@colorableGroup
|
|
||||||
syn keyword BG98fb98 PaleGreen contained containedin=@colorableGroup
|
|
||||||
syn keyword BGafeeee PaleTurquoise contained containedin=@colorableGroup
|
|
||||||
syn keyword BGd87093 PaleVioletRed contained containedin=@colorableGroup
|
|
||||||
syn keyword BGffefd5 PapayaWhip contained containedin=@colorableGroup
|
|
||||||
syn keyword BGffdab9 PeachPuff contained containedin=@colorableGroup
|
|
||||||
syn keyword BGcd853f Peru contained containedin=@colorableGroup
|
|
||||||
syn keyword BGffc0cb Pink contained containedin=@colorableGroup
|
|
||||||
syn keyword BGdda0dd Plum contained containedin=@colorableGroup
|
|
||||||
syn keyword BGb0e0e6 PowderBlue contained containedin=@colorableGroup
|
|
||||||
syn keyword BGbc8f8f RosyBrown contained containedin=@colorableGroup
|
|
||||||
syn keyword BG4169e1 RoyalBlue contained containedin=@colorableGroup
|
|
||||||
syn keyword BG8b4513 SaddleBrown contained containedin=@colorableGroup
|
|
||||||
syn keyword BGfa8072 Salmon contained containedin=@colorableGroup
|
|
||||||
syn keyword BGf4a460 SandyBrown contained containedin=@colorableGroup
|
|
||||||
syn keyword BG2e8b57 SeaGreen contained containedin=@colorableGroup
|
|
||||||
syn keyword BGfff5ee SeaShell contained containedin=@colorableGroup
|
|
||||||
syn keyword BGa0522d Sienna contained containedin=@colorableGroup
|
|
||||||
syn keyword BG87ceeb SkyBlue contained containedin=@colorableGroup
|
|
||||||
syn keyword BG6a5acd SlateBlue contained containedin=@colorableGroup
|
|
||||||
syn keyword BG708090 SlateGray contained containedin=@colorableGroup
|
|
||||||
syn keyword BG708090 SlateGrey contained containedin=@colorableGroup
|
|
||||||
syn keyword BGfffafa Snow contained containedin=@colorableGroup
|
|
||||||
syn keyword BG00ff7f SpringGreen contained containedin=@colorableGroup
|
|
||||||
syn keyword BG4682b4 SteelBlue contained containedin=@colorableGroup
|
|
||||||
syn keyword BGd2b48c Tan contained containedin=@colorableGroup
|
|
||||||
syn keyword BGd8bfd8 Thistle contained containedin=@colorableGroup
|
|
||||||
syn keyword BGff6347 Tomato contained containedin=@colorableGroup
|
|
||||||
syn keyword BG40e0d0 Turquoise contained containedin=@colorableGroup
|
|
||||||
syn keyword BGee82ee Violet contained containedin=@colorableGroup
|
|
||||||
syn keyword BGf5deb3 Wheat contained containedin=@colorableGroup
|
|
||||||
syn keyword BGf5f5f5 WhiteSmoke contained containedin=@colorableGroup
|
|
||||||
syn keyword BG9acd32 YellowGreen contained containedin=@colorableGroup
|
|
||||||
endfunction
|
|
||||||
3192
autoload/csv.vim
Normal file
3192
autoload/csv.vim
Normal file
File diff suppressed because it is too large
Load Diff
183
autoload/dart.vim
Normal file
183
autoload/dart.vim
Normal file
@@ -0,0 +1,183 @@
|
|||||||
|
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'dart') == -1
|
||||||
|
|
||||||
|
|
||||||
|
function! s:error(text) abort
|
||||||
|
echohl Error
|
||||||
|
echomsg printf('[dart-vim-plugin] %s', a:text)
|
||||||
|
echohl None
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:cexpr(errorformat, lines, reason) abort
|
||||||
|
call setqflist([], ' ', {
|
||||||
|
\ 'lines': a:lines,
|
||||||
|
\ 'efm': a:errorformat,
|
||||||
|
\ 'context': {'reason': a:reason},
|
||||||
|
\})
|
||||||
|
copen
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" If the quickfix list has a context matching [reason], clear and close it.
|
||||||
|
function! s:clearQfList(reason) abort
|
||||||
|
let context = get(getqflist({'context': 1}), 'context', {})
|
||||||
|
if type(context) == v:t_dict &&
|
||||||
|
\ has_key(context, 'reason') &&
|
||||||
|
\ context.reason == a:reason
|
||||||
|
call setqflist([], 'r')
|
||||||
|
cclose
|
||||||
|
endif
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! dart#fmt(q_args) abort
|
||||||
|
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
|
||||||
|
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
|
||||||
|
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`.
|
||||||
|
"
|
||||||
|
" If the file is a package: uri, looks for a .packages file to resolve the path.
|
||||||
|
" If the path cannot be resolved, or is not a package: uri, returns the
|
||||||
|
" original.
|
||||||
|
function! dart#resolveUri(uri) abort
|
||||||
|
if a:uri !~ 'package:'
|
||||||
|
return a:uri
|
||||||
|
endif
|
||||||
|
let package_name = substitute(a:uri, 'package:\(\w\+\)\/.*', '\1', '')
|
||||||
|
let [found, package_map] = s:PackageMap()
|
||||||
|
if !found
|
||||||
|
call s:error('cannot find .packages file')
|
||||||
|
return a:uri
|
||||||
|
endif
|
||||||
|
if !has_key(package_map, package_name)
|
||||||
|
call s:error('no package mapping for '.package_name)
|
||||||
|
return a:uri
|
||||||
|
endif
|
||||||
|
let package_lib = package_map[package_name]
|
||||||
|
return substitute(a:uri,
|
||||||
|
\ 'package:'.package_name,
|
||||||
|
\ escape(package_map[package_name], '\'),
|
||||||
|
\ '')
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" A map from package name to lib directory parse from a '.packages' file.
|
||||||
|
"
|
||||||
|
" Returns [found, package_map]
|
||||||
|
function! s:PackageMap() abort
|
||||||
|
let [found, dot_packages] = s:DotPackagesFile()
|
||||||
|
if !found
|
||||||
|
return [v:false, {}]
|
||||||
|
endif
|
||||||
|
let dot_packages_dir = fnamemodify(dot_packages, ':p:h')
|
||||||
|
let lines = readfile(dot_packages)
|
||||||
|
let map = {}
|
||||||
|
for line in lines
|
||||||
|
if line =~ '\s*#'
|
||||||
|
continue
|
||||||
|
endif
|
||||||
|
let package = substitute(line, ':.*$', '', '')
|
||||||
|
let lib_dir = substitute(line, '^[^:]*:', '', '')
|
||||||
|
if lib_dir =~ 'file:/'
|
||||||
|
let lib_dir = substitute(lib_dir, 'file://', '', '')
|
||||||
|
if lib_dir =~ '/[A-Z]:/'
|
||||||
|
let lib_dir = lib_dir[1:]
|
||||||
|
endif
|
||||||
|
else
|
||||||
|
let lib_dir = resolve(dot_packages_dir.'/'.lib_dir)
|
||||||
|
endif
|
||||||
|
if lib_dir =~ '/$'
|
||||||
|
let lib_dir = lib_dir[:len(lib_dir) - 2]
|
||||||
|
endif
|
||||||
|
let map[package] = lib_dir
|
||||||
|
endfor
|
||||||
|
return [v:true, map]
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" Toggle whether dartfmt is run on save or not.
|
||||||
|
function! dart#ToggleFormatOnSave() abort
|
||||||
|
if get(g:, "dart_format_on_save", 0)
|
||||||
|
let g:dart_format_on_save = 0
|
||||||
|
return
|
||||||
|
endif
|
||||||
|
let g:dart_format_on_save = 1
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" Finds a file name '.packages' in the cwd, or in any directory above the open
|
||||||
|
" file.
|
||||||
|
"
|
||||||
|
" Returns [found, file].
|
||||||
|
function! s:DotPackagesFile() abort
|
||||||
|
if filereadable('.packages')
|
||||||
|
return [v:true, '.packages']
|
||||||
|
endif
|
||||||
|
let dir_path = expand('%:p:h')
|
||||||
|
while v:true
|
||||||
|
let file_path = dir_path.'/.packages'
|
||||||
|
if filereadable(file_path)
|
||||||
|
return [v:true, file_path]
|
||||||
|
endif
|
||||||
|
let parent = fnamemodify(dir_path, ':h')
|
||||||
|
if dir_path == parent
|
||||||
|
break
|
||||||
|
endif
|
||||||
|
let dir_path = parent
|
||||||
|
endwhile
|
||||||
|
return [v:false, '']
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" Prevent writes to files in the pub cache.
|
||||||
|
function! dart#setModifiable() abort
|
||||||
|
let full_path = expand('%:p')
|
||||||
|
if full_path =~# '.pub-cache' ||
|
||||||
|
\ full_path =~# 'Pub\Cache'
|
||||||
|
setlocal nomodifiable
|
||||||
|
endif
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
endif
|
||||||
24
autoload/db/adapter/ecto.vim
Normal file
24
autoload/db/adapter/ecto.vim
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
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')])
|
||||||
|
|
||||||
|
function! s:repo_list() abort
|
||||||
|
return map(systemlist(s:cmd), 'split(v:val)')
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! db#adapter#ecto#canonicalize(url) abort
|
||||||
|
for l:item in s:repo_list()
|
||||||
|
let l:name = get(l:item, 0)
|
||||||
|
let l:url = get(l:item, 1)
|
||||||
|
if !empty(l:name) && 'ecto:'.l:name ==# a:url
|
||||||
|
return l:url
|
||||||
|
endif
|
||||||
|
endfor
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! db#adapter#ecto#complete_opaque(url) abort
|
||||||
|
return map(s:repo_list(), 'v:val[0]')
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
endif
|
||||||
365
autoload/elixir/indent.vim
Normal file
365
autoload/elixir/indent.vim
Normal file
@@ -0,0 +1,365 @@
|
|||||||
|
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
|
||||||
|
endif
|
||||||
|
|
||||||
|
" Return the effective value of 'shiftwidth'
|
||||||
|
function! s:sw()
|
||||||
|
return &shiftwidth == 0 ? &tabstop : &shiftwidth
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! elixir#indent#indent(lnum)
|
||||||
|
let lnum = a:lnum
|
||||||
|
let text = getline(lnum)
|
||||||
|
let prev_nb_lnum = prevnonblank(lnum-1)
|
||||||
|
let prev_nb_text = getline(prev_nb_lnum)
|
||||||
|
|
||||||
|
call s:debug("==> Indenting line " . lnum)
|
||||||
|
call s:debug("text = '" . text . "'")
|
||||||
|
|
||||||
|
let [_, curs_lnum, curs_col, _] = getpos('.')
|
||||||
|
call cursor(lnum, 0)
|
||||||
|
|
||||||
|
let handlers = [
|
||||||
|
\'top_of_file',
|
||||||
|
\'starts_with_string_continuation',
|
||||||
|
\'following_trailing_binary_operator',
|
||||||
|
\'starts_with_pipe',
|
||||||
|
\'starts_with_binary_operator',
|
||||||
|
\'inside_block',
|
||||||
|
\'starts_with_end',
|
||||||
|
\'inside_generic_block',
|
||||||
|
\'follow_prev_nb'
|
||||||
|
\]
|
||||||
|
for handler in handlers
|
||||||
|
call s:debug('testing handler elixir#indent#handle_'.handler)
|
||||||
|
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 == -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
|
||||||
|
endif
|
||||||
|
endfor
|
||||||
|
|
||||||
|
call s:debug("defaulting")
|
||||||
|
call cursor(curs_lnum, curs_col)
|
||||||
|
return 0
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:debug(str)
|
||||||
|
if exists("g:elixir_indent_debug") && g:elixir_indent_debug
|
||||||
|
echom a:str
|
||||||
|
endif
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:starts_with(context, expr)
|
||||||
|
return s:_starts_with(a:context.text, a:expr, a:context.lnum)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:prev_starts_with(context, expr)
|
||||||
|
return s:_starts_with(a:context.prev_nb_text, a:expr, a:context.prev_nb_lnum)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" Returns 0 or 1 based on whether or not the text starts with the given
|
||||||
|
" expression and is not a string or comment
|
||||||
|
function! s:_starts_with(text, expr, lnum)
|
||||||
|
let pos = match(a:text, '^\s*'.a:expr)
|
||||||
|
if pos == -1
|
||||||
|
return 0
|
||||||
|
else
|
||||||
|
" NOTE: @jbodah 2017-02-24: pos is the index of the match which is
|
||||||
|
" zero-indexed. Add one to make it the column number
|
||||||
|
if s:is_string_or_comment(a:lnum, pos + 1)
|
||||||
|
return 0
|
||||||
|
else
|
||||||
|
return 1
|
||||||
|
end
|
||||||
|
end
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:prev_ends_with(context, expr)
|
||||||
|
return s:_ends_with(a:context.prev_nb_text, a:expr, a:context.prev_nb_lnum)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" Returns 0 or 1 based on whether or not the text ends with the given
|
||||||
|
" expression and is not a string or comment
|
||||||
|
function! s:_ends_with(text, expr, lnum)
|
||||||
|
let pos = match(a:text, a:expr.'\s*$')
|
||||||
|
if pos == -1
|
||||||
|
return 0
|
||||||
|
else
|
||||||
|
if s:is_string_or_comment(a:lnum, pos)
|
||||||
|
return 0
|
||||||
|
else
|
||||||
|
return 1
|
||||||
|
end
|
||||||
|
end
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" Returns 0 or 1 based on whether or not the given line number and column
|
||||||
|
" number pair is a string or comment
|
||||||
|
function! s:is_string_or_comment(line, col)
|
||||||
|
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
|
||||||
|
" under the cursor is a string or comment
|
||||||
|
function! elixir#indent#searchpair_back_skip()
|
||||||
|
" NOTE: @jbodah 2017-02-27: for some reason this function gets called with
|
||||||
|
" and index that doesn't exist in the line sometimes. Detect and account for
|
||||||
|
" that situation
|
||||||
|
let curr_col = col('.')
|
||||||
|
if getline('.')[curr_col-1] == ''
|
||||||
|
let curr_col = curr_col-1
|
||||||
|
endif
|
||||||
|
return s:is_string_or_comment(line('.'), curr_col)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" DRY up regex for keywords that 1) makes sure we only look at complete words
|
||||||
|
" and 2) ignores atoms
|
||||||
|
function! s:keyword(expr)
|
||||||
|
return ':\@<!\<\C\%('.a:expr.'\)\>:\@!'
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" Start at the end of text and search backwards looking for a match. Also peek
|
||||||
|
" ahead if we get a match to make sure we get a complete match. This means
|
||||||
|
" that the result should be the position of the start of the right-most match
|
||||||
|
function! s:find_last_pos(lnum, text, match)
|
||||||
|
let last = len(a:text) - 1
|
||||||
|
let c = last
|
||||||
|
|
||||||
|
while c >= 0
|
||||||
|
let substr = strpart(a:text, c, last)
|
||||||
|
let peek = strpart(a:text, c - 1, last)
|
||||||
|
let ss_match = match(substr, a:match)
|
||||||
|
if ss_match != -1
|
||||||
|
let peek_match = match(peek, a:match)
|
||||||
|
if peek_match == ss_match + 1
|
||||||
|
let syng = synIDattr(synID(a:lnum, c + ss_match, 1), 'name')
|
||||||
|
if syng !~ '\%(String\|Comment\)'
|
||||||
|
return c + ss_match
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
let c -= 1
|
||||||
|
endwhile
|
||||||
|
|
||||||
|
return -1
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! elixir#indent#handle_top_of_file(context)
|
||||||
|
if a:context.prev_nb_lnum == 0
|
||||||
|
return 0
|
||||||
|
else
|
||||||
|
return -1
|
||||||
|
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
|
||||||
|
|
||||||
|
" Given the line at `lnum`, returns the indent of the line that acts as the 'base indent'
|
||||||
|
" for this line. In particular it traverses backwards up things like pipelines
|
||||||
|
" to find the beginning of the expression
|
||||||
|
function! s:get_base_indent(lnum, text)
|
||||||
|
let prev_nb_lnum = prevnonblank(a:lnum - 1)
|
||||||
|
let prev_nb_text = getline(prev_nb_lnum)
|
||||||
|
|
||||||
|
let binary_operator = '\%(=\|<>\|>>>\|<=\|||\|+\|\~\~\~\|-\|&&\|<<<\|/\|\^\^\^\|\*\)'
|
||||||
|
let data_structure_close = '\%(\]\|}\|)\)'
|
||||||
|
let pipe = '|>'
|
||||||
|
|
||||||
|
if s:_starts_with(a:text, binary_operator, a:lnum)
|
||||||
|
return s:get_base_indent(prev_nb_lnum, prev_nb_text)
|
||||||
|
elseif s:_starts_with(a:text, pipe, a:lnum)
|
||||||
|
return s:get_base_indent(prev_nb_lnum, prev_nb_text)
|
||||||
|
elseif s:_ends_with(prev_nb_text, binary_operator, prev_nb_lnum)
|
||||||
|
return s:get_base_indent(prev_nb_lnum, prev_nb_text)
|
||||||
|
elseif s:_ends_with(a:text, data_structure_close, a:lnum)
|
||||||
|
let data_structure_open = '\%(\[\|{\|(\)'
|
||||||
|
let close_match_idx = match(a:text, data_structure_close . '\s*$')
|
||||||
|
call cursor(a:lnum, close_match_idx + 1)
|
||||||
|
let [open_match_lnum, open_match_col] = searchpairpos(data_structure_open, '', data_structure_close, 'bnW')
|
||||||
|
let open_match_text = getline(open_match_lnum)
|
||||||
|
return s:get_base_indent(open_match_lnum, open_match_text)
|
||||||
|
else
|
||||||
|
return indent(a:lnum)
|
||||||
|
endif
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! elixir#indent#handle_following_trailing_binary_operator(context)
|
||||||
|
let binary_operator = '\%(=\|<>\|>>>\|<=\|||\|+\|\~\~\~\|-\|&&\|<<<\|/\|\^\^\^\|\*\)'
|
||||||
|
|
||||||
|
if s:prev_ends_with(a:context, binary_operator)
|
||||||
|
return indent(a:context.prev_nb_lnum) + s:sw()
|
||||||
|
else
|
||||||
|
return -1
|
||||||
|
endif
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! elixir#indent#handle_starts_with_pipe(context)
|
||||||
|
if s:starts_with(a:context, '|>')
|
||||||
|
let match_operator = '\%(!\|=\|<\|>\)\@<!=\%(=\|>\|\~\)\@!'
|
||||||
|
let pos = s:find_last_pos(a:context.prev_nb_lnum, a:context.prev_nb_text, match_operator)
|
||||||
|
if pos == -1
|
||||||
|
return indent(a:context.prev_nb_lnum)
|
||||||
|
else
|
||||||
|
let next_word_pos = match(strpart(a:context.prev_nb_text, pos+1, len(a:context.prev_nb_text)-1), '\S')
|
||||||
|
if next_word_pos == -1
|
||||||
|
return indent(a:context.prev_nb_lnum) + s:sw()
|
||||||
|
else
|
||||||
|
return pos + 1 + next_word_pos
|
||||||
|
end
|
||||||
|
end
|
||||||
|
else
|
||||||
|
return -1
|
||||||
|
endif
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! elixir#indent#handle_starts_with_end(context)
|
||||||
|
if s:starts_with(a:context, s:keyword('end'))
|
||||||
|
let pair_lnum = searchpair(s:keyword('do\|fn'), '', s:keyword('end').'\zs', 'bnW', "line('.') == " . line('.') . " || elixir#indent#searchpair_back_skip()")
|
||||||
|
return indent(pair_lnum)
|
||||||
|
else
|
||||||
|
return -1
|
||||||
|
endif
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! elixir#indent#handle_starts_with_binary_operator(context)
|
||||||
|
let binary_operator = '\%(=\|<>\|>>>\|<=\|||\|+\|\~\~\~\|-\|&&\|<<<\|/\|\^\^\^\|\*\)'
|
||||||
|
|
||||||
|
if s:starts_with(a:context, binary_operator)
|
||||||
|
let match_operator = '\%(!\|=\|<\|>\)\@<!=\%(=\|>\|\~\)\@!'
|
||||||
|
let pos = s:find_last_pos(a:context.prev_nb_lnum, a:context.prev_nb_text, match_operator)
|
||||||
|
if pos == -1
|
||||||
|
return indent(a:context.prev_nb_lnum)
|
||||||
|
else
|
||||||
|
let next_word_pos = match(strpart(a:context.prev_nb_text, pos+1, len(a:context.prev_nb_text)-1), '\S')
|
||||||
|
if next_word_pos == -1
|
||||||
|
return indent(a:context.prev_nb_lnum) + s:sw()
|
||||||
|
else
|
||||||
|
return pos + 1 + next_word_pos
|
||||||
|
end
|
||||||
|
end
|
||||||
|
else
|
||||||
|
return -1
|
||||||
|
endif
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" To handle nested structures properly we need to find the innermost
|
||||||
|
" nested structure. For example, we might be in a function in a map in a
|
||||||
|
" function, etc... so we need to first figure out what the innermost structure
|
||||||
|
" is then forward execution to the proper handler
|
||||||
|
function! elixir#indent#handle_inside_block(context)
|
||||||
|
let start_pattern = '\C\%(\<with\>\|\<if\>\|\<case\>\|\<cond\>\|\<try\>\|\<receive\>\|\<fn\>\|{\|\[\|(\)'
|
||||||
|
let end_pattern = '\C\%(\<end\>\|\]\|}\|)\)'
|
||||||
|
" hack - handle do: better
|
||||||
|
let block_info = searchpairpos(start_pattern, '', end_pattern, 'bnW', "line('.') == " . line('.') . " || elixir#indent#searchpair_back_skip() || getline(line('.')) =~ 'do:'", max([0, a:context.lnum - g:elixir_indent_max_lookbehind]))
|
||||||
|
let block_start_lnum = block_info[0]
|
||||||
|
let block_start_col = block_info[1]
|
||||||
|
if block_start_lnum != 0 || block_start_col != 0
|
||||||
|
let block_text = getline(block_start_lnum)
|
||||||
|
let block_start_char = block_text[block_start_col - 1]
|
||||||
|
|
||||||
|
let never_match = '\(a\)\@=b'
|
||||||
|
let config = {
|
||||||
|
\'f': {'aligned_clauses': s:keyword('end'), 'pattern_match_clauses': never_match},
|
||||||
|
\'c': {'aligned_clauses': s:keyword('end'), 'pattern_match_clauses': never_match},
|
||||||
|
\'t': {'aligned_clauses': s:keyword('end\|catch\|rescue\|after\|else'), 'pattern_match_clauses': s:keyword('catch\|rescue\|else')},
|
||||||
|
\'r': {'aligned_clauses': s:keyword('end\|after'), 'pattern_match_clauses': s:keyword('after')},
|
||||||
|
\'i': {'aligned_clauses': s:keyword('end\|else'), 'pattern_match_clauses': never_match},
|
||||||
|
\'[': {'aligned_clauses': ']', 'pattern_match_clauses': never_match},
|
||||||
|
\'{': {'aligned_clauses': '}', 'pattern_match_clauses': never_match},
|
||||||
|
\'(': {'aligned_clauses': ')', 'pattern_match_clauses': never_match}
|
||||||
|
\}
|
||||||
|
|
||||||
|
if block_start_char == 'w'
|
||||||
|
call s:debug("testing s:handle_with")
|
||||||
|
return s:handle_with(block_start_lnum, block_start_col, a:context)
|
||||||
|
else
|
||||||
|
let block_config = config[block_start_char]
|
||||||
|
if s:starts_with(a:context, block_config.aligned_clauses)
|
||||||
|
call s:debug("clause")
|
||||||
|
return indent(block_start_lnum)
|
||||||
|
else
|
||||||
|
let clause_lnum = searchpair(block_config.pattern_match_clauses, '', '*', 'bnW', "line('.') == " . line('.') . " || elixir#indent#searchpair_back_skip()", block_start_lnum)
|
||||||
|
let relative_lnum = max([clause_lnum, block_start_lnum])
|
||||||
|
call s:debug("pattern matching relative to lnum " . relative_lnum)
|
||||||
|
return s:do_handle_pattern_match_block(relative_lnum, a:context)
|
||||||
|
endif
|
||||||
|
end
|
||||||
|
else
|
||||||
|
return -1
|
||||||
|
end
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:handle_with(start_lnum, start_col, context)
|
||||||
|
let block_info = searchpairpos('\C\%(\<with\>\|\<do\>\|\<else\>\)', '', s:keyword('end'), 'bnW', "line('.') == " . line('.') . " || elixir#indent#searchpair_back_skip()")
|
||||||
|
let block_start_lnum = block_info[0]
|
||||||
|
let block_start_col = block_info[1]
|
||||||
|
|
||||||
|
let block_start_text = getline(block_start_lnum)
|
||||||
|
let block_start_char = block_start_text[block_start_col - 1]
|
||||||
|
|
||||||
|
if s:starts_with(a:context, s:keyword('do\|else\|end'))
|
||||||
|
return indent(a:start_lnum)
|
||||||
|
elseif block_start_char == 'w' || s:starts_with(a:context, '\C\(do\|else\):')
|
||||||
|
return indent(a:start_lnum) + 5
|
||||||
|
elseif s:_starts_with(block_start_text, '\C\(do\|else\):', a:start_lnum)
|
||||||
|
return indent(block_start_lnum) + s:sw()
|
||||||
|
else
|
||||||
|
return s:do_handle_pattern_match_block(a:start_lnum, a:context)
|
||||||
|
end
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:do_handle_pattern_match_block(relative_line, context)
|
||||||
|
let relative_indent = indent(a:relative_line)
|
||||||
|
" hack!
|
||||||
|
if a:context.text =~ '\(fn.*\)\@<!->'
|
||||||
|
call s:debug("current line contains ->; assuming match definition")
|
||||||
|
return relative_indent + s:sw()
|
||||||
|
elseif search('\(fn.*\)\@<!->', 'bnW', a:relative_line) != 0
|
||||||
|
call s:debug("a previous line contains ->; assuming match handler")
|
||||||
|
return relative_indent + 2 * s:sw()
|
||||||
|
else
|
||||||
|
call s:debug("couldn't find any previous ->; assuming body text")
|
||||||
|
return relative_indent + s:sw()
|
||||||
|
end
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! elixir#indent#handle_inside_generic_block(context)
|
||||||
|
let pair_lnum = searchpair(s:keyword('do\|fn'), '', s:keyword('end'), 'bW', "line('.') == ".a:context.lnum." || s:is_string_or_comment(line('.'), col('.'))", max([0, a:context.lnum - g:elixir_indent_max_lookbehind]))
|
||||||
|
if pair_lnum
|
||||||
|
" TODO: @jbodah 2017-03-29: this should probably be the case in *all*
|
||||||
|
" blocks
|
||||||
|
if s:prev_ends_with(a:context, ',')
|
||||||
|
return indent(pair_lnum) + 2 * s:sw()
|
||||||
|
else
|
||||||
|
return indent(pair_lnum) + s:sw()
|
||||||
|
endif
|
||||||
|
else
|
||||||
|
return -1
|
||||||
|
endif
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
endif
|
||||||
28
autoload/elixir/util.vim
Normal file
28
autoload/elixir/util.vim
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'elixir') == -1
|
||||||
|
|
||||||
|
function! elixir#util#get_filename(word) abort
|
||||||
|
let word = a:word
|
||||||
|
|
||||||
|
" get first thing that starts uppercase, until the first space or end of line
|
||||||
|
let word = substitute(word,'^\s*\(\u[^ ]\+\).*$','\1','g')
|
||||||
|
|
||||||
|
" remove any trailing characters that don't look like a nested module
|
||||||
|
let word = substitute(word,'\.\U.*$','','g')
|
||||||
|
|
||||||
|
" replace module dots with slash
|
||||||
|
let word = substitute(word,'\.','/','g')
|
||||||
|
|
||||||
|
" remove any special chars
|
||||||
|
let word = substitute(word,'[^A-z0-9-_/]','','g')
|
||||||
|
|
||||||
|
" convert to snake_case
|
||||||
|
let word = substitute(word,'\(\u\+\)\(\u\l\)','\1_\2','g')
|
||||||
|
let word = substitute(word,'\(\u\+\)\(\u\l\)','\1_\2','g')
|
||||||
|
let word = substitute(word,'\(\l\|\d\)\(\u\)','\1_\2','g')
|
||||||
|
let word = substitute(word,'-','_','g')
|
||||||
|
let word = tolower(word)
|
||||||
|
|
||||||
|
return word
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
endif
|
||||||
385
autoload/elm.vim
Normal file
385
autoload/elm.vim
Normal file
@@ -0,0 +1,385 @@
|
|||||||
|
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'elm') == -1
|
||||||
|
|
||||||
|
let s:errors = []
|
||||||
|
|
||||||
|
function! s:elmOracle(...) abort
|
||||||
|
let l:project = finddir('elm-stuff/..', '.;')
|
||||||
|
if len(l:project) == 0
|
||||||
|
echoerr '`elm-stuff` not found! run `elm-package install` for autocomplete.'
|
||||||
|
return []
|
||||||
|
endif
|
||||||
|
|
||||||
|
let l:filename = expand('%:p')
|
||||||
|
|
||||||
|
if a:0 == 0
|
||||||
|
let l:oldiskeyword = &iskeyword
|
||||||
|
" Some non obvious values used in 'iskeyword':
|
||||||
|
" @ = all alpha
|
||||||
|
" 48-57 = numbers 0 to 9
|
||||||
|
" @-@ = character @
|
||||||
|
" 124 = |
|
||||||
|
setlocal iskeyword=@,48-57,@-@,_,-,~,!,#,$,%,&,*,+,=,<,>,/,?,.,\\,124,^
|
||||||
|
let l:word = expand('<cword>')
|
||||||
|
let &iskeyword = l:oldiskeyword
|
||||||
|
else
|
||||||
|
let l:word = a:1
|
||||||
|
endif
|
||||||
|
|
||||||
|
let l:infos = elm#Oracle(l:filename, l:word)
|
||||||
|
if v:shell_error != 0
|
||||||
|
call elm#util#EchoError("elm-oracle failed:\n\n", l:infos)
|
||||||
|
return []
|
||||||
|
endif
|
||||||
|
|
||||||
|
let l:d = split(l:infos, '\n')
|
||||||
|
if len(l:d) > 0
|
||||||
|
return elm#util#DecodeJSON(l:d[0])
|
||||||
|
endif
|
||||||
|
|
||||||
|
return []
|
||||||
|
endf
|
||||||
|
|
||||||
|
" Vim command to format Elm files with elm-format
|
||||||
|
function! elm#Format() abort
|
||||||
|
" check for elm-format
|
||||||
|
if elm#util#CheckBin('elm-format', 'https://github.com/avh4/elm-format') ==# ''
|
||||||
|
return
|
||||||
|
endif
|
||||||
|
|
||||||
|
" save cursor position, folds and many other things
|
||||||
|
let l:curw = {}
|
||||||
|
try
|
||||||
|
mkview!
|
||||||
|
catch
|
||||||
|
let l:curw = winsaveview()
|
||||||
|
endtry
|
||||||
|
|
||||||
|
" save our undo file to be restored after we are done.
|
||||||
|
let l:tmpundofile = tempname()
|
||||||
|
exe 'wundo! ' . l:tmpundofile
|
||||||
|
|
||||||
|
" write current unsaved buffer to a temporary file
|
||||||
|
let l:tmpname = tempname() . '.elm'
|
||||||
|
call writefile(getline(1, '$'), l:tmpname)
|
||||||
|
|
||||||
|
" call elm-format on the temporary file
|
||||||
|
let l:out = system('elm-format ' . l:tmpname . ' --output ' . l:tmpname)
|
||||||
|
|
||||||
|
" if there is no error
|
||||||
|
if v:shell_error == 0
|
||||||
|
try | silent undojoin | catch | endtry
|
||||||
|
|
||||||
|
" replace current file with temp file, then reload buffer
|
||||||
|
let l:old_fileformat = &fileformat
|
||||||
|
call rename(l:tmpname, expand('%'))
|
||||||
|
silent edit!
|
||||||
|
let &fileformat = l:old_fileformat
|
||||||
|
let &syntax = &syntax
|
||||||
|
elseif g:elm_format_fail_silently == 0
|
||||||
|
call elm#util#EchoLater('EchoError', 'elm-format:', l:out)
|
||||||
|
endif
|
||||||
|
|
||||||
|
" save our undo history
|
||||||
|
silent! exe 'rundo ' . l:tmpundofile
|
||||||
|
call delete(l:tmpundofile)
|
||||||
|
|
||||||
|
" restore our cursor/windows positions, folds, etc..
|
||||||
|
if empty(l:curw)
|
||||||
|
silent! loadview
|
||||||
|
else
|
||||||
|
call winrestview(l:curw)
|
||||||
|
endif
|
||||||
|
endf
|
||||||
|
|
||||||
|
" Query elm-oracle and echo the type and docs for the word under the cursor.
|
||||||
|
function! elm#ShowDocs() abort
|
||||||
|
" check for the elm-oracle binary
|
||||||
|
if elm#util#CheckBin('elm-oracle', 'https://github.com/elmcast/elm-oracle') ==# ''
|
||||||
|
return
|
||||||
|
endif
|
||||||
|
|
||||||
|
let l:response = s:elmOracle()
|
||||||
|
|
||||||
|
if len(l:response) > 0
|
||||||
|
let l:info = l:response[0]
|
||||||
|
redraws! | echohl Identifier | echon l:info.fullName | echohl None | echon ' : ' | echohl Function | echon l:info.signature | echohl None | echon "\n\n" . l:info.comment
|
||||||
|
else
|
||||||
|
call elm#util#Echo('elm-oracle:', '...no match found')
|
||||||
|
endif
|
||||||
|
endf
|
||||||
|
|
||||||
|
" Query elm-oracle and open the docs for the word under the cursor.
|
||||||
|
function! elm#BrowseDocs() abort
|
||||||
|
" check for the elm-oracle binary
|
||||||
|
if elm#util#CheckBin('elm-oracle', 'https://github.com/elmcast/elm-oracle') ==# ''
|
||||||
|
return
|
||||||
|
endif
|
||||||
|
|
||||||
|
let l:response = s:elmOracle()
|
||||||
|
|
||||||
|
if len(l:response) > 0
|
||||||
|
let l:info = l:response[0]
|
||||||
|
call elm#util#OpenBrowser(l:info.href)
|
||||||
|
else
|
||||||
|
call elm#util#Echo('elm-oracle:', '...no match found')
|
||||||
|
endif
|
||||||
|
endf
|
||||||
|
|
||||||
|
|
||||||
|
function! elm#Syntastic(input) abort
|
||||||
|
let l:fixes = []
|
||||||
|
|
||||||
|
let l:bin = 'elm-make'
|
||||||
|
let l:format = '--report=json'
|
||||||
|
let l:input = shellescape(a:input)
|
||||||
|
let l:output = '--output=' . shellescape(syntastic#util#DevNull())
|
||||||
|
let l:command = l:bin . ' ' . l:format . ' ' . l:input . ' ' . l:output
|
||||||
|
let l:reports = s:ExecuteInRoot(l:command)
|
||||||
|
|
||||||
|
for l:report in split(l:reports, '\n')
|
||||||
|
if l:report[0] ==# '['
|
||||||
|
for l:error in elm#util#DecodeJSON(l:report)
|
||||||
|
if g:elm_syntastic_show_warnings == 0 && l:error.type ==? 'warning'
|
||||||
|
else
|
||||||
|
if a:input == l:error.file
|
||||||
|
call add(s:errors, l:error)
|
||||||
|
call add(l:fixes, {'filename': l:error.file,
|
||||||
|
\'valid': 1,
|
||||||
|
\'bufnr': bufnr('%'),
|
||||||
|
\'type': (l:error.type ==? 'error') ? 'E' : 'W',
|
||||||
|
\'lnum': l:error.region.start.line,
|
||||||
|
\'col': l:error.region.start.column,
|
||||||
|
\'text': l:error.overview})
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
endfor
|
||||||
|
endif
|
||||||
|
endfor
|
||||||
|
|
||||||
|
return l:fixes
|
||||||
|
endf
|
||||||
|
|
||||||
|
function! elm#Build(input, output, show_warnings) abort
|
||||||
|
let s:errors = []
|
||||||
|
let l:fixes = []
|
||||||
|
let l:rawlines = []
|
||||||
|
|
||||||
|
let l:bin = 'elm-make'
|
||||||
|
let l:format = '--report=json'
|
||||||
|
let l:input = shellescape(a:input)
|
||||||
|
let l:output = '--output=' . shellescape(a:output)
|
||||||
|
let l:command = l:bin . ' ' . l:format . ' ' . l:input . ' ' . l:output
|
||||||
|
let l:reports = s:ExecuteInRoot(l:command)
|
||||||
|
|
||||||
|
for l:report in split(l:reports, '\n')
|
||||||
|
if l:report[0] ==# '['
|
||||||
|
for l:error in elm#util#DecodeJSON(l:report)
|
||||||
|
if a:show_warnings == 0 && l:error.type ==? 'warning'
|
||||||
|
else
|
||||||
|
call add(s:errors, l:error)
|
||||||
|
call add(l:fixes, {'filename': l:error.file,
|
||||||
|
\'valid': 1,
|
||||||
|
\'type': (l:error.type ==? 'error') ? 'E' : 'W',
|
||||||
|
\'lnum': l:error.region.start.line,
|
||||||
|
\'col': l:error.region.start.column,
|
||||||
|
\'text': l:error.overview})
|
||||||
|
endif
|
||||||
|
endfor
|
||||||
|
else
|
||||||
|
call add(l:rawlines, l:report)
|
||||||
|
endif
|
||||||
|
endfor
|
||||||
|
|
||||||
|
let l:details = join(l:rawlines, "\n")
|
||||||
|
let l:lines = split(l:details, "\n")
|
||||||
|
if !empty(l:lines)
|
||||||
|
let l:overview = l:lines[0]
|
||||||
|
else
|
||||||
|
let l:overview = ''
|
||||||
|
endif
|
||||||
|
|
||||||
|
if l:details ==# '' || l:details =~? '^Successfully.*'
|
||||||
|
else
|
||||||
|
call add(s:errors, {'overview': l:details, 'details': l:details})
|
||||||
|
call add(l:fixes, {'filename': expand('%', 1),
|
||||||
|
\'valid': 1,
|
||||||
|
\'type': 'E',
|
||||||
|
\'lnum': 0,
|
||||||
|
\'col': 0,
|
||||||
|
\'text': l:overview})
|
||||||
|
endif
|
||||||
|
|
||||||
|
return l:fixes
|
||||||
|
endf
|
||||||
|
|
||||||
|
" Make the given file, or the current file if none is given.
|
||||||
|
function! elm#Make(...) abort
|
||||||
|
if elm#util#CheckBin('elm-make', 'http://elm-lang.org/install') ==# ''
|
||||||
|
return
|
||||||
|
endif
|
||||||
|
|
||||||
|
call elm#util#Echo('elm-make:', 'building...')
|
||||||
|
|
||||||
|
let l:input = (a:0 == 0) ? expand('%:p') : a:1
|
||||||
|
let l:fixes = elm#Build(l:input, g:elm_make_output_file, g:elm_make_show_warnings)
|
||||||
|
|
||||||
|
if len(l:fixes) > 0
|
||||||
|
call elm#util#EchoWarning('', 'found ' . len(l:fixes) . ' errors')
|
||||||
|
|
||||||
|
call setqflist(l:fixes, 'r')
|
||||||
|
cwindow
|
||||||
|
|
||||||
|
if get(g:, 'elm_jump_to_error', 1)
|
||||||
|
ll 1
|
||||||
|
endif
|
||||||
|
else
|
||||||
|
call elm#util#EchoSuccess('', 'Sucessfully compiled')
|
||||||
|
|
||||||
|
call setqflist([])
|
||||||
|
cwindow
|
||||||
|
endif
|
||||||
|
endf
|
||||||
|
|
||||||
|
" Show the detail of the current error in the quickfix window.
|
||||||
|
function! elm#ErrorDetail() abort
|
||||||
|
if !empty(filter(tabpagebuflist(), 'getbufvar(v:val, "&buftype") ==? "quickfix"'))
|
||||||
|
exec ':copen'
|
||||||
|
let l:linenr = line('.')
|
||||||
|
exec ':wincmd p'
|
||||||
|
if len(s:errors) > 0
|
||||||
|
let l:detail = s:errors[l:linenr-1].details
|
||||||
|
if l:detail ==# ''
|
||||||
|
let l:detail = s:errors[l:linenr-1].overview
|
||||||
|
endif
|
||||||
|
echo l:detail
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
endf
|
||||||
|
|
||||||
|
" Open the elm repl in a subprocess.
|
||||||
|
function! elm#Repl() abort
|
||||||
|
" check for the elm-repl binary
|
||||||
|
if elm#util#CheckBin('elm-repl', 'http://elm-lang.org/install') ==# ''
|
||||||
|
return
|
||||||
|
endif
|
||||||
|
|
||||||
|
if has('nvim')
|
||||||
|
term('elm-repl')
|
||||||
|
else
|
||||||
|
!elm-repl
|
||||||
|
endif
|
||||||
|
endf
|
||||||
|
|
||||||
|
function! elm#Oracle(filepath, word) abort
|
||||||
|
let l:bin = 'elm-oracle'
|
||||||
|
let l:filepath = shellescape(a:filepath)
|
||||||
|
let l:word = shellescape(a:word)
|
||||||
|
let l:command = l:bin . ' ' . l:filepath . ' ' . l:word
|
||||||
|
return s:ExecuteInRoot(l:command)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
let s:fullComplete = ''
|
||||||
|
|
||||||
|
" Complete the current token using elm-oracle
|
||||||
|
function! elm#Complete(findstart, base) abort
|
||||||
|
" a:base is unused, but the callback function for completion expects 2 arguments
|
||||||
|
if a:findstart
|
||||||
|
let l:line = getline('.')
|
||||||
|
|
||||||
|
let l:idx = col('.') - 1
|
||||||
|
let l:start = 0
|
||||||
|
while l:idx > 0 && l:line[l:idx - 1] =~# '[a-zA-Z0-9_\.]'
|
||||||
|
if l:line[l:idx - 1] ==# '.' && l:start == 0
|
||||||
|
let l:start = l:idx
|
||||||
|
endif
|
||||||
|
let l:idx -= 1
|
||||||
|
endwhile
|
||||||
|
|
||||||
|
if l:start == 0
|
||||||
|
let l:start = l:idx
|
||||||
|
endif
|
||||||
|
|
||||||
|
let s:fullComplete = l:line[l:idx : col('.')-2]
|
||||||
|
|
||||||
|
return l:start
|
||||||
|
else
|
||||||
|
" check for the elm-oracle binary
|
||||||
|
if elm#util#CheckBin('elm-oracle', 'https://github.com/elmcast/elm-oracle') ==# ''
|
||||||
|
return []
|
||||||
|
endif
|
||||||
|
|
||||||
|
let l:res = []
|
||||||
|
let l:response = s:elmOracle(s:fullComplete)
|
||||||
|
|
||||||
|
let l:detailed = get(g:, 'elm_detailed_complete', 0)
|
||||||
|
|
||||||
|
for l:r in l:response
|
||||||
|
let l:menu = ''
|
||||||
|
if l:detailed
|
||||||
|
let l:menu = ': ' . l:r.signature
|
||||||
|
endif
|
||||||
|
call add(l:res, {'word': l:r.name, 'menu': l:menu})
|
||||||
|
endfor
|
||||||
|
|
||||||
|
return l:res
|
||||||
|
endif
|
||||||
|
endf
|
||||||
|
|
||||||
|
" If the current buffer contains a consoleRunner, run elm-test with it.
|
||||||
|
" Otherwise run elm-test in the root of your project which deafults to
|
||||||
|
" running 'elm-test tests/TestRunner'.
|
||||||
|
function! elm#Test() abort
|
||||||
|
if elm#util#CheckBin('elm-test', 'https://github.com/rtfeldman/node-elm-test') ==# ''
|
||||||
|
return
|
||||||
|
endif
|
||||||
|
|
||||||
|
if match(getline(1, '$'), 'consoleRunner') < 0
|
||||||
|
let l:out = s:ExecuteInRoot('elm-test')
|
||||||
|
call elm#util#EchoSuccess('elm-test', l:out)
|
||||||
|
else
|
||||||
|
let l:filepath = shellescape(expand('%:p'))
|
||||||
|
let l:out = s:ExecuteInRoot('elm-test ' . l:filepath)
|
||||||
|
call elm#util#EchoSuccess('elm-test', l:out)
|
||||||
|
endif
|
||||||
|
endf
|
||||||
|
|
||||||
|
" Returns the closest parent with an elm-package.json file.
|
||||||
|
function! elm#FindRootDirectory() abort
|
||||||
|
let l:elm_root = getbufvar('%', 'elmRoot')
|
||||||
|
if empty(l:elm_root)
|
||||||
|
let l:current_file = expand('%:p')
|
||||||
|
let l:dir_current_file = fnameescape(fnamemodify(l:current_file, ':h'))
|
||||||
|
let l:old_match = findfile('elm-package.json', l:dir_current_file . ';')
|
||||||
|
let l:new_match = findfile('elm.json', l:dir_current_file . ';')
|
||||||
|
if !empty(l:new_match)
|
||||||
|
let l:elm_root = fnamemodify(l:new_match, ':p:h')
|
||||||
|
elseif !empty(l:old_match)
|
||||||
|
let l:elm_root = fnamemodify(l:old_match, ':p:h')
|
||||||
|
else
|
||||||
|
let l:elm_root = ''
|
||||||
|
endif
|
||||||
|
|
||||||
|
if !empty(l:elm_root)
|
||||||
|
call setbufvar('%', 'elmRoot', l:elm_root)
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
return l:elm_root
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" Executes a command in the project directory.
|
||||||
|
function! s:ExecuteInRoot(cmd) abort
|
||||||
|
let l:cd = exists('*haslocaldir') && haslocaldir() ? 'lcd ' : 'cd '
|
||||||
|
let l:current_dir = getcwd()
|
||||||
|
let l:root_dir = elm#FindRootDirectory()
|
||||||
|
|
||||||
|
try
|
||||||
|
execute l:cd . fnameescape(l:root_dir)
|
||||||
|
let l:out = system(a:cmd)
|
||||||
|
finally
|
||||||
|
execute l:cd . fnameescape(l:current_dir)
|
||||||
|
endtry
|
||||||
|
|
||||||
|
return l:out
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
endif
|
||||||
184
autoload/elm/util.vim
Normal file
184
autoload/elm/util.vim
Normal file
@@ -0,0 +1,184 @@
|
|||||||
|
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'elm') == -1
|
||||||
|
|
||||||
|
" IsWin returns 1 if current OS is Windows or 0 otherwise
|
||||||
|
fun! elm#util#IsWin() abort
|
||||||
|
let l:win = ['win16', 'win32', 'win32unix', 'win64', 'win95']
|
||||||
|
for l:w in l:win
|
||||||
|
if (has(l:w))
|
||||||
|
return 1
|
||||||
|
endif
|
||||||
|
endfor
|
||||||
|
|
||||||
|
return 0
|
||||||
|
endf
|
||||||
|
|
||||||
|
fun! elm#util#CheckBin(bin, url) abort
|
||||||
|
let l:binpath = substitute(a:bin, '^\s*\(.\{-}\)\s*$', '\1', '')
|
||||||
|
|
||||||
|
if executable(l:binpath)
|
||||||
|
return l:binpath
|
||||||
|
endif
|
||||||
|
|
||||||
|
call elm#util#EchoWarning('elm-vim:', 'could not find ' . l:binpath . ' [' . a:url . ']')
|
||||||
|
|
||||||
|
return ''
|
||||||
|
endf
|
||||||
|
|
||||||
|
" Determines the browser command to use
|
||||||
|
fun! s:get_browser_command() abort
|
||||||
|
let l:elm_browser_command = get(g:, 'elm_browser_command', '')
|
||||||
|
if l:elm_browser_command ==? ''
|
||||||
|
if elm#util#IsWin()
|
||||||
|
let l:elm_browser_command = '!start rundll32 url.dll,FileProtocolHandler %URL%'
|
||||||
|
elseif has('mac') || has('macunix') || has('gui_macvim') || system('uname') =~? '^darwin'
|
||||||
|
let l:elm_browser_command = 'open %URL%'
|
||||||
|
elseif executable('xdg-open')
|
||||||
|
let l:elm_browser_command = 'xdg-open %URL%'
|
||||||
|
elseif executable('firefox')
|
||||||
|
let l:elm_browser_command = 'firefox %URL% &'
|
||||||
|
else
|
||||||
|
let l:elm_browser_command = ''
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
return l:elm_browser_command
|
||||||
|
endf
|
||||||
|
|
||||||
|
" OpenBrowser opens a url in the default browser
|
||||||
|
fun! elm#util#OpenBrowser(url) abort
|
||||||
|
let l:cmd = s:get_browser_command()
|
||||||
|
if len(l:cmd) == 0
|
||||||
|
redraw
|
||||||
|
echohl WarningMsg
|
||||||
|
echo "It seems that you don't have general web browser. Open URL below."
|
||||||
|
echohl None
|
||||||
|
echo a:url
|
||||||
|
return
|
||||||
|
endif
|
||||||
|
if l:cmd =~? '^!'
|
||||||
|
let l:cmd = substitute(l:cmd, '%URL%', '\=shellescape(a:url)', 'g')
|
||||||
|
silent! exec l:cmd
|
||||||
|
elseif l:cmd =~# '^:[A-Z]'
|
||||||
|
let l:cmd = substitute(l:cmd, '%URL%', '\=a:url', 'g')
|
||||||
|
exec l:cmd
|
||||||
|
else
|
||||||
|
let l:cmd = substitute(l:cmd, '%URL%', '\=shellescape(a:url)', 'g')
|
||||||
|
call system(l:cmd)
|
||||||
|
endif
|
||||||
|
endf
|
||||||
|
|
||||||
|
" DecodeJSON decodes a string of json into a viml object
|
||||||
|
fun! elm#util#DecodeJSON(s) abort
|
||||||
|
let l:true = 1
|
||||||
|
let l:false = 0
|
||||||
|
let l:null = 0
|
||||||
|
return eval(a:s)
|
||||||
|
endf
|
||||||
|
|
||||||
|
" Remove ANSI escape characters used for highlighting purposes
|
||||||
|
fun! s:strip_color(msg) abort
|
||||||
|
return substitute(a:msg, '\e\[[0-9;]\+[mK]', '', 'g')
|
||||||
|
endf
|
||||||
|
|
||||||
|
" Print functions
|
||||||
|
fun! elm#util#Echo(title, msg) abort
|
||||||
|
redraws! | echon a:title . ' ' | echohl Identifier | echon s:strip_color(a:msg) | echohl None
|
||||||
|
endf
|
||||||
|
|
||||||
|
fun! elm#util#EchoSuccess(title, msg) abort
|
||||||
|
redraws! | echon a:title . ' ' | echohl Function | echon s:strip_color(a:msg) | echohl None
|
||||||
|
endf
|
||||||
|
|
||||||
|
fun! elm#util#EchoWarning(title, msg) abort
|
||||||
|
redraws! | echon a:title . ' ' | echohl WarningMsg | echon s:strip_color(a:msg) | echohl None
|
||||||
|
endf
|
||||||
|
|
||||||
|
fun! elm#util#EchoError(title, msg) abort
|
||||||
|
redraws! | echon a:title . ' ' | echohl ErrorMsg | echon s:strip_color(a:msg) | echohl None
|
||||||
|
endf
|
||||||
|
|
||||||
|
fun! elm#util#EchoLater(func_name, title, msg) abort
|
||||||
|
let s:echo_func_name = a:func_name
|
||||||
|
let s:echo_title = a:title
|
||||||
|
let s:echo_msg = a:msg
|
||||||
|
endf
|
||||||
|
|
||||||
|
fun! elm#util#EchoStored() abort
|
||||||
|
if exists('s:echo_func_name') && exists('s:echo_title') && exists('s:echo_msg')
|
||||||
|
call elm#util#{s:echo_func_name}(s:echo_title, s:echo_msg)
|
||||||
|
unlet s:echo_func_name
|
||||||
|
unlet s:echo_title
|
||||||
|
unlet s:echo_msg
|
||||||
|
endif
|
||||||
|
endf
|
||||||
|
|
||||||
|
function! elm#util#GoToModule(name)
|
||||||
|
if empty(a:name) | return | endif
|
||||||
|
if empty(matchstr(a:name, '^Native\.'))
|
||||||
|
let l:extension = '.elm'
|
||||||
|
else
|
||||||
|
let l:extension = '.js'
|
||||||
|
endif
|
||||||
|
let l:rel_path = substitute(a:name, '\.', '/', 'g') . l:extension
|
||||||
|
let l:root = elm#FindRootDirectory()
|
||||||
|
|
||||||
|
let l:module_file = s:findLocalModule(l:rel_path, l:root)
|
||||||
|
if !filereadable(l:module_file)
|
||||||
|
let l:module_file = s:findDependencyModule(l:rel_path, l:root)
|
||||||
|
endif
|
||||||
|
|
||||||
|
if filereadable(l:module_file)
|
||||||
|
exec 'edit ' . fnameescape(l:module_file)
|
||||||
|
else
|
||||||
|
return s:error("Can't find module \"" . a:name . "\"")
|
||||||
|
endif
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:findLocalModule(rel_path, root)
|
||||||
|
let l:old_match = findfile('elm-package.json', a:root . ';')
|
||||||
|
let l:new_match = findfile('elm.json', a:root . ';')
|
||||||
|
if !empty(l:new_match)
|
||||||
|
let l:package_json = l:new_match
|
||||||
|
elseif !empty(l:old_match)
|
||||||
|
let l:package_json = l:old_match
|
||||||
|
endif
|
||||||
|
if exists('*json_decode')
|
||||||
|
let l:package = json_decode(readfile(l:package_json))
|
||||||
|
let l:source_roots = l:package['source-directories']
|
||||||
|
else
|
||||||
|
" This is a fallback for vim's which do not support json_decode.
|
||||||
|
" It simply only looks in the 'src' subdirectory and fails otherwise.
|
||||||
|
let l:source_roots = ['src']
|
||||||
|
end
|
||||||
|
for l:source_root in l:source_roots
|
||||||
|
let l:file_path = a:root . '/' . l:source_root . '/' . a:rel_path
|
||||||
|
if !filereadable(l:file_path)
|
||||||
|
continue
|
||||||
|
endif
|
||||||
|
return l:file_path
|
||||||
|
endfor
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:findDependencyModule(rel_path, root)
|
||||||
|
" If we are a dependency ourselves, we need to check our siblings.
|
||||||
|
" This is because elm package doesn't install dependencies recursively.
|
||||||
|
let l:root = substitute(a:root, '\/elm-stuff/packages.\+$', '', '')
|
||||||
|
|
||||||
|
" We naively craws the dependencies dir for any fitting module name.
|
||||||
|
" If it exists, we'll find it. If multiple filenames match,
|
||||||
|
" there's a chance we return the wrong one.
|
||||||
|
let l:module_paths = glob(l:root . '/elm-stuff/packages/**/' . a:rel_path, 0, 1)
|
||||||
|
if len(l:module_paths) > 0
|
||||||
|
return l:module_paths[0]
|
||||||
|
endif
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" Using the built-in :echoerr prints a stacktrace, which isn't that nice.
|
||||||
|
" From: https://github.com/moll/vim-node/blob/master/autoload/node.vim
|
||||||
|
function! s:error(msg)
|
||||||
|
echohl ErrorMsg
|
||||||
|
echomsg a:msg
|
||||||
|
echohl NONE
|
||||||
|
let v:errmsg = a:msg
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
endif
|
||||||
71
autoload/fish.vim
Normal file
71
autoload/fish.vim
Normal file
@@ -0,0 +1,71 @@
|
|||||||
|
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'fish') == -1
|
||||||
|
|
||||||
|
function! fish#Indent()
|
||||||
|
let l:shiftwidth = shiftwidth()
|
||||||
|
let l:prevlnum = prevnonblank(v:lnum - 1)
|
||||||
|
if l:prevlnum ==# 0
|
||||||
|
return 0
|
||||||
|
endif
|
||||||
|
let l:indent = 0
|
||||||
|
let l:prevline = getline(l:prevlnum)
|
||||||
|
if l:prevline =~# '\v^\s*switch>'
|
||||||
|
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(l:prevlnum) - (l:indent ==# 0 ? l:shiftwidth : l:indent)
|
||||||
|
elseif l:line =~# '\v^\s*%(case|else)>'
|
||||||
|
return indent(l:prevlnum) - l:shiftwidth
|
||||||
|
endif
|
||||||
|
return indent(l:prevlnum) + l:indent
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! fish#Format()
|
||||||
|
if mode() =~# '\v^%(i|R)$'
|
||||||
|
return 1
|
||||||
|
else
|
||||||
|
let l:command = v:lnum.','.(v:lnum+v:count-1).'!fish_indent'
|
||||||
|
echo l:command
|
||||||
|
execute l:command
|
||||||
|
endif
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! fish#Fold()
|
||||||
|
let l:line = getline(v:lnum)
|
||||||
|
if l:line =~# '\v^\s*%(begin|if|while|for|function|switch)>'
|
||||||
|
return 'a1'
|
||||||
|
elseif l:line =~# '\v^\s*end>'
|
||||||
|
return 's1'
|
||||||
|
else
|
||||||
|
return '='
|
||||||
|
end
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! fish#Complete(findstart, base)
|
||||||
|
if a:findstart
|
||||||
|
return getline('.') =~# '\v^\s*$' ? -1 : 0
|
||||||
|
else
|
||||||
|
if empty(a:base)
|
||||||
|
return []
|
||||||
|
endif
|
||||||
|
let l:results = []
|
||||||
|
let l:completions =
|
||||||
|
\ system('fish -c "complete -C'.shellescape(a:base).'"')
|
||||||
|
let l:cmd = substitute(a:base, '\v\S+$', '', '')
|
||||||
|
for l:line in split(l:completions, '\n')
|
||||||
|
let l:tokens = split(l:line, '\t')
|
||||||
|
call add(l:results, {'word': l:cmd.l:tokens[0],
|
||||||
|
\'abbr': l:tokens[0],
|
||||||
|
\'menu': get(l:tokens, 1, '')})
|
||||||
|
endfor
|
||||||
|
return l:results
|
||||||
|
endif
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! fish#errorformat()
|
||||||
|
return '%Afish: %m,%-G%*\\ ^,%-Z%f (line %l):%s'
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
endif
|
||||||
539
autoload/go/config.vim
Normal file
539
autoload/go/config.vim
Normal file
@@ -0,0 +1,539 @@
|
|||||||
|
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
|
||||||
|
set cpo&vim
|
||||||
|
|
||||||
|
function! go#config#AutodetectGopath() abort
|
||||||
|
return get(g:, 'go_autodetect_gopath', 0)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! go#config#ListTypeCommands() abort
|
||||||
|
return get(g:, 'go_list_type_commands', {})
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! go#config#VersionWarning() abort
|
||||||
|
return get(g:, 'go_version_warning', 1)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! go#config#BuildTags() abort
|
||||||
|
return get(g:, 'go_build_tags', '')
|
||||||
|
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
|
||||||
|
return get(g:, 'go_test_timeout', '10s')
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! go#config#TestShowName() abort
|
||||||
|
return get(g:, 'go_test_show_name', 0)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! go#config#TermHeight() abort
|
||||||
|
return get(g:, 'go_term_height', winheight(0))
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! go#config#TermWidth() abort
|
||||||
|
return get(g:, 'go_term_width', winwidth(0))
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
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)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! go#config#SetTermEnabled(value) abort
|
||||||
|
let g:go_term_enabled = a:value
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! go#config#TemplateUsePkg() abort
|
||||||
|
return get(g:, 'go_template_use_pkg', 0)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! go#config#TemplateTestFile() abort
|
||||||
|
return get(g:, 'go_template_test_file', "hello_world_test.go")
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! go#config#TemplateFile() abort
|
||||||
|
return get(g:, 'go_template_file', "hello_world.go")
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! go#config#StatuslineDuration() abort
|
||||||
|
return get(g:, 'go_statusline_duration', 60000)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! go#config#SnippetEngine() abort
|
||||||
|
return get(g:, 'go_snippet_engine', 'automatic')
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! go#config#PlayBrowserCommand() abort
|
||||||
|
if go#util#IsWin()
|
||||||
|
let go_play_browser_command = '!start rundll32 url.dll,FileProtocolHandler %URL%'
|
||||||
|
elseif go#util#IsMac()
|
||||||
|
let go_play_browser_command = 'open %URL%'
|
||||||
|
elseif executable('xdg-open')
|
||||||
|
let go_play_browser_command = 'xdg-open %URL%'
|
||||||
|
elseif executable('firefox')
|
||||||
|
let go_play_browser_command = 'firefox %URL% &'
|
||||||
|
elseif executable('chromium')
|
||||||
|
let go_play_browser_command = 'chromium %URL% &'
|
||||||
|
else
|
||||||
|
let go_play_browser_command = ''
|
||||||
|
endif
|
||||||
|
|
||||||
|
return get(g:, 'go_play_browser_command', go_play_browser_command)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! go#config#MetalinterDeadline() abort
|
||||||
|
" gometalinter has a default deadline of 5 seconds only when asynchronous
|
||||||
|
" jobs are not supported.
|
||||||
|
|
||||||
|
let deadline = '5s'
|
||||||
|
if go#util#has_job() && has('lambda')
|
||||||
|
let deadline = ''
|
||||||
|
endif
|
||||||
|
|
||||||
|
return get(g:, 'go_metalinter_deadline', deadline)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! go#config#ListType() abort
|
||||||
|
return get(g:, 'go_list_type', '')
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! go#config#ListAutoclose() abort
|
||||||
|
return get(g:, 'go_list_autoclose', 1)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! go#config#InfoMode() abort
|
||||||
|
return get(g:, 'go_info_mode', 'gopls')
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! go#config#GuruScope() abort
|
||||||
|
let scope = get(g:, 'go_guru_scope', [])
|
||||||
|
|
||||||
|
if !empty(scope)
|
||||||
|
" strip trailing slashes for each path in scope. bug:
|
||||||
|
" https://github.com/golang/go/issues/14584
|
||||||
|
let scopes = go#util#StripTrailingSlash(scope)
|
||||||
|
endif
|
||||||
|
|
||||||
|
return scope
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! go#config#SetGuruScope(scope) abort
|
||||||
|
if empty(a:scope)
|
||||||
|
if exists('g:go_guru_scope')
|
||||||
|
unlet g:go_guru_scope
|
||||||
|
endif
|
||||||
|
else
|
||||||
|
let g:go_guru_scope = a:scope
|
||||||
|
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
|
||||||
|
|
||||||
|
function! go#config#DocUrl() abort
|
||||||
|
let godoc_url = get(g:, 'go_doc_url', 'https://godoc.org')
|
||||||
|
if godoc_url isnot 'https://godoc.org'
|
||||||
|
" strip last '/' character if available
|
||||||
|
let last_char = strlen(godoc_url) - 1
|
||||||
|
if godoc_url[last_char] == '/'
|
||||||
|
let godoc_url = strpart(godoc_url, 0, last_char)
|
||||||
|
endif
|
||||||
|
" custom godoc installations expect /pkg before package names
|
||||||
|
let godoc_url .= "/pkg"
|
||||||
|
endif
|
||||||
|
return godoc_url
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! go#config#DocPopupWindow() abort
|
||||||
|
return get(g:, 'go_doc_popup_window', 0)
|
||||||
|
endfunction
|
||||||
|
function! go#config#DefReuseBuffer() abort
|
||||||
|
return get(g:, 'go_def_reuse_buffer', 0)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! go#config#DefMode() abort
|
||||||
|
return get(g:, 'go_def_mode', 'gopls')
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! go#config#DeclsIncludes() abort
|
||||||
|
return get(g:, 'go_decls_includes', 'func,type')
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! go#config#Debug() abort
|
||||||
|
return get(g:, 'go_debug', [])
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! go#config#DebugWindows() abort
|
||||||
|
return get(g:, 'go_debug_windows', {
|
||||||
|
\ 'vars': 'leftabove 30vnew',
|
||||||
|
\ 'stack': 'leftabove 20new',
|
||||||
|
\ 'goroutines': 'botright 10new',
|
||||||
|
\ 'out': 'botright 5new',
|
||||||
|
\ }
|
||||||
|
\ )
|
||||||
|
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! go#config#DebugAddress() abort
|
||||||
|
return get(g:, 'go_debug_address', '127.0.0.1:8181')
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! go#config#DebugCommands() abort
|
||||||
|
" make sure g:go_debug_commands is set so that it can be added to easily.
|
||||||
|
let g:go_debug_commands = get(g:, 'go_debug_commands', [])
|
||||||
|
return g:go_debug_commands
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! go#config#DebugLogOutput() abort
|
||||||
|
return get(g:, 'go_debug_log_output', 'debugger,rpc')
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! go#config#LspLog() abort
|
||||||
|
" make sure g:go_lsp_log is set so that it can be added to easily.
|
||||||
|
let g:go_lsp_log = get(g:, 'go_lsp_log', [])
|
||||||
|
return g:go_lsp_log
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! go#config#SetDebugDiag(value) abort
|
||||||
|
let g:go_debug_diag = a:value
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! go#config#AutoSameids() abort
|
||||||
|
return get(g:, 'go_auto_sameids', 0)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! go#config#SetAutoSameids(value) abort
|
||||||
|
let g:go_auto_sameids = a:value
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! go#config#AddtagsTransform() abort
|
||||||
|
return get(g:, 'go_addtags_transform', "snakecase")
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! go#config#TemplateAutocreate() abort
|
||||||
|
return get(g:, "go_template_autocreate", 1)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! go#config#SetTemplateAutocreate(value) abort
|
||||||
|
let g:go_template_autocreate = a:value
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! go#config#MetalinterCommand() abort
|
||||||
|
return get(g:, "go_metalinter_command", "golangci-lint")
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! go#config#MetalinterAutosaveEnabled() abort
|
||||||
|
let l:default_enabled = ["vet", "golint"]
|
||||||
|
|
||||||
|
if go#config#MetalinterCommand() == "golangci-lint"
|
||||||
|
let l:default_enabled = ["govet", "golint"]
|
||||||
|
endif
|
||||||
|
|
||||||
|
return get(g:, "go_metalinter_autosave_enabled", default_enabled)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! go#config#MetalinterEnabled() abort
|
||||||
|
let l:default_enabled = ["vet", "golint", "errcheck"]
|
||||||
|
|
||||||
|
if go#config#MetalinterCommand() == "golangci-lint"
|
||||||
|
let l:default_enabled = ["govet", "golint"]
|
||||||
|
endif
|
||||||
|
|
||||||
|
return get(g:, "go_metalinter_enabled", default_enabled)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! go#config#GolintBin() abort
|
||||||
|
return get(g:, "go_golint_bin", "golint")
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! go#config#ErrcheckBin() abort
|
||||||
|
return get(g:, "go_errcheck_bin", "errcheck")
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! go#config#MetalinterAutosave() abort
|
||||||
|
return get(g:, "go_metalinter_autosave", 0)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! go#config#SetMetalinterAutosave(value) abort
|
||||||
|
let g:go_metalinter_autosave = a:value
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! go#config#ListHeight() abort
|
||||||
|
return get(g:, "go_list_height", 0)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! go#config#FmtAutosave() abort
|
||||||
|
return get(g:, "go_fmt_autosave", 1)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! go#config#SetFmtAutosave(value) abort
|
||||||
|
let g:go_fmt_autosave = a:value
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! go#config#AsmfmtAutosave() abort
|
||||||
|
return get(g:, "go_asmfmt_autosave", 0)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! go#config#SetAsmfmtAutosave(value) abort
|
||||||
|
let g:go_asmfmt_autosave = a:value
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! go#config#ModFmtAutosave() abort
|
||||||
|
return get(g:, "go_mod_fmt_autosave", 1)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! go#config#SetModFmtAutosave(value) abort
|
||||||
|
let g:go_mod_fmt_autosave = a:value
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! go#config#DocMaxHeight() abort
|
||||||
|
return get(g:, "go_doc_max_height", 20)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! go#config#AutoTypeInfo() abort
|
||||||
|
return get(g:, "go_auto_type_info", 0)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! go#config#SetAutoTypeInfo(value) abort
|
||||||
|
let g:go_auto_type_info = a:value
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! go#config#AlternateMode() abort
|
||||||
|
return get(g:, "go_alternate_mode", "edit")
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! go#config#DeclsMode() abort
|
||||||
|
return get(g:, "go_decls_mode", "")
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! go#config#FmtCommand() abort
|
||||||
|
return get(g:, "go_fmt_command", "gofmt")
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! go#config#FmtOptions() abort
|
||||||
|
return get(b:, "go_fmt_options", get(g:, "go_fmt_options", {}))
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! go#config#FmtFailSilently() abort
|
||||||
|
return get(g:, "go_fmt_fail_silently", 0)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! go#config#FmtExperimental() abort
|
||||||
|
return get(g:, "go_fmt_experimental", 0 )
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
|
function! go#config#GorenamePrefill() abort
|
||||||
|
return get(g:, "go_gorename_prefill", 'expand("<cword>") =~# "^[A-Z]"' .
|
||||||
|
\ '? go#util#pascalcase(expand("<cword>"))' .
|
||||||
|
\ ': go#util#camelcase(expand("<cword>"))')
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! go#config#TextobjIncludeFunctionDoc() abort
|
||||||
|
return get(g:, "go_textobj_include_function_doc", 1)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! go#config#TextobjIncludeVariable() abort
|
||||||
|
return get(g:, "go_textobj_include_variable", 1)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! go#config#BinPath() abort
|
||||||
|
return get(g:, "go_bin_path", "")
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! go#config#SearchBinPathFirst() abort
|
||||||
|
return get(g:, 'go_search_bin_path_first', 1)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! go#config#HighlightArrayWhitespaceError() abort
|
||||||
|
return get(g:, 'go_highlight_array_whitespace_error', 0)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! go#config#HighlightChanWhitespaceError() abort
|
||||||
|
return get(g:, 'go_highlight_chan_whitespace_error', 0)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! go#config#HighlightExtraTypes() abort
|
||||||
|
return get(g:, 'go_highlight_extra_types', 0)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! go#config#HighlightSpaceTabError() abort
|
||||||
|
return get(g:, 'go_highlight_space_tab_error', 0)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! go#config#HighlightTrailingWhitespaceError() abort
|
||||||
|
return get(g:, 'go_highlight_trailing_whitespace_error', 0)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! go#config#HighlightOperators() abort
|
||||||
|
return get(g:, 'go_highlight_operators', 0)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! go#config#HighlightFunctions() abort
|
||||||
|
return get(g:, 'go_highlight_functions', 0)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! go#config#HighlightFunctionParameters() abort
|
||||||
|
" fallback to highlight_function_arguments for backwards compatibility
|
||||||
|
return get(g:, 'go_highlight_function_parameters', get(g:, 'go_highlight_function_arguments', 0))
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! go#config#HighlightFunctionCalls() abort
|
||||||
|
return get(g:, 'go_highlight_function_calls', 0)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! go#config#HighlightFields() abort
|
||||||
|
return get(g:, 'go_highlight_fields', 0)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! go#config#HighlightTypes() abort
|
||||||
|
return get(g:, 'go_highlight_types', 0)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! go#config#HighlightBuildConstraints() abort
|
||||||
|
return get(g:, 'go_highlight_build_constraints', 0)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! go#config#HighlightStringSpellcheck() abort
|
||||||
|
return get(g:, 'go_highlight_string_spellcheck', 1)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! go#config#HighlightFormatStrings() abort
|
||||||
|
return get(g:, 'go_highlight_format_strings', 1)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! go#config#HighlightGenerateTags() abort
|
||||||
|
return get(g:, 'go_highlight_generate_tags', 0)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! go#config#HighlightVariableAssignments() abort
|
||||||
|
return get(g:, 'go_highlight_variable_assignments', 0)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
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#FoldEnable(...) abort
|
||||||
|
if a:0 > 0
|
||||||
|
return index(go#config#FoldEnable(), a:1) > -1
|
||||||
|
endif
|
||||||
|
return get(g:, 'go_fold_enable', ['block', 'import', 'varconst', 'package_comment'])
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! go#config#EchoGoInfo() abort
|
||||||
|
return get(g:, "go_echo_go_info", 1)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
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#GoplsCompleteUnimported() abort
|
||||||
|
return get(g:, 'go_gopls_complete_unimported', 0)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! go#config#GoplsDeepCompletion() abort
|
||||||
|
return get(g:, 'go_gopls_deep_completion', 1)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! go#config#GoplsFuzzyMatching() abort
|
||||||
|
return get(g:, 'go_gopls_fuzzy_matching', 1)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! go#config#GoplsUsePlaceholders() abort
|
||||||
|
return get(g:, 'go_gopls_use_placeholders', 0)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! go#config#GoplsEnabled() abort
|
||||||
|
return get(g:, 'go_gopls_enabled', 1)
|
||||||
|
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
|
||||||
|
unlet g:go_gorename_prefill
|
||||||
|
endif
|
||||||
|
|
||||||
|
" restore Vi compatibility settings
|
||||||
|
let &cpo = s:cpo_save
|
||||||
|
unlet s:cpo_save
|
||||||
|
|
||||||
|
" vim: sw=2 ts=2 et
|
||||||
|
|
||||||
|
endif
|
||||||
16
autoload/graphql.vim
Normal file
16
autoload/graphql.vim
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'graphql') == -1
|
||||||
|
|
||||||
|
" Vim plugin
|
||||||
|
" Language: GraphQL
|
||||||
|
" Maintainer: Jon Parise <jon@indelible.org>
|
||||||
|
|
||||||
|
if exists('g:autoloaded_graphql')
|
||||||
|
finish
|
||||||
|
endif
|
||||||
|
let g:autoloaded_graphql = 1
|
||||||
|
|
||||||
|
function! graphql#javascript_tags() abort
|
||||||
|
return get(g:, 'graphql_javascript_tags', ['gql', 'graphql', 'Relay.QL'])
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
endif
|
||||||
File diff suppressed because it is too large
Load Diff
41
autoload/jsx_pretty/comment.vim
Normal file
41
autoload/jsx_pretty/comment.vim
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
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 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')
|
||||||
|
let &l:commentstring = '<!-- %s -->'
|
||||||
|
elseif syn_name =~? '^jsxAttrib'
|
||||||
|
let &l:commentstring = '// %s'
|
||||||
|
else
|
||||||
|
let &l:commentstring = '{/* %s */}'
|
||||||
|
endif
|
||||||
|
else
|
||||||
|
let &l:commentstring = a:original
|
||||||
|
endif
|
||||||
|
|
||||||
|
" Restore the cursor position
|
||||||
|
call setpos('.', save_cursor)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:syn_name(lnum, cnum)
|
||||||
|
let syn_id = get(synstack(a:lnum, a:cnum), -1)
|
||||||
|
return synIDattr(syn_id, "name")
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:syn_contains(lnum, cnum, syn_name)
|
||||||
|
let stack = synstack(a:lnum, a:cnum)
|
||||||
|
let syn_names = map(stack, 'synIDattr(v:val, "name")')
|
||||||
|
return index(syn_names, a:syn_name) >= 0
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
endif
|
||||||
306
autoload/jsx_pretty/indent.vim
Normal file
306
autoload/jsx_pretty/indent.vim
Normal file
@@ -0,0 +1,306 @@
|
|||||||
|
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()
|
||||||
|
return shiftwidth()
|
||||||
|
endfunction
|
||||||
|
else
|
||||||
|
function! s:sw()
|
||||||
|
return &sw
|
||||||
|
endfunction
|
||||||
|
endif
|
||||||
|
|
||||||
|
" 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 stack at the given position
|
||||||
|
function s:syntax_stack_at(lnum, col)
|
||||||
|
return map(synstack(a:lnum, a:col), 'synIDattr(v:val, "name")')
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" Get the syntax at the given position
|
||||||
|
function s:syntax_at(lnum, col)
|
||||||
|
return synIDattr(synID(a:lnum, a:col, 1), 'name')
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" Get the start col of the non-space charactor
|
||||||
|
function s:start_col(lnum)
|
||||||
|
return len(matchstr(getline(a:lnum), '^\s*')) + 1
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" 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
|
||||||
|
|
||||||
|
" 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
|
||||||
|
|
||||||
|
" Whether the specified stytax group is the opening tag
|
||||||
|
function s:is_opening_tag(syntax)
|
||||||
|
return a:syntax =~? 'jsxOpenPunct'
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" Whether the specified stytax group is the closing tag
|
||||||
|
function s:is_closing_tag(syntax)
|
||||||
|
return a:syntax =~? 'jsxClose'
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" Whether the specified syntax group is the jsxRegion
|
||||||
|
function s:is_jsx_region(syntax)
|
||||||
|
return a:syntax =~? 'jsxRegion'
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" 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
|
||||||
|
|
||||||
|
|
||||||
|
function! jsx_pretty#indent#get(js_indent)
|
||||||
|
let line = s:trim(getline(v:lnum))
|
||||||
|
let start_syntax = s:start_syntax(v:lnum)
|
||||||
|
|
||||||
|
if s:is_jsx_backticks(start_syntax)
|
||||||
|
return s:jsx_indent_backticks(v:lnum)
|
||||||
|
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 indent(prev_lnum)
|
||||||
|
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 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
|
||||||
|
endif
|
||||||
|
|
||||||
|
return a:js_indent()
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
endif
|
||||||
188
autoload/julia.vim
Normal file
188
autoload/julia.vim
Normal file
@@ -0,0 +1,188 @@
|
|||||||
|
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
|
||||||
|
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
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
if exists("loaded_matchit")
|
||||||
|
|
||||||
|
function! julia#toggle_function_blockassign()
|
||||||
|
let sav_pos = getcurpos()
|
||||||
|
let l = getline('.')
|
||||||
|
let c = match(l, '\C\m\<function\s\+.\+(')
|
||||||
|
if c != -1
|
||||||
|
return julia#function_block2assign()
|
||||||
|
endif
|
||||||
|
let c = match(l, '\C\m)\%(::\S\+\)\?\%(\s\+where\s\+.*\)\?\s*=\s*')
|
||||||
|
if c == -1
|
||||||
|
echohl WarningMsg | echo "Not on a function definition or assignment line" | echohl None
|
||||||
|
return
|
||||||
|
endif
|
||||||
|
return julia#function_assign2block()
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! julia#function_block2assign()
|
||||||
|
let sav_pos = getcurpos()
|
||||||
|
let l = getline('.')
|
||||||
|
let c = match(l, '\C\m\<function\s\+.\+(')
|
||||||
|
if c == -1
|
||||||
|
echohl WarningMsg | echo "Not on a function definition line" | echohl None
|
||||||
|
return
|
||||||
|
endif
|
||||||
|
let fpos = copy(sav_pos)
|
||||||
|
let fpos[2] = c+1
|
||||||
|
call setpos('.', fpos)
|
||||||
|
normal %
|
||||||
|
if line('.') != fpos[1]+2 || match(getline('.'), '\C\m^\s*end\s*$') == -1
|
||||||
|
echohl WarningMsg | echo "Only works with 3-lines functions" | echohl None
|
||||||
|
call setpos('.', sav_pos)
|
||||||
|
return
|
||||||
|
endif
|
||||||
|
call setpos('.', fpos)
|
||||||
|
normal! f(
|
||||||
|
normal %
|
||||||
|
while line('.') == fpos[1] && match(l[col('.')-1:], '\C\m)(') == 0
|
||||||
|
normal! l
|
||||||
|
normal %
|
||||||
|
endwhile
|
||||||
|
if line('.') != fpos[1] || match(l[(col('.')-1):], '\C\m)\%(::\S\+\)\?\%(\s\+where\s\+.*\)\?\s*$') != 0
|
||||||
|
echohl WarningMsg | echo "Unrecognized function definition format" | echohl None
|
||||||
|
call setpos('.', sav_pos)
|
||||||
|
return
|
||||||
|
endif
|
||||||
|
|
||||||
|
call setpos('.', fpos)
|
||||||
|
normal! dwA = J
|
||||||
|
if match(getline('.')[(col('.')-1):], '\C\mreturn\>') == 0
|
||||||
|
normal! dw
|
||||||
|
endif
|
||||||
|
if match(getline('.')[(col('.')-1):], '\C\m\s*$') == 0
|
||||||
|
normal! F=C= nothing
|
||||||
|
endif
|
||||||
|
normal! jddk^
|
||||||
|
return
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! julia#function_assign2block()
|
||||||
|
let sav_pos = getcurpos()
|
||||||
|
let l = getline('.')
|
||||||
|
let c = match(l, '\C\m)\%(::\S\+\)\?\%(\s\+where\s\+.*\)\?\s*=\s*')
|
||||||
|
if c == -1
|
||||||
|
echohl WarningMsg | echo "Not on a function assignment-definition line" | echohl None
|
||||||
|
return
|
||||||
|
endif
|
||||||
|
normal ^
|
||||||
|
while match(l[(col('.')-1):], '\%(\S\+\.\)*@') == 0
|
||||||
|
normal! W
|
||||||
|
endwhile
|
||||||
|
normal! ifunction
|
||||||
|
let l = getline('.')
|
||||||
|
let c = match(l, '\C\m)\%(::\S\+\)\?\%(\s\+where\s\+.*\)\?\s*\zs=\s*')
|
||||||
|
let eqpos = copy(sav_pos)
|
||||||
|
let eqpos[2] = c+1
|
||||||
|
call setpos('.', eqpos)
|
||||||
|
normal! cw
|
||||||
|
oend
|
||||||
|
normal %
|
||||||
|
s/\s*$// | noh
|
||||||
|
return
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
|
||||||
|
let s:nonid_chars = "\U01-\U07" . "\U0E-\U1F" .
|
||||||
|
\ "\"#$'(,.:;=?@`\\U5B{" .
|
||||||
|
\ "\U80-\UA1" . "\UA7\UA8\UAB\UAD\UAF\UB4" . "\UB6-\UB8" . "\UBB\UBF"
|
||||||
|
|
||||||
|
let s:nonidS_chars = "[:space:])\\U5D}" . s:nonid_chars
|
||||||
|
|
||||||
|
" the following excludes '!' since it can be used as an identifier,
|
||||||
|
" and '$' since it can be used in interpolations
|
||||||
|
" note that \U2D is '-'
|
||||||
|
let s:uniop_chars = "+\\U2D~¬√∛∜"
|
||||||
|
|
||||||
|
let s:binop_chars = "=+\\U2D*/\\%÷^&|⊻<>≤≥≡≠≢∈∉⋅×∪∩⊆⊈⊂⊄⊊←→∋∌⊕⊖⊞⊟∘∧⊗⊘↑↓∨⊠±"
|
||||||
|
|
||||||
|
" the following is a list of all remainig valid operator chars,
|
||||||
|
" but it's more efficient when expressed with ranges (see below)
|
||||||
|
" let s:binop_chars_extra = "↔↚↛↠↣↦↮⇎⇏⇒⇔⇴⇶⇷⇸⇹⇺⇻⇼⇽⇾⇿⟵⟶⟷⟷⟹⟺⟻⟼⟽⟾⟿⤀⤁⤂⤃⤄⤅⤆⤇⤌⤍⤎⤏⤐⤑⤔⤕⤖⤗⤘⤝⤞⤟⤠⥄⥅⥆⥇⥈⥊⥋⥎⥐⥒⥓⥖⥗⥚⥛⥞⥟⥢⥤⥦⥧⥨⥩⥪⥫⥬⥭⥰⧴⬱⬰⬲⬳⬴⬵⬶⬷⬸⬹⬺⬻⬼⬽⬾⬿⭀⭁⭂⭃⭄⭇⭈⭉⭊⭋⭌←→" .
|
||||||
|
" \ "∝∊∍∥∦∷∺∻∽∾≁≃≄≅≆≇≈≉≊≋≌≍≎≐≑≒≓≔≕≖≗≘≙≚≛≜≝≞≟≣≦≧≨≩≪≫≬≭≮≯≰≱≲≳≴≵≶≷≸≹≺≻≼≽≾≿⊀⊁⊃⊅⊇⊉⊋⊏⊐⊑⊒⊜⊩⊬⊮⊰⊱⊲⊳⊴⊵⊶⊷⋍⋐⋑⋕⋖⋗⋘⋙⋚⋛⋜⋝⋞⋟⋠⋡⋢⋣⋤⋥⋦⋧⋨⋩⋪⋫⋬⋭⋲⋳⋴⋵⋶⋷⋸⋹⋺⋻⋼⋽⋾⋿⟈⟉⟒⦷⧀⧁⧡⧣⧤⧥⩦⩧⩪⩫⩬⩭⩮⩯⩰⩱⩲⩳⩴⩵⩶⩷⩸⩹⩺⩻⩼⩽⩾⩿⪀⪁⪂⪃⪄⪅⪆⪇⪈⪉⪊⪋⪌⪍⪎⪏⪐⪑⪒⪓⪔⪕⪖⪗⪘⪙⪚⪛⪜⪝⪞⪟⪠⪡⪢⪣⪤⪥⪦⪧⪨⪩⪪⪫⪬⪭⪮⪯⪰⪱⪲⪳⪴⪵⪶⪷⪸⪹⪺⪻⪼⪽⪾⪿⫀⫁⫂⫃⫄⫅⫆⫇⫈⫉⫊⫋⫌⫍⫎⫏⫐⫑⫒⫓⫔⫕⫖⫗⫘⫙⫷⫸⫹⫺⊢⊣" .
|
||||||
|
" \ "⊔∓∔∸≂≏⊎⊽⋎⋓⧺⧻⨈⨢⨣⨤⨥⨦⨧⨨⨩⨪⨫⨬⨭⨮⨹⨺⩁⩂⩅⩊⩌⩏⩐⩒⩔⩖⩗⩛⩝⩡⩢⩣" .
|
||||||
|
" \ "⊙⊚⊛⊡⊓∗∙∤⅋≀⊼⋄⋆⋇⋉⋊⋋⋌⋏⋒⟑⦸⦼⦾⦿⧶⧷⨇⨰⨱⨲⨳⨴⨵⨶⨷⨸⨻⨼⨽⩀⩃⩄⩋⩍⩎⩑⩓⩕⩘⩚⩜⩞⩟⩠⫛⊍▷⨝⟕⟖⟗" .
|
||||||
|
" \ "⇵⟰⟱⤈⤉⤊⤋⤒⤓⥉⥌⥍⥏⥑⥔⥕⥘⥙⥜⥝⥠⥡⥣⥥⥮⥯↑↓"
|
||||||
|
|
||||||
|
" same as above, but with character ranges, for performance
|
||||||
|
let s:binop_chars_extra = "\\U214B\\U2190-\\U2194\\U219A\\U219B\\U21A0\\U21A3\\U21A6\\U21AE\\U21CE\\U21CF\\U21D2\\U21D4\\U21F4-\\U21FF\\U2208-\\U220D\\U2213\\U2214\\U2217-\\U2219\\U221D\\U2224-\\U222A\\U2237\\U2238\\U223A\\U223B\\U223D\\U223E\\U2240-\\U228B\\U228D-\\U229C\\U229E-\\U22A3\\U22A9\\U22AC\\U22AE\\U22B0-\\U22B7\\U22BB-\\U22BD\\U22C4-\\U22C7\\U22C9-\\U22D3\\U22D5-\\U22ED\\U22F2-\\U22FF\\U25B7\\U27C8\\U27C9\\U27D1\\U27D2\\U27D5-\\U27D7\\U27F0\\U27F1\\U27F5-\\U27F7\\U27F7\\U27F9-\\U27FF\\U2900-\\U2918\\U291D-\\U2920\\U2944-\\U2970\\U29B7\\U29B8\\U29BC\\U29BE-\\U29C1\\U29E1\\U29E3-\\U29E5\\U29F4\\U29F6\\U29F7\\U29FA\\U29FB\\U2A07\\U2A08\\U2A1D\\U2A22-\\U2A2E\\U2A30-\\U2A3D\\U2A40-\\U2A45\\U2A4A-\\U2A58\\U2A5A-\\U2A63\\U2A66\\U2A67\\U2A6A-\\U2AD9\\U2ADB\\U2AF7-\\U2AFA\\U2B30-\\U2B44\\U2B47-\\U2B4C\\UFFE9-\\UFFEC"
|
||||||
|
|
||||||
|
" a Julia identifier, sort of
|
||||||
|
let s:idregex = '[^' . s:nonidS_chars . '0-9!' . s:uniop_chars . s:binop_chars . '][^' . s:nonidS_chars . s:uniop_chars . s:binop_chars . s:binop_chars_extra . ']*'
|
||||||
|
|
||||||
|
let s:operators = '\%(' . '\.\%([-+*/^÷%|&!]\|//\|\\\|<<\|>>>\?\)\?=' .
|
||||||
|
\ '\|' . '[:$<>]=\|||\|&&\||>\|<|\|<:\|:>\|::\|<<\|>>>\?\|//\|[-=]>\|\.\{3\}' .
|
||||||
|
\ '\|' . '[' . s:uniop_chars . '!$]' .
|
||||||
|
\ '\|' . '\.\?[' . s:binop_chars . s:binop_chars_extra . ']' .
|
||||||
|
\ '\)'
|
||||||
|
|
||||||
|
function! julia#idundercursor()
|
||||||
|
" TODO...
|
||||||
|
let w = expand('<cword>')
|
||||||
|
" let [l,c] = [line('.'),col('.')]
|
||||||
|
" let ll = getline(l)
|
||||||
|
return w
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! julia#gotodefinition()
|
||||||
|
let w = julia#idundercursor()
|
||||||
|
if empty(w)
|
||||||
|
return ''
|
||||||
|
endif
|
||||||
|
let [l,c] = [line('.'),col('.')]
|
||||||
|
let st = map(synstack(l,c), 'synIDattr(v:val, "name")')
|
||||||
|
let n = len(st)
|
||||||
|
if n > 0 && st[-1] =~# '^julia\%(\%(Range\|Ternary\|CTrans\)\?Operator\|\%(Possible\)\?SymbolS\?\|\%(Bl\|Rep\)\?Keyword\|Conditional\|ParDelim\|Char\|Colon\|Typedef\|Number\|Float\|Const\%(Generic\|Bool\)\|ComplexUnit\|\%(Special\|\%(Octal\|Hex\)Escape\)Char\|UniChar\%(Small\|Large\)\|Comment[LM]\|Todo\|Semicolon\)$'
|
||||||
|
return ''
|
||||||
|
endif
|
||||||
|
|
||||||
|
let comprehension = 0
|
||||||
|
let indollar = 0
|
||||||
|
for i in range(n-1, 0, -1)
|
||||||
|
if st[i] =~# '^juliaDollar\%(Var\|Par\|SqBra\)$'
|
||||||
|
let indollar = 1
|
||||||
|
endif
|
||||||
|
if !indollar && st[i] =~# '^julia\%(\a*String\|QuotedParBlockS\?\)$'
|
||||||
|
return ''
|
||||||
|
endif
|
||||||
|
if st[i] =~# '^julia\%(ParBlock\%(InRange\)\?\|SqBraBlock\|\%(Dollar\|StringVars\)\%(Par\|SqBra\)\)$'
|
||||||
|
let comprehension = 1
|
||||||
|
endif
|
||||||
|
endfor
|
||||||
|
|
||||||
|
let s1 = search('\C\<' . w . '\s*=[^=]', 'bcWzs')
|
||||||
|
|
||||||
|
return
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
endif
|
||||||
|
|
||||||
246
autoload/julia/doc.vim
Normal file
246
autoload/julia/doc.vim
Normal file
@@ -0,0 +1,246 @@
|
|||||||
|
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'julia') == -1
|
||||||
|
|
||||||
|
" path to the julia binary to communicate with
|
||||||
|
if has('win32') || has('win64')
|
||||||
|
if exists('g:julia#doc#juliapath')
|
||||||
|
" use assigned g:julia#doc#juliapath
|
||||||
|
elseif executable('julia')
|
||||||
|
" use julia command in PATH
|
||||||
|
let g:julia#doc#juliapath = 'julia'
|
||||||
|
else
|
||||||
|
" search julia binary in the default installation paths
|
||||||
|
let pathlist = sort(glob($LOCALAPPDATA . '\Julia-*\bin\julia.exe', 1, 1))
|
||||||
|
let g:julia#doc#juliapath = get(pathlist, -1, 'julia')
|
||||||
|
endif
|
||||||
|
else
|
||||||
|
let g:julia#doc#juliapath = get(g:, 'julia#doc#juliapath', 'julia')
|
||||||
|
endif
|
||||||
|
|
||||||
|
function! s:version() abort
|
||||||
|
let VERSION = {'major': 0, 'minor': 0}
|
||||||
|
if !executable(g:julia#doc#juliapath)
|
||||||
|
return VERSION
|
||||||
|
endif
|
||||||
|
|
||||||
|
let cmd = printf('%s -v', g:julia#doc#juliapath)
|
||||||
|
let output = system(cmd)
|
||||||
|
let versionstr = matchstr(output, '\C^julia version \zs\d\+\.\d\+\ze')
|
||||||
|
let [major, minor] = map(split(versionstr, '\.'), 'str2nr(v:val)')
|
||||||
|
let VERSION.major = major
|
||||||
|
let VERSION.minor = minor
|
||||||
|
return VERSION
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
let s:VERSION = s:version()
|
||||||
|
let s:NODOCPATTERN = '\C\VNo documentation found.'
|
||||||
|
|
||||||
|
function! julia#doc#lookup(keyword, ...) abort
|
||||||
|
let juliapath = get(a:000, 0, g:julia#doc#juliapath)
|
||||||
|
let keyword = escape(a:keyword, '"\')
|
||||||
|
let cmd = printf('%s -E "@doc %s"', juliapath, keyword)
|
||||||
|
return systemlist(cmd)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! julia#doc#open(keyword) abort
|
||||||
|
if empty(a:keyword)
|
||||||
|
call s:warn('Not an appropriate keyword.')
|
||||||
|
return
|
||||||
|
endif
|
||||||
|
|
||||||
|
if !executable(g:julia#doc#juliapath)
|
||||||
|
call s:warn('%s command is not executable', g:julia#doc#juliapath)
|
||||||
|
return
|
||||||
|
endif
|
||||||
|
|
||||||
|
let doc = julia#doc#lookup(a:keyword, g:julia#doc#juliapath)
|
||||||
|
if empty(doc) || match(doc[0], s:NODOCPATTERN) > -1
|
||||||
|
call s:warn('No documentation found for "%s".', a:keyword)
|
||||||
|
return
|
||||||
|
endif
|
||||||
|
|
||||||
|
" workaround for * and ? since a buffername cannot include them
|
||||||
|
let keyword = a:keyword
|
||||||
|
let keyword = substitute(keyword, '\*', ':asterisk:', 'g')
|
||||||
|
let keyword = substitute(keyword, '?', ':question:', 'g')
|
||||||
|
let buffername = printf('juliadoc: %s', keyword)
|
||||||
|
|
||||||
|
call s:write_to_preview_window(doc, "juliadoc", buffername)
|
||||||
|
|
||||||
|
call filter(s:HELPHISTORY, 'v:val isnot# a:keyword')
|
||||||
|
call add(s:HELPHISTORY, a:keyword)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:write_to_preview_window(content, ftype, buffername)
|
||||||
|
" Are we in the preview window from the outset? If not, best to close any
|
||||||
|
" preview windows that might exist.
|
||||||
|
let pvw = &previewwindow
|
||||||
|
if !pvw
|
||||||
|
silent! pclose!
|
||||||
|
endif
|
||||||
|
execute "silent! pedit +setlocal\\ nobuflisted\\ noswapfile\\"
|
||||||
|
\ "buftype=nofile\\ bufhidden=wipe" a:buffername
|
||||||
|
silent! wincmd P
|
||||||
|
if &previewwindow
|
||||||
|
setlocal modifiable noreadonly
|
||||||
|
silent! %delete _
|
||||||
|
call append(0, a:content)
|
||||||
|
silent! $delete _
|
||||||
|
normal! ggj
|
||||||
|
setlocal nomodified readonly nomodifiable
|
||||||
|
execute "setfiletype" a:ftype
|
||||||
|
" Only return to a normal window if we didn't start in a preview window.
|
||||||
|
if !pvw
|
||||||
|
silent! wincmd p
|
||||||
|
endif
|
||||||
|
else
|
||||||
|
" We couldn't make it to the preview window, so as a fallback we dump the
|
||||||
|
" contents in the status area.
|
||||||
|
execute printf("echo '%s'", join(a:content, "\n"))
|
||||||
|
endif
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:warn(...) abort
|
||||||
|
if a:0 == 0
|
||||||
|
return
|
||||||
|
endif
|
||||||
|
|
||||||
|
echohl WarningMsg
|
||||||
|
try
|
||||||
|
if a:0 == 1
|
||||||
|
echo a:1
|
||||||
|
else
|
||||||
|
echo call('printf', a:000)
|
||||||
|
endif
|
||||||
|
finally
|
||||||
|
echohl None
|
||||||
|
endtry
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
let s:KEYWORDPATTERN = '\m@\?\h\k*!\?'
|
||||||
|
|
||||||
|
" This function is called in normal mode or visual mode.
|
||||||
|
function! julia#doc#keywordprg(word) abort
|
||||||
|
if a:word is# ''
|
||||||
|
return
|
||||||
|
endif
|
||||||
|
|
||||||
|
let word = s:unfnameescape(a:word)
|
||||||
|
if word is# expand('<cword>')
|
||||||
|
" 'K' in normal mode
|
||||||
|
" NOTE: Because ! and @ is not in 'iskeyword' option, this func ignore
|
||||||
|
" the argument to recognize keywords like "@time" and "push!"
|
||||||
|
let view = winsaveview()
|
||||||
|
let lnum = line('.')
|
||||||
|
let tail = searchpos(s:KEYWORDPATTERN, 'ce', lnum)
|
||||||
|
let head = searchpos(s:KEYWORDPATTERN, 'bc', lnum)
|
||||||
|
call winrestview(view)
|
||||||
|
if head == [0, 0] || tail == [0, 0]
|
||||||
|
return
|
||||||
|
else
|
||||||
|
let start = head[1] - 1
|
||||||
|
let end = tail[1] - 1
|
||||||
|
let word = getline(lnum)[start : end]
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
call julia#doc#open(word)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
if exists('+shellslash')
|
||||||
|
let s:ESCAPEDCHARS = " \t\n\"#%'*<?`|"
|
||||||
|
else
|
||||||
|
let s:ESCAPEDCHARS = " \t\n*?[{`$\\%#'\"|!<"
|
||||||
|
endif
|
||||||
|
let s:FNAMEESCAPEPATTERN = '\\\ze[' . escape(s:ESCAPEDCHARS, ']^-\') . ']'
|
||||||
|
|
||||||
|
" this function reproduces an original string escaped by fnameescape()
|
||||||
|
function! s:unfnameescape(str) abort
|
||||||
|
if a:str is# ''
|
||||||
|
return ''
|
||||||
|
endif
|
||||||
|
|
||||||
|
" NOTE: We cannot determine the original string if a:str starts from '\-',
|
||||||
|
" '\+' or '\>' because fnameescape('-') ==# fnameescape('\-').
|
||||||
|
if a:str is# '\-'
|
||||||
|
" Remove escape anyway.
|
||||||
|
return '-'
|
||||||
|
endif
|
||||||
|
|
||||||
|
if a:str =~# '^\\[+>]'
|
||||||
|
let str = a:str[1:]
|
||||||
|
else
|
||||||
|
let str = a:str
|
||||||
|
endif
|
||||||
|
return substitute(str, s:FNAMEESCAPEPATTERN, '', 'g')
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
let s:HELPPROMPT = 'help?> '
|
||||||
|
let s:HELPHISTORY = []
|
||||||
|
|
||||||
|
function! julia#doc#prompt() abort
|
||||||
|
let inputhist = s:savehistory('input')
|
||||||
|
echohl MoreMsg
|
||||||
|
try
|
||||||
|
call s:restorehistory('input', s:HELPHISTORY)
|
||||||
|
let keyword = input(s:HELPPROMPT, '', 'customlist,julia#doc#complete')
|
||||||
|
|
||||||
|
" Clear the last prompt
|
||||||
|
normal! :
|
||||||
|
finally
|
||||||
|
echohl None
|
||||||
|
call s:restorehistory('input', inputhist)
|
||||||
|
endtry
|
||||||
|
|
||||||
|
if empty(keyword)
|
||||||
|
return
|
||||||
|
endif
|
||||||
|
|
||||||
|
call julia#doc#open(keyword)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:savehistory(name) abort
|
||||||
|
if histnr(a:name) == -1
|
||||||
|
return []
|
||||||
|
endif
|
||||||
|
|
||||||
|
let history = []
|
||||||
|
for i in range(1, histnr(a:name))
|
||||||
|
let item = histget(a:name, i)
|
||||||
|
if !empty(item)
|
||||||
|
call add(history, item)
|
||||||
|
endif
|
||||||
|
endfor
|
||||||
|
return history
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:restorehistory(name, history) abort
|
||||||
|
call histdel(a:name)
|
||||||
|
for item in a:history
|
||||||
|
call histadd(a:name, item)
|
||||||
|
endfor
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
if s:VERSION.major == 0 && s:VERSION.minor <= 6
|
||||||
|
let s:REPL_SEARCH = 'Base.Docs.repl_search'
|
||||||
|
else
|
||||||
|
let s:REPL_SEARCH = 'import REPL.repl_search; repl_search'
|
||||||
|
endif
|
||||||
|
|
||||||
|
function! julia#doc#complete(ArgLead, CmdLine, CursorPos) abort
|
||||||
|
return s:likely(a:ArgLead)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:likely(str) abort
|
||||||
|
" escape twice
|
||||||
|
let str = escape(escape(a:str, '"\'), '"\')
|
||||||
|
let cmd = printf('%s -E "%s(\"%s\")"', g:julia#doc#juliapath, s:REPL_SEARCH, str)
|
||||||
|
let output = systemlist(cmd)
|
||||||
|
return split(matchstr(output[0], '\C^search: \zs.*'))
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
endif
|
||||||
798
autoload/julia_blocks.vim
Normal file
798
autoload/julia_blocks.vim
Normal file
@@ -0,0 +1,798 @@
|
|||||||
|
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)
|
||||||
|
|
||||||
|
let s:default_mappings = {
|
||||||
|
\ "moveblock_n" : "]]",
|
||||||
|
\ "moveblock_N" : "][",
|
||||||
|
\ "moveblock_p" : "[[",
|
||||||
|
\ "moveblock_P" : "[]",
|
||||||
|
\
|
||||||
|
\ "move_n" : "]j",
|
||||||
|
\ "move_N" : "]J",
|
||||||
|
\ "move_p" : "[j",
|
||||||
|
\ "move_P" : "[J",
|
||||||
|
\
|
||||||
|
\ "select_a" : "aj",
|
||||||
|
\ "select_i" : "ij",
|
||||||
|
\
|
||||||
|
\ "whereami" : "",
|
||||||
|
\ }
|
||||||
|
|
||||||
|
function! s:getmapchars(function)
|
||||||
|
if exists("g:julia_blocks_mappings") && has_key(g:julia_blocks_mappings, a:function)
|
||||||
|
return s:escape(g:julia_blocks_mappings[a:function])
|
||||||
|
else
|
||||||
|
return s:escape(s:default_mappings[a:function])
|
||||||
|
endif
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:map_move(function, toend, backwards)
|
||||||
|
let chars = s:getmapchars(a:function)
|
||||||
|
if empty(chars)
|
||||||
|
return
|
||||||
|
endif
|
||||||
|
let fn = "julia_blocks#" . a:function
|
||||||
|
let lhs = "<buffer> <nowait> <silent> " . chars . " "
|
||||||
|
let cnt = ":<C-U>let b:jlblk_count=v:count1"
|
||||||
|
exe "nnoremap " . lhs . cnt
|
||||||
|
\ . " <Bar> call " . fn . "()<CR>"
|
||||||
|
exe "onoremap " . lhs . cnt
|
||||||
|
\ . "<CR><Esc>:call julia_blocks#owrapper_move(v:operator, \"" . fn . "\", " . a:toend . ", " . a:backwards . ")<CR>"
|
||||||
|
exe "xnoremap " . lhs . cnt
|
||||||
|
\ . "<CR>gv<Esc>:call julia_blocks#vwrapper_move(\"" . fn . "\")<CR>"
|
||||||
|
let b:jlblk_mapped[a:function] = 1
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! julia_blocks#owrapper_move(oper, function, toend, backwards)
|
||||||
|
let F = function(a:function)
|
||||||
|
|
||||||
|
let save_redraw = &lazyredraw
|
||||||
|
let save_select = &selection
|
||||||
|
|
||||||
|
let restore_cmds = "\<Esc>"
|
||||||
|
\ . ":let &l:selection = \"" . save_select . "\"\<CR>"
|
||||||
|
\ . ":let &l:lazyredraw = " . save_redraw . "\<CR>"
|
||||||
|
\ . ":\<BS>"
|
||||||
|
|
||||||
|
setlocal lazyredraw
|
||||||
|
|
||||||
|
let start_pos = getpos('.')
|
||||||
|
let b:jlblk_abort_calls_esc = 0
|
||||||
|
call F()
|
||||||
|
let b:jlblk_abort_calls_esc = 1
|
||||||
|
let end_pos = getpos('.')
|
||||||
|
if start_pos == end_pos
|
||||||
|
call feedkeys(restore_cmds, 'n')
|
||||||
|
endif
|
||||||
|
|
||||||
|
let &l:selection = "inclusive"
|
||||||
|
if a:backwards || !a:toend
|
||||||
|
let &l:selection = "exclusive"
|
||||||
|
endif
|
||||||
|
if a:toend && a:backwards
|
||||||
|
let end_pos[2] += 1
|
||||||
|
endif
|
||||||
|
|
||||||
|
if s:compare_pos(start_pos, end_pos) > 0
|
||||||
|
let [start_pos, end_pos] = [end_pos, start_pos]
|
||||||
|
endif
|
||||||
|
|
||||||
|
call setpos("'<", start_pos)
|
||||||
|
call setpos("'>", end_pos)
|
||||||
|
|
||||||
|
" NOTE: the 'c' operator behaves differently, for mysterious reasons. We
|
||||||
|
" simulate it with 'd' followed by 'i' instead
|
||||||
|
call feedkeys("gv" . (a:oper == "c" ? "d" : a:oper) . restore_cmds . (a:oper == "c" ? "i" : ""), 'n')
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! julia_blocks#vwrapper_move(function)
|
||||||
|
let F = function(a:function)
|
||||||
|
|
||||||
|
let s = getpos('.')
|
||||||
|
let b1 = getpos("'<")
|
||||||
|
let b2 = getpos("'>")
|
||||||
|
|
||||||
|
let b = b1 == s ? b2 : b1
|
||||||
|
call setpos('.', s)
|
||||||
|
let b:jlblk_abort_calls_esc = 0
|
||||||
|
call F()
|
||||||
|
let b:jlblk_abort_calls_esc = 1
|
||||||
|
let e = getpos('.')
|
||||||
|
call setpos('.', b)
|
||||||
|
exe "normal " . visualmode()
|
||||||
|
call setpos('.', e)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:unmap(function)
|
||||||
|
if !get(b:jlblk_mapped, a:function, 0)
|
||||||
|
return
|
||||||
|
endif
|
||||||
|
let chars = s:getmapchars(a:function)
|
||||||
|
if empty(chars)
|
||||||
|
" shouldn't happen
|
||||||
|
return
|
||||||
|
endif
|
||||||
|
let mapids = a:function =~# "^move" ? ["n", "x", "o"] :
|
||||||
|
\ a:function =~# "^select" ? ["x", "o"] :
|
||||||
|
\ ["n"]
|
||||||
|
let fn = "julia_blocks#" . a:function
|
||||||
|
let cmd = "<buffer> " . chars
|
||||||
|
for m in mapids
|
||||||
|
exe m . "unmap " . cmd
|
||||||
|
endfor
|
||||||
|
let b:jlblk_mapped[a:function] = 0
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:escape(chars)
|
||||||
|
let c = a:chars
|
||||||
|
let c = substitute(c, '|', '<Bar>', 'g')
|
||||||
|
return c
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:map_select(function)
|
||||||
|
let chars = s:getmapchars(a:function)
|
||||||
|
if empty(chars)
|
||||||
|
return
|
||||||
|
endif
|
||||||
|
let fn = "julia_blocks#" . a:function
|
||||||
|
let lhs = "<buffer> <nowait> <silent> " . chars . " "
|
||||||
|
let cnt = ":<C-U>let b:jlblk_inwrapper=1<CR>:let b:jlblk_count=max([v:prevcount,1])<CR>"
|
||||||
|
exe "onoremap " . lhs . "<Esc>" . cnt
|
||||||
|
\ . ":call julia_blocks#owrapper_select(v:operator, \"" . fn . "\")<CR>"
|
||||||
|
exe "xnoremap " . lhs . cnt
|
||||||
|
\ . ":call julia_blocks#vwrapper_select(\"" . fn . "\")<CR>"
|
||||||
|
let b:jlblk_mapped[a:function] = 1
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! julia_blocks#owrapper_select(oper, function) ", toend, backwards)
|
||||||
|
let F = function(a:function)
|
||||||
|
|
||||||
|
let save_redraw = &lazyredraw
|
||||||
|
let save_select = &selection
|
||||||
|
|
||||||
|
let restore_cmds = "\<Esc>"
|
||||||
|
\ . ":let &l:selection = \"" . save_select . "\"\<CR>"
|
||||||
|
\ . ":let &l:lazyredraw = " . save_redraw . "\<CR>"
|
||||||
|
\ . ":\<BS>"
|
||||||
|
|
||||||
|
setlocal lazyredraw
|
||||||
|
|
||||||
|
let b:jlblk_abort_calls_esc = 0
|
||||||
|
let retF = F()
|
||||||
|
let b:jlblk_abort_calls_esc = 1
|
||||||
|
if empty(retF)
|
||||||
|
let b:jlblk_inwrapper = 0
|
||||||
|
call feedkeys(restore_cmds, 'n')
|
||||||
|
return
|
||||||
|
end
|
||||||
|
let [start_pos, end_pos] = retF
|
||||||
|
|
||||||
|
if start_pos == end_pos
|
||||||
|
call feedkeys(restore_cmds, 'n')
|
||||||
|
endif
|
||||||
|
|
||||||
|
let &l:selection = "inclusive"
|
||||||
|
|
||||||
|
call setpos("'<", start_pos)
|
||||||
|
call setpos("'>", end_pos)
|
||||||
|
|
||||||
|
let b:jlblk_inwrapper = 0
|
||||||
|
" NOTE: the 'c' operator behaves differently, for mysterious reasons. We
|
||||||
|
" simulate it with 'd' followed by 'i' instead
|
||||||
|
call feedkeys("gv" . (a:oper == "c" ? "d" : a:oper) . restore_cmds . (a:oper == "c" ? "i" : ""), 'n')
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! julia_blocks#vwrapper_select(function)
|
||||||
|
let F = function(a:function)
|
||||||
|
|
||||||
|
let b:jlblk_abort_calls_esc = 0
|
||||||
|
let retF = F()
|
||||||
|
let b:jlblk_abort_calls_esc = 1
|
||||||
|
if empty(retF)
|
||||||
|
let b:jlblk_inwrapper = 0
|
||||||
|
return
|
||||||
|
end
|
||||||
|
let [start_pos, end_pos] = retF
|
||||||
|
call setpos("'<", start_pos)
|
||||||
|
call setpos("'>", end_pos)
|
||||||
|
normal! gv
|
||||||
|
let b:jlblk_inwrapper = 0
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:map_aux(function)
|
||||||
|
let chars = s:getmapchars(a:function)
|
||||||
|
if empty(chars)
|
||||||
|
return
|
||||||
|
endif
|
||||||
|
let fn = "julia_blocks#" . a:function
|
||||||
|
let lhs = "<buffer> <nowait> <silent> " . chars . " "
|
||||||
|
exe "nnoremap " . lhs . ":<C-U>echo " . fn . "()<CR>"
|
||||||
|
let b:jlblk_mapped[a:function] = 1
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
let s:julia_blocks_functions = {
|
||||||
|
\ "moveblock_N": [1, 0],
|
||||||
|
\ "moveblock_n": [0, 0],
|
||||||
|
\ "moveblock_p": [0, 1],
|
||||||
|
\ "moveblock_P": [1, 1],
|
||||||
|
\
|
||||||
|
\ "move_N": [1, 0],
|
||||||
|
\ "move_n": [0, 0],
|
||||||
|
\ "move_p": [0, 1],
|
||||||
|
\ "move_P": [1, 1],
|
||||||
|
\
|
||||||
|
\ "select_a": [],
|
||||||
|
\ "select_i": [],
|
||||||
|
\
|
||||||
|
\ "whereami": [],
|
||||||
|
\ }
|
||||||
|
|
||||||
|
function! julia_blocks#init_mappings()
|
||||||
|
let b:jlblk_mapped = {}
|
||||||
|
for f in keys(s:julia_blocks_functions)
|
||||||
|
if f =~# "^move"
|
||||||
|
let [te, bw] = s:julia_blocks_functions[f]
|
||||||
|
call s:map_move(f, te, bw)
|
||||||
|
elseif f =~# "^select"
|
||||||
|
call s:map_select(f)
|
||||||
|
else
|
||||||
|
call s:map_aux(f)
|
||||||
|
endif
|
||||||
|
endfor
|
||||||
|
call julia_blocks#select_reset()
|
||||||
|
augroup JuliaBlocks
|
||||||
|
au!
|
||||||
|
au InsertEnter <buffer> call julia_blocks#select_reset()
|
||||||
|
au CursorMoved <buffer> call s:cursor_moved()
|
||||||
|
augroup END
|
||||||
|
|
||||||
|
" we would need some autocmd event associated with exiting from
|
||||||
|
" visual mode, but there isn't any, so we resort to this crude
|
||||||
|
" hack
|
||||||
|
" ACTUALLY this creates more problems than it solves, so the crude hack
|
||||||
|
" is just disabled
|
||||||
|
"vnoremap <buffer><silent><unique> <Esc> <Esc>:call julia_blocks#select_reset()<CR>
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! julia_blocks#remove_mappings()
|
||||||
|
if exists("b:jlblk_mapped")
|
||||||
|
for f in keys(s:julia_blocks_functions)
|
||||||
|
call s:unmap(f)
|
||||||
|
endfor
|
||||||
|
endif
|
||||||
|
unlet! b:jlblk_save_pos b:jlblk_view b:jlblk_count b:jlblk_abort_calls_esc
|
||||||
|
unlet! b:jlblk_inwrapper b:jlblk_did_select b:jlblk_doing_select
|
||||||
|
unlet! b:jlblk_last_start_pos b:jlblk_last_end_pos b:jlblk_last_mode
|
||||||
|
augroup JuliaBlocks
|
||||||
|
au!
|
||||||
|
augroup END
|
||||||
|
augroup! JuliaBlocks
|
||||||
|
let md = maparg("<Esc>", "x", 0, 1)
|
||||||
|
if !empty(md) && md["buffer"]
|
||||||
|
vunmap <buffer> <Esc>
|
||||||
|
endif
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:restore_view()
|
||||||
|
"redraw! " would ensure correct behaviour, but is annoying
|
||||||
|
let pos = getpos('.')
|
||||||
|
if pos == b:jlblk_save_pos
|
||||||
|
call winrestview(b:jlblk_view)
|
||||||
|
return
|
||||||
|
endif
|
||||||
|
let oldtopline = b:jlblk_view["topline"]
|
||||||
|
let newtopline = winsaveview()["topline"]
|
||||||
|
let l = pos[1]
|
||||||
|
if l >= oldtopline + &l:scrolloff && l <= oldtopline + winheight(0) - 1 - &l:scrolloff
|
||||||
|
if newtopline > oldtopline
|
||||||
|
exe ":normal! " . (newtopline - oldtopline) . "\<C-Y>"
|
||||||
|
elseif newtopline < oldtopline
|
||||||
|
exe ":normal! " . (oldtopline - newtopline) . "\<C-E>"
|
||||||
|
endif
|
||||||
|
" these reduce the scrolling to the minimum (which is maybe not
|
||||||
|
" standard ViM behaviour?)
|
||||||
|
elseif newtopline < oldtopline && (l - newtopline - &l:scrolloff) > 0
|
||||||
|
exe ":normal! " . (l - newtopline - &l:scrolloff) . "\<C-E>"
|
||||||
|
elseif newtopline > oldtopline && (newtopline + &l:scrolloff - l) > 0
|
||||||
|
exe ":normal! " . (l - newtopline - &l:scrolloff) . "\<C-E>"
|
||||||
|
endif
|
||||||
|
call setpos('.', pos) " make sure we didn't screw up
|
||||||
|
" (since winsaveview may not be up to date)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:abort()
|
||||||
|
call setpos('.', b:jlblk_save_pos)
|
||||||
|
call s:restore_view()
|
||||||
|
if get(b:, "jlblk_abort_calls_esc", 1)
|
||||||
|
call feedkeys("\<Esc>", 'n')
|
||||||
|
endif
|
||||||
|
return 0
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:set_mark_tick(...)
|
||||||
|
" This could be a one-liner:
|
||||||
|
" call setpos("''", b:jlblk_save_pos)
|
||||||
|
" but we want to append to the jumplist,
|
||||||
|
" which setpos doesn't do
|
||||||
|
let p = getpos('.')
|
||||||
|
call setpos('.', b:jlblk_save_pos)
|
||||||
|
normal! m'
|
||||||
|
call setpos('.', p)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:get_save_pos(...)
|
||||||
|
if !exists("b:jlblk_save_pos") || (a:0 == 0) || (a:0 > 0 && a:1)
|
||||||
|
let b:jlblk_save_pos = getpos('.')
|
||||||
|
endif
|
||||||
|
let b:jlblk_view = winsaveview()
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:on_end()
|
||||||
|
return getline('.')[col('.')-1] =~# '\k' && expand("<cword>") =~# b:julia_end_keywords
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:on_begin()
|
||||||
|
let [l,c] = [line('.'), col('.')]
|
||||||
|
normal! ^
|
||||||
|
let patt = '\%<'.(c+1).'c\(' . b:julia_begin_keywordsm . '\)\%>'.(c-1).'c'
|
||||||
|
let n = search(patt, 'Wnc', l)
|
||||||
|
call cursor(l, c)
|
||||||
|
return n > 0
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:matchit()
|
||||||
|
let lkj = exists(":lockjumps") == 2 ? "lockjumps " : ""
|
||||||
|
exe lkj . "normal %"
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:move_before_begin()
|
||||||
|
call search(b:julia_begin_keywordsm, 'Wbc')
|
||||||
|
normal! h
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:cycle_until_end()
|
||||||
|
let pos = getpos('.')
|
||||||
|
while !s:on_end()
|
||||||
|
call s:matchit()
|
||||||
|
let c = 0
|
||||||
|
if getpos('.') == pos || c > 1000
|
||||||
|
" shouldn't happen, but let's avoid infinite loops anyway
|
||||||
|
return 0
|
||||||
|
endif
|
||||||
|
let c += 1
|
||||||
|
endwhile
|
||||||
|
return 1
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:moveto_block_delim(toend, backwards, ...)
|
||||||
|
let pattern = a:toend ? b:julia_end_keywords : b:julia_begin_keywordsm
|
||||||
|
let flags = a:backwards ? 'Wb' : 'W'
|
||||||
|
let cnt = a:0 > 0 ? a:1 : b:jlblk_count
|
||||||
|
if !a:toend && a:backwards && s:on_begin()
|
||||||
|
call s:move_before_begin()
|
||||||
|
endif
|
||||||
|
let ret = 0
|
||||||
|
for c in range(cnt)
|
||||||
|
if a:toend && a:backwards && s:on_end()
|
||||||
|
normal! l
|
||||||
|
normal! bh
|
||||||
|
endif
|
||||||
|
while 1
|
||||||
|
let searchret = search(pattern, flags)
|
||||||
|
if !searchret
|
||||||
|
return ret
|
||||||
|
endif
|
||||||
|
exe "let skip = " . b:match_skip
|
||||||
|
if !skip
|
||||||
|
let ret = 1
|
||||||
|
break
|
||||||
|
endif
|
||||||
|
endwhile
|
||||||
|
endfor
|
||||||
|
return ret
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:compare_pos(pos1, pos2)
|
||||||
|
if a:pos1[1] < a:pos2[1]
|
||||||
|
return -1
|
||||||
|
elseif a:pos1[1] > a:pos2[1]
|
||||||
|
return 1
|
||||||
|
elseif a:pos1[2] < a:pos2[2]
|
||||||
|
return -1
|
||||||
|
elseif a:pos1[2] > a:pos2[2]
|
||||||
|
return 1
|
||||||
|
else
|
||||||
|
return 0
|
||||||
|
endif
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! julia_blocks#move_N()
|
||||||
|
call s:get_save_pos()
|
||||||
|
|
||||||
|
let ret = s:moveto_block_delim(1, 0)
|
||||||
|
if !ret
|
||||||
|
return s:abort()
|
||||||
|
endif
|
||||||
|
|
||||||
|
normal! e
|
||||||
|
call s:set_mark_tick()
|
||||||
|
|
||||||
|
return 1
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! julia_blocks#move_n()
|
||||||
|
call s:get_save_pos()
|
||||||
|
|
||||||
|
let ret = s:moveto_block_delim(0, 0)
|
||||||
|
if !ret
|
||||||
|
return s:abort()
|
||||||
|
endif
|
||||||
|
|
||||||
|
call s:set_mark_tick()
|
||||||
|
|
||||||
|
return 1
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! julia_blocks#move_p()
|
||||||
|
call s:get_save_pos()
|
||||||
|
|
||||||
|
let ret = s:moveto_block_delim(0, 1)
|
||||||
|
if !ret
|
||||||
|
return s:abort()
|
||||||
|
endif
|
||||||
|
|
||||||
|
call s:set_mark_tick()
|
||||||
|
|
||||||
|
return 1
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! julia_blocks#move_P()
|
||||||
|
call s:get_save_pos()
|
||||||
|
|
||||||
|
let ret = s:moveto_block_delim(1, 1)
|
||||||
|
if !ret
|
||||||
|
return s:abort()
|
||||||
|
endif
|
||||||
|
|
||||||
|
normal! e
|
||||||
|
call s:set_mark_tick()
|
||||||
|
|
||||||
|
return 1
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:moveto_currentblock_end()
|
||||||
|
let flags = 'W'
|
||||||
|
if s:on_end()
|
||||||
|
let flags .= 'c'
|
||||||
|
" NOTE: using "normal! lb" fails at the end of the file (?!)
|
||||||
|
normal! l
|
||||||
|
normal! b
|
||||||
|
endif
|
||||||
|
|
||||||
|
let ret = searchpair(b:julia_begin_keywordsm, '', b:julia_end_keywords, flags, b:match_skip)
|
||||||
|
if ret <= 0
|
||||||
|
return s:abort()
|
||||||
|
endif
|
||||||
|
|
||||||
|
normal! e
|
||||||
|
return 1
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! julia_blocks#moveblock_N()
|
||||||
|
call s:get_save_pos()
|
||||||
|
|
||||||
|
let ret = 0
|
||||||
|
for c in range(b:jlblk_count)
|
||||||
|
let last_seen_pos = getpos('.')
|
||||||
|
if s:on_end()
|
||||||
|
normal! hel
|
||||||
|
let save_pos = getpos('.')
|
||||||
|
let ret_start = s:moveto_block_delim(0, 0, 1)
|
||||||
|
let start1_pos = ret_start ? getpos('.') : [0,0,0,0]
|
||||||
|
call setpos('.', save_pos)
|
||||||
|
if s:on_end()
|
||||||
|
normal! h
|
||||||
|
endif
|
||||||
|
let ret_end = s:moveto_block_delim(1, 0, 1)
|
||||||
|
let end1_pos = ret_end ? getpos('.') : [0,0,0,0]
|
||||||
|
|
||||||
|
if ret_start && (!ret_end || s:compare_pos(start1_pos, end1_pos) < 0)
|
||||||
|
call setpos('.', start1_pos)
|
||||||
|
else
|
||||||
|
call setpos('.', save_pos)
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
let moveret = s:moveto_currentblock_end()
|
||||||
|
if !moveret && c == 0
|
||||||
|
let moveret = s:moveto_block_delim(0, 0, 1) && s:cycle_until_end()
|
||||||
|
if moveret
|
||||||
|
normal! e
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
if !moveret
|
||||||
|
call setpos('.', last_seen_pos)
|
||||||
|
break
|
||||||
|
endif
|
||||||
|
|
||||||
|
let ret = 1
|
||||||
|
endfor
|
||||||
|
if !ret
|
||||||
|
return s:abort()
|
||||||
|
endif
|
||||||
|
|
||||||
|
call s:set_mark_tick()
|
||||||
|
|
||||||
|
return 1
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! julia_blocks#moveblock_n()
|
||||||
|
call s:get_save_pos()
|
||||||
|
|
||||||
|
let ret = 0
|
||||||
|
for c in range(b:jlblk_count)
|
||||||
|
let last_seen_pos = getpos('.')
|
||||||
|
|
||||||
|
call s:moveto_currentblock_end()
|
||||||
|
if s:moveto_block_delim(0, 0, 1)
|
||||||
|
let ret = 1
|
||||||
|
else
|
||||||
|
call setpos('.', last_seen_pos)
|
||||||
|
break
|
||||||
|
endif
|
||||||
|
endfor
|
||||||
|
|
||||||
|
if !ret
|
||||||
|
return s:abort()
|
||||||
|
endif
|
||||||
|
|
||||||
|
call s:set_mark_tick()
|
||||||
|
|
||||||
|
return 1
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! julia_blocks#moveblock_p()
|
||||||
|
call s:get_save_pos()
|
||||||
|
|
||||||
|
let ret = 0
|
||||||
|
for c in range(b:jlblk_count)
|
||||||
|
let last_seen_pos = getpos('.')
|
||||||
|
if s:on_begin()
|
||||||
|
call s:move_before_begin()
|
||||||
|
if s:on_end()
|
||||||
|
normal! l
|
||||||
|
endif
|
||||||
|
let save_pos = getpos('.')
|
||||||
|
let ret_start = s:moveto_block_delim(0, 1, 1)
|
||||||
|
let start1_pos = ret_start ? getpos('.') : [0,0,0,0]
|
||||||
|
call setpos('.', save_pos)
|
||||||
|
let ret_end = s:moveto_block_delim(1, 1, 1)
|
||||||
|
let end1_pos = ret_end ? getpos('.') : [0,0,0,0]
|
||||||
|
|
||||||
|
if ret_end && (!ret_start || s:compare_pos(start1_pos, end1_pos) < 0)
|
||||||
|
call setpos('.', end1_pos)
|
||||||
|
else
|
||||||
|
call setpos('.', save_pos)
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
let moveret = s:moveto_currentblock_end()
|
||||||
|
if !moveret && c == 0
|
||||||
|
let moveret = s:moveto_block_delim(1, 1, 1)
|
||||||
|
endif
|
||||||
|
if !moveret
|
||||||
|
call setpos('.', last_seen_pos)
|
||||||
|
break
|
||||||
|
endif
|
||||||
|
|
||||||
|
call s:matchit()
|
||||||
|
let ret = 1
|
||||||
|
endfor
|
||||||
|
if !ret
|
||||||
|
return s:abort()
|
||||||
|
endif
|
||||||
|
|
||||||
|
call s:set_mark_tick()
|
||||||
|
call s:restore_view()
|
||||||
|
|
||||||
|
return 1
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! julia_blocks#moveblock_P()
|
||||||
|
call s:get_save_pos()
|
||||||
|
|
||||||
|
let ret = 0
|
||||||
|
for c in range(b:jlblk_count)
|
||||||
|
let last_seen_pos = getpos('.')
|
||||||
|
|
||||||
|
call s:moveto_currentblock_end()
|
||||||
|
if s:on_end()
|
||||||
|
call s:matchit()
|
||||||
|
endif
|
||||||
|
|
||||||
|
if s:moveto_block_delim(1, 1, 1)
|
||||||
|
" NOTE: normal! he does not work unless &whichwrap inlcudes h
|
||||||
|
normal! h
|
||||||
|
normal! e
|
||||||
|
let ret = 1
|
||||||
|
else
|
||||||
|
call setpos('.', last_seen_pos)
|
||||||
|
endif
|
||||||
|
endfor
|
||||||
|
|
||||||
|
if !ret
|
||||||
|
return s:abort()
|
||||||
|
endif
|
||||||
|
|
||||||
|
call s:set_mark_tick()
|
||||||
|
call s:restore_view()
|
||||||
|
|
||||||
|
return 1
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! julia_blocks#whereami()
|
||||||
|
let b:jlblk_count = v:count1
|
||||||
|
let save_redraw = &lazyredraw
|
||||||
|
setlocal lazyredraw
|
||||||
|
let pos = getpos('.')
|
||||||
|
let ret = julia_blocks#select_a('w')
|
||||||
|
if empty(ret)
|
||||||
|
call setpos('.', pos)
|
||||||
|
let &l:lazyredraw = save_redraw
|
||||||
|
return ""
|
||||||
|
end
|
||||||
|
let [start_pos, end_pos] = ret
|
||||||
|
let m = getline(start_pos[1])[start_pos[2]-1:]
|
||||||
|
|
||||||
|
" If cursor_moved was not forced from select_a, we force it now
|
||||||
|
" (TODO: this is *really* ugly)
|
||||||
|
if end_pos != pos
|
||||||
|
call s:cursor_moved(1)
|
||||||
|
endif
|
||||||
|
call setpos('.', pos)
|
||||||
|
call s:restore_view()
|
||||||
|
let &l:lazyredraw = save_redraw
|
||||||
|
return m
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" Block text objects
|
||||||
|
|
||||||
|
function! s:find_block(current_mode)
|
||||||
|
|
||||||
|
let flags = 'W'
|
||||||
|
|
||||||
|
if b:jlblk_did_select
|
||||||
|
call setpos('.', b:jlblk_last_start_pos)
|
||||||
|
if !s:cycle_until_end()
|
||||||
|
return s:abort()
|
||||||
|
endif
|
||||||
|
if !(a:current_mode[0] == 'a' && a:current_mode == b:jlblk_last_mode)
|
||||||
|
let flags .= 'c'
|
||||||
|
endif
|
||||||
|
elseif s:on_end()
|
||||||
|
let flags .= 'c'
|
||||||
|
" NOTE: using "normal! lb" fails at the end of the file (?!)
|
||||||
|
normal! l
|
||||||
|
normal! b
|
||||||
|
endif
|
||||||
|
let searchret = searchpair(b:julia_begin_keywordsm, '', b:julia_end_keywords, flags, b:match_skip)
|
||||||
|
if searchret <= 0
|
||||||
|
if !b:jlblk_did_select
|
||||||
|
return s:abort()
|
||||||
|
else
|
||||||
|
call setpos('.', b:jlblk_last_end_pos)
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
let end_pos = getpos('.')
|
||||||
|
" Jump to match
|
||||||
|
call s:matchit()
|
||||||
|
let start_pos = getpos('.')
|
||||||
|
|
||||||
|
let b:jlblk_last_start_pos = copy(start_pos)
|
||||||
|
let b:jlblk_last_end_pos = copy(end_pos)
|
||||||
|
|
||||||
|
return [start_pos, end_pos]
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:repeated_find(ai_mode)
|
||||||
|
let repeat = b:jlblk_count + (a:ai_mode == 'i' && v:count1 > 1 ? 1 : 0)
|
||||||
|
for c in range(repeat)
|
||||||
|
let current_mode = (c < repeat - 1 ? 'a' : a:ai_mode)
|
||||||
|
let ret_find_block = s:find_block(current_mode)
|
||||||
|
if empty(ret_find_block)
|
||||||
|
return 0
|
||||||
|
endif
|
||||||
|
let [start_pos, end_pos] = ret_find_block
|
||||||
|
call setpos('.', end_pos)
|
||||||
|
let b:jlblk_last_mode = current_mode
|
||||||
|
if c < repeat - 1
|
||||||
|
let b:jlblk_doing_select = 0
|
||||||
|
let b:jlblk_did_select = 1
|
||||||
|
endif
|
||||||
|
endfor
|
||||||
|
return [start_pos, end_pos]
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! julia_blocks#select_a(...)
|
||||||
|
let mode_flag = a:0 > 0 ? a:1 : ''
|
||||||
|
call s:get_save_pos(!b:jlblk_did_select)
|
||||||
|
let current_pos = getpos('.')
|
||||||
|
let ret_find_block = s:repeated_find('a' . mode_flag)
|
||||||
|
if empty(ret_find_block)
|
||||||
|
return 0
|
||||||
|
endif
|
||||||
|
let [start_pos, end_pos] = ret_find_block
|
||||||
|
|
||||||
|
call setpos('.', end_pos)
|
||||||
|
normal! e
|
||||||
|
let end_pos = getpos('.')
|
||||||
|
|
||||||
|
let b:jlblk_doing_select = 1
|
||||||
|
|
||||||
|
" CursorMove is only triggered if end_pos
|
||||||
|
" end_pos is different than the staring position;
|
||||||
|
" so when starting from the 'd' in 'end' we need to
|
||||||
|
" force it
|
||||||
|
if current_pos == end_pos
|
||||||
|
call s:cursor_moved(1)
|
||||||
|
endif
|
||||||
|
|
||||||
|
call s:set_mark_tick()
|
||||||
|
return [start_pos, end_pos]
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! julia_blocks#select_i()
|
||||||
|
call s:get_save_pos(!b:jlblk_did_select)
|
||||||
|
let current_pos = getpos('.')
|
||||||
|
let ret_find_block = s:repeated_find('i')
|
||||||
|
if empty(ret_find_block)
|
||||||
|
return 0
|
||||||
|
endif
|
||||||
|
let [start_pos, end_pos] = ret_find_block
|
||||||
|
|
||||||
|
if end_pos[1] <= start_pos[1]+1
|
||||||
|
return s:abort()
|
||||||
|
endif
|
||||||
|
|
||||||
|
call setpos('.', end_pos)
|
||||||
|
|
||||||
|
let b:jlblk_doing_select = 1
|
||||||
|
|
||||||
|
let start_pos[1] += 1
|
||||||
|
call setpos('.', start_pos)
|
||||||
|
normal! ^
|
||||||
|
let start_pos = getpos('.')
|
||||||
|
let end_pos[1] -= 1
|
||||||
|
let end_pos[2] = len(getline(end_pos[1]))
|
||||||
|
|
||||||
|
" CursorMove is only triggered if end_pos
|
||||||
|
" end_pos is different than the staring position;
|
||||||
|
" so when starting from the 'd' in 'end' we need to
|
||||||
|
" force it
|
||||||
|
if current_pos == end_pos
|
||||||
|
call s:cursor_moved(1)
|
||||||
|
endif
|
||||||
|
|
||||||
|
call s:set_mark_tick()
|
||||||
|
return [start_pos, end_pos]
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function julia_blocks#select_reset()
|
||||||
|
let b:jlblk_did_select = 0
|
||||||
|
let b:jlblk_doing_select = 0
|
||||||
|
let b:jlblk_inwrapper = 0
|
||||||
|
let b:jlblk_last_mode = ""
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:cursor_moved(...)
|
||||||
|
if b:jlblk_inwrapper && !(a:0 > 0 && a:1)
|
||||||
|
return
|
||||||
|
endif
|
||||||
|
let b:jlblk_did_select = b:jlblk_doing_select
|
||||||
|
let b:jlblk_doing_select = 0
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
endif
|
||||||
3334
autoload/julia_latex_symbols.vim
Normal file
3334
autoload/julia_latex_symbols.vim
Normal file
File diff suppressed because it is too large
Load Diff
532
autoload/markdown.vim
Normal file
532
autoload/markdown.vim
Normal file
@@ -0,0 +1,532 @@
|
|||||||
|
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'markdown') == -1
|
||||||
|
|
||||||
|
|
||||||
|
" {{{ FOLDING
|
||||||
|
|
||||||
|
function! markdown#FoldLevelOfLine(lnum)
|
||||||
|
let currentline = getline(a:lnum)
|
||||||
|
let nextline = getline(a:lnum + 1)
|
||||||
|
|
||||||
|
" an empty line is not going to change the indentation level
|
||||||
|
if match(currentline, '^\s*$') >= 0
|
||||||
|
return '='
|
||||||
|
endif
|
||||||
|
|
||||||
|
" folding lists
|
||||||
|
if s:SyntaxGroupOfLineIs(a:lnum, '^markdownListItem')
|
||||||
|
if s:SyntaxGroupOfLineIs(a:lnum - 1, '^markdownListItem')
|
||||||
|
return 'a1'
|
||||||
|
endif
|
||||||
|
if s:SyntaxGroupOfLineIs(a:lnum + 1, '^markdownListItem')
|
||||||
|
return 's1'
|
||||||
|
endif
|
||||||
|
return '='
|
||||||
|
endif
|
||||||
|
|
||||||
|
" we are not going to fold things inside list items, too hairy
|
||||||
|
let is_inside_a_list_item = s:SyntaxGroupOfLineIs(a:lnum, '^markdownListItem')
|
||||||
|
if is_inside_a_list_item
|
||||||
|
return '='
|
||||||
|
endif
|
||||||
|
|
||||||
|
" folding atx headers
|
||||||
|
if match(currentline, '^#\{1,6}\s') >= 0
|
||||||
|
let header_level = strlen(substitute(currentline, '^\(#\{1,6}\).*', '\1', ''))
|
||||||
|
return '>' . header_level
|
||||||
|
endif
|
||||||
|
|
||||||
|
" folding fenced code blocks
|
||||||
|
let next_line_syntax_group = synIDattr(synID(a:lnum + 1, 1, 1), 'name')
|
||||||
|
if match(currentline, '^\s*```') >= 0
|
||||||
|
if next_line_syntax_group ==# 'markdownFencedCodeBlock'
|
||||||
|
return 'a1'
|
||||||
|
endif
|
||||||
|
return 's1'
|
||||||
|
endif
|
||||||
|
|
||||||
|
" folding code blocks
|
||||||
|
let current_line_syntax_group = synIDattr(synID(a:lnum, 1, 1), 'name')
|
||||||
|
let prev_line_syntax_group = synIDattr(synID(a:lnum - 1, 1, 1), 'name')
|
||||||
|
if match(currentline, '^\s\{4,}') >= 0
|
||||||
|
if current_line_syntax_group ==# 'markdownCodeBlock'
|
||||||
|
if prev_line_syntax_group !=# 'markdownCodeBlock'
|
||||||
|
return 'a1'
|
||||||
|
endif
|
||||||
|
if next_line_syntax_group !=# 'markdownCodeBlock'
|
||||||
|
return 's1'
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
return '='
|
||||||
|
endif
|
||||||
|
|
||||||
|
" folding setex headers
|
||||||
|
if (match(currentline, '^.*$') >= 0)
|
||||||
|
if (match(nextline, '^=\+$') >= 0)
|
||||||
|
return '>1'
|
||||||
|
endif
|
||||||
|
if (match(nextline, '^-\+$') >= 0)
|
||||||
|
return '>2'
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
return '='
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:SyntaxGroupOfLineIs(lnum, pattern)
|
||||||
|
let stack = synstack(a:lnum, a:cnum)
|
||||||
|
if len(stack) > 0
|
||||||
|
return synIDattr(stack[0], 'name') =~# a:pattern
|
||||||
|
endif
|
||||||
|
return 0
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" }}}
|
||||||
|
|
||||||
|
" {{{ EDIT
|
||||||
|
|
||||||
|
function! markdown#EditBlock() range abort
|
||||||
|
if exists('b:markdown_temporary_buffer') && b:markdown_temporary_buffer
|
||||||
|
echo 'Sorry, you cannot edit a code block inside a temporary buffer'
|
||||||
|
return
|
||||||
|
endif
|
||||||
|
" Github fenced code blocks like ```ruby
|
||||||
|
let code_block = s:LocateFencedCodeBlock(a:firstline,
|
||||||
|
\ '^\s*`\{3,}\(\w\+\)\%(\s.*$\|$\)',
|
||||||
|
\ '^\s*`\{3,}\s*$'
|
||||||
|
\ )
|
||||||
|
if code_block['from'] == 0 || code_block['to'] == 0
|
||||||
|
" Github fenced code blocks with metadata like ```{ruby, <WHATEVER>}
|
||||||
|
let code_block = s:LocateFencedCodeBlock(a:firstline,
|
||||||
|
\ '^\s*`\{3,}{\(\w\+\),[^}]\+}\%(\s.*$\|$\)',
|
||||||
|
\ '^\s*`\{3,}\s*$'
|
||||||
|
\ )
|
||||||
|
endif
|
||||||
|
if code_block['from'] == 0 || code_block['to'] == 0
|
||||||
|
" Github fenced code blocks alternate style like ~~~ruby
|
||||||
|
let code_block = s:LocateFencedCodeBlock(a:firstline,
|
||||||
|
\ '^\s*\~\{3,}\(\w\+\)\%(\s.*$\|$\)',
|
||||||
|
\ '^\s*\~\{3,}\s*$'
|
||||||
|
\ )
|
||||||
|
endif
|
||||||
|
if code_block['from'] == 0 || code_block['to'] == 0
|
||||||
|
" Liquid fenced code blocks {% highlight ruby %}
|
||||||
|
" (since we support some liquid/jekyll tags, why not?)
|
||||||
|
let code_block = s:LocateFencedCodeBlock(a:firstline,
|
||||||
|
\ '^\s*{%\s*highlight\s\+\(\w\+\)\s*%}\%(\s.*$\|$\)',
|
||||||
|
\ '^\s*{%\s*endhighlight\s*%}\%(\s.*$\|$\)'
|
||||||
|
\ )
|
||||||
|
endif
|
||||||
|
if code_block['from'] == 0 || code_block['to'] == 0
|
||||||
|
let code_block = s:LocateRangeBlock(a:firstline, a:lastline)
|
||||||
|
endif
|
||||||
|
if code_block['from'] == 0 || code_block['to'] == 0
|
||||||
|
echo 'Sorry, I did not find any suitable code block to edit or create'
|
||||||
|
return
|
||||||
|
endif
|
||||||
|
|
||||||
|
let code_block['file_extension'] = '.' . code_block['language']
|
||||||
|
if has_key(s:known_file_extensions, code_block['language'])
|
||||||
|
let code_block['file_extension'] = s:known_file_extensions[code_block['language']]
|
||||||
|
endif
|
||||||
|
let code_block['file_path'] = tempname() . code_block['file_extension']
|
||||||
|
let code_block['content'] = getline(code_block['from'], code_block['to'])
|
||||||
|
let code_block['content'] = s:UnindentBlock(code_block['content'], code_block['indentation'])
|
||||||
|
|
||||||
|
call writefile(code_block['content'], code_block['file_path'])
|
||||||
|
augroup MarkdownReplaceEditedBlock
|
||||||
|
autocmd BufEnter <buffer> call s:ReplaceEditedBlock()
|
||||||
|
augroup END
|
||||||
|
|
||||||
|
let b:code_block = code_block
|
||||||
|
execute 'split ' . code_block['file_path']
|
||||||
|
let b:markdown_temporary_buffer = 1
|
||||||
|
autocmd BufLeave <buffer> wq
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:ReplaceEditedBlock()
|
||||||
|
augroup MarkdownReplaceEditedBlock
|
||||||
|
autocmd!
|
||||||
|
augroup END
|
||||||
|
augroup! MarkdownReplaceEditedBlock
|
||||||
|
|
||||||
|
if b:code_block['to'] - b:code_block['from'] >= 0
|
||||||
|
execute b:code_block['from'] . ',' b:code_block['to'] . ' delete _'
|
||||||
|
endif
|
||||||
|
let content = readfile(b:code_block['file_path'])
|
||||||
|
let content = s:IndentBlock(l:content, b:code_block['indentation'])
|
||||||
|
let content = s:SurroundWithFencedCodeBlock(l:content, b:code_block)
|
||||||
|
call append(b:code_block['from']-1, content)
|
||||||
|
call setpos('.', b:code_block['back_to_position'])
|
||||||
|
|
||||||
|
execute 'silent bwipeout! ' . b:code_block['file_path']
|
||||||
|
call delete(b:code_block['file_path'])
|
||||||
|
unlet! b:code_block
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:UnindentBlock(content, indentation)
|
||||||
|
return map(a:content, 'substitute(v:val, ''^' . a:indentation . ''', '''', ''g'')')
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:IndentBlock(content, indentation)
|
||||||
|
return map(a:content, 'substitute(v:val, ''^'', ''' . a:indentation . ''', ''g'')')
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:SurroundWithFencedCodeBlock(code, editing)
|
||||||
|
if !a:editing['surround'] | return a:code | endif
|
||||||
|
if a:editing['language'] =~# 'markdown' | return a:code | endif
|
||||||
|
let before =
|
||||||
|
\ (a:editing['make_room_before'] ? [''] : []) +
|
||||||
|
\ [a:editing['indentation'] . '```' . a:editing['language']]
|
||||||
|
let after =
|
||||||
|
\ [a:editing['indentation'] . '```'] +
|
||||||
|
\ (a:editing['make_room_after'] ? [''] : [])
|
||||||
|
return l:before + a:code + l:after
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:LocateRangeBlock(from, to)
|
||||||
|
" TODO: extract initialize_code_block
|
||||||
|
let code_block = {'from': 0, 'to': 0, 'language': 'txt', 'indentation': '', 'surround': 0}
|
||||||
|
if a:to >= a:from
|
||||||
|
let code_block['from'] = a:from
|
||||||
|
let code_block['to'] = a:to
|
||||||
|
let code_block['back_to_position'] = getpos('.')
|
||||||
|
let code_block['language'] = 'markdown'
|
||||||
|
|
||||||
|
if a:from == a:to && getline(a:from) =~ '^\s*$'
|
||||||
|
let code_block['surround'] = 1
|
||||||
|
let code_block['make_room_before'] = getline(a:from - 1) !~ '^\s*$'
|
||||||
|
let code_block['make_room_after'] = getline(a:to + 1) !~ '^\s*$'
|
||||||
|
let code_block['language'] = input('filetype? (default: markdown) ', '', 'filetype')
|
||||||
|
if code_block['language'] =~ '^\s*$'
|
||||||
|
let code_block['language'] = 'markdown'
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
return code_block
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:LocateFencedCodeBlock(starting_from, upper_delimiter, lower_delimiter)
|
||||||
|
" TODO: extract initialize_code_block
|
||||||
|
let code_block = {'from': 0, 'to': 0, 'language': 'txt', 'indentation': '', 'surround': 0}
|
||||||
|
let initial_position = getpos('.')
|
||||||
|
let search_position = copy(initial_position)
|
||||||
|
let search_position[1] = a:starting_from
|
||||||
|
let search_position[2] = 0
|
||||||
|
cal setpos('.', search_position)
|
||||||
|
|
||||||
|
let start_code_block_backward = search(a:upper_delimiter, 'cbnW')
|
||||||
|
let end_code_block_backward = search(a:lower_delimiter, 'cbnW')
|
||||||
|
let end_code_block_forward = search(a:lower_delimiter, 'cnW')
|
||||||
|
|
||||||
|
let found_code_block =
|
||||||
|
\ start_code_block_backward > 0 &&
|
||||||
|
\ end_code_block_forward > 0
|
||||||
|
let between_two_code_blocks =
|
||||||
|
\ start_code_block_backward < end_code_block_backward &&
|
||||||
|
\ end_code_block_backward <= a:starting_from
|
||||||
|
let starting_inside_code_block =
|
||||||
|
\ found_code_block &&
|
||||||
|
\ !between_two_code_blocks &&
|
||||||
|
\ start_code_block_backward <= a:starting_from &&
|
||||||
|
\ end_code_block_forward >= a:starting_from
|
||||||
|
|
||||||
|
if starting_inside_code_block
|
||||||
|
let code_block['language'] = s:ExtractLanguage(start_code_block_backward, a:upper_delimiter)
|
||||||
|
let code_block['indentation'] = s:ExtractIndentation(start_code_block_backward)
|
||||||
|
let code_block['back_to_position'] = initial_position
|
||||||
|
let code_block['back_to_position'][1] = start_code_block_backward
|
||||||
|
let code_block['back_to_position'][2] = 0
|
||||||
|
let code_block['from'] = start_code_block_backward + 1
|
||||||
|
let code_block['to'] = end_code_block_forward - 1
|
||||||
|
endif
|
||||||
|
return code_block
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:ExtractLanguage(start_at, upper_delimiter)
|
||||||
|
return substitute(getline(a:start_at), a:upper_delimiter, '\1', '')
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:ExtractIndentation(start_at)
|
||||||
|
return substitute(getline(a:start_at), '\(^\s*\).\+$', '\1', '')
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
let s:known_file_extensions = {
|
||||||
|
\ 'abap': '.abap',
|
||||||
|
\ 'antlr': '.g4',
|
||||||
|
\ 'asp': '.asp',
|
||||||
|
\ 'ats': '.dats',
|
||||||
|
\ 'actionscript': '.as',
|
||||||
|
\ 'ada': '.adb',
|
||||||
|
\ 'agda': '.agda',
|
||||||
|
\ 'apacheconf': '.apacheconf',
|
||||||
|
\ 'apex': '.cls',
|
||||||
|
\ 'applescript': '.applescript',
|
||||||
|
\ 'arc': '.arc',
|
||||||
|
\ 'arduino': '.ino',
|
||||||
|
\ 'asciidoc': '.asciidoc',
|
||||||
|
\ 'assembly': '.asm',
|
||||||
|
\ 'augeas': '.aug',
|
||||||
|
\ 'autohotkey': '.ahk',
|
||||||
|
\ 'autoit': '.au3',
|
||||||
|
\ 'awk': '.awk',
|
||||||
|
\ 'batchfile': '.bat',
|
||||||
|
\ 'befunge': '.befunge',
|
||||||
|
\ 'blitzbasic': '.bb',
|
||||||
|
\ 'blitzmax': '.bmx',
|
||||||
|
\ 'bluespec': '.bsv',
|
||||||
|
\ 'boo': '.boo',
|
||||||
|
\ 'brainfuck': '.b',
|
||||||
|
\ 'brightscript': '.brs',
|
||||||
|
\ 'bro': '.bro',
|
||||||
|
\ 'c': '.c',
|
||||||
|
\ 'c++': '.cpp',
|
||||||
|
\ 'cpp': '.cpp',
|
||||||
|
\ 'clips': '.clp',
|
||||||
|
\ 'cmake': '.cmake',
|
||||||
|
\ 'cobol': '.cob',
|
||||||
|
\ 'css': '.css',
|
||||||
|
\ 'ceylon': '.ceylon',
|
||||||
|
\ 'chuck': '.ck',
|
||||||
|
\ 'cirru': '.cirru',
|
||||||
|
\ 'clean': '.icl',
|
||||||
|
\ 'clojure': '.clj',
|
||||||
|
\ 'coffeescript': '.coffee',
|
||||||
|
\ 'coldfusion': '.cfm',
|
||||||
|
\ 'coq': '.coq',
|
||||||
|
\ 'creole': '.creole',
|
||||||
|
\ 'crystal': '.cr',
|
||||||
|
\ 'cucumber': '.feature',
|
||||||
|
\ 'cuda': '.cu',
|
||||||
|
\ 'cython': '.pyx',
|
||||||
|
\ 'd': '.d',
|
||||||
|
\ 'dm': '.dm',
|
||||||
|
\ 'dot': '.dot',
|
||||||
|
\ 'dart': '.dart',
|
||||||
|
\ 'diff': '.diff',
|
||||||
|
\ 'dylan': '.dylan',
|
||||||
|
\ 'ecl': '.ecl',
|
||||||
|
\ 'eiffel': '.e',
|
||||||
|
\ 'elixir': '.ex',
|
||||||
|
\ 'elm': '.elm',
|
||||||
|
\ 'erlang': '.erl',
|
||||||
|
\ 'flux': '.fx',
|
||||||
|
\ 'fortran': '.f90',
|
||||||
|
\ 'factor': '.factor',
|
||||||
|
\ 'fancy': '.fy',
|
||||||
|
\ 'fantom': '.fan',
|
||||||
|
\ 'forth': '.fth',
|
||||||
|
\ 'gas': '.s',
|
||||||
|
\ 'glsl': '.glsl',
|
||||||
|
\ 'genshi': '.kid',
|
||||||
|
\ 'glyph': '.glf',
|
||||||
|
\ 'go': '.go',
|
||||||
|
\ 'gosu': '.gs',
|
||||||
|
\ 'groff': '.man',
|
||||||
|
\ 'groovy': '.groovy',
|
||||||
|
\ 'html': '.html',
|
||||||
|
\ 'http': '.http',
|
||||||
|
\ 'haml': '.haml',
|
||||||
|
\ 'handlebars': '.handlebars',
|
||||||
|
\ 'harbour': '.hb',
|
||||||
|
\ 'haskell': '.hs',
|
||||||
|
\ 'haxe': '.hx',
|
||||||
|
\ 'hy': '.hy',
|
||||||
|
\ 'idl': '.pro',
|
||||||
|
\ 'ini': '.ini',
|
||||||
|
\ 'idris': '.idr',
|
||||||
|
\ 'io': '.io',
|
||||||
|
\ 'ioke': '.ik',
|
||||||
|
\ 'j': '.ijs',
|
||||||
|
\ 'json': '.json',
|
||||||
|
\ 'json5': '.json5',
|
||||||
|
\ 'jsonld': '.jsonld',
|
||||||
|
\ 'jade': '.jade',
|
||||||
|
\ 'java': '.java',
|
||||||
|
\ 'javascript': '.js',
|
||||||
|
\ 'julia': '.jl',
|
||||||
|
\ 'krl': '.krl',
|
||||||
|
\ 'kotlin': '.kt',
|
||||||
|
\ 'lfe': '.lfe',
|
||||||
|
\ 'llvm': '.ll',
|
||||||
|
\ 'lasso': '.lasso',
|
||||||
|
\ 'less': '.less',
|
||||||
|
\ 'lilypond': '.ly',
|
||||||
|
\ 'livescript': '.ls',
|
||||||
|
\ 'logos': '.xm',
|
||||||
|
\ 'logtalk': '.lgt',
|
||||||
|
\ 'lua': '.lua',
|
||||||
|
\ 'm': '.mumps',
|
||||||
|
\ 'makefile': '.mak',
|
||||||
|
\ 'mako': '.mako',
|
||||||
|
\ 'markdown': '.md',
|
||||||
|
\ 'mask': '.mask',
|
||||||
|
\ 'matlab': '.matlab',
|
||||||
|
\ 'max': '.maxpat',
|
||||||
|
\ 'mediawiki': '.mediawiki',
|
||||||
|
\ 'mirah': '.druby',
|
||||||
|
\ 'monkey': '.monkey',
|
||||||
|
\ 'moocode': '.moo',
|
||||||
|
\ 'moonscript': '.moon',
|
||||||
|
\ 'myghty': '.myt',
|
||||||
|
\ 'nsis': '.nsi',
|
||||||
|
\ 'nemerle': '.n',
|
||||||
|
\ 'netlogo': '.nlogo',
|
||||||
|
\ 'nginx': '.nginxconf',
|
||||||
|
\ 'nimrod': '.nim',
|
||||||
|
\ 'nu': '.nu',
|
||||||
|
\ 'numpy': '.numpy',
|
||||||
|
\ 'ocaml': '.ml',
|
||||||
|
\ 'objdump': '.objdump',
|
||||||
|
\ 'omgrofl': '.omgrofl',
|
||||||
|
\ 'opa': '.opa',
|
||||||
|
\ 'opencl': '.cl',
|
||||||
|
\ 'org': '.org',
|
||||||
|
\ 'oxygene': '.oxygene',
|
||||||
|
\ 'pawn': '.pwn',
|
||||||
|
\ 'php': '.php',
|
||||||
|
\ 'parrot': '.parrot',
|
||||||
|
\ 'pascal': '.pas',
|
||||||
|
\ 'perl': '.pl',
|
||||||
|
\ 'perl6': '.p6',
|
||||||
|
\ 'pike': '.pike',
|
||||||
|
\ 'pod': '.pod',
|
||||||
|
\ 'pogoscript': '.pogo',
|
||||||
|
\ 'postscript': '.ps',
|
||||||
|
\ 'powershell': '.ps1',
|
||||||
|
\ 'processing': '.pde',
|
||||||
|
\ 'prolog': '.prolog',
|
||||||
|
\ 'puppet': '.pp',
|
||||||
|
\ 'python': '.py',
|
||||||
|
\ 'qml': '.qml',
|
||||||
|
\ 'r': '.r',
|
||||||
|
\ 'rdoc': '.rdoc',
|
||||||
|
\ 'realbasic': '.rbbas',
|
||||||
|
\ 'rhtml': '.rhtml',
|
||||||
|
\ 'rmarkdown': '.rmd',
|
||||||
|
\ 'racket': '.rkt',
|
||||||
|
\ 'rebol': '.rebol',
|
||||||
|
\ 'redcode': '.cw',
|
||||||
|
\ 'robotframework': '.robot',
|
||||||
|
\ 'rouge': '.rg',
|
||||||
|
\ 'ruby': '.rb',
|
||||||
|
\ 'rust': '.rs',
|
||||||
|
\ 'scss': '.scss',
|
||||||
|
\ 'sql': '.sql',
|
||||||
|
\ 'sage': '.sage',
|
||||||
|
\ 'sass': '.sass',
|
||||||
|
\ 'scala': '.scala',
|
||||||
|
\ 'scaml': '.scaml',
|
||||||
|
\ 'scheme': '.scm',
|
||||||
|
\ 'scilab': '.sci',
|
||||||
|
\ 'self': '.self',
|
||||||
|
\ 'shell': '.sh',
|
||||||
|
\ 'shen': '.shen',
|
||||||
|
\ 'slash': '.sl',
|
||||||
|
\ 'smalltalk': '.st',
|
||||||
|
\ 'smarty': '.tpl',
|
||||||
|
\ 'squirrel': '.nut',
|
||||||
|
\ 'stylus': '.styl',
|
||||||
|
\ 'supercollider': '.scd',
|
||||||
|
\ 'toml': '.toml',
|
||||||
|
\ 'txl': '.txl',
|
||||||
|
\ 'tcl': '.tcl',
|
||||||
|
\ 'tcsh': '.tcsh',
|
||||||
|
\ 'tex': '.tex',
|
||||||
|
\ 'tea': '.tea',
|
||||||
|
\ 'textile': '.textile',
|
||||||
|
\ 'turing': '.t',
|
||||||
|
\ 'twig': '.twig',
|
||||||
|
\ 'typescript': '.ts',
|
||||||
|
\ 'unrealscript': '.uc',
|
||||||
|
\ 'vhdl': '.vhdl',
|
||||||
|
\ 'vala': '.vala',
|
||||||
|
\ 'verilog': '.v',
|
||||||
|
\ 'viml': '.vim',
|
||||||
|
\ 'volt': '.volt',
|
||||||
|
\ 'xc': '.xc',
|
||||||
|
\ 'xml': '.xml',
|
||||||
|
\ 'xproc': '.xpl',
|
||||||
|
\ 'xquery': '.xquery',
|
||||||
|
\ 'xs': '.xs',
|
||||||
|
\ 'xslt': '.xslt',
|
||||||
|
\ 'xtend': '.xtend',
|
||||||
|
\ 'yaml': '.yml',
|
||||||
|
\ 'ec': '.ec',
|
||||||
|
\ 'edn': '.edn',
|
||||||
|
\ 'fish': '.fish',
|
||||||
|
\ 'mupad': '.mu',
|
||||||
|
\ 'nesc': '.nc',
|
||||||
|
\ 'ooc': '.ooc',
|
||||||
|
\ 'restructuredtext': '.rst',
|
||||||
|
\ 'wisp': '.wisp',
|
||||||
|
\ 'xbase': '.prg',
|
||||||
|
\ }
|
||||||
|
|
||||||
|
" }}}
|
||||||
|
|
||||||
|
" {{{ FORMAT
|
||||||
|
function! markdown#FormatTable()
|
||||||
|
let p = '^\s*|\s.*\s|\s*$'
|
||||||
|
if exists(':Tabularize') && getline('.') =~# '^\s*|' && (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.*'))
|
||||||
|
let separator_line_number = search('^\s*|\s*-\{3,}', 'cbnW')
|
||||||
|
|
||||||
|
call s:ShrinkTableHeaderSeparator(separator_line_number)
|
||||||
|
Tabularize/|/l1
|
||||||
|
call s:ExpandTableHeaderSeparator(separator_line_number)
|
||||||
|
normal! 0
|
||||||
|
|
||||||
|
call search(repeat('[^|]*|',column).'\s\{-\}'.repeat('.',position),'ce',line('.'))
|
||||||
|
endif
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:ShrinkTableHeaderSeparator(separator_line_number)
|
||||||
|
if a:separator_line_number > 0
|
||||||
|
let separator_line = getline(a:separator_line_number)
|
||||||
|
let separator_line = substitute(separator_line, '-\+', '---', 'g')
|
||||||
|
call setline(a:separator_line_number, separator_line)
|
||||||
|
endif
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:ExpandTableHeaderSeparator(separator_line_number)
|
||||||
|
if a:separator_line_number > 0
|
||||||
|
let separator_line = getline(a:separator_line_number)
|
||||||
|
let separator_line = substitute(
|
||||||
|
\ separator_line,
|
||||||
|
\ '|\([^|]*\)',
|
||||||
|
\ '\="| " . repeat("-", strlen(submatch(1)) - 2) . " "',
|
||||||
|
\ 'g')
|
||||||
|
let separator_line = substitute(separator_line, '\s*$', '', '')
|
||||||
|
call setline(a:separator_line_number, separator_line)
|
||||||
|
endif
|
||||||
|
endfunction
|
||||||
|
" }}}
|
||||||
|
|
||||||
|
" {{{ SWITCH STATUS
|
||||||
|
function! markdown#SwitchStatus()
|
||||||
|
let current_line = getline('.')
|
||||||
|
if match(current_line, '^\s*[*\-+] \[ \]') >= 0
|
||||||
|
call setline('.', substitute(current_line, '^\(\s*[*\-+]\) \[ \]', '\1 [x]', ''))
|
||||||
|
return
|
||||||
|
endif
|
||||||
|
if match(current_line, '^\s*[*\-+] \[x\]') >= 0
|
||||||
|
call setline('.', substitute(current_line, '^\(\s*[*\-+]\) \[x\]', '\1', ''))
|
||||||
|
return
|
||||||
|
endif
|
||||||
|
if match(current_line, '^\s*[*\-+] \(\[[x ]\]\)\@!') >= 0
|
||||||
|
call setline('.', substitute(current_line, '^\(\s*[*\-+]\)', '\1 [ ]', ''))
|
||||||
|
return
|
||||||
|
endif
|
||||||
|
if match(current_line, '^\s*#\{1,5}\s') >= 0
|
||||||
|
call setline('.', substitute(current_line, '^\(\s*#\{1,5}\) \(.*$\)', '\1# \2', ''))
|
||||||
|
return
|
||||||
|
endif
|
||||||
|
if match(current_line, '^\s*#\{6}\s') >= 0
|
||||||
|
call setline('.', substitute(current_line, '^\(\s*\)#\{6} \(.*$\)', '\1# \2', ''))
|
||||||
|
return
|
||||||
|
endif
|
||||||
|
endfunction
|
||||||
|
" }}}
|
||||||
|
|
||||||
|
endif
|
||||||
536
autoload/pony.vim
Normal file
536
autoload/pony.vim
Normal file
@@ -0,0 +1,536 @@
|
|||||||
|
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'pony') == -1
|
||||||
|
|
||||||
|
" Vim plugin file
|
||||||
|
" Language: Pony
|
||||||
|
" Maintainer: Jak Wings
|
||||||
|
|
||||||
|
" TODO: Make sure echomsg is off for release.
|
||||||
|
let s:cpo_save = &cpo
|
||||||
|
set cpo&vim
|
||||||
|
|
||||||
|
|
||||||
|
"let s:skip = '<SID>InCommentOrLiteral(line("."), col("."))'
|
||||||
|
let s:skip2 = '<SID>InLiteral(line("."), col(".")) || <SID>InComment(line("."), col(".")) == 1'
|
||||||
|
let s:skip3 = '!<SID>InKeyword(line("."), col("."))'
|
||||||
|
let s:skip4 = '!<SID>InBracket(line("."), col("."))'
|
||||||
|
let s:cfstart = '\v<%(ifdef|if|match|while|for|repeat|try|with|recover|object|lambda|iftype)>'
|
||||||
|
let s:cfmiddle = '\v<%(then|elseif|else|until|do|in|elseiftype)>|\|'
|
||||||
|
let s:cfend = '\v<end>'
|
||||||
|
let s:bstartp = '\v<%(ifdef|if|then|elseif|else|(match)|while|for|in|do|try|with|recover|repeat|until|(object)|lambda|iftype|elseiftype)>'
|
||||||
|
|
||||||
|
function! pony#Indent()
|
||||||
|
if v:lnum <= 1
|
||||||
|
return 0
|
||||||
|
endif
|
||||||
|
|
||||||
|
call cursor(v:lnum, 1)
|
||||||
|
let l:pnzpos = searchpos('.', 'cbnW')
|
||||||
|
if l:pnzpos == [0, 0]
|
||||||
|
return 0
|
||||||
|
endif
|
||||||
|
|
||||||
|
if s:InComment2(l:pnzpos) > 1
|
||||||
|
"echomsg 'Comment' (l:pnzpos[0] . '-' . v:lnum) -1
|
||||||
|
return cindent(v:lnum)
|
||||||
|
endif
|
||||||
|
|
||||||
|
if s:InLiteral2(l:pnzpos)
|
||||||
|
"echomsg 'String' (l:pnzpos[0] . '-' . v:lnum) -1
|
||||||
|
return -1
|
||||||
|
endif
|
||||||
|
|
||||||
|
unlet! l:pnzpos
|
||||||
|
|
||||||
|
" NOTE: Lines started in comments and strings are checked already.
|
||||||
|
|
||||||
|
let l:pnblnum = s:PrevNonblank(v:lnum - 1)
|
||||||
|
if l:pnblnum < 1
|
||||||
|
return 0
|
||||||
|
endif
|
||||||
|
|
||||||
|
let l:pnbline = getline(l:pnblnum)
|
||||||
|
let l:pnbindent = indent(l:pnblnum)
|
||||||
|
|
||||||
|
let l:line = getline(v:lnum)
|
||||||
|
let l:indent = l:pnbindent
|
||||||
|
let l:shiftwidth = shiftwidth()
|
||||||
|
|
||||||
|
" FIXME?
|
||||||
|
let l:continuing = 0
|
||||||
|
" If the previous line ends with a unary or binary operator,
|
||||||
|
if s:IsContinued(l:pnblnum)
|
||||||
|
let l:contlnum = l:pnblnum
|
||||||
|
let l:ppcontinued = 0
|
||||||
|
let l:ppnblnum = s:PrevNonblank(l:pnblnum - 1)
|
||||||
|
while s:IsContinued(l:ppnblnum)
|
||||||
|
let l:ppcontinued += 1
|
||||||
|
let l:contlnum = l:ppnblnum
|
||||||
|
let l:ppnblnum = s:PrevNonblank(l:ppnblnum - 1)
|
||||||
|
endwhile
|
||||||
|
"echomsg 'Continued1' l:pnblnum l:contlnum
|
||||||
|
" If the previous line is also continuing another line,
|
||||||
|
if l:ppcontinued
|
||||||
|
let l:continuing = 1
|
||||||
|
if getline(l:contlnum) =~# '\v^\s*%(actor|class|struct|primitive|trait|type|interface)>'
|
||||||
|
" reset the indent level.
|
||||||
|
"echomsg 'Continuing0' (l:contlnum . '-' . v:lnum) (l:shiftwidth * 2)
|
||||||
|
let l:indent = l:shiftwidth * 2
|
||||||
|
else
|
||||||
|
" keep using the previous indent.
|
||||||
|
"echomsg 'Continuing1' (l:pnblnum . '-' . v:lnum) l:pnbindent
|
||||||
|
let l:indent = l:pnbindent
|
||||||
|
endif
|
||||||
|
" if the previous line is part of the definition of a class,
|
||||||
|
elseif l:pnbline =~# '\v^\s*%(actor|class|struct|primitive|trait|type|interface)>'
|
||||||
|
" reset the indent level.
|
||||||
|
"echomsg 'Continuing2' (l:pnblnum . '-' . v:lnum) (l:shiftwidth * 2)
|
||||||
|
let l:continuing = 1
|
||||||
|
let l:indent = l:shiftwidth * 2
|
||||||
|
" if the previous line is part of the definition of a method,
|
||||||
|
elseif l:pnbline =~# '\v^\s*%(fun|new|be)>'
|
||||||
|
" reset the indent level.
|
||||||
|
"echomsg 'Continuing3' (l:pnblnum . '-' . v:lnum) (l:pnbindent + l:shiftwidth)
|
||||||
|
let l:continuing = 1
|
||||||
|
let l:indent = l:pnbindent + l:shiftwidth
|
||||||
|
" if the previous line is the start of a definition body,
|
||||||
|
elseif l:pnbline =~# '=>\s*$'
|
||||||
|
" indent this line.
|
||||||
|
"echomsg 'Continuing4' (l:pnblnum . '-' . v:lnum) (l:pnbindent + l:shiftwidth)
|
||||||
|
let l:continuing = 1
|
||||||
|
let l:indent = l:pnbindent + l:shiftwidth
|
||||||
|
else
|
||||||
|
" indent this line twice as far.
|
||||||
|
"echomsg 'Continuing5' (l:pnblnum . '-' . v:lnum) (l:pnbindent + l:shiftwidth * 2)
|
||||||
|
let l:continuing = 1
|
||||||
|
let l:indent = l:pnbindent + l:shiftwidth * 2
|
||||||
|
endif
|
||||||
|
|
||||||
|
unlet! l:contlnum l:ppnblnum l:ppcontinued
|
||||||
|
endif
|
||||||
|
|
||||||
|
" If this line starts a document string,
|
||||||
|
if !l:continuing && l:line =~# '^\s*"""'
|
||||||
|
let l:ppnblnum = s:PrevNonblank(l:pnblnum - 1)
|
||||||
|
if s:IsContinued(l:ppnblnum)
|
||||||
|
let l:contlnum = l:ppnblnum
|
||||||
|
while s:IsContinued(l:ppnblnum)
|
||||||
|
let l:contlnum = l:ppnblnum
|
||||||
|
let l:ppnblnum = s:PrevNonblank(l:ppnblnum - 1)
|
||||||
|
endwhile
|
||||||
|
if getline(l:contlnum) =~# '\v^\s*%(actor|class|struct|primitive|trait|type|interface)>'
|
||||||
|
" reset the indent level.
|
||||||
|
"echomsg 'DocString' (l:contlnum . '-' . v:lnum) l:shiftwidth
|
||||||
|
return l:shiftwidth
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
unlet! l:contlnum l:ppnblnum
|
||||||
|
endif
|
||||||
|
|
||||||
|
" If the previous line contains an unmatched opening bracket
|
||||||
|
if !l:continuing && l:pnbline =~# '[{[(]'
|
||||||
|
" if the line ends with an opening bracket,
|
||||||
|
if l:pnbline =~# '[{[(]\s*$' && !s:InCommentOrLiteral(l:pnblnum, col([l:pnblnum, '$']) - 1)
|
||||||
|
" indent this line.
|
||||||
|
let l:indent += l:shiftwidth
|
||||||
|
else
|
||||||
|
" find the unmatched opening bracket,
|
||||||
|
let l:start = [0, 0]
|
||||||
|
let l:end = col([l:pnblnum, '$']) - 1
|
||||||
|
call cursor(l:pnblnum, l:end)
|
||||||
|
while l:end > 0
|
||||||
|
let l:start = s:OuterPos(l:start, searchpairpos('(', '', ')', 'bnW', s:skip4, l:pnblnum))
|
||||||
|
let l:start = s:OuterPos(l:start, searchpairpos('\[', '', '\]', 'bnW', s:skip4, l:pnblnum))
|
||||||
|
let l:start = s:OuterPos(l:start, searchpairpos('{', '', '}', 'bnW', s:skip4, l:pnblnum))
|
||||||
|
if l:start == [0, 0]
|
||||||
|
break
|
||||||
|
endif
|
||||||
|
" find the matched closing bracket on the same line,
|
||||||
|
call cursor(l:start[0], l:start[1])
|
||||||
|
let l:c = s:CharAtCursor(l:start[0], l:start[1])
|
||||||
|
if searchpair(escape(l:c, '['), '', escape(tr(l:c, '([{', ')]}'), ']'),
|
||||||
|
\ 'znW', s:skip4, l:pnblnum) < 1
|
||||||
|
" the unmatched opening bracket is found,
|
||||||
|
break
|
||||||
|
endif
|
||||||
|
let l:end = l:start[1]
|
||||||
|
let l:start = [0, 0]
|
||||||
|
endwhile
|
||||||
|
if l:start != [0, 0]
|
||||||
|
" indent this line.
|
||||||
|
"echomsg 'Open bracket' (l:pnblnum . '-' . v:lnum) (l:indent + l:shiftwidth)
|
||||||
|
let l:indent += l:shiftwidth
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
unlet! l:start l:end l:c
|
||||||
|
endif
|
||||||
|
|
||||||
|
" If there is a matched closing bracket on the previous line,
|
||||||
|
" NOTE:
|
||||||
|
" >|[
|
||||||
|
" | (1 -
|
||||||
|
" | 1) * 2]
|
||||||
|
" | command
|
||||||
|
" ^
|
||||||
|
if !l:continuing
|
||||||
|
call cursor(l:pnblnum, 1)
|
||||||
|
" find the last closing bracket,
|
||||||
|
let l:end = [0, 0]
|
||||||
|
let l:end = s:OuterPos(l:end, searchpairpos('(', '', ')', 'zncr', s:skip4, l:pnblnum))
|
||||||
|
let l:end = s:OuterPos(l:end, searchpairpos('\[', '', '\]', 'zncr', s:skip4, l:pnblnum))
|
||||||
|
let l:end = s:OuterPos(l:end, searchpairpos('{', '', '}', 'zncr', s:skip4, l:pnblnum))
|
||||||
|
if l:end != [0, 0]
|
||||||
|
" find the matched opening bracket on another line,
|
||||||
|
let l:c = s:CharAtCursor(l:end[0], l:end[1])
|
||||||
|
let l:start = searchpairpos(escape(tr(l:c, ')]}', '([{'), '['), '', escape(l:c, ']'), 'nbW', s:skip4)
|
||||||
|
if l:start[0] != l:end[0]
|
||||||
|
" and then this line has the same indent as the line the matched bracket stays.
|
||||||
|
"echomsg 'Matched bracket' (l:start[0] . '-' . v:lnum) indent(l:start[0])
|
||||||
|
let l:indent = indent(l:start[0])
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
unlet! l:start l:end l:c
|
||||||
|
endif
|
||||||
|
|
||||||
|
" If there is a matched closing bracket on this line,
|
||||||
|
" NOTE:
|
||||||
|
" |[
|
||||||
|
" >| (1 -
|
||||||
|
" | 1) * 2
|
||||||
|
" |]
|
||||||
|
" ^ ^
|
||||||
|
if l:line =~# '^\s*[)\]}]'
|
||||||
|
" find the first closing bracket,
|
||||||
|
call cursor(v:lnum, 1)
|
||||||
|
let l:end = [0, 0]
|
||||||
|
let l:end = s:InnerPos(l:end, searchpairpos('(', '', ')', 'zncW', s:skip4, v:lnum))
|
||||||
|
let l:end = s:InnerPos(l:end, searchpairpos('\[', '', '\]', 'zncW', s:skip4, v:lnum))
|
||||||
|
let l:end = s:InnerPos(l:end, searchpairpos('{', '', '}', 'zncW', s:skip4, v:lnum))
|
||||||
|
if l:end != [0, 0]
|
||||||
|
" find the matched opening bracket on another line,
|
||||||
|
let l:c = s:CharAtCursor(l:end[0], l:end[1])
|
||||||
|
let l:start = searchpairpos(escape(tr(l:c, ')]}', '([{'), '['), '', escape(l:c, ']'), 'nbW', s:skip4)
|
||||||
|
if l:start[0] != l:end[0]
|
||||||
|
" and then this line has the same indent as the line the matched bracket stays.
|
||||||
|
"echomsg 'Closing Bracket' (l:start[0] . '-' . v:lnum) indent(l:start[0])
|
||||||
|
let l:indent = indent(l:start[0])
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
unlet! l:start l:end l:c
|
||||||
|
endif
|
||||||
|
|
||||||
|
" If this line starts the definition of a method, closure or match case,
|
||||||
|
if l:line =~# '^\s*=>'
|
||||||
|
" find the start of the definition,
|
||||||
|
call cursor(v:lnum, 1)
|
||||||
|
let l:start = searchpairpos('\v<%(new|be|fun|lambda)>|\|', '', '=>\zs', 'bnW', s:skip3)
|
||||||
|
if l:start != [0, 0]
|
||||||
|
" then this line has the same indent as the start.
|
||||||
|
"echomsg 'Method body' (l:start[0] . '-' . v:lnum) indent(l:start[0])
|
||||||
|
return indent(l:start[0])
|
||||||
|
endif
|
||||||
|
|
||||||
|
unlet! l:start
|
||||||
|
endif
|
||||||
|
|
||||||
|
" If this line starts a class definition or starts an alias,
|
||||||
|
if l:line =~# '\v^\s*%(actor|class|struct|primitive|trait|interface|use|type)>'
|
||||||
|
" reset the indent level.
|
||||||
|
return 0
|
||||||
|
endif
|
||||||
|
|
||||||
|
" If this line starts a method definition,
|
||||||
|
if l:line =~# '\v^\s*%(new|be|fun)>'
|
||||||
|
call cursor(v:lnum, 1)
|
||||||
|
let l:start = searchpairpos(s:cfstart, s:cfmiddle, s:cfend, 'bW', s:skip3)
|
||||||
|
if l:start != [0, 0]
|
||||||
|
let l:start = searchpos(s:bstartp, 'zcnpW', l:start[0])
|
||||||
|
" see if it is in an object block,
|
||||||
|
if l:start[2] == 3
|
||||||
|
"echomsg 'Method in object' (l:start[0] . '-' . v:lnum) (l:shiftwidth + indent(l:start[0]))
|
||||||
|
return l:shiftwidth + indent(l:start[0])
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
return l:shiftwidth
|
||||||
|
endif
|
||||||
|
|
||||||
|
" If this line starts a match case,
|
||||||
|
call cursor(v:lnum, 1)
|
||||||
|
if l:line =~# '^\s*|' && s:InKeyword(searchpos('|', 'znW', v:lnum))
|
||||||
|
" find the start or the previous case of the match block,
|
||||||
|
let l:start = searchpairpos(s:cfstart, s:cfmiddle, s:cfend, 'bnW', s:skip3)
|
||||||
|
if l:start != [0, 0]
|
||||||
|
" then this line has the same indent as the start.
|
||||||
|
"echomsg 'Match case' (l:start[0] . '-' . v:lnum) indent(l:start[0])
|
||||||
|
return indent(l:start[0])
|
||||||
|
endif
|
||||||
|
|
||||||
|
unlet! l:start
|
||||||
|
endif
|
||||||
|
|
||||||
|
" If this line ends (part of) a control flow,
|
||||||
|
if l:line =~# '\v^\s*%(end|elseif|else|then|in|do|until|elseiftype)>'
|
||||||
|
" find the start or middle of the control block,
|
||||||
|
call cursor(v:lnum, 1)
|
||||||
|
let l:start = searchpairpos(s:cfstart, s:cfmiddle, s:cfend, 'bnW', s:skip3)
|
||||||
|
if l:start != [0, 0]
|
||||||
|
" then this line has the same indent as the start.
|
||||||
|
"echomsg 'Block end' (l:start[0] . '-' . v:lnum) indent(l:start[0])
|
||||||
|
return indent(l:start[0])
|
||||||
|
endif
|
||||||
|
|
||||||
|
unlet! l:start
|
||||||
|
endif
|
||||||
|
|
||||||
|
" If the previous line starts a class definition,
|
||||||
|
if l:pnbline =~# '\v^\s*%(actor|class|struct|primitive|trait|type|interface)>'
|
||||||
|
" reset the indent level.
|
||||||
|
if s:IsContinued(l:pnblnum)
|
||||||
|
return l:shiftwidth * 2
|
||||||
|
else
|
||||||
|
return l:shiftwidth
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
" If the previous line starts a method definition,
|
||||||
|
if l:pnbline =~# '\v^\s*%(new|be|fun)>'
|
||||||
|
return l:pnbindent + l:shiftwidth
|
||||||
|
endif
|
||||||
|
|
||||||
|
" If the previous line starts (part of) a control flow,
|
||||||
|
call cursor(l:pnblnum, 1)
|
||||||
|
while 1
|
||||||
|
" find the start of the control block,
|
||||||
|
let l:start = searchpos(s:bstartp, 'zcepW', l:pnblnum)
|
||||||
|
if l:start[2] == 0
|
||||||
|
break
|
||||||
|
endif
|
||||||
|
if !s:InKeyword(l:start[0:1])
|
||||||
|
call cursor(l:pnblnum, l:start[1] + 3)
|
||||||
|
continue
|
||||||
|
endif
|
||||||
|
let l:index = l:start[2]
|
||||||
|
" find the end of the control block on the same line,
|
||||||
|
let l:end = searchpair(s:cfstart, '', s:cfend, 'znW', s:skip3, l:pnblnum)
|
||||||
|
" if the control block is not ended,
|
||||||
|
if l:end < 1
|
||||||
|
" if this line is a case for a match,
|
||||||
|
if l:index == 2 && l:line =~# '^\s*|'
|
||||||
|
" then this line has the same indent as the start of the match block.
|
||||||
|
return l:pnbindent
|
||||||
|
else
|
||||||
|
" then indent this line.
|
||||||
|
"echomsg 'Block start' (l:pnblnum . '-' . v:lnum) (l:pnbindent + l:shiftwidth)
|
||||||
|
return l:pnbindent + l:shiftwidth
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
endwhile
|
||||||
|
|
||||||
|
unlet! l:start l:end l:index
|
||||||
|
|
||||||
|
return l:indent
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:PrevNonblank(lnum)
|
||||||
|
let l:lnum = prevnonblank(a:lnum)
|
||||||
|
while l:lnum > 0 && (s:InComment2(l:lnum, 1) || s:InLiteral2(l:lnum, 1))
|
||||||
|
let l:lnum = prevnonblank(l:lnum - 1)
|
||||||
|
endwhile
|
||||||
|
return l:lnum
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" NOTE:
|
||||||
|
" v
|
||||||
|
" |1 /* comment */
|
||||||
|
" |2
|
||||||
|
function! s:IsContinued(lnum)
|
||||||
|
let l:lnum = s:PrevNonblank(a:lnum)
|
||||||
|
if l:lnum < 1
|
||||||
|
return 0
|
||||||
|
endif
|
||||||
|
let l:line = getline(l:lnum)
|
||||||
|
let l:width = strwidth(substitute(l:line, '\s*$', '', ''))
|
||||||
|
" FIXME?
|
||||||
|
" | 1 + //
|
||||||
|
" | //
|
||||||
|
" | 2
|
||||||
|
return !s:InCommentOrLiteral(a:lnum, l:width)
|
||||||
|
\ && (l:line =~# '\v<%(and|or|xor|is|isnt|as|not|consume|addressof|digestof)\s*$'
|
||||||
|
\ || l:line =~# '\v%([=\-.]\>|[<!=>]\=\~?|\<\<\~?|\>\>\~?|\<:|[+\-*/%<>]\~?|[.,|:@~])\s*$'
|
||||||
|
\ )
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:InCommentOrLiteral(...)
|
||||||
|
return call('s:InComment', a:000) || call('s:InLiteral', a:000)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:InKeyword(...)
|
||||||
|
let [l:lnum, l:col] = (type(a:1) == type([]) ? a:1 : a:000)
|
||||||
|
for id in s:Or(synstack(l:lnum, l:col), [])
|
||||||
|
if synIDattr(id, 'name') =~# '^ponyKw'
|
||||||
|
return 1
|
||||||
|
endif
|
||||||
|
endfor
|
||||||
|
return 0
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:InBracket(...)
|
||||||
|
let [l:lnum, l:col] = (type(a:1) == type([]) ? a:1 : a:000)
|
||||||
|
for id in s:Or(synstack(l:lnum, l:col), [])
|
||||||
|
if synIDattr(id, 'name') ==# 'ponyBracket'
|
||||||
|
return 1
|
||||||
|
endif
|
||||||
|
endfor
|
||||||
|
return 0
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:InComment(...)
|
||||||
|
let [l:lnum, l:col] = (type(a:1) == type([]) ? a:1 : a:000)
|
||||||
|
let l:stack = synstack(l:lnum, l:col)
|
||||||
|
let l:i = len(l:stack)
|
||||||
|
while l:i > 0
|
||||||
|
let l:sname = synIDattr(l:stack[l:i - 1], 'name')
|
||||||
|
if l:sname =~# '^ponyNestedCommentX\?$'
|
||||||
|
return 1 + l:i - (l:sname =~# 'X$')
|
||||||
|
elseif l:sname =~# '^ponyCommentX\?$'
|
||||||
|
return 1
|
||||||
|
endif
|
||||||
|
let l:i -= 1
|
||||||
|
endwhile
|
||||||
|
return 0
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:InLiteral(...)
|
||||||
|
let [l:lnum, l:col] = (type(a:1) == type([]) ? a:1 : a:000)
|
||||||
|
let l:stack = synstack(l:lnum, l:col)
|
||||||
|
let l:i = len(l:stack)
|
||||||
|
while l:i > 0
|
||||||
|
let l:sname = synIDattr(l:stack[l:i - 1], 'name')
|
||||||
|
if l:sname =~# '^ponyDocumentStringX\?$'
|
||||||
|
return 3
|
||||||
|
elseif l:sname =~# '^ponyStringX\?$'
|
||||||
|
return 2
|
||||||
|
elseif l:sname =~# '^ponyCharacterX\?$'
|
||||||
|
return 1
|
||||||
|
endif
|
||||||
|
let l:i -= 1
|
||||||
|
endwhile
|
||||||
|
return 0
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" NOTE:
|
||||||
|
" |// //inside
|
||||||
|
" ^^^^^^^^^^
|
||||||
|
" |/* /*inside*/ */
|
||||||
|
" ^^^^^^^^^^^^^^
|
||||||
|
function! s:InComment2(...)
|
||||||
|
let [l:lnum, l:col] = (type(a:1) == type([]) ? a:1 : a:000)
|
||||||
|
let l:stack = synstack(l:lnum, l:col)
|
||||||
|
let l:i = len(l:stack)
|
||||||
|
while l:i > 0
|
||||||
|
let l:sname = synIDattr(l:stack[l:i - 1], 'name')
|
||||||
|
if l:sname ==# 'ponyNestedComment'
|
||||||
|
return 1 + l:i
|
||||||
|
elseif l:sname ==# 'ponyComment'
|
||||||
|
return 1
|
||||||
|
elseif l:sname =~# '\v^pony%(Nested)?CommentX$'
|
||||||
|
return 0
|
||||||
|
endif
|
||||||
|
let l:i -= 1
|
||||||
|
endwhile
|
||||||
|
return 0
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" NOTE:
|
||||||
|
" |"inside"
|
||||||
|
" ^^^^^^
|
||||||
|
" |"""inside"""""
|
||||||
|
" ^^^^^^^^^^^^
|
||||||
|
function! s:InLiteral2(...)
|
||||||
|
let [l:lnum, l:col] = (type(a:1) == type([]) ? a:1 : a:000)
|
||||||
|
let l:stack = synstack(l:lnum, l:col)
|
||||||
|
let l:i = len(l:stack)
|
||||||
|
while l:i > 0
|
||||||
|
let l:sname = synIDattr(l:stack[l:i - 1], 'name')
|
||||||
|
if l:sname ==# 'ponyDocumentString'
|
||||||
|
return 3
|
||||||
|
elseif l:sname ==# 'ponyString'
|
||||||
|
return 2
|
||||||
|
elseif l:sname ==# 'ponyCharacter'
|
||||||
|
return 1
|
||||||
|
elseif l:sname =~# '\v^pony%(DocumentString|String|Character)X$'
|
||||||
|
return 0
|
||||||
|
endif
|
||||||
|
let l:i -= 1
|
||||||
|
endwhile
|
||||||
|
return 0
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:CharAtCursor(...)
|
||||||
|
let [l:lnum, l:col] = (type(a:1) == type([]) ? a:1 : a:000)
|
||||||
|
return matchstr(getline(l:lnum), '\%' . l:col . 'c.')
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:Or(x, y)
|
||||||
|
return !empty(a:x) ? a:x : a:y
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:InnerPos(x, y)
|
||||||
|
if a:x == [0, 0]
|
||||||
|
return a:y
|
||||||
|
elseif a:y == [0, 0]
|
||||||
|
return a:x
|
||||||
|
else
|
||||||
|
return a:x[1] < a:y[1] ? a:x : a:y
|
||||||
|
end
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:OuterPos(x, y)
|
||||||
|
if a:x == [0, 0]
|
||||||
|
return a:y
|
||||||
|
elseif a:y == [0, 0]
|
||||||
|
return a:x
|
||||||
|
else
|
||||||
|
return a:x[1] > a:y[1] ? a:x : a:y
|
||||||
|
end
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! pony#ClearTrailingSpace(all, alt, ...)
|
||||||
|
let l:force = (a:0 > 0 ? a:1 : 0)
|
||||||
|
if !l:force && (&readonly || !&modifiable || !&modified)
|
||||||
|
return
|
||||||
|
endif
|
||||||
|
if a:all
|
||||||
|
for lnum in range(1, line('$'))
|
||||||
|
let l:line = getline(lnum)
|
||||||
|
let l:end = col([lnum, '$']) - 1
|
||||||
|
if l:end > 0 && l:line =~# '\s$' && !s:InLiteral(lnum, l:end)
|
||||||
|
if a:alt
|
||||||
|
call setline(lnum, substitute(l:line, '\S\@<=\s\s*$', '', ''))
|
||||||
|
else
|
||||||
|
call setline(lnum, substitute(l:line, '\s\+$', '', ''))
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
endfor
|
||||||
|
else
|
||||||
|
let l:lnum = line('.')
|
||||||
|
let l:end = col('$') - 1
|
||||||
|
let l:line = getline(l:lnum)
|
||||||
|
if l:line =~# '\s$' && !s:InLiteral(l:lnum, l:end)
|
||||||
|
if a:alt
|
||||||
|
call setline(l:lnum, substitute(l:line, '\s\+$', '', ''))
|
||||||
|
else
|
||||||
|
call setline(l:lnum, substitute(l:line, '\S\@<=\s\s*$', '', ''))
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
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
|
||||||
21
autoload/python/utils.vim
Normal file
21
autoload/python/utils.vim
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'python-compiler') == -1
|
||||||
|
|
||||||
|
" Sometimes Python issues debugging messages
|
||||||
|
" which don't belong to a call stack context
|
||||||
|
" this function filters these messages
|
||||||
|
function! python#utils#fix_qflist() " {{{
|
||||||
|
let l:traceback = []
|
||||||
|
let l:qflist = getqflist()
|
||||||
|
|
||||||
|
for l:item in l:qflist
|
||||||
|
if !empty(l:item.type)
|
||||||
|
call add(l:traceback, l:item)
|
||||||
|
endif
|
||||||
|
endfor
|
||||||
|
|
||||||
|
if !empty(l:traceback)
|
||||||
|
call setqflist(l:traceback)
|
||||||
|
endif
|
||||||
|
endfunction " }}}
|
||||||
|
|
||||||
|
endif
|
||||||
@@ -1,9 +1,10 @@
|
|||||||
|
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'ruby') == -1
|
||||||
|
|
||||||
" Vim completion script
|
" Vim completion script
|
||||||
" Language: Ruby
|
" Language: Ruby
|
||||||
" Maintainer: Mark Guzman <segfault@hasno.info>
|
" Maintainer: Mark Guzman <segfault@hasno.info>
|
||||||
" URL: https://github.com/vim-ruby/vim-ruby
|
" URL: https://github.com/vim-ruby/vim-ruby
|
||||||
" Release Coordinator: Doug Kearns <dougkearns@gmail.com>
|
" Release Coordinator: Doug Kearns <dougkearns@gmail.com>
|
||||||
" Maintainer Version: 0.8.1
|
|
||||||
" ----------------------------------------------------------------------------
|
" ----------------------------------------------------------------------------
|
||||||
"
|
"
|
||||||
" Ruby IRB/Complete author: Keiju ISHITSUKA(keiju@ishitsuka.com)
|
" Ruby IRB/Complete author: Keiju ISHITSUKA(keiju@ishitsuka.com)
|
||||||
@@ -53,6 +54,23 @@ if !exists("g:rubycomplete_include_objectspace")
|
|||||||
endif
|
endif
|
||||||
" }}} configuration failsafe initialization
|
" }}} configuration failsafe initialization
|
||||||
|
|
||||||
|
" {{{ regex patterns
|
||||||
|
|
||||||
|
" Regex that defines the start-match for the 'end' keyword.
|
||||||
|
let s:end_start_regex =
|
||||||
|
\ '\C\%(^\s*\|[=,*/%+\-|;{]\|<<\|>>\|:\s\)\s*\zs' .
|
||||||
|
\ '\<\%(module\|class\|if\|for\|while\|until\|case\|unless\|begin' .
|
||||||
|
\ '\|\%(\K\k*[!?]\?\s\+\)\=def\):\@!\>' .
|
||||||
|
\ '\|\%(^\|[^.:@$]\)\@<=\<do:\@!\>'
|
||||||
|
|
||||||
|
" Regex that defines the middle-match for the 'end' keyword.
|
||||||
|
let s:end_middle_regex = '\<\%(ensure\|else\|\%(\%(^\|;\)\s*\)\@<=\<rescue:\@!\>\|when\|elsif\):\@!\>'
|
||||||
|
|
||||||
|
" Regex that defines the end-match for the 'end' keyword.
|
||||||
|
let s:end_end_regex = '\%(^\|[^.:@$]\)\@<=\<end:\@!\>'
|
||||||
|
|
||||||
|
" }}} regex patterns
|
||||||
|
|
||||||
" {{{ vim-side support functions
|
" {{{ vim-side support functions
|
||||||
let s:rubycomplete_debug = 0
|
let s:rubycomplete_debug = 0
|
||||||
|
|
||||||
@@ -103,7 +121,7 @@ function! s:GetBufferRubyEntity( name, type, ... )
|
|||||||
endif
|
endif
|
||||||
|
|
||||||
let curpos = getpos(".")
|
let curpos = getpos(".")
|
||||||
let [enum,ecol] = searchpairpos( crex, '', '\(end\|}\)', 'wr' )
|
let [enum,ecol] = searchpairpos( s:end_start_regex, s:end_middle_regex, s:end_end_regex, 'W' )
|
||||||
call cursor(lastpos[1], lastpos[2])
|
call cursor(lastpos[1], lastpos[2])
|
||||||
|
|
||||||
if lnum > enum
|
if lnum > enum
|
||||||
@@ -128,19 +146,28 @@ function! s:IsPosInClassDef(pos)
|
|||||||
return ret
|
return ret
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
|
function! s:IsInComment(pos)
|
||||||
|
let stack = synstack(a:pos[0], a:pos[1])
|
||||||
|
if !empty(stack)
|
||||||
|
return synIDattr(stack[0], 'name') =~ 'ruby\%(.*Comment\|Documentation\)'
|
||||||
|
else
|
||||||
|
return 0
|
||||||
|
endif
|
||||||
|
endfunction
|
||||||
|
|
||||||
function! s:GetRubyVarType(v)
|
function! s:GetRubyVarType(v)
|
||||||
let stopline = 1
|
let stopline = 1
|
||||||
let vtp = ''
|
let vtp = ''
|
||||||
let pos = getpos('.')
|
let curpos = getpos('.')
|
||||||
let sstr = '^\s*#\s*@var\s*'.escape(a:v, '*').'\>\s\+[^ \t]\+\s*$'
|
let sstr = '^\s*#\s*@var\s*'.escape(a:v, '*').'\>\s\+[^ \t]\+\s*$'
|
||||||
let [lnum,lcol] = searchpos(sstr,'nb',stopline)
|
let [lnum,lcol] = searchpos(sstr,'nb',stopline)
|
||||||
if lnum != 0 && lcol != 0
|
if lnum != 0 && lcol != 0
|
||||||
call setpos('.',pos)
|
call setpos('.',curpos)
|
||||||
let str = getline(lnum)
|
let str = getline(lnum)
|
||||||
let vtp = substitute(str,sstr,'\1','')
|
let vtp = substitute(str,sstr,'\1','')
|
||||||
return vtp
|
return vtp
|
||||||
endif
|
endif
|
||||||
call setpos('.',pos)
|
call setpos('.',curpos)
|
||||||
let ctors = '\(now\|new\|open\|get_instance'
|
let ctors = '\(now\|new\|open\|get_instance'
|
||||||
if exists('g:rubycomplete_rails') && g:rubycomplete_rails == 1 && s:rubycomplete_rails_loaded == 1
|
if exists('g:rubycomplete_rails') && g:rubycomplete_rails == 1 && s:rubycomplete_rails_loaded == 1
|
||||||
let ctors = ctors.'\|find\|create'
|
let ctors = ctors.'\|find\|create'
|
||||||
@@ -150,9 +177,13 @@ function! s:GetRubyVarType(v)
|
|||||||
|
|
||||||
let fstr = '=\s*\([^ \t]\+.' . ctors .'\>\|[\[{"''/]\|%[xwQqr][(\[{@]\|[A-Za-z0-9@:\-()\.]\+...\?\|lambda\|&\)'
|
let fstr = '=\s*\([^ \t]\+.' . ctors .'\>\|[\[{"''/]\|%[xwQqr][(\[{@]\|[A-Za-z0-9@:\-()\.]\+...\?\|lambda\|&\)'
|
||||||
let sstr = ''.escape(a:v, '*').'\>\s*[+\-*/]*'.fstr
|
let sstr = ''.escape(a:v, '*').'\>\s*[+\-*/]*'.fstr
|
||||||
let [lnum,lcol] = searchpos(sstr,'nb',stopline)
|
let pos = searchpos(sstr,'bW')
|
||||||
if lnum != 0 && lcol != 0
|
while pos != [0,0] && s:IsInComment(pos)
|
||||||
let str = matchstr(getline(lnum),fstr,lcol)
|
let pos = searchpos(sstr,'bW')
|
||||||
|
endwhile
|
||||||
|
if pos != [0,0]
|
||||||
|
let [lnum, col] = pos
|
||||||
|
let str = matchstr(getline(lnum),fstr,col)
|
||||||
let str = substitute(str,'^=\s*','','')
|
let str = substitute(str,'^=\s*','','')
|
||||||
|
|
||||||
call setpos('.',pos)
|
call setpos('.',pos)
|
||||||
@@ -174,7 +205,7 @@ function! s:GetRubyVarType(v)
|
|||||||
end
|
end
|
||||||
return ''
|
return ''
|
||||||
endif
|
endif
|
||||||
call setpos('.',pos)
|
call setpos('.',curpos)
|
||||||
return ''
|
return ''
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
@@ -196,7 +227,7 @@ function! rubycomplete#Complete(findstart, base)
|
|||||||
if c =~ '\w'
|
if c =~ '\w'
|
||||||
continue
|
continue
|
||||||
elseif ! c =~ '\.'
|
elseif ! c =~ '\.'
|
||||||
idx = -1
|
let idx = -1
|
||||||
break
|
break
|
||||||
else
|
else
|
||||||
break
|
break
|
||||||
@@ -253,15 +284,27 @@ class VimRubyCompletion
|
|||||||
|
|
||||||
# {{{ buffer analysis magic
|
# {{{ buffer analysis magic
|
||||||
def load_requires
|
def load_requires
|
||||||
|
|
||||||
|
custom_paths = VIM::evaluate("get(g:, 'rubycomplete_load_paths', [])")
|
||||||
|
|
||||||
|
if !custom_paths.empty?
|
||||||
|
$LOAD_PATH.concat(custom_paths).uniq!
|
||||||
|
end
|
||||||
|
|
||||||
buf = VIM::Buffer.current
|
buf = VIM::Buffer.current
|
||||||
enum = buf.line_number
|
enum = buf.line_number
|
||||||
nums = Range.new( 1, enum )
|
nums = Range.new( 1, enum )
|
||||||
nums.each do |x|
|
nums.each do |x|
|
||||||
|
|
||||||
ln = buf[x]
|
ln = buf[x]
|
||||||
begin
|
begin
|
||||||
eval( "require %s" % $1 ) if /.*require\s*(.*)$/.match( ln )
|
if /.*require_relative\s*(.*)$/.match( ln )
|
||||||
rescue Exception
|
eval( "require %s" % File.expand_path($1) )
|
||||||
#ignore?
|
elsif /.*require\s*(["'].*?["'])/.match( ln )
|
||||||
|
eval( "require %s" % $1 )
|
||||||
|
end
|
||||||
|
rescue Exception => e
|
||||||
|
dprint e.inspect
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@@ -344,8 +387,13 @@ class VimRubyCompletion
|
|||||||
if x != cur_line
|
if x != cur_line
|
||||||
next if x == 0
|
next if x == 0
|
||||||
ln = buf[x]
|
ln = buf[x]
|
||||||
if /^\s*(module|class|def|include)\s+/.match(ln)
|
is_const = false
|
||||||
clscnt += 1 if $1 == "class"
|
if /^\s*(module|class|def|include)\s+/.match(ln) || is_const = /^\s*?[A-Z]([A-z]|[1-9])*\s*?[|]{0,2}=\s*?.+\s*?/.match(ln)
|
||||||
|
clscnt += 1 if /class|module/.match($1)
|
||||||
|
# We must make sure to load each constant only once to avoid errors
|
||||||
|
if is_const
|
||||||
|
ln.gsub!(/\s*?[|]{0,2}=\s*?/, '||=')
|
||||||
|
end
|
||||||
#dprint "\$1$1
|
#dprint "\$1$1
|
||||||
classdef += "%s\n" % ln
|
classdef += "%s\n" % ln
|
||||||
classdef += "end\n" if /def\s+/.match(ln)
|
classdef += "end\n" if /def\s+/.match(ln)
|
||||||
@@ -423,7 +471,6 @@ class VimRubyCompletion
|
|||||||
return get_buffer_entity_list( "class" )
|
return get_buffer_entity_list( "class" )
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
def load_rails
|
def load_rails
|
||||||
allow_rails = VIM::evaluate("exists('g:rubycomplete_rails') && g:rubycomplete_rails")
|
allow_rails = VIM::evaluate("exists('g:rubycomplete_rails') && g:rubycomplete_rails")
|
||||||
return if allow_rails.to_i.zero?
|
return if allow_rails.to_i.zero?
|
||||||
@@ -529,7 +576,6 @@ class VimRubyCompletion
|
|||||||
ret += ActiveRecord::ConnectionAdapters::SchemaStatements.methods
|
ret += ActiveRecord::ConnectionAdapters::SchemaStatements.methods
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
return ret
|
return ret
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -587,11 +633,13 @@ class VimRubyCompletion
|
|||||||
# {{{ main completion code
|
# {{{ main completion code
|
||||||
def self.preload_rails
|
def self.preload_rails
|
||||||
a = VimRubyCompletion.new
|
a = VimRubyCompletion.new
|
||||||
require 'Thread'
|
if VIM::evaluate("has('nvim')") == 0
|
||||||
Thread.new(a) do |b|
|
require 'thread'
|
||||||
begin
|
Thread.new(a) do |b|
|
||||||
b.load_rails
|
begin
|
||||||
rescue
|
b.load_rails
|
||||||
|
rescue
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
a.load_rails
|
a.load_rails
|
||||||
@@ -612,7 +660,6 @@ class VimRubyCompletion
|
|||||||
|
|
||||||
want_gems = VIM::evaluate("get(g:, 'rubycomplete_load_gemfile')")
|
want_gems = VIM::evaluate("get(g:, 'rubycomplete_load_gemfile')")
|
||||||
load_gems unless want_gems.to_i.zero?
|
load_gems unless want_gems.to_i.zero?
|
||||||
|
|
||||||
|
|
||||||
input = VIM::Buffer.current.line
|
input = VIM::Buffer.current.line
|
||||||
cpos = VIM::Window.current.cursor[1] - 1
|
cpos = VIM::Window.current.cursor[1] - 1
|
||||||
@@ -655,25 +702,25 @@ class VimRubyCompletion
|
|||||||
methods.delete_if { |c| c.match( /'/ ) }
|
methods.delete_if { |c| c.match( /'/ ) }
|
||||||
end
|
end
|
||||||
|
|
||||||
when /^::([A-Z][^:\.\(]*)$/ # Absolute Constant or class methods
|
when /^::([A-Z][^:\.\(]*)?$/ # Absolute Constant or class methods
|
||||||
dprint "const or cls"
|
dprint "const or cls"
|
||||||
receiver = $1
|
receiver = $1
|
||||||
methods = Object.constants
|
methods = Object.constants.collect{ |c| c.to_s }.grep(/^#{receiver}/)
|
||||||
methods.grep(/^#{receiver}/).collect{|e| "::" + e}
|
|
||||||
|
|
||||||
when /^(((::)?[A-Z][^:.\(]*)+?)::?([^:.]*)$/ # Constant or class methods
|
when /^(((::)?[A-Z][^:.\(]*)+?)::?([^:.]*)$/ # Constant or class methods
|
||||||
receiver = $1
|
receiver = $1
|
||||||
message = Regexp.quote($4)
|
message = Regexp.quote($4)
|
||||||
dprint "const or cls 2 [recv: \'%s\', msg: \'%s\']" % [ receiver, message ]
|
dprint "const or cls 2 [recv: \'%s\', msg: \'%s\']" % [ receiver, message ]
|
||||||
load_buffer_class( receiver )
|
load_buffer_class( receiver )
|
||||||
|
load_buffer_module( receiver )
|
||||||
begin
|
begin
|
||||||
classes = eval("#{receiver}.constants")
|
constants = eval("#{receiver}.constants").collect{ |c| c.to_s }.grep(/^#{message}/)
|
||||||
#methods = eval("#{receiver}.methods")
|
methods = eval("#{receiver}.methods").collect{ |m| m.to_s }.grep(/^#{message}/)
|
||||||
rescue Exception
|
rescue Exception
|
||||||
dprint "exception: %s" % $!
|
dprint "exception: %s" % $!
|
||||||
|
constants = []
|
||||||
methods = []
|
methods = []
|
||||||
end
|
end
|
||||||
methods.grep(/^#{message}/).collect{|e| receiver + "::" + e}
|
|
||||||
|
|
||||||
when /^(:[^:.]+)\.([^.]*)$/ # Symbol
|
when /^(:[^:.]+)\.([^.]*)$/ # Symbol
|
||||||
dprint "symbol"
|
dprint "symbol"
|
||||||
@@ -704,7 +751,9 @@ class VimRubyCompletion
|
|||||||
cv = eval("self.class.constants")
|
cv = eval("self.class.constants")
|
||||||
vartype = get_var_type( receiver )
|
vartype = get_var_type( receiver )
|
||||||
dprint "vartype: %s" % vartype
|
dprint "vartype: %s" % vartype
|
||||||
if vartype != ''
|
|
||||||
|
invalid_vartype = ['', "gets"]
|
||||||
|
if !invalid_vartype.include?(vartype)
|
||||||
load_buffer_class( vartype )
|
load_buffer_class( vartype )
|
||||||
|
|
||||||
begin
|
begin
|
||||||
@@ -732,7 +781,7 @@ class VimRubyCompletion
|
|||||||
methods.concat m.instance_methods(false)
|
methods.concat m.instance_methods(false)
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
variables += add_rails_columns( "#{vartype}" ) if vartype && vartype.length > 0
|
variables += add_rails_columns( "#{vartype}" ) if vartype && !invalid_vartype.include?(vartype)
|
||||||
|
|
||||||
when /^\(?\s*[A-Za-z0-9:^@.%\/+*\(\)]+\.\.\.?[A-Za-z0-9:^@.%\/+*\(\)]+\s*\)?\.([^.]*)/
|
when /^\(?\s*[A-Za-z0-9:^@.%\/+*\(\)]+\.\.\.?[A-Za-z0-9:^@.%\/+*\(\)]+\s*\)?\.([^.]*)/
|
||||||
message = $1
|
message = $1
|
||||||
@@ -784,7 +833,6 @@ class VimRubyCompletion
|
|||||||
methods += Kernel.public_methods
|
methods += Kernel.public_methods
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
include_object = VIM::evaluate("exists('g:rubycomplete_include_object') && g:rubycomplete_include_object")
|
include_object = VIM::evaluate("exists('g:rubycomplete_include_object') && g:rubycomplete_include_object")
|
||||||
methods = clean_sel( methods, message )
|
methods = clean_sel( methods, message )
|
||||||
methods = (methods-Object.instance_methods) if include_object == "0"
|
methods = (methods-Object.instance_methods) if include_object == "0"
|
||||||
@@ -827,5 +875,6 @@ let s:rubycomplete_rails_loaded = 0
|
|||||||
call s:DefRuby()
|
call s:DefRuby()
|
||||||
"}}} ruby-side code
|
"}}} ruby-side code
|
||||||
|
|
||||||
|
|
||||||
" vim:tw=78:sw=4:ts=8:et:fdm=marker:ft=vim:norl:
|
" vim:tw=78:sw=4:ts=8:et:fdm=marker:ft=vim:norl:
|
||||||
|
|
||||||
|
endif
|
||||||
|
|||||||
@@ -1,225 +1,567 @@
|
|||||||
" Author: Kevin Ballard
|
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'rust') == -1
|
||||||
|
|
||||||
" Description: Helper functions for Rust commands/mappings
|
" Description: Helper functions for Rust commands/mappings
|
||||||
" Last Modified: May 27, 2014
|
" Last Modified: May 27, 2014
|
||||||
|
" For bugs, patches and license go to https://github.com/rust-lang/rust.vim
|
||||||
|
|
||||||
|
function! rust#Load()
|
||||||
|
" Utility call to get this script loaded, for debugging
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! rust#GetConfigVar(name, default)
|
||||||
|
" Local buffer variable with same name takes predeence over global
|
||||||
|
if has_key(b:, a:name)
|
||||||
|
return get(b:, a:name)
|
||||||
|
endif
|
||||||
|
if has_key(g:, a:name)
|
||||||
|
return get(g:, a:name)
|
||||||
|
endif
|
||||||
|
return a:default
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" Include expression {{{1
|
||||||
|
|
||||||
|
function! rust#IncludeExpr(fname) abort
|
||||||
|
" Remove leading 'crate::' to deal with 2018 edition style 'use'
|
||||||
|
" statements
|
||||||
|
let l:fname = substitute(a:fname, '^crate::', '', '')
|
||||||
|
|
||||||
|
" Remove trailing colons arising from lines like
|
||||||
|
"
|
||||||
|
" use foo::{Bar, Baz};
|
||||||
|
let l:fname = substitute(l:fname, ':\+$', '', '')
|
||||||
|
|
||||||
|
" Replace '::' with '/'
|
||||||
|
let l:fname = substitute(l:fname, '::', '/', 'g')
|
||||||
|
|
||||||
|
" When we have
|
||||||
|
"
|
||||||
|
" use foo::bar::baz;
|
||||||
|
"
|
||||||
|
" we can't tell whether baz is a module or a function; and we can't tell
|
||||||
|
" which modules correspond to files.
|
||||||
|
"
|
||||||
|
" So we work our way up, trying
|
||||||
|
"
|
||||||
|
" foo/bar/baz.rs
|
||||||
|
" foo/bar.rs
|
||||||
|
" foo.rs
|
||||||
|
while l:fname !=# '.'
|
||||||
|
let l:path = findfile(l:fname)
|
||||||
|
if !empty(l:path)
|
||||||
|
return l:fname
|
||||||
|
endif
|
||||||
|
let l:fname = fnamemodify(l:fname, ':h')
|
||||||
|
endwhile
|
||||||
|
return l:fname
|
||||||
|
endfunction
|
||||||
|
|
||||||
" Jump {{{1
|
" Jump {{{1
|
||||||
|
|
||||||
function! rust#Jump(mode, function) range
|
function! rust#Jump(mode, function) range
|
||||||
let cnt = v:count1
|
let cnt = v:count1
|
||||||
normal! m'
|
normal! m'
|
||||||
if a:mode ==# 'v'
|
if a:mode ==# 'v'
|
||||||
norm! gv
|
norm! gv
|
||||||
endif
|
endif
|
||||||
let foldenable = &foldenable
|
let foldenable = &foldenable
|
||||||
set nofoldenable
|
set nofoldenable
|
||||||
while cnt > 0
|
while cnt > 0
|
||||||
execute "call <SID>Jump_" . a:function . "()"
|
execute "call <SID>Jump_" . a:function . "()"
|
||||||
let cnt = cnt - 1
|
let cnt = cnt - 1
|
||||||
endwhile
|
endwhile
|
||||||
let &foldenable = foldenable
|
let &foldenable = foldenable
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! s:Jump_Back()
|
function! s:Jump_Back()
|
||||||
call search('{', 'b')
|
call search('{', 'b')
|
||||||
keepjumps normal! w99[{
|
keepjumps normal! w99[{
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! s:Jump_Forward()
|
function! s:Jump_Forward()
|
||||||
normal! j0
|
normal! j0
|
||||||
call search('{', 'b')
|
call search('{', 'b')
|
||||||
keepjumps normal! w99[{%
|
keepjumps normal! w99[{%
|
||||||
call search('{')
|
call search('{')
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
" Run {{{1
|
" Run {{{1
|
||||||
|
|
||||||
function! rust#Run(bang, args)
|
function! rust#Run(bang, args)
|
||||||
if a:bang
|
let args = s:ShellTokenize(a:args)
|
||||||
let idx = index(a:args, '--')
|
if a:bang
|
||||||
if idx != -1
|
let idx = index(l:args, '--')
|
||||||
let rustc_args = idx == 0 ? [] : a:args[:idx-1]
|
if idx != -1
|
||||||
let args = a:args[idx+1:]
|
let rustc_args = idx == 0 ? [] : l:args[:idx-1]
|
||||||
else
|
let args = l:args[idx+1:]
|
||||||
let rustc_args = a:args
|
else
|
||||||
let args = []
|
let rustc_args = l:args
|
||||||
endif
|
let args = []
|
||||||
else
|
endif
|
||||||
let rustc_args = []
|
else
|
||||||
let args = a:args
|
let rustc_args = []
|
||||||
endif
|
endif
|
||||||
|
|
||||||
let b:rust_last_rustc_args = rustc_args
|
let b:rust_last_rustc_args = l:rustc_args
|
||||||
let b:rust_last_args = args
|
let b:rust_last_args = l:args
|
||||||
|
|
||||||
call s:WithPath(function("s:Run"), rustc_args, args)
|
call s:WithPath(function("s:Run"), rustc_args, args)
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! s:Run(path, rustc_args, args)
|
function! s:Run(dict, rustc_args, args)
|
||||||
try
|
let exepath = a:dict.tmpdir.'/'.fnamemodify(a:dict.path, ':t:r')
|
||||||
let exepath = tempname()
|
if has('win32')
|
||||||
if has('win32')
|
let exepath .= '.exe'
|
||||||
let exepath .= '.exe'
|
endif
|
||||||
endif
|
|
||||||
|
|
||||||
let rustc_args = [a:path, '-o', exepath] + a:rustc_args
|
let relpath = get(a:dict, 'tmpdir_relpath', a:dict.path)
|
||||||
|
let rustc_args = [relpath, '-o', exepath] + a:rustc_args
|
||||||
|
|
||||||
let rustc = exists("g:rustc_path") ? g:rustc_path : "rustc"
|
let rustc = exists("g:rustc_path") ? g:rustc_path : "rustc"
|
||||||
|
|
||||||
let output = system(shellescape(rustc) . " " . join(map(rustc_args, 'shellescape(v:val)')))
|
let pwd = a:dict.istemp ? a:dict.tmpdir : ''
|
||||||
if output != ''
|
let output = s:system(pwd, shellescape(rustc) . " " . join(map(rustc_args, 'shellescape(v:val)')))
|
||||||
echohl WarningMsg
|
if output !=# ''
|
||||||
echo output
|
echohl WarningMsg
|
||||||
echohl None
|
echo output
|
||||||
endif
|
echohl None
|
||||||
if !v:shell_error
|
endif
|
||||||
exe '!' . shellescape(exepath) . " " . join(map(a:args, 'shellescape(v:val)'))
|
if !v:shell_error
|
||||||
endif
|
exe '!' . shellescape(exepath) . " " . join(map(a:args, 'shellescape(v:val)'))
|
||||||
finally
|
endif
|
||||||
if exists("exepath")
|
|
||||||
silent! call delete(exepath)
|
|
||||||
endif
|
|
||||||
endtry
|
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
" Expand {{{1
|
" Expand {{{1
|
||||||
|
|
||||||
function! rust#Expand(bang, args)
|
function! rust#Expand(bang, args)
|
||||||
if a:bang && !empty(a:args)
|
let args = s:ShellTokenize(a:args)
|
||||||
let pretty = a:args[0]
|
if a:bang && !empty(l:args)
|
||||||
let args = a:args[1:]
|
let pretty = remove(l:args, 0)
|
||||||
else
|
else
|
||||||
let pretty = "expanded"
|
let pretty = "expanded"
|
||||||
let args = a:args
|
endif
|
||||||
endif
|
call s:WithPath(function("s:Expand"), pretty, args)
|
||||||
call s:WithPath(function("s:Expand"), pretty, args)
|
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! s:Expand(path, pretty, args)
|
function! s:Expand(dict, pretty, args)
|
||||||
try
|
try
|
||||||
let rustc = exists("g:rustc_path") ? g:rustc_path : "rustc"
|
let rustc = exists("g:rustc_path") ? g:rustc_path : "rustc"
|
||||||
|
|
||||||
let args = [a:path, '--pretty', a:pretty] + a:args
|
if a:pretty =~? '^\%(everybody_loops$\|flowgraph=\)'
|
||||||
let output = system(shellescape(rustc) . " " . join(map(args, "shellescape(v:val)")))
|
let flag = '--xpretty'
|
||||||
if v:shell_error
|
else
|
||||||
echohl WarningMsg
|
let flag = '--pretty'
|
||||||
echo output
|
endif
|
||||||
echohl None
|
let relpath = get(a:dict, 'tmpdir_relpath', a:dict.path)
|
||||||
else
|
let args = [relpath, '-Z', 'unstable-options', l:flag, a:pretty] + a:args
|
||||||
new
|
let pwd = a:dict.istemp ? a:dict.tmpdir : ''
|
||||||
silent put =output
|
let output = s:system(pwd, shellescape(rustc) . " " . join(map(args, 'shellescape(v:val)')))
|
||||||
1
|
if v:shell_error
|
||||||
d
|
echohl WarningMsg
|
||||||
setl filetype=rust
|
echo output
|
||||||
setl buftype=nofile
|
echohl None
|
||||||
setl bufhidden=hide
|
else
|
||||||
setl noswapfile
|
new
|
||||||
endif
|
silent put =output
|
||||||
endtry
|
1
|
||||||
|
d
|
||||||
|
setl filetype=rust
|
||||||
|
setl buftype=nofile
|
||||||
|
setl bufhidden=hide
|
||||||
|
setl noswapfile
|
||||||
|
" give the buffer a nice name
|
||||||
|
let suffix = 1
|
||||||
|
let basename = fnamemodify(a:dict.path, ':t:r')
|
||||||
|
while 1
|
||||||
|
let bufname = basename
|
||||||
|
if suffix > 1 | let bufname .= ' ('.suffix.')' | endif
|
||||||
|
let bufname .= '.pretty.rs'
|
||||||
|
if bufexists(bufname)
|
||||||
|
let suffix += 1
|
||||||
|
continue
|
||||||
|
endif
|
||||||
|
exe 'silent noautocmd keepalt file' fnameescape(bufname)
|
||||||
|
break
|
||||||
|
endwhile
|
||||||
|
endif
|
||||||
|
endtry
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! rust#CompleteExpand(lead, line, pos)
|
function! rust#CompleteExpand(lead, line, pos)
|
||||||
if a:line[: a:pos-1] =~ '^RustExpand!\s*\S*$'
|
if a:line[: a:pos-1] =~# '^RustExpand!\s*\S*$'
|
||||||
" first argument and it has a !
|
" first argument and it has a !
|
||||||
let list = ["normal", "expanded", "typed", "expanded,identified", "flowgraph="]
|
let list = ["normal", "expanded", "typed", "expanded,identified", "flowgraph=", "everybody_loops"]
|
||||||
if !empty(a:lead)
|
if !empty(a:lead)
|
||||||
call filter(list, "v:val[:len(a:lead)-1] == a:lead")
|
call filter(list, "v:val[:len(a:lead)-1] == a:lead")
|
||||||
endif
|
endif
|
||||||
return list
|
return list
|
||||||
endif
|
endif
|
||||||
|
|
||||||
return glob(escape(a:lead, "*?[") . '*', 0, 1)
|
return glob(escape(a:lead, "*?[") . '*', 0, 1)
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
" Emit {{{1
|
" Emit {{{1
|
||||||
|
|
||||||
function! rust#Emit(type, args)
|
function! rust#Emit(type, args)
|
||||||
call s:WithPath(function("s:Emit"), a:type, a:args)
|
let args = s:ShellTokenize(a:args)
|
||||||
|
call s:WithPath(function("s:Emit"), a:type, args)
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! s:Emit(path, type, args)
|
function! s:Emit(dict, type, args)
|
||||||
try
|
try
|
||||||
let rustc = exists("g:rustc_path") ? g:rustc_path : "rustc"
|
let output_path = a:dict.tmpdir.'/output'
|
||||||
|
|
||||||
let args = [a:path, '--emit', a:type, '-o', '-'] + a:args
|
let rustc = exists("g:rustc_path") ? g:rustc_path : "rustc"
|
||||||
let output = system(shellescape(rustc) . " " . join(map(args, "shellescape(v:val)")))
|
|
||||||
if v:shell_error
|
let relpath = get(a:dict, 'tmpdir_relpath', a:dict.path)
|
||||||
echohl WarningMsg
|
let args = [relpath, '--emit', a:type, '-o', output_path] + a:args
|
||||||
echo output
|
let pwd = a:dict.istemp ? a:dict.tmpdir : ''
|
||||||
echohl None
|
let output = s:system(pwd, shellescape(rustc) . " " . join(map(args, 'shellescape(v:val)')))
|
||||||
else
|
if output !=# ''
|
||||||
new
|
echohl WarningMsg
|
||||||
silent put =output
|
echo output
|
||||||
1
|
echohl None
|
||||||
d
|
endif
|
||||||
if a:type == "ir"
|
if !v:shell_error
|
||||||
setl filetype=llvm
|
new
|
||||||
elseif a:type == "asm"
|
exe 'silent keepalt read' fnameescape(output_path)
|
||||||
setl filetype=asm
|
1
|
||||||
endif
|
d
|
||||||
setl buftype=nofile
|
if a:type ==# "llvm-ir"
|
||||||
setl bufhidden=hide
|
setl filetype=llvm
|
||||||
setl noswapfile
|
let extension = 'll'
|
||||||
endif
|
elseif a:type ==# "asm"
|
||||||
endtry
|
setl filetype=asm
|
||||||
|
let extension = 's'
|
||||||
|
endif
|
||||||
|
setl buftype=nofile
|
||||||
|
setl bufhidden=hide
|
||||||
|
setl noswapfile
|
||||||
|
if exists('l:extension')
|
||||||
|
" give the buffer a nice name
|
||||||
|
let suffix = 1
|
||||||
|
let basename = fnamemodify(a:dict.path, ':t:r')
|
||||||
|
while 1
|
||||||
|
let bufname = basename
|
||||||
|
if suffix > 1 | let bufname .= ' ('.suffix.')' | endif
|
||||||
|
let bufname .= '.'.extension
|
||||||
|
if bufexists(bufname)
|
||||||
|
let suffix += 1
|
||||||
|
continue
|
||||||
|
endif
|
||||||
|
exe 'silent noautocmd keepalt file' fnameescape(bufname)
|
||||||
|
break
|
||||||
|
endwhile
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
endtry
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
" Utility functions {{{1
|
" Utility functions {{{1
|
||||||
|
|
||||||
|
" Invokes func(dict, ...)
|
||||||
|
" Where {dict} is a dictionary with the following keys:
|
||||||
|
" 'path' - The path to the file
|
||||||
|
" 'tmpdir' - The path to a temporary directory that will be deleted when the
|
||||||
|
" function returns.
|
||||||
|
" 'istemp' - 1 if the path is a file inside of {dict.tmpdir} or 0 otherwise.
|
||||||
|
" If {istemp} is 1 then an additional key is provided:
|
||||||
|
" 'tmpdir_relpath' - The {path} relative to the {tmpdir}.
|
||||||
|
"
|
||||||
|
" {dict.path} may be a path to a file inside of {dict.tmpdir} or it may be the
|
||||||
|
" existing path of the current buffer. If the path is inside of {dict.tmpdir}
|
||||||
|
" then it is guaranteed to have a '.rs' extension.
|
||||||
function! s:WithPath(func, ...)
|
function! s:WithPath(func, ...)
|
||||||
try
|
let buf = bufnr('')
|
||||||
let save_write = &write
|
let saved = {}
|
||||||
set write
|
let dict = {}
|
||||||
let path = expand('%')
|
try
|
||||||
let pathisempty = empty(path)
|
let saved.write = &write
|
||||||
if pathisempty || !save_write
|
set write
|
||||||
" use a temporary file named 'unnamed.rs' inside a temporary
|
let dict.path = expand('%')
|
||||||
" directory. This produces better error messages
|
let pathisempty = empty(dict.path)
|
||||||
let tmpdir = tempname()
|
|
||||||
call mkdir(tmpdir)
|
|
||||||
|
|
||||||
let save_cwd = getcwd()
|
" Always create a tmpdir in case the wrapped command wants it
|
||||||
silent exe 'lcd' fnameescape(tmpdir)
|
let dict.tmpdir = tempname()
|
||||||
|
call mkdir(dict.tmpdir)
|
||||||
|
|
||||||
let path = 'unnamed.rs'
|
if pathisempty || !saved.write
|
||||||
|
let dict.istemp = 1
|
||||||
|
" if we're doing this because of nowrite, preserve the filename
|
||||||
|
if !pathisempty
|
||||||
|
let filename = expand('%:t:r').".rs"
|
||||||
|
else
|
||||||
|
let filename = 'unnamed.rs'
|
||||||
|
endif
|
||||||
|
let dict.tmpdir_relpath = filename
|
||||||
|
let dict.path = dict.tmpdir.'/'.filename
|
||||||
|
|
||||||
let save_mod = &mod
|
let saved.mod = &modified
|
||||||
set nomod
|
set nomodified
|
||||||
|
|
||||||
silent exe 'keepalt write! ' . fnameescape(path)
|
silent exe 'keepalt write! ' . fnameescape(dict.path)
|
||||||
if pathisempty
|
if pathisempty
|
||||||
silent keepalt 0file
|
silent keepalt 0file
|
||||||
endif
|
endif
|
||||||
else
|
else
|
||||||
update
|
let dict.istemp = 0
|
||||||
endif
|
update
|
||||||
|
endif
|
||||||
|
|
||||||
call call(a:func, [path] + a:000)
|
call call(a:func, [dict] + a:000)
|
||||||
finally
|
finally
|
||||||
if exists("save_mod") | let &mod = save_mod | endif
|
if bufexists(buf)
|
||||||
if exists("save_write") | let &write = save_write | endif
|
for [opt, value] in items(saved)
|
||||||
if exists("save_cwd") | silent exe 'lcd' fnameescape(save_cwd) | endif
|
silent call setbufvar(buf, '&'.opt, value)
|
||||||
if exists("tmpdir") | silent call s:RmDir(tmpdir) | endif
|
unlet value " avoid variable type mismatches
|
||||||
endtry
|
endfor
|
||||||
|
endif
|
||||||
|
if has_key(dict, 'tmpdir') | silent call s:RmDir(dict.tmpdir) | endif
|
||||||
|
endtry
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! rust#AppendCmdLine(text)
|
function! rust#AppendCmdLine(text)
|
||||||
call setcmdpos(getcmdpos())
|
call setcmdpos(getcmdpos())
|
||||||
let cmd = getcmdline() . a:text
|
let cmd = getcmdline() . a:text
|
||||||
return cmd
|
return cmd
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" Tokenize the string according to sh parsing rules
|
||||||
|
function! s:ShellTokenize(text)
|
||||||
|
" states:
|
||||||
|
" 0: start of word
|
||||||
|
" 1: unquoted
|
||||||
|
" 2: unquoted backslash
|
||||||
|
" 3: double-quote
|
||||||
|
" 4: double-quoted backslash
|
||||||
|
" 5: single-quote
|
||||||
|
let l:state = 0
|
||||||
|
let l:current = ''
|
||||||
|
let l:args = []
|
||||||
|
for c in split(a:text, '\zs')
|
||||||
|
if l:state == 0 || l:state == 1 " unquoted
|
||||||
|
if l:c ==# ' '
|
||||||
|
if l:state == 0 | continue | endif
|
||||||
|
call add(l:args, l:current)
|
||||||
|
let l:current = ''
|
||||||
|
let l:state = 0
|
||||||
|
elseif l:c ==# '\'
|
||||||
|
let l:state = 2
|
||||||
|
elseif l:c ==# '"'
|
||||||
|
let l:state = 3
|
||||||
|
elseif l:c ==# "'"
|
||||||
|
let l:state = 5
|
||||||
|
else
|
||||||
|
let l:current .= l:c
|
||||||
|
let l:state = 1
|
||||||
|
endif
|
||||||
|
elseif l:state == 2 " unquoted backslash
|
||||||
|
if l:c !=# "\n" " can it even be \n?
|
||||||
|
let l:current .= l:c
|
||||||
|
endif
|
||||||
|
let l:state = 1
|
||||||
|
elseif l:state == 3 " double-quote
|
||||||
|
if l:c ==# '\'
|
||||||
|
let l:state = 4
|
||||||
|
elseif l:c ==# '"'
|
||||||
|
let l:state = 1
|
||||||
|
else
|
||||||
|
let l:current .= l:c
|
||||||
|
endif
|
||||||
|
elseif l:state == 4 " double-quoted backslash
|
||||||
|
if stridx('$`"\', l:c) >= 0
|
||||||
|
let l:current .= l:c
|
||||||
|
elseif l:c ==# "\n" " is this even possible?
|
||||||
|
" skip it
|
||||||
|
else
|
||||||
|
let l:current .= '\'.l:c
|
||||||
|
endif
|
||||||
|
let l:state = 3
|
||||||
|
elseif l:state == 5 " single-quoted
|
||||||
|
if l:c ==# "'"
|
||||||
|
let l:state = 1
|
||||||
|
else
|
||||||
|
let l:current .= l:c
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
endfor
|
||||||
|
if l:state != 0
|
||||||
|
call add(l:args, l:current)
|
||||||
|
endif
|
||||||
|
return l:args
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! s:RmDir(path)
|
function! s:RmDir(path)
|
||||||
" sanity check; make sure it's not empty, /, or $HOME
|
" sanity check; make sure it's not empty, /, or $HOME
|
||||||
if empty(a:path)
|
if empty(a:path)
|
||||||
echoerr 'Attempted to delete empty path'
|
echoerr 'Attempted to delete empty path'
|
||||||
return 0
|
return 0
|
||||||
elseif a:path == '/' || a:path == $HOME
|
elseif a:path ==# '/' || a:path ==# $HOME
|
||||||
echoerr 'Attempted to delete protected path: ' . a:path
|
let l:path = expand(a:path)
|
||||||
return 0
|
if l:path ==# '/' || l:path ==# $HOME
|
||||||
endif
|
echoerr 'Attempted to delete protected path: ' . a:path
|
||||||
silent exe "!rm -rf " . shellescape(a:path)
|
return 0
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
if !isdirectory(a:path)
|
||||||
|
return 0
|
||||||
|
endif
|
||||||
|
|
||||||
|
" 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.
|
||||||
|
" If {pwd} is the empty string then it doesn't change the cwd.
|
||||||
|
function! s:system(pwd, cmd)
|
||||||
|
let cmd = a:cmd
|
||||||
|
if !empty(a:pwd)
|
||||||
|
let cmd = 'cd ' . shellescape(a:pwd) . ' && ' . cmd
|
||||||
|
endif
|
||||||
|
return system(cmd)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" Playpen Support {{{1
|
||||||
|
" Parts of gist.vim by Yasuhiro Matsumoto <mattn.jp@gmail.com> reused
|
||||||
|
" gist.vim available under the BSD license, available at
|
||||||
|
" http://github.com/mattn/gist-vim
|
||||||
|
function! s:has_webapi()
|
||||||
|
if !exists("*webapi#http#post")
|
||||||
|
try
|
||||||
|
call webapi#http#post()
|
||||||
|
catch
|
||||||
|
endtry
|
||||||
|
endif
|
||||||
|
return exists("*webapi#http#post")
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! rust#Play(count, line1, line2, ...) abort
|
||||||
|
redraw
|
||||||
|
|
||||||
|
let l:rust_playpen_url = get(g:, 'rust_playpen_url', 'https://play.rust-lang.org/')
|
||||||
|
let l:rust_shortener_url = get(g:, 'rust_shortener_url', 'https://is.gd/')
|
||||||
|
|
||||||
|
if !s:has_webapi()
|
||||||
|
echohl ErrorMsg | echomsg ':RustPlay depends on webapi.vim (https://github.com/mattn/webapi-vim)' | echohl None
|
||||||
|
return
|
||||||
|
endif
|
||||||
|
|
||||||
|
let bufname = bufname('%')
|
||||||
|
if a:count < 1
|
||||||
|
let content = join(getline(a:line1, a:line2), "\n")
|
||||||
|
else
|
||||||
|
let save_regcont = @"
|
||||||
|
let save_regtype = getregtype('"')
|
||||||
|
silent! normal! gvy
|
||||||
|
let content = @"
|
||||||
|
call setreg('"', save_regcont, save_regtype)
|
||||||
|
endif
|
||||||
|
|
||||||
|
let url = l:rust_playpen_url."?code=".webapi#http#encodeURI(content)
|
||||||
|
|
||||||
|
if strlen(url) > 5000
|
||||||
|
echohl ErrorMsg | echomsg 'Buffer too large, max 5000 encoded characters ('.strlen(url).')' | echohl None
|
||||||
|
return
|
||||||
|
endif
|
||||||
|
|
||||||
|
let payload = "format=simple&url=".webapi#http#encodeURI(url)
|
||||||
|
let res = webapi#http#post(l:rust_shortener_url.'create.php', payload, {})
|
||||||
|
if res.status[0] ==# '2'
|
||||||
|
let url = res.content
|
||||||
|
endif
|
||||||
|
|
||||||
|
let footer = ''
|
||||||
|
if exists('g:rust_clip_command')
|
||||||
|
call system(g:rust_clip_command, url)
|
||||||
|
if !v:shell_error
|
||||||
|
let footer = ' (copied to clipboard)'
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
redraw | echomsg 'Done: '.url.footer
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" Run a test under the cursor or all tests {{{1
|
||||||
|
|
||||||
|
" Finds a test function name under the cursor. Returns empty string when a
|
||||||
|
" test function is not found.
|
||||||
|
function! s:SearchTestFunctionNameUnderCursor() abort
|
||||||
|
let cursor_line = line('.')
|
||||||
|
|
||||||
|
" Find #[test] attribute
|
||||||
|
if search('\m\C#\[test\]', 'bcW') is 0
|
||||||
|
return ''
|
||||||
|
endif
|
||||||
|
|
||||||
|
" Move to an opening brace of the test function
|
||||||
|
let test_func_line = search('\m\C^\s*fn\s\+\h\w*\s*(.\+{$', 'eW')
|
||||||
|
if test_func_line is 0
|
||||||
|
return ''
|
||||||
|
endif
|
||||||
|
|
||||||
|
" Search the end of test function (closing brace) to ensure that the
|
||||||
|
" cursor position is within function definition
|
||||||
|
normal! %
|
||||||
|
if line('.') < cursor_line
|
||||||
|
return ''
|
||||||
|
endif
|
||||||
|
|
||||||
|
return matchstr(getline(test_func_line), '\m\C^\s*fn\s\+\zs\h\w*')
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
|
" <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)
|
||||||
|
endif
|
||||||
|
|
||||||
|
if a:all
|
||||||
|
if a:options ==# ''
|
||||||
|
execute cmd . 'cargo test --manifest-path' manifest
|
||||||
|
else
|
||||||
|
execute cmd . 'cargo test --manifest-path' manifest a:options
|
||||||
|
endif
|
||||||
|
return
|
||||||
|
endif
|
||||||
|
|
||||||
|
let saved = getpos('.')
|
||||||
|
try
|
||||||
|
let func_name = s:SearchTestFunctionNameUnderCursor()
|
||||||
|
if func_name ==# ''
|
||||||
|
echohl ErrorMsg
|
||||||
|
echomsg 'No test function was found under the cursor. Please add ! to command if you want to run all tests'
|
||||||
|
echohl None
|
||||||
|
return
|
||||||
|
endif
|
||||||
|
if a:options ==# ''
|
||||||
|
execute cmd . 'cargo test --manifest-path' manifest func_name
|
||||||
|
else
|
||||||
|
execute cmd . 'cargo test --manifest-path' manifest func_name a:options
|
||||||
|
endif
|
||||||
|
return
|
||||||
|
finally
|
||||||
|
call setpos('.', saved)
|
||||||
|
endtry
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
" }}}1
|
" }}}1
|
||||||
|
|
||||||
" vim: set noet sw=4 ts=4:
|
" vim: set et sw=4 sts=4 ts=8:
|
||||||
|
|
||||||
|
endif
|
||||||
|
|||||||
107
autoload/rust/debugging.vim
Normal file
107
autoload/rust/debugging.vim
Normal file
@@ -0,0 +1,107 @@
|
|||||||
|
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',
|
||||||
|
\ 'loaded_syntastic_rust_rustc_checker',
|
||||||
|
\ 'rust_bang_comment_leader',
|
||||||
|
\ 'rust_cargo_avoid_whole_workspace',
|
||||||
|
\ 'rust_clip_command',
|
||||||
|
\ 'rust_conceal',
|
||||||
|
\ 'rust_conceal_mod_path',
|
||||||
|
\ 'rust_conceal_pub',
|
||||||
|
\ 'rust_fold',
|
||||||
|
\ 'rust_last_args',
|
||||||
|
\ 'rust_last_rustc_args',
|
||||||
|
\ 'rust_original_delimitMate_excluded_regions',
|
||||||
|
\ 'rust_playpen_url',
|
||||||
|
\ 'rust_prev_delimitMate_quotes',
|
||||||
|
\ 'rust_recent_nearest_cargo_tol',
|
||||||
|
\ 'rust_recent_root_cargo_toml',
|
||||||
|
\ 'rust_recommended_style',
|
||||||
|
\ 'rust_set_conceallevel',
|
||||||
|
\ 'rust_set_conceallevel=1',
|
||||||
|
\ 'rust_set_foldmethod',
|
||||||
|
\ 'rust_set_foldmethod=1',
|
||||||
|
\ 'rust_shortener_url',
|
||||||
|
\ 'rustc_makeprg_no_percent',
|
||||||
|
\ 'rustc_path',
|
||||||
|
\ 'rustfmt_autosave',
|
||||||
|
\ 'rustfmt_autosave_if_config_present',
|
||||||
|
\ 'rustfmt_command',
|
||||||
|
\ 'rustfmt_emit_files',
|
||||||
|
\ 'rustfmt_fail_silently',
|
||||||
|
\ 'rustfmt_options',
|
||||||
|
\ 'syntastic_extra_filetypes',
|
||||||
|
\ 'syntastic_rust_cargo_fname',
|
||||||
|
\]
|
||||||
|
|
||||||
|
function! s:Echo(message) abort
|
||||||
|
execute 'echo a:message'
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:EchoGlobalVariables() abort
|
||||||
|
for l:key in s:global_variable_list
|
||||||
|
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]))
|
||||||
|
endif
|
||||||
|
endfor
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! rust#debugging#Info() abort
|
||||||
|
call cargo#Load()
|
||||||
|
call rust#Load()
|
||||||
|
call rustfmt#Load()
|
||||||
|
call s:Echo('rust.vim Global Variables:')
|
||||||
|
call s:Echo('')
|
||||||
|
call s:EchoGlobalVariables()
|
||||||
|
|
||||||
|
silent let l:output = system(g:rustfmt_command . ' --version')
|
||||||
|
echo l:output
|
||||||
|
|
||||||
|
let l:rustc = exists("g:rustc_path") ? g:rustc_path : "rustc"
|
||||||
|
silent let l:output = system(l:rustc . ' --version')
|
||||||
|
echo l:output
|
||||||
|
|
||||||
|
silent let l:output = system('cargo --version')
|
||||||
|
echo l:output
|
||||||
|
|
||||||
|
version
|
||||||
|
|
||||||
|
if exists(":SyntasticInfo")
|
||||||
|
echo "----"
|
||||||
|
echo "Info from Syntastic:"
|
||||||
|
execute "SyntasticInfo"
|
||||||
|
endif
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! rust#debugging#InfoToClipboard() abort
|
||||||
|
redir @"
|
||||||
|
silent call rust#debugging#Info()
|
||||||
|
redir END
|
||||||
|
|
||||||
|
call s:Echo('RustInfo copied to your clipboard')
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! rust#debugging#InfoToFile(filename) abort
|
||||||
|
let l:expanded_filename = expand(a:filename)
|
||||||
|
|
||||||
|
redir => l:output
|
||||||
|
silent call rust#debugging#Info()
|
||||||
|
redir END
|
||||||
|
|
||||||
|
call writefile(split(l:output, "\n"), l:expanded_filename)
|
||||||
|
call s:Echo('RustInfo written to ' . l:expanded_filename)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" vim: set et sw=4 sts=4 ts=8:
|
||||||
|
|
||||||
|
endif
|
||||||
48
autoload/rust/delimitmate.vim
Normal file
48
autoload/rust/delimitmate.vim
Normal file
@@ -0,0 +1,48 @@
|
|||||||
|
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'rust') == -1
|
||||||
|
|
||||||
|
let s:delimitMate_extra_excluded_regions = ',rustLifetimeCandidate,rustGenericLifetimeCandidate'
|
||||||
|
|
||||||
|
" For this buffer, when delimitMate issues the `User delimitMate_map`
|
||||||
|
" event in the autocommand system, add the above-defined extra excluded
|
||||||
|
" regions to delimitMate's state, if they have not already been added.
|
||||||
|
function! rust#delimitmate#onMap() abort
|
||||||
|
if &filetype !=# 'rust'
|
||||||
|
return
|
||||||
|
endif
|
||||||
|
|
||||||
|
if get(b:, "delimitMate_quotes")
|
||||||
|
let b:rust_prev_delimitMate_quotes = b:delimitMate_quotes
|
||||||
|
endif
|
||||||
|
let b:delimitMate_quotes = "\" `"
|
||||||
|
|
||||||
|
if match(delimitMate#Get("excluded_regions"),
|
||||||
|
\ s:delimitMate_extra_excluded_regions) == -1
|
||||||
|
call delimitMate#Set("excluded_regions",
|
||||||
|
\delimitMate#Get("excluded_regions").s:delimitMate_extra_excluded_regions)
|
||||||
|
endif
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" For this buffer, when delimitMate issues the `User delimitMate_unmap`
|
||||||
|
" event in the autocommand system, delete the above-defined extra excluded
|
||||||
|
" regions from delimitMate's state (the deletion being idempotent and
|
||||||
|
" having no effect if the extra excluded regions are not present in the
|
||||||
|
" targeted part of delimitMate's state).
|
||||||
|
function! rust#delimitmate#onUnmap() abort
|
||||||
|
if &filetype !=# 'rust'
|
||||||
|
return
|
||||||
|
endif
|
||||||
|
|
||||||
|
if get(b:, "rust_prev_delimitMate_quotes")
|
||||||
|
let b:delimitMate_quotes = b:rust_prev_delimitMate_quotes
|
||||||
|
endif
|
||||||
|
|
||||||
|
call delimitMate#Set("excluded_regions", substitute(
|
||||||
|
\ delimitMate#Get("excluded_regions"),
|
||||||
|
\ '\C\V' . s:delimitMate_extra_excluded_regions,
|
||||||
|
\ '', 'g'))
|
||||||
|
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
|
||||||
268
autoload/rustfmt.vim
Normal file
268
autoload/rustfmt.vim
Normal file
@@ -0,0 +1,268 @@
|
|||||||
|
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'rust') == -1
|
||||||
|
|
||||||
|
" Author: Stephen Sugden <stephen@stephensugden.com>
|
||||||
|
"
|
||||||
|
" Adapted from https://github.com/fatih/vim-go
|
||||||
|
" For bugs, patches and license go to https://github.com/rust-lang/rust.vim
|
||||||
|
|
||||||
|
if !exists("g:rustfmt_autosave")
|
||||||
|
let g:rustfmt_autosave = 0
|
||||||
|
endif
|
||||||
|
|
||||||
|
if !exists("g:rustfmt_command")
|
||||||
|
let g:rustfmt_command = "rustfmt"
|
||||||
|
endif
|
||||||
|
|
||||||
|
if !exists("g:rustfmt_options")
|
||||||
|
let g:rustfmt_options = ""
|
||||||
|
endif
|
||||||
|
|
||||||
|
if !exists("g:rustfmt_fail_silently")
|
||||||
|
let g:rustfmt_fail_silently = 0
|
||||||
|
endif
|
||||||
|
|
||||||
|
function! rustfmt#DetectVersion()
|
||||||
|
" Save rustfmt '--help' for feature inspection
|
||||||
|
silent let s:rustfmt_help = system(g:rustfmt_command . " --help")
|
||||||
|
let s:rustfmt_unstable_features = s:rustfmt_help =~# "--unstable-features"
|
||||||
|
|
||||||
|
" Build a comparable rustfmt version varible out of its `--version` output:
|
||||||
|
silent let l:rustfmt_version_full = system(g:rustfmt_command . " --version")
|
||||||
|
let l:rustfmt_version_list = matchlist(l:rustfmt_version_full,
|
||||||
|
\ '\vrustfmt ([0-9]+[.][0-9]+[.][0-9]+)')
|
||||||
|
if len(l:rustfmt_version_list) < 3
|
||||||
|
let s:rustfmt_version = "0"
|
||||||
|
else
|
||||||
|
let s:rustfmt_version = l:rustfmt_version_list[1]
|
||||||
|
endif
|
||||||
|
return s:rustfmt_version
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
call rustfmt#DetectVersion()
|
||||||
|
|
||||||
|
if !exists("g:rustfmt_emit_files")
|
||||||
|
let g:rustfmt_emit_files = s:rustfmt_version >= "0.8.2"
|
||||||
|
endif
|
||||||
|
|
||||||
|
if !exists("g:rustfmt_file_lines")
|
||||||
|
let g:rustfmt_file_lines = s:rustfmt_help =~# "--file-lines JSON"
|
||||||
|
endif
|
||||||
|
|
||||||
|
let s:got_fmt_error = 0
|
||||||
|
|
||||||
|
function! rustfmt#Load()
|
||||||
|
" Utility call to get this script loaded, for debugging
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:RustfmtWriteMode()
|
||||||
|
if g:rustfmt_emit_files
|
||||||
|
return "--emit=files"
|
||||||
|
else
|
||||||
|
return "--write-mode=overwrite"
|
||||||
|
endif
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:RustfmtConfig()
|
||||||
|
let l:rustfmt_toml = findfile('rustfmt.toml', expand('%:p:h') . ';')
|
||||||
|
if l:rustfmt_toml !=# ''
|
||||||
|
return '--config-path '.l:rustfmt_toml
|
||||||
|
endif
|
||||||
|
|
||||||
|
let l:_rustfmt_toml = findfile('.rustfmt.toml', expand('%:p:h') . ';')
|
||||||
|
if l:_rustfmt_toml !=# ''
|
||||||
|
return '--config-path '.l:_rustfmt_toml
|
||||||
|
endif
|
||||||
|
|
||||||
|
return ''
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:RustfmtCommandRange(filename, line1, line2)
|
||||||
|
if g:rustfmt_file_lines == 0
|
||||||
|
echo "--file-lines is not supported in the installed `rustfmt` executable"
|
||||||
|
return
|
||||||
|
endif
|
||||||
|
|
||||||
|
let l:arg = {"file": shellescape(a:filename), "range": [a:line1, a:line2]}
|
||||||
|
let l:write_mode = s:RustfmtWriteMode()
|
||||||
|
let l:rustfmt_config = s:RustfmtConfig()
|
||||||
|
|
||||||
|
" FIXME: When --file-lines gets to be stable, add version range checking
|
||||||
|
" accordingly.
|
||||||
|
let l:unstable_features = s:rustfmt_unstable_features ? '--unstable-features' : ''
|
||||||
|
|
||||||
|
let l:cmd = printf("%s %s %s %s %s --file-lines '[%s]' %s", g:rustfmt_command,
|
||||||
|
\ l:write_mode, g:rustfmt_options,
|
||||||
|
\ l:unstable_features, l:rustfmt_config,
|
||||||
|
\ json_encode(l:arg), shellescape(a:filename))
|
||||||
|
return l:cmd
|
||||||
|
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
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:DeleteLines(start, end) abort
|
||||||
|
silent! execute a:start . ',' . a:end . 'delete _'
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:RunRustfmt(command, tmpname, from_writepre)
|
||||||
|
mkview!
|
||||||
|
|
||||||
|
let l:stderr_tmpname = tempname()
|
||||||
|
call writefile([], l:stderr_tmpname)
|
||||||
|
|
||||||
|
let l:command = a:command . ' 2> ' . l:stderr_tmpname
|
||||||
|
|
||||||
|
if a:tmpname ==# ''
|
||||||
|
" Rustfmt in stdin/stdout mode
|
||||||
|
|
||||||
|
" chdir to the directory of the file
|
||||||
|
let l:has_lcd = haslocaldir()
|
||||||
|
let l:prev_cd = getcwd()
|
||||||
|
execute 'lchdir! '.expand('%:h')
|
||||||
|
|
||||||
|
let l:buffer = getline(1, '$')
|
||||||
|
if exists("*systemlist")
|
||||||
|
silent let out = systemlist(l:command, l:buffer)
|
||||||
|
else
|
||||||
|
silent let out = split(system(l:command,
|
||||||
|
\ join(l:buffer, "\n")), '\r\?\n')
|
||||||
|
endif
|
||||||
|
else
|
||||||
|
if exists("*systemlist")
|
||||||
|
silent let out = systemlist(l:command)
|
||||||
|
else
|
||||||
|
silent let out = split(system(l:command), '\r\?\n')
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
let l:stderr = readfile(l:stderr_tmpname)
|
||||||
|
|
||||||
|
call delete(l:stderr_tmpname)
|
||||||
|
|
||||||
|
let l:open_lwindow = 0
|
||||||
|
if v:shell_error == 0
|
||||||
|
if a:from_writepre
|
||||||
|
" remove undo point caused via BufWritePre
|
||||||
|
try | silent undojoin | catch | endtry
|
||||||
|
endif
|
||||||
|
|
||||||
|
if a:tmpname ==# ''
|
||||||
|
let l:content = l:out
|
||||||
|
else
|
||||||
|
" take the tmpfile's content, this is better than rename
|
||||||
|
" because it preserves file modes.
|
||||||
|
let l:content = readfile(a:tmpname)
|
||||||
|
endif
|
||||||
|
|
||||||
|
call s:DeleteLines(len(l:content), line('$'))
|
||||||
|
call setline(1, l:content)
|
||||||
|
|
||||||
|
" only clear location list if it was previously filled to prevent
|
||||||
|
" clobbering other additions
|
||||||
|
if s:got_fmt_error
|
||||||
|
let s:got_fmt_error = 0
|
||||||
|
call setloclist(0, [])
|
||||||
|
let l:open_lwindow = 1
|
||||||
|
endif
|
||||||
|
elseif g:rustfmt_fail_silently == 0 && !a:from_writepre
|
||||||
|
" otherwise get the errors and put them in the location list
|
||||||
|
let l:errors = []
|
||||||
|
|
||||||
|
let l:prev_line = ""
|
||||||
|
for l:line in l:stderr
|
||||||
|
" error: expected one of `;` or `as`, found `extern`
|
||||||
|
" --> src/main.rs:2:1
|
||||||
|
let tokens = matchlist(l:line, '^\s\+-->\s\(.\{-}\):\(\d\+\):\(\d\+\)$')
|
||||||
|
if !empty(tokens)
|
||||||
|
call add(l:errors, {"filename": @%,
|
||||||
|
\"lnum": tokens[2],
|
||||||
|
\"col": tokens[3],
|
||||||
|
\"text": l:prev_line})
|
||||||
|
endif
|
||||||
|
let l:prev_line = l:line
|
||||||
|
endfor
|
||||||
|
|
||||||
|
if !empty(l:errors)
|
||||||
|
call setloclist(0, l:errors, 'r')
|
||||||
|
echohl Error | echomsg "rustfmt returned error" | echohl None
|
||||||
|
else
|
||||||
|
echo "rust.vim: was not able to parse rustfmt messages. Here is the raw output:"
|
||||||
|
echo "\n"
|
||||||
|
for l:line in l:stderr
|
||||||
|
echo l:line
|
||||||
|
endfor
|
||||||
|
endif
|
||||||
|
|
||||||
|
let s:got_fmt_error = 1
|
||||||
|
let l:open_lwindow = 1
|
||||||
|
endif
|
||||||
|
|
||||||
|
" Restore the current directory if needed
|
||||||
|
if a:tmpname ==# ''
|
||||||
|
if l:has_lcd
|
||||||
|
execute 'lchdir! '.l:prev_cd
|
||||||
|
else
|
||||||
|
execute 'chdir! '.l:prev_cd
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
" Open lwindow after we have changed back to the previous directory
|
||||||
|
if l:open_lwindow == 1
|
||||||
|
lwindow
|
||||||
|
endif
|
||||||
|
|
||||||
|
silent! loadview
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
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, v:false)
|
||||||
|
call delete(l:tmpname)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! rustfmt#Format()
|
||||||
|
call s:RunRustfmt(s:RustfmtCommand(), '', v:false)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! rustfmt#Cmd()
|
||||||
|
" Mainly for debugging
|
||||||
|
return s:RustfmtCommand()
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! rustfmt#PreWrite()
|
||||||
|
if !filereadable(expand("%@"))
|
||||||
|
return
|
||||||
|
endif
|
||||||
|
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
|
||||||
|
endif
|
||||||
|
else
|
||||||
|
if has_key(b:, '_rustfmt_autosave_because_of_config')
|
||||||
|
unlet b:_rustfmt_autosave_because_of_config
|
||||||
|
unlet b:rustfmt_autosave
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
if !rust#GetConfigVar("rustfmt_autosave", 0)
|
||||||
|
return
|
||||||
|
endif
|
||||||
|
|
||||||
|
call s:RunRustfmt(s:RustfmtCommand(), '', v:true)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
|
||||||
|
" vim: set et sw=4 sts=4 ts=8:
|
||||||
|
|
||||||
|
endif
|
||||||
34
autoload/smt2.vim
Normal file
34
autoload/smt2.vim
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'smt2') == -1
|
||||||
|
|
||||||
|
" Invokes the solver on current file
|
||||||
|
function! smt2#RunSolver()
|
||||||
|
silent !clear
|
||||||
|
execute "!" . g:smt2_solver_command . " " . bufname("%")
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" Puts the solver's output in new split (replaces old split)
|
||||||
|
function! smt2#RunSolverAndShowResult()
|
||||||
|
let output = system(g:smt2_solver_command . " " . bufname("%") . " 2>&1")
|
||||||
|
|
||||||
|
" Create split (or reuse existent)
|
||||||
|
if exists("s:outputbufnr") && bufwinnr(s:outputbufnr) > 0
|
||||||
|
execute bufwinnr(s:outputbufnr) . 'wincmd w'
|
||||||
|
else
|
||||||
|
silent! vnew
|
||||||
|
let s:outputbufnr=bufnr('%')
|
||||||
|
endif
|
||||||
|
|
||||||
|
" Clear & (re-)fill contents
|
||||||
|
silent! normal! ggdG
|
||||||
|
setlocal filetype=smt2 buftype=nofile nobuflisted noswapfile
|
||||||
|
call append(0, split(output, '\v\n'))
|
||||||
|
normal! gg
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" Requests the solver's version
|
||||||
|
function! smt2#PrintSolverVersion()
|
||||||
|
silent !clear
|
||||||
|
execute "!" . g:smt2_solver_command . " " . g:smt2_solver_version_switch
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
endif
|
||||||
64
autoload/terraform.vim
Normal file
64
autoload/terraform.vim
Normal file
@@ -0,0 +1,64 @@
|
|||||||
|
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'terraform') == -1
|
||||||
|
|
||||||
|
" Ensure no conflict with arguments from the environment
|
||||||
|
let $TF_CLI_ARGS_fmt=''
|
||||||
|
|
||||||
|
function! terraform#fmt()
|
||||||
|
if !filereadable(expand('%:p'))
|
||||||
|
return
|
||||||
|
endif
|
||||||
|
let l:curw = winsaveview()
|
||||||
|
" Make a fake change so that the undo point is right.
|
||||||
|
normal! ix
|
||||||
|
normal! "_x
|
||||||
|
silent execute '%!terraform fmt -no-color -'
|
||||||
|
if v:shell_error != 0
|
||||||
|
let output = getline(1, '$')
|
||||||
|
silent undo
|
||||||
|
echo join(output, "\n")
|
||||||
|
endif
|
||||||
|
call winrestview(l:curw)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! terraform#align()
|
||||||
|
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)
|
||||||
|
let l: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(l:commands, "\n")
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
endif
|
||||||
18
autoload/vifm/edit.vim
Normal file
18
autoload/vifm/edit.vim
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
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>
|
||||||
|
" Last Change: August 18, 2013
|
||||||
|
|
||||||
|
" Prepare buffer
|
||||||
|
function! vifm#edit#Init()
|
||||||
|
" Mappings for quick leaving the buffer (behavior similar to Command line
|
||||||
|
" buffer in Vim)
|
||||||
|
nnoremap <buffer> <cr> :copy 0 \| wq<cr>
|
||||||
|
imap <buffer> <cr> <esc><cr>
|
||||||
|
|
||||||
|
" Start buffer editing in insert mode
|
||||||
|
startinsert
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
endif
|
||||||
35
autoload/vifm/globals.vim
Normal file
35
autoload/vifm/globals.vim
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'vifm') == -1
|
||||||
|
|
||||||
|
" common functions for vifm plugin related to globals
|
||||||
|
" Maintainer: xaizek <xaizek@posteo.net>
|
||||||
|
" Last Change: November 03, 2018
|
||||||
|
|
||||||
|
" Initializes global variables to defaults unless they are already set
|
||||||
|
function! vifm#globals#Init()
|
||||||
|
if !exists('g:vifm_exec')
|
||||||
|
let g:vifm_exec = 'vifm'
|
||||||
|
endif
|
||||||
|
|
||||||
|
if !exists('g:vifm_exec_args')
|
||||||
|
let g:vifm_exec_args = ''
|
||||||
|
endif
|
||||||
|
|
||||||
|
if !exists('g:vifm_term')
|
||||||
|
if has('win32')
|
||||||
|
if filereadable('C:\Windows\system32\cmd.exe')
|
||||||
|
let g:vifm_term = 'C:\Windows\system32\cmd.exe /C'
|
||||||
|
else
|
||||||
|
" If don't find use the integrate shell it work too
|
||||||
|
let g:vifm_term = ''
|
||||||
|
endif
|
||||||
|
else
|
||||||
|
let g:vifm_term = 'xterm -e'
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
if !exists('g:vifm_embed_term')
|
||||||
|
let g:vifm_embed_term = has('gui_running')
|
||||||
|
endif
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
endif
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user