我正在使用一种通常具有很大且难以导航的文件的语言,因此我想随时了解我所处的功能,因为这通常是最大的烦恼(将速度提高20倍左右)查找当前的函数名称,然后向下调页)。
我了解如何通过注册文档符号提供程序来编写扩展以列出所有功能。但是,在我走得太远之前,我想知道是否有某种方法可以在大纲视图中自动,持续地显示某种指示,即哪个节点代表代码编辑器中的当前位置。如果没有,我可能只需要创建自己的树形视图即可(具有这种功能吗?)。
答案 0 :(得分:1)
是的,这是可能的。您的树提供程序需要一种将符号与树项目匹配的方法,然后调用TreeView.reveal()
。 code I use可以根据插入符号在当前源代码编辑器中的位置,在操作列表中选择一个条目:
public update(editor: TextEditor) {
let position = editor.selection.active;
let action = Utils.findInListFromPosition(this.actions, position.character, position.line + 1);
if (action) {
this.actionTree.reveal(action, { select: true });
return;
}
let predicate = Utils.findInListFromPosition(this.predicates, position.character, position.line + 1);
if (predicate) {
this.actionTree.reveal(predicate, { select: true });
return;
}
}
从注册在主扩展文件中的选择更改事件中调用此方法:
window.onDidChangeTextEditorSelection((event: TextEditorSelectionChangeEvent) => {
if (event.textEditor.document.languageId === "antlr" && event.textEditor.document.uri.scheme === "file") {
...
actionsProvider.update(event.textEditor);
}
});
答案 1 :(得分:0)
如果您具有合理的功能轮廓视图,也就是说,通过为每个符号的整个范围(而不只是位置)提供范围对象来对符号进行分层排列,则可以切换“面包屑”项在视图菜单中可以连续查看您在大纲层次结构中的位置。这正是我所追求的。
为解决这个问题,我将一些数据存储在名为currentBlock
的变量中,其中包括symbolInformation
,这些变量是在遇到方法的第一行时创建的(例如,从匹配项中获取)从正则表达式返回的对象):
currentBlock.symbolInformation = new vscode.SymbolInformation(
match[1],
vscode.SymbolKind.Method,
className,
new vscode.Location(document.uri,
new vscode.Position(lineNum, line.firstNonWhitespaceCharacterIndex)));
然后,当我到达该块的末尾时,我将合并包含先前存储的数据的其余信息,并将其推送到SymbolInformation[]
结果中。
private popBlock(document: vscode.TextDocument, lineNum: number, currentBlock: IndentInfo): vscode.SymbolInformation | undefined {
if (currentBlock.symbolInformation !== undefined) {
currentBlock.symbolInformation = new vscode.SymbolInformation(
currentBlock.symbolInformation.name,
currentBlock.symbolInformation.kind,
currentBlock.symbolInformation.containerName,
new vscode.Location(
currentBlock.symbolInformation.location.uri,
new vscode.Range(
currentBlock.symbolInformation.location.range.start,
new vscode.Position(lineNum-1, document.lineAt(lineNum-1).text.length)
)
)
);
return currentBlock.symbolInformation;
}
}
在编辑器窗格上方,您可以在此处看到报告当前位置完整上下文的面包屑。它基于用于构建轮廓的相同信息。