From 44dfd255e69322850884d1c4ff464411618563a7 Mon Sep 17 00:00:00 2001 From: Grant Mathews Date: Tue, 2 Aug 2016 00:04:36 -0700 Subject: [PATCH] Support gd (#547) * Add support for `gd` for #529 This commit maps `gd` to VSCode's go to declaration action. Also, add a missing semicolon. * Fix go to definition by polling. --- src/actions/actions.ts | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/src/actions/actions.ts b/src/actions/actions.ts index bead742610e..95a6d670c34 100644 --- a/src/actions/actions.ts +++ b/src/actions/actions.ts @@ -1350,6 +1350,38 @@ class CommandExitVisualLineMode extends BaseCommand { } } +@RegisterAction +class CommandGoToDefinition extends BaseCommand { + modes = [ModeName.Normal]; + keys = ["g", "d"]; + + public async exec(position: Position, vimState: VimState): Promise { + const startPosition = Position.FromVSCodePosition(vscode.window.activeTextEditor.selection.start); + + await vscode.commands.executeCommand("editor.action.goToDeclaration"); + + // Unfortuantely, the above does not necessarily have to have finished executing + // (even though we do await!). THe only way to ensure it's done is to poll, which is + // a major bummer. + + await new Promise(resolve => { + let interval = setInterval(() => { + const positionNow = Position.FromVSCodePosition(vscode.window.activeTextEditor.selection.start); + + if (!startPosition.isEqual(positionNow)) { + clearInterval(interval); + resolve(); + } + }, 50); + }); + + vimState.focusChanged = true; + vimState.cursorPosition = Position.FromVSCodePosition(vscode.window.activeTextEditor.selection.start); + + return vimState; + } +} + // begin insert commands @RegisterAction