Compare commits

...

181 Commits

Author SHA1 Message Date
Adam Stankiewicz
271679272c Fix eruby filetype detect, closes #547 2020-09-15 11:19:56 +02:00
Adam Stankiewicz
d43d269bed Update 2020-09-15 10:45:50 +02:00
Adam Stankiewicz
4314841aa4 Fix build, closes #548 2020-09-13 09:14:21 +02:00
Adam Stankiewicz
5308fab3e9 Fix build, closes #548 2020-09-13 09:13:11 +02:00
Adam Stankiewicz
c842cbcb59 Update 2020-09-12 14:54:55 +02:00
Adam Stankiewicz
314621a395 Make warning more clear, #546 2020-09-11 13:56:24 +02:00
Adam Stankiewicz
ca8818e8ed Improve issue template 2020-09-10 16:46:31 +02:00
Adam Stankiewicz
947e6853aa Improve issue template 2020-09-10 16:44:51 +02:00
Adam Stankiewicz
05ff14bfda Add odin support, closes #544 2020-09-10 16:38:32 +02:00
Adam Stankiewicz
9243367ba3 Automatically detect script filetype when typing 2020-09-10 15:40:27 +02:00
Adam Stankiewicz
1eed30b2af Fix filetype detection and docini filetypes 2020-09-10 14:07:02 +02:00
Adam Stankiewicz
be092d6f43 Fix jsx indentation, closes #543 2020-09-10 12:18:29 +02:00
Adam Stankiewicz
fb7cf8a9ab Update 2020-09-10 10:30:32 +02:00
Adam Stankiewicz
19a69cf77d Remove debugging code... 2020-09-09 19:22:27 +02:00
Adam Stankiewicz
4f7a4036eb Finally fix issues with tab detection, #541 2020-09-09 19:08:17 +02:00
Adam Stankiewicz
0ff5d451b0 Fix b:sleuth_culprit for tabs 2020-09-09 18:31:30 +02:00
Adam Stankiewicz
49840b1893 Show full path in b:sleuth_culprit 2020-09-09 18:28:28 +02:00
Adam Stankiewicz
2dc954d6fa Last fixes to b:sleuth_culprit 2020-09-09 18:07:03 +02:00
Adam Stankiewicz
2369cd5d22 Make b:sleuth_culprit more readable 2020-09-09 18:02:38 +02:00
Adam Stankiewicz
46affb6153 Show warning if g:polyglot_disabled is not at the top of .vimrc 2020-09-09 17:50:40 +02:00
Adam Stankiewicz
a4cc3f64f9 Make it easier to debug indentation issues, #542 2020-09-09 17:39:27 +02:00
Adam Stankiewicz
2fe310256e Transcompile ..= operator to support old vims, fixes #542 2020-09-09 17:08:29 +02:00
Adam Stankiewicz
2e1a980632 Add missing functions from Sleuth, #541 2020-09-09 16:48:49 +02:00
Adam Stankiewicz
cecfb5dd10 Fix disabling autoindent, #541 2020-09-09 16:45:51 +02:00
Adam Stankiewicz
a4a9481d37 Fix disabling autoindent, closes #541 2020-09-09 11:58:24 +02:00
Adam Stankiewicz
5e5d127eb8 Add expect (fix tests) 2020-09-08 22:41:51 +02:00
Adam Stankiewicz
002573265a Fix some ftdetect issues from tests 2020-09-08 21:17:24 +02:00
Adam Stankiewicz
a4b91124a8 Fix auto-detecting indent, closes #540 2020-09-08 16:15:45 +02:00
Adam Stankiewicz
46040f3ffd Add heuristics for .h extension 2020-09-06 23:37:24 +02:00
Adam Stankiewicz
48254ec7ad Add more apache filetypes 2020-09-06 21:07:04 +02:00
Adam Stankiewicz
cd2fded0e0 Add support for Visual Basic and Basic 2020-09-06 20:51:38 +02:00
Adam Stankiewicz
255345bf95 Remove stephpy/vim-yaml syntax
It causes issues:
- https://github.com/dracula/vim/pull/163
- https://github.com/stephpy/vim-yaml/issues/22
2020-09-06 19:25:34 +02:00
Adam Stankiewicz
3169f80169 Remove empty blocks 2020-09-06 19:23:23 +02:00
Adam Stankiewicz
e9b3bcd5e1 Ensure duplicate tags do not happen in the future, #538 2020-09-06 19:20:23 +02:00
Adam Stankiewicz
d9ee362537 Fix weird indentation issue of yaml 2020-09-06 15:08:20 +02:00
Adam Stankiewicz
57badea2dc Ignore idris2 doc, fixes #538 2020-09-06 02:34:46 +02:00
CodingCellist
3baafd5c33 Add support for Idris2, closes #534 (#535) 2020-09-05 21:37:11 +02:00
Adam Stankiewicz
b0124dc880 Ignore files from homedir and root for indent
https://github.com/tpope/vim-sleuth/pull/57
2020-09-04 19:45:47 +02:00
Adam Stankiewicz
99166bd51f Do not set indent on by default
https://github.com/tpope/vim-sleuth/issues/21
2020-09-04 19:21:08 +02:00
Adam Stankiewicz
48b4f233c5 Fix detecting indentation in some CSS
This is done by ignoring lines that don't have any
alphanumeric characters, e.g. following would be detected
as 4-spaces indentation instead of 2-spaces

.android {
    height: 404px; width: 334px;
    margin: 100px auto;
  }

https://github.com/tpope/vim-sleuth/issues/22
2020-09-04 19:02:39 +02:00
Adam Stankiewicz
556ba05cee Ignore heredoc when detecting indent 2020-09-04 18:55:51 +02:00
Adam Stankiewicz
262960fa22 Synchronize shiftwidth with tabstop by default 2020-09-04 18:29:53 +02:00
Adam Stankiewicz
b2640b5b76 Fix detection of indentation, #537 2020-09-04 17:31:22 +02:00
Adam Stankiewicz
c30ba66d22 Let user select tabstop, by not changing it 2020-09-04 14:23:18 +02:00
Adam Stankiewicz
4df00e6574 Allow to disable autoindent with g:polyglot_disabled 2020-09-04 14:18:37 +02:00
Adam Stankiewicz
48f59577c8 Switch to neovim version of help filetype, fixes #536 2020-09-04 12:11:55 +02:00
Adam Stankiewicz
96179c95ba Update contribution info 2020-09-03 17:16:08 +02:00
Adam Stankiewicz
520389bbfd Add test for terraform 2020-09-03 05:38:07 +02:00
Adam Stankiewicz
7123e97498 Disable native autocommands when appropriate, fixes #533 2020-09-03 05:36:55 +02:00
Adam Stankiewicz
63119f09d1 Automatically detect indentation, closes #529 2020-09-01 23:38:17 +02:00
Adam Stankiewicz
f2ef4cedec Fix reason filetype detection, closes #532 2020-09-01 23:02:36 +02:00
Adam Stankiewicz
45c1923f43 Add sql support for javascript 2020-09-01 16:02:38 +02:00
Adam Stankiewicz
8dd0474feb Remove vim-sql-syntax, #528 2020-09-01 15:55:43 +02:00
Adam Stankiewicz
e166f741ef Some major updates including heuristics
- Allow to define heuristics in heuristics.yaml
- Migrate all filetypes from vim beginning with "a"
- Remove enhanced cpp syntax (it was too slow to load)
- Use setf instead of set ft for setting filetype (faster)
- Override native hauristics with au!
- Add globbing of files for packages
- Replace predefined dirs with extra_dirs and ignored_dirs
- Allow to define proper order of packages with topological sort
- Fix powershell detection
- Lint and fix many packages.yaml issues
- etc etd
2020-09-01 08:33:15 +02:00
Tim Bedard
d4fcef1aa8 add missing period to fix mako detection (#530) 2020-08-29 12:17:29 +02:00
Adam Stankiewicz
7972e8eea1 Build 2020-08-27 15:02:54 +02:00
Adam Stankiewicz
6ed481e463 Make sure all extensions are covered 2020-08-27 15:01:44 +02:00
Adam Stankiewicz
c1e1870a3d Fix ocaml and dune ftdetect 2020-08-27 09:30:50 +02:00
Adam Stankiewicz
f0d6ecff07 Build 2020-08-25 23:09:24 +02:00
Tim Bedard
15e5df246e Add missing newlines (#527) 2020-08-25 23:08:33 +02:00
Adam Stankiewicz
94ababe91f Fix ansible ftdetect 2020-08-25 14:28:44 +02:00
Adam Stankiewicz
080b8cdc60 Fix ansible ftdetect 2020-08-25 14:26:38 +02:00
Adam Stankiewicz
e47af23f64 Cleanup ftdetect 2020-08-25 14:03:03 +02:00
Adam Stankiewicz
8f5134aef8 Include docs of plugins 2020-08-24 12:37:31 +02:00
Adam Stankiewicz
be8d039e02 Remove vifm and test all filetypes 2020-08-24 12:34:24 +02:00
Adam Stankiewicz
38ce8e9cb6 Use make in CI 2020-08-24 11:53:03 +02:00
Adam Stankiewicz
55ad5a982a Migrate to makefile 2020-08-24 11:52:33 +02:00
Adam Stankiewicz
b2055afaa7 Migrate only after dirs 2020-08-24 11:48:35 +02:00
Adam Stankiewicz
63a175357a Remove some custom dirs config 2020-08-24 10:56:09 +02:00
Adam Stankiewicz
25db54573a Mention vim-polyglot is more secure than using individual packs 2020-08-24 10:32:03 +02:00
Adam Stankiewicz
d1bfe50419 Ignore compiler for javascript, fixes #521 2020-08-24 10:29:39 +02:00
Adam Stankiewicz
22e8e01c1e Use setf for ambiguous extensions 2020-08-24 09:52:25 +02:00
Adam Stankiewicz
30bef582ba Fix blade ftdetect 2020-08-24 09:31:34 +02:00
Adam Stankiewicz
74d940cda3 Remove travis 2020-08-24 00:21:35 +02:00
Adam Stankiewicz
54d2386262 Update readme 2020-08-24 00:05:31 +02:00
Adam Stankiewicz
a47c315b01 Update readme 2020-08-24 00:04:36 +02:00
Adam Stankiewicz
ff0ada0dc3 Fix CI 2020-08-24 00:01:53 +02:00
Adam Stankiewicz
e194de5875 Debug CI 2020-08-23 23:59:02 +02:00
Adam Stankiewicz
012cf89210 Fix CI 2020-08-23 23:54:23 +02:00
Adam Stankiewicz
ac71777dc2 Fix CI 2020-08-23 23:40:50 +02:00
Adam Stankiewicz
23defeb610 fix: Migrate build script to ruby 2020-08-23 23:35:05 +02:00
Adam Stankiewicz
114a93bb7c Migrate ftdetect generation to ruby 2020-08-23 23:25:06 +02:00
Adam Stankiewicz
f3ab28a287 Move packages to yaml file 2020-08-23 19:39:42 +02:00
Adam Stankiewicz
bc3b36088e Update 2020-08-23 17:26:30 +02:00
Adam Stankiewicz
5d0150e326 Migrate build script to ruby 2020-08-21 19:49:36 +02:00
Adam Stankiewicz
cf8e31ff7f Update 2020-08-21 14:51:19 +02:00
Adam Stankiewicz
0df1bfa0c5 Add requirements.txt support, closes #507 2020-08-18 23:31:31 +02:00
Adam Stankiewicz
f7302d9262 Add jq syntax, closes #502 2020-08-18 23:25:22 +02:00
Adam Stankiewicz
7e38f4288a Add improved sql syntax, closes #505 2020-08-18 23:22:09 +02:00
Adam Stankiewicz
e521ba3ae2 Add fennel support, closes #514 2020-08-18 23:09:35 +02:00
Adam Stankiewicz
ee4f51587d Add ftdetect for jsonnet 2020-08-18 23:06:10 +02:00
Adam Stankiewicz
20a388cbc8 Add jsonnet support, closes #515 2020-08-18 23:04:38 +02:00
Adam Stankiewicz
81e61a3c5d Ignore auto-generated tags file 2020-08-18 23:00:07 +02:00
Adam Stankiewicz
5670985b3a Add docs, fixes #501 2020-08-18 22:45:46 +02:00
Adam Stankiewicz
69eae22ea6 Let fsharp have priority over fs files, fixes #523 2020-08-18 21:30:22 +02:00
Adam Stankiewicz
f8cee0172b Allow to set let g:python_highlight_all = 0, closes #474 2020-08-18 20:52:00 +02:00
Adam Stankiewicz
c6936aeeb1 Fix dhall plugin, closes #519 2020-08-18 20:08:26 +02:00
Adam Stankiewicz
6bb111eaba Embed plugin guards 2020-08-18 20:01:12 +02:00
Adam Stankiewicz
dfecb63078 Report download errors 2020-08-18 18:49:24 +02:00
Adam Stankiewicz
00015bd105 Migrate all ftdetect to linguist 2020-08-18 15:53:18 +02:00
Adam Stankiewicz
d821de3142 Migrate more filetypes 2020-08-18 11:54:28 +02:00
Adam Stankiewicz
a3bdbcdb3c Fix svelte branch name, closes #522 2020-08-14 19:15:07 +02:00
Adam Stankiewicz
34e01b8b62 Start github-linguist rewrite 2020-08-06 13:42:56 +02:00
Adam Stankiewicz
1e533e5982 Update 2020-08-06 13:22:17 +02:00
Adam Stankiewicz
56121b4e27 Update 2020-07-26 10:20:08 +02:00
Adam Stankiewicz
9c3c0bc082 Fix rspect ftdetect, #503 2020-07-06 19:14:22 +02:00
Adam Stankiewicz
8500ae8bb9 Update 2020-07-06 19:13:39 +02:00
Adam Stankiewicz
d09a56a494 Add unison language support 2020-06-25 13:40:40 +02:00
Adam Stankiewicz
abca7c2014 Update 2020-06-25 13:38:15 +02:00
TravonteD
8b6c06e723 Add detection for rspec files (#503)
Standard convention for rspec files is "*_spec.rb". This is also what
rspec.vim (the syntax plugin that is pulled in) uses.
2020-06-19 14:47:03 +02:00
Adam Stankiewicz
a86c0179eb Update 2020-06-13 11:36:03 +02:00
Adam Stankiewicz
22095febb7 Update 2020-06-10 11:46:12 +02:00
Adam Stankiewicz
ff066ee9f0 Update 2020-06-07 17:37:15 +02:00
Adam Stankiewicz
5b38663027 Update README.md 2020-06-01 22:01:48 +02:00
Adam Stankiewicz
f0b38f2c1d Install vim 8 for tests 2020-05-31 23:53:41 +02:00
Adam Stankiewicz
6676d61f61 Fix 2020-05-31 23:51:46 +02:00
Adam Stankiewicz
f0da1a9f4d Update vim version 2020-05-31 23:48:07 +02:00
Adam Stankiewicz
298d6b6356 Fix tests 2020-05-31 23:44:10 +02:00
Adam Stankiewicz
62f004c3da Update travis script 2020-05-31 23:42:04 +02:00
Adam Stankiewicz
c73ea49ecb Improve bash and zsh highlighting 2020-05-31 20:57:37 +02:00
Adam Stankiewicz
b2be47befc Update 2020-05-31 20:52:04 +02:00
Adam Kwiatek
de38ccabbd Enable TypeScript in ftdetect (#496) 2020-05-29 21:10:18 +02:00
Adam Stankiewicz
f0f49cf0fa Add support for ics, closes #492 2020-05-28 11:12:25 +02:00
Adam Stankiewicz
224a6348f9 Update 2020-05-28 11:09:19 +02:00
Emerson MX
00c3f02945 Remove gdscript ftplugin (#494) 2020-05-28 11:05:53 +02:00
Adam Stankiewicz
df34b4b4fa Update 2020-05-21 22:45:59 +02:00
Adam Stankiewicz
f3804b0892 Restore support for polyglot_disabled for ftdetect, closes #491 2020-05-21 22:45:04 +02:00
Adam Stankiewicz
685aeaaeb1 Add ledger support, closes #488 2020-05-20 20:24:48 +02:00
Adam Stankiewicz
a9cc6fd218 Remove latex, fixes #484 2020-05-20 20:19:03 +02:00
Adam Stankiewicz
3c47f192b5 Fix jinja.html detection 2020-05-20 19:44:40 +02:00
Adam Stankiewicz
c8b350432c Remove generation of ftdetect from build 2020-05-20 19:35:10 +02:00
Adam Stankiewicz
cdb8e233c2 Manually fix ftdetect 2020-05-20 19:32:07 +02:00
Adam Stankiewicz
ff282f610f Remove extra files 2020-05-20 17:29:46 +02:00
Adam Stankiewicz
74cb75bedd Add vim-raku, closes #490 2020-05-20 17:06:38 +02:00
Adam Stankiewicz
42529540df Remove non-working ftplugin line, closes #485 2020-05-20 17:04:22 +02:00
Adam Stankiewicz
a688c66a04 Update 2020-05-20 16:59:09 +02:00
Adam Stankiewicz
0a7c62b3b2 Remove rego syntax, fixes #486 2020-04-30 16:49:01 +02:00
Adam Stankiewicz
c7b5826d53 Update 2020-04-28 01:09:08 +02:00
Adam Stankiewicz
1d348d0c2d Update badge 2020-04-25 23:23:00 +02:00
Adam Stankiewicz
6a15d48ed4 Add brewfile support, closes #469 2020-04-25 22:15:02 +02:00
Adam Stankiewicz
24f0581a96 Add rego support, closes #471 2020-04-25 22:12:56 +02:00
Adam Stankiewicz
33c9484671 Allow to configure python syntax, #474 2020-04-25 22:09:35 +02:00
Adam Stankiewicz
55287efdf7 Change elm provider, closes #475 2020-04-25 21:32:37 +02:00
Adam Stankiewicz
d757bfd643 Change latex provider to luatex, closes #476 2020-04-25 21:30:46 +02:00
Adam Stankiewicz
8ec73a3a89 Change fsharp provider, closes #477 2020-04-25 21:22:25 +02:00
Adam Stankiewicz
b2ee28374b Add gdscript, closes #483 2020-04-25 21:06:45 +02:00
Adam Stankiewicz
68b2748af1 Update 2020-04-25 21:03:34 +02:00
Adam Stankiewicz
14dc82fc4e Update 2020-04-14 13:17:26 +02:00
Adam Stankiewicz
e86e0ad36e Update 2020-03-05 12:30:24 +01:00
Adam Stankiewicz
45ab4d80dd Add zinit syntax, closes #459 2020-03-02 01:42:31 +01:00
Adam Stankiewicz
9cd6e8533b Update 2020-03-02 01:39:59 +01:00
Adam Stankiewicz
43ecbfae50 Add ctags files, fixes #445 2020-03-02 01:24:08 +01:00
Adam Stankiewicz
f77702c090 Remove groovy syntax, fixes #456 2020-03-02 01:10:48 +01:00
Adam Stankiewicz
e558a218c6 Add razor syntax, fixes #450 2020-03-02 01:03:15 +01:00
Adam Stankiewicz
16774887a3 Force javascript filetype for jsx, fixes #460 2020-03-02 00:59:47 +01:00
Adam Stankiewicz
e7dc03dc01 Use upstream rspec plugin, fixes #458 2020-03-02 00:45:18 +01:00
Adam Stankiewicz
aee260a301 Remove jasmine syntax, fixes #464 2020-03-02 00:43:28 +01:00
Adam Stankiewicz
6b540d7db0 Update 2020-03-02 00:34:02 +01:00
Adam Stankiewicz
35ea4d2b90 Update 2020-01-25 16:56:10 +01:00
Chris Bandy
967486dd71 Combine ftdetect files in a predictable order (#461)
Bash expands patterns to an alphabetically sorted list of filenames, but
the order depends on LC_COLLATE. On both Linux and BSD, `sort -V` uses
the C locale.
2020-01-25 16:54:44 +01:00
Adam Stankiewicz
e8454d66ab Fix performance issue with markdown highlighting 2019-12-31 14:23:47 +01:00
Adam Stankiewicz
a60e299a3c Switch back to plasticboy for markdown 2019-12-31 14:08:15 +01:00
Adam Stankiewicz
b8a5504021 Update 2019-12-31 14:05:09 +01:00
Adam Stankiewicz
cea0d08a06 Replace markdown plugin for faster one 2019-12-12 16:43:09 +01:00
Adam Stankiewicz
43085dc02f Update 2019-12-12 16:33:01 +01:00
Adam Stankiewicz
4d8423c962 Add v language, closes #437 2019-12-07 17:39:31 +01:00
Adam Stankiewicz
e204a7223b Add ftplugin to markdown, fixes #447 2019-12-07 13:01:03 +01:00
Adam Stankiewicz
7a0f2d974f Update 2019-12-07 12:21:37 +01:00
timfeirg
15aeea662e Headsup on g:polyglot_disabled (#438) 2019-11-28 11:29:38 +01:00
Adam Stankiewicz
d15651463a Update 2019-11-15 17:27:14 +01:00
Adam Stankiewicz
0c79dd3e73 Update 2019-11-12 21:56:06 +01:00
Adam Stankiewicz
4e95df7c7e Update 2019-11-04 09:04:28 +01:00
Adam Stankiewicz
31c55b85a0 Change octave provider, closes #436 2019-10-16 14:57:13 +02:00
Adam Stankiewicz
199846c6d8 Update 2019-10-16 14:56:00 +02:00
Adam Stankiewicz
f95026252c Update everything, closes #435 2019-09-27 19:47:32 +02:00
Adam Stankiewicz
4f3df59be7 Improve guard so it works for no eof new line 2019-09-12 15:08:44 +02:00
Adam Stankiewicz
26790941f6 Update 2019-09-12 14:32:53 +02:00
Adam Stankiewicz
fbc2af9e82 Remove styled components, fixes #432 2019-09-06 16:47:37 +02:00
Adam Stankiewicz
d4f252565a Remove unnecessary tsx fix 2019-09-06 16:26:33 +02:00
Adam Stankiewicz
48e07bc501 Improve guard to support concatenated files 2019-09-06 15:54:31 +02:00
Adam Stankiewicz
c8897c9c18 Remove unnecessary graphql fix 2019-09-06 15:50:47 +02:00
777 changed files with 48507 additions and 21322 deletions

7
.gitattributes vendored
View File

@@ -1,7 +0,0 @@
.gitignore export-ignore
.gitattributes export-ignore
README.md export-ignore
/spec export-ignore
Gemfile export-ignore
Gemfile.lock export-ignore
.travis.yml export-ignore

View File

@@ -2,17 +2,23 @@
name: Add language name: Add language
about: Add support for new language about: Add support for new language
title: '' title: ''
labels: '' labels: 'enhancement'
assignees: '' assignees: ''
--- ---
<!--- vim-polyglot accepts only lightweight, maintained github-hosted vim plugins --> **What is the name of this language in Linguist?**
<!-- https://github.com/github/linguist/blob/master/lib/linguist/languages.yml -->
**Link to GitHub repository of Vim plugin**
**GitHub repository url**
**Is this plugin well maintained?** **Is this plugin well maintained?**
**Is this plugin lightweight? (no advanced functionality, just indent and syntax support)** **Is this plugin lightweight? (no advanced functionality, just indent and syntax support)**

View File

@@ -1,20 +0,0 @@
---
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.

21
.github/workflows/test.yml vendored Normal file
View File

@@ -0,0 +1,21 @@
name: Vim Polyglot CI
on:
push:
pull_request:
schedule:
- cron: '0 0 * * 0' # weekly
jobs:
test:
runs-on: ubuntu-latest
steps:
- name: Install Vim
run: |
sudo add-apt-repository ppa:jonathonf/vim -y
sudo apt-get update -q
sudo apt-get install -y vim expect
vim --version
- uses: actions/checkout@v2
- name: Run Tests
run: make test

2
.gitignore vendored
View File

@@ -1 +1,3 @@
/tmp /tmp
!*ctags*
tags

View File

@@ -1,11 +0,0 @@
language: ruby
rvm:
- 2.6
sudo: false
addons:
apt:
packages:
- vim-gtk
before_script:
- "./build"
script: xvfb-run bundle exec rspec --format=documentation

View File

@@ -1,4 +0,0 @@
source 'https://rubygems.org'
gem 'vimrunner'
gem 'rspec'

View File

@@ -1,28 +0,0 @@
GEM
remote: https://rubygems.org/
specs:
diff-lcs (1.3)
rspec (3.8.0)
rspec-core (~> 3.8.0)
rspec-expectations (~> 3.8.0)
rspec-mocks (~> 3.8.0)
rspec-core (3.8.0)
rspec-support (~> 3.8.0)
rspec-expectations (3.8.2)
diff-lcs (>= 1.2.0, < 2.0)
rspec-support (~> 3.8.0)
rspec-mocks (3.8.0)
diff-lcs (>= 1.2.0, < 2.0)
rspec-support (~> 3.8.0)
rspec-support (3.8.0)
vimrunner (0.3.4)
PLATFORMS
ruby
DEPENDENCIES
rspec
vimrunner
BUNDLED WITH
1.16.2

10
Makefile Normal file
View File

@@ -0,0 +1,10 @@
.PHONY: all test dev
all:
@ scripts/build
test:
@ scripts/test
dev:
@ echo "packages.yaml\nheuristics.yaml\nscripts/test\nscripts/build\nscripts/test_extensions.vim" | DEV=1 entr bash -c 'make && make test'

385
README.md
View File

@@ -1,22 +1,20 @@
![vim-polyglot](https://i.imgur.com/9RxQK6k.png) ![vim-polyglot](https://i.imgur.com/9RxQK6k.png)
[![Build Status][travis-img-url]][travis-url] [![Maintenance](https://img.shields.io/maintenance/yes/2019.svg?maxAge=2592000)]() ![build](https://github.com/sheerun/vim-polyglot/workflows/Vim%20Polyglot%20CI/badge.svg) [![Maintenance](https://img.shields.io/maintenance/yes/2020.svg?maxAge=2592000)]()
[travis-img-url]: https://travis-ci.org/sheerun/vim-polyglot.svg
[travis-url]: https://travis-ci.org/sheerun/vim-polyglot
A collection of language packs for Vim. A collection of language packs for Vim.
> One to rule them all, one to find them, one to bring them all and in the darkness bind them. > One to rule them all, one to find them, one to bring them all and in the darkness bind them.
- It **won't affect your startup time**, as scripts are loaded only on demand\*. - It **won't affect your startup time**, as scripts are loaded only on demand\*.
- It **installs and updates 120+ times faster** than the <!--Package Count-->147<!--/Package Count--> packages it consists of. - It **installs and updates 120+ times faster** than the <!--Package Count-->196<!--/Package Count--> packages it consists of.
- It is more secure because scripts loaded for all extensions are generated by vim-polyglot (ftdetect).
- Solid syntax and indentation support (other features skipped). Only the best language packs. - Solid syntax and indentation support (other features skipped). Only the best language packs.
- All unnecessary files are ignored (like enormous documentation from php support). - All unnecessary files are ignored (like enormous documentation from php support).
- No support for esoteric languages, only most popular ones (modern too, like `slim`). - Automatically detect indentation (includes performance-optimized version of [vim-sleuth](https://github.com/tpope/vim-sleuth))
- Each build is tested by automated vimrunner script on CI. See `spec` directory. - Each build is tested by automated vimrunner script on CI. See `spec` directory.
\*To be completely honest, concatenated `ftdetect` script takes up to `17ms` to load. \*To be completely honest, optimized `ftdetect` script takes around `20ms` to load.
## Installation ## Installation
@@ -38,190 +36,241 @@ mkdir -p ~/.vim/pack/default/start
git clone https://github.com/sheerun/vim-polyglot ~/.vim/pack/default/start/vim-polyglot 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). NOTE: Not all features of individual language packs are available. We strip them from functionality slowing vim startup (for example we ignore `plugins` folder that is loaded regardless of file type, instead we prefer `ftplugin` which is loaded lazily).
If you need full functionality of any plugin, please use it directly with your plugin manager. If you need full functionality of any plugin, please use it directly with your plugin manager.
## Language packs ## Language packs
<!--Language Packs--> <!--Language Packs-->
- [acpiasl](https://github.com/martinlroth/vim-acpi-asl) (syntax) - [8th](https://github.com/vim/vim/tree/master/runtime)
- [ansible](https://github.com/pearofducks/ansible-vim) (syntax, indent, ftplugin) - [a2ps](https://github.com/vim/vim/tree/master/runtime)
- [apiblueprint](https://github.com/sheerun/apiblueprint.vim) (syntax) - [a65](https://github.com/vim/vim/tree/master/runtime)
- [applescript](https://github.com/mityu/vim-applescript) (syntax, indent) - [aap](https://github.com/vim/vim/tree/master/runtime)
- [arduino](https://github.com/sudar/vim-arduino-syntax) (syntax, indent) - [abap](https://github.com/vim/vim/tree/master/runtime)
- [asciidoc](https://github.com/asciidoc/vim-asciidoc) (syntax) - [abaqus](https://github.com/vim/vim/tree/master/runtime)
- [autohotkey](https://github.com/hnamikaw/vim-autohotkey) (indent) - [abc](https://github.com/vim/vim/tree/master/runtime)
- [blade](https://github.com/jwalton512/vim-blade) (syntax, indent, ftplugin) - [abel](https://github.com/vim/vim/tree/master/runtime)
- [c++11](https://github.com/octol/vim-cpp-enhanced-highlight) (syntax) - [acedb](https://github.com/vim/vim/tree/master/runtime)
- [c/c++](https://github.com/vim-jp/vim-cpp) (syntax) - [acpiasl](https://github.com/martinlroth/vim-acpi-asl)
- [caddyfile](https://github.com/isobit/vim-caddyfile) (syntax, indent, ftplugin) - [ada](https://github.com/vim/vim/tree/master/runtime)
- [carp](https://github.com/hellerve/carp-vim) (syntax) - [ahdl](https://github.com/vim/vim/tree/master/runtime)
- [cjsx](https://github.com/mtscout6/vim-cjsx) (syntax, ftplugin) - [aidl](https://github.com/vim/vim/tree/master/runtime)
- [clojure](https://github.com/guns/vim-clojure-static) (syntax, indent, autoload, ftplugin) - [alsaconf](https://github.com/vim/vim/tree/master/runtime)
- [cmake](https://github.com/pboettch/vim-cmake-syntax) (syntax, indent) - [aml](https://github.com/vim/vim/tree/master/runtime)
- [coffee-script](https://github.com/kchmck/vim-coffee-script) (syntax, compiler, indent, autoload, ftplugin) - [ampl](https://github.com/vim/vim/tree/master/runtime)
- [cql](https://github.com/elubow/cql-vim) (syntax) - [ansible](https://github.com/pearofducks/ansible-vim)
- [cryptol](https://github.com/victoredwardocallaghan/cryptol.vim) (syntax, compiler, ftplugin) - [ant](https://github.com/vim/vim/tree/master/runtime)
- [crystal](https://github.com/rhysd/vim-crystal) (syntax, indent, autoload, ftplugin) - [apache](https://github.com/vim/vim/tree/master/runtime)
- [csv](https://github.com/chrisbra/csv.vim) (syntax, autoload, ftplugin) - [apiblueprint](https://github.com/sheerun/apiblueprint.vim)
- [cucumber](https://github.com/tpope/vim-cucumber) (syntax, indent, compiler, ftplugin) - [applescript](https://github.com/mityu/vim-applescript)
- [cue](https://github.com/mgrabovsky/vim-cuesheet) (syntax) - [aptconf](https://github.com/vim/vim/tree/master/runtime)
- [dart](https://github.com/dart-lang/dart-vim-plugin) (syntax, indent, autoload, ftplugin) - [arch](https://github.com/vim/vim/tree/master/runtime)
- [dhall](https://github.com/vmchale/dhall-vim) (syntax, ftplugin) - [arduino](https://github.com/sudar/vim-arduino-syntax)
- [dlang](https://github.com/JesseKPhillips/d.vim) (syntax, indent) - [art](https://github.com/vim/vim/tree/master/runtime)
- [dockerfile](https://github.com/ekalinin/Dockerfile.vim) (syntax, indent, ftplugin) - [asciidoc](https://github.com/asciidoc/vim-asciidoc)
- [elixir](https://github.com/elixir-lang/vim-elixir) (syntax, indent, compiler, autoload, ftplugin) - [asn](https://github.com/vim/vim/tree/master/runtime)
- [elm](https://github.com/ElmCast/elm-vim) (syntax, indent, autoload, ftplugin) - [aspperl](https://github.com/vim/vim/tree/master/runtime)
- [emberscript](https://github.com/yalesov/vim-ember-script) (syntax, indent, ftplugin) - [aspvbs](https://github.com/vim/vim/tree/master/runtime)
- [emblem](https://github.com/yalesov/vim-emblem) (syntax, indent, ftplugin) - [atlas](https://github.com/vim/vim/tree/master/runtime)
- [erlang](https://github.com/vim-erlang/vim-erlang-runtime) (syntax, indent) - [autohotkey](https://github.com/hnamikaw/vim-autohotkey)
- [ferm](https://github.com/vim-scripts/ferm.vim) (syntax) - [autoit](https://github.com/vim/vim/tree/master/runtime)
- [fish](https://github.com/georgewitteman/vim-fish) (syntax, indent, compiler, autoload, ftplugin) - [automake](https://github.com/vim/vim/tree/master/runtime)
- [flatbuffers](https://github.com/dcharbon/vim-flatbuffers) (syntax) - [ave](https://github.com/vim/vim/tree/master/runtime)
- [fsharp](https://github.com/fsharp/vim-fsharp) (syntax, indent) - [awk](https://github.com/vim/vim/tree/master/runtime)
- [git](https://github.com/tpope/vim-git) (syntax, indent, ftplugin) - [basic](https://github.com/vim/vim/tree/master/runtime)
- [glsl](https://github.com/tikhomirov/vim-glsl) (syntax, indent) - [blade](https://github.com/jwalton512/vim-blade)
- [gmpl](https://github.com/maelvalais/gmpl.vim) (syntax) - [brewfile](https://github.com/bfontaine/Brewfile.vim)
- [gnuplot](https://github.com/vim-scripts/gnuplot-syntax-highlighting) (syntax) - [c/c++](https://github.com/vim-jp/vim-cpp)
- [go](https://github.com/fatih/vim-go) (syntax, compiler, indent) - [caddyfile](https://github.com/isobit/vim-caddyfile)
- [gradle](https://github.com/tfnico/vim-gradle) (compiler) - [carp](https://github.com/hellerve/carp-vim)
- [graphql](https://github.com/jparise/vim-graphql) (syntax, indent, autoload, ftplugin, after) - [cjsx](https://github.com/mtscout6/vim-cjsx)
- [groovy-indent](https://github.com/vim-scripts/groovyindent-unix) (indent) - [clojure](https://github.com/guns/vim-clojure-static)
- [groovy](https://github.com/vim-scripts/groovy.vim) (syntax) - [cmake](https://github.com/pboettch/vim-cmake-syntax)
- [haml](https://github.com/sheerun/vim-haml) (syntax, indent, compiler, ftplugin) - [coffee-script](https://github.com/kchmck/vim-coffee-script)
- [handlebars](https://github.com/mustache/vim-mustache-handlebars) (syntax, indent, ftplugin) - [cql](https://github.com/elubow/cql-vim)
- [haproxy](https://github.com/CH-DanReif/haproxy.vim) (syntax) - [cryptol](https://github.com/victoredwardocallaghan/cryptol.vim)
- [haskell](https://github.com/neovimhaskell/haskell-vim) (syntax, indent, ftplugin) - [crystal](https://github.com/rhysd/vim-crystal)
- [haxe](https://github.com/yaymukund/vim-haxe) (syntax) - [csv](https://github.com/chrisbra/csv.vim)
- [hcl](https://github.com/b4b4r07/vim-hcl) (syntax, indent, ftplugin) - [cucumber](https://github.com/tpope/vim-cucumber)
- [helm](https://github.com/towolf/vim-helm) (syntax) - [cue](https://github.com/mgrabovsky/vim-cuesheet)
- [hive](https://github.com/zebradil/hive.vim) (syntax, ftplugin) - [dart](https://github.com/dart-lang/dart-vim-plugin)
- [html5](https://github.com/othree/html5.vim) (syntax, indent, autoload, ftplugin) - [dhall](https://github.com/vmchale/dhall-vim)
- [i3](https://github.com/mboughaba/i3config.vim) (syntax, ftplugin) - [dlang](https://github.com/JesseKPhillips/d.vim)
- [idris](https://github.com/idris-hackers/idris-vim) (syntax, indent, ftplugin) - [dockerfile](https://github.com/ekalinin/Dockerfile.vim)
- [ion](https://github.com/vmchale/ion-vim) (syntax, ftplugin) - [dosini](https://github.com/vim/vim/tree/master/runtime)
- [jasmine](https://github.com/glanotte/vim-jasmine) (syntax) - [elf](https://github.com/vim/vim/tree/master/runtime)
- [javascript](https://github.com/pangloss/vim-javascript) (syntax, indent, compiler, ftplugin, extras) - [elixir](https://github.com/elixir-lang/vim-elixir)
- [jenkins](https://github.com/martinda/Jenkinsfile-vim-syntax) (syntax, indent) - [elm](https://github.com/andys8/vim-elm-syntax)
- [jinja](https://github.com/lepture/vim-jinja) (syntax, indent) - [emberscript](https://github.com/yalesov/vim-ember-script)
- [json5](https://github.com/GutenYe/json5.vim) (syntax) - [emblem](https://github.com/yalesov/vim-emblem)
- [json](https://github.com/elzr/vim-json) (syntax, indent, ftplugin) - [erlang](https://github.com/vim-erlang/vim-erlang-runtime)
- [jst](https://github.com/briancollins/vim-jst) (syntax, indent) - [fennel](https://github.com/bakpakin/fennel.vim)
- [jsx](https://github.com/MaxMEllon/vim-jsx-pretty) (autoload, syntax, indent, ftplugin) - [ferm](https://github.com/vim-scripts/ferm.vim)
- [julia](https://github.com/JuliaEditorSupport/julia-vim) (syntax, indent, autoload, ftplugin) - [fish](https://github.com/georgewitteman/vim-fish)
- [kotlin](https://github.com/udalov/kotlin-vim) (syntax, indent, ftplugin) - [flatbuffers](https://github.com/dcharbon/vim-flatbuffers)
- [latex](https://github.com/LaTeX-Box-Team/LaTeX-Box) (syntax, indent, ftplugin) - [forth](https://github.com/vim/vim/tree/master/runtime)
- [less](https://github.com/groenewege/vim-less) (syntax, indent, ftplugin) - [fsharp](https://github.com/ionide/Ionide-vim)
- [lilypond](https://github.com/anowlcalledjosh/vim-lilypond) (syntax, indent, compiler, ftplugin) - [gdscript](https://github.com/calviken/vim-gdscript3)
- [livescript](https://github.com/gkz/vim-ls) (syntax, indent, compiler, ftplugin) - [git](https://github.com/tpope/vim-git)
- [llvm](https://github.com/rhysd/vim-llvm) (syntax, indent, ftplugin) - [glsl](https://github.com/tikhomirov/vim-glsl)
- [log](https://github.com/MTDL9/vim-log-highlighting) (syntax) - [gmpl](https://github.com/maelvalais/gmpl.vim)
- [lua](https://github.com/tbastos/vim-lua) (syntax, indent) - [gnuplot](https://github.com/vim-scripts/gnuplot-syntax-highlighting)
- [mako](https://github.com/sophacles/vim-bundle-mako) (syntax, indent, ftplugin) - [go](https://github.com/fatih/vim-go)
- [markdown](https://github.com/plasticboy/vim-markdown) (syntax, indent) - [gradle](https://github.com/tfnico/vim-gradle)
- [mathematica](https://github.com/voldikss/vim-mma) (syntax, ftplugin) - [graphql](https://github.com/jparise/vim-graphql)
- [mdx](https://github.com/jxnblk/vim-mdx-js) (syntax) - [groovy](https://github.com/vim/vim/tree/master/runtime)
- [meson](https://github.com/mesonbuild/meson) (syntax, indent, ftplugin) - [grub](https://github.com/vim/vim/tree/master/runtime)
- [moonscript](https://github.com/leafo/moonscript-vim) (syntax, indent, ftplugin) - [haml](https://github.com/sheerun/vim-haml)
- [nginx](https://github.com/chr4/nginx.vim) (syntax, indent, ftplugin) - [handlebars](https://github.com/sheerun/vim-mustache-handlebars)
- [nim](https://github.com/zah/nim.vim) (syntax, compiler, indent) - [haproxy](https://github.com/CH-DanReif/haproxy.vim)
- [nix](https://github.com/LnL7/vim-nix) (syntax, indent, compiler, ftplugin) - [haskell](https://github.com/neovimhaskell/haskell-vim)
- [objc](https://github.com/b4winckler/vim-objc) (ftplugin, syntax, indent) - [haxe](https://github.com/yaymukund/vim-haxe)
- [ocaml](https://github.com/rgrinberg/vim-ocaml) (syntax, indent, compiler, ftplugin) - [hcl](https://github.com/b4b4r07/vim-hcl)
- [octave](https://github.com/vim-scripts/octave.vim--) (syntax) - [helm](https://github.com/towolf/vim-helm)
- [opencl](https://github.com/petRUShka/vim-opencl) (syntax, indent, ftplugin) - [help](https://github.com/neovim/neovim/tree/master/runtime)
- [perl](https://github.com/vim-perl/vim-perl) (syntax, indent, ftplugin) - [hive](https://github.com/zebradil/hive.vim)
- [pgsql](https://github.com/lifepillar/pgsql.vim) (syntax, indent) - [html5](https://github.com/othree/html5.vim)
- [php](https://github.com/StanAngeloff/php.vim) (syntax) - [i3](https://github.com/mboughaba/i3config.vim)
- [plantuml](https://github.com/aklt/plantuml-syntax) (syntax, indent, ftplugin) - [icalendar](https://github.com/chutzpah/icalendar.vim)
- [pony](https://github.com/jakwings/vim-pony) (syntax, indent, autoload, ftplugin) - [idris2](https://github.com/edwinb/idris2-vim)
- [powershell](https://github.com/PProvost/vim-ps1) (syntax, indent, ftplugin) - [idris](https://github.com/idris-hackers/idris-vim)
- [protobuf](https://github.com/uarun/vim-protobuf) (syntax, indent) - [ion](https://github.com/vmchale/ion-vim)
- [pug](https://github.com/digitaltoad/vim-pug) (syntax, indent, ftplugin) - [javascript-sql](https://github.com/statico/vim-javascript-sql)
- [puppet](https://github.com/rodjek/vim-puppet) (syntax, indent, autoload, ftplugin) - [javascript](https://github.com/pangloss/vim-javascript)
- [purescript](https://github.com/purescript-contrib/purescript-vim) (syntax, indent, ftplugin) - [jenkins](https://github.com/martinda/Jenkinsfile-vim-syntax)
- [python-compiler](https://github.com/aliev/vim-compiler-python) (compiler, autoload) - [jinja](https://github.com/lepture/vim-jinja)
- [python-indent](https://github.com/Vimjas/vim-python-pep8-indent) (indent) - [jq](https://github.com/vito-c/jq.vim)
- [python](https://github.com/vim-python/python-syntax) (syntax) - [json5](https://github.com/GutenYe/json5.vim)
- [qmake](https://github.com/artoj/qmake-syntax-vim) (syntax) - [json](https://github.com/elzr/vim-json)
- [qml](https://github.com/peterhoeg/vim-qml) (syntax, indent, ftplugin) - [jsonnet](https://github.com/google/vim-jsonnet)
- [r-lang](https://github.com/vim-scripts/R.vim) (syntax) - [jst](https://github.com/briancollins/vim-jst)
- [racket](https://github.com/wlangstroth/vim-racket) (syntax, indent, ftplugin) - [jsx](https://github.com/MaxMEllon/vim-jsx-pretty)
- [ragel](https://github.com/jneen/ragel.vim) (syntax) - [julia](https://github.com/JuliaEditorSupport/julia-vim)
- [raml](https://github.com/IN3D/vim-raml) (syntax, ftplugin) - [kotlin](https://github.com/udalov/kotlin-vim)
- [reason](https://github.com/reasonml-editor/vim-reason-plus) (syntax, indent) - [ledger](https://github.com/ledger/vim-ledger)
- [rspec](https://github.com/sheerun/rspec.vim) (syntax) - [less](https://github.com/groenewege/vim-less)
- [rst](https://github.com/marshallward/vim-restructuredtext) (syntax, autoload, ftplugin) - [lilypond](https://github.com/anowlcalledjosh/vim-lilypond)
- [ruby](https://github.com/vim-ruby/vim-ruby) (syntax, indent, compiler, autoload, ftplugin) - [livescript](https://github.com/gkz/vim-ls)
- [rust](https://github.com/rust-lang/rust.vim) (syntax, indent, compiler, autoload, ftplugin) - [llvm](https://github.com/rhysd/vim-llvm)
- [sbt](https://github.com/derekwyatt/vim-sbt) (syntax) - [log](https://github.com/MTDL9/vim-log-highlighting)
- [scala](https://github.com/derekwyatt/vim-scala) (syntax, indent, compiler, ftplugin) - [lua](https://github.com/tbastos/vim-lua)
- [scss](https://github.com/cakebaker/scss-syntax.vim) (syntax, indent, ftplugin) - [m4](https://github.com/vim/vim/tree/master/runtime)
- [slim](https://github.com/slim-template/vim-slim) (syntax, indent, ftplugin) - [mako](https://github.com/sophacles/vim-bundle-mako)
- [slime](https://github.com/slime-lang/vim-slime-syntax) (syntax, indent) - [markdown](https://github.com/plasticboy/vim-markdown)
- [smt2](https://github.com/bohlender/vim-smt2) (syntax, autoload, ftplugin) - [mathematica](https://github.com/voldikss/vim-mma)
- [solidity](https://github.com/tomlion/vim-solidity) (syntax, indent, ftplugin) - [mdx](https://github.com/jxnblk/vim-mdx-js)
- [styled-components](https://github.com/styled-components/vim-styled-components#main) (after) - [meson](https://github.com/mesonbuild/meson/tree/master/data/syntax-highlighting/vim)
- [stylus](https://github.com/wavded/vim-stylus) (syntax, indent, ftplugin) - [moonscript](https://github.com/leafo/moonscript-vim)
- [svelte](https://github.com/evanleck/vim-svelte) (syntax, indent) - [murphi](https://github.com/vim/vim/tree/master/runtime)
- [svg-indent](https://github.com/jasonshell/vim-svg-indent) (indent) - [nginx](https://github.com/chr4/nginx.vim)
- [svg](https://github.com/vim-scripts/svg.vim) (syntax) - [nim](https://github.com/zah/nim.vim)
- [swift](https://github.com/keith/swift.vim) (syntax, indent, ftplugin) - [nix](https://github.com/LnL7/vim-nix)
- [sxhkd](https://github.com/baskerville/vim-sxhkdrc) (syntax) - [objc](https://github.com/b4winckler/vim-objc)
- [systemd](https://github.com/wgwoods/vim-systemd-syntax) (syntax) - [ocaml](https://github.com/rgrinberg/vim-ocaml)
- [terraform](https://github.com/hashivim/vim-terraform) (syntax, indent, autoload, ftplugin) - [octave](https://github.com/McSinyx/vim-octave)
- [textile](https://github.com/timcharper/textile.vim) (syntax, ftplugin) - [odin](https://github.com/Tetralux/odin.vim)
- [thrift](https://github.com/solarnz/thrift.vim) (syntax) - [opencl](https://github.com/petRUShka/vim-opencl)
- [tmux](https://github.com/ericpruitt/tmux.vim) (syntax, ftplugin) - [perl](https://github.com/vim-perl/vim-perl)
- [tomdoc](https://github.com/wellbredgrapefruit/tomdoc.vim) (syntax) - [pgsql](https://github.com/lifepillar/pgsql.vim)
- [toml](https://github.com/cespare/vim-toml) (syntax, ftplugin) - [php](https://github.com/StanAngeloff/php.vim)
- [tptp](https://github.com/c-cube/vim-tptp) (syntax) - [plantuml](https://github.com/aklt/plantuml-syntax)
- [twig](https://github.com/lumiliet/vim-twig) (syntax, indent, ftplugin) - [pony](https://github.com/jakwings/vim-pony)
- [typescript](https://github.com/HerringtonDarkholme/yats.vim) (syntax, indent, compiler, ftplugin) - [powershell](https://github.com/PProvost/vim-ps1)
- [vala](https://github.com/arrufat/vala.vim) (syntax, indent) - [protobuf](https://github.com/uarun/vim-protobuf)
- [vbnet](https://github.com/vim-scripts/vbnet.vim) (syntax) - [pug](https://github.com/digitaltoad/vim-pug)
- [vcl](https://github.com/smerrill/vcl-vim-plugin) (syntax) - [puppet](https://github.com/rodjek/vim-puppet)
- [vifm](https://github.com/vifm/vifm.vim) (syntax, autoload, ftplugin) - [purescript](https://github.com/purescript-contrib/purescript-vim)
- [vm](https://github.com/lepture/vim-velocity) (syntax, indent) - [python-compiler](https://github.com/aliev/vim-compiler-python)
- [vue](https://github.com/posva/vim-vue) (syntax, indent, ftplugin) - [python-indent](https://github.com/Vimjas/vim-python-pep8-indent)
- [xdc](https://github.com/amal-khailtash/vim-xdc-syntax) (syntax) - [python](https://github.com/vim-python/python-syntax)
- [xls](https://github.com/vim-scripts/XSLT-syntax) (syntax) - [qmake](https://github.com/artoj/qmake-syntax-vim)
- [xml](https://github.com/amadeus/vim-xml) (syntax) - [qml](https://github.com/peterhoeg/vim-qml)
- [yaml](https://github.com/stephpy/vim-yaml) (syntax, ftplugin) - [r-lang](https://github.com/vim-scripts/R.vim)
- [yard](https://github.com/sheerun/vim-yardoc) (syntax) - [racket](https://github.com/wlangstroth/vim-racket)
- [zephir](https://github.com/xwsoul/vim-zephir) (syntax) - [ragel](https://github.com/jneen/ragel.vim)
- [zig](https://github.com/ziglang/zig.vim) (syntax, autoload, ftplugin) - [raku](https://github.com/Raku/vim-raku)
- [raml](https://github.com/IN3D/vim-raml)
- [razor](https://github.com/adamclerk/vim-razor)
- [reason](https://github.com/reasonml-editor/vim-reason-plus)
- [requirements](https://github.com/raimon49/requirements.txt.vim)
- [rspec](https://github.com/keith/rspec.vim)
- [rst](https://github.com/marshallward/vim-restructuredtext)
- [ruby](https://github.com/vim-ruby/vim-ruby)
- [rust](https://github.com/rust-lang/rust.vim)
- [sbt](https://github.com/derekwyatt/vim-sbt)
- [scala](https://github.com/derekwyatt/vim-scala)
- [scss](https://github.com/cakebaker/scss-syntax.vim)
- [sh](https://github.com/arzg/vim-sh)
- [slim](https://github.com/slim-template/vim-slim)
- [slime](https://github.com/slime-lang/vim-slime-syntax)
- [smt2](https://github.com/bohlender/vim-smt2)
- [solidity](https://github.com/tomlion/vim-solidity)
- [stylus](https://github.com/wavded/vim-stylus)
- [svelte](https://github.com/evanleck/vim-svelte/tree/main)
- [svg-indent](https://github.com/jasonshell/vim-svg-indent)
- [svg](https://github.com/vim-scripts/svg.vim)
- [swift](https://github.com/keith/swift.vim)
- [sxhkd](https://github.com/baskerville/vim-sxhkdrc)
- [systemd](https://github.com/wgwoods/vim-systemd-syntax)
- [terraform](https://github.com/hashivim/vim-terraform)
- [textile](https://github.com/timcharper/textile.vim)
- [thrift](https://github.com/solarnz/thrift.vim)
- [tmux](https://github.com/ericpruitt/tmux.vim/tree/master/vim)
- [toml](https://github.com/cespare/vim-toml)
- [tptp](https://github.com/c-cube/vim-tptp)
- [trasys](https://github.com/vim/vim/tree/master/runtime)
- [twig](https://github.com/lumiliet/vim-twig)
- [typescript](https://github.com/HerringtonDarkholme/yats.vim)
- [unison](https://github.com/unisonweb/unison/tree/trunk/editor-support/vim)
- [v](https://github.com/ollykel/v-vim)
- [vala](https://github.com/arrufat/vala.vim)
- [vbnet](https://github.com/vim-scripts/vbnet.vim)
- [vcl](https://github.com/smerrill/vcl-vim-plugin)
- [velocity](https://github.com/lepture/vim-velocity)
- [visual-basic](https://github.com/vim/vim/tree/master/runtime)
- [vmasm](https://github.com/vim/vim/tree/master/runtime)
- [vue](https://github.com/posva/vim-vue)
- [xdc](https://github.com/amal-khailtash/vim-xdc-syntax)
- [xml](https://github.com/amadeus/vim-xml)
- [xsl](https://github.com/vim-scripts/XSLT-syntax)
- [yaml](https://github.com/vim/vim/tree/df44a27b53586fccfc6a3aedc89061fdd9a515ff/runtime)
- [yard](https://github.com/sheerun/vim-yardoc)
- [zephir](https://github.com/xwsoul/vim-zephir)
- [zig](https://github.com/ziglang/zig.vim)
- [zinit](https://github.com/zinit-zsh/zplugin-vim-syntax)
<!--/Language Packs--> <!--/Language Packs-->
## Updating ## Updating
You can either wait for new patch release with updates or run the `./build` script by yourself. You can either wait for new patch release with updates or run `make` by yourself.
## Troubleshooting ## Troubleshooting
Please make sure you have `syntax on` in your `.vimrc`, otherwise syntax files are not loaded at all. Please make sure you have `syntax on` in your `.vimrc` (or use something like [sheerun/vimrc](https://github.com/sheerun/vimrc))
Individual language packs can be disabled by setting `g:polyglot_disabled` as follows: Individual language packs can be disabled by setting `g:polyglot_disabled` as follows:
```viml ```vim
" ~/.vimrc
let g:polyglot_disabled = ['css'] 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. *Please declare this variable before polyglot is loaded (at the top of .vimrc)*
Please note that disabling a language won't make in your vim startup any faster / slower (only for specific this specific filetype). All plugins are loaded lazily, on demand.
Vim Polyglot tries to automatically detect indentation settings (just like vim-sleuth). If this feature is not working for you for some reason, please file an issue and disable it temporarily with:
```vim
let g:polyglot_disabled = ['autoindent']
```
## Contributing ## Contributing
Language packs are periodically updated using automated `build` script. Language packs are periodically updated using automated `scripts/build` script.
Feel free to add your language, and send pull-request. In your pull request, please include: Feel free to add your language to `packages.yaml` + `heuristics.yaml`, and send pull-request. You can run `make test` to run rough tests. And `make dev` for easy development.
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. This repository is MIT-licensed.

View File

@@ -1,21 +0,0 @@
if exists('g:polyglot_disabled') && index(g:polyglot_disabled, 'styled-components') != -1
finish
endif
" Vim completion script
" Language: styled-components (js/ts)
" Maintainer: Karl Fleischmann <fleischmann.karl@gmail.com>
" URL: https://github.com/styled-components/vim-styled-components
fun! styledcomplete#CompleteSC(findstart, base)
if IsStyledDefinition(line('.'))
return csscomplete#CompleteCSS(a:findstart, a:base)
endif
" Only trigger original omnifunc if it was set in the first place
if exists('b:prevofu')
" create a funcref to call with the previous omnicomplete function
let s:funcref = function(b:prevofu)
return s:funcref(a:findstart, a:base)
endif
endfun

View File

@@ -1,7 +1,7 @@
if exists('g:polyglot_disabled') && index(g:polyglot_disabled, 'haskell') != -1 if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'haskell') == -1
finish
endif
setlocal comments=s1fl:{-,mb:-,ex:-},:-- setlocal comments=s1fl:{-,mb:-,ex:-},:--
setlocal iskeyword+=-,.,* setlocal iskeyword+=-,.,*
setlocal commentstring=--\ %s setlocal commentstring=--\ %s
endif

View File

@@ -1,9 +1,9 @@
if exists('g:polyglot_disabled') && index(g:polyglot_disabled, 'cjsx') != -1 if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'cjsx') == -1
finish
endif
if exists("loaded_matchit") if exists("loaded_matchit")
let b:match_ignorecase = 0 let b:match_ignorecase = 0
let b:match_words = '(:),\[:\],{:},<:>,' . let b:match_words = '(:),\[:\],{:},<:>,' .
\ '<\@<=\([^/][^ \t>]*\)[^>]*\%(>\|$\):<\@<=/\1>' \ '<\@<=\([^/][^ \t>]*\)[^>]*\%(>\|$\):<\@<=/\1>'
endif endif
endif

View File

@@ -1,6 +1,6 @@
if exists('g:polyglot_disabled') && index(g:polyglot_disabled, 'haskell') != -1 if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'haskell') == -1
finish
endif
setlocal comments=s1fl:{-,mb:\ \ ,ex:-},:-- setlocal comments=s1fl:{-,mb:\ \ ,ex:-},:--
setlocal iskeyword+=' setlocal iskeyword+='
endif

View File

@@ -1,5 +1,5 @@
if exists('g:polyglot_disabled') && index(g:polyglot_disabled, 'idris') != -1 if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'idris') == -1
finish
endif
setlocal iskeyword+=' setlocal iskeyword+='
endif

View File

@@ -0,0 +1,5 @@
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'idris2') == -1
setlocal iskeyword+='
endif

View File

@@ -0,0 +1,16 @@
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'javascript') == -1
" Vim filetype plugin file
" Language: JavaScript
" Maintainer: vim-javascript community
" URL: https://github.com/pangloss/vim-javascript
setlocal iskeyword+=$ suffixesadd+=.js
if exists('b:undo_ftplugin')
let b:undo_ftplugin .= ' | setlocal iskeyword< suffixesadd<'
else
let b:undo_ftplugin = 'setlocal iskeyword< suffixesadd<'
endif
endif

View File

@@ -0,0 +1,9 @@
if !exists('g:polyglot_disabled') || (index(g:polyglot_disabled, 'javascript') == -1 && index(g:polyglot_disabled, 'jsx') == -1)
if get(g:, 'vim_jsx_pretty_disable_js', 0)
finish
endif
source <sfile>:h/jsx.vim
endif

View File

@@ -1,92 +1,3 @@
if exists('g:polyglot_disabled') && index(g:polyglot_disabled, 'javascript') != -1 " Polyglot metafile
finish source <sfile>:h/javascript-1.vim
endif source <sfile>:h/javascript-2.vim
" 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
if exists('g:polyglot_disabled') && (index(g:polyglot_disabled, 'typescript') != -1 || index(g:polyglot_disabled, 'typescript') != -1 || index(g:polyglot_disabled, 'jsx') != -1)
finish
endif
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" 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
if exists('g:polyglot_disabled') && index(g:polyglot_disabled, 'styled-components') != -1
finish
endif
" Vim filetype plugin file
" Language: styled-components (js/ts)
" Maintainer: Karl Fleischmann <fleischmann.karl@gmail.com>
" URL: https://github.com/styled-components/vim-styled-components
fu! s:GetSyntaxNames(lnum, cnum)
return map(synstack(a:lnum, a:cnum), 'synIDattr(v:val, "name")')
endfu
" re-implement SynSOL of vim-jsx
fu! s:SynSOL(lnum)
return s:GetSyntaxNames(a:lnum, 1)
endfu
"" Return whether the current line is a jsTemplateString
fu! IsStyledDefinition(lnum)
" iterate through all syntax items in the given line
for item in s:SynSOL(a:lnum)
" if syntax-item is a jsTemplateString return 1 - true
" `==#` is a match case comparison of the item
if item ==# 'styledDefinition'
return 1
endif
endfor
" fallback to 0 - false
return 0
endfu
if exists('&ofu')
if &ofu
" Do not keep track of previous omnifunc if it was not set in the first
" place
let b:prevofu=&ofu
endif
setl omnifunc=styledcomplete#CompleteSC
endif

View File

@@ -0,0 +1,5 @@
if !exists('g:polyglot_disabled') || (index(g:polyglot_disabled, 'javascript') == -1 && index(g:polyglot_disabled, 'jsx') == -1)
source <sfile>:h/jsx.vim
endif

35
after/ftplugin/jsx.vim Normal file
View File

@@ -0,0 +1,35 @@
if !exists('g:polyglot_disabled') || (index(g:polyglot_disabled, 'javascript') == -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:jsx_pretty_old_cms = &l:commentstring
augroup jsx_comment
autocmd! CursorMoved <buffer>
autocmd CursorMoved <buffer> call jsx_pretty#comment#update_commentstring(b:jsx_pretty_old_cms)
augroup end
setlocal suffixesadd+=.jsx
endif

View File

@@ -1,6 +1,4 @@
if exists('g:polyglot_disabled') && index(g:polyglot_disabled, 'llvm') != -1 if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'llvm') == -1
finish
endif
" Copyright (c) 2018 rhysd " Copyright (c) 2018 rhysd
" "
@@ -59,7 +57,7 @@ function! s:is_section_delim(line, func_delim) abort
return 0 return 0
endif endif
let kind = sec[0] let kind = sec[0]
return kind == s:KIND_BLOCK_PREC || kind == s:KIND_BLOCK_FOLLOW || kind == func_delim return kind == s:KIND_BLOCK_PREC || kind == s:KIND_BLOCK_FOLLOW || kind == a:func_delim
endfunction endfunction
function! s:next_section(stop_func_begin) abort function! s:next_section(stop_func_begin) abort
@@ -87,11 +85,16 @@ function! s:prev_section(stop_func_begin) abort
endwhile endwhile
endfunction endfunction
nnoremap <buffer><Plug>(llvm-next-section-begin) :<C-u>call <SID>next_section(1)<CR>
nnoremap <buffer><Plug>(llvm-prev-section-begin) :<C-u>call <SID>prev_section(1)<CR>
nnoremap <buffer><Plug>(llvm-next-section-end) :<C-u>call <SID>next_section(0)<CR>
nnoremap <buffer><Plug>(llvm-prev-section-end) :<C-u>call <SID>prev_section(0)<CR>
if !g:llvm_ext_no_mapping if !g:llvm_ext_no_mapping
nnoremap <buffer><silent>]] :<C-u>call <SID>next_section(1)<CR> nmap <buffer><silent>]] <Plug>(llvm-next-section-begin)
nnoremap <buffer><silent>[[ :<C-u>call <SID>prev_section(1)<CR> nmap <buffer><silent>[[ <Plug>(llvm-prev-section-begin)
nnoremap <buffer><silent>][ :<C-u>call <SID>next_section(0)<CR> nmap <buffer><silent>][ <Plug>(llvm-next-section-end)
nnoremap <buffer><silent>[] :<C-u>call <SID>prev_section(0)<CR> nmap <buffer><silent>[] <Plug>(llvm-prev-section-end)
endif endif
function! s:function_range_at(linum) abort function! s:function_range_at(linum) abort
@@ -224,9 +227,12 @@ function! s:move_to_following_block() abort
endtry endtry
endfunction endfunction
nnoremap <buffer><Plug>(llvm-move-block-prev) :<C-u>call <SID>move_to_pred_block()<CR>
nnoremap <buffer><Plug>(llvm-move-block-next) :<C-u>call <SID>move_to_following_block()<CR>
if !g:llvm_ext_no_mapping if !g:llvm_ext_no_mapping
nnoremap <buffer><silent>[b :<C-u>call <SID>move_to_pred_block()<CR> nmap <buffer><silent>[b <Plug>(llvm-move-block-prev)
nnoremap <buffer><silent>]b :<C-u>call <SID>move_to_following_block()<CR> nmap <buffer><silent>]b <Plug>(llvm-move-block-next)
endif endif
function! s:get_func_identifiers(line) abort function! s:get_func_identifiers(line) abort
@@ -440,8 +446,10 @@ function! s:goto_definition() abort
echom "No definition for '" . ident . "' found" echom "No definition for '" . ident . "' found"
endfunction endfunction
nnoremap <buffer><Plug>(llvm-goto-definition) :<C-u>call <SID>goto_definition()<CR>
if !g:llvm_ext_no_mapping if !g:llvm_ext_no_mapping
nnoremap <buffer><silent>K :<C-u>call <SID>goto_definition()<CR> nmap <buffer><silent>K <Plug>(llvm-goto-definition)
endif endif
function! s:run_lli(...) abort function! s:run_lli(...) abort
@@ -475,3 +483,5 @@ endfunction
if !exists(':LLI') if !exists(':LLI')
command! -buffer -nargs=? -bar -complete=file LLI call <SID>run_lli(<f-args>) command! -buffer -nargs=? -bar -complete=file LLI call <SID>run_lli(<f-args>)
endif endif
endif

View File

@@ -1,6 +1,4 @@
if exists('g:polyglot_disabled') && index(g:polyglot_disabled, 'puppet') != -1 if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'puppet') == -1
finish
endif
if !exists('g:puppet_align_hashes') if !exists('g:puppet_align_hashes')
let g:puppet_align_hashes = 1 let g:puppet_align_hashes = 1
@@ -9,3 +7,5 @@ endif
if g:puppet_align_hashes if g:puppet_align_hashes
inoremap <buffer> <silent> => =><Esc>:call puppet#align#AlignHashrockets()<CR>$a inoremap <buffer> <silent> => =><Esc>:call puppet#align#AlignHashrockets()<CR>$a
endif endif
endif

View File

@@ -1,9 +1,12 @@
if exists('g:polyglot_disabled') && (index(g:polyglot_disabled, 'typescript') != -1 || index(g:polyglot_disabled, 'typescript') != -1 || index(g:polyglot_disabled, 'jsx') != -1) if !exists('g:polyglot_disabled') || (index(g:polyglot_disabled, 'javascript') == -1 && index(g:polyglot_disabled, 'jsx') == -1)
finish
endif
" modified from html.vim " modified from html.vim
" For matchit plugin " For matchit plugin
if get(g:, 'vim_jsx_pretty_disable_tsx', 0)
finish
endif
if exists("loaded_matchit") if exists("loaded_matchit")
let b:match_ignorecase = 0 let b:match_ignorecase = 0
let b:match_words = '(:),\[:\],{:},<:>,' . let b:match_words = '(:),\[:\],{:},<:>,' .
@@ -17,15 +20,13 @@ if exists("loaded_matchup")
let b:match_skip = 's:comment\|string' let b:match_skip = 's:comment\|string'
endif endif
let b:original_commentstring = &l:commentstring let b:jsx_pretty_old_cms = &l:commentstring
augroup jsx_comment augroup jsx_comment
autocmd! CursorMoved <buffer> autocmd! CursorMoved <buffer>
autocmd CursorMoved <buffer> call jsx_pretty#comment#update_commentstring(b:original_commentstring) autocmd CursorMoved <buffer> call jsx_pretty#comment#update_commentstring(b:jsx_pretty_old_cms)
augroup end augroup end
setlocal suffixesadd+=.tsx setlocal suffixesadd+=.tsx
if exists('g:polyglot_disabled') && index(g:polyglot_disabled, 'styled-components') != -1
finish
endif
endif

View File

@@ -0,0 +1,5 @@
if !exists('g:polyglot_disabled') || (index(g:polyglot_disabled, 'javascript') == -1 && index(g:polyglot_disabled, 'jsx') == -1)
source <sfile>:h/tsx.vim
endif

View File

@@ -1,11 +0,0 @@
if exists('g:polyglot_disabled') && index(g:polyglot_disabled, 'yaml') != -1
finish
endif
" 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:

View File

@@ -1,206 +1,9 @@
if exists('g:polyglot_disabled') && (index(g:polyglot_disabled, 'typescript') != -1 || index(g:polyglot_disabled, 'typescript') != -1 || index(g:polyglot_disabled, 'jsx') != -1) if !exists('g:polyglot_disabled') || (index(g:polyglot_disabled, 'javascript') == -1 && index(g:polyglot_disabled, 'jsx') == -1)
if get(g:, 'vim_jsx_pretty_disable_js', 0)
finish finish
endif endif
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" source <sfile>:h/jsx.vim
" 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 endif
let s:keepcpo = &cpo
set cpo&vim
if exists('s:did_indent')
let b:did_indent = s:did_indent
endif
setlocal indentexpr=GetJsxIndent()
setlocal indentkeys=0{,0},0),0],0\,,!^F,o,O,e,*<Return>,<>>,<<>,/
function! GetJsxIndent()
return jsx_pretty#indent#get(function('GetJavascriptIndent'))
endfunction
let &cpo = s:keepcpo
unlet s:keepcpo
if exists('g:polyglot_disabled') && index(g:polyglot_disabled, 'styled-components') != -1
finish
endif
" Vim syntax file
" Language: styled-components (js/ts)
" Maintainer: Karl Fleischmann <fleischmann.karl@gmail.com>
" URL: https://github.com/styled-components/vim-styled-components
" initialize variable to check, if the indentation expression is run
" multiple times in a row, which indicates an infinite recursion
let s:is_recursion = 0
" store current indentexpr for later
let b:js_ts_indent=&indentexpr
" set indentexpr for this filetype (styled-components)
setlocal indentexpr=GetStyledIndent()
" add the following keys to trigger reindenting, when in insert mode
" - *; - Indent and insert on press of ';' key.
" - *<:> - Indent and insert on press of ':' key.
set indentkeys+=*;,*<:>,*<Return>
fu! s:GetSyntaxNames(lnum, cnum)
return map(synstack(a:lnum, a:cnum), 'synIDattr(v:val, "name")')
endfu
" re-implement SynSOL of vim-jsx
" TODO: add dependency to the readme and remove duplicate implementation
fu! s:SynSOL(lnum)
return s:GetSyntaxNames(a:lnum, 1)
endfu
" re-implement SynEOL of vim-jsx
" TODO: add dependency to the readme and remove duplicate implementation
fu! s:SynEOL(lnum, offset)
let l:lnum = prevnonblank(a:lnum)
let l:col = strlen(getline(l:lnum))
return s:GetSyntaxNames(l:lnum, l:col + a:offset)
endfu
"" Return whether the current line is a jsTemplateString
fu! s:IsStyledDefinition(lnum)
" iterate through all syntax items in the given line
for item in s:SynSOL(a:lnum)
" if syntax-item is a jsTemplateString return 1 - true
" `==#` is a match case comparison of the item
if item ==# 'styledDefinition'
return 1
endif
endfor
" fallback to 0 - false
return 0
endfu
"" Count occurences of `str` at the beginning of the given `lnum` line
fu! s:CountOccurencesInSOL(lnum, str)
let l:occurence = 0
" iterate through all items in the given line
for item in s:SynSOL(a:lnum)
" if the syntax-item equals the given str increment the counter
" `==?` is a case isensitive equal operation
if item ==? a:str
let l:occurence += 1
endif
endfor
" return the accumulated count of occurences
return l:occurence
endfu
"" Count occurences of `str` at the end of the given `lnum` line
fu! s:CountOccurencesInEOL(lnum, str, offset)
let l:occurence = 0
" iterate through all items in the given line
for item in s:SynEOL(a:lnum, a:offset)
" if the syntax-item equals the given str increment the counter
" `==?` is a case insensitive equal operation
if item == a:str
let l:occurence += 1
endif
endfor
" return the accumulated count of occurences
return l:occurence
endfu
"" Get the indentation of the current line
fu! GetStyledIndent()
if s:IsStyledDefinition(v:lnum)
let l:baseIndent = 0
" find last non-styled line
let l:cnum = v:lnum
while s:IsStyledDefinition(l:cnum)
let l:cnum -= 1
endwhile
" get indentation of the last non-styled line as base indentation
let l:baseIndent = indent(l:cnum)
" incrementally build indentation based on current indentation
" - one shiftwidth for the styled definition region
" - one shiftwidth per open nested definition region
let l:styledIndent = &sw
let l:styledIndent += min([
\ s:CountOccurencesInSOL(v:lnum, 'styledNestedRegion'),
\ s:CountOccurencesInEOL(v:lnum, 'styledNestedRegion', 0)
\ ]) * &sw
" decrease indentation by one shiftwidth, if the styled definition
" region ends on the current line
" - either directly via styled definition region, or
" - if the very last
if s:CountOccurencesInEOL(v:lnum, 'styledDefinition', 1) == 0
let l:styledIndent -= &sw
endif
" return the base indentation
" (for nested styles inside classes/objects/etc.) plus the actual
" indentation inside the styled definition region
return l:baseIndent + l:styledIndent
elseif len(b:js_ts_indent)
let l:result = 0
let l:offset = 0
" increase indentation by one shiftwidth, if the last line ended on a
" styledXmlRegion and this line does not continue with it
" this is a fix for an incorrectly indented xml prop after a
" glamor-styled styledXmlRegion
if s:CountOccurencesInEOL(v:lnum-1, 'styledXmlRegion', 0) == 1 &&
\ s:CountOccurencesInSOL(v:lnum, 'styledXmlRegion') == 0
let l:offset = &sw
endif
" make sure `GetStyledIndent` and `GetJsxIndent` don't infinitely
" recurse by incrementing a counter variable, before evaluating the
" stored indent expression
if s:is_recursion == 0
let s:is_recursion = 1
let l:result = eval(b:js_ts_indent)
endif
" `is_recursion` being 0 at this point indicates, that
" `eval(b:js_ts_indent)` did itself evaluate it's stored indentexpr
" and thus it can be assumed, that the current line should be
" indented as JS
if s:is_recursion == 0
" use one of `GetJavascriptIndent` or `GetJsIndent` if existing
" fallback to cindent, if not
if exists('*GetJavascriptIndent')
let l:result = GetJavascriptIndent()
elseif exists('*GetJsIndent')
let l:result = GetJsIndent()
else
let l:result = cindent(v:lnum)
endif
endif
" reset `is_recursion` counter and return the indentation value
let s:is_recursion = 0
return l:result + l:offset
endif
" if all else fails indent according to C-syntax
return cindent(v:lnum)
endfu

View File

@@ -0,0 +1,5 @@
if !exists('g:polyglot_disabled') || (index(g:polyglot_disabled, 'javascript') == -1 && index(g:polyglot_disabled, 'jsx') == -1)
source <sfile>:h/jsx.vim
endif

View File

@@ -1,5 +1,33 @@
if exists('g:polyglot_disabled') && index(g:polyglot_disabled, 'styled-components') != -1 if !exists('g:polyglot_disabled') || (index(g:polyglot_disabled, 'javascript') == -1 && index(g:polyglot_disabled, 'jsx') == -1)
finish
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" 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 endif
runtime! indent/javascript.vim 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

View File

@@ -1,6 +1,4 @@
if exists('g:polyglot_disabled') && index(g:polyglot_disabled, 'objc') != -1 if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'objc') == -1
finish
endif
" Vim indent file " Vim indent file
" Language: Objective-C " Language: Objective-C
@@ -95,3 +93,5 @@ endfunction
" Restore 'cpo' options " Restore 'cpo' options
let &cpo = s:save_cpo let &cpo = s:save_cpo
unlet s:save_cpo unlet s:save_cpo
endif

View File

@@ -1,6 +1,4 @@
if exists('g:polyglot_disabled') && (index(g:polyglot_disabled, 'typescript') != -1 || index(g:polyglot_disabled, 'typescript') != -1 || index(g:polyglot_disabled, 'jsx') != -1) if !exists('g:polyglot_disabled') || (index(g:polyglot_disabled, 'javascript') == -1 && index(g:polyglot_disabled, 'jsx') == -1)
finish
endif
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" Vim indent file " Vim indent file
@@ -11,6 +9,10 @@ endif
" "
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
if get(g:, 'vim_jsx_pretty_disable_tsx', 0)
finish
endif
if exists('b:did_indent') if exists('b:did_indent')
let s:did_indent = b:did_indent let s:did_indent = b:did_indent
unlet b:did_indent unlet b:did_indent
@@ -23,8 +25,10 @@ if exists('s:did_indent')
let b:did_indent = s:did_indent let b:did_indent = s:did_indent
endif endif
runtime! indent/typescript.vim
setlocal indentexpr=GetJsxIndent() setlocal indentexpr=GetJsxIndent()
setlocal indentkeys=0{,0},0),0],0\,,!^F,o,O,e,*<Return>,<>>,<<>,/ setlocal indentkeys=0.,0{,0},0),0],0?,0\*,0\,,!^F,:,<:>,o,O,e,<>>,=*/
function! GetJsxIndent() function! GetJsxIndent()
return jsx_pretty#indent#get(function('GetTypescriptIndent')) return jsx_pretty#indent#get(function('GetTypescriptIndent'))
@@ -32,8 +36,5 @@ endfunction
let &cpo = s:keepcpo let &cpo = s:keepcpo
unlet s:keepcpo unlet s:keepcpo
if exists('g:polyglot_disabled') && index(g:polyglot_disabled, 'styled-components') != -1
finish
endif
runtime! indent/javascript.vim endif

View File

@@ -0,0 +1,5 @@
if !exists('g:polyglot_disabled') || (index(g:polyglot_disabled, 'javascript') == -1 && index(g:polyglot_disabled, 'jsx') == -1)
source <sfile>:h/tsx.vim
endif

View File

@@ -1,308 +0,0 @@
if exists('g:polyglot_disabled') && index(g:polyglot_disabled, 'c++11') != -1
finish
endif
" Vim syntax file
" Language: C Additions
" Maintainer: Jon Haggblad <jon@haeggblad.com>
" Contributor: Mikhail Wolfson <mywolfson@gmail.com>
" URL: http://www.haeggblad.com
" Last Change: 6 Sep 2014
" Version: 0.3
" Changelog:
" 0.3 - integration of aftersyntaxc.vim
" 0.2 - Cleanup
" 0.1 - initial version.
"
" Syntax highlighting for functions in C.
"
" Based on:
" http://stackoverflow.com/questions/736701/class-function-names-highlighting-in-vim
" -----------------------------------------------------------------------------
" Highlight function names.
" -----------------------------------------------------------------------------
if !exists('g:cpp_no_function_highlight')
syn match cCustomParen transparent "(" contains=cParen contains=cCppParen
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
" -----------------------------------------------------------------------------
" Source: aftersyntaxc.vim
" -----------------------------------------------------------------------------
" Common ANSI-standard functions
syn keyword cAnsiFunction MULU_ DIVU_ MODU_ MUL_ DIV_ MOD_
syn keyword cAnsiFunction main typeof
syn keyword cAnsiFunction open close read write lseek dup dup2
syn keyword cAnsiFunction fcntl ioctl
syn keyword cAnsiFunction wctrans towctrans towupper
syn keyword cAnsiFunction towlower wctype iswctype
syn keyword cAnsiFunction iswxdigit iswupper iswspace
syn keyword cAnsiFunction iswpunct iswprint iswlower
syn keyword cAnsiFunction iswgraph iswdigit iswcntrl
syn keyword cAnsiFunction iswalpha iswalnum wcsrtombs
syn keyword cAnsiFunction mbsrtowcs wcrtomb mbrtowc
syn keyword cAnsiFunction mbrlen mbsinit wctob
syn keyword cAnsiFunction btowc wcsfxtime wcsftime
syn keyword cAnsiFunction wmemset wmemmove wmemcpy
syn keyword cAnsiFunction wmemcmp wmemchr wcstok
syn keyword cAnsiFunction wcsstr wcsspn wcsrchr
syn keyword cAnsiFunction wcspbrk wcslen wcscspn
syn keyword cAnsiFunction wcschr wcsxfrm wcsncmp
syn keyword cAnsiFunction wcscoll wcscmp wcsncat
syn keyword cAnsiFunction wcscat wcsncpy wcscpy
syn keyword cAnsiFunction wcstoull wcstoul wcstoll
syn keyword cAnsiFunction wcstol wcstold wcstof
syn keyword cAnsiFunction wcstod ungetwc putwchar
syn keyword cAnsiFunction putwc getwchar getwc
syn keyword cAnsiFunction fwide fputws fputwc
syn keyword cAnsiFunction fgetws fgetwc wscanf
syn keyword cAnsiFunction wprintf vwscanf vwprintf
syn keyword cAnsiFunction vswscanf vswprintf vfwscanf
syn keyword cAnsiFunction vfwprintf swscanf swprintf
syn keyword cAnsiFunction fwscanf fwprintf zonetime
syn keyword cAnsiFunction strfxtime strftime localtime
syn keyword cAnsiFunction gmtime ctime asctime
syn keyword cAnsiFunction time mkxtime mktime
syn keyword cAnsiFunction difftime clock strlen
syn keyword cAnsiFunction strerror memset strtok
syn keyword cAnsiFunction strstr strspn strrchr
syn keyword cAnsiFunction strpbrk strcspn strchr
syn keyword cAnsiFunction memchr strxfrm strncmp
syn keyword cAnsiFunction strcoll strcmp memcmp
syn keyword cAnsiFunction strncat strcat strncpy
syn keyword cAnsiFunction strcpy memmove memcpy
syn keyword cAnsiFunction wcstombs mbstowcs wctomb
syn keyword cAnsiFunction mbtowc mblen lldiv
syn keyword cAnsiFunction ldiv div llabs
syn keyword cAnsiFunction labs abs qsort
"syn keyword cAnsiFunction bsearch system getenv
syn keyword cAnsiFunction bsearch getenv
syn keyword cAnsiFunction exit atexit abort
syn keyword cAnsiFunction realloc malloc free
syn keyword cAnsiFunction calloc srand rand
syn keyword cAnsiFunction strtoull strtoul strtoll
syn keyword cAnsiFunction strtol strtold strtof
syn keyword cAnsiFunction strtod atoll atol
syn keyword cAnsiFunction atoi atof perror
syn keyword cAnsiFunction ferror feof clearerr
syn keyword cAnsiFunction rewind ftell fsetpos
syn keyword cAnsiFunction fseek fgetpos fwrite
syn keyword cAnsiFunction fread ungetc puts
syn keyword cAnsiFunction putchar putc gets
syn keyword cAnsiFunction getchar getc fputs
syn keyword cAnsiFunction fputc fgets fgetc
syn keyword cAnsiFunction vsscanf vsprintf vsnprintf
syn keyword cAnsiFunction vscanf vprintf vfscanf
syn keyword cAnsiFunction vfprintf sscanf sprintf
syn keyword cAnsiFunction snprintf scanf printf
syn keyword cAnsiFunction fscanf fprintf setvbuf
syn keyword cAnsiFunction setbuf freopen fopen
syn keyword cAnsiFunction fflush fclose tmpnam
syn keyword cAnsiFunction tmpfile rename remove
syn keyword cAnsiFunction offsetof va_start va_end
syn keyword cAnsiFunction va_copy va_arg raise signal
syn keyword cAnsiFunction longjmp setjmp isunordered
syn keyword cAnsiFunction islessgreater islessequal isless
syn keyword cAnsiFunction isgreaterequal isgreater fmal
syn keyword cAnsiFunction fmaf fma fminl
syn keyword cAnsiFunction fminf fmin fmaxl
syn keyword cAnsiFunction fmaxf fmax fdiml
syn keyword cAnsiFunction fdimf fdim nextafterxl
syn keyword cAnsiFunction nextafterxf nextafterx nextafterl
syn keyword cAnsiFunction nextafterf nextafter nanl
syn keyword cAnsiFunction nanf nan copysignl
syn keyword cAnsiFunction copysignf copysign remquol
syn keyword cAnsiFunction remquof remquo remainderl
syn keyword cAnsiFunction remainderf remainder fmodl
syn keyword cAnsiFunction fmodf fmod truncl
syn keyword cAnsiFunction truncf trunc llroundl
syn keyword cAnsiFunction llroundf llround lroundl
syn keyword cAnsiFunction lroundf lround roundl
syn keyword cAnsiFunction roundf round llrintl
syn keyword cAnsiFunction llrintf llrint lrintl
syn keyword cAnsiFunction lrintf lrint rintl
syn keyword cAnsiFunction rintf rint nearbyintl
syn keyword cAnsiFunction nearbyintf nearbyint floorl
syn keyword cAnsiFunction floorf floor ceill
syn keyword cAnsiFunction ceilf ceil tgammal
syn keyword cAnsiFunction tgammaf tgamma lgammal
syn keyword cAnsiFunction lgammaf lgamma erfcl
syn keyword cAnsiFunction erfcf erfc erfl
syn keyword cAnsiFunction erff erf sqrtl
syn keyword cAnsiFunction sqrtf sqrt powl
syn keyword cAnsiFunction powf pow hypotl
syn keyword cAnsiFunction hypotf hypot fabsl
syn keyword cAnsiFunction fabsf fabs cbrtl
syn keyword cAnsiFunction cbrtf cbrt scalblnl
syn keyword cAnsiFunction scalblnf scalbln scalbnl
syn keyword cAnsiFunction scalbnf scalbn modfl
syn keyword cAnsiFunction modff modf logbl
syn keyword cAnsiFunction logbf logb log2l
syn keyword cAnsiFunction log2f log2 log1pl
syn keyword cAnsiFunction log1pf log1p log10l
syn keyword cAnsiFunction log10f log10 logl
syn keyword cAnsiFunction logf log ldexpl
syn keyword cAnsiFunction ldexpf ldexp ilogbl
syn keyword cAnsiFunction ilogbf ilogb frexpl
syn keyword cAnsiFunction frexpf frexp expm1l
syn keyword cAnsiFunction expm1f expm1 exp2l
syn keyword cAnsiFunction exp2f exp2 expl
syn keyword cAnsiFunction expf exp tanhl
syn keyword cAnsiFunction tanhf tanh sinhl
syn keyword cAnsiFunction sinhf sinh coshl
syn keyword cAnsiFunction coshf cosh atanhl
syn keyword cAnsiFunction atanhf atanh asinhl
syn keyword cAnsiFunction asinhf asinh acoshl
syn keyword cAnsiFunction acoshf acosh tanl
syn keyword cAnsiFunction tanf tan sinl
syn keyword cAnsiFunction sinf sin cosl
syn keyword cAnsiFunction cosf cos atan2l
syn keyword cAnsiFunction atan2f atan2 atanl
syn keyword cAnsiFunction atanf atan asinl
syn keyword cAnsiFunction asinf asin acosl
syn keyword cAnsiFunction acosf acos signbit
syn keyword cAnsiFunction isnormal isnan isinf
syn keyword cAnsiFunction isfinite fpclassify localeconv
syn keyword cAnsiFunction setlocale wcstoumax wcstoimax
syn keyword cAnsiFunction strtoumax strtoimax feupdateenv
syn keyword cAnsiFunction fesetenv feholdexcept fegetenv
syn keyword cAnsiFunction fesetround fegetround fetestexcept
syn keyword cAnsiFunction fesetexceptflag feraiseexcept fegetexceptflag
syn keyword cAnsiFunction feclearexcept toupper tolower
syn keyword cAnsiFunction isxdigit isupper isspace
syn keyword cAnsiFunction ispunct isprint islower
syn keyword cAnsiFunction isgraph isdigit iscntrl
syn keyword cAnsiFunction isalpha isalnum creall
syn keyword cAnsiFunction crealf creal cprojl
syn keyword cAnsiFunction cprojf cproj conjl
syn keyword cAnsiFunction conjf conj cimagl
syn keyword cAnsiFunction cimagf cimag cargl
syn keyword cAnsiFunction cargf carg csqrtl
syn keyword cAnsiFunction csqrtf csqrt cpowl
syn keyword cAnsiFunction cpowf cpow cabsl
syn keyword cAnsiFunction cabsf cabs clogl
syn keyword cAnsiFunction clogf clog cexpl
syn keyword cAnsiFunction cexpf cexp ctanhl
syn keyword cAnsiFunction ctanhf ctanh csinhl
syn keyword cAnsiFunction csinhf csinh ccoshl
syn keyword cAnsiFunction ccoshf ccosh catanhl
syn keyword cAnsiFunction catanhf catanh casinhl
syn keyword cAnsiFunction casinhf casinh cacoshl
syn keyword cAnsiFunction cacoshf cacosh ctanl
syn keyword cAnsiFunction ctanf ctan csinl
syn keyword cAnsiFunction csinf csin ccosl
syn keyword cAnsiFunction ccosf ccos catanl
syn keyword cAnsiFunction catanf catan casinl
syn keyword cAnsiFunction casinf casin cacosl
syn keyword cAnsiFunction cacosf cacos assert
syn keyword cAnsiFunction UINTMAX_C INTMAX_C UINT64_C
syn keyword cAnsiFunction UINT32_C UINT16_C UINT8_C
syn keyword cAnsiFunction INT64_C INT32_C INT16_C INT8_C
" Common ANSI-standard Names
syn keyword cAnsiName PRId8 PRIi16 PRIo32 PRIu64
syn keyword cAnsiName PRId16 PRIi32 PRIo64 PRIuLEAST8
syn keyword cAnsiName PRId32 PRIi64 PRIoLEAST8 PRIuLEAST16
syn keyword cAnsiName PRId64 PRIiLEAST8 PRIoLEAST16 PRIuLEAST32
syn keyword cAnsiName PRIdLEAST8 PRIiLEAST16 PRIoLEAST32 PRIuLEAST64
syn keyword cAnsiName PRIdLEAST16 PRIiLEAST32 PRIoLEAST64 PRIuFAST8
syn keyword cAnsiName PRIdLEAST32 PRIiLEAST64 PRIoFAST8 PRIuFAST16
syn keyword cAnsiName PRIdLEAST64 PRIiFAST8 PRIoFAST16 PRIuFAST32
syn keyword cAnsiName PRIdFAST8 PRIiFAST16 PRIoFAST32 PRIuFAST64
syn keyword cAnsiName PRIdFAST16 PRIiFAST32 PRIoFAST64 PRIuMAX
syn keyword cAnsiName PRIdFAST32 PRIiFAST64 PRIoMAX PRIuPTR
syn keyword cAnsiName PRIdFAST64 PRIiMAX PRIoPTR PRIx8
syn keyword cAnsiName PRIdMAX PRIiPTR PRIu8 PRIx16
syn keyword cAnsiName PRIdPTR PRIo8 PRIu16 PRIx32
syn keyword cAnsiName PRIi8 PRIo16 PRIu32 PRIx64
syn keyword cAnsiName PRIxLEAST8 SCNd8 SCNiFAST32 SCNuLEAST32
syn keyword cAnsiName PRIxLEAST16 SCNd16 SCNiFAST64 SCNuLEAST64
syn keyword cAnsiName PRIxLEAST32 SCNd32 SCNiMAX SCNuFAST8
syn keyword cAnsiName PRIxLEAST64 SCNd64 SCNiPTR SCNuFAST16
syn keyword cAnsiName PRIxFAST8 SCNdLEAST8 SCNo8 SCNuFAST32
syn keyword cAnsiName PRIxFAST16 SCNdLEAST16 SCNo16 SCNuFAST64
syn keyword cAnsiName PRIxFAST32 SCNdLEAST32 SCNo32 SCNuMAX
syn keyword cAnsiName PRIxFAST64 SCNdLEAST64 SCNo64 SCNuPTR
syn keyword cAnsiName PRIxMAX SCNdFAST8 SCNoLEAST8 SCNx8
syn keyword cAnsiName PRIxPTR SCNdFAST16 SCNoLEAST16 SCNx16
syn keyword cAnsiName PRIX8 SCNdFAST32 SCNoLEAST32 SCNx32
syn keyword cAnsiName PRIX16 SCNdFAST64 SCNoLEAST64 SCNx64
syn keyword cAnsiName PRIX32 SCNdMAX SCNoFAST8 SCNxLEAST8
syn keyword cAnsiName PRIX64 SCNdPTR SCNoFAST16 SCNxLEAST16
syn keyword cAnsiName PRIXLEAST8 SCNi8 SCNoFAST32 SCNxLEAST32
syn keyword cAnsiName PRIXLEAST16 SCNi16 SCNoFAST64 SCNxLEAST64
syn keyword cAnsiName PRIXLEAST32 SCNi32 SCNoMAX SCNxFAST8
syn keyword cAnsiName PRIXLEAST64 SCNi64 SCNoPTR SCNxFAST16
syn keyword cAnsiName PRIXFAST8 SCNiLEAST8 SCNu8 SCNxFAST32
syn keyword cAnsiName PRIXFAST16 SCNiLEAST16 SCNu16 SCNxFAST64
syn keyword cAnsiName PRIXFAST32 SCNiLEAST32 SCNu32 SCNxMAX
syn keyword cAnsiName PRIXFAST64 SCNiLEAST64 SCNu64 SCNxPTR
syn keyword cAnsiName PRIXMAX SCNiFAST8 SCNuLEAST8
syn keyword cAnsiName PRIXPTR SCNiFAST16 SCNuLEAST16
syn keyword cAnsiName errno environ
syn keyword cAnsiName STDC CX_LIMITED_RANGE
syn keyword cAnsiName STDC FENV_ACCESS
syn keyword cAnsiName STDC FP_CONTRACT
syn keyword cAnsiName and bitor not_eq xor
syn keyword cAnsiName and_eq compl or xor_eq
syn keyword cAnsiName bitand not or_eq
hi def link cAnsiFunction cFunction
hi def link cAnsiName cIdentifier
hi def link cFunction Function
hi def link cIdentifier Identifier
" Booleans
syn keyword cBoolean true false TRUE FALSE
hi def link cBoolean Boolean
" -----------------------------------------------------------------------------
" Additional optional highlighting
" -----------------------------------------------------------------------------
" Operators
"syn match cOperator "\(<<\|>>\|[-+*/%&^|<>!=]\)="
"syn match cOperator "<<\|>>\|&&\|||\|++\|--\|->"
"syn match cOperator "[.!~*&%<>^|=,+-]"
"syn match cOperator "/[^/*=]"me=e-1
"syn match cOperator "/$"
"syn match cOperator "&&\|||"
"syn match cOperator "[][]"
"
"" Preprocs
"syn keyword cDefined defined contained containedin=cDefine
"hi def link cDefined cDefine
"" Functions
"syn match cUserFunction "\<\h\w*\>\(\s\|\n\)*("me=e-1 contains=cType,cDelimiter,cDefine
"syn match cUserFunctionPointer "(\s*\*\s*\h\w*\s*)\(\s\|\n\)*(" contains=cDelimiter,cOperator
"
"hi def link cUserFunction cFunction
"hi def link cUserFunctionPointer cFunction
"
"" Delimiters
"syn match cDelimiter "[();\\]"
"" foldmethod=syntax fix, courtesy of Ivan Freitas
"syn match cBraces display "[{}]"
" Links
"hi def link cDelimiter Delimiter
" foldmethod=syntax fix, courtesy of Ivan Freitas
"hi def link cBraces Delimiter

View File

@@ -1,6 +1,4 @@
if exists('g:polyglot_disabled') && index(g:polyglot_disabled, 'cjsx') != -1 if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'cjsx') == -1
finish
endif
if exists('b:current_syntax') if exists('b:current_syntax')
let s:current_syntax=b:current_syntax let s:current_syntax=b:current_syntax
@@ -29,3 +27,5 @@ hi def link cjsxTagName Function
hi def link cjsxEntity Statement hi def link cjsxEntity Statement
hi def link cjsxEntityPunct Type hi def link cjsxEntityPunct Type
hi def link cjsxAttribProperty Type hi def link cjsxAttribProperty Type
endif

File diff suppressed because it is too large Load Diff

View File

@@ -1,6 +1,4 @@
if exists('g:polyglot_disabled') && index(g:polyglot_disabled, 'dhall') != -1 if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'dhall') == -1
finish
endif
" store and remove current syntax value " store and remove current syntax value
let old_syntax = b:current_syntax let old_syntax = b:current_syntax
@@ -15,3 +13,5 @@ hi def link quasiQuote Underlined
" restore current syntax value " restore current syntax value
let b:current_syntax = old_syntax let b:current_syntax = old_syntax
endif

View File

@@ -1,6 +1,4 @@
if exists('g:polyglot_disabled') && index(g:polyglot_disabled, 'scala') != -1 if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'scala') == -1
finish
endif
" Extends standard help syntax with highlighting of Scala code. " Extends standard help syntax with highlighting of Scala code.
" "
@@ -16,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

View File

@@ -1,6 +1,4 @@
if exists('g:polyglot_disabled') && index(g:polyglot_disabled, 'html5') != -1 if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'html5') == -1
finish
endif
" Vim syntax file " Vim syntax file
" Language: HTML (version 5.1) " Language: HTML (version 5.1)
@@ -14,3 +12,5 @@ endif
" https://github.com/w3c/html/issues/694 " https://github.com/w3c/html/issues/694
syntax region htmlComment start=+<!--+ end=+-->+ contains=@Spell syntax region htmlComment start=+<!--+ end=+-->+ contains=@Spell
syntax region htmlComment start=+<!DOCTYPE+ keepend end=+>+ syntax region htmlComment start=+<!DOCTYPE+ keepend end=+>+
endif

View File

@@ -1,6 +1,4 @@
if exists('g:polyglot_disabled') && index(g:polyglot_disabled, 'idris') != -1 if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'idris') == -1
finish
endif
" This script allows for unicode concealing of certain characters " This script allows for unicode concealing of certain characters
" For instance -> goes to → " For instance -> goes to →
@@ -80,3 +78,5 @@ hi link idrNiceOperator Operator
hi! link Conceal Operator hi! link Conceal Operator
setlocal conceallevel=2 setlocal conceallevel=2
endif

82
after/syntax/idris2.vim Normal file
View File

@@ -0,0 +1,82 @@
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'idris2') == -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

View File

@@ -1,261 +1,9 @@
if exists('g:polyglot_disabled') && (index(g:polyglot_disabled, 'typescript') != -1 || index(g:polyglot_disabled, 'typescript') != -1 || index(g:polyglot_disabled, 'jsx') != -1) if !exists('g:polyglot_disabled') || (index(g:polyglot_disabled, 'javascript') == -1 && index(g:polyglot_disabled, 'jsx') == -1)
if get(g:, 'vim_jsx_pretty_disable_js', 0)
finish finish
endif endif
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" source <sfile>:h/jsx.vim
" 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("jsNoise") " pangloss/vim-javascript
syntax cluster jsExpression add=jsxRegion
elseif hlexists("javascriptOpSymbols") " othree/yajs.vim
" refine the javascript line comment
syntax region javascriptLineComment start=+//+ end=/$/ contains=@Spell,javascriptCommentTodo extend keepend
syntax cluster javascriptValue add=jsxRegion
syntax cluster javascriptNoReserved add=jsxElement,jsxTag
" add support to arrow function which returns a tagged template string, e.g.
" () => html`<div></div>`
syntax cluster afterArrowFunc add=javascriptTagRef
else " build-in javascript syntax
" refine the javascript line comment
syntax region javaScriptLineComment start=+//+ end=/$/ contains=@Spell,javascriptCommentTodo extend keepend
" add a javaScriptBlock group for build-in syntax
syntax region javaScriptBlockBuildIn
\ contained
\ matchgroup=javaScriptBraces
\ start="{"
\ end="}"
\ extend
\ contains=javaScriptBlockBuildIn,@javaScriptEmbededExpr,javaScript.*
\ fold
syntax cluster javaScriptEmbededExpr add=jsxRegion
" refine the template string syntax
syntax region javaScriptStringT start=+`+ skip=+\\\\\|\\`+ end=+`+ contains=javaScriptSpecial,javaScriptEmbed,@htmlPreproc extend
syntax region javaScriptEmbed matchgroup=javaScriptEmbedBraces start=+\${+ end=+}+ contained contains=@javaScriptEmbededExpr,javaScript.*
endif
runtime syntax/jsx_pretty.vim
let b:current_syntax = 'javascript.jsx'
let &cpo = s:jsx_cpo
unlet s:jsx_cpo
if exists('g:polyglot_disabled') && index(g:polyglot_disabled, 'styled-components') != -1
finish
endif
" Vim syntax file
" Language: styled-components (js/ts)
" Maintainer: Karl Fleischmann <fleischmann.karl@gmail.com>
" URL: https://github.com/styled-components/vim-styled-components
if exists("b:current_syntax")
let s:current_syntax=b:current_syntax
unlet b:current_syntax
endif
" fix for "-" before cssPositioningProp
" - needs to be above CSS include to not match cssVendor definitions
syn region cssCustomPositioningPrefix contained
\ start='-' end='\%(\s\{-}:\)\@='
\ contains=cssPositioningProp
" introduce CSS cluster from built-in (or single third party syntax file)
syn include @CSS syntax/css.vim
" try to include CSS3 definitions from multiple files
" this is only possible on vim version above 7
if v:version >= 700
try
syn include @CSS3 syntax/css/*.vim
catch
endtry
endif
" TODO: include react-native keywords
" define custom cssAttrRegion
" - add ",", "`" and "{" to the end characters
" - add "cssPseudoClassId" to it's containing elements
" this will incorrectly highlight pseudo elements incorrectly used as
" attributes but correctly highlight actual attributes
syn region cssCustomAttrRegion contained
\ start=":" end="\ze\%(;\|)\|{\|}\|`\)"
\ contains=css.*Attr,cssColor,cssImportant,cssValue.*,cssFunction,
\ cssString.*,cssURL,cssComment,cssUnicodeEscape,cssVendor,
\ cssError,cssAttrComma,cssNoise,cssPseudoClassId,
\ jsTemplateExpression,
\ typescriptInterpolation,typescriptTemplateSubstitution
syn region cssCustomAttrRegion contained
\ start="transition\s*:" end="\ze\%(;\|)\|{\|}\|`\)"
\ contains=css.*Prop,css.*Attr,cssColor,cssImportant,cssValue.*,
\ cssFunction,cssString.*,cssURL,cssComment,cssUnicodeEscape,
\ cssVendor,cssError,cssAttrComma,cssNoise,cssPseudoClassId,
\ jsTemplateExpression,
\ typescriptInterpolation,typescriptTemplateSubstitution
" define custom css elements to not utilize cssDefinition
syn region cssCustomMediaBlock contained fold transparent matchgroup=cssBraces
\ start="{" end="}"
\ contains=css.*Attr,css.*Prop,cssComment,cssValue.*,cssColor,cssURL,
\ cssImportant,cssError,cssStringQ,cssStringQQ,cssFunction,
\ cssUnicodeEscape,cssVendor,cssTagName,cssClassName,
\ cssIdentifier,cssPseudoClass,cssSelectorOp,cssSelectorOp2,
\ cssAttributeSelector
syn region cssCustomPageWrap contained transparent matchgroup=cssBraces
\ start="{" end="}"
\ contains=cssPageMargin,cssPageProp,cssCustomAttrRegion,css.*Prop,
\ cssComment,cssValue.*,cssColor,cssURL,cssImportant,cssError,
\ cssStringQ,cssStringQQ,cssFunction,cssUnicodeEscape,cssVendor,
\ cssHacks
syn match cssCustomPageMargin contained skipwhite skipnl
\ "@\%(\%(top\|left\|right\|bottom\)-\%(left\|center\|right\|middle\|bottom\)\)\%(-corner\)\="
syn match cssCustomKeyFrameSelector "\%(\d*%\|\<from\>\|\<to\>\)" contained
\ skipwhite skipnl
" define css include customly to overwrite nextgroup
syn region cssInclude start="@media\>" end="\ze{" skipwhite skipnl
\ contains=cssMediaProp,cssValueLength,cssMediaKeyword,cssValueInteger,
\ cssMediaMediaAttr,cssVencor,cssMediaType,cssIncludeKeyword,
\ cssMediaComma,cssComment
\ nextgroup=cssCustomMediaBlock
" define all non-contained css definitions
syn cluster CSSTop
\ contains=cssTagName,cssSelectorOp,cssAttributeSelector,cssClassName,
\ cssBraces,cssIdentifier,cssIncludeKeyword,cssPage,cssKeyFrame,
\ cssFontDescriptor,cssAttrComma,cssPseudoClass,cssUnicodeEscape
" custom highlights for styled components
" - "&" inside top level
" - cssTagName inside of jsStrings inside of styledPrefix regions
" TODO: override highlighting of cssTagName with more subtle one
syn match styledAmpersand contained "&"
syn region styledTagNameString matchgroup=jsString contained
\ start=+'+ end=+'+ skip=+\\\%(\'\|$\)+
\ contains=cssTagName
syn region styledTagNameString matchgroup=jsString contained
\ start=+"+ end=+"+ skip=+\\\%(\"\|$\)+
\ contains=cssTagName
syn region styledTagNameString matchgroup=jsString contained
\ start=+`+ end=+`+ skip=+\\\%(\`\|$\)+
\ contains=cssTagName
" define custom API sections that trigger the styledDefinition highlighting
syn match styledPrefix "\<styled\>\.\k\+"
\ transparent fold
\ nextgroup=styledDefinition
\ contains=cssTagName,javascriptTagRef
\ containedin=jsFuncBlock,jsParen,jsObject,jsObjectValue
syn match styledPrefix "\.\<attrs\>\s*(\%(\n\|\s\|.\)\{-})"
\ transparent fold extend
\ nextgroup=styledDefinition
\ contains=jsObject,jsParen
\ containedin=jsFuncBlock,jsParen,jsObject,jsObjectValue
syn match styledPrefix "\.\<extend\>"
\ transparent fold
\ nextgroup=styledDefinition
\ containedin=jsFuncBlock,jsParen,jsObject,jsObjectValue
" define emotion css prop
" to bypass problems from top-level defined xml/js definitions, this
" plugin re-defines keywords/noise for highlighting inside of the custom
" xmlAttrib definition
syn keyword styledXmlRegionKeyword css contained
syn match styledXmlRegionNoise "\%(=\|{\|}\)" contained
" only include styledDefinitions inside of xmlAttribs, that are wrapped
" in `css={}` regions, `keepend` is necessary to correctly break on the
" higher-level xmlAttrib region end
syn region styledXmlRegion
\ start="\<css\>={" end="}"
\ keepend fold
\ containedin=xmlAttrib
\ contains=styledXmlRegionKeyword,styledXmlRegionNoise,styledDefinition
" define nested region for indenting
syn region styledNestedRegion contained transparent
\ matchgroup=cssBraces
\ start="{" end="}"
" re-define cssError to be highlighted correctly in styledNestedRegion
syn match cssError contained "{@<>"
" extend javascript matches to trigger styledDefinition highlighting
syn match jsTaggedTemplate extend
\ "\<css\>\|\.\<resolve\>\|\.\<global\>\|\<keyframes\>\|\<injectGlobal\>\|\<fontFace\>\|\<createGlobalStyle\>"
\ nextgroup=styledDefinition
syn match jsFuncCall "\<styled\>\s*(.\+)" transparent
\ nextgroup=styledDefinition
syn match jsFuncCall "\<styled\>\s*(\%('\k\+'\|\"\k\+\"\|`\k\+`\))"
\ contains=styledTagNameString
\ nextgroup=styledDefinition
syn match jsFuncCall "\.\<withComponent\>\s*(\%('\k\+'\|\"\k\+\"\|`\k\+`\))"
\ contains=styledTagNameString
syn match jsFuncCall "\<dc\>\s*(\%('\k\+'\|\"\k\+\"\|`\k\+`\))\%((\)\@="
\ contains=styledTagNameString
\ nextgroup=styledDefinitionArgument
" inject css highlighting into custom jsTemplateString region
" - use `extend` to not end all nested jsTemplateExpression on the first
" closing one
syn region styledDefinition contained transparent fold extend
\ start="`" end="`" skip="\\\%(`\|$\)"
\ contains=@CSSTop,
\ css.*Prop,cssValue.*,cssColor,cssUrl,cssImportant,cssError,
\ cssStringQ,cssStringQQ,cssFunction,cssUnicodeEscape,cssVendor,
\ cssHacks,
\ cssCustom.*,
\ jsComment,jsTemplateExpression,
\ typescriptInterpolation,typescriptTemplateSubstitution,
\ styledAmpersand,styledNestedRegion
syn region styledDefinitionArgument contained transparent start=+(+ end=+)+
\ contains=styledDefinition
""" yajs specific extensions
" define template tag keywords, that trigger styledDefinitions again to be
" contained in and also do contain the `javascriptTagRef` region
syn match javascriptTagRefStyledPrefix transparent fold
\ "\<css\>\|\<keyframes\>\|\<injectGlobal\>\|\<fontFace\>\|\<createGlobalStyle\>"
\ containedin=javascriptTagRef
\ contains=javascriptTagRef
\ nextgroup=styledDefinition
" extend the yajs clusters to include the previously and extraneously defined
" styled-related matches
syn cluster javascriptExpression
\ add=styledPrefix,jsFuncCall,javascriptTagRefStyledPrefix
syn cluster javascriptAfterIdentifier add=styledPrefix,jsFuncCall
" color the custom highlight elements
hi def link cssCustomKeyFrameSelector Constant
hi def link cssCustomPositioningPrefix StorageClass
hi def link styledAmpersand Special
hi def link styledXmlRegionKeyword Type
hi def link styledXmlRegionNoise Noise
hi def link styledXmlRegion String
if exists("s:current_syntax")
let b:current_syntax=s:current_syntax
endif endif

View File

@@ -1,6 +1,27 @@
if exists('g:polyglot_disabled') && index(g:polyglot_disabled, 'graphql') != -1 if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'graphql') == -1
finish
endif " Copyright (c) 2016-2020 Jon Parise <jon@indelible.org>
"
" Permission is hereby granted, free of charge, to any person obtaining a copy
" of this software and associated documentation files (the "Software"), to
" deal in the Software without restriction, including without limitation the
" rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
" sell copies of the Software, and to permit persons to whom the Software is
" furnished to do so, subject to the following conditions:
"
" The above copyright notice and this permission notice shall be included in
" all copies or substantial portions of the Software.
"
" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
" IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
" FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
" AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
" LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
" FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
" IN THE SOFTWARE.
"
" Language: GraphQL
" Maintainer: Jon Parise <jon@indelible.org>
if exists('b:current_syntax') if exists('b:current_syntax')
let s:current_syntax = b:current_syntax let s:current_syntax = b:current_syntax
@@ -13,15 +34,31 @@ endif
let s:tags = '\%(' . join(graphql#javascript_tags(), '\|') . '\)' let s:tags = '\%(' . join(graphql#javascript_tags(), '\|') . '\)'
exec 'syntax region graphqlTemplateString start=+' . s:tags . '\@20<=`+ skip=+\\`+ end=+`+ contains=@GraphQLSyntax,jsTemplateExpression,jsSpecial extend' if graphql#has_syntax_group('jsTemplateExpression')
exec 'syntax match graphqlTaggedTemplate +' . s:tags . '\ze`+ nextgroup=graphqlTemplateString' " pangloss/vim-javascript
exec 'syntax region graphqlTemplateString start=+' . s:tags . '\@20<=`+ skip=+\\\\\|\\`+ end=+`+ contains=@GraphQLSyntax,jsTemplateExpression,jsSpecial extend'
exec 'syntax match graphqlTaggedTemplate +' . s:tags . '\ze`+ nextgroup=graphqlTemplateString'
syntax region graphqlTemplateExpression start=+${+ end=+}+ contained contains=jsTemplateExpression containedin=graphqlFold keepend
" Support expression interpolation ((${...})) inside template strings. hi def link graphqlTemplateString jsTemplateString
syntax region graphqlTemplateExpression start=+${+ end=+}+ contained contains=jsTemplateExpression containedin=graphqlFold keepend hi def link graphqlTaggedTemplate jsTaggedTemplate
hi def link graphqlTemplateExpression jsTemplateExpression
hi def link graphqlTemplateString jsTemplateString syn cluster jsExpression add=graphqlTaggedTemplate
hi def link graphqlTaggedTemplate jsTaggedTemplate syn cluster graphqlTaggedTemplate add=graphqlTemplateString
hi def link graphqlTemplateExpression jsTemplateExpression elseif graphql#has_syntax_group('javaScriptStringT')
" runtime/syntax/javascript.vim
exec 'syntax region graphqlTemplateString start=+' . s:tags . '\@20<=`+ skip=+\\\\\|\\`+ end=+`+ contains=@GraphQLSyntax,javaScriptSpecial,javaScriptEmbed,@htmlPreproc extend'
exec 'syntax match graphqlTaggedTemplate +' . s:tags . '\ze`+ nextgroup=graphqlTemplateString'
syntax region graphqlTemplateExpression start=+${+ end=+}+ contained contains=@javaScriptEmbededExpr containedin=graphqlFold keepend
syn cluster jsExpression add=graphqlTaggedTemplate hi def link graphqlTemplateString javaScriptStringT
syn cluster graphqlTaggedTemplate add=graphqlTemplateString hi def link graphqlTaggedTemplate javaScriptEmbed
hi def link graphqlTemplateExpression javaScriptEmbed
syn cluster htmlJavaScript add=graphqlTaggedTemplate
syn cluster javaScriptEmbededExpr add=graphqlTaggedTemplate
syn cluster graphqlTaggedTemplate add=graphqlTemplateString
endif
endif

View File

@@ -0,0 +1,26 @@
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'javascript-sql') == -1
" Vim plugin
" Language: JavaScript
" Maintainer: Ian Langworth <ian@langworth.com>
if exists('b:current_syntax')
let s:current_syntax = b:current_syntax
unlet b:current_syntax
endif
exec 'syntax include @SQLSyntax syntax/' . g:javascript_sql_dialect . '.vim'
if exists('s:current_syntax')
let b:current_syntax = s:current_syntax
endif
syntax region sqlTemplateString start=+`+ skip=+\\\(`\|$\)+ end=+`+ contains=@SQLSyntax,jsTemplateExpression,jsSpecial extend
exec 'syntax match sqlTaggedTemplate +\%(SQL\)\%(`\)\@=+ nextgroup=sqlTemplateString'
hi def link sqlTemplateString jsTemplateString
hi def link sqlTaggedTemplate jsTaggedTemplate
syn cluster jsExpression add=sqlTaggedTemplate
syn cluster sqlTaggedTemplate add=sqlTemplateString
endif

View File

@@ -0,0 +1,5 @@
if !exists('g:polyglot_disabled') || (index(g:polyglot_disabled, 'javascript') == -1 && index(g:polyglot_disabled, 'jsx') == -1)
source <sfile>:h/jsx.vim
endif

View File

@@ -0,0 +1,5 @@
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'graphql') == -1
runtime! after/syntax/javascript/graphql.vim
endif

59
after/syntax/jsx.vim Normal file
View File

@@ -0,0 +1,59 @@
if !exists('g:polyglot_disabled') || (index(g:polyglot_disabled, 'javascript') == -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

View File

@@ -1,9 +1,13 @@
if exists('g:polyglot_disabled') && (index(g:polyglot_disabled, 'typescript') != -1 || index(g:polyglot_disabled, 'typescript') != -1 || index(g:polyglot_disabled, 'jsx') != -1) if !exists('g:polyglot_disabled') || (index(g:polyglot_disabled, 'javascript') == -1 && index(g:polyglot_disabled, 'jsx') == -1)
finish
endif
let s:highlight_close_tag = get(g:, 'vim_jsx_pretty_highlight_close_tag', 0) 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\|\s*\<T\>\)\@!\<[_$A-Za-z][-:._$A-Za-z0-9]*\>\)\%(\_s*\%([-+*)\]}&|?,]\|/\%([/*]\|\_s*>\)\@!\)\)\@!\)+
\ end=++
\ contains=jsxElement
" <tag id="sample"> " <tag id="sample">
" ~~~~~~~~~~~~~~~~~ " ~~~~~~~~~~~~~~~~~
" and self close tag " and self close tag
@@ -14,11 +18,14 @@ syntax region jsxTag
\ matchgroup=jsxOpenPunct \ matchgroup=jsxOpenPunct
\ end=+>+ \ end=+>+
\ matchgroup=NONE \ matchgroup=NONE
\ end=+\(/\_s*>\)\@=+ \ end=+\%(/\_s*>\)\@=+
\ contained \ contained
\ contains=jsxOpenTag,jsxEscapeJs,jsxAttrib,jsComment,@javascriptComments,javaScriptLineComment,javaScriptComment,typescriptLineComment,typescriptComment,jsxSpreadOperator \ contains=jsxOpenTag,jsxAttrib,jsxExpressionBlock,jsxSpreadOperator,jsComment,@javascriptComments,javaScriptLineComment,javaScriptComment,typescriptLineComment,typescriptComment
\ keepend \ keepend
\ extend \ extend
\ skipwhite
\ skipempty
\ nextgroup=jsxCloseString
" <tag></tag> " <tag></tag>
" ~~~~~~~~~~~ " ~~~~~~~~~~~
@@ -29,30 +36,15 @@ syntax region jsxTag
" <tag /> " <tag />
" ~~~~~~~ " ~~~~~~~
syntax region jsxElement syntax region jsxElement
\ start=+<\_s*\(>\|\${\|\z(\<[-:_\.\$0-9A-Za-z]\+\>\)\)+ \ start=+<\_s*\%(>\|\${\|\z(\<[-:._$A-Za-z0-9]\+\>\)\)+
\ end=+/\_s*>+ \ end=+/\_s*>+
\ end=+<\_s*/\_s*\z1\_s*>+ \ end=+<\_s*/\_s*\z1\_s*>+
\ contains=jsxElement,jsxEscapeJs,jsxTag,jsxComment,jsxCloseString,jsxCloseTag,@Spell \ contains=jsxElement,jsxTag,jsxExpressionBlock,jsxComment,jsxCloseTag,@Spell
\ keepend \ keepend
\ extend \ extend
\ contained \ contained
\ fold \ fold
" detect jsx region
syntax region jsxRegion
\ start=+\(\(\_[([,?:=+\-*/<>{}]\|&&\|||\|=>\|\<return\|\<default\|\<await\|\<yield\)\_s*\)\@<=<\_s*\(>\|\z(\(script\)\@!\<[_\$A-Za-z][-:_\.\$0-9A-Za-z]*\>\)\(\_s*\([-+*)\]}&|?]\|/\([/*]\|\_s*>\)\@!\)\)\@!\)+
\ end=++
\ contains=jsxElement
" <tag key={this.props.key}>
" ~~~~~~~~~~~~~~~~
syntax region jsxEscapeJs
\ start=+{+
\ end=++
\ extend
\ contained
\ contains=jsBlock,javascriptBlock,javaScriptBlockBuildIn,typescriptBlock
" <tag key={this.props.key}> " <tag key={this.props.key}>
" ~~~~ " ~~~~
" and fragment start tag " and fragment start tag
@@ -68,19 +60,31 @@ exe 'syntax region jsxOpenTag
\ contains=jsxTagName \ contains=jsxTagName
\ nextgroup=jsxAttrib \ nextgroup=jsxAttrib
\ skipwhite \ skipwhite
\ skipempty ' .(s:highlight_close_tag ? 'transparent' : '') \ skipempty
\ ' .(s:highlight_close_tag ? 'transparent' : '')
" <tag key={this.props.key}>
" ~~~~~~~~~~~~~~~~
syntax region jsxExpressionBlock
\ matchgroup=jsxBraces
\ start=+{+
\ end=+}+
\ contained
\ extend
\ contains=@jsExpression,jsSpreadExpression,@javascriptExpression,javascriptSpreadOp,@javaScriptEmbededExpr,@typescriptExpression,typescriptObjectSpread,jsComment,@javascriptComments,javaScriptLineComment,javaScriptComment,typescriptLineComment,typescriptComment
" <foo.bar> " <foo.bar>
" ~ " ~
syntax match jsxDot +\.+ contained display syntax match jsxDot +\.+ contained
" <foo:bar> " <foo:bar>
" ~ " ~
syntax match jsxNamespace +:+ contained display syntax match jsxNamespace +:+ contained
" <tag id="sample"> " <tag id="sample">
" ~ " ~
syntax match jsxEqual +=+ contained display nextgroup=jsxString,jsxEscapeJs,jsxRegion skipwhite syntax match jsxEqual +=+ contained skipwhite skipempty nextgroup=jsxString,jsxExpressionBlock,jsxRegion
" <tag /> " <tag />
" ~~ " ~~
@@ -101,13 +105,12 @@ syntax region jsxCloseTag
" <tag key={this.props.key}> " <tag key={this.props.key}>
" ~~~ " ~~~
syntax match jsxAttrib syntax match jsxAttrib
\ +\<[-A-Za-z_][-:_\$0-9A-Za-z]*\>+ \ +\<[_$A-Za-z][-:_$A-Za-z0-9]*\>+
\ contained \ contained
\ nextgroup=jsxEqual \ nextgroup=jsxEqual
\ skipwhite \ skipwhite
\ skipempty \ skipempty
\ contains=jsxAttribKeyword \ contains=jsxAttribKeyword,jsxNamespace
\ display
" <MyComponent ...> " <MyComponent ...>
" ~~~~~~~~~~~ " ~~~~~~~~~~~
@@ -115,67 +118,71 @@ syntax match jsxAttrib
" <someCamel ...> " <someCamel ...>
" ~~~~~ " ~~~~~
exe 'syntax match jsxComponentName exe 'syntax match jsxComponentName
\ +\<[A-Z][\$0-9A-Za-z]\+\>+ \ +\<[_$]\?[A-Z][-_$A-Za-z0-9]*\>+
\ contained \ contained
\ display ' .(s:highlight_close_tag ? 'transparent' : '') \ ' .(s:highlight_close_tag ? 'transparent' : '')
" <tag key={this.props.key}> " <tag key={this.props.key}>
" ~~~ " ~~~
exe 'syntax match jsxTagName exe 'syntax match jsxTagName
\ +\<[-:_\.\$0-9A-Za-z]\+\>+ \ +\<[-:._$A-Za-z0-9]\+\>+
\ contained \ contained
\ contains=jsxComponentName,jsxDot,jsxNamespace \ contains=jsxComponentName,jsxDot,jsxNamespace
\ nextgroup=jsxAttrib \ nextgroup=jsxAttrib
\ skipempty \ skipempty
\ skipwhite \ skipwhite
\ display ' .(s:highlight_close_tag ? 'transparent' : '') \ ' .(s:highlight_close_tag ? 'transparent' : '')
" <tag id="sample"> " <tag id="sample">
" ~~~~~~~~ " ~~~~~~~~
" and " and
" <tag id='sample'> " <tag id='sample'>
" ~~~~~~~~ " ~~~~~~~~
syntax region jsxString start=+\z(["']\)+ skip=+\\\%(\z1\|$\)+ end=+\z1+ contained contains=@Spell display syntax region jsxString start=+\z(["']\)+ skip=+\\\\\|\\\z1\|\\\n+ end=+\z1+ contained contains=@Spell
let s:tags = get(g:, 'vim_jsx_pretty_template_tags', ['html', 'raw']) let s:tags = get(g:, 'vim_jsx_pretty_template_tags', ['html', 'jsx'])
let s:enable_tagged_jsx = !empty(s:tags) let s:enable_tagged_jsx = !empty(s:tags)
" add support to JSX inside the tagged template string " add support to JSX inside the tagged template string
" https://github.com/developit/htm " https://github.com/developit/htm
if s:enable_tagged_jsx if s:enable_tagged_jsx
exe 'syntax region jsxTaggedRegion exe 'syntax match jsxRegion +\%(' . join(s:tags, '\|') . '\)\%(\_s*`\)\@=+ contains=jsTemplateStringTag,jsTaggedTemplate,javascriptTagRef skipwhite skipempty nextgroup=jsxTaggedRegion'
\ start=+\%('. join(s:tags, '\|') .'\)\@<=`+ms=s+1
\ end=+`+me=e-1
\ extend
\ contained
\ containedin=jsTemplateString,javascriptTemplate,javaScriptStringT,typescriptStringB
\ contains=jsxElement'
syntax region jsxEscapeJs syntax region jsxTaggedRegion
\ start=+\${+ \ matchgroup=jsxBackticks
\ end=++ \ start=+`+
\ end=+`+
\ extend \ extend
\ contained \ contained
\ contains=jsTemplateExpression,javascriptTemplateSubstitution,javaScriptEmbed,typescriptInterpolation \ contains=jsxElement,jsxExpressionBlock
\ transparent
syntax region jsxExpressionBlock
\ matchgroup=jsxBraces
\ start=+\${+
\ end=+}+
\ extend
\ contained
\ contains=@jsExpression,jsSpreadExpression,@javascriptExpression,javascriptSpreadOp,@javaScriptEmbededExpr,@typescriptExpression,typescriptObjectSpread
syntax region jsxOpenTag syntax region jsxOpenTag
\ matchgroup=jsxOpenPunct \ matchgroup=jsxOpenPunct
\ start=+<\%(\${\)\@=+ \ start=+<\%(\${\)\@=+
\ matchgroup=NONE \ matchgroup=NONE
\ end=++ \ end=+}\@1<=+
\ contained \ contained
\ contains=jsxEscapeJs \ contains=jsxExpressionBlock
\ nextgroup=jsxAttrib,jsxSpreadOperator
\ skipwhite \ skipwhite
\ skipempty \ skipempty
\ nextgroup=jsxAttrib,jsxSpreadOperator
syntax keyword jsxAttribKeyword class contained display syntax keyword jsxAttribKeyword class contained
syntax match jsxSpreadOperator +\.\.\.+ contained display nextgroup=jsxEscapeJs skipwhite syntax match jsxSpreadOperator +\.\.\.+ contained nextgroup=jsxExpressionBlock skipwhite
syntax match jsxCloseTag +<//>+ display syntax match jsxCloseTag +<//>+ contained
syntax match jsxComment +<!--\_.\{-}-->+ display syntax match jsxComment +<!--\_.\{-}-->+
endif endif
" Highlight the tag name " Highlight the tag name
@@ -185,10 +192,14 @@ highlight def link jsxComponentName Function
highlight def link jsxAttrib Type highlight def link jsxAttrib Type
highlight def link jsxAttribKeyword jsxAttrib highlight def link jsxAttribKeyword jsxAttrib
highlight def link jsxEqual Operator
highlight def link jsxString String highlight def link jsxString String
highlight def link jsxComment Comment
highlight def link jsxDot Operator highlight def link jsxDot Operator
highlight def link jsxNamespace 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 if s:highlight_close_tag
highlight def link jsxCloseString Identifier highlight def link jsxCloseString Identifier
@@ -203,9 +214,6 @@ highlight def link jsxPunct jsxCloseString
highlight def link jsxClosePunct jsxPunct highlight def link jsxClosePunct jsxPunct
highlight def link jsxCloseTag jsxCloseString highlight def link jsxCloseTag jsxCloseString
highlight def link jsxComment Comment
highlight def link jsxSpreadOperator Operator
let s:vim_jsx_pretty_colorful_config = get(g:, 'vim_jsx_pretty_colorful_config', 0) let s:vim_jsx_pretty_colorful_config = get(g:, 'vim_jsx_pretty_colorful_config', 0)
if s:vim_jsx_pretty_colorful_config == 1 if s:vim_jsx_pretty_colorful_config == 1
@@ -214,3 +222,4 @@ if s:vim_jsx_pretty_colorful_config == 1
highlight def link jsFuncArgs Type highlight def link jsFuncArgs Type
endif endif
endif

View File

@@ -1,6 +1,4 @@
if exists('g:polyglot_disabled') && index(g:polyglot_disabled, 'llvm') != -1 if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'llvm') == -1
finish
endif
" Copyright (c) 2018 rhysd " Copyright (c) 2018 rhysd
" "
@@ -24,3 +22,5 @@ endif
syn keyword llvmKeyword attributes syn keyword llvmKeyword attributes
syn match llvmNoName /#\d\+\>/ syn match llvmNoName /#\d\+\>/
endif

View File

@@ -1,6 +1,4 @@
if exists('g:polyglot_disabled') && index(g:polyglot_disabled, 'mdx') != -1 if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'mdx') == -1
finish
endif
" based on mxw/vim-jsx " based on mxw/vim-jsx
@@ -43,3 +41,5 @@ syn cluster jsExpression add=jsxRegion
" Allow jsxRegion to contain reserved words. " Allow jsxRegion to contain reserved words.
syn cluster javascriptNoReserved add=jsxRegion syn cluster javascriptNoReserved add=jsxRegion
endif

View File

@@ -1,20 +1,14 @@
if exists('g:polyglot_disabled') && index(g:polyglot_disabled, 'mathematica') != -1 if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'mathematica') == -1
finish
endif
"Vim conceal file "Vim conceal file
" Language: Mathematica " Language: Mathematica
" Maintainer: Voldikss <dyzplus@gmail.com> " Maintainer: R. Menon <rsmenon@icloud.com>
" Last Change: 2019 Jan 23 by Voldikss " Last Change: Feb 25, 2013
" Source: https://github.com/voldikss/vim-mma/after/syntax/mma.vim
" Credits:
" Rsmenon: https://github.com/rsmenon
if (exists('g:mma_candy') && g:mma_candy == 0) || !has('conceal') || &enc != 'utf-8' if (exists('g:mma_candy') && g:mma_candy == 0) || !has('conceal') || &enc != 'utf-8'
finish finish
endif endif
"These are fairly safe and straightforward conceals "These are fairly safe and straightforward conceals
if exists('g:mma_candy') && g:mma_candy > 0 if exists('g:mma_candy') && g:mma_candy > 0
"Rules "Rules
@@ -1448,3 +1442,5 @@ endif
hi! link Conceal Normal hi! link Conceal Normal
setlocal conceallevel=2 setlocal conceallevel=2
endif

View File

@@ -1,6 +1,4 @@
if exists('g:polyglot_disabled') && index(g:polyglot_disabled, 'objc') != -1 if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'objc') == -1
finish
endif
" ARC type modifiers " ARC type modifiers
syn keyword objcTypeModifier __bridge __bridge_retained __bridge_transfer __autoreleasing __strong __weak __unsafe_unretained syn keyword objcTypeModifier __bridge __bridge_retained __bridge_transfer __autoreleasing __strong __weak __unsafe_unretained
@@ -21,3 +19,5 @@ syn match objcDirective "@property\|@synthesize\|@dynamic\|@package"
" Highlight property attributes as if they were type modifiers " Highlight property attributes as if they were type modifiers
hi def link objcPropertyAttribute objcTypeModifier hi def link objcPropertyAttribute objcTypeModifier
endif

View File

@@ -1,4 +1,4 @@
if exists('g:polyglot_disabled') && index(g:polyglot_disabled, 'reason') != -1 if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'reason') == -1
finish
endif
endif

View File

@@ -0,0 +1,37 @@
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'graphql') == -1
" Copyright (c) 2016-2020 Jon Parise <jon@indelible.org>
"
" Permission is hereby granted, free of charge, to any person obtaining a copy
" of this software and associated documentation files (the "Software"), to
" deal in the Software without restriction, including without limitation the
" rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
" sell copies of the Software, and to permit persons to whom the Software is
" furnished to do so, subject to the following conditions:
"
" The above copyright notice and this permission notice shall be included in
" all copies or substantial portions of the Software.
"
" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
" IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
" FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
" AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
" LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
" FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
" IN THE SOFTWARE.
"
" Language: GraphQL
" Maintainer: Jon Parise <jon@indelible.org>
if exists('b:current_syntax')
let s:current_syntax = b:current_syntax
unlet b:current_syntax
endif
syn include @GraphQLSyntax syntax/graphql.vim
if exists('s:current_syntax')
let b:current_syntax = s:current_syntax
endif
syntax region graphqlExtensionPoint matchgroup=Noise start=+\[%graphql\_s*{|+lc=10 end=+|}\_s*]+he=s+1 contains=@GraphQLSyntax keepend
endif

View File

@@ -1,6 +1,4 @@
if exists('g:polyglot_disabled') && index(g:polyglot_disabled, 'rspec') != -1 if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'rspec') == -1
finish
endif
" "
" An rspec syntax file " An rspec syntax file
@@ -11,26 +9,185 @@ endif
runtime! syntax/ruby.vim runtime! syntax/ruby.vim
unlet! b:current_syntax unlet! b:current_syntax
syntax keyword rspecGroupMethods context describe example it its let it_should_behave_like shared_examples_for subject it_behaves_like pending specify When Then Given Invariant feature scenario given setlocal commentstring=#\ %s
highlight link rspecGroupMethods Type
syntax keyword rspecBeforeAndAfter after after_suite_parts append_after append_before before before_suite_parts prepend_after prepend_before around syntax keyword rspecGroupMethods
highlight link rspecBeforeAndAfter Statement \ aggregate_failures
\ context
\ describe
\ example
\ feature
\ fcontext
\ fdescribe
\ fexample
\ fit
\ focus
\ fspecify
\ Given
\ given\!
\ include_context
\ include_examples
\ Invariant
\ it
\ it_behaves_like
\ it_should_behave_like
\ its
\ let
\ let\!
\ pending
\ scenario
\ shared_examples
\ shared_examples_for
\ skip
\ specify
\ subject
\ Then
\ When
syntax keyword rspecMocks double mock stub stub_chain syntax keyword rspecBeforeAndAfter
highlight link rspecMocks Constant \ after
\ after_suite_parts
\ append_after
\ append_before
\ around
\ before
\ before_suite_parts
\ prepend_after
\ prepend_before
syntax keyword rspecMockMethods and_raise and_return and_throw and_yield build_child called_max_times expected_args invoke matches syntax keyword rspecMocks
highlight link rspecMockMethods Function \ double
\ instance_double
\ instance_spy
\ mock
\ spy
\ stub
\ stub_chain
\ stub_const
syntax keyword rspecKeywords should should_not should_not_receive should_receive syntax keyword rspecMockMethods
highlight link rspecKeywords Constant \ and_call_original
\ and_raise
\ and_return
\ and_throw
\ and_yield
\ build_child
\ called_max_times
\ expected_args
\ invoke
\ matches
syntax keyword rspecKeywords
\ should
\ should_not
\ should_not_receive
\ should_receive
syntax keyword rspecMatchers
\ all
\ allow
\ allow_any_instance_of
\ assigns
\ be
\ change
\ described_class
\ eq
\ eql
\ equal
\ errors_on
\ exist
\ expect
\ expect_any_instance_of
\ have
\ have_at_least
\ have_at_most
\ have_exactly
\ include
\ is_expected
\ match
\ match_array
\ matcher
\ not_to
\ raise_error
\ raise_exception
\ receive
\ receive_messages
\ receive_message_chain
\ respond_to
\ satisfy
\ throw_symbol
\ to
\ to_not
\ when
\ wrap_expectation
" rspec-mongoid exclusive matchers
syntax keyword rspecMatchers
\ accept_nested_attributes_for
\ belong_to
\ custom_validate
\ embed_many
\ embed_one
\ validate_associated
\ validate_exclusion_of
\ validate_format_of
\ validate_inclusion_of
\ validate_length_of
" shoulda matchers
syntax keyword rspecMatchers
\ allow_mass_assignment_of
\ allow_value
\ ensure_exclusion_of
\ ensure_length_of
\ have_secure_password
\ validate_absence_of
\ validate_acceptance_of
\ validate_confirmation_of
\ validate_numericality_of
\ validate_presence_of
\ validate_uniqueness_of
syntax keyword rspecMessageExpectation
\ advise
\ any_args
\ any_number_of_times
\ anything
\ at_least
\ at_most
\ exactly
\ expected_messages_received
\ generate_error
\ hash_including
\ hash_not_including
\ ignoring_args
\ instance_of
\ matches_at_least_count
\ matches_at_most_count
\ matches_exact_count
\ matches_name_but_not_args
\ negative_expectation_for
\ never
\ no_args
\ once
\ ordered
\ similar_messages
\ times
\ twice
\ verify_messages_received
\ with
syntax keyword rspecMatchers be change eql equal exist expect have have_at_least have_at_most have_exactly include match matcher raise_error raise_exception respond_to satisfy throw_symbol to to_not not_to when wrap_expectation
syntax match rspecMatchers /\<\(be\|have\)_\w\+\>/ syntax match rspecMatchers /\<\(be\|have\)_\w\+\>/
highlight link rspecMatchers Function syntax match rspecGroupMethods /\.describe/
syntax keyword rspecMessageExpectation advise any_args any_number_of_times anything at_least at_most exactly expected_messages_received generate_error hash_including hash_not_including ignoring_args instance_of matches_at_least_count matches_at_most_count matches_exact_count matches_name_but_not_args negative_expectation_for never no_args once ordered similar_messages times twice verify_messages_received with highlight link rspecGroupMethods Statement
highlight link rspecBeforeAndAfter Identifier
highlight link rspecMocks Constant
highlight link rspecMockMethods Function
highlight link rspecKeywords Constant
highlight link rspecMatchers Function
highlight link rspecMessageExpectation Function highlight link rspecMessageExpectation Function
let b:current_syntax = 'rspec' let b:current_syntax = 'rspec'
endif

View File

@@ -1,6 +1,4 @@
if exists('g:polyglot_disabled') && index(g:polyglot_disabled, 'yard') != -1 if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'yard') == -1
finish
endif
" Ruby syntax extensions for highlighting YARD documentation. " Ruby syntax extensions for highlighting YARD documentation.
" "
@@ -128,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

View File

@@ -1,6 +1,4 @@
if exists('g:polyglot_disabled') && index(g:polyglot_disabled, 'rust') != -1 if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'rust') == -1
finish
endif
scriptencoding utf-8 scriptencoding utf-8
@@ -43,3 +41,5 @@ if !get(g:, 'rust_conceal_mod_path', 0)
endif endif
" vim: set et sw=4 sts=4 ts=8: " vim: set et sw=4 sts=4 ts=8:
endif

View File

@@ -1,13 +0,0 @@
if exists('g:polyglot_disabled') && index(g:polyglot_disabled, 'latex') != -1
finish
endif
" adds support for cleverref package
" \Cref, \cref, \cpageref, \labelcref, \labelcpageref
syn region texRefZone matchgroup=texStatement start="\\Cref{" end="}\|%stopzone\>" contains=@texRefGroup
syn region texRefZone matchgroup=texStatement start="\\\(label\|\)c\(page\|\)ref{" end="}\|%stopzone\>" contains=@texRefGroup
" adds support for listings package
syn region texZone start="\\begin{lstlisting}" end="\\end{lstlisting}\|%stopzone\>"
syn match texInputFile "\\lstinputlisting\s*\(\[.*\]\)\={.\{-}}" contains=texStatement,texInputCurlies,texInputFileOpt
syn match texZone "\\lstinline\s*\(\[.*\]\)\={.\{-}}"

63
after/syntax/tsx.vim Normal file
View File

@@ -0,0 +1,63 @@
if !exists('g:polyglot_disabled') || (index(g:polyglot_disabled, 'javascript') == -1 && index(g:polyglot_disabled, 'jsx') == -1)
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" Vim syntax file
"
" Language: javascript.jsx
" Maintainer: MaxMellon <maxmellon1994@gmail.com>
" Depends: leafgarland/typescript-vim
"
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
if get(g:, 'vim_jsx_pretty_disable_tsx', 0)
finish
endif
let s:jsx_cpo = &cpo
set cpo&vim
syntax case match
if exists('b:current_syntax')
let s:current_syntax = b:current_syntax
unlet b:current_syntax
endif
if exists('s:current_syntax')
let b:current_syntax = s:current_syntax
endif
" refine the typescript line comment
syntax region typescriptLineComment start=+//+ end=/$/ contains=@Spell,typescriptCommentTodo,typescriptRef extend keepend
for syntax_name in ['tsxRegion', 'tsxFragment']
if hlexists(syntax_name)
exe 'syntax clear ' . syntax_name
endif
endfor
if !hlexists('typescriptTypeCast')
" add a typescriptBlock group for typescript
syntax region typescriptBlock
\ matchgroup=typescriptBraces
\ start="{"
\ end="}"
\ contained
\ extend
\ contains=@typescriptExpression,typescriptBlock
\ fold
hi def link typescriptTypeBrackets typescriptOpSymbols
endif
runtime syntax/jsx_pretty.vim
syntax cluster typescriptExpression add=jsxRegion,typescriptParens
" Fix type casting ambiguity with JSX syntax
syntax match typescriptTypeBrackets +[<>]+ contained
syntax match typescriptTypeCast +<\([_$A-Za-z0-9]\+\)>\%(\s*\%([_$A-Za-z0-9]\+\s*;\?\|(\)\%(\_[^<]*</\1>\)\@!\)\@=+ contains=typescriptTypeBrackets,@typescriptType,typescriptType nextgroup=@typescriptExpression
let b:current_syntax = 'typescript.tsx'
let &cpo = s:jsx_cpo
unlet s:jsx_cpo
endif

View File

@@ -1,116 +0,0 @@
if exists('g:polyglot_disabled') && (index(g:polyglot_disabled, 'typescript') != -1 || index(g:polyglot_disabled, 'typescript') != -1 || index(g:polyglot_disabled, 'jsx') != -1)
finish
endif
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" Vim syntax file
"
" Language: javascript.jsx
" Maintainer: MaxMellon <maxmellon1994@gmail.com>
" Depends: leafgarland/typescript-vim
"
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
let s:jsx_cpo = &cpo
set cpo&vim
syntax case match
if exists('b:current_syntax')
let s:current_syntax = b:current_syntax
unlet b:current_syntax
endif
if exists('s:current_syntax')
let b:current_syntax = s:current_syntax
endif
" refine the typescript line comment
syntax region typescriptLineComment start=+//+ end=/$/ contains=@Spell,typescriptCommentTodo,typescriptRef extend keepend
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
if exists('g:polyglot_disabled') && index(g:polyglot_disabled, 'styled-components') != -1
finish
endif
runtime! syntax/javascript.vim
" define custom API section, that contains typescript annotations
" this is structurally similar to `jsFuncCall`, but allows type
" annotations (delimited by brackets (e.g. "<>")) between `styled` and
" the function call parenthesis
syn match styledTypescriptPrefix
\ "\<styled\><\%(\[\|\]\|{\|}\||\|&\|:\|;\|,\|?\|'\|\"\|\k\|\s\|\n\)\+>(\%('\k\+'\|\"\k\+\"\|\k\+\))"
\ transparent fold extend
\ nextgroup=styledDefinition
\ contains=cssTagName,
\ typescriptBraces,typescriptOpSymbols,typescriptEndColons,
\ typescriptParens,typescriptStringS,@typescriptType,
\ typescriptType,foldBraces,
\ styledTagNameString
\ containedin=foldBraces
syn match styledTypescriptPrefix
\ "\<styled\>\%((\%('\k\+'\|\"\k\+\"\|\k\+\))\|\.\k\+\)<\%(\[\|\]\|{\|}\||\|&\|:\|;\|,\|?\|'\|\"\|\k\|\s\|\n\)\+>"
\ transparent fold extend
\ nextgroup=styledDefinition
\ contains=cssTagName,
\ typescriptBraces,typescriptOpSymbols,typescriptEndColons,
\ typescriptParens,typescriptStringS,@typescriptType,
\ typescriptType,foldBraces,
\ styledTagNameString
\ containedin=foldBraces
syn match styledTypescriptPrefix "\.\<attrs\>\s*(\%(\n\|\s\|.\)\{-})<\%(\[\|\]\|{\|}\||\|&\|:\|;\|,\|?\|'\|\"\|\k\|\s\|\n\)\+>"
\ transparent fold extend
\ nextgroup=styledDefinition
\ contains=cssTagName,
\ typescriptBraces,typescriptOpSymbols,typescriptEndColons,
\ typescriptParens,typescriptStringS,@typescriptType,
\ typescriptType,foldBraces,
\ styledTagNameString
\ containedin=foldBraces
syn match styledTypescriptPrefix "\.\<extend\><\%(\[\|\]\|{\|}\||\|&\|:\|;\|,\|?\|'\|\"\|\k\|\s\|\n\)\+>"
\ transparent fold extend
\ nextgroup=styledDefinition
\ contains=cssTagName,
\ typescriptBraces,typescriptOpSymbols,typescriptEndColons,
\ typescriptParens,typescriptStringS,@typescriptType,
\ typescriptType,foldBraces,
\ styledTagNameString
\ containedin=foldBraces
syn match jsFuncCall "\<styled\>\s*(\%('\k\+'\|\"\k\+\"\|`\k\+`\))<\%(\[\|\]\|{\|}\||\|&\|:\|;\|,\|?\|'\|\"\|\k\|\s\|\n\)\+>"
\ transparent fold
\ contains=typescriptBraces,typescriptOpSymbols,typescriptEndColons,
\ typescriptParens,typescriptStringS,@typescriptType,
\ typescriptType,foldBraces,
\ styledTagNameString
\ nextgroup=styledDefinition
\ containedin=foldBraces
syn cluster typescriptValue add=styledPrefix,jsFuncCall,styledTypescriptPrefix
""" yats specific extensions
" extend typescriptIdentifierName to allow styledDefinitions in their
" tagged templates
syn match typescriptIdentifierName extend
\ "\<css\>\|\<keyframes\>\|\<injectGlobal\>\|\<fontFace\>\|\<createGlobalStyle\>"
\ nextgroup=styledDefinition

View File

@@ -1,6 +1,27 @@
if exists('g:polyglot_disabled') && index(g:polyglot_disabled, 'graphql') != -1 if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'graphql') == -1
finish
endif " Copyright (c) 2016-2020 Jon Parise <jon@indelible.org>
"
" Permission is hereby granted, free of charge, to any person obtaining a copy
" of this software and associated documentation files (the "Software"), to
" deal in the Software without restriction, including without limitation the
" rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
" sell copies of the Software, and to permit persons to whom the Software is
" furnished to do so, subject to the following conditions:
"
" The above copyright notice and this permission notice shall be included in
" all copies or substantial portions of the Software.
"
" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
" IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
" FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
" AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
" LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
" FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
" IN THE SOFTWARE.
"
" Language: GraphQL
" Maintainer: Jon Parise <jon@indelible.org>
if exists('b:current_syntax') if exists('b:current_syntax')
let s:current_syntax = b:current_syntax let s:current_syntax = b:current_syntax
@@ -24,3 +45,5 @@ hi def link graphqlTemplateExpression typescriptTemplateSubstitution
syn cluster typescriptExpression add=graphqlTaggedTemplate syn cluster typescriptExpression add=graphqlTaggedTemplate
syn cluster graphqlTaggedTemplate add=graphqlTemplateString syn cluster graphqlTaggedTemplate add=graphqlTemplateString
endif

View File

@@ -0,0 +1,5 @@
if !exists('g:polyglot_disabled') || (index(g:polyglot_disabled, 'javascript') == -1 && index(g:polyglot_disabled, 'jsx') == -1)
source <sfile>:h/tsx.vim
endif

View File

@@ -0,0 +1,5 @@
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'graphql') == -1
runtime! after/syntax/typescript/graphql.vim
endif

View File

@@ -0,0 +1,5 @@
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'graphql') == -1
runtime! after/syntax/javascript/graphql.vim
endif

View File

@@ -1,65 +0,0 @@
if exists('g:polyglot_disabled') && index(g:polyglot_disabled, 'yaml') != -1
finish
endif
" 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

126
after/syntax/zsh.vim Normal file
View File

@@ -0,0 +1,126 @@
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'zinit') == -1
" Copyright (c) 2019 Sebastian Gniazdowski
"
" Syntax highlighting for Zinit commands in any file of type `zsh'.
" It adds definitions for the Zinit syntax to the ones from the
" existing zsh.vim definitions-file.
" Main Zinit command.
" Should be the only TOP rule for the whole syntax.
syntax match ZinitCommand /\<zinit\>\s/me=e-1
\ skipwhite
\ nextgroup=ZinitSubCommands,ZinitPluginSubCommands,ZinitSnippetSubCommands
\ contains=ZinitSubCommands,ZinitPluginSubCommands,ZinitSnippetSubCommands
" TODO: add options for e.g. light
syntax match ZinitSubCommands /\s\<\%(ice\|compinit\|env-whitelist\|cdreplay\|cdclear\|update\)\>\s/ms=s+1,me=e-1
\ contained
syntax match ZinitPluginSubCommands /\s\<\%(light\|load\)\>\s/ms=s+1,me=e-1
\ skipwhite nextgroup=ZinitPlugin1,ZinitPlugin2,ZinitPlugin3
\ contains=ZinitPlugin1,ZinitPlugin2,ZinitPlugin3
syntax match ZinitSnippetSubCommands /\s\<\%(snippet\)\>\s/ms=s+1,me=e-1
\ skipwhite
\ nextgroup=ZinitSnippetShorthands1,ZinitSnippetShorthands2
\ contains=ZinitSnippetShorthands1,ZinitSnippetShorthands2
" "user/plugin"
syntax match ZinitPlugin1 /\s["]\%([!-_]*\%(\/[!-_]\+\)\+\|[!-_]\+\)["]/ms=s+1,hs=s+2,he=e-1
\ contained
\ nextgroup=ZinitTrailingWhiteSpace
\ contains=ZinitTrailingWhiteSpace
" 'user/plugin'
syntax match ZinitPlugin2 /\s[']\%([!-_]*\%(\/[!-_]\+\)\+\|[!-_]\+\)[']/ms=s+1,hs=s+2,he=e-1
\ contained
\ nextgroup=ZinitTrailingWhiteSpace
\ contains=ZinitTrailingWhiteSpace
" user/plugin
syntax match ZinitPlugin3 /\s\%([!-_]*\%(\/[!-_]\+\)\+\|[!-_]\+\)/ms=s+1,me=e+2
\ contained
\ nextgroup=ZinitTrailingWhiteSpace
\ contains=ZinitTrailingWhiteSpace
" OMZ:: or PZT::
" TODO: 'OMZ:: or 'PZT::
syntax match ZinitSnippetShorthands1 /\s\<\%(\%(OMZ\|PZT\)\>::\|\)/hs=s+1,he=e-2
\ contained
\ skipwhite
\ nextgroup=ZinitSnippetUrl1,ZinitSnippetUrl2
\ contains=ZinitSnippetUrl1,ZinitSnippetUrl2
" "OMZ:: or "PZT::
syntax match ZinitSnippetShorthands2 /\s["]\%(\%(OMZ\|PZT\)\>::\|\)/hs=s+2,he=e-2
\ contained
\ skipwhite
\ nextgroup=ZinitSnippetUrl3,ZinitSnippetUrl4
\ contains=ZinitSnippetUrl3,ZinitSnippetUrl4
syntax match ZinitSnippetUrl3 /\<\%(http:\/\/\|https:\/\/\|ftp:\/\/\|\$HOME\|\/\)[!-_]\+\%(\/[!-_]\+\)*\/\?["]/he=e-1
\ contained
\ nextgroup=ZinitTrailingWhiteSpace
\ contains=ZinitTrailingWhiteSpace
" TODO: Fix ZinitTrailingWhiteSpace not matching
syntax match ZinitSnippetUrl4 /\%(\%(OMZ\|PZT\)::\)[!-_]\+\%(\/[!-_]\+\)*\/\?["]/hs=s+5,he=e-1
\ contained
\ nextgroup=ZinitTrailingWhiteSpace
\ contains=ZinitTrailingWhiteSpace
" http://… or https://… or ftp://… or $HOME/… or /…
" TODO: Fix $HOME/… and /… not matching
syntax match ZinitSnippetUrl1 /\<\%(http:\/\/\|https:\/\/\|ftp:\/\/\|\$HOME\|\/\)[!-_]\+\%(\/[!-_]\+\)*\/\?/
\ contained
\ nextgroup=ZinitTrailingWhiteSpace
\ contains=ZinitTrailingWhiteSpace
" TODO: Fix ZinitTrailingWhiteSpace not matching
syntax match ZinitSnippetUrl2 /\<\%(\%(OMZ\|PZT\)::\)[!-_]\+\%(\/[!-_]\+\)*\/\?/hs=s+5
\ contained
\ nextgroup=ZinitTrailingWhiteSpace
\ contains=ZinitTrailingWhiteSpace
syntax match ZinitTrailingWhiteSpace /[[:space:]]\+$/ contained
" TODO: differentiate the no-value ices
" TODO: use contained
syntax match ZinitIceSubCommand /\sice\s/ms=s+1,me=e-1 nextgroup=ZinitIceModifiers
syntax match ZinitIceModifiers /\s\<\%(svn\|proto\|from\|teleid\|bindmap\|cloneopts\|id-as\|depth\|if\|wait\|load\)\>/ms=s+1
syntax match ZinitIceModifiers /\s\<\%(unload\|blockf\|on-update-of\|subscribe\|pick\|bpick\|src\|as\|ver\|silent\)\>/ms=s+1
syntax match ZinitIceModifiers /\s\<\%(lucid\|notify\|mv\|cp\|atinit\|atclone\|atload\|atpull\|nocd\|run-atpull\|has\)\>/ms=s+1
syntax match ZinitIceModifiers /\s\<\%(cloneonly\|make\|service\|trackbinds\|multisrc\|compile\|nocompile\)\>/ms=s+1
syntax match ZinitIceModifiers /\s\<\%(nocompletions\|reset-prompt\|wrap-track\|reset\|aliases\|sh\|bash\|ksh\|csh\)\>/ms=s+1
syntax match ZinitIceModifiers /\s\<\%(\\!sh\|!sh\|\\!bash\|!bash\|\\!ksh\|!ksh\|\\!csh\|!csh\)\>/ms=s+1
syntax match ZinitIceModifiers /\s\<\%(blockf\|silent\|lucid\|trackbinds\|cloneonly\|nocd\|run-atpull\)\>/ms=s+1
syntax match ZinitIceModifiers /\s\<\%(\|sh\|\!sh\|bash\|\!bash\|ksh\|\!ksh\|csh\|\!csh\)\>/ms=s+1
syntax match ZinitIceModifiers /\s\<\%(nocompletions\|svn\|aliases\|trigger-load\)\>/ms=s+1
syntax match ZinitIceModifiers /\s\<\%(light-mode\|is-snippet\|countdown\|ps-on-unload\|ps-on-update\)\>/ms=s+1
" Include also ices added by the existing annexes
syntax match ZinitIceModifiers /\s\<\%(test\|zman\|submod\|dl\|patch\|fbin\|sbin\|fsrc\|ferc\|fmod\|gem\|node\|rustup\|cargo\)\>/ms=s+1
" Additional Zsh and Zinit functions
syntax match ZshAndZinitFunctions /\<\%(compdef\|compinit\|zpcdreplay\|zpcdclear\|zpcompinit\|zpcompdef\)\>/
" Link
highlight def link ZshAndZinitFunctions Keyword
highlight def link ZinitCommand Statement
highlight def link ZinitSubCommands Title
highlight def link ZinitPluginSubCommands Title
highlight def link ZinitSnippetSubCommands Title
highlight def link ZinitIceModifiers Type
highlight def link ZinitSnippetShorthands1 Keyword
highlight def link ZinitSnippetShorthands2 Keyword
highlight def link ZinitPlugin1 Macro
highlight def link ZinitPlugin2 Macro
highlight def link ZinitPlugin3 Macro
highlight def link ZinitSnippetUrl1 Macro
highlight def link ZinitSnippetUrl2 Macro
highlight def link ZinitSnippetUrl3 Macro
highlight def link ZinitSnippetUrl4 Macro
highlight def link ZinitTrailingWhiteSpace Error
endif

View File

@@ -1,6 +1,4 @@
if exists('g:polyglot_disabled') && index(g:polyglot_disabled, 'julia') != -1 if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'julia') == -1
finish
endif
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" Support for LaTex-to-Unicode conversion as in the Julia REPL " " Support for LaTex-to-Unicode conversion as in the Julia REPL "
@@ -15,6 +13,9 @@ function! s:L2U_Setup()
if !has_key(b:, "l2u_enabled") if !has_key(b:, "l2u_enabled")
let b:l2u_enabled = 0 let b:l2u_enabled = 0
endif endif
if !has_key(b:, "l2u_autodetect_enable")
let b:l2u_autodetect_enable = 1
endif
" Did we install the L2U tab mappings? " Did we install the L2U tab mappings?
if !has_key(b:, "l2u_tab_set") if !has_key(b:, "l2u_tab_set")
@@ -94,34 +95,39 @@ endfunction
" Each time the filetype changes, we may need to enable or " Each time the filetype changes, we may need to enable or
" disable the LaTeX-to-Unicode functionality " disable the LaTeX-to-Unicode functionality
function! LaTeXtoUnicode#Refresh() function! LaTeXtoUnicode#Refresh()
call s:L2U_Setup() call s:L2U_Setup()
" skip if manually overridden
if !b:l2u_autodetect_enable
return ''
endif
" by default, LaTeX-to-Unicode is only active on julia files " by default, LaTeX-to-Unicode is only active on julia files
let file_types = s:L2U_file_type_regex(get(g:, "latex_to_unicode_file_types", "julia")) let file_types = s:L2U_file_type_regex(get(g:, "latex_to_unicode_file_types", "julia"))
let file_types_blacklist = s:L2U_file_type_regex(get(g:, "latex_to_unicode_file_types_blacklist", "$^")) let file_types_blacklist = s:L2U_file_type_regex(get(g:, "latex_to_unicode_file_types_blacklist", "$^"))
if match(&filetype, file_types) < 0 || match(&filetype, file_types_blacklist) >= 0 if match(&filetype, file_types) < 0 || match(&filetype, file_types_blacklist) >= 0
if b:l2u_enabled if b:l2u_enabled
call LaTeXtoUnicode#Disable() call LaTeXtoUnicode#Disable(1)
else else
return return ''
endif endif
elseif !b:l2u_enabled elseif !b:l2u_enabled
call LaTeXtoUnicode#Enable() call LaTeXtoUnicode#Enable(1)
endif endif
endfunction endfunction
function! LaTeXtoUnicode#Enable() function! LaTeXtoUnicode#Enable(...)
let auto_set = a:0 > 0 ? a:1 : 0
if b:l2u_enabled if b:l2u_enabled
return return ''
end end
call s:L2U_ResetLastCompletionInfo() call s:L2U_ResetLastCompletionInfo()
let b:l2u_enabled = 1 let b:l2u_enabled = 1
let b:l2u_autodetect_enable = auto_set
" If we're editing the first file upon opening vim, this will only init the " If we're editing the first file upon opening vim, this will only init the
" command line mode mapping, and the full initialization will be performed by " command line mode mapping, and the full initialization will be performed by
@@ -129,18 +135,18 @@ function! LaTeXtoUnicode#Enable()
" Otherwise, if we're opening a file from within a running vim session, this " Otherwise, if we're opening a file from within a running vim session, this
" will actually initialize all the LaTeX-to-Unicode substitutions. " will actually initialize all the LaTeX-to-Unicode substitutions.
call LaTeXtoUnicode#Init() call LaTeXtoUnicode#Init()
return ''
return
endfunction endfunction
function! LaTeXtoUnicode#Disable() function! LaTeXtoUnicode#Disable(...)
let auto_set = a:0 > 0 ? a:1 : 0
if !b:l2u_enabled if !b:l2u_enabled
return return ''
endif endif
let b:l2u_enabled = 0 let b:l2u_enabled = 0
let b:l2u_autodetect_enable = auto_set
call LaTeXtoUnicode#Init() call LaTeXtoUnicode#Init()
return return ''
endfunction endfunction
" Translate old options to their new equivalents " Translate old options to their new equivalents
@@ -248,7 +254,6 @@ function! LaTeXtoUnicode#omnifunc(findstart, base)
endif endif
let b:l2u_in_fallback = 0 let b:l2u_in_fallback = 0
" set info for the callback " set info for the callback
let b:l2u_tab_completing = 1
let b:l2u_found_completion = 1 let b:l2u_found_completion = 1
" analyse current line " analyse current line
let col1 = col('.') let col1 = col('.')
@@ -377,6 +382,7 @@ function! LaTeXtoUnicode#Tab()
endif endif
" reset the in_fallback info " reset the in_fallback info
let b:l2u_in_fallback = 0 let b:l2u_in_fallback = 0
let b:l2u_tab_completing = 1
" temporary change to completeopt to use the `longest` setting, which is " temporary change to completeopt to use the `longest` setting, which is
" probably the only one which makes sense given that the goal of the " probably the only one which makes sense given that the goal of the
" completion is to substitute the final string " completion is to substitute the final string
@@ -385,7 +391,8 @@ function! LaTeXtoUnicode#Tab()
set completeopt-=noinsert set completeopt-=noinsert
" invoke omnicompletion; failure to perform LaTeX-to-Unicode completion is " invoke omnicompletion; failure to perform LaTeX-to-Unicode completion is
" handled by the CompleteDone autocommand. " handled by the CompleteDone autocommand.
return "\<C-X>\<C-O>" call feedkeys("\<C-X>\<C-O>", 'n')
return ""
endfunction endfunction
" This function is called at every CompleteDone event, and is meant to handle " This function is called at every CompleteDone event, and is meant to handle
@@ -411,7 +418,7 @@ function! LaTeXtoUnicode#FallbackCallback()
endfunction endfunction
" This is the function that performs the substitution in command-line mode " This is the function that performs the substitution in command-line mode
function! LaTeXtoUnicode#CmdTab(triggeredbytab) function! LaTeXtoUnicode#CmdTab(trigger)
" first stage " first stage
" analyse command line " analyse command line
let col1 = getcmdpos() - 1 let col1 = getcmdpos() - 1
@@ -420,10 +427,12 @@ function! LaTeXtoUnicode#CmdTab(triggeredbytab)
let b:l2u_singlebslash = (match(l[0:col1-1], '\\$') >= 0) let b:l2u_singlebslash = (match(l[0:col1-1], '\\$') >= 0)
" completion not found " completion not found
if col0 == -1 if col0 == -1
if a:triggeredbytab if a:trigger == &wildchar
call feedkeys("\<Tab>", 'nt') " fall-back to the default <Tab> call feedkeys(nr2char(a:trigger), 'nt') " fall-back to the default wildchar
elseif a:trigger == char2nr("\<S-Tab>")
call feedkeys("\<S-Tab>", 'nt') " fall-back to the default <S-Tab>
endif endif
return l return ''
endif endif
let base = l[col0 : col1-1] let base = l[col0 : col1-1]
" search for matches " search for matches
@@ -432,39 +441,28 @@ function! LaTeXtoUnicode#CmdTab(triggeredbytab)
for k in keys(g:l2u_symbols_dict) for k in keys(g:l2u_symbols_dict)
if k ==# base if k ==# base
let exact_match = 1 let exact_match = 1
endif break
if len(k) >= len(base) && k[0 : len(base)-1] ==# base elseif len(k) >= len(base) && k[0 : len(base)-1] ==# base
call add(partmatches, k) call add(partmatches, k)
endif endif
endfor endfor
if len(partmatches) == 0 if !exact_match && len(partmatches) == 0
if a:triggeredbytab " no matches, call fallbacks
call feedkeys("\<Tab>", 'nt') " fall-back to the default <Tab> if a:trigger == &wildchar
call feedkeys(nr2char(a:trigger), 'nt') " fall-back to the default wildchar
elseif a:trigger == char2nr("\<S-Tab>")
call feedkeys("\<S-Tab>", 'nt') " fall-back to the default <S-Tab>
endif endif
return l elseif exact_match
endif " exact matches are replaced with Unicode
" exact matches are replaced with Unicode
if exact_match
let unicode = g:l2u_symbols_dict[base] let unicode = g:l2u_symbols_dict[base]
if col0 > 0 call feedkeys(repeat("\b", len(base)) . unicode, 'nt')
let pre = l[0 : col0 - 1]
else
let pre = ''
endif
let posdiff = col1-col0 - len(unicode)
call setcmdpos(col1 - posdiff + 1)
return pre . unicode . l[col1 : -1]
endif
" no exact match: complete with the longest common prefix
let common = s:L2U_longest_common_prefix(partmatches)
if col0 > 0
let pre = l[0 : col0 - 1]
else else
let pre = '' " no exact match: complete with the longest common prefix
let common = s:L2U_longest_common_prefix(partmatches)
call feedkeys(common[len(base):], 'nt')
endif endif
let posdiff = col1-col0 - len(common) return ''
call setcmdpos(col1 - posdiff + 1)
return pre . common . l[col1 : -1]
endfunction endfunction
" Setup the L2U tab mapping " Setup the L2U tab mapping
@@ -475,7 +473,8 @@ function! s:L2U_SetTab(wait_insert_enter)
let b:l2u_cmdtab_keys = [b:l2u_cmdtab_keys] let b:l2u_cmdtab_keys = [b:l2u_cmdtab_keys]
endif endif
for k in b:l2u_cmdtab_keys for k in b:l2u_cmdtab_keys
exec 'cnoremap <buffer> '.k.' <C-\>eLaTeXtoUnicode#CmdTab('.(k ==? '<Tab>').')<CR>' exec 'let trigger = char2nr("'.(k[0] == '<' ? '\' : '').k.'")'
exec 'cnoremap <buffer><expr> '.k.' LaTeXtoUnicode#CmdTab('.trigger.')'
endfor endfor
let b:l2u_cmdtab_set = 1 let b:l2u_cmdtab_set = 1
endif endif
@@ -639,6 +638,7 @@ function! LaTeXtoUnicode#Init(...)
call s:L2U_SetTab(wait_insert_enter) call s:L2U_SetTab(wait_insert_enter)
call s:L2U_SetAutoSub(wait_insert_enter) call s:L2U_SetAutoSub(wait_insert_enter)
call s:L2U_SetKeymap() call s:L2U_SetKeymap()
return ''
endfunction endfunction
function! LaTeXtoUnicode#Toggle() function! LaTeXtoUnicode#Toggle()
@@ -650,5 +650,7 @@ function! LaTeXtoUnicode#Toggle()
call LaTeXtoUnicode#Enable() call LaTeXtoUnicode#Enable()
echo "LaTeX-to-Unicode enabled" echo "LaTeX-to-Unicode enabled"
endif endif
return return ''
endfunction endfunction
endif

View File

@@ -1,6 +1,4 @@
if exists('g:polyglot_disabled') && index(g:polyglot_disabled, 'rst') != -1 if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'rst') == -1
finish
endif
" Author: Antony Lee <anntzer.lee@gmail.com> " Author: Antony Lee <anntzer.lee@gmail.com>
" Description: Helper functions for reStructuredText syntax folding " Description: Helper functions for reStructuredText syntax folding
@@ -64,3 +62,5 @@ function RstFold#GetRstFoldText()
let text = thisline =~ '^\([=`:.''"~^_*+#-]\)\1\+$' ? getline(v:foldstart + 1) : thisline let text = thisline =~ '^\([=`:.''"~^_*+#-]\)\1\+$' ? getline(v:foldstart + 1) : thisline
return indent . text return indent . text
endfunction endfunction
endif

641
autoload/ada.vim Normal file
View File

@@ -0,0 +1,641 @@
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'ada') == -1
"------------------------------------------------------------------------------
" Description: Perform Ada specific completion & tagging.
" Language: Ada (2005)
" $Id: ada.vim 887 2008-07-08 14:29:01Z krischik $
" Maintainer: Mathias Brousset <mathiasb17@gmail.com>
" Martin Krischik <krischik@users.sourceforge.net>
" Taylor Venable <taylor@metasyntax.net>
" Neil Bird <neil@fnxweb.com>
" Ned Okie <nokie@radford.edu>
" $Author: krischik $
" $Date: 2017-01-31 20:20:05 +0200 (Mon, 01 Jan 2017) $
" Version: 4.6
" $Revision: 887 $
" $HeadURL: https://gnuada.svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/autoload/ada.vim $
" History: 24.05.2006 MK Unified Headers
" 26.05.2006 MK ' should not be in iskeyword.
" 16.07.2006 MK Ada-Mode as vim-ball
" 02.10.2006 MK Better folding.
" 15.10.2006 MK Bram's suggestion for runtime integration
" 05.11.2006 MK Bram suggested not to use include protection for
" autoload
" 05.11.2006 MK Bram suggested to save on spaces
" 08.07.2007 TV fix mapleader problems.
" 09.05.2007 MK Session just won't work no matter how much
" tweaking is done
" 19.09.2007 NO still some mapleader problems
" 31.01.2017 MB fix more mapleader problems
" Help Page: ft-ada-functions
"------------------------------------------------------------------------------
if version < 700
finish
endif
let s:keepcpo= &cpo
set cpo&vim
" Section: Constants {{{1
"
let g:ada#DotWordRegex = '\a\w*\(\_s*\.\_s*\a\w*\)*'
let g:ada#WordRegex = '\a\w*'
let g:ada#Comment = "\\v^(\"[^\"]*\"|'.'|[^\"']){-}\\zs\\s*--.*"
let g:ada#Keywords = []
" Section: g:ada#Keywords {{{1
"
" Section: add Ada keywords {{{2
"
for Item in ['abort', 'else', 'new', 'return', 'abs', 'elsif', 'not', 'reverse', 'abstract', 'end', 'null', 'accept', 'entry', 'select', 'access', 'exception', 'of', 'separate', 'aliased', 'exit', 'or', 'subtype', 'all', 'others', 'synchronized', 'and', 'for', 'out', 'array', 'function', 'overriding', 'tagged', 'at', 'task', 'generic', 'package', 'terminate', 'begin', 'goto', 'pragma', 'then', 'body', 'private', 'type', 'if', 'procedure', 'case', 'in', 'protected', 'until', 'constant', 'interface', 'use', 'is', 'raise', 'declare', 'range', 'when', 'delay', 'limited', 'record', 'while', 'delta', 'loop', 'rem', 'with', 'digits', 'renames', 'do', 'mod', 'requeue', 'xor']
let g:ada#Keywords += [{
\ 'word': Item,
\ 'menu': 'keyword',
\ 'info': 'Ada keyword.',
\ 'kind': 'k',
\ 'icase': 1}]
endfor
" Section: GNAT Project Files {{{3
"
if exists ('g:ada_with_gnat_project_files')
for Item in ['project']
let g:ada#Keywords += [{
\ 'word': Item,
\ 'menu': 'keyword',
\ 'info': 'GNAT projectfile keyword.',
\ 'kind': 'k',
\ 'icase': 1}]
endfor
endif
" Section: add standart exception {{{2
"
for Item in ['Constraint_Error', 'Program_Error', 'Storage_Error', 'Tasking_Error', 'Status_Error', 'Mode_Error', 'Name_Error', 'Use_Error', 'Device_Error', 'End_Error', 'Data_Error', 'Layout_Error', 'Length_Error', 'Pattern_Error', 'Index_Error', 'Translation_Error', 'Time_Error', 'Argument_Error', 'Tag_Error', 'Picture_Error', 'Terminator_Error', 'Conversion_Error', 'Pointer_Error', 'Dereference_Error', 'Update_Error']
let g:ada#Keywords += [{
\ 'word': Item,
\ 'menu': 'exception',
\ 'info': 'Ada standart exception.',
\ 'kind': 'x',
\ 'icase': 1}]
endfor
" Section: add GNAT exception {{{3
"
if exists ('g:ada_gnat_extensions')
for Item in ['Assert_Failure']
let g:ada#Keywords += [{
\ 'word': Item,
\ 'menu': 'exception',
\ 'info': 'GNAT exception.',
\ 'kind': 'x',
\ 'icase': 1}]
endfor
endif
" Section: add Ada buildin types {{{2
"
for Item in ['Boolean', 'Integer', 'Natural', 'Positive', 'Float', 'Character', 'Wide_Character', 'Wide_Wide_Character', 'String', 'Wide_String', 'Wide_Wide_String', 'Duration']
let g:ada#Keywords += [{
\ 'word': Item,
\ 'menu': 'type',
\ 'info': 'Ada buildin type.',
\ 'kind': 't',
\ 'icase': 1}]
endfor
" Section: add GNAT buildin types {{{3
"
if exists ('g:ada_gnat_extensions')
for Item in ['Short_Integer', 'Short_Short_Integer', 'Long_Integer', 'Long_Long_Integer', 'Short_Float', 'Short_Short_Float', 'Long_Float', 'Long_Long_Float']
let g:ada#Keywords += [{
\ 'word': Item,
\ 'menu': 'type',
\ 'info': 'GNAT buildin type.',
\ 'kind': 't',
\ 'icase': 1}]
endfor
endif
" Section: add Ada Attributes {{{2
"
for Item in ['''Access', '''Address', '''Adjacent', '''Aft', '''Alignment', '''Base', '''Bit_Order', '''Body_Version', '''Callable', '''Caller', '''Ceiling', '''Class', '''Component_Size', '''Compose', '''Constrained', '''Copy_Sign', '''Count', '''Definite', '''Delta', '''Denorm', '''Digits', '''Emax', '''Exponent', '''External_Tag', '''Epsilon', '''First', '''First_Bit', '''Floor', '''Fore', '''Fraction', '''Identity', '''Image', '''Input', '''Large', '''Last', '''Last_Bit', '''Leading_Part', '''Length', '''Machine', '''Machine_Emax', '''Machine_Emin', '''Machine_Mantissa', '''Machine_Overflows', '''Machine_Radix', '''Machine_Rounding', '''Machine_Rounds', '''Mantissa', '''Max', '''Max_Size_In_Storage_Elements', '''Min', '''Mod', '''Model', '''Model_Emin', '''Model_Epsilon', '''Model_Mantissa', '''Model_Small', '''Modulus', '''Output', '''Partition_ID', '''Pos', '''Position', '''Pred', '''Priority', '''Range', '''Read', '''Remainder', '''Round', '''Rounding', '''Safe_Emax', '''Safe_First', '''Safe_Large', '''Safe_Last', '''Safe_Small', '''Scale', '''Scaling', '''Signed_Zeros', '''Size', '''Small', '''Storage_Pool', '''Storage_Size', '''Stream_Size', '''Succ', '''Tag', '''Terminated', '''Truncation', '''Unbiased_Rounding', '''Unchecked_Access', '''Val', '''Valid', '''Value', '''Version', '''Wide_Image', '''Wide_Value', '''Wide_Wide_Image', '''Wide_Wide_Value', '''Wide_Wide_Width', '''Wide_Width', '''Width', '''Write']
let g:ada#Keywords += [{
\ 'word': Item,
\ 'menu': 'attribute',
\ 'info': 'Ada attribute.',
\ 'kind': 'a',
\ 'icase': 1}]
endfor
" Section: add GNAT Attributes {{{3
"
if exists ('g:ada_gnat_extensions')
for Item in ['''Abort_Signal', '''Address_Size', '''Asm_Input', '''Asm_Output', '''AST_Entry', '''Bit', '''Bit_Position', '''Code_Address', '''Default_Bit_Order', '''Elaborated', '''Elab_Body', '''Elab_Spec', '''Emax', '''Enum_Rep', '''Epsilon', '''Fixed_Value', '''Has_Access_Values', '''Has_Discriminants', '''Img', '''Integer_Value', '''Machine_Size', '''Max_Interrupt_Priority', '''Max_Priority', '''Maximum_Alignment', '''Mechanism_Code', '''Null_Parameter', '''Object_Size', '''Passed_By_Reference', '''Range_Length', '''Storage_Unit', '''Target_Name', '''Tick', '''To_Address', '''Type_Class', '''UET_Address', '''Unconstrained_Array', '''Universal_Literal_String', '''Unrestricted_Access', '''VADS_Size', '''Value_Size', '''Wchar_T_Size', '''Word_Size']
let g:ada#Keywords += [{
\ 'word': Item,
\ 'menu': 'attribute',
\ 'info': 'GNAT attribute.',
\ 'kind': 'a',
\ 'icase': 1}]
endfor
endif
" Section: add Ada Pragmas {{{2
"
for Item in ['All_Calls_Remote', 'Assert', 'Assertion_Policy', 'Asynchronous', 'Atomic', 'Atomic_Components', 'Attach_Handler', 'Controlled', 'Convention', 'Detect_Blocking', 'Discard_Names', 'Elaborate', 'Elaborate_All', 'Elaborate_Body', 'Export', 'Import', 'Inline', 'Inspection_Point', 'Interface (Obsolescent)', 'Interrupt_Handler', 'Interrupt_Priority', 'Linker_Options', 'List', 'Locking_Policy', 'Memory_Size (Obsolescent)', 'No_Return', 'Normalize_Scalars', 'Optimize', 'Pack', 'Page', 'Partition_Elaboration_Policy', 'Preelaborable_Initialization', 'Preelaborate', 'Priority', 'Priority_Specific_Dispatching', 'Profile', 'Pure', 'Queueing_Policy', 'Relative_Deadline', 'Remote_Call_Interface', 'Remote_Types', 'Restrictions', 'Reviewable', 'Shared (Obsolescent)', 'Shared_Passive', 'Storage_Size', 'Storage_Unit (Obsolescent)', 'Suppress', 'System_Name (Obsolescent)', 'Task_Dispatching_Policy', 'Unchecked_Union', 'Unsuppress', 'Volatile', 'Volatile_Components']
let g:ada#Keywords += [{
\ 'word': Item,
\ 'menu': 'pragma',
\ 'info': 'Ada pragma.',
\ 'kind': 'p',
\ 'icase': 1}]
endfor
" Section: add GNAT Pragmas {{{3
"
if exists ('g:ada_gnat_extensions')
for Item in ['Abort_Defer', 'Ada_83', 'Ada_95', 'Ada_05', 'Annotate', 'Ast_Entry', 'C_Pass_By_Copy', 'Comment', 'Common_Object', 'Compile_Time_Warning', 'Complex_Representation', 'Component_Alignment', 'Convention_Identifier', 'CPP_Class', 'CPP_Constructor', 'CPP_Virtual', 'CPP_Vtable', 'Debug', 'Elaboration_Checks', 'Eliminate', 'Export_Exception', 'Export_Function', 'Export_Object', 'Export_Procedure', 'Export_Value', 'Export_Valued_Procedure', 'Extend_System', 'External', 'External_Name_Casing', 'Finalize_Storage_Only', 'Float_Representation', 'Ident', 'Import_Exception', 'Import_Function', 'Import_Object', 'Import_Procedure', 'Import_Valued_Procedure', 'Initialize_Scalars', 'Inline_Always', 'Inline_Generic', 'Interface_Name', 'Interrupt_State', 'Keep_Names', 'License', 'Link_With', 'Linker_Alias', 'Linker_Section', 'Long_Float', 'Machine_Attribute', 'Main_Storage', 'Obsolescent', 'Passive', 'Polling', 'Profile_Warnings', 'Propagate_Exceptions', 'Psect_Object', 'Pure_Function', 'Restriction_Warnings', 'Source_File_Name', 'Source_File_Name_Project', 'Source_Reference', 'Stream_Convert', 'Style_Checks', 'Subtitle', 'Suppress_All', 'Suppress_Exception_Locations', 'Suppress_Initialization', 'Task_Info', 'Task_Name', 'Task_Storage', 'Thread_Body', 'Time_Slice', 'Title', 'Unimplemented_Unit', 'Universal_Data', 'Unreferenced', 'Unreserve_All_Interrupts', 'Use_VADS_Size', 'Validity_Checks', 'Warnings', 'Weak_External']
let g:ada#Keywords += [{
\ 'word': Item,
\ 'menu': 'pragma',
\ 'info': 'GNAT pragma.',
\ 'kind': 'p',
\ 'icase': 1}]
endfor
endif
" 1}}}
" Section: g:ada#Ctags_Kinds {{{1
"
let g:ada#Ctags_Kinds = {
\ 'P': ["packspec", "package specifications"],
\ 'p': ["package", "packages"],
\ 'T': ["typespec", "type specifications"],
\ 't': ["type", "types"],
\ 'U': ["subspec", "subtype specifications"],
\ 'u': ["subtype", "subtypes"],
\ 'c': ["component", "record type components"],
\ 'l': ["literal", "enum type literals"],
\ 'V': ["varspec", "variable specifications"],
\ 'v': ["variable", "variables"],
\ 'f': ["formal", "generic formal parameters"],
\ 'n': ["constant", "constants"],
\ 'x': ["exception", "user defined exceptions"],
\ 'R': ["subprogspec", "subprogram specifications"],
\ 'r': ["subprogram", "subprograms"],
\ 'K': ["taskspec", "task specifications"],
\ 'k': ["task", "tasks"],
\ 'O': ["protectspec", "protected data specifications"],
\ 'o': ["protected", "protected data"],
\ 'E': ["entryspec", "task/protected data entry specifications"],
\ 'e': ["entry", "task/protected data entries"],
\ 'b': ["label", "labels"],
\ 'i': ["identifier", "loop/declare identifiers"],
\ 'a': ["autovar", "automatic variables"],
\ 'y': ["annon", "loops and blocks with no identifier"]}
" Section: ada#Word (...) {{{1
"
" Extract current Ada word across multiple lines
" AdaWord ([line, column])\
"
function ada#Word (...)
if a:0 > 1
let l:Line_Nr = a:1
let l:Column_Nr = a:2 - 1
else
let l:Line_Nr = line('.')
let l:Column_Nr = col('.') - 1
endif
let l:Line = substitute (getline (l:Line_Nr), g:ada#Comment, '', '' )
" Cope with tag searching for items in comments; if we are, don't loop
" backards looking for previous lines
if l:Column_Nr > strlen(l:Line)
" We were in a comment
let l:Line = getline(l:Line_Nr)
let l:Search_Prev_Lines = 0
else
let l:Search_Prev_Lines = 1
endif
" Go backwards until we find a match (Ada ID) that *doesn't* include our
" location - i.e., the previous ID. This is because the current 'correct'
" match will toggle matching/not matching as we traverse characters
" backwards. Thus, we have to find the previous unrelated match, exclude
" it, then use the next full match (ours).
" Remember to convert vim column 'l:Column_Nr' [1..n] to string offset [0..(n-1)]
" ... but start, here, one after the required char.
let l:New_Column = l:Column_Nr + 1
while 1
let l:New_Column = l:New_Column - 1
if l:New_Column < 0
" Have to include previous l:Line from file
let l:Line_Nr = l:Line_Nr - 1
if l:Line_Nr < 1 || !l:Search_Prev_Lines
" Start of file or matching in a comment
let l:Line_Nr = 1
let l:New_Column = 0
let l:Our_Match = match (l:Line, g:ada#WordRegex )
break
endif
" Get previous l:Line, and prepend it to our search string
let l:New_Line = substitute (getline (l:Line_Nr), g:ada#Comment, '', '' )
let l:New_Column = strlen (l:New_Line) - 1
let l:Column_Nr = l:Column_Nr + l:New_Column
let l:Line = l:New_Line . l:Line
endif
" Check to see if this is a match excluding 'us'
let l:Match_End = l:New_Column +
\ matchend (strpart (l:Line,l:New_Column), g:ada#WordRegex ) - 1
if l:Match_End >= l:New_Column &&
\ l:Match_End < l:Column_Nr
" Yes
let l:Our_Match = l:Match_End+1 +
\ match (strpart (l:Line,l:Match_End+1), g:ada#WordRegex )
break
endif
endwhile
" Got anything?
if l:Our_Match < 0
return ''
else
let l:Line = strpart (l:Line, l:Our_Match)
endif
" Now simply add further lines until the match gets no bigger
let l:Match_String = matchstr (l:Line, g:ada#WordRegex)
let l:Last_Line = line ('$')
let l:Line_Nr = line ('.') + 1
while l:Line_Nr <= l:Last_Line
let l:Last_Match = l:Match_String
let l:Line = l:Line .
\ substitute (getline (l:Line_Nr), g:ada#Comment, '', '')
let l:Match_String = matchstr (l:Line, g:ada#WordRegex)
if l:Match_String == l:Last_Match
break
endif
endwhile
" Strip whitespace & return
return substitute (l:Match_String, '\s\+', '', 'g')
endfunction ada#Word
" Section: ada#List_Tag (...) {{{1
"
" List tags in quickfix window
"
function ada#List_Tag (...)
if a:0 > 1
let l:Tag_Word = ada#Word (a:1, a:2)
elseif a:0 > 0
let l:Tag_Word = a:1
else
let l:Tag_Word = ada#Word ()
endif
echo "Searching for" l:Tag_Word
let l:Pattern = '^' . l:Tag_Word . '$'
let l:Tag_List = taglist (l:Pattern)
let l:Error_List = []
"
" add symbols
"
for Tag_Item in l:Tag_List
if l:Tag_Item['kind'] == ''
let l:Tag_Item['kind'] = 's'
endif
let l:Error_List += [
\ l:Tag_Item['filename'] . '|' .
\ l:Tag_Item['cmd'] . '|' .
\ l:Tag_Item['kind'] . "\t" .
\ l:Tag_Item['name'] ]
endfor
set errorformat=%f\|%l\|%m
cexpr l:Error_List
cwindow
endfunction ada#List_Tag
" Section: ada#Jump_Tag (Word, Mode) {{{1
"
" Word tag - include '.' and if Ada make uppercase
"
function ada#Jump_Tag (Word, Mode)
if a:Word == ''
" Get current word
let l:Word = ada#Word()
if l:Word == ''
throw "NOT_FOUND: no identifier found."
endif
else
let l:Word = a:Word
endif
echo "Searching for " . l:Word
try
execute a:Mode l:Word
catch /.*:E426:.*/
let ignorecase = &ignorecase
set ignorecase
execute a:Mode l:Word
let &ignorecase = ignorecase
endtry
return
endfunction ada#Jump_Tag
" Section: ada#Insert_Backspace () {{{1
"
" Backspace at end of line after auto-inserted commentstring '-- ' wipes it
"
function ada#Insert_Backspace ()
let l:Line = getline ('.')
if col ('.') > strlen (l:Line) &&
\ match (l:Line, '-- $') != -1 &&
\ match (&comments,'--') != -1
return "\<bs>\<bs>\<bs>"
else
return "\<bs>"
endif
return
endfunction ada#InsertBackspace
" Section: Insert Completions {{{1
"
" Section: ada#User_Complete(findstart, base) {{{2
"
" This function is used for the 'complete' option.
"
function! ada#User_Complete(findstart, base)
if a:findstart == 1
"
" locate the start of the word
"
let line = getline ('.')
let start = col ('.') - 1
while start > 0 && line[start - 1] =~ '\i\|'''
let start -= 1
endwhile
return start
else
"
" look up matches
"
let l:Pattern = '^' . a:base . '.*$'
"
" add keywords
"
for Tag_Item in g:ada#Keywords
if l:Tag_Item['word'] =~? l:Pattern
if complete_add (l:Tag_Item) == 0
return []
endif
if complete_check ()
return []
endif
endif
endfor
return []
endif
endfunction ada#User_Complete
" Section: ada#Completion (cmd) {{{2
"
" Word completion (^N/^R/^X^]) - force '.' inclusion
function ada#Completion (cmd)
set iskeyword+=46
return a:cmd . "\<C-R>=ada#Completion_End ()\<CR>"
endfunction ada#Completion
" Section: ada#Completion_End () {{{2
"
function ada#Completion_End ()
set iskeyword-=46
return ''
endfunction ada#Completion_End
" Section: ada#Create_Tags {{{1
"
function ada#Create_Tags (option)
if a:option == 'file'
let l:Filename = fnamemodify (bufname ('%'), ':p')
elseif a:option == 'dir'
let l:Filename =
\ fnamemodify (bufname ('%'), ':p:h') . "*.ada " .
\ fnamemodify (bufname ('%'), ':p:h') . "*.adb " .
\ fnamemodify (bufname ('%'), ':p:h') . "*.ads"
else
let l:Filename = a:option
endif
execute '!ctags --excmd=number ' . l:Filename
endfunction ada#Create_Tags
" Section: ada#Switch_Session {{{1
"
function ada#Switch_Session (New_Session)
"
" you should not save to much date into the seession since they will
" be sourced
"
let l:sessionoptions=&sessionoptions
try
set sessionoptions=buffers,curdir,folds,globals,resize,slash,tabpages,tabpages,unix,winpos,winsize
if a:New_Session != v:this_session
"
" We actually got a new session - otherwise there
" is nothing to do.
"
if strlen (v:this_session) > 0
execute 'mksession! ' . v:this_session
endif
let v:this_session = a:New_Session
"if filereadable (v:this_session)
"execute 'source ' . v:this_session
"endif
augroup ada_session
autocmd!
autocmd VimLeavePre * execute 'mksession! ' . v:this_session
augroup END
"if exists ("g:Tlist_Auto_Open") && g:Tlist_Auto_Open
"TlistOpen
"endif
endif
finally
let &sessionoptions=l:sessionoptions
endtry
return
endfunction ada#Switch_Session
" Section: GNAT Pretty Printer folding {{{1
"
if exists('g:ada_folding') && g:ada_folding[0] == 'g'
"
" Lines consisting only of ')' ';' are due to a gnat pretty bug and
" have the same level as the line above (can't happen in the first
" line).
"
let s:Fold_Collate = '^\([;)]*$\|'
"
" some lone statements are folded with the line above
"
if stridx (g:ada_folding, 'i') >= 0
let s:Fold_Collate .= '\s\+\<is\>$\|'
endif
if stridx (g:ada_folding, 'b') >= 0
let s:Fold_Collate .= '\s\+\<begin\>$\|'
endif
if stridx (g:ada_folding, 'p') >= 0
let s:Fold_Collate .= '\s\+\<private\>$\|'
endif
if stridx (g:ada_folding, 'x') >= 0
let s:Fold_Collate .= '\s\+\<exception\>$\|'
endif
" We also handle empty lines and
" comments here.
let s:Fold_Collate .= '--\)'
function ada#Pretty_Print_Folding (Line) " {{{2
let l:Text = getline (a:Line)
if l:Text =~ s:Fold_Collate
"
" fold with line above
"
let l:Level = "="
elseif l:Text =~ '^\s\+('
"
" gnat outdents a line which stards with a ( by one characters so
" that parameters which follow are aligned.
"
let l:Level = (indent (a:Line) + 1) / &shiftwidth
else
let l:Level = indent (a:Line) / &shiftwidth
endif
return l:Level
endfunction ada#Pretty_Print_Folding " }}}2
endif
" Section: Options and Menus {{{1
"
" Section: ada#Switch_Syntax_Options {{{2
"
function ada#Switch_Syntax_Option (option)
syntax off
if exists ('g:ada_' . a:option)
unlet g:ada_{a:option}
echo a:option . 'now off'
else
let g:ada_{a:option}=1
echo a:option . 'now on'
endif
syntax on
endfunction ada#Switch_Syntax_Option
" Section: ada#Map_Menu {{{2
"
function ada#Map_Menu (Text, Keys, Command)
if a:Keys[0] == ':'
execute
\ "50amenu " .
\ "Ada." . escape(a:Text, ' ') .
\ "<Tab>" . a:Keys .
\ " :" . a:Command . "<CR>"
execute
\ "command -buffer " .
\ a:Keys[1:] .
\" :" . a:Command . "<CR>"
elseif a:Keys[0] == '<'
execute
\ "50amenu " .
\ "Ada." . escape(a:Text, ' ') .
\ "<Tab>" . a:Keys .
\ " :" . a:Command . "<CR>"
execute
\ "nnoremap <buffer> " .
\ a:Keys .
\" :" . a:Command . "<CR>"
execute
\ "inoremap <buffer> " .
\ a:Keys .
\" <C-O>:" . a:Command . "<CR>"
else
if exists("g:mapleader")
let l:leader = g:mapleader
else
let l:leader = '\'
endif
execute
\ "50amenu " .
\ "Ada." . escape(a:Text, ' ') .
\ "<Tab>" . escape(l:leader . "a" . a:Keys , '\') .
\ " :" . a:Command . "<CR>"
execute
\ "nnoremap <buffer>" .
\ " <Leader>a" . a:Keys .
\" :" . a:Command
execute
\ "inoremap <buffer>" .
\ " <Leader>a" . a:Keys .
\" <C-O>:" . a:Command
endif
return
endfunction
" Section: ada#Map_Popup {{{2
"
function ada#Map_Popup (Text, Keys, Command)
if exists("g:mapleader")
let l:leader = g:mapleader
else
let l:leader = '\'
endif
execute
\ "50amenu " .
\ "PopUp." . escape(a:Text, ' ') .
\ "<Tab>" . escape(l:leader . "a" . a:Keys , '\') .
\ " :" . a:Command . "<CR>"
call ada#Map_Menu (a:Text, a:Keys, a:Command)
return
endfunction ada#Map_Popup
" }}}1
lockvar g:ada#WordRegex
lockvar g:ada#DotWordRegex
lockvar g:ada#Comment
lockvar! g:ada#Keywords
lockvar! g:ada#Ctags_Kinds
let &cpo = s:keepcpo
unlet s:keepcpo
finish " 1}}}
"------------------------------------------------------------------------------
" Copyright (C) 2006 Martin Krischik
"
" Vim is Charityware - see ":help license" or uganda.txt for licence details.
"------------------------------------------------------------------------------
" vim: textwidth=78 wrap tabstop=8 shiftwidth=3 softtabstop=3 noexpandtab
" vim: foldmethod=marker
endif

View File

@@ -1,13 +1,23 @@
if exists('g:polyglot_disabled') && index(g:polyglot_disabled, 'rust') != -1 if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'rust') == -1
finish
endif
function! cargo#Load() function! cargo#Load()
" Utility call to get this script loaded, for debugging " Utility call to get this script loaded, for debugging
endfunction endfunction
function! cargo#cmd(args) function! cargo#cmd(args) abort
execute "! cargo" a:args " Trim trailing spaces. This is necessary since :terminal command parses
" trailing spaces as an empty argument.
let args = substitute(a:args, '\s\+$', '', '')
if exists('g:cargo_shell_command_runner')
let cmd = g:cargo_shell_command_runner
elseif has('terminal')
let cmd = 'terminal'
elseif has('nvim')
let cmd = 'noautocmd new | terminal'
else
let cmd = '!'
endif
execute cmd 'cargo' args
endfunction endfunction
function! s:nearest_cargo(...) abort function! s:nearest_cargo(...) abort
@@ -59,6 +69,10 @@ function! cargo#build(args)
call cargo#cmd("build " . a:args) call cargo#cmd("build " . a:args)
endfunction endfunction
function! cargo#check(args)
call cargo#cmd("check " . a:args)
endfunction
function! cargo#clean(args) function! cargo#clean(args)
call cargo#cmd("clean " . a:args) call cargo#cmd("clean " . a:args)
endfunction endfunction
@@ -88,6 +102,22 @@ function! cargo#bench(args)
call cargo#cmd("bench " . a:args) call cargo#cmd("bench " . a:args)
endfunction endfunction
function! cargo#update(args)
call cargo#cmd("update " . a:args)
endfunction
function! cargo#search(args)
call cargo#cmd("search " . a:args)
endfunction
function! cargo#publish(args)
call cargo#cmd("publish " . a:args)
endfunction
function! cargo#install(args)
call cargo#cmd("install " . a:args)
endfunction
function! cargo#runtarget(args) function! cargo#runtarget(args)
let l:filename = expand('%:p') let l:filename = expand('%:p')
let l:read_manifest = system('cargo read-manifest') let l:read_manifest = system('cargo read-manifest')
@@ -117,3 +147,5 @@ function! cargo#runtarget(args)
endfunction endfunction
" vim: set et sw=4 sts=4 ts=8: " vim: set et sw=4 sts=4 ts=8:
endif

View File

@@ -1,9 +1,8 @@
if exists('g:polyglot_disabled') && index(g:polyglot_disabled, 'rust') != -1 if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'rust') == -1
finish
endif
function! cargo#quickfix#CmdPre() abort function! cargo#quickfix#CmdPre() abort
if &filetype ==# 'rust' && get(b:, 'current_compiler', '') ==# 'cargo' if &filetype ==# 'rust' && get(b:, 'current_compiler', '') ==# 'cargo' &&
\ &makeprg =~ '\V\^cargo\ \.\*'
" Preserve the current directory, and 'lcd' to the nearest Cargo file. " 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_has_lcd = haslocaldir()
let b:rust_compiler_cargo_qf_prev_cd = getcwd() let b:rust_compiler_cargo_qf_prev_cd = getcwd()
@@ -28,3 +27,5 @@ function! cargo#quickfix#CmdPost() abort
endfunction endfunction
" vim: set et sw=4 sts=4 ts=8: " vim: set et sw=4 sts=4 ts=8:
endif

View File

@@ -1,6 +1,4 @@
if exists('g:polyglot_disabled') && index(g:polyglot_disabled, 'clojure') != -1 if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'clojure') == -1
finish
endif
" Vim completion script " Vim completion script
" Language: Clojure " Language: Clojure
@@ -24,3 +22,5 @@ function! clojurecomplete#Complete(findstart, base)
endfunction endfunction
" vim:sts=8:sw=8:ts=8:noet " vim:sts=8:sw=8:ts=8:noet
endif

View File

@@ -1,6 +1,4 @@
if exists('g:polyglot_disabled') && index(g:polyglot_disabled, 'coffee-script') != -1 if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'coffee-script') == -1
finish
endif
" Language: CoffeeScript " Language: CoffeeScript
" Maintainer: Mick Koch <mick@kochm.co> " Maintainer: Mick Koch <mick@kochm.co>
@@ -56,3 +54,5 @@ function! coffee#CoffeeSetUpErrorFormat()
\%f:%l:%c:\ error:\ %m, \%f:%l:%c:\ error:\ %m,
\%-G%.%# \%-G%.%#
endfunction endfunction
endif

1044
autoload/crystal/indent.vim Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -1,50 +1,47 @@
if exists('g:polyglot_disabled') && index(g:polyglot_disabled, 'crystal') != -1 if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'crystal') == -1
finish
endif
let s:save_cpo = &cpo
set cpo&vim
let s:V = vital#crystal#new() let s:V = vital#crystal#new()
let s:P = s:V.import('Process') let s:P = s:V.import('Process')
let s:C = s:V.import('ColorEcho') let s:C = s:V.import('ColorEcho')
let s:IS_WINDOWS = has('win32')
if exists('*json_decode') if exists('*json_decode')
function! s:decode_json(text) abort function! s:decode_json(text) abort
return json_decode(a:text) return json_decode(a:text)
endfunction endfunction
else else
let s:J = s:V.import('Web.JSON') let s:J = s:V.import('Web.JSON')
function! s:decode_json(text) abort function! s:decode_json(text) abort
return s:J.decode(a:text) return s:J.decode(a:text)
endfunction endfunction
endif endif
function! s:echo_error(msg, ...) abort function! s:echo_error(msg, ...) abort
echohl ErrorMsg echohl ErrorMsg
if a:0 == 0 if a:0 == 0
echomsg a:msg echomsg a:msg
else else
echomsg call('printf', [a:msg] + a:000) echomsg call('printf', [a:msg] + a:000)
endif endif
echohl None echohl None
endfunction endfunction
function! s:run_cmd(cmd) abort function! s:run_cmd(cmd) abort
if !executable(g:crystal_compiler_command) if !executable(g:crystal_compiler_command)
throw "vim-crystal: Error: '" . g:crystal_compiler_command . "' command is not found." throw "vim-crystal: Error: '" . g:crystal_compiler_command . "' command is not found."
endif endif
return s:P.system(a:cmd) return s:P.system(a:cmd)
endfunction endfunction
function! s:find_root_by(search_dir, d) abort function! s:find_root_by(search_dir, d) abort
let found_dir = finddir(a:search_dir, a:d . ';') let found_dir = finddir(a:search_dir, a:d . ';')
if found_dir ==# '' if found_dir ==# ''
return '' return ''
endif endif
" Note: ':h:h' for {root}/{search_dir}/ -> {root}/{search_dir} -> {root} " Note: ':h:h' for {root}/{search_dir}/ -> {root}/{search_dir} -> {root}
return fnamemodify(found_dir, ':p:h:h') return fnamemodify(found_dir, ':p:h:h')
endfunction endfunction
" Search the root directory containing a 'spec/' and a 'src/' directories. " Search the root directory containing a 'spec/' and a 'src/' directories.
@@ -53,292 +50,318 @@ endfunction
" compiler has a 'cr_sources/src/spec/' directory that would otherwise give the root " compiler has a 'cr_sources/src/spec/' directory that would otherwise give the root
" directory as 'cr_source/src/' instead of 'cr_sources/'. " directory as 'cr_source/src/' instead of 'cr_sources/'.
function! s:find_root_by_spec_and_src(d) abort function! s:find_root_by_spec_and_src(d) abort
" Search for 'spec/' " Search for 'spec/'
let root = s:find_root_by('spec', a:d) let root = s:find_root_by('spec', a:d)
" Check that 'src/' is also there " Check that 'src/' is also there
if root !=# '' && isdirectory(root . '/src') if root !=# '' && isdirectory(root . '/src')
return root return root
endif endif
" Search for 'src/' " Search for 'src/'
let root = s:find_root_by('src', a:d) let root = s:find_root_by('src', a:d)
" Check that 'spec/' is also there " Check that 'spec/' is also there
if root !=# '' && isdirectory(root . '/spec') if root !=# '' && isdirectory(root . '/spec')
return root return root
endif endif
" Cannot find a directory containing both 'src/' and 'spec/' " Cannot find a directory containing both 'src/' and 'spec/'
return '' return ''
endfunction endfunction
function! crystal_lang#entrypoint_for(file_path) abort function! crystal_lang#entrypoint_for(file_path) abort
let parent_dir = fnamemodify(a:file_path, ':p:h') let parent_dir = fnamemodify(a:file_path, ':p:h')
let root_dir = s:find_root_by_spec_and_src(parent_dir) let root_dir = s:find_root_by_spec_and_src(parent_dir)
if root_dir ==# '' if root_dir ==# ''
" No spec directory found. No need to make temporary file " No spec directory found. No need to make temporary file
return a:file_path return a:file_path
endif endif
let temp_name = root_dir . '/__vim-crystal-temporary-entrypoint-' . fnamemodify(a:file_path, ':t') let required_spec_path = get(b:, 'crystal_required_spec_path', get(g:, 'crystal_required_spec_path', ''))
let contents = [ if required_spec_path !=# ''
\ 'require "spec"', let require_spec_str = './' . required_spec_path
\ 'require "./spec/**"', else
\ printf('require "./%s"', fnamemodify(a:file_path, ':p')[strlen(root_dir)+1 : ]) let require_spec_str = './spec/**'
\ ] endif
let result = writefile(contents, temp_name) let temp_name = root_dir . '/__vim-crystal-temporary-entrypoint-' . fnamemodify(a:file_path, ':t')
if result == -1 let contents = [
" Note: When writefile() failed \ 'require "spec"',
return a:file_path \ 'require "' . require_spec_str . '"',
endif \ printf('require "./%s"', fnamemodify(a:file_path, ':p')[strlen(root_dir)+1 : ])
\ ]
return temp_name let result = writefile(contents, temp_name)
if result == -1
" Note: When writefile() failed
return a:file_path
endif
return temp_name
endfunction endfunction
function! crystal_lang#tool(name, file, pos, option_str) abort function! crystal_lang#tool(name, file, pos, option_str) abort
let entrypoint = crystal_lang#entrypoint_for(a:file) let entrypoint = crystal_lang#entrypoint_for(a:file)
let cmd = printf( let cmd = printf(
\ '%s tool %s --no-color %s --cursor %s:%d:%d %s', \ '%s tool %s --no-color %s --cursor %s:%d:%d %s',
\ g:crystal_compiler_command, \ g:crystal_compiler_command,
\ a:name, \ a:name,
\ a:option_str, \ a:option_str,
\ a:file, \ a:file,
\ a:pos[1], \ a:pos[1],
\ a:pos[2], \ a:pos[2],
\ entrypoint \ entrypoint
\ ) \ )
try try
let output = s:run_cmd(cmd) let output = s:run_cmd(cmd)
return {'failed': s:P.get_last_status(), 'output': output} return {'failed': s:P.get_last_status(), 'output': output}
finally finally
" Note: " Note:
" If the entry point is temporary file, delete it finally. " If the entry point is temporary file, delete it finally.
if a:file !=# entrypoint if a:file !=# entrypoint
call delete(entrypoint) call delete(entrypoint)
endif endif
endtry endtry
endfunction endfunction
" `pos` is assumed a returned value from getpos() " `pos` is assumed a returned value from getpos()
function! crystal_lang#impl(file, pos, option_str) abort function! crystal_lang#impl(file, pos, option_str) abort
return crystal_lang#tool('implementations', a:file, a:pos, a:option_str) return crystal_lang#tool('implementations', a:file, a:pos, a:option_str)
endfunction endfunction
function! s:jump_to_impl(impl) abort function! s:jump_to_impl(impl) abort
execute 'edit' a:impl.filename execute 'edit' a:impl.filename
call cursor(a:impl.line, a:impl.column) call cursor(a:impl.line, a:impl.column)
endfunction endfunction
function! crystal_lang#jump_to_definition(file, pos) abort function! crystal_lang#jump_to_definition(file, pos) abort
echo 'analyzing definitions under cursor...' echo 'analyzing definitions under cursor...'
let cmd_result = crystal_lang#impl(a:file, a:pos, '--format json') let cmd_result = crystal_lang#impl(a:file, a:pos, '--format json')
if cmd_result.failed if cmd_result.failed
return s:echo_error(cmd_result.output) return s:echo_error(cmd_result.output)
endif endif
let impl = s:decode_json(cmd_result.output) let impl = s:decode_json(cmd_result.output)
if impl.status !=# 'ok' if impl.status !=# 'ok'
return s:echo_error(impl.message) return s:echo_error(impl.message)
endif endif
if len(impl.implementations) == 1 if len(impl.implementations) == 1
call s:jump_to_impl(impl.implementations[0]) call s:jump_to_impl(impl.implementations[0])
return return
endif endif
let message = "Multiple definitions detected. Choose a number\n\n" let message = "Multiple definitions detected. Choose a number\n\n"
for idx in range(len(impl.implementations)) for idx in range(len(impl.implementations))
let i = impl.implementations[idx] let i = impl.implementations[idx]
let message .= printf("[%d] %s:%d:%d\n", idx, i.filename, i.line, i.column) let message .= printf("[%d] %s:%d:%d\n", idx, i.filename, i.line, i.column)
endfor endfor
let message .= "\n" let message .= "\n"
let idx = str2nr(input(message, "\n> ")) let idx = str2nr(input(message, "\n> "))
call s:jump_to_impl(impl.implementations[idx]) call s:jump_to_impl(impl.implementations[idx])
endfunction endfunction
function! crystal_lang#context(file, pos, option_str) abort function! crystal_lang#context(file, pos, option_str) abort
return crystal_lang#tool('context', a:file, a:pos, a:option_str) return crystal_lang#tool('context', a:file, a:pos, a:option_str)
endfunction endfunction
function! crystal_lang#type_hierarchy(file, option_str) abort function! crystal_lang#type_hierarchy(file, option_str) abort
let cmd = printf( let cmd = printf(
\ '%s tool hierarchy --no-color %s %s', \ '%s tool hierarchy --no-color %s %s',
\ g:crystal_compiler_command, \ g:crystal_compiler_command,
\ a:option_str, \ a:option_str,
\ a:file \ a:file
\ ) \ )
return s:run_cmd(cmd) return s:run_cmd(cmd)
endfunction endfunction
function! s:find_completion_start() abort function! s:find_completion_start() abort
let c = col('.') let c = col('.')
if c <= 1 if c <= 1
return -1 return -1
endif endif
let line = getline('.')[:c-2] let line = getline('.')[:c-2]
return match(line, '\w\+$') return match(line, '\w\+$')
endfunction endfunction
function! crystal_lang#complete(findstart, base) abort function! crystal_lang#complete(findstart, base) abort
if a:findstart if a:findstart
return s:find_completion_start() return s:find_completion_start()
endif endif
let cmd_result = crystal_lang#context(expand('%'), getpos('.'), '--format json') let cmd_result = crystal_lang#context(expand('%'), getpos('.'), '--format json')
if cmd_result.failed if cmd_result.failed
return return
endif endif
let contexts = s:decode_json(cmd_result.output) let contexts = s:decode_json(cmd_result.output)
if contexts.status !=# 'ok' if contexts.status !=# 'ok'
return return
endif endif
let candidates = [] let candidates = []
for c in contexts.contexts for c in contexts.contexts
for [name, desc] in items(c) for [name, desc] in items(c)
let candidates += [{ let candidates += [{
\ 'word': name, \ 'word': name,
\ 'menu': ': ' . desc . ' [var]', \ 'menu': ': ' . desc . ' [var]',
\ }] \ }]
endfor
endfor endfor
endfor
return candidates return candidates
endfunction endfunction
function! crystal_lang#get_spec_switched_path(absolute_path) abort function! crystal_lang#get_spec_switched_path(absolute_path) abort
let base = fnamemodify(a:absolute_path, ':t:r') let base = fnamemodify(a:absolute_path, ':t:r')
" TODO: Make cleverer " TODO: Make cleverer
if base =~# '_spec$' if base =~# '_spec$'
let parent = fnamemodify(substitute(a:absolute_path, '/spec/', '/src/', ''), ':h') let parent = fnamemodify(substitute(a:absolute_path, '/spec/', '/src/', ''), ':h')
return parent . '/' . matchstr(base, '.\+\ze_spec$') . '.cr' return parent . '/' . matchstr(base, '.\+\ze_spec$') . '.cr'
else else
let parent = fnamemodify(substitute(a:absolute_path, '/src/', '/spec/', ''), ':h') let parent = fnamemodify(substitute(a:absolute_path, '/src/', '/spec/', ''), ':h')
return parent . '/' . base . '_spec.cr' return parent . '/' . base . '_spec.cr'
endif endif
endfunction endfunction
function! crystal_lang#switch_spec_file(...) abort function! crystal_lang#switch_spec_file(...) abort
let path = a:0 == 0 ? expand('%:p') : fnamemodify(a:1, ':p') let path = a:0 == 0 ? expand('%:p') : fnamemodify(a:1, ':p')
if path !~# '.cr$' if path !~# '.cr$'
return s:echo_error('Not crystal source file: ' . path) return s:echo_error('Not crystal source file: ' . path)
endif endif
execute 'edit!' crystal_lang#get_spec_switched_path(path) execute 'edit!' crystal_lang#get_spec_switched_path(path)
endfunction endfunction
function! s:run_spec(root, path, ...) abort function! s:run_spec(root, path, ...) abort
" Note: " Note:
" `crystal spec` can't understand absolute path. " `crystal spec` can't understand absolute path.
let cmd = printf( let cmd = printf(
\ '%s spec %s%s', \ '%s spec %s%s',
\ g:crystal_compiler_command, \ g:crystal_compiler_command,
\ a:path, \ a:path,
\ a:0 == 0 ? '' : (':' . a:1) \ a:0 == 0 ? '' : (':' . a:1)
\ ) \ )
let saved_cwd = getcwd() let saved_cwd = getcwd()
let cd = haslocaldir() ? 'lcd' : 'cd' let cd = haslocaldir() ? 'lcd' : 'cd'
try try
execute cd a:root execute cd a:root
call s:C.echo(s:run_cmd(cmd)) call s:C.echo(s:run_cmd(cmd))
finally finally
execute cd saved_cwd execute cd saved_cwd
endtry endtry
endfunction endfunction
function! crystal_lang#run_all_spec(...) abort function! crystal_lang#run_all_spec(...) abort
let path = a:0 == 0 ? expand('%:p:h') : a:1 let path = a:0 == 0 ? expand('%:p:h') : a:1
let root_path = s:find_root_by_spec_and_src(path) let root_path = s:find_root_by_spec_and_src(path)
if root_path ==# '' if root_path ==# ''
return s:echo_error("'spec' directory is not found") return s:echo_error("'spec' directory is not found")
endif endif
call s:run_spec(root_path, 'spec') call s:run_spec(root_path, 'spec')
endfunction endfunction
function! crystal_lang#run_current_spec(...) abort function! crystal_lang#run_current_spec(...) abort
" /foo/bar/src/poyo.cr " /foo/bar/src/poyo.cr
let path = a:0 == 0 ? expand('%:p') : fnamemodify(a:1, ':p') let path = a:0 == 0 ? expand('%:p') : fnamemodify(a:1, ':p')
if path !~# '.cr$' if path !~# '.cr$'
return s:echo_error('Not crystal source file: ' . path) return s:echo_error('Not crystal source file: ' . path)
endif endif
" /foo/bar/src " /foo/bar/src
let source_dir = fnamemodify(path, ':h') let source_dir = fnamemodify(path, ':h')
" /foo/bar " /foo/bar
let root_dir = s:find_root_by_spec_and_src(source_dir) let root_dir = s:find_root_by_spec_and_src(source_dir)
if root_dir ==# '' if root_dir ==# ''
return s:echo_error("Root directory with 'src/' and 'spec/' not found") return s:echo_error("Root directory with 'src/' and 'spec/' not found")
endif endif
" src " src
let rel_path = source_dir[strlen(root_dir)+1 : ] let rel_path = source_dir[strlen(root_dir)+1 : ]
if path =~# '_spec.cr$' if path =~# '_spec.cr$'
call s:run_spec(root_dir, path[strlen(root_dir)+1 : ], line('.')) call s:run_spec(root_dir, path[strlen(root_dir)+1 : ], line('.'))
else else
let spec_path = substitute(rel_path, '^src', 'spec', '') . '/' . fnamemodify(path, ':t:r') . '_spec.cr' let spec_path = substitute(rel_path, '^src', 'spec', '') . '/' . fnamemodify(path, ':t:r') . '_spec.cr'
if !filereadable(root_dir . '/' . spec_path) if !filereadable(root_dir . '/' . spec_path)
return s:echo_error('Error: Could not find a spec source corresponding to ' . path) return s:echo_error('Error: Could not find a spec source corresponding to ' . path)
endif
call s:run_spec(root_dir, spec_path)
endif endif
call s:run_spec(root_dir, spec_path)
endif
endfunction endfunction
function! crystal_lang#format_string(code, ...) abort function! crystal_lang#format_string(code, ...) abort
let cmd = printf( if s:IS_WINDOWS
\ '%s tool format --no-color %s -', let redirect = '2> nul'
\ g:crystal_compiler_command, else
\ get(a:, 1, '') let redirect = '2>/dev/null'
\ ) endif
let output = s:P.system(cmd, a:code) let cmd = printf(
if s:P.get_last_status() \ '%s tool format --no-color %s - %s',
throw 'vim-crystal: Error on formatting: ' . output \ g:crystal_compiler_command,
endif \ get(a:, 1, ''),
return output \ redirect,
\ )
let output = s:P.system(cmd, a:code)
if s:P.get_last_status()
throw 'vim-crystal: Error on formatting with command: ' . cmd
endif
return output
endfunction endfunction
" crystal_lang#format(option_str [, on_save]) " crystal_lang#format(option_str [, on_save])
function! crystal_lang#format(option_str, ...) abort function! crystal_lang#format(option_str, ...) abort
if !executable(g:crystal_compiler_command) let on_save = a:0 > 0 ? a:1 : 0
" Finish command silently
return if !executable(g:crystal_compiler_command)
if on_save
" Finish command silently on save
return
else
throw 'vim-crystal: Command for formatting is not executable: ' . g:crystal_compiler_command
endif endif
endif
let on_save = a:0 > 0 ? a:1 : 0 let before = join(getline(1, '$'), "\n")
try
let before = join(getline(1, '$'), "\n")
let formatted = crystal_lang#format_string(before, a:option_str) let formatted = crystal_lang#format_string(before, a:option_str)
if !on_save catch /^vim-crystal: /
let after = substitute(formatted, '\n$', '', '') echohl ErrorMsg
if before ==# after echomsg v:exception . ': Your code was not formatted. Exception was thrown at ' . v:throwpoint
return echohl None
endif return
endif endtry
let view_save = winsaveview() if !on_save
let pos_save = getpos('.') let after = substitute(formatted, '\n$', '', '')
let lines = split(formatted, '\n') if before ==# after
silent! undojoin return
if line('$') > len(lines)
execute len(lines) . ',$delete' '_'
endif endif
call setline(1, lines) endif
call winrestview(view_save)
call setpos('.', pos_save) let view_save = winsaveview()
let pos_save = getpos('.')
let lines = split(formatted, '\n')
silent! undojoin
if line('$') > len(lines)
execute len(lines) . ',$delete' '_'
endif
call setline(1, lines)
call winrestview(view_save)
call setpos('.', pos_save)
endfunction endfunction
function! crystal_lang#expand(file, pos, ...) abort function! crystal_lang#expand(file, pos, ...) abort
return crystal_lang#tool('expand', a:file, a:pos, get(a:, 1, '')) return crystal_lang#tool('expand', a:file, a:pos, get(a:, 1, ''))
endfunction endfunction
let &cpo = s:save_cpo " vim: sw=2 sts=2 et:
unlet s:save_cpo
endif

View File

@@ -1,6 +1,4 @@
if exists('g:polyglot_disabled') && index(g:polyglot_disabled, 'csv') != -1 if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'csv') == -1
finish
endif
" Filetype plugin for editing CSV files. "{{{1 " Filetype plugin for editing CSV files. "{{{1
" Author: Christian Brabandt <cb@256bit.org> " Author: Christian Brabandt <cb@256bit.org>
@@ -71,6 +69,10 @@ fu! csv#Init(start, end, ...) "{{{3
else else
let b:csv_cmt = split(g:csv_comment, '%s') let b:csv_cmt = split(g:csv_comment, '%s')
endif endif
" Make sure it is a list with 2 chars
if b:csv_cmt == []
let b:csv_cmt = ["", ""]
endif
if empty(b:delimiter) && !exists("b:csv_fixed_width") if empty(b:delimiter) && !exists("b:csv_fixed_width")
call csv#Warn("No delimiter found. See :h csv-delimiter to set it manually!") call csv#Warn("No delimiter found. See :h csv-delimiter to set it manually!")
@@ -124,7 +126,7 @@ fu! csv#Init(start, end, ...) "{{{3
" Enable vartabs for tab delimited files " Enable vartabs for tab delimited files
if b:delimiter=="\t" && has("vartabs")&& !exists("b:csv_fixed_width_cols") if b:delimiter=="\t" && has("vartabs")&& !exists("b:csv_fixed_width_cols")
if get(b:, 'col_width', []) ==# [] if get(b:, 'col_width', []) ==# []
call csv#CalculateColumnWidth('') call csv#CalculateColumnWidth(line('$'), 1)
endif endif
let &l:vts=join(b:col_width, ',') let &l:vts=join(b:col_width, ',')
let g:csv_no_conceal=1 let g:csv_no_conceal=1
@@ -265,7 +267,7 @@ fu! csv#GetPat(colnr, maxcolnr, pat, allowmore) "{{{3
" Allow space in front of the pattern, so that it works correctly " Allow space in front of the pattern, so that it works correctly
" even if :Arrange Col has been used #100 " even if :Arrange Col has been used #100
return '^' . csv#GetColPat(a:colnr - 1,0) . return '^' . csv#GetColPat(a:colnr - 1,0) .
\ '\s*\zs' . a:pat . '\ze' . (a:allowmore ? '' : '$') \ '.*\zs' . a:pat . '\ze' . (a:allowmore ? '' : '$')
else else
return '\%' . b:csv_fixed_width_cols[-1] . return '\%' . b:csv_fixed_width_cols[-1] .
\ 'c\zs' . a:pat . '\ze' . (a:allowmore ? '' : '$') \ 'c\zs' . a:pat . '\ze' . (a:allowmore ? '' : '$')
@@ -502,7 +504,7 @@ fu! csv#WColumn(...) "{{{3
" Return on which column the cursor is " Return on which column the cursor is
let _cur = getpos('.') let _cur = getpos('.')
if !exists("b:csv_fixed_width_cols") if !exists("b:csv_fixed_width_cols")
if line('.') > 1 && mode('') != 'n' if line('.') > 1 && mode('') != 'n' && empty(getline('.')[0:col('.')-1])
" in insert mode, get line from above, just in case the current " in insert mode, get line from above, just in case the current
" line is empty " line is empty
let line = getline(line('.')-1) let line = getline(line('.')-1)
@@ -576,7 +578,7 @@ fu! csv#MaxColumns(...) "{{{3
return len(b:csv_fixed_width_cols) return len(b:csv_fixed_width_cols)
endif endif
endfu endfu
fu! csv#ColWidth(colnr, ...) "{{{3 fu! csv#ColWidth(colnr, row, silent) "{{{3
" if a:1 is given, specifies the row, for which to calculate the width " if a:1 is given, specifies the row, for which to calculate the width
" "
" Return the width of a column " Return the width of a column
@@ -588,14 +590,13 @@ fu! csv#ColWidth(colnr, ...) "{{{3
if !exists("b:csv_fixed_width_cols") if !exists("b:csv_fixed_width_cols")
if !exists("b:csv_list") if !exists("b:csv_list")
" only check first 10000 lines, to be faster " only check first 10000 lines, to be faster
let last = line('$') let last = a:row
if exists("a:1") && !empty(a:1)
let last = a:1
endif
if !get(b:, 'csv_arrange_use_all_rows', 0) if !get(b:, 'csv_arrange_use_all_rows', 0)
if last > 10000 if last > 10000
let last = 10000 let last = 10000
call csv#Warn('File too large, only checking the first 10000 rows for the width') if !a:silent
call csv#Warn('File too large, only checking the first 10000 rows for the width')
endif
endif endif
endif endif
let b:csv_list=getline(skipfirst+1,last) let b:csv_list=getline(skipfirst+1,last)
@@ -638,8 +639,12 @@ fu! csv#ArrangeCol(first, last, bang, limit, ...) range "{{{3
return return
endif endif
let cur=winsaveview() let cur=winsaveview()
" be sure, that b:col_width is actually valid
if exists("b:col_width") && eval(join(b:col_width, '+')) == 0
unlet! b:col_width
endif
" Force recalculation of Column width " Force recalculation of Column width
let row = exists("a:1") ? a:1 : '' let row = exists("a:1") && !empty(a:1) ? a:1 : line('$')
if a:bang || !empty(row) if a:bang || !empty(row)
if a:bang && exists("b:col_width") if a:bang && exists("b:col_width")
" Unarrange, so that if csv_arrange_align has changed " Unarrange, so that if csv_arrange_align has changed
@@ -673,7 +678,7 @@ fu! csv#ArrangeCol(first, last, bang, limit, ...) range "{{{3
endif endif
if !exists("b:col_width") if !exists("b:col_width")
call csv#CalculateColumnWidth(row) call csv#CalculateColumnWidth(row, 1)
endif endif
" abort on empty file " abort on empty file
@@ -752,11 +757,15 @@ fu! csv#UnArrangeCol(match) "{{{3
" Strip leading white space, also trims empty recordcsv# " Strip leading white space, also trims empty recordcsv#
return substitute(a:match, '\%(^ \+\)\|\%( \+\ze'.b:delimiter. '\?$\)', '', 'g') return substitute(a:match, '\%(^ \+\)\|\%( \+\ze'.b:delimiter. '\?$\)', '', 'g')
endfu endfu
fu! csv#CalculateColumnWidth(row) "{{{3 fu! csv#CalculateColumnWidth(row, silent) "{{{3
" Internal function, not called from external, " Internal function, not called from external,
" does not work with fixed width columns " does not work with fixed width columns
" row for the row for which to calculate the width " row for the row for which to calculate the width
let b:col_width=[] let b:col_width=[]
if has( 'vartabs' ) && b:delimiter == "\t"
let vts_save=&vts
set vts=
endif
try try
if exists("b:csv_headerline") if exists("b:csv_headerline")
if line('.') < b:csv_headerline if line('.') < b:csv_headerline
@@ -765,7 +774,7 @@ fu! csv#CalculateColumnWidth(row) "{{{3
endif endif
let s:max_cols=csv#MaxColumns(line('.')) let s:max_cols=csv#MaxColumns(line('.'))
for i in range(1,s:max_cols) for i in range(1,s:max_cols)
call add(b:col_width, csv#ColWidth(i, a:row)) call add(b:col_width, csv#ColWidth(i, a:row, a:silent))
endfor endfor
catch /csv:no_col/ catch /csv:no_col/
call csv#Warn("Error: getting Column numbers, aborting!") call csv#Warn("Error: getting Column numbers, aborting!")
@@ -775,6 +784,9 @@ fu! csv#CalculateColumnWidth(row) "{{{3
" delete buffer content in variable b:csv_list, " delete buffer content in variable b:csv_list,
" this was only necessary for calculating the max width " this was only necessary for calculating the max width
unlet! b:csv_list s:columnize_count s:decimal_column unlet! b:csv_list s:columnize_count s:decimal_column
if has( 'vartabs' ) && b:delimiter == "\t"
let &vts=vts_save
endif
endfu endfu
fu! csv#Columnize(field) "{{{3 fu! csv#Columnize(field) "{{{3
" Internal function, not called from external, " Internal function, not called from external,
@@ -1055,7 +1067,7 @@ fu! csv#MoveCol(forward, line, ...) "{{{3
let maxcol=csv#MaxColumns(line('.')) let maxcol=csv#MaxColumns(line('.'))
let cpos=getpos('.')[2] let cpos=getpos('.')[2]
if !exists("b:csv_fixed_width_cols") if !exists("b:csv_fixed_width_cols")
let curwidth=CSVWidth() let curwidth=CSVWidth(1)
call search(b:col, 'bc', line('.')) call search(b:col, 'bc', line('.'))
endif endif
let spos=getpos('.')[2] let spos=getpos('.')[2]
@@ -1148,7 +1160,7 @@ fu! csv#MoveCol(forward, line, ...) "{{{3
" leave the column (if the next column is shorter) " leave the column (if the next column is shorter)
if !exists("b:csv_fixed_width_cols") if !exists("b:csv_fixed_width_cols")
let a = getpos('.') let a = getpos('.')
if CSVWidth() == curwidth if CSVWidth(1) == curwidth
let a[2]+= cpos-spos let a[2]+= cpos-spos
endif endif
else else
@@ -1161,7 +1173,7 @@ fu! csv#MoveCol(forward, line, ...) "{{{3
" Move to the correct screen column " Move to the correct screen column
if !exists("b:csv_fixed_width_cols") if !exists("b:csv_fixed_width_cols")
let a = getpos('.') let a = getpos('.')
if CSVWidth() == curwidth if CSVWidth(1) == curwidth
let a[2]+= cpos-spos let a[2]+= cpos-spos
endif endif
else else
@@ -1438,7 +1450,7 @@ fu! csv#SumColumn(list) "{{{3
let b:csv_result = '0' let b:csv_result = '0'
return 0 return 0
else else
let sum = has("float") ? 0.0 : 0 let sum = 0.0
for item in a:list for item in a:list
if empty(item) if empty(item)
continue continue
@@ -1448,33 +1460,25 @@ fu! csv#SumColumn(list) "{{{3
let format2 = '\d\+\zs\V' . s:nr_format[1] . '\m\ze\d' let format2 = '\d\+\zs\V' . s:nr_format[1] . '\m\ze\d'
try try
let nr = substitute(nr, format1, '', '') let nr = substitute(nr, format1, '', '')
if has("float") && s:nr_format[1] != '.' if s:nr_format[1] != '.'
let nr = substitute(nr, format2, '.', '') let nr = substitute(nr, format2, '.', '')
endif endif
catch catch
let nr = 0 let nr = '0'
endtry endtry
let sum += (has("float") ? str2float(nr) : (nr + 0)) let sum += str2float(nr)
endfor endfor
if has("float") let b:csv_result = sum
let b:csv_result = string(float2nr(sum)) return printf("%.2f", sum)
if float2nr(sum) == sum
return float2nr(sum)
else
return printf("%.2f", sum)
endif
endif
let b:csv_result = string(sum)
return sum
endif endif
endfu endfu
fu! csv#AvgColumn(list) "{{{3 fu! csv#AvgColumn(list) "{{{3
if empty(a:list) if empty(a:list)
let b:csv_result = '0' let b:csv_result = '0'
return 0 return 0.0
else else
let cnt = 0 let cnt = 0
let sum = has("float") ? 0.0 : 0 let sum = 0.0
for item in a:list for item in a:list
if empty(item) if empty(item)
continue continue
@@ -1484,30 +1488,25 @@ fu! csv#AvgColumn(list) "{{{3
let format2 = '\d\+\zs\V' . s:nr_format[1] . '\m\ze\d' let format2 = '\d\+\zs\V' . s:nr_format[1] . '\m\ze\d'
try try
let nr = substitute(nr, format1, '', '') let nr = substitute(nr, format1, '', '')
if has("float") && s:nr_format[1] != '.' if s:nr_format[1] != '.'
let nr = substitute(nr, format2, '.', '') let nr = substitute(nr, format2, '.', '')
endif endif
catch catch
let nr = 0 let nr ='0'
endtry endtry
let sum += (has("float") ? str2float(nr) : (nr + 0)) let sum += str2float(nr)
let cnt += 1 let cnt += 1
endfor endfor
if has("float") let b:csv_result = printf("%.2f", sum/cnt)
let b:csv_result = printf("%.2f", sum/cnt) return sum/cnt
return b:csv_result
else
let b:csv_result = printf("%s", sum/cnt)
return sum/cnt
endif
endif endif
endfu endfu
fu! csv#VarianceColumn(list, is_population) "{{{3 fu! csv#VarianceColumn(list, is_population) "{{{3
if empty(a:list) if empty(a:list)
return 0 return 0.0
else else
let cnt = 0 let cnt = 0
let sum = has("float") ? 0.0 : 0 let sum = 0.0
let avg = csv#AvgColumn(a:list) let avg = csv#AvgColumn(a:list)
for item in a:list for item in a:list
if empty(item) if empty(item)
@@ -1518,64 +1517,64 @@ fu! csv#VarianceColumn(list, is_population) "{{{3
let format2 = '\d\+\zs\V' . s:nr_format[1] . '\m\ze\d' let format2 = '\d\+\zs\V' . s:nr_format[1] . '\m\ze\d'
try try
let nr = substitute(nr, format1, '', '') let nr = substitute(nr, format1, '', '')
if has("float") && s:nr_format[1] != '.' if s:nr_format[1] != '.'
let nr = substitute(nr, format2, '.', '') let nr = substitute(nr, format2, '.', '')
endif endif
catch catch
let nr = 0 let nr = '0'
endtry endtry
let sum += pow((has("float") ? (str2float(nr)-avg) : ((nr + 0)-avg)), 2) let nr = str2float(nr)
let sum += pow((nr-avg), 2)
let cnt += 1 let cnt += 1
endfor endfor
if(a:is_population == 0) if(a:is_population == 0)
let cnt = cnt-1 let cnt = cnt-1
endif endif
if has("float") let b:csv_result = sum/cnt
let b:csv_result = printf("%.2f", sum/cnt) return b:csv_result
return b:csv_result
else
let b:csv_result = printf("%s", sum/cnt)
return sum/(cnt)
endif
endif endif
endfu endfu
fu! csv#SmplVarianceColumn(list) "{{{2 fu! csv#SmplVarianceColumn(list) "{{{2
unlet! b:csv_result
if empty(a:list) if empty(a:list)
let b:csv_result = '0' let b:csv_result = 0.0
return 0 return 0.0
else else
return csv#VarianceColumn(a:list, 0) return csv#VarianceColumn(a:list, 0)
endif endif
endfu endfu
fu! csv#PopVarianceColumn(list) "{{{2 fu! csv#PopVarianceColumn(list) "{{{2
unlet! b:csv_result
if empty(a:list) if empty(a:list)
let b:csv_result = '0' let b:csv_result = 0.0
return 0 return 0.0
else else
return csv#VarianceColumn(a:list, 1) return csv#VarianceColumn(a:list, 1)
endif endif
endfu endfu
fu! csv#SmplStdDevColumn(list) "{{{2 fu! csv#SmplStdDevColumn(list) "{{{2
unlet! b:csv_result
if empty(a:list) if empty(a:list)
let b:csv_result = '0' let b:csv_result = 0.0
return 0 return 0.0
else else
let result = sqrt(str2float(csv#VarianceColumn(a:list, 0))) let result = sqrt(csv#VarianceColumn(a:list, 0))
let b:csv_result = string(result) let b:csv_result = result
return result return result
endif endif
endfu endfu
fu! csv#PopStdDevColumn(list) "{{{2 fu! csv#PopStdDevColumn(list) "{{{2
unlet! b:csv_result
if empty(a:list) if empty(a:list)
let b:csv_result = '0' let b:csv_result = 0.0
return 0 return 0.0
else else
let result = sqrt(str2float(csv#VarianceColumn(a:list, 1))) let result = sqrt(csv#VarianceColumn(a:list, 1))
let b:csv_result = string(result) let b:csv_result = result
return result return result
endif endif
endfu endfu
@@ -1598,13 +1597,13 @@ fu! csv#MaxColumn(list) "{{{3
let format2 = '\d\+\zs\V' . s:nr_format[1] . '\m\ze\d' let format2 = '\d\+\zs\V' . s:nr_format[1] . '\m\ze\d'
try try
let nr = substitute(nr, format1, '', '') let nr = substitute(nr, format1, '', '')
if has("float") && s:nr_format[1] != '.' if s:nr_format[1] != '.'
let nr = substitute(nr, format2, '.', '') let nr = substitute(nr, format2, '.', '')
endif endif
catch catch
let nr = 0 let nr = '0'
endtry endtry
call add(result, has("float") ? str2float(nr) : nr+0) call add(result, str2float(nr))
endfor endfor
let result = sort(result, s:csv_numeric_sort ? 'n' : 'csv#CSVSortValues') let result = sort(result, s:csv_numeric_sort ? 'n' : 'csv#CSVSortValues')
let ind = len(result) > 9 ? 9 : len(result) let ind = len(result) > 9 ? 9 : len(result)
@@ -1837,7 +1836,7 @@ fu! csv#ProcessFieldValue(field) "{{{3
if a == b:delimiter if a == b:delimiter
try try
let a=repeat(' ', csv#ColWidth(col)) let a=repeat(' ', csv#ColWidth(col, line('$'), 1))
catch catch
" no-op " no-op
endtry endtry
@@ -1944,8 +1943,12 @@ fu! csv#CheckHeaderLine() "{{{3
endfu endfu
fu! csv#AnalyzeColumn(...) "{{{3 fu! csv#AnalyzeColumn(...) "{{{3
let maxcolnr = csv#MaxColumns() let maxcolnr = csv#MaxColumns()
if len(a:000) == 1 let topn = 5
if len(a:000) > 0
let colnr = a:1 let colnr = a:1
if len(a:000) == 2
let topn = a:2
endif
else else
let colnr = csv#WColumn() let colnr = csv#WColumn()
endif endif
@@ -1973,16 +1976,13 @@ fu! csv#AnalyzeColumn(...) "{{{3
let max_items = reverse(sort(values(res), s:csv_numeric_sort ? 'n' : 'csv#CSVSortValues')) let max_items = reverse(sort(values(res), s:csv_numeric_sort ? 'n' : 'csv#CSVSortValues'))
" What about the minimum 5 items? " What about the minimum 5 items?
let count_items = keys(res) let count_items = keys(res)
if len(max_items) > 5 if len(max_items) > topn
call remove(max_items, 5, -1) call remove(max_items, topn, -1)
call map(max_items, 'printf(''\V%s\m'', escape(v:val, ''\\''))') call map(max_items, 'printf(''\V%s\m'', escape(v:val, ''\\''))')
call filter(res, 'v:val =~ ''^''.join(max_items, ''\|'').''$''') call filter(res, 'v:val =~ ''^''.join(max_items, ''\|'').''$''')
endif endif
if has("float") let title="Nr\tCount\t % \tValue"
let title="Nr\tCount\t % \tValue"
else
let title="Nr\tCount\tValue"
endif endif
echohl Title echohl Title
echo printf("%s", title) echo printf("%s", title)
@@ -1998,12 +1998,8 @@ fu! csv#AnalyzeColumn(...) "{{{3
else else
let k = key let k = key
endif endif
if has("float") echo printf("%02d\t%02d\t%2.0f%%\t%.50s", i, res[key],
echo printf("%02d\t%02d\t%2.0f%%\t%.50s", i, res[key], \ ((res[key] + 0.0)/qty)*100, k)
\ ((res[key] + 0.0)/qty)*100, k)
else
echo printf("%02d\t%02d\t%.50s", i, res[key], k)
endif
call remove(res,key) call remove(res,key)
let i+=1 let i+=1
else else
@@ -2136,7 +2132,7 @@ fu! csv#NewRecord(line1, line2, count) "{{{3
if !exists("b:col_width") if !exists("b:col_width")
" Best guess width " Best guess width
if exists("b:csv_fixed_width_cols") if exists("b:csv_fixed_width_cols")
let record .= printf("%*s", csv#ColWidth(item), let record .= printf("%*s", csv#ColWidth(item, line('$'), 1),
\ b:delimiter) \ b:delimiter)
else else
let record .= printf("%20s", b:delimiter) let record .= printf("%20s", b:delimiter)
@@ -2251,7 +2247,7 @@ fu! csv#CommandDefinitions() "{{{3
\ ':echo csv#EvalColumn(<q-args>, "csv#SmplStdDevColumn", <line1>,<line2>)', \ ':echo csv#EvalColumn(<q-args>, "csv#SmplStdDevColumn", <line1>,<line2>)',
\ '-nargs=? -range=% -complete=custom,csv#SortComplete') \ '-nargs=? -range=% -complete=custom,csv#SortComplete')
call csv#LocalCmd("PopStdCol", call csv#LocalCmd("PopStdCol",
\ ':echo csv#EvalColumn(<q-args>, "csv#SmplStdDevColumn", <line1>,<line2>)', \ ':echo csv#EvalColumn(<q-args>, "csv#PopStdDevColumn", <line1>,<line2>)',
\ '-nargs=? -range=% -complete=custom,csv#SortComplete') \ '-nargs=? -range=% -complete=custom,csv#SortComplete')
call csv#LocalCmd("UnArrangeColumn", call csv#LocalCmd("UnArrangeColumn",
\':call csv#PrepUnArrangeCol(<line1>, <line2>)', \':call csv#PrepUnArrangeCol(<line1>, <line2>)',
@@ -2299,8 +2295,8 @@ fu! csv#CommandDefinitions() "{{{3
\ '-bang -nargs=? -range=%') \ '-bang -nargs=? -range=%')
call csv#LocalCmd("Filters", ':call csv#OutputFilters(<bang>0)', call csv#LocalCmd("Filters", ':call csv#OutputFilters(<bang>0)',
\ '-nargs=0 -bang') \ '-nargs=0 -bang')
call csv#LocalCmd("Analyze", ':call csv#AnalyzeColumn(<args>)', call csv#LocalCmd("Analyze", ':call csv#AnalyzeColumn(<f-args>)',
\ '-nargs=?') \ '-nargs=*' )
call csv#LocalCmd("VertFold", ':call csv#Vertfold(<bang>0,<q-args>)', call csv#LocalCmd("VertFold", ':call csv#Vertfold(<bang>0,<q-args>)',
\ '-bang -nargs=? -range=% -complete=custom,csv#SortComplete') \ '-bang -nargs=? -range=% -complete=custom,csv#SortComplete')
call csv#LocalCmd("CSVFixed", ':call csv#InitCSVFixedWidth()', '') call csv#LocalCmd("CSVFixed", ':call csv#InitCSVFixedWidth()', '')
@@ -2334,7 +2330,7 @@ fu! csv#ColumnWidth()
endfu endfu
fu! csv#Map(map, name, definition, ...) "{{{3 fu! csv#Map(map, name, definition, ...) "{{{3
let keyname = substitute(a:name, '[<>]', '', 'g') let keyname = substitute(substitute(a:name, '[<>]', '', 'g'), '-', '_', 'g')
let expr = (exists("a:1") && a:1 == 'expr' ? '<expr>' : '') let expr = (exists("a:1") && a:1 == 'expr' ? '<expr>' : '')
if !get(g:, "csv_nomap_". tolower(keyname), 0) if !get(g:, "csv_nomap_". tolower(keyname), 0)
" All mappings are buffer local " All mappings are buffer local
@@ -2934,6 +2930,11 @@ fu! csv#EvalColumn(nr, func, first, last, ...) range "{{{3
call csv#Warn("File is no CSV file!") call csv#Warn("File is no CSV file!")
return return
endif endif
" Need a Vim with floating point feature
if !has("float")
call csv#Warn("Your Vim is missing floating point feature!")
return
endif
let save = winsaveview() let save = winsaveview()
call csv#CheckHeaderLine() call csv#CheckHeaderLine()
let nr = matchstr(a:nr, '^\-\?\d\+') let nr = matchstr(a:nr, '^\-\?\d\+')
@@ -3147,7 +3148,9 @@ fu! CSVCount(col, fmt, first, last, ...) "{{{3
unlet! s:additional['distinct'] unlet! s:additional['distinct']
return (empty(result) ? 0 : result) return (empty(result) ? 0 : result)
endfu endfu
fu! CSVWidth() "{{{3 fu! CSVWidth(...) "{{{3
" do not output any warning
let silent = get(a:000, 0, 1)
" does not work with fixed width columns " does not work with fixed width columns
if exists("b:csv_fixed_width_cols") if exists("b:csv_fixed_width_cols")
let c = getline(1,'$') let c = getline(1,'$')
@@ -3166,7 +3169,7 @@ fu! CSVWidth() "{{{3
" Add width for last column " Add width for last column
call add(width, max-y+1) call add(width, max-y+1)
else else
call csv#CalculateColumnWidth('') call csv#CalculateColumnWidth(line('$'), silent)
let width=map(copy(b:col_width), 'v:val-1') let width=map(copy(b:col_width), 'v:val-1')
endif endif
return width return width
@@ -3189,3 +3192,5 @@ endfun
" Vim Modeline " {{{2 " Vim Modeline " {{{2
" vim: set foldmethod=marker et sw=0 sts=-1 ts=4: " vim: set foldmethod=marker et sw=0 sts=-1 ts=4:
endif

View File

@@ -1,6 +1,4 @@
if exists('g:polyglot_disabled') && index(g:polyglot_disabled, 'dart') != -1 if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'dart') == -1
finish
endif
function! s:error(text) abort function! s:error(text) abort
@@ -29,62 +27,61 @@ function! s:clearQfList(reason) abort
endif endif
endfunction endfunction
function! dart#fmt(q_args) abort function! dart#fmt(...) abort
if executable('dartfmt') let l:dartfmt = s:FindDartFmt()
let buffer_content = join(getline(1, '$'), "\n") if type(l:dartfmt) != type('') | return | endif
let args = '--stdin-name '.expand('%').' '.a:q_args let buffer_content = getline(1, '$')
let joined_lines = system(printf('dartfmt %s', args), buffer_content) let l:cmd = [l:dartfmt, '--stdin-name', shellescape(expand('%'))]
if buffer_content ==# joined_lines[:-2] if exists('g:dartfmt_options')
call s:clearQfList('dartfmt') call extend(l:cmd, g:dartfmt_options)
return
endif
if 0 == v:shell_error
let win_view = winsaveview()
let lines = split(joined_lines, "\n")
silent keepjumps call setline(1, lines)
if line('$') > len(lines)
silent keepjumps execute string(len(lines)+1).',$ delete'
endif
call winrestview(win_view)
call s:clearQfList('dartfmt')
else
let errors = split(joined_lines, "\n")[2:]
let error_format = '%Aline %l\, column %c of %f: %m,%C%.%#'
call s:cexpr(error_format, errors, 'dartfmt')
endif
else
call s:error('cannot execute binary file: dartfmt')
endif endif
call extend(l:cmd, a:000)
let lines = systemlist(join(l:cmd), join(buffer_content, "\n"))
" TODO(https://github.com/dart-lang/sdk/issues/38507) - Remove once the
" 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 endfunction
function! dart#analyzer(q_args) abort function! dart#analyzer(q_args) abort
if executable('dartanalyzer') call s:error('DartAnalyzer support has been removed. '.
let path = expand('%:p:gs:\:/:') \'If this broke your workflow please comment on '.
if filereadable(path) \'https://github.com/dart-lang/dart-vim-plugin/issues/89')
let command = printf('dartanalyzer %s %s', a:q_args, shellescape(path))
let lines = systemlist(command)
call s:cexpr('%m (%f\, line %l\, col %c)', lines, 'dartanalyzer')
else
call s:error(printf('cannot read a file: "%s"', path))
endif
else
call s:error('cannot execute binary file: dartanalyzer')
endif
endfunction endfunction
function! dart#tojs(q_args) abort function! dart#tojs(q_args) abort
if executable('dart2js') call s:error('Dart2JS support has been removed. '.
let path = expand('%:p:gs:\:/:') \'If this broke your workflow please comment on '.
if filereadable(path) \'https://github.com/dart-lang/dart-vim-plugin/issues/89')
let command = printf('dart2js %s %s', a:q_args, shellescape(path))
let lines = systemlist(command)
call s:cexpr('%m (%f\, line %l\, col %c)', lines, 'dart2js')
else
call s:error(printf('cannot read a file: "%s"', path))
endif
else
call s:error('cannot execute binary file: dartanalyzer')
endif
endfunction endfunction
" Finds the path to `uri`. " Finds the path to `uri`.
@@ -93,7 +90,7 @@ endfunction
" If the path cannot be resolved, or is not a package: uri, returns the " If the path cannot be resolved, or is not a package: uri, returns the
" original. " original.
function! dart#resolveUri(uri) abort function! dart#resolveUri(uri) abort
if a:uri !~ 'package:' if a:uri !~# 'package:'
return a:uri return a:uri
endif endif
let package_name = substitute(a:uri, 'package:\(\w\+\)\/.*', '\1', '') let package_name = substitute(a:uri, 'package:\(\w\+\)\/.*', '\1', '')
@@ -125,20 +122,20 @@ function! s:PackageMap() abort
let lines = readfile(dot_packages) let lines = readfile(dot_packages)
let map = {} let map = {}
for line in lines for line in lines
if line =~ '\s*#' if line =~# '\s*#'
continue continue
endif endif
let package = substitute(line, ':.*$', '', '') let package = substitute(line, ':.*$', '', '')
let lib_dir = substitute(line, '^[^:]*:', '', '') let lib_dir = substitute(line, '^[^:]*:', '', '')
if lib_dir =~ 'file:/' if lib_dir =~# 'file:/'
let lib_dir = substitute(lib_dir, 'file://', '', '') let lib_dir = substitute(lib_dir, 'file://', '', '')
if lib_dir =~ '/[A-Z]:/' if lib_dir =~# '/[A-Z]:/'
let lib_dir = lib_dir[1:] let lib_dir = lib_dir[1:]
endif endif
else else
let lib_dir = resolve(dot_packages_dir.'/'.lib_dir) let lib_dir = resolve(dot_packages_dir.'/'.lib_dir)
endif endif
if lib_dir =~ '/$' if lib_dir =~# '/$'
let lib_dir = lib_dir[:len(lib_dir) - 2] let lib_dir = lib_dir[:len(lib_dir) - 2]
endif endif
let map[package] = lib_dir let map[package] = lib_dir
@@ -148,7 +145,7 @@ endfunction
" Toggle whether dartfmt is run on save or not. " Toggle whether dartfmt is run on save or not.
function! dart#ToggleFormatOnSave() abort function! dart#ToggleFormatOnSave() abort
if get(g:, "dart_format_on_save", 0) if get(g:, 'dart_format_on_save', 0)
let g:dart_format_on_save = 0 let g:dart_format_on_save = 0
return return
endif endif
@@ -186,3 +183,5 @@ function! dart#setModifiable() abort
setlocal nomodifiable setlocal nomodifiable
endif endif
endfunction endfunction
endif

View File

@@ -1,6 +1,4 @@
if exists('g:polyglot_disabled') && index(g:polyglot_disabled, 'elixir') != -1 if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'elixir') == -1
finish
endif
let s:path = expand('<sfile>:h') let s:path = expand('<sfile>:h')
let s:cmd = join(['mix', 'run', '--no-start', '--no-compile', shellescape(s:path.'/get_repos.exs')]) let s:cmd = join(['mix', 'run', '--no-start', '--no-compile', shellescape(s:path.'/get_repos.exs')])
@@ -22,3 +20,5 @@ endfunction
function! db#adapter#ecto#complete_opaque(url) abort function! db#adapter#ecto#complete_opaque(url) abort
return map(s:repo_list(), 'v:val[0]') return map(s:repo_list(), 'v:val[0]')
endfunction endfunction
endif

36
autoload/ecrystal.vim Normal file
View File

@@ -0,0 +1,36 @@
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'crystal') == -1
let s:ecrystal_extensions = {
\ 'cr': 'crystal',
\ 'yml': 'yaml',
\ 'js': 'javascript',
\ 'txt': 'text',
\ 'md': 'markdown'
\ }
if exists('g:ecrystal_extensions')
call extend(s:ecrystal_extensions, g:ecrystal_extensions, 'force')
endif
function! ecrystal#SetSubtype() abort
if exists('b:ecrystal_subtype')
return
endif
let b:ecrystal_subtype = matchstr(substitute(expand('%:t'), '\c\%(\.ecr\)\+$', '', ''), '\.\zs\w\+\%(\ze+\w\+\)\=$')
let b:ecrystal_subtype = get(s:ecrystal_extensions, b:ecrystal_subtype, b:ecrystal_subtype)
if b:ecrystal_subtype ==# ''
let b:ecrystal_subtype = get(g:, 'ecrystal_default_subtype', 'html')
endif
if b:ecrystal_subtype !=# ''
exec 'setlocal filetype=ecrystal.' . b:ecrystal_subtype
exec 'setlocal syntax=ecrystal.' . b:ecrystal_subtype
endif
endfunction
" vim: sw=2 sts=2 et:
endif

View File

@@ -1,6 +1,4 @@
if exists('g:polyglot_disabled') && index(g:polyglot_disabled, 'elixir') != -1 if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'elixir') == -1
finish
endif
if !exists("g:elixir_indent_max_lookbehind") if !exists("g:elixir_indent_max_lookbehind")
let g:elixir_indent_max_lookbehind = 30 let g:elixir_indent_max_lookbehind = 30
@@ -363,3 +361,5 @@ function! elixir#indent#handle_inside_generic_block(context)
return -1 return -1
endif endif
endfunction endfunction
endif

View File

@@ -1,6 +1,4 @@
if exists('g:polyglot_disabled') && index(g:polyglot_disabled, 'elixir') != -1 if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'elixir') == -1
finish
endif
function! elixir#util#get_filename(word) abort function! elixir#util#get_filename(word) abort
let word = a:word let word = a:word
@@ -26,3 +24,5 @@ function! elixir#util#get_filename(word) abort
return word return word
endfunction endfunction
endif

View File

@@ -1,385 +0,0 @@
if exists('g:polyglot_disabled') && index(g:polyglot_disabled, 'elm') != -1
finish
endif
let s:errors = []
function! s:elmOracle(...) abort
let l:project = finddir('elm-stuff/..', '.;')
if len(l:project) == 0
echoerr '`elm-stuff` not found! run `elm-package install` for autocomplete.'
return []
endif
let l:filename = expand('%:p')
if a:0 == 0
let l:oldiskeyword = &iskeyword
" Some non obvious values used in 'iskeyword':
" @ = all alpha
" 48-57 = numbers 0 to 9
" @-@ = character @
" 124 = |
setlocal iskeyword=@,48-57,@-@,_,-,~,!,#,$,%,&,*,+,=,<,>,/,?,.,\\,124,^
let l:word = expand('<cword>')
let &iskeyword = l:oldiskeyword
else
let l:word = a:1
endif
let l:infos = elm#Oracle(l:filename, l:word)
if v:shell_error != 0
call elm#util#EchoError("elm-oracle failed:\n\n", l:infos)
return []
endif
let l:d = split(l:infos, '\n')
if len(l:d) > 0
return elm#util#DecodeJSON(l:d[0])
endif
return []
endf
" Vim command to format Elm files with elm-format
function! elm#Format() abort
" check for elm-format
if elm#util#CheckBin('elm-format', 'https://github.com/avh4/elm-format') ==# ''
return
endif
" save cursor position, folds and many other things
let l:curw = {}
try
mkview!
catch
let l:curw = winsaveview()
endtry
" save our undo file to be restored after we are done.
let l:tmpundofile = tempname()
exe 'wundo! ' . l:tmpundofile
" write current unsaved buffer to a temporary file
let l:tmpname = tempname() . '.elm'
call writefile(getline(1, '$'), l:tmpname)
" call elm-format on the temporary file
let l:out = system('elm-format ' . l:tmpname . ' --output ' . l:tmpname)
" if there is no error
if v:shell_error == 0
try | silent undojoin | catch | endtry
" replace current file with temp file, then reload buffer
let l:old_fileformat = &fileformat
call rename(l:tmpname, expand('%'))
silent edit!
let &fileformat = l:old_fileformat
let &syntax = &syntax
elseif g:elm_format_fail_silently == 0
call elm#util#EchoLater('EchoError', 'elm-format:', l:out)
endif
" save our undo history
silent! exe 'rundo ' . l:tmpundofile
call delete(l:tmpundofile)
" restore our cursor/windows positions, folds, etc..
if empty(l:curw)
silent! loadview
else
call winrestview(l:curw)
endif
endf
" Query elm-oracle and echo the type and docs for the word under the cursor.
function! elm#ShowDocs() abort
" check for the elm-oracle binary
if elm#util#CheckBin('elm-oracle', 'https://github.com/elmcast/elm-oracle') ==# ''
return
endif
let l:response = s:elmOracle()
if len(l:response) > 0
let l:info = l:response[0]
redraws! | echohl Identifier | echon l:info.fullName | echohl None | echon ' : ' | echohl Function | echon l:info.signature | echohl None | echon "\n\n" . l:info.comment
else
call elm#util#Echo('elm-oracle:', '...no match found')
endif
endf
" Query elm-oracle and open the docs for the word under the cursor.
function! elm#BrowseDocs() abort
" check for the elm-oracle binary
if elm#util#CheckBin('elm-oracle', 'https://github.com/elmcast/elm-oracle') ==# ''
return
endif
let l:response = s:elmOracle()
if len(l:response) > 0
let l:info = l:response[0]
call elm#util#OpenBrowser(l:info.href)
else
call elm#util#Echo('elm-oracle:', '...no match found')
endif
endf
function! elm#Syntastic(input) abort
let l:fixes = []
let l:bin = 'elm-make'
let l:format = '--report=json'
let l:input = shellescape(a:input)
let l:output = '--output=' . shellescape(syntastic#util#DevNull())
let l:command = l:bin . ' ' . l:format . ' ' . l:input . ' ' . l:output
let l:reports = s:ExecuteInRoot(l:command)
for l:report in split(l:reports, '\n')
if l:report[0] ==# '['
for l:error in elm#util#DecodeJSON(l:report)
if g:elm_syntastic_show_warnings == 0 && l:error.type ==? 'warning'
else
if a:input == l:error.file
call add(s:errors, l:error)
call add(l:fixes, {'filename': l:error.file,
\'valid': 1,
\'bufnr': bufnr('%'),
\'type': (l:error.type ==? 'error') ? 'E' : 'W',
\'lnum': l:error.region.start.line,
\'col': l:error.region.start.column,
\'text': l:error.overview})
endif
endif
endfor
endif
endfor
return l:fixes
endf
function! elm#Build(input, output, show_warnings) abort
let s:errors = []
let l:fixes = []
let l:rawlines = []
let l:bin = 'elm-make'
let l:format = '--report=json'
let l:input = shellescape(a:input)
let l:output = '--output=' . shellescape(a:output)
let l:command = l:bin . ' ' . l:format . ' ' . l:input . ' ' . l:output
let l:reports = s:ExecuteInRoot(l:command)
for l:report in split(l:reports, '\n')
if l:report[0] ==# '['
for l:error in elm#util#DecodeJSON(l:report)
if a:show_warnings == 0 && l:error.type ==? 'warning'
else
call add(s:errors, l:error)
call add(l:fixes, {'filename': l:error.file,
\'valid': 1,
\'type': (l:error.type ==? 'error') ? 'E' : 'W',
\'lnum': l:error.region.start.line,
\'col': l:error.region.start.column,
\'text': l:error.overview})
endif
endfor
else
call add(l:rawlines, l:report)
endif
endfor
let l:details = join(l:rawlines, "\n")
let l:lines = split(l:details, "\n")
if !empty(l:lines)
let l:overview = l:lines[0]
else
let l:overview = ''
endif
if l:details ==# '' || l:details =~? '^Successfully.*'
else
call add(s:errors, {'overview': l:details, 'details': l:details})
call add(l:fixes, {'filename': expand('%', 1),
\'valid': 1,
\'type': 'E',
\'lnum': 0,
\'col': 0,
\'text': l:overview})
endif
return l:fixes
endf
" Make the given file, or the current file if none is given.
function! elm#Make(...) abort
if elm#util#CheckBin('elm-make', 'http://elm-lang.org/install') ==# ''
return
endif
call elm#util#Echo('elm-make:', 'building...')
let l:input = (a:0 == 0) ? expand('%:p') : a:1
let l:fixes = elm#Build(l:input, g:elm_make_output_file, g:elm_make_show_warnings)
if len(l:fixes) > 0
call elm#util#EchoWarning('', 'found ' . len(l:fixes) . ' errors')
call setqflist(l:fixes, 'r')
cwindow
if get(g:, 'elm_jump_to_error', 1)
ll 1
endif
else
call elm#util#EchoSuccess('', 'Sucessfully compiled')
call setqflist([])
cwindow
endif
endf
" Show the detail of the current error in the quickfix window.
function! elm#ErrorDetail() abort
if !empty(filter(tabpagebuflist(), 'getbufvar(v:val, "&buftype") ==? "quickfix"'))
exec ':copen'
let l:linenr = line('.')
exec ':wincmd p'
if len(s:errors) > 0
let l:detail = s:errors[l:linenr-1].details
if l:detail ==# ''
let l:detail = s:errors[l:linenr-1].overview
endif
echo l:detail
endif
endif
endf
" Open the elm repl in a subprocess.
function! elm#Repl() abort
" check for the elm-repl binary
if elm#util#CheckBin('elm-repl', 'http://elm-lang.org/install') ==# ''
return
endif
if has('nvim')
term('elm-repl')
else
!elm-repl
endif
endf
function! elm#Oracle(filepath, word) abort
let l:bin = 'elm-oracle'
let l:filepath = shellescape(a:filepath)
let l:word = shellescape(a:word)
let l:command = l:bin . ' ' . l:filepath . ' ' . l:word
return s:ExecuteInRoot(l:command)
endfunction
let s:fullComplete = ''
" Complete the current token using elm-oracle
function! elm#Complete(findstart, base) abort
" a:base is unused, but the callback function for completion expects 2 arguments
if a:findstart
let l:line = getline('.')
let l:idx = col('.') - 1
let l:start = 0
while l:idx > 0 && l:line[l:idx - 1] =~# '[a-zA-Z0-9_\.]'
if l:line[l:idx - 1] ==# '.' && l:start == 0
let l:start = l:idx
endif
let l:idx -= 1
endwhile
if l:start == 0
let l:start = l:idx
endif
let s:fullComplete = l:line[l:idx : col('.')-2]
return l:start
else
" check for the elm-oracle binary
if elm#util#CheckBin('elm-oracle', 'https://github.com/elmcast/elm-oracle') ==# ''
return []
endif
let l:res = []
let l:response = s:elmOracle(s:fullComplete)
let l:detailed = get(g:, 'elm_detailed_complete', 0)
for l:r in l:response
let l:menu = ''
if l:detailed
let l:menu = ': ' . l:r.signature
endif
call add(l:res, {'word': l:r.name, 'menu': l:menu})
endfor
return l:res
endif
endf
" If the current buffer contains a consoleRunner, run elm-test with it.
" Otherwise run elm-test in the root of your project which deafults to
" running 'elm-test tests/TestRunner'.
function! elm#Test() abort
if elm#util#CheckBin('elm-test', 'https://github.com/rtfeldman/node-elm-test') ==# ''
return
endif
if match(getline(1, '$'), 'consoleRunner') < 0
let l:out = s:ExecuteInRoot('elm-test')
call elm#util#EchoSuccess('elm-test', l:out)
else
let l:filepath = shellescape(expand('%:p'))
let l:out = s:ExecuteInRoot('elm-test ' . l:filepath)
call elm#util#EchoSuccess('elm-test', l:out)
endif
endf
" Returns the closest parent with an elm-package.json file.
function! elm#FindRootDirectory() abort
let l:elm_root = getbufvar('%', 'elmRoot')
if empty(l:elm_root)
let l:current_file = expand('%:p')
let l:dir_current_file = fnameescape(fnamemodify(l:current_file, ':h'))
let l:old_match = findfile('elm-package.json', l:dir_current_file . ';')
let l:new_match = findfile('elm.json', l:dir_current_file . ';')
if !empty(l:new_match)
let l:elm_root = fnamemodify(l:new_match, ':p:h')
elseif !empty(l:old_match)
let l:elm_root = fnamemodify(l:old_match, ':p:h')
else
let l:elm_root = ''
endif
if !empty(l:elm_root)
call setbufvar('%', 'elmRoot', l:elm_root)
endif
endif
return l:elm_root
endfunction
" Executes a command in the project directory.
function! s:ExecuteInRoot(cmd) abort
let l:cd = exists('*haslocaldir') && haslocaldir() ? 'lcd ' : 'cd '
let l:current_dir = getcwd()
let l:root_dir = elm#FindRootDirectory()
try
execute l:cd . fnameescape(l:root_dir)
let l:out = system(a:cmd)
finally
execute l:cd . fnameescape(l:current_dir)
endtry
return l:out
endfunction

View File

@@ -1,184 +0,0 @@
if exists('g:polyglot_disabled') && index(g:polyglot_disabled, 'elm') != -1
finish
endif
" IsWin returns 1 if current OS is Windows or 0 otherwise
fun! elm#util#IsWin() abort
let l:win = ['win16', 'win32', 'win32unix', 'win64', 'win95']
for l:w in l:win
if (has(l:w))
return 1
endif
endfor
return 0
endf
fun! elm#util#CheckBin(bin, url) abort
let l:binpath = substitute(a:bin, '^\s*\(.\{-}\)\s*$', '\1', '')
if executable(l:binpath)
return l:binpath
endif
call elm#util#EchoWarning('elm-vim:', 'could not find ' . l:binpath . ' [' . a:url . ']')
return ''
endf
" Determines the browser command to use
fun! s:get_browser_command() abort
let l:elm_browser_command = get(g:, 'elm_browser_command', '')
if l:elm_browser_command ==? ''
if elm#util#IsWin()
let l:elm_browser_command = '!start rundll32 url.dll,FileProtocolHandler %URL%'
elseif has('mac') || has('macunix') || has('gui_macvim') || system('uname') =~? '^darwin'
let l:elm_browser_command = 'open %URL%'
elseif executable('xdg-open')
let l:elm_browser_command = 'xdg-open %URL%'
elseif executable('firefox')
let l:elm_browser_command = 'firefox %URL% &'
else
let l:elm_browser_command = ''
endif
endif
return l:elm_browser_command
endf
" OpenBrowser opens a url in the default browser
fun! elm#util#OpenBrowser(url) abort
let l:cmd = s:get_browser_command()
if len(l:cmd) == 0
redraw
echohl WarningMsg
echo "It seems that you don't have general web browser. Open URL below."
echohl None
echo a:url
return
endif
if l:cmd =~? '^!'
let l:cmd = substitute(l:cmd, '%URL%', '\=shellescape(a:url)', 'g')
silent! exec l:cmd
elseif l:cmd =~# '^:[A-Z]'
let l:cmd = substitute(l:cmd, '%URL%', '\=a:url', 'g')
exec l:cmd
else
let l:cmd = substitute(l:cmd, '%URL%', '\=shellescape(a:url)', 'g')
call system(l:cmd)
endif
endf
" DecodeJSON decodes a string of json into a viml object
fun! elm#util#DecodeJSON(s) abort
let l:true = 1
let l:false = 0
let l:null = 0
return eval(a:s)
endf
" Remove ANSI escape characters used for highlighting purposes
fun! s:strip_color(msg) abort
return substitute(a:msg, '\e\[[0-9;]\+[mK]', '', 'g')
endf
" Print functions
fun! elm#util#Echo(title, msg) abort
redraws! | echon a:title . ' ' | echohl Identifier | echon s:strip_color(a:msg) | echohl None
endf
fun! elm#util#EchoSuccess(title, msg) abort
redraws! | echon a:title . ' ' | echohl Function | echon s:strip_color(a:msg) | echohl None
endf
fun! elm#util#EchoWarning(title, msg) abort
redraws! | echon a:title . ' ' | echohl WarningMsg | echon s:strip_color(a:msg) | echohl None
endf
fun! elm#util#EchoError(title, msg) abort
redraws! | echon a:title . ' ' | echohl ErrorMsg | echon s:strip_color(a:msg) | echohl None
endf
fun! elm#util#EchoLater(func_name, title, msg) abort
let s:echo_func_name = a:func_name
let s:echo_title = a:title
let s:echo_msg = a:msg
endf
fun! elm#util#EchoStored() abort
if exists('s:echo_func_name') && exists('s:echo_title') && exists('s:echo_msg')
call elm#util#{s:echo_func_name}(s:echo_title, s:echo_msg)
unlet s:echo_func_name
unlet s:echo_title
unlet s:echo_msg
endif
endf
function! elm#util#GoToModule(name)
if empty(a:name) | return | endif
if empty(matchstr(a:name, '^Native\.'))
let l:extension = '.elm'
else
let l:extension = '.js'
endif
let l:rel_path = substitute(a:name, '\.', '/', 'g') . l:extension
let l:root = elm#FindRootDirectory()
let l:module_file = s:findLocalModule(l:rel_path, l:root)
if !filereadable(l:module_file)
let l:module_file = s:findDependencyModule(l:rel_path, l:root)
endif
if filereadable(l:module_file)
exec 'edit ' . fnameescape(l:module_file)
else
return s:error("Can't find module \"" . a:name . "\"")
endif
endfunction
function! s:findLocalModule(rel_path, root)
let l:old_match = findfile('elm-package.json', a:root . ';')
let l:new_match = findfile('elm.json', a:root . ';')
if !empty(l:new_match)
let l:package_json = l:new_match
elseif !empty(l:old_match)
let l:package_json = l:old_match
endif
if exists('*json_decode')
let l:package = json_decode(readfile(l:package_json))
let l:source_roots = l:package['source-directories']
else
" This is a fallback for vim's which do not support json_decode.
" It simply only looks in the 'src' subdirectory and fails otherwise.
let l:source_roots = ['src']
end
for l:source_root in l:source_roots
let l:file_path = a:root . '/' . l:source_root . '/' . a:rel_path
if !filereadable(l:file_path)
continue
endif
return l:file_path
endfor
endfunction
function! s:findDependencyModule(rel_path, root)
" If we are a dependency ourselves, we need to check our siblings.
" This is because elm package doesn't install dependencies recursively.
let l:root = substitute(a:root, '\/elm-stuff/packages.\+$', '', '')
" We naively craws the dependencies dir for any fitting module name.
" If it exists, we'll find it. If multiple filenames match,
" there's a chance we return the wrong one.
let l:module_paths = glob(l:root . '/elm-stuff/packages/**/' . a:rel_path, 0, 1)
if len(l:module_paths) > 0
return l:module_paths[0]
endif
endfunction
" Using the built-in :echoerr prints a stacktrace, which isn't that nice.
" From: https://github.com/moll/vim-node/blob/master/autoload/node.vim
function! s:error(msg)
echohl ErrorMsg
echomsg a:msg
echohl NONE
let v:errmsg = a:msg
endfunction

View File

@@ -1,27 +1,43 @@
if exists('g:polyglot_disabled') && index(g:polyglot_disabled, 'fish') != -1 if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'fish') == -1
finish
endif
function! fish#Indent() function! fish#Indent()
let l:shiftwidth = shiftwidth()
let l:prevlnum = prevnonblank(v:lnum - 1) let l:prevlnum = prevnonblank(v:lnum - 1)
if l:prevlnum ==# 0 if l:prevlnum ==# 0
return 0 return 0
endif endif
let l:indent = 0
let l:prevline = getline(l:prevlnum) let l:prevline = getline(l:prevlnum)
if l:prevline =~# '\v^\s*switch>'
return indent(l:prevlnum) + l:shiftwidth
elseif l:prevline =~# '\v^\s*%(begin|if|else|while|for|function|case)>'
let l:indent = l:shiftwidth
endif
let l:line = getline(v:lnum) let l:line = getline(v:lnum)
if l:line =~# '\v^\s*end>' let l:shiftwidth = shiftwidth()
return indent(l:prevlnum) - (l:indent ==# 0 ? l:shiftwidth : l:indent) let l:previndent = indent(l:prevlnum)
elseif l:line =~# '\v^\s*%(case|else)>' let l:indent = l:previndent
return indent(l:prevlnum) - l:shiftwidth if l:prevline =~# '\v^\s*%(begin|if|else|while|for|function|switch|case)>'
let l:indent += l:shiftwidth
endif endif
return indent(l:prevlnum) + l:indent if l:line =~# '\v^\s*end>'
let l:indent -= l:shiftwidth
" If we're inside a case, dedent twice because it ends the switch.
if l:prevline =~# '\v^\s*case>'
" Previous line starts the case.
let l:indent -= l:shiftwidth
else
" Scan back to a dedented line to find whether we're in a case.
let l:i = l:prevlnum
while l:i >= 1 && indent(l:i) >= l:previndent
let l:i = prevnonblank(l:i - 1)
endwhile
if indent(l:i) < l:previndent && getline(l:i) =~# '\v^\s*case>'
let l:indent -= l:shiftwidth
endif
endif
elseif l:line =~# '\v^\s*else>'
let l:indent -= l:shiftwidth
elseif l:prevline !~# '\v^\s*switch>' && l:line =~# '\v^\s*case>'
let l:indent -= l:shiftwidth
endif
if l:indent < 0
return 0
endif
return l:indent
endfunction endfunction
function! fish#Format() function! fish#Format()
@@ -56,7 +72,7 @@ function! fish#Complete(findstart, base)
let l:completions = let l:completions =
\ system('fish -c "complete -C'.shellescape(a:base).'"') \ system('fish -c "complete -C'.shellescape(a:base).'"')
let l:cmd = substitute(a:base, '\v\S+$', '', '') let l:cmd = substitute(a:base, '\v\S+$', '', '')
for l:line in split(l:completions, '\n') for l:line in filter(split(l:completions, '\n'), 'len(v:val)')
let l:tokens = split(l:line, '\t') let l:tokens = split(l:line, '\t')
call add(l:results, {'word': l:cmd.l:tokens[0], call add(l:results, {'word': l:cmd.l:tokens[0],
\'abbr': l:tokens[0], \'abbr': l:tokens[0],
@@ -69,3 +85,5 @@ endfunction
function! fish#errorformat() function! fish#errorformat()
return '%Afish: %m,%-G%*\\ ^,%-Z%f (line %l):%s' return '%Afish: %m,%-G%*\\ ^,%-Z%f (line %l):%s'
endfunction endfunction
endif

517
autoload/fsharp.vim Normal file
View File

@@ -0,0 +1,517 @@
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'fsharp') == -1
" Vim autoload functions
if exists('g:loaded_autoload_fsharp')
finish
endif
let g:loaded_autoload_fsharp = 1
let s:cpo_save = &cpo
set cpo&vim
function! s:prompt(msg)
let height = &cmdheight
if height < 2
set cmdheight=2
endif
echom a:msg
let &cmdheight = height
endfunction
function! s:PlainNotification(content)
return { 'Content': a:content }
endfunction
function! s:TextDocumentIdentifier(path)
let usr_ss_opt = &shellslash
set shellslash
let uri = fnamemodify(a:path, ":p")
if uri[0] == "/"
let uri = "file://" . uri
else
let uri = "file:///" . uri
endif
let &shellslash = usr_ss_opt
return { 'Uri': uri }
endfunction
function! s:Position(line, character)
return { 'Line': a:line, 'Character': a:character }
endfunction
function! s:TextDocumentPositionParams(documentUri, line, character)
return {
\ 'TextDocument': s:TextDocumentIdentifier(a:documentUri),
\ 'Position': s:Position(a:line, a:character)
\ }
endfunction
function! s:DocumentationForSymbolRequest(xmlSig, assembly)
return {
\ 'XmlSig': a:xmlSig,
\ 'Assembly': a:assembly
\ }
endfunction
function! s:ProjectParms(projectUri)
return { 'Project': s:TextDocumentIdentifier(a:projectUri) }
endfunction
function! s:WorkspacePeekRequest(directory, deep, excludedDirs)
return {
\ 'Directory': fnamemodify(a:directory, ":p"),
\ 'Deep': a:deep,
\ 'ExcludedDirs': a:excludedDirs
\ }
endfunction
function! s:WorkspaceLoadParms(files)
let prm = []
for file in a:files
call add(prm, s:TextDocumentIdentifier(file))
endfor
return { 'TextDocuments': prm }
endfunction
function! s:FsdnRequest(query)
return { 'Query': a:query }
endfunction
function! s:call(method, params, cont)
call LanguageClient#Call(a:method, a:params, a:cont)
endfunction
function! s:signature(filePath, line, character, cont)
return s:call('fsharp/signature', s:TextDocumentPositionParams(a:filePath, a:line, a:character), a:cont)
endfunction
function! s:signatureData(filePath, line, character, cont)
return s:call('fsharp/signatureData', s:TextDocumentPositionParams(a:filePath, a:line, a:character), a:cont)
endfunction
function! s:lineLens(projectPath, cont)
return s:call('fsharp/lineLens', s:ProjectParms(a:projectPath), a:cont)
endfunction
function! s:compilerLocation(cont)
return s:call('fsharp/compilerLocation', {}, a:cont)
endfunction
function! s:compile(projectPath, cont)
return s:call('fsharp/compile', s:ProjectParms(a:projectPath), a:cont)
endfunction
function! s:workspacePeek(directory, depth, excludedDirs, cont)
return s:call('fsharp/workspacePeek', s:WorkspacePeekRequest(a:directory, a:depth, a:excludedDirs), a:cont)
endfunction
function! s:workspaceLoad(files, cont)
return s:call('fsharp/workspaceLoad', s:WorkspaceLoadParms(a:files), a:cont)
endfunction
function! s:project(projectPath, cont)
return s:call('fsharp/project', s:ProjectParms(a:projectPath), a:cont)
endfunction
function! s:fsdn(signature, cont)
return s:call('fsharp/fsdn', s:FsdnRequest(a:signature), a:cont)
endfunction
function! s:f1Help(filePath, line, character, cont)
return s:call('fsharp/f1Help', s:TextDocumentPositionParams(a:filePath, a:line, a:character), a:cont)
endfunction
function! fsharp#documentation(filePath, line, character, cont)
return s:call('fsharp/documentation', s:TextDocumentPositionParams(a:filePath, a:line, a:character), a:cont)
endfunction
function! s:documentationSymbol(xmlSig, assembly, cont)
return s:call('fsharp/documentationSymbol', s:DocumentationForSymbolRequest(a:xmlSig, a:assembly), a:cont)
endfunction
" FSharpConfigDto from https://github.com/fsharp/FsAutoComplete/blob/master/src/FsAutoComplete/LspHelpers.fs
"
" * The following options seems not working with workspace/didChangeConfiguration
" since the initialization has already completed?
" 'AutomaticWorkspaceInit',
" 'WorkspaceModePeekDeepLevel',
"
" * Changes made to linter/unused analyzer settings seems not reflected after sending them to FSAC?
"
let s:config_keys_camel =
\ [
\ {'key': 'AutomaticWorkspaceInit', 'default': 1},
\ {'key': 'WorkspaceModePeekDeepLevel', 'default': 2},
\ {'key': 'ExcludeProjectDirectories', 'default': []},
\ {'key': 'keywordsAutocomplete', 'default': 1},
\ {'key': 'ExternalAutocomplete', 'default': 0},
\ {'key': 'Linter', 'default': 1},
\ {'key': 'UnionCaseStubGeneration', 'default': 1},
\ {'key': 'UnionCaseStubGenerationBody'},
\ {'key': 'RecordStubGeneration', 'default': 1},
\ {'key': 'RecordStubGenerationBody'},
\ {'key': 'InterfaceStubGeneration', 'default': 1},
\ {'key': 'InterfaceStubGenerationObjectIdentifier', 'default': 'this'},
\ {'key': 'InterfaceStubGenerationMethodBody'},
\ {'key': 'UnusedOpensAnalyzer', 'default': 1},
\ {'key': 'UnusedDeclarationsAnalyzer', 'default': 1},
\ {'key': 'SimplifyNameAnalyzer', 'default': 0},
\ {'key': 'ResolveNamespaces', 'default': 1},
\ {'key': 'EnableReferenceCodeLens', 'default': 1},
\ {'key': 'EnableAnalyzers', 'default': 0},
\ {'key': 'AnalyzersPath'},
\ {'key': 'DisableInMemoryProjectReferences', 'default': 0},
\ {'key': 'LineLens', 'default': {'enabled': 'replaceCodeLens', 'prefix': '//'}},
\ {'key': 'UseSdkScripts', 'default': 1},
\ {'key': 'dotNetRoot'},
\ {'key': 'fsiExtraParameters', 'default': []},
\ ]
let s:config_keys = []
function! fsharp#toSnakeCase(str)
let sn = substitute(a:str, '\(\<\u\l\+\|\l\+\)\(\u\)', '\l\1_\l\2', 'g')
if sn == a:str | return tolower(a:str) | endif
return sn
endfunction
function! s:buildConfigKeys()
if len(s:config_keys) == 0
for key_camel in s:config_keys_camel
let key = {}
let key.snake = fsharp#toSnakeCase(key_camel.key)
let key.camel = key_camel.key
if has_key(key_camel, 'default')
let key.default = key_camel.default
endif
call add(s:config_keys, key)
endfor
endif
endfunction
function! g:fsharp#getServerConfig()
let fsharp = {}
call s:buildConfigKeys()
for key in s:config_keys
if exists('g:fsharp#' . key.snake)
let fsharp[key.camel] = g:fsharp#{key.snake}
elseif exists('g:fsharp#' . key.camel)
let fsharp[key.camel] = g:fsharp#{key.camel}
elseif has_key(key, 'default') && g:fsharp#use_recommended_server_config
let g:fsharp#{key.snake} = key.default
let fsharp[key.camel] = key.default
endif
endfor
return fsharp
endfunction
function! g:fsharp#updateServerConfig()
let fsharp = fsharp#getServerConfig()
let settings = {'settings': {'FSharp': fsharp}}
call LanguageClient#Notify('workspace/didChangeConfiguration', settings)
endfunction
function! s:findWorkspace(dir, cont)
let s:cont_findWorkspace = a:cont
function! s:callback_findWorkspace(result)
let result = a:result
let content = json_decode(result.result.content)
if len(content.Data.Found) < 1
return []
endif
let workspace = { 'Type': 'none' }
for found in content.Data.Found
if workspace.Type == 'none'
let workspace = found
elseif found.Type == 'solution'
if workspace.Type == 'project'
let workspace = found
else
let curLen = len(workspace.Data.Items)
let newLen = len(found.Data.Items)
if newLen > curLen
let workspace = found
endif
endif
endif
endfor
if workspace.Type == 'solution'
call s:cont_findWorkspace([workspace.Data.Path])
else
call s:cont_findWorkspace(workspace.Data.Fsprojs)
endif
endfunction
call s:workspacePeek(a:dir, g:fsharp#workspace_mode_peek_deep_level, g:fsharp#exclude_project_directories, function("s:callback_findWorkspace"))
endfunction
let s:workspace = []
function! s:load(arg)
let s:loading_workspace = a:arg
function! s:callback_load(_)
echo "[FSAC] Workspace loaded: " . join(s:loading_workspace, ', ')
let s:workspace = s:workspace + s:loading_workspace
endfunction
call s:workspaceLoad(a:arg, function("s:callback_load"))
endfunction
function! fsharp#loadProject(...)
let prjs = []
for proj in a:000
call add(prjs, fnamemodify(proj, ':p'))
endfor
call s:load(prjs)
endfunction
function! fsharp#loadWorkspaceAuto()
if &ft == 'fsharp'
call fsharp#updateServerConfig()
if g:fsharp#automatic_workspace_init
echom "[FSAC] Loading workspace..."
let bufferDirectory = fnamemodify(resolve(expand('%:p')), ':h')
call s:findWorkspace(bufferDirectory, function("s:load"))
endif
endif
endfunction
function! fsharp#reloadProjects()
if len(s:workspace) > 0
function! s:callback_reloadProjects(_)
call s:prompt("[FSAC] Workspace reloaded.")
endfunction
call s:workspaceLoad(s:workspace, function("s:callback_reloadProjects"))
else
echom "[FSAC] Workspace is empty"
endif
endfunction
function! fsharp#OnFSProjSave()
if &ft == "fsharp_project" && exists('g:fsharp#automatic_reload_workspace') && g:fsharp#automatic_reload_workspace
call fsharp#reloadProjects()
endif
endfunction
function! fsharp#showSignature()
function! s:callback_showSignature(result)
let result = a:result
if exists('result.result.content')
let content = json_decode(result.result.content)
if exists('content.Data')
echom substitute(content.Data, '\n\+$', ' ', 'g')
endif
endif
endfunction
call s:signature(expand('%:p'), line('.') - 1, col('.') - 1, function("s:callback_showSignature"))
endfunction
function! fsharp#OnCursorMove()
if g:fsharp#show_signature_on_cursor_move
call fsharp#showSignature()
endif
endfunction
function! fsharp#showF1Help()
let result = s:f1Help(expand('%:p'), line('.') - 1, col('.') - 1)
echo result
endfunction
function! fsharp#showTooltip()
function! s:callback_showTooltip(result)
let result = a:result
if exists('result.result.content')
let content = json_decode(result.result.content)
if exists('content.Data')
call LanguageClient#textDocument_hover()
endif
endif
endfunction
" show hover only if signature exists for the current position
call s:signature(expand('%:p'), line('.') - 1, col('.') - 1, function("s:callback_showTooltip"))
endfunction
let s:script_root_dir = expand('<sfile>:p:h') . "/../"
let s:fsac = fnamemodify(s:script_root_dir . "fsac/fsautocomplete.dll", ":p")
let g:fsharp#languageserver_command =
\ ['dotnet', s:fsac,
\ '--background-service-enabled'
\ ]
function! s:download(branch)
echom "[FSAC] Downloading FSAC. This may take a while..."
let zip = s:script_root_dir . "fsac.zip"
call system(
\ 'curl -fLo ' . zip . ' --create-dirs ' .
\ '"https://ci.appveyor.com/api/projects/fsautocomplete/fsautocomplete/artifacts/bin/pkgs/fsautocomplete.netcore.zip?branch=' . a:branch . '"'
\ )
if v:shell_error == 0
call system('unzip -o -d ' . s:script_root_dir . "/fsac " . zip)
echom "[FSAC] Updated FsAutoComplete to version " . a:branch . ""
else
echom "[FSAC] Failed to update FsAutoComplete"
endif
endfunction
function! fsharp#updateFSAC(...)
if len(a:000) == 0
let branch = "master"
else
let branch = a:000[0]
endif
call s:download(branch)
endfunction
let s:fsi_buffer = -1
let s:fsi_job = -1
let s:fsi_width = 0
let s:fsi_height = 0
function! s:win_gotoid_safe(winid)
function! s:vimReturnFocus(window)
call win_gotoid(a:window)
redraw!
endfunction
if has('nvim')
call win_gotoid(a:winid)
else
call timer_start(1, { -> s:vimReturnFocus(a:winid) })
endif
endfunction
function! s:get_fsi_command()
let cmd = g:fsharp#fsi_command
for prm in g:fsharp#fsi_extra_parameters
let cmd = cmd . " " . prm
endfor
return cmd
endfunction
function! fsharp#openFsi(returnFocus)
if bufwinid(s:fsi_buffer) <= 0
let fsi_command = s:get_fsi_command()
" Neovim
if exists('*termopen') || exists('*term_start')
let current_win = win_getid()
execute g:fsharp#fsi_window_command
if s:fsi_width > 0 | execute 'vertical resize' s:fsi_width | endif
if s:fsi_height > 0 | execute 'resize' s:fsi_height | endif
" if window is closed but FSI is still alive then reuse it
if s:fsi_buffer >= 0 && bufexists(str2nr(s:fsi_buffer))
exec 'b' s:fsi_buffer
normal G
if !has('nvim') && mode() == 'n' | execute "normal A" | endif
if a:returnFocus | call s:win_gotoid_safe(current_win) | endif
" open FSI: Neovim
elseif has('nvim')
let s:fsi_job = termopen(fsi_command)
if s:fsi_job > 0
let s:fsi_buffer = bufnr("%")
else
close
echom "[FSAC] Failed to open FSI."
return -1
endif
" open FSI: Vim
else
let options = {
\ "term_name": "F# Interactive",
\ "curwin": 1,
\ "term_finish": "close"
\ }
let s:fsi_buffer = term_start(fsi_command, options)
if s:fsi_buffer != 0
if exists('*term_setkill') | call term_setkill(s:fsi_buffer, "term") | endif
let s:fsi_job = term_getjob(s:fsi_buffer)
else
close
echom "[FSAC] Failed to open FSI."
return -1
endif
endif
setlocal bufhidden=hide
normal G
if a:returnFocus | call s:win_gotoid_safe(current_win) | endif
return s:fsi_buffer
else
echom "[FSAC] Your Vim does not support terminal".
return 0
endif
endif
return s:fsi_buffer
endfunction
function! fsharp#toggleFsi()
let fsiWindowId = bufwinid(s:fsi_buffer)
if fsiWindowId > 0
let current_win = win_getid()
call win_gotoid(fsiWindowId)
let s:fsi_width = winwidth('%')
let s:fsi_height = winheight('%')
close
call win_gotoid(current_win)
else
call fsharp#openFsi(0)
endif
endfunction
function! fsharp#quitFsi()
if s:fsi_buffer >= 0 && bufexists(str2nr(s:fsi_buffer))
if has('nvim')
let winid = bufwinid(s:fsi_buffer)
if winid > 0 | execute "close " . winid | endif
call jobstop(s:fsi_job)
else
call job_stop(s:fsi_job, "term")
endif
let s:fsi_buffer = -1
let s:fsi_job = -1
endif
endfunction
function! fsharp#resetFsi()
call fsharp#quitFsi()
return fsharp#openFsi(1)
endfunction
function! fsharp#sendFsi(text)
if fsharp#openFsi(!g:fsharp#fsi_focus_on_send) > 0
" Neovim
if has('nvim')
call chansend(s:fsi_job, a:text . ";;". "\n")
" Vim 8
else
call term_sendkeys(s:fsi_buffer, a:text . ";;" . "\<cr>")
call term_wait(s:fsi_buffer)
endif
endif
endfunction
" https://stackoverflow.com/a/6271254
function! s:get_visual_selection()
let [line_start, column_start] = getpos("'<")[1:2]
let [line_end, column_end] = getpos("'>")[1:2]
let lines = getline(line_start, line_end)
if len(lines) == 0
return ''
endif
let lines[-1] = lines[-1][: column_end - (&selection == 'inclusive' ? 1 : 2)]
let lines[0] = lines[0][column_start - 1:]
return lines
endfunction
function! s:get_complete_buffer()
return join(getline(1, '$'), "\n")
endfunction
function! fsharp#sendSelectionToFsi() range
let lines = s:get_visual_selection()
exec 'normal' len(lines) . 'j'
let text = join(lines, "\n")
return fsharp#sendFsi(text)
endfunction
function! fsharp#sendLineToFsi()
let text = getline('.')
exec 'normal j'
return fsharp#sendFsi(text)
endfunction
function! fsharp#sendAllToFsi()
let text = s:get_complete_buffer()
return fsharp#sendFsi(text)
endfunction
let &cpo = s:cpo_save
unlet s:cpo_save
" vim: sw=4 et sts=4
endif

View File

@@ -1,6 +1,4 @@
if exists('g:polyglot_disabled') && index(g:polyglot_disabled, 'go') != -1 if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'go') == -1
finish
endif
" don't spam the user when Vim is started in Vi compatibility mode " don't spam the user when Vim is started in Vi compatibility mode
let s:cpo_save = &cpo let s:cpo_save = &cpo
@@ -57,12 +55,19 @@ function! go#config#TermCloseOnExit() abort
return get(g:, 'go_term_close_on_exit', 1) return get(g:, 'go_term_close_on_exit', 1)
endfunction endfunction
function! go#config#TermReuse() abort
return get(g:, 'go_term_reuse', 0)
endfunction
function! go#config#SetTermCloseOnExit(value) abort function! go#config#SetTermCloseOnExit(value) abort
let g:go_term_close_on_exit = a:value let g:go_term_close_on_exit = a:value
endfunction endfunction
function! go#config#TermEnabled() abort function! go#config#TermEnabled() abort
return has('nvim') && get(g:, 'go_term_enabled', 0) " nvim always support
" vim will support if terminal feature exists
let l:support = has('nvim') || has('terminal')
return support && get(g:, 'go_term_enabled', 0)
endfunction endfunction
function! go#config#SetTermEnabled(value) abort function! go#config#SetTermEnabled(value) abort
@@ -86,7 +91,18 @@ function! go#config#StatuslineDuration() abort
endfunction endfunction
function! go#config#SnippetEngine() abort function! go#config#SnippetEngine() abort
return get(g:, 'go_snippet_engine', 'automatic') let l:engine = get(g:, 'go_snippet_engine', 'automatic')
if l:engine is? "automatic"
if get(g:, 'did_plugin_ultisnips') is 1
let l:engine = 'ultisnips'
elseif get(g:, 'loaded_neosnippet') is 1
let l:engine = 'neosnippet'
elseif get(g:, 'loaded_minisnip') is 1
let l:engine = 'minisnip'
endif
endif
return l:engine
endfunction endfunction
function! go#config#PlayBrowserCommand() abort function! go#config#PlayBrowserCommand() abort
@@ -153,30 +169,13 @@ function! go#config#SetGuruScope(scope) abort
endif endif
endfunction endfunction
function! go#config#GocodeUnimportedPackages() abort
return get(g:, 'go_gocode_unimported_packages', 0)
endfunction
let s:sock_type = (has('win32') || has('win64')) ? 'tcp' : 'unix'
function! go#config#GocodeSocketType() abort
return get(g:, 'go_gocode_socket_type', s:sock_type)
endfunction
function! go#config#GocodeProposeBuiltins() abort
return get(g:, 'go_gocode_propose_builtins', 1)
endfunction
function! go#config#GocodeProposeSource() abort
return get(g:, 'go_gocode_propose_source', 0)
endfunction
function! go#config#EchoCommandInfo() abort function! go#config#EchoCommandInfo() abort
return get(g:, 'go_echo_command_info', 1) return get(g:, 'go_echo_command_info', 1)
endfunction endfunction
function! go#config#DocUrl() abort function! go#config#DocUrl() abort
let godoc_url = get(g:, 'go_doc_url', 'https://godoc.org') let godoc_url = get(g:, 'go_doc_url', 'https://pkg.go.dev')
if godoc_url isnot 'https://godoc.org' if godoc_url isnot 'https://pkg.go.dev'
" strip last '/' character if available " strip last '/' character if available
let last_char = strlen(godoc_url) - 1 let last_char = strlen(godoc_url) - 1
if godoc_url[last_char] == '/' if godoc_url[last_char] == '/'
@@ -209,9 +208,10 @@ endfunction
function! go#config#DebugWindows() abort function! go#config#DebugWindows() abort
return get(g:, 'go_debug_windows', { return get(g:, 'go_debug_windows', {
\ 'stack': 'leftabove 20vnew',
\ 'out': 'botright 10new',
\ 'vars': 'leftabove 30vnew', \ 'vars': 'leftabove 30vnew',
\ 'stack': 'leftabove 20new',
\ 'goroutines': 'botright 10new',
\ 'out': 'botright 5new',
\ } \ }
\ ) \ )
@@ -228,7 +228,7 @@ function! go#config#DebugCommands() abort
endfunction endfunction
function! go#config#DebugLogOutput() abort function! go#config#DebugLogOutput() abort
return get(g:, 'go_debug_log_output', 'debugger, rpc') return get(g:, 'go_debug_log_output', 'debugger,rpc')
endfunction endfunction
function! go#config#LspLog() abort function! go#config#LspLog() abort
@@ -253,6 +253,10 @@ function! go#config#AddtagsTransform() abort
return get(g:, 'go_addtags_transform', "snakecase") return get(g:, 'go_addtags_transform', "snakecase")
endfunction endfunction
function! go#config#AddtagsSkipUnexported() abort
return get(g:, 'go_addtags_skip_unexported', 0)
endfunction
function! go#config#TemplateAutocreate() abort function! go#config#TemplateAutocreate() abort
return get(g:, "go_template_autocreate", 1) return get(g:, "go_template_autocreate", 1)
endfunction endfunction
@@ -262,27 +266,15 @@ function! go#config#SetTemplateAutocreate(value) abort
endfunction endfunction
function! go#config#MetalinterCommand() abort function! go#config#MetalinterCommand() abort
return get(g:, "go_metalinter_command", "gometalinter") return get(g:, "go_metalinter_command", "golangci-lint")
endfunction endfunction
function! go#config#MetalinterAutosaveEnabled() abort function! go#config#MetalinterAutosaveEnabled() abort
let l:default_enabled = ["vet", "golint"] return get(g:, "go_metalinter_autosave_enabled", ["govet", "golint"])
if go#config#MetalinterCommand() == "golangci-lint"
let l:default_enabled = ["govet", "golint"]
endif
return get(g:, "go_metalinter_autosave_enabled", default_enabled)
endfunction endfunction
function! go#config#MetalinterEnabled() abort function! go#config#MetalinterEnabled() abort
let l:default_enabled = ["vet", "golint", "errcheck"] return get(g:, "go_metalinter_enabled", ["vet", "golint", "errcheck"])
if go#config#MetalinterCommand() == "golangci-lint"
let l:default_enabled = ["govet", "golint"]
endif
return get(g:, "go_metalinter_enabled", default_enabled)
endfunction endfunction
function! go#config#GolintBin() abort function! go#config#GolintBin() abort
@@ -309,6 +301,10 @@ function! go#config#FmtAutosave() abort
return get(g:, "go_fmt_autosave", 1) return get(g:, "go_fmt_autosave", 1)
endfunction endfunction
function! go#config#ImportsAutosave() abort
return get(g:, 'go_imports_autosave', 0)
endfunction
function! go#config#SetFmtAutosave(value) abort function! go#config#SetFmtAutosave(value) abort
let g:go_fmt_autosave = a:value let g:go_fmt_autosave = a:value
endfunction endfunction
@@ -353,8 +349,12 @@ function! go#config#FmtCommand() abort
return get(g:, "go_fmt_command", "gofmt") return get(g:, "go_fmt_command", "gofmt")
endfunction endfunction
function! go#config#ImportsMode() abort
return get(g:, "go_imports_mode", "goimports")
endfunction
function! go#config#FmtOptions() abort function! go#config#FmtOptions() abort
return get(g:, "go_fmt_options", {}) return get(b:, "go_fmt_options", get(g:, "go_fmt_options", {}))
endfunction endfunction
function! go#config#FmtFailSilently() abort function! go#config#FmtFailSilently() abort
@@ -369,8 +369,13 @@ function! go#config#PlayOpenBrowser() abort
return get(g:, "go_play_open_browser", 1) return get(g:, "go_play_open_browser", 1)
endfunction endfunction
function! go#config#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 function! go#config#GorenameBin() abort
return get(g:, "go_gorename_bin", "gorename") return get(g:, "go_gorename_bin", "gopls")
endfunction endfunction
function! go#config#GorenamePrefill() abort function! go#config#GorenamePrefill() abort
@@ -464,10 +469,22 @@ function! go#config#HighlightVariableDeclarations() abort
return get(g:, 'go_highlight_variable_declarations', 0) return get(g:, 'go_highlight_variable_declarations', 0)
endfunction 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 function! go#config#HighlightDebug() abort
return get(g:, 'go_highlight_debug', 1) return get(g:, 'go_highlight_debug', 1)
endfunction endfunction
function! go#config#DebugBreakpointSignText() abort
return get(g:, 'go_debug_breakpoint_sign_text', '>')
endfunction
function! go#config#FoldEnable(...) abort function! go#config#FoldEnable(...) abort
if a:0 > 0 if a:0 > 0
return index(go#config#FoldEnable(), a:1) > -1 return index(go#config#FoldEnable(), a:1) > -1
@@ -483,6 +500,78 @@ function! go#config#CodeCompletionEnabled() abort
return get(g:, "go_code_completion_enabled", 1) return get(g:, "go_code_completion_enabled", 1)
endfunction endfunction
function! go#config#CodeCompletionIcase() abort
return get(g:, "go_code_completion_icase", 0)
endfunction
function! go#config#Updatetime() abort
let go_updatetime = get(g:, 'go_updatetime', 800)
return go_updatetime == 0 ? &updatetime : go_updatetime
endfunction
function! go#config#ReferrersMode() abort
return get(g:, 'go_referrers_mode', 'gopls')
endfunction
function! go#config#ImplementsMode() abort
return get(g:, 'go_implements_mode', 'guru')
endfunction
function! go#config#GoplsCompleteUnimported() abort
return get(g:, 'go_gopls_complete_unimported', v:null)
endfunction
function! go#config#GoplsDeepCompletion() abort
return get(g:, 'go_gopls_deep_completion', v:null)
endfunction
function! go#config#GoplsMatcher() abort
if !exists('g:go_gopls_matcher') && get(g:, 'g:go_gopls_fuzzy_matching', v:null) is 1
return 'fuzzy'
endif
return get(g:, 'go_gopls_matcher', v:null)
endfunction
function! go#config#GoplsStaticCheck() abort
return get(g:, 'go_gopls_staticcheck', v:null)
endfunction
function! go#config#GoplsUsePlaceholders() abort
return get(g:, 'go_gopls_use_placeholders', v:null)
endfunction
function! go#config#GoplsTempModfile() abort
return get(g:, 'go_gopls_temp_modfile', v:null)
endfunction
function! go#config#GoplsAnalyses() abort
return get(g:, 'go_gopls_analyses', v:null)
endfunction
function! go#config#GoplsLocal() abort
return get(g:, 'go_gopls_local', v:null)
endfunction
function! go#config#GoplsGofumpt() abort
return get(g:, 'go_gopls_gofumpt', v:null)
endfunction
function! go#config#GoplsSettings() abort
return get(g:, 'go_gopls_settings', v:null)
endfunction
function! go#config#GoplsEnabled() abort
return get(g:, 'go_gopls_enabled', 1)
endfunction
function! go#config#DiagnosticsEnabled() abort
return get(g:, 'go_diagnostics_enabled', 0)
endfunction
function! go#config#GoplsOptions() abort
return get(g:, 'go_gopls_options', ['-remote=auto'])
endfunction
" Set the default value. A value of "1" is a shortcut for this, for " Set the default value. A value of "1" is a shortcut for this, for
" compatibility reasons. " compatibility reasons.
if exists("g:go_gorename_prefill") && g:go_gorename_prefill == 1 if exists("g:go_gorename_prefill") && g:go_gorename_prefill == 1
@@ -494,3 +583,5 @@ let &cpo = s:cpo_save
unlet s:cpo_save unlet s:cpo_save
" vim: sw=2 ts=2 et " vim: sw=2 ts=2 et
endif

View File

@@ -1,16 +1,39 @@
if exists('g:polyglot_disabled') && index(g:polyglot_disabled, 'graphql') != -1 if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'graphql') == -1
finish
endif
" Vim plugin " Copyright (c) 2016-2020 Jon Parise <jon@indelible.org>
"
" Permission is hereby granted, free of charge, to any person obtaining a copy
" of this software and associated documentation files (the "Software"), to
" deal in the Software without restriction, including without limitation the
" rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
" sell copies of the Software, and to permit persons to whom the Software is
" furnished to do so, subject to the following conditions:
"
" The above copyright notice and this permission notice shall be included in
" all copies or substantial portions of the Software.
"
" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
" IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
" FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
" AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
" LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
" FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
" IN THE SOFTWARE.
"
" Language: GraphQL " Language: GraphQL
" Maintainer: Jon Parise <jon@indelible.org> " Maintainer: Jon Parise <jon@indelible.org>
if exists('g:autoloaded_graphql') function! graphql#has_syntax_group(group) abort
finish try
endif silent execute 'silent highlight ' . a:group
let g:autoloaded_graphql = 1 catch
return v:false
endtry
return v:true
endfunction
function! graphql#javascript_tags() abort function! graphql#javascript_tags() abort
return get(g:, 'graphql_javascript_tags', ['gql', 'graphql', 'Relay.QL']) return get(g:, 'graphql_javascript_tags', ['gql', 'graphql', 'Relay.QL'])
endfunction endfunction
endif

View File

@@ -1,6 +1,4 @@
if exists('g:polyglot_disabled') && index(g:polyglot_disabled, 'html5') != -1 if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'html5') == -1
finish
endif
" Vim completion script " Vim completion script
" Language: HTML and XHTML " Language: HTML and XHTML
@@ -843,3 +841,5 @@ function! htmlcomplete#CheckDoctype() " {{{
endfunction endfunction
" }}} " }}}
" vim:set foldmethod=marker: " vim:set foldmethod=marker:
endif

129
autoload/jsonnet.vim Normal file
View File

@@ -0,0 +1,129 @@
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'jsonnet') == -1
" Options.
if !exists("g:jsonnet_command")
let g:jsonnet_command = "jsonnet"
endif
if !exists("g:jsonnet_fmt_command")
let g:jsonnet_fmt_command = "jsonnetfmt"
endif
if !exists('g:jsonnet_fmt_options')
let g:jsonnet_fmt_options = ''
endif
if !exists('g:jsonnet_fmt_fail_silently')
let g:jsonnet_fmt_fail_silently = 1
endif
" System runs a shell command. It will reset the shell to /bin/sh for Unix-like
" systems if it is executable.
function! jsonnet#System(str, ...)
let l:shell = &shell
if executable('/bin/sh')
let &shell = '/bin/sh'
endif
try
let l:output = call("system", [a:str] + a:000)
return l:output
finally
let &shell = l:shell
endtry
endfunction
" CheckBinPath checks whether the given binary exists or not and returns the
" path of the binary. It returns an empty string if it doesn't exists.
function! jsonnet#CheckBinPath(binName)
if executable(a:binName)
if exists('*exepath')
let binPath = exepath(a:binName)
return binPath
else
return a:binName
endif
else
echo "vim-jsonnet: could not find '" . a:binName . "'."
return ""
endif
endfunction
" Format calls `jsonnetfmt ... ` on the file and replaces the file with the
" auto formatted version. Does some primitive error checking of the
" jsonnetfmt command too.
function! jsonnet#Format()
" Save cursor position and many other things.
let l:curw = winsaveview()
" Write current unsaved buffer to a temp file
let l:tmpname = tempname()
call writefile(getline(1, '$'), l:tmpname)
" get the command first so we can test it
let l:binName = g:jsonnet_fmt_command
" check if the user has installed command binary.
let l:binPath = jsonnet#CheckBinPath(l:binName)
if empty(l:binPath)
return
endif
" Populate the final command.
let l:command = l:binPath
" The inplace modification is default. Makes file management easier
let l:command = l:command . ' -i '
let l:command = l:command . g:jsonnet_fmt_options
" Execute the compiled jsonnetfmt command and save the return value
let l:out = jsonnet#System(l:command . " " . l:tmpname)
let l:errorCode = v:shell_error
if l:errorCode == 0
" The format command succeeded Move the formatted temp file over the
" current file and restore other settings
" stop undo recording
try | silent undojoin | catch | endtry
let l:originalFileFormat = &fileformat
if exists("*getfperm")
" save old file permissions
let l:originalFPerm = getfperm(expand('%'))
endif
" Overwrite current file with the formatted temp file
call rename(l:tmpname, expand('%'))
if exists("*setfperm") && l:originalFPerm != ''
call setfperm(expand('%'), l:originalFPerm)
endif
" the file has been changed outside of vim, enable reedit
silent edit!
let &fileformat = l:originalFileFormat
let &syntax = &syntax
elseif g:jsonnet_fmt_fail_silently == 0
" FixMe: We could leverage the errors coming from the `jsonnetfmt` and
" give immediate feedback to the user at every save time.
" Our inspiration, vim-go, opens a new list below the current edit
" window and shows the errors (the output of the fmt command).
" We are not sure whether this is desired in the vim-jsonnet community
" or not. Nevertheless, this else block is a suitable place to benefit
" from the `jsonnetfmt` errors.
endif
" Restore our cursor/windows positions.
call winrestview(l:curw)
endfunction
endif

View File

@@ -1,22 +1,20 @@
if exists('g:polyglot_disabled') && (index(g:polyglot_disabled, 'typescript') != -1 || index(g:polyglot_disabled, 'typescript') != -1 || index(g:polyglot_disabled, 'jsx') != -1) if !exists('g:polyglot_disabled') || (index(g:polyglot_disabled, 'javascript') == -1 && index(g:polyglot_disabled, 'jsx') == -1)
finish
endif
function! jsx_pretty#comment#update_commentstring(original) function! jsx_pretty#comment#update_commentstring(original)
let syn_current = s:syn_name(line('.'), col('.')) let line = getline(".")
let syn_start = s:syn_name(line('.'), 1) let col = col('.')
if line !~# '^\s*$' && line[: col - 1] =~# '^\s*$' " skip indent
let col = indent('.') + 1
endif
let syn_start = s:syn_name(line('.'), col)
let save_cursor = getcurpos() let save_cursor = getcurpos()
if syn_start =~? '^jsx' if syn_start =~? '^jsx'
let line = getline(".")
let start = len(matchstr(line, '^\s*'))
let syn_name = s:syn_name(line('.'), start + 1)
if line =~ '^\s*//' if line =~ '^\s*//'
let &l:commentstring = '// %s' let &l:commentstring = '// %s'
elseif s:syn_contains(line('.'), col('.'), 'jsxTaggedRegion') elseif s:syn_contains(line('.'), col, 'jsxTaggedRegion')
let &l:commentstring = '<!-- %s -->' let &l:commentstring = '<!-- %s -->'
elseif syn_name =~? '^jsxAttrib' elseif syn_start =~? '^jsxAttrib'
let &l:commentstring = '// %s' let &l:commentstring = '// %s'
else else
let &l:commentstring = '{/* %s */}' let &l:commentstring = '{/* %s */}'
@@ -39,3 +37,5 @@ function! s:syn_contains(lnum, cnum, syn_name)
let syn_names = map(stack, 'synIDattr(v:val, "name")') let syn_names = map(stack, 'synIDattr(v:val, "name")')
return index(syn_names, a:syn_name) >= 0 return index(syn_names, a:syn_name) >= 0
endfunction endfunction
endif

View File

@@ -1,6 +1,4 @@
if exists('g:polyglot_disabled') && (index(g:polyglot_disabled, 'typescript') != -1 || index(g:polyglot_disabled, 'typescript') != -1 || index(g:polyglot_disabled, 'jsx') != -1) if !exists('g:polyglot_disabled') || (index(g:polyglot_disabled, 'javascript') == -1 && index(g:polyglot_disabled, 'jsx') == -1)
finish
endif
if exists('*shiftwidth') if exists('*shiftwidth')
function! s:sw() function! s:sw()
@@ -12,207 +10,297 @@ else
endfunction endfunction
endif endif
" Get the syntax group of start of line " Regexp for the start tag
function! s:syn_sol(lnum) let s:start_tag = '<\_s*\%(>\|\${\|\%(\<[-:._$A-Za-z0-9]\+\>\)\)'
let line = getline(a:lnum) " Regexp for the end tag
let sol = matchstr(line, '^\s*') let s:end_tag = '\%(<\_s*/\_s*\%(\<[-:._$A-Za-z0-9]\+\>\)\_s*>\|/\_s*>\)'
return map(synstack(a:lnum, len(sol) + 1), 'synIDattr(v:val, "name")')
function s:trim(line)
return substitute(a:line, '^\s*\|\s*$', '', 'g')
endfunction endfunction
" Get the syntax group of end of line " Get the syntax stack at the given position
function! s:syn_eol(lnum) function s:syntax_stack_at(lnum, col)
let lnum = prevnonblank(a:lnum) return map(synstack(a:lnum, a:col), 'synIDattr(v:val, "name")')
let col = strlen(getline(lnum))
return map(synstack(lnum, col), 'synIDattr(v:val, "name")')
endfunction endfunction
function! s:prev_indent(lnum) " Get the syntax at the given position
let lnum = prevnonblank(a:lnum - 1) function s:syntax_at(lnum, col)
return indent(lnum) return synIDattr(synID(a:lnum, a:col, 1), 'name')
endfunction endfunction
function! s:prev_line(lnum) " Get the start col of the non-space charactor
let lnum = prevnonblank(a:lnum - 1) function s:start_col(lnum)
return substitute(getline(lnum), '^\s*\|\s*$', '', 'g') return len(matchstr(getline(a:lnum), '^\s*')) + 1
endfunction endfunction
function! s:syn_attr_jsx(synattr) " Get the start syntax of a given line number
return a:synattr =~? "^jsx" function s:start_syntax(lnum)
return s:syntax_at(a:lnum, s:start_col(a:lnum))
endfunction endfunction
function! s:syn_xmlish(syns) " The skip function for searchpair
return s:syn_attr_jsx(get(a:syns, -1)) 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 endfunction
function! s:syn_jsx_element(syns) " Whether the specified stytax group is the opening tag
return get(a:syns, -1) =~? 'jsxElement' function s:is_opening_tag(syntax)
return a:syntax =~? 'jsxOpenPunct'
endfunction endfunction
function! s:syn_js_comment(syns) " Whether the specified stytax group is the closing tag
return get(a:syns, -1) =~? 'Comment$' function s:is_closing_tag(syntax)
return a:syntax =~? 'jsxClose'
endfunction endfunction
function! s:syn_jsx_escapejs(syns) " Whether the specified syntax group is the jsxRegion
return get(a:syns, -1) =~? '\(\(js\(Template\)\?\|javaScript\(Embed\)\?\|typescript\)Braces\|javascriptTemplateSB\|typescriptInterpolationDelimiter\)' && function s:is_jsx_region(syntax)
\ (get(a:syns, -2) =~? 'jsxEscapeJs' || return a:syntax =~? 'jsxRegion'
\ get(a:syns, -3) =~? 'jsxEscapeJs')
endfunction endfunction
function! s:syn_jsx_attrib(syns) " Whether the specified syntax group is the jsxElement
return len(filter(copy(a:syns), 'v:val =~? "jsxAttrib"')) 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 endfunction
let s:start_tag = '<\s*\([-:_\.\$0-9A-Za-z]\+\|>\)'
" match `/end_tag>` and `//>`
let s:end_tag = '/\%(\s*[-:_\.\$0-9A-Za-z]*\s*\|/\)>'
let s:opfirst = '^' . get(g:,'javascript_opfirst',
\ '\C\%([<>=,.?^%|/&]\|\([-:+]\)\1\@!\|\*\+\|!=\|in\%(stanceof\)\=\>\)')
function! jsx_pretty#indent#get(js_indent) function! jsx_pretty#indent#get(js_indent)
let lnum = v:lnum let line = s:trim(getline(v:lnum))
let line = substitute(getline(lnum), '^\s*\|\s*$', '', 'g') let start_syntax = s:start_syntax(v:lnum)
let current_syn = s:syn_sol(lnum)
let current_syn_eol = s:syn_eol(lnum)
let prev_line_num = prevnonblank(lnum - 1)
let prev_syn_sol = s:syn_sol(prev_line_num)
let prev_syn_eol = s:syn_eol(prev_line_num)
let prev_line = s:prev_line(lnum)
let prev_ind = s:prev_indent(lnum)
if s:syn_xmlish(current_syn) if s:is_jsx_backticks(start_syntax)
return s:jsx_indent_backticks(v:lnum)
endif
if !s:syn_xmlish(prev_syn_sol) if s:is_jsx_brace(start_syntax)
\ && !s:syn_jsx_escapejs(prev_syn_sol) return s:jsx_indent_element(v:lnum)
\ && !s:syn_jsx_escapejs(prev_syn_eol) endif
\ && !s:syn_js_comment(prev_syn_sol)
if line =~ '^/\s*>' || line =~ '^<\s*' . s:end_tag if s:is_opening_tag(start_syntax) && line =~ '^>'
return prev_ind return s:jsx_indent_trail_punct(v:lnum)
else endif
return prev_ind + s:sw()
endif let syntax_context = s:syntax_context(v:lnum)
elseif !s:syn_xmlish(prev_syn_sol) && !s:syn_js_comment(prev_syn_sol) && s:syn_jsx_attrib(current_syn)
" For #79 if syntax_context == 'jsxRegion'
return prev_ind + s:sw() if s:is_closing_tag(start_syntax)
" { return s:jsx_indent_closing_tag(v:lnum)
" <div></div> endif
" ##} <--
elseif s:syn_jsx_element(current_syn) && line =~ '}$' let prev_lnum = s:prev_lnum(v:lnum)
let pair_line = searchpair('{', '', '}', 'b') let prev_line = s:trim(getline(prev_lnum))
return indent(pair_line)
elseif line =~ '^-->$' if prev_line =~ '[([{=?]$'
if prev_line =~ '^<!--' return indent(prev_lnum) + s:sw()
return prev_ind elseif prev_line =~ '[:|&<>]$' &&
else \ s:trim(getline(s:prev_lnum(prev_lnum))) !~ '[?:|&<>]$'
return prev_ind - s:sw() return indent(prev_lnum) + s:sw()
endif
elseif prev_line =~ '-->$'
return prev_ind
" close tag </tag> or /> including </>
elseif prev_line =~ s:end_tag . '$'
if line =~ '^<\s*' . s:end_tag
return prev_ind - s:sw()
elseif s:syn_jsx_attrib(prev_syn_sol)
return prev_ind - s:sw()
else
return prev_ind
endif
elseif line =~ '^\(>\|/\s*>\)'
if prev_line =~ '^<'
return prev_ind
else
return prev_ind - s:sw()
endif
elseif prev_line =~ '^\(<\|>\)' &&
\ (s:syn_xmlish(prev_syn_eol) || s:syn_js_comment(prev_syn_eol))
if line =~ '^<\s*' . s:end_tag
return prev_ind
else
return prev_ind + s:sw()
endif
elseif line =~ '^<\s*' . s:end_tag
if !s:syn_xmlish(prev_syn_sol)
if s:syn_jsx_escapejs(prev_syn_eol)
\ || s:syn_jsx_escapejs(prev_syn_sol)
return prev_ind - s:sw()
else
return prev_ind
endif
elseif prev_line =~ '^\<return'
return prev_ind
else
return prev_ind - s:sw()
endif
elseif !s:syn_xmlish(prev_syn_eol)
if prev_line =~ '\(&&\|||\|=>\|[([{]\|`\)$'
" <div>
" {
" }
" </div>
if line =~ '^[)\]}]'
return prev_ind
else
return prev_ind + s:sw()
endif
else
return prev_ind
endif
else else
return prev_ind return indent(prev_lnum)
endif endif
elseif s:syn_jsx_escapejs(current_syn) elseif syntax_context == 'jsxTaggedRegion'
if line =~ '^}' if s:is_closing_tag(start_syntax)
let char = getline('.')[col('.') - 1] return s:jsx_indent_closing_tag(v:lnum)
" When pressing enter after the }, keep the indent elseif s:is_jsx_comment(start_syntax)
if char != '}' && search('}', 'b', lnum) return s:jsx_indent_comment(v:lnum)
return indent(lnum) else
else return indent(s:prev_lnum(v:lnum)) + s:sw()
let pair_line = searchpair('{', '', '}', 'bW')
return indent(pair_line)
endif
elseif line =~ '^{' || line =~ '^\${'
if s:syn_jsx_escapejs(prev_syn_eol)
\ || s:syn_jsx_attrib(prev_syn_sol)
return prev_ind
elseif s:syn_xmlish(prev_syn_eol) && (prev_line =~ s:end_tag || prev_line =~ '-->$')
return prev_ind
else
return prev_ind + s:sw()
endif
endif endif
elseif line =~ '^`' && s:syn_jsx_escapejs(current_syn_eol) elseif syntax_context == 'jsxElement'
" For `} of template syntax if s:is_jsx_comment(start_syntax)
let pair_line = searchpair('{', '', '}', 'bW') return s:jsx_indent_comment(v:lnum)
return indent(pair_line) endif
elseif line =~ '^/[/*]' " js comment in jsx tag
if get(prev_syn_sol, -1) =~ 'Punct' if s:is_comment(start_syntax)
return prev_ind + s:sw() return s:jsx_indent_comment(v:lnum)
elseif synIDattr(synID(lnum - 1, 1, 1), 'name') =~ 'jsxTag' endif
return prev_ind
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 else
return a:js_indent() return a:js_indent()
endif endif
else
let ind = a:js_indent()
" Issue #68
" return (<div>
" |<div>)
if (line =~ '^/\s*>' || line =~ '^<\s*' . s:end_tag)
\ && !s:syn_xmlish(prev_syn_sol)
return prev_ind
endif
" If current syntax is not a jsx syntax group
if s:syn_xmlish(prev_syn_eol) && line !~ '^[)\]}]'
let sol = matchstr(line, s:opfirst)
if sol is ''
" Fix javascript continue indent
return ind - s:sw()
else
return ind
endif
endif
return ind
endif endif
return a:js_indent()
endfunction endfunction
endif

View File

@@ -1,32 +1,11 @@
if exists('g:polyglot_disabled') && index(g:polyglot_disabled, 'julia') != -1 if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'julia') == -1
finish
endif
function! julia#set_syntax_version(jvers) function! julia#set_syntax_version(jvers)
if &filetype != "julia" echo "The julia#set_syntax_version function is deprecated"
echo "Not a Julia file"
return
endif
syntax clear
let b:julia_syntax_version = a:jvers
set filetype=julia
endfunction endfunction
function! julia#toggle_deprecated_syntax() function! julia#toggle_deprecated_syntax()
if &filetype != "julia" echo "The julia#toggle_deprecated_syntax function is deprecated"
echo "Not a Julia file"
return
endif
syntax clear
let hd = get(b:, "julia_syntax_highlight_deprecated",
\ get(g:, "julia_syntax_highlight_deprecated", 0))
let b:julia_syntax_highlight_deprecated = hd ? 0 : 1
set filetype=julia
if b:julia_syntax_highlight_deprecated
echo "Highlighting of deprecated syntax enabled"
else
echo "Highlighting of deprecated syntax disabled"
endif
endfunction endfunction
if exists("loaded_matchit") if exists("loaded_matchit")
@@ -186,3 +165,5 @@ function! julia#gotodefinition()
return return
endfunction endfunction
endif

View File

@@ -1,6 +1,4 @@
if exists('g:polyglot_disabled') && index(g:polyglot_disabled, 'julia') != -1 if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'julia') == -1
finish
endif
" path to the julia binary to communicate with " path to the julia binary to communicate with
if has('win32') || has('win64') if has('win32') || has('win64')
@@ -244,3 +242,5 @@ function! s:likely(str) abort
let output = systemlist(cmd) let output = systemlist(cmd)
return split(matchstr(output[0], '\C^search: \zs.*')) return split(matchstr(output[0], '\C^search: \zs.*'))
endfunction endfunction
endif

View File

@@ -1,6 +1,4 @@
if exists('g:polyglot_disabled') && index(g:polyglot_disabled, 'julia') != -1 if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'julia') == -1
finish
endif
" Facilities for moving around Julia blocks (e.g. if/end, function/end etc.) " Facilities for moving around Julia blocks (e.g. if/end, function/end etc.)
" (AKA a collection of horrible hacks) " (AKA a collection of horrible hacks)
@@ -796,3 +794,5 @@ function! s:cursor_moved(...)
let b:jlblk_did_select = b:jlblk_doing_select let b:jlblk_did_select = b:jlblk_doing_select
let b:jlblk_doing_select = 0 let b:jlblk_doing_select = 0
endfunction endfunction
endif

View File

@@ -1,9 +1,7 @@
if exists('g:polyglot_disabled') && index(g:polyglot_disabled, 'julia') != -1 if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'julia') == -1
finish
endif
" This file is autogenerated from the script 'generate_latex_symbols_table.jl' " This file is autogenerated from the script 'generate_latex_symbols_table.jl'
" The symbols are based on Julia version 1.3.0-DEV.263 " The symbols are based on Julia version 1.5.0-DEV.67
scriptencoding utf-8 scriptencoding utf-8
@@ -660,7 +658,9 @@ function! julia_latex_symbols#get_dict()
\ '\nequiv': '≢', \ '\nequiv': '≢',
\ '\Equiv': '≣', \ '\Equiv': '≣',
\ '\le': '≤', \ '\le': '≤',
\ '\leq': '≤',
\ '\ge': '≥', \ '\ge': '≥',
\ '\geq': '≥',
\ '\leqq': '≦', \ '\leqq': '≦',
\ '\geqq': '≧', \ '\geqq': '≧',
\ '\lneqq': '≨', \ '\lneqq': '≨',
@@ -3332,3 +3332,5 @@ function! julia_latex_symbols#get_dict()
\ '\:baggage_claim:': '🛄', \ '\:baggage_claim:': '🛄',
\ '\:left_luggage:': '🛅'} \ '\:left_luggage:': '🛅'}
endfunction endfunction
endif

744
autoload/ledger.vim Normal file
View File

@@ -0,0 +1,744 @@
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'ledger') == -1
scriptencoding utf-8
" vim:ts=2:sw=2:sts=2:foldmethod=marker
function! ledger#transaction_state_toggle(lnum, ...) abort
if a:0 == 1
let chars = a:1
else
let chars = ' *'
endif
let trans = s:transaction.from_lnum(a:lnum)
if empty(trans) || has_key(trans, 'expr')
return
endif
let old = has_key(trans, 'state') ? trans['state'] : ' '
let i = stridx(chars, old) + 1
let new = chars[i >= len(chars) ? 0 : i]
call trans.set_state(new)
call setline(trans['head'], trans.format_head())
endf
function! ledger#transaction_state_set(lnum, char) abort
" modifies or sets the state of the transaction at the cursor,
" removing the state altogether if a:char is empty
let trans = s:transaction.from_lnum(a:lnum)
if empty(trans) || has_key(trans, 'expr')
return
endif
call trans.set_state(a:char)
call setline(trans['head'], trans.format_head())
endf
function! ledger#transaction_date_set(lnum, type, ...) abort
let time = a:0 == 1 ? a:1 : localtime()
let trans = s:transaction.from_lnum(a:lnum)
if empty(trans) || has_key(trans, 'expr')
return
endif
let formatted = strftime(g:ledger_date_format, time)
if has_key(trans, 'date') && ! empty(trans['date'])
let date = split(trans['date'], '=')
else
let date = [formatted]
endif
if a:type =~? 'effective\|actual'
echoerr 'actual/effective arguments were replaced by primary/auxiliary'
return
endif
if a:type ==? 'primary'
let date[0] = formatted
elseif a:type ==? 'auxiliary'
if time < 0
" remove auxiliary date
let date = [date[0]]
else
" set auxiliary date
if len(date) >= 2
let date[1] = formatted
else
call add(date, formatted)
endif
endif
elseif a:type ==? 'unshift'
let date = [formatted, date[0]]
endif
let trans['date'] = join(date[0:1], '=')
call setline(trans['head'], trans.format_head())
endf
" == get transactions ==
function! ledger#transaction_from_lnum(lnum) abort
return s:transaction.from_lnum(a:lnum)
endf
function! ledger#transactions(...) abort
if a:0 == 2
let lnum = a:1
let end = a:2
elseif a:0 == 0
let lnum = 1
let end = line('$')
else
throw 'wrong number of arguments for get_transactions()'
return []
endif
" safe view / position
let view = winsaveview()
let fe = &foldenable
set nofoldenable
let transactions = []
call cursor(lnum, 0)
while lnum && lnum < end
let trans = s:transaction.from_lnum(lnum)
if ! empty(trans)
call add(transactions, trans)
call cursor(trans['tail'], 0)
endif
let lnum = search('^[~=[:digit:]]', 'cW')
endw
" restore view / position
let &foldenable = fe
call winrestview(view)
return transactions
endf
" == transaction object implementation ==
let s:transaction = {} "{{{1
function! s:transaction.new() abort dict
return copy(s:transaction)
endf
function! s:transaction.from_lnum(lnum) abort dict "{{{2
let [head, tail] = s:get_transaction_extents(a:lnum)
if ! head
return {}
endif
let trans = copy(s:transaction)
let trans['head'] = head
let trans['tail'] = tail
" split off eventual comments at the end of line
let line = split(getline(head), '\ze\s*\%(\t\| \);', 1)
if len(line) > 1
let trans['appendix'] = join(line[1:], '')
endif
" parse rest of line
" FIXME (minor): will not preserve spacing (see 'join(parts)')
let parts = split(line[0], '\s\+')
if parts[0] ==# '~'
let trans['expr'] = join(parts[1:])
return trans
elseif parts[0] ==# '='
let trans['auto'] = join(parts[1:])
return trans
elseif parts[0] !~# '^\d'
" this case is avoided in s:get_transaction_extents(),
" but we'll check anyway.
return {}
endif
for part in parts
if ! has_key(trans, 'date') && part =~# '^\d'
let trans['date'] = part
elseif ! has_key(trans, 'code') && part =~# '^([^)]*)$'
let trans['code'] = part[1:-2]
elseif ! has_key(trans, 'state') && part =~# '^[[:punct:]]$'
" the first character by itself is assumed to be the state of the transaction.
let trans['state'] = part
else
" everything after date/code or state belongs to the description
break
endif
call remove(parts, 0)
endfor
let trans['description'] = join(parts)
return trans
endf "}}}
function! s:transaction.set_state(char) abort dict "{{{2
if has_key(self, 'state') && a:char =~# '^\s*$'
call remove(self, 'state')
else
let self['state'] = a:char
endif
endf "}}}
function! s:transaction.parse_body(...) abort dict "{{{2
if a:0 == 2
let head = a:1
let tail = a:2
elseif a:0 == 0
let head = self['head']
let tail = self['tail']
else
throw 'wrong number of arguments for parse_body()'
return []
endif
if ! head || tail <= head
return []
endif
let lnum = head
let tags = {}
let postings = []
while lnum <= tail
let line = split(getline(lnum), '\s*\%(\t\| \);', 1)
if line[0] =~# '^\s\+[^[:blank:];]'
" posting
let [state, rest] = matchlist(line[0], '^\s\+\([*!]\?\)\s*\(.*\)$')[1:2]
if rest =~# '\t\| '
let [account, amount] = matchlist(rest, '^\(.\{-}\)\%(\t\| \)\s*\(.\{-}\)\s*$')[1:2]
else
let amount = ''
let account = matchstr(rest, '^\s*\zs.\{-}\ze\s*$')
endif
call add(postings, {'account': account, 'amount': amount, 'state': state})
end
" where are tags to be stored?
if empty(postings)
" they belong to the transaction
let tag_container = tags
else
" they belong to last posting
if ! has_key(postings[-1], 'tags')
let postings[-1]['tags'] = {}
endif
let tag_container = postings[-1]['tags']
endif
let comment = join(line[1:], ' ;')
if comment =~# '^\s*:'
" tags without values
for t in s:findall(comment, ':\zs[^:[:blank:]]\([^:]*[^:[:blank:]]\)\?\ze:')
let tag_container[t] = ''
endfor
elseif comment =~# '^\s*[^:[:blank:]][^:]\+:'
" tag with value
let key = matchstr(comment, '^\s*\zs[^:]\+\ze:')
if ! empty(key)
let val = matchstr(comment, ':\s*\zs.*\ze\s*$')
let tag_container[key] = val
endif
endif
let lnum += 1
endw
return [tags, postings]
endf "}}}
function! s:transaction.format_head() abort dict "{{{2
if has_key(self, 'expr')
return '~ '.self['expr']
elseif has_key(self, 'auto')
return '= '.self['auto']
endif
let parts = []
if has_key(self, 'date') | call add(parts, self['date']) | endif
if has_key(self, 'state') | call add(parts, self['state']) | endif
if has_key(self, 'code') | call add(parts, '('.self['code'].')') | endif
if has_key(self, 'description') | call add(parts, self['description']) | endif
let line = join(parts)
if has_key(self, 'appendix') | let line .= self['appendix'] | endif
return line
endf "}}}
"}}}
" == helper functions ==
" get a list of declared accounts in the buffer
function! ledger#declared_accounts(...) abort
if a:0 == 2
let lnum = a:1
let lend = a:2
elseif a:0 == 0
let lnum = 1
let lend = line('$')
else
throw 'wrong number of arguments for ledger#declared_accounts()'
return []
endif
" save view / position
let view = winsaveview()
let fe = &foldenable
set nofoldenable
let accounts = []
call cursor(lnum, 0)
while 1
let lnum = search('^account\s', 'cW', lend)
if !lnum || lnum > lend
break
endif
" remove comments at the end and "account" at the front
let line = split(getline(lnum), '\s\+;')[0]
let line = matchlist(line, 'account\s\+\(.\+\)')[1]
if len(line) > 1
call add(accounts, line)
endif
call cursor(lnum+1,0)
endw
" restore view / position
let &foldenable = fe
call winrestview(view)
return accounts
endf
function! s:get_transaction_extents(lnum) abort
if ! (indent(a:lnum) || getline(a:lnum) =~# '^[~=[:digit:]]')
" only do something if lnum is in a transaction
return [0, 0]
endif
" safe view / position
let view = winsaveview()
let fe = &foldenable
set nofoldenable
call cursor(a:lnum, 0)
let head = search('^[~=[:digit:]]', 'bcnW')
let tail = search('^[^;[:blank:]]\S\+', 'nW')
let tail = tail > head ? tail - 1 : line('$')
" restore view / position
let &foldenable = fe
call winrestview(view)
return head ? [head, tail] : [0, 0]
endf
function! ledger#find_in_tree(tree, levels) abort
if empty(a:levels)
return []
endif
let results = []
let currentlvl = a:levels[0]
let nextlvls = a:levels[1:]
let branches = ledger#filter_items(keys(a:tree), currentlvl)
for branch in branches
let exact = empty(nextlvls)
call add(results, [branch, exact])
if ! empty(nextlvls)
for [result, exact] in ledger#find_in_tree(a:tree[branch], nextlvls)
call add(results, [branch.':'.result, exact])
endfor
endif
endfor
return results
endf
function! ledger#filter_items(list, keyword) abort
" return only those items that start with a specified keyword
return filter(copy(a:list), 'v:val =~ ''^\V'.substitute(a:keyword, '\\', '\\\\', 'g').'''')
endf
function! s:findall(text, rx) abort
" returns all the matches in a string,
" there will be overlapping matches according to :help match()
let matches = []
while 1
let m = matchstr(a:text, a:rx, 0, len(matches)+1)
if empty(m)
break
endif
call add(matches, m)
endw
return matches
endf
" Move the cursor to the specified column, filling the line with spaces if necessary.
" Ensure that at least min_spaces are added, and go to the end of the line if
" the line is already too long
function! s:goto_col(pos, min_spaces) abort
exec 'normal!' '$'
let diff = max([a:min_spaces, a:pos - virtcol('.')])
if diff > 0 | exec 'normal!' diff . 'a ' | endif
endf
" Return character position of decimal separator (multibyte safe)
function! s:decimalpos(expr) abort
let pos = match(a:expr, '\V' . g:ledger_decimal_sep)
if pos > 0
let pos = strchars(a:expr[:pos]) - 1
endif
return pos
endf
" Align the amount expression after an account name at the decimal point.
"
" This function moves the amount expression of a posting so that the decimal
" separator is aligned at the column specified by g:ledger_align_at.
"
" For example, after selecting:
"
" 2015/05/09 Some Payee
" Expenses:Other $120,23 ; Tags here
" Expenses:Something $-4,99
" Expenses:More ($12,34 + $16,32)
"
" :'<,'>call ledger#align_commodity() produces:
"
" 2015/05/09 Some Payee
" Expenses:Other $120,23 ; Tags here
" Expenses:Something $-4,99
" Expenses:More ($12,34 + $16,32)
"
function! ledger#align_commodity() abort
" Extract the part of the line after the account name (excluding spaces):
let l:line = getline('.')
let rhs = matchstr(l:line, '\m^\s\+[^;[:space:]].\{-}\(\t\| \)\s*\zs.*$')
if rhs !=# ''
" Remove everything after the account name (including spaces):
call setline('.', substitute(l:line, '\m^\s\+[^[:space:]].\{-}\zs\(\t\| \).*$', '', ''))
let pos = -1
if g:ledger_decimal_sep !=# ''
" Find the position of the first decimal separator:
let pos = s:decimalpos(rhs)
endif
if pos < 0
" Find the position after the first digits
let pos = matchend(rhs, '\m\d[^[:space:]]*')
endif
" Go to the column that allows us to align the decimal separator at g:ledger_align_at:
if pos > 0
call s:goto_col(g:ledger_align_at - pos - 1, 2)
else
call s:goto_col(g:ledger_align_at - strdisplaywidth(rhs) - 2, 2)
endif " Append the part of the line that was previously removed:
exe 'normal! a' . rhs
endif
endf
" Align the amount under the cursor and append/prepend the default currency.
function! ledger#align_amount_at_cursor() abort
" Select and cut text:
normal! viWd
" Find the position of the decimal separator
let pos = s:decimalpos(@") " Returns zero when the separator is the empty string
if pos <= 0
let pos = len(@")
endif
" Paste text at the correct column and append/prepend default commodity:
if g:ledger_commodity_before
call s:goto_col(g:ledger_align_at - pos - len(g:ledger_default_commodity) - len(g:ledger_commodity_sep) - 1, 2)
exe 'normal! a' . g:ledger_default_commodity . g:ledger_commodity_sep
normal! p
else
call s:goto_col(g:ledger_align_at - pos - 1, 2)
exe 'normal! pa' . g:ledger_commodity_sep . g:ledger_default_commodity
endif
endf
" Report generation {{{1
" Helper functions and variables {{{2
" Position of report windows
let s:winpos_map = {
\ 'T': 'to new', 't': 'abo new', 'B': 'bo new', 'b': 'bel new',
\ 'L': 'to vnew', 'l': 'abo vnew', 'R': 'bo vnew', 'r': 'bel vnew'
\ }
function! s:error_message(msg) abort
redraw " See h:echo-redraw
echohl ErrorMsg
echo "\r"
echomsg a:msg
echohl NONE
endf
function! s:warning_message(msg) abort
redraw " See h:echo-redraw
echohl WarningMsg
echo "\r"
echomsg a:msg
echohl NONE
endf
" Open the quickfix/location window when it is not empty,
" closes it if it is empty.
"
" Optional parameters:
" a:1 Quickfix window title.
" a:2 Message to show when the window is empty.
"
" Returns 0 if the quickfix window is empty, 1 otherwise.
function! s:quickfix_toggle(...) abort
if g:ledger_use_location_list
let l:list = 'l'
let l:open = (len(getloclist(winnr())) > 0)
else
let l:list = 'c'
let l:open = (len(getqflist()) > 0)
endif
if l:open
execute (g:ledger_qf_vertical ? 'vert' : 'botright') l:list.'open' g:ledger_qf_size
" Set local mappings to quit the quickfix window or lose focus.
nnoremap <silent> <buffer> <tab> <c-w><c-w>
execute 'nnoremap <silent> <buffer> q :' l:list.'close<CR>'
" Note that the following settings do not persist (e.g., when you close and re-open the quickfix window).
" See: https://superuser.com/questions/356912/how-do-i-change-the-quickix-title-status-bar-in-vim
if g:ledger_qf_hide_file
setl conceallevel=2
setl concealcursor=nc
syntax match qfFile /^[^|]*/ transparent conceal
endif
if a:0 > 0
let w:quickfix_title = a:1
endif
return 1
endif
execute l:list.'close'
call s:warning_message((a:0 > 1) ? a:2 : 'No results')
return 0
endf
" Populate a quickfix/location window with data. The argument must be a String
" or a List.
function! s:quickfix_populate(data) abort
" Note that cexpr/lexpr always uses the global value of errorformat
let l:efm = &errorformat " Save global errorformat
set errorformat=%EWhile\ parsing\ file\ \"%f\"\\,\ line\ %l:,%ZError:\ %m,%-C%.%#
set errorformat+=%tarning:\ \"%f\"\\,\ line\ %l:\ %m
" Format to parse command-line errors:
set errorformat+=Error:\ %m
" Format to parse reports:
set errorformat+=%f:%l\ %m
set errorformat+=%-G%.%#
execute (g:ledger_use_location_list ? 'l' : 'c').'getexpr' 'a:data'
let &errorformat = l:efm " Restore global errorformat
return
endf
" Build a ledger command to process the given file.
function! s:ledger_cmd(file, args) abort
let l:options = g:ledger_extra_options
if len(g:ledger_date_format) > 0 && !g:ledger_is_hledger
let l:options = join([l:options, '--date-format', g:ledger_date_format,
\ '--input-date-format', g:ledger_date_format])
endif
return join([g:ledger_bin, l:options, '-f', shellescape(expand(a:file)), a:args])
endf
" }}}
function! ledger#autocomplete_and_align() abort
if pumvisible()
return "\<c-n>"
endif
" Align an amount only if there is a digit immediately before the cursor and
" such digit is preceded by at least one space (the latter condition is
" necessary to avoid situations where a date starting at the first column is
" confused with a commodity to be aligned).
if match(getline('.'), '\s.*\d\%'.col('.').'c') > -1
normal! h
call ledger#align_amount_at_cursor()
return "\<c-o>A"
endif
return "\<c-x>\<c-o>"
endf
" Use current line as input to ledger entry and replace with output. If there
" are errors, they are echoed instead.
function! ledger#entry() abort
let l:output = systemlist(s:ledger_cmd(g:ledger_main, join(['entry', getline('.')])))
" Filter out warnings
let l:output = filter(l:output, "v:val !~? '^Warning: '")
" Errors may occur
if v:shell_error
echomsg join(l:output)
return
endif
" Append output so we insert instead of overwrite, then delete line
call append('.', l:output)
normal! "_dd
endfunc
" Run an arbitrary ledger command and show the output in a new buffer. If
" there are errors, no new buffer is opened: the errors are displayed in a
" quickfix window instead.
"
" Parameters:
" file The file to be processed.
" args A string of Ledger command-line arguments.
"
" Returns:
" Ledger's output as a String.
function! ledger#report(file, args) abort
let l:output = systemlist(s:ledger_cmd(a:file, a:args))
if v:shell_error " If there are errors, show them in a quickfix/location list.
call s:quickfix_populate(l:output)
call s:quickfix_toggle('Errors', 'Unable to parse errors')
endif
return l:output
endf
" Open the output of a Ledger's command in a new buffer.
"
" Parameters:
" report A String containing the output of a Ledger's command.
"
" Returns:
" 1 if a new buffer is created; 0 otherwise.
function! ledger#output(report) abort
if empty(a:report)
call s:warning_message('No results')
return 0
endif
" Open a new buffer to show Ledger's output.
execute get(s:winpos_map, g:ledger_winpos, 'bo new')
setlocal buftype=nofile bufhidden=wipe modifiable nobuflisted noswapfile nowrap
call append(0, a:report)
setlocal nomodifiable
" Set local mappings to quit window or lose focus.
nnoremap <silent> <buffer> <tab> <c-w><c-p>
nnoremap <silent> <buffer> q <c-w><c-p>@=winnr('#')<cr><c-w>c
" Add some coloring to the report
syntax match LedgerNumber /-\@1<!\d\+\([,.]\d\+\)*/
syntax match LedgerNegativeNumber /-\d\+\([,.]\d\+\)*/
syntax match LedgerImproperPerc /\d\d\d\+%/
return 1
endf
" Show an arbitrary register report in a quickfix list.
"
" Parameters:
" file The file to be processed
" args A string of Ledger command-line arguments.
function! ledger#register(file, args) abort
let l:cmd = s:ledger_cmd(a:file, join([
\ 'register',
\ "--format='" . g:ledger_qf_register_format . "'",
\ "--prepend-format='%(filename):%(beg_line) '",
\ a:args
\ ]))
call s:quickfix_populate(systemlist(l:cmd))
call s:quickfix_toggle('Register report')
endf
" Reconcile the given account.
" This function accepts a file path as a third optional argument.
" The default is to use the value of g:ledger_main.
"
" Parameters:
" file The file to be processed
" account An account name (String)
" target_amount The target amount (Float)
function! ledger#reconcile(file, account, target_amount) abort
let l:cmd = s:ledger_cmd(a:file, join([
\ 'register',
\ '--uncleared',
\ "--format='" . g:ledger_qf_reconcile_format . "'",
\ "--prepend-format='%(filename):%(beg_line) %(pending ? \"P\" : \"U\") '",
\ shellescape(a:account)
\ ]))
let l:file = expand(a:file) " Needed for #show_balance() later
call s:quickfix_populate(systemlist(l:cmd))
if s:quickfix_toggle('Reconcile ' . a:account, 'Nothing to reconcile')
let g:ledger_target_amount = a:target_amount
" Show updated account balance upon saving, as long as the quickfix window is open
augroup reconcile
autocmd!
execute "autocmd BufWritePost *.ldg,*.ledger call ledger#show_balance('" . l:file . "','" . a:account . "')"
autocmd BufWipeout <buffer> call <sid>finish_reconciling()
augroup END
" Add refresh shortcut
execute "nnoremap <silent> <buffer> <c-l> :<c-u>call ledger#reconcile('"
\ . l:file . "','" . a:account . "'," . string(a:target_amount) . ')<cr>'
call ledger#show_balance(l:file, a:account)
endif
endf
function! s:finish_reconciling() abort
unlet g:ledger_target_amount
augroup reconcile
autocmd!
augroup END
augroup! reconcile
endf
" Show the pending/cleared balance of an account.
" This function has an optional parameter:
"
" a:1 An account name
"
" If no account if given, the account in the current line is used.
function! ledger#show_balance(file, ...) abort
let l:account = a:0 > 0 && !empty(a:1) ? a:1 : matchstr(getline('.'), '\m\( \|\t\)\zs\S.\{-}\ze\( \|\t\|$\)')
if empty(l:account)
call s:error_message('No account found')
return
endif
let l:cmd = s:ledger_cmd(a:file, join([
\ 'cleared',
\ shellescape(l:account),
\ '--empty',
\ '--collapse',
\ "--format='%(scrub(get_at(display_total, 0)))|%(scrub(get_at(display_total, 1)))|%(quantity(scrub(get_at(display_total, 1))))'",
\ (empty(g:ledger_default_commodity) ? '' : '-X ' . shellescape(g:ledger_default_commodity))
\ ]))
let l:output = systemlist(l:cmd)
" Errors may occur, for example, when the account has multiple commodities
" and g:ledger_default_commodity is empty.
if v:shell_error
call s:quickfix_populate(l:output)
call s:quickfix_toggle('Errors', 'Unable to parse errors')
return
endif
let l:amounts = split(l:output[-1], '|')
redraw " Necessary in some cases to overwrite previous messages. See :h echo-redraw
if len(l:amounts) < 3
call s:error_message('Could not determine balance. Did you use a valid account?')
return
endif
echo g:ledger_pending_string
echohl LedgerPending
echon l:amounts[0]
echohl NONE
echon ' ' g:ledger_cleared_string
echohl LedgerCleared
echon l:amounts[1]
echohl NONE
if exists('g:ledger_target_amount')
echon ' ' g:ledger_target_string
echohl LedgerTarget
echon printf('%.2f', (g:ledger_target_amount - str2float(l:amounts[2])))
echohl NONE
endif
endf
" }}}
endif

244
autoload/nim.vim Normal file
View File

@@ -0,0 +1,244 @@
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'nim') == -1
let g:nim_log = []
let s:plugin_path = escape(expand('<sfile>:p:h'), '\')
if !exists("g:nim_caas_enabled")
let g:nim_caas_enabled = 0
endif
if !executable('nim')
echoerr "the Nim compiler must be in your system's PATH"
endif
if has("python3")
exe 'py3file ' . fnameescape(s:plugin_path) . '/nim_vim.py'
elseif has("python")
exe 'pyfile ' . fnameescape(s:plugin_path) . '/nim_vim.py'
endif
fun! nim#init()
let cmd = printf("nim --dump.format:json --verbosity:0 dump %s", s:CurrentNimFile())
let raw_dumpdata = system(cmd)
if !v:shell_error && expand("%:e") == "nim"
let false = 0 " Needed for eval of json
let true = 1 " Needed for eval of json
let dumpdata = eval(substitute(raw_dumpdata, "\n", "", "g"))
let b:nim_project_root = dumpdata['project_path']
let b:nim_defined_symbols = dumpdata['defined_symbols']
let b:nim_caas_enabled = g:nim_caas_enabled || index(dumpdata['defined_symbols'], 'forcecaas') != -1
for path in dumpdata['lib_paths']
if finddir(path) == path
let &l:path = path . "," . &l:path
endif
endfor
else
let b:nim_caas_enabled = 0
endif
endf
fun! s:UpdateNimLog()
setlocal buftype=nofile
setlocal bufhidden=hide
setlocal noswapfile
for entry in g:nim_log
call append(line('$'), split(entry, "\n"))
endfor
let g:nim_log = []
match Search /^nim\ .*/
endf
augroup NimVim
au!
au BufEnter log://nim call s:UpdateNimLog()
if has("python3") || has("python")
" au QuitPre * :py nimTerminateAll()
au VimLeavePre * :py nimTerminateAll()
endif
augroup END
command! NimLog :e log://nim
command! NimTerminateService
\ :exe printf("py nimTerminateService('%s')", b:nim_project_root)
command! NimRestartService
\ :exe printf("py nimRestartService('%s')", b:nim_project_root)
fun! s:CurrentNimFile()
let save_cur = getpos('.')
call cursor(0, 0, 0)
let PATTERN = "\\v^\\#\\s*included from \\zs.*\\ze"
let l = search(PATTERN, "n")
if l != 0
let f = matchstr(getline(l), PATTERN)
let l:to_check = expand('%:h') . "/" . f
else
let l:to_check = expand("%")
endif
call setpos('.', save_cur)
return l:to_check
endf
let g:nim_symbol_types = {
\ 'skParam': 'v',
\ 'skVar': 'v',
\ 'skLet': 'v',
\ 'skTemp': 'v',
\ 'skForVar': 'v',
\ 'skConst': 'v',
\ 'skResult': 'v',
\ 'skGenericParam': 't',
\ 'skType': 't',
\ 'skField': 'm',
\ 'skProc': 'f',
\ 'skMethod': 'f',
\ 'skIterator': 'f',
\ 'skConverter': 'f',
\ 'skMacro': 'f',
\ 'skTemplate': 'f',
\ 'skEnumField': 'v',
\ }
fun! NimExec(op)
let isDirty = getbufvar(bufnr('%'), "&modified")
if isDirty
let tmp = tempname() . bufname("%") . "_dirty.nim"
silent! exe ":w " . tmp
let cmd = printf("idetools %s --trackDirty:\"%s,%s,%d,%d\" \"%s\"",
\ a:op, tmp, expand('%:p'), line('.'), col('.')-1, s:CurrentNimFile())
else
let cmd = printf("idetools %s --track:\"%s,%d,%d\" \"%s\"",
\ a:op, expand('%:p'), line('.'), col('.')-1, s:CurrentNimFile())
endif
if b:nim_caas_enabled
exe printf("py nimExecCmd('%s', '%s', False)", b:nim_project_root, cmd)
let output = l:py_res
else
let output = system("nim " . cmd)
endif
call add(g:nim_log, "nim " . cmd . "\n" . output)
return output
endf
fun! NimExecAsync(op, Handler)
let result = NimExec(a:op)
call a:Handler(result)
endf
fun! NimComplete(findstart, base)
if b:nim_caas_enabled == 0
return -1
endif
if a:findstart
if synIDattr(synIDtrans(synID(line("."),col("."),1)), "name") == 'Comment'
return -1
endif
let line = getline('.')
let start = col('.') - 1
while start > 0 && line[start - 1] =~? '\w'
let start -= 1
endwhile
return start
else
let result = []
let sugOut = NimExec("--suggest")
for line in split(sugOut, '\n')
let lineData = split(line, '\t')
if len(lineData) > 0 && lineData[0] == "sug"
let word = split(lineData[2], '\.')[-1]
if a:base ==? '' || word =~# '^' . a:base
let kind = get(g:nim_symbol_types, lineData[1], '')
let c = { 'word': word, 'kind': kind, 'menu': lineData[3], 'dup': 1 }
call add(result, c)
endif
endif
endfor
return result
endif
endf
if !exists("g:neocomplcache_omni_patterns")
let g:neocomplcache_omni_patterns = {}
endif
let g:neocomplcache_omni_patterns['nim'] = '[^. *\t]\.\w*'
if !exists('g:neocomplete#sources#omni#input_patterns')
let g:neocomplete#sources#omni#input_patterns = {}
endif
let g:neocomplete#sources#omni#input_patterns['nim'] = '[^. *\t]\.\w*'
let g:nim_completion_callbacks = {}
fun! NimAsyncCmdComplete(cmd, output)
call add(g:nim_log, a:output)
echom g:nim_completion_callbacks
if has_key(g:nim_completion_callbacks, a:cmd)
let Callback = get(g:nim_completion_callbacks, a:cmd)
call Callback(a:output)
" remove(g:nim_completion_callbacks, a:cmd)
else
echom "ERROR, Unknown Command: " . a:cmd
endif
return 1
endf
fun! GotoDefinition_nim_ready(def_output)
if v:shell_error
echo "nim was unable to locate the definition. exit code: " . v:shell_error
" echoerr a:def_output
return 0
endif
let rawDef = matchstr(a:def_output, 'def\t\([^\n]*\)')
if rawDef == ""
echo "the current cursor position does not match any definitions"
return 0
endif
let defBits = split(rawDef, '\t')
let file = defBits[4]
let line = defBits[5]
exe printf("e +%d %s", line, file)
return 1
endf
fun! GotoDefinition_nim()
call NimExecAsync("--def", function("GotoDefinition_nim_ready"))
endf
fun! FindReferences_nim()
setloclist()
endf
" Syntastic syntax checking
fun! SyntaxCheckers_nim_nim_GetLocList()
let makeprg = 'nim check --hints:off --listfullpaths ' . s:CurrentNimFile()
let errorformat = &errorformat
return SyntasticMake({ 'makeprg': makeprg, 'errorformat': errorformat })
endf
function! SyntaxCheckers_nim_nim_IsAvailable()
return executable("nim")
endfunction
if exists("g:SyntasticRegistry")
call g:SyntasticRegistry.CreateAndRegisterChecker({
\ 'filetype': 'nim',
\ 'name': 'nim'})
endif
endif

301
autoload/polyglot.vim Normal file
View File

@@ -0,0 +1,301 @@
" Line continuation is used here, remove 'C' from 'cpoptions'
let s:cpo_save = &cpo
set cpo&vim
" We need it because scripts.vim in vim uses "set ft=" which cannot be
" overridden with setf (and we can't use set ft= so our scripts.vim work)
func! s:Setf(ft)
if &filetype !~# '<'.a:ft.'>'
let &filetype = a:ft
endif
endfunc
func! polyglot#Heuristics()
" Try to detect filetype from shebang
let l:filetype = polyglot#Shebang()
if l:filetype != ""
exec "setf " . l:filetype
return 1
endif
return 0
endfunc
let s:interpreters = {
\ 'osascript': 'applescript',
\ 'tcc': 'c',
\ 'coffee': 'coffee',
\ 'crystal': 'crystal',
\ 'dart': 'dart',
\ 'elixir': 'elixir',
\ 'escript': 'erlang',
\ 'fish': 'fish',
\ 'gnuplot': 'gnuplot',
\ 'groovy': 'groovy',
\ 'runhaskell': 'haskell',
\ 'chakra': 'javascript',
\ 'd8': 'javascript',
\ 'gjs': 'javascript',
\ 'js': 'javascript',
\ 'node': 'javascript',
\ 'nodejs': 'javascript',
\ 'qjs': 'javascript',
\ 'rhino': 'javascript',
\ 'v8': 'javascript',
\ 'v8-shell': 'javascript',
\ 'julia': 'julia',
\ 'lua': 'lua',
\ 'moon': 'moon',
\ 'ocaml': 'ocaml',
\ 'ocamlrun': 'ocaml',
\ 'ocamlscript': 'ocaml',
\ 'cperl': 'perl',
\ 'perl': 'perl',
\ 'php': 'php',
\ 'pwsh': 'ps1',
\ 'python': 'python',
\ 'python2': 'python',
\ 'python3': 'python',
\ 'qmake': 'qmake',
\ 'Rscript': 'r',
\ 'racket': 'racket',
\ 'perl6': 'raku',
\ 'raku': 'raku',
\ 'rakudo': 'raku',
\ 'ruby': 'ruby',
\ 'macruby': 'ruby',
\ 'rake': 'ruby',
\ 'jruby': 'ruby',
\ 'rbx': 'ruby',
\ 'scala': 'scala',
\ 'ash': 'sh',
\ 'bash': 'sh',
\ 'dash': 'sh',
\ 'ksh': 'sh',
\ 'mksh': 'sh',
\ 'pdksh': 'sh',
\ 'rc': 'sh',
\ 'sh': 'sh',
\ 'zsh': 'sh',
\ 'boolector': 'smt2',
\ 'cvc4': 'smt2',
\ 'mathsat5': 'smt2',
\ 'opensmt': 'smt2',
\ 'smtinterpol': 'smt2',
\ 'smt-rat': 'smt2',
\ 'stp': 'smt2',
\ 'verit': 'smt2',
\ 'yices2': 'smt2',
\ 'z3': 'smt2',
\ 'deno': 'typescript',
\ 'ts-node': 'typescript',
\ }
let s:r_hashbang = '^#!\s*\(\S\+\)\s*\(.*\)\s*'
let s:r_envflag = '%(\S\+=\S\+\|-[iS]\|--ignore-environment\|--split-string\)'
let s:r_env = '^\%(\' . s:r_envflag . '\s\+\)*\(\S\+\)'
func! polyglot#Shebang()
let l:line1 = getline(1)
if l:line1 !~# "^#!"
return
endif
let l:pathrest = matchlist(l:line1, s:r_hashbang)
if len(l:pathrest) == 0
return
endif
let [_, l:path, l:rest; __] = l:pathrest
let l:script = split(l:path, "/")[-1]
if l:script == "env"
let l:argspath = matchlist(l:rest, s:r_env)
if len(l:argspath) == 0
return
endif
let l:script = l:argspath[1]
endif
if has_key(s:interpreters, l:script)
return s:interpreters[l:script]
endif
for interpreter in keys(s:interpreters)
if l:script =~# '^' . interpreter
return s:interpreters[interpreter]
endif
endfor
endfunc
func! polyglot#DetectInpFiletype()
let line = getline(1)
if line =~# '^\*'
call s:Setf('abaqus') | return
endif
for lnum in range(1, min([line("$"), 500]))
let line = getline(lnum)
if line =~? '^header surface data'
call s:Setf('trasys') | return
endif
endfor
endfunc
func! polyglot#DetectAsaFiletype()
if exists("g:filetype_asa")
call s:Setf(g:filetype_asa) | return
endif
call s:Setf('aspvbs') | return
endfunc
func! polyglot#DetectAspFiletype()
if exists("g:filetype_asp")
call s:Setf(g:filetype_asp) | return
endif
for lnum in range(1, min([line("$"), 3]))
let line = getline(lnum)
if line =~? 'perlscript'
call s:Setf('aspperl') | return
endif
endfor
call s:Setf('aspvbs') | return
endfunc
func! polyglot#DetectHFiletype()
for lnum in range(1, min([line("$"), 200]))
let line = getline(lnum)
if line =~# '^\s*\(@\(interface\|class\|protocol\|property\|end\|synchronised\|selector\|implementation\)\(\<\|\>\)\|#import\s\+.\+\.h[">]\)'
if exists("g:c_syntax_for_h")
call s:Setf('objc') | return
endif
call s:Setf('objcpp') | return
endif
endfor
if exists("g:c_syntax_for_h")
call s:Setf('c') | return
endif
if exists("g:ch_syntax_for_h")
call s:Setf('ch') | return
endif
call s:Setf('cpp') | return
endfunc
func! polyglot#DetectMFiletype()
let saw_comment = 0
for lnum in range(1, min([line("$"), 100]))
let line = getline(lnum)
if line =~# '^\s*/\*'
let saw_comment = 1
endif
if line =~# '^\s*\(@\(interface\|class\|protocol\|property\|end\|synchronised\|selector\|implementation\)\(\<\|\>\)\|#import\s\+.\+\.h[">]\)'
call s:Setf('objc') | return
endif
if line =~# '^\s*%'
call s:Setf('octave') | return
endif
if line =~# '^\s*(\*'
call s:Setf('mma') | return
endif
if line =~? '^\s*\(\(type\|var\)\(\<\|\>\)\|--\)'
call s:Setf('murphi') | return
endif
endfor
if saw_comment
call s:Setf('objc') | return
endif
if exists("g:filetype_m")
call s:Setf(g:filetype_m) | return
endif
call s:Setf('octave') | return
endfunc
func! polyglot#DetectFsFiletype()
for lnum in range(1, min([line("$"), 50]))
let line = getline(lnum)
if line =~# '^\(: \|new-device\)'
call s:Setf('forth') | return
endif
if line =~# '^\s*\(#light\|import\|let\|module\|namespace\|open\|type\)'
call s:Setf('fsharp') | return
endif
if line =~# '\s*\(#version\|precision\|uniform\|varying\|vec[234]\)'
call s:Setf('glsl') | return
endif
endfor
if exists("g:filetype_fs")
call s:Setf(g:filetype_fs) | return
endif
call s:Setf('forth') | return
endfunc
func! polyglot#DetectReFiletype()
for lnum in range(1, min([line("$"), 50]))
let line = getline(lnum)
if line =~# '^\s*#\%(\%(if\|ifdef\|define\|pragma\)\s\+\w\|\s*include\s\+[<"]\|template\s*<\)'
call s:Setf('cpp') | return
endif
call s:Setf('reason') | return
endfor
endfunc
func! polyglot#DetectIdrFiletype()
for lnum in range(1, min([line("$"), 5]))
let line = getline(lnum)
if line =~# '^\s*--.*[Ii]dris \=1'
call s:Setf('idris') | return
endif
if line =~# '^\s*--.*[Ii]dris \=2'
call s:Setf('idris2') | return
endif
endfor
for lnum in range(1, min([line("$"), 30]))
let line = getline(lnum)
if line =~# '^pkgs =.*'
call s:Setf('idris') | return
endif
if line =~# '^depends =.*'
call s:Setf('idris2') | return
endif
if line =~# '^%language \(TypeProviders\|ElabReflection\)'
call s:Setf('idris') | return
endif
if line =~# '^%language PostfixProjections'
call s:Setf('idris2') | return
endif
if line =~# '^%access .*'
call s:Setf('idris') | return
endif
if exists("g:filetype_idr")
call s:Setf(g:filetype_idr) | return
endif
endfor
call s:Setf('idris2') | return
endfunc
func! polyglot#DetectLidrFiletype()
for lnum in range(1, min([line("$"), 200]))
let line = getline(lnum)
if line =~# '^>\s*--.*[Ii]dris \=1'
call s:Setf('lidris') | return
endif
endfor
call s:Setf('lidris2') | return
endfunc
func! polyglot#DetectBasFiletype()
for lnum in range(1, min([line("$"), 5]))
let line = getline(lnum)
if line =~? 'VB_Name\|Begin VB\.\(Form\|MDIForm\|UserControl\)'
call s:Setf('vb') | return
endif
endfor
call s:Setf('basic') | return
endfunc
" Restore 'cpoptions'
let &cpo = s:cpo_save
unlet s:cpo_save

View File

@@ -1,6 +1,4 @@
if exists('g:polyglot_disabled') && index(g:polyglot_disabled, 'pony') != -1 if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'pony') == -1
finish
endif
" Vim plugin file " Vim plugin file
" Language: Pony " Language: Pony
@@ -534,3 +532,5 @@ endfunction
let &cpo = s:cpo_save let &cpo = s:cpo_save
unlet s:cpo_save unlet s:cpo_save
endif

View File

@@ -1,6 +1,4 @@
if exists('g:polyglot_disabled') && index(g:polyglot_disabled, 'puppet') != -1 if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'puppet') == -1
finish
endif
function! puppet#align#IndentLevel(lnum) function! puppet#align#IndentLevel(lnum)
return indent(a:lnum) / &shiftwidth return indent(a:lnum) / &shiftwidth
@@ -70,3 +68,5 @@ function! puppet#align#AlignHashrockets(...) abort
endif endif
endfor endfor
endfunction endfunction
endif

Some files were not shown because too many files have changed in this diff Show More