将语法突出显示添加到IElisonBuffer

乔什·瓦蒂

我正在一个项目中,在该项目中,我们将C#代码分解为函数,并将这些函数存储在IElisonBuffers中我已经连接了Intellisense,并且缓冲区可以与其他扩展交互,如下所示:

在此处输入图片说明

但是,我无法使语法高亮显示在这些编辑器中。

我通过以下步骤嵌入了这些编辑器:

  1. IVsInvisibleEditor为文件创建一个
  2. 获取IVsTextLinesIVsInvisibleEditor
  3. 创建IVsCodeWindow和设置缓冲区这IVsCodeWindowIVsTextLinesIVsInvisibleEditor
  4. IWpfTextViewHost从此代码窗口获取一个这使我回到“ WPF Land”,在那里我可以与传统跨度进行交互。
  5. 创建IWpfTextViewHost的文本视图的SnapshotSpan 该SnapshotSpan包含一个功能。
  6. 创建一个IElisionBuffer包含SnapshotSpan的对象。
  7. 创建IVsTextBuffer通过IVsEditorAdaptersFactoryService.CreateVsTextBufferAdapterForSecondaryBuffer()传入IElisionBuffer
  8. 现在,我将转换IVsTextBufferIVsTextLinesSetLanguageServiceID()通过C#GUID调用传递:694DD9B6-B865-4C5B-AD85-86356E9C88DC。
  9. 我再次检查它是否通过正确设置GetLanguageServiceID(),一切看起来都还不错。
  10. 我创建一个IVsTextView,并使用new对其进行初始化IVsTextBuffer
  11. 然后我得到IWpfTextViewHost这个IVsTextView

为IElisionBuffer设置语言服务ID时,是否需要采取任何特殊措施?

为了完整起见,这是我正在使用的代码:

public CustomEditorViewModel CreateEditor(string filePath, int start, int end) {

IVsInvisibleEditor invisibleEditor;
ErrorHandler.ThrowOnFailure(this._InvisibleEditorManager.RegisterInvisibleEditor(
    filePath
    , pProject: null
    , dwFlags: (uint)_EDITORREGFLAGS.RIEF_ENABLECACHING
    , pFactory: null
    , ppEditor: out invisibleEditor));

var docDataPointer = IntPtr.Zero;
Guid guidIVsTextLines = typeof(IVsTextLines).GUID;

ErrorHandler.ThrowOnFailure(
  invisibleEditor.GetDocData(
  fEnsureWritable: 1
  , riid: ref guidIVsTextLines
  , ppDocData: out docDataPointer));

IVsTextLines docData = (IVsTextLines)Marshal.GetObjectForIUnknown(docDataPointer);

//Createa a code window adapter
var codeWindow = _EditorAdapterFactory.CreateVsCodeWindowAdapter(VisualStudioServices.OLEServiceProvider);

//Associate our IVsTextLines with our new code window
ErrorHandler.ThrowOnFailure(codeWindow.SetBuffer(docData));

//Get our text view for our editor which we will use to get the WPF control that hosts that editor.
IVsTextView textView;
ErrorHandler.ThrowOnFailure(codeWindow.GetPrimaryView(out textView));

//This is our TextViewHost
//It transports us back into the land of WPF 
IWpfTextViewHost textViewHost = _EditorAdapterFactory.GetWpfTextViewHost(textView);

  //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  //Now we need to subset TextBuffer somehow... 
  //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
int length = end - start;
SnapshotSpan subsetSnapshot = new SnapshotSpan(textViewHost.TextView.TextSnapshot, start, length);

var CSharpType = _contentTypeRegistry.GetContentType("CSharp");

var projBuffer = _ProjectionBufferFactory.CreateElisionBuffer(
  null
  , new NormalizedSnapshotSpanCollection(subsetSnapshot)
  , ElisionBufferOptions.None
  ,CSharpType);

IVsTextBuffer bufferAdapter = _EditorAdapterFactory.CreateVsTextBufferAdapterForSecondaryBuffer(VisualStudioServices.OLEServiceProvider, projBuffer);

//My attempt at getting syntax coloring to work:
Guid CSharpLanguageServiceId = new Guid("694DD9B6-B865-4C5B-AD85-86356E9C88DC");
IVsTextLines buffer = (IVsTextLines)bufferAdapter;
buffer.SetLanguageServiceID(ref CSharpLanguageServiceId);


IVsTextView projTextView = _EditorAdapterFactory.CreateVsTextViewAdapter(VisualStudioServices.OLEServiceProvider);

projTextView.Initialize(
            (IVsTextLines)bufferAdapter
            , IntPtr.Zero
            , (uint)TextViewInitFlags.VIF_HSCROLL | (uint)TextViewInitFlags.VIF_VSCROLL | (uint)TextViewInitFlags3.VIF_NO_HWND_SUPPORT,
                    new[] { new INITVIEW { fSelectionMargin = 0, fWidgetMargin = 0, fVirtualSpace = 0, fDragDropMove = 0 } }
                );


 return _EditorAdapterFactory.GetWpfTextViewHost(projTextView);
}
杰森·马林诺夫斯基(Jason Malinowski)

