diff --git a/src/actions/commands/actions.ts b/src/actions/commands/actions.ts index 9f2b76f9e94..d3af03a8ce0 100644 --- a/src/actions/commands/actions.ts +++ b/src/actions/commands/actions.ts @@ -3106,7 +3106,7 @@ class CommandTabPrevious extends BaseTabCommand { } @RegisterAction -class ActionDeleteChar extends BaseCommand { +export class ActionDeleteChar extends BaseCommand { modes = [ModeName.Normal]; keys = ['x']; canBeRepeatedWithDot = true; @@ -3132,7 +3132,7 @@ class ActionDeleteChar extends BaseCommand { } @RegisterAction -class ActionDeleteCharWithDeleteKey extends BaseCommand { +export class ActionDeleteCharWithDeleteKey extends BaseCommand { modes = [ModeName.Normal]; keys = ['']; runsOnceForEachCountPrefix = true; @@ -3154,7 +3154,7 @@ class ActionDeleteCharWithDeleteKey extends BaseCommand { } @RegisterAction -class ActionDeleteLastChar extends BaseCommand { +export class ActionDeleteLastChar extends BaseCommand { modes = [ModeName.Normal]; keys = ['X']; canBeRepeatedWithDot = true; diff --git a/src/register/register.ts b/src/register/register.ts index 0b257b35f96..01d1de48f5e 100644 --- a/src/register/register.ts +++ b/src/register/register.ts @@ -1,5 +1,11 @@ import { Clipboard } from './../util/clipboard'; -import { CommandRegister, CommandYankFullLine } from './../actions/commands/actions'; +import { + ActionDeleteChar, + ActionDeleteCharWithDeleteKey, + ActionDeleteLastChar, + CommandRegister, + CommandYankFullLine, +} from './../actions/commands/actions'; import { DeleteOperator, YankOperator } from './../actions/operator'; import { RecordedState } from './../state/recordedState'; import { VimState } from './../state/vimState'; @@ -40,6 +46,7 @@ export class Register { '.': { text: '', registerMode: RegisterMode.CharacterWise, isClipboardRegister: false }, '*': { text: '', registerMode: RegisterMode.CharacterWise, isClipboardRegister: true }, '+': { text: '', registerMode: RegisterMode.CharacterWise, isClipboardRegister: true }, + '-': { text: '', registerMode: RegisterMode.CharacterWise, isClipboardRegister: false }, _: { text: '', registerMode: RegisterMode.CharacterWise, isClipboardRegister: false }, '0': { text: '', registerMode: RegisterMode.CharacterWise, isClipboardRegister: false }, '1': { text: '', registerMode: RegisterMode.CharacterWise, isClipboardRegister: false }, @@ -315,19 +322,30 @@ export class Register { Register.registers['0'].registerMode = vimState.effectiveRegisterMode; } } else if ( - baseOperator instanceof DeleteOperator && + (baseOperator instanceof DeleteOperator || + baseOperator instanceof ActionDeleteChar || + baseOperator instanceof ActionDeleteLastChar || + baseOperator instanceof ActionDeleteCharWithDeleteKey) && !(vimState.isRecordingMacro || vimState.isReplayingMacro) ) { - // shift 'delete-history' register - for (let index = 9; index > 1; index--) { - Register.registers[String(index)].text = Register.registers[String(index - 1)].text; - Register.registers[String(index)].registerMode = - Register.registers[String(index - 1)].registerMode; - } + if ( + !content.toString().match(/\n/g) && + vimState.currentRegisterMode !== RegisterMode.LineWise + ) { + Register.registers['-'].text = content; + Register.registers['-'].registerMode = RegisterMode.CharacterWise; + } else { + // shift 'delete-history' register + for (let index = 9; index > 1; index--) { + Register.registers[String(index)].text = Register.registers[String(index - 1)].text; + Register.registers[String(index)].registerMode = + Register.registers[String(index - 1)].registerMode; + } - // Paste last delete into register '1' - Register.registers['1'].text = content; - Register.registers['1'].registerMode = vimState.effectiveRegisterMode; + // Paste last delete into register '1' + Register.registers['1'].text = content; + Register.registers['1'].registerMode = vimState.effectiveRegisterMode; + } } } diff --git a/test/register/register.test.ts b/test/register/register.test.ts index 231616f36a2..38ba0b64f84 100644 --- a/test/register/register.test.ts +++ b/test/register/register.test.ts @@ -255,4 +255,52 @@ suite('register', () => { assert.fail(err); } }); + + test('Small deletion using x is stored in small delete register', async () => { + modeHandler.vimState.editor = vscode.window.activeTextEditor!; + + modeHandler.vimState.registerName = '-'; + Register.put('', modeHandler.vimState); + + await modeHandler.handleMultipleKeyEvents('itest1\ntest2\ntest3'.split('')); + await modeHandler.handleMultipleKeyEvents(['', 'g', 'g', '2', 'x', 'j', '"', '-', 'p']); + + assertEqualLines(['st1', 'tteest2', 'test3']); + }); + + test('Small deletion using Del is stored in small delete register', async () => { + modeHandler.vimState.editor = vscode.window.activeTextEditor!; + + modeHandler.vimState.registerName = '-'; + Register.put('', modeHandler.vimState); + + await modeHandler.handleMultipleKeyEvents('itest1\ntest2\ntest3'.split('')); + await modeHandler.handleMultipleKeyEvents(['', 'g', 'g', '', 'j', '"', '-', 'p']); + + assertEqualLines(['est1', 'ttest2', 'test3']); + }); + + test('Small deletion using X is stored in small delete register', async () => { + modeHandler.vimState.editor = vscode.window.activeTextEditor!; + + modeHandler.vimState.registerName = '-'; + Register.put('', modeHandler.vimState); + + await modeHandler.handleMultipleKeyEvents('itest1\ntest2\ntest3'.split('')); + await modeHandler.handleMultipleKeyEvents([ + '', + 'g', + 'g', + 'l', + 'l', + '2', + 'X', + 'j', + '"', + '-', + 'p', + ]); + + assertEqualLines(['st1', 'tteest2', 'test3']); + }); });