Visual studio code 如何捕获为VSCode扩展api添加/删除/修改的行

Visual studio code 如何捕获为VSCode扩展api添加/删除/修改的行,visual-studio-code,vscode-extensions,Visual Studio Code,Vscode Extensions,我正在开发VS代码的扩展,我需要捕获在编辑器中添加/删除的行。基本上我的问题是。我已经为一个打开的文档创建了一个诊断集合,比如第5行,位置2。 当用户编辑文本文档(例如添加了一行)时,位置会发生变化。但问题中显示的诊断数据仍然指向旧的第5行。 解决这个问题的方法是什么?我们认为是否有可能捕获编辑器中添加/删除的行事件并更新行号 vscode.workspace.onDidChangeTextDocument(event => { console.log(event); })

我正在开发VS代码的扩展,我需要捕获在编辑器中添加/删除的行。基本上我的问题是。我已经为一个打开的文档创建了一个诊断集合,比如第5行,位置2。

当用户编辑文本文档(例如添加了一行)时,位置会发生变化。但问题中显示的诊断数据仍然指向旧的第5行。

解决这个问题的方法是什么?我们认为是否有可能捕获编辑器中添加/删除的行事件并更新行号

  vscode.workspace.onDidChangeTextDocument(event => {
    console.log(event);
  })
当任何
TextDocument
发生更改(而不仅仅是保存)时,都将触发。不过,它是在逐个字符的基础上进行的(粘贴/删除操作除外,这些操作会同时发生)

事件
对象中有您正在查找的信息,如

event.document.filename
//更改了哪个文档

event.contentChanges
//一组更改

您可以从中获得对文档所做的实际更改以及以下内容

event.contentChanges[0]。range.start.line
//开始更改的行

删除时,您不会得到被删除的实际文本,而是得到一个空字符串,但您仍然可以得到更改的
范围
——其中有两个
开始
结束
位置,每个位置都有一个行号组件


我想您可以跟踪这些更改,如果您想在保存时批量执行这些更改,则只能在
onDidSaveTextDocument(事件)
上执行计算。

当文件内容更改时,请分析并更新报告的问题感谢answer@mark,事件中的数据。contentChanges[0]很奇怪。例如,当数据中有新行按下enter键时,我得到的是范围长度:0,偏移量:462范围数据开始行:26,位置:1,结束:26,位置:1开始和结束完全相同,而且,当我复制并粘贴3行代码时,我得到的是范围长度:0,偏移量:464范围数据开始行:27,位置:1,结束:27,位置:1,单行:在这两种情况下都正确,我有相同的开始和结束,这里的任何建议我认为这些是正确的结果。
范围是进行更改的范围。因此,如果未选择任何内容,则不存在
范围。长度
,但
开始
结束
将是dicument中完全相同的点。尝试选择行中的最后一个单词,然后插入换行符,然后,您将获得一个range.length和start/end,该值由替换发生的位置(所选文本)确定。粘贴文本时(如果未选择任何替换内容),则再次选择
范围。length
应为
0
开始/结束位置为插入点。如果您在插入后也得到了结果,那就太好了,但是您没有,而是直接获得了有关更改的信息,而不是结果文档。但是,通过检查插入的内容,您可以确定是否有新行,在W10上,我在报告的
文本中看到了literal
\r\n
(在Mac/linux上可能不同)
-因此您可以从
开始.line
确定添加了多少行。一个想法是执行
事件。contentChanges[n].text
信息并运行
字符串。将
或类似内容与
textDocument.getText()
匹配,以计算插入索引+端点插入长度,并使用
textDocument.positionAt()将其转换为
位置
-由于这是在添加/删除每个字符时发生的,或者在粘贴/剪切文件时发生的,如果文件很长,则必须查看性能。就这个主意吧……谢谢,这似乎是个好建议。