Как синхронизировать контур VS Code с текущей позицией в редакторе - PullRequest
0 голосов
/ 21 февраля 2019

Я работаю на языке, который обычно имеет очень большие и трудные для навигации файлы, поэтому я хотел бы легко увидеть, в какой функции я нахожусь всегда, так как это обычно самое большое раздражение (переход на страницу ~ 20 разчтобы найти текущее имя функции, а затем вернуться обратно вниз.)

Я вижу, как можно написать расширение для вывода списка всех функций путем регистрации поставщика символов документа.Прежде чем я зайду слишком далеко по пути, я хочу знать, будет ли какой-то способ автоматически и постоянно иметь какое-то указание в виде схемы, какой узел представляет текущую позицию в редакторе кода.Если нет, то вместо этого мне, возможно, придется создать свое собственное древовидное представление (будет ли у него такая возможность?).

Ответы [ 2 ]

0 голосов
/ 23 февраля 2019

Если у вас достаточно функциональный контурный вид, то есть тот, в котором символы расположены иерархически, предоставляя объекты диапазона для всего объема каждого символа, а не только для позиции, тогда вы можете переключить элемент «Хлебные крошки»в меню просмотра, чтобы иметь постоянное представление о том, где вы находитесь в иерархии структуры.Это именно то, к чему я стремился.

Чтобы помочь с этим, у меня были некоторые данные, хранящиеся в переменной с именем 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

0 голосов
/ 21 февраля 2019

Да, это возможно.Вашему провайдеру дерева нужен способ сопоставления символа с элементом дерева, а затем вызовите TreeView.reveal().Вот код , который я использую для выбора записи в списке действий, в зависимости от того, где находится курсор в текущем редакторе исходного кода:

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);
    }
});
...