在vs代码工作区中保存文件时,如何获取新修改的行的行号?

问题描述

我正在开发vs代码扩展。 我正在尝试找到VS Code Extension API或任何其他方式来告知新修改的行的行号 用户添加/更新的内容保存在vscode工作区的文件中。

例如:如果在VSCode工作空间中打开Test.js文件,其内容如下:

export class **ApP** {
  constructor() {
    this.html = "<h1>DomSanitizer</h1><script>attackerCode()</script>"
  }
}

然后用户内容修改为如下所示并保存:

export class **Application** {
  constructor() {
    this.html = "<h1>DomSanitizer</h1><script>attackerCode()</script>"
  }
}

是否有任何方法可以获取修改的行号?例如:在以上示例中,App被修改为Application, 因此输出应为行号1。

解决方法

您可以使用onDidChangeTextDocument事件。在vscode.workspace中:

https://code.visualstudio.com/api/references/vscode-api#workspace


发送到回调的事件参数称为TextDocumentChangeEvent:

https://code.visualstudio.com/api/references/vscode-api#TextDocumentChangeEvent

此事件包含已更改的TextDocument(请参见文章底部)和一个TextDocumentContentChangeEvents数组:

https://code.visualstudio.com/api/references/vscode-api#TextDocumentContentChangeEvent

从此数组中可以获取已更改的行号。 TextDocumentContentChangeEvent包含Range类变量,该变量为您提供了更改的行的开始和结束位置。由于您只关心行号,而不关心行中的修改位置,因此只需要使用“开始/结束”“位置”行变量即可。

https://code.visualstudio.com/api/references/vscode-api#Range

https://code.visualstudio.com/api/references/vscode-api#Position


对于保存文本文档时,可以在vscode.workspace中使用onDidSaveTextDocument:

https://code.visualstudio.com/api/references/vscode-api#workspace

这会将TextDocument发送到回调:

https://code.visualstudio.com/api/references/vscode-api#TextDocument