diff --git a/README.md b/README.md index f26060f1091..3b4be1ff13d 100644 --- a/README.md +++ b/README.md @@ -122,6 +122,8 @@ These settings are specific to VSCodeVim. | vim.substituteGlobalFlag | Similar to Vim's `gdefault` setting. `/g` flag in a substitute command replaces all occurrences in the line. Without this flag, replacement occurs only for the first occurrence in each line. With this setting enabled, the `g` is on by default. | Boolean | false | | vim.useCtrlKeys | Enable Vim ctrl keys overriding common VS Code operations such as copy, paste, find, etc. | Boolean | true | | vim.visualstar | In visual mode, start a search with `*` or `#` using the current selection | Boolean | false | +| vim.yankHighlighting | Enable highlighting when yanking | Boolean | false | +| vim.yankHighlightColor | Set the color of yank highlights | String | rgba(250, 240, 170, 0.5) | ### Neovim Integration diff --git a/package.json b/package.json index 33b144fae91..9a42f3edadb 100644 --- a/package.json +++ b/package.json @@ -379,6 +379,16 @@ "description": "Color of the search highlight.", "default": "rgba(150, 150, 255, 0.3)" }, + "vim.yankHighlighting": { + "type": "boolean", + "description": "Enable highlighting when yanking.", + "default": false + }, + "vim.yankHighlightColor": { + "type": "string", + "description": "Color of the yank highlight.", + "default": "rgba(250, 240, 170, 0.5)" + }, "vim.useSystemClipboard": { "type": "boolean", "description": "Use system clipboard for unnamed register.", diff --git a/src/actions/operator.ts b/src/actions/operator.ts index 2c3de5198ac..ae3421ef29a 100644 --- a/src/actions/operator.ts +++ b/src/actions/operator.ts @@ -3,6 +3,7 @@ import * as vscode from 'vscode'; import { Position, PositionDiff } from './../common/motion/position'; import { Range } from './../common/motion/range'; import { configuration } from './../configuration/configuration'; +import { Decoration } from '../configuration/decoration'; import { ModeName } from './../mode/mode'; import { Register, RegisterMode } from './../register/register'; import { VimState } from './../state/vimState'; @@ -268,7 +269,8 @@ export class YankOperator extends BaseOperator { end = end.getLineEnd(); } - let text = TextEditor.getText(new vscode.Range(start, end)); + const range = new vscode.Range(start, end); + let text = TextEditor.getText(range); // If we selected the newline character, add it as well. if ( @@ -278,6 +280,12 @@ export class YankOperator extends BaseOperator { text = text + '\n'; } + if (configuration.yankHighlighting) { + const decoration = Decoration.YankHighlight; + vimState.editor.setDecorations(decoration, [range]); + setTimeout(() => decoration.dispose(), 200); + } + Register.put(text, vimState, this.multicursorIndex); await vimState.setCurrentMode(ModeName.Normal); @@ -645,12 +653,13 @@ export class YankVisualBlockMode extends BaseOperator { return false; } - public async run(vimState: VimState, start: Position, end: Position): Promise { + public async run(vimState: VimState, startPos: Position, endPos: Position): Promise { let toCopy: string = ''; + const ranges: vscode.Range[] = []; + const isMultiline = startPos.line !== endPos.line; - const isMultiline = start.line !== end.line; - - for (const { line } of Position.IterateLine(vimState)) { + for (const { line, start, end } of Position.IterateLine(vimState)) { + ranges.push(new vscode.Range(start, end)); if (isMultiline) { toCopy += line + '\n'; } else { @@ -658,6 +667,12 @@ export class YankVisualBlockMode extends BaseOperator { } } + if (configuration.yankHighlighting) { + const decoration = Decoration.YankHighlight; + vimState.editor.setDecorations(decoration, ranges); + setTimeout(() => decoration.dispose(), 200); + } + vimState.currentRegisterMode = RegisterMode.BlockWise; Register.put(toCopy, vimState, this.multicursorIndex); @@ -666,7 +681,7 @@ export class YankVisualBlockMode extends BaseOperator { ReportLinesYanked(numLinesYanked, vimState); await vimState.setCurrentMode(ModeName.Normal); - vimState.cursorPosition = start; + vimState.cursorPosition = startPos; return vimState; } } diff --git a/src/configuration/configuration.ts b/src/configuration/configuration.ts index f1836965b28..52d5d9e72e3 100644 --- a/src/configuration/configuration.ts +++ b/src/configuration/configuration.ts @@ -252,6 +252,10 @@ class Configuration implements IConfiguration { searchHighlightColor = 'rgba(150, 150, 255, 0.3)'; + yankHighlighting = false; + + yankHighlightColor = 'rgba(250, 240, 170, 0.5)'; + @overlapSetting({ settingName: 'tabSize', defaultValue: 8 }) tabstop: number; diff --git a/src/configuration/decoration.ts b/src/configuration/decoration.ts index 2546bd1be0b..0ea3f652eb9 100644 --- a/src/configuration/decoration.ts +++ b/src/configuration/decoration.ts @@ -24,4 +24,10 @@ export class Decoration { static readonly EasyMotion = vscode.window.createTextEditorDecorationType({ backgroundColor: configuration.searchHighlightColor, }); + + static get YankHighlight() { + return vscode.window.createTextEditorDecorationType({ + backgroundColor: configuration.yankHighlightColor, + }); + } } diff --git a/src/configuration/iconfiguration.ts b/src/configuration/iconfiguration.ts index 6a17955aeb8..524a6180060 100644 --- a/src/configuration/iconfiguration.ts +++ b/src/configuration/iconfiguration.ts @@ -172,6 +172,16 @@ export interface IConfiguration { */ searchHighlightColor: string; + /** + * Enable highlighting when yanking. + */ + yankHighlighting: boolean; + + /** + * Color of yank highlights. + */ + yankHighlightColor: string; + /** * Size of a tab character. */ diff --git a/test/testConfiguration.ts b/test/testConfiguration.ts index 316049a2136..4efe6ca1b72 100644 --- a/test/testConfiguration.ts +++ b/test/testConfiguration.ts @@ -57,6 +57,8 @@ export class Configuration implements IConfiguration { loggingLevelForConsole: 'debug'; }; searchHighlightColor = 'rgba(150, 150, 255, 0.3)'; + yankHighlighting = false; + yankHighlightColor = 'rgba(250, 240, 170, 0.5)'; tabstop = 2; editorCursorStyle = vscode.TextEditorCursorStyle.Line; expandtab = true;