Visual studio code 如何捕获为VSCode扩展api添加/删除/修改的行
我正在开发VS代码的扩展,我需要捕获在编辑器中添加/删除的行。基本上我的问题是。我已经为一个打开的文档创建了一个诊断集合,比如第5行,位置2。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); })
当用户编辑文本文档(例如添加了一行)时,位置会发生变化。但问题中显示的诊断数据仍然指向旧的第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()将其转换为位置
-由于这是在添加/删除每个字符时发生的,或者在粘贴/剪切文件时发生的,如果文件很长,则必须查看性能。就这个主意吧……谢谢,这似乎是个好建议。