使省略缓冲区的内容类型为内容类型“ projection”或从其派生。这就是标记者应该通过它进行投射的暗示。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

突出显示/将类添加到活动 div

来自分类Dev

动态突出显示时将项目符号点添加到<p>吗?

来自分类Dev

将TODO单词突出显示添加到atom编辑器

来自分类Dev

AngularJS-如何突出显示/将类添加到最大值

来自分类Dev

将事件添加到日历上的特定日期并希望突出显示该日期

来自分类Dev

Bootstrap Datepicker:如何将课程(例如“活动月份”)添加到我要突出显示的特定月份

来自分类Dev

如何将打印命令添加到DCG语法

来自分类Dev

Roslyn:将using语句添加到语法树

来自分类Dev

使用多行语法将路径添加到PATH

来自分类Dev

C ++语法:将新向量添加到列表

来自分类Dev

Javascript将元素添加到DOM语法问题

来自分类Dev

在JS中将标签添加到突出显示的文本不起作用

来自分类Dev

回复收件箱中突出显示的电子邮件,将密件抄送添加到特定的电子邮件中,并直接回复特定的电子邮件

来自分类Dev

如果选择/突出显示了父项,那么如何使用jsTree将新项添加到现有父项的子组中?

来自分类Dev

回复收件箱中突出显示的电子邮件,将密件抄送添加到特定电子邮件中,并直接回复特定电子邮件

来自分类Dev

GDB:将堆栈内容添加到自动显示

来自分类Dev

将动态行添加到ngTable中不显示

来自分类Dev

将列添加到Powershell显示输出

来自分类Dev

将UIViewcontroller的视图添加到UIWindow不会显示

来自分类Dev

将childViewController添加到MvxTabBarViewController不显示视图

来自分类Dev

PHP将新字段添加到数组并显示

来自分类Dev

将动态行添加到ngTable中不显示

来自分类Dev

将值添加到多值字段并显示它们

来自分类Dev

无法将虚拟显示添加到Xorg

来自分类Dev

将 nil 添加到 tableHeaderView 时无法再次显示

来自分类Dev

将记录添加到商店并显示在网格上

来自分类Dev

如何将Pascal语法着色添加到Xcode 5?

来自分类Dev

使用字符串作为语法将变量添加到data.frame

来自分类Dev

将data-tooltip添加到简单的表单语法中?

Related 相关文章

  1. 1

    突出显示/将类添加到活动 div

  2. 2

    动态突出显示时将项目符号点添加到<p>吗?

  3. 3

    将TODO单词突出显示添加到atom编辑器

  4. 4

    AngularJS-如何突出显示/将类添加到最大值

  5. 5

    将事件添加到日历上的特定日期并希望突出显示该日期

  6. 6

    Bootstrap Datepicker:如何将课程(例如“活动月份”)添加到我要突出显示的特定月份

  7. 7

    如何将打印命令添加到DCG语法

  8. 8

    Roslyn:将using语句添加到语法树

  9. 9

    使用多行语法将路径添加到PATH

  10. 10

    C ++语法:将新向量添加到列表

  11. 11

    Javascript将元素添加到DOM语法问题

  12. 12

    在JS中将标签添加到突出显示的文本不起作用

  13. 13

    回复收件箱中突出显示的电子邮件,将密件抄送添加到特定的电子邮件中,并直接回复特定的电子邮件

  14. 14

    如果选择/突出显示了父项,那么如何使用jsTree将新项添加到现有父项的子组中?

  15. 15

    回复收件箱中突出显示的电子邮件,将密件抄送添加到特定电子邮件中,并直接回复特定电子邮件

  16. 16

    GDB:将堆栈内容添加到自动显示

  17. 17

    将动态行添加到ngTable中不显示

  18. 18

    将列添加到Powershell显示输出

  19. 19

    将UIViewcontroller的视图添加到UIWindow不会显示

  20. 20

    将childViewController添加到MvxTabBarViewController不显示视图

  21. 21

    PHP将新字段添加到数组并显示

  22. 22

    将动态行添加到ngTable中不显示

  23. 23

    将值添加到多值字段并显示它们

  24. 24

    无法将虚拟显示添加到Xorg

  25. 25

    将 nil 添加到 tableHeaderView 时无法再次显示

  26. 26

    将记录添加到商店并显示在网格上

  27. 27

    如何将Pascal语法着色添加到Xcode 5?

  28. 28

    使用字符串作为语法将变量添加到data.frame

  29. 29

    将data-tooltip添加到简单的表单语法中?

热门标签

归档