草庐IT

c# - 以编程方式重置 VisualStudio 快捷方式

coder 2024-05-25 原文

关于resetting VisualStudio keyboard scheme有两个相关问题和 importing VisualStudio settings .然而,这似乎并不能很好地结合在一起。

我有两个包含快捷方式的设置文件:

<!-- IntelliJ.vssettings -->   
<ShortcutsScheme>Visual C# 2005</ShortcutsScheme>
<UserShortcuts>
  <Shortcut Command="ReSharper.ReSharper_GotoNextHighlight" Scope="Global">F12</Shortcut>
</UserShortcuts>

<!-- ReSharper.vssettings -->   
<ShortcutsScheme>Visual C# 2005</ShortcutsScheme>
<UserShortcuts>
  <!-- Implicitly has F12 assigned to Edit.GoToDefinition -->
</UserShortcuts>

如您所见,ReSharper.vssettings 并没有真正分配 F12 快捷方式,因为它是 VisualStudio 的默认设置。导入该文件,不会重新应用 ShortcutsScheme,在这两种情况下都是 Visual Studio C# 2005。这反过来导致 F12 继续执行 GotoNextHighlight 命令。仅使用导入对话框时出现同样的问题。

如下使用DTE 重置键盘方案也不起作用:

var property = dte.Properties["Environment", "Keyboard"];
property.Item("SchemeName").Value = "(Default)";

出于同样的原因,导出默认设置不起作用。作为shown here没有快捷方式被导出。

因此问题:如何使用 DTE 以编程方式重置 VisualStudio 键盘方案?

我真正需要的是在 Options | 中触发 Reset 按钮的命令。环境 |键盘对话框。

最佳答案

您可以按照以下方式删除特定的键绑定(bind): Visual Studio key bindings configuration file

不幸的是,我没有 IntelliJ 和 ReSharper 来测试它是否有效。如果确实如此,那么使用 DTE 来执行此操作会很好,但是此解决方案超出了 DTE 的范围,并且使用 System.IO.File 将是微不足道的。

更新:

Question: How can I reset the VisualStudio keyboard scheme programmatically using DTE? What I actually need is the command to trigger the Reset button in Options | Environment | Keyboard dialog.

很遗憾,您不能这样做(据我所知),因为重置键盘快捷键超出了 DTE 的范围。

如果您设置一个名为“ResetKeyBoard”的 VS AddIn 项目并在 Exec 方法上放置一个断点,您将看到当您在“工具选项”窗口中时,DTE 不会捕获任何触发的 Visual Studio 事件,它们根本不会通过 DTE 对象模型公开:

public void Exec(string commandName, vsCommandExecOption executeOption, ref object varIn, ref object varOut, ref bool handled)

这也可以通过录制宏来演示,录制的命令只会深入到打开选项对话框(无论您在内部更改什么设置):

Public Module RecordingModule
    Sub TemporaryMacro()
        DTE.ExecuteCommand("Tools.Options")
    End Sub
End Module

我确实学习了如何直接打开“选项”窗口的“键盘”选项卡,但由于它是一个模态对话框,您甚至不能使用 SendKeys 来按下“重置”按钮:

