├── .github ├── FUNDING.yml └── workflows │ └── release.yml ├── CHANGELOG.md ├── res └── logo.png ├── eslint.config.mjs ├── screenshots └── demo.png ├── pnpm-workspace.yaml ├── src ├── types.ts ├── config.ts ├── utils.ts ├── index.ts └── icons.ts ├── taze.config.ts ├── .gitignore ├── .vscodeignore ├── tsdown.config.ts ├── .vscode ├── settings.json ├── tasks.json └── launch.json ├── tsconfig.json ├── LICENSE.md ├── README.md └── package.json /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | github: [antfu] 2 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | ## [Released] 2 | - Initial release -------------------------------------------------------------------------------- /res/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/antfu/vscode-where-am-i/HEAD/res/logo.png -------------------------------------------------------------------------------- /eslint.config.mjs: -------------------------------------------------------------------------------- 1 | import antfu from '@antfu/eslint-config' 2 | 3 | export default antfu() 4 | -------------------------------------------------------------------------------- /screenshots/demo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/antfu/vscode-where-am-i/HEAD/screenshots/demo.png -------------------------------------------------------------------------------- /pnpm-workspace.yaml: -------------------------------------------------------------------------------- 1 | onlyBuiltDependencies: 2 | - esbuild 3 | - '@vscode/vsce-sign' 4 | - keytar 5 | -------------------------------------------------------------------------------- /src/types.ts: -------------------------------------------------------------------------------- 1 | export type ProjectSetting = Record 6 | -------------------------------------------------------------------------------- /taze.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'taze' 2 | 3 | export default defineConfig({ 4 | exclude: ['@types/vscode'], 5 | }) 6 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .cache 2 | .DS_Store 3 | .idea 4 | *.log 5 | *.tgz 6 | *.vsix 7 | coverage 8 | dist 9 | lib-cov 10 | logs 11 | node_modules 12 | temp 13 | src/generated 14 | .env 15 | -------------------------------------------------------------------------------- /.vscodeignore: -------------------------------------------------------------------------------- 1 | .vscode/** 2 | .vscode-test/** 3 | out/test/** 4 | out/**/*.map 5 | node_modules/** 6 | src/** 7 | .gitignore 8 | package-lock.json 9 | .eslintrc.js 10 | tsconfig.json 11 | screenshots/** -------------------------------------------------------------------------------- /tsdown.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'tsdown' 2 | 3 | export default defineConfig({ 4 | entry: [ 5 | 'src/index.ts', 6 | ], 7 | format: ['cjs'], 8 | shims: false, 9 | dts: false, 10 | external: [ 11 | 'vscode', 12 | ], 13 | }) 14 | -------------------------------------------------------------------------------- /.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 | } 10 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "es2017", 4 | "lib": ["esnext"], 5 | "module": "esnext", 6 | "moduleResolution": "node", 7 | "resolveJsonModule": true, 8 | "strict": true, 9 | "strictNullChecks": true, 10 | "esModuleInterop": true, 11 | "skipDefaultLibCheck": true, 12 | "skipLibCheck": true 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /.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": "dev", 9 | "isBackground": true, 10 | "presentation": { 11 | "reveal": "never" 12 | }, 13 | "problemMatcher": [ 14 | { 15 | "base": "$tsc-watch", 16 | "background": { 17 | "activeOnStart": true, 18 | "beginsPattern": "Build start", 19 | "endsPattern": "(B|Reb)uild complete" 20 | } 21 | } 22 | ], 23 | "group": "build" 24 | } 25 | ] 26 | } 27 | -------------------------------------------------------------------------------- /.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 | "name": "Extension", 10 | "type": "extensionHost", 11 | "request": "launch", 12 | "runtimeExecutable": "${execPath}", 13 | "args": [ 14 | "--extensionDevelopmentPath=${workspaceFolder}" 15 | ], 16 | "outFiles": [ 17 | "${workspaceFolder}/out/**/*.js" 18 | ], 19 | "preLaunchTask": "npm: watch" 20 | } 21 | ] 22 | } 23 | -------------------------------------------------------------------------------- /src/config.ts: -------------------------------------------------------------------------------- 1 | import type { ProjectSetting } from './types' 2 | import { defineConfigObject } from 'reactive-vscode' 3 | import { ConfigurationTarget, StatusBarAlignment } from 'vscode' 4 | import * as Meta from './generated/meta' 5 | 6 | export const config = defineConfigObject( 7 | Meta.scopedConfigs.scope, 8 | Meta.scopedConfigs.defaults, 9 | ) 10 | 11 | export function alignPriority(): number { 12 | return +config.alignPriority 13 | } 14 | 15 | export function getProjectSetting(): ProjectSetting { 16 | return config.projectSetting as ProjectSetting 17 | } 18 | 19 | export function setProjectSetting(v: ProjectSetting) { 20 | config.$update('projectSetting', v, ConfigurationTarget.Global) 21 | } 22 | 23 | export function getAlign(): StatusBarAlignment { 24 | switch (config.align) { 25 | case 'left': 26 | return StatusBarAlignment.Left 27 | case 'right': 28 | return StatusBarAlignment.Right 29 | default: 30 | return StatusBarAlignment.Left 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /.github/workflows/release.yml: -------------------------------------------------------------------------------- 1 | name: Publish Extension 2 | 3 | on: 4 | push: 5 | tags: 6 | - v* 7 | 8 | jobs: 9 | publish-extension: 10 | permissions: 11 | id-token: write 12 | contents: write 13 | actions: write 14 | 15 | runs-on: ubuntu-latest 16 | steps: 17 | - name: Checkout 18 | uses: actions/checkout@v5 19 | with: 20 | fetch-depth: 0 21 | 22 | - name: Install pnpm 23 | uses: pnpm/action-setup@v4 24 | 25 | - name: Set node 26 | uses: actions/setup-node@v5 27 | with: 28 | node-version: lts/* 29 | cache: pnpm 30 | 31 | - run: npx changelogithub 32 | continue-on-error: true 33 | env: 34 | GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}} 35 | 36 | - run: pnpm install 37 | 38 | - name: Generate .vsix file 39 | run: pnpm package 40 | 41 | - name: Publish Extension 42 | run: npx vsxpub --no-dependencies 43 | env: 44 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 45 | VSCE_PAT: ${{secrets.VSCE_PAT}} 46 | OVSX_PAT: ${{secrets.OVSX_PAT}} 47 | -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2022 Anthony Fu 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.md: -------------------------------------------------------------------------------- 1 | # Where Am I? - VS Code extension 2 | 3 | Don't get lost even you have multiple VS Code opened. 4 | 5 | ![](./screenshots/demo.png) 6 | 7 | Modified base on [maliarov/vscode-project-name-in-statusbar](https://github.com/maliarov/vscode-project-name-in-statusbar). 8 | 9 | ## Configurations 10 | 11 | 12 | 13 | | Key | Description | Type | Default | 14 | | --------------------------- | ------------------------------------------------------------------------------------------------------------------------ | --------- | -------------------------------------- | 15 | | `where-am-i.colorful` | Use color | `boolean` | `true` | 16 | | `where-am-i.color` | The color of status text. When not defined, a random color will be used based on the project name. | `string` | `""` | 17 | | `where-am-i.align` | Defines The alignment of the label, requires restart of vscode | `string` | `"left"` | 18 | | `where-am-i.alignPriority` | Defines priority of the label. Higher values mean the label should be shown more to the left, requires restart of vscode | `number` | `100000` | 19 | | `where-am-i.textTransfrom` | Defines project name text style inside template | `string` | `"capitalize"` | 20 | | `where-am-i.command` | The command to execute when clicking the status bar item. | `string` | `"workbench.action.quickSwitchWindow"` | 21 | | `where-am-i.icon` | Codicon id | `string` | `"folder-opened"` | 22 | | `where-am-i.template` | Defines template of project name placeholder | `string` | `"{icon} {project-name}"` | 23 | | `where-am-i.projectSetting` | Project preference | `object` | `{}` | 24 | 25 | 26 | 27 | ## Commands 28 | 29 | 30 | 31 | | Command | Title | 32 | | ------------------- | ------------------------------------- | 33 | | `where-am-i.config` | Where Am I: Config the name and color | 34 | 35 | 36 | -------------------------------------------------------------------------------- /src/utils.ts: -------------------------------------------------------------------------------- 1 | import type { TextEditor } from 'vscode' 2 | import path from 'node:path' 3 | import { useLogger } from 'reactive-vscode' 4 | import { window, workspace } from 'vscode' 5 | import { config } from './config' 6 | import { displayName } from './generated/meta' 7 | 8 | export const logger = useLogger(displayName) 9 | 10 | function capitalize(s: string) { 11 | return s.charAt(0).toUpperCase() + s.slice(1).toLowerCase() 12 | } 13 | 14 | const textTransforms: Record string> = { 15 | uppercase: (t: string) => t.toUpperCase(), 16 | lowercase: (t: string) => t.toLowerCase(), 17 | capitalize: (t: string) => t.trim().split(/-|_/g).map(capitalize).join(' '), 18 | } 19 | 20 | export function getProjectPath(): string | undefined { 21 | if (Array.isArray(workspace.workspaceFolders)) { 22 | if (workspace.workspaceFolders.length === 1) { 23 | return workspace.workspaceFolders[0].uri.path 24 | } 25 | else if (workspace.workspaceFolders.length > 1) { 26 | const activeTextEditor: TextEditor | undefined = window.activeTextEditor 27 | if (activeTextEditor) { 28 | const workspaceFolder = workspace.workspaceFolders.find((folder: any) => 29 | activeTextEditor.document.uri.path.startsWith(folder.uri.path), 30 | ) 31 | if (workspaceFolder) 32 | return workspaceFolder.uri.path 33 | } 34 | } 35 | } 36 | } 37 | 38 | export function getProjectColor(projectName: string, isDark: boolean): string | undefined { 39 | if (!config.colorful) 40 | return 41 | 42 | if (!projectName) 43 | return config.color || undefined 44 | 45 | return config.color || stringToColor(projectName, isDark) 46 | } 47 | 48 | export function getProjectName(projectPath: string) { 49 | const projectName = path.basename(projectPath) 50 | const transform = config.textTransfrom 51 | 52 | if (textTransforms[transform]) 53 | return textTransforms[transform](projectName) 54 | return projectName 55 | } 56 | 57 | export function getCommand(): string { 58 | return config.command || 'workbench.action.quickSwitchWindow' 59 | } 60 | 61 | const colors = new Map<'dark' | 'light', Map>(new Map([['dark', new Map()], ['light', new Map()]])) 62 | 63 | function stringToColor(str: string, isDark: boolean = false) { 64 | const cached = colors.get(isDark ? 'dark' : 'light')?.get(str) 65 | if (cached) 66 | return cached 67 | 68 | let hash = 0 69 | for (let i = 0; i < str.length; i++) 70 | hash = str.charCodeAt(i) + ((hash << 5) - hash) 71 | 72 | const hue = Math.abs(hash) % 360 73 | 74 | const saturation = 65 75 | const lightness = isDark ? 60 : 40 76 | 77 | const result = hslToHex(hue, saturation, lightness) 78 | logger.info(`stringToColor: ${str} -> ${result}`) 79 | colors.get(isDark ? 'dark' : 'light')?.set(str, result) 80 | 81 | return result 82 | } 83 | 84 | function hslToHex(h: number, s: number, l: number) { 85 | const [r, g, b] = hslToRgb(h, s, l) 86 | return `#${r.toString(16).padStart(2, '0').slice(0, 2)}${g.toString(16).padStart(2, '0').slice(0, 2)}${b.toString(16).padStart(2, '0').slice(0, 2)}` 87 | } 88 | 89 | function hslToRgb(h: number, s: number, l: number) { 90 | h = h % 360 91 | h /= 360 92 | s /= 100 93 | l /= 100 94 | let r, g, b 95 | 96 | if (s === 0) { 97 | r = g = b = l // achromatic 98 | } 99 | else { 100 | const hue2rgb = (p: number, q: number, t: number) => { 101 | if (t < 0) 102 | t += 1 103 | if (t > 1) 104 | t -= 1 105 | if (t < 1 / 6) 106 | return p + (q - p) * 6 * t 107 | if (t < 1 / 2) 108 | return q 109 | if (t < 2 / 3) 110 | return p + (q - p) * (2 / 3 - t) * 6 111 | return p 112 | } 113 | 114 | const q = l < 0.5 ? l * (1 + s) : l + s - l * s 115 | const p = 2 * l - q 116 | r = hue2rgb(p, q, h + 1 / 3) 117 | g = hue2rgb(p, q, h) 118 | b = hue2rgb(p, q, h - 1 / 3) 119 | } 120 | 121 | return [ 122 | Math.max(0, Math.round(r * 255)), 123 | Math.max(0, Math.round(g * 255)), 124 | Math.max(0, Math.round(b * 255)), 125 | ] 126 | } 127 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "publisher": "antfu", 3 | "name": "where-am-i", 4 | "displayName": "Where Am I?", 5 | "version": "0.3.1", 6 | "packageManager": "pnpm@10.19.0", 7 | "description": "Identify your current working folder in status bar", 8 | "license": "MIT", 9 | "repository": { 10 | "type": "git", 11 | "url": "https://github.com/antfu/vscode-where-am-i" 12 | }, 13 | "categories": [ 14 | "Other" 15 | ], 16 | "main": "./dist/index.js", 17 | "icon": "res/logo.png", 18 | "engines": { 19 | "vscode": "^1.62.0" 20 | }, 21 | "activationEvents": [ 22 | "onStartupFinished" 23 | ], 24 | "contributes": { 25 | "commands": [ 26 | { 27 | "command": "where-am-i.config", 28 | "category": "Where Am I", 29 | "title": "Config the name and color" 30 | } 31 | ], 32 | "configuration": { 33 | "type": "object", 34 | "title": "Project Name In StatusBar extension configuration", 35 | "properties": { 36 | "where-am-i.colorful": { 37 | "type": "boolean", 38 | "default": true, 39 | "description": "Use color" 40 | }, 41 | "where-am-i.color": { 42 | "type": "string", 43 | "default": "", 44 | "description": "The color of status text. When not defined, a random color will be used based on the project name." 45 | }, 46 | "where-am-i.align": { 47 | "type": "string", 48 | "enum": [ 49 | "left", 50 | "right" 51 | ], 52 | "default": "left", 53 | "description": "Defines The alignment of the label, requires restart of vscode" 54 | }, 55 | "where-am-i.alignPriority": { 56 | "type": "number", 57 | "default": 100000, 58 | "description": "Defines priority of the label. Higher values mean the label should be shown more to the left, requires restart of vscode" 59 | }, 60 | "where-am-i.textTransfrom": { 61 | "type": "string", 62 | "enum": [ 63 | "none", 64 | "uppercase", 65 | "lowercase", 66 | "capitalize" 67 | ], 68 | "default": "capitalize", 69 | "description": "Defines project name text style inside template" 70 | }, 71 | "where-am-i.command": { 72 | "type": "string", 73 | "enum": [ 74 | "workbench.action.quickSwitchWindow", 75 | "workbench.action.openRecent" 76 | ], 77 | "default": "workbench.action.quickSwitchWindow", 78 | "description": "The command to execute when clicking the status bar item." 79 | }, 80 | "where-am-i.icon": { 81 | "type": "string", 82 | "default": "folder-opened", 83 | "description": "Codicon id" 84 | }, 85 | "where-am-i.template": { 86 | "type": "string", 87 | "default": "{icon} {project-name}", 88 | "description": "Defines template of project name placeholder" 89 | }, 90 | "where-am-i.projectSetting": { 91 | "type": "object", 92 | "default": {}, 93 | "description": "Project preference" 94 | } 95 | } 96 | } 97 | }, 98 | "scripts": { 99 | "package": "vsce package --no-dependencies", 100 | "build": "tsdown src/index.ts --external vscode", 101 | "dev": "pnpm build --watch --sourcemap", 102 | "lint": "eslint .", 103 | "typecheck": "tsc --noEmit", 104 | "test": "vitest", 105 | "release": "bumpp", 106 | "prepare": "vscode-ext-gen --output src/generated/meta.ts", 107 | "vscode:prepublish": "npm run build" 108 | }, 109 | "devDependencies": { 110 | "@antfu/eslint-config": "^6.0.0", 111 | "@types/node": "^24.9.1", 112 | "@types/vscode": "^1.62.0", 113 | "@vscode/vsce": "^3.6.2", 114 | "bumpp": "^10.3.1", 115 | "eslint": "^9.38.0", 116 | "reactive-vscode": "^0.4.0", 117 | "taze": "^19.8.1", 118 | "tsdown": "^0.15.9", 119 | "typescript": "^5.9.3", 120 | "vitest": "^3.2.4", 121 | "vscode-ext-gen": "^1.3.0", 122 | "vsxpub": "^0.1.2" 123 | } 124 | } 125 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | import type { Disposable, ExtensionContext } from 'vscode' 2 | import { defineExtension, useIsDarkTheme, watch } from 'reactive-vscode' 3 | import { commands, window, workspace } from 'vscode' 4 | import { alignPriority, config, getAlign, getProjectSetting, setProjectSetting } from './config' 5 | import icons from './icons' 6 | import { getCommand, getProjectColor, getProjectName, getProjectPath } from './utils' 7 | 8 | async function selectIcon(value?: string) { 9 | const items = icons.map(i => ({ 10 | label: `$(${i})`, 11 | description: i, 12 | })) 13 | const result = await window.showQuickPick(items, { 14 | placeHolder: value, 15 | matchOnDetail: true, 16 | matchOnDescription: true, 17 | }) 18 | return result?.description || value 19 | } 20 | 21 | const { activate, deactivate } = defineExtension((context: ExtensionContext) => { 22 | let onDidChangeWorkspaceFoldersDisposable: Disposable | undefined 23 | let onDidChangeActiveTextEditorDisposable: Disposable | undefined 24 | const isDark = useIsDarkTheme() 25 | const statusBarItem = window.createStatusBarItem(getAlign(), alignPriority()) 26 | let projectPath: string | undefined 27 | let projectName = '' 28 | let statusBarName = '' 29 | let statusBarColor: string | undefined 30 | let statusBarIcon: string | undefined 31 | 32 | function updateStatusBarItem() { 33 | projectPath = getProjectPath() 34 | if (!projectPath) { 35 | statusBarItem.text = '' 36 | statusBarItem.hide() 37 | return 38 | } 39 | 40 | const projectSetting = getProjectSetting()[projectPath] 41 | projectName = projectSetting?.name || getProjectName(projectPath) 42 | statusBarIcon = projectSetting?.icon || config.icon 43 | statusBarName = config.template 44 | .replace(/\{project-name\}/, projectName) 45 | .replace(/\{icon\}/, `$(${statusBarIcon})`) 46 | statusBarColor = projectSetting?.color || getProjectColor(projectPath, isDark.value) 47 | statusBarItem.text = statusBarName 48 | statusBarItem.color = statusBarColor 49 | statusBarItem.command = getCommand() 50 | statusBarItem.show() 51 | } 52 | 53 | function updateSubscription() { 54 | if (!onDidChangeWorkspaceFoldersDisposable) { 55 | (onDidChangeWorkspaceFoldersDisposable = workspace.onDidChangeWorkspaceFolders(() => { 56 | updateSubscription() 57 | updateStatusBarItem() 58 | })) 59 | } 60 | 61 | if (Array.isArray(workspace.workspaceFolders)) { 62 | if (workspace.workspaceFolders.length > 1) { 63 | if (!onDidChangeActiveTextEditorDisposable) 64 | onDidChangeActiveTextEditorDisposable = window.onDidChangeActiveTextEditor(() => updateStatusBarItem()) 65 | } 66 | else { 67 | if (onDidChangeActiveTextEditorDisposable) 68 | onDidChangeActiveTextEditorDisposable.dispose() 69 | } 70 | } 71 | } 72 | 73 | context.subscriptions.push(statusBarItem) 74 | 75 | commands.registerCommand('where-am-i.config', async () => { 76 | if (!projectName || !projectPath) 77 | return 78 | 79 | projectName = await window.showInputBox({ 80 | value: projectName, 81 | prompt: 'Project Name', 82 | }) ?? projectName 83 | 84 | if (config.colorful) { 85 | statusBarColor = await window.showInputBox({ 86 | value: statusBarColor, 87 | prompt: 'Project Color', 88 | }) ?? statusBarColor 89 | } 90 | 91 | statusBarIcon = await selectIcon(statusBarIcon) 92 | 93 | const settings = getProjectSetting() 94 | if (!settings[projectPath]) 95 | settings[projectPath] = {} 96 | 97 | const projectSetting = settings[projectPath] 98 | projectSetting.name = projectName 99 | projectSetting.color = statusBarColor 100 | projectSetting.icon = statusBarIcon 101 | 102 | setProjectSetting(settings) 103 | updateStatusBarItem() 104 | }) 105 | 106 | workspace.onDidChangeConfiguration(() => { 107 | updateSubscription() 108 | updateStatusBarItem() 109 | }) 110 | 111 | watch( 112 | () => isDark.value, 113 | () => { 114 | updateSubscription() 115 | updateStatusBarItem() 116 | }, 117 | { immediate: true }, 118 | ) 119 | }) 120 | 121 | export { activate, deactivate } 122 | -------------------------------------------------------------------------------- /src/icons.ts: -------------------------------------------------------------------------------- 1 | export default [ 2 | 'account', 3 | 'activate-breakpoints', 4 | 'add', 5 | 'archive', 6 | 'arrow-both', 7 | 'arrow-down', 8 | 'arrow-left', 9 | 'arrow-right', 10 | 'arrow-small-down', 11 | 'arrow-small-left', 12 | 'arrow-small-right', 13 | 'arrow-small-up', 14 | 'arrow-up', 15 | 'beaker', 16 | 'bell-dot', 17 | 'bell', 18 | 'bold', 19 | 'book', 20 | 'bookmark', 21 | 'briefcase', 22 | 'broadcast', 23 | 'browser', 24 | 'bug', 25 | 'calendar', 26 | 'call-incoming', 27 | 'call-outgoing', 28 | 'case-sensitive', 29 | 'check', 30 | 'checklist', 31 | 'chevron-down', 32 | 'chevron-left', 33 | 'chevron-right', 34 | 'chevron-up', 35 | 'chrome-close', 36 | 'chrome-maximize', 37 | 'chrome-minimize', 38 | 'chrome-restore', 39 | 'circle-filled', 40 | 'circle-outline', 41 | 'circle-slash', 42 | 'circuit-board', 43 | 'clear-all', 44 | 'clippy', 45 | 'close-all', 46 | 'close', 47 | 'cloud-download', 48 | 'cloud-upload', 49 | 'code', 50 | 'collapse-all', 51 | 'color-mode', 52 | 'comment-discussion', 53 | 'comment', 54 | 'compare-changes', 55 | 'credit-card', 56 | 'dash', 57 | 'dashboard', 58 | 'database', 59 | 'debug-alt-2', 60 | 'debug-alt', 61 | 'debug-breakpoint-conditional-unverified', 62 | 'debug-breakpoint-conditional', 63 | 'debug-breakpoint-data-unverified', 64 | 'debug-breakpoint-data', 65 | 'debug-breakpoint-function-unverified', 66 | 'debug-breakpoint-function', 67 | 'debug-breakpoint-log-unverified', 68 | 'debug-breakpoint-log', 69 | 'debug-breakpoint-unsupported', 70 | 'debug-console', 71 | 'debug-continue', 72 | 'debug-disconnect', 73 | 'debug-pause', 74 | 'debug-restart-frame', 75 | 'debug-restart', 76 | 'debug-reverse-continue', 77 | 'debug-stackframe-active', 78 | 'debug-stackframe-dot', 79 | 'debug-stackframe', 80 | 'debug-start', 81 | 'debug-step-back', 82 | 'debug-step-into', 83 | 'debug-step-out', 84 | 'debug-step-over', 85 | 'debug-stop', 86 | 'debug', 87 | 'desktop-download', 88 | 'device-camera-video', 89 | 'device-camera', 90 | 'device-mobile', 91 | 'diff-added', 92 | 'diff-ignored', 93 | 'diff-modified', 94 | 'diff-removed', 95 | 'diff-renamed', 96 | 'diff', 97 | 'discard', 98 | 'edit', 99 | 'editor-layout', 100 | 'ellipsis', 101 | 'empty-window', 102 | 'error', 103 | 'exclude', 104 | 'expand-all', 105 | 'extensions', 106 | 'eye-closed', 107 | 'eye', 108 | 'feedback', 109 | 'file-binary', 110 | 'file-code', 111 | 'file-media', 112 | 'file-pdf', 113 | 'file-submodule', 114 | 'file-symlink-directory', 115 | 'file-symlink-file', 116 | 'file-zip', 117 | 'file', 118 | 'files', 119 | 'filter', 120 | 'flame', 121 | 'fold-down', 122 | 'fold-up', 123 | 'fold', 124 | 'folder-active', 125 | 'folder-opened', 126 | 'folder', 127 | 'gear', 128 | 'gift', 129 | 'gist-secret', 130 | 'gist', 131 | 'git-commit', 132 | 'git-compare', 133 | 'git-merge', 134 | 'git-pull-request', 135 | 'github-action', 136 | 'github-alt', 137 | 'github-inverted', 138 | 'github', 139 | 'globe', 140 | 'go-to-file', 141 | 'grabber', 142 | 'graph', 143 | 'gripper', 144 | 'group-by-ref-type', 145 | 'heart', 146 | 'history', 147 | 'home', 148 | 'horizontal-rule', 149 | 'hubot', 150 | 'inbox', 151 | 'info', 152 | 'issue-closed', 153 | 'issue-reopened', 154 | 'issues', 155 | 'italic', 156 | 'jersey', 157 | 'json', 158 | 'kebab-vertical', 159 | 'key', 160 | 'law', 161 | 'library', 162 | 'lightbulb-autofix', 163 | 'lightbulb', 164 | 'link-external', 165 | 'link', 166 | 'list-filter', 167 | 'list-flat', 168 | 'list-ordered', 169 | 'list-selection', 170 | 'list-tree', 171 | 'list-unordered', 172 | 'live-share', 173 | 'loading', 174 | 'location', 175 | 'lock', 176 | 'mail-read', 177 | 'mail', 178 | 'markdown', 179 | 'megaphone', 180 | 'mention', 181 | 'menu', 182 | 'milestone', 183 | 'mirror', 184 | 'mortar-board', 185 | 'move', 186 | 'multiple-windows', 187 | 'mute', 188 | 'new-file', 189 | 'new-folder', 190 | 'no-newline', 191 | 'note', 192 | 'octoface', 193 | 'open-preview', 194 | 'organization', 195 | 'output', 196 | 'package', 197 | 'paintcan', 198 | 'person', 199 | 'pin', 200 | 'pinned', 201 | 'play', 202 | 'plug', 203 | 'preserve-case', 204 | 'preview', 205 | 'primitive-square', 206 | 'project', 207 | 'pulse', 208 | 'question', 209 | 'quote', 210 | 'radio-tower', 211 | 'reactions', 212 | 'record-keys', 213 | 'references', 214 | 'refresh', 215 | 'regex', 216 | 'remote-explorer', 217 | 'remote', 218 | 'remove', 219 | 'replace-all', 220 | 'replace', 221 | 'reply', 222 | 'repo-clone', 223 | 'repo-force-push', 224 | 'repo-forked', 225 | 'repo-pull', 226 | 'repo-push', 227 | 'repo', 228 | 'report', 229 | 'request-changes', 230 | 'rocket', 231 | 'root-folder-opened', 232 | 'root-folder', 233 | 'rss', 234 | 'ruby', 235 | 'run-all', 236 | 'save-all', 237 | 'save-as', 238 | 'save', 239 | 'screen-full', 240 | 'screen-normal', 241 | 'search-stop', 242 | 'search', 243 | 'server-environment', 244 | 'server-process', 245 | 'server', 246 | 'settings-gear', 247 | 'settings', 248 | 'shield', 249 | 'sign-in', 250 | 'sign-out', 251 | 'smiley', 252 | 'sort-precedence', 253 | 'source-control', 254 | 'split-horizontal', 255 | 'split-vertical', 256 | 'squirrel', 257 | 'star-empty', 258 | 'star-full', 259 | 'star-half', 260 | 'symbol-array', 261 | 'symbol-boolean', 262 | 'symbol-class', 263 | 'symbol-color', 264 | 'symbol-constant', 265 | 'symbol-enum-member', 266 | 'symbol-enum', 267 | 'symbol-event', 268 | 'symbol-field', 269 | 'symbol-file', 270 | 'symbol-interface', 271 | 'symbol-key', 272 | 'symbol-keyword', 273 | 'symbol-method', 274 | 'symbol-misc', 275 | 'symbol-namespace', 276 | 'symbol-numeric', 277 | 'symbol-operator', 278 | 'symbol-parameter', 279 | 'symbol-property', 280 | 'symbol-ruler', 281 | 'symbol-snippet', 282 | 'symbol-string', 283 | 'symbol-structure', 284 | 'symbol-variable', 285 | 'sync-ignored', 286 | 'sync', 287 | 'tag', 288 | 'tasklist', 289 | 'telescope', 290 | 'terminal', 291 | 'text-size', 292 | 'three-bars', 293 | 'thumbsdown', 294 | 'thumbsup', 295 | 'tools', 296 | 'trash', 297 | 'triangle-down', 298 | 'triangle-left', 299 | 'triangle-right', 300 | 'triangle-up', 301 | 'twitter', 302 | 'unfold', 303 | 'ungroup-by-ref-type', 304 | 'unlock', 305 | 'unmute', 306 | 'unverified', 307 | 'verified', 308 | 'versions', 309 | 'vm-active', 310 | 'vm-outline', 311 | 'vm-running', 312 | 'vm', 313 | 'warning', 314 | 'watch', 315 | 'whitespace', 316 | 'whole-word', 317 | 'window', 318 | 'word-wrap', 319 | 'zoom-in', 320 | 'zoom-out', 321 | ] 322 | --------------------------------------------------------------------------------