Skip to content

Commit

Permalink
digraphs: Allow input in reverse order (fixes #3599) (#3635)
Browse files Browse the repository at this point in the history
  • Loading branch information
jbaiter authored and jpoon committed Mar 28, 2019
1 parent 6a6816b commit 39609da
Show file tree
Hide file tree
Showing 2 changed files with 32 additions and 6 deletions.
29 changes: 26 additions & 3 deletions src/actions/commands/insert.ts
Original file line number Diff line number Diff line change
Expand Up @@ -306,7 +306,14 @@ class CommandInsertDigraph extends BaseCommand {

public async exec(position: Position, vimState: VimState): Promise<VimState> {
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];
}
Expand All @@ -324,16 +331,32 @@ 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 {
if (!super.couldActionApply(vimState, keysPressed)) {
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);
Expand Down
9 changes: 6 additions & 3 deletions test/mode/modeInsert.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -347,16 +347,19 @@ suite('Mode Insert', () => {
'e',
'x',
't',
'<C-k>',
'>',
'-',
]);
assertEqualLines(['text→text']);
assertEqualLines(['text→text']);
});

test('Can handle custom digraph insert', async () => {
Globals.mockConfiguration.digraphs = {
'R!': ['🚀', [55357, 56960]],
};
await reloadConfiguration();
await modeHandler.handleMultipleKeyEvents(['i', '<C-k>', 'R', '!']);
assertEqualLines(['🚀']);
await modeHandler.handleMultipleKeyEvents(['i', '<C-k>', 'R', '!', '<C-k>', '!', 'R']);
assertEqualLines(['🚀🚀']);
});
});

0 comments on commit 39609da

Please sign in to comment.