├── .eslintrc.json ├── .gitignore ├── .nvmrc ├── .vscode ├── extensions.json ├── launch.json ├── settings.json └── tasks.json ├── .vscodeignore ├── CHANGELOG.md ├── LICENSE ├── README-dev.md ├── README.md ├── bun.lockb ├── code-sense-0.2.8.vsix ├── images ├── Code-Sense-Logo.png └── vsix-install-steps.jpg ├── out └── extension.js ├── package.json ├── solid-app ├── .gitignore ├── README.md ├── bun.lockb ├── index.html ├── package.json ├── public │ ├── seti.woff │ └── vs-seti-icon-theme.json ├── src │ ├── App.module.css │ ├── App.tsx │ ├── List.tsx │ ├── Result.module.css │ ├── Result.tsx │ ├── importPatterns.ts │ ├── index.css │ ├── index.tsx │ ├── toolkit.d.ts │ ├── types.d.ts │ └── utils.tsx ├── tsconfig.json ├── vite.config.ts └── vscode.proposed.textSearchProvider.d.ts ├── src ├── extension.ts ├── test │ ├── runTest.ts │ └── suite │ │ ├── extension.test.ts │ │ └── index.ts └── types.d.ts ├── tsconfig.json ├── vsc-extension-quickstart.md ├── vscode.proposed.findTextInFiles.d.ts └── vscode.proposed.textSearchProvider.d.ts /.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "root": true, 3 | "parser": "@typescript-eslint/parser", 4 | "parserOptions": { 5 | "ecmaVersion": 6, 6 | "sourceType": "module" 7 | }, 8 | "plugins": [ 9 | "@typescript-eslint" 10 | ], 11 | "rules": { 12 | // "@typescript-eslint/naming-convention": "warn", 13 | "@typescript-eslint/semi": "warn", 14 | "eqeqeq": "warn", 15 | "no-throw-literal": "warn", 16 | "semi": "off" 17 | }, 18 | "ignorePatterns": [ 19 | "out", 20 | "dist", 21 | "**/*.d.ts" 22 | ] 23 | } 24 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | .DS_Store -------------------------------------------------------------------------------- /.nvmrc: -------------------------------------------------------------------------------- 1 | v20.10.0 -------------------------------------------------------------------------------- /.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | { 2 | // See http://go.microsoft.com/fwlink/?LinkId=827846 3 | // for the documentation about the extensions.json format 4 | "recommendations": [ 5 | "dbaeumer.vscode-eslint", 6 | "connor4312.esbuild-problem-matchers" 7 | ] 8 | } 9 | -------------------------------------------------------------------------------- /.vscode/launch.json: -------------------------------------------------------------------------------- 1 | // A launch configuration that compiles the extension and then opens it inside a new window 2 | // Use IntelliSense to learn about possible attributes. 3 | // Hover to view descriptions of existing attributes. 4 | // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 5 | { 6 | "version": "0.2.0", 7 | "configurations": [ 8 | 9 | { 10 | "name": "Run Extension", 11 | "type": "extensionHost", 12 | "request": "launch", 13 | "args": [ 14 | "--extensionDevelopmentPath=${workspaceFolder}" 15 | ], 16 | "outFiles": [ 17 | "${workspaceFolder}/out/**/*.js" 18 | ], 19 | "preLaunchTask": "${defaultBuildTask}" 20 | }, 21 | { 22 | "name": "Extension Tests", 23 | "type": "extensionHost", 24 | "request": "launch", 25 | "args": [ 26 | "--extensionDevelopmentPath=${workspaceFolder}", 27 | "--extensionTestsPath=${workspaceFolder}/out/test/suite/index" 28 | ], 29 | "outFiles": [ 30 | "${workspaceFolder}/out/test/**/*.js" 31 | ], 32 | "preLaunchTask": "${defaultBuildTask}" 33 | } 34 | ] 35 | } 36 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | // Place your settings in this file to overwrite default and user settings. 2 | { 3 | "files.exclude": { 4 | "out": false // set this to true to hide the "out" folder with the compiled JS files 5 | }, 6 | "search.exclude": { 7 | "out": true // set this to false to include "out" folder in search results 8 | }, 9 | // Turn off tsc task auto detection since we have the necessary tasks as npm scripts 10 | "typescript.tsc.autoDetect": "off", 11 | "typescript.tsdk": "node_modules/typescript/lib" 12 | } -------------------------------------------------------------------------------- /.vscode/tasks.json: -------------------------------------------------------------------------------- 1 | // See https://go.microsoft.com/fwlink/?LinkId=733558 2 | // for the documentation about the tasks.json format 3 | { 4 | "version": "2.0.0", 5 | "tasks": [ 6 | { 7 | "type": "npm", 8 | "script": "watch", 9 | "problemMatcher": "$esbuild-watch", 10 | "isBackground": true, 11 | "presentation": { 12 | "reveal": "never" 13 | }, 14 | "group": { 15 | "kind": "build", 16 | "isDefault": true 17 | } 18 | } 19 | ] 20 | } 21 | -------------------------------------------------------------------------------- /.vscodeignore: -------------------------------------------------------------------------------- 1 | * 2 | */** 3 | **/.DS_Store 4 | 5 | !solid-app/dist/** 6 | !out/extension.js 7 | !package.json 8 | !README.md 9 | !CHANGELOG.md 10 | !images/* -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Change Log 2 | 3 | All notable changes to the "code-sense" extension will be documented in this file. 4 | 5 | Check [Keep a Changelog](http://keepachangelog.com/) for recommendations on how to structure this file. 6 | 7 | ## [Unreleased] 8 | 9 | - Initial release -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2024 Negative Space LLC 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 | -------------------------------------------------------------------------------- /README-dev.md: -------------------------------------------------------------------------------- 1 | # Code Sense 2 | 3 | ### Use command pallet to run code-sense.start 4 | 5 | ## Dev 6 | 7 | ### 1) Run build for solid app 8 | 9 | ``` 10 | cd solid-app 11 | bun run build 12 | ``` 13 | 14 | ### 2) Run extension 15 | 16 | From VSCode, press F5 17 | 18 | ### 3) Open build extension 19 | 20 | ``` 21 | bun run vscode:prepublish 22 | ``` 23 | 24 | ### 4) Create VSIX file 25 | 26 | #### 4.1) Install vsce 27 | 28 | ``` 29 | bun install -g @vscode/vsce 30 | ``` 31 | 32 | #### 4.2) Create VSIX file 33 | 34 | ``` 35 | vsce package 36 | ``` 37 | 38 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Code Sense 2 | 3 | # Install 4 | 5 | ## This extension uses a Proposed API and requires extra steps to install 6 | 7 | 8 | ### 1. Download latest `code-sense-X.X.X.vsix` file and install using the "Install from VSIX..." option in the extensions menu 9 | 10 | ![image](https://github.com/Negative-Space-Dev/code-sense/assets/25469167/96d26b9c-6c3f-47ac-ae24-8cf43f25172b) 11 | 12 | 13 | ### 2. Enable proposed APIs for this extension 14 | 15 | - Open the command pallette (Ctrl+Shift+P) and enter `Preferences: Configure Runtime Arguments` 16 | - Add the following to the list of arguments 17 | 18 | ```json 19 | { 20 | ... 21 | "enable-proposed-api": ["negative-space.code-sense"] 22 | } 23 | ``` 24 | 25 | ### 3. Restart VSCode 26 | 27 | 28 | # Start 29 | 30 | ## Use the command pallette to run `Code Sense: Start code sense` 31 | 32 | -------------------------------------------------------------------------------- /bun.lockb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Negative-Space-Dev/code-sense/81465236621f097bd7b23487a78a1411f23c670d/bun.lockb -------------------------------------------------------------------------------- /code-sense-0.2.8.vsix: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Negative-Space-Dev/code-sense/81465236621f097bd7b23487a78a1411f23c670d/code-sense-0.2.8.vsix -------------------------------------------------------------------------------- /images/Code-Sense-Logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Negative-Space-Dev/code-sense/81465236621f097bd7b23487a78a1411f23c670d/images/Code-Sense-Logo.png -------------------------------------------------------------------------------- /images/vsix-install-steps.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Negative-Space-Dev/code-sense/81465236621f097bd7b23487a78a1411f23c670d/images/vsix-install-steps.jpg -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "code-sense", 3 | "displayName": "Code Sense", 4 | "description": "Discover and understand code faster", 5 | "repository": "https://github.com/Negative-Space-Dev/code-sense", 6 | "version": "0.2.8", 7 | "publisher": "negative-space", 8 | "icon": "images/Code-Sense-Logo.png", 9 | "engines": { 10 | "vscode": "^1.73.0" 11 | }, 12 | "categories": [ 13 | "Other" 14 | ], 15 | "preview": true, 16 | "activationEvents": [ 17 | "onCommand:code-sense.start" 18 | ], 19 | "main": "./out/extension.js", 20 | "enabledApiProposals": [ 21 | "findTextInFiles", 22 | "textSearchProvider" 23 | ], 24 | "contributes": { 25 | "commands": [ 26 | { 27 | "command": "code-sense.start", 28 | "title": "Start code sense", 29 | "category": "Code Sense" 30 | } 31 | ], 32 | "configuration": { 33 | "title": "CodeSense", 34 | "properties": { 35 | "code-sense.serverPort": { 36 | "type": "number", 37 | "markdownDescription": "Port to use for webview server.\n\n**Important**: Reload VSCode for changes to apply.", 38 | "default": 49168 39 | } 40 | } 41 | } 42 | }, 43 | "scripts": { 44 | "vscode:prepublish": "bun run esbuild-base -- --minify", 45 | "esbuild-base": "rimraf out && esbuild ./src/extension.ts --bundle --outfile=out/extension.js --external:vscode --format=cjs --platform=node", 46 | "build": "bun run esbuild-base -- --sourcemap", 47 | "watch": "bun run esbuild-base -- --sourcemap --watch", 48 | "test-compile": "tsc -p ./", 49 | "pretest": "bun run esbuild && bun run lint", 50 | "lint": "eslint src --ext ts", 51 | "test": "node ./out/test/runTest.js" 52 | }, 53 | "devDependencies": { 54 | "@types/cors": "^2.8.12", 55 | "@types/express": "^4.17.14", 56 | "@types/glob": "^7.2.0", 57 | "@types/mocha": "^9.1.0", 58 | "@types/node": "14.x", 59 | "@types/string-similarity": "^4.0.0", 60 | "@types/vscode": "^1.73.0", 61 | "@typescript-eslint/eslint-plugin": "^5.16.0", 62 | "@typescript-eslint/parser": "^5.16.0", 63 | "@vscode/test-electron": "^2.1.3", 64 | "esbuild": "^0.16.10", 65 | "eslint": "^8.11.0", 66 | "glob": "^7.2.0", 67 | "mocha": "^9.2.2", 68 | "rimraf": "^3.0.2", 69 | "typescript": "^4.5.5" 70 | }, 71 | "dependencies": { 72 | "cors": "^2.8.5", 73 | "express": "^4.18.2", 74 | "fs": "^0.0.1-security", 75 | "path": "^0.12.7", 76 | "string-similarity": "^4.0.4" 77 | } 78 | } 79 | -------------------------------------------------------------------------------- /solid-app/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | dist -------------------------------------------------------------------------------- /solid-app/README.md: -------------------------------------------------------------------------------- 1 | ## Usage 2 | 3 | Those templates dependencies are maintained via [pnpm](https://pnpm.io) via `pnpm up -Lri`. 4 | 5 | This is the reason you see a `pnpm-lock.yaml`. That being said, any package manager will work. This file can be safely be removed once you clone a template. 6 | 7 | ```bash 8 | $ npm install # or pnpm install or yarn install 9 | ``` 10 | 11 | ### Learn more on the [Solid Website](https://solidjs.com) and come chat with us on our [Discord](https://discord.com/invite/solidjs) 12 | 13 | ## Available Scripts 14 | 15 | In the project directory, you can run: 16 | 17 | ### `npm dev` or `npm start` 18 | 19 | Runs the app in the development mode.
20 | Open [http://localhost:3000](http://localhost:3000) to view it in the browser. 21 | 22 | The page will reload if you make edits.
23 | 24 | ### `npm run build` 25 | 26 | Builds the app for production to the `dist` folder.
27 | It correctly bundles Solid in production mode and optimizes the build for the best performance. 28 | 29 | The build is minified and the filenames include the hashes.
30 | Your app is ready to be deployed! 31 | 32 | ## Deployment 33 | 34 | You can deploy the `dist` folder to any static host provider (netlify, surge, now, etc.) 35 | -------------------------------------------------------------------------------- /solid-app/bun.lockb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Negative-Space-Dev/code-sense/81465236621f097bd7b23487a78a1411f23c670d/solid-app/bun.lockb -------------------------------------------------------------------------------- /solid-app/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /solid-app/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "vite-template-solid", 3 | "version": "0.0.0", 4 | "description": "", 5 | "type": "module", 6 | "scripts": { 7 | "start": "vite", 8 | "dev": "vite", 9 | "build": "vite build", 10 | "serve": "vite preview" 11 | }, 12 | "license": "MIT", 13 | "devDependencies": { 14 | "@types/vscode-webview": "^1.57.0", 15 | "typescript": "^5.3.3", 16 | "vite": "^5.1.3", 17 | "vite-plugin-solid": "^2.3.0" 18 | }, 19 | "dependencies": { 20 | "@vscode/webview-ui-toolkit": "^1.4.0", 21 | "minimatch": "^9.0.3", 22 | "solid-js": "^1.8.15" 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /solid-app/public/seti.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Negative-Space-Dev/code-sense/81465236621f097bd7b23487a78a1411f23c670d/solid-app/public/seti.woff -------------------------------------------------------------------------------- /solid-app/public/vs-seti-icon-theme.json: -------------------------------------------------------------------------------- 1 | { 2 | "information_for_contributors": [ 3 | "This file has been generated from data in https://github.com/jesseweed/seti-ui", 4 | "- icon definitions: https://github.com/jesseweed/seti-ui/blob/master/styles/_fonts/seti.less", 5 | "- icon colors: https://github.com/jesseweed/seti-ui/blob/master/styles/ui-variables.less", 6 | "- file associations: https://github.com/jesseweed/seti-ui/blob/master/styles/components/icons/mapping.less", 7 | "If you want to provide a fix or improvement, please create a pull request against the jesseweed/seti-ui repository.", 8 | "Once accepted there, we are happy to receive an update request." 9 | ], 10 | "fonts": [ 11 | { 12 | "id": "seti", 13 | "src": [ 14 | { 15 | "path": "./seti.woff", 16 | "format": "woff" 17 | } 18 | ], 19 | "weight": "normal", 20 | "style": "normal", 21 | "size": "150%" 22 | } 23 | ], 24 | "iconDefinitions": { 25 | "_R_light": { 26 | "fontCharacter": "\\E001", 27 | "fontColor": "#498ba7" 28 | }, 29 | "_R": { 30 | "fontCharacter": "\\E001", 31 | "fontColor": "#519aba" 32 | }, 33 | "_argdown_light": { 34 | "fontCharacter": "\\E003", 35 | "fontColor": "#498ba7" 36 | }, 37 | "_argdown": { 38 | "fontCharacter": "\\E003", 39 | "fontColor": "#519aba" 40 | }, 41 | "_asm_light": { 42 | "fontCharacter": "\\E004", 43 | "fontColor": "#b8383d" 44 | }, 45 | "_asm": { 46 | "fontCharacter": "\\E004", 47 | "fontColor": "#cc3e44" 48 | }, 49 | "_audio_light": { 50 | "fontCharacter": "\\E005", 51 | "fontColor": "#9068b0" 52 | }, 53 | "_audio": { 54 | "fontCharacter": "\\E005", 55 | "fontColor": "#a074c4" 56 | }, 57 | "_babel_light": { 58 | "fontCharacter": "\\E006", 59 | "fontColor": "#b7b73b" 60 | }, 61 | "_babel": { 62 | "fontCharacter": "\\E006", 63 | "fontColor": "#cbcb41" 64 | }, 65 | "_bazel_light": { 66 | "fontCharacter": "\\E007", 67 | "fontColor": "#7fae42" 68 | }, 69 | "_bazel": { 70 | "fontCharacter": "\\E007", 71 | "fontColor": "#8dc149" 72 | }, 73 | "_bazel_1_light": { 74 | "fontCharacter": "\\E007", 75 | "fontColor": "#455155" 76 | }, 77 | "_bazel_1": { 78 | "fontCharacter": "\\E007", 79 | "fontColor": "#4d5a5e" 80 | }, 81 | "_bicep_light": { 82 | "fontCharacter": "\\E008", 83 | "fontColor": "#498ba7" 84 | }, 85 | "_bicep": { 86 | "fontCharacter": "\\E008", 87 | "fontColor": "#519aba" 88 | }, 89 | "_bower_light": { 90 | "fontCharacter": "\\E009", 91 | "fontColor": "#cc6d2e" 92 | }, 93 | "_bower": { 94 | "fontCharacter": "\\E009", 95 | "fontColor": "#e37933" 96 | }, 97 | "_bsl_light": { 98 | "fontCharacter": "\\E00A", 99 | "fontColor": "#b8383d" 100 | }, 101 | "_bsl": { 102 | "fontCharacter": "\\E00A", 103 | "fontColor": "#cc3e44" 104 | }, 105 | "_c_light": { 106 | "fontCharacter": "\\E00C", 107 | "fontColor": "#498ba7" 108 | }, 109 | "_c": { 110 | "fontCharacter": "\\E00C", 111 | "fontColor": "#519aba" 112 | }, 113 | "_c-sharp_light": { 114 | "fontCharacter": "\\E00B", 115 | "fontColor": "#498ba7" 116 | }, 117 | "_c-sharp": { 118 | "fontCharacter": "\\E00B", 119 | "fontColor": "#519aba" 120 | }, 121 | "_c_1_light": { 122 | "fontCharacter": "\\E00C", 123 | "fontColor": "#9068b0" 124 | }, 125 | "_c_1": { 126 | "fontCharacter": "\\E00C", 127 | "fontColor": "#a074c4" 128 | }, 129 | "_c_2_light": { 130 | "fontCharacter": "\\E00C", 131 | "fontColor": "#b7b73b" 132 | }, 133 | "_c_2": { 134 | "fontCharacter": "\\E00C", 135 | "fontColor": "#cbcb41" 136 | }, 137 | "_cake_light": { 138 | "fontCharacter": "\\E00D", 139 | "fontColor": "#b8383d" 140 | }, 141 | "_cake": { 142 | "fontCharacter": "\\E00D", 143 | "fontColor": "#cc3e44" 144 | }, 145 | "_cake_php_light": { 146 | "fontCharacter": "\\E00E", 147 | "fontColor": "#b8383d" 148 | }, 149 | "_cake_php": { 150 | "fontCharacter": "\\E00E", 151 | "fontColor": "#cc3e44" 152 | }, 153 | "_clock_light": { 154 | "fontCharacter": "\\E012", 155 | "fontColor": "#498ba7" 156 | }, 157 | "_clock": { 158 | "fontCharacter": "\\E012", 159 | "fontColor": "#519aba" 160 | }, 161 | "_clock_1_light": { 162 | "fontCharacter": "\\E012", 163 | "fontColor": "#627379" 164 | }, 165 | "_clock_1": { 166 | "fontCharacter": "\\E012", 167 | "fontColor": "#6d8086" 168 | }, 169 | "_clojure_light": { 170 | "fontCharacter": "\\E013", 171 | "fontColor": "#7fae42" 172 | }, 173 | "_clojure": { 174 | "fontCharacter": "\\E013", 175 | "fontColor": "#8dc149" 176 | }, 177 | "_clojure_1_light": { 178 | "fontCharacter": "\\E013", 179 | "fontColor": "#498ba7" 180 | }, 181 | "_clojure_1": { 182 | "fontCharacter": "\\E013", 183 | "fontColor": "#519aba" 184 | }, 185 | "_code-climate_light": { 186 | "fontCharacter": "\\E014", 187 | "fontColor": "#7fae42" 188 | }, 189 | "_code-climate": { 190 | "fontCharacter": "\\E014", 191 | "fontColor": "#8dc149" 192 | }, 193 | "_code-search_light": { 194 | "fontCharacter": "\\E015", 195 | "fontColor": "#9068b0" 196 | }, 197 | "_code-search": { 198 | "fontCharacter": "\\E015", 199 | "fontColor": "#a074c4" 200 | }, 201 | "_coffee_light": { 202 | "fontCharacter": "\\E016", 203 | "fontColor": "#b7b73b" 204 | }, 205 | "_coffee": { 206 | "fontCharacter": "\\E016", 207 | "fontColor": "#cbcb41" 208 | }, 209 | "_coldfusion_light": { 210 | "fontCharacter": "\\E018", 211 | "fontColor": "#498ba7" 212 | }, 213 | "_coldfusion": { 214 | "fontCharacter": "\\E018", 215 | "fontColor": "#519aba" 216 | }, 217 | "_config_light": { 218 | "fontCharacter": "\\E019", 219 | "fontColor": "#627379" 220 | }, 221 | "_config": { 222 | "fontCharacter": "\\E019", 223 | "fontColor": "#6d8086" 224 | }, 225 | "_cpp_light": { 226 | "fontCharacter": "\\E01A", 227 | "fontColor": "#498ba7" 228 | }, 229 | "_cpp": { 230 | "fontCharacter": "\\E01A", 231 | "fontColor": "#519aba" 232 | }, 233 | "_cpp_1_light": { 234 | "fontCharacter": "\\E01A", 235 | "fontColor": "#9068b0" 236 | }, 237 | "_cpp_1": { 238 | "fontCharacter": "\\E01A", 239 | "fontColor": "#a074c4" 240 | }, 241 | "_cpp_2_light": { 242 | "fontCharacter": "\\E01A", 243 | "fontColor": "#b7b73b" 244 | }, 245 | "_cpp_2": { 246 | "fontCharacter": "\\E01A", 247 | "fontColor": "#cbcb41" 248 | }, 249 | "_crystal_light": { 250 | "fontCharacter": "\\E01B", 251 | "fontColor": "#bfc2c1" 252 | }, 253 | "_crystal": { 254 | "fontCharacter": "\\E01B", 255 | "fontColor": "#d4d7d6" 256 | }, 257 | "_crystal_embedded_light": { 258 | "fontCharacter": "\\E01C", 259 | "fontColor": "#bfc2c1" 260 | }, 261 | "_crystal_embedded": { 262 | "fontCharacter": "\\E01C", 263 | "fontColor": "#d4d7d6" 264 | }, 265 | "_css_light": { 266 | "fontCharacter": "\\E01D", 267 | "fontColor": "#498ba7" 268 | }, 269 | "_css": { 270 | "fontCharacter": "\\E01D", 271 | "fontColor": "#519aba" 272 | }, 273 | "_csv_light": { 274 | "fontCharacter": "\\E01E", 275 | "fontColor": "#7fae42" 276 | }, 277 | "_csv": { 278 | "fontCharacter": "\\E01E", 279 | "fontColor": "#8dc149" 280 | }, 281 | "_cu_light": { 282 | "fontCharacter": "\\E01F", 283 | "fontColor": "#7fae42" 284 | }, 285 | "_cu": { 286 | "fontCharacter": "\\E01F", 287 | "fontColor": "#8dc149" 288 | }, 289 | "_cu_1_light": { 290 | "fontCharacter": "\\E01F", 291 | "fontColor": "#9068b0" 292 | }, 293 | "_cu_1": { 294 | "fontCharacter": "\\E01F", 295 | "fontColor": "#a074c4" 296 | }, 297 | "_d_light": { 298 | "fontCharacter": "\\E020", 299 | "fontColor": "#b8383d" 300 | }, 301 | "_d": { 302 | "fontCharacter": "\\E020", 303 | "fontColor": "#cc3e44" 304 | }, 305 | "_dart_light": { 306 | "fontCharacter": "\\E021", 307 | "fontColor": "#498ba7" 308 | }, 309 | "_dart": { 310 | "fontCharacter": "\\E021", 311 | "fontColor": "#519aba" 312 | }, 313 | "_db_light": { 314 | "fontCharacter": "\\E022", 315 | "fontColor": "#dd4b78" 316 | }, 317 | "_db": { 318 | "fontCharacter": "\\E022", 319 | "fontColor": "#f55385" 320 | }, 321 | "_db_1_light": { 322 | "fontCharacter": "\\E022", 323 | "fontColor": "#498ba7" 324 | }, 325 | "_db_1": { 326 | "fontCharacter": "\\E022", 327 | "fontColor": "#519aba" 328 | }, 329 | "_default_light": { 330 | "fontCharacter": "\\E023", 331 | "fontColor": "#bfc2c1" 332 | }, 333 | "_default": { 334 | "fontCharacter": "\\E023", 335 | "fontColor": "#d4d7d6" 336 | }, 337 | "_docker_light": { 338 | "fontCharacter": "\\E025", 339 | "fontColor": "#498ba7" 340 | }, 341 | "_docker": { 342 | "fontCharacter": "\\E025", 343 | "fontColor": "#519aba" 344 | }, 345 | "_docker_1_light": { 346 | "fontCharacter": "\\E025", 347 | "fontColor": "#455155" 348 | }, 349 | "_docker_1": { 350 | "fontCharacter": "\\E025", 351 | "fontColor": "#4d5a5e" 352 | }, 353 | "_docker_2_light": { 354 | "fontCharacter": "\\E025", 355 | "fontColor": "#7fae42" 356 | }, 357 | "_docker_2": { 358 | "fontCharacter": "\\E025", 359 | "fontColor": "#8dc149" 360 | }, 361 | "_docker_3_light": { 362 | "fontCharacter": "\\E025", 363 | "fontColor": "#dd4b78" 364 | }, 365 | "_docker_3": { 366 | "fontCharacter": "\\E025", 367 | "fontColor": "#f55385" 368 | }, 369 | "_ejs_light": { 370 | "fontCharacter": "\\E027", 371 | "fontColor": "#b7b73b" 372 | }, 373 | "_ejs": { 374 | "fontCharacter": "\\E027", 375 | "fontColor": "#cbcb41" 376 | }, 377 | "_elixir_light": { 378 | "fontCharacter": "\\E028", 379 | "fontColor": "#9068b0" 380 | }, 381 | "_elixir": { 382 | "fontCharacter": "\\E028", 383 | "fontColor": "#a074c4" 384 | }, 385 | "_elixir_script_light": { 386 | "fontCharacter": "\\E029", 387 | "fontColor": "#9068b0" 388 | }, 389 | "_elixir_script": { 390 | "fontCharacter": "\\E029", 391 | "fontColor": "#a074c4" 392 | }, 393 | "_elm_light": { 394 | "fontCharacter": "\\E02A", 395 | "fontColor": "#498ba7" 396 | }, 397 | "_elm": { 398 | "fontCharacter": "\\E02A", 399 | "fontColor": "#519aba" 400 | }, 401 | "_eslint_light": { 402 | "fontCharacter": "\\E02C", 403 | "fontColor": "#9068b0" 404 | }, 405 | "_eslint": { 406 | "fontCharacter": "\\E02C", 407 | "fontColor": "#a074c4" 408 | }, 409 | "_eslint_1_light": { 410 | "fontCharacter": "\\E02C", 411 | "fontColor": "#455155" 412 | }, 413 | "_eslint_1": { 414 | "fontCharacter": "\\E02C", 415 | "fontColor": "#4d5a5e" 416 | }, 417 | "_ethereum_light": { 418 | "fontCharacter": "\\E02D", 419 | "fontColor": "#498ba7" 420 | }, 421 | "_ethereum": { 422 | "fontCharacter": "\\E02D", 423 | "fontColor": "#519aba" 424 | }, 425 | "_f-sharp_light": { 426 | "fontCharacter": "\\E02E", 427 | "fontColor": "#498ba7" 428 | }, 429 | "_f-sharp": { 430 | "fontCharacter": "\\E02E", 431 | "fontColor": "#519aba" 432 | }, 433 | "_favicon_light": { 434 | "fontCharacter": "\\E02F", 435 | "fontColor": "#b7b73b" 436 | }, 437 | "_favicon": { 438 | "fontCharacter": "\\E02F", 439 | "fontColor": "#cbcb41" 440 | }, 441 | "_firebase_light": { 442 | "fontCharacter": "\\E030", 443 | "fontColor": "#cc6d2e" 444 | }, 445 | "_firebase": { 446 | "fontCharacter": "\\E030", 447 | "fontColor": "#e37933" 448 | }, 449 | "_firefox_light": { 450 | "fontCharacter": "\\E031", 451 | "fontColor": "#cc6d2e" 452 | }, 453 | "_firefox": { 454 | "fontCharacter": "\\E031", 455 | "fontColor": "#e37933" 456 | }, 457 | "_font_light": { 458 | "fontCharacter": "\\E033", 459 | "fontColor": "#b8383d" 460 | }, 461 | "_font": { 462 | "fontCharacter": "\\E033", 463 | "fontColor": "#cc3e44" 464 | }, 465 | "_git_light": { 466 | "fontCharacter": "\\E034", 467 | "fontColor": "#3b4b52" 468 | }, 469 | "_git": { 470 | "fontCharacter": "\\E034", 471 | "fontColor": "#41535b" 472 | }, 473 | "_github_light": { 474 | "fontCharacter": "\\E037", 475 | "fontColor": "#bfc2c1" 476 | }, 477 | "_github": { 478 | "fontCharacter": "\\E037", 479 | "fontColor": "#d4d7d6" 480 | }, 481 | "_gitlab_light": { 482 | "fontCharacter": "\\E038", 483 | "fontColor": "#cc6d2e" 484 | }, 485 | "_gitlab": { 486 | "fontCharacter": "\\E038", 487 | "fontColor": "#e37933" 488 | }, 489 | "_go_light": { 490 | "fontCharacter": "\\E039", 491 | "fontColor": "#498ba7" 492 | }, 493 | "_go": { 494 | "fontCharacter": "\\E039", 495 | "fontColor": "#519aba" 496 | }, 497 | "_go2_light": { 498 | "fontCharacter": "\\E03A", 499 | "fontColor": "#498ba7" 500 | }, 501 | "_go2": { 502 | "fontCharacter": "\\E03A", 503 | "fontColor": "#519aba" 504 | }, 505 | "_godot_light": { 506 | "fontCharacter": "\\E03B", 507 | "fontColor": "#498ba7" 508 | }, 509 | "_godot": { 510 | "fontCharacter": "\\E03B", 511 | "fontColor": "#519aba" 512 | }, 513 | "_godot_1_light": { 514 | "fontCharacter": "\\E03B", 515 | "fontColor": "#b8383d" 516 | }, 517 | "_godot_1": { 518 | "fontCharacter": "\\E03B", 519 | "fontColor": "#cc3e44" 520 | }, 521 | "_godot_2_light": { 522 | "fontCharacter": "\\E03B", 523 | "fontColor": "#b7b73b" 524 | }, 525 | "_godot_2": { 526 | "fontCharacter": "\\E03B", 527 | "fontColor": "#cbcb41" 528 | }, 529 | "_godot_3_light": { 530 | "fontCharacter": "\\E03B", 531 | "fontColor": "#9068b0" 532 | }, 533 | "_godot_3": { 534 | "fontCharacter": "\\E03B", 535 | "fontColor": "#a074c4" 536 | }, 537 | "_gradle_light": { 538 | "fontCharacter": "\\E03C", 539 | "fontColor": "#498ba7" 540 | }, 541 | "_gradle": { 542 | "fontCharacter": "\\E03C", 543 | "fontColor": "#519aba" 544 | }, 545 | "_grails_light": { 546 | "fontCharacter": "\\E03D", 547 | "fontColor": "#7fae42" 548 | }, 549 | "_grails": { 550 | "fontCharacter": "\\E03D", 551 | "fontColor": "#8dc149" 552 | }, 553 | "_graphql_light": { 554 | "fontCharacter": "\\E03E", 555 | "fontColor": "#dd4b78" 556 | }, 557 | "_graphql": { 558 | "fontCharacter": "\\E03E", 559 | "fontColor": "#f55385" 560 | }, 561 | "_grunt_light": { 562 | "fontCharacter": "\\E03F", 563 | "fontColor": "#cc6d2e" 564 | }, 565 | "_grunt": { 566 | "fontCharacter": "\\E03F", 567 | "fontColor": "#e37933" 568 | }, 569 | "_gulp_light": { 570 | "fontCharacter": "\\E040", 571 | "fontColor": "#b8383d" 572 | }, 573 | "_gulp": { 574 | "fontCharacter": "\\E040", 575 | "fontColor": "#cc3e44" 576 | }, 577 | "_hacklang_light": { 578 | "fontCharacter": "\\E041", 579 | "fontColor": "#cc6d2e" 580 | }, 581 | "_hacklang": { 582 | "fontCharacter": "\\E041", 583 | "fontColor": "#e37933" 584 | }, 585 | "_haml_light": { 586 | "fontCharacter": "\\E042", 587 | "fontColor": "#b8383d" 588 | }, 589 | "_haml": { 590 | "fontCharacter": "\\E042", 591 | "fontColor": "#cc3e44" 592 | }, 593 | "_happenings_light": { 594 | "fontCharacter": "\\E043", 595 | "fontColor": "#498ba7" 596 | }, 597 | "_happenings": { 598 | "fontCharacter": "\\E043", 599 | "fontColor": "#519aba" 600 | }, 601 | "_haskell_light": { 602 | "fontCharacter": "\\E044", 603 | "fontColor": "#9068b0" 604 | }, 605 | "_haskell": { 606 | "fontCharacter": "\\E044", 607 | "fontColor": "#a074c4" 608 | }, 609 | "_haxe_light": { 610 | "fontCharacter": "\\E045", 611 | "fontColor": "#cc6d2e" 612 | }, 613 | "_haxe": { 614 | "fontCharacter": "\\E045", 615 | "fontColor": "#e37933" 616 | }, 617 | "_haxe_1_light": { 618 | "fontCharacter": "\\E045", 619 | "fontColor": "#b7b73b" 620 | }, 621 | "_haxe_1": { 622 | "fontCharacter": "\\E045", 623 | "fontColor": "#cbcb41" 624 | }, 625 | "_haxe_2_light": { 626 | "fontCharacter": "\\E045", 627 | "fontColor": "#498ba7" 628 | }, 629 | "_haxe_2": { 630 | "fontCharacter": "\\E045", 631 | "fontColor": "#519aba" 632 | }, 633 | "_haxe_3_light": { 634 | "fontCharacter": "\\E045", 635 | "fontColor": "#9068b0" 636 | }, 637 | "_haxe_3": { 638 | "fontCharacter": "\\E045", 639 | "fontColor": "#a074c4" 640 | }, 641 | "_heroku_light": { 642 | "fontCharacter": "\\E046", 643 | "fontColor": "#9068b0" 644 | }, 645 | "_heroku": { 646 | "fontCharacter": "\\E046", 647 | "fontColor": "#a074c4" 648 | }, 649 | "_hex_light": { 650 | "fontCharacter": "\\E047", 651 | "fontColor": "#b8383d" 652 | }, 653 | "_hex": { 654 | "fontCharacter": "\\E047", 655 | "fontColor": "#cc3e44" 656 | }, 657 | "_html_light": { 658 | "fontCharacter": "\\E048", 659 | "fontColor": "#498ba7" 660 | }, 661 | "_html": { 662 | "fontCharacter": "\\E048", 663 | "fontColor": "#519aba" 664 | }, 665 | "_html_1_light": { 666 | "fontCharacter": "\\E048", 667 | "fontColor": "#7fae42" 668 | }, 669 | "_html_1": { 670 | "fontCharacter": "\\E048", 671 | "fontColor": "#8dc149" 672 | }, 673 | "_html_2_light": { 674 | "fontCharacter": "\\E048", 675 | "fontColor": "#b7b73b" 676 | }, 677 | "_html_2": { 678 | "fontCharacter": "\\E048", 679 | "fontColor": "#cbcb41" 680 | }, 681 | "_html_3_light": { 682 | "fontCharacter": "\\E048", 683 | "fontColor": "#cc6d2e" 684 | }, 685 | "_html_3": { 686 | "fontCharacter": "\\E048", 687 | "fontColor": "#e37933" 688 | }, 689 | "_html_erb_light": { 690 | "fontCharacter": "\\E049", 691 | "fontColor": "#b8383d" 692 | }, 693 | "_html_erb": { 694 | "fontCharacter": "\\E049", 695 | "fontColor": "#cc3e44" 696 | }, 697 | "_ignored_light": { 698 | "fontCharacter": "\\E04A", 699 | "fontColor": "#3b4b52" 700 | }, 701 | "_ignored": { 702 | "fontCharacter": "\\E04A", 703 | "fontColor": "#41535b" 704 | }, 705 | "_illustrator_light": { 706 | "fontCharacter": "\\E04B", 707 | "fontColor": "#b7b73b" 708 | }, 709 | "_illustrator": { 710 | "fontCharacter": "\\E04B", 711 | "fontColor": "#cbcb41" 712 | }, 713 | "_image_light": { 714 | "fontCharacter": "\\E04C", 715 | "fontColor": "#9068b0" 716 | }, 717 | "_image": { 718 | "fontCharacter": "\\E04C", 719 | "fontColor": "#a074c4" 720 | }, 721 | "_info_light": { 722 | "fontCharacter": "\\E04D", 723 | "fontColor": "#498ba7" 724 | }, 725 | "_info": { 726 | "fontCharacter": "\\E04D", 727 | "fontColor": "#519aba" 728 | }, 729 | "_ionic_light": { 730 | "fontCharacter": "\\E04E", 731 | "fontColor": "#498ba7" 732 | }, 733 | "_ionic": { 734 | "fontCharacter": "\\E04E", 735 | "fontColor": "#519aba" 736 | }, 737 | "_jade_light": { 738 | "fontCharacter": "\\E04F", 739 | "fontColor": "#b8383d" 740 | }, 741 | "_jade": { 742 | "fontCharacter": "\\E04F", 743 | "fontColor": "#cc3e44" 744 | }, 745 | "_java_light": { 746 | "fontCharacter": "\\E050", 747 | "fontColor": "#b8383d" 748 | }, 749 | "_java": { 750 | "fontCharacter": "\\E050", 751 | "fontColor": "#cc3e44" 752 | }, 753 | "_java_1_light": { 754 | "fontCharacter": "\\E050", 755 | "fontColor": "#498ba7" 756 | }, 757 | "_java_1": { 758 | "fontCharacter": "\\E050", 759 | "fontColor": "#519aba" 760 | }, 761 | "_javascript_light": { 762 | "fontCharacter": "\\E051", 763 | "fontColor": "#b7b73b" 764 | }, 765 | "_javascript": { 766 | "fontCharacter": "\\E051", 767 | "fontColor": "#cbcb41" 768 | }, 769 | "_javascript_1_light": { 770 | "fontCharacter": "\\E051", 771 | "fontColor": "#cc6d2e" 772 | }, 773 | "_javascript_1": { 774 | "fontCharacter": "\\E051", 775 | "fontColor": "#e37933" 776 | }, 777 | "_javascript_2_light": { 778 | "fontCharacter": "\\E051", 779 | "fontColor": "#498ba7" 780 | }, 781 | "_javascript_2": { 782 | "fontCharacter": "\\E051", 783 | "fontColor": "#519aba" 784 | }, 785 | "_jenkins_light": { 786 | "fontCharacter": "\\E052", 787 | "fontColor": "#b8383d" 788 | }, 789 | "_jenkins": { 790 | "fontCharacter": "\\E052", 791 | "fontColor": "#cc3e44" 792 | }, 793 | "_jinja_light": { 794 | "fontCharacter": "\\E053", 795 | "fontColor": "#b8383d" 796 | }, 797 | "_jinja": { 798 | "fontCharacter": "\\E053", 799 | "fontColor": "#cc3e44" 800 | }, 801 | "_json_light": { 802 | "fontCharacter": "\\E055", 803 | "fontColor": "#b7b73b" 804 | }, 805 | "_json": { 806 | "fontCharacter": "\\E055", 807 | "fontColor": "#cbcb41" 808 | }, 809 | "_json_1_light": { 810 | "fontCharacter": "\\E055", 811 | "fontColor": "#7fae42" 812 | }, 813 | "_json_1": { 814 | "fontCharacter": "\\E055", 815 | "fontColor": "#8dc149" 816 | }, 817 | "_julia_light": { 818 | "fontCharacter": "\\E056", 819 | "fontColor": "#9068b0" 820 | }, 821 | "_julia": { 822 | "fontCharacter": "\\E056", 823 | "fontColor": "#a074c4" 824 | }, 825 | "_karma_light": { 826 | "fontCharacter": "\\E057", 827 | "fontColor": "#7fae42" 828 | }, 829 | "_karma": { 830 | "fontCharacter": "\\E057", 831 | "fontColor": "#8dc149" 832 | }, 833 | "_kotlin_light": { 834 | "fontCharacter": "\\E058", 835 | "fontColor": "#cc6d2e" 836 | }, 837 | "_kotlin": { 838 | "fontCharacter": "\\E058", 839 | "fontColor": "#e37933" 840 | }, 841 | "_less_light": { 842 | "fontCharacter": "\\E059", 843 | "fontColor": "#498ba7" 844 | }, 845 | "_less": { 846 | "fontCharacter": "\\E059", 847 | "fontColor": "#519aba" 848 | }, 849 | "_license_light": { 850 | "fontCharacter": "\\E05A", 851 | "fontColor": "#b7b73b" 852 | }, 853 | "_license": { 854 | "fontCharacter": "\\E05A", 855 | "fontColor": "#cbcb41" 856 | }, 857 | "_license_1_light": { 858 | "fontCharacter": "\\E05A", 859 | "fontColor": "#cc6d2e" 860 | }, 861 | "_license_1": { 862 | "fontCharacter": "\\E05A", 863 | "fontColor": "#e37933" 864 | }, 865 | "_license_2_light": { 866 | "fontCharacter": "\\E05A", 867 | "fontColor": "#b8383d" 868 | }, 869 | "_license_2": { 870 | "fontCharacter": "\\E05A", 871 | "fontColor": "#cc3e44" 872 | }, 873 | "_liquid_light": { 874 | "fontCharacter": "\\E05B", 875 | "fontColor": "#7fae42" 876 | }, 877 | "_liquid": { 878 | "fontCharacter": "\\E05B", 879 | "fontColor": "#8dc149" 880 | }, 881 | "_livescript_light": { 882 | "fontCharacter": "\\E05C", 883 | "fontColor": "#498ba7" 884 | }, 885 | "_livescript": { 886 | "fontCharacter": "\\E05C", 887 | "fontColor": "#519aba" 888 | }, 889 | "_lock_light": { 890 | "fontCharacter": "\\E05D", 891 | "fontColor": "#7fae42" 892 | }, 893 | "_lock": { 894 | "fontCharacter": "\\E05D", 895 | "fontColor": "#8dc149" 896 | }, 897 | "_lua_light": { 898 | "fontCharacter": "\\E05E", 899 | "fontColor": "#498ba7" 900 | }, 901 | "_lua": { 902 | "fontCharacter": "\\E05E", 903 | "fontColor": "#519aba" 904 | }, 905 | "_makefile_light": { 906 | "fontCharacter": "\\E05F", 907 | "fontColor": "#cc6d2e" 908 | }, 909 | "_makefile": { 910 | "fontCharacter": "\\E05F", 911 | "fontColor": "#e37933" 912 | }, 913 | "_makefile_1_light": { 914 | "fontCharacter": "\\E05F", 915 | "fontColor": "#9068b0" 916 | }, 917 | "_makefile_1": { 918 | "fontCharacter": "\\E05F", 919 | "fontColor": "#a074c4" 920 | }, 921 | "_makefile_2_light": { 922 | "fontCharacter": "\\E05F", 923 | "fontColor": "#627379" 924 | }, 925 | "_makefile_2": { 926 | "fontCharacter": "\\E05F", 927 | "fontColor": "#6d8086" 928 | }, 929 | "_makefile_3_light": { 930 | "fontCharacter": "\\E05F", 931 | "fontColor": "#498ba7" 932 | }, 933 | "_makefile_3": { 934 | "fontCharacter": "\\E05F", 935 | "fontColor": "#519aba" 936 | }, 937 | "_markdown_light": { 938 | "fontCharacter": "\\E060", 939 | "fontColor": "#498ba7" 940 | }, 941 | "_markdown": { 942 | "fontCharacter": "\\E060", 943 | "fontColor": "#519aba" 944 | }, 945 | "_maven_light": { 946 | "fontCharacter": "\\E061", 947 | "fontColor": "#b8383d" 948 | }, 949 | "_maven": { 950 | "fontCharacter": "\\E061", 951 | "fontColor": "#cc3e44" 952 | }, 953 | "_mdo_light": { 954 | "fontCharacter": "\\E062", 955 | "fontColor": "#b8383d" 956 | }, 957 | "_mdo": { 958 | "fontCharacter": "\\E062", 959 | "fontColor": "#cc3e44" 960 | }, 961 | "_mustache_light": { 962 | "fontCharacter": "\\E063", 963 | "fontColor": "#cc6d2e" 964 | }, 965 | "_mustache": { 966 | "fontCharacter": "\\E063", 967 | "fontColor": "#e37933" 968 | }, 969 | "_nim_light": { 970 | "fontCharacter": "\\E065", 971 | "fontColor": "#b7b73b" 972 | }, 973 | "_nim": { 974 | "fontCharacter": "\\E065", 975 | "fontColor": "#cbcb41" 976 | }, 977 | "_notebook_light": { 978 | "fontCharacter": "\\E066", 979 | "fontColor": "#498ba7" 980 | }, 981 | "_notebook": { 982 | "fontCharacter": "\\E066", 983 | "fontColor": "#519aba" 984 | }, 985 | "_npm_light": { 986 | "fontCharacter": "\\E067", 987 | "fontColor": "#3b4b52" 988 | }, 989 | "_npm": { 990 | "fontCharacter": "\\E067", 991 | "fontColor": "#41535b" 992 | }, 993 | "_npm_1_light": { 994 | "fontCharacter": "\\E067", 995 | "fontColor": "#b8383d" 996 | }, 997 | "_npm_1": { 998 | "fontCharacter": "\\E067", 999 | "fontColor": "#cc3e44" 1000 | }, 1001 | "_npm_ignored_light": { 1002 | "fontCharacter": "\\E068", 1003 | "fontColor": "#3b4b52" 1004 | }, 1005 | "_npm_ignored": { 1006 | "fontCharacter": "\\E068", 1007 | "fontColor": "#41535b" 1008 | }, 1009 | "_nunjucks_light": { 1010 | "fontCharacter": "\\E069", 1011 | "fontColor": "#7fae42" 1012 | }, 1013 | "_nunjucks": { 1014 | "fontCharacter": "\\E069", 1015 | "fontColor": "#8dc149" 1016 | }, 1017 | "_ocaml_light": { 1018 | "fontCharacter": "\\E06A", 1019 | "fontColor": "#cc6d2e" 1020 | }, 1021 | "_ocaml": { 1022 | "fontCharacter": "\\E06A", 1023 | "fontColor": "#e37933" 1024 | }, 1025 | "_odata_light": { 1026 | "fontCharacter": "\\E06B", 1027 | "fontColor": "#cc6d2e" 1028 | }, 1029 | "_odata": { 1030 | "fontCharacter": "\\E06B", 1031 | "fontColor": "#e37933" 1032 | }, 1033 | "_pddl_light": { 1034 | "fontCharacter": "\\E06C", 1035 | "fontColor": "#9068b0" 1036 | }, 1037 | "_pddl": { 1038 | "fontCharacter": "\\E06C", 1039 | "fontColor": "#a074c4" 1040 | }, 1041 | "_pdf_light": { 1042 | "fontCharacter": "\\E06D", 1043 | "fontColor": "#b8383d" 1044 | }, 1045 | "_pdf": { 1046 | "fontCharacter": "\\E06D", 1047 | "fontColor": "#cc3e44" 1048 | }, 1049 | "_perl_light": { 1050 | "fontCharacter": "\\E06E", 1051 | "fontColor": "#498ba7" 1052 | }, 1053 | "_perl": { 1054 | "fontCharacter": "\\E06E", 1055 | "fontColor": "#519aba" 1056 | }, 1057 | "_photoshop_light": { 1058 | "fontCharacter": "\\E06F", 1059 | "fontColor": "#498ba7" 1060 | }, 1061 | "_photoshop": { 1062 | "fontCharacter": "\\E06F", 1063 | "fontColor": "#519aba" 1064 | }, 1065 | "_php_light": { 1066 | "fontCharacter": "\\E070", 1067 | "fontColor": "#9068b0" 1068 | }, 1069 | "_php": { 1070 | "fontCharacter": "\\E070", 1071 | "fontColor": "#a074c4" 1072 | }, 1073 | "_pipeline_light": { 1074 | "fontCharacter": "\\E071", 1075 | "fontColor": "#cc6d2e" 1076 | }, 1077 | "_pipeline": { 1078 | "fontCharacter": "\\E071", 1079 | "fontColor": "#e37933" 1080 | }, 1081 | "_plan_light": { 1082 | "fontCharacter": "\\E072", 1083 | "fontColor": "#7fae42" 1084 | }, 1085 | "_plan": { 1086 | "fontCharacter": "\\E072", 1087 | "fontColor": "#8dc149" 1088 | }, 1089 | "_platformio_light": { 1090 | "fontCharacter": "\\E073", 1091 | "fontColor": "#cc6d2e" 1092 | }, 1093 | "_platformio": { 1094 | "fontCharacter": "\\E073", 1095 | "fontColor": "#e37933" 1096 | }, 1097 | "_powershell_light": { 1098 | "fontCharacter": "\\E074", 1099 | "fontColor": "#498ba7" 1100 | }, 1101 | "_powershell": { 1102 | "fontCharacter": "\\E074", 1103 | "fontColor": "#519aba" 1104 | }, 1105 | "_prisma_light": { 1106 | "fontCharacter": "\\E075", 1107 | "fontColor": "#498ba7" 1108 | }, 1109 | "_prisma": { 1110 | "fontCharacter": "\\E075", 1111 | "fontColor": "#519aba" 1112 | }, 1113 | "_prolog_light": { 1114 | "fontCharacter": "\\E077", 1115 | "fontColor": "#cc6d2e" 1116 | }, 1117 | "_prolog": { 1118 | "fontCharacter": "\\E077", 1119 | "fontColor": "#e37933" 1120 | }, 1121 | "_pug_light": { 1122 | "fontCharacter": "\\E078", 1123 | "fontColor": "#b8383d" 1124 | }, 1125 | "_pug": { 1126 | "fontCharacter": "\\E078", 1127 | "fontColor": "#cc3e44" 1128 | }, 1129 | "_puppet_light": { 1130 | "fontCharacter": "\\E079", 1131 | "fontColor": "#b7b73b" 1132 | }, 1133 | "_puppet": { 1134 | "fontCharacter": "\\E079", 1135 | "fontColor": "#cbcb41" 1136 | }, 1137 | "_purescript_light": { 1138 | "fontCharacter": "\\E07A", 1139 | "fontColor": "#bfc2c1" 1140 | }, 1141 | "_purescript": { 1142 | "fontCharacter": "\\E07A", 1143 | "fontColor": "#d4d7d6" 1144 | }, 1145 | "_python_light": { 1146 | "fontCharacter": "\\E07B", 1147 | "fontColor": "#498ba7" 1148 | }, 1149 | "_python": { 1150 | "fontCharacter": "\\E07B", 1151 | "fontColor": "#519aba" 1152 | }, 1153 | "_react_light": { 1154 | "fontCharacter": "\\E07D", 1155 | "fontColor": "#498ba7" 1156 | }, 1157 | "_react": { 1158 | "fontCharacter": "\\E07D", 1159 | "fontColor": "#519aba" 1160 | }, 1161 | "_react_1_light": { 1162 | "fontCharacter": "\\E07D", 1163 | "fontColor": "#cc6d2e" 1164 | }, 1165 | "_react_1": { 1166 | "fontCharacter": "\\E07D", 1167 | "fontColor": "#e37933" 1168 | }, 1169 | "_reasonml_light": { 1170 | "fontCharacter": "\\E07E", 1171 | "fontColor": "#b8383d" 1172 | }, 1173 | "_reasonml": { 1174 | "fontCharacter": "\\E07E", 1175 | "fontColor": "#cc3e44" 1176 | }, 1177 | "_rescript_light": { 1178 | "fontCharacter": "\\E07F", 1179 | "fontColor": "#b8383d" 1180 | }, 1181 | "_rescript": { 1182 | "fontCharacter": "\\E07F", 1183 | "fontColor": "#cc3e44" 1184 | }, 1185 | "_rescript_1_light": { 1186 | "fontCharacter": "\\E07F", 1187 | "fontColor": "#dd4b78" 1188 | }, 1189 | "_rescript_1": { 1190 | "fontCharacter": "\\E07F", 1191 | "fontColor": "#f55385" 1192 | }, 1193 | "_rollup_light": { 1194 | "fontCharacter": "\\E080", 1195 | "fontColor": "#b8383d" 1196 | }, 1197 | "_rollup": { 1198 | "fontCharacter": "\\E080", 1199 | "fontColor": "#cc3e44" 1200 | }, 1201 | "_ruby_light": { 1202 | "fontCharacter": "\\E081", 1203 | "fontColor": "#b8383d" 1204 | }, 1205 | "_ruby": { 1206 | "fontCharacter": "\\E081", 1207 | "fontColor": "#cc3e44" 1208 | }, 1209 | "_rust_light": { 1210 | "fontCharacter": "\\E082", 1211 | "fontColor": "#627379" 1212 | }, 1213 | "_rust": { 1214 | "fontCharacter": "\\E082", 1215 | "fontColor": "#6d8086" 1216 | }, 1217 | "_salesforce_light": { 1218 | "fontCharacter": "\\E083", 1219 | "fontColor": "#498ba7" 1220 | }, 1221 | "_salesforce": { 1222 | "fontCharacter": "\\E083", 1223 | "fontColor": "#519aba" 1224 | }, 1225 | "_sass_light": { 1226 | "fontCharacter": "\\E084", 1227 | "fontColor": "#dd4b78" 1228 | }, 1229 | "_sass": { 1230 | "fontCharacter": "\\E084", 1231 | "fontColor": "#f55385" 1232 | }, 1233 | "_sbt_light": { 1234 | "fontCharacter": "\\E085", 1235 | "fontColor": "#498ba7" 1236 | }, 1237 | "_sbt": { 1238 | "fontCharacter": "\\E085", 1239 | "fontColor": "#519aba" 1240 | }, 1241 | "_scala_light": { 1242 | "fontCharacter": "\\E086", 1243 | "fontColor": "#b8383d" 1244 | }, 1245 | "_scala": { 1246 | "fontCharacter": "\\E086", 1247 | "fontColor": "#cc3e44" 1248 | }, 1249 | "_shell_light": { 1250 | "fontCharacter": "\\E089", 1251 | "fontColor": "#7fae42" 1252 | }, 1253 | "_shell": { 1254 | "fontCharacter": "\\E089", 1255 | "fontColor": "#8dc149" 1256 | }, 1257 | "_slim_light": { 1258 | "fontCharacter": "\\E08A", 1259 | "fontColor": "#cc6d2e" 1260 | }, 1261 | "_slim": { 1262 | "fontCharacter": "\\E08A", 1263 | "fontColor": "#e37933" 1264 | }, 1265 | "_smarty_light": { 1266 | "fontCharacter": "\\E08B", 1267 | "fontColor": "#b7b73b" 1268 | }, 1269 | "_smarty": { 1270 | "fontCharacter": "\\E08B", 1271 | "fontColor": "#cbcb41" 1272 | }, 1273 | "_spring_light": { 1274 | "fontCharacter": "\\E08C", 1275 | "fontColor": "#7fae42" 1276 | }, 1277 | "_spring": { 1278 | "fontCharacter": "\\E08C", 1279 | "fontColor": "#8dc149" 1280 | }, 1281 | "_stylelint_light": { 1282 | "fontCharacter": "\\E08D", 1283 | "fontColor": "#bfc2c1" 1284 | }, 1285 | "_stylelint": { 1286 | "fontCharacter": "\\E08D", 1287 | "fontColor": "#d4d7d6" 1288 | }, 1289 | "_stylelint_1_light": { 1290 | "fontCharacter": "\\E08D", 1291 | "fontColor": "#455155" 1292 | }, 1293 | "_stylelint_1": { 1294 | "fontCharacter": "\\E08D", 1295 | "fontColor": "#4d5a5e" 1296 | }, 1297 | "_stylus_light": { 1298 | "fontCharacter": "\\E08E", 1299 | "fontColor": "#7fae42" 1300 | }, 1301 | "_stylus": { 1302 | "fontCharacter": "\\E08E", 1303 | "fontColor": "#8dc149" 1304 | }, 1305 | "_sublime_light": { 1306 | "fontCharacter": "\\E08F", 1307 | "fontColor": "#cc6d2e" 1308 | }, 1309 | "_sublime": { 1310 | "fontCharacter": "\\E08F", 1311 | "fontColor": "#e37933" 1312 | }, 1313 | "_svelte_light": { 1314 | "fontCharacter": "\\E090", 1315 | "fontColor": "#b8383d" 1316 | }, 1317 | "_svelte": { 1318 | "fontCharacter": "\\E090", 1319 | "fontColor": "#cc3e44" 1320 | }, 1321 | "_svg_light": { 1322 | "fontCharacter": "\\E091", 1323 | "fontColor": "#9068b0" 1324 | }, 1325 | "_svg": { 1326 | "fontCharacter": "\\E091", 1327 | "fontColor": "#a074c4" 1328 | }, 1329 | "_svg_1_light": { 1330 | "fontCharacter": "\\E091", 1331 | "fontColor": "#498ba7" 1332 | }, 1333 | "_svg_1": { 1334 | "fontCharacter": "\\E091", 1335 | "fontColor": "#519aba" 1336 | }, 1337 | "_swift_light": { 1338 | "fontCharacter": "\\E092", 1339 | "fontColor": "#cc6d2e" 1340 | }, 1341 | "_swift": { 1342 | "fontCharacter": "\\E092", 1343 | "fontColor": "#e37933" 1344 | }, 1345 | "_terraform_light": { 1346 | "fontCharacter": "\\E093", 1347 | "fontColor": "#9068b0" 1348 | }, 1349 | "_terraform": { 1350 | "fontCharacter": "\\E093", 1351 | "fontColor": "#a074c4" 1352 | }, 1353 | "_tex_light": { 1354 | "fontCharacter": "\\E094", 1355 | "fontColor": "#498ba7" 1356 | }, 1357 | "_tex": { 1358 | "fontCharacter": "\\E094", 1359 | "fontColor": "#519aba" 1360 | }, 1361 | "_tex_1_light": { 1362 | "fontCharacter": "\\E094", 1363 | "fontColor": "#b7b73b" 1364 | }, 1365 | "_tex_1": { 1366 | "fontCharacter": "\\E094", 1367 | "fontColor": "#cbcb41" 1368 | }, 1369 | "_tex_2_light": { 1370 | "fontCharacter": "\\E094", 1371 | "fontColor": "#cc6d2e" 1372 | }, 1373 | "_tex_2": { 1374 | "fontCharacter": "\\E094", 1375 | "fontColor": "#e37933" 1376 | }, 1377 | "_tex_3_light": { 1378 | "fontCharacter": "\\E094", 1379 | "fontColor": "#bfc2c1" 1380 | }, 1381 | "_tex_3": { 1382 | "fontCharacter": "\\E094", 1383 | "fontColor": "#d4d7d6" 1384 | }, 1385 | "_todo": { 1386 | "fontCharacter": "\\E096" 1387 | }, 1388 | "_tsconfig_light": { 1389 | "fontCharacter": "\\E097", 1390 | "fontColor": "#498ba7" 1391 | }, 1392 | "_tsconfig": { 1393 | "fontCharacter": "\\E097", 1394 | "fontColor": "#519aba" 1395 | }, 1396 | "_twig_light": { 1397 | "fontCharacter": "\\E098", 1398 | "fontColor": "#7fae42" 1399 | }, 1400 | "_twig": { 1401 | "fontCharacter": "\\E098", 1402 | "fontColor": "#8dc149" 1403 | }, 1404 | "_typescript_light": { 1405 | "fontCharacter": "\\E099", 1406 | "fontColor": "#498ba7" 1407 | }, 1408 | "_typescript": { 1409 | "fontCharacter": "\\E099", 1410 | "fontColor": "#519aba" 1411 | }, 1412 | "_typescript_1_light": { 1413 | "fontCharacter": "\\E099", 1414 | "fontColor": "#cc6d2e" 1415 | }, 1416 | "_typescript_1": { 1417 | "fontCharacter": "\\E099", 1418 | "fontColor": "#e37933" 1419 | }, 1420 | "_vala_light": { 1421 | "fontCharacter": "\\E09A", 1422 | "fontColor": "#627379" 1423 | }, 1424 | "_vala": { 1425 | "fontCharacter": "\\E09A", 1426 | "fontColor": "#6d8086" 1427 | }, 1428 | "_video_light": { 1429 | "fontCharacter": "\\E09B", 1430 | "fontColor": "#dd4b78" 1431 | }, 1432 | "_video": { 1433 | "fontCharacter": "\\E09B", 1434 | "fontColor": "#f55385" 1435 | }, 1436 | "_vue_light": { 1437 | "fontCharacter": "\\E09C", 1438 | "fontColor": "#7fae42" 1439 | }, 1440 | "_vue": { 1441 | "fontCharacter": "\\E09C", 1442 | "fontColor": "#8dc149" 1443 | }, 1444 | "_wasm_light": { 1445 | "fontCharacter": "\\E09D", 1446 | "fontColor": "#9068b0" 1447 | }, 1448 | "_wasm": { 1449 | "fontCharacter": "\\E09D", 1450 | "fontColor": "#a074c4" 1451 | }, 1452 | "_wat_light": { 1453 | "fontCharacter": "\\E09E", 1454 | "fontColor": "#9068b0" 1455 | }, 1456 | "_wat": { 1457 | "fontCharacter": "\\E09E", 1458 | "fontColor": "#a074c4" 1459 | }, 1460 | "_webpack_light": { 1461 | "fontCharacter": "\\E09F", 1462 | "fontColor": "#498ba7" 1463 | }, 1464 | "_webpack": { 1465 | "fontCharacter": "\\E09F", 1466 | "fontColor": "#519aba" 1467 | }, 1468 | "_wgt_light": { 1469 | "fontCharacter": "\\E0A0", 1470 | "fontColor": "#498ba7" 1471 | }, 1472 | "_wgt": { 1473 | "fontCharacter": "\\E0A0", 1474 | "fontColor": "#519aba" 1475 | }, 1476 | "_windows_light": { 1477 | "fontCharacter": "\\E0A1", 1478 | "fontColor": "#498ba7" 1479 | }, 1480 | "_windows": { 1481 | "fontCharacter": "\\E0A1", 1482 | "fontColor": "#519aba" 1483 | }, 1484 | "_word_light": { 1485 | "fontCharacter": "\\E0A2", 1486 | "fontColor": "#498ba7" 1487 | }, 1488 | "_word": { 1489 | "fontCharacter": "\\E0A2", 1490 | "fontColor": "#519aba" 1491 | }, 1492 | "_xls_light": { 1493 | "fontCharacter": "\\E0A3", 1494 | "fontColor": "#7fae42" 1495 | }, 1496 | "_xls": { 1497 | "fontCharacter": "\\E0A3", 1498 | "fontColor": "#8dc149" 1499 | }, 1500 | "_xml_light": { 1501 | "fontCharacter": "\\E0A4", 1502 | "fontColor": "#cc6d2e" 1503 | }, 1504 | "_xml": { 1505 | "fontCharacter": "\\E0A4", 1506 | "fontColor": "#e37933" 1507 | }, 1508 | "_yarn_light": { 1509 | "fontCharacter": "\\E0A5", 1510 | "fontColor": "#498ba7" 1511 | }, 1512 | "_yarn": { 1513 | "fontCharacter": "\\E0A5", 1514 | "fontColor": "#519aba" 1515 | }, 1516 | "_yml_light": { 1517 | "fontCharacter": "\\E0A6", 1518 | "fontColor": "#9068b0" 1519 | }, 1520 | "_yml": { 1521 | "fontCharacter": "\\E0A6", 1522 | "fontColor": "#a074c4" 1523 | }, 1524 | "_zig_light": { 1525 | "fontCharacter": "\\E0A7", 1526 | "fontColor": "#cc6d2e" 1527 | }, 1528 | "_zig": { 1529 | "fontCharacter": "\\E0A7", 1530 | "fontColor": "#e37933" 1531 | }, 1532 | "_zip_light": { 1533 | "fontCharacter": "\\E0A8", 1534 | "fontColor": "#b8383d" 1535 | }, 1536 | "_zip": { 1537 | "fontCharacter": "\\E0A8", 1538 | "fontColor": "#cc3e44" 1539 | }, 1540 | "_zip_1_light": { 1541 | "fontCharacter": "\\E0A8", 1542 | "fontColor": "#627379" 1543 | }, 1544 | "_zip_1": { 1545 | "fontCharacter": "\\E0A8", 1546 | "fontColor": "#6d8086" 1547 | } 1548 | }, 1549 | "file": "_default", 1550 | "fileExtensions": { 1551 | "bsl": "_bsl", 1552 | "mdo": "_mdo", 1553 | "cls": "_salesforce", 1554 | "apex": "_salesforce", 1555 | "asm": "_asm", 1556 | "s": "_asm", 1557 | "bicep": "_bicep", 1558 | "bzl": "_bazel", 1559 | "bazel": "_bazel", 1560 | "build": "_bazel", 1561 | "workspace": "_bazel", 1562 | "bazelignore": "_bazel", 1563 | "bazelversion": "_bazel", 1564 | "h": "_c_1", 1565 | "aspx": "_html", 1566 | "ascx": "_html_1", 1567 | "asax": "_html_2", 1568 | "master": "_html_2", 1569 | "hh": "_cpp_1", 1570 | "hpp": "_cpp_1", 1571 | "hxx": "_cpp_1", 1572 | "h++": "_cpp_1", 1573 | "edn": "_clojure_1", 1574 | "cfc": "_coldfusion", 1575 | "cfm": "_coldfusion", 1576 | "litcoffee": "_coffee", 1577 | "config": "_config", 1578 | "cr": "_crystal", 1579 | "ecr": "_crystal_embedded", 1580 | "slang": "_crystal_embedded", 1581 | "cson": "_json", 1582 | "css.map": "_css", 1583 | "css": "_css", 1584 | "sss": "_css", 1585 | "csv": "_csv", 1586 | "xls": "_xls", 1587 | "xlsx": "_xls", 1588 | "cuh": "_cu_1", 1589 | "hu": "_cu_1", 1590 | "cake": "_cake", 1591 | "ctp": "_cake_php", 1592 | "d": "_d", 1593 | "doc": "_word", 1594 | "docx": "_word", 1595 | "ejs": "_ejs", 1596 | "ex": "_elixir", 1597 | "exs": "_elixir_script", 1598 | "elm": "_elm", 1599 | "ico": "_favicon", 1600 | "gitconfig": "_git", 1601 | "gitkeep": "_git", 1602 | "gitattributes": "_git", 1603 | "gitmodules": "_git", 1604 | "slide": "_go", 1605 | "article": "_go", 1606 | "gd": "_godot", 1607 | "godot": "_godot_1", 1608 | "tres": "_godot_2", 1609 | "tscn": "_godot_3", 1610 | "gradle": "_gradle", 1611 | "gsp": "_grails", 1612 | "gql": "_graphql", 1613 | "graphql": "_graphql", 1614 | "graphqls": "_graphql", 1615 | "hack": "_hacklang", 1616 | "haml": "_haml", 1617 | "hs": "_haskell", 1618 | "lhs": "_haskell", 1619 | "hx": "_haxe", 1620 | "hxs": "_haxe_1", 1621 | "hxp": "_haxe_2", 1622 | "hxml": "_haxe_3", 1623 | "jade": "_jade", 1624 | "class": "_java_1", 1625 | "classpath": "_java", 1626 | "js.map": "_javascript", 1627 | "js": "_javascript", 1628 | "spec.js": "_javascript_1", 1629 | "test.js": "_javascript_1", 1630 | "es": "_javascript", 1631 | "es5": "_javascript", 1632 | "es7": "_javascript", 1633 | "jinja": "_jinja", 1634 | "jinja2": "_jinja", 1635 | "kt": "_kotlin", 1636 | "kts": "_kotlin", 1637 | "liquid": "_liquid", 1638 | "ls": "_livescript", 1639 | "argdown": "_argdown", 1640 | "ad": "_argdown", 1641 | "mustache": "_mustache", 1642 | "stache": "_mustache", 1643 | "nim": "_nim", 1644 | "nims": "_nim", 1645 | "github-issues": "_github", 1646 | "ipynb": "_notebook", 1647 | "njk": "_nunjucks", 1648 | "nunjucks": "_nunjucks", 1649 | "nunjs": "_nunjucks", 1650 | "nunj": "_nunjucks", 1651 | "njs": "_nunjucks", 1652 | "nj": "_nunjucks", 1653 | "npm-debug.log": "_npm", 1654 | "npmignore": "_npm_1", 1655 | "npmrc": "_npm_1", 1656 | "ml": "_ocaml", 1657 | "mli": "_ocaml", 1658 | "cmx": "_ocaml", 1659 | "cmxa": "_ocaml", 1660 | "odata": "_odata", 1661 | "php.inc": "_php", 1662 | "pipeline": "_pipeline", 1663 | "pddl": "_pddl", 1664 | "plan": "_plan", 1665 | "happenings": "_happenings", 1666 | "prisma": "_prisma", 1667 | "pp": "_puppet", 1668 | "epp": "_puppet", 1669 | "purs": "_purescript", 1670 | "spec.jsx": "_react_1", 1671 | "test.jsx": "_react_1", 1672 | "cjsx": "_react", 1673 | "spec.tsx": "_react_1", 1674 | "test.tsx": "_react_1", 1675 | "re": "_reasonml", 1676 | "res": "_rescript", 1677 | "resi": "_rescript_1", 1678 | "r": "_R", 1679 | "rmd": "_R", 1680 | "erb": "_html_erb", 1681 | "erb.html": "_html_erb", 1682 | "html.erb": "_html_erb", 1683 | "sass": "_sass", 1684 | "springbeans": "_spring", 1685 | "slim": "_slim", 1686 | "smarty.tpl": "_smarty", 1687 | "tpl": "_smarty", 1688 | "sbt": "_sbt", 1689 | "scala": "_scala", 1690 | "sol": "_ethereum", 1691 | "styl": "_stylus", 1692 | "svelte": "_svelte", 1693 | "soql": "_db_1", 1694 | "tf": "_terraform", 1695 | "tf.json": "_terraform", 1696 | "tfvars": "_terraform", 1697 | "tfvars.json": "_terraform", 1698 | "dtx": "_tex_2", 1699 | "ins": "_tex_3", 1700 | "toml": "_config", 1701 | "twig": "_twig", 1702 | "spec.ts": "_typescript_1", 1703 | "test.ts": "_typescript_1", 1704 | "vala": "_vala", 1705 | "vapi": "_vala", 1706 | "component": "_html_3", 1707 | "vue": "_vue", 1708 | "wasm": "_wasm", 1709 | "wat": "_wat", 1710 | "pro": "_prolog", 1711 | "zig": "_zig", 1712 | "jar": "_zip", 1713 | "zip": "_zip_1", 1714 | "wgt": "_wgt", 1715 | "ai": "_illustrator", 1716 | "psd": "_photoshop", 1717 | "pdf": "_pdf", 1718 | "eot": "_font", 1719 | "ttf": "_font", 1720 | "woff": "_font", 1721 | "woff2": "_font", 1722 | "avif": "_image", 1723 | "gif": "_image", 1724 | "jpg": "_image", 1725 | "jpeg": "_image", 1726 | "png": "_image", 1727 | "pxm": "_image", 1728 | "svg": "_svg", 1729 | "svgx": "_image", 1730 | "tiff": "_image", 1731 | "webp": "_image", 1732 | "sublime-project": "_sublime", 1733 | "sublime-workspace": "_sublime", 1734 | "mov": "_video", 1735 | "ogv": "_video", 1736 | "webm": "_video", 1737 | "avi": "_video", 1738 | "mpg": "_video", 1739 | "mp4": "_video", 1740 | "mp3": "_audio", 1741 | "ogg": "_audio", 1742 | "wav": "_audio", 1743 | "flac": "_audio", 1744 | "3ds": "_svg_1", 1745 | "3dm": "_svg_1", 1746 | "stl": "_svg_1", 1747 | "obj": "_svg_1", 1748 | "dae": "_svg_1", 1749 | "babelrc": "_babel", 1750 | "babelrc.js": "_babel", 1751 | "babelrc.cjs": "_babel", 1752 | "bazelrc": "_bazel_1", 1753 | "bowerrc": "_bower", 1754 | "dockerignore": "_docker_1", 1755 | "codeclimate.yml": "_code-climate", 1756 | "eslintrc": "_eslint", 1757 | "eslintrc.js": "_eslint", 1758 | "eslintrc.cjs": "_eslint", 1759 | "eslintrc.yaml": "_eslint", 1760 | "eslintrc.yml": "_eslint", 1761 | "eslintrc.json": "_eslint", 1762 | "eslintignore": "_eslint_1", 1763 | "firebaserc": "_firebase", 1764 | "gitlab-ci.yml": "_gitlab", 1765 | "jshintrc": "_javascript_2", 1766 | "jscsrc": "_javascript_2", 1767 | "stylelintrc": "_stylelint", 1768 | "stylelintrc.json": "_stylelint", 1769 | "stylelintrc.yaml": "_stylelint", 1770 | "stylelintrc.yml": "_stylelint", 1771 | "stylelintrc.js": "_stylelint", 1772 | "stylelintignore": "_stylelint_1", 1773 | "direnv": "_config", 1774 | "env": "_config", 1775 | "static": "_config", 1776 | "slugignore": "_config", 1777 | "tmp": "_clock_1", 1778 | "htaccess": "_config", 1779 | "key": "_lock", 1780 | "cert": "_lock", 1781 | "cer": "_lock", 1782 | "crt": "_lock", 1783 | "pem": "_lock", 1784 | "ds_store": "_ignored" 1785 | }, 1786 | "fileNames": { 1787 | "mix": "_hex", 1788 | "karma.conf.js": "_karma", 1789 | "karma.conf.coffee": "_karma", 1790 | "readme.md": "_info", 1791 | "readme.txt": "_info", 1792 | "readme": "_info", 1793 | "changelog.md": "_clock", 1794 | "changelog.txt": "_clock", 1795 | "changelog": "_clock", 1796 | "changes.md": "_clock", 1797 | "changes.txt": "_clock", 1798 | "changes": "_clock", 1799 | "version.md": "_clock", 1800 | "version.txt": "_clock", 1801 | "version": "_clock", 1802 | "mvnw": "_maven", 1803 | "tsconfig.json": "_tsconfig", 1804 | "swagger.json": "_json_1", 1805 | "swagger.yml": "_json_1", 1806 | "swagger.yaml": "_json_1", 1807 | "mime.types": "_config", 1808 | "jenkinsfile": "_jenkins", 1809 | "babel.config.js": "_babel", 1810 | "babel.config.json": "_babel", 1811 | "babel.config.cjs": "_babel", 1812 | "build": "_bazel", 1813 | "build.bazel": "_bazel", 1814 | "workspace": "_bazel", 1815 | "workspace.bazel": "_bazel", 1816 | "bower.json": "_bower", 1817 | "docker-healthcheck": "_docker_2", 1818 | "firebase.json": "_firebase", 1819 | "geckodriver": "_firefox", 1820 | "gruntfile.js": "_grunt", 1821 | "gruntfile.babel.js": "_grunt", 1822 | "gruntfile.coffee": "_grunt", 1823 | "gulpfile": "_gulp", 1824 | "gulpfile.js": "_gulp", 1825 | "ionic.config.json": "_ionic", 1826 | "ionic.project": "_ionic", 1827 | "platformio.ini": "_platformio", 1828 | "rollup.config.js": "_rollup", 1829 | "sass-lint.yml": "_sass", 1830 | "stylelint.config.js": "_stylelint", 1831 | "stylelint.config.cjs": "_stylelint", 1832 | "yarn.clean": "_yarn", 1833 | "yarn.lock": "_yarn", 1834 | "webpack.config.js": "_webpack", 1835 | "webpack.config.cjs": "_webpack", 1836 | "webpack.config.ts": "_webpack", 1837 | "webpack.config.build.js": "_webpack", 1838 | "webpack.config.build.cjs": "_webpack", 1839 | "webpack.config.build.ts": "_webpack", 1840 | "webpack.common.js": "_webpack", 1841 | "webpack.common.cjs": "_webpack", 1842 | "webpack.common.ts": "_webpack", 1843 | "webpack.dev.js": "_webpack", 1844 | "webpack.dev.cjs": "_webpack", 1845 | "webpack.dev.ts": "_webpack", 1846 | "webpack.prod.js": "_webpack", 1847 | "webpack.prod.cjs": "_webpack", 1848 | "webpack.prod.ts": "_webpack", 1849 | "license": "_license", 1850 | "licence": "_license", 1851 | "license.txt": "_license", 1852 | "licence.txt": "_license", 1853 | "license.md": "_license", 1854 | "licence.md": "_license", 1855 | "copying": "_license", 1856 | "copying.txt": "_license", 1857 | "copying.md": "_license", 1858 | "compiling": "_license_1", 1859 | "compiling.txt": "_license_1", 1860 | "compiling.md": "_license_1", 1861 | "contributing": "_license_2", 1862 | "contributing.txt": "_license_2", 1863 | "contributing.md": "_license_2", 1864 | "qmakefile": "_makefile_1", 1865 | "omakefile": "_makefile_2", 1866 | "cmakelists.txt": "_makefile_3", 1867 | "procfile": "_heroku", 1868 | "todo": "_todo", 1869 | "todo.txt": "_todo", 1870 | "todo.md": "_todo", 1871 | "npm-debug.log": "_npm_ignored" 1872 | }, 1873 | "languageIds": { 1874 | "bat": "_windows", 1875 | "clojure": "_clojure", 1876 | "coffeescript": "_coffee", 1877 | "jsonc": "_json", 1878 | "json": "_json", 1879 | "c": "_c", 1880 | "cpp": "_cpp", 1881 | "cuda-cpp": "_cu", 1882 | "csharp": "_c-sharp", 1883 | "css": "_css", 1884 | "dart": "_dart", 1885 | "dockerfile": "_docker", 1886 | "ignore": "_git", 1887 | "fsharp": "_f-sharp", 1888 | "git-commit": "_git", 1889 | "go": "_go2", 1890 | "groovy": "_grails", 1891 | "handlebars": "_mustache", 1892 | "html": "_html_3", 1893 | "properties": "_config", 1894 | "java": "_java", 1895 | "javascriptreact": "_react", 1896 | "javascript": "_javascript", 1897 | "julia": "_julia", 1898 | "tex": "_tex_1", 1899 | "latex": "_tex", 1900 | "less": "_less", 1901 | "lua": "_lua", 1902 | "makefile": "_makefile", 1903 | "markdown": "_markdown", 1904 | "objective-c": "_c_2", 1905 | "objective-cpp": "_cpp_2", 1906 | "perl": "_perl", 1907 | "php": "_php", 1908 | "powershell": "_powershell", 1909 | "jade": "_pug", 1910 | "python": "_python", 1911 | "r": "_R", 1912 | "razor": "_html", 1913 | "ruby": "_ruby", 1914 | "rust": "_rust", 1915 | "scss": "_sass", 1916 | "search-result": "_code-search", 1917 | "shellscript": "_shell", 1918 | "sql": "_db", 1919 | "swift": "_swift", 1920 | "typescript": "_typescript", 1921 | "typescriptreact": "_typescript", 1922 | "xml": "_xml", 1923 | "dockercompose": "_docker_3", 1924 | "yaml": "_yml", 1925 | "argdown": "_argdown", 1926 | "bicep": "_bicep", 1927 | "elixir": "_elixir", 1928 | "elm": "_elm", 1929 | "erb": "_html_erb", 1930 | "github-issues": "_github", 1931 | "gradle": "_gradle", 1932 | "godot": "_godot", 1933 | "haml": "_haml", 1934 | "haskell": "_haskell", 1935 | "haxe": "_haxe", 1936 | "jinja": "_jinja", 1937 | "kotlin": "_kotlin", 1938 | "mustache": "_mustache", 1939 | "nunjucks": "_nunjucks", 1940 | "ocaml": "_ocaml", 1941 | "rescript": "_rescript", 1942 | "sass": "_sass", 1943 | "stylus": "_stylus", 1944 | "terraform": "_terraform", 1945 | "todo": "_todo", 1946 | "vala": "_vala", 1947 | "vue": "_vue", 1948 | "postcss": "_css", 1949 | "django-html": "_html_3", 1950 | "blade": "_php" 1951 | }, 1952 | "light": { 1953 | "file": "_default_light", 1954 | "fileExtensions": { 1955 | "bsl": "_bsl_light", 1956 | "mdo": "_mdo_light", 1957 | "cls": "_salesforce_light", 1958 | "apex": "_salesforce_light", 1959 | "asm": "_asm_light", 1960 | "s": "_asm_light", 1961 | "bicep": "_bicep_light", 1962 | "bzl": "_bazel_light", 1963 | "bazel": "_bazel_light", 1964 | "build": "_bazel_light", 1965 | "workspace": "_bazel_light", 1966 | "bazelignore": "_bazel_light", 1967 | "bazelversion": "_bazel_light", 1968 | "h": "_c_1_light", 1969 | "aspx": "_html_light", 1970 | "ascx": "_html_1_light", 1971 | "asax": "_html_2_light", 1972 | "master": "_html_2_light", 1973 | "hh": "_cpp_1_light", 1974 | "hpp": "_cpp_1_light", 1975 | "hxx": "_cpp_1_light", 1976 | "h++": "_cpp_1_light", 1977 | "edn": "_clojure_1_light", 1978 | "cfc": "_coldfusion_light", 1979 | "cfm": "_coldfusion_light", 1980 | "litcoffee": "_coffee_light", 1981 | "config": "_config_light", 1982 | "cr": "_crystal_light", 1983 | "ecr": "_crystal_embedded_light", 1984 | "slang": "_crystal_embedded_light", 1985 | "cson": "_json_light", 1986 | "css.map": "_css_light", 1987 | "sss": "_css_light", 1988 | "csv": "_csv_light", 1989 | "xls": "_xls_light", 1990 | "xlsx": "_xls_light", 1991 | "cuh": "_cu_1_light", 1992 | "hu": "_cu_1_light", 1993 | "cake": "_cake_light", 1994 | "ctp": "_cake_php_light", 1995 | "d": "_d_light", 1996 | "doc": "_word_light", 1997 | "docx": "_word_light", 1998 | "ejs": "_ejs_light", 1999 | "ex": "_elixir_light", 2000 | "exs": "_elixir_script_light", 2001 | "elm": "_elm_light", 2002 | "ico": "_favicon_light", 2003 | "gitconfig": "_git_light", 2004 | "gitkeep": "_git_light", 2005 | "gitattributes": "_git_light", 2006 | "gitmodules": "_git_light", 2007 | "slide": "_go_light", 2008 | "article": "_go_light", 2009 | "gd": "_godot_light", 2010 | "godot": "_godot_1_light", 2011 | "tres": "_godot_2_light", 2012 | "tscn": "_godot_3_light", 2013 | "gradle": "_gradle_light", 2014 | "gsp": "_grails_light", 2015 | "gql": "_graphql_light", 2016 | "graphql": "_graphql_light", 2017 | "graphqls": "_graphql_light", 2018 | "hack": "_hacklang_light", 2019 | "haml": "_haml_light", 2020 | "hs": "_haskell_light", 2021 | "lhs": "_haskell_light", 2022 | "hx": "_haxe_light", 2023 | "hxs": "_haxe_1_light", 2024 | "hxp": "_haxe_2_light", 2025 | "hxml": "_haxe_3_light", 2026 | "jade": "_jade_light", 2027 | "class": "_java_1_light", 2028 | "classpath": "_java_light", 2029 | "js.map": "_javascript_light", 2030 | "js": "_javascript_light", 2031 | "spec.js": "_javascript_1_light", 2032 | "test.js": "_javascript_1_light", 2033 | "es": "_javascript_light", 2034 | "es5": "_javascript_light", 2035 | "es7": "_javascript_light", 2036 | "jinja": "_jinja_light", 2037 | "jinja2": "_jinja_light", 2038 | "kt": "_kotlin_light", 2039 | "kts": "_kotlin_light", 2040 | "liquid": "_liquid_light", 2041 | "ls": "_livescript_light", 2042 | "argdown": "_argdown_light", 2043 | "ad": "_argdown_light", 2044 | "mustache": "_mustache_light", 2045 | "stache": "_mustache_light", 2046 | "nim": "_nim_light", 2047 | "nims": "_nim_light", 2048 | "github-issues": "_github_light", 2049 | "ipynb": "_notebook_light", 2050 | "njk": "_nunjucks_light", 2051 | "nunjucks": "_nunjucks_light", 2052 | "nunjs": "_nunjucks_light", 2053 | "nunj": "_nunjucks_light", 2054 | "njs": "_nunjucks_light", 2055 | "nj": "_nunjucks_light", 2056 | "npm-debug.log": "_npm_light", 2057 | "npmignore": "_npm_1_light", 2058 | "npmrc": "_npm_1_light", 2059 | "ml": "_ocaml_light", 2060 | "mli": "_ocaml_light", 2061 | "cmx": "_ocaml_light", 2062 | "cmxa": "_ocaml_light", 2063 | "odata": "_odata_light", 2064 | "php.inc": "_php_light", 2065 | "pipeline": "_pipeline_light", 2066 | "pddl": "_pddl_light", 2067 | "plan": "_plan_light", 2068 | "happenings": "_happenings_light", 2069 | "prisma": "_prisma_light", 2070 | "pp": "_puppet_light", 2071 | "epp": "_puppet_light", 2072 | "purs": "_purescript_light", 2073 | "spec.jsx": "_react_1_light", 2074 | "test.jsx": "_react_1_light", 2075 | "cjsx": "_react_light", 2076 | "spec.tsx": "_react_1_light", 2077 | "test.tsx": "_react_1_light", 2078 | "re": "_reasonml_light", 2079 | "res": "_rescript_light", 2080 | "resi": "_rescript_1_light", 2081 | "r": "_R_light", 2082 | "rmd": "_R_light", 2083 | "erb": "_html_erb_light", 2084 | "erb.html": "_html_erb_light", 2085 | "html.erb": "_html_erb_light", 2086 | "sass": "_sass_light", 2087 | "springbeans": "_spring_light", 2088 | "slim": "_slim_light", 2089 | "smarty.tpl": "_smarty_light", 2090 | "tpl": "_smarty_light", 2091 | "sbt": "_sbt_light", 2092 | "scala": "_scala_light", 2093 | "sol": "_ethereum_light", 2094 | "styl": "_stylus_light", 2095 | "svelte": "_svelte_light", 2096 | "soql": "_db_1_light", 2097 | "tf": "_terraform_light", 2098 | "tf.json": "_terraform_light", 2099 | "tfvars": "_terraform_light", 2100 | "tfvars.json": "_terraform_light", 2101 | "dtx": "_tex_2_light", 2102 | "ins": "_tex_3_light", 2103 | "toml": "_config_light", 2104 | "twig": "_twig_light", 2105 | "spec.ts": "_typescript_1_light", 2106 | "test.ts": "_typescript_1_light", 2107 | "vala": "_vala_light", 2108 | "vapi": "_vala_light", 2109 | "component": "_html_3_light", 2110 | "vue": "_vue_light", 2111 | "wasm": "_wasm_light", 2112 | "wat": "_wat_light", 2113 | "pro": "_prolog_light", 2114 | "zig": "_zig_light", 2115 | "jar": "_zip_light", 2116 | "zip": "_zip_1_light", 2117 | "wgt": "_wgt_light", 2118 | "ai": "_illustrator_light", 2119 | "psd": "_photoshop_light", 2120 | "pdf": "_pdf_light", 2121 | "eot": "_font_light", 2122 | "ttf": "_font_light", 2123 | "woff": "_font_light", 2124 | "woff2": "_font_light", 2125 | "avif": "_image_light", 2126 | "gif": "_image_light", 2127 | "jpg": "_image_light", 2128 | "jpeg": "_image_light", 2129 | "png": "_image_light", 2130 | "pxm": "_image_light", 2131 | "svg": "_svg_light", 2132 | "svgx": "_image_light", 2133 | "tiff": "_image_light", 2134 | "webp": "_image_light", 2135 | "sublime-project": "_sublime_light", 2136 | "sublime-workspace": "_sublime_light", 2137 | "mov": "_video_light", 2138 | "ogv": "_video_light", 2139 | "webm": "_video_light", 2140 | "avi": "_video_light", 2141 | "mpg": "_video_light", 2142 | "mp4": "_video_light", 2143 | "mp3": "_audio_light", 2144 | "ogg": "_audio_light", 2145 | "wav": "_audio_light", 2146 | "flac": "_audio_light", 2147 | "3ds": "_svg_1_light", 2148 | "3dm": "_svg_1_light", 2149 | "stl": "_svg_1_light", 2150 | "obj": "_svg_1_light", 2151 | "dae": "_svg_1_light", 2152 | "babelrc": "_babel_light", 2153 | "babelrc.js": "_babel_light", 2154 | "babelrc.cjs": "_babel_light", 2155 | "bazelrc": "_bazel_1_light", 2156 | "bowerrc": "_bower_light", 2157 | "dockerignore": "_docker_1_light", 2158 | "codeclimate.yml": "_code-climate_light", 2159 | "eslintrc": "_eslint_light", 2160 | "eslintrc.js": "_eslint_light", 2161 | "eslintrc.cjs": "_eslint_light", 2162 | "eslintrc.yaml": "_eslint_light", 2163 | "eslintrc.yml": "_eslint_light", 2164 | "eslintrc.json": "_eslint_light", 2165 | "eslintignore": "_eslint_1_light", 2166 | "firebaserc": "_firebase_light", 2167 | "gitlab-ci.yml": "_gitlab_light", 2168 | "jshintrc": "_javascript_2_light", 2169 | "jscsrc": "_javascript_2_light", 2170 | "stylelintrc": "_stylelint_light", 2171 | "stylelintrc.json": "_stylelint_light", 2172 | "stylelintrc.yaml": "_stylelint_light", 2173 | "stylelintrc.yml": "_stylelint_light", 2174 | "stylelintrc.js": "_stylelint_light", 2175 | "stylelintignore": "_stylelint_1_light", 2176 | "direnv": "_config_light", 2177 | "env": "_config_light", 2178 | "static": "_config_light", 2179 | "slugignore": "_config_light", 2180 | "tmp": "_clock_1_light", 2181 | "htaccess": "_config_light", 2182 | "key": "_lock_light", 2183 | "cert": "_lock_light", 2184 | "cer": "_lock_light", 2185 | "crt": "_lock_light", 2186 | "pem": "_lock_light", 2187 | "ds_store": "_ignored_light" 2188 | }, 2189 | "languageIds": { 2190 | "bat": "_windows_light", 2191 | "clojure": "_clojure_light", 2192 | "coffeescript": "_coffee_light", 2193 | "jsonc": "_json_light", 2194 | "json": "_json_light", 2195 | "c": "_c_light", 2196 | "cpp": "_cpp_light", 2197 | "cuda-cpp": "_cu_light", 2198 | "csharp": "_c-sharp_light", 2199 | "css": "_css_light", 2200 | "dart": "_dart_light", 2201 | "dockerfile": "_docker_light", 2202 | "ignore": "_git_light", 2203 | "fsharp": "_f-sharp_light", 2204 | "git-commit": "_git_light", 2205 | "go": "_go2_light", 2206 | "groovy": "_grails_light", 2207 | "handlebars": "_mustache_light", 2208 | "html": "_html_3_light", 2209 | "properties": "_config_light", 2210 | "java": "_java_light", 2211 | "javascriptreact": "_react_light", 2212 | "javascript": "_javascript_light", 2213 | "julia": "_julia_light", 2214 | "tex": "_tex_1_light", 2215 | "latex": "_tex_light", 2216 | "less": "_less_light", 2217 | "lua": "_lua_light", 2218 | "makefile": "_makefile_light", 2219 | "markdown": "_markdown_light", 2220 | "objective-c": "_c_2_light", 2221 | "objective-cpp": "_cpp_2_light", 2222 | "perl": "_perl_light", 2223 | "php": "_php_light", 2224 | "powershell": "_powershell_light", 2225 | "jade": "_pug_light", 2226 | "python": "_python_light", 2227 | "r": "_R_light", 2228 | "razor": "_html_light", 2229 | "ruby": "_ruby_light", 2230 | "rust": "_rust_light", 2231 | "scss": "_sass_light", 2232 | "search-result": "_code-search_light", 2233 | "shellscript": "_shell_light", 2234 | "sql": "_db_light", 2235 | "swift": "_swift_light", 2236 | "typescript": "_typescript_light", 2237 | "typescriptreact": "_typescript_light", 2238 | "xml": "_xml_light", 2239 | "dockercompose": "_docker_3_light", 2240 | "yaml": "_yml_light", 2241 | "argdown": "_argdown_light", 2242 | "bicep": "_bicep_light", 2243 | "elixir": "_elixir_light", 2244 | "elm": "_elm_light", 2245 | "erb": "_html_erb_light", 2246 | "github-issues": "_github_light", 2247 | "gradle": "_gradle_light", 2248 | "godot": "_godot_light", 2249 | "haml": "_haml_light", 2250 | "haskell": "_haskell_light", 2251 | "haxe": "_haxe_light", 2252 | "jinja": "_jinja_light", 2253 | "kotlin": "_kotlin_light", 2254 | "mustache": "_mustache_light", 2255 | "nunjucks": "_nunjucks_light", 2256 | "ocaml": "_ocaml_light", 2257 | "rescript": "_rescript_light", 2258 | "sass": "_sass_light", 2259 | "stylus": "_stylus_light", 2260 | "terraform": "_terraform_light", 2261 | "vala": "_vala_light", 2262 | "vue": "_vue_light", 2263 | "postcss": "_css_light", 2264 | "django-html": "_html_3_light", 2265 | "blade": "_php_light" 2266 | }, 2267 | "fileNames": { 2268 | "mix": "_hex_light", 2269 | "karma.conf.js": "_karma_light", 2270 | "karma.conf.coffee": "_karma_light", 2271 | "readme.md": "_info_light", 2272 | "readme.txt": "_info_light", 2273 | "readme": "_info_light", 2274 | "changelog.md": "_clock_light", 2275 | "changelog.txt": "_clock_light", 2276 | "changelog": "_clock_light", 2277 | "changes.md": "_clock_light", 2278 | "changes.txt": "_clock_light", 2279 | "changes": "_clock_light", 2280 | "version.md": "_clock_light", 2281 | "version.txt": "_clock_light", 2282 | "version": "_clock_light", 2283 | "mvnw": "_maven_light", 2284 | "tsconfig.json": "_tsconfig_light", 2285 | "swagger.json": "_json_1_light", 2286 | "swagger.yml": "_json_1_light", 2287 | "swagger.yaml": "_json_1_light", 2288 | "mime.types": "_config_light", 2289 | "jenkinsfile": "_jenkins_light", 2290 | "babel.config.js": "_babel_light", 2291 | "babel.config.json": "_babel_light", 2292 | "babel.config.cjs": "_babel_light", 2293 | "build": "_bazel_light", 2294 | "build.bazel": "_bazel_light", 2295 | "workspace": "_bazel_light", 2296 | "workspace.bazel": "_bazel_light", 2297 | "bower.json": "_bower_light", 2298 | "docker-healthcheck": "_docker_2_light", 2299 | "firebase.json": "_firebase_light", 2300 | "geckodriver": "_firefox_light", 2301 | "gruntfile.js": "_grunt_light", 2302 | "gruntfile.babel.js": "_grunt_light", 2303 | "gruntfile.coffee": "_grunt_light", 2304 | "gulpfile": "_gulp_light", 2305 | "gulpfile.js": "_gulp_light", 2306 | "ionic.config.json": "_ionic_light", 2307 | "ionic.project": "_ionic_light", 2308 | "platformio.ini": "_platformio_light", 2309 | "rollup.config.js": "_rollup_light", 2310 | "sass-lint.yml": "_sass_light", 2311 | "stylelint.config.js": "_stylelint_light", 2312 | "stylelint.config.cjs": "_stylelint_light", 2313 | "yarn.clean": "_yarn_light", 2314 | "yarn.lock": "_yarn_light", 2315 | "webpack.config.js": "_webpack_light", 2316 | "webpack.config.cjs": "_webpack_light", 2317 | "webpack.config.ts": "_webpack_light", 2318 | "webpack.config.build.js": "_webpack_light", 2319 | "webpack.config.build.cjs": "_webpack_light", 2320 | "webpack.config.build.ts": "_webpack_light", 2321 | "webpack.common.js": "_webpack_light", 2322 | "webpack.common.cjs": "_webpack_light", 2323 | "webpack.common.ts": "_webpack_light", 2324 | "webpack.dev.js": "_webpack_light", 2325 | "webpack.dev.cjs": "_webpack_light", 2326 | "webpack.dev.ts": "_webpack_light", 2327 | "webpack.prod.js": "_webpack_light", 2328 | "webpack.prod.cjs": "_webpack_light", 2329 | "webpack.prod.ts": "_webpack_light", 2330 | "license": "_license_light", 2331 | "licence": "_license_light", 2332 | "license.txt": "_license_light", 2333 | "licence.txt": "_license_light", 2334 | "license.md": "_license_light", 2335 | "licence.md": "_license_light", 2336 | "copying": "_license_light", 2337 | "copying.txt": "_license_light", 2338 | "copying.md": "_license_light", 2339 | "compiling": "_license_1_light", 2340 | "compiling.txt": "_license_1_light", 2341 | "compiling.md": "_license_1_light", 2342 | "contributing": "_license_2_light", 2343 | "contributing.txt": "_license_2_light", 2344 | "contributing.md": "_license_2_light", 2345 | "qmakefile": "_makefile_1_light", 2346 | "omakefile": "_makefile_2_light", 2347 | "cmakelists.txt": "_makefile_3_light", 2348 | "procfile": "_heroku_light", 2349 | "npm-debug.log": "_npm_ignored_light" 2350 | } 2351 | }, 2352 | "version": "https://github.com/jesseweed/seti-ui/commit/fd20793e5a75b350eab8d489165fb9b420df3f62" 2353 | } -------------------------------------------------------------------------------- /solid-app/src/App.module.css: -------------------------------------------------------------------------------- 1 | .App { 2 | padding: 20px; 3 | } 4 | 5 | .topBar { 6 | display: flex; 7 | align-items: flex-end; 8 | gap: 5px; 9 | } -------------------------------------------------------------------------------- /solid-app/src/App.tsx: -------------------------------------------------------------------------------- 1 | import { Component, createEffect, Show, on, type JSX } from 'solid-js'; 2 | import { createStore } from "solid-js/store"; 3 | import vscode from 'vscode'; 4 | import { 5 | provideVSCodeDesignSystem, 6 | vsCodeButton, 7 | vsCodeTextField, 8 | vsCodePanels, 9 | vsCodePanelTab, 10 | vsCodePanelView, 11 | } from "@vscode/webview-ui-toolkit"; 12 | import { minimatch } from 'minimatch'; 13 | 14 | import List from "./List"; 15 | import styles from './App.module.css'; 16 | import importPatterns from './importPatterns'; 17 | import { countResults } from './utils'; 18 | import { CustomTextSearchMatch, FileDefinition } from './types'; 19 | 20 | provideVSCodeDesignSystem().register( 21 | vsCodeButton(), 22 | vsCodeTextField(), 23 | vsCodePanels(), 24 | vsCodePanelTab(), 25 | vsCodePanelView(), 26 | ); 27 | 28 | const [state, setState] = createStore({ 29 | intoResults: [] as CustomTextSearchMatch[], 30 | intoResultsLoading: 0, 31 | outofResults: [] as CustomTextSearchMatch[], 32 | outofResultsLoading: 0, 33 | workspace: null as vscode.WorkspaceFolder[] | null, 34 | activeEditor: null as vscode.TextEditor | null, 35 | }); 36 | 37 | const clearIntoResults = () => setState({ intoResults: [], intoResultsLoading: 0 }); 38 | const clearOutofResults = () => setState({ outofResults: [], outofResultsLoading: 0 }); 39 | 40 | window.addEventListener('message', event => { 41 | const message = event.data; // The JSON data our extension sent 42 | 43 | if (message.result) { 44 | // console.log('result', message.for, message.result, message.activeEditor); 45 | // Square bracket notation is used to access the correct results properties from state 46 | if ('done' in message) return setState(state => 47 | ({ [`${message.for}ResultsLoading`]: state[`${message.for as 'into' | 'outof'}ResultsLoading`] - 1 })); 48 | 49 | 50 | if (state.activeEditor?.document.fileName.includes(message.activeEditor)) 51 | setState(state => ({ 52 | [`${message.for}Results`]: [...state[`${message.for as 'into' | 'outof'}Results`], message.result].sort((a, b) => { 53 | if (a.ranges[0][0].line < b.ranges[0][0].line) return -1; 54 | if (a.ranges[0][0].line > b.ranges[0][0].line) return 1; 55 | return 0; 56 | }) 57 | })); 58 | } 59 | else if (message.workspace) { 60 | setState(state => ({ workspace: message.workspace })); 61 | console.log(state.workspace); 62 | } 63 | else if (message.activeEditor) { 64 | setState(state => ({ activeEditor: message.activeEditor })); 65 | console.log(state.activeEditor); 66 | } 67 | }); 68 | 69 | window.vscode.postMessage({ command: 'getWorkspace' }); 70 | window.vscode.postMessage({ command: 'getActiveEditor' }); 71 | 72 | const $jsonScript = document.querySelector('script#vs-seti-icon-theme') as HTMLScriptElement | null; 73 | if (!$jsonScript) throw new Error('vs-seti-icon-theme script not found'); 74 | fetch($jsonScript.src) 75 | .then(res => res.json()) 76 | .then(data => { 77 | console.log('vscode seti date', data); 78 | window['vs-seti-icon-theme'] = data; 79 | }); 80 | 81 | 82 | const fileDefinitionMatch = (filepath: string, fileDefinition: FileDefinition) => !!filepath.match(new RegExp(`.*\/${fileDefinition.folder}\/.*\.${fileDefinition.extension || '.*'}`)); 83 | 84 | const getCurrentFilePath = () => { 85 | if (!state.activeEditor || !state.workspace) return null; 86 | const workspacePath = state.workspace[0].uri.path; 87 | const editorPath = state.activeEditor.document.uri.path; 88 | return editorPath.replace(workspacePath, ''); 89 | }; 90 | 91 | const matchedIntoImportPatterns = () => { 92 | const currentFilePath = getCurrentFilePath(); 93 | if (!currentFilePath) return []; 94 | return importPatterns.filter(pattern => fileDefinitionMatch(currentFilePath, pattern.fileDefinition)); 95 | }; 96 | 97 | const matchedOutofImportPatterns = () => { 98 | const currentFilePath = getCurrentFilePath(); 99 | if (!currentFilePath) return []; 100 | return importPatterns.filter(pattern => fileDefinitionMatch(currentFilePath, pattern.fileDefinition)); 101 | }; 102 | 103 | // Send find commands for current active file import patterns 104 | createEffect(on(() => state.activeEditor, () => { 105 | clearIntoResults(); 106 | clearOutofResults(); 107 | 108 | const currentFilePath = getCurrentFilePath(); 109 | if (!currentFilePath) return; 110 | const fullFilename = currentFilePath.includes('/') ? currentFilePath.split('/').pop() : currentFilePath; 111 | if (!fullFilename) return; 112 | const filename = fullFilename.includes('.') ? fullFilename.split('.').splice(0, fullFilename.split('.').length - 1).join('.') : fullFilename; 113 | if (!filename) return; 114 | 115 | for (const importPattern of matchedIntoImportPatterns()) { 116 | for (const condition of importPattern.conditions) { 117 | setState(state => ({ intoResultsLoading: state.intoResultsLoading + 1 })); 118 | window.vscode.postMessage({ 119 | command: 'find', 120 | for: 'into', 121 | activeEditor: currentFilePath, 122 | textSearchQuery: { 123 | pattern: condition.regex('customFilenameFunc' in condition ? 124 | condition.customFilenameFunc(currentFilePath, fullFilename, filename) : 125 | filename 126 | ), 127 | isRegExp: true 128 | }, 129 | textSearchOptions: { 130 | ...('include' in condition && { include: condition.include }), 131 | } 132 | }); 133 | } 134 | } 135 | 136 | 137 | for (const importPattern of importPatterns) { 138 | for (const condition of importPattern.conditions) { 139 | if (!minimatch(currentFilePath.slice(1), condition.include)) continue; 140 | setState(state => ({ outofResultsLoading: state.outofResultsLoading + 1 })); 141 | window.vscode.postMessage({ 142 | command: 'find', 143 | for: 'outof', 144 | activeEditor: currentFilePath, 145 | fileDefinition: importPattern.fileDefinition, 146 | textSearchQuery: { 147 | pattern: condition.regex('(?[A-Za-z0-9-_,\\s]+)'), 148 | isRegExp: true 149 | }, 150 | textSearchOptions: { 151 | include: currentFilePath.slice(1), 152 | } 153 | }); 154 | } 155 | } 156 | })); 157 | 158 | let panel: JSX.IntrinsicElements["vscode-panels"] | undefined; 159 | 160 | createEffect(() => { 161 | // console.log("HIT"); 162 | if (state.intoResultsLoading || state.outofResultsLoading) return; 163 | // console.log('panel', panel); 164 | if (!panel) return; 165 | // console.log('panel.activeTabIndex', panel.activeTabIndex); 166 | if (panel.activeTabIndex === 0 && state.intoResults.length === 0 && state.outofResults.length > 0) 167 | panel.querySelector('vscode-panel-tab#tab-2').click(); 168 | else if (panel.activeTabIndex === 1 && state.outofResults.length === 0 && state.intoResults.length > 0) 169 | panel.querySelector('vscode-panel-tab#tab-1').click(); 170 | }); 171 | 172 | 173 | const App: Component = () => { 174 | return ( 175 |
176 | {/*
intoResultsLoading {state.intoResultsLoading}
177 |
outofResultsLoading {state.outofResultsLoading}
*/} 178 | 179 | ACTIVE FILE USED IN {`(${countResults(state.intoResults)})`} 180 | 181 | ACTIVE FILE USES {`(${countResults(state.outofResults)})`} 182 | 183 | 184 | 185 |
186 |
{getCurrentFilePath()}
187 | 188 | 189 |
190 | No import patterns found for current file 191 |
192 |
193 | 194 | 195 |
196 |
197 | 198 | 199 |
200 |
{getCurrentFilePath()}
201 | 202 | 203 |
204 | No import patterns found for current file 205 |
206 |
207 | 208 | 209 |
210 |
211 | 212 |
213 |
214 | ); 215 | }; 216 | 217 | export default App; -------------------------------------------------------------------------------- /solid-app/src/List.tsx: -------------------------------------------------------------------------------- 1 | import { Component, For } from 'solid-js'; 2 | import Result from './Result'; 3 | import vscode from 'vscode'; 4 | import { 5 | provideVSCodeDesignSystem, 6 | vsCodeProgressRing 7 | } from "@vscode/webview-ui-toolkit"; 8 | import { countResults } from './utils'; 9 | import { CustomTextSearchMatch } from './types'; 10 | 11 | provideVSCodeDesignSystem().register( 12 | vsCodeProgressRing(), 13 | ); 14 | 15 | const List: Component<{results: CustomTextSearchMatch[], resultsLoading: number, workspace: vscode.WorkspaceFolder[] | null}> = (props) => { 16 | 17 | 18 | return ( 19 |
20 |

21 | Results: {countResults(props.results)} 22 | {props.resultsLoading ? 23 | <>loading : 24 | 'DONE' } 25 |

26 | 27 | 28 | {(result) => } 29 | 30 |
31 | ); 32 | }; 33 | 34 | export default List; -------------------------------------------------------------------------------- /solid-app/src/Result.module.css: -------------------------------------------------------------------------------- 1 | .result { 2 | display: block; 3 | padding: 5px 0; 4 | } 5 | 6 | .result mark { 7 | display: inline-block; 8 | border: 1px solid; 9 | background-color: transparent; 10 | color: currentColor; 11 | } 12 | 13 | .result p { 14 | margin: 5px 0; 15 | } 16 | 17 | .file { 18 | display: flex; 19 | gap: 3px; 20 | cursor: pointer; 21 | } 22 | 23 | .line-number { 24 | color: var(--vscode-editorLineNumber-activeForeground); 25 | } 26 | 27 | .preview { 28 | display: flex; 29 | gap: 10px; 30 | } 31 | 32 | .preview-text { 33 | white-space: pre-wrap; 34 | } -------------------------------------------------------------------------------- /solid-app/src/Result.tsx: -------------------------------------------------------------------------------- 1 | import { Component, For, JSX } from 'solid-js'; 2 | import styles from './Result.module.css'; 3 | import vscode from 'vscode'; 4 | import { LinePosition, CustomTextSearchMatch, Range } from './types'; 5 | 6 | const openFile = (path: string, range?: Range) => { 7 | window.vscode.postMessage({ 8 | command: 'openFile', 9 | path, 10 | range: range ? JSON.parse(JSON.stringify(range)) : null 11 | }); 12 | }; 13 | 14 | const formatPreview = (result: CustomTextSearchMatch, matchIndex: number) => { 15 | const match = ('length' in result.preview.matches) ? 16 | result.preview.matches[matchIndex] : result.preview.matches; 17 | const range = ('length' in result.ranges) ? 18 | result.ranges[matchIndex] : result.ranges; 19 | const start = match[0]; 20 | const end = match[1]; 21 | let cursor = { line: start.line, character: 0 } as LinePosition; 22 | const textLines = result.preview.text.split('\n'); 23 | const lineNumbers = []; 24 | for (let line = range[0].line + 1; line <= range[1].line + 1; line++) 25 | lineNumbers.push(<>{line}
); 26 | 27 | 28 | const lineSlice = (start: LinePosition, end: LinePosition) => { 29 | let output = ''; 30 | 31 | if (start.line > end.line) throw Error('Start line cannot be greater than end line'); 32 | if (start.line === end.line) 33 | output = textLines[start.line].slice(start.character, end.character); 34 | else { 35 | output += textLines[start.line].slice(start.character) + '\n'; 36 | for (let i = start.line + 1; i < end.line; i++) output += textLines[i] + '\n'; 37 | output += textLines[end.line].slice(0, end.character) + '\n'; 38 | } 39 | return output.replaceAll('\t', ' '); 40 | }; 41 | 42 | const before = lineSlice(cursor, start); 43 | const matchContent = lineSlice(start, end); 44 | const after = lineSlice(end, { line: end.line, character: textLines[end.line].length }); 45 | return ( 46 | <> 47 |
{lineNumbers}
48 |
{before}{matchContent}{after}
49 | 50 | ); 51 | 52 | }; 53 | 54 | const formatFile = (filePath: string, workspace: vscode.WorkspaceFolder[] | null) => { 55 | return (workspace !== null) ? filePath.replace(workspace[0].uri.path, '') : filePath; 56 | }; 57 | 58 | const languageIcon = (filePath: string) => { 59 | if (!window['vs-seti-icon-theme']) return ''; 60 | 61 | try { 62 | const extension = filePath.split('.').reverse()[0]; 63 | const iconDefinition = window['vs-seti-icon-theme'].iconDefinitions[ 64 | window['vs-seti-icon-theme'].fileExtensions[extension] || window['vs-seti-icon-theme'].languageIds[extension] 65 | ]; 66 | // Convert icon from Hex to Decimal and use Unicode character for string 67 | const fontCharacterConverted = String.fromCodePoint(parseInt(iconDefinition.fontCharacter.replace('\\', ''), 16)); 68 | const iconJsx = {fontCharacterConverted}; 69 | return iconJsx; 70 | } catch (err) { 71 | console.log(err); 72 | return ''; 73 | } 74 | }; 75 | 76 | 77 | const ResultLine: Component<{result: CustomTextSearchMatch, matchIndex: number, workspace: vscode.WorkspaceFolder[] | null}> = (props) => { 78 | console.log('RESULT', props.result); 79 | let uri: vscode.Uri | null; 80 | if (props.result.outOfUris) uri = props.result.outOfUris[props.matchIndex]; 81 | else uri = props.result.uri; 82 | 83 | if (!uri) return null; 84 | 85 | return ( 86 |
87 |

uri && (props.result.outOfUris ? openFile(uri.path) : openFile(uri.path, props.result.ranges[props.matchIndex]))}> 88 | {languageIcon(uri.path)}{formatFile(uri.path, props.workspace)} 89 |

90 |
{formatPreview(props.result, props.matchIndex || 0)}
91 |
92 | ); 93 | }; 94 | 95 | const Result: Component<{result: CustomTextSearchMatch, workspace: vscode.WorkspaceFolder[] | null}> = (props) => { 96 | return ( 97 | 98 | {(range, index) => } 99 | 100 | ); 101 | }; 102 | 103 | export default Result; 104 | -------------------------------------------------------------------------------- /solid-app/src/importPatterns.ts: -------------------------------------------------------------------------------- 1 | export default [ 2 | { 3 | name: 'snippet import', 4 | fileDefinition: { 5 | folder: 'snippets', 6 | extension: 'liquid', 7 | }, 8 | conditions: [ 9 | { 10 | regex: (filename: string) => `(render|include)\\s*('|")${filename}('|")`, 11 | include: '**/**.liquid', 12 | }, 13 | ], 14 | }, 15 | { 16 | name: 'section import', 17 | fileDefinition: { 18 | folder: 'sections', 19 | extension: 'liquid', 20 | }, 21 | conditions: [ 22 | { 23 | regex: (filename: string) => `section\\s*('|")${filename}('|")`, 24 | include: '**/**.liquid', 25 | }, 26 | { 27 | regex: (filename: string) => `"type": "${filename}"`, 28 | include: '**/templates/**.json', 29 | }, 30 | ], 31 | }, 32 | { 33 | name: 'section group import', 34 | fileDefinition: { 35 | folder: 'sections', 36 | extension: 'json', 37 | }, 38 | conditions: [ 39 | { 40 | regex: (filename: string) => `sections\\s*('|")${filename}('|")`, 41 | include: '**/**.liquid', 42 | } 43 | ], 44 | }, 45 | { 46 | name: 'asset import', 47 | fileDefinition: { 48 | folder: 'assets', 49 | }, 50 | conditions: [ 51 | { 52 | regex: (filename: string) => 53 | `('|")${filename}(?\\..*|)('|")\\s*\\|\\s*asset_url`, 54 | customFilenameFunc: (path: string, fullFilename: string, filename: string) => 55 | fullFilename.replace('.liquid', ''), 56 | include: '**/**.liquid', 57 | }, 58 | ], 59 | }, 60 | ]; 61 | -------------------------------------------------------------------------------- /solid-app/src/index.css: -------------------------------------------------------------------------------- 1 | .vscode-icon { 2 | font-family: 'seti'; 3 | font-size: 20px; 4 | } 5 | body { 6 | padding: 0; 7 | } 8 | -------------------------------------------------------------------------------- /solid-app/src/index.tsx: -------------------------------------------------------------------------------- 1 | /* @refresh reload */ 2 | import { render } from 'solid-js/web'; 3 | 4 | import './index.css'; 5 | import App from './App'; 6 | import { VscodeSetiIconData } from './types'; 7 | 8 | declare global { 9 | interface Window { 10 | acquireVsCodeApi: Function; 11 | vscode: { postMessage: Function }; 12 | ['vs-seti-icon-theme']: VscodeSetiIconData; 13 | } 14 | } 15 | 16 | render(() => , document.getElementById('root') as HTMLElement); 17 | -------------------------------------------------------------------------------- /solid-app/src/toolkit.d.ts: -------------------------------------------------------------------------------- 1 | import "solid-js"; 2 | 3 | // An important part of getting the Webview UI Toolkit to work with 4 | // Solid + TypeScript + JSX is to extend the solid-js JSX.IntrinsicElements 5 | // type interface to include type annotations for each of the toolkit's components. 6 | // 7 | // Without this, type errors will occur when you try to use any toolkit component 8 | // in your Solid + TypeScript + JSX component code. (Note that this file shouldn't be 9 | // necessary if you're not using TypeScript or are using tagged template literals 10 | // instead of JSX for your Solid component code). 11 | // 12 | // Important: This file should be updated whenever a new component is added to the 13 | // toolkit. You can find a list of currently available toolkit components here: 14 | // 15 | // https://github.com/microsoft/vscode-webview-ui-toolkit/blob/main/docs/components.md 16 | // 17 | declare module "solid-js" { 18 | namespace JSX { 19 | interface IntrinsicElements { 20 | "vscode-badge": any; 21 | "vscode-button": any; 22 | "vscode-checkbox": any; 23 | "vscode-data-grid": any; 24 | "vscode-divider": any; 25 | "vscode-dropdown": any; 26 | "vscode-link": any; 27 | "vscode-option": any; 28 | "vscode-panels": any; 29 | "vscode-panel-tab": any; 30 | "vscode-panel-view": any; 31 | "vscode-progress-ring": any; 32 | "vscode-radio": any; 33 | "vscode-radio-group": any; 34 | "vscode-tag": any; 35 | "vscode-text-area": any; 36 | "vscode-text-field": any; 37 | } 38 | } 39 | } -------------------------------------------------------------------------------- /solid-app/src/types.d.ts: -------------------------------------------------------------------------------- 1 | import * as vscode from 'vscode'; 2 | 3 | interface VscodeSetiIconData { 4 | file: string; 5 | fileExtensions: { 6 | [key: string]: string; 7 | } 8 | iconDefinitions: { 9 | [key: string]: { 10 | fontCharacter: string; 11 | fontColor: string; 12 | }; 13 | } 14 | languageIds: { 15 | [key: string]: string; 16 | } 17 | } 18 | 19 | interface FileDefinition { 20 | folder: string; 21 | extension?: string; 22 | } 23 | 24 | interface LinePosition { 25 | line: number; 26 | character: number; 27 | } 28 | 29 | type Range = [LinePosition, LinePosition]; 30 | 31 | interface CustomTextSearchMatch { 32 | uri: vscode.Uri; 33 | outOfUris?: vscode.Uri[]; 34 | ranges: Range[]; 35 | preview: { 36 | matches: Range[]; 37 | text: string; 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /solid-app/src/utils.tsx: -------------------------------------------------------------------------------- 1 | import { CustomTextSearchMatch } from "./types"; 2 | 3 | export const countResults = (results: CustomTextSearchMatch[]) => { 4 | return results.reduce((accumulator, current) => { 5 | if (!current.outOfUris) return accumulator + current.ranges.length; 6 | return accumulator + current.outOfUris.filter(entry => entry !== null).length 7 | }, 0); 8 | }; -------------------------------------------------------------------------------- /solid-app/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "strict": true, 4 | "target": "ESNext", 5 | "module": "ESNext", 6 | "moduleResolution": "node", 7 | "allowSyntheticDefaultImports": true, 8 | "esModuleInterop": true, 9 | "jsx": "preserve", 10 | "jsxImportSource": "solid-js", 11 | "types": ["vite/client"], 12 | "noEmit": true, 13 | "isolatedModules": true 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /solid-app/vite.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'vite'; 2 | import solidPlugin from 'vite-plugin-solid'; 3 | import path from 'node:path'; 4 | 5 | export default defineConfig({ 6 | plugins: [solidPlugin()], 7 | base: 'http://localhost:PORT/', 8 | build: { 9 | watch: {}, 10 | target: 'esnext', 11 | } 12 | }); 13 | -------------------------------------------------------------------------------- /solid-app/vscode.proposed.textSearchProvider.d.ts: -------------------------------------------------------------------------------- 1 | /*--------------------------------------------------------------------------------------------- 2 | * Copyright (c) Microsoft Corporation. All rights reserved. 3 | * Licensed under the MIT License. See License.txt in the project root for license information. 4 | *--------------------------------------------------------------------------------------------*/ 5 | 6 | declare module 'vscode' { 7 | 8 | // https://github.com/microsoft/vscode/issues/59921 9 | 10 | /** 11 | * The parameters of a query for text search. 12 | */ 13 | export interface TextSearchQuery { 14 | /** 15 | * The text pattern to search for. 16 | */ 17 | pattern: string; 18 | 19 | /** 20 | * Whether or not `pattern` should match multiple lines of text. 21 | */ 22 | isMultiline?: boolean; 23 | 24 | /** 25 | * Whether or not `pattern` should be interpreted as a regular expression. 26 | */ 27 | isRegExp?: boolean; 28 | 29 | /** 30 | * Whether or not the search should be case-sensitive. 31 | */ 32 | isCaseSensitive?: boolean; 33 | 34 | /** 35 | * Whether or not to search for whole word matches only. 36 | */ 37 | isWordMatch?: boolean; 38 | } 39 | 40 | /** 41 | * A file glob pattern to match file paths against. 42 | * TODO@roblourens merge this with the GlobPattern docs/definition in vscode.d.ts. 43 | * @see {@link GlobPattern} 44 | */ 45 | export type GlobString = string; 46 | 47 | /** 48 | * Options common to file and text search 49 | */ 50 | export interface SearchOptions { 51 | /** 52 | * The root folder to search within. 53 | */ 54 | folder: Uri; 55 | 56 | /** 57 | * Files that match an `includes` glob pattern should be included in the search. 58 | */ 59 | includes: GlobString[]; 60 | 61 | /** 62 | * Files that match an `excludes` glob pattern should be excluded from the search. 63 | */ 64 | excludes: GlobString[]; 65 | 66 | /** 67 | * Whether external files that exclude files, like .gitignore, should be respected. 68 | * See the vscode setting `"search.useIgnoreFiles"`. 69 | */ 70 | useIgnoreFiles: boolean; 71 | 72 | /** 73 | * Whether symlinks should be followed while searching. 74 | * See the vscode setting `"search.followSymlinks"`. 75 | */ 76 | followSymlinks: boolean; 77 | 78 | /** 79 | * Whether global files that exclude files, like .gitignore, should be respected. 80 | * See the vscode setting `"search.useGlobalIgnoreFiles"`. 81 | */ 82 | useGlobalIgnoreFiles: boolean; 83 | 84 | /** 85 | * Whether files in parent directories that exclude files, like .gitignore, should be respected. 86 | * See the vscode setting `"search.useParentIgnoreFiles"`. 87 | */ 88 | useParentIgnoreFiles: boolean; 89 | } 90 | 91 | /** 92 | * Options to specify the size of the result text preview. 93 | * These options don't affect the size of the match itself, just the amount of preview text. 94 | */ 95 | export interface TextSearchPreviewOptions { 96 | /** 97 | * The maximum number of lines in the preview. 98 | * Only search providers that support multiline search will ever return more than one line in the match. 99 | */ 100 | matchLines: number; 101 | 102 | /** 103 | * The maximum number of characters included per line. 104 | */ 105 | charsPerLine: number; 106 | } 107 | 108 | /** 109 | * Options that apply to text search. 110 | */ 111 | export interface TextSearchOptions extends SearchOptions { 112 | /** 113 | * The maximum number of results to be returned. 114 | */ 115 | maxResults: number; 116 | 117 | /** 118 | * Options to specify the size of the result text preview. 119 | */ 120 | previewOptions?: TextSearchPreviewOptions; 121 | 122 | /** 123 | * Exclude files larger than `maxFileSize` in bytes. 124 | */ 125 | maxFileSize?: number; 126 | 127 | /** 128 | * Interpret files using this encoding. 129 | * See the vscode setting `"files.encoding"` 130 | */ 131 | encoding?: string; 132 | 133 | /** 134 | * Number of lines of context to include before each match. 135 | */ 136 | beforeContext?: number; 137 | 138 | /** 139 | * Number of lines of context to include after each match. 140 | */ 141 | afterContext?: number; 142 | } 143 | 144 | /** 145 | * Represents the severity of a TextSearchComplete message. 146 | */ 147 | export enum TextSearchCompleteMessageType { 148 | Information = 1, 149 | Warning = 2, 150 | } 151 | 152 | /** 153 | * A message regarding a completed search. 154 | */ 155 | export interface TextSearchCompleteMessage { 156 | /** 157 | * Markdown text of the message. 158 | */ 159 | text: string; 160 | /** 161 | * Whether the source of the message is trusted, command links are disabled for untrusted message sources. 162 | * Messaged are untrusted by default. 163 | */ 164 | trusted?: boolean; 165 | /** 166 | * The message type, this affects how the message will be rendered. 167 | */ 168 | type: TextSearchCompleteMessageType; 169 | } 170 | 171 | /** 172 | * Information collected when text search is complete. 173 | */ 174 | export interface TextSearchComplete { 175 | /** 176 | * Whether the search hit the limit on the maximum number of search results. 177 | * `maxResults` on {@linkcode TextSearchOptions} specifies the max number of results. 178 | * - If exactly that number of matches exist, this should be false. 179 | * - If `maxResults` matches are returned and more exist, this should be true. 180 | * - If search hits an internal limit which is less than `maxResults`, this should be true. 181 | */ 182 | limitHit?: boolean; 183 | 184 | /** 185 | * Additional information regarding the state of the completed search. 186 | * 187 | * Messages with "Information" style support links in markdown syntax: 188 | * - Click to [run a command](command:workbench.action.OpenQuickPick) 189 | * - Click to [open a website](https://aka.ms) 190 | * 191 | * Commands may optionally return { triggerSearch: true } to signal to the editor that the original search should run be again. 192 | */ 193 | message?: TextSearchCompleteMessage | TextSearchCompleteMessage[]; 194 | } 195 | 196 | /** 197 | * A preview of the text result. 198 | */ 199 | export interface TextSearchMatchPreview { 200 | /** 201 | * The matching lines of text, or a portion of the matching line that contains the match. 202 | */ 203 | text: string; 204 | 205 | /** 206 | * The Range within `text` corresponding to the text of the match. 207 | * The number of matches must match the TextSearchMatch's range property. 208 | */ 209 | matches: Range | Range[]; 210 | } 211 | 212 | /** 213 | * A match from a text search 214 | */ 215 | export interface TextSearchMatch { 216 | /** 217 | * The uri for the matching document. 218 | */ 219 | uri: Uri; 220 | 221 | /** 222 | * The range of the match within the document, or multiple ranges for multiple matches. 223 | */ 224 | ranges: Range | Range[]; 225 | 226 | /** 227 | * A preview of the text match. 228 | */ 229 | preview: TextSearchMatchPreview; 230 | } 231 | 232 | /** 233 | * A line of context surrounding a TextSearchMatch. 234 | */ 235 | export interface TextSearchContext { 236 | /** 237 | * The uri for the matching document. 238 | */ 239 | uri: Uri; 240 | 241 | /** 242 | * One line of text. 243 | * previewOptions.charsPerLine applies to this 244 | */ 245 | text: string; 246 | 247 | /** 248 | * The line number of this line of context. 249 | */ 250 | lineNumber: number; 251 | } 252 | 253 | export type TextSearchResult = TextSearchMatch | TextSearchContext; 254 | 255 | /** 256 | * A TextSearchProvider provides search results for text results inside files in the workspace. 257 | */ 258 | export interface TextSearchProvider { 259 | /** 260 | * Provide results that match the given text pattern. 261 | * @param query The parameters for this query. 262 | * @param options A set of options to consider while searching. 263 | * @param progress A progress callback that must be invoked for all results. 264 | * @param token A cancellation token. 265 | */ 266 | provideTextSearchResults(query: TextSearchQuery, options: TextSearchOptions, progress: Progress, token: CancellationToken): ProviderResult; 267 | } 268 | 269 | export namespace workspace { 270 | /** 271 | * Register a text search provider. 272 | * 273 | * Only one provider can be registered per scheme. 274 | * 275 | * @param scheme The provider will be invoked for workspace folders that have this file scheme. 276 | * @param provider The provider. 277 | * @return A {@link Disposable} that unregisters this provider when being disposed. 278 | */ 279 | export function registerTextSearchProvider(scheme: string, provider: TextSearchProvider): Disposable; 280 | } 281 | } 282 | -------------------------------------------------------------------------------- /src/extension.ts: -------------------------------------------------------------------------------- 1 | // The module 'vscode' contains the VS Code extensibility API 2 | // Import the module and reference it with the alias vscode in your code below 3 | import * as vscode from 'vscode'; 4 | import * as fs from 'fs'; 5 | import * as path from 'path'; 6 | import express from 'express'; 7 | import cors from 'cors'; 8 | import * as stringSimilarity from 'string-similarity'; 9 | import { CustomTextSearchMatch } from './types'; 10 | 11 | const app = express(); 12 | const port = (vscode.workspace.getConfiguration('code-sense').get('serverPort') || 49168) as number; 13 | console.log('PORT', port); 14 | 15 | app.use(cors()); 16 | app.use(express.static(path.join(__dirname, '../solid-app/dist/'))); 17 | 18 | app 19 | .listen(port, () => { 20 | console.log(`Example app listening on port ${port}`); 21 | }) 22 | .on('error', (err) => { 23 | vscode.window.showErrorMessage(`Code Sense: ${err.message}`); 24 | }); 25 | 26 | export function activate(context: vscode.ExtensionContext) { 27 | // Track currently webview panel 28 | let currentPanel: vscode.WebviewPanel | undefined = undefined; 29 | 30 | const disposable = vscode.commands.registerCommand('code-sense.start', async () => { 31 | // const fullWebServerUri = await vscode.env.asExternalUri( 32 | // vscode.Uri.parse(`http://localhost:5173`) 33 | // ); 34 | 35 | // console.log(fullWebServerUri); 36 | 37 | if (currentPanel) return currentPanel.reveal(); 38 | let activeEditor = vscode.window.activeTextEditor; 39 | let firstSet = true; 40 | 41 | const setActiveEditor = (editor: vscode.TextEditor | undefined) => { 42 | if (editor && (editor.document.fileName !== activeEditor?.document.fileName || firstSet)) { 43 | firstSet = false; 44 | activeEditor = editor; 45 | currentPanel?.webview.postMessage({ activeEditor: editor }); 46 | } 47 | }; 48 | 49 | // Create and show a new webview 50 | currentPanel = vscode.window.createWebviewPanel( 51 | 'code-sense', // Identifies the type of the webview. Used internally 52 | 'Code Sense', // Title of the panel displayed to the user 53 | { 54 | viewColumn: activeEditor?.viewColumn ? activeEditor?.viewColumn + 1 : vscode.ViewColumn.Two, // Editor column to show the new webview panel in. 55 | preserveFocus: true, 56 | }, 57 | { 58 | enableScripts: true, 59 | retainContextWhenHidden: true, 60 | localResourceRoots: [vscode.Uri.joinPath(context.extensionUri, 'solid-app/dist')], 61 | } // Webview options. More on these later. 62 | ); 63 | 64 | currentPanel.iconPath = vscode.Uri.file( 65 | path.join(context.extensionPath, 'images/Code-Sense-Logo.png') 66 | ); 67 | 68 | const entryPath = path.join(context.extensionPath, 'solid-app/dist/index.html'); 69 | 70 | const loadEntry = () => { 71 | const fileBuffer = fs.readFileSync(entryPath); 72 | let file = fileBuffer.toString(); 73 | 74 | const reloadedBadge = ` 75 |
Reloaded
76 | 100 | `; 101 | 102 | file = file.replace('', `\n${reloadedBadge}`); 103 | 104 | file = file.replaceAll('PORT', port.toString()); 105 | 106 | if (currentPanel) currentPanel.webview.html = file; 107 | 108 | console.log('Entry loaded'); 109 | }; 110 | 111 | loadEntry(); 112 | 113 | fs.watchFile(entryPath, loadEntry); 114 | 115 | // async function checkIfFileExists(uri: vscode.Uri) { 116 | // try { 117 | // // Attempt to get the file stats 118 | // await vscode.workspace.fs.stat(uri); 119 | // // If the stat method succeeds, the file exists 120 | // console.log('The file exists.'); 121 | // return true; 122 | // } catch (error) { 123 | // // If the stat method fails, it's likely because the file does not exist 124 | // console.log('The file does not exist.'); 125 | // return false; 126 | // } 127 | // } 128 | 129 | currentPanel.webview.onDidReceiveMessage(async (message) => { 130 | console.log('RECEIVED MESSAGE', message); 131 | 132 | switch (message.command) { 133 | case 'find': 134 | let promises: Promise[] = []; 135 | vscode.workspace 136 | .findTextInFiles( 137 | message.textSearchQuery, 138 | message.textSearchOptions, 139 | async (result) => { 140 | if (message.for === 'outof' && 'preview' in result) { 141 | const matches = Array.from( 142 | result.preview.text.matchAll(message.textSearchQuery.pattern) 143 | ); 144 | 145 | (result as CustomTextSearchMatch).outOfUris = []; 146 | promises = matches.map(async (match, index) => { 147 | const filename = match.groups?.filename; 148 | const extension: string = 149 | match.groups?.extension || 150 | (message.fileDefinition?.extension 151 | ? '.' + message.fileDefinition.extension 152 | : ''); 153 | if (filename) { 154 | const path = `${message.fileDefinition.folder}/${filename}${extension}`; 155 | const uris = await vscode.workspace.findFiles(`**/${path}*`, '', 3); 156 | 157 | let uri: vscode.Uri | null; 158 | if (uris.length === 0 || activeEditor === undefined) uri = null; 159 | else if (uris.length === 1) uri = uris[0]; 160 | else { 161 | const activePath = activeEditor.document.uri.path; 162 | uri = uris.reduce((prev, curr) => { 163 | const prevScore = stringSimilarity.compareTwoStrings( 164 | activePath, 165 | prev.path 166 | ); 167 | const currScore = stringSimilarity.compareTwoStrings( 168 | activePath, 169 | curr.path 170 | ); 171 | return prevScore > currScore ? prev : curr; 172 | }); 173 | } 174 | (result as CustomTextSearchMatch).outOfUris[index] = uri; 175 | } 176 | }); 177 | 178 | await Promise.allSettled(promises); 179 | } 180 | currentPanel?.webview.postMessage({ 181 | result, 182 | for: message.for, 183 | activeEditor: message.activeEditor, 184 | }); 185 | }, 186 | undefined 187 | ) 188 | .then(async (finalResult) => { 189 | await Promise.allSettled(promises); 190 | 191 | currentPanel?.webview.postMessage({ 192 | result: finalResult, 193 | for: message.for, 194 | activeEditor: message.activeEditor, 195 | done: true, 196 | }); 197 | }); 198 | break; 199 | case 'openFile': 200 | const document = await vscode.workspace.openTextDocument(message.path); 201 | 202 | vscode.window.showTextDocument(document, 1).then((editor) => { 203 | if (message.range) { 204 | const range = new vscode.Range( 205 | message.range[0].line, 206 | message.range[0].character, 207 | message.range[1].line, 208 | message.range[1].character 209 | ); 210 | editor.revealRange(range, vscode.TextEditorRevealType.InCenter); 211 | const decorationType = vscode.window.createTextEditorDecorationType({ 212 | border: '2px solid var(--vscode-editor-findMatchBorder)', 213 | }); 214 | editor.setDecorations(decorationType, [range]); 215 | const disposable = vscode.window.onDidChangeTextEditorSelection(() => { 216 | decorationType.dispose(); 217 | disposable.dispose(); 218 | }); 219 | } 220 | }); 221 | 222 | // const uri = vscode.Uri.parse(message.path); 223 | // console.log('uri', uri); 224 | // try { 225 | 226 | // } catch (e) 227 | // console.log(message.path); 228 | // vscode.commands.executeCommand('workbench.action.quickOpen', message.path); 229 | break; 230 | case 'getWorkspace': 231 | currentPanel?.webview.postMessage({ workspace: vscode.workspace.workspaceFolders }); 232 | break; 233 | case 'getActiveEditor': 234 | setActiveEditor(vscode.window.activeTextEditor); 235 | break; 236 | } 237 | }); 238 | 239 | // Listens for active editor changes 240 | const disposable2 = vscode.window.onDidChangeActiveTextEditor((editor) => 241 | setActiveEditor(editor) 242 | ); 243 | 244 | currentPanel.onDidDispose( 245 | () => { 246 | currentPanel = undefined; 247 | fs.unwatchFile(entryPath, loadEntry); 248 | disposable2.dispose(); 249 | }, 250 | null, 251 | context.subscriptions 252 | ); 253 | }); 254 | 255 | context.subscriptions.push(disposable); 256 | } 257 | 258 | // this method is called when your extension is deactivated 259 | export function deactivate() {} 260 | -------------------------------------------------------------------------------- /src/test/runTest.ts: -------------------------------------------------------------------------------- 1 | import * as path from 'path'; 2 | 3 | import { runTests } from '@vscode/test-electron'; 4 | 5 | async function main() { 6 | try { 7 | // The folder containing the Extension Manifest package.json 8 | // Passed to `--extensionDevelopmentPath` 9 | const extensionDevelopmentPath = path.resolve(__dirname, '../../'); 10 | 11 | // The path to test runner 12 | // Passed to --extensionTestsPath 13 | const extensionTestsPath = path.resolve(__dirname, './suite/index'); 14 | 15 | // Download VS Code, unzip it and run the integration test 16 | await runTests({ extensionDevelopmentPath, extensionTestsPath }); 17 | } catch (err) { 18 | console.error('Failed to run tests'); 19 | process.exit(1); 20 | } 21 | } 22 | 23 | main(); 24 | -------------------------------------------------------------------------------- /src/test/suite/extension.test.ts: -------------------------------------------------------------------------------- 1 | import * as assert from 'assert'; 2 | 3 | // You can import and use all API from the 'vscode' module 4 | // as well as import your extension to test it 5 | import * as vscode from 'vscode'; 6 | // import * as myExtension from '../../extension'; 7 | 8 | suite('Extension Test Suite', () => { 9 | vscode.window.showInformationMessage('Start all tests.'); 10 | 11 | test('Sample test', () => { 12 | assert.strictEqual(-1, [1, 2, 3].indexOf(5)); 13 | assert.strictEqual(-1, [1, 2, 3].indexOf(0)); 14 | }); 15 | }); 16 | -------------------------------------------------------------------------------- /src/test/suite/index.ts: -------------------------------------------------------------------------------- 1 | import * as path from 'path'; 2 | import * as Mocha from 'mocha'; 3 | import * as glob from 'glob'; 4 | 5 | export function run(): Promise { 6 | // Create the mocha test 7 | const mocha = new Mocha({ 8 | ui: 'tdd', 9 | color: true 10 | }); 11 | 12 | const testsRoot = path.resolve(__dirname, '..'); 13 | 14 | return new Promise((c, e) => { 15 | glob('**/**.test.js', { cwd: testsRoot }, (err, files) => { 16 | if (err) { 17 | return e(err); 18 | } 19 | 20 | // Add files to the test suite 21 | files.forEach(f => mocha.addFile(path.resolve(testsRoot, f))); 22 | 23 | try { 24 | // Run the mocha test 25 | mocha.run(failures => { 26 | if (failures > 0) { 27 | e(new Error(`${failures} tests failed.`)); 28 | } else { 29 | c(); 30 | } 31 | }); 32 | } catch (err) { 33 | console.error(err); 34 | e(err); 35 | } 36 | }); 37 | }); 38 | } 39 | -------------------------------------------------------------------------------- /src/types.d.ts: -------------------------------------------------------------------------------- 1 | import * as vscode from 'vscode'; 2 | 3 | interface FileDefinition { 4 | folder: string; 5 | extension?: string; 6 | } 7 | 8 | interface CustomTextSearchMatch extends vscode.TextSearchMatch { 9 | outOfUris: (vscode.Uri | null)[]; 10 | } -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "module": "commonjs", 4 | "target": "ES2022", 5 | "outDir": "out", 6 | "esModuleInterop": true, 7 | "lib": [ 8 | "ES2022" 9 | ], 10 | "sourceMap": true, 11 | "rootDir": "src", 12 | "strict": true /* enable all strict type-checking options */ 13 | 14 | /* Additional Checks */ 15 | // "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */ 16 | // "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */ 17 | // "noUnusedParameters": true, /* Report errors on unused parameters. */ 18 | }, 19 | "include": ["src", "./vscode.proposed.findTextInFiles.d.ts", "./vscode.proposed.textSearchProvider.d.ts"], 20 | } 21 | -------------------------------------------------------------------------------- /vsc-extension-quickstart.md: -------------------------------------------------------------------------------- 1 | # Welcome to your VS Code Extension 2 | 3 | ## What's in the folder 4 | 5 | * This folder contains all of the files necessary for your extension. 6 | * `package.json` - this is the manifest file in which you declare your extension and command. 7 | * The sample plugin registers a command and defines its title and command name. With this information VS Code can show the command in the command palette. It doesn’t yet need to load the plugin. 8 | * `src/extension.ts` - this is the main file where you will provide the implementation of your command. 9 | * The file exports one function, `activate`, which is called the very first time your extension is activated (in this case by executing the command). Inside the `activate` function we call `registerCommand`. 10 | * We pass the function containing the implementation of the command as the second parameter to `registerCommand`. 11 | 12 | ## Get up and running straight away 13 | 14 | * Press `F5` to open a new window with your extension loaded. 15 | * Run your command from the command palette by pressing (`Ctrl+Shift+P` or `Cmd+Shift+P` on Mac) and typing `Hello World`. 16 | * Set breakpoints in your code inside `src/extension.ts` to debug your extension. 17 | * Find output from your extension in the debug console. 18 | 19 | ## Make changes 20 | 21 | * You can relaunch the extension from the debug toolbar after changing code in `src/extension.ts`. 22 | * You can also reload (`Ctrl+R` or `Cmd+R` on Mac) the VS Code window with your extension to load your changes. 23 | 24 | 25 | ## Explore the API 26 | 27 | * You can open the full set of our API when you open the file `node_modules/@types/vscode/index.d.ts`. 28 | 29 | ## Run tests 30 | 31 | * Open the debug viewlet (`Ctrl+Shift+D` or `Cmd+Shift+D` on Mac) and from the launch configuration dropdown pick `Extension Tests`. 32 | * Press `F5` to run the tests in a new window with your extension loaded. 33 | * See the output of the test result in the debug console. 34 | * Make changes to `src/test/suite/extension.test.ts` or create new test files inside the `test/suite` folder. 35 | * The provided test runner will only consider files matching the name pattern `**.test.ts`. 36 | * You can create folders inside the `test` folder to structure your tests any way you want. 37 | 38 | ## Go further 39 | 40 | * Reduce the extension size and improve the startup time by [bundling your extension](https://code.visualstudio.com/api/working-with-extensions/bundling-extension). 41 | * [Publish your extension](https://code.visualstudio.com/api/working-with-extensions/publishing-extension) on the VSCode extension marketplace. 42 | * Automate builds by setting up [Continuous Integration](https://code.visualstudio.com/api/working-with-extensions/continuous-integration). 43 | -------------------------------------------------------------------------------- /vscode.proposed.findTextInFiles.d.ts: -------------------------------------------------------------------------------- 1 | /*--------------------------------------------------------------------------------------------- 2 | * Copyright (c) Microsoft Corporation. All rights reserved. 3 | * Licensed under the MIT License. See License.txt in the project root for license information. 4 | *--------------------------------------------------------------------------------------------*/ 5 | 6 | declare module 'vscode' { 7 | 8 | // https://github.com/microsoft/vscode/issues/59924 9 | 10 | /** 11 | * Options that can be set on a findTextInFiles search. 12 | */ 13 | export interface FindTextInFilesOptions { 14 | /** 15 | * A {@link GlobPattern glob pattern} that defines the files to search for. The glob pattern 16 | * will be matched against the file paths of files relative to their workspace. Use a {@link RelativePattern relative pattern} 17 | * to restrict the search results to a {@link WorkspaceFolder workspace folder}. 18 | */ 19 | include?: GlobPattern; 20 | 21 | /** 22 | * A {@link GlobPattern glob pattern} that defines files and folders to exclude. The glob pattern 23 | * will be matched against the file paths of resulting matches relative to their workspace. When `undefined`, default excludes will 24 | * apply. 25 | */ 26 | exclude?: GlobPattern; 27 | 28 | /** 29 | * Whether to use the default and user-configured excludes. Defaults to true. 30 | */ 31 | useDefaultExcludes?: boolean; 32 | 33 | /** 34 | * The maximum number of results to search for 35 | */ 36 | maxResults?: number; 37 | 38 | /** 39 | * Whether external files that exclude files, like .gitignore, should be respected. 40 | * See the vscode setting `"search.useIgnoreFiles"`. 41 | */ 42 | useIgnoreFiles?: boolean; 43 | 44 | /** 45 | * Whether global files that exclude files, like .gitignore, should be respected. 46 | * See the vscode setting `"search.useGlobalIgnoreFiles"`. 47 | */ 48 | useGlobalIgnoreFiles?: boolean; 49 | 50 | /** 51 | * Whether files in parent directories that exclude files, like .gitignore, should be respected. 52 | * See the vscode setting `"search.useParentIgnoreFiles"`. 53 | */ 54 | useParentIgnoreFiles?: boolean; 55 | 56 | /** 57 | * Whether symlinks should be followed while searching. 58 | * See the vscode setting `"search.followSymlinks"`. 59 | */ 60 | followSymlinks?: boolean; 61 | 62 | /** 63 | * Interpret files using this encoding. 64 | * See the vscode setting `"files.encoding"` 65 | */ 66 | encoding?: string; 67 | 68 | /** 69 | * Options to specify the size of the result text preview. 70 | */ 71 | previewOptions?: TextSearchPreviewOptions; 72 | 73 | /** 74 | * Number of lines of context to include before each match. 75 | */ 76 | beforeContext?: number; 77 | 78 | /** 79 | * Number of lines of context to include after each match. 80 | */ 81 | afterContext?: number; 82 | } 83 | 84 | export namespace workspace { 85 | /** 86 | * Search text in files across all {@link workspace.workspaceFolders workspace folders} in the workspace. 87 | * @param query The query parameters for the search - the search string, whether it's case-sensitive, or a regex, or matches whole words. 88 | * @param callback A callback, called for each result 89 | * @param token A token that can be used to signal cancellation to the underlying search engine. 90 | * @return A thenable that resolves when the search is complete. 91 | */ 92 | export function findTextInFiles(query: TextSearchQuery, callback: (result: TextSearchResult) => void, token?: CancellationToken): Thenable; 93 | 94 | /** 95 | * Search text in files across all {@link workspace.workspaceFolders workspace folders} in the workspace. 96 | * @param query The query parameters for the search - the search string, whether it's case-sensitive, or a regex, or matches whole words. 97 | * @param options An optional set of query options. Include and exclude patterns, maxResults, etc. 98 | * @param callback A callback, called for each result 99 | * @param token A token that can be used to signal cancellation to the underlying search engine. 100 | * @return A thenable that resolves when the search is complete. 101 | */ 102 | export function findTextInFiles(query: TextSearchQuery, options: FindTextInFilesOptions, callback: (result: TextSearchResult) => void, token?: CancellationToken): Thenable; 103 | } 104 | } 105 | -------------------------------------------------------------------------------- /vscode.proposed.textSearchProvider.d.ts: -------------------------------------------------------------------------------- 1 | /*--------------------------------------------------------------------------------------------- 2 | * Copyright (c) Microsoft Corporation. All rights reserved. 3 | * Licensed under the MIT License. See License.txt in the project root for license information. 4 | *--------------------------------------------------------------------------------------------*/ 5 | 6 | declare module 'vscode' { 7 | 8 | // https://github.com/microsoft/vscode/issues/59921 9 | 10 | /** 11 | * The parameters of a query for text search. 12 | */ 13 | export interface TextSearchQuery { 14 | /** 15 | * The text pattern to search for. 16 | */ 17 | pattern: string; 18 | 19 | /** 20 | * Whether or not `pattern` should match multiple lines of text. 21 | */ 22 | isMultiline?: boolean; 23 | 24 | /** 25 | * Whether or not `pattern` should be interpreted as a regular expression. 26 | */ 27 | isRegExp?: boolean; 28 | 29 | /** 30 | * Whether or not the search should be case-sensitive. 31 | */ 32 | isCaseSensitive?: boolean; 33 | 34 | /** 35 | * Whether or not to search for whole word matches only. 36 | */ 37 | isWordMatch?: boolean; 38 | } 39 | 40 | /** 41 | * A file glob pattern to match file paths against. 42 | * TODO@roblourens merge this with the GlobPattern docs/definition in vscode.d.ts. 43 | * @see {@link GlobPattern} 44 | */ 45 | export type GlobString = string; 46 | 47 | /** 48 | * Options common to file and text search 49 | */ 50 | export interface SearchOptions { 51 | /** 52 | * The root folder to search within. 53 | */ 54 | folder: Uri; 55 | 56 | /** 57 | * Files that match an `includes` glob pattern should be included in the search. 58 | */ 59 | includes: GlobString[]; 60 | 61 | /** 62 | * Files that match an `excludes` glob pattern should be excluded from the search. 63 | */ 64 | excludes: GlobString[]; 65 | 66 | /** 67 | * Whether external files that exclude files, like .gitignore, should be respected. 68 | * See the vscode setting `"search.useIgnoreFiles"`. 69 | */ 70 | useIgnoreFiles: boolean; 71 | 72 | /** 73 | * Whether symlinks should be followed while searching. 74 | * See the vscode setting `"search.followSymlinks"`. 75 | */ 76 | followSymlinks: boolean; 77 | 78 | /** 79 | * Whether global files that exclude files, like .gitignore, should be respected. 80 | * See the vscode setting `"search.useGlobalIgnoreFiles"`. 81 | */ 82 | useGlobalIgnoreFiles: boolean; 83 | 84 | /** 85 | * Whether files in parent directories that exclude files, like .gitignore, should be respected. 86 | * See the vscode setting `"search.useParentIgnoreFiles"`. 87 | */ 88 | useParentIgnoreFiles: boolean; 89 | } 90 | 91 | /** 92 | * Options to specify the size of the result text preview. 93 | * These options don't affect the size of the match itself, just the amount of preview text. 94 | */ 95 | export interface TextSearchPreviewOptions { 96 | /** 97 | * The maximum number of lines in the preview. 98 | * Only search providers that support multiline search will ever return more than one line in the match. 99 | */ 100 | matchLines: number; 101 | 102 | /** 103 | * The maximum number of characters included per line. 104 | */ 105 | charsPerLine: number; 106 | } 107 | 108 | /** 109 | * Options that apply to text search. 110 | */ 111 | export interface TextSearchOptions extends SearchOptions { 112 | /** 113 | * The maximum number of results to be returned. 114 | */ 115 | maxResults: number; 116 | 117 | /** 118 | * Options to specify the size of the result text preview. 119 | */ 120 | previewOptions?: TextSearchPreviewOptions; 121 | 122 | /** 123 | * Exclude files larger than `maxFileSize` in bytes. 124 | */ 125 | maxFileSize?: number; 126 | 127 | /** 128 | * Interpret files using this encoding. 129 | * See the vscode setting `"files.encoding"` 130 | */ 131 | encoding?: string; 132 | 133 | /** 134 | * Number of lines of context to include before each match. 135 | */ 136 | beforeContext?: number; 137 | 138 | /** 139 | * Number of lines of context to include after each match. 140 | */ 141 | afterContext?: number; 142 | } 143 | 144 | /** 145 | * Represents the severity of a TextSearchComplete message. 146 | */ 147 | export enum TextSearchCompleteMessageType { 148 | Information = 1, 149 | Warning = 2, 150 | } 151 | 152 | /** 153 | * A message regarding a completed search. 154 | */ 155 | export interface TextSearchCompleteMessage { 156 | /** 157 | * Markdown text of the message. 158 | */ 159 | text: string; 160 | /** 161 | * Whether the source of the message is trusted, command links are disabled for untrusted message sources. 162 | * Messaged are untrusted by default. 163 | */ 164 | trusted?: boolean; 165 | /** 166 | * The message type, this affects how the message will be rendered. 167 | */ 168 | type: TextSearchCompleteMessageType; 169 | } 170 | 171 | /** 172 | * Information collected when text search is complete. 173 | */ 174 | export interface TextSearchComplete { 175 | /** 176 | * Whether the search hit the limit on the maximum number of search results. 177 | * `maxResults` on {@linkcode TextSearchOptions} specifies the max number of results. 178 | * - If exactly that number of matches exist, this should be false. 179 | * - If `maxResults` matches are returned and more exist, this should be true. 180 | * - If search hits an internal limit which is less than `maxResults`, this should be true. 181 | */ 182 | limitHit?: boolean; 183 | 184 | /** 185 | * Additional information regarding the state of the completed search. 186 | * 187 | * Messages with "Information" style support links in markdown syntax: 188 | * - Click to [run a command](command:workbench.action.OpenQuickPick) 189 | * - Click to [open a website](https://aka.ms) 190 | * 191 | * Commands may optionally return { triggerSearch: true } to signal to the editor that the original search should run be again. 192 | */ 193 | message?: TextSearchCompleteMessage | TextSearchCompleteMessage[]; 194 | } 195 | 196 | /** 197 | * A preview of the text result. 198 | */ 199 | export interface TextSearchMatchPreview { 200 | /** 201 | * The matching lines of text, or a portion of the matching line that contains the match. 202 | */ 203 | text: string; 204 | 205 | /** 206 | * The Range within `text` corresponding to the text of the match. 207 | * The number of matches must match the TextSearchMatch's range property. 208 | */ 209 | matches: Range | Range[]; 210 | } 211 | 212 | /** 213 | * A match from a text search 214 | */ 215 | export interface TextSearchMatch { 216 | /** 217 | * The uri for the matching document. 218 | */ 219 | uri: Uri; 220 | 221 | /** 222 | * The range of the match within the document, or multiple ranges for multiple matches. 223 | */ 224 | ranges: Range | Range[]; 225 | 226 | /** 227 | * A preview of the text match. 228 | */ 229 | preview: TextSearchMatchPreview; 230 | } 231 | 232 | /** 233 | * A line of context surrounding a TextSearchMatch. 234 | */ 235 | export interface TextSearchContext { 236 | /** 237 | * The uri for the matching document. 238 | */ 239 | uri: Uri; 240 | 241 | /** 242 | * One line of text. 243 | * previewOptions.charsPerLine applies to this 244 | */ 245 | text: string; 246 | 247 | /** 248 | * The line number of this line of context. 249 | */ 250 | lineNumber: number; 251 | } 252 | 253 | export type TextSearchResult = TextSearchMatch | TextSearchContext; 254 | 255 | /** 256 | * A TextSearchProvider provides search results for text results inside files in the workspace. 257 | */ 258 | export interface TextSearchProvider { 259 | /** 260 | * Provide results that match the given text pattern. 261 | * @param query The parameters for this query. 262 | * @param options A set of options to consider while searching. 263 | * @param progress A progress callback that must be invoked for all results. 264 | * @param token A cancellation token. 265 | */ 266 | provideTextSearchResults(query: TextSearchQuery, options: TextSearchOptions, progress: Progress, token: CancellationToken): ProviderResult; 267 | } 268 | 269 | export namespace workspace { 270 | /** 271 | * Register a text search provider. 272 | * 273 | * Only one provider can be registered per scheme. 274 | * 275 | * @param scheme The provider will be invoked for workspace folders that have this file scheme. 276 | * @param provider The provider. 277 | * @return A {@link Disposable} that unregisters this provider when being disposed. 278 | */ 279 | export function registerTextSearchProvider(scheme: string, provider: TextSearchProvider): Disposable; 280 | } 281 | } 282 | --------------------------------------------------------------------------------