From 9e4ecd8f38a364d495ed2efa2b63e6eb58917c96 Mon Sep 17 00:00:00 2001 From: ManuelHentschel <53863351+ManuelHentschel@users.noreply.github.com> Date: Tue, 9 Mar 2021 13:53:37 +0100 Subject: [PATCH 1/2] Add links to help pages in hover --- package.json | 10 ++++++++++ src/completions.ts | 26 ++++++++++++++++++++++++++ src/extension.ts | 1 + src/rHelp.ts | 33 ++++++++++++++++++++++----------- 4 files changed, 59 insertions(+), 11 deletions(-) diff --git a/package.json b/package.json index ec7455247..93ac188f1 100644 --- a/package.json +++ b/package.json @@ -615,6 +615,11 @@ "title": "Open help for selection", "category": "R", "command": "r.helpPanel.openForSelection" + }, + { + "title": "Open help for path", + "category": "R", + "command": "r.helpPanel.openForPath" } ], "keybindings": [ @@ -945,6 +950,11 @@ "markdownDeprecationMessage": "Will be deprecated. Use `#r.rpath.windows#`, `#r.rpath.mac#`, or `#r.rpath.linux#` instead.", "deprecationMessage": "Will be deprecated. Use r.rpath.windows, r.rpath.mac, or r.rpath.linux instead." }, + "r.helpPanel.enableHoverLinks": { + "type": "boolean", + "default": true, + "markdownDescription": "Show links to matching help pages in hover" + }, "r.source.encoding": { "type": "string", "default": "UTF-8", diff --git a/src/completions.ts b/src/completions.ts index 27d47e003..20886ce2d 100644 --- a/src/completions.ts +++ b/src/completions.ts @@ -10,6 +10,8 @@ import * as vscode from 'vscode'; import * as session from './session'; import { extendSelection } from './selection'; import { cleanLine } from './lineCache'; +import { globalRHelp } from './extension'; +import { config } from './util'; // Get with names(roxygen2:::default_tags()) @@ -34,6 +36,30 @@ export class HoverProvider implements vscode.HoverProvider { } } +export class HelpLinkHoverProvider implements vscode.HoverProvider { + async provideHover(document: vscode.TextDocument, position: vscode.Position): Promise { + if(!config().get('helpPanel.enableHoverLinks')){ + return null; + } + const re = /([a-zA-Z0-9._:])+/; + const wordRange = document.getWordRangeAtPosition(position, re); + const token = document.getText(wordRange); + const aliases = await globalRHelp?.getMatchingAliases(token) || []; + const mds = aliases.map(a => { + const cmdText = `${a.package}::${a.name}`; + const args = [`/library/${a.package}/html/${a.alias}.html`]; + const encodedArgs = encodeURIComponent(JSON.stringify(args)); + const cmd = 'command:r.helpPanel.openForPath'; + const cmdUri = vscode.Uri.parse(`${cmd}?${encodedArgs}`); + return `[${cmdText}](${cmdUri})`; + }); + const md = new vscode.MarkdownString(mds.join('\n\n')); + md.isTrusted = true; + return new vscode.Hover(md, wordRange); + } +} + + export class StaticCompletionItemProvider implements vscode.CompletionItemProvider { provideCompletionItems(document: vscode.TextDocument, position: vscode.Position): vscode.CompletionItem[] | undefined { if (document.lineAt(position).text diff --git a/src/extension.ts b/src/extension.ts index 3dced44a5..f10085dc4 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -132,6 +132,7 @@ export async function activate(context: vscode.ExtensionContext): Promise rHelp?.goBack()), vscode.commands.registerCommand('r.helpPanel.forward', () => rHelp?.goForward()), vscode.commands.registerCommand('r.helpPanel.openExternal', () => rHelp?.openExternal()), - vscode.commands.registerCommand('r.helpPanel.openForSelection', (preserveFocus: boolean = false) => rHelp?.openHelpForSelection(!!preserveFocus)) + vscode.commands.registerCommand('r.helpPanel.openForSelection', (preserveFocus: boolean = false) => rHelp?.openHelpForSelection(!!preserveFocus)), + vscode.commands.registerCommand('r.helpPanel.openForPath', (path?: string) => { + if(path){ + void rHelp?.showHelpForPath(path); + } + }) ); vscode.window.registerWebviewPanelSerializer('rhelp', rHelp); @@ -340,16 +345,7 @@ export class RHelp implements api.HelpPanel, vscode.WebviewPanelSerializer { - const aliases = await this.getAllAliases(); - if(!aliases){ - return false; - } - - const matchingAliases = aliases.filter(alias => ( - token === alias.name - || token === `${alias.package}::${alias.name}` - || token === `${alias.package}:::${alias.name}` - )); + const matchingAliases = await this.getMatchingAliases(token); let pickedAlias: Alias | undefined; if(matchingAliases.length === 0){ @@ -364,6 +360,21 @@ export class RHelp implements api.HelpPanel, vscode.WebviewPanelSerializer { + const aliases = await this.getAllAliases(); + if(!aliases){ + []; + } + + const matchingAliases = aliases.filter(alias => ( + token === alias.name + || token === `${alias.package}::${alias.name}` + || token === `${alias.package}:::${alias.name}` + )); + + return matchingAliases; + } // search function, similar to calling `?` in R public async searchHelpByAlias(): Promise { From 2125cb1bd4d8b6fe3575ddba3ac5799593990f49 Mon Sep 17 00:00:00 2001 From: Kun Ren Date: Fri, 12 Mar 2021 15:58:34 +0800 Subject: [PATCH 2/2] Improve the formatting --- src/completions.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/completions.ts b/src/completions.ts index 20886ce2d..767c19f8c 100644 --- a/src/completions.ts +++ b/src/completions.ts @@ -51,9 +51,9 @@ export class HelpLinkHoverProvider implements vscode.HoverProvider { const encodedArgs = encodeURIComponent(JSON.stringify(args)); const cmd = 'command:r.helpPanel.openForPath'; const cmdUri = vscode.Uri.parse(`${cmd}?${encodedArgs}`); - return `[${cmdText}](${cmdUri})`; + return `[\`${cmdText}\`](${cmdUri})`; }); - const md = new vscode.MarkdownString(mds.join('\n\n')); + const md = new vscode.MarkdownString(mds.join(' \n')); md.isTrusted = true; return new vscode.Hover(md, wordRange); }