├── .all-contributorsrc ├── .editorconfig ├── .eslintignore ├── .eslintrc ├── .github ├── FUNDING.yml └── renovate.json ├── .gitignore ├── .vscode ├── launch.json ├── settings.json └── tasks.json ├── .vscodeignore ├── CHANGELOG.md ├── LICENSE ├── Makefile ├── README.md ├── assets ├── README.png ├── github_sponsor_btn.png └── logo.png ├── cgmanifest.json ├── package.json ├── src └── extension.ts ├── syntaxes ├── codeblock.json ├── help.language-configuration.json ├── help.tmLanguage.json ├── snippet.language-configuration.json ├── snippet.tmLanguage.json ├── viml.language-configuration.json ├── viml.tmLanguage.json ├── vroom.language-configuration.json └── vroom.tmLanguage.json ├── tsconfig.json └── vroom-examples ├── basics.vroom ├── blocks.vroom ├── buffer.vroom ├── continuations.vroom ├── controls.vroom ├── directives.vroom ├── escaping.vroom ├── macros.vroom ├── messages.vroom ├── mode.vroom ├── range.vroom └── system.vroom /.all-contributorsrc: -------------------------------------------------------------------------------- 1 | { 2 | "files": [ 3 | "README.md" 4 | ], 5 | "imageSize": 100, 6 | "commit": false, 7 | "contributors": [ 8 | { 9 | "login": "XadillaX", 10 | "name": "Khaidi Chu", 11 | "avatar_url": "https://avatars.githubusercontent.com/u/2842176?v=4", 12 | "profile": "https://xcoder.in/", 13 | "contributions": [ 14 | "maintenance", 15 | "code" 16 | ] 17 | }, 18 | { 19 | "login": "GitMensch", 20 | "name": "Simon Sobisch", 21 | "avatar_url": "https://avatars.githubusercontent.com/u/6699539?v=4", 22 | "profile": "https://github.com/GitMensch", 23 | "contributions": [ 24 | "ideas" 25 | ] 26 | }, 27 | { 28 | "login": "dawsers", 29 | "name": "dawsers", 30 | "avatar_url": "https://avatars.githubusercontent.com/u/47487972?v=4", 31 | "profile": "https://github.com/dawsers", 32 | "contributions": [ 33 | "code" 34 | ] 35 | }, 36 | { 37 | "login": "beastmatser", 38 | "name": "mrts", 39 | "avatar_url": "https://avatars.githubusercontent.com/u/79206232?v=4", 40 | "profile": "https://github.com/beastmatser", 41 | "contributions": [ 42 | "code" 43 | ] 44 | }, 45 | { 46 | "login": "wenfangdu", 47 | "name": "Wenfang Du", 48 | "avatar_url": "https://avatars.githubusercontent.com/u/28700378?v=4", 49 | "profile": "https://stackoverflow.com/u/7881859", 50 | "contributions": [ 51 | "code" 52 | ] 53 | } 54 | ], 55 | "contributorsPerLine": 7, 56 | "projectName": "vscode-language-viml", 57 | "projectOwner": "XadillaX", 58 | "repoType": "github", 59 | "repoHost": "https://github.com", 60 | "skipCi": true, 61 | "badgeTemplate": "-ALL%20CONTRIBUTORS?style=for-the-badge&colorA=FF69b4&colorB=cc47a4&label=ALL%20CONTRIBUTORS\" />", 62 | "commitConvention": "angular" 63 | } 64 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | end_of_line = lf 5 | insert_final_newline = true 6 | 7 | charset = utf-8 8 | indent_style = space 9 | indent_size = 2 10 | 11 | [Makefile] 12 | indent_style = tab 13 | indent_size = 8 14 | -------------------------------------------------------------------------------- /.eslintignore: -------------------------------------------------------------------------------- 1 | out/**/* 2 | -------------------------------------------------------------------------------- /.eslintrc: -------------------------------------------------------------------------------- 1 | { 2 | "extends": [ 3 | "eslint-config-egg/typescript" 4 | ], 5 | "parserOptions": { 6 | "project": "./tsconfig.json" 7 | }, 8 | "rules": { 9 | "@typescript-eslint/ban-types": "off" 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | 3 | github: XadillaX # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] 4 | patreon: # Replace with a single Patreon username 5 | open_collective: # Replace with a single Open Collective username 6 | ko_fi: # Replace with a single Ko-fi username 7 | tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel 8 | community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry 9 | liberapay: # Replace with a single Liberapay username 10 | issuehunt: # Replace with a single IssueHunt username 11 | otechie: # Replace with a single Otechie username 12 | lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry 13 | custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2'] 14 | -------------------------------------------------------------------------------- /.github/renovate.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": [ 3 | "config:base" 4 | ], 5 | "ignoreDeps": [ 6 | "@types/vscode", 7 | "eslint", 8 | "eslint-config-egg", 9 | "vscode" 10 | ], 11 | "lockFileMaintenance": { 12 | "enabled": false 13 | }, 14 | "updatePinnedDependencies": false, 15 | "rangeStrategy": "bump" 16 | } 17 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | 8 | # Runtime data 9 | pids 10 | *.pid 11 | *.seed 12 | *.pid.lock 13 | 14 | # Directory for instrumented libs generated by jscoverage/JSCover 15 | lib-cov 16 | 17 | # Coverage directory used by tools like istanbul 18 | coverage 19 | 20 | # nyc test coverage 21 | .nyc_output 22 | 23 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 24 | .grunt 25 | 26 | # Bower dependency directory (https://bower.io/) 27 | bower_components 28 | 29 | # node-waf configuration 30 | .lock-wscript 31 | 32 | # Compiled binary addons (https://nodejs.org/api/addons.html) 33 | build/Release 34 | 35 | # Dependency directories 36 | node_modules/ 37 | jspm_packages/ 38 | 39 | # TypeScript v1 declaration files 40 | typings/ 41 | 42 | # Optional npm cache directory 43 | .npm 44 | 45 | # Optional eslint cache 46 | .eslintcache 47 | 48 | # Optional REPL history 49 | .node_repl_history 50 | 51 | # Output of 'npm pack' 52 | *.tgz 53 | 54 | # Yarn Integrity file 55 | .yarn-integrity 56 | 57 | # dotenv environment variables file 58 | .env 59 | 60 | # next.js build output 61 | .next 62 | 63 | *.vsix 64 | out 65 | package-lock.json 66 | -------------------------------------------------------------------------------- /.vscode/launch.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "0.0.1", 3 | "configurations": [{ 4 | "name": "Extension", 5 | "type": "extensionHost", 6 | "request": "launch", 7 | "runtimeExecutable": "${execPath}", 8 | "args": [ 9 | "--extensionDevelopmentPath=${workspaceFolder}" 10 | ] 11 | }] 12 | } -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "eslint.validate": [ 3 | "javascript", 4 | "javascriptreact", 5 | { 6 | "language": "typescript", 7 | "autoFix": true 8 | }, 9 | ] 10 | } 11 | -------------------------------------------------------------------------------- /.vscode/tasks.json: -------------------------------------------------------------------------------- 1 | { 2 | "tasks": [ 3 | { 4 | "type": "typescript", 5 | "tsconfig": "tsconfig.json", 6 | "option": "watch", 7 | "presentation": { 8 | "echo": true, 9 | "reveal": "silent", 10 | "focus": false, 11 | "panel": "shared" 12 | }, 13 | "isBackground": true, 14 | "runOptions": { 15 | "runOn": "folderOpen" 16 | }, 17 | "problemMatcher": [ 18 | "$tsc-watch" 19 | ], 20 | "group": { 21 | "kind": "build", 22 | "isDefault": true 23 | } 24 | } 25 | ] 26 | } 27 | -------------------------------------------------------------------------------- /.vscodeignore: -------------------------------------------------------------------------------- 1 | .vscode/** 2 | .gitignore 3 | 4 | *.vsix 5 | src 6 | vroom-examples -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | ### Changelog 2 | 3 | All notable changes to this project will be documented in this file. Dates are displayed in UTC. 4 | 5 | Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog). 6 | 7 | #### [v2.2.0](https://github.com/XadillaX/vscode-language-viml/compare/v2.1.2...v2.2.0) 8 | 9 | - feat: support vroom's highlight (#45) [`#53`](https://github.com/XadillaX/vscode-language-viml/pull/53) 10 | - chore(deps): update dependency all-contributors-cli to ^6.25.0 [`#50`](https://github.com/XadillaX/vscode-language-viml/pull/50) 11 | - chore(deps): update dependency @types/node to ^18.16.3 [`#49`](https://github.com/XadillaX/vscode-language-viml/pull/49) 12 | - style: `"` for comment [`#38`](https://github.com/XadillaX/vscode-language-viml/pull/38) 13 | - chore(deps): update dependency @types/node to ^18.16.0 [`#46`](https://github.com/XadillaX/vscode-language-viml/pull/46) 14 | - chore(deps): update dependency typescript to ^5.0.4 [`#47`](https://github.com/XadillaX/vscode-language-viml/pull/47) 15 | - fix(deps): update dependency vscode-languageclient to ^8.1.0 [`#39`](https://github.com/XadillaX/vscode-language-viml/pull/39) 16 | - chore(deps): update dependency @types/node to v18 [`#42`](https://github.com/XadillaX/vscode-language-viml/pull/42) 17 | - chore(deps): update dependency typescript to v5 [`#44`](https://github.com/XadillaX/vscode-language-viml/pull/44) 18 | - chore(deps): update dependency typescript to ^4.9.5 [`#40`](https://github.com/XadillaX/vscode-language-viml/pull/40) 19 | - fix(deps): update dependency vim-language-server to ^2.3.0 [`#43`](https://github.com/XadillaX/vscode-language-viml/pull/43) 20 | - chore(deps): update dependency all-contributors-cli to ^6.24.0 [`#41`](https://github.com/XadillaX/vscode-language-viml/pull/41) 21 | - chore(deps): update dependency typescript to ^4.7.4 [`#35`](https://github.com/XadillaX/vscode-language-viml/pull/35) 22 | - fix(deps): update dependency vscode-languageclient to v8 [`#33`](https://github.com/XadillaX/vscode-language-viml/pull/33) 23 | - chore(deps): update dependency typescript to ^4.7.2 [`#34`](https://github.com/XadillaX/vscode-language-viml/pull/34) 24 | - chore(deps): update dependency typescript to ^4.6.4 [`#32`](https://github.com/XadillaX/vscode-language-viml/pull/32) 25 | - docs: add beastmatser as a contributor for code [`#31`](https://github.com/XadillaX/vscode-language-viml/pull/31) 26 | 27 | #### [v2.1.2](https://github.com/XadillaX/vscode-language-viml/compare/v2.1.1...v2.1.2) 28 | 29 | > 27 April 2022 30 | 31 | - refactor: Modify activationEvents [`#29`](https://github.com/XadillaX/vscode-language-viml/pull/29) 32 | - fix(deps): update dependency vim-language-server to ^2.2.10 [`#27`](https://github.com/XadillaX/vscode-language-viml/pull/27) 33 | - fix(deps): update dependency vim-language-server to ^2.2.9 [`#26`](https://github.com/XadillaX/vscode-language-viml/pull/26) 34 | - fix(deps): update dependency vim-language-server to ^2.2.8 [`#25`](https://github.com/XadillaX/vscode-language-viml/pull/25) 35 | - fix(deps): update dependency vim-language-server to ^2.2.7 [`#23`](https://github.com/XadillaX/vscode-language-viml/pull/23) 36 | - chore: update CHANGELOG.md [`45b1cbe`](https://github.com/XadillaX/vscode-language-viml/commit/45b1cbe4cd91384c016126129777b7456c4a86a2) 37 | - chore: bump version to v2.1.2 [`61cc432`](https://github.com/XadillaX/vscode-language-viml/commit/61cc432108334d7f71b52df0f539e140295ab5f1) 38 | 39 | #### [v2.1.1](https://github.com/XadillaX/vscode-language-viml/compare/v2.1.0...v2.1.1) 40 | 41 | > 31 March 2022 42 | 43 | - chore(deps): update dependency typescript to ^4.6.3 [`#21`](https://github.com/XadillaX/vscode-language-viml/pull/21) 44 | - chore: Configure Renovate [`#16`](https://github.com/XadillaX/vscode-language-viml/pull/16) 45 | - chore: bump to 2.1.1 [`68572b3`](https://github.com/XadillaX/vscode-language-viml/commit/68572b3645675e6fd722dd642e989b32833130c3) 46 | - chore: update renovate.json [`1457612`](https://github.com/XadillaX/vscode-language-viml/commit/14576128a27628f4bd2c2bf1d879b94bfdd10346) 47 | - Create FUNDING.yml [`2f25d62`](https://github.com/XadillaX/vscode-language-viml/commit/2f25d620b68566dcef87f0d58bb653a0fdf7f888) 48 | 49 | #### [v2.1.0](https://github.com/XadillaX/vscode-language-viml/compare/v2.0.0...v2.1.0) 50 | 51 | > 11 March 2022 52 | 53 | - docs: add dawsers as a contributor for code [`#15`](https://github.com/XadillaX/vscode-language-viml/pull/15) 54 | - docs: add GitMensch as a contributor for ideas [`#14`](https://github.com/XadillaX/vscode-language-viml/pull/14) 55 | - docs: add XadillaX as a contributor for maintenance, code [`#13`](https://github.com/XadillaX/vscode-language-viml/pull/13) 56 | - docs: Update README.md [`#11`](https://github.com/XadillaX/vscode-language-viml/pull/11) 57 | - feat: support embed vim help files and vim snippet files in Markdown [`02216fd`](https://github.com/XadillaX/vscode-language-viml/commit/02216fd19002da4bf68bee5b14e850485079194b) 58 | - docs: update README.md [`c03dc51`](https://github.com/XadillaX/vscode-language-viml/commit/c03dc51e480dc7d1de9f8f3700de5009184b019f) 59 | - feat: add support for vim/viml Markdown fenced code blocks (#12) [`7e70ed2`](https://github.com/XadillaX/vscode-language-viml/commit/7e70ed252e17ac56baacb1695ad996a150ef63c3) 60 | 61 | ### [v2.0.0](https://github.com/XadillaX/vscode-language-viml/compare/v1.1.1...v2.0.0) 62 | 63 | > 10 March 2022 64 | 65 | - feat: add LSP support and Vim Help files, Vim Snippet files [`e70b9b9`](https://github.com/XadillaX/vscode-language-viml/commit/e70b9b931ac426ac8540d4d03ff7ba4d9e35861e) 66 | - chore: bump version to 2.0.0 [`6486a26`](https://github.com/XadillaX/vscode-language-viml/commit/6486a267a10908ea2dd09994520b8e8f5f141ede) 67 | 68 | #### [v1.1.1](https://github.com/XadillaX/vscode-language-viml/compare/v1.1.0...v1.1.1) 69 | 70 | > 10 March 2022 71 | 72 | - fix: missing changelog process [`70744d1`](https://github.com/XadillaX/vscode-language-viml/commit/70744d108f36ebd66b05c330782325db7b72e770) 73 | - chore: bump version to v1.1.1 [`6b1b328`](https://github.com/XadillaX/vscode-language-viml/commit/6b1b3286adc6904e9ac89336731a59d14b627f61) 74 | 75 | #### [v1.1.0](https://github.com/XadillaX/vscode-language-viml/compare/v1.0.1...v1.1.0) 76 | 77 | > 10 March 2022 78 | 79 | - chore: Updated viml.tmLanguage.json to Alhadis/language-viml@5030985 (2021-06-26) [`38b4b11`](https://github.com/XadillaX/vscode-language-viml/commit/38b4b115ab72d487e3e2521cde152344a3f66773) 80 | - chore: bump to v1.1.0 [`d643af6`](https://github.com/XadillaX/vscode-language-viml/commit/d643af69515d211f4f303550ed40321e88172c4f) 81 | - feat: support _vimrc (#10) [`06620ea`](https://github.com/XadillaX/vscode-language-viml/commit/06620ea0d9eb20619534fe750e5fba793f10d99d) 82 | 83 | #### [v1.0.1](https://github.com/XadillaX/vscode-language-viml/compare/v1.0.0...v1.0.1) 84 | 85 | > 10 March 2022 86 | 87 | - fix repository URL [`#5`](https://github.com/XadillaX/vscode-language-viml/pull/5) 88 | - feat: update from upstream [`3d32a41`](https://github.com/XadillaX/vscode-language-viml/commit/3d32a4150926720d400e3e7553245ea2e2c7a4ef) 89 | - feat: add .ideavimrc [`1b1323f`](https://github.com/XadillaX/vscode-language-viml/commit/1b1323f40525a92663e8ac26af2127ff7063858e) 90 | 91 | ### [v1.0.0](https://github.com/XadillaX/vscode-language-viml/compare/v0.0.2...v1.0.0) 92 | 93 | > 10 March 2022 94 | 95 | - feat: update grammar via vscode-grammar-update-tool [`#3`](https://github.com/XadillaX/vscode-language-viml/pull/3) 96 | - feat: Added .exrc extension [`#2`](https://github.com/XadillaX/vscode-language-viml/pull/2) 97 | - feat: Highlight vimrc [`#1`](https://github.com/XadillaX/vscode-language-viml/pull/1) 98 | - chore: bump version to 1.0.0 [`aeb7bea`](https://github.com/XadillaX/vscode-language-viml/commit/aeb7bea40f13e3a26ac6a28c66b773cdd669df76) 99 | 100 | #### [v0.0.2](https://github.com/XadillaX/vscode-language-viml/compare/v0.0.1...v0.0.2) 101 | 102 | > 10 March 2022 103 | 104 | - fix: add missing language configuration [`2228b3c`](https://github.com/XadillaX/vscode-language-viml/commit/2228b3c55a383b05affb145725c66d3d0a6ac3bc) 105 | 106 | #### v0.0.1 107 | 108 | > 10 March 2022 109 | 110 | - refactor: first commit [`4ce2568`](https://github.com/XadillaX/vscode-language-viml/commit/4ce25689be082ad8a087ee05e8f8e6265f1e4a77) 111 | - Initial commit [`6ff39d2`](https://github.com/XadillaX/vscode-language-viml/commit/6ff39d20d8b3a22ea0768b419538670d2b362a8a) 112 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2022 Khaidi Chu 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | UPDATE_GRAMMAR_BIN = ./node_modules/.bin/update-grammar 2 | 3 | .PHONY: update_grammar pack 4 | 5 | update-grammar: 6 | $(UPDATE_GRAMMAR_BIN) Alhadis/language-viml grammars/viml.cson syntaxes/viml.tmLanguage.json 7 | $(UPDATE_GRAMMAR_BIN) Alhadis/language-viml grammars/help.cson syntaxes/help.tmLanguage.json 8 | $(UPDATE_GRAMMAR_BIN) Alhadis/language-viml grammars/snippet.cson syntaxes/snippet.tmLanguage.json 9 | 10 | pack: 11 | npm install 12 | npm run compile 13 | rm -rf node_modules 14 | npm install --prod 15 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |

2 | 3 |

4 | 5 |

6 | 7 |

8 | 9 |

10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 |

23 | 24 | ## What does this extension do? 25 | 26 | [**VimL**](https://en.wikipedia.org/wiki/Vim_(text_editor)#Vim_script) (Also known as **Vim Language**, **VimScript**) support for [VSCode](https://code.visualstudio.com/). 27 | 28 | Syntax Highlighting is synchronized from [Atom VimL](https://github.com/Alhadis/language-viml) with ❤ by [vscode-grammar-update-tool](https://github.com/XadillaX/vscode-update-grammar-tool). 29 | 30 | Language Server Protocol depends on [vim-language-server](https://github.com/iamcco/vim-language-server). 31 | 32 | > Thanks to [Alhadis/language-viml](https://github.com/Alhadis/language-viml), [iamcco/vim-language-server](https://github.com/iamcco/vim-language-server) and [XadillaX/vscode-update-grammar-tool](https://github.com/XadillaX/vscode-update-grammar-tool). 33 | 34 | ## Features 35 | 36 | + Language Server Protocol (Refer to [vim-language-server](https://github.com/iamcco/vim-language-server)): 37 | - Auto completion; 38 | - Function signature help; 39 | - Hover document; 40 | - Go to definition; 41 | - Go to references; 42 | - Document symbols; 43 | - Folding range; 44 | - Select range; 45 | - Rename; 46 | - Snippets; 47 | - Diagnostic; 48 | + Syntax highlighting for 49 | - **VimL files** (`*.vim`, `*.vimrc`, `_vimrc`, `*.gvimrc`, `*.ideavim`, `.ideavim`, `.ideavimrc`, `*.exrc`, etc); 50 | - **Vim Help files** (`*.txt` with matching a certain RegExp in file); 51 | - **Vim Snippet files** (`*.snip`, `*.snippet`, `*.snippets`, etc); 52 | - [**Vroom files**](https://github.com/google/vroom) (`*.vroom`); 53 | + Syntax highlighting for embedding **Vim related syntaxes** (see above) in **Markdown files**. 54 | 55 | ## Contributors ✨ 56 | 57 | Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)): 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 |
Khaidi Chu
Khaidi Chu

🚧 💻
Simon Sobisch
Simon Sobisch

🤔
dawsers
dawsers

💻
mrts
mrts

💻
Wenfang Du
Wenfang Du

💻
73 | 74 | 75 | 76 | 77 | 78 | 79 | This project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome! 80 | -------------------------------------------------------------------------------- /assets/README.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XadillaX/vscode-language-viml/f31f4ede6e1586c4b4ee946228a704f9f1f320d7/assets/README.png -------------------------------------------------------------------------------- /assets/github_sponsor_btn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XadillaX/vscode-language-viml/f31f4ede6e1586c4b4ee946228a704f9f1f320d7/assets/github_sponsor_btn.png -------------------------------------------------------------------------------- /assets/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XadillaX/vscode-language-viml/f31f4ede6e1586c4b4ee946228a704f9f1f320d7/assets/logo.png -------------------------------------------------------------------------------- /cgmanifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "registrations": [ 3 | { 4 | "component": { 5 | "type": "git", 6 | "git": { 7 | "name": "Alhadis/language-viml", 8 | "repositoryUrl": "https://github.com/Alhadis/language-viml", 9 | "commitHash": "a8e1770846b4d994ab2be04371f7d97a16b1a08f" 10 | }, 11 | "license": "MIT", 12 | "description": "Vim Script language support for Atom" 13 | }, 14 | "version": "1.2.2" 15 | } 16 | ] 17 | } -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "viml", 3 | "displayName": "VimL (Vim Language, Vim Script)", 4 | "version": "2.2.0", 5 | "description": "Vim Script language server protocol and highlighting support for VSCode.", 6 | "scripts": { 7 | "update-grammar": "make update-grammar", 8 | "update-changelog": "npx auto-changelog -p", 9 | "postinstall": "rm -f package-lock.json", 10 | "compile": "tsc -p ./", 11 | "vscode:prepublish": "make pack" 12 | }, 13 | "engines": { 14 | "vscode": "^1.20.0" 15 | }, 16 | "categories": [ 17 | "Programming Languages" 18 | ], 19 | "publisher": "XadillaX", 20 | "repository": { 21 | "type": "git", 22 | "url": "https://github.com/XadillaX/vscode-language-viml.git" 23 | }, 24 | "author": "XadillaX ", 25 | "license": "MIT", 26 | "bugs": { 27 | "url": "https://github.com/XadillaX/vscode-language-viml/issues" 28 | }, 29 | "homepage": "https://github.com/XadillaX/vscode-language-viml#readme", 30 | "galleryBanner": { 31 | "color": "#569cd6", 32 | "theme": "dark" 33 | }, 34 | "icon": "assets/logo.png", 35 | "devDependencies": { 36 | "@types/node": "^20.16.5", 37 | "@types/vscode": "^1.20.0", 38 | "all-contributors-cli": "^6.26.1", 39 | "auto-changelog": "^2.4.0", 40 | "eslint": "^8.0.0", 41 | "eslint-config-egg": "^11.0.0", 42 | "typescript": "^5.5.4", 43 | "vscode-update-grammar-tool": "^1.0.0" 44 | }, 45 | "contributes": { 46 | "configuration": { 47 | "title": "VimL", 48 | "properties": { 49 | "viml.highVimHelpIndentStylePriority": { 50 | "type": "boolean", 51 | "default": true, 52 | "description": "Force use 8-spaces-size and tab as Vim Help file's indentation style (Even higher priority than EditorConfig, etc.)" 53 | } 54 | } 55 | }, 56 | "grammars": [ 57 | { 58 | "language": "viml", 59 | "scopeName": "source.viml", 60 | "path": "./syntaxes/viml.tmLanguage.json" 61 | }, 62 | { 63 | "language": "vim-help", 64 | "scopeName": "text.vim-help", 65 | "path": "./syntaxes/help.tmLanguage.json" 66 | }, 67 | { 68 | "language": "vim-snippet", 69 | "scopeName": "source.vim-snippet", 70 | "path": "./syntaxes/snippet.tmLanguage.json" 71 | }, 72 | { 73 | "language": "vroom", 74 | "scopeName": "source.vroom", 75 | "path": "./syntaxes/vroom.tmLanguage.json" 76 | }, 77 | { 78 | "scopeName": "markdown.vim.codeblock", 79 | "path": "./syntaxes/codeblock.json", 80 | "injectTo": [ 81 | "text.html.markdown" 82 | ], 83 | "embeddedLanguages": { 84 | "meta.embedded.block.viml": "viml", 85 | "meta.embedded.block.vim-help": "vim-help", 86 | "meta.embedded.block.vim-snippet": "vim-snippet" 87 | } 88 | } 89 | ], 90 | "languages": [ 91 | { 92 | "id": "viml", 93 | "aliases": [ 94 | "VimL", 95 | "VimScript", 96 | "Vim Language" 97 | ], 98 | "extensions": [ 99 | ".vim", 100 | ".vimrc", 101 | ".gvim", 102 | ".ideavim", 103 | ".exrc" 104 | ], 105 | "filenames": [ 106 | "_vimrc", 107 | "vimrc", 108 | ".ideavim", 109 | ".ideavimrc" 110 | ], 111 | "configuration": "./syntaxes/viml.language-configuration.json" 112 | }, 113 | { 114 | "id": "vim-help", 115 | "aliases": [ 116 | "Vim Help" 117 | ], 118 | "configuration": "./syntaxes/help.language-configuration.json" 119 | }, 120 | { 121 | "id": "vim-snippet", 122 | "aliases": [ 123 | "Vim Snippet" 124 | ], 125 | "extensions": [ 126 | ".snip", 127 | ".snippet", 128 | ".snippets" 129 | ], 130 | "configuration": "./syntaxes/snippet.language-configuration.json" 131 | }, 132 | { 133 | "id": "vroom", 134 | "aliases": [ 135 | "Vroom" 136 | ], 137 | "extensions": [ 138 | ".vroom" 139 | ], 140 | "configuration": "./syntaxes/vroom.language-configuration.json" 141 | } 142 | ] 143 | }, 144 | "activationEvents": [ 145 | "onLanguage:viml", 146 | "onLanguage:vim-help", 147 | "onLanguage:vim-snippet", 148 | "onLanguage:vroom", 149 | "workspaceContains:**/.*txt" 150 | ], 151 | "main": "./out/extension.js", 152 | "dependencies": { 153 | "vim-language-server": "^2.3.1", 154 | "vscode-languageclient": "^9.0.1" 155 | } 156 | } 157 | -------------------------------------------------------------------------------- /src/extension.ts: -------------------------------------------------------------------------------- 1 | import { 2 | languages, 3 | OutputChannel, 4 | TextEditor, 5 | TextEditorOptionsChangeEvent, 6 | window, 7 | WindowState, 8 | workspace, 9 | } from 'vscode'; 10 | import { 11 | LanguageClient, 12 | LanguageClientOptions, 13 | ServerOptions, 14 | TransportKind, 15 | } from 'vscode-languageclient/node'; 16 | 17 | const VIM_MODELINE = /(?:(?:^|[ \t])(?:vi|Vi(?=m))(?:m[<=>]?[0-9]+|m)?|[ \t]ex)(?=:(?=[ \t]*set?[ \t][^\r\n:]+:)|:(?![ \t]*set?[ \t]))(?:(?:[ \t]*:[ \t]*|[ \t])\w*(?:[ \t]*=(?:[^\\\s]|\\.)*)?)*[ \t:](?:filetype|ft|syntax)[ \t]*=(\w+)(?=$|\s|:)/mi; 18 | 19 | let client: LanguageClient | undefined; 20 | let outputChannel: OutputChannel; 21 | 22 | function startVimLLanguageServer() { 23 | outputChannel.append('Start VimL Language Server.\n'); 24 | const serverModule = require.resolve('vim-language-server'); 25 | const debugOptions = { execArgv: [ '--nolazy', '--inspect=6009' ] }; 26 | const serverOptions: ServerOptions = { 27 | run: { module: serverModule, transport: TransportKind.ipc }, 28 | debug: { 29 | module: serverModule, 30 | transport: TransportKind.ipc, 31 | options: debugOptions, 32 | }, 33 | }; 34 | 35 | const clientOptions: LanguageClientOptions = { 36 | documentSelector: [{ scheme: 'file', language: 'viml' }], 37 | }; 38 | 39 | client = new LanguageClient( 40 | 'VimLLanguageServer', 41 | 'VimL Language Server', 42 | serverOptions, 43 | clientOptions); 44 | 45 | client.start(); 46 | } 47 | 48 | function startVimLLanguageServerWhenVimLFile() { 49 | if (window.activeTextEditor && 50 | window.activeTextEditor.document && 51 | window.activeTextEditor.document.languageId === 'viml') { 52 | startVimLLanguageServer(); 53 | return; 54 | } 55 | 56 | window.onDidChangeActiveTextEditor((editor: TextEditor | undefined) => { 57 | if (client) return; 58 | if (!editor || !editor.document || editor.document.languageId !== 'viml') { 59 | return; 60 | } 61 | startVimLLanguageServer(); 62 | }); 63 | 64 | window.onDidChangeWindowState((e: WindowState) => { 65 | if (client) return; 66 | if (!e.focused) return; 67 | if (window.activeTextEditor && 68 | window.activeTextEditor.document && 69 | window.activeTextEditor.document.languageId === 'viml') { 70 | startVimLLanguageServer(); 71 | } 72 | }); 73 | } 74 | 75 | function tryApplyVimHelpEditorOption( 76 | editor: TextEditor, 77 | dependsOnHighPriorityConfig = false) { 78 | if (!editor) return; 79 | if (dependsOnHighPriorityConfig) { 80 | const config = workspace.getConfiguration('viml'); 81 | const highPriority = config.get('highVimHelpIndentStylePriority'); 82 | if (!highPriority) { 83 | outputChannel.append( 84 | 'viml.highVimHelpIndentStylePriority is false, ignore.\n'); 85 | return; 86 | } 87 | 88 | outputChannel.append( 89 | 'viml.highVimHelpIndentStylePriority is true, force indentation.\n'); 90 | } 91 | 92 | outputChannel.append(`Set ${editor.document.fileName}'s indentation\n`); 93 | 94 | editor.options = { 95 | tabSize: 8, 96 | insertSpaces: false, 97 | }; 98 | } 99 | 100 | function detectIfVimHelp(editor: TextEditor) { 101 | const document = editor.document; 102 | // Refer to https://github.com/Alhadis/language-viml/blob/769b532/index.js 103 | if (/\.txt$/i.test(document.fileName) && 104 | VIM_MODELINE.test(document.getText()) && 105 | RegExp.lastParen === 'help') { 106 | outputChannel.append(`vim-help detected on ${document.fileName}.\n`); 107 | languages.setTextDocumentLanguage(document, 'vim-help'); 108 | tryApplyVimHelpEditorOption(editor, true); 109 | } 110 | } 111 | 112 | function startVimHelpLogic() { 113 | if (window.activeTextEditor && window.activeTextEditor.document) { 114 | if (window.activeTextEditor.document.languageId === 'vim-help') { 115 | tryApplyVimHelpEditorOption(window.activeTextEditor, true); 116 | } else if (![ 117 | 'viml', 118 | 'vim-snippet', 119 | ].includes(window.activeTextEditor.document.languageId)) { 120 | detectIfVimHelp(window.activeTextEditor); 121 | } 122 | } 123 | 124 | window.onDidChangeTextEditorOptions( 125 | // For EditorConfig 126 | async (e: TextEditorOptionsChangeEvent) => { 127 | if (e.textEditor && 128 | e.textEditor.document && 129 | e.textEditor.document.languageId === 'vim-help') { 130 | if (e.options.tabSize !== 8 || e.options.insertSpaces) { 131 | tryApplyVimHelpEditorOption(e.textEditor, true); 132 | } 133 | } 134 | }); 135 | 136 | window.onDidChangeActiveTextEditor(async (editor: TextEditor | undefined) => { 137 | if (editor && editor.document) { 138 | if (editor.document.languageId === 'vim-help') { 139 | tryApplyVimHelpEditorOption(editor); 140 | } else { 141 | detectIfVimHelp(editor); 142 | } 143 | } 144 | }); 145 | 146 | window.onDidChangeWindowState(async (state: WindowState) => { 147 | const editor: TextEditor | undefined = window.activeTextEditor; 148 | if (state.focused && editor && editor.document) { 149 | if (editor.document.languageId === 'vim-help') { 150 | tryApplyVimHelpEditorOption(editor); 151 | } else { 152 | detectIfVimHelp(editor); 153 | } 154 | } 155 | }); 156 | } 157 | 158 | export function activate() { 159 | outputChannel = window.createOutputChannel('VimL'); 160 | startVimLLanguageServerWhenVimLFile(); 161 | startVimHelpLogic(); 162 | } 163 | 164 | export function deactivate(): Thenable | undefined { 165 | if (!client) return; 166 | const old: LanguageClient = client; 167 | client = undefined; 168 | return old.stop(); 169 | } 170 | -------------------------------------------------------------------------------- /syntaxes/codeblock.json: -------------------------------------------------------------------------------- 1 | { 2 | "fileTypes": [], 3 | "injectionSelector": "L:text.html.markdown", 4 | "patterns": [ 5 | { 6 | "include": "#viml-code-block" 7 | }, 8 | { 9 | "include": "#vim-help-code-block" 10 | }, 11 | { 12 | "include": "#vim-snippet-code-block" 13 | } 14 | ], 15 | "repository": { 16 | "viml-code-block": { 17 | "begin": "(^|\\G)(\\s*)(\\`{3,}|~{3,})\\s*(?i:(vim|viml|vimscript)(\\s+[^`~]*)?$)", 18 | "name": "markup.fenced_code.block.markdown", 19 | "end": "(^|\\G)(\\2|\\s{0,3})(\\3)\\s*$", 20 | "beginCaptures": { 21 | "3": { 22 | "name": "punctuation.definition.markdown" 23 | }, 24 | "4": { 25 | "name": "fenced_code.block.language.markdown" 26 | }, 27 | "5": { 28 | "name": "fenced_code.block.language.attributes.markdown" 29 | } 30 | }, 31 | "endCaptures": { 32 | "3": { 33 | "name": "punctuation.definition.markdown" 34 | } 35 | }, 36 | "patterns": [ 37 | { 38 | "begin": "(^|\\G)(\\s*)(.*)", 39 | "while": "(^|\\G)(?!\\s*([`~]{3,})\\s*$)", 40 | "contentName": "meta.embedded.block.viml", 41 | "patterns": [ 42 | { 43 | "include": "source.viml" 44 | } 45 | ] 46 | } 47 | ] 48 | }, 49 | "vim-help-code-block": { 50 | "begin": "(^|\\G)(\\s*)(\\`{3,}|~{3,})\\s*(?i:(vim-help|vimhelp)(\\s+[^`~]*)?$)", 51 | "name": "markup.fenced_code.block.markdown", 52 | "end": "(^|\\G)(\\2|\\s{0,3})(\\3)\\s*$", 53 | "beginCaptures": { 54 | "3": { 55 | "name": "punctuation.definition.markdown" 56 | }, 57 | "4": { 58 | "name": "fenced_code.block.language.markdown" 59 | }, 60 | "5": { 61 | "name": "fenced_code.block.language.attributes.markdown" 62 | } 63 | }, 64 | "endCaptures": { 65 | "3": { 66 | "name": "punctuation.definition.markdown" 67 | } 68 | }, 69 | "patterns": [ 70 | { 71 | "begin": "(^|\\G)(\\s*)(.*)", 72 | "while": "(^|\\G)(?!\\s*([`~]{3,})\\s*$)", 73 | "contentName": "meta.embedded.block.vim-help", 74 | "patterns": [ 75 | { 76 | "include": "text.vim-help" 77 | } 78 | ] 79 | } 80 | ] 81 | }, 82 | "vim-snippet-code-block": { 83 | "begin": "(^|\\G)(\\s*)(\\`{3,}|~{3,})\\s*(?i:(vim-snippet|vimsnippet)(\\s+[^`~]*)?$)", 84 | "name": "markup.fenced_code.block.markdown", 85 | "end": "(^|\\G)(\\2|\\s{0,3})(\\3)\\s*$", 86 | "beginCaptures": { 87 | "3": { 88 | "name": "punctuation.definition.markdown" 89 | }, 90 | "4": { 91 | "name": "fenced_code.block.language.markdown" 92 | }, 93 | "5": { 94 | "name": "fenced_code.block.language.attributes.markdown" 95 | } 96 | }, 97 | "endCaptures": { 98 | "3": { 99 | "name": "punctuation.definition.markdown" 100 | } 101 | }, 102 | "patterns": [ 103 | { 104 | "begin": "(^|\\G)(\\s*)(.*)", 105 | "while": "(^|\\G)(?!\\s*([`~]{3,})\\s*$)", 106 | "contentName": "meta.embedded.block.vim-snippet", 107 | "patterns": [ 108 | { 109 | "include": "source.vim-snippet" 110 | } 111 | ] 112 | } 113 | ] 114 | } 115 | }, 116 | "scopeName": "markdown.vim.codeblock" 117 | } 118 | -------------------------------------------------------------------------------- /syntaxes/help.language-configuration.json: -------------------------------------------------------------------------------- 1 | { 2 | "brackets": [ 3 | [ "*", "*" ], 4 | [ "|", "|" ], 5 | [ "(", ")" ], 6 | [ "[", "]" ], 7 | [ "{", "}" ] 8 | ], 9 | "autoClosingPairs": [ 10 | [ "*", "*" ], 11 | [ "|", "|" ], 12 | [ "(", ")" ], 13 | [ "[", "]" ], 14 | [ "{", "}" ], 15 | [ "\"", "\"" ], 16 | [ "'", "'" ] 17 | ], 18 | "surroundingPairs": [ 19 | [ "{", "}" ], 20 | [ "[", "]" ], 21 | [ "(", ")" ], 22 | [ "{", "}" ], 23 | [ "'", "'" ], 24 | [ "\"", "\"" ], 25 | [ "|", "|" ], 26 | [ "*", "*" ] 27 | ] 28 | } 29 | -------------------------------------------------------------------------------- /syntaxes/help.tmLanguage.json: -------------------------------------------------------------------------------- 1 | { 2 | "information_for_contributors": [ 3 | "This file has been converted from https://github.com/Alhadis/language-viml/blob/master/grammars/help.cson", 4 | "If you want to provide a fix or improvement, please create a pull request against the original repository.", 5 | "Once accepted there, we are happy to receive an update request." 6 | ], 7 | "version": "https://github.com/Alhadis/language-viml/commit/2e90a584dc4be6483d9b2061d257a5bc962c8b4a", 8 | "name": "Vim Help", 9 | "scopeName": "text.vim-help", 10 | "patterns": [ 11 | { 12 | "name": "meta.file-header.vim-help", 13 | "match": "(?i)\\A(\\*[#-)!+-~]+\\*)[ \\t]+(For\\s+Vim\\s+version\\s*[\\d.]+)[ \\t]+Last\\s+changed?:\\s*(\\S.*?)\\s*$", 14 | "captures": { 15 | "1": { 16 | "patterns": [ 17 | { 18 | "include": "#tag" 19 | } 20 | ] 21 | }, 22 | "2": { 23 | "patterns": [ 24 | { 25 | "include": "#vimVersion" 26 | } 27 | ] 28 | }, 29 | "3": { 30 | "name": "constant.numeric.date.last-changed.vim-help" 31 | } 32 | } 33 | }, 34 | { 35 | "include": "#main" 36 | } 37 | ], 38 | "repository": { 39 | "main": { 40 | "patterns": [ 41 | { 42 | "include": "#tag" 43 | }, 44 | { 45 | "include": "#link" 46 | }, 47 | { 48 | "include": "#special" 49 | }, 50 | { 51 | "include": "#option" 52 | }, 53 | { 54 | "include": "#command" 55 | }, 56 | { 57 | "include": "#codeBlock" 58 | }, 59 | { 60 | "include": "#manualTitle" 61 | }, 62 | { 63 | "include": "#columnHeading" 64 | }, 65 | { 66 | "include": "#sectionDelimiter" 67 | }, 68 | { 69 | "include": "#vimVersion" 70 | }, 71 | { 72 | "include": "#url" 73 | }, 74 | { 75 | "include": "#other" 76 | } 77 | ] 78 | }, 79 | "codeBlock": { 80 | "name": "meta.example.vim-help", 81 | "begin": "(?:(?<=\\s)|^)(>)$", 82 | "end": "^(<)|(?=^\\S)", 83 | "beginCaptures": { 84 | "1": { 85 | "name": "keyword.control.example.begin.vim-help" 86 | } 87 | }, 88 | "endCaptures": { 89 | "1": { 90 | "name": "keyword.control.example.end.vim-help" 91 | } 92 | }, 93 | "contentName": "markup.raw.code.verbatim.vim-help" 94 | }, 95 | "columnHeading": { 96 | "name": "markup.heading.column-title.vim-help", 97 | "match": "^\\s*\\S.*(~)$", 98 | "captures": { 99 | "1": { 100 | "name": "keyword.operator.column-marker.tilde.vim-help" 101 | } 102 | } 103 | }, 104 | "command": { 105 | "name": "markup.raw.command.vim-help", 106 | "match": "(`)([^` \\t]+)(`)", 107 | "captures": { 108 | "1": { 109 | "name": "punctuation.definition.link.begin.vim-help" 110 | }, 111 | "2": { 112 | "patterns": [ 113 | { 114 | "include": "source.viml" 115 | } 116 | ] 117 | }, 118 | "3": { 119 | "name": "punctuation.definition.link.end.vim-help" 120 | } 121 | } 122 | }, 123 | "link": { 124 | "name": "meta.link.vim-help", 125 | "match": "(\\|)([^\"*|]+)(\\|)", 126 | "captures": { 127 | "1": { 128 | "name": "meta.separator.punctuation.link.begin.vim-help" 129 | }, 130 | "2": { 131 | "name": "constant.other.link.vim-help" 132 | }, 133 | "3": { 134 | "name": "meta.separator.punctuation.link.end.vim-help" 135 | } 136 | } 137 | }, 138 | "special": { 139 | "patterns": [ 140 | { 141 | "name": "entity.name.keyword.vim-help", 142 | "match": "(<)N(>)", 143 | "captures": { 144 | "1": { 145 | "name": "punctuation.definition.bracket.angle.begin.vim-help" 146 | }, 147 | "2": { 148 | "name": "punctuation.definition.bracket.angle.end.vim-help" 149 | } 150 | } 151 | }, 152 | { 153 | "name": "entity.name.keyword.vim-help", 154 | "match": "(<)N(?=\\.(?:$|\\s))", 155 | "captures": { 156 | "1": { 157 | "name": "punctuation.definition.bracket.angle.begin.vim-help" 158 | } 159 | } 160 | }, 161 | { 162 | "name": "entity.name.keyword.vim-help", 163 | "match": "(\\()N(>)", 164 | "captures": { 165 | "1": { 166 | "name": "punctuation.definition.bracket.round.begin.vim-help" 167 | }, 168 | "2": { 169 | "name": "punctuation.definition.bracket.angle.end.vim-help" 170 | } 171 | } 172 | }, 173 | { 174 | "name": "entity.name.keyword.vim-help", 175 | "match": "(\\[)N(\\])", 176 | "captures": { 177 | "1": { 178 | "name": "punctuation.definition.bracket.square.begin.vim-help" 179 | }, 180 | "2": { 181 | "name": "punctuation.definition.bracket.square.end.vim-help" 182 | } 183 | } 184 | }, 185 | { 186 | "match": "(N) (N)", 187 | "captures": { 188 | "1": { 189 | "name": "entity.name.keyword.vim-help" 190 | }, 191 | "2": { 192 | "name": "entity.name.keyword.vim-help" 193 | } 194 | } 195 | }, 196 | { 197 | "name": "entity.name.keyword.vim-help", 198 | "match": "N(?=th|-1)" 199 | }, 200 | { 201 | "name": "entity.name.keyword.vim-help", 202 | "match": "({)[-a-zA-Z0-9'\"*+/:%#=\\[\\]<>.,]+(})", 203 | "captures": { 204 | "1": { 205 | "name": "punctuation.definition.bracket.curly.begin.vim-help" 206 | }, 207 | "2": { 208 | "name": "punctuation.definition.bracket.curly.end.vim-help" 209 | } 210 | } 211 | }, 212 | { 213 | "name": "entity.name.keyword.vim-help", 214 | "match": "(?<=\\s)(\\[)[-a-z^A-Z0-9_]{2,}(\\])", 215 | "captures": { 216 | "1": { 217 | "name": "punctuation.definition.bracket.square.begin.vim-help" 218 | }, 219 | "2": { 220 | "name": "punctuation.definition.bracket.square.end.vim-help" 221 | } 222 | } 223 | }, 224 | { 225 | "name": "entity.name.keyword.vim-help", 226 | "match": "(<)[-a-zA-Z0-9_]+(>)", 227 | "captures": { 228 | "1": { 229 | "name": "punctuation.definition.bracket.angle.begin.vim-help" 230 | }, 231 | "2": { 232 | "name": "punctuation.definition.bracket.angle.end.vim-help" 233 | } 234 | } 235 | }, 236 | { 237 | "name": "entity.name.keyword.vim-help", 238 | "match": "(<)[SCM]-.(>)", 239 | "captures": { 240 | "1": { 241 | "name": "punctuation.definition.bracket.angle.begin.vim-help" 242 | }, 243 | "2": { 244 | "name": "punctuation.definition.bracket.angle.end.vim-help" 245 | } 246 | } 247 | }, 248 | { 249 | "name": "entity.name.keyword.vim-help", 250 | "match": "(\\[)(?:\\+\\+opt|[-+]?num|\\+?cmd|addr|arguments|arg|count|group|ident|line|offset|range)(\\])", 251 | "captures": { 252 | "1": { 253 | "name": "punctuation.definition.bracket.square.begin.vim-help" 254 | }, 255 | "2": { 256 | "name": "punctuation.definition.bracket.square.end.vim-help" 257 | } 258 | } 259 | }, 260 | { 261 | "name": "entity.name.keyword.vim-help", 262 | "match": "\\bCTRL(-)(?:.|Break|Del|Insert|PageDown|PageUp|({)char(}))", 263 | "captures": { 264 | "1": { 265 | "name": "punctuation.delimiter.separator.dash.hyphen.vim-help" 266 | }, 267 | "2": { 268 | "name": "punctuation.definition.bracket.curly.begin.vim-help" 269 | }, 270 | "3": { 271 | "name": "punctuation.definition.bracket.curly.end.vim-help" 272 | } 273 | } 274 | } 275 | ] 276 | }, 277 | "tag": { 278 | "name": "storage.link.hypertext.vim-help", 279 | "match": "(\\*)[#-)!+-~]+(\\*)(?=\\s|$)", 280 | "captures": { 281 | "1": { 282 | "name": "punctuation.definition.begin.vim-help" 283 | }, 284 | "2": { 285 | "name": "punctuation.definition.end.vim-help" 286 | } 287 | } 288 | }, 289 | "manualTitle": { 290 | "name": "markup.heading.manual-title.vim-help", 291 | "match": "^[ \\t]+(VIM REFERENCE.*)\\s*$", 292 | "captures": { 293 | "1": { 294 | "name": "constant.other.title-text.vim-help" 295 | } 296 | } 297 | }, 298 | "option": { 299 | "patterns": [ 300 | { 301 | "name": "entity.name.tag.option.vim-help", 302 | "match": "(')[a-z]{2,}(')", 303 | "captures": { 304 | "1": { 305 | "name": "punctuation.definition.begin.option.vim-help" 306 | }, 307 | "2": { 308 | "name": "punctuation.definition.end.option.vim-help" 309 | } 310 | } 311 | } 312 | ] 313 | }, 314 | "sectionDelimiter": { 315 | "name": "constant.other.section.delimiter.vim-help", 316 | "match": "^===.*===$|^---.*--$" 317 | }, 318 | "url": { 319 | "name": "constant.other.reference.link.vim-help", 320 | "match": "(?x)\n(?:(?:(?:https?|ftp|gopher)://|(?:mailto|file|news):)[^'\\x20\\t<>\"]+\n|(?:www|web|w3)[a-z0-9_-]*\\.[a-z0-9._-]+\\.[^'\\x20\\t<>\"]+)\n[a-zA-Z0-9/]" 321 | }, 322 | "vimVersion": { 323 | "name": "entity.other.vim-version.vim-help", 324 | "match": "\\bVim version [0-9][0-9.a-z]*" 325 | }, 326 | "other": { 327 | "patterns": [ 328 | { 329 | "name": "markup.changed.${1:/downcase}.vim-help", 330 | "match": "\\b(DEPRECATED|WARNING|(?:Deprecated|Warning)(?=:))(:|\\b)", 331 | "captures": { 332 | "2": { 333 | "name": "keyword.operator.assignment.key-value.colon.vim-help" 334 | } 335 | } 336 | }, 337 | { 338 | "name": "invalid.illegal.error.vim-help", 339 | "match": "\\t[* ]Error\\t+[a-z].*", 340 | "captures": { 341 | "1": { 342 | "name": "punctuation.separator.list-item.marker.vim-help" 343 | } 344 | } 345 | }, 346 | { 347 | "name": "markup.ignored.todo.vim-help", 348 | "match": "\\t[* ]Todo\\t+[a-z].*", 349 | "captures": { 350 | "1": { 351 | "name": "punctuation.separator.list-item.marker.vim-help" 352 | } 353 | } 354 | }, 355 | { 356 | "name": "comment.line.vim-help", 357 | "match": "\\t[* ](Comment)\\t+([a-z].*)", 358 | "captures": { 359 | "1": { 360 | "name": "punctuation.separator.list-item.marker.vim-help" 361 | } 362 | } 363 | }, 364 | { 365 | "name": "constant.other.reference.link.vim-help", 366 | "match": "\\t[* ]Underlined\\t+[a-z].*" 367 | }, 368 | { 369 | "name": "meta.${2:/downcase}-line.vim-help", 370 | "match": "(?x) \\t (\\*|\\x20)\n(Boolean|Character|Conditional|Constant|Debug|Define|Delimiter\n|Exception|Float|Function|Identifier|Include|Keyword|Label|Macro\n|Number|Operator|PreCondit|PreProc|Repeat|SpecialChar\n|SpecialComment|Special|Statement|StorageClass|String\n|Structure|Tag|Typedef|Type)\n(\\t+ ([\"Aa-z].*))", 371 | "captures": { 372 | "1": { 373 | "name": "punctuation.separator.list-item.marker.vim-help" 374 | }, 375 | "2": { 376 | "name": "storage.type.${2:/downcase}.vim-help" 377 | }, 378 | "3": { 379 | "name": "meta.output.vim-help" 380 | }, 381 | "4": { 382 | "name": "${2:/downcase}.vim-help" 383 | } 384 | } 385 | } 386 | ] 387 | } 388 | } 389 | } -------------------------------------------------------------------------------- /syntaxes/snippet.language-configuration.json: -------------------------------------------------------------------------------- 1 | { 2 | "comments": { 3 | "lineComment": "# ", 4 | }, 5 | "brackets": [ 6 | [ "{", "}" ], 7 | [ "[", "]" ], 8 | [ "(", ")" ] 9 | ], 10 | "autoClosingPairs": [ 11 | [ "{", "}" ], 12 | [ "[", "]" ], 13 | [ "(", ")" ], 14 | [ "'", "'" ], 15 | [ "\"", "\"" ] 16 | ], 17 | "surroundingPairs": [ 18 | [ "{", "}" ], 19 | [ "[", "]" ], 20 | [ "(", ")" ], 21 | [ "'", "'" ], 22 | [ "\"", "\"" ] 23 | ], 24 | "indentationRules": { 25 | "increaseIndentPattern": "^snippet.+(?" ] 10 | ], 11 | "autoClosingPairs": [ 12 | [ "{", "}" ], 13 | [ "[", "]" ], 14 | [ "(", ")" ], 15 | [ "'", "'" ] 16 | ], 17 | "surroundingPairs": [ 18 | [ "{", "}" ], 19 | [ "[", "]" ], 20 | [ "(", ")" ], 21 | [ "'", "'" ], 22 | [ "\"", "\"" ], 23 | [ "<", ">" ] 24 | ], 25 | "indentationRules": { 26 | "increaseIndentPattern": "(?:^|\\s)(?:if|else|elseif|for|function!?|fu|fun|func|augroup|aug|try|catch|while)(?:\\s|$)", 27 | "decreaseIndentPattern": "(?:^|\\s)(?:endif|endfor|endf|endfun|endfunction|endtry|endwhile|(?:augroup|aug)\\.END)(?:\\s|$)" 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /syntaxes/viml.tmLanguage.json: -------------------------------------------------------------------------------- 1 | { 2 | "information_for_contributors": [ 3 | "This file has been converted from https://github.com/Alhadis/language-viml/blob/master/grammars/viml.cson", 4 | "If you want to provide a fix or improvement, please create a pull request against the original repository.", 5 | "Once accepted there, we are happy to receive an update request." 6 | ], 7 | "version": "https://github.com/Alhadis/language-viml/commit/5030985ab9f5a84a3a18d999d7c3a82f581b0283", 8 | "name": "VimL", 9 | "scopeName": "source.viml", 10 | "patterns": [ 11 | { 12 | "name": "meta.file-archive.vimball", 13 | "begin": "\\A(?=\" Vimball Archiver)", 14 | "end": "(?=A)B", 15 | "patterns": [ 16 | { 17 | "name": "meta.file-record.help-file.vimball", 18 | "begin": "^(.*?\\S.*?\\.txt)(\\t)(\\[{3}1)(?=$)", 19 | "end": "(?!\\G)(?=^.*?\\S.*?\\t\\[{3}1$)", 20 | "beginCaptures": { 21 | "0": { 22 | "name": "markup.heading.1.vimball" 23 | }, 24 | "1": { 25 | "name": "entity.name.file.path.vimball" 26 | }, 27 | "2": { 28 | "name": "punctuation.whitespace.tab.separator.vimball" 29 | }, 30 | "3": { 31 | "name": "punctuation.definition.header.vimball" 32 | } 33 | }, 34 | "contentName": "text.embedded.vim-help", 35 | "patterns": [ 36 | { 37 | "begin": "\\G", 38 | "end": "^(\\d+$)?", 39 | "endCaptures": { 40 | "0": { 41 | "name": "comment.ignored.line-count.viml" 42 | }, 43 | "1": { 44 | "name": "sublimelinter.gutter-mark" 45 | } 46 | } 47 | }, 48 | { 49 | "include": "text.vim-help" 50 | } 51 | ] 52 | }, 53 | { 54 | "name": "meta.file-record.vimball.viml", 55 | "begin": "^(.*?\\S.*?[ \\t]*?)(\\t)(\\[{3}1)(?=$)", 56 | "end": "(?!\\G)(?=^.*?\\S.*?\\t\\[{3}1$)", 57 | "beginCaptures": { 58 | "0": { 59 | "name": "markup.heading.1.vimball" 60 | }, 61 | "1": { 62 | "name": "entity.name.file.path.vimball" 63 | }, 64 | "2": { 65 | "name": "punctuation.whitespace.tab.separator.vimball" 66 | }, 67 | "3": { 68 | "name": "punctuation.definition.header.vimball" 69 | } 70 | }, 71 | "patterns": [ 72 | { 73 | "begin": "\\G", 74 | "end": "^(\\d+$)?", 75 | "endCaptures": { 76 | "0": { 77 | "name": "comment.ignored.line-count.viml" 78 | }, 79 | "1": { 80 | "name": "sublimelinter.gutter-mark" 81 | } 82 | } 83 | }, 84 | { 85 | "include": "#main" 86 | } 87 | ] 88 | }, 89 | { 90 | "include": "#main" 91 | } 92 | ] 93 | }, 94 | { 95 | "include": "#main" 96 | } 97 | ], 98 | "repository": { 99 | "main": { 100 | "patterns": [ 101 | { 102 | "include": "#vimTodo" 103 | }, 104 | { 105 | "include": "#comments" 106 | }, 107 | { 108 | "include": "#modelines" 109 | }, 110 | { 111 | "include": "#pathname" 112 | }, 113 | { 114 | "include": "#escape" 115 | }, 116 | { 117 | "include": "#strings" 118 | }, 119 | { 120 | "include": "#hashbang" 121 | }, 122 | { 123 | "include": "#numbers" 124 | }, 125 | { 126 | "include": "#syntax" 127 | }, 128 | { 129 | "include": "#highlightLink" 130 | }, 131 | { 132 | "include": "#funcDef" 133 | }, 134 | { 135 | "include": "#auCmd" 136 | }, 137 | { 138 | "include": "#auGroup" 139 | }, 140 | { 141 | "include": "#parameter" 142 | }, 143 | { 144 | "include": "#assignment" 145 | }, 146 | { 147 | "include": "#expr" 148 | }, 149 | { 150 | "include": "#keyword" 151 | }, 152 | { 153 | "include": "#register" 154 | }, 155 | { 156 | "include": "#filetype" 157 | }, 158 | { 159 | "include": "#variable" 160 | }, 161 | { 162 | "include": "#supportType" 163 | }, 164 | { 165 | "include": "#supportVariable" 166 | }, 167 | { 168 | "include": "#extraVimOptions" 169 | }, 170 | { 171 | "include": "#extraVimFunc" 172 | }, 173 | { 174 | "include": "#keywordLists" 175 | } 176 | ] 177 | }, 178 | "strings": { 179 | "patterns": [ 180 | { 181 | "name": "string.quoted.double.empty.viml", 182 | "match": "(\")(\")", 183 | "captures": { 184 | "1": { 185 | "name": "punctuation.definition.string.begin.viml" 186 | }, 187 | "2": { 188 | "name": "punctuation.definition.string.end.viml" 189 | } 190 | } 191 | }, 192 | { 193 | "name": "string.quoted.single.empty.viml", 194 | "match": "(')(')", 195 | "captures": { 196 | "1": { 197 | "name": "punctuation.definition.string.begin.viml" 198 | }, 199 | "2": { 200 | "name": "punctuation.definition.string.end.viml" 201 | } 202 | } 203 | }, 204 | { 205 | "name": "string.quoted.double.viml", 206 | "match": "(\")((?:[^\\\\\"]|\\\\.)*)(\")", 207 | "captures": { 208 | "1": { 209 | "name": "punctuation.definition.string.begin.viml" 210 | }, 211 | "2": { 212 | "patterns": [ 213 | { 214 | "include": "#escape" 215 | } 216 | ] 217 | }, 218 | "3": { 219 | "name": "punctuation.definition.string.end.viml" 220 | } 221 | } 222 | }, 223 | { 224 | "name": "string.quoted.single.viml", 225 | "match": "(')((?:[^']|'')*)(')", 226 | "captures": { 227 | "1": { 228 | "name": "punctuation.definition.string.begin.viml" 229 | }, 230 | "2": { 231 | "patterns": [ 232 | { 233 | "name": "constant.character.escape.quotes.viml", 234 | "match": "''" 235 | } 236 | ] 237 | }, 238 | "3": { 239 | "name": "punctuation.definition.string.end.viml" 240 | } 241 | } 242 | }, 243 | { 244 | "name": "string.regexp.interpolated.viml", 245 | "match": "(/)(?:\\\\\\\\|\\\\/|[^\\n/])*(/)", 246 | "captures": { 247 | "1": { 248 | "name": "punctuation.section.regexp.begin.viml" 249 | }, 250 | "2": { 251 | "name": "punctuation.section.regexp.end.viml" 252 | } 253 | } 254 | } 255 | ] 256 | }, 257 | "escape": { 258 | "patterns": [ 259 | { 260 | "include": "#escapedCodePoint" 261 | }, 262 | { 263 | "include": "#escapedKey" 264 | }, 265 | { 266 | "match": "(\\\\)b", 267 | "name": "constant.character.escape.backspace.viml", 268 | "captures": { 269 | "1": { 270 | "name": "punctuation.definition.escape.viml" 271 | } 272 | } 273 | }, 274 | { 275 | "match": "(\\\\)e", 276 | "name": "constant.character.escape.escape.viml", 277 | "captures": { 278 | "1": { 279 | "name": "punctuation.definition.escape.viml" 280 | } 281 | } 282 | }, 283 | { 284 | "match": "(\\\\)f", 285 | "name": "constant.character.escape.form-feed.viml", 286 | "captures": { 287 | "1": { 288 | "name": "punctuation.definition.escape.viml" 289 | } 290 | } 291 | }, 292 | { 293 | "match": "(\\\\)n", 294 | "name": "constant.character.escape.newline.viml", 295 | "captures": { 296 | "1": { 297 | "name": "punctuation.definition.escape.viml" 298 | } 299 | } 300 | }, 301 | { 302 | "match": "(\\\\)r", 303 | "name": "constant.character.escape.return.viml", 304 | "captures": { 305 | "1": { 306 | "name": "punctuation.definition.escape.viml" 307 | } 308 | } 309 | }, 310 | { 311 | "match": "(\\\\)t", 312 | "name": "constant.character.escape.tab.viml", 313 | "captures": { 314 | "1": { 315 | "name": "punctuation.definition.escape.viml" 316 | } 317 | } 318 | }, 319 | { 320 | "match": "(\\\\)\\1", 321 | "name": "constant.character.escape.backslash.viml", 322 | "captures": { 323 | "1": { 324 | "name": "punctuation.definition.escape.viml" 325 | } 326 | } 327 | }, 328 | { 329 | "match": "(\\\\)\"", 330 | "name": "constant.character.escape.quote.viml", 331 | "captures": { 332 | "1": { 333 | "name": "punctuation.definition.escape.viml" 334 | } 335 | } 336 | }, 337 | { 338 | "match": "(\\\\).", 339 | "name": "constant.character.escape.other.viml", 340 | "captures": { 341 | "1": { 342 | "name": "punctuation.definition.escape.viml" 343 | } 344 | } 345 | } 346 | ] 347 | }, 348 | "escapedCodePoint": { 349 | "patterns": [ 350 | { 351 | "name": "constant.character.escape.codepoint.hex.short.viml", 352 | "match": "(\\\\)[xX][0-9A-Fa-f]{1,2}", 353 | "captures": { 354 | "1": { 355 | "name": "punctuation.definition.escape.backslash.viml" 356 | } 357 | } 358 | }, 359 | { 360 | "name": "constant.character.escape.codepoint.hex.long.viml", 361 | "match": "(\\\\)(?:u[0-9A-Fa-f]{1,4}|U[0-9A-Fa-f]{1,8})", 362 | "captures": { 363 | "1": { 364 | "name": "punctuation.definition.escape.backslash.viml" 365 | } 366 | } 367 | }, 368 | { 369 | "name": "constant.character.escape.codepoint.octal.viml", 370 | "match": "(\\\\)([0-7]{1,3})", 371 | "captures": { 372 | "1": { 373 | "name": "punctuation.definition.escape.backslash.viml" 374 | } 375 | } 376 | } 377 | ] 378 | }, 379 | "escapedKey": { 380 | "name": "constant.character.escape.keymapping.viml", 381 | "match": "(\\\\<\\*?)(?:[^\">\\\\]|\\\\.)+(>)", 382 | "captures": { 383 | "1": { 384 | "name": "punctuation.definition.escape.key.begin.viml" 385 | }, 386 | "2": { 387 | "name": "punctuation.definition.escape.key.end.viml" 388 | } 389 | } 390 | }, 391 | "pathname": { 392 | "name": "constant.pathname.viml", 393 | "begin": "~/", 394 | "end": "(?=\\s)" 395 | }, 396 | "comments": { 397 | "patterns": [ 398 | { 399 | "name": "comment.line.quotes.viml", 400 | "begin": "^\\s*(\")(?=(\\s*[A-Z]\\w+)+:)", 401 | "end": "((:))(.*)$", 402 | "contentName": "support.constant.field.viml", 403 | "beginCaptures": { 404 | "1": { 405 | "name": "punctuation.definition.comment.viml" 406 | } 407 | }, 408 | "endCaptures": { 409 | "1": { 410 | "name": "support.constant.field.viml" 411 | }, 412 | "2": { 413 | "name": "punctuation.separator.key-value.colon.viml" 414 | }, 415 | "3": { 416 | "patterns": [ 417 | { 418 | "include": "#commentInnards" 419 | } 420 | ] 421 | } 422 | } 423 | }, 424 | { 425 | "name": "comment.line.quotes.viml", 426 | "begin": "^\\s*(\")", 427 | "end": "$", 428 | "beginCaptures": { 429 | "1": { 430 | "name": "punctuation.definition.comment.viml" 431 | } 432 | }, 433 | "patterns": [ 434 | { 435 | "include": "#commentInnards" 436 | } 437 | ] 438 | }, 439 | { 440 | "name": "comment.inline.quotes.viml", 441 | "patterns": [ 442 | { 443 | "include": "#commentInnards" 444 | } 445 | ], 446 | "begin": "(?]?\\d+|m)?|[\\t\\x20]ex):\\s*(?=set?\\s)", 476 | "end": ":|$" 477 | }, 478 | { 479 | "name": "string.other.modeline.viml", 480 | "patterns": [ 481 | { 482 | "include": "#main" 483 | } 484 | ], 485 | "begin": "(?:(?:\\s|^)vi(?:m[<=>]?\\d+|m)?|[\\t\\x20]ex):", 486 | "end": "$" 487 | } 488 | ] 489 | }, 490 | "hashbang": { 491 | "name": "comment.line.shebang.viml", 492 | "begin": "\\A#!", 493 | "end": "$", 494 | "beginCaptures": { 495 | "0": { 496 | "name": "punctuation.definition.comment.shebang.viml" 497 | } 498 | } 499 | }, 500 | "numbers": { 501 | "patterns": [ 502 | { 503 | "name": "constant.numeric.hex.short.viml", 504 | "match": "0[xX][0-9A-Fa-f]+" 505 | }, 506 | { 507 | "name": "constant.numeric.hex.long.viml", 508 | "match": "0[zZ][0-9A-Fa-f]+" 509 | }, 510 | { 511 | "name": "constant.numeric.float.exponential.viml", 512 | "match": "(?<]=[#?]?|[=!]~(?!\\/)[#?]?|[><][#?*]|\\b(?:isnot|is)\\b|\\\\|[-+%*]" 639 | }, 640 | { 641 | "match": "\\s[><]\\s", 642 | "name": "keyword.operator.logical.viml" 643 | }, 644 | { 645 | "match": "(?<=\\S)!", 646 | "name": "storage.modifier.force.viml" 647 | }, 648 | { 649 | "match": "!(?=\\S)", 650 | "name": "keyword.operator.logical.not.viml" 651 | }, 652 | { 653 | "match": "{", 654 | "name": "punctuation.expression.bracket.curly.begin.viml" 655 | }, 656 | { 657 | "match": "}", 658 | "name": "punctuation.expression.bracket.curly.end.viml" 659 | }, 660 | { 661 | "match": "\\[", 662 | "name": "punctuation.expression.bracket.square.begin.viml" 663 | }, 664 | { 665 | "match": "\\]", 666 | "name": "punctuation.expression.bracket.square.end.viml" 667 | }, 668 | { 669 | "match": "\\(", 670 | "name": "punctuation.expression.bracket.round.begin.viml" 671 | }, 672 | { 673 | "match": "\\)", 674 | "name": "punctuation.expression.bracket.round.end.viml" 675 | }, 676 | { 677 | "match": "\\|", 678 | "name": "punctuation.separator.statement.viml" 679 | }, 680 | { 681 | "match": ",", 682 | "name": "punctuation.separator.comma.viml" 683 | }, 684 | { 685 | "match": ":", 686 | "name": "punctuation.separator.colon.viml" 687 | }, 688 | { 689 | "match": "\\.{3}", 690 | "name": "keyword.operator.rest.viml" 691 | }, 692 | { 693 | "match": "\\.", 694 | "name": "punctuation.delimiter.property.dot.viml" 695 | }, 696 | { 697 | "match": "&(?=\\w+)", 698 | "name": "punctuation.definition.option.viml" 699 | } 700 | ] 701 | }, 702 | "keyword": { 703 | "patterns": [ 704 | { 705 | "name": "keyword.control.$1.viml", 706 | "match": "\\b(if|while|for|return|try|catch|finally|finish|end(if|for|while|try)?|else(if)?|do|in|:)\\b" 707 | }, 708 | { 709 | "name": "keyword.operator.$1.viml", 710 | "match": "\\b(unlet)\\b" 711 | }, 712 | { 713 | "name": "storage.type.let.viml", 714 | "match": "\\blet\\b" 715 | }, 716 | { 717 | "name": "support.constant.vimball.use.viml", 718 | "match": "(?<=^|\\n)UseVimball(?=\\s*$)" 719 | } 720 | ] 721 | }, 722 | "register": { 723 | "name": "variable.other.register.viml", 724 | "match": "(@)([-\"A-Za-z\\d:.%#=*+~_/])", 725 | "captures": { 726 | "1": { 727 | "name": "punctuation.definition.register.viml" 728 | } 729 | } 730 | }, 731 | "variable": { 732 | "patterns": [ 733 | { 734 | "name": "variable.language.self.viml", 735 | "match": "\\b(self)\\b" 736 | }, 737 | { 738 | "name": "support.variable.environment.viml", 739 | "match": "(\\$)\\w+", 740 | "captures": { 741 | "1": { 742 | "name": "punctuation.definition.variable.viml" 743 | } 744 | } 745 | }, 746 | { 747 | "name": "variable.other.viml", 748 | "match": "(&?)(?:([sSgGbBwWlLaAvV](:))|[@$]|&(?!&))\\w*", 749 | "captures": { 750 | "1": { 751 | "name": "punctuation.definition.reference.viml" 752 | }, 753 | "2": { 754 | "name": "storage.modifier.scope.viml" 755 | }, 756 | "3": { 757 | "name": "punctuation.definition.scope.key-value.viml" 758 | } 759 | } 760 | } 761 | ] 762 | }, 763 | "supportType": { 764 | "name": "entity.tag.name.viml", 765 | "match": "(<).*?(>)", 766 | "captures": { 767 | "1": { 768 | "name": "punctuation.definition.bracket.angle.begin.viml" 769 | }, 770 | "2": { 771 | "name": "punctuation.definition.bracket.angle.end.viml" 772 | } 773 | } 774 | }, 775 | "supportVariable": { 776 | "name": "support.variable.viml", 777 | "match": "\\b(?:am(?:enu)?|(?:hl|inc)?search|[Bb]uf(?:[Nn]ew[Ff]ile|[Rr]ead)?|[Ff]ile[Tt]ype)\\b" 778 | }, 779 | "highlightLink": { 780 | "match": "(?x)^\\s* (:)? \\s* (?# 1: punctuation.separator.key-value.colon.viml) (hi|highlight) (?# 2: support.function.highlight.viml) (!)? (?# 3: storage.modifier.force.viml) (?:\\s+(def|default))? (?# 4: support.function.highlight-default.viml) (?:\\s+(link)) (?# 5: support.function.highlight-link.viml) (?:\\s+([-\\w]+)) (?# 6: variable.parameter.group-name.viml) (?:\\s+(?:(NONE)|([-\\w]+)))?", 781 | "captures": { 782 | "1": { 783 | "name": "punctuation.separator.key-value.colon.viml" 784 | }, 785 | "2": { 786 | "name": "support.function.highlight.viml" 787 | }, 788 | "3": { 789 | "name": "storage.modifier.force.viml" 790 | }, 791 | "4": { 792 | "name": "support.function.highlight-default.viml" 793 | }, 794 | "5": { 795 | "name": "support.function.highlight-link.viml" 796 | }, 797 | "6": { 798 | "name": "variable.parameter.group-name.viml" 799 | }, 800 | "7": { 801 | "name": "support.constant.highlighting.viml" 802 | }, 803 | "8": { 804 | "name": "variable.parameter.group-name.viml" 805 | } 806 | } 807 | }, 808 | "filetype": { 809 | "match": "\\b(?:(setf|setfiletype)(?:\\s+(FALLBACK))?\\s+|(ft|filetype)\\s*(=))([.\\w]+)", 810 | "captures": { 811 | "1": { 812 | "name": "support.function.command.viml" 813 | }, 814 | "2": { 815 | "name": "support.variable.option.viml" 816 | }, 817 | "3": { 818 | "name": "storage.modifier.fallback.viml" 819 | }, 820 | "4": { 821 | "name": "keyword.operator.assignment.viml" 822 | }, 823 | "5": { 824 | "name": "variable.parameter.function.filetype.viml" 825 | } 826 | } 827 | }, 828 | "syntax": { 829 | "name": "meta.syntax-item.viml", 830 | "begin": "^\\s*(:)?(?:(VimFold\\w)\\s+)?\\s*(syntax|syn?)(?=\\s|$)", 831 | "end": "$", 832 | "beginCaptures": { 833 | "1": { 834 | "name": "punctuation.separator.key-value.colon.viml" 835 | }, 836 | "2": { 837 | "name": "support.function.fold-command.viml" 838 | }, 839 | "3": { 840 | "name": "storage.type.syntax-item.viml" 841 | } 842 | }, 843 | "patterns": [ 844 | { 845 | "match": "\\G\\s+(case)(?:\\s+(match|ignore))?(?=\\s|$)", 846 | "captures": { 847 | "1": { 848 | "name": "support.function.syntax-case.viml" 849 | }, 850 | "2": { 851 | "name": "support.constant.$2-case.viml" 852 | } 853 | } 854 | }, 855 | { 856 | "match": "\\G\\s+(spell)(?:\\s+(toplevel|notoplevel|default))?(?=\\s|$)", 857 | "captures": { 858 | "1": { 859 | "name": "support.function.syntax-spellcheck.viml" 860 | }, 861 | "2": { 862 | "name": "support.constant.$2-checking.viml" 863 | } 864 | } 865 | }, 866 | { 867 | "begin": "\\G\\s+(keyword)(?:\\s+([-\\w]+))?", 868 | "end": "(?=$)", 869 | "beginCaptures": { 870 | "1": { 871 | "name": "support.function.syntax-keywords.viml" 872 | }, 873 | "2": { 874 | "name": "variable.parameter.group-name.viml" 875 | } 876 | }, 877 | "contentName": "keyword.other.syntax-definition.viml", 878 | "patterns": [ 879 | { 880 | "include": "#syntaxOptions" 881 | }, 882 | { 883 | "include": "#assignment" 884 | }, 885 | { 886 | "include": "#expr" 887 | } 888 | ] 889 | }, 890 | { 891 | "begin": "\\G\\s+(match)(?:\\s+([-\\w]+))?\\s*", 892 | "end": "(?=$)", 893 | "beginCaptures": { 894 | "1": { 895 | "name": "support.function.syntax-match.viml" 896 | }, 897 | "2": { 898 | "name": "variable.parameter.group-name.viml" 899 | } 900 | }, 901 | "patterns": [ 902 | { 903 | "include": "#syntaxRegex" 904 | } 905 | ] 906 | }, 907 | { 908 | "begin": "\\G\\s+(region)(?:\\s+([-\\w]+))?", 909 | "end": "(?=$)", 910 | "beginCaptures": { 911 | "1": { 912 | "name": "support.function.syntax-region.viml" 913 | }, 914 | "2": { 915 | "name": "variable.parameter.group-name.viml" 916 | } 917 | }, 918 | "patterns": [ 919 | { 920 | "include": "#syntaxOptions" 921 | }, 922 | { 923 | "include": "#main" 924 | } 925 | ] 926 | }, 927 | { 928 | "begin": "\\G\\s+(cluster)(?:\\s+([-\\w]+))?(?=\\s|$)", 929 | "end": "(?=$)", 930 | "beginCaptures": { 931 | "1": { 932 | "name": "support.function.syntax-cluster.viml" 933 | }, 934 | "2": { 935 | "name": "variable.parameter.group-name.viml" 936 | } 937 | }, 938 | "patterns": [ 939 | { 940 | "include": "#syntaxOptions" 941 | }, 942 | { 943 | "include": "#main" 944 | } 945 | ] 946 | }, 947 | { 948 | "match": "\\G\\s+(conceal)(?:\\s+(on|off)(?=\\s|$))?", 949 | "captures": { 950 | "1": { 951 | "name": "support.function.syntax-conceal.viml" 952 | }, 953 | "2": { 954 | "name": "support.constant.boolean.$2.viml" 955 | } 956 | } 957 | }, 958 | { 959 | "match": "\\G\\s+(include)(?:\\s+((@)?[-\\w]+))?(?:\\s+(\\S+))?", 960 | "captures": { 961 | "1": { 962 | "name": "support.function.syntax-include.viml" 963 | }, 964 | "2": { 965 | "name": "variable.parameter.group-name.viml" 966 | }, 967 | "3": { 968 | "name": "punctuation.definition.group-reference.viml" 969 | }, 970 | "4": { 971 | "name": "string.unquoted.filename.viml", 972 | "patterns": [ 973 | { 974 | "include": "#supportType" 975 | } 976 | ] 977 | } 978 | } 979 | }, 980 | { 981 | "begin": "\\G\\s+(sync)(?=\\s|$)", 982 | "end": "$", 983 | "beginCaptures": { 984 | "1": { 985 | "name": "support.function.syntax-sync.viml" 986 | } 987 | }, 988 | "patterns": [ 989 | { 990 | "match": "\\G\\s+(fromstart)(?=\\s|$)", 991 | "captures": { 992 | "1": { 993 | "name": "support.constant.sync-$1.viml" 994 | } 995 | } 996 | }, 997 | { 998 | "match": "\\G\\s+(ccomment|clear)(?:\\s+(?![-\\w]+\\s*=)([-\\w]+))?", 999 | "captures": { 1000 | "1": { 1001 | "name": "support.constant.sync-$1.viml" 1002 | }, 1003 | "2": { 1004 | "name": "variable.parameter.group-name.viml" 1005 | } 1006 | } 1007 | }, 1008 | { 1009 | "match": "\\G\\s+(minlines|lines)\\s*(=)(\\d*)", 1010 | "captures": { 1011 | "1": { 1012 | "name": "support.constant.sync-mode.viml" 1013 | }, 1014 | "2": { 1015 | "name": "punctuation.assignment.parameter.viml" 1016 | }, 1017 | "3": { 1018 | "name": "constant.numeric.integer.viml" 1019 | } 1020 | } 1021 | }, 1022 | { 1023 | "match": "(?x)\\G\\s+(match|region)(?:\\s+(?![-\\w]+\\s*=)([-\\w]+))?", 1024 | "captures": { 1025 | "1": { 1026 | "name": "support.constant.sync-mode.viml" 1027 | }, 1028 | "2": { 1029 | "name": "variable.parameter.group-name.viml" 1030 | }, 1031 | "3": { 1032 | "name": "support.constant.sync-mode-location.viml" 1033 | } 1034 | } 1035 | }, 1036 | { 1037 | "begin": "(?<=\\s)(groupt?here|linecont)(?:\\s+(?![-\\w]+\\s*=)([-\\w]+))?(?=\\s|$)", 1038 | "end": "(?=$)", 1039 | "beginCaptures": { 1040 | "1": { 1041 | "name": "support.constant.sync-match.viml" 1042 | }, 1043 | "2": { 1044 | "name": "variable.parameter.group-name.viml" 1045 | } 1046 | }, 1047 | "patterns": [ 1048 | { 1049 | "include": "#syntaxRegex" 1050 | } 1051 | ] 1052 | }, 1053 | { 1054 | "include": "#syntaxOptions" 1055 | } 1056 | ] 1057 | }, 1058 | { 1059 | "include": "#main" 1060 | } 1061 | ] 1062 | }, 1063 | "syntaxOptions": { 1064 | "patterns": [ 1065 | { 1066 | "name": "meta.syntax-item.pattern-argument.viml", 1067 | "begin": "(?<=\\s)(start|skip|end)(?:\\s*(=))", 1068 | "end": "(?=$|\\s)", 1069 | "beginCaptures": { 1070 | "1": { 1071 | "name": "support.constant.$1-pattern.viml" 1072 | }, 1073 | "2": { 1074 | "name": "punctuation.assignment.parameter.viml" 1075 | } 1076 | }, 1077 | "patterns": [ 1078 | { 1079 | "include": "#regex" 1080 | } 1081 | ] 1082 | }, 1083 | { 1084 | "name": "meta.syntax-item.argument.viml", 1085 | "match": "(?x)(?<=\\s)\n((?:matchgroup|contains|containedin|nextgroup|add|remove|minlines|linebreaks|maxlines)(?=\\s*=)\n|(?:cchar|conceal|concealends|contained|display|excludenl|extend|fold|keepend|oneline|skipempty|skipnl|skipwhite|transparent))\n(?:(?=$|\\s)|\\s*(=)(\\S*)?)", 1086 | "captures": { 1087 | "1": { 1088 | "name": "support.constant.syntax-$1.viml" 1089 | }, 1090 | "2": { 1091 | "name": "punctuation.assignment.parameter.viml" 1092 | }, 1093 | "3": { 1094 | "name": "string.unquoted.syntax-option.viml", 1095 | "patterns": [ 1096 | { 1097 | "include": "#numbers" 1098 | }, 1099 | { 1100 | "match": ",", 1101 | "name": "punctuation.separator.comma.viml" 1102 | }, 1103 | { 1104 | "match": "@", 1105 | "name": "punctuation.definition.group-reference.viml" 1106 | } 1107 | ] 1108 | } 1109 | } 1110 | } 1111 | ] 1112 | }, 1113 | "syntaxRegex": { 1114 | "patterns": [ 1115 | { 1116 | "include": "#syntaxOptions" 1117 | }, 1118 | { 1119 | "name": "string.regexp.viml", 1120 | "begin": "(?<=\\s)(\\S)", 1121 | "end": "(?:(\\1)(\\S*)(.*))?$", 1122 | "patterns": [ 1123 | { 1124 | "include": "#regexInnards" 1125 | } 1126 | ], 1127 | "beginCaptures": { 1128 | "1": { 1129 | "name": "punctuation.definition.string.begin.viml" 1130 | } 1131 | }, 1132 | "endCaptures": { 1133 | "1": { 1134 | "name": "punctuation.definition.string.end.viml" 1135 | }, 1136 | "2": { 1137 | "patterns": [ 1138 | { 1139 | "include": "#regexOffset" 1140 | } 1141 | ] 1142 | }, 1143 | "3": { 1144 | "patterns": [ 1145 | { 1146 | "include": "#syntaxOptions" 1147 | }, 1148 | { 1149 | "include": "#main" 1150 | } 1151 | ] 1152 | } 1153 | } 1154 | } 1155 | ] 1156 | }, 1157 | "regex": { 1158 | "name": "string.regexp.viml", 1159 | "begin": "(?<=\\s|=)(\\S)", 1160 | "end": "$|(\\1)(\\S*)", 1161 | "patterns": [ 1162 | { 1163 | "include": "#regexInnards" 1164 | } 1165 | ], 1166 | "beginCaptures": { 1167 | "1": { 1168 | "name": "punctuation.definition.string.begin.viml" 1169 | } 1170 | }, 1171 | "endCaptures": { 1172 | "1": { 1173 | "name": "punctuation.definition.string.end.viml" 1174 | }, 1175 | "2": { 1176 | "patterns": [ 1177 | { 1178 | "include": "#regexOffset" 1179 | } 1180 | ] 1181 | } 1182 | } 1183 | }, 1184 | "regexOffset": { 1185 | "name": "meta.pattern-offset.viml", 1186 | "match": "(ms|me|hs|he|rs|re|lc)(=)(?:(\\d+)|([se])(?:([-+])(\\d+))?)(,)?", 1187 | "captures": { 1188 | "1": { 1189 | "name": "constant.language.pattern-offset.viml" 1190 | }, 1191 | "2": { 1192 | "name": "punctuation.assignment.parameter.viml" 1193 | }, 1194 | "3": { 1195 | "name": "constant.numeric.integer.viml" 1196 | }, 1197 | "4": { 1198 | "name": "constant.language.pattern-position.viml" 1199 | }, 1200 | "5": { 1201 | "name": "keyword.operator.arithmetic.viml" 1202 | }, 1203 | "6": { 1204 | "name": "constant.numeric.integer.viml" 1205 | }, 1206 | "7": { 1207 | "name": "punctuation.separator.comma.viml" 1208 | } 1209 | } 1210 | }, 1211 | "regexInnards": { 1212 | "patterns": [ 1213 | { 1214 | "begin": "\\[", 1215 | "end": "\\]|$", 1216 | "beginCaptures": { 1217 | "0": { 1218 | "name": "punctuation.definition.character-class.begin.viml" 1219 | } 1220 | }, 1221 | "endCaptures": { 1222 | "0": { 1223 | "name": "punctuation.definition.character-class.end.viml" 1224 | } 1225 | }, 1226 | "patterns": [ 1227 | { 1228 | "include": "#regexInnards" 1229 | } 1230 | ] 1231 | }, 1232 | { 1233 | "name": "constant.character.escape.viml", 1234 | "match": "(\\\\).", 1235 | "captures": { 1236 | "1": { 1237 | "name": "punctuation.definition.backslash.escape.viml" 1238 | } 1239 | } 1240 | } 1241 | ] 1242 | }, 1243 | "extraVimFunc": { 1244 | "name": "support.function.viml", 1245 | "match": "(?x)\\b\n\t((?:echo(?:hl?)?)|exe(?:c(?:ute)?)?|[lxvn]?noremap|smapc(?:lear)?|mapmode|xmap|(?:[xs]un|snore)map\n\t|Plugin|autocmd|[cinvo]?(?:un|nore)?(?:map|menu)|(?:range)?go(?:to)?|(?:count)?(?:pop?|tag?|tn(?:ext)?|tp(?:revious)?|tr(?:ewind)?)\n\t|(?:range)?(?:s(?:ubstitute)?|ret(?:ab)?|g(?:lobal)?)|unm(?:ap)?|map_l|mapc(?:lear)?|N?buffer|N?bnext|N?bNext|N?bprevious|N?bmod\n\t|ab(?:breviate)?|norea(?:bbrev)?|[ic](?:un|nore)?ab|split_f|rangefold|[ic](?:un|nore)?ab|[ic]abbrev|edit_f|next_f|[vcoxli]u\n\t|(?:range)?(?:w(?:rite)?|up(?:date)?)|sar|cno|[vl]n|[io]?no|[xn]n|snor|lm(?:ap)?|lunmap|lear|[vnx]m|om|[ci]m|ap|nun|sunm)\n\\b" 1246 | }, 1247 | "extraVimOptions": { 1248 | "name": "support.variable.option.viml", 1249 | "match": "(?x)\\b (no)?\n\t(altwerase|bf|escapetime|extended|filec|iclower|keytime|leftright|li|lock|noprint|octal|recdir|searchincr\n\t|shellmeta|ttywerase|windowname|wl|wraplen)\n\\b" 1250 | }, 1251 | "keywordLists": { 1252 | "patterns": [ 1253 | { 1254 | "include": "#vimTodo" 1255 | }, 1256 | { 1257 | "include": "#vimAugroupKey" 1258 | }, 1259 | { 1260 | "include": "#vimAutoEvent" 1261 | }, 1262 | { 1263 | "include": "#vimBehaveModel" 1264 | }, 1265 | { 1266 | "include": "#vimCommand" 1267 | }, 1268 | { 1269 | "include": "#vimFTCmd" 1270 | }, 1271 | { 1272 | "include": "#vimFTOption" 1273 | }, 1274 | { 1275 | "include": "#vimFgBgAttrib" 1276 | }, 1277 | { 1278 | "include": "#vimFuncKey" 1279 | }, 1280 | { 1281 | "include": "#vimFuncName" 1282 | }, 1283 | { 1284 | "include": "#vimGroup" 1285 | }, 1286 | { 1287 | "include": "#vimGroupSpecial" 1288 | }, 1289 | { 1290 | "include": "#vimHLGroup" 1291 | }, 1292 | { 1293 | "include": "#vimHiAttrib" 1294 | }, 1295 | { 1296 | "include": "#vimHiClear" 1297 | }, 1298 | { 1299 | "include": "#vimHiCtermColor" 1300 | }, 1301 | { 1302 | "include": "#vimMapModKey" 1303 | }, 1304 | { 1305 | "include": "#vimOption" 1306 | }, 1307 | { 1308 | "include": "#vimPattern" 1309 | }, 1310 | { 1311 | "include": "#vimStdPlugin" 1312 | }, 1313 | { 1314 | "include": "#vimSynCase" 1315 | }, 1316 | { 1317 | "include": "#vimSynType" 1318 | }, 1319 | { 1320 | "include": "#vimSyncC" 1321 | }, 1322 | { 1323 | "include": "#vimSyncLinecont" 1324 | }, 1325 | { 1326 | "include": "#vimSyncMatch" 1327 | }, 1328 | { 1329 | "include": "#vimSyncNone" 1330 | }, 1331 | { 1332 | "include": "#vimSyncRegion" 1333 | }, 1334 | { 1335 | "include": "#vimUserAttrbCmplt" 1336 | }, 1337 | { 1338 | "include": "#vimUserAttrbKey" 1339 | }, 1340 | { 1341 | "include": "#vimUserCommand" 1342 | }, 1343 | { 1344 | "include": "#vimErrSetting" 1345 | } 1346 | ] 1347 | }, 1348 | "vimTodo": { 1349 | "name": "support.constant.${1:/downcase}.viml", 1350 | "match": "(?x) \\b\n( COMBAK\n| FIXME\n| TODO\n| XXX\n) \\b" 1351 | }, 1352 | "vimAugroupKey": { 1353 | "name": "support.function.vimAugroupKey.viml", 1354 | "match": "(?x) \\b\n( aug\n| augroup\n) \\b" 1355 | }, 1356 | "vimAutoEvent": { 1357 | "name": "support.function.auto-event.viml", 1358 | "match": "(?xi) \\b\n( BufAdd\n| BufCreate\n| BufDelete\n| BufEnter\n| BufFilePost\n| BufFilePre\n| BufHidden\n| BufLeave\n| BufNewFile\n| BufNew\n| BufReadCmd\n| BufReadPost\n| BufReadPre\n| BufRead\n| BufUnload\n| BufWinEnter\n| BufWinLeave\n| BufWipeout\n| BufWriteCmd\n| BufWritePost\n| BufWritePre\n| BufWrite\n| CmdUndefined\n| CmdlineChanged\n| CmdlineEnter\n| CmdlineLeave\n| CmdwinEnter\n| CmdwinLeave\n| ColorSchemePre\n| ColorScheme\n| CompleteChanged\n| CompleteDonePre\n| CompleteDone\n| CursorHoldI\n| CursorHold\n| CursorMovedI\n| CursorMoved\n| DiffUpdated\n| DirChanged\n| EncodingChanged\n| ExitPre\n| FileAppendCmd\n| FileAppendPost\n| FileAppendPre\n| FileChangedRO\n| FileChangedShellPost\n| FileChangedShell\n| FileEncoding\n| FileReadCmd\n| FileReadPost\n| FileReadPre\n| FileType\n| FileWriteCmd\n| FileWritePost\n| FileWritePre\n| FilterReadPost\n| FilterReadPre\n| FilterWritePost\n| FilterWritePre\n| FocusGained\n| FocusLost\n| FuncUndefined\n| GUIEnter\n| GUIFailed\n| InsertChange\n| InsertCharPre\n| InsertEnter\n| InsertLeavePre\n| InsertLeave\n| MenuPopup\n| OptionSet\n| QuickFixCmdPost\n| QuickFixCmdPre\n| QuitPre\n| RemoteReply\n| SafeStateAgain\n| SafeState\n| SessionLoadPost\n| ShellCmdPost\n| ShellFilterPost\n| SigUSR1\n| SourceCmd\n| SourcePost\n| SourcePre\n| SpellFileMissing\n| StdinReadPost\n| StdinReadPre\n| SwapExists\n| Syntax\n| TabClosed\n| TabEnter\n| TabLeave\n| TabNew\n| TermChanged\n| TermResponse\n| TerminalOpen\n| TerminalWinOpen\n| TextChangedI\n| TextChangedP\n| TextChanged\n| TextYankPost\n| User\n| VimEnter\n| VimLeavePre\n| VimLeave\n| VimResized\n| VimResume\n| VimSuspend\n| WinEnter\n| WinLeave\n| WinNew\n) \\b" 1359 | }, 1360 | "vimBehaveModel": { 1361 | "name": "support.function.vimBehaveModel.viml", 1362 | "match": "(?x) \\b\n( mswin\n| xterm\n) \\b" 1363 | }, 1364 | "vimCommand": { 1365 | "name": "support.function.command.viml", 1366 | "match": "(?x) \\b\n( abc\n| abclear\n| abo\n| aboveleft\n| ab\n| addd\n| all?\n| ar\n| args\n| arga\n| argadd\n| argd\n| argdelete\n| argdo\n| arge\n| argedit\n| argg\n| argglobal\n| argl\n| arglocal\n| argu\n| argument\n| as\n| ascii\n| au\n| a\n| bN\n| bNext\n| b\n| buffer\n| ba\n| ball\n| badd?\n| balt\n| bd\n| bdelete\n| bel\n| belowright\n| bf\n| bfirst\n| bl\n| blast\n| bm\n| bmodified\n| bn\n| bnext\n| bo\n| botright\n| bp\n| bprevious\n| br\n| brewind\n| break?\n| breaka\n| breakadd\n| breakd\n| breakdel\n| breakl\n| breaklist\n| bro\n| browse\n| bufdo\n| buffers\n| bun\n| bunload\n| bw\n| bwipeout\n| cN\n| cNext\n| cNf\n| cNfile\n| c\n| change\n| cabc\n| cabclear\n| cabo\n| cabove\n| cad\n| caddbuffer\n| cadde\n| caddexpr\n| caddf\n| caddfile\n| caf\n| cafter\n| call?\n| cat\n| catch\n| ca\n| cb\n| cbuffer\n| cbe\n| cbefore\n| cbel\n| cbelow\n| cbo\n| cbottom\n| ccl\n| cclose\n| cc\n| cdo\n| cd\n| ce\n| center\n| cex\n| cexpr\n| cf\n| cfile\n| cfdo\n| cfir\n| cfirst\n| cg\n| cgetfile\n| cgetb\n| cgetbuffer\n| cgete\n| cgetexpr\n| changes\n| chd\n| chdir\n| che\n| checkpath\n| checkt\n| checktime\n| chi\n| chistory\n| cl\n| clist\n| cla\n| clast\n| class\n| cle\n| clearjumps\n| clo\n| close\n| cmapc\n| cmapclear\n| cn\n| cnext\n| cnew\n| cnewer\n| cnf\n| cnfile\n| cnor\n| co\n| copy\n| col\n| colder\n| colo\n| colorscheme\n| comc\n| comclear\n| comp\n| compiler\n| com\n| con\n| continue\n| conf\n| confirm\n| const?\n| copen?\n| cp\n| cprevious\n| cpf\n| cpfile\n| cq\n| cquit\n| cr\n| crewind\n| cscope\n| cstag\n| cs\n| cuna\n| cunabbrev\n| cun\n| cw\n| cwindow\n| d\n| delete\n| debugg\n| debuggreedy\n| debug\n| defc\n| defcompile\n| def\n| delc\n| delcommand\n| delel\n| delep\n| deletel\n| deletep\n| deletl\n| deletp\n| delf\n| delfunction\n| dell\n| delm\n| delmarks\n| delp\n| dep\n| di\n| display\n| dif\n| diffupdate\n| diffg\n| diffget\n| diffo\n| diffoff\n| diffp\n| diffpatch\n| diffput?\n| diffs\n| diffsplit\n| difft\n| diffthis\n| dig\n| digraphs\n| dir\n| disa\n| disassemble\n| dj\n| djump\n| dli\n| dlist\n| dl\n| doaut\n| doau\n| do\n| dp\n| dr\n| drop\n| ds\n| dsearch\n| dsp\n| dsplit\n| e\n| edit\n| earlier\n| ea\n| echoc\n| echoconsole\n| echoe\n| echoerr\n| echom\n| echomsg\n| echon\n| ec\n| el\n| else\n| elseif?\n| em\n| emenu\n| en\n| endif\n| enddef\n| endf\n| endfunction\n| endfor?\n| endt\n| endtry\n| endw\n| endwhile\n| enew?\n| eval\n| exit?\n| export\n| exp\n| exu\n| exusage\n| ex\n| f\n| file\n| files\n| filetype\n| filet\n| filt\n| filter\n| find?\n| fina\n| finally\n| fini\n| finish\n| fir\n| first\n| fix\n| fixdel\n| fo\n| fold\n| foldc\n| foldclose\n| foldd\n| folddoopen\n| folddoc\n| folddoclosed\n| foldo\n| foldopen\n| for\n| fu\n| function\n| go\n| goto\n| gr\n| grep\n| grepa\n| grepadd\n| gui\n| gvim\n| g\n| h\n| help\n| ha\n| hardcopy\n| helpc\n| helpclose\n| helpf\n| helpfind\n| helpg\n| helpgrep\n| helpt\n| helptags\n| hide?\n| his\n| history\n| hi\n| iabc\n| iabclear\n| ia\n| if\n| ij\n| ijump\n| il\n| ilist\n| imapc\n| imapclear\n| import\n| imp\n| inor\n| interface\n| intro\n| in\n| is\n| isearch\n| isp\n| isplit\n| iuna\n| iunabbrev\n| i\n| j\n| join\n| ju\n| jumps\n| kee\n| keepmarks\n| keepalt\n| keepa\n| keepj\n| keepjumps\n| keepp\n| keeppatterns\n| k\n| lN\n| lNext\n| lNf\n| lNfile\n| l\n| list\n| la\n| last\n| lab\n| labove\n| lad\n| laddexpr\n| laddb\n| laddbuffer\n| laddf\n| laddfile\n| laf\n| lafter\n| lan\n| language\n| later\n| lat\n| lb\n| lbuffer\n| lbe\n| lbefore\n| lbel\n| lbelow\n| lbo\n| lbottom\n| lcd?\n| lch\n| lchdir\n| lcl\n| lclose\n| lcscope\n| lcs\n| ldo?\n| le\n| left\n| lefta\n| leftabove\n| leg\n| legacy\n| lex\n| lexpr\n| lf\n| lfile\n| lfdo\n| lfir\n| lfirst\n| lg\n| lgetfile\n| lgetb\n| lgetbuffer\n| lgete\n| lgetexpr\n| lgr\n| lgrep\n| lgrepa\n| lgrepadd\n| lh\n| lhelpgrep\n| lhi\n| lhistory\n| lla\n| llast\n| lli\n| llist\n| ll\n| lmake?\n| lmapc\n| lmapclear\n| lma\n| lne\n| lnext\n| lnew\n| lnewer\n| lnf\n| lnfile\n| lo\n| loadview\n| loadkeymap\n| loadk\n| loc\n| lockmarks\n| lockv\n| lockvar\n| lol\n| lolder\n| lop\n| lopen\n| lp\n| lprevious\n| lpf\n| lpfile\n| lr\n| lrewind\n| ls\n| lt\n| ltag\n| luado\n| luafile\n| lua\n| lv\n| lvimgrep\n| lvimgrepa\n| lvimgrepadd\n| lw\n| lwindow\n| m\n| move\n| ma\n| mark\n| make?\n| marks\n| mat\n| match\n| menut\n| menutranslate\n| mes\n| messages\n| mk\n| mkexrc\n| mks\n| mksession\n| mksp\n| mkspell\n| mkv\n| mkvimrc\n| mkview?\n| mode?\n| mz\n| mzscheme\n| mzf\n| mzfile\n| n\n| next\n| nb\n| nbkey\n| nbc\n| nbclose\n| nbs\n| nbstart\n| new\n| nmapc\n| nmapclear\n| noautocmd\n| noa\n| noh\n| nohlsearch\n| nore\n| nor\n| nos\n| noswapfile\n| nu\n| number\n| o\n| open\n| ol\n| oldfiles\n| omapc\n| omapclear\n| on\n| only\n| opt\n| options\n| ownsyntax\n| p\n| print\n| pa\n| packadd\n| packl\n| packloadall\n| pc\n| pclose\n| pe\n| perl\n| ped\n| pedit\n| perldo?\n| pop?\n| popup?\n| pp\n| ppop\n| pre\n| preserve\n| prev\n| previous\n| prof\n| profile\n| profd\n| profdel\n| promptf\n| promptfind\n| promptr\n| promptrepl\n| pro\n| ps\n| psearch\n| ptN\n| ptNext\n| ptag?\n| ptf\n| ptfirst\n| ptj\n| ptjump\n| ptl\n| ptlast\n| ptn\n| ptnext\n| ptp\n| ptprevious\n| ptr\n| ptrewind\n| pts\n| ptselect\n| put?\n| pwd?\n| py3do\n| py3f\n| py3file\n| py3\n| py\n| python\n| pydo\n| pyf\n| pyfile\n| python3\n| pythonx\n| pyxdo\n| pyxfile\n| pyx\n| q\n| quit\n| qa\n| qall\n| quita\n| quitall\n| r\n| read\n| rec\n| recover\n| redo?\n| redir?\n| redr\n| redraw\n| redraws\n| redrawstatus\n| redrawt\n| redrawtabline\n| reg\n| registers\n| res\n| resize\n| ret\n| retab\n| retu\n| return\n| rew\n| rewind\n| ri\n| right\n| rightb\n| rightbelow\n| ru\n| runtime\n| ruby?\n| rubydo?\n| rubyf\n| rubyfile\n| rundo\n| rv\n| rviminfo\n| sIc\n| sIe\n| sIg\n| sIl\n| sIn\n| sIp\n| sIr\n| sI\n| sN\n| sNext\n| sa\n| sargument\n| sall?\n| san\n| sandbox\n| sav\n| saveas\n| sbN\n| sbNext\n| sb\n| sbuffer\n| sba\n| sball\n| sbf\n| sbfirst\n| sbl\n| sblast\n| sbm\n| sbmodified\n| sbn\n| sbnext\n| sbp\n| sbprevious\n| sbr\n| sbrewind\n| scI\n| sce\n| scg\n| sci\n| scl\n| scp\n| scr\n| scriptnames\n| scripte\n| scriptencoding\n| scriptv\n| scriptversion\n| scscope\n| scs\n| sc\n| set?\n| setf\n| setfiletype\n| setg\n| setglobal\n| setl\n| setlocal\n| sf\n| sfind\n| sfir\n| sfirst\n| sgI\n| sgc\n| sge\n| sgi\n| sgl\n| sgn\n| sgp\n| sgr\n| sg\n| sh\n| shell\n| sic\n| sie\n| sign\n| sig\n| sil\n| silent\n| sim\n| simalt\n| sin\n| sip\n| sir\n| si\n| sl\n| sleep\n| sla\n| slast\n| sm\n| smagic\n| sm\n| smap\n| smenu\n| sme\n| smile\n| sn\n| snext\n| sno\n| snomagic\n| snoremenu\n| snoreme\n| so\n| source\n| sort?\n| sp\n| split\n| spe\n| spellgood\n| spelld\n| spelldump\n| spelli\n| spellinfo\n| spellr\n| spellrare\n| spellr\n| spellrepall\n| spellr\n| spellrrare\n| spellu\n| spellundo\n| spellw\n| spellwrong\n| spr\n| sprevious\n| srI\n| src\n| sre\n| srewind\n| srg\n| sri\n| srl\n| srn\n| srp\n| sr\n| st\n| stop\n| stag?\n| star\n| startinsert\n| startg\n| startgreplace\n| startr\n| startreplace\n| stj\n| stjump\n| stopi\n| stopinsert\n| sts\n| stselect\n| substitutepattern\n| substituterepeat\n| sun\n| sunhide\n| sunmenu\n| sunme\n| sus\n| suspend\n| sv\n| sview\n| sw\n| swapname\n| syncbind\n| sync\n| syntime\n| syn\n| sy\n| tN\n| tNext\n| tag?\n| tabN\n| tabNext\n| tabc\n| tabclose\n| tabdo?\n| tabe\n| tabedit\n| tabf\n| tabfind\n| tabfir\n| tabfirst\n| tabl\n| tablast\n| tabm\n| tabmove\n| tabn\n| tabnext\n| tabnew\n| tabo\n| tabonly\n| tabp\n| tabprevious\n| tabr\n| tabrewind\n| tabs\n| tab\n| tags\n| tcl?\n| tcd\n| tch\n| tchdir\n| tcldo?\n| tclf\n| tclfile\n| te\n| tearoff\n| ter\n| terminal\n| tf\n| tfirst\n| th\n| throw\n| tj\n| tjump\n| tl\n| tlast\n| tlmenu\n| tlm\n| tlnoremenu\n| tln\n| tlunmenu\n| tlu\n| tm\n| tmenu\n| tmap?\n| tmapc\n| tmapclear\n| tn\n| tnext\n| tno\n| tnoremap\n| to\n| topleft\n| tp\n| tprevious\n| tr\n| trewind\n| try\n| ts\n| tselect\n| tu\n| tunmenu\n| tunmap?\n| type\n| t\n| u\n| undo\n| una\n| unabbreviate\n| undoj\n| undojoin\n| undol\n| undolist\n| unh\n| unhide\n| unlo\n| unlockvar\n| unl\n| uns\n| unsilent\n| up\n| update\n| var\n| ve\n| version\n| verb\n| verbose\n| vert\n| vertical\n| vi\n| visual\n| view?\n| vim9\n| vim9cmd\n| vim9s\n| vim9script\n| vim\n| vimgrep\n| vimgrepa\n| vimgrepadd\n| viu\n| viusage\n| vmapc\n| vmapclear\n| vnew?\n| vs\n| vsplit\n| v\n| wN\n| wNext\n| w\n| write\n| wa\n| wall\n| wh\n| while\n| win\n| winsize\n| winc\n| wincmd\n| windo\n| winp\n| winpos\n| wn\n| wnext\n| wp\n| wprevious\n| wqa\n| wqall\n| wq\n| wundo\n| wv\n| wviminfo\n| x\n| xit\n| xa\n| xall\n| xmapc\n| xmapclear\n| xmenu\n| xme\n| xnoremenu\n| xnoreme\n| xprop\n| xr\n| xrestore\n| xunmenu\n| xunme\n| xwininfo\n| y\n| yank\n) \\b" 1367 | }, 1368 | "vimErrSetting": { 1369 | "name": "invalid.deprecated.legacy-setting.viml", 1370 | "match": "(?x) \\b\n( autoprint\n| beautify\n| bioskey\n| biosk\n| conskey\n| consk\n| flash\n| graphic\n| hardtabs\n| ht\n| mesg\n| noautoprint\n| nobeautify\n| nobioskey\n| nobiosk\n| noconskey\n| noconsk\n| noflash\n| nographic\n| nohardtabs\n| nomesg\n| nonovice\n| noopen\n| nooptimize\n| noop\n| noredraw\n| noslowopen\n| noslow\n| nosourceany\n| novice\n| now1200\n| now300\n| now9600\n| open\n| optimize\n| op\n| redraw\n| slowopen\n| slow\n| sourceany\n| w1200\n| w300\n| w9600\n) \\b" 1371 | }, 1372 | "vimFTCmd": { 1373 | "name": "support.function.vimFTCmd.viml", 1374 | "match": "(?x) \\b\n( filet\n| filetype\n) \\b" 1375 | }, 1376 | "vimFTOption": { 1377 | "name": "support.function.vimFTOption.viml", 1378 | "match": "(?x) \\b\n( detect\n| indent\n| off\n| on\n| plugin\n) \\b" 1379 | }, 1380 | "vimFgBgAttrib": { 1381 | "name": "support.constant.attribute.viml", 1382 | "match": "(?x) \\b\n( background\n| bg\n| fg\n| foreground\n| none\n) \\b" 1383 | }, 1384 | "vimFuncKey": { 1385 | "name": "support.function.vimFuncKey.viml", 1386 | "match": "(?x) \\b\n( def\n| fu\n| function\n) \\b" 1387 | }, 1388 | "vimFuncName": { 1389 | "name": "support.function.viml", 1390 | "match": "(?x) \\b\n( abs\n| acos\n| add\n| and\n| appendbufline\n| append\n| argc\n| argidx\n| arglistid\n| argv\n| asin\n| assert_beeps\n| assert_equalfile\n| assert_equal\n| assert_exception\n| assert_fails\n| assert_false\n| assert_inrange\n| assert_match\n| assert_nobeep\n| assert_notequal\n| assert_notmatch\n| assert_report\n| assert_true\n| atan2\n| atan\n| balloon_gettext\n| balloon_show\n| balloon_split\n| browsedir\n| browse\n| bufadd\n| bufexists\n| buflisted\n| bufloaded\n| bufload\n| bufname\n| bufnr\n| bufwinid\n| bufwinnr\n| byte2line\n| byteidxcomp\n| byteidx\n| call\n| ceil\n| ch_canread\n| ch_close_in\n| ch_close\n| ch_evalexpr\n| ch_evalraw\n| ch_getbufnr\n| ch_getjob\n| ch_info\n| ch_logfile\n| ch_log\n| ch_open\n| ch_readblob\n| ch_readraw\n| ch_read\n| ch_sendexpr\n| ch_sendraw\n| ch_setoptions\n| ch_status\n| changenr\n| char2nr\n| charclass\n| charcol\n| charidx\n| chdir\n| cindent\n| clearmatches\n| col\n| complete_add\n| complete_check\n| complete_info\n| complete\n| confirm\n| copy\n| cosh\n| cos\n| count\n| cscope_connection\n| cursor\n| debugbreak\n| deepcopy\n| deletebufline\n| delete\n| did_filetype\n| diff_filler\n| diff_hlID\n| echoraw\n| empty\n| environ\n| escape\n| eval\n| eventhandler\n| executable\n| execute\n| exepath\n| exists\n| expandcmd\n| expand\n| exp\n| extendnew\n| extend\n| feedkeys\n| filereadable\n| filewritable\n| filter\n| finddir\n| findfile\n| flattennew\n| flatten\n| float2nr\n| floor\n| fmod\n| fnameescape\n| fnamemodify\n| foldclosedend\n| foldclosed\n| foldlevel\n| foldtextresult\n| foldtext\n| foreground\n| fullcommand\n| funcref\n| function\n| garbagecollect\n| getbufinfo\n| getbufline\n| getbufvar\n| getchangelist\n| getcharmod\n| getcharpos\n| getcharsearch\n| getchar\n| getcmdline\n| getcmdpos\n| getcmdtype\n| getcmdwintype\n| getcompletion\n| getcurpos\n| getcursorcharpos\n| getcwd\n| getenv\n| getfontname\n| getfperm\n| getfsize\n| getftime\n| getftype\n| getimstatus\n| getjumplist\n| getline\n| getloclist\n| getmarklist\n| getmatches\n| getmousepos\n| getpid\n| getpos\n| getqflist\n| getreginfo\n| getregtype\n| getreg\n| gettabinfo\n| gettabvar\n| gettabwinvar\n| gettagstack\n| gettext\n| getwininfo\n| getwinposx\n| getwinposy\n| getwinpos\n| getwinvar\n| get\n| glob2regpat\n| globpath\n| glob\n| has_key\n| haslocaldir\n| hasmapto\n| has\n| histadd\n| histdel\n| histget\n| histnr\n| hlID\n| hlexists\n| hostname\n| iconv\n| indent\n| index\n| inputdialog\n| inputlist\n| inputrestore\n| inputsave\n| inputsecret\n| input\n| insert\n| interrupt\n| invert\n| isdirectory\n| isinf\n| islocked\n| isnan\n| items\n| job_getchannel\n| job_info\n| job_setoptions\n| job_start\n| job_status\n| job_stop\n| join\n| js_decode\n| js_encode\n| json_decode\n| json_encode\n| keys\n| len\n| libcallnr\n| libcall\n| line2byte\n| line\n| lispindent\n| list2str\n| listener_add\n| listener_flush\n| listener_remove\n| localtime\n| log10\n| log\n| luaeval\n| maparg\n| mapcheck\n| mapnew\n| mapset\n| map\n| matchaddpos\n| matchadd\n| matcharg\n| matchdelete\n| matchend\n| matchfuzzypos\n| matchfuzzy\n| matchlist\n| matchstrpos\n| matchstr\n| match\n| max\n| menu_info\n| min\n| mkdir\n| mode\n| mzeval\n| nextnonblank\n| nr2char\n| or\n| pathshorten\n| perleval\n| popup_atcursor\n| popup_beval\n| popup_clear\n| popup_close\n| popup_create\n| popup_dialog\n| popup_filter_menu\n| popup_filter_yesno\n| popup_findinfo\n| popup_findpreview\n| popup_getoptions\n| popup_getpos\n| popup_hide\n| popup_list\n| popup_locate\n| popup_menu\n| popup_move\n| popup_notification\n| popup_setoptions\n| popup_settext\n| popup_show\n| pow\n| prevnonblank\n| printf\n| prompt_getprompt\n| prompt_setcallback\n| prompt_setinterrupt\n| prompt_setprompt\n| prop_add\n| prop_clear\n| prop_find\n| prop_list\n| prop_remove\n| prop_type_add\n| prop_type_change\n| prop_type_delete\n| prop_type_get\n| prop_type_list\n| pum_getpos\n| pumvisible\n| py3eval\n| pyeval\n| pyxeval\n| rand\n| range\n| readblob\n| readdirex\n| readdir\n| readfile\n| reduce\n| reg_executing\n| reg_recording\n| reltimefloat\n| reltimestr\n| reltime\n| remote_expr\n| remote_foreground\n| remote_peek\n| remote_read\n| remote_send\n| remote_startserver\n| remove\n| rename\n| repeat\n| resolve\n| reverse\n| round\n| rubyeval\n| screenattr\n| screenchars\n| screenchar\n| screencol\n| screenpos\n| screenrow\n| screenstring\n| searchcount\n| searchdecl\n| searchpairpos\n| searchpair\n| searchpos\n| search\n| server2client\n| serverlist\n| setbufline\n| setbufvar\n| setcellwidths\n| setcharpos\n| setcharsearch\n| setcmdpos\n| setcursorcharpos\n| setenv\n| setfperm\n| setline\n| setloclist\n| setmatches\n| setpos\n| setqflist\n| setreg\n| settabvar\n| settabwinvar\n| settagstack\n| setwinvar\n| sha256\n| shellescape\n| shiftwidth\n| sign_define\n| sign_getdefined\n| sign_getplaced\n| sign_jump\n| sign_placelist\n| sign_place\n| sign_undefine\n| sign_unplacelist\n| sign_unplace\n| simplify\n| sinh\n| sin\n| slice\n| sort\n| sound_clear\n| sound_playevent\n| sound_playfile\n| sound_stop\n| soundfold\n| spellbadword\n| spellsuggest\n| split\n| sqrt\n| srand\n| state\n| str2float\n| str2list\n| str2nr\n| strcharlen\n| strcharpart\n| strchars\n| strdisplaywidth\n| strftime\n| strgetchar\n| stridx\n| string\n| strlen\n| strpart\n| strptime\n| strridx\n| strtrans\n| strwidth\n| submatch\n| substitute\n| swapinfo\n| swapname\n| synIDattr\n| synIDtrans\n| synID\n| synconcealed\n| synstack\n| systemlist\n| system\n| tabpagebuflist\n| tabpagenr\n| tabpagewinnr\n| tagfiles\n| taglist\n| tanh\n| tan\n| tempname\n| term_dumpdiff\n| term_dumpload\n| term_dumpwrite\n| term_getaltscreen\n| term_getansicolors\n| term_getattr\n| term_getcursor\n| term_getjob\n| term_getline\n| term_getscrolled\n| term_getsize\n| term_getstatus\n| term_gettitle\n| term_gettty\n| term_list\n| term_scrape\n| term_sendkeys\n| term_setansicolors\n| term_setapi\n| term_setkill\n| term_setrestore\n| term_setsize\n| term_start\n| term_wait\n| terminalprops\n| test_alloc_fail\n| test_autochdir\n| test_feedinput\n| test_garbagecollect_now\n| test_garbagecollect_soon\n| test_getvalue\n| test_ignore_error\n| test_null_blob\n| test_null_channel\n| test_null_dict\n| test_null_function\n| test_null_job\n| test_null_list\n| test_null_partial\n| test_null_string\n| test_option_not_set\n| test_override\n| test_refcount\n| test_scrollbar\n| test_setmouse\n| test_settime\n| test_srand_seed\n| test_unknown\n| test_void\n| timer_info\n| timer_pause\n| timer_start\n| timer_stopall\n| timer_stop\n| tolower\n| toupper\n| trim\n| trunc\n| tr\n| typename\n| type\n| undofile\n| undotree\n| uniq\n| values\n| virtcol\n| visualmode\n| wildmenumode\n| win_execute\n| win_findbuf\n| win_getid\n| win_gettype\n| win_gotoid\n| win_id2tabwin\n| win_id2win\n| win_screenpos\n| win_splitmove\n| winbufnr\n| wincol\n| windowsversion\n| winheight\n| winlayout\n| winline\n| winnr\n| winrestcmd\n| winrestview\n| winsaveview\n| winwidth\n| wordcount\n| writefile\n| xor\n) \\b" 1391 | }, 1392 | "vimGroup": { 1393 | "name": "support.type.group.viml", 1394 | "match": "(?xi) \\b\n( Boolean\n| Character\n| Comment\n| Conditional\n| Constant\n| Debug\n| Define\n| Delimiter\n| Error\n| Exception\n| Float\n| Function\n| Identifier\n| Ignore\n| Include\n| Keyword\n| Label\n| Macro\n| Number\n| Operator\n| PreCondit\n| PreProc\n| Repeat\n| SpecialChar\n| SpecialComment\n| Special\n| Statement\n| StorageClass\n| String\n| Structure\n| Tag\n| Todo\n| Typedef\n| Type\n| Underlined\n) \\b" 1395 | }, 1396 | "vimGroupSpecial": { 1397 | "name": "support.function.vimGroupSpecial.viml", 1398 | "match": "(?x) \\b\n( ALLBUT\n| ALL\n| CONTAINED\n| TOP\n) \\b" 1399 | }, 1400 | "vimHLGroup": { 1401 | "name": "support.type.highlight-group.viml", 1402 | "match": "(?xi) \\b\n( ColorColumn\n| CursorColumn\n| CursorIM\n| CursorLineNr\n| CursorLine\n| Cursor\n| DiffAdd\n| DiffChange\n| DiffDelete\n| DiffText\n| Directory\n| EndOfBuffer\n| ErrorMsg\n| FoldColumn\n| Folded\n| IncSearch\n| LineNrAbove\n| LineNrBelow\n| LineNr\n| MatchParen\n| Menu\n| ModeMsg\n| MoreMsg\n| NonText\n| Normal\n| PmenuSbar\n| PmenuSel\n| PmenuThumb\n| Pmenu\n| Question\n| QuickFixLine\n| Scrollbar\n| Search\n| SignColumn\n| SpecialKey\n| SpellBad\n| SpellCap\n| SpellLocal\n| SpellRare\n| StatusLineNC\n| StatusLineTerm\n| StatusLine\n| TabLineFill\n| TabLineSel\n| TabLine\n| Terminal\n| Title\n| Tooltip\n| VertSplit\n| VisualNOS\n| Visual\n| WarningMsg\n| WildMenu\n) \\b" 1403 | }, 1404 | "vimHiAttrib": { 1405 | "name": "support.function.vimHiAttrib.viml", 1406 | "match": "(?x) \\b\n( bold\n| inverse\n| italic\n| nocombine\n| none\n| reverse\n| standout\n| strikethrough\n| undercurl\n| underline\n) \\b" 1407 | }, 1408 | "vimHiClear": { 1409 | "name": "support.function.vimHiClear.viml", 1410 | "match": "(?x) \\b\n( clear\n) \\b" 1411 | }, 1412 | "vimHiCtermColor": { 1413 | "name": "support.constant.colour.color.$1.viml", 1414 | "match": "(?x) \\b\n( black\n| blue\n| brown\n| cyan\n| darkblue\n| darkcyan\n| darkgray\n| darkgreen\n| darkgrey\n| darkmagenta\n| darkred\n| darkyellow\n| gray\n| green\n| grey40\n| grey50\n| grey90\n| grey\n| lightblue\n| lightcyan\n| lightgray\n| lightgreen\n| lightgrey\n| lightmagenta\n| lightred\n| lightyellow\n| magenta\n| red\n| seagreen\n| white\n| yellow\n) \\b" 1415 | }, 1416 | "vimMapModKey": { 1417 | "name": "support.function.vimMapModKey.viml", 1418 | "match": "(?x) \\b\n( buffer\n| expr\n| leader\n| localleader\n| nowait\n| plug\n| script\n| sid\n| silent\n| unique\n) \\b" 1419 | }, 1420 | "vimOption": { 1421 | "name": "support.variable.option.viml", 1422 | "match": "(?x) \\b\n( acd\n| ai\n| akm\n| aleph\n| allowrevins\n| altkeymap\n| al\n| ambiwidth\n| ambw\n| antialias\n| anti\n| arabicshape\n| arabic\n| arab\n| ari\n| arshape\n| ar\n| asd\n| autochdir\n| autoindent\n| autoread\n| autoshelldir\n| autowriteall\n| autowrite\n| awa\n| aw\n| background\n| backspace\n| backupcopy\n| backupdir\n| backupext\n| backupskip\n| backup\n| balloondelay\n| balloonevalterm\n| ballooneval\n| balloonexpr\n| bdir\n| bdlay\n| belloff\n| bevalterm\n| beval\n| bexpr\n| bex\n| bg\n| bh\n| binary\n| bin\n| bkc\n| bk\n| bl\n| bomb\n| bo\n| breakat\n| breakindentopt\n| breakindent\n| briopt\n| bri\n| brk\n| browsedir\n| bsdir\n| bsk\n| bs\n| bt\n| bufhidden\n| buflisted\n| buftype\n| casemap\n| cb\n| ccv\n| cc\n| cdpath\n| cd\n| cedit\n| cfu\n| cf\n| charconvert\n| ch\n| cindent\n| cinkeys\n| cink\n| cinoptions\n| cino\n| cinwords\n| cinw\n| cin\n| ci\n| clipboard\n| cmdheight\n| cmdwinheight\n| cmp\n| cms\n| cm\n| cocu\n| cole\n| colorcolumn\n| columns\n| commentstring\n| comments\n| compatible\n| completefunc\n| completeopt\n| completepopup\n| completeslash\n| complete\n| com\n| confirm\n| copyindent\n| cot\n| co\n| cpoptions\n| cpo\n| cpp\n| cpt\n| cp\n| crb\n| cryptmethod\n| cscopepathcomp\n| cscopeprg\n| cscopequickfix\n| cscoperelative\n| cscopetagorder\n| cscopetag\n| cscopeverbose\n| csl\n| cspc\n| csprg\n| csqf\n| csre\n| csto\n| cst\n| csverb\n| cuc\n| culopt\n| cul\n| cursorbind\n| cursorcolumn\n| cursorlineopt\n| cursorline\n| cursor\n| cwh\n| debug\n| deco\n| define\n| def\n| delcombine\n| dex\n| dg\n| dictionary\n| dict\n| diffexpr\n| diffopt\n| diff\n| digraph\n| dip\n| directory\n| dir\n| display\n| dy\n| eadirection\n| ead\n| ea\n| eb\n| edcompatible\n| ed\n| efm\n| ef\n| ei\n| ek\n| emoji\n| emo\n| encoding\n| enc\n| endofline\n| eol\n| ep\n| equalalways\n| equalprg\n| errorbells\n| errorfile\n| errorformat\n| esckeys\n| et\n| eventignore\n| expandtab\n| exrc\n| ex\n| fcl\n| fcs\n| fdc\n| fde\n| fdi\n| fdls\n| fdl\n| fdm\n| fdn\n| fdo\n| fdt\n| fencs\n| fenc\n| fen\n| fex\n| ffs\n| ff\n| fic\n| fileencodings\n| fileencoding\n| fileformats\n| fileformat\n| fileignorecase\n| filetype\n| fillchars\n| fixendofline\n| fixeol\n| fkmap\n| fk\n| flp\n| fml\n| fmr\n| foldclose\n| foldcolumn\n| foldenable\n| foldexpr\n| foldignore\n| foldlevelstart\n| foldlevel\n| foldmarker\n| foldmethod\n| foldminlines\n| foldnestmax\n| foldopen\n| foldtext\n| formatexpr\n| formatlistpat\n| formatoptions\n| formatprg\n| fo\n| fp\n| fsync\n| fs\n| ft\n| gcr\n| gdefault\n| gd\n| gfm\n| gfn\n| gfs\n| gfw\n| ghr\n| go\n| gp\n| grepformat\n| grepprg\n| gtl\n| gtt\n| guicursor\n| guifontset\n| guifontwide\n| guifont\n| guiheadroom\n| guioptions\n| guipty\n| guitablabel\n| guitabtooltip\n| helpfile\n| helpheight\n| helplang\n| hf\n| hh\n| hidden\n| hid\n| highlight\n| history\n| hi\n| hkmapp\n| hkmap\n| hkp\n| hk\n| hlg\n| hlsearch\n| hls\n| hl\n| iconstring\n| icon\n| ic\n| ignorecase\n| imactivatefunc\n| imactivatekey\n| imaf\n| imak\n| imcmdline\n| imc\n| imdisable\n| imd\n| iminsert\n| imi\n| imsearch\n| imsf\n| imstatusfunc\n| imstyle\n| imst\n| ims\n| im\n| includeexpr\n| include\n| incsearch\n| inc\n| indentexpr\n| indentkeys\n| inde\n| indk\n| inex\n| infercase\n| inf\n| insertmode\n| invacd\n| invai\n| invakm\n| invallowrevins\n| invaltkeymap\n| invantialias\n| invanti\n| invarabicshape\n| invarabic\n| invarab\n| invari\n| invarshape\n| invar\n| invasd\n| invautochdir\n| invautoindent\n| invautoread\n| invautoshelldir\n| invautowriteall\n| invautowrite\n| invawa\n| invaw\n| invbackup\n| invballoonevalterm\n| invballooneval\n| invbevalterm\n| invbeval\n| invbinary\n| invbin\n| invbk\n| invbl\n| invbomb\n| invbreakindent\n| invbri\n| invbuflisted\n| invcf\n| invcindent\n| invcin\n| invci\n| invcompatible\n| invconfirm\n| invcopyindent\n| invcp\n| invcrb\n| invcscoperelative\n| invcscopetag\n| invcscopeverbose\n| invcsre\n| invcst\n| invcsverb\n| invcuc\n| invcul\n| invcursorbind\n| invcursorcolumn\n| invcursorline\n| invdeco\n| invdelcombine\n| invdg\n| invdiff\n| invdigraph\n| invea\n| inveb\n| invedcompatible\n| inved\n| invek\n| invemoji\n| invemo\n| invendofline\n| inveol\n| invequalalways\n| inverrorbells\n| invesckeys\n| invet\n| invexpandtab\n| invexrc\n| invex\n| invfen\n| invfic\n| invfileignorecase\n| invfixendofline\n| invfixeol\n| invfkmap\n| invfk\n| invfoldenable\n| invfsync\n| invfs\n| invgdefault\n| invgd\n| invguipty\n| invhidden\n| invhid\n| invhkmapp\n| invhkmap\n| invhkp\n| invhk\n| invhlsearch\n| invhls\n| invicon\n| invic\n| invignorecase\n| invimcmdline\n| invimc\n| invimdisable\n| invimd\n| invim\n| invincsearch\n| invinfercase\n| invinf\n| invinsertmode\n| invis\n| invjoinspaces\n| invjs\n| invlangnoremap\n| invlangremap\n| invlazyredraw\n| invlbr\n| invlinebreak\n| invlisp\n| invlist\n| invlnr\n| invloadplugins\n| invlpl\n| invlrm\n| invlz\n| invmacatsui\n| invmagic\n| invma\n| invmh\n| invmle\n| invml\n| invmodelineexpr\n| invmodeline\n| invmodifiable\n| invmodified\n| invmod\n| invmore\n| invmousefocus\n| invmousef\n| invmousehide\n| invnumber\n| invnu\n| invodev\n| invopendevice\n| invpaste\n| invpi\n| invpreserveindent\n| invpreviewwindow\n| invprompt\n| invpvw\n| invreadonly\n| invrelativenumber\n| invremap\n| invrestorescreen\n| invrevins\n| invrightleft\n| invri\n| invrl\n| invrnu\n| invro\n| invrs\n| invruler\n| invru\n| invsb\n| invscb\n| invscf\n| invscrollbind\n| invscrollfocus\n| invscs\n| invsc\n| invsecure\n| invsft\n| invshellslash\n| invshelltemp\n| invshiftround\n| invshortname\n| invshowcmd\n| invshowfulltag\n| invshowmatch\n| invshowmode\n| invsi\n| invsmartcase\n| invsmartindent\n| invsmarttab\n| invsmd\n| invsm\n| invsn\n| invsol\n| invspell\n| invsplitbelow\n| invsplitright\n| invspr\n| invsr\n| invssl\n| invstartofline\n| invsta\n| invstmp\n| invswapfile\n| invswf\n| invtagbsearch\n| invtagrelative\n| invtagstack\n| invta\n| invtbidi\n| invtbi\n| invtbs\n| invtermbidi\n| invterse\n| invtextauto\n| invtextmode\n| invtf\n| invtgst\n| invtildeop\n| invtimeout\n| invtitle\n| invtop\n| invto\n| invtr\n| invttimeout\n| invttybuiltin\n| invttyfast\n| invtx\n| invudf\n| invundofile\n| invvb\n| invvisualbell\n| invwarn\n| invwa\n| invwb\n| invweirdinvert\n| invwfh\n| invwfw\n| invwic\n| invwildignorecase\n| invwildmenu\n| invwinfixheight\n| invwinfixwidth\n| invwiv\n| invwmnu\n| invwrapscan\n| invwrap\n| invwriteany\n| invwritebackup\n| invwrite\n| invws\n| isfname\n| isf\n| isident\n| isi\n| iskeyword\n| isk\n| isprint\n| isp\n| is\n| joinspaces\n| js\n| keymap\n| keymodel\n| keywordprg\n| key\n| kmp\n| km\n| kp\n| langmap\n| langmenu\n| langnoremap\n| langremap\n| laststatus\n| lazyredraw\n| lbr\n| lcs\n| level\n| linebreak\n| linespace\n| lines\n| lispwords\n| lisp\n| listchars\n| list\n| lmap\n| lm\n| lnr\n| loadplugins\n| lpl\n| lrm\n| lsp\n| ls\n| luadll\n| lw\n| lz\n| macatsui\n| magic\n| makeef\n| makeencoding\n| makeprg\n| matchpairs\n| matchtime\n| mat\n| maxcombine\n| maxfuncdepth\n| maxmapdepth\n| maxmempattern\n| maxmemtot\n| maxmem\n| ma\n| mco\n| mef\n| menc\n| menuitems\n| mfd\n| mh\n| mis\n| mkspellmem\n| mle\n| mls\n| ml\n| mmd\n| mmp\n| mmt\n| mm\n| modelineexpr\n| modelines\n| modeline\n| modifiable\n| modified\n| mod\n| more\n| mousefocus\n| mousef\n| mousehide\n| mousemodel\n| mousem\n| mouseshape\n| mouses\n| mousetime\n| mouset\n| mouse\n| mps\n| mp\n| msm\n| mzquantum\n| mzq\n| mzschemedll\n| mzschemegcdll\n| nf\n| noacd\n| noai\n| noakm\n| noallowrevins\n| noaltkeymap\n| noantialias\n| noanti\n| noarabicshape\n| noarabic\n| noarab\n| noari\n| noarshape\n| noar\n| noasd\n| noautochdir\n| noautoindent\n| noautoread\n| noautoshelldir\n| noautowriteall\n| noautowrite\n| noawa\n| noaw\n| nobackup\n| noballoonevalterm\n| noballooneval\n| nobevalterm\n| nobeval\n| nobinary\n| nobin\n| nobk\n| nobl\n| nobomb\n| nobreakindent\n| nobri\n| nobuflisted\n| nocf\n| nocindent\n| nocin\n| noci\n| nocompatible\n| noconfirm\n| nocopyindent\n| nocp\n| nocrb\n| nocscoperelative\n| nocscopetag\n| nocscopeverbose\n| nocsre\n| nocst\n| nocsverb\n| nocuc\n| nocul\n| nocursorbind\n| nocursorcolumn\n| nocursorline\n| nodeco\n| nodelcombine\n| nodg\n| nodiff\n| nodigraph\n| noea\n| noeb\n| noedcompatible\n| noed\n| noek\n| noemoji\n| noemo\n| noendofline\n| noeol\n| noequalalways\n| noerrorbells\n| noesckeys\n| noet\n| noexpandtab\n| noexrc\n| noex\n| nofen\n| nofic\n| nofileignorecase\n| nofixendofline\n| nofixeol\n| nofkmap\n| nofk\n| nofoldenable\n| nofsync\n| nofs\n| nogdefault\n| nogd\n| noguipty\n| nohidden\n| nohid\n| nohkmapp\n| nohkmap\n| nohkp\n| nohk\n| nohlsearch\n| nohls\n| noicon\n| noic\n| noignorecase\n| noimcmdline\n| noimc\n| noimdisable\n| noimd\n| noim\n| noincsearch\n| noinfercase\n| noinf\n| noinsertmode\n| nois\n| nojoinspaces\n| nojs\n| nolangnoremap\n| nolangremap\n| nolazyredraw\n| nolbr\n| nolinebreak\n| nolisp\n| nolist\n| nolnr\n| noloadplugins\n| nolpl\n| nolrm\n| nolz\n| nomacatsui\n| nomagic\n| noma\n| nomh\n| nomle\n| noml\n| nomodelineexpr\n| nomodeline\n| nomodifiable\n| nomodified\n| nomod\n| nomore\n| nomousefocus\n| nomousef\n| nomousehide\n| nonumber\n| nonu\n| noodev\n| noopendevice\n| nopaste\n| nopi\n| nopreserveindent\n| nopreviewwindow\n| noprompt\n| nopvw\n| noreadonly\n| norelativenumber\n| noremap\n| norestorescreen\n| norevins\n| norightleft\n| nori\n| norl\n| nornu\n| noro\n| nors\n| noruler\n| noru\n| nosb\n| noscb\n| noscf\n| noscrollbind\n| noscrollfocus\n| noscs\n| nosc\n| nosecure\n| nosft\n| noshellslash\n| noshelltemp\n| noshiftround\n| noshortname\n| noshowcmd\n| noshowfulltag\n| noshowmatch\n| noshowmode\n| nosi\n| nosmartcase\n| nosmartindent\n| nosmarttab\n| nosmd\n| nosm\n| nosn\n| nosol\n| nospell\n| nosplitbelow\n| nosplitright\n| nospr\n| nosr\n| nossl\n| nostartofline\n| nosta\n| nostmp\n| noswapfile\n| noswf\n| notagbsearch\n| notagrelative\n| notagstack\n| nota\n| notbidi\n| notbi\n| notbs\n| notermbidi\n| noterse\n| notextauto\n| notextmode\n| notf\n| notgst\n| notildeop\n| notimeout\n| notitle\n| notop\n| noto\n| notr\n| nottimeout\n| nottybuiltin\n| nottyfast\n| notx\n| noudf\n| noundofile\n| novb\n| novisualbell\n| nowarn\n| nowa\n| nowb\n| noweirdinvert\n| nowfh\n| nowfw\n| nowic\n| nowildignorecase\n| nowildmenu\n| nowinfixheight\n| nowinfixwidth\n| nowiv\n| nowmnu\n| nowrapscan\n| nowrap\n| nowriteany\n| nowritebackup\n| nowrite\n| nows\n| nrformats\n| numberwidth\n| number\n| nuw\n| nu\n| odev\n| oft\n| ofu\n| omnifunc\n| opendevice\n| operatorfunc\n| opfunc\n| osfiletype\n| packpath\n| paragraphs\n| para\n| pastetoggle\n| paste\n| patchexpr\n| patchmode\n| path\n| pa\n| pdev\n| penc\n| perldll\n| pexpr\n| pex\n| pfn\n| pheader\n| ph\n| pi\n| pmbcs\n| pmbfn\n| pm\n| popt\n| pp\n| preserveindent\n| previewheight\n| previewpopup\n| previewwindow\n| printdevice\n| printencoding\n| printexpr\n| printfont\n| printheader\n| printmbcharset\n| printmbfont\n| printoptions\n| prompt\n| pt\n| pumheight\n| pumwidth\n| pvh\n| pvp\n| pvw\n| pw\n| pythondll\n| pythonhome\n| pythonthreedll\n| pythonthreehome\n| pyxversion\n| pyx\n| qe\n| qftf\n| quickfixtextfunc\n| quoteescape\n| rdt\n| readonly\n| redrawtime\n| regexpengine\n| relativenumber\n| remap\n| renderoptions\n| report\n| restorescreen\n| revins\n| re\n| rightleftcmd\n| rightleft\n| ri\n| rlc\n| rl\n| rnu\n| rop\n| ro\n| rs\n| rtp\n| rubydll\n| ruf\n| rulerformat\n| ruler\n| runtimepath\n| ru\n| sbo\n| sbr\n| sb\n| scb\n| scf\n| scl\n| scrollbind\n| scrollfocus\n| scrolljump\n| scrolloff\n| scrollopt\n| scroll\n| scr\n| scs\n| sc\n| sections\n| sect\n| secure\n| selection\n| selectmode\n| sel\n| sessionoptions\n| sft\n| shcf\n| shellcmdflag\n| shellpipe\n| shellquote\n| shellredir\n| shellslash\n| shelltemp\n| shelltype\n| shellxescape\n| shellxquote\n| shell\n| shiftround\n| shiftwidth\n| shm\n| shortmess\n| shortname\n| showbreak\n| showcmd\n| showfulltag\n| showmatch\n| showmode\n| showtabline\n| shq\n| sh\n| sidescrolloff\n| sidescroll\n| signcolumn\n| siso\n| si\n| sj\n| slm\n| smartcase\n| smartindent\n| smarttab\n| smc\n| smd\n| sm\n| sn\n| softtabstop\n| sol\n| so\n| spc\n| spellcapcheck\n| spellfile\n| spelllang\n| spelloptions\n| spellsuggest\n| spell\n| spf\n| splitbelow\n| splitright\n| spl\n| spo\n| spr\n| sps\n| sp\n| srr\n| sr\n| ssl\n| ssop\n| ss\n| stal\n| startofline\n| statusline\n| sta\n| stl\n| stmp\n| sts\n| st\n| sua\n| suffixesadd\n| suffixes\n| su\n| swapfile\n| swapsync\n| swb\n| swf\n| switchbuf\n| sws\n| sw\n| sxe\n| sxq\n| synmaxcol\n| syntax\n| syn\n| t_8b\n| t_8f\n| t_8u\n| t_AB\n| t_AF\n| t_AL\n| t_AU\n| t_BD\n| t_BE\n| t_CS\n| t_CV\n| t_Ce\n| t_Co\n| t_Cs\n| t_DL\n| t_EC\n| t_EI\n| t_F1\n| t_F2\n| t_F3\n| t_F4\n| t_F5\n| t_F6\n| t_F7\n| t_F8\n| t_F9\n| t_GP\n| t_IE\n| t_IS\n| t_K1\n| t_K3\n| t_K4\n| t_K5\n| t_K6\n| t_K7\n| t_K8\n| t_K9\n| t_KA\n| t_KB\n| t_KC\n| t_KD\n| t_KE\n| t_KF\n| t_KG\n| t_KH\n| t_KI\n| t_KJ\n| t_KK\n| t_KL\n| t_PE\n| t_PS\n| t_RB\n| t_RC\n| t_RF\n| t_RI\n| t_RS\n| t_RT\n| t_RV\n| t_Ri\n| t_SC\n| t_SH\n| t_SI\n| t_SR\n| t_ST\n| t_Sb\n| t_Sf\n| t_Si\n| t_TE\n| t_TI\n| t_Te\n| t_Ts\n| t_VS\n| t_WP\n| t_WS\n| t_ZH\n| t_ZR\n| t_al\n| t_bc\n| t_cd\n| t_ce\n| t_cl\n| t_cm\n| t_cs\n| t_da\n| t_db\n| t_dl\n| t_fd\n| t_fe\n| t_fs\n| t_k1\n| t_k2\n| t_k3\n| t_k4\n| t_k5\n| t_k6\n| t_k7\n| t_k8\n| t_k9\n| t_kB\n| t_kD\n| t_kI\n| t_kN\n| t_kP\n| t_kb\n| t_kd\n| t_ke\n| t_kh\n| t_kl\n| t_kr\n| t_ks\n| t_ku\n| t_le\n| t_mb\n| t_md\n| t_me\n| t_mr\n| t_ms\n| t_nd\n| t_op\n| t_se\n| t_so\n| t_sr\n| t_te\n| t_ti\n| t_ts\n| t_u7\n| t_ue\n| t_us\n| t_ut\n| t_vb\n| t_ve\n| t_vi\n| t_vs\n| t_xn\n| t_xs\n| tabline\n| tabpagemax\n| tabstop\n| tagbsearch\n| tagcase\n| tagfunc\n| taglength\n| tagrelative\n| tagstack\n| tags\n| tag\n| tal\n| ta\n| tbidi\n| tbis\n| tbi\n| tbs\n| tb\n| tcldll\n| tc\n| tenc\n| termbidi\n| termencoding\n| termguicolors\n| termwinkey\n| termwinscroll\n| termwinsize\n| termwintype\n| term\n| terse\n| textauto\n| textmode\n| textwidth\n| tfu\n| tf\n| tgc\n| tgst\n| thesaurus\n| tildeop\n| timeoutlen\n| timeout\n| titlelen\n| titleold\n| titlestring\n| title\n| tl\n| tm\n| toolbariconsize\n| toolbar\n| top\n| to\n| tpm\n| tr\n| tsl\n| tsr\n| ts\n| ttimeoutlen\n| ttimeout\n| ttm\n| ttybuiltin\n| ttyfast\n| ttymouse\n| ttym\n| ttyscroll\n| ttytype\n| tty\n| twk\n| twsl\n| tws\n| twt\n| tw\n| tx\n| uc\n| udf\n| udir\n| ul\n| undodir\n| undofile\n| undolevels\n| undoreload\n| updatecount\n| updatetime\n| ur\n| ut\n| varsofttabstop\n| vartabstop\n| vbs\n| vb\n| vdir\n| verbosefile\n| verbose\n| ve\n| vfile\n| viewdir\n| viewoptions\n| vif\n| viminfofile\n| viminfo\n| virtualedit\n| visualbell\n| vi\n| vop\n| vsts\n| vts\n| wak\n| warn\n| wa\n| wb\n| wcm\n| wcr\n| wc\n| wd\n| weirdinvert\n| wfh\n| wfw\n| whichwrap\n| wh\n| wic\n| wig\n| wildcharm\n| wildchar\n| wildignorecase\n| wildignore\n| wildmenu\n| wildmode\n| wildoptions\n| wim\n| winaltkeys\n| wincolor\n| window\n| winfixheight\n| winfixwidth\n| winheight\n| winminheight\n| winminwidth\n| winptydll\n| winwidth\n| wiv\n| wiw\n| wi\n| wmh\n| wmnu\n| wmw\n| wm\n| wop\n| wrapmargin\n| wrapscan\n| wrap\n| writeany\n| writebackup\n| writedelay\n| write\n| ws\n| ww\n) \\b" 1423 | }, 1424 | "vimPattern": { 1425 | "name": "support.function.vimPattern.viml", 1426 | "match": "(?x) \\b\n( end\n| skip\n| start\n) \\b" 1427 | }, 1428 | "vimStdPlugin": { 1429 | "name": "support.class.stdplugin.viml", 1430 | "match": "(?x) \\b\n( Arguments\n| Asm\n| Break\n| Cfilter\n| Clear\n| Continue\n| DiffOrig\n| Evaluate\n| Finish\n| Gdb\n| Lfilter\n| Man\n| N\n| Next\n| Over\n| P\n| Print\n| Program\n| Run\n| Source\n| Step\n| Stop\n| S\n| TOhtml\n| TermdebugCommand\n| Termdebug\n| Winbar\n| XMLent\n| XMLns\n) \\b" 1431 | }, 1432 | "vimSynCase": { 1433 | "name": "support.function.vimSynCase.viml", 1434 | "match": "(?x) \\b\n( ignore\n| match\n) \\b" 1435 | }, 1436 | "vimSynType": { 1437 | "name": "support.function.vimSynType.viml", 1438 | "match": "(?x) \\b\n( case\n| clear\n| cluster\n| enable\n| include\n| iskeyword\n| keyword\n| list\n| manual\n| match\n| off\n| on\n| region\n| reset\n| sync\n) \\b" 1439 | }, 1440 | "vimSyncC": { 1441 | "name": "support.function.vimSyncC.viml", 1442 | "match": "(?x) \\b\n( ccomment\n| clear\n| fromstart\n) \\b" 1443 | }, 1444 | "vimSyncLinecont": { 1445 | "name": "support.function.vimSyncLinecont.viml", 1446 | "match": "(?x) \\b\n( linecont\n) \\b" 1447 | }, 1448 | "vimSyncMatch": { 1449 | "name": "support.function.vimSyncMatch.viml", 1450 | "match": "(?x) \\b\n( match\n) \\b" 1451 | }, 1452 | "vimSyncNone": { 1453 | "name": "support.function.vimSyncNone.viml", 1454 | "match": "(?x) \\b\n( NONE\n) \\b" 1455 | }, 1456 | "vimSyncRegion": { 1457 | "name": "support.function.vimSyncRegion.viml", 1458 | "match": "(?x) \\b\n( region\n) \\b" 1459 | }, 1460 | "vimUserAttrbCmplt": { 1461 | "name": "support.function.vimUserAttrbCmplt.viml", 1462 | "match": "(?x) \\b\n( augroup\n| behave\n| buffer\n| color\n| command\n| compiler\n| cscope\n| customlist\n| custom\n| dir\n| environment\n| event\n| expression\n| file_in_path\n| filetype\n| file\n| function\n| help\n| highlight\n| history\n| locale\n| mapping\n| menu\n| option\n| packadd\n| shellcmd\n| sign\n| syntax\n| syntime\n| tag_listfiles\n| tag\n| user\n| var\n) \\b" 1463 | }, 1464 | "vimUserAttrbKey": { 1465 | "name": "support.function.vimUserAttrbKey.viml", 1466 | "match": "(?x) \\b\n( bang?\n| bar\n| com\n| complete\n| cou\n| count\n| n\n| nargs\n| ra\n| range\n| re\n| register\n) \\b" 1467 | }, 1468 | "vimUserCommand": { 1469 | "name": "support.function.vimUserCommand.viml", 1470 | "match": "(?x) \\b\n( com\n| command\n) \\b" 1471 | } 1472 | } 1473 | } -------------------------------------------------------------------------------- /syntaxes/vroom.language-configuration.json: -------------------------------------------------------------------------------- 1 | { 2 | "brackets": [ 3 | ["{", "}"], 4 | ["[", "]"], 5 | ["(", ")"] 6 | ], 7 | "autoClosingPairs": [ 8 | { "open": "{", "close": "}" }, 9 | { "open": "[", "close": "]" }, 10 | { "open": "(", "close": ")" }, 11 | { "open": "\"", "close": "\"", "notIn": ["string"] }, 12 | { "open": "'", "close": "'", "notIn": ["string", "comment"] } 13 | ], 14 | "surroundingPairs": [ 15 | { "open": "{", "close": "}" }, 16 | { "open": "[", "close": "]" }, 17 | { "open": "(", "close": ")" }, 18 | { "open": "\"", "close": "\"" }, 19 | { "open": "'", "close": "'" } 20 | ] 21 | } -------------------------------------------------------------------------------- /syntaxes/vroom.tmLanguage.json: -------------------------------------------------------------------------------- 1 | { 2 | "scopeName": "source.vroom", 3 | "fileTypes": ["vroom"], 4 | "patterns": [ 5 | { 6 | "match": "^( >)( .*)?$", 7 | "name": "markup.bold.entity.input.vroom", 8 | "captures": { 9 | "1": { 10 | "name": "support.type.input.vroom" 11 | }, 12 | "2": { 13 | "patterns": [{"include": "#vroomControls"}, {"include": "source.viml"}] 14 | } 15 | } 16 | }, 17 | { 18 | "match": "^( %)( .*)?$", 19 | "name": "entity.text.vroom", 20 | "captures": { 21 | "1": { 22 | "name": "support.type.text.vroom" 23 | }, 24 | "2": { 25 | "patterns": [{"include": "#vroomControls"}, {"include": "source.viml"}] 26 | } 27 | } 28 | }, 29 | { 30 | "begin": "^ :", 31 | "end": "$", 32 | "name": "markup.italic.command.vroom", 33 | "patterns": [{"include": "#vroomControls"}, {"include": "source.viml"}, { 34 | "match": "^( :)", 35 | "name": "support.type.command.vroom" 36 | }] 37 | }, 38 | { 39 | "match": "^( &)( .*)?$", 40 | "name": "entity.output.vroom", 41 | "captures": { 42 | "1": { 43 | "name": "support.type.output.vroom" 44 | }, 45 | "2": { 46 | "name": "text.output.vroom", 47 | "patterns": [{"include": "#vroomControls"}] 48 | } 49 | } 50 | }, 51 | { 52 | "match": "^( \\~)( .*)?$", 53 | "name": "entity.message.vroom", 54 | "captures": { 55 | "1": { 56 | "name": "support.type.message.vroom" 57 | }, 58 | "2": { 59 | "name": "string.message.vroom", 60 | "patterns": [{"include": "#vroomControls"}] 61 | } 62 | } 63 | }, 64 | { 65 | "match": "^( \\$)( .*)?$", 66 | "name": "entity.hijack.vroom", 67 | "captures": { 68 | "1": { 69 | "name": "support.type.hijack.vroom" 70 | }, 71 | "2": { 72 | "name": "support.function.hijack.vroom", 73 | "patterns": [{"include": "#vroomControls"}] 74 | } 75 | } 76 | }, 77 | { 78 | "match": "^( !)( .*)?$", 79 | "name": "markup.italic.shell.vroom", 80 | "captures": { 81 | "1": { 82 | "name": "support.type.shell.vroom" 83 | }, 84 | "2": { 85 | "name": "text.shell.vroom", 86 | "patterns": [{"include": "#vroomControls"}, {"include": "source.shell"}] 87 | } 88 | } 89 | }, 90 | { 91 | "match": "^( @)(\\w+)(\\W\\(.+\\))?$", 92 | "name": "markup.italic.directive.vroom", 93 | "captures": { 94 | "1": { 95 | "name": "support.type.directive.vroom" 96 | }, 97 | "2": { 98 | "name": "keyword.control.directive.vroom" 99 | }, 100 | "3": { 101 | "patterns": [{"include": "#vroomControls"}] 102 | } 103 | } 104 | }, 105 | { 106 | "match": "^( \\|)(.*)?$", 107 | "name": "entity.continuation.vroom", 108 | "captures": { 109 | "1": { 110 | "name": "support.type.continuation.vroom" 111 | } 112 | } 113 | }, 114 | { 115 | "match": "^ ([^>:&\\~\\$!@\\|].*)$", 116 | "name": "markup.italic.output_buffer.vroom", 117 | "captures": { 118 | "1": { 119 | "patterns": [{"include": "#vroomControls"}] 120 | } 121 | } 122 | }, 123 | { 124 | "match": "^[^ ].*$", 125 | "name": "comment.line.vroom" 126 | } 127 | ], 128 | "repository": { 129 | "source.vim": { 130 | "path": "./syntaxes/viml.tmLanguage.json" 131 | }, 132 | "vroomControls": { 133 | "match": "(\\()(.+)(\\))$", 134 | "name": "variable.control.vroom", 135 | "captures": { 136 | "1": { 137 | "name": "punctuation.definition.control.vroom" 138 | }, 139 | "3": { 140 | "name": "punctuation.definition.control.vroom" 141 | }, 142 | "2": { 143 | "patterns": [{ 144 | "match": "\\.(,\\+?(\\d+|\\$)?)?$", 145 | "name": "constant.numeric.range.vroom" 146 | }, { 147 | "match": "\\d+$", 148 | "name": "constant.numeric.range.vroom" 149 | }, { 150 | "match": "\\d*(,\\+?(\\d+|\\$))$", 151 | "name": "constant.numeric.range.vroom" 152 | }, { 153 | "match": "(regex|glob|verbatim)$", 154 | "name": "variable.control.mode.vroom" 155 | }, { 156 | "match": "(stderr|stdout|command|status)$", 157 | "name": "variable.control.channel.vroom" 158 | }, { 159 | "match": "bind$", 160 | "name": "variable.control.bind.vroom" 161 | }, { 162 | "match": "(STRICT|RELAXED|GUESS-ERRORS)$", 163 | "name": "variable.control.strictness.vroom" 164 | }, { 165 | "match": "&.", 166 | "name": "text.escaped.vroom" 167 | }, { 168 | "match": ",", 169 | "name": "punctuation.separator.vroom" 170 | }, { 171 | "match": "=", 172 | "name": "punctuation.separator.vroom" 173 | }, { 174 | "begin": "'", 175 | "end": "'", 176 | "name": "string.single.vroom" 177 | }, { 178 | "begin": "\"", 179 | "end": "\"", 180 | "name": "string.double.vroom" 181 | }, { 182 | "match": "[a-zA-Z0-9_]+", 183 | "name": "variable.other.vroom" 184 | }] 185 | } 186 | } 187 | } 188 | } 189 | } -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "module": "commonjs", 4 | "target": "es2020", 5 | "lib": [ 6 | "es2020" 7 | ], 8 | "outDir": "out", 9 | "rootDir": "src", 10 | "sourceMap": true, 11 | "strict": true, 12 | "allowJs": false 13 | }, 14 | "include": [ 15 | "src" 16 | ], 17 | "exclude": [ 18 | "node_modules" 19 | ], 20 | "compileOnSave": true 21 | } 22 | -------------------------------------------------------------------------------- /vroom-examples/basics.vroom: -------------------------------------------------------------------------------- 1 | This is a vroom script. 2 | 3 | Everything that doesn't start with two spaces is a comment. Feel free to 4 | explain your tests. 5 | 6 | Vroom input lines start with ` > `. That's two spaces, a greater-than sign, 7 | and another space. They're passed like :map commands: 8 | 9 | > iHello, world! 10 | 11 | Easy as that. Output lines start with two spaces and check the current buffer. 12 | 13 | Hello, world! 14 | 15 | Whenever you break up your output tests, vroom goes back to checking the top of 16 | the buffer. Let's check the output again to make sure it hasn't changed: 17 | 18 | Hello, world! 19 | 20 | It's still good. 21 | 22 | You start a new test with three blank lines: 23 | 24 | 25 | 26 | This is a new test! Starting a new test is roughly equivalent to running 27 | 28 | > :stopinsert 29 | > :silent! bufdo! bdelete! 30 | 31 | and then increasing vroom's test counter. If you think three blank lines are 32 | unsightly, you may also begin a new test with the @clear directive. See 33 | examples/directives.vroom for details. 34 | 35 | 36 | 37 | You can leave vim in insert mode between commands, though it's not recommended: 38 | 39 | > iHello, 40 | Hello, 41 | > world! 42 | Hello, world! 43 | 44 | 45 | 46 | You may also change which buffer you're checking. 47 | 48 | > iThis text is in buffer THREE 49 | > :vnew 50 | > iThis text is in buffer 4. 51 | This text is in buffer THREE (3) 52 | This text is in buffer 4. (4) 53 | 54 | Notice the (3) and (4) at the end of the lines -- these are choosing the buffer 55 | to check, and they're called "vroom controls". 56 | 57 | (Why 3 and 4 instead of 1 and 2? Vim buffer numbers are sequential, but they 58 | don't ever reset during a vim session -- you just have to count how many buffers 59 | you've used. It's the nature of the beast.) 60 | 61 | Most vroom lines can end in vroom controls, which are a space followed by 62 | parenthesis at the end of a line. You may also do things like select a range of 63 | lines to check or change the match mode. See examples/controls.vroom for more. 64 | 65 | 66 | 67 | You may check message output with ` ~ ` lines. This is useful for catching and 68 | handling errors. Make sure you use `:echomsg` and not vanilla `:echo`! Echos are 69 | not persistent, and vroom has no way of checking them. 70 | 71 | > :echomsg "Hello, world!" 72 | ~ Hello, world! 73 | > :echomsg exists('x') 74 | ~ 0 75 | 76 | See examples/messages.vroom for more information. 77 | 78 | 79 | 80 | There are two useful shortcuts that you may appreciate. Firstly, you can use 81 | lines starting with ` :` to enter vim commands more succinctly: 82 | 83 | :echomsg "Another message!" 84 | ~ Another message! 85 | 86 | This is exactly equivalent to ` > :echomsg "Another message!"` 87 | 88 | Secondly, you can use lines starting with ` % ` to enter user input. 89 | 90 | % Goodbye, world. 91 | Goodbye, world. 92 | 93 | Which is exactly equivalent to ` > iGoodby, world.`: it enters insert 94 | mode, spits out your text, and exits insert mode. 95 | 96 | Be careful with these shortcuts! They only work from normal mode. If vim isn't in 97 | normal mode when you use them, things could get a little hairy.. 98 | 99 | :new 100 | > i 101 | :LaunchTheNukes 102 | > 103 | & :LaunchTheNukes 104 | & 105 | 106 | Notice how we just tried to match the output line `:LaunchTheNukes`. We couldn't 107 | write it verbatim, because vroom would have thought it was a control line! So we 108 | used ` & ` instead, which explicitly forces output checking. See 109 | examples/escaping.vroom for details. 110 | 111 | 112 | 113 | The currently running file can be found in the $VROOMFILE environment variable. 114 | It is local to the directory where vroom is started. 115 | 116 | :echomsg $VROOMFILE 117 | ~ *basics.vroom (glob) 118 | 119 | The relative path to the directory containing $VROOMFILE can be found in the 120 | $VROOMDIR environment variable. 121 | 122 | If vroom was started from the directory containing $VROOMFILE, $VROOMDIR will 123 | be set to '.', and so a file in the same directory as $VROOMFILE can be named 124 | using a path such as $VROOMDIR/foo.vim. 125 | 126 | :echomsg $VROOMDIR 127 | ~ (\.|(.+/)?examples) (regex) 128 | 129 | 130 | 131 | That's all there is to it! 132 | 133 | In more complicated tests you may need to sandbox vim, preventing it from doing 134 | things like hitting the network for data. To learn how to hijack system calls, 135 | see examples/system.vroom. 136 | 137 | If you have weird test output that you need to match, you may want to check out 138 | examples/escaping.vroom and examples/continuations.vroom. 139 | 140 | Then you just run the vroom script (you can use -v for extra output) on your 141 | vroom file, and away you go! 142 | -------------------------------------------------------------------------------- /vroom-examples/blocks.vroom: -------------------------------------------------------------------------------- 1 | % OneTwoThreeFour 2 | 3 | When you have a block of output commands, vroom checks them against the buffer 4 | sequentially: 5 | 6 | One 7 | Two 8 | Three 9 | 10 | When you have a line break between your output checks, you go back to the top. 11 | 12 | One 13 | 14 | One 15 | 16 | One 17 | Two 18 | Three 19 | 20 | Use two spaces instead of a blank line to check for an empty buffer line. (You 21 | may also use ` &` if you dislike trailing whitespace.) 22 | 23 | One 24 | Two 25 | Three 26 | & 27 | Four 28 | 29 | So if you want to comment during your outputting, comment without blank lines 30 | in-between. 31 | 32 | One 33 | Like this. 34 | Two 35 | 36 | Finally, three or more blank lines acts like a @clear. 37 | 38 | 39 | 40 | @end 41 | -------------------------------------------------------------------------------- /vroom-examples/buffer.vroom: -------------------------------------------------------------------------------- 1 | Buffer controls can be placed at the end of any output line. (See 2 | examples/controls.vroom for more on controls in general.) 3 | 4 | % Buffer one line one. 5 | % Buffer one line two. 6 | :vnew 7 | % Buffer two line one. 8 | % Buffer two line two. 9 | 10 | If you leave off the buffer control, vroom checks whatever buffer you've loaded 11 | last. If you haven't loaded a buffer before, it checks the active buffer. 12 | 13 | Buffer two line one. 14 | Buffer two line two. 15 | 16 | Otherwise, it loads the buffer you specify. 17 | 18 | Buffer one line one. (1) 19 | Buffer one line two. 20 | 21 | Notice how vroom sticks to the (1) buffer after you load it once. That lasts for 22 | continuous output lines. Whenever you start a new output block, vroom goes back 23 | to checking the active buffer. 24 | 25 | Buffer two line one. 26 | Buffer two line two. 27 | -------------------------------------------------------------------------------- /vroom-examples/continuations.vroom: -------------------------------------------------------------------------------- 1 | Sometimes you want lines that are longer that is sightful. For that, you want 2 | line continuations. 3 | 4 | Vroom line continuations are simple: they are appended to the line prior with no 5 | whitespace in between. 6 | 7 | > i 8 | |Hello 9 | Hello 10 | 11 | 12 | 13 | Line continuations can be chained and used anywhere. 14 | 15 | > i 16 | |H 17 | |e 18 | |l 19 | |l 20 | |o 21 | | 22 | 23 | 24 | 25 | They can't be given controls, so they're useful for outputting literal 26 | parentheses at the end of lines. 27 | 28 | > i 29 | |(regex) 30 | (regex) 31 | 32 | 33 | 34 | You can join output lines: 35 | 36 | > iHello 37 | Hel 38 | |lo 39 | 40 | 41 | 42 | And system hijack lines: 43 | 44 | :.!echo "Hello" 45 | $ Capt 46 | |ured 47 | Captured 48 | 49 | Though remember that you can string system hijack lines together to get 50 | newlines, which is more often what you want with system hijacking: 51 | 52 | :.!echo "Hello" 53 | $ Captured, my friend. 54 | $ Captured. 55 | -------------------------------------------------------------------------------- /vroom-examples/controls.vroom: -------------------------------------------------------------------------------- 1 | When you end a line with a space and parentheses, you're sending controls to 2 | vroom. (If you'd rather not, see examples/escaping.vroom.) Different types of 3 | lines take different types of controls. 4 | 5 | The most important controls are output line controls. There are three different 6 | controls words that you can use in output lines: 7 | 8 | 9 | 10 | 1. You can choose an output buffer. Buffer controls are just a number. 11 | 12 | % Buffer one. 13 | :vnew 14 | % Buffer two. 15 | Buffer one. (1) 16 | Buffer two. (2) 17 | 18 | See examples/buffer.vroom for more tricks. 19 | 20 | 21 | 22 | 2. You may select a range of lines to match in the current buffer. You do this 23 | by specifying X,Y where X is the line to start on and Y is the line to end on. 24 | 25 | > 10aHello 26 | > 10aWorld 27 | > dd 28 | Hello (1,10) 29 | World (,$) 30 | 31 | 32 | 33 | 2.1. A slight variation on the range control, you may use the `.` control to 34 | check starting at the cursor line instead of starting at the top of the buffer. 35 | 36 | % OneTwoThree 37 | > k 38 | Two (.) 39 | 40 | 41 | 42 | 3. You may change the match mode of the output line to `regex` or `glob`. 43 | 44 | % The quick brown fox jumps over the lazy dog? 45 | The * * ??? jumps over the * dog[?] (glob) 46 | 47 | See examples/mode.vroom for more tricks. 48 | 49 | 50 | 51 | Message capture lines can specify a mode, but no other controls. 52 | 53 | :echomsg "Hello there!" 54 | ~ * (glob) 55 | :echomsg "Hello there!" 56 | ~ .* (regex) 57 | :echomsg "Hello there!" 58 | ~ Hello there! 59 | 60 | System capture lines are similar: you may specify a mode, but nothing else. 61 | 62 | 63 | 64 | Input lines also have their own special type of control, the delay control. You 65 | use this to have vroom pause after a command that is going to take a long time. 66 | 67 | :sleep 1 (1.1s) 68 | % I'm awake now! 69 | I'm awake now! 70 | 71 | The delay control is any number (decimal allowed) followed by an 's'. Vroom 72 | pauses for that many seconds before continuing. The delay must be prefixed with 73 | a leading zero if it's less than one. 74 | 75 | Note that this pause is in addition to the delay specified by the -d flag. 76 | -------------------------------------------------------------------------------- /vroom-examples/directives.vroom: -------------------------------------------------------------------------------- 1 | Lines that start with ` @` are directives. Some are hard-baked shortcuts, 2 | others unleash special functionality that can't be achieved otherwise. 3 | 4 | Vroom directives include: 5 | 6 | 1. @end, used to check that all output has been accounted for. 7 | 8 | > 10aHellodd 9 | 10 | Normally, vroom checks the lines that you tell it to check and no further. Using 11 | the @end directive, you can verify that the last line checked was the final line 12 | in the buffer. 13 | 14 | Hello (,+9) 15 | @end 16 | 17 | 18 | 19 | 2. @clear, which clears out all the existing buffers. Use it between tests when 20 | you want to start anew. 21 | 22 | % Hello 23 | @clear 24 | @end 25 | 26 | 27 | 28 | 3. @messages, which can control the message strictness temporarily. 29 | 30 | Normally, you *must* catch error messages, or vroom complains (unless you've 31 | tweaked the --message-strictness flag). 32 | 33 | :set cmdheight=99 34 | 35 | :throw 'I broke something!' 36 | ~ Error detected while processing * (glob) 37 | ~ E605: Exception not caught: * (glob) 38 | 39 | But with the @messages directive, you can temporarily change the message 40 | strictness setting: 41 | 42 | @messages (RELAXED) 43 | :throw 'I broke it again.' 44 | @messages 45 | 46 | Notice how @messages without a control block resets the message handling back 47 | to its original --message-strictness setting. 48 | 49 | 50 | 51 | You may also use @system to temporarily override --system-strictness. 52 | 53 | @system (RELAXED) 54 | :.!echo "Hello" 55 | @system 56 | 57 | This will pass even if you run the test with --system-strictness=STRICT 58 | -------------------------------------------------------------------------------- /vroom-examples/escaping.vroom: -------------------------------------------------------------------------------- 1 | Sometimes, vroom syntax gets in the way of your tests. When you have weird 2 | tests, there's two escaping rules that you need to remember. 3 | 4 | 5 | 6 | 1. The ampersand (&) escapes a control block. 7 | 8 | % Literal line ending in (&1) 9 | Literal line ending in (&1) 10 | 11 | The contents of the buffer will be "Literal line ending in (1)" 12 | 13 | 14 | 15 | 2. Lines starting with ` & ` are also output lines. 16 | 17 | % > This looks like an input line. 18 | & > This looks like an input line. 19 | 20 | As a special case, you can use the line ` &` to match an empty buffer line. 21 | (two blank spaces will also work, but some editors complain about trailing 22 | whitespace.) 23 | 24 | @clear 25 | % HelloWorld 26 | Hello 27 | & 28 | World 29 | 30 | 31 | 32 | Finally, remember that you can escape special characters in glob mode with 33 | square brackets. 34 | 35 | % What? An asterisk* 36 | & ????[?] An *[*] (glob) 37 | -------------------------------------------------------------------------------- /vroom-examples/macros.vroom: -------------------------------------------------------------------------------- 1 | Sometimes you may find yourself repeating similar chunks of vroom code across 2 | different tests. For example, let's write some tests for the 'cindent' feature: 3 | 4 | Enter a small, unindented function 5 | % void func() 6 | % { 7 | % if (true) { 8 | % printf("hello\n!"); 9 | % } 10 | % } 11 | Enable cindent and set tabstop and shiftwidth to 2 12 | :set cin ts=2 sw=2 et 13 | > gg=G 14 | Now function should have a 2-space indentation: 15 | void func() 16 | { 17 | if (true) { 18 | printf("hello\n!"); 19 | } 20 | } 21 | & 22 | @end 23 | @clear 24 | 25 | Now let's test cindent again, but with another value for ts/sw. To make sure 26 | the previous indentation won't affect this one, we start with a clear buffer: 27 | % void func() 28 | % { 29 | % if (true) { 30 | % printf("hello\n!"); 31 | % } 32 | % } 33 | :set cin ts=4 sw=4 et 34 | > gg=G 35 | void func() 36 | { 37 | if (true) { 38 | printf("hello\n!"); 39 | } 40 | } 41 | & 42 | @end 43 | @clear 44 | 45 | The above pattern of writing tests can generalized like this: 46 | 47 | - Start with a clear buffer 48 | - Input some text 49 | - Call a function or command with some parameters 50 | - Verify if the buffer is in a expected state 51 | - Repeat but with a different set of parameters 52 | 53 | Macros can be used to create reusable chunks of vroom code and help reduce 54 | boilerplate across tests. Let's rewrite the above test using macros: 55 | 56 | @macro (input_unindented_function) 57 | % void func() 58 | % { 59 | % if (true) { 60 | % printf("hello\n!"); 61 | % } 62 | % } 63 | @endmacro 64 | 65 | The above defined a macro named 'input_unindented_function' that takes care of 66 | entering an unindented function in the current buffer. 67 | 68 | & 69 | @end 70 | 71 | As you can see, the buffer wasn't modified. The macro can be "executed" with 72 | a @do directive: 73 | 74 | @do (input_unindented_function) 75 | void func() 76 | { 77 | if (true) { 78 | printf("hello\n!"); 79 | } 80 | } 81 | & 82 | @end 83 | 84 | Now indent and verify output 85 | :set cin ts=4 sw=4 et 86 | > gg=G 87 | void func() 88 | { 89 | if (true) { 90 | printf("hello\n!"); 91 | } 92 | } 93 | & 94 | @end 95 | @clear 96 | 97 | A cool thing about macros is that the lines between the @macro/@endmacro 98 | directives can contain python format string syntax(the same syntax used by 99 | str.format()). For example: 100 | 101 | @macro (greet) 102 | % hello {subject} 103 | @endmacro 104 | @do (greet, subject='world') 105 | @do (greet, subject='vroom') 106 | hello world 107 | hello vroom 108 | & 109 | @end 110 | @clear 111 | 112 | That means we can generalize even the cindent verification: 113 | 114 | @macro (indent_and_verify) 115 | :set cin ts={count} sw={count} et 116 | > gg=G 117 | void func() 118 | {{ 119 | {fill:{count}}if (true) {{ 120 | {fill:{count}}{fill:{count}}printf("hello\n!"); 121 | {fill:{count}}}} 122 | }} 123 | Notice how any braces that are part of the output need to be escaped. This is 124 | only necessary when the macro is executed with arguments. 125 | & 126 | @endmacro 127 | 128 | Let's split into two macros to improve readability: 129 | 130 | @macro (verify) 131 | void func() 132 | {{ 133 | {indent}if (true) {{ 134 | {indent}{indent}printf("hello\n!"); 135 | {indent}}} 136 | }} 137 | & 138 | @endmacro 139 | 140 | @macro (indent_and_verify) 141 | Notice how macros can be redefined at any time 142 | :set cin ts={count} sw={count} et 143 | > gg=G 144 | @do (verify, indent='{fill:{count}}') 145 | @endmacro 146 | 147 | After the macro is defined we can easily test cindent for multiple ts/sw 148 | values. The keyword arguments passed to @do can contain simple python 149 | expressions: 150 | 151 | @do (input_unindented_function) 152 | @do (indent_and_verify, fill=' ', count=2) 153 | @clear 154 | @do (input_unindented_function) 155 | @do (indent_and_verify, fill=' ', count=4) 156 | @clear 157 | 158 | Since macros can contain `@do` directives, the test can be simplified even 159 | further: 160 | 161 | @macro (test_cindent) 162 | @do (input_unindented_function) 163 | @do (indent_and_verify, fill=' ', count={width}) 164 | @clear 165 | @endmacro 166 | 167 | @do (test_cindent, width=2) 168 | @do (test_cindent, width=4) 169 | @do (test_cindent, width=6) 170 | @do (test_cindent, width=8) 171 | 172 | It's important to understand parsing macro contents is delayed until a 173 | corresponding @do directive is found: 174 | 175 | @macro (insert_or_verify) 176 | {prefix}some text 177 | @endmacro 178 | 179 | Input the text 180 | 181 | @do (insert_or_verify, prefix='% ') 182 | @do (insert_or_verify, prefix='') 183 | @clear 184 | 185 | Finally, macro names can contain spaces for more descriptive names: 186 | 187 | @macro (test cindent for arbitrary widths) 188 | @do (test_cindent, width={width}) 189 | @endmacro 190 | 191 | @do (test cindent for arbitrary widths, width=2) 192 | @do (test cindent for arbitrary widths, width=4) 193 | @do (test cindent for arbitrary widths, width=8) 194 | 195 | For more details about python format syntax, see: 196 | https://docs.python.org/2/library/string.html#format-string-syntax 197 | -------------------------------------------------------------------------------- /vroom-examples/messages.vroom: -------------------------------------------------------------------------------- 1 | You can check message output with a ` ~ ` line. You must catch messages after 2 | the command that causes them if you want it to work. 3 | 4 | :echomsg "Hello." 5 | ~ Hello. 6 | 7 | This mechanism allows vroom to know what lines errors occur on. You can match 8 | multiple messages on one command. 9 | 10 | :set cmdheight=99 11 | 12 | :echomsg "First" | echomsg "Second" 13 | ~ First 14 | ~ Second 15 | 16 | Note sometimes multiple lines of output cause vroom to get stuck at a "Hit ENTER 17 | to continue" prompt (typically in Neovim mode), and increasing cmdheight is a 18 | simple workaround to avoid getting stuck. See 19 | https://github.com/google/vroom/issues/83. 20 | 21 | By default, vroom doesn't mind if you miss messages. It only minds if you miss 22 | messages that vroom thinks look like error messages. 23 | 24 | You can tweak this behavior with the --message-strictness flag. 25 | 26 | For example, the test below will fail with --message-strictness=STRICT, because 27 | the message is not caught. 28 | 29 | :echomsg "Third." 30 | -------------------------------------------------------------------------------- /vroom-examples/mode.vroom: -------------------------------------------------------------------------------- 1 | By default, output lines are matched in verbatim mode: 2 | 3 | % The quick brown fox jumps over the lazy dog? 4 | The quick brown fox jumps over the lazy dog? 5 | 6 | You make modes explicit with control blocks: 7 | 8 | The quick brown fox jumps over the lazy dog? (verbatim) 9 | 10 | You may also use `glob` mode and `regex` mode. * and ? are expanded in glob mode 11 | and may be escaped. This works like python's fnmatch. 12 | 13 | The * * ??? jumps over the * dog[?] (glob) 14 | 15 | Regexes are python-style. 16 | 17 | \w+ \w+ brown fox .* lazy dog\? (regex) 18 | 19 | Python regex flags etc. all work: 20 | 21 | (?i)\w+ \w+ BROWN FOX .* LAZY DOG. (regex) 22 | 23 | We suggest you use flags at the beginning of the regex, so as to not confuse 24 | vroom into thinking you're misspelling line controls. 25 | 26 | 27 | 28 | System capture lines are matched in regex mode by default: 29 | 30 | :.!echo 'Hello.' 31 | ! echo .* 32 | Hello. 33 | 34 | You may override that. 35 | 36 | @clear 37 | :.!echo '.*' 38 | ! echo '.*' (verbatim) 39 | .* 40 | -------------------------------------------------------------------------------- /vroom-examples/range.vroom: -------------------------------------------------------------------------------- 1 | The range syntax is X,Y. Only the comma is required. If X is omitted, vroom 2 | picks up where it starts off. If Y is omitted, only one line is matched. 3 | 4 | If both are omitted, nothing really happens, but it's technically valid: 5 | 6 | % Hello, 7 | % World 8 | Hello, 9 | World (,) 10 | 11 | 12 | 13 | X may also be `.` to start the match at the current cursor position. 14 | 15 | % OneTwoTwoThreeThreeThree 16 | > 5k 17 | Two (.,+1) 18 | 19 | 20 | 21 | Y is the end of the range. Y may be absolute: 22 | 23 | > 10aHello 24 | > 10aWorld 25 | > dd 26 | Hello (1,10) 27 | World (,20) 28 | 29 | Or relative: 30 | 31 | Hello (1,10) 32 | World (,+9) 33 | 34 | Y may also be `$` to continue the check until the end of the buffer. 35 | 36 | Hello (1,10) 37 | World (,$) 38 | -------------------------------------------------------------------------------- /vroom-examples/system.vroom: -------------------------------------------------------------------------------- 1 | Sometimes, vim makes calls to the system at large. That could be bad during 2 | testing if your plugin is hitting a network or launching the nukes. 3 | 4 | Vroom provides you with two tools to handle vim system calls. 5 | 6 | Firstly, you can verify that system calls match a certain expected pattern: 7 | 8 | :.!echo "Hey system, talk to me." 9 | ! echo .* 10 | 11 | System calls are matched in regex mode by default. 12 | 13 | 14 | 15 | This works with :call as well. 16 | 17 | :echomsg system('echo hi') 18 | ! echo hi (verbatim) 19 | ~ hi 20 | 21 | 22 | 23 | If the system call that vim actually makes doesn't match the one you specify, 24 | vroom will complain. 25 | 26 | By default, any unexpected system calls will trigger a failure. This strictness 27 | helps protect you from unknowingly triggering system calls that succeed in your 28 | environment but fail when others try to run them, and also encourages you to 29 | document your expectations. But if this gets annoying, you can always turn it 30 | off with @system (RELAXED). 31 | 32 | @system (RELAXED) 33 | :.!echo "Come at me, bro." 34 | 35 | 36 | This is nice, but it doesn't really give you much control over the system. To do 37 | that, you need to hijack the system and hoodwink vim: 38 | 39 | :.!echo "Hey system, talk to me." 40 | ! echo "Hey system, talk to me\." 41 | $ No. I'm not talking. 42 | 43 | Let's check whether or not that worked: 44 | 45 | No. I'm not talking. 46 | 47 | Good! 48 | 49 | 50 | 51 | If you need newlines in your dummy output, string hijack commands together. 52 | 53 | :.!echo "Please?" 54 | ! echo "Please\?" 55 | $ No! 56 | $ Go away. 57 | No! 58 | Go away. 59 | 60 | 61 | 62 | You may use system hijack lines to change the exit status using the "status" 63 | control word: 64 | 65 | :set cmdheight=99 66 | 67 | :.!echo "Testing" 68 | $ 2 (status) 69 | :echomsg v:shell_error 70 | ~ 2 71 | 72 | 73 | Or even to change the command entirely: 74 | 75 | :.!rm "Testing." 76 | $ echo "Testing." (command) 77 | Testing. 78 | 79 | The default output channel is 'stdout'. You may explicitly mark it if you wish. 80 | 81 | :.!echo "Testing" 82 | $ .gnitseT (stdout) 83 | .gnitseT 84 | 85 | 86 | 87 | If you capture a command with a regex, the regex's match groups will be 88 | available to hijack lines. 89 | 90 | :.!rm hello 91 | ! rm (\w+) 92 | $ echo \1 (command) 93 | hello 94 | 95 | 96 | 97 | :.!rm hello 98 | ! rm (\w+) 99 | $ \1 \1 100 | hello hello 101 | 102 | @system 103 | --------------------------------------------------------------------------------