From 05910257d138eb8c91070416b1dae20063ff0c70 Mon Sep 17 00:00:00 2001 From: Jesse Meade-Clift Date: Tue, 16 Jan 2018 14:25:46 -0700 Subject: [PATCH 1/5] Fix tokenizeKeySequence to allow left shift operator in keysPressed. --- test/testSimplifier.ts | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/test/testSimplifier.ts b/test/testSimplifier.ts index 51126c13e29..853ef444f3f 100644 --- a/test/testSimplifier.ts +++ b/test/testSimplifier.ts @@ -171,11 +171,23 @@ function tokenizeKeySequence(sequence: string): string[] { let key = ''; let result: string[] = []; + // no close bracket, probably trying to do a left shift, take literal + // char sequence + function rawTokenize(): void { + for (const char of key) { + result.push(char); + } + } + for (const char of sequence) { key += char; if (char === '<') { - isBracketedKey = true; + if (isBracketedKey) { + rawTokenize(); + } else { + isBracketedKey = true; + } } if (char === '>') { @@ -190,6 +202,10 @@ function tokenizeKeySequence(sequence: string): string[] { key = ''; } + if (isBracketedKey) { + rawTokenize(); + } + return result; } From 9ccad643c3c2f8fc7cd06b2d641ec8863c606de9 Mon Sep 17 00:00:00 2001 From: Jesse Meade-Clift Date: Tue, 16 Jan 2018 14:26:23 -0700 Subject: [PATCH 2/5] Tests for #2299 and other left and right shift operations. --- test/operator/shift.test.ts | 52 +++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 test/operator/shift.test.ts diff --git a/test/operator/shift.test.ts b/test/operator/shift.test.ts new file mode 100644 index 00000000000..b0fb4d2051f --- /dev/null +++ b/test/operator/shift.test.ts @@ -0,0 +1,52 @@ +import { getAndUpdateModeHandler } from '../../extension'; +import { ModeHandler } from '../../src/mode/modeHandler'; +import { getTestingFunctions } from '../testSimplifier'; +import { cleanUpWorkspace, setupWorkspace } from '../testUtils'; + +suite('shift operator', () => { + let modeHandler: ModeHandler; + + let { newTest, newTestOnly } = getTestingFunctions(); + + setup(async () => { + await setupWorkspace(); + modeHandler = await getAndUpdateModeHandler(); + }); + + teardown(cleanUpWorkspace); + + newTest({ + title: 'basic shift left test', + start: [' |zxcv', ' zxcv', ' zxcv'], + keysPressed: '<<', + end: ['|zxcv', ' zxcv', ' zxcv'], + }); + + newTest({ + title: 'shift left goto end test', + start: [' |zxcv', ' zxcv', ' zxcv'], + keysPressed: 'G', + end: [' |zxcv', ' zxcv', ' zxcv'], + }); + + newTest({ + title: 'shift right goto line test', + start: ['|zxcv', 'zxcv', 'zxcv'], + keysPressed: '>2G', + end: [' |zxcv', ' zxcv', 'zxcv'], + }); +}); From c6dc6db58ba9ad9bf338194d8f7607d40050d5d8 Mon Sep 17 00:00:00 2001 From: Jesse Meade-Clift Date: Tue, 16 Jan 2018 14:26:49 -0700 Subject: [PATCH 3/5] Fix #2299 left shift operator off by one bug --- src/actions/operator.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/actions/operator.ts b/src/actions/operator.ts index 416e8d9237f..8fc5f63b1ca 100644 --- a/src/actions/operator.ts +++ b/src/actions/operator.ts @@ -491,7 +491,7 @@ class OutdentOperator extends BaseOperator { keys = ['<']; public async run(vimState: VimState, start: Position, end: Position): Promise { - vimState.editor.selection = new vscode.Selection(start, end); + vimState.editor.selection = new vscode.Selection(start, end.getLineEnd()); await vscode.commands.executeCommand('editor.action.outdentLines'); vimState.currentMode = ModeName.Normal; From ed329090c1b85410ad7ff63e548e45260a8076b6 Mon Sep 17 00:00:00 2001 From: Jesse Meade-Clift Date: Tue, 16 Jan 2018 22:17:31 -0700 Subject: [PATCH 4/5] Fix tokenizeKeySequence bug introduced by handling left shift. --- test/testSimplifier.ts | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/test/testSimplifier.ts b/test/testSimplifier.ts index 853ef444f3f..12bec57ece2 100644 --- a/test/testSimplifier.ts +++ b/test/testSimplifier.ts @@ -173,10 +173,11 @@ function tokenizeKeySequence(sequence: string): string[] { // no close bracket, probably trying to do a left shift, take literal // char sequence - function rawTokenize(): void { - for (const char of key) { + function rawTokenize(characters: string): void { + for (const char of characters) { result.push(char); } + key = '<'; } for (const char of sequence) { @@ -184,7 +185,7 @@ function tokenizeKeySequence(sequence: string): string[] { if (char === '<') { if (isBracketedKey) { - rawTokenize(); + rawTokenize(key.slice(0, key.length - 1)); } else { isBracketedKey = true; } @@ -203,7 +204,7 @@ function tokenizeKeySequence(sequence: string): string[] { } if (isBracketedKey) { - rawTokenize(); + rawTokenize(key); } return result; From e2624c08b5791bec5bafc08521b6ff167b95f3ca Mon Sep 17 00:00:00 2001 From: Jesse Meade-Clift Date: Tue, 16 Jan 2018 22:19:13 -0700 Subject: [PATCH 5/5] Make rawTokenize clearer. --- test/testSimplifier.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/testSimplifier.ts b/test/testSimplifier.ts index 12bec57ece2..d7200b6b545 100644 --- a/test/testSimplifier.ts +++ b/test/testSimplifier.ts @@ -177,7 +177,6 @@ function tokenizeKeySequence(sequence: string): string[] { for (const char of characters) { result.push(char); } - key = '<'; } for (const char of sequence) { @@ -186,6 +185,7 @@ function tokenizeKeySequence(sequence: string): string[] { if (char === '<') { if (isBracketedKey) { rawTokenize(key.slice(0, key.length - 1)); + key = '<'; } else { isBracketedKey = true; }