From 111439be295073d6e8406c1ea3d61ad2564609ca Mon Sep 17 00:00:00 2001 From: Richard Ginzburg Date: Fri, 1 Mar 2019 17:31:28 +0100 Subject: [PATCH 1/6] Add small deletions to small delete register --- src/actions/commands/actions.ts | 2 +- src/register/register.ts | 32 +++++++++++++++++++++----------- 2 files changed, 22 insertions(+), 12 deletions(-) diff --git a/src/actions/commands/actions.ts b/src/actions/commands/actions.ts index 9f2b76f9e94..69b2a7d1b3e 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; diff --git a/src/register/register.ts b/src/register/register.ts index 0b257b35f96..6a42a1971f2 100644 --- a/src/register/register.ts +++ b/src/register/register.ts @@ -1,5 +1,9 @@ import { Clipboard } from './../util/clipboard'; -import { CommandRegister, CommandYankFullLine } from './../actions/commands/actions'; +import { + ActionDeleteChar, + CommandRegister, + CommandYankFullLine +} from './../actions/commands/actions'; import { DeleteOperator, YankOperator } from './../actions/operator'; import { RecordedState } from './../state/recordedState'; import { VimState } from './../state/vimState'; @@ -40,6 +44,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 +320,24 @@ export class Register { Register.registers['0'].registerMode = vimState.effectiveRegisterMode; } } else if ( - baseOperator instanceof DeleteOperator && + (baseOperator instanceof DeleteOperator || baseOperator instanceof ActionDeleteChar) && !(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)) { + 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; + } } } From 861efd3bd2b7df9c09eb8023073160d026fe96b5 Mon Sep 17 00:00:00 2001 From: Richard Ginzburg Date: Sat, 2 Mar 2019 17:02:53 +0100 Subject: [PATCH 2/6] Don't store data in small delete register when working linewise --- src/register/register.ts | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/register/register.ts b/src/register/register.ts index 6a42a1971f2..a0231a2e7e5 100644 --- a/src/register/register.ts +++ b/src/register/register.ts @@ -2,7 +2,7 @@ import { Clipboard } from './../util/clipboard'; import { ActionDeleteChar, CommandRegister, - CommandYankFullLine + CommandYankFullLine, } from './../actions/commands/actions'; import { DeleteOperator, YankOperator } from './../actions/operator'; import { RecordedState } from './../state/recordedState'; @@ -323,7 +323,10 @@ export class Register { (baseOperator instanceof DeleteOperator || baseOperator instanceof ActionDeleteChar) && !(vimState.isRecordingMacro || vimState.isReplayingMacro) ) { - if (!content.toString().match(/\n/g)) { + if ( + !content.toString().match(/\n/g) && + vimState.currentRegisterMode !== RegisterMode.LineWise + ) { Register.registers['-'].text = content; Register.registers['-'].registerMode = RegisterMode.CharacterWise; } else { From c7bf1a4d21efaadb35f8dcbb2fb15d2db087400a Mon Sep 17 00:00:00 2001 From: Richard Ginzburg Date: Sat, 2 Mar 2019 17:42:27 +0100 Subject: [PATCH 3/6] Small delete register tests --- test/register/register.test.ts | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/test/register/register.test.ts b/test/register/register.test.ts index 231616f36a2..9606eb56017 100644 --- a/test/register/register.test.ts +++ b/test/register/register.test.ts @@ -255,4 +255,14 @@ suite('register', () => { assert.fail(err); } }); -}); + + test('Small deleteion is stored in small delete register', async () => { + modeHandler.vimState.editor = vscode.window.activeTextEditor!; + + await modeHandler.handleMultipleKeyEvents('itest1\ntest2\ntest3'.split('')); + + await modeHandler.handleMultipleKeyEvents(['', 'g', 'g', '2', 'x', 'j', '"', '-', 'p']); + + assertEqualLines(['st1', 'tteest2', 'test3']); + }); +}); \ No newline at end of file From f8f26b8e2b252d05e7f92ed4265ab6b4903fcfc7 Mon Sep 17 00:00:00 2001 From: Richard Ginzburg Date: Thu, 7 Mar 2019 17:24:36 +0100 Subject: [PATCH 4/6] Store deletions using X and in the small delete register --- src/actions/commands/actions.ts | 4 +-- src/register/register.ts | 7 ++++- test/register/register.test.ts | 45 +++++++++++++++++++++++++++++++-- 3 files changed, 51 insertions(+), 5 deletions(-) diff --git a/src/actions/commands/actions.ts b/src/actions/commands/actions.ts index 69b2a7d1b3e..d3af03a8ce0 100644 --- a/src/actions/commands/actions.ts +++ b/src/actions/commands/actions.ts @@ -3132,7 +3132,7 @@ export 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 a0231a2e7e5..01d1de48f5e 100644 --- a/src/register/register.ts +++ b/src/register/register.ts @@ -1,6 +1,8 @@ import { Clipboard } from './../util/clipboard'; import { ActionDeleteChar, + ActionDeleteCharWithDeleteKey, + ActionDeleteLastChar, CommandRegister, CommandYankFullLine, } from './../actions/commands/actions'; @@ -320,7 +322,10 @@ export class Register { Register.registers['0'].registerMode = vimState.effectiveRegisterMode; } } else if ( - (baseOperator instanceof DeleteOperator || baseOperator instanceof ActionDeleteChar) && + (baseOperator instanceof DeleteOperator || + baseOperator instanceof ActionDeleteChar || + baseOperator instanceof ActionDeleteLastChar || + baseOperator instanceof ActionDeleteCharWithDeleteKey) && !(vimState.isRecordingMacro || vimState.isReplayingMacro) ) { if ( diff --git a/test/register/register.test.ts b/test/register/register.test.ts index 9606eb56017..841b623869a 100644 --- a/test/register/register.test.ts +++ b/test/register/register.test.ts @@ -256,13 +256,54 @@ suite('register', () => { } }); - test('Small deleteion is stored in small delete register', async () => { + test('Small deleteion 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']); }); -}); \ No newline at end of file + + test('Small deleteion 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', '', 'j', '"', '-', 'p']); + + assertEqualLines(['est1', 'ttest2', 'test3']); + }); + + test('Small deleteion 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']); + }); +}); From 43e9e94f9eff6ebe6e5adaf3440448f9354748b9 Mon Sep 17 00:00:00 2001 From: Richard Ginzburg Date: Thu, 7 Mar 2019 22:47:59 +0100 Subject: [PATCH 5/6] Trigger build --- test/register/register.test.ts | 3 --- 1 file changed, 3 deletions(-) diff --git a/test/register/register.test.ts b/test/register/register.test.ts index 841b623869a..17c1c226d28 100644 --- a/test/register/register.test.ts +++ b/test/register/register.test.ts @@ -263,7 +263,6 @@ suite('register', () => { Register.put('', modeHandler.vimState); await modeHandler.handleMultipleKeyEvents('itest1\ntest2\ntest3'.split('')); - await modeHandler.handleMultipleKeyEvents(['', 'g', 'g', '2', 'x', 'j', '"', '-', 'p']); assertEqualLines(['st1', 'tteest2', 'test3']); @@ -276,7 +275,6 @@ suite('register', () => { Register.put('', modeHandler.vimState); await modeHandler.handleMultipleKeyEvents('itest1\ntest2\ntest3'.split('')); - await modeHandler.handleMultipleKeyEvents(['', 'g', 'g', '', 'j', '"', '-', 'p']); assertEqualLines(['est1', 'ttest2', 'test3']); @@ -289,7 +287,6 @@ suite('register', () => { Register.put('', modeHandler.vimState); await modeHandler.handleMultipleKeyEvents('itest1\ntest2\ntest3'.split('')); - await modeHandler.handleMultipleKeyEvents([ '', 'g', From a9e6f48ad95cd59afd64cf824a7bf26f03fb11a7 Mon Sep 17 00:00:00 2001 From: Richard Ginzburg Date: Thu, 7 Mar 2019 22:49:22 +0100 Subject: [PATCH 6/6] Test names fix --- test/register/register.test.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/test/register/register.test.ts b/test/register/register.test.ts index 17c1c226d28..38ba0b64f84 100644 --- a/test/register/register.test.ts +++ b/test/register/register.test.ts @@ -256,7 +256,7 @@ suite('register', () => { } }); - test('Small deleteion using x is stored in small delete register', async () => { + test('Small deletion using x is stored in small delete register', async () => { modeHandler.vimState.editor = vscode.window.activeTextEditor!; modeHandler.vimState.registerName = '-'; @@ -268,7 +268,7 @@ suite('register', () => { assertEqualLines(['st1', 'tteest2', 'test3']); }); - test('Small deleteion using x is stored in small delete register', async () => { + test('Small deletion using Del is stored in small delete register', async () => { modeHandler.vimState.editor = vscode.window.activeTextEditor!; modeHandler.vimState.registerName = '-'; @@ -280,7 +280,7 @@ suite('register', () => { assertEqualLines(['est1', 'ttest2', 'test3']); }); - test('Small deleteion using X is stored in small delete register', async () => { + test('Small deletion using X is stored in small delete register', async () => { modeHandler.vimState.editor = vscode.window.activeTextEditor!; modeHandler.vimState.registerName = '-';