diff --git a/codeflea-2.1.1.vsix b/codeflea-2.1.1.vsix index 18e4b8e..f75f9bc 100644 Binary files a/codeflea-2.1.1.vsix and b/codeflea-2.1.1.vsix differ diff --git a/package-lock.json b/package-lock.json index d131a34..17b949b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "codeflea", - "version": "2.0.7", + "version": "2.1.1", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "codeflea", - "version": "2.0.7", + "version": "2.1.1", "devDependencies": { "@types/node": "^16.11.7", "@types/vscode": "^1.34.0", diff --git a/package.json b/package.json index 60e52fb..35a7b82 100644 --- a/package.json +++ b/package.json @@ -102,157 +102,162 @@ { "key": ",", "command": "codeFlea.changeToInsertMode", - "when": "editorTextFocus && codeFlea.mode == 'COMMAND' || editorTextFocus && codeFlea.mode == 'EXTEND'" + "when": "(editorTextFocus && !codeFlea.waitingForChar && codeFlea.mode == 'COMMAND' ) || (editorTextFocus && !codeFlea.waitingForChar && codeFlea.mode == 'EXTEND')" }, { "key": ".", "command": "codeFlea.customVsCodeCommand", - "when": "editorTextFocus && codeFlea.mode == 'COMMAND' || editorTextFocus && codeFlea.mode == 'EXTEND'" + "when": "(editorTextFocus && !codeFlea.waitingForChar && codeFlea.mode == 'COMMAND' ) || (editorTextFocus && !codeFlea.waitingForChar && codeFlea.mode == 'EXTEND')" }, { "key": "v", "command": "codeFlea.changeToExtendMode", - "when": "editorTextFocus && codeFlea.mode == 'COMMAND'" + "when": "(editorTextFocus && !codeFlea.waitingForChar) && codeFlea.mode == 'COMMAND'" }, { "key": "v", "command": "codeFlea.changeToCommandModeLast", - "when": "editorTextFocus && codeFlea.mode == 'EXTEND'" + "when": "(editorTextFocus && !codeFlea.waitingForChar && codeFlea.mode == 'EXTEND')" }, { "key": "w", "command": "codeFlea.changeToWordSubject", - "when": "editorTextFocus && codeFlea.mode == 'COMMAND' || editorTextFocus && codeFlea.mode == 'EXTEND'" + "when": "(editorTextFocus && !codeFlea.waitingForChar && codeFlea.mode == 'COMMAND' ) || (editorTextFocus && !codeFlea.waitingForChar && codeFlea.mode == 'EXTEND')" }, { "key": "x", "command": "codeFlea.changeToLineSubject", - "when": "editorTextFocus && codeFlea.mode == 'COMMAND' || editorTextFocus && codeFlea.mode == 'EXTEND'" + "when": "(editorTextFocus && !codeFlea.waitingForChar && codeFlea.mode == 'COMMAND' ) || (editorTextFocus && !codeFlea.waitingForChar && codeFlea.mode == 'EXTEND')" }, { "key": "b", "command": "codeFlea.changeToBlockSubject", - "when": "editorTextFocus && codeFlea.mode == 'COMMAND' || editorTextFocus && codeFlea.mode == 'EXTEND'" + "when": "(editorTextFocus && !codeFlea.waitingForChar && codeFlea.mode == 'COMMAND' ) || (editorTextFocus && !codeFlea.waitingForChar && codeFlea.mode == 'EXTEND')" }, { "key": "`", "command": "codeFlea.changeToCharSubject", - "when": "editorTextFocus && codeFlea.mode == 'COMMAND' || editorTextFocus && codeFlea.mode == 'EXTEND'" + "when": "(editorTextFocus && !codeFlea.waitingForChar && codeFlea.mode == 'COMMAND' ) || (editorTextFocus && !codeFlea.waitingForChar && codeFlea.mode == 'EXTEND')" }, { "key": "n", "command": "codeFlea.changeToBracketSubject", - "when": "editorTextFocus && codeFlea.mode == 'COMMAND' || editorTextFocus && codeFlea.mode == 'EXTEND'" + "when": "(editorTextFocus && !codeFlea.waitingForChar && codeFlea.mode == 'COMMAND' ) || (editorTextFocus && !codeFlea.waitingForChar && codeFlea.mode == 'EXTEND')" }, { "key": "a", "command": "codeFlea.changeToInsertModeAppend", - "when": "editorTextFocus && codeFlea.mode == 'COMMAND' || editorTextFocus && codeFlea.mode == 'EXTEND'" + "when": "(editorTextFocus && !codeFlea.waitingForChar && codeFlea.mode == 'COMMAND' ) || (editorTextFocus && !codeFlea.waitingForChar && codeFlea.mode == 'EXTEND')" }, { "key": "shift+a", "command": "codeFlea.appendNewObject", - "when": "editorTextFocus && codeFlea.mode == 'COMMAND' || editorTextFocus && codeFlea.mode == 'EXTEND'" + "when": "(editorTextFocus && !codeFlea.waitingForChar && codeFlea.mode == 'COMMAND' ) || (editorTextFocus && !codeFlea.waitingForChar && codeFlea.mode == 'EXTEND')" }, { "key": "p", "command": "codeFlea.changeToInsertModePrepend", - "when": "editorTextFocus && codeFlea.mode == 'COMMAND' || editorTextFocus && codeFlea.mode == 'EXTEND'" + "when": "(editorTextFocus && !codeFlea.waitingForChar && codeFlea.mode == 'COMMAND' ) || (editorTextFocus && !codeFlea.waitingForChar && codeFlea.mode == 'EXTEND')" }, { "key": "shift+p", "command": "codeFlea.prependNewObject", - "when": "editorTextFocus && codeFlea.mode == 'COMMAND' || editorTextFocus && codeFlea.mode == 'EXTEND'" + "when": "(editorTextFocus && !codeFlea.waitingForChar && codeFlea.mode == 'COMMAND' ) || (editorTextFocus && !codeFlea.waitingForChar && codeFlea.mode == 'EXTEND')" }, { "key": "/", "command": "codeFlea.changeToInsertModeMidPoint", - "when": "editorTextFocus && codeFlea.mode == 'COMMAND' || editorTextFocus && codeFlea.mode == 'EXTEND'" + "when": "(editorTextFocus && !codeFlea.waitingForChar && codeFlea.mode == 'COMMAND' ) || (editorTextFocus && !codeFlea.waitingForChar && codeFlea.mode == 'EXTEND')" }, { "key": "shift+/", "command": "codeFlea.changeToInsertModeSurround", - "when": "editorTextFocus && codeFlea.mode == 'COMMAND' || editorTextFocus && codeFlea.mode == 'EXTEND'" + "when": "(editorTextFocus && !codeFlea.waitingForChar && codeFlea.mode == 'COMMAND' ) || (editorTextFocus && !codeFlea.waitingForChar && codeFlea.mode == 'EXTEND')" }, { "key": "enter", "command": "codeFlea.repeatLastSkip", - "when": "editorTextFocus && codeFlea.mode == 'COMMAND' || editorTextFocus && codeFlea.mode == 'EXTEND'" + "when": "(editorTextFocus && !codeFlea.waitingForChar && codeFlea.mode == 'COMMAND' ) || (editorTextFocus && !codeFlea.waitingForChar && codeFlea.mode == 'EXTEND')" }, { "key": "shift+enter", "command": "codeFlea.repeatLastSkipBackwards", - "when": "editorTextFocus && codeFlea.mode == 'COMMAND' || editorTextFocus && codeFlea.mode == 'EXTEND'" + "when": "(editorTextFocus && !codeFlea.waitingForChar && codeFlea.mode == 'COMMAND' ) || (editorTextFocus && !codeFlea.waitingForChar && codeFlea.mode == 'EXTEND')" }, { "key": "space", "command": "codeFlea.openSpaceMenu", - "when": "editorTextFocus && codeFlea.mode == 'COMMAND' || editorTextFocus && codeFlea.mode == 'EXTEND'" + "when": "(editorTextFocus && !codeFlea.waitingForChar && codeFlea.mode == 'COMMAND' ) || (editorTextFocus && !codeFlea.waitingForChar && codeFlea.mode == 'EXTEND')" }, { "key": "g", "command": "codeFlea.openGoToMenu", - "when": "editorTextFocus && codeFlea.mode == 'COMMAND' || editorTextFocus && codeFlea.mode == 'EXTEND'" + "when": "(editorTextFocus && !codeFlea.waitingForChar && codeFlea.mode == 'COMMAND' ) || (editorTextFocus && !codeFlea.waitingForChar && codeFlea.mode == 'EXTEND')" }, { "key": "q", "command": "codeFlea.changeToSubwordSubject", - "when": "editorTextFocus && codeFlea.mode == 'COMMAND' || editorTextFocus && codeFlea.mode == 'EXTEND'" + "when": "(editorTextFocus && !codeFlea.waitingForChar && codeFlea.mode == 'COMMAND' ) || (editorTextFocus && !codeFlea.waitingForChar && codeFlea.mode == 'EXTEND')" + }, + { + "key": "s", + "command": "codeFlea.fastSkip", + "when": "editorTextFocus && !codeFlea.waitingForChar && codeFlea.mode == 'COMMAND'" }, { "key": "s", "command": "codeFlea.skip", - "when": "editorTextFocus && codeFlea.mode == 'COMMAND' || editorTextFocus && codeFlea.mode == 'EXTEND'" + "when": "(editorTextFocus && !codeFlea.waitingForChar) && codeFlea.mode == 'EXTEND'" }, { "key": "shift+s", "command": "codeFlea.skipBackwards", - "when": "editorTextFocus && codeFlea.mode == 'COMMAND' || editorTextFocus && codeFlea.mode == 'EXTEND'" + "when": "(editorTextFocus && !codeFlea.waitingForChar) && (codeFlea.mode == 'COMMAND' || codeFlea.mode == 'EXTEND')" }, { "key": "f", "command": "codeFlea.skipOver", - "when": "editorTextFocus && codeFlea.mode == 'COMMAND' || editorTextFocus && codeFlea.mode == 'EXTEND'" + "when": "(editorTextFocus && !codeFlea.waitingForChar) && (codeFlea.mode == 'COMMAND' || codeFlea.mode == 'EXTEND')" }, { "key": "u", "command": "codeFlea.goToFirstSubjectInScope", - "when": "editorTextFocus && codeFlea.mode == 'COMMAND' || editorTextFocus && codeFlea.mode == 'EXTEND'" + "when": "(editorTextFocus && !codeFlea.waitingForChar && codeFlea.mode == 'COMMAND' ) || (editorTextFocus && !codeFlea.waitingForChar && codeFlea.mode == 'EXTEND')" }, { "key": "o", "command": "codeFlea.goToLastSubjectInScope", - "when": "editorTextFocus && codeFlea.mode == 'COMMAND' || editorTextFocus && codeFlea.mode == 'EXTEND'" + "when": "(editorTextFocus && !codeFlea.waitingForChar && codeFlea.mode == 'COMMAND' ) || (editorTextFocus && !codeFlea.waitingForChar && codeFlea.mode == 'EXTEND')" }, { "key": "y", "command": "codeFlea.goToPrevOccurrence", - "when": "editorTextFocus && codeFlea.mode == 'COMMAND' || editorTextFocus && codeFlea.mode == 'EXTEND'" + "when": "(editorTextFocus && !codeFlea.waitingForChar && codeFlea.mode == 'COMMAND' ) || (editorTextFocus && !codeFlea.waitingForChar && codeFlea.mode == 'EXTEND')" }, { "key": "h", "command": "codeFlea.goToNextOccurrence", - "when": "editorTextFocus && codeFlea.mode == 'COMMAND' || editorTextFocus && codeFlea.mode == 'EXTEND'" + "when": "(editorTextFocus && !codeFlea.waitingForChar && codeFlea.mode == 'COMMAND' ) || (editorTextFocus && !codeFlea.waitingForChar && codeFlea.mode == 'EXTEND')" }, { "key": "shift+y", "command": "codeFlea.extendToPrevOccurrence", - "when": "editorTextFocus && codeFlea.mode == 'COMMAND' || editorTextFocus && codeFlea.mode == 'EXTEND'" + "when": "(editorTextFocus && !codeFlea.waitingForChar && codeFlea.mode == 'COMMAND' ) || (editorTextFocus && !codeFlea.waitingForChar && codeFlea.mode == 'EXTEND')" }, { "key": "shift+h", "command": "codeFlea.extendToNextOccurrence", - "when": "editorTextFocus && codeFlea.mode == 'COMMAND' || editorTextFocus && codeFlea.mode == 'EXTEND'" + "when": "(editorTextFocus && !codeFlea.waitingForChar && codeFlea.mode == 'COMMAND' ) || (editorTextFocus && !codeFlea.waitingForChar && codeFlea.mode == 'EXTEND')" }, { "key": "m", "command": "codeFlea.openModifyMenu", - "when": "editorTextFocus && codeFlea.mode == 'COMMAND' || editorTextFocus && codeFlea.mode == 'EXTEND'" + "when": "(editorTextFocus && !codeFlea.waitingForChar && codeFlea.mode == 'COMMAND' ) || (editorTextFocus && !codeFlea.waitingForChar && codeFlea.mode == 'EXTEND')" }, { "key": "z", "command": "codeFlea.openViewMenu", - "when": "editorTextFocus && codeFlea.mode == 'COMMAND' || editorTextFocus && codeFlea.mode == 'EXTEND'" + "when": "(editorTextFocus && !codeFlea.waitingForChar && codeFlea.mode == 'COMMAND' ) || (editorTextFocus && !codeFlea.waitingForChar && codeFlea.mode == 'EXTEND')" }, { "key": "escape", @@ -262,152 +267,152 @@ { "key": "i", "command": "codeFlea.nextSubjectUp", - "when": "editorTextFocus && codeFlea.mode == 'COMMAND' || editorTextFocus && codeFlea.mode == 'EXTEND'" + "when": "(editorTextFocus && !codeFlea.waitingForChar && codeFlea.mode == 'COMMAND' ) || (editorTextFocus && !codeFlea.waitingForChar && codeFlea.mode == 'EXTEND')" }, { "key": "up", "command": "codeFlea.nextSubjectUp", - "when": "editorTextFocus && codeFlea.mode == 'COMMAND' || editorTextFocus && codeFlea.mode == 'EXTEND'" + "when": "(editorTextFocus && !codeFlea.waitingForChar && codeFlea.mode == 'COMMAND' ) || (editorTextFocus && !codeFlea.waitingForChar && codeFlea.mode == 'EXTEND')" }, { "key": "k", "command": "codeFlea.nextSubjectDown", - "when": "editorTextFocus && codeFlea.mode == 'COMMAND' || editorTextFocus && codeFlea.mode == 'EXTEND'" + "when": "(editorTextFocus && !codeFlea.waitingForChar && codeFlea.mode == 'COMMAND' ) || (editorTextFocus && !codeFlea.waitingForChar && codeFlea.mode == 'EXTEND')" }, { "key": "down", "command": "codeFlea.nextSubjectDown", - "when": "editorTextFocus && codeFlea.mode == 'COMMAND' || editorTextFocus && codeFlea.mode == 'EXTEND'" + "when": "(editorTextFocus && !codeFlea.waitingForChar && codeFlea.mode == 'COMMAND' ) || (editorTextFocus && !codeFlea.waitingForChar && codeFlea.mode == 'EXTEND')" }, { "key": "j", "command": "codeFlea.nextSubjectLeft", - "when": "editorTextFocus && codeFlea.mode == 'COMMAND' || editorTextFocus && codeFlea.mode == 'EXTEND'" + "when": "(editorTextFocus && !codeFlea.waitingForChar && codeFlea.mode == 'COMMAND' ) || (editorTextFocus && !codeFlea.waitingForChar && codeFlea.mode == 'EXTEND')" }, { "key": "left", "command": "codeFlea.nextSubjectLeft", - "when": "editorTextFocus && codeFlea.mode == 'COMMAND' || editorTextFocus && codeFlea.mode == 'EXTEND'" + "when": "(editorTextFocus && !codeFlea.waitingForChar && codeFlea.mode == 'COMMAND' ) || (editorTextFocus && !codeFlea.waitingForChar && codeFlea.mode == 'EXTEND')" }, { "key": "l", "command": "codeFlea.nextSubjectRight", - "when": "editorTextFocus && codeFlea.mode == 'COMMAND' || editorTextFocus && codeFlea.mode == 'EXTEND'" + "when": "(editorTextFocus && !codeFlea.waitingForChar && codeFlea.mode == 'COMMAND' ) || (editorTextFocus && !codeFlea.waitingForChar && codeFlea.mode == 'EXTEND')" }, { "key": "right", "command": "codeFlea.nextSubjectRight", - "when": "editorTextFocus && codeFlea.mode == 'COMMAND' || editorTextFocus && codeFlea.mode == 'EXTEND'" + "when": "(editorTextFocus && !codeFlea.waitingForChar && codeFlea.mode == 'COMMAND' ) || (editorTextFocus && !codeFlea.waitingForChar && codeFlea.mode == 'EXTEND')" }, { "key": "shift+i", "command": "codeFlea.addSubjectUp", - "when": "editorTextFocus && codeFlea.mode == 'COMMAND' || editorTextFocus && codeFlea.mode == 'EXTEND'" + "when": "(editorTextFocus && !codeFlea.waitingForChar && codeFlea.mode == 'COMMAND' ) || (editorTextFocus && !codeFlea.waitingForChar && codeFlea.mode == 'EXTEND')" }, { "key": "shift+up", "command": "codeFlea.addSubjectUp", - "when": "editorTextFocus && codeFlea.mode == 'COMMAND' || editorTextFocus && codeFlea.mode == 'EXTEND'" + "when": "(editorTextFocus && !codeFlea.waitingForChar && codeFlea.mode == 'COMMAND' ) || (editorTextFocus && !codeFlea.waitingForChar && codeFlea.mode == 'EXTEND')" }, { "key": "shift+k", "command": "codeFlea.addSubjectDown", - "when": "editorTextFocus && codeFlea.mode == 'COMMAND' || editorTextFocus && codeFlea.mode == 'EXTEND'" + "when": "(editorTextFocus && !codeFlea.waitingForChar && codeFlea.mode == 'COMMAND' ) || (editorTextFocus && !codeFlea.waitingForChar && codeFlea.mode == 'EXTEND')" }, { "key": "shift+down", "command": "codeFlea.addSubjectDown", - "when": "editorTextFocus && codeFlea.mode == 'COMMAND' || editorTextFocus && codeFlea.mode == 'EXTEND'" + "when": "(editorTextFocus && !codeFlea.waitingForChar && codeFlea.mode == 'COMMAND' ) || (editorTextFocus && !codeFlea.waitingForChar && codeFlea.mode == 'EXTEND')" }, { "key": "shift+j", "command": "codeFlea.addSubjectLeft", - "when": "editorTextFocus && codeFlea.mode == 'COMMAND' || editorTextFocus && codeFlea.mode == 'EXTEND'" + "when": "(editorTextFocus && !codeFlea.waitingForChar && codeFlea.mode == 'COMMAND' ) || (editorTextFocus && !codeFlea.waitingForChar && codeFlea.mode == 'EXTEND')" }, { "key": "shift+left", "command": "codeFlea.addSubjectLeft", - "when": "editorTextFocus && codeFlea.mode == 'COMMAND' || editorTextFocus && codeFlea.mode == 'EXTEND'" + "when": "(editorTextFocus && !codeFlea.waitingForChar && codeFlea.mode == 'COMMAND' ) || (editorTextFocus && !codeFlea.waitingForChar && codeFlea.mode == 'EXTEND')" }, { "key": "shift+l", "command": "codeFlea.addSubjectRight", - "when": "editorTextFocus && codeFlea.mode == 'COMMAND' || editorTextFocus && codeFlea.mode == 'EXTEND'" + "when": "(editorTextFocus && !codeFlea.waitingForChar && codeFlea.mode == 'COMMAND' ) || (editorTextFocus && !codeFlea.waitingForChar && codeFlea.mode == 'EXTEND')" }, { "key": "shift+right", "command": "codeFlea.addSubjectRight", - "when": "editorTextFocus && codeFlea.mode == 'COMMAND' || editorTextFocus && codeFlea.mode == 'EXTEND'" + "when": "(editorTextFocus && !codeFlea.waitingForChar && codeFlea.mode == 'COMMAND' ) || (editorTextFocus && !codeFlea.waitingForChar && codeFlea.mode == 'EXTEND')" }, { "key": "ctrl+i", "command": "codeFlea.swapSubjectUp", - "when": "editorTextFocus && codeFlea.mode == 'COMMAND' || editorTextFocus && codeFlea.mode == 'EXTEND'" + "when": "(editorTextFocus && !codeFlea.waitingForChar && codeFlea.mode == 'COMMAND' ) || (editorTextFocus && !codeFlea.waitingForChar && codeFlea.mode == 'EXTEND')" }, { "key": "ctrl+k", "command": "codeFlea.swapSubjectDown", - "when": "editorTextFocus && codeFlea.mode == 'COMMAND' || editorTextFocus && codeFlea.mode == 'EXTEND'" + "when": "(editorTextFocus && !codeFlea.waitingForChar && codeFlea.mode == 'COMMAND' ) || (editorTextFocus && !codeFlea.waitingForChar && codeFlea.mode == 'EXTEND')" }, { "key": "ctrl+j", "command": "codeFlea.swapSubjectLeft", - "when": "editorTextFocus && codeFlea.mode == 'COMMAND' || editorTextFocus && codeFlea.mode == 'EXTEND'" + "when": "(editorTextFocus && !codeFlea.waitingForChar && codeFlea.mode == 'COMMAND' ) || (editorTextFocus && !codeFlea.waitingForChar && codeFlea.mode == 'EXTEND')" }, { "key": "ctrl+l", "command": "codeFlea.swapSubjectRight", - "when": "editorTextFocus && codeFlea.mode == 'COMMAND' || editorTextFocus && codeFlea.mode == 'EXTEND'" + "when": "(editorTextFocus && !codeFlea.waitingForChar && codeFlea.mode == 'COMMAND' ) || (editorTextFocus && !codeFlea.waitingForChar && codeFlea.mode == 'EXTEND')" }, { "key": "r", "command": "editor.action.quickFix", - "when": "editorTextFocus && codeFlea.mode == 'COMMAND' || editorTextFocus && codeFlea.mode == 'EXTEND'" + "when": "(editorTextFocus && !codeFlea.waitingForChar && codeFlea.mode == 'COMMAND' ) || (editorTextFocus && !codeFlea.waitingForChar && codeFlea.mode == 'EXTEND')" }, { "key": "d", "command": "codeFlea.deleteSubject", - "when": "editorTextFocus && codeFlea.mode == 'COMMAND' || editorTextFocus && codeFlea.mode == 'EXTEND'" + "when": "(editorTextFocus && !codeFlea.waitingForChar && codeFlea.mode == 'COMMAND' ) || (editorTextFocus && !codeFlea.waitingForChar && codeFlea.mode == 'EXTEND')" }, { "key": "shift+d", "command": "codeFlea.duplicateSubject", - "when": "editorTextFocus && codeFlea.mode == 'COMMAND' || editorTextFocus && codeFlea.mode == 'EXTEND'" + "when": "(editorTextFocus && !codeFlea.waitingForChar && codeFlea.mode == 'COMMAND' ) || (editorTextFocus && !codeFlea.waitingForChar && codeFlea.mode == 'EXTEND')" }, { "key": "c", "command": "codeFlea.change", - "when": "editorTextFocus && codeFlea.mode == 'COMMAND' || editorTextFocus && codeFlea.mode == 'EXTEND'" + "when": "(editorTextFocus && !codeFlea.waitingForChar && codeFlea.mode == 'COMMAND' ) || (editorTextFocus && !codeFlea.waitingForChar && codeFlea.mode == 'EXTEND')" }, { "key": "shift+c", "command": "codeFlea.changeToLineEnd", - "when": "editorTextFocus && codeFlea.mode == 'COMMAND' || editorTextFocus && codeFlea.mode == 'EXTEND'" + "when": "(editorTextFocus && !codeFlea.waitingForChar && codeFlea.mode == 'COMMAND' ) || (editorTextFocus && !codeFlea.waitingForChar && codeFlea.mode == 'EXTEND')" }, { "key": ";", "command": "codeFlea.newLineBelow", - "when": "editorTextFocus && codeFlea.mode == 'COMMAND' || editorTextFocus && codeFlea.mode == 'EXTEND'" + "when": "(editorTextFocus && !codeFlea.waitingForChar && codeFlea.mode == 'COMMAND' ) || (editorTextFocus && !codeFlea.waitingForChar && codeFlea.mode == 'EXTEND')" }, { "key": "shift+;", "command": "codeFlea.newLineAbove", - "when": "editorTextFocus && codeFlea.mode == 'COMMAND' || editorTextFocus && codeFlea.mode == 'EXTEND'" + "when": "(editorTextFocus && !codeFlea.waitingForChar && codeFlea.mode == 'COMMAND' ) || (editorTextFocus && !codeFlea.waitingForChar && codeFlea.mode == 'EXTEND')" }, { "key": "t", "command": "codeFlea.jump", - "when": "editorTextFocus && codeFlea.mode == 'COMMAND' || editorTextFocus && codeFlea.mode == 'EXTEND'" + "when": "((editorTextFocus && !codeFlea.waitingForChar) && !codeFlea.waitingForChar) && (codeFlea.mode == 'COMMAND' || codeFlea.mode == 'EXTEND')" }, { "key": "backspace", "command": "cursorUndo", - "when": "editorTextFocus && codeFlea.mode == 'COMMAND' || editorTextFocus && codeFlea.mode == 'EXTEND'" + "when": "(editorTextFocus && !codeFlea.waitingForChar && codeFlea.mode == 'COMMAND' ) || (editorTextFocus && !codeFlea.waitingForChar && codeFlea.mode == 'EXTEND')" }, { "key": "delete", "command": "cursorRedo", - "when": "editorTextFocus && codeFlea.mode == 'COMMAND' || editorTextFocus && codeFlea.mode == 'EXTEND'" + "when": "(editorTextFocus && !codeFlea.waitingForChar && codeFlea.mode == 'COMMAND' ) || (editorTextFocus && !codeFlea.waitingForChar && codeFlea.mode == 'EXTEND')" } ] }, diff --git a/src/CodeFleaManager.ts b/src/CodeFleaManager.ts index 04b272c..ae6cebf 100644 --- a/src/CodeFleaManager.ts +++ b/src/CodeFleaManager.ts @@ -239,6 +239,11 @@ export default class CodeFleaManager { this.setUI(); } + async fastSkip(direction: common.Direction) { + await this.mode.fastSkip(direction); + this.setUI(); + } + async skipOver(direction: common.Direction) { await this.mode.skipOver(direction); this.setUI(); diff --git a/src/commands.ts b/src/commands.ts index 78a0b96..a32ebfd 100644 --- a/src/commands.ts +++ b/src/commands.ts @@ -329,6 +329,12 @@ export const registeredCommands: ExtensionCommand[] = [ await manager.skip(Direction.forwards); }, }, + { + id: "codeFlea.fastSkip", + execute: async (manager) => { + await manager.fastSkip(Direction.forwards); + }, + }, { id: "codeFlea.skipBackwards", execute: async (manager) => { diff --git a/src/modes/CommandMode.ts b/src/modes/CommandMode.ts index 6eab726..33df690 100644 --- a/src/modes/CommandMode.ts +++ b/src/modes/CommandMode.ts @@ -10,6 +10,7 @@ import SubjectBase from "../subjects/SubjectBase"; import { SubjectAction } from "../subjects/SubjectActions"; import JumpInterface from "../handlers/JumpInterface"; import { SubjectName } from "../subjects/SubjectName"; +import { InlineInput } from '../utils/inlineInput'; export default class CommandMode extends modes.EditorMode { private lastSkip: common.Skip | undefined = undefined; @@ -183,6 +184,7 @@ export default class CommandMode extends modes.EditorMode { await this.subject.fixSelection(half); } + async skip(direction: common.Direction): Promise { const skipChar = await editor.inputBoxChar( `Skip ${direction} to a ${this.subject.name} by its first character` @@ -197,6 +199,47 @@ export default class CommandMode extends modes.EditorMode { await this.subject.skip(direction, this.lastSkip); } + async fastSkip(direction: common.Direction): Promise { + await new Promise((resolve) => { + const handleInput = async (_: string, char: common.Char) => { + if (this.subject.name === "WORD" && !/[a-zA-Z0-9_]/.test(char)) { + const newMode = await this.changeTo({ kind: "COMMAND", subjectName: "CHAR" }); + if (newMode instanceof CommandMode) { + const skip: common.Skip = { + kind: "SkipTo", + char, + }; + this.lastSkip = { kind: "SkipOver", char: char }; + await newMode.subject.skip(direction, skip); + } + } else { + const skip: common.Skip = { + kind: "SkipTo", + char, + + }; + this.lastSkip = { kind: "SkipOver", char: char }; + await this.subject.skip(direction, skip); + } + + resolve(); + }; + + const inlineInput = new InlineInput({ + textEditor: this.context.editor, + onInput: handleInput, + onCancel: async () => { + resolve(); + } + }); + + inlineInput.updateStatusBar( + `Skip ${direction} to ${this.subject.displayName} by first character`, + 0 + ); + }); + } + async skipOver(direction: common.Direction): Promise { const skipChar = await editor.inputBoxChar( `Skip ${direction} over the given character to the next ${this.subject.name}`, diff --git a/src/modes/ExtendMode.ts b/src/modes/ExtendMode.ts index a81c9e2..d6c035a 100644 --- a/src/modes/ExtendMode.ts +++ b/src/modes/ExtendMode.ts @@ -152,6 +152,10 @@ export default class ExtendMode extends EditorMode { await this.extendSelections(() => this.wrappedMode.skip(direction)); } + async fastSkip(direction: common.Direction) { + await this.extendSelections(() => this.wrappedMode.skip(direction)); // just use normal skip + } + async skipOver(direction: common.Direction) { await this.extendSelections(() => this.wrappedMode.skipOver(direction)); } diff --git a/src/modes/InsertMode.ts b/src/modes/InsertMode.ts index dc75cb2..b3bb5c5 100644 --- a/src/modes/InsertMode.ts +++ b/src/modes/InsertMode.ts @@ -54,6 +54,7 @@ export default class InsertMode extends EditorMode { async executeSubjectCommand() {} async repeatLastSkip() {} async skip() {} + async fastSkip() {} async skipOver() {} async jump() {} async jumpToSubject() { return undefined; } diff --git a/src/modes/NullMode.ts b/src/modes/NullMode.ts index 0da11e0..4059934 100644 --- a/src/modes/NullMode.ts +++ b/src/modes/NullMode.ts @@ -41,6 +41,7 @@ export default class NullMode extends EditorMode { async executeSubjectCommand() {} async skip() {} + async fastSkip() {} async skipOver() {} async repeatLastSkip() {} async jump() {} diff --git a/src/modes/modes.ts b/src/modes/modes.ts index 6d53ff0..c79ec45 100644 --- a/src/modes/modes.ts +++ b/src/modes/modes.ts @@ -31,6 +31,7 @@ export abstract class EditorMode implements vscode.Disposable { abstract executeSubjectCommand(command: SubjectAction): Promise; abstract skip(direction: Direction): Promise; + abstract fastSkip(direction: Direction): Promise; abstract skipOver(direction: string): Promise; abstract repeatLastSkip(direction: Direction): Promise; abstract jump(): Promise; diff --git a/src/utils/inlineInput.ts b/src/utils/inlineInput.ts new file mode 100644 index 0000000..9225f62 --- /dev/null +++ b/src/utils/inlineInput.ts @@ -0,0 +1,68 @@ +// Mostly from https://github.com/usernamehw/vscode-find-jump/blob/master/src/inlineInput.ts + +import { commands, Disposable, StatusBarAlignment, StatusBarItem, TextEditor, window } from 'vscode'; +import { Char } from '../common'; +import * as vscode from "vscode"; + +const cancellationChars = new Set('\n'); +const subscriptions: Disposable[] = []; + +export class InlineInput { + private statusBarItem: StatusBarItem; + private input = ''; + + constructor(private readonly props: { + textEditor: TextEditor; + onInput(input: string, char: Char): void; + onCancel(...args: any[]): void; + }) { + subscriptions.push( + commands.registerCommand('type', this._onInput), + window.onDidChangeTextEditorSelection(this._onCancel), + ); + + vscode.commands.executeCommand('setContext', 'codeFlea.waitingForChar', true); + this.statusBarItem = window.createStatusBarItem( + StatusBarAlignment.Right, + 1000 + ); + } + + public updateStatusBar = (text: string, numberOfMatches: number, activityIndicatorState?: boolean): void => { + if (activityIndicatorState !== undefined) { + const indicator = activityIndicatorState ? '⚪' : '🔴'; + this.statusBarItem.text = `${numberOfMatches} ░ ${text} ░ ${indicator}`; + } else { + this.statusBarItem.text = `$(search) ${text}`; + } + this.statusBarItem.show(); + }; + + public destroy = (): void => { + this.statusBarItem.dispose(); + subscriptions.forEach(subscription => subscription.dispose()); + vscode.commands.executeCommand('setContext', 'codeFlea.waitingForChar', false); + }; + + public deleteLastCharacter = (): string => { + this.input = this.input.slice(0, -1); + return this.input; + }; + + private readonly _onInput = ({ text }: { text: string }) => { + if (text.length !== 1) return; + const char = text as Char; // Now we know it's length 1 + this.input += char; + + if (cancellationChars.has(char)) { + this._onCancel(); + } else { + return this.props.onInput(this.input, char); + } + }; + + private readonly _onCancel = (...args: any[]) => { + this.destroy(); + return this.props.onCancel(args); + }; +} \ No newline at end of file