diff --git a/CHANGELOG.md b/CHANGELOG.md index c5f9348..354f3d4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,8 +9,9 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/) and this p - Adds all-new recent changes annotations of the whole-file - annotates and highlights all of lines changed in the most recent commit - Can customize the [layout](https://marketplace.visualstudio.com/items?itemName=eamodio.gitlens#file-recent-changes-annotation-settings), as well as the [theme](https://marketplace.visualstudio.com/items?itemName=eamodio.gitlens#theme-settings) - Adds `Toggle Recent File Changes Annotations` command (`gitlens.toggleFileRecentChanges`) - toggles the recent changes annotations on and off +- Adds ability to press `Escape` to quickly toggle any whole-file annotations off - Improves performance - - Optimized git output parsing to increase speed and reduce memory usage + - Optimized git output parsing to increase speed and dramatically reduce memory usage - Defers diff chunk parsing until it is actually required - Adds `gitlens.defaultDateFormat` setting to specify how all absolute dates will be formatted by default diff --git a/README.md b/README.md index 2f62d8d..74ec64d 100644 --- a/README.md +++ b/README.md @@ -33,6 +33,7 @@ GitLens provides an unobtrusive blame annotation at the end of the current line, - Adds a `details` hover annotation to the line's annotation, which provides more commit details ([optional](#file-blame-annotation-settings), on by default) - Adds a `heatmap` (age) indicator to the gutter annotations (on right edge by [default](#file-blame-annotation-settings)), which provides an easy, at-a-glance way to tell the age of a line ([optional](#file-blame-annotation-settings), on by default) - Indicator ranges from bright yellow (newer) to dark brown (older) + - Press `Escape` to quickly toggle the annotations off - Adds [customizable](#status-bar-settings) **blame information** about the current line to the **status bar** ([optional](#status-bar-settings), on by default) @@ -61,6 +62,7 @@ GitLens provides an unobtrusive blame annotation at the end of the current line, - Highlights all of lines changed in the most recent commit - Adds a `details` hover annotation to each line, which provides more commit details ([optional](#file-blame-annotation-settings), on by default) - Adds a `changes` (diff) hover annotation to each line, which provides **instant** access to the line's previous version ([optional](#file-recent-changes-annotation-settings), on by default) + - Press `Escape` to quickly toggle the annotations off - Adds `Toggle Recent File Changes Annotations` command (`gitlens.toggleFileRecentChanges`) to toggle the recent changes annotations on and off diff --git a/package.json b/package.json index c59d449..99dda9f 100644 --- a/package.json +++ b/package.json @@ -1,1349 +1,1341 @@ -{ - "name": "gitlens", - "version": "4.1.0-beta.2", - "author": { - "name": "Eric Amodio", - "email": "eamodio@gmail.com" - }, - "publisher": "eamodio", - "engines": { - "vscode": "^1.12.0" - }, - "license": "SEE LICENSE IN LICENSE", - "displayName": "Git Lens \u2014 git blame annotations, code lens, and more", - "description": "Supercharge Visual Studio Code's Git capabilities \u2014 Visualize code authorship at a glance via Git blame annotations and code lens, seamlessly navigate and explore the history of a file or branch, gain valuable insights via powerful comparision commands, and so much more", - "badges": [ - { - "url": "https://badges.gitter.im/vscode-gitlens/Lobby.svg", - "href": "https://gitter.im/vscode-gitlens/Lobby", - "description": "Chat at https://gitter.im/vscode-gitlens/Lobby" - } - ], - "categories": [ - "Other" - ], - "keywords": [ - "git", - "code lens", - "blame", - "history", - "annotation", - "log", - "inline blame", - "compare", - "diff" - ], - "galleryBanner": { - "color": "#56098c", - "theme": "dark" - }, - "icon": "images/gitlens-icon.svg", - "preview": false, - "homepage": "https://github.com/eamodio/vscode-gitlens/blob/master/README.md", - "bugs": { - "url": "https://github.com/eamodio/vscode-gitlens/issues" - }, - "repository": { - "type": "git", - "url": "https://github.com/eamodio/vscode-gitlens.git" - }, - "main": "./out/src/extension", - "contributes": { - "configuration": { - "type": "object", - "title": "GitLens configuration", - "properties": { - "gitlens.debug": { - "type": "boolean", - "default": false, - "description": "Specifies debug mode" - }, - "gitlens.insiders": { - "type": "boolean", - "default": false, - "description": "Specifies whether or not to enable new experimental features (expect there to be issues)" - }, - "gitlens.outputLevel": { - "type": "string", - "default": "silent", - "enum": [ - "silent", - "errors", - "verbose" - ], - "description": "Specifies how much (if any) output will be sent to the GitLens output channel" - }, - "gitlens.annotations.file.gutter.format": { - "type": "string", - "default": "${message|40?} ${ago|14-}", - "description": "Specifies the format of the gutter blame annotations\nAvailable tokens\n ${id} - commit id\n ${author} - commit author\n ${message} - commit message\n ${ago} - relative commit date (e.g. 1 day ago)\n ${date} - formatted commit date (format specified by `gitlens.annotations.file.gutter.dateFormat`)\n ${authorAgo} - commit author, relative commit date\nSee https://github.com/eamodio/vscode-gitlens/wiki/Advanced-Formatting for advanced formatting" - }, - "gitlens.annotations.file.gutter.dateFormat": { - "type": "string", - "default": null, - "description": "Specifies how to format absolute dates (using the `${date}` token) in gutter blame annotations\nSee https://momentjs.com/docs/#/displaying/format/ for valid formats" - }, - "gitlens.annotations.file.gutter.compact": { - "type": "boolean", - "default": true, - "description": "Specifies whether or not to compact (deduplicate) matching adjacent gutter blame annotations" - }, - "gitlens.annotations.file.gutter.heatmap.enabled": { - "type": "boolean", - "default": true, - "description": "Specifies whether or not to provide a heatmap indicator in the gutter blame annotations" - }, - "gitlens.annotations.file.gutter.heatmap.location": { - "type": "string", - "default": "right", - "enum": [ - "left", - "right" - ], - "description": "Specifies where the heatmap indicators will be shown in the gutter blame annotations\n `left` - adds a heatmap indicator on the left edge of the gutter blame annotations\n `right` - adds a heatmap indicator on the right edge of the gutter blame annotations" - }, - "gitlens.annotations.file.gutter.hover.details": { - "type": "boolean", - "default": true, - "description": "Specifies whether or not to provide a commit details hover annotation over the gutter blame annotations" - }, - "gitlens.annotations.file.gutter.hover.wholeLine": { - "type": "boolean", - "default": false, - "description": "Specifies whether or not to trigger hover annotations over the whole line" - }, - "gitlens.annotations.file.hover.heatmap.enabled": { - "type": "boolean", - "default": true, - "description": "Specifies whether or not to provide heatmap indicators on the left edge of each line" - }, - "gitlens.annotations.file.hover.wholeLine": { - "type": "boolean", - "default": true, - "description": "Specifies whether or not to trigger hover annotations over the whole line" - }, - "gitlens.annotations.file.recentChanges.hover.details": { - "type": "boolean", - "default": true, - "description": "Specifies whether or not to provide a commit details hover annotation" - }, - "gitlens.annotations.file.recentChanges.hover.changes": { - "type": "boolean", - "default": true, - "description": "Specifies whether or not to provide a changes (diff) hover annotation" - }, - "gitlens.annotations.file.recentChanges.hover.wholeLine": { - "type": "boolean", - "default": true, - "description": "Specifies whether or not to trigger hover annotations over the whole line" - }, - "gitlens.annotations.line.hover.details": { - "type": "boolean", - "default": true, - "description": "Specifies whether or not to provide a commit details hover annotation for the current line" - }, - "gitlens.annotations.line.hover.changes": { - "type": "boolean", - "default": true, - "description": "Specifies whether or not to provide a changes (diff) hover annotation for the current line" - }, - "gitlens.annotations.line.trailing.format": { - "type": "string", - "default": "${authorAgo} \u2022 ${message}", - "description": "Specifies the format of the trailing blame annotations\nAvailable tokens\n ${id} - commit id\n ${author} - commit author\n ${message} - commit message\n ${ago} - relative commit date (e.g. 1 day ago)\n ${date} - formatted commit date (format specified by `gitlens.annotations.line.trailing.dateFormat`)\n ${authorAgo} - commit author, relative commit date\nSee https://github.com/eamodio/vscode-gitlens/wiki/Advanced-Formatting for advanced formatting" - }, - "gitlens.annotations.line.trailing.dateFormat": { - "type": "string", - "default": null, - "description": "Specifies how to format absolute dates (using the `${date}` token) in trailing blame annotations\nSee https://momentjs.com/docs/#/displaying/format/ for valid formats" - }, - "gitlens.annotations.line.trailing.hover.details": { - "type": "boolean", - "default": true, - "description": "Specifies whether or not to provide a commit details hover annotation over the trailing blame annotations" - }, - "gitlens.annotations.line.trailing.hover.changes": { - "type": "boolean", - "default": true, - "description": "Specifies whether or not to provide a changes (diff) hover annotation over the trailing blame annotations" - }, - "gitlens.annotations.line.trailing.hover.wholeLine": { - "type": "boolean", - "default": false, - "description": "Specifies whether or not to trigger hover annotations over the whole line" - }, - "gitlens.blame.file.annotationType": { - "type": "string", - "default": "gutter", - "enum": [ - "gutter", - "hover" - ], - "description": "Specifies the type of blame annotations that will be shown for the current file\n `gutter` - adds an annotation to the beginning of each line\n `hover` - shows annotations when hovering over each line" - }, - "gitlens.blame.file.lineHighlight.enabled": { - "type": "boolean", - "default": true, - "description": "Specifies whether or not to highlight lines associated with the current line" - }, - "gitlens.blame.file.lineHighlight.locations": { - "type": "array", - "default": [ - "gutter", - "line", - "overviewRuler" - ], - "items": { - "type": "string", - "enum": [ - "gutter", - "line", - "overviewRuler" - ] - }, - "minItems": 1, - "maxItems": 3, - "uniqueItems": true, - "description": "Specifies where the associated line highlights will be shown\n `gutter` - adds a gutter glyph\n `line` - adds a full-line highlight background color\n `overviewRuler` - adds a decoration to the overviewRuler (scroll bar)" - }, - "gitlens.blame.line.enabled": { - "type": "boolean", - "default": true, - "description": "Specifies whether or not to provide a blame annotation for the current line" - }, - "gitlens.blame.line.annotationType": { - "type": "string", - "default": "trailing", - "enum": [ - "trailing", - "hover" - ], - "description": "Specifies the type of blame annotations that will be shown for the current line\n `trailing` - adds an annotation to the end of the current line\n `hover` - shows annotations when hovering over the current line" - }, - "gitlens.recentChanges.file.lineHighlight.locations": { - "type": "array", - "default": [ - "gutter", - "line", - "overviewRuler" - ], - "items": { - "type": "string", - "enum": [ - "gutter", - "line", - "overviewRuler" - ] - }, - "minItems": 1, - "maxItems": 3, - "uniqueItems": true, - "description": "Specifies where the highlights of the recently changed lines will be shown\n `gutter` - adds a gutter glyph\n `line` - adds a full-line highlight background color\n `overviewRuler` - adds a decoration to the overviewRuler (scroll bar)" - }, - "gitlens.codeLens.enabled": { - "type": "boolean", - "default": true, - "description": "Specifies whether or not to provide any Git code lens" - }, - "gitlens.codeLens.recentChange.enabled": { - "type": "boolean", - "default": true, - "description": "Specifies whether or not to show a `recent change` code lens showing the author and date of the most recent commit for the file or code block" - }, - "gitlens.codeLens.recentChange.command": { - "type": "string", - "default": "gitlens.showQuickCommitFileDetails", - "enum": [ - "gitlens.toggleFileBlame", - "gitlens.showBlameHistory", - "gitlens.showFileHistory", - "gitlens.diffWithPrevious", - "gitlens.showQuickCommitDetails", - "gitlens.showQuickCommitFileDetails", - "gitlens.showQuickFileHistory", - "gitlens.showQuickRepoHistory" - ], - "description": "Specifies the command to be executed when the `recent change` code lens is clicked\n `gitlens.toggleFileBlame` - toggles file blame annotations\n `gitlens.showBlameHistory` - opens the blame history explorer\n `gitlens.showFileHistory` - opens the file history explorer\n `gitlens.diffWithPrevious` - compares the current committed file with the previous commit\n `gitlens.showQuickCommitDetails` - shows a commit details quick pick\n `gitlens.showQuickCommitFileDetails` - shows a commit file details quick pick\n `gitlens.showQuickFileHistory` - shows a file history quick pick\n `gitlens.showQuickRepoHistory` - shows a branch history quick pick" - }, - "gitlens.codeLens.authors.enabled": { - "type": "boolean", - "default": true, - "description": "Specifies whether or not to show an `authors` code lens showing number of authors of the file or code block and the most prominent author (if there is more than one)" - }, - "gitlens.codeLens.authors.command": { - "type": "string", - "default": "gitlens.toggleFileBlame", - "enum": [ - "gitlens.toggleFileBlame", - "gitlens.showBlameHistory", - "gitlens.showFileHistory", - "gitlens.diffWithPrevious", - "gitlens.showQuickCommitDetails", - "gitlens.showQuickCommitFileDetails", - "gitlens.showQuickFileHistory", - "gitlens.showQuickRepoHistory" - ], - "description": "Specifies the command to be executed when the `authors` code lens is clicked\n `gitlens.toggleFileBlame` - toggles file blame annotations\n `gitlens.showBlameHistory` - opens the blame history explorer\n `gitlens.showFileHistory` - opens the file history explorer\n `gitlens.diffWithPrevious` - compares the current committed file with the previous commit\n `gitlens.showQuickCommitDetails` - shows a commit details quick pick\n `gitlens.showQuickCommitFileDetails` - shows a commit file details quick pick\n `gitlens.showQuickFileHistory` - shows a file history quick pick\n `gitlens.showQuickRepoHistory` - shows a branch history quick pick" - }, - "gitlens.codeLens.locations": { - "type": "array", - "default": [ - "document", - "containers" - ], - "items": { - "type": "string", - "enum": [ - "document", - "containers", - "blocks", - "custom" - ] - }, - "minItems": 1, - "maxItems": 4, - "uniqueItems": true, - "description": "Specifies where Git code lens will be shown in the document\n `document` - adds code lens at the top of the document\n `containers` - adds code lens at the start of container-like symbols (modules, classes, interfaces, etc)\n `blocks` - adds code lens at the start of block-like symbols (functions, methods, properties, etc) lines\n `custom` - adds code lens at the start of symbols contained in `gitlens.codeLens.locationCustomSymbols`" - }, - "gitlens.codeLens.customLocationSymbols": { - "type": "array", - "items": { - "type": "string" - }, - "uniqueItems": true, - "description": "Specifies the set of document symbols where Git code lens will be shown in the document\nMust be a member of `SymbolKind`" - }, - "gitlens.codeLens.perLanguageLocations": { - "type": "array", - "default": [ - { - "language": "css", - "locations": [ - "document" - ] - }, - { - "language": "html", - "locations": [ - "document" - ] - }, - { - "language": "json", - "locations": [ - "document" - ] - }, - { - "language": "less", - "locations": [ - "document" - ] - }, - { - "language": "scss", - "locations": [ - "document" - ] - }, - { - "language": "vue", - "locations": [ - "document" - ] - } - ], - "items": { - "type": "object", - "required": [ - "language", - "locations" - ], - "properties": { - "language": { - "type": "string", - "description": "Specifies the language to which this code lens override applies" - }, - "locations": { - "type": "array", - "default": [ - "document", - "containers" - ], - "items": { - "type": "string", - "enum": [ - "document", - "containers", - "blocks", - "custom" - ] - }, - "minItems": 1, - "maxItems": 4, - "uniqueItems": true, - "description": "Specifies where Git code lens will be shown in the document for the specified language\n `document` - adds code lens at the top of the document\n `containers` - adds code lens at the start of container-like symbols (modules, classes, interfaces, etc)\n `blocks` - adds code lens at the start of block-like symbols (functions, methods, properties, etc) lines\n `custom` - adds code lens at the start of symbols contained in `customSymbols`" - }, - "customSymbols": { - "type": "array", - "items": { - "type": "string" - }, - "uniqueItems": true, - "description": "Specifies the set of document symbols where Git code lens will be shown in the document for the specified language\nMust be a member of `SymbolKind`" - } - } - }, - "uniqueItems": true, - "description": "Specifies where Git code lens will be shown in the document for the specified languages" - }, - "gitlens.codeLens.debug": { - "type": "boolean", - "default": false, - "description": "Specifies whether or not to show debug information in code lens" - }, - "gitlens.defaultDateFormat": { - "type": "string", - "default": null, - "description": "Specifies how all absolute dates will be formatted by default\nSee https://momentjs.com/docs/#/displaying/format/ for valid formats" - }, - "gitlens.statusBar.enabled": { - "type": "boolean", - "default": true, - "description": "Specifies whether or not to provide blame information on the status bar" - }, - "gitlens.statusBar.alignment": { - "type": "string", - "default": "right", - "enum": [ - "left", - "right" - ], - "description": "Specifies the blame alignment in the status bar\n `left` - align to the left\n `right` - align to the right" - }, - "gitlens.statusBar.command": { - "type": "string", - "default": "gitlens.showQuickCommitDetails", - "enum": [ - "gitlens.toggleFileBlame", - "gitlens.showBlameHistory", - "gitlens.showFileHistory", - "gitlens.diffWithPrevious", - "gitlens.diffWithWorking", - "gitlens.toggleCodeLens", - "gitlens.showQuickCommitDetails", - "gitlens.showQuickCommitFileDetails", - "gitlens.showQuickFileHistory", - "gitlens.showQuickRepoHistory" - ], - "description": "Specifies the command to be executed when the blame status bar item is clicked\n `gitlens.toggleFileBlame` - toggles file blame annotations\n `gitlens.showBlameHistory` - opens the blame history explorer\n `gitlens.showFileHistory` - opens the file history explorer\n `gitlens.diffWithPrevious` - compares the current line commit with the previous\n `gitlens.diffWithWorking` - compares the current line commit with the working tree\n `gitlens.toggleCodeLens` - toggles Git code lens\n `gitlens.showQuickCommitDetails` - shows a commit details quick pick\n `gitlens.showQuickCommitFileDetails` - shows a commit file details quick pick\n `gitlens.showQuickFileHistory` - shows a file history quick pick\n `gitlens.showQuickRepoHistory` - shows a branch history quick pick" - }, - "gitlens.statusBar.format": { - "type": "string", - "default": "${authorAgo}", - "description": "Specifies the format of the status bar blame information\nAvailable tokens\n ${id} - commit id\n ${author} - commit author\n ${message} - commit message\n ${ago} - relative commit date (e.g. 1 day ago)\n ${date} - formatted commit date (format specified by `gitlens.statusBar.dateFormat`)\n ${authorAgo} - commit author, relative commit date\nSee https://github.com/eamodio/vscode-gitlens/wiki/Advanced-Formatting for advanced formatting" - }, - "gitlens.statusBar.dateFormat": { - "type": "string", - "default": null, - "description": "Specifies the date format of absolute dates shown in the blame information on the status bar. See https://momentjs.com/docs/#/displaying/format/ for valid formats" - }, - "gitlens.strings.codeLens.unsavedChanges.recentChangeAndAuthors": { - "type": "string", - "default": "Cannot determine recent change or authors (unsaved changes)", - "description": "Specifies the string to be shown in place of both the `recent change` and `authors` code lens when there are unsaved changes" - }, - "gitlens.strings.codeLens.unsavedChanges.recentChangeOnly": { - "type": "string", - "default": "Cannot determine recent change (unsaved changes)", - "description": "Specifies the string to be shown in place of the `recent change` code lens when there are unsaved changes" - }, - "gitlens.strings.codeLens.unsavedChanges.authorsOnly": { - "type": "string", - "default": "Cannot determine authors (unsaved changes)", - "description": "Specifies the string to be shown in place of the `authors` code lens when there are unsaved changes" - }, - "gitlens.theme.annotations.file.gutter.separateLines": { - "type": "boolean", - "default": true, - "description": "Specifies whether or not gutter blame annotations will be separated by a small gap" - }, - "gitlens.theme.annotations.file.gutter.dark.backgroundColor": { - "type": "string", - "default": "rgba(255, 255, 255, 0.075)", - "description": "Specifies the dark theme background color of the gutter blame annotations. Must be a valid css color" - }, - "gitlens.theme.annotations.file.gutter.light.backgroundColor": { - "type": "string", - "default": "rgba(0, 0, 0, 0.05)", - "description": "Specifies the light theme background color of the gutter blame annotations. Must be a valid css color" - }, - "gitlens.theme.annotations.file.gutter.dark.foregroundColor": { - "type": "string", - "default": "rgb(190, 190, 190)", - "description": "Specifies the dark theme foreground color of the gutter blame annotations. Must be a valid css color" - }, - "gitlens.theme.annotations.file.gutter.light.foregroundColor": { - "type": "string", - "default": "rgb(116, 116, 116)", - "description": "Specifies the light theme foreground color of the gutter blame annotations. Must be a valid css color" - }, - "gitlens.theme.annotations.file.gutter.dark.uncommittedForegroundColor": { - "type": "string", - "default": "rgba(0, 188, 242, 0.6)", - "description": "Specifies the dark theme foreground color of an uncommitted line in the gutter blame annotations. Must be a valid css color" - }, - "gitlens.theme.annotations.file.gutter.light.uncommittedForegroundColor": { - "type": "string", - "default": "rgba(0, 188, 242, 0.6)", - "description": "Specifies the light theme foreground color of an uncommitted line in the gutter blame annotations. Must be a valid css color" - }, - "gitlens.theme.annotations.file.hover.separateLines": { - "type": "boolean", - "default": false, - "description": "Specifies whether or not hover blame annotations will be separated by a small gap (if heatmap is enabled)" - }, - "gitlens.theme.annotations.line.trailing.dark.backgroundColor": { - "type": "string", - "default": null, - "description": "Specifies the dark theme background color of the trailing blame annotation. Must be a valid css color" - }, - "gitlens.theme.annotations.line.trailing.light.backgroundColor": { - "type": "string", - "default": null, - "description": "Specifies the light theme background color of the trailing blame annotation. Must be a valid css color" - }, - "gitlens.theme.annotations.line.trailing.dark.foregroundColor": { - "type": "string", - "default": "rgba(153, 153, 153, 0.35)", - "description": "Specifies the dark theme foreground color of the trailing blame annotation. Must be a valid css color" - }, - "gitlens.theme.annotations.line.trailing.light.foregroundColor": { - "type": "string", - "default": "rgba(153, 153, 153, 0.35)", - "description": "Specifies the light theme foreground color of the trailing blame annotation. Must be a valid css color" - }, - "gitlens.theme.lineHighlight.dark.backgroundColor": { - "type": "string", - "default": "rgba(0, 188, 242, 0.2)", - "description": "Specifies the dark theme background color of the associated line highlights in blame annotations. Must be a valid css color" - }, - "gitlens.theme.lineHighlight.light.backgroundColor": { - "type": "string", - "default": "rgba(0, 188, 242, 0.2)", - "description": "Specifies the light theme background color of the associated line highlights in blame annotations. Must be a valid css color" - }, - "gitlens.theme.lineHighlight.dark.overviewRulerColor": { - "type": "string", - "default": "rgba(0, 188, 242, 0.6)", - "description": "Specifies the dark theme overview ruler color of the associated line highlights in blame annotations. Must be a valid css color" - }, - "gitlens.theme.lineHighlight.light.overviewRulerColor": { - "type": "string", - "default": "rgba(0, 188, 242, 0.6)", - "description": "Specifies the light theme overview ruler color of the associated line highlights in blame annotations. Must be a valid css color" - }, - "gitlens.advanced.caching.enabled": { - "type": "boolean", - "default": true, - "description": "Specifies whether git output will be cached" - }, - "gitlens.advanced.caching.maxLines": { - "type": "number", - "default": 0, - "description": "Specifies the threshold for caching larger documents" - }, - "gitlens.advanced.git": { - "type": "string", - "default": null, - "description": "Specifies the git path to use" - }, - "gitlens.advanced.gitignore.enabled": { - "type": "boolean", - "default": true, - "description": "Specifies whether or not to parse the root .gitignore file for better performance (i.e. avoids blaming excluded files)" - }, - "gitlens.advanced.maxQuickHistory": { - "type": "number", - "default": 200, - "description": "Specifies the maximum number of QuickPick history entries to show" - }, - "gitlens.advanced.menus": { - "type": "object", - "default": { - "editorContext": { - "blame": true, - "copy": true, - "details": true, - "fileDiff": true, - "history": true, - "lineDiff": true, - "remote": true - }, - "editorTitle": { - "blame": true, - "fileDiff": true, - "history": true, - "remote": true, - "status": true - }, - "editorTitleContext": { - "blame": true, - "fileDiff": true, - "history": true, - "remote": true - }, - "explorerContext": { - "fileDiff": true, - "history": true, - "remote": true - } - }, - "description": "Specifies which commands will be added to which menus", - "properties": { - "editorContext": { - "type": "object", - "default": { - "blame": true, - "copy": true, - "details": true, - "fileDiff": true, - "history": true, - "lineDiff": true, - "remote": true - }, - "properties": { - "blame": { - "type": "boolean", - "default": true - }, - "copy": { - "type": "boolean", - "default": true - }, - "details": { - "type": "boolean", - "default": true - }, - "fileDiff": { - "type": "boolean", - "default": true - }, - "history": { - "type": "boolean", - "default": true - }, - "lineDiff": { - "type": "boolean", - "default": true - }, - "remote": { - "type": "boolean", - "default": true - } - } - }, - "editorTitle": { - "type": "object", - "default": { - "blame": true, - "fileDiff": true, - "history": true, - "remote": true, - "status": true - }, - "properties": { - "blame": { - "type": "boolean", - "default": true - }, - "fileDiff": { - "type": "boolean", - "default": true - }, - "history": { - "type": "boolean", - "default": true - }, - "remote": { - "type": "boolean", - "default": true - }, - "status": { - "type": "boolean", - "default": true - } - } - }, - "editorTitleContext": { - "type": "object", - "default": { - "blame": true, - "fileDiff": true, - "history": true, - "remote": true - }, - "properties": { - "blame": { - "type": "boolean", - "default": true - }, - "fileDiff": { - "type": "boolean", - "default": true - }, - "history": { - "type": "boolean", - "default": true - }, - "remote": { - "type": "boolean", - "default": true - } - } - }, - "explorerContext": { - "type": "object", - "default": { - "fileDiff": true, - "history": true, - "remote": true - }, - "properties": { - "fileDiff": { - "type": "boolean", - "default": true - }, - "history": { - "type": "boolean", - "default": true - }, - "remote": { - "type": "boolean", - "default": true - } - } - } - } - }, - "gitlens.advanced.quickPick.closeOnFocusOut": { - "type": "boolean", - "default": true, - "description": "Specifies whether or not to close the QuickPick menu when focus is lost" - }, - "gitlens.advanced.telemetry.enabled": { - "type": "boolean", - "default": true, - "description": "Specifies whether or not to enable GitLens telemetry (even if enabled still abides by the overall `telemetry.enableTelemetry` setting" - }, - "gitlens.advanced.toggleWhitespace.enabled": { - "type": "boolean", - "default": true, - "description": "Specifies whether or not to toggle whitespace off then showing blame annotations (*may* be required by certain fonts/themes)" - } - } - }, - "commands": [ - { - "command": "gitlens.diffDirectory", - "title": "Directory Compare", - "category": "GitLens" - }, - { - "command": "gitlens.diffWithBranch", - "title": "Compare File with...", - "category": "GitLens" - }, - { - "command": "gitlens.diffWithNext", - "title": "Compare File with Next Commit", - "category": "GitLens" - }, - { - "command": "gitlens.diffWithPrevious", - "title": "Compare File with Previous", - "category": "GitLens" - }, - { - "command": "gitlens.diffLineWithPrevious", - "title": "Compare Line Commit with Previous", - "category": "GitLens" - }, - { - "command": "gitlens.diffWithWorking", - "title": "Compare File with Working Tree", - "category": "GitLens" - }, - { - "command": "gitlens.diffLineWithWorking", - "title": "Compare Line Commit with Working Tree", - "category": "GitLens" - }, - { - "command": "gitlens.showFileBlame", - "title": "Show File Blame Annotations", - "category": "GitLens" - }, - { - "command": "gitlens.showLineBlame", - "title": "Show Line Blame Annotations", - "category": "GitLens" - }, - { - "command": "gitlens.toggleFileBlame", - "title": "Toggle File Blame Annotations", - "category": "GitLens", - "icon": { +{ + "name": "gitlens", + "version": "4.1.0-beta.2", + "author": { + "name": "Eric Amodio", + "email": "eamodio@gmail.com" + }, + "publisher": "eamodio", + "engines": { + "vscode": "^1.12.0" + }, + "license": "SEE LICENSE IN LICENSE", + "displayName": "Git Lens \u2014 git blame annotations, code lens, and more", + "description": "Supercharge Visual Studio Code's Git capabilities \u2014 Visualize code authorship at a glance via Git blame annotations and code lens, seamlessly navigate and explore the history of a file or branch, gain valuable insights via powerful comparision commands, and so much more", + "badges": [ + { + "url": "https://badges.gitter.im/vscode-gitlens/Lobby.svg", + "href": "https://gitter.im/vscode-gitlens/Lobby", + "description": "Chat at https://gitter.im/vscode-gitlens/Lobby" + } + ], + "categories": [ + "Other" + ], + "keywords": [ + "git", + "code lens", + "blame", + "history", + "annotation", + "log", + "inline blame", + "compare", + "diff" + ], + "galleryBanner": { + "color": "#56098c", + "theme": "dark" + }, + "icon": "images/gitlens-icon.svg", + "preview": false, + "homepage": "https://github.com/eamodio/vscode-gitlens/blob/master/README.md", + "bugs": { + "url": "https://github.com/eamodio/vscode-gitlens/issues" + }, + "repository": { + "type": "git", + "url": "https://github.com/eamodio/vscode-gitlens.git" + }, + "main": "./out/src/extension", + "contributes": { + "configuration": { + "type": "object", + "title": "GitLens configuration", + "properties": { + "gitlens.debug": { + "type": "boolean", + "default": false, + "description": "Specifies debug mode" + }, + "gitlens.insiders": { + "type": "boolean", + "default": false, + "description": "Specifies whether or not to enable new experimental features (expect there to be issues)" + }, + "gitlens.outputLevel": { + "type": "string", + "default": "silent", + "enum": [ + "silent", + "errors", + "verbose" + ], + "description": "Specifies how much (if any) output will be sent to the GitLens output channel" + }, + "gitlens.annotations.file.gutter.format": { + "type": "string", + "default": "${message|40?} ${ago|14-}", + "description": "Specifies the format of the gutter blame annotations\nAvailable tokens\n ${id} - commit id\n ${author} - commit author\n ${message} - commit message\n ${ago} - relative commit date (e.g. 1 day ago)\n ${date} - formatted commit date (format specified by `gitlens.annotations.file.gutter.dateFormat`)\n ${authorAgo} - commit author, relative commit date\nSee https://github.com/eamodio/vscode-gitlens/wiki/Advanced-Formatting for advanced formatting" + }, + "gitlens.annotations.file.gutter.dateFormat": { + "type": "string", + "default": null, + "description": "Specifies how to format absolute dates (using the `${date}` token) in gutter blame annotations\nSee https://momentjs.com/docs/#/displaying/format/ for valid formats" + }, + "gitlens.annotations.file.gutter.compact": { + "type": "boolean", + "default": true, + "description": "Specifies whether or not to compact (deduplicate) matching adjacent gutter blame annotations" + }, + "gitlens.annotations.file.gutter.heatmap.enabled": { + "type": "boolean", + "default": true, + "description": "Specifies whether or not to provide a heatmap indicator in the gutter blame annotations" + }, + "gitlens.annotations.file.gutter.heatmap.location": { + "type": "string", + "default": "right", + "enum": [ + "left", + "right" + ], + "description": "Specifies where the heatmap indicators will be shown in the gutter blame annotations\n `left` - adds a heatmap indicator on the left edge of the gutter blame annotations\n `right` - adds a heatmap indicator on the right edge of the gutter blame annotations" + }, + "gitlens.annotations.file.gutter.hover.details": { + "type": "boolean", + "default": true, + "description": "Specifies whether or not to provide a commit details hover annotation over the gutter blame annotations" + }, + "gitlens.annotations.file.gutter.hover.wholeLine": { + "type": "boolean", + "default": false, + "description": "Specifies whether or not to trigger hover annotations over the whole line" + }, + "gitlens.annotations.file.hover.heatmap.enabled": { + "type": "boolean", + "default": true, + "description": "Specifies whether or not to provide heatmap indicators on the left edge of each line" + }, + "gitlens.annotations.file.hover.wholeLine": { + "type": "boolean", + "default": true, + "description": "Specifies whether or not to trigger hover annotations over the whole line" + }, + "gitlens.annotations.file.recentChanges.hover.details": { + "type": "boolean", + "default": true, + "description": "Specifies whether or not to provide a commit details hover annotation" + }, + "gitlens.annotations.file.recentChanges.hover.changes": { + "type": "boolean", + "default": true, + "description": "Specifies whether or not to provide a changes (diff) hover annotation" + }, + "gitlens.annotations.file.recentChanges.hover.wholeLine": { + "type": "boolean", + "default": true, + "description": "Specifies whether or not to trigger hover annotations over the whole line" + }, + "gitlens.annotations.line.hover.details": { + "type": "boolean", + "default": true, + "description": "Specifies whether or not to provide a commit details hover annotation for the current line" + }, + "gitlens.annotations.line.hover.changes": { + "type": "boolean", + "default": true, + "description": "Specifies whether or not to provide a changes (diff) hover annotation for the current line" + }, + "gitlens.annotations.line.trailing.format": { + "type": "string", + "default": "${authorAgo} \u2022 ${message}", + "description": "Specifies the format of the trailing blame annotations\nAvailable tokens\n ${id} - commit id\n ${author} - commit author\n ${message} - commit message\n ${ago} - relative commit date (e.g. 1 day ago)\n ${date} - formatted commit date (format specified by `gitlens.annotations.line.trailing.dateFormat`)\n ${authorAgo} - commit author, relative commit date\nSee https://github.com/eamodio/vscode-gitlens/wiki/Advanced-Formatting for advanced formatting" + }, + "gitlens.annotations.line.trailing.dateFormat": { + "type": "string", + "default": null, + "description": "Specifies how to format absolute dates (using the `${date}` token) in trailing blame annotations\nSee https://momentjs.com/docs/#/displaying/format/ for valid formats" + }, + "gitlens.annotations.line.trailing.hover.details": { + "type": "boolean", + "default": true, + "description": "Specifies whether or not to provide a commit details hover annotation over the trailing blame annotations" + }, + "gitlens.annotations.line.trailing.hover.changes": { + "type": "boolean", + "default": true, + "description": "Specifies whether or not to provide a changes (diff) hover annotation over the trailing blame annotations" + }, + "gitlens.annotations.line.trailing.hover.wholeLine": { + "type": "boolean", + "default": false, + "description": "Specifies whether or not to trigger hover annotations over the whole line" + }, + "gitlens.blame.file.annotationType": { + "type": "string", + "default": "gutter", + "enum": [ + "gutter", + "hover" + ], + "description": "Specifies the type of blame annotations that will be shown for the current file\n `gutter` - adds an annotation to the beginning of each line\n `hover` - shows annotations when hovering over each line" + }, + "gitlens.blame.file.lineHighlight.enabled": { + "type": "boolean", + "default": true, + "description": "Specifies whether or not to highlight lines associated with the current line" + }, + "gitlens.blame.file.lineHighlight.locations": { + "type": "array", + "default": [ + "gutter", + "line", + "overviewRuler" + ], + "items": { + "type": "string", + "enum": [ + "gutter", + "line", + "overviewRuler" + ] + }, + "minItems": 1, + "maxItems": 3, + "uniqueItems": true, + "description": "Specifies where the associated line highlights will be shown\n `gutter` - adds a gutter glyph\n `line` - adds a full-line highlight background color\n `overviewRuler` - adds a decoration to the overviewRuler (scroll bar)" + }, + "gitlens.blame.line.enabled": { + "type": "boolean", + "default": true, + "description": "Specifies whether or not to provide a blame annotation for the current line" + }, + "gitlens.blame.line.annotationType": { + "type": "string", + "default": "trailing", + "enum": [ + "trailing", + "hover" + ], + "description": "Specifies the type of blame annotations that will be shown for the current line\n `trailing` - adds an annotation to the end of the current line\n `hover` - shows annotations when hovering over the current line" + }, + "gitlens.recentChanges.file.lineHighlight.locations": { + "type": "array", + "default": [ + "gutter", + "line", + "overviewRuler" + ], + "items": { + "type": "string", + "enum": [ + "gutter", + "line", + "overviewRuler" + ] + }, + "minItems": 1, + "maxItems": 3, + "uniqueItems": true, + "description": "Specifies where the highlights of the recently changed lines will be shown\n `gutter` - adds a gutter glyph\n `line` - adds a full-line highlight background color\n `overviewRuler` - adds a decoration to the overviewRuler (scroll bar)" + }, + "gitlens.codeLens.enabled": { + "type": "boolean", + "default": true, + "description": "Specifies whether or not to provide any Git code lens" + }, + "gitlens.codeLens.recentChange.enabled": { + "type": "boolean", + "default": true, + "description": "Specifies whether or not to show a `recent change` code lens showing the author and date of the most recent commit for the file or code block" + }, + "gitlens.codeLens.recentChange.command": { + "type": "string", + "default": "gitlens.showQuickCommitFileDetails", + "enum": [ + "gitlens.toggleFileBlame", + "gitlens.showBlameHistory", + "gitlens.showFileHistory", + "gitlens.diffWithPrevious", + "gitlens.showQuickCommitDetails", + "gitlens.showQuickCommitFileDetails", + "gitlens.showQuickFileHistory", + "gitlens.showQuickRepoHistory" + ], + "description": "Specifies the command to be executed when the `recent change` code lens is clicked\n `gitlens.toggleFileBlame` - toggles file blame annotations\n `gitlens.showBlameHistory` - opens the blame history explorer\n `gitlens.showFileHistory` - opens the file history explorer\n `gitlens.diffWithPrevious` - compares the current committed file with the previous commit\n `gitlens.showQuickCommitDetails` - shows a commit details quick pick\n `gitlens.showQuickCommitFileDetails` - shows a commit file details quick pick\n `gitlens.showQuickFileHistory` - shows a file history quick pick\n `gitlens.showQuickRepoHistory` - shows a branch history quick pick" + }, + "gitlens.codeLens.authors.enabled": { + "type": "boolean", + "default": true, + "description": "Specifies whether or not to show an `authors` code lens showing number of authors of the file or code block and the most prominent author (if there is more than one)" + }, + "gitlens.codeLens.authors.command": { + "type": "string", + "default": "gitlens.toggleFileBlame", + "enum": [ + "gitlens.toggleFileBlame", + "gitlens.showBlameHistory", + "gitlens.showFileHistory", + "gitlens.diffWithPrevious", + "gitlens.showQuickCommitDetails", + "gitlens.showQuickCommitFileDetails", + "gitlens.showQuickFileHistory", + "gitlens.showQuickRepoHistory" + ], + "description": "Specifies the command to be executed when the `authors` code lens is clicked\n `gitlens.toggleFileBlame` - toggles file blame annotations\n `gitlens.showBlameHistory` - opens the blame history explorer\n `gitlens.showFileHistory` - opens the file history explorer\n `gitlens.diffWithPrevious` - compares the current committed file with the previous commit\n `gitlens.showQuickCommitDetails` - shows a commit details quick pick\n `gitlens.showQuickCommitFileDetails` - shows a commit file details quick pick\n `gitlens.showQuickFileHistory` - shows a file history quick pick\n `gitlens.showQuickRepoHistory` - shows a branch history quick pick" + }, + "gitlens.codeLens.locations": { + "type": "array", + "default": [ + "document", + "containers" + ], + "items": { + "type": "string", + "enum": [ + "document", + "containers", + "blocks", + "custom" + ] + }, + "minItems": 1, + "maxItems": 4, + "uniqueItems": true, + "description": "Specifies where Git code lens will be shown in the document\n `document` - adds code lens at the top of the document\n `containers` - adds code lens at the start of container-like symbols (modules, classes, interfaces, etc)\n `blocks` - adds code lens at the start of block-like symbols (functions, methods, properties, etc) lines\n `custom` - adds code lens at the start of symbols contained in `gitlens.codeLens.locationCustomSymbols`" + }, + "gitlens.codeLens.customLocationSymbols": { + "type": "array", + "items": { + "type": "string" + }, + "uniqueItems": true, + "description": "Specifies the set of document symbols where Git code lens will be shown in the document\nMust be a member of `SymbolKind`" + }, + "gitlens.codeLens.perLanguageLocations": { + "type": "array", + "default": [ + { + "language": "css", + "locations": [ + "document" + ] + }, + { + "language": "html", + "locations": [ + "document" + ] + }, + { + "language": "json", + "locations": [ + "document" + ] + }, + { + "language": "less", + "locations": [ + "document" + ] + }, + { + "language": "scss", + "locations": [ + "document" + ] + }, + { + "language": "vue", + "locations": [ + "document" + ] + } + ], + "items": { + "type": "object", + "required": [ + "language", + "locations" + ], + "properties": { + "language": { + "type": "string", + "description": "Specifies the language to which this code lens override applies" + }, + "locations": { + "type": "array", + "default": [ + "document", + "containers" + ], + "items": { + "type": "string", + "enum": [ + "document", + "containers", + "blocks", + "custom" + ] + }, + "minItems": 1, + "maxItems": 4, + "uniqueItems": true, + "description": "Specifies where Git code lens will be shown in the document for the specified language\n `document` - adds code lens at the top of the document\n `containers` - adds code lens at the start of container-like symbols (modules, classes, interfaces, etc)\n `blocks` - adds code lens at the start of block-like symbols (functions, methods, properties, etc) lines\n `custom` - adds code lens at the start of symbols contained in `customSymbols`" + }, + "customSymbols": { + "type": "array", + "items": { + "type": "string" + }, + "uniqueItems": true, + "description": "Specifies the set of document symbols where Git code lens will be shown in the document for the specified language\nMust be a member of `SymbolKind`" + } + } + }, + "uniqueItems": true, + "description": "Specifies where Git code lens will be shown in the document for the specified languages" + }, + "gitlens.codeLens.debug": { + "type": "boolean", + "default": false, + "description": "Specifies whether or not to show debug information in code lens" + }, + "gitlens.defaultDateFormat": { + "type": "string", + "default": null, + "description": "Specifies how all absolute dates will be formatted by default\nSee https://momentjs.com/docs/#/displaying/format/ for valid formats" + }, + "gitlens.statusBar.enabled": { + "type": "boolean", + "default": true, + "description": "Specifies whether or not to provide blame information on the status bar" + }, + "gitlens.statusBar.alignment": { + "type": "string", + "default": "right", + "enum": [ + "left", + "right" + ], + "description": "Specifies the blame alignment in the status bar\n `left` - align to the left\n `right` - align to the right" + }, + "gitlens.statusBar.command": { + "type": "string", + "default": "gitlens.showQuickCommitDetails", + "enum": [ + "gitlens.toggleFileBlame", + "gitlens.showBlameHistory", + "gitlens.showFileHistory", + "gitlens.diffWithPrevious", + "gitlens.diffWithWorking", + "gitlens.toggleCodeLens", + "gitlens.showQuickCommitDetails", + "gitlens.showQuickCommitFileDetails", + "gitlens.showQuickFileHistory", + "gitlens.showQuickRepoHistory" + ], + "description": "Specifies the command to be executed when the blame status bar item is clicked\n `gitlens.toggleFileBlame` - toggles file blame annotations\n `gitlens.showBlameHistory` - opens the blame history explorer\n `gitlens.showFileHistory` - opens the file history explorer\n `gitlens.diffWithPrevious` - compares the current line commit with the previous\n `gitlens.diffWithWorking` - compares the current line commit with the working tree\n `gitlens.toggleCodeLens` - toggles Git code lens\n `gitlens.showQuickCommitDetails` - shows a commit details quick pick\n `gitlens.showQuickCommitFileDetails` - shows a commit file details quick pick\n `gitlens.showQuickFileHistory` - shows a file history quick pick\n `gitlens.showQuickRepoHistory` - shows a branch history quick pick" + }, + "gitlens.statusBar.format": { + "type": "string", + "default": "${authorAgo}", + "description": "Specifies the format of the status bar blame information\nAvailable tokens\n ${id} - commit id\n ${author} - commit author\n ${message} - commit message\n ${ago} - relative commit date (e.g. 1 day ago)\n ${date} - formatted commit date (format specified by `gitlens.statusBar.dateFormat`)\n ${authorAgo} - commit author, relative commit date\nSee https://github.com/eamodio/vscode-gitlens/wiki/Advanced-Formatting for advanced formatting" + }, + "gitlens.statusBar.dateFormat": { + "type": "string", + "default": null, + "description": "Specifies the date format of absolute dates shown in the blame information on the status bar. See https://momentjs.com/docs/#/displaying/format/ for valid formats" + }, + "gitlens.strings.codeLens.unsavedChanges.recentChangeAndAuthors": { + "type": "string", + "default": "Cannot determine recent change or authors (unsaved changes)", + "description": "Specifies the string to be shown in place of both the `recent change` and `authors` code lens when there are unsaved changes" + }, + "gitlens.strings.codeLens.unsavedChanges.recentChangeOnly": { + "type": "string", + "default": "Cannot determine recent change (unsaved changes)", + "description": "Specifies the string to be shown in place of the `recent change` code lens when there are unsaved changes" + }, + "gitlens.strings.codeLens.unsavedChanges.authorsOnly": { + "type": "string", + "default": "Cannot determine authors (unsaved changes)", + "description": "Specifies the string to be shown in place of the `authors` code lens when there are unsaved changes" + }, + "gitlens.theme.annotations.file.gutter.separateLines": { + "type": "boolean", + "default": true, + "description": "Specifies whether or not gutter blame annotations will be separated by a small gap" + }, + "gitlens.theme.annotations.file.gutter.dark.backgroundColor": { + "type": "string", + "default": "rgba(255, 255, 255, 0.075)", + "description": "Specifies the dark theme background color of the gutter blame annotations. Must be a valid css color" + }, + "gitlens.theme.annotations.file.gutter.light.backgroundColor": { + "type": "string", + "default": "rgba(0, 0, 0, 0.05)", + "description": "Specifies the light theme background color of the gutter blame annotations. Must be a valid css color" + }, + "gitlens.theme.annotations.file.gutter.dark.foregroundColor": { + "type": "string", + "default": "rgb(190, 190, 190)", + "description": "Specifies the dark theme foreground color of the gutter blame annotations. Must be a valid css color" + }, + "gitlens.theme.annotations.file.gutter.light.foregroundColor": { + "type": "string", + "default": "rgb(116, 116, 116)", + "description": "Specifies the light theme foreground color of the gutter blame annotations. Must be a valid css color" + }, + "gitlens.theme.annotations.file.gutter.dark.uncommittedForegroundColor": { + "type": "string", + "default": "rgba(0, 188, 242, 0.6)", + "description": "Specifies the dark theme foreground color of an uncommitted line in the gutter blame annotations. Must be a valid css color" + }, + "gitlens.theme.annotations.file.gutter.light.uncommittedForegroundColor": { + "type": "string", + "default": "rgba(0, 188, 242, 0.6)", + "description": "Specifies the light theme foreground color of an uncommitted line in the gutter blame annotations. Must be a valid css color" + }, + "gitlens.theme.annotations.file.hover.separateLines": { + "type": "boolean", + "default": false, + "description": "Specifies whether or not hover blame annotations will be separated by a small gap (if heatmap is enabled)" + }, + "gitlens.theme.annotations.line.trailing.dark.backgroundColor": { + "type": "string", + "default": null, + "description": "Specifies the dark theme background color of the trailing blame annotation. Must be a valid css color" + }, + "gitlens.theme.annotations.line.trailing.light.backgroundColor": { + "type": "string", + "default": null, + "description": "Specifies the light theme background color of the trailing blame annotation. Must be a valid css color" + }, + "gitlens.theme.annotations.line.trailing.dark.foregroundColor": { + "type": "string", + "default": "rgba(153, 153, 153, 0.35)", + "description": "Specifies the dark theme foreground color of the trailing blame annotation. Must be a valid css color" + }, + "gitlens.theme.annotations.line.trailing.light.foregroundColor": { + "type": "string", + "default": "rgba(153, 153, 153, 0.35)", + "description": "Specifies the light theme foreground color of the trailing blame annotation. Must be a valid css color" + }, + "gitlens.theme.lineHighlight.dark.backgroundColor": { + "type": "string", + "default": "rgba(0, 188, 242, 0.2)", + "description": "Specifies the dark theme background color of the associated line highlights in blame annotations. Must be a valid css color" + }, + "gitlens.theme.lineHighlight.light.backgroundColor": { + "type": "string", + "default": "rgba(0, 188, 242, 0.2)", + "description": "Specifies the light theme background color of the associated line highlights in blame annotations. Must be a valid css color" + }, + "gitlens.theme.lineHighlight.dark.overviewRulerColor": { + "type": "string", + "default": "rgba(0, 188, 242, 0.6)", + "description": "Specifies the dark theme overview ruler color of the associated line highlights in blame annotations. Must be a valid css color" + }, + "gitlens.theme.lineHighlight.light.overviewRulerColor": { + "type": "string", + "default": "rgba(0, 188, 242, 0.6)", + "description": "Specifies the light theme overview ruler color of the associated line highlights in blame annotations. Must be a valid css color" + }, + "gitlens.advanced.caching.enabled": { + "type": "boolean", + "default": true, + "description": "Specifies whether git output will be cached" + }, + "gitlens.advanced.caching.maxLines": { + "type": "number", + "default": 0, + "description": "Specifies the threshold for caching larger documents" + }, + "gitlens.advanced.git": { + "type": "string", + "default": null, + "description": "Specifies the git path to use" + }, + "gitlens.advanced.gitignore.enabled": { + "type": "boolean", + "default": true, + "description": "Specifies whether or not to parse the root .gitignore file for better performance (i.e. avoids blaming excluded files)" + }, + "gitlens.advanced.maxQuickHistory": { + "type": "number", + "default": 200, + "description": "Specifies the maximum number of QuickPick history entries to show" + }, + "gitlens.advanced.menus": { + "type": "object", + "default": { + "editorContext": { + "blame": true, + "copy": true, + "details": true, + "fileDiff": true, + "history": true, + "lineDiff": true, + "remote": true + }, + "editorTitle": { + "blame": true, + "fileDiff": true, + "history": true, + "remote": true, + "status": true + }, + "editorTitleContext": { + "blame": true, + "fileDiff": true, + "history": true, + "remote": true + }, + "explorerContext": { + "fileDiff": true, + "history": true, + "remote": true + } + }, + "description": "Specifies which commands will be added to which menus", + "properties": { + "editorContext": { + "type": "object", + "default": { + "blame": true, + "copy": true, + "details": true, + "fileDiff": true, + "history": true, + "lineDiff": true, + "remote": true + }, + "properties": { + "blame": { + "type": "boolean", + "default": true + }, + "copy": { + "type": "boolean", + "default": true + }, + "details": { + "type": "boolean", + "default": true + }, + "fileDiff": { + "type": "boolean", + "default": true + }, + "history": { + "type": "boolean", + "default": true + }, + "lineDiff": { + "type": "boolean", + "default": true + }, + "remote": { + "type": "boolean", + "default": true + } + } + }, + "editorTitle": { + "type": "object", + "default": { + "blame": true, + "fileDiff": true, + "history": true, + "remote": true, + "status": true + }, + "properties": { + "blame": { + "type": "boolean", + "default": true + }, + "fileDiff": { + "type": "boolean", + "default": true + }, + "history": { + "type": "boolean", + "default": true + }, + "remote": { + "type": "boolean", + "default": true + }, + "status": { + "type": "boolean", + "default": true + } + } + }, + "editorTitleContext": { + "type": "object", + "default": { + "blame": true, + "fileDiff": true, + "history": true, + "remote": true + }, + "properties": { + "blame": { + "type": "boolean", + "default": true + }, + "fileDiff": { + "type": "boolean", + "default": true + }, + "history": { + "type": "boolean", + "default": true + }, + "remote": { + "type": "boolean", + "default": true + } + } + }, + "explorerContext": { + "type": "object", + "default": { + "fileDiff": true, + "history": true, + "remote": true + }, + "properties": { + "fileDiff": { + "type": "boolean", + "default": true + }, + "history": { + "type": "boolean", + "default": true + }, + "remote": { + "type": "boolean", + "default": true + } + } + } + } + }, + "gitlens.advanced.quickPick.closeOnFocusOut": { + "type": "boolean", + "default": true, + "description": "Specifies whether or not to close the QuickPick menu when focus is lost" + }, + "gitlens.advanced.telemetry.enabled": { + "type": "boolean", + "default": true, + "description": "Specifies whether or not to enable GitLens telemetry (even if enabled still abides by the overall `telemetry.enableTelemetry` setting" + }, + "gitlens.advanced.toggleWhitespace.enabled": { + "type": "boolean", + "default": true, + "description": "Specifies whether or not to toggle whitespace off then showing blame annotations (*may* be required by certain fonts/themes)" + } + } + }, + "commands": [ + { + "command": "gitlens.diffDirectory", + "title": "Directory Compare", + "category": "GitLens" + }, + { + "command": "gitlens.diffWithBranch", + "title": "Compare File with...", + "category": "GitLens" + }, + { + "command": "gitlens.diffWithNext", + "title": "Compare File with Next Commit", + "category": "GitLens" + }, + { + "command": "gitlens.diffWithPrevious", + "title": "Compare File with Previous", + "category": "GitLens" + }, + { + "command": "gitlens.diffLineWithPrevious", + "title": "Compare Line Commit with Previous", + "category": "GitLens" + }, + { + "command": "gitlens.diffWithWorking", + "title": "Compare File with Working Tree", + "category": "GitLens" + }, + { + "command": "gitlens.diffLineWithWorking", + "title": "Compare Line Commit with Working Tree", + "category": "GitLens" + }, + { + "command": "gitlens.showFileBlame", + "title": "Show File Blame Annotations", + "category": "GitLens" + }, + { + "command": "gitlens.showLineBlame", + "title": "Show Line Blame Annotations", + "category": "GitLens" + }, + { + "command": "gitlens.toggleFileBlame", + "title": "Toggle File Blame Annotations", + "category": "GitLens", + "icon": { "dark": "images/dark/git-icon.svg", "light": "images/light/git-icon.svg" - } - }, - { - "command": "gitlens.toggleFileRecentChanges", - "title": "Toggle Recent File Changes Annotations", - "category": "GitLens" - }, - { - "command": "gitlens.toggleLineBlame", - "title": "Toggle Line Blame Annotations", - "category": "GitLens" - }, - { - "command": "gitlens.toggleCodeLens", - "title": "Toggle Git Code Lens", - "category": "GitLens" - }, - { - "command": "gitlens.showBlameHistory", - "title": "Open Blame History Explorer", - "category": "GitLens" - }, - { - "command": "gitlens.showCommitSearch", - "title": "Search Commits", - "category": "GitLens" - }, - { - "command": "gitlens.showFileHistory", - "title": "Open File History Explorer", - "category": "GitLens" - }, - { - "command": "gitlens.showLastQuickPick", - "title": "Show Last Opened Quick Pick", - "category": "GitLens" - }, - { - "command": "gitlens.showQuickCommitDetails", - "title": "Show Commit Details", - "category": "GitLens" - }, - { - "command": "gitlens.showQuickCommitFileDetails", - "title": "Show Line Commit Details", - "category": "GitLens" - }, - { - "command": "gitlens.showQuickFileHistory", - "title": "Show File History", - "category": "GitLens" - }, - { - "command": "gitlens.showQuickBranchHistory", - "title": "Show Branch History", - "category": "GitLens" - }, - { - "command": "gitlens.showQuickRepoHistory", - "title": "Show Current Branch History", - "category": "GitLens" - }, - { - "command": "gitlens.showQuickRepoStatus", - "title": "Show Repository Status", - "category": "GitLens" - }, - { - "command": "gitlens.showQuickStashList", - "title": "Show Stashed Changes", - "category": "GitLens" - }, - { - "command": "gitlens.copyShaToClipboard", - "title": "Copy Commit ID to Clipboard", - "category": "GitLens" - }, - { - "command": "gitlens.copyMessageToClipboard", - "title": "Copy Commit Message to Clipboard", - "category": "GitLens" - }, - { - "command": "gitlens.closeUnchangedFiles", - "title": "Close Unchanged Files", - "category": "GitLens" - }, - { - "command": "gitlens.openChangedFiles", - "title": "Open Changed Files", - "category": "GitLens" - }, - { - "command": "gitlens.openBranchInRemote", - "title": "Open Branch in Remote", - "category": "GitLens" - }, - { - "command": "gitlens.openCommitInRemote", - "title": "Open Line Commit in Remote", - "category": "GitLens" - }, - { - "command": "gitlens.openFileInRemote", - "title": "Open File in Remote", - "category": "GitLens" - }, - { - "command": "gitlens.openRepoInRemote", - "title": "Open Repository in Remote", - "category": "GitLens" - }, - { - "command": "gitlens.stashApply", - "title": "Apply Stashed Changes", - "category": "GitLens" - }, - { - "command": "gitlens.stashSave", - "title": "Stash Changes", - "category": "GitLens" - }, - { - "command": "gitlens.resetSuppressedWarnings", - "title": "Reset Suppressed Warnings", - "category": "GitLens" - } - ], - "menus": { - "commandPalette": [ - { - "command": "gitlens.diffDirectory", - "when": "gitlens:enabled" - }, - { - "command": "gitlens.diffWithBranch", - "when": "gitlens:isTracked" - }, - { - "command": "gitlens.diffWithNext", - "when": "gitlens:isTracked" - }, - { - "command": "gitlens.diffWithPrevious", - "when": "gitlens:isTracked" - }, - { - "command": "gitlens.diffLineWithPrevious", - "when": "gitlens:isBlameable" - }, - { - "command": "gitlens.diffWithWorking", - "when": "gitlens:isTracked" - }, - { - "command": "gitlens.diffLineWithWorking", - "when": "gitlens:isBlameable" - }, - { - "command": "gitlens.showFileBlame", - "when": "gitlens:isBlameable" - }, - { - "command": "gitlens.showLineBlame", - "when": "gitlens:isBlameable" - }, - { - "command": "gitlens.toggleFileBlame", - "when": "gitlens:isBlameable" - }, - { - "command": "gitlens.toggleFileRecentChanges", - "when": "gitlens:isTracked" - }, - { - "command": "gitlens.toggleLineBlame", - "when": "gitlens:isBlameable" - }, - { - "command": "gitlens.toggleCodeLens", - "when": "gitlens:isTracked && gitlens:canToggleCodeLens" - }, - { - "command": "gitlens.showBlameHistory", - "when": "gitlens:isBlameable" - }, - { - "command": "gitlens.showFileHistory", - "when": "gitlens:isTracked" - }, - { - "command": "gitlens.showLastQuickPick", - "when": "gitlens:enabled" - }, - { - "command": "gitlens.showQuickCommitDetails", - "when": "gitlens:isBlameable" - }, - { - "command": "gitlens.showQuickCommitFileDetails", - "when": "gitlens:isBlameable" - }, - { - "command": "gitlens.showQuickFileHistory", - "when": "gitlens:isTracked" - }, - { - "command": "gitlens.showQuickBranchHistory", - "when": "gitlens:enabled" - }, - { - "command": "gitlens.showQuickRepoHistory", - "when": "gitlens:enabled" - }, - { - "command": "gitlens.showQuickRepoStatus", - "when": "gitlens:enabled" - }, - { - "command": "gitlens.showQuickStashList", - "when": "gitlens:enabled" - }, - { - "command": "gitlens.copyShaToClipboard", - "when": "gitlens:isBlameable" - }, - { - "command": "gitlens.copyMessageToClipboard", - "when": "gitlens:isBlameable" - }, - { - "command": "gitlens.closeUnchangedFiles", - "when": "gitlens:enabled" - }, - { - "command": "gitlens.openChangedFiles", - "when": "gitlens:enabled" - }, - { - "command": "gitlens.openBranchInRemote", - "when": "gitlens:hasRemotes" - }, - { - "command": "gitlens.openCommitInRemote", - "when": "gitlens:isBlameable && gitlens:hasRemotes" - }, - { - "command": "gitlens.openFileInRemote", - "when": "gitlens:isTracked && gitlens:hasRemotes" - }, - { - "command": "gitlens.openRepoInRemote", - "when": "gitlens:hasRemotes" - }, - { - "command": "gitlens.stashApply", - "when": "gitlens:enabled" - }, - { - "command": "gitlens.stashSave", - "when": "gitlens:enabled" - }, - { - "command": "gitlens.resetSuppressedWarnings", - "when": "gitlens:enabled" - } - ], - "editor/context": [ - { - "command": "gitlens.openFileInRemote", - "when": "editorTextFocus && gitlens:isTracked && gitlens:hasRemotes && config.gitlens.advanced.menus.editorContext.remote", - "group": "navigation@100" - }, - { - "command": "gitlens.diffLineWithPrevious", - "when": "editorTextFocus && gitlens:isBlameable && config.gitlens.advanced.menus.editorContext.lineDiff", - "group": "1_gitlens@1" - }, - { - "command": "gitlens.diffLineWithWorking", - "when": "editorTextFocus && gitlens:isBlameable && config.gitlens.advanced.menus.editorContext.lineDiff", - "group": "1_gitlens@2" - }, - { - "command": "gitlens.showQuickCommitFileDetails", - "when": "editorTextFocus && gitlens:isBlameable && config.gitlens.advanced.menus.editorContext.details", - "group": "1_gitlens@3" - }, - { - "command": "gitlens.diffWithPrevious", - "when": "editorTextFocus && gitlens:isTracked && config.gitlens.advanced.menus.editorContext.fileDiff", - "group": "1_gitlens_1@1" - }, - { - "command": "gitlens.diffWithWorking", - "when": "editorTextFocus && gitlens:isTracked && config.gitlens.advanced.menus.editorContext.fileDiff", - "group": "1_gitlens_1@2" - }, - { - "command": "gitlens.showQuickFileHistory", - "when": "gitlens:isTracked && config.gitlens.advanced.menus.editorContext.history", - "group": "3_gitlens@1" - }, - { - "command": "gitlens.toggleFileBlame", - "when": "editorTextFocus && gitlens:isBlameable && config.gitlens.advanced.menus.editorContext.blame", - "group": "3_gitlens@2" - }, - { - "command": "gitlens.copyShaToClipboard", - "when": "editorTextFocus && gitlens:isBlameable && config.gitlens.advanced.menus.editorContext.copy", - "group": "9_gitlens@1" - }, - { - "command": "gitlens.copyMessageToClipboard", - "when": "editorTextFocus && gitlens:isBlameable && config.gitlens.advanced.menus.editorContext.copy", - "group": "9_gitlens@2" - } - ], - "editor/title": [ - { - "command": "gitlens.toggleFileBlame", - "when": "gitlens:isBlameable && config.gitlens.advanced.menus.editorTitle.blame", - "group": "navigation@100" - }, - { - "command": "gitlens.openFileInRemote", - "when": "gitlens:enabled && config.gitlens.advanced.menus.editorTitleContext.remote", - "group": "1_gitlens" - }, - { - "command": "gitlens.openRepoInRemote", - "when": "gitlens:enabled && config.gitlens.advanced.menus.editorTitleContext.remote", - "group": "1_gitlens" - }, - { - "command": "gitlens.diffWithPrevious", - "when": "editorTextFocus && gitlens:isTracked && config.gitlens.advanced.menus.editorTitle.fileDiff", - "group": "2_gitlens" - }, - { - "command": "gitlens.diffWithWorking", - "when": "editorTextFocus && gitlens:isTracked && config.gitlens.advanced.menus.editorTitle.fileDiff", - "group": "2_gitlens" - }, - { - "command": "gitlens.showQuickFileHistory", - "when": "editorFocus && gitlens:isTracked && config.gitlens.advanced.menus.editorTitle.history", - "group": "2_gitlens_1" - }, - { - "command": "gitlens.showQuickRepoHistory", - "when": "!editorFocus && gitlens:enabled && config.gitlens.advanced.menus.editorTitle.history", - "group": "2_gitlens_1" - }, - { - "command": "gitlens.showQuickRepoStatus", - "when": "gitlens:enabled && config.gitlens.advanced.menus.editorTitle.status", - "group": "2_gitlens_1" - } - ], - "editor/title/context": [ - { - "command": "gitlens.openFileInRemote", - "when": "gitlens:enabled && config.gitlens.advanced.menus.editorTitleContext.remote", - "group": "1_gitlens" - }, - { - "command": "gitlens.diffWithPrevious", - "when": "gitlens:enabled && config.gitlens.advanced.menus.editorTitleContext.fileDiff", - "group": "1_gitlens_1@1" - }, - { - "command": "gitlens.diffWithWorking", - "when": "gitlens:enabled && config.gitlens.advanced.menus.editorTitleContext.fileDiff", - "group": "1_gitlens_1@2" - }, - { - "command": "gitlens.showQuickFileHistory", - "when": "gitlens:enabled && config.gitlens.advanced.menus.editorTitleContext.history", - "group": "1_gitlens_2@1" - }, - { - "command": "gitlens.toggleFileBlame", - "when": "gitlens:enabled && config.gitlens.advanced.menus.editorTitleContext.blame", - "group": "1_gitlens_2@2" - } - ], - "explorer/context": [ - { - "command": "gitlens.openFileInRemote", - "when": "gitlens:enabled && config.gitlens.advanced.menus.explorerContext.remote", - "group": "navigation@100" - }, - { - "command": "gitlens.diffWithPrevious", - "when": "gitlens:enabled && config.gitlens.advanced.menus.explorerContext.fileDiff", - "group": "1_gitlens@1" - }, - { - "command": "gitlens.diffWithWorking", - "when": "gitlens:enabled && config.gitlens.advanced.menus.explorerContext.fileDiff", - "group": "1_gitlens@2" - }, - { - "command": "gitlens.showQuickFileHistory", - "when": "gitlens:enabled && config.gitlens.advanced.menus.explorerContext.history", - "group": "1_gitlens_1@1" - } - ] - }, - "keybindings": [ - { - "command": "gitlens.key.left", - "key": "alt+left", - "when": "gitlens:key:left" - }, - { - "command": "gitlens.key.right", - "key": "alt+right", - "when": "gitlens:key:right" - }, - { - "command": "gitlens.key.,", - "key": "alt+,", - "when": "gitlens:key:," - }, - { - "command": "gitlens.key..", - "key": "alt+.", - "when": "gitlens:key:." - }, - { - "command": "gitlens.toggleFileBlame", - "key": "alt+b", - "mac": "alt+b", - "when": "editorTextFocus && gitlens:isTracked" - }, - { - "command": "gitlens.toggleCodeLens", - "key": "shift+alt+b", - "mac": "shift+alt+b", - "when": "editorTextFocus && gitlens:isTracked && gitlens:canToggleCodeLens" - }, - { - "command": "gitlens.showLastQuickPick", - "key": "alt+-", - "mac": "alt+-", - "when": "gitlens:enabled" - }, - { - "command": "gitlens.showCommitSearch", - "key": "alt+/", - "mac": "alt+/", - "when": "gitlens:enabled" - }, - { - "command": "gitlens.showQuickFileHistory", - "key": "alt+h", - "mac": "alt+h", - "when": "gitlens:enabled" - }, - { - "command": "gitlens.showQuickRepoHistory", - "key": "shift+alt+h", - "mac": "shift+alt+h", - "when": "gitlens:enabled" - }, - { - "command": "gitlens.showQuickRepoStatus", - "key": "alt+s", - "mac": "alt+s", - "when": "gitlens:enabled" - }, - { - "command": "gitlens.showQuickCommitFileDetails", - "key": "alt+c", - "mac": "alt+c", - "when": "editorTextFocus && gitlens:enabled" - }, - { - "command": "gitlens.diffWithNext", - "key": "alt+.", - "mac": "alt+.", - "when": "editorTextFocus && gitlens:isTracked" - }, - { - "command": "gitlens.diffLineWithPrevious", - "key": "shift+alt+,", - "mac": "shift+alt+,", - "when": "editorTextFocus && gitlens:isTracked" - }, - { - "command": "gitlens.diffWithPrevious", - "key": "alt+,", - "mac": "alt+,", - "when": "editorTextFocus && gitlens:isTracked" - }, - { - "command": "gitlens.diffLineWithWorking", - "key": "alt+w", - "mac": "alt+w", - "when": "editorTextFocus && gitlens:isTracked" - }, - { - "command": "gitlens.diffWithWorking", - "key": "shift+alt+w", - "mac": "shift+alt+w", - "when": "editorTextFocus && gitlens:isTracked" - } - ] - }, - "activationEvents": [ - "*" - ], - "scripts": { - "clean": "git clean -xdf", - "compile": "tslint --project tslint.json && tsc -p ./", - "watch": "tsc -watch -p ./", - "lint": "tslint --project tslint.json", - "pack": "git clean -xdf && vsce package", - "postinstall": "node ./node_modules/vscode/bin/install", - "pub": "git clean -xdf && vsce publish", - "reset": "git clean -xdf && npm install", - "vscode:prepublish": "npm install --no-save && npm run compile" - }, - "dependencies": { - "applicationinsights": "0.20.1", - "copy-paste": "1.3.0", - "iconv-lite": "0.4.17", - "ignore": "3.3.3", - "lodash.debounce": "4.0.8", - "lodash.escaperegexp": "4.1.2", - "lodash.isequal": "4.5.0", - "lodash.once": "4.1.1", - "moment": "2.18.1", - "spawn-rx": "2.0.11", - "tmp": "0.0.31" - }, - "devDependencies": { - "@types/copy-paste": "1.1.30", - "@types/iconv-lite": "0.0.1", - "@types/mocha": "2.2.41", - "@types/node": "7.0.29", - "@types/tmp": "0.0.33", - "mocha": "3.4.2", - "tslint": "5.4.3", - "typescript": "2.3.4", - "vscode": "1.1.0" - } -} + } + }, + { + "command": "gitlens.toggleFileRecentChanges", + "title": "Toggle Recent File Changes Annotations", + "category": "GitLens" + }, + { + "command": "gitlens.toggleLineBlame", + "title": "Toggle Line Blame Annotations", + "category": "GitLens" + }, + { + "command": "gitlens.toggleCodeLens", + "title": "Toggle Git Code Lens", + "category": "GitLens" + }, + { + "command": "gitlens.showBlameHistory", + "title": "Open Blame History Explorer", + "category": "GitLens" + }, + { + "command": "gitlens.showCommitSearch", + "title": "Search Commits", + "category": "GitLens" + }, + { + "command": "gitlens.showFileHistory", + "title": "Open File History Explorer", + "category": "GitLens" + }, + { + "command": "gitlens.showLastQuickPick", + "title": "Show Last Opened Quick Pick", + "category": "GitLens" + }, + { + "command": "gitlens.showQuickCommitDetails", + "title": "Show Commit Details", + "category": "GitLens" + }, + { + "command": "gitlens.showQuickCommitFileDetails", + "title": "Show Line Commit Details", + "category": "GitLens" + }, + { + "command": "gitlens.showQuickFileHistory", + "title": "Show File History", + "category": "GitLens" + }, + { + "command": "gitlens.showQuickBranchHistory", + "title": "Show Branch History", + "category": "GitLens" + }, + { + "command": "gitlens.showQuickRepoHistory", + "title": "Show Current Branch History", + "category": "GitLens" + }, + { + "command": "gitlens.showQuickRepoStatus", + "title": "Show Repository Status", + "category": "GitLens" + }, + { + "command": "gitlens.showQuickStashList", + "title": "Show Stashed Changes", + "category": "GitLens" + }, + { + "command": "gitlens.copyShaToClipboard", + "title": "Copy Commit ID to Clipboard", + "category": "GitLens" + }, + { + "command": "gitlens.copyMessageToClipboard", + "title": "Copy Commit Message to Clipboard", + "category": "GitLens" + }, + { + "command": "gitlens.closeUnchangedFiles", + "title": "Close Unchanged Files", + "category": "GitLens" + }, + { + "command": "gitlens.openChangedFiles", + "title": "Open Changed Files", + "category": "GitLens" + }, + { + "command": "gitlens.openBranchInRemote", + "title": "Open Branch in Remote", + "category": "GitLens" + }, + { + "command": "gitlens.openCommitInRemote", + "title": "Open Line Commit in Remote", + "category": "GitLens" + }, + { + "command": "gitlens.openFileInRemote", + "title": "Open File in Remote", + "category": "GitLens" + }, + { + "command": "gitlens.openRepoInRemote", + "title": "Open Repository in Remote", + "category": "GitLens" + }, + { + "command": "gitlens.stashApply", + "title": "Apply Stashed Changes", + "category": "GitLens" + }, + { + "command": "gitlens.stashSave", + "title": "Stash Changes", + "category": "GitLens" + }, + { + "command": "gitlens.resetSuppressedWarnings", + "title": "Reset Suppressed Warnings", + "category": "GitLens" + } + ], + "menus": { + "commandPalette": [ + { + "command": "gitlens.diffDirectory", + "when": "gitlens:enabled" + }, + { + "command": "gitlens.diffWithBranch", + "when": "gitlens:isTracked" + }, + { + "command": "gitlens.diffWithNext", + "when": "gitlens:isTracked" + }, + { + "command": "gitlens.diffWithPrevious", + "when": "gitlens:isTracked" + }, + { + "command": "gitlens.diffLineWithPrevious", + "when": "gitlens:isBlameable" + }, + { + "command": "gitlens.diffWithWorking", + "when": "gitlens:isTracked" + }, + { + "command": "gitlens.diffLineWithWorking", + "when": "gitlens:isBlameable" + }, + { + "command": "gitlens.showFileBlame", + "when": "gitlens:isBlameable" + }, + { + "command": "gitlens.showLineBlame", + "when": "gitlens:isBlameable" + }, + { + "command": "gitlens.toggleFileBlame", + "when": "gitlens:isBlameable" + }, + { + "command": "gitlens.toggleFileRecentChanges", + "when": "gitlens:isTracked" + }, + { + "command": "gitlens.toggleLineBlame", + "when": "gitlens:isBlameable" + }, + { + "command": "gitlens.toggleCodeLens", + "when": "gitlens:isTracked && gitlens:canToggleCodeLens" + }, + { + "command": "gitlens.showBlameHistory", + "when": "gitlens:isBlameable" + }, + { + "command": "gitlens.showFileHistory", + "when": "gitlens:isTracked" + }, + { + "command": "gitlens.showLastQuickPick", + "when": "gitlens:enabled" + }, + { + "command": "gitlens.showQuickCommitDetails", + "when": "gitlens:isBlameable" + }, + { + "command": "gitlens.showQuickCommitFileDetails", + "when": "gitlens:isBlameable" + }, + { + "command": "gitlens.showQuickFileHistory", + "when": "gitlens:isTracked" + }, + { + "command": "gitlens.showQuickBranchHistory", + "when": "gitlens:enabled" + }, + { + "command": "gitlens.showQuickRepoHistory", + "when": "gitlens:enabled" + }, + { + "command": "gitlens.showQuickRepoStatus", + "when": "gitlens:enabled" + }, + { + "command": "gitlens.showQuickStashList", + "when": "gitlens:enabled" + }, + { + "command": "gitlens.copyShaToClipboard", + "when": "gitlens:isBlameable" + }, + { + "command": "gitlens.copyMessageToClipboard", + "when": "gitlens:isBlameable" + }, + { + "command": "gitlens.closeUnchangedFiles", + "when": "gitlens:enabled" + }, + { + "command": "gitlens.openChangedFiles", + "when": "gitlens:enabled" + }, + { + "command": "gitlens.openBranchInRemote", + "when": "gitlens:hasRemotes" + }, + { + "command": "gitlens.openCommitInRemote", + "when": "gitlens:isBlameable && gitlens:hasRemotes" + }, + { + "command": "gitlens.openFileInRemote", + "when": "gitlens:isTracked && gitlens:hasRemotes" + }, + { + "command": "gitlens.openRepoInRemote", + "when": "gitlens:hasRemotes" + }, + { + "command": "gitlens.stashApply", + "when": "gitlens:enabled" + }, + { + "command": "gitlens.stashSave", + "when": "gitlens:enabled" + }, + { + "command": "gitlens.resetSuppressedWarnings", + "when": "gitlens:enabled" + } + ], + "editor/context": [ + { + "command": "gitlens.openFileInRemote", + "when": "editorTextFocus && gitlens:isTracked && gitlens:hasRemotes && config.gitlens.advanced.menus.editorContext.remote", + "group": "navigation@100" + }, + { + "command": "gitlens.diffLineWithPrevious", + "when": "editorTextFocus && gitlens:isBlameable && config.gitlens.advanced.menus.editorContext.lineDiff", + "group": "1_gitlens@1" + }, + { + "command": "gitlens.diffLineWithWorking", + "when": "editorTextFocus && gitlens:isBlameable && config.gitlens.advanced.menus.editorContext.lineDiff", + "group": "1_gitlens@2" + }, + { + "command": "gitlens.showQuickCommitFileDetails", + "when": "editorTextFocus && gitlens:isBlameable && config.gitlens.advanced.menus.editorContext.details", + "group": "1_gitlens@3" + }, + { + "command": "gitlens.diffWithPrevious", + "when": "editorTextFocus && gitlens:isTracked && config.gitlens.advanced.menus.editorContext.fileDiff", + "group": "1_gitlens_1@1" + }, + { + "command": "gitlens.diffWithWorking", + "when": "editorTextFocus && gitlens:isTracked && config.gitlens.advanced.menus.editorContext.fileDiff", + "group": "1_gitlens_1@2" + }, + { + "command": "gitlens.showQuickFileHistory", + "when": "gitlens:isTracked && config.gitlens.advanced.menus.editorContext.history", + "group": "3_gitlens@1" + }, + { + "command": "gitlens.toggleFileBlame", + "when": "editorTextFocus && gitlens:isBlameable && config.gitlens.advanced.menus.editorContext.blame", + "group": "3_gitlens@2" + }, + { + "command": "gitlens.copyShaToClipboard", + "when": "editorTextFocus && gitlens:isBlameable && config.gitlens.advanced.menus.editorContext.copy", + "group": "9_gitlens@1" + }, + { + "command": "gitlens.copyMessageToClipboard", + "when": "editorTextFocus && gitlens:isBlameable && config.gitlens.advanced.menus.editorContext.copy", + "group": "9_gitlens@2" + } + ], + "editor/title": [ + { + "command": "gitlens.toggleFileBlame", + "when": "gitlens:isBlameable && config.gitlens.advanced.menus.editorTitle.blame", + "group": "navigation@100" + }, + { + "command": "gitlens.openFileInRemote", + "when": "gitlens:enabled && config.gitlens.advanced.menus.editorTitleContext.remote", + "group": "1_gitlens" + }, + { + "command": "gitlens.openRepoInRemote", + "when": "gitlens:enabled && config.gitlens.advanced.menus.editorTitleContext.remote", + "group": "1_gitlens" + }, + { + "command": "gitlens.diffWithPrevious", + "when": "editorTextFocus && gitlens:isTracked && config.gitlens.advanced.menus.editorTitle.fileDiff", + "group": "2_gitlens" + }, + { + "command": "gitlens.diffWithWorking", + "when": "editorTextFocus && gitlens:isTracked && config.gitlens.advanced.menus.editorTitle.fileDiff", + "group": "2_gitlens" + }, + { + "command": "gitlens.showQuickFileHistory", + "when": "editorFocus && gitlens:isTracked && config.gitlens.advanced.menus.editorTitle.history", + "group": "2_gitlens_1" + }, + { + "command": "gitlens.showQuickRepoHistory", + "when": "!editorFocus && gitlens:enabled && config.gitlens.advanced.menus.editorTitle.history", + "group": "2_gitlens_1" + }, + { + "command": "gitlens.showQuickRepoStatus", + "when": "gitlens:enabled && config.gitlens.advanced.menus.editorTitle.status", + "group": "2_gitlens_1" + } + ], + "editor/title/context": [ + { + "command": "gitlens.openFileInRemote", + "when": "gitlens:enabled && config.gitlens.advanced.menus.editorTitleContext.remote", + "group": "1_gitlens" + }, + { + "command": "gitlens.diffWithPrevious", + "when": "gitlens:enabled && config.gitlens.advanced.menus.editorTitleContext.fileDiff", + "group": "1_gitlens_1@1" + }, + { + "command": "gitlens.diffWithWorking", + "when": "gitlens:enabled && config.gitlens.advanced.menus.editorTitleContext.fileDiff", + "group": "1_gitlens_1@2" + }, + { + "command": "gitlens.showQuickFileHistory", + "when": "gitlens:enabled && config.gitlens.advanced.menus.editorTitleContext.history", + "group": "1_gitlens_2@1" + }, + { + "command": "gitlens.toggleFileBlame", + "when": "gitlens:enabled && config.gitlens.advanced.menus.editorTitleContext.blame", + "group": "1_gitlens_2@2" + } + ], + "explorer/context": [ + { + "command": "gitlens.openFileInRemote", + "when": "gitlens:enabled && config.gitlens.advanced.menus.explorerContext.remote", + "group": "navigation@100" + }, + { + "command": "gitlens.diffWithPrevious", + "when": "gitlens:enabled && config.gitlens.advanced.menus.explorerContext.fileDiff", + "group": "1_gitlens@1" + }, + { + "command": "gitlens.diffWithWorking", + "when": "gitlens:enabled && config.gitlens.advanced.menus.explorerContext.fileDiff", + "group": "1_gitlens@2" + }, + { + "command": "gitlens.showQuickFileHistory", + "when": "gitlens:enabled && config.gitlens.advanced.menus.explorerContext.history", + "group": "1_gitlens_1@1" + } + ] + }, + "keybindings": [ + { + "command": "gitlens.key.left", + "key": "alt+left", + "when": "gitlens:key:left" + }, + { + "command": "gitlens.key.right", + "key": "alt+right", + "when": "gitlens:key:right" + }, + { + "command": "gitlens.key.,", + "key": "alt+,", + "when": "gitlens:key:," + }, + { + "command": "gitlens.key..", + "key": "alt+.", + "when": "gitlens:key:." + }, + { + "command": "gitlens.key.escape", + "key": "escape", + "when": "gitlens:key:escape" + }, + { + "command": "gitlens.toggleFileBlame", + "key": "alt+b", + "when": "editorTextFocus && gitlens:isTracked" + }, + { + "command": "gitlens.toggleCodeLens", + "key": "shift+alt+b", + "when": "editorTextFocus && gitlens:isTracked && gitlens:canToggleCodeLens" + }, + { + "command": "gitlens.showLastQuickPick", + "key": "alt+-", + "when": "gitlens:enabled" + }, + { + "command": "gitlens.showCommitSearch", + "key": "alt+/", + "when": "gitlens:enabled" + }, + { + "command": "gitlens.showQuickFileHistory", + "key": "alt+h", + "when": "gitlens:enabled" + }, + { + "command": "gitlens.showQuickRepoHistory", + "key": "shift+alt+h", + "when": "gitlens:enabled" + }, + { + "command": "gitlens.showQuickRepoStatus", + "key": "alt+s", + "when": "gitlens:enabled" + }, + { + "command": "gitlens.showQuickCommitFileDetails", + "key": "alt+c", + "when": "editorTextFocus && gitlens:enabled" + }, + { + "command": "gitlens.diffWithNext", + "key": "alt+.", + "when": "editorTextFocus && gitlens:isTracked" + }, + { + "command": "gitlens.diffLineWithPrevious", + "key": "shift+alt+,", + "when": "editorTextFocus && gitlens:isTracked" + }, + { + "command": "gitlens.diffWithPrevious", + "key": "alt+,", + "when": "editorTextFocus && gitlens:isTracked" + }, + { + "command": "gitlens.diffLineWithWorking", + "key": "alt+w", + "when": "editorTextFocus && gitlens:isTracked" + }, + { + "command": "gitlens.diffWithWorking", + "key": "shift+alt+w", + "when": "editorTextFocus && gitlens:isTracked" + } + ] + }, + "activationEvents": [ + "*" + ], + "scripts": { + "clean": "git clean -xdf", + "compile": "tslint --project tslint.json && tsc -p ./", + "watch": "tsc -watch -p ./", + "lint": "tslint --project tslint.json", + "pack": "git clean -xdf && vsce package", + "postinstall": "node ./node_modules/vscode/bin/install", + "pub": "git clean -xdf && vsce publish", + "reset": "git clean -xdf && npm install", + "vscode:prepublish": "npm install --no-save && npm run compile" + }, + "dependencies": { + "applicationinsights": "0.20.1", + "copy-paste": "1.3.0", + "iconv-lite": "0.4.17", + "ignore": "3.3.3", + "lodash.debounce": "4.0.8", + "lodash.escaperegexp": "4.1.2", + "lodash.isequal": "4.5.0", + "lodash.once": "4.1.1", + "moment": "2.18.1", + "spawn-rx": "2.0.11", + "tmp": "0.0.31" + }, + "devDependencies": { + "@types/copy-paste": "1.1.30", + "@types/iconv-lite": "0.0.1", + "@types/mocha": "2.2.41", + "@types/node": "7.0.29", + "@types/tmp": "0.0.33", + "mocha": "3.4.2", + "tslint": "5.4.3", + "typescript": "2.3.4", + "vscode": "1.1.0" + } +} diff --git a/src/annotations/annotationController.ts b/src/annotations/annotationController.ts index 18ebcc2..4558aa4 100644 --- a/src/annotations/annotationController.ts +++ b/src/annotations/annotationController.ts @@ -2,6 +2,7 @@ import { Functions, Objects } from '../system'; import { DecorationRenderOptions, Disposable, Event, EventEmitter, ExtensionContext, OverviewRulerLane, TextDocument, TextDocumentChangeEvent, TextEditor, TextEditorDecorationType, TextEditorViewColumnChangeEvent, window, workspace } from 'vscode'; import { AnnotationProviderBase } from './annotationProvider'; +import { Keyboard, KeyboardScope, KeyCommand, Keys } from '../keyboard'; import { TextDocumentComparer, TextEditorComparer } from '../comparers'; import { ExtensionKey, IConfig, LineHighlightLocations, themeDefaults } from '../configuration'; import { BlameabilityChangeEvent, GitContextTracker, GitService, GitUri } from '../gitService'; @@ -193,13 +194,17 @@ export class AnnotationController extends Disposable { async clear(column: number) { const provider = this._annotationProviders.get(column); - if (!provider) return; + if (provider === undefined) return; this._annotationProviders.delete(column); await provider.dispose(); if (this._annotationProviders.size === 0) { Logger.log(`Remove listener registrations for annotations`); + + this._keyboardScope && this._keyboardScope.dispose(); + this._keyboardScope = undefined; + this._annotationsDisposable && this._annotationsDisposable.dispose(); this._annotationsDisposable = undefined; } @@ -207,17 +212,19 @@ export class AnnotationController extends Disposable { this._onDidToggleAnnotations.fire(); } - getAnnotationType(editor: TextEditor): FileAnnotationType | undefined { + getAnnotationType(editor: TextEditor | undefined): FileAnnotationType | undefined { const provider = this.getProvider(editor); return provider === undefined ? undefined : provider.annotationType; } - getProvider(editor: TextEditor): AnnotationProviderBase | undefined { + getProvider(editor: TextEditor | undefined): AnnotationProviderBase | undefined { if (!editor || !editor.document || !this.git.isEditorBlameable(editor)) return undefined; return this._annotationProviders.get(editor.viewColumn || -1); } + private _keyboardScope: KeyboardScope | undefined = undefined; + async showAnnotations(editor: TextEditor, type: FileAnnotationType, shaOrLine?: string | number): Promise { if (!editor || !editor.document || !this.git.isEditorBlameable(editor)) return false; @@ -227,6 +234,21 @@ export class AnnotationController extends Disposable { return true; } + // Allows pressing escape to exit the annotations + if (this._keyboardScope === undefined) { + this._keyboardScope = await Keyboard.instance.beginScope({ + escape: { + onDidPressKey: (key: Keys) => { + const editor = window.activeTextEditor; + if (editor === undefined) return Promise.resolve(undefined); + + this.clear(editor.viewColumn || -1); + return Promise.resolve(undefined); + } + } as KeyCommand + }); + } + const gitUri = await GitUri.fromUri(editor.document.uri, this.git); let provider: AnnotationProviderBase | undefined = undefined; diff --git a/src/commands.ts b/src/commands.ts index 3b7731e..c18c7e0 100644 --- a/src/commands.ts +++ b/src/commands.ts @@ -1,8 +1,6 @@ 'use strict'; export * from './commands/common'; -export * from './commands/keyboard'; - export * from './commands/closeUnchangedFiles'; export * from './commands/copyMessageToClipboard'; export * from './commands/copyShaToClipboard'; diff --git a/src/commands/common.ts b/src/commands/common.ts index 85a65f1..12698c2 100644 --- a/src/commands/common.ts +++ b/src/commands/common.ts @@ -1,6 +1,5 @@ 'use strict'; import { commands, Disposable, TextDocumentShowOptions, TextEditor, TextEditorEdit, Uri, window, workspace } from 'vscode'; -import { BuiltInCommands } from '../constants'; import { Logger } from '../logger'; import { Telemetry } from '../telemetry'; @@ -87,27 +86,6 @@ export function getCommandUri(uri?: Uri, editor?: TextEditor): Uri | undefined { return editor.document.uri; } -export type CommandContext = 'gitlens:canToggleCodeLens' | - 'gitlens:enabled' | - 'gitlens:hasRemotes' | - 'gitlens:isBlameable' | - 'gitlens:isRepository' | - 'gitlens:isTracked' | - 'gitlens:key'; -export const CommandContext = { - CanToggleCodeLens: 'gitlens:canToggleCodeLens' as CommandContext, - Enabled: 'gitlens:enabled' as CommandContext, - HasRemotes: 'gitlens:hasRemotes' as CommandContext, - IsBlameable: 'gitlens:isBlameable' as CommandContext, - IsRepository: 'gitlens:isRepository' as CommandContext, - IsTracked: 'gitlens:isTracked' as CommandContext, - Key: 'gitlens:key' as CommandContext -}; - -export function setCommandContext(key: CommandContext | string, value: any) { - return commands.executeCommand(BuiltInCommands.SetContext, key, value); -} - export abstract class Command extends Disposable { private _disposable: Disposable; diff --git a/src/constants.ts b/src/constants.ts index 93bf413..ddf2942 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -1,4 +1,5 @@ 'use strict'; +import { commands } from 'vscode'; export const ExtensionId = 'gitlens'; export const ExtensionKey = ExtensionId; @@ -38,6 +39,27 @@ export const BuiltInCommands = { ToggleRenderWhitespace: 'editor.action.toggleRenderWhitespace' as BuiltInCommands }; +export type CommandContext = 'gitlens:canToggleCodeLens' | + 'gitlens:enabled' | + 'gitlens:hasRemotes' | + 'gitlens:isBlameable' | + 'gitlens:isRepository' | + 'gitlens:isTracked' | + 'gitlens:key'; +export const CommandContext = { + CanToggleCodeLens: 'gitlens:canToggleCodeLens' as CommandContext, + Enabled: 'gitlens:enabled' as CommandContext, + HasRemotes: 'gitlens:hasRemotes' as CommandContext, + IsBlameable: 'gitlens:isBlameable' as CommandContext, + IsRepository: 'gitlens:isRepository' as CommandContext, + IsTracked: 'gitlens:isTracked' as CommandContext, + Key: 'gitlens:key' as CommandContext +}; + +export function setCommandContext(key: CommandContext | string, value: any) { + return commands.executeCommand(BuiltInCommands.SetContext, key, value); +} + export type DocumentSchemes = 'file' | 'git' | 'gitlens-git'; export const DocumentSchemes = { File: 'file' as DocumentSchemes, diff --git a/src/extension.ts b/src/extension.ts index b4847bf..74b191f 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -2,7 +2,6 @@ // import { Objects } from './system'; import { ExtensionContext, extensions, languages, window, workspace } from 'vscode'; import { AnnotationController } from './annotations/annotationController'; -import { CommandContext, setCommandContext } from './commands'; import { CloseUnchangedFilesCommand, OpenChangedFilesCommand } from './commands'; import { OpenBranchInRemoteCommand, OpenCommitInRemoteCommand, OpenFileInRemoteCommand, OpenInRemoteCommand, OpenRepoInRemoteCommand } from './commands'; import { CopyMessageToClipboardCommand, CopyShaToClipboardCommand } from './commands'; @@ -16,13 +15,13 @@ import { ShowCommitSearchCommand, ShowQuickCommitDetailsCommand, ShowQuickCommit import { ShowQuickRepoStatusCommand, ShowQuickStashListCommand } from './commands'; import { StashApplyCommand, StashDeleteCommand, StashSaveCommand } from './commands'; import { ToggleCodeLensCommand } from './commands'; -import { Keyboard } from './commands'; import { CodeLensLocations, IConfig, LineHighlightLocations } from './configuration'; -import { ApplicationInsightsKey, ExtensionKey, QualifiedExtensionId, WorkspaceState } from './constants'; +import { ApplicationInsightsKey, CommandContext, ExtensionKey, QualifiedExtensionId, setCommandContext, WorkspaceState } from './constants'; import { CurrentLineController, LineAnnotationType } from './currentLineController'; import { GitContentProvider } from './gitContentProvider'; import { GitRevisionCodeLensProvider } from './gitRevisionCodeLensProvider'; import { GitContextTracker, GitService } from './gitService'; +import { Keyboard } from './keyboard'; import { Logger } from './logger'; import { Messages, SuppressedKeys } from './messages'; import { Telemetry } from './telemetry'; diff --git a/src/git/gitContextTracker.ts b/src/git/gitContextTracker.ts index b4a4bf8..02f57a7 100644 --- a/src/git/gitContextTracker.ts +++ b/src/git/gitContextTracker.ts @@ -1,7 +1,7 @@ 'use strict'; import { Disposable, Event, EventEmitter, TextDocument, TextDocumentChangeEvent, TextEditor, window, workspace } from 'vscode'; -import { CommandContext, setCommandContext } from '../commands'; import { TextDocumentComparer } from '../comparers'; +import { CommandContext, setCommandContext } from '../constants'; import { GitService, GitUri } from '../gitService'; import { Logger } from '../logger'; diff --git a/src/gitService.ts b/src/gitService.ts index 26a6515..0897179 100644 --- a/src/gitService.ts +++ b/src/gitService.ts @@ -1,9 +1,8 @@ 'use strict'; import { Iterables, Objects } from './system'; import { Disposable, Event, EventEmitter, ExtensionContext, FileSystemWatcher, languages, Location, Position, Range, TextDocument, TextDocumentChangeEvent, TextEditor, Uri, workspace } from 'vscode'; -import { CommandContext, setCommandContext } from './commands'; import { IConfig } from './configuration'; -import { DocumentSchemes, ExtensionKey } from './constants'; +import { CommandContext, DocumentSchemes, ExtensionKey, setCommandContext } from './constants'; import { Git, GitAuthor, GitBlame, GitBlameCommit, GitBlameLine, GitBlameLines, GitBlameParser, GitBranch, GitCommit, GitDiff, GitDiffLine, GitDiffParser, GitLog, GitLogCommit, GitLogParser, GitRemote, GitStash, GitStashParser, GitStatus, GitStatusFile, GitStatusParser, IGit, setDefaultEncoding } from './git/git'; import { GitUri, IGitCommitInfo, IGitUriData } from './git/gitUri'; import { GitCodeLensProvider } from './gitCodeLensProvider'; diff --git a/src/commands/keyboard.ts b/src/keyboard.ts similarity index 83% rename from src/commands/keyboard.ts rename to src/keyboard.ts index 16aa820..ecb9bb5 100644 --- a/src/commands/keyboard.ts +++ b/src/keyboard.ts @@ -1,140 +1,143 @@ -'use strict'; -import { commands, Disposable } from 'vscode'; -import { CommandContext, setCommandContext } from './common'; -import { ExtensionKey } from '../constants'; -import { QuickPickItem } from '../quickPicks'; -import { Logger } from '../logger'; - -const keyNoopCommand = Object.create(null) as QuickPickItem; -export { keyNoopCommand as KeyNoopCommand }; - -export declare type Keys = 'left' | 'right' | ',' | '.'; -export const keys: Keys[] = [ - 'left', - 'right', - ',', - '.' -]; - -export declare interface KeyMapping { - [id: string]: (QuickPickItem | (() => Promise) | undefined); -} - -const mappings: KeyMapping[] = []; - -let _instance: Keyboard; - -export class KeyboardScope extends Disposable { - - constructor(private mapping: KeyMapping) { - super(() => this.dispose()); - - for (const key in mapping) { - mapping[key] = mapping[key] || keyNoopCommand; - } - } - - async dispose() { - const index = mappings.indexOf(this.mapping); - Logger.log('KeyboardScope.dispose', mappings.length, index); - if (index === (mappings.length - 1)) { - mappings.pop(); - await this.updateKeyCommandsContext(mappings[mappings.length - 1]); - } - else { - mappings.splice(index, 1); - } - } - - async begin() { - mappings.push(this.mapping); - await this.updateKeyCommandsContext(this.mapping); - return this; - } - - async clearKeyCommand(key: Keys) { - const mapping = mappings[mappings.length - 1]; - if (mapping !== this.mapping || !mapping[key]) return; - - Logger.log('KeyboardScope.clearKeyCommand', mappings.length, key); - mapping[key] = undefined; - await setCommandContext(`${CommandContext.Key}:${key}`, false); - } - - async setKeyCommand(key: Keys, command: QuickPickItem | (() => Promise)) { - const mapping = mappings[mappings.length - 1]; - if (mapping !== this.mapping) return; - - Logger.log('KeyboardScope.setKeyCommand', mappings.length, key, !!mapping[key]); - - if (!mapping[key]) { - mapping[key] = command; - await setCommandContext(`${CommandContext.Key}:${key}`, true); - } - else { - mapping[key] = command; - } - } - - private async updateKeyCommandsContext(mapping: KeyMapping) { - const promises = []; - for (const key of keys) { - promises.push(setCommandContext(`${CommandContext.Key}:${key}`, !!(mapping && mapping[key]))); - } - await Promise.all(promises); - } -} - -export class Keyboard extends Disposable { - - static get instance(): Keyboard { - return _instance; - } - - private _disposable: Disposable; - - constructor() { - super(() => this.dispose()); - - const subscriptions: Disposable[] = []; - - for (const key of keys) { - subscriptions.push(commands.registerCommand(`${ExtensionKey}.key.${key}`, () => this.execute(key), this)); - } - - this._disposable = Disposable.from(...subscriptions); - - _instance = this; - } - - dispose() { - this._disposable && this._disposable.dispose(); - } - - async beginScope(mapping?: KeyMapping): Promise { - Logger.log('Keyboard.beginScope', mappings.length); - return await new KeyboardScope(mapping ? Object.assign(Object.create(null), mapping) : Object.create(null)).begin(); - } - - async execute(key: Keys): Promise<{} | undefined> { - if (!mappings.length) return undefined; - - try { - const mapping = mappings[mappings.length - 1]; - - let command = mapping[key] as QuickPickItem | (() => Promise); - if (typeof command === 'function') { - command = await command(); - } - if (!command || typeof command.onDidPressKey !== 'function') return undefined; - - Logger.log('Keyboard.execute', key); - - return await command.onDidPressKey(key); - } - catch (ex) { - Logger.error(ex, 'Keyboard.execute'); - return undefined; - } - } +'use strict'; +import { commands, Disposable } from 'vscode'; +import { CommandContext, ExtensionKey, setCommandContext } from './constants'; +import { Logger } from './logger'; + +export declare interface KeyCommand { + onDidPressKey?(key: Keys): Promise<{} | undefined>; +} + +const keyNoopCommand = Object.create(null) as KeyCommand; +export { keyNoopCommand as KeyNoopCommand }; + +export declare type Keys = 'left' | 'right' | ',' | '.' | 'escape'; +export const keys: Keys[] = [ + 'left', + 'right', + ',', + '.', + 'escape' +]; + +export declare interface KeyMapping { + [id: string]: (KeyCommand | (() => Promise) | undefined); +} + +const mappings: KeyMapping[] = []; + +let _instance: Keyboard; + +export class KeyboardScope extends Disposable { + + constructor(private mapping: KeyMapping) { + super(() => this.dispose()); + + for (const key in mapping) { + mapping[key] = mapping[key] || keyNoopCommand; + } + } + + async dispose() { + const index = mappings.indexOf(this.mapping); + Logger.log('KeyboardScope.dispose', mappings.length, index); + if (index === (mappings.length - 1)) { + mappings.pop(); + await this.updateKeyCommandsContext(mappings[mappings.length - 1]); + } + else { + mappings.splice(index, 1); + } + } + + async begin() { + mappings.push(this.mapping); + await this.updateKeyCommandsContext(this.mapping); + return this; + } + + async clearKeyCommand(key: Keys) { + const mapping = mappings[mappings.length - 1]; + if (mapping !== this.mapping || !mapping[key]) return; + + Logger.log('KeyboardScope.clearKeyCommand', mappings.length, key); + mapping[key] = undefined; + await setCommandContext(`${CommandContext.Key}:${key}`, false); + } + + async setKeyCommand(key: Keys, command: KeyCommand | (() => Promise)) { + const mapping = mappings[mappings.length - 1]; + if (mapping !== this.mapping) return; + + Logger.log('KeyboardScope.setKeyCommand', mappings.length, key, !!mapping[key]); + + if (!mapping[key]) { + mapping[key] = command; + await setCommandContext(`${CommandContext.Key}:${key}`, true); + } + else { + mapping[key] = command; + } + } + + private async updateKeyCommandsContext(mapping: KeyMapping) { + const promises = []; + for (const key of keys) { + promises.push(setCommandContext(`${CommandContext.Key}:${key}`, !!(mapping && mapping[key]))); + } + await Promise.all(promises); + } +} + +export class Keyboard extends Disposable { + + static get instance(): Keyboard { + return _instance; + } + + private _disposable: Disposable; + + constructor() { + super(() => this.dispose()); + + const subscriptions: Disposable[] = []; + + for (const key of keys) { + subscriptions.push(commands.registerCommand(`${ExtensionKey}.key.${key}`, () => this.execute(key), this)); + } + + this._disposable = Disposable.from(...subscriptions); + + _instance = this; + } + + dispose() { + this._disposable && this._disposable.dispose(); + } + + async beginScope(mapping?: KeyMapping): Promise { + Logger.log('Keyboard.beginScope', mappings.length); + return await new KeyboardScope(mapping ? Object.assign(Object.create(null), mapping) : Object.create(null)).begin(); + } + + async execute(key: Keys): Promise<{} | undefined> { + if (!mappings.length) return undefined; + + try { + const mapping = mappings[mappings.length - 1]; + + let command = mapping[key] as KeyCommand | (() => Promise); + if (typeof command === 'function') { + command = await command(); + } + if (!command || typeof command.onDidPressKey !== 'function') return undefined; + + Logger.log('Keyboard.execute', key); + + return await command.onDidPressKey(key); + } + catch (ex) { + Logger.error(ex, 'Keyboard.execute'); + return undefined; + } + } } \ No newline at end of file diff --git a/src/quickPicks/branchHistory.ts b/src/quickPicks/branchHistory.ts index 687e389..a82d068 100644 --- a/src/quickPicks/branchHistory.ts +++ b/src/quickPicks/branchHistory.ts @@ -1,9 +1,10 @@ 'use strict'; import { Arrays, Iterables } from '../system'; import { CancellationTokenSource, QuickPickOptions, Uri, window } from 'vscode'; -import { Commands, Keyboard, KeyNoopCommand, ShowCommitSearchCommandArgs, ShowQuickBranchHistoryCommandArgs } from '../commands'; +import { Commands, ShowCommitSearchCommandArgs, ShowQuickBranchHistoryCommandArgs } from '../commands'; import { CommandQuickPickItem, CommitQuickPickItem, getQuickPickIgnoreFocusOut, showQuickPickProgress } from './common'; import { GitLog, GitService, GitUri, RemoteResource } from '../gitService'; +import { Keyboard, KeyNoopCommand } from '../keyboard'; import { OpenRemotesCommandQuickPickItem } from './remotes'; export class BranchHistoryQuickPick { diff --git a/src/quickPicks/commitDetails.ts b/src/quickPicks/commitDetails.ts index c042125..780b32d 100644 --- a/src/quickPicks/commitDetails.ts +++ b/src/quickPicks/commitDetails.ts @@ -1,9 +1,10 @@ 'use strict'; import { Arrays, Iterables } from '../system'; import { commands, QuickPickOptions, TextDocumentShowOptions, Uri, window } from 'vscode'; -import { Commands, CopyMessageToClipboardCommandArgs, CopyShaToClipboardCommandArgs, DiffDirectoryCommandCommandArgs, DiffWithPreviousCommandArgs, Keyboard, KeyNoopCommand, Keys, ShowQuickCommitDetailsCommandArgs, StashApplyCommandArgs, StashDeleteCommandArgs } from '../commands'; +import { Commands, CopyMessageToClipboardCommandArgs, CopyShaToClipboardCommandArgs, DiffDirectoryCommandCommandArgs, DiffWithPreviousCommandArgs, ShowQuickCommitDetailsCommandArgs, StashApplyCommandArgs, StashDeleteCommandArgs } from '../commands'; import { CommandQuickPickItem, getQuickPickIgnoreFocusOut, KeyCommandQuickPickItem, OpenFileCommandQuickPickItem, OpenFilesCommandQuickPickItem, QuickPickItem } from './common'; import { getGitStatusIcon, GitCommit, GitLog, GitLogCommit, GitService, GitStashCommit, GitStatusFile, GitStatusFileStatus, GitUri, IGitCommitInfo, IGitStatusFile, RemoteResource } from '../gitService'; +import { Keyboard, KeyNoopCommand, Keys } from '../keyboard'; import { OpenRemotesCommandQuickPickItem } from './remotes'; import * as moment from 'moment'; import * as path from 'path'; diff --git a/src/quickPicks/commitFileDetails.ts b/src/quickPicks/commitFileDetails.ts index 6e7cc15..47a4310 100644 --- a/src/quickPicks/commitFileDetails.ts +++ b/src/quickPicks/commitFileDetails.ts @@ -1,9 +1,10 @@ 'use strict'; import { Arrays, Iterables } from '../system'; import { QuickPickItem, QuickPickOptions, Uri, window } from 'vscode'; -import { Commands, CopyMessageToClipboardCommandArgs, CopyShaToClipboardCommandArgs, DiffWithPreviousCommandArgs, DiffWithWorkingCommandArgs, Keyboard, KeyNoopCommand, ShowQuickCommitDetailsCommandArgs, ShowQuickCommitFileDetailsCommandArgs, ShowQuickFileHistoryCommandArgs } from '../commands'; +import { Commands, CopyMessageToClipboardCommandArgs, CopyShaToClipboardCommandArgs, DiffWithPreviousCommandArgs, DiffWithWorkingCommandArgs, ShowQuickCommitDetailsCommandArgs, ShowQuickCommitFileDetailsCommandArgs, ShowQuickFileHistoryCommandArgs } from '../commands'; import { CommandQuickPickItem, getQuickPickIgnoreFocusOut, KeyCommandQuickPickItem, OpenFileCommandQuickPickItem } from './common'; import { GitBranch, GitLog, GitLogCommit, GitService, GitUri, RemoteResource } from '../gitService'; +import { Keyboard, KeyNoopCommand } from '../keyboard'; import { OpenRemotesCommandQuickPickItem } from './remotes'; import * as moment from 'moment'; import * as path from 'path'; diff --git a/src/quickPicks/commits.ts b/src/quickPicks/commits.ts index b1593dc..3732eff 100644 --- a/src/quickPicks/commits.ts +++ b/src/quickPicks/commits.ts @@ -1,8 +1,8 @@ 'use strict'; import { Iterables } from '../system'; import { QuickPickOptions, window } from 'vscode'; -import { Keyboard } from '../commands'; import { GitLog, GitService } from '../gitService'; +import { Keyboard } from '../keyboard'; import { CommandQuickPickItem, CommitQuickPickItem, getQuickPickIgnoreFocusOut } from '../quickPicks'; export class CommitsQuickPick { diff --git a/src/quickPicks/common.ts b/src/quickPicks/common.ts index 29ca012..7f63307 100644 --- a/src/quickPicks/common.ts +++ b/src/quickPicks/common.ts @@ -1,8 +1,9 @@ 'use strict'; import { CancellationTokenSource, commands, Disposable, QuickPickItem, QuickPickOptions, TextDocumentShowOptions, TextEditor, Uri, window, workspace } from 'vscode'; -import { Commands, Keyboard, KeyboardScope, KeyMapping, Keys, openEditor } from '../commands'; +import { Commands, openEditor } from '../commands'; import { ExtensionKey, IAdvancedConfig } from '../configuration'; import { GitCommit, GitLogCommit, GitStashCommit } from '../gitService'; +import { Keyboard, KeyboardScope, KeyMapping, Keys } from '../keyboard'; // import { Logger } from '../logger'; import * as moment from 'moment'; diff --git a/src/quickPicks/fileHistory.ts b/src/quickPicks/fileHistory.ts index 0d3a582..d9173ca 100644 --- a/src/quickPicks/fileHistory.ts +++ b/src/quickPicks/fileHistory.ts @@ -1,9 +1,10 @@ 'use strict'; import { Arrays, Iterables } from '../system'; import { CancellationTokenSource, QuickPickOptions, Uri, window } from 'vscode'; -import { Commands, Keyboard, KeyNoopCommand, ShowQuickCurrentBranchHistoryCommandArgs, ShowQuickFileHistoryCommandArgs } from '../commands'; +import { Commands, ShowQuickCurrentBranchHistoryCommandArgs, ShowQuickFileHistoryCommandArgs } from '../commands'; import { CommandQuickPickItem, CommitQuickPickItem, getQuickPickIgnoreFocusOut, showQuickPickProgress } from './common'; import { GitLog, GitService, GitUri, RemoteResource } from '../gitService'; +import { Keyboard, KeyNoopCommand } from '../keyboard'; import { OpenRemotesCommandQuickPickItem } from './remotes'; import * as path from 'path'; diff --git a/src/quickPicks/repoStatus.ts b/src/quickPicks/repoStatus.ts index dd2fc61..417df2b 100644 --- a/src/quickPicks/repoStatus.ts +++ b/src/quickPicks/repoStatus.ts @@ -1,9 +1,10 @@ 'use strict'; import { Iterables } from '../system'; import { commands, QuickPickOptions, TextDocumentShowOptions, Uri, window } from 'vscode'; -import { Commands, DiffWithWorkingCommandArgs, Keyboard, Keys, OpenChangedFilesCommandArgs, ShowQuickBranchHistoryCommandArgs, ShowQuickRepoStatusCommandArgs, ShowQuickStashListCommandArgs } from '../commands'; +import { Commands, DiffWithWorkingCommandArgs, OpenChangedFilesCommandArgs, ShowQuickBranchHistoryCommandArgs, ShowQuickRepoStatusCommandArgs, ShowQuickStashListCommandArgs } from '../commands'; import { CommandQuickPickItem, getQuickPickIgnoreFocusOut, OpenFileCommandQuickPickItem, QuickPickItem } from './common'; import { GitStatus, GitStatusFile, GitUri } from '../gitService'; +import { Keyboard, Keys } from '../keyboard'; import * as path from 'path'; export class OpenStatusFileCommandQuickPickItem extends OpenFileCommandQuickPickItem { diff --git a/src/quickPicks/stashList.ts b/src/quickPicks/stashList.ts index df301ff..6478a0c 100644 --- a/src/quickPicks/stashList.ts +++ b/src/quickPicks/stashList.ts @@ -1,8 +1,9 @@ 'use strict'; import { Iterables } from '../system'; import { QuickPickOptions, window } from 'vscode'; -import { Commands, Keyboard, StashSaveCommandArgs } from '../commands'; +import { Commands, StashSaveCommandArgs } from '../commands'; import { GitService, GitStash } from '../gitService'; +import { Keyboard } from '../keyboard'; import { CommandQuickPickItem, CommitQuickPickItem, getQuickPickIgnoreFocusOut } from '../quickPicks'; export class StashListQuickPick {