Index: clangd/clients/clangd-vscode/package.json =================================================================== --- clangd/clients/clangd-vscode/package.json +++ clangd/clients/clangd-vscode/package.json @@ -74,6 +74,20 @@ "description": "Names a file that clangd should log a performance trace to, in chrome trace-viewer JSON format." } } - } + }, + "commands": [ + { + "command": "clangd-vscode.switchheadersource", + "title": "C/C++: Switch between Source/Header" + } + ], + "keybindings": [ + { + "command": "clangd-vscode.switchheadersource", + "key": "Alt+o", + "mac": "Alt+cmd+o", + "when": "editorTextFocus" + } + ] } } Index: clangd/clients/clangd-vscode/src/extension.ts =================================================================== --- clangd/clients/clangd-vscode/src/extension.ts +++ clangd/clients/clangd-vscode/src/extension.ts @@ -1,6 +1,7 @@ import * as vscode from 'vscode'; import * as vscodelc from 'vscode-languageclient'; import { realpathSync } from 'fs'; +import { RequestType, TextDocumentIdentifier } from 'vscode-languageclient'; /** * Method to get workspace configuration option @@ -12,6 +13,10 @@ return config.get(option, defaultValue); } +export namespace SwitchSourceHeaderRequest { + export const type = new RequestType('textDocument/switchSourceHeader'); +} + /** * this method is called when your extension is activate * your extension is activated the very first time the command is executed @@ -53,6 +58,18 @@ const clangdClient = new vscodelc.LanguageClient('Clang Language Server', serverOptions, clientOptions); console.log('Clang Language Server is now active!'); - - const disposable = clangdClient.start(); + + context.subscriptions.push(clangdClient.start()); + context.subscriptions.push(vscode.commands.registerCommand('clangd-vscode.switchheadersource', () => { + const uri = vscode.Uri.file(vscode.window.activeTextEditor.document.fileName); + if (!uri) { + return; + } + const docIdentifier = TextDocumentIdentifier.create(uri.toString()); + clangdClient.sendRequest(SwitchSourceHeaderRequest.type, docIdentifier).then(sourceUri => { + if (sourceUri !== undefined) { + vscode.workspace.openTextDocument(vscode.Uri.parse(sourceUri)).then(doc => vscode.window.showTextDocument(doc)); + } + }); + })); }