テキストの空白を特定の形式にする必要があるパッケージを作成しています。理由について議論することなく、これが問題のない要件であると仮定しましょう。次に、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 のコマンドをクリーンアップし、必要に応じてフォーマットを含むファイルを復元できます。
もう 1 つの可能性は、Resharper オプション ファイルの場所を見つけて、そのファイルを除外するように何らかの方法で更新した場合です。私はこれが手動で可能であることを知っています。