A fair question about the custom list: what does it buy over the built-in Open Editors view? Most of the answer was the project colours — and those do not need a custom view. A FileDecorationProvider puts them on the built-in Open Editors view, the Explorer and the tabs, which keeps everything native that view already does, including the drag-to-dock this list cannot offer. verticalTabs.decorateFiles is off / color / colorAndBadge, defaulting to color. Badges are the two characters a FileDecoration allows, taken from the first and last segments of the project name so that Acme.Shop.Client and Acme.Shop.Server read as AC and AS rather than colliding. Two limits are documented rather than papered over: there is no way to decorate only the Open Editors view, so the Explorer is coloured too; and Git decorates modified files with only one colour winning, so a dirty file can show Git's colour instead of its project's. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
327 lines
9.3 KiB
JSON
327 lines
9.3 KiB
JSON
{
|
|
"name": "vertical-tabs",
|
|
"displayName": "Vertical Tabs",
|
|
"description": "Open editors as a flat vertical list, colour-coded by project, with pinning. For people who turn the tab bar off.",
|
|
"version": "0.1.0",
|
|
"publisher": "local",
|
|
"license": "MIT",
|
|
"engines": {
|
|
"vscode": "^1.85.0"
|
|
},
|
|
"categories": [
|
|
"Other"
|
|
],
|
|
"keywords": [
|
|
"tabs",
|
|
"vertical tabs",
|
|
"open editors",
|
|
"csharp",
|
|
"visual studio"
|
|
],
|
|
"activationEvents": [
|
|
"onStartupFinished"
|
|
],
|
|
"main": "./out/extension.js",
|
|
"contributes": {
|
|
"views": {
|
|
"explorer": [
|
|
{
|
|
"id": "verticalTabs.tabs",
|
|
"name": "Tabs",
|
|
"type": "webview",
|
|
"contextualTitle": "Tabs",
|
|
"visibility": "visible"
|
|
}
|
|
]
|
|
},
|
|
"commands": [
|
|
{
|
|
"command": "verticalTabs.close",
|
|
"title": "Close Active Tab",
|
|
"category": "Tabs"
|
|
},
|
|
{
|
|
"command": "verticalTabs.closeOthers",
|
|
"title": "Close Other Tabs",
|
|
"category": "Tabs"
|
|
},
|
|
{
|
|
"command": "verticalTabs.togglePin",
|
|
"title": "Pin or Unpin Active Tab",
|
|
"category": "Tabs"
|
|
},
|
|
{
|
|
"command": "verticalTabs.setOrderOpen",
|
|
"title": "Sort Tabs by Open Order",
|
|
"category": "Tabs"
|
|
},
|
|
{
|
|
"command": "verticalTabs.setOrderProject",
|
|
"title": "Sort Tabs by Project",
|
|
"category": "Tabs"
|
|
},
|
|
{
|
|
"command": "verticalTabs.setOrderName",
|
|
"title": "Sort Tabs by File Name",
|
|
"category": "Tabs"
|
|
}
|
|
],
|
|
"menus": {
|
|
"view/title": [
|
|
{
|
|
"command": "verticalTabs.setOrderOpen",
|
|
"when": "view == verticalTabs.tabs",
|
|
"group": "1_order@1"
|
|
},
|
|
{
|
|
"command": "verticalTabs.setOrderProject",
|
|
"when": "view == verticalTabs.tabs",
|
|
"group": "1_order@2"
|
|
},
|
|
{
|
|
"command": "verticalTabs.setOrderName",
|
|
"when": "view == verticalTabs.tabs",
|
|
"group": "1_order@3"
|
|
}
|
|
]
|
|
},
|
|
"configuration": {
|
|
"title": "Vertical Tabs",
|
|
"properties": {
|
|
"verticalTabs.order": {
|
|
"type": "string",
|
|
"enum": [
|
|
"open",
|
|
"project",
|
|
"name"
|
|
],
|
|
"enumDescriptions": [
|
|
"Keep the order the editors are open in, matching the tab bar.",
|
|
"Group by project, so the colours run in blocks.",
|
|
"Sort by file name."
|
|
],
|
|
"default": "open",
|
|
"description": "How the tab list is ordered. Pinned tabs always come first."
|
|
},
|
|
"verticalTabs.pinnedFirst": {
|
|
"type": "boolean",
|
|
"default": true,
|
|
"description": "List pinned tabs above the rest."
|
|
},
|
|
"verticalTabs.showProject": {
|
|
"type": "boolean",
|
|
"default": true,
|
|
"description": "Show the project name beside the file. The row's left border already encodes the project, so turning this off gives the file name the whole row."
|
|
},
|
|
"verticalTabs.showDirectory": {
|
|
"type": "string",
|
|
"enum": [
|
|
"never",
|
|
"duplicates",
|
|
"always"
|
|
],
|
|
"enumDescriptions": [
|
|
"Never show the directory. The file name gets the whole row.",
|
|
"Only when two open files share a name, which is the usual reason to need it.",
|
|
"Always show the directory."
|
|
],
|
|
"default": "duplicates",
|
|
"description": "When to spend row width on the containing directory."
|
|
},
|
|
"verticalTabs.colorByProject": {
|
|
"type": "boolean",
|
|
"default": true,
|
|
"description": "Colour each row's left border by its containing project."
|
|
},
|
|
"verticalTabs.allGroups": {
|
|
"type": "boolean",
|
|
"default": true,
|
|
"description": "List the tabs of every editor group. When off, only the active group is listed."
|
|
},
|
|
"verticalTabs.projectFiles": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string"
|
|
},
|
|
"default": [
|
|
".asmdef",
|
|
".csproj",
|
|
".fsproj",
|
|
".vbproj",
|
|
"package.json",
|
|
"Cargo.toml",
|
|
"go.mod",
|
|
"pyproject.toml",
|
|
"pom.xml",
|
|
"build.gradle"
|
|
],
|
|
"description": "File names or extensions that mark a project root. The nearest match above a file names its project."
|
|
},
|
|
"verticalTabs.rowSpacing": {
|
|
"type": "number",
|
|
"default": 2,
|
|
"minimum": 0,
|
|
"maximum": 10,
|
|
"description": "Pixels of vertical space between rows."
|
|
},
|
|
"verticalTabs.borderWidth": {
|
|
"type": "number",
|
|
"default": 3,
|
|
"minimum": 0,
|
|
"maximum": 8,
|
|
"description": "Width in pixels of the project colour border on the left of each row."
|
|
},
|
|
"verticalTabs.decorateFiles": {
|
|
"type": "string",
|
|
"enum": [
|
|
"off",
|
|
"color",
|
|
"colorAndBadge"
|
|
],
|
|
"enumDescriptions": [
|
|
"Do not decorate files.",
|
|
"Colour each file's name by its project.",
|
|
"Colour the name and add a short project badge, such as AC for Acme.Shop.Client."
|
|
],
|
|
"default": "color",
|
|
"markdownDescription": "Colour files by project wherever VS Code shows file decorations: the Explorer, the built-in **Open Editors** view, and the editor tabs. This is what makes the built-in Open Editors view project-coloured without giving up its drag-and-drop.\n\nThere is no way to decorate only the Open Editors view, so the Explorer is coloured too. Git also decorates modified files and only one colour wins, so a dirty file may show Git's colour instead of its project's. Requires `explorer.decorations.colors`, which is on by default."
|
|
}
|
|
}
|
|
},
|
|
"colors": [
|
|
{
|
|
"id": "verticalTabs.project1",
|
|
"description": "Project colour 1.",
|
|
"defaults": {
|
|
"dark": "#4ec9b0",
|
|
"light": "#227d68",
|
|
"highContrast": "#4ec9b0"
|
|
}
|
|
},
|
|
{
|
|
"id": "verticalTabs.project2",
|
|
"description": "Project colour 2.",
|
|
"defaults": {
|
|
"dark": "#dcdcaa",
|
|
"light": "#7a6e17",
|
|
"highContrast": "#dcdcaa"
|
|
}
|
|
},
|
|
{
|
|
"id": "verticalTabs.project3",
|
|
"description": "Project colour 3.",
|
|
"defaults": {
|
|
"dark": "#9cdcfe",
|
|
"light": "#0b5f92",
|
|
"highContrast": "#9cdcfe"
|
|
}
|
|
},
|
|
{
|
|
"id": "verticalTabs.project4",
|
|
"description": "Project colour 4.",
|
|
"defaults": {
|
|
"dark": "#c586c0",
|
|
"light": "#8b338a",
|
|
"highContrast": "#c586c0"
|
|
}
|
|
},
|
|
{
|
|
"id": "verticalTabs.project5",
|
|
"description": "Project colour 5.",
|
|
"defaults": {
|
|
"dark": "#ce9178",
|
|
"light": "#a3441f",
|
|
"highContrast": "#ce9178"
|
|
}
|
|
},
|
|
{
|
|
"id": "verticalTabs.project6",
|
|
"description": "Project colour 6.",
|
|
"defaults": {
|
|
"dark": "#b5cea8",
|
|
"light": "#3c7a2e",
|
|
"highContrast": "#b5cea8"
|
|
}
|
|
},
|
|
{
|
|
"id": "verticalTabs.project7",
|
|
"description": "Project colour 7.",
|
|
"defaults": {
|
|
"dark": "#569cd6",
|
|
"light": "#1d4f91",
|
|
"highContrast": "#569cd6"
|
|
}
|
|
},
|
|
{
|
|
"id": "verticalTabs.project8",
|
|
"description": "Project colour 8.",
|
|
"defaults": {
|
|
"dark": "#d7ba7d",
|
|
"light": "#8a6512",
|
|
"highContrast": "#d7ba7d"
|
|
}
|
|
},
|
|
{
|
|
"id": "verticalTabs.project9",
|
|
"description": "Project colour 9.",
|
|
"defaults": {
|
|
"dark": "#f28b82",
|
|
"light": "#b3261e",
|
|
"highContrast": "#f28b82"
|
|
}
|
|
},
|
|
{
|
|
"id": "verticalTabs.project10",
|
|
"description": "Project colour 10.",
|
|
"defaults": {
|
|
"dark": "#a5d6a7",
|
|
"light": "#2e7d32",
|
|
"highContrast": "#a5d6a7"
|
|
}
|
|
},
|
|
{
|
|
"id": "verticalTabs.project11",
|
|
"description": "Project colour 11.",
|
|
"defaults": {
|
|
"dark": "#b39ddb",
|
|
"light": "#5e35b1",
|
|
"highContrast": "#b39ddb"
|
|
}
|
|
},
|
|
{
|
|
"id": "verticalTabs.project12",
|
|
"description": "Project colour 12.",
|
|
"defaults": {
|
|
"dark": "#80cbc4",
|
|
"light": "#00695c",
|
|
"highContrast": "#80cbc4"
|
|
}
|
|
},
|
|
{
|
|
"id": "verticalTabs.noProject",
|
|
"description": "Colour for files that belong to no project.",
|
|
"defaults": {
|
|
"dark": "descriptionForeground",
|
|
"light": "descriptionForeground",
|
|
"highContrast": "descriptionForeground"
|
|
}
|
|
}
|
|
]
|
|
},
|
|
"scripts": {
|
|
"vscode:prepublish": "npm run compile",
|
|
"compile": "tsc -p ./",
|
|
"watch": "tsc -watch -p ./",
|
|
"pretest": "npm run compile",
|
|
"test": "node ./out/test/runTest.js"
|
|
},
|
|
"devDependencies": {
|
|
"@types/mocha": "^10.0.6",
|
|
"@types/node": "^20.11.0",
|
|
"@types/vscode": "^1.85.0",
|
|
"@vscode/test-electron": "^2.4.1",
|
|
"mocha": "^10.4.0",
|
|
"typescript": "^5.4.0"
|
|
}
|
|
}
|