diff --git a/CHANGELOG.md b/CHANGELOG.md index 022b0a9..25e8ea2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,12 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/) and this p ## [Unreleased] ### Added - Adds multi-cursor support to current line annotations — closes [#291](https://github.com/eamodio/vscode-gitlens/issues/291) +- Adds support to toggle annotations for each file individually or for all files at once — closes [#289](https://github.com/eamodio/vscode-gitlens/issues/289) + - Adds new controls the interactive settings editor (*Open Settings* from the Command Palette) to configure this new behavior + - Adds `gitlens.blame.toggleMode` setting to specify how the gutter blame annotations will be toggled, per file or window + - Adds `gitlens.heatmap.toggleMode` setting to specify how the gutter heatmap annotations will be toggled, per file or window + - Adds `gitlens.recentChanges.toggleMode` setting to specify how the recently changed lines annotations will be toggled, per file or window + ### Changed - Renames *Compare Selected Ancestor with Working Tree* command to *Compare Ancestry with Working Tree* and removes the need to select a branch first, since all compares are done to the working tree — closes [#279](https://github.com/eamodio/vscode-gitlens/issues/279) diff --git a/README.md b/README.md index 9ab5d99..cb73bbf 100644 --- a/README.md +++ b/README.md @@ -583,6 +583,13 @@ See also [Explorer Settings](#explorer-settings "Jump to the Explorer settings") |`gitlens.blame.highlight.locations`|Specifies where the associated line highlights will be shown
`gutter` - adds a gutter glyph
`line` - adds a full-line highlight background color
`overview` - adds a decoration to the overview ruler (scroll bar) |`gitlens.blame.ignoreWhitespace`|Specifies whether to ignore whitespace when comparing revisions during blame operations |`gitlens.blame.separateLines`|Specifies whether gutter blame annotations will have line separators +|`gitlens.blame.toggleMode`|Specifies how the gutter blame annotations will be toggled
`file` - toggle each file individually
`window` - toggle the window, i.e. all files at once + +### Gutter Heatmap Settings + +|Name | Description +|-----|------------ +|`gitlens.heatmap.toggleMode`|Specifies how the gutter heatmap annotations will be toggled
`file` - toggle each file individually
`window` - toggle the window, i.e. all files at once ### Hover Settings @@ -603,6 +610,7 @@ See also [Explorer Settings](#explorer-settings "Jump to the Explorer settings") |Name | Description |-----|------------ |`gitlens.recentChanges.highlight.locations`|Specifies where the highlights of the recently changed lines will be shown
`gutter` - adds a gutter glyph
`line` - adds a full-line highlight background color
`overview` - adds a decoration to the overview ruler (scroll bar) +|`gitlens.recentChanges.toggleMode`|Specifies how the recently changed lines annotations will be toggled
`file` - toggle each file individually
`window` - toggle the window, i.e. all files at once ### Status Bar Settings diff --git a/package.json b/package.json index ec36841..ec0853a 100644 --- a/package.json +++ b/package.json @@ -129,6 +129,16 @@ "description": "Specifies whether gutter blame annotations will be separated by a small gap", "scope": "window" }, + "gitlens.blame.toggleMode": { + "type": "string", + "default": "file", + "enum": [ + "file", + "window" + ], + "description": "Specifies how the gutter blame annotations will be toggled\n `file` - toggle each file individually\n `window` - toggle the window, i.e. all files at once", + "scope": "window" + }, "gitlens.codeLens.authors.command": { "type": "string", "default": "gitlens.toggleFileBlame", @@ -459,6 +469,16 @@ "description": "Specifies the starting view (mode) of the `GitLens` explorer\n `auto` - shows the last selected view, defaults to `repository`\n `history` - shows the commit history of the active file\n `repository` - shows a repository explorer", "scope": "window" }, + "gitlens.heatmap.toggleMode": { + "type": "string", + "default": "file", + "enum": [ + "file", + "window" + ], + "description": "Specifies how the gutter heatmap annotations will be toggled\n `file` - toggle each file individually\n `window` - toggle the window, i.e. all files at once", + "scope": "window" + }, "gitlens.hovers.annotations.changes": { "type": "boolean", "default": true, @@ -571,6 +591,16 @@ "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 `overview` - adds a decoration to the overview ruler (scroll bar)", "scope": "window" }, + "gitlens.recentChanges.toggleMode": { + "type": "string", + "default": "file", + "enum": [ + "file", + "window" + ], + "description": "Specifies how the recently changed lines annotations will be toggled\n `file` - toggle each file individually\n `window` - toggle the window, i.e. all files at once", + "scope": "window" + }, "gitlens.remotes": { "type": "array", "default": null, @@ -1733,7 +1763,7 @@ }, { "command": "gitlens.clearFileAnnotations", - "when": "gitlens:annotationStatus == computed" + "when": "gitlens:activeIsBlameable && gitlens:annotationStatus == computed" }, { "command": "gitlens.computingFileAnnotations", @@ -2134,12 +2164,12 @@ }, { "command": "gitlens.computingFileAnnotations", - "when": "gitlens:annotationStatus == computing && config.gitlens.advanced.menus.editorTitle.blame", + "when": "gitlens:activeIsBlameable && gitlens:annotationStatus == computing && config.gitlens.advanced.menus.editorTitle.blame", "group": "navigation@100" }, { "command": "gitlens.clearFileAnnotations", - "when": "gitlens:annotationStatus == computed && config.gitlens.advanced.menus.editorTitle.blame", + "when": "gitlens:activeIsBlameable && gitlens:annotationStatus == computed && config.gitlens.advanced.menus.editorTitle.blame", "group": "navigation@100" }, { diff --git a/src/annotations/annotationController.ts b/src/annotations/annotationController.ts index 2ba7655..5c17c8d 100644 --- a/src/annotations/annotationController.ts +++ b/src/annotations/annotationController.ts @@ -2,7 +2,7 @@ import { Functions, Iterables } from '../system'; import { ConfigurationChangeEvent, DecorationRangeBehavior, DecorationRenderOptions, Disposable, Event, EventEmitter, OverviewRulerLane, Progress, ProgressLocation, TextDocument, TextEditor, TextEditorDecorationType, TextEditorViewColumnChangeEvent, ThemeColor, window, workspace } from 'vscode'; import { AnnotationProviderBase, AnnotationStatus, TextEditorCorrelationKey } from './annotationProvider'; -import { configuration, FileAnnotationType, HighlightLocations } from '../configuration'; +import { AnnotationsToggleMode, configuration, FileAnnotationType, HighlightLocations } from '../configuration'; import { CommandContext, isTextEditor, setCommandContext } from '../constants'; import { Container } from '../container'; import { DocumentBlameStateChangeEvent, DocumentDirtyStateChangeEvent, GitDocumentState } from '../trackers/documentTracker'; @@ -46,6 +46,8 @@ export class AnnotationController extends Disposable { private _disposable: Disposable; private _editor: TextEditor | undefined; private _keyboardScope: KeyboardScope | undefined = undefined; + private readonly _toggleModes: Map; + private _annotationType: FileAnnotationType | undefined = undefined; constructor() { super(() => this.dispose()); @@ -53,11 +55,13 @@ export class AnnotationController extends Disposable { this._disposable = Disposable.from( configuration.onDidChange(this.onConfigurationChanged, this) ); + + this._toggleModes = new Map(); this.onConfigurationChanged(configuration.initializingChangeEvent); } dispose() { - this._annotationProviders.forEach(async (p, key) => await this.clearCore(key, AnnotationClearReason.Disposing)); + this.clearAll(); Decorations.blameAnnotation && Decorations.blameAnnotation.dispose(); Decorations.blameHighlight && Decorations.blameHighlight.dispose(); @@ -132,6 +136,27 @@ export class AnnotationController extends Disposable { }); } + if (initializing || configuration.changed(e, configuration.name('blame')('toggleMode').value)) { + this._toggleModes.set(FileAnnotationType.Blame, cfg.blame.toggleMode); + if (!initializing && cfg.blame.toggleMode === AnnotationsToggleMode.File) { + this.clearAll(); + } + } + + if (initializing || configuration.changed(e, configuration.name('heatmap')('toggleMode').value)) { + this._toggleModes.set(FileAnnotationType.Heatmap, cfg.heatmap.toggleMode); + if (!initializing && cfg.heatmap.toggleMode === AnnotationsToggleMode.File) { + this.clearAll(); + } + } + + if (initializing || configuration.changed(e, configuration.name('recentChanges')('toggleMode').value)) { + this._toggleModes.set(FileAnnotationType.RecentChanges, cfg.recentChanges.toggleMode); + if (!initializing && cfg.recentChanges.toggleMode === AnnotationsToggleMode.File) { + this.clearAll(); + } + } + if (initializing) return; if (configuration.changed(e, configuration.name('blame').value) || @@ -154,12 +179,18 @@ export class AnnotationController extends Disposable { } } - private onActiveTextEditorChanged(editor: TextEditor | undefined) { + private async onActiveTextEditorChanged(editor: TextEditor | undefined) { if (editor !== undefined && !isTextEditor(editor)) return; this._editor = editor; // Logger.log('AnnotationController.onActiveTextEditorChanged', editor && editor.document.uri.fsPath); + if (this.isInWindowToggle()) { + await this.showAnnotations(editor, this._annotationType!); + + return; + } + const provider = this.getProvider(editor); if (provider === undefined) { setCommandContext(CommandContext.AnnotationStatus, undefined); @@ -215,7 +246,7 @@ export class AnnotationController extends Disposable { provider.restore(e.textEditor); } - private async onVisibleTextEditorsChanged(editors: TextEditor[]) { + private onVisibleTextEditorsChanged(editors: TextEditor[]) { let provider: AnnotationProviderBase | undefined; for (const e of editors) { provider = this.getProvider(e); @@ -225,8 +256,29 @@ export class AnnotationController extends Disposable { } } - async clear(editor: TextEditor, reason: AnnotationClearReason = AnnotationClearReason.User) { - this.clearCore(AnnotationProviderBase.getCorrelationKey(editor), reason); + isInWindowToggle(): boolean { + return this.getToggleMode(this._annotationType) === AnnotationsToggleMode.Window; + } + + private getToggleMode(annotationType: FileAnnotationType | undefined): AnnotationsToggleMode { + if (annotationType === undefined) return AnnotationsToggleMode.File; + + return this._toggleModes.get(annotationType) || AnnotationsToggleMode.File; + } + + clear(editor: TextEditor, reason: AnnotationClearReason = AnnotationClearReason.User) { + if (this.isInWindowToggle()) { + return this.clearAll(); + } + + return this.clearCore(AnnotationProviderBase.getCorrelationKey(editor), reason); + } + + async clearAll() { + this._annotationType = undefined; + for (const [key] of this._annotationProviders) { + await this.clearCore(key, AnnotationClearReason.Disposing); + } } async getAnnotationType(editor: TextEditor | undefined): Promise { @@ -245,6 +297,26 @@ export class AnnotationController extends Disposable { } async showAnnotations(editor: TextEditor | undefined, type: FileAnnotationType, shaOrLine?: string | number): Promise { + if (this.getToggleMode(type) === AnnotationsToggleMode.Window) { + let first = this._annotationType === undefined; + const reset = !first && this._annotationType !== type; + + this._annotationType = type; + + if (reset) { + await this.clearAll(); + first = true; + } + + if (first) { + for (const e of window.visibleTextEditors) { + if (e === editor) continue; + + this.showAnnotations(e, type); + } + } + } + if (editor === undefined) return false; // || editor.viewColumn === undefined) return false; this._editor = editor; @@ -283,7 +355,13 @@ export class AnnotationController extends Disposable { if (provider === undefined) return this.showAnnotations(editor!, type, shaOrLine); const reopen = provider.annotationType !== type; - await this.clearCore(provider.correlationKey, AnnotationClearReason.User); + + if (this.isInWindowToggle()) { + await this.clearAll(); + } + else { + await this.clearCore(provider.correlationKey, AnnotationClearReason.User); + } if (!reopen) return false; diff --git a/src/annotations/annotations.ts b/src/annotations/annotations.ts index cda71d4..f8e0ca6 100644 --- a/src/annotations/annotations.ts +++ b/src/annotations/annotations.ts @@ -1,5 +1,5 @@ import { Dates, Objects, Strings } from '../system'; -import { DecorationInstanceRenderOptions, DecorationOptions, MarkdownString, ThemableDecorationRenderOptions, ThemeColor, window } from 'vscode'; +import { DecorationInstanceRenderOptions, DecorationOptions, MarkdownString, ThemableDecorationRenderOptions, ThemeColor } from 'vscode'; import { DiffWithCommand, OpenCommitInRemoteCommand, OpenFileRevisionCommand, ShowQuickCommitDetailsCommand, ShowQuickCommitFileDetailsCommand } from '../commands'; import { FileAnnotationType } from './../configuration'; import { GlyphChars } from '../constants'; @@ -41,7 +41,7 @@ export class Annotations { return '#793738'; } - private static getHoverCommandBar(commit: GitCommit, hasRemote: boolean, annotationType?: FileAnnotationType) { + private static getHoverCommandBar(commit: GitCommit, hasRemote: boolean, annotationType?: FileAnnotationType, line: number = 0) { let commandBar = `[\`${GlyphChars.DoubleArrowLeft}\`](${DiffWithCommand.getMarkdownCommandArgs(commit)} "Open Changes") `; if (commit.previousSha !== undefined) { @@ -50,8 +50,6 @@ export class Annotations { } const uri = GitUri.toRevisionUri(commit.previousSha, commit.previousUri.fsPath, commit.repoPath); - const line = window.activeTextEditor!.selection.active.line; - commandBar += `[\`${GlyphChars.SquareWithTopShadow}\`](${OpenFileRevisionCommand.getMarkdownCommandArgs(uri, annotationType || FileAnnotationType.Blame, line)} "Blame Previous Revision") `; } @@ -64,7 +62,7 @@ export class Annotations { return commandBar; } - static getHoverMessage(commit: GitCommit, dateFormat: string | null, hasRemote: boolean, annotationType?: FileAnnotationType): MarkdownString { + static getHoverMessage(commit: GitCommit, dateFormat: string | null, hasRemote: boolean, annotationType?: FileAnnotationType, line: number = 0): MarkdownString { if (dateFormat === null) { dateFormat = 'MMMM Do, YYYY h:mma'; } @@ -73,7 +71,7 @@ export class Annotations { let commandBar = ''; let showCommitDetailsCommand = ''; if (!commit.isUncommitted) { - commandBar = `\n\n${this.getHoverCommandBar(commit, hasRemote, annotationType)}`; + commandBar = `\n\n${this.getHoverCommandBar(commit, hasRemote, annotationType, line)}`; showCommitDetailsCommand = `[\`${commit.shortSha}\`](${ShowQuickCommitDetailsCommand.getMarkdownCommandArgs(commit.sha)} "Show Commit Details")`; message = commit.message @@ -137,7 +135,7 @@ export class Annotations { } as DecorationOptions; } - static detailsHover(commit: GitCommit, dateFormat: string | null, hasRemote: boolean, annotationType?: FileAnnotationType): DecorationOptions { + static detailsHover(commit: GitCommit, dateFormat: string | null, hasRemote: boolean, annotationType?: FileAnnotationType, line: number = 0): DecorationOptions { const message = this.getHoverMessage(commit, dateFormat, hasRemote, annotationType); return { hoverMessage: message diff --git a/src/annotations/blameAnnotationProvider.ts b/src/annotations/blameAnnotationProvider.ts index 79b4bf4..06d828b 100644 --- a/src/annotations/blameAnnotationProvider.ts +++ b/src/annotations/blameAnnotationProvider.ts @@ -121,7 +121,7 @@ export abstract class BlameAnnotationProviderBase extends AnnotationProviderBase } } - const message = Annotations.getHoverMessage(logCommit || commit, Container.config.defaultDateFormat, await Container.git.hasRemote(commit.repoPath), this.annotationType); + const message = Annotations.getHoverMessage(logCommit || commit, Container.config.defaultDateFormat, await Container.git.hasRemote(commit.repoPath), this.annotationType, this.editor.selection.active.line); return new Hover(message, document.validateRange(new Range(position.line, 0, position.line, RangeEndOfLineIndex))); } diff --git a/src/annotations/recentChangesAnnotationProvider.ts b/src/annotations/recentChangesAnnotationProvider.ts index 611d572..22aa342 100644 --- a/src/annotations/recentChangesAnnotationProvider.ts +++ b/src/annotations/recentChangesAnnotationProvider.ts @@ -56,7 +56,7 @@ export class RecentChangesAnnotationProvider extends AnnotationProviderBase { if (cfg.hovers.enabled && cfg.hovers.annotations.enabled) { if (cfg.hovers.annotations.details) { this.decorations.push({ - hoverMessage: Annotations.getHoverMessage(commit, dateFormat, await Container.git.hasRemote(commit.repoPath), this.annotationType), + hoverMessage: Annotations.getHoverMessage(commit, dateFormat, await Container.git.hasRemote(commit.repoPath), this.annotationType, this.editor.selection.active.line), range: range } as DecorationOptions); } diff --git a/src/commands/toggleFileBlame.ts b/src/commands/toggleFileBlame.ts index dff7485..e498d07 100644 --- a/src/commands/toggleFileBlame.ts +++ b/src/commands/toggleFileBlame.ts @@ -1,6 +1,6 @@ 'use strict'; -import { TextEditor, TextEditorEdit, Uri, window } from 'vscode'; -import { Commands, EditorCommand } from './common'; +import { TextEditor, Uri, window } from 'vscode'; +import { ActiveEditorCommand, Commands } from './common'; import { UriComparer } from '../comparers'; import { FileAnnotationType } from '../configuration'; import { Container } from '../container'; @@ -11,20 +11,22 @@ export interface ToggleFileBlameCommandArgs { type?: FileAnnotationType; } -export class ToggleFileBlameCommand extends EditorCommand { +export class ToggleFileBlameCommand extends ActiveEditorCommand { constructor() { super(Commands.ToggleFileBlame); } - async execute(editor: TextEditor, edit: TextEditorEdit, uri?: Uri, args: ToggleFileBlameCommandArgs = {}): Promise { - if (editor === undefined) return undefined; + async execute(editor: TextEditor, uri?: Uri, args: ToggleFileBlameCommandArgs = {}): Promise { + // if (editor === undefined) return undefined; - // Handle the case where we are focused on a non-editor editor (output, debug console) - if (uri !== undefined && !UriComparer.equals(uri, editor.document.uri)) { - const e = window.visibleTextEditors.find(e => UriComparer.equals(uri, e.document.uri)); - if (e !== undefined) { - editor = e; + if (editor !== undefined) { + // Handle the case where we are focused on a non-editor editor (output, debug console) + if (uri !== undefined && !UriComparer.equals(uri, editor.document.uri)) { + const e = window.visibleTextEditors.find(e => UriComparer.equals(uri, e.document.uri)); + if (e !== undefined) { + editor = e; + } } } @@ -33,7 +35,7 @@ export class ToggleFileBlameCommand extends EditorCommand { args = { ...args, type: FileAnnotationType.Blame }; } - return Container.annotations.toggleAnnotations(editor, args.type!, args.sha !== undefined ? args.sha : editor.selection.active.line); + return Container.annotations.toggleAnnotations(editor, args.type!, args.sha !== undefined ? args.sha : editor && editor.selection.active.line); } catch (ex) { Logger.error(ex, 'ToggleFileBlameCommand'); diff --git a/src/commands/toggleFileHeatmap.ts b/src/commands/toggleFileHeatmap.ts index 8082db5..6467889 100644 --- a/src/commands/toggleFileHeatmap.ts +++ b/src/commands/toggleFileHeatmap.ts @@ -1,16 +1,16 @@ 'use strict'; -import { commands, TextEditor, TextEditorEdit, Uri } from 'vscode'; +import { commands, TextEditor, Uri } from 'vscode'; import { ToggleFileBlameCommandArgs } from '../commands'; -import { Commands, EditorCommand } from './common'; +import { ActiveEditorCommand, Commands } from './common'; import { FileAnnotationType } from '../configuration'; -export class ToggleFileHeatmapCommand extends EditorCommand { +export class ToggleFileHeatmapCommand extends ActiveEditorCommand { constructor() { super(Commands.ToggleFileHeatmap); } - async execute(editor: TextEditor, edit: TextEditorEdit, uri?: Uri): Promise { + async execute(editor: TextEditor, uri?: Uri): Promise { commands.executeCommand(Commands.ToggleFileBlame, uri, { type: FileAnnotationType.Heatmap } as ToggleFileBlameCommandArgs); } } \ No newline at end of file diff --git a/src/commands/toggleFileRecentChanges.ts b/src/commands/toggleFileRecentChanges.ts index 415d00a..cc96f89 100644 --- a/src/commands/toggleFileRecentChanges.ts +++ b/src/commands/toggleFileRecentChanges.ts @@ -1,16 +1,16 @@ 'use strict'; -import { commands, TextEditor, TextEditorEdit, Uri } from 'vscode'; +import { commands, TextEditor, Uri } from 'vscode'; import { ToggleFileBlameCommandArgs } from '../commands'; -import { Commands, EditorCommand } from './common'; +import { ActiveEditorCommand, Commands } from './common'; import { FileAnnotationType } from '../configuration'; -export class ToggleFileRecentChangesCommand extends EditorCommand { +export class ToggleFileRecentChangesCommand extends ActiveEditorCommand { constructor() { super(Commands.ToggleFileRecentChanges); } - async execute(editor: TextEditor, edit: TextEditorEdit, uri?: Uri): Promise { + async execute(editor: TextEditor, uri?: Uri): Promise { commands.executeCommand(Commands.ToggleFileBlame, uri, { type: FileAnnotationType.RecentChanges } as ToggleFileBlameCommandArgs); } } \ No newline at end of file diff --git a/src/currentLineController.ts b/src/currentLineController.ts index 2b796ab..46d566c 100644 --- a/src/currentLineController.ts +++ b/src/currentLineController.ts @@ -263,7 +263,7 @@ export class CurrentLineController extends Disposable { const trackedDocument = await Container.tracker.get(document); if (trackedDocument === undefined) return undefined; - const message = Annotations.getHoverMessage(logCommit || commit, Container.config.defaultDateFormat, trackedDocument.hasRemotes, fileAnnotations); + const message = Annotations.getHoverMessage(logCommit || commit, Container.config.defaultDateFormat, trackedDocument.hasRemotes, fileAnnotations, position.line); return new Hover(message, range); } diff --git a/src/ui/config.ts b/src/ui/config.ts index c1df7a9..d57f512 100644 --- a/src/ui/config.ts +++ b/src/ui/config.ts @@ -1,5 +1,10 @@ 'use strict'; +export enum AnnotationsToggleMode { + File = 'file', + Window = 'window' +} + export enum CodeLensCommand { DiffWithPrevious = 'gitlens.diffWithPrevious', ShowQuickCommitDetails = 'gitlens.showQuickCommitDetails', @@ -256,6 +261,7 @@ export interface IConfig { }; ignoreWhitespace: boolean; separateLines: boolean; + toggleMode: AnnotationsToggleMode; }; currentLine: { @@ -275,6 +281,10 @@ export interface IConfig { gitExplorer: IGitExplorerConfig; + heatmap: { + toggleMode: AnnotationsToggleMode; + }; + hovers: { annotations: { changes: boolean; @@ -301,6 +311,7 @@ export interface IConfig { highlight: { locations: HighlightLocations[]; }; + toggleMode: AnnotationsToggleMode; }; remotes: IRemotesConfig[]; diff --git a/src/ui/images/settings/heatmap.png b/src/ui/images/settings/heatmap.png new file mode 100644 index 0000000..2f1cdb1 Binary files /dev/null and b/src/ui/images/settings/heatmap.png differ diff --git a/src/ui/settings/index.html b/src/ui/settings/index.html index 8023402..6a27e6b 100644 --- a/src/ui/settings/index.html +++ b/src/ui/settings/index.html @@ -281,7 +281,7 @@ For more advanced customizations open User Settings and search for gitlens.currentLine Use the - GitLens: Toggle Line Blame Annotations command to override this setting for the current window + GitLens: Toggle Line Blame Annotations command to override this setting for the current window

@@ -298,6 +298,14 @@
+
+ + +
+
@@ -356,6 +364,47 @@ For more advanced customizations open User Settings and search for gitlens.blame + Use the + + + command to turn the annotations on or off + + + Press Esc to turn off the annotations + +

+
+ + +
+
+

Gutter Heatmap + + + +

+

Adds on-demand heatmap to the edge of the gutter to show the relative age of a line

+
+
+
+
+ + +
+
+
+ +
+

+ + Use the + + + command to turn the annotations on or off + Press Esc to turn off the annotations

@@ -476,6 +525,14 @@
+
+ + +
+
@@ -498,7 +555,9 @@

Use the - GitLens: Toggle Recent File Changes Annotations command to turn the annotations on or off + + + command to turn the annotations on or off Press Esc to turn off the annotations @@ -552,7 +611,7 @@ For more advanced customizations open User Settings and search for gitlens.statusBar Use the - GitLens: Toggle Line Blame Annotations command to override this setting for the current window + GitLens: Toggle Line Blame Annotations command to override this setting for the current window

@@ -602,6 +661,7 @@
  • Code Lens
  • Current Line Blame
  • Gutter Blame
  • +
  • Gutter Heatmap
  • Hovers
  • Recent Changes
  • Status Bar Blame