Visual studio 2012 Visual Studio扩展代码完成-多文件数据

Visual studio 2012 Visual Studio扩展代码完成-多文件数据,visual-studio-2012,Visual Studio 2012,我希望在VisualStudio中为自定义语言创建代码完成。我已经有了一些简单编辑器交互的代码,比如语法高亮显示和大括号匹配。现在我想转到代码完成。但我遇到了一个小问题——数据源 就像在C#这样的语言中一样,我在多个文件之间隐式共享代码。这意味着,为了完成一个文件的编码,我需要知道其他文件的内容。更具体地说,虽然我可以简单地遍历项目和项目项并打开文件,但这是一个次优的解决方案。例如,我无法编写用户所做的未保存的完整更改代码。另一方面,我已经做了大量的处理工作,对内容进行词法分析或解析,以满足用户

我希望在VisualStudio中为自定义语言创建代码完成。我已经有了一些简单编辑器交互的代码,比如语法高亮显示和大括号匹配。现在我想转到代码完成。但我遇到了一个小问题——数据源

就像在C#这样的语言中一样,我在多个文件之间隐式共享代码。这意味着,为了完成一个文件的编码,我需要知道其他文件的内容。更具体地说,虽然我可以简单地遍历项目和项目项并打开文件,但这是一个次优的解决方案。例如,我无法编写用户所做的未保存的完整更改代码。另一方面,我已经做了大量的处理工作,对内容进行词法分析或解析,以满足用户对语法突出显示等的要求,我不想重复这项工作


如何访问项目中其他文件的内容,并获取它们的ITextBuffers,以便重新使用我已经完成的工作?

没有为磁盘上存在但当前未在Visual Studio中打开的文件提供
ITextBuffer
。使用
ITextDocumentFactoryService::CreateAndLoadDocument
可以为任意文件创建
ITextBuffer
的实例。这将获取一个字符串并返回一个
ITextDocument
实例,您可以从该实例访问
ITextBuffer

要查找当前打开的文件的现有
ITextBuffer
,可以执行以下操作

  • IVsRunningDocumentTable::FindDocument
    这将获取一个文件路径,并返回表示当前打开的文件的cookie()
  • IVsRunningDocumentTable::GetDocumentInfo
    这将获取一个cookie并返回一个
    IVsTextLines
    实例()
  • IVSEditorAdapterFactoryService::GetDataBuffer
    获取一个
    IVsTextLines
    并返回一个
    ITextBuffer
    ()

如果我为未打开的文件创建自己的文本缓冲区,如果用户试图打开它们,IDE会重复使用它们吗?另外,我正在查看IVsRunningDocumentTable的文档,界面也不太类似。例如,我只能从GetDocumentInfo获取IVsHierarchy。@DeadMG我添加了示例代码的链接,该代码向您展示了如何从
GetDocumentInfo
获取
IVsTextLine
实例。我正在快速打字,但忘了它是作为
对象
存储在该结构上的,而不是
IVsTextLines
,需要一些施法魔法。@DeadMG第一个问题没有。如果您调用
CreateAndLoadDocument
VS将不会连接现有的
ITextBuffer
,如果它将来打开该文件。您将不得不放下它,然后简单地重新加载它。是的,这样做一点也不好玩(啊,事实上,问题的很大一部分似乎是你的意思,而不是。