我正在创建一个包,要求文本空格为特定格式。没有争论为什么让我们假设这是一个好的要求。然后我必须阻止visual studio自动更新代码。
从打开的文档中可以很容易地添加命令过滤器并使用以下代码阻止执行该命令。
[Export(typeof(IVsTextViewCreationListener))]
internal sealed class MyListener : IVsTextViewCreationListener
{
public void VsTextViewCreated(IVsTextView textViewAdapter)
{
var filter = PackageManager.Kernel.Get<CommandFilter>();
if (ErrorHandler.Succeeded(textViewAdapter.AddCommandFilter(filter,out var next)))
filter.Next = next;
}
}
public class CommandFilter : IOleCommandTarget
{
public IOleCommandTarget Next { get; set; }
public const uint CmdEditFormat = 0x8F;
public int QueryStatus(ref Guid pguidCmdGroup, uint cCmds, OLECMD[] prgCmds, IntPtr pCmdText)
{
switch (prgCmds[0].cmdID)
{
case CmdEditFormat:
return VSConstants.E_ABORT;
return Next.QueryStatus(ref pguidCmdGroup, cCmds, prgCmds, pCmdText);
}
}
我根据需要阻止Edit.FormatDocument命令ID。我还可以添加Edit.FormatSelection或任何其他可能影响空白区域的命令。对于打开的文档来说,这一切都很好,我特别需要这些文档。
然而,当涉及像Resharper这样的加载项时,它们以多种方式更新文件而不实际打开文件本身就会出现问题。一旦我发现哪些命令对我的实现是易失性的,我还需要阻止其中的一些命令。
所以问题是我可以在应用程序范围内设置某种类型的CommandFilter,以便我可以在行为中捕获它们吗?这将允许我清理Resharper命令,然后根据需要恢复包含格式的文件。
另一种可能性是,如果我能找到Resharper选项文件的位置并以某种方式更新它以排除所述文件。我知道这是手动的。