如何将VS Code的轮廓同步到编辑器中的当前位置

时间:2019-02-20 23:03:38

标签: typescript visual-studio-code vscode-extensions

我正在使用一种通常具有很大且难以导航的文件的语言,因此我想随时了解我所处的功能,因为这通常是最大的烦恼(将速度提高20倍左右)查找当前的函数名称,然后向下调页)。

我了解如何通过注册文档符号提供程序来编写扩展以列出所有功能。但是,在我走得太远之前,我想知道是否有某种方法可以在大纲视图中自动,持续地显示某种指示,即哪个节点代表代码编辑器中的当前位置。如果没有,我可能只需要创建自己的树形视图即可(具有这种功能吗?)。

2 个答案:

答案 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;
    }
}

在编辑器窗格上方,您可以在此处看到报告当前位置完整上下文的面包屑。它基于用于构建轮廓的相同信息。

enter image description here