1

我正在创建一个要求文本空格采用特定格式的包。无需争论为什么让我们假设这是一个可以的要求。然后我必须阻止 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 选项文件的位置并以某种方式对其进行更新以排除所述文件。我知道这是手动可能的。

4

0 回答 0