【发布时间】:2015-10-04 19:03:28
【问题描述】:
我创建了一个 IVsInvisibleEditor 的实例。我使用以下代码来实现这一点:
public IWpfTextViewHost CreateEditor(string targetFile)
{
var componentModel = (IComponentModel)Microsoft.VisualStudio.Shell.Package.GetGlobalService(typeof(SComponentModel));
var editorAdapter = componentModel.GetService<IVsEditorAdaptersFactoryService>();
var editorFactoryService = componentModel.GetService<ITextEditorFactoryService>();
var invisibleEditorManager = (IVsInvisibleEditorManager)Microsoft.VisualStudio.Shell.Package.GetGlobalService(typeof(SVsInvisibleEditorManager));
IVsInvisibleEditor invisibleEditor;
ErrorHandler.ThrowOnFailure(invisibleEditorManager.RegisterInvisibleEditor(
targetFile,
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));
//Create a code window adapter
IVsTextLines docData = (IVsTextLines)Marshal.GetObjectForIUnknown(docDataPointer);
var codeWindow = editorAdapter.CreateVsCodeWindowAdapter(VisualStudioServices.OLEServiceProvider);
ErrorHandler.ThrowOnFailure(codeWindow.SetBuffer(docData));
IVsTextView textView;
ErrorHandler.ThrowOnFailure(codeWindow.GetPrimaryView(out textView));
var userData = (IVsUserData)codeWindow;
var uniqueMoniker = Guid.NewGuid().ToString();
Guid bufferMonikerGuid = typeof(IVsUserData).GUID;
userData.SetData(ref bufferMonikerGuid, uniqueMoniker);
var guid = VSConstants.VsTextBufferUserDataGuid.VsTextViewRoles_guid;
userData.SetData(ref guid, editorFactoryService.CreateTextViewRoleSet(editorFactoryService.DefaultRoles).ToString());
var host = editorAdapter.GetWpfTextViewHost(textView);
host.TextView.Options.SetOptionValue(DefaultTextViewHostOptions.ZoomControlId, false);
return host;
}
一切正常,除了没有语法突出显示,例如,如果我使用 C# (.cs) 文件在不可见的编辑器中显示。经过一番研究,我发现我还需要向 RDT 添加一个文档,我使用以下函数完成了该操作:
uint RegisterDocument(string targetFile)
{
//Then when creating the IVsInvisibleEditor, find and lock the document
uint itemID;
IntPtr docData;
uint docCookie;
IVsHierarchy hierarchy;
var runningDocTable = (IVsRunningDocumentTable)Microsoft.VisualStudio.Shell.Package.GetGlobalService(typeof(SVsRunningDocumentTable));
var result = runningDocTable.FindAndLockDocument(
dwRDTLockType: (uint)_VSRDTFLAGS.RDT_EditLock,
pszMkDocument: targetFile,
ppHier: out hierarchy,
pitemid: out itemID,
ppunkDocData: out docData,
pdwCookie: out docCookie);
return docCookie;
}
现在,如果我显示 C# 文件,则会显示高亮显示(并且 intelisense 也有效),但如果我显示一个 sql 文件,那么我再一次没有语法高亮显示。现在,我进一步调查并意识到也许我应该在文档上附加一个语言服务,所以我使用以下代码来实现:
Guid sqlGuid = LanguageServices.Guids.TSQL;
docData.SetLanguageServiceID(ref sqlGuid);
瞧,它有效,现在语法高亮也适用于 sql 文件,但现在我有另一个问题,sql 文件的多视图不起作用。例如,如果我有一个文件 MyQuery.sql 并且我用隐形编辑器打开它,它将被打开,语法将显示并且一切都按预期工作,但是现在,如果我尝试打开同一个文件(而隐形编辑器是仍然打开)然后我收到以下消息:
我相信在使用 sql 文件时,使用 RDT 的东西是不行的,似乎当没有附加语言服务时,添加到 RDT 会被某种方式忽略,这很奇怪,因为相同的代码适用于 C# 文件。有没有其他方法可以使用隐形编辑器打开特定文件(可以是任何类型),我错过了什么吗?
【问题讨论】:
标签: c# visual-studio mef