From 39609da7af2965682cbea7cde63562affc93ab72 Mon Sep 17 00:00:00 2001 From: Johannes Baiter Date: Thu, 28 Mar 2019 19:43:06 +0100 Subject: [PATCH] digraphs: Allow input in reverse order (fixes #3599) (#3635) --- src/actions/commands/insert.ts | 29 ++++++++++++++++++++++++++--- test/mode/modeInsert.test.ts | 9 ++++++--- 2 files changed, 32 insertions(+), 6 deletions(-) diff --git a/src/actions/commands/insert.ts b/src/actions/commands/insert.ts index 46b4ed54b03..4e7c89f0c2a 100644 --- a/src/actions/commands/insert.ts +++ b/src/actions/commands/insert.ts @@ -306,7 +306,14 @@ class CommandInsertDigraph extends BaseCommand { public async exec(position: Position, vimState: VimState): Promise { const digraph = this.keysPressed.slice(1, 3).join(''); - let charCodes = (DefaultDigraphs[digraph] || configuration.digraphs[digraph])[1]; + const reverseDigraph = digraph + .split('') + .reverse() + .join(''); + let charCodes = (DefaultDigraphs[digraph] || + DefaultDigraphs[reverseDigraph] || + configuration.digraphs[digraph] || + configuration.digraphs[reverseDigraph])[1]; if (!(charCodes instanceof Array)) { charCodes = [charCodes]; } @@ -324,7 +331,16 @@ class CommandInsertDigraph extends BaseCommand { return false; } const chars = keysPressed.slice(1, 3).join(''); - return chars in configuration.digraphs || chars in DefaultDigraphs; + const reverseChars = chars + .split('') + .reverse() + .join(''); + return ( + chars in configuration.digraphs || + reverseChars in configuration.digraphs || + chars in DefaultDigraphs || + reverseChars in DefaultDigraphs + ); } public couldActionApply(vimState: VimState, keysPressed: string[]): boolean { @@ -332,8 +348,15 @@ class CommandInsertDigraph extends BaseCommand { return false; } const chars = keysPressed.slice(1, keysPressed.length).join(''); + const reverseChars = chars + .split('') + .reverse() + .join(''); if (chars.length > 0) { - const predicate = (digraph: string) => chars === digraph.substring(0, chars.length); + const predicate = (digraph: string) => { + const digraphChars = digraph.substring(0, chars.length); + return chars === digraphChars || reverseChars === digraphChars; + }; const match = Object.keys(configuration.digraphs).find(predicate) || Object.keys(DefaultDigraphs).find(predicate); diff --git a/test/mode/modeInsert.test.ts b/test/mode/modeInsert.test.ts index 5b24bfe5769..bfc51200f0d 100644 --- a/test/mode/modeInsert.test.ts +++ b/test/mode/modeInsert.test.ts @@ -347,8 +347,11 @@ suite('Mode Insert', () => { 'e', 'x', 't', + '', + '>', + '-', ]); - assertEqualLines(['text→text']); + assertEqualLines(['text→text→']); }); test('Can handle custom digraph insert', async () => { @@ -356,7 +359,7 @@ suite('Mode Insert', () => { 'R!': ['🚀', [55357, 56960]], }; await reloadConfiguration(); - await modeHandler.handleMultipleKeyEvents(['i', '', 'R', '!']); - assertEqualLines(['🚀']); + await modeHandler.handleMultipleKeyEvents(['i', '', 'R', '!', '', '!', 'R']); + assertEqualLines(['🚀🚀']); }); });