Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -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": [
Expand Down Expand Up @@ -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",
Expand Down
26 changes: 26 additions & 0 deletions src/completions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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())
Expand All @@ -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<vscode.Hover> {
if(!config().get<boolean>('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'));
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
Expand Down
1 change: 1 addition & 0 deletions src/extension.ts
Original file line number Diff line number Diff line change
Expand Up @@ -132,6 +132,7 @@ export async function activate(context: vscode.ExtensionContext): Promise<apiImp

// register (session) hover and completion providers
vscode.languages.registerHoverProvider('r', new completions.HoverProvider());
vscode.languages.registerHoverProvider('r', new completions.HelpLinkHoverProvider());
vscode.languages.registerCompletionItemProvider('r', new completions.StaticCompletionItemProvider(), '@');


Expand Down
33 changes: 22 additions & 11 deletions src/rHelp.ts
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,12 @@ export async function initializeHelp(context: vscode.ExtensionContext, rExtensio
vscode.commands.registerCommand('r.helpPanel.back', () => 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);
Expand Down Expand Up @@ -340,16 +345,7 @@ export class RHelp implements api.HelpPanel, vscode.WebviewPanelSerializer<strin

// quickly open help page by alias
public async openHelpByAlias(token: string = '', preserveFocus: boolean = false): Promise<boolean> {
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){
Expand All @@ -364,6 +360,21 @@ export class RHelp implements api.HelpPanel, vscode.WebviewPanelSerializer<strin
}
return false;
}

public async getMatchingAliases(token: string): Promise<Alias[]> {
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<boolean> {
Expand Down