VSCode使用JS在特定的行号中打开文件

时间:2020-06-18 15:29:00

标签: visual-studio-code vscode-extensions

我在VSCode中添加了一个新按钮,以便单击时可以编译当前文件夹,并使用vscode.window.showInformationMessage显示对话框。
每个框都显示一个编译错误,并带有一个按钮。用户单击按钮后,它将使用vscode.workspace.openTextDocument在选项卡中打开有问题的文件。

我想使按钮也导航到有问题的文件中有问题的行。

我的问题是:
给定一个数字,是否可以导航到文件内的特定行号?

到目前为止我获得的成就的示例代码:

// Bullshit to give some context
const pattern = /(In \w+.jack)/g;
var i = s.search(pattern);
var substring = s.substring(i + 1)
var j = substring.search(pattern);
var s = "bsadsdbla In main.jack (line 55) sqdwqe blasdsd wq qqweq"
let GoToFile = 'Go to File'; 
var k = s.search(/(\w+.jack)/);
var l = s.search(/(.jack)/)
var fileName = s.substring(k, l);

// ---------> This is the important part <----------------
vscode.window.showInformationMessage(s.substring(i, j), GoToFile).then(selection => {
    if (selection === GoToFile) {
        vscode.workspace.openTextDocument(currentDirectory + '\\' + fileName + '.jack')
        .then(document => vscode.window.showTextDocument(document));
    }
});

2 个答案:

答案 0 :(得分:1)

我假设您有一些可以提供行号的代码/正则表达式。每当有人单击您的GoToFile方法时,将调用以下代码:

activeEditor.selections = [new vscode.Selection(lineToGo, lineToGo)];
var range = new vscode.Range(lineToGo, lineToGo);
activeEditor.revealRange(range);

答案 1 :(得分:0)

某些背景
正如@ rioV8所提到的,revealRange是必经之路,但问题是我无法理解如何使用VSCode API来使用它,因此这里出现了@Shahriar Hossain。 @Shahriar Hossain的代码有效,但是,缺少一个重要的声明,我还必须弄清楚当用户单击按钮时如何运行代码。

这是完整的解决方案:

       vscode.window.showInformationMessage(s.substring(i), GoToFile).then(selection => {
          if (selection === GoToFile) {

            vscode.workspace.openTextDocument(currentDirectory + '\\' + fileName + '.jack')
            .then(document => vscode.window.showTextDocument(document))

            // Whatever code inside this "then" block 
            // will be executed on button click
            .then(x => {
              let m = s.substring(i, j).search(/\(line \d+\)/);
              let subStr = s.substring(m + 6);
              let n = subStr.search(/\)/);
              subStr = subStr.substring(0, n);
              let lineToGo = parseInt(subStr.match(/\d+/));

              // The missing declaration of the activeEditor
              let activeEditor = vscode.window.activeTextEditor;
              let range = activeEditor.document.lineAt(lineToGo - 1).range;
              activeEditor.selection =  new vscode.Selection(range.start, range.end);
              activeEditor.revealRange(range);
            })

          }
        });