public void Exec(string commandName, vsCommandExecOption executeOption, ref object varIn, ref object varOut, ref bool handled)
        {
            handled = false;
            if(executeOption == vsCommandExecOption.vsCommandExecOptionDoDefault)
            {
                if(commandName == "ResetKeyBoard.Connect.ResetKeyBoard")
                {
                    _applicationObject.ExecuteCommand("Tools.Options", "BAFF6A1A-0CF2-11D1-8C8D-0000F87570EE");
                    System.Windows.Forms.SendKeys.Send("%e");
                    System.Windows.Forms.SendKeys.Send("{ENTER}");

我尝试的最后一个 DTE 选项(运气不好)是使用 Commands.Raise,同样你不能比打开工具选项更深入,或者至少如果你可以 它未记录 .

public void Exec(string commandName, vsCommandExecOption executeOption, ref object varIn, ref object varOut, ref bool handled)
{
    handled = false;
    if(executeOption == vsCommandExecOption.vsCommandExecOptionDoDefault)
    {
        if(commandName == "ResetKeyBoard.Connect.ResetKeyBoard")
        {
            Commands cmds = _applicationObject.Commands;
            Command cmdobj = cmds.Item("Tools.Options");
            object customIn = null;
            object customOut = null;
            _applicationObject.Commands.Raise(cmdobj.Guid, cmdobj.ID, ref customIn, ref customOut);

解决方法:

a) 我不鼓励您替换 Visual C# 2005.vsk 文件,但是如果您想调查它的这个文件:

C:\Program Files (x86)\Microsoft Visual Studio 1X.0\Common7\IDE\Visual C# 2005.vsk

MSDN Warning

You cannot programmatically change the settings for the default keyboard mapping scheme. To change the settings, save a copy of the default keyboard mapping scheme in the Keyboard node in the Options dialog box. You can then change the settings in that mapping scheme.

我不推荐也不鼓励这种方法,它的编程很糟糕,你可能会破坏某人的键盘快捷键!

b) 另一种方法是创建您自己的 VSK 文件并将其设置在 currentSettings.vssettings 中:

    </ScopeDefinitions>
     <ShortcutsScheme>Visual C# JT</ShortcutsScheme>
    </KeyboardShortcuts>

确保在更改之前备份 currentSettings.vssettings 文件。

c) 这又回到了 Chris Dunaway 的建议,您可以创建一个 vssettings 文件(仅包含键盘快捷键)并将其导入以重置键盘快捷键。我意识到默认的快捷方式没有保存,但是这里有一些代码可以与 DTE 一起使用来导出命令,插入到一个新的 vssettings 文件中,然后导入:

//note, this is untested code!
public void Exec(string commandName, vsCommandExecOption executeOption, ref object varIn, ref object varOut, ref bool handled)
{
    handled = false;
    if(executeOption == vsCommandExecOption.vsCommandExecOptionDoDefault)
    {
        if(commandName == "ResetKeyBoard.Connect.ResetKeyBoard")
        {
            System.Diagnostics.Debug.WriteLine("<UserShortcuts>");
            foreach (Command c in _applicationObject.Commands)
            {
                if (!string.IsNullOrEmpty(c.Name))
                {
                    System.Array bindings = default(System.Array);
                    bindings = (System.Array)c.Bindings;
                    for (int i = 0; i <= bindings.Length - 1; i++)
                    {
                        string scope = string.Empty;
                        string keyShortCut = string.Empty;
                        string[] binding = bindings.GetValue(i).ToString().Split(new string[] {  "::" },StringSplitOptions.RemoveEmptyEntries );
                        scope = binding[0];
                        keyShortCut = binding[1];
                        System.Diagnostics.Debug.WriteLine("<RemoveShortcut Command=\"...\" Scope=\"" + scope + "\">" + keyShortCut + "</RemoveShortcut>");
                        System.Diagnostics.Debug.WriteLine("<Shortcut Command=\"" + c.Name + "\" Scope=\"" + scope + "\">" + keyShortCut + "</Shortcut>");
                    }
                }
            }
            System.Diagnostics.Debug.WriteLine("</UserShortcuts>");

一旦你得到它们,就很容易将它们导入:

_applicationObject.ExecuteCommand("Tools.ImportandExportSettings", "/import:\"KeyboardOnly-Exported-2016-08-29.vssettings\"");

引用资料:

Visual Studio 2005 IDE Tips and Tricks

How to reset visual studio settings to my saved settings with just a single shortcut?

How does one set Visual Studio 2010 keyboard shortcuts comfortably, especially when using ReSharper?

https://superuser.com/questions/914244/is-there-a-quick-way-to-delete-all-shortcuts-in-visual-studio-10

Remove a keyboard shortcut binding in Visual Studio using Macros

http://vswindowmanager.codeplex.com/

Get full list of available commands for DTE.ExecuteCommand

HOWTO: Execute a command by Guid and Id from a Visual Studio package

HOWTO: Execute a command by Guid and Id from a Visual Studio add-in

HOWTO: Pass parameters programmatically to a command from a Visual Studio add-in

最后是 Jared Par 的这首:

https://github.com/jaredpar/VsVim/blob/master/Src/VsVimShared/Extensions.cs

/// <summary>
/// Safely reset the keyboard bindings on this Command to the provided values
/// </summary>
public static void SafeSetBindings(this DteCommand command, IEnumerable<string> commandBindings)
{
    try
    {
        var bindings = commandBindings.Cast<object>().ToArray();
        command.Bindings = bindings;

        // There are certain commands in Visual Studio which simply don't want to have their
        // keyboard bindings removed.  The only way to get them to relinquish control is to
        // ask them to remove the bindings twice.  
        //
        // One example of this is SolutionExplorer.OpenFilesFilter.  It has bindings for both
        // "Ctrl-[, O" and "Ctrl-[, Ctrl-O".  Asking it to remove all bindings will remove one
        // but not both (at least until you restart Visual Studio, then both will be gone).  If
        // we ask it to remove bindings twice though then it will behave as expected.  
        if (bindings.Length == 0 && command.GetBindings().Count() != 0)
        {
            command.Bindings = bindings;
        }
    }
    catch (Exception)
    {
        // Several implementations, Transact SQL in particular, return E_FAIL for this
        // operation.  Simply ignore the failure and continue
    }

关于c# - 以编程方式重置 VisualStudio 快捷方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39043624/

有关c# - 以编程方式重置 VisualStudio 快捷方式的更多相关文章

  1. ruby - 如何以所有可能的方式将字符串拆分为长度最多为 3 的连续子字符串? - 2

    我试图获取一个长度在1到10之间的字符串,并输出将字符串分解为大小为1、2或3的连续子字符串的所有可能方式。例如:输入:123456将整数分割成单个字符,然后继续查找组合。该代码将返回以下所有数组。[1,2,3,4,5,6][12,3,4,5,6][1,23,4,5,6][1,2,34,5,6][1,2,3,45,6][1,2,3,4,56][12,34,5,6][12,3,45,6][12,3,4,56][1,23,45,6][1,2,34,56][1,23,4,56][12,34,56][123,4,5,6][1,234,5,6][1,2,345,6][1,2,3,456][123

  2. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  3. ruby-on-rails - 正确的 Rails 2.1 做事方式 - 2

    question的一些答案关于redirect_to让我想到了其他一些问题。基本上,我正在使用Rails2.1编写博客应用程序。我一直在尝试自己完成大部分工作(因为我对Rails有所了解),但在需要时会引用Internet上的教程和引用资料。我设法让一个简单的博客正常运行,然后我尝试添加评论。靠我自己,我设法让它进入了可以从script/console添加评论的阶段,但我无法让表单正常工作。我遵循的其中一个教程建议在帖子Controller中创建一个“评论”操作,以添加评论。我的问题是:这是“标准”方式吗?我的另一个问题的答案之一似乎暗示应该有一个CommentsController参

  4. ruby - 寻找通过阅读代码确定编程语言的ruby gem? - 2

    几个月前,我读了一篇关于ruby​​gem的博客文章,它可以通过阅读代码本身来确定编程语言。对于我的生活,我不记得博客或gem的名称。谷歌搜索“ruby编程语言猜测”及其变体也无济于事。有人碰巧知道相关gem的名称吗? 最佳答案 是这个吗:http://github.com/chrislo/sourceclassifier/tree/master 关于ruby-寻找通过阅读代码确定编程语言的rubygem?,我们在StackOverflow上找到一个类似的问题:

  5. c# - 如何在 ruby​​ 中调用 C# dll? - 2

    如何在ruby​​中调用C#dll? 最佳答案 我能想到几种可能性:为您的DLL编写(或找人编写)一个COM包装器,如果它还没有,则使用Ruby的WIN32OLE库来调用它;看看RubyCLR,其中一位作者是JohnLam,他继续在Microsoft从事IronRuby方面的工作。(估计不会再维护了,可能不支持.Net2.0以上的版本);正如其他地方已经提到的,看看使用IronRuby,如果这是您的技术选择。有一个主题是here.请注意,最后一篇文章实际上来自JohnLam(看起来像是2009年3月),他似乎很自在地断言RubyCL

  6. C# 到 Ruby sha1 base64 编码 - 2

    我正在尝试在Ruby中复制Convert.ToBase64String()行为。这是我的C#代码:varsha1=newSHA1CryptoServiceProvider();varpasswordBytes=Encoding.UTF8.GetBytes("password");varpasswordHash=sha1.ComputeHash(passwordBytes);returnConvert.ToBase64String(passwordHash);//returns"W6ph5Mm5Pz8GgiULbPgzG37mj9g="当我在Ruby中尝试同样的事情时,我得到了相同sha

  7. 【鸿蒙应用开发系列】- 获取系统设备信息以及版本API兼容调用方式 - 2

    在应用开发中,有时候我们需要获取系统的设备信息,用于数据上报和行为分析。那在鸿蒙系统中,我们应该怎么去获取设备的系统信息呢,比如说获取手机的系统版本号、手机的制造商、手机型号等数据。1、获取方式这里分为两种情况,一种是设备信息的获取,一种是系统信息的获取。1.1、获取设备信息获取设备信息,鸿蒙的SDK包为我们提供了DeviceInfo类,通过该类的一些静态方法,可以获取设备信息,DeviceInfo类的包路径为:ohos.system.DeviceInfo.具体的方法如下:ModifierandTypeMethodDescriptionstatic StringgetAbiList​()Obt

  8. 基于C#实现简易绘图工具【100010177】 - 2

    C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.

  9. 网络编程套接字 - 2

    网络编程套接字网络编程基础知识理解源`IP`地址和目的`IP`地址理解源MAC地址和目的MAC地址认识端口号理解端口号和进程ID理解源端口号和目的端口号认识`TCP`协议认识`UDP`协议网络字节序socket编程接口`sockaddr``UDP`网络程序服务器端代码逻辑:需要用到的接口服务器端代码`udp`客户端代码逻辑`udp`客户端代码`TCP`网络程序服务器代码逻辑多个版本服务器单进程版本多进程版本多线程版本线程池版本服务器端代码客户端代码逻辑客户端代码TCP协议通讯流程TCP协议的客户端/服务器程序流程三次握手(建立连接)数据传输四次挥手(断开连接)TCP和UDP对比网络编程基础知识

  10. ruby - 鸭子输入字符串、符号和数组的优雅方式? - 2

    这是针对我无法破坏的现有公共(public)API,但我确实希望对其进行扩展。目前,该方法采用字符串或符号或任何其他在作为第一个参数传递给send时有意义的内容我想添加发送字符串、符号等列表的功能。我可以只使用is_a吗?数组,但还有其他发送列表的方法,这不是很像ruby​​。我将调用列表中的map,所以第一个倾向是使用respond_to?:map。但是字符串也会响应:map,所以这行不通。 最佳答案 如何将它们全部视为数组?String的行为与仅包含String的Array相同:deffoo(obj,arg)[*arg].eac

随机推荐