51

我在XAML开发中将宏广泛用于 ViewModel 属性。我在WCF中更多地使用它们来生成 Message 和 DataContract 属性。

令我失望的是,我构建的宏无法在 Visual Studio 2012 中使用。

我正在谈论的一个例子,对于一个虚拟机,我会输入这样的东西。

int id;
string name;

选择这两行,运行宏并最终得到

private int _id;
private string _name;

public int Id
{
   get {return _id;}
   set
   {
      if(_id != value)
      {
        _id = value;
        RaisePropertyChanged("Id");
      }
}

public string Name
{
   if(_name != value)
   {
      _name = value;
      RaisePropertyChanged("Name");
   }
}

我正在寻找其他解决方案的想法来处理丢失的宏。

4

10 回答 10

65

宏的最简单替代方法是创建插件。我知道,我知道,我也不对此感到兴奋,但实际上它非常容易。它有三个简单的部分:

  1. 创建宏项目,逐步完成向导 UI。
  2. 编写你的代码。
  3. 将宏的 .addin 和 .dll 文件复制到 Visual StudioAddins目录。

让我们使用我编写的一个简单宏来显示关闭解决方案后的起始页并将其转换为加载项。

创建宏项目

  • 运行 VS 2012 并创建一个新项目。
  • 转到 Templates > Other Project Types > Extensibility 并选择Visual Studio Add-in
  • 给它一个名称,例如 ShowStartPage。
  • 单击确定。这将打开加载项向导。
  • 逐步完成向导,选择:
    • 编程语言:我们将使用 C#
    • 应用主机:应选择VS 2012
    • 加载项的名称和说明
    • 在加载项选项页面上,仅选中第二个选项(“我希望我的加载项在主机应用程序启动时加载”)
    • 暂时跳过关于框的内容,然后单击完成。

现在您有一个加载项项目。这是你用它做的事情:

编写代码

打开Connect.cs文件。(它可能已经打开。一些“DTE”的东西应该看起来很熟悉。)

在类级别添加此代码:

SolutionEvents solutionEvents;

将此代码添加到OnConnection方法中,就在以下_addInInstance = (AddIn)addInInst;行之后:

solutionEvents = _applicationObject.Events.SolutionEvents;

solutionEvents.AfterClosing += () =>
{
    _applicationObject.ExecuteCommand("View.StartPage");
};

点击“运行”按钮来测试你的代码。一个新的 Visual Studio 2012 实例启动,加载项加载。现在测试加载项并确保它可以正常工作。(打开一个解决方案,然后将其关闭;当您这样做时,起始页应该会返回。)

部署它

一旦加载项工作,要定期将其与 Visual Studio 2012 一起使用,您只需部署两个文件:

  • ShowStartPage.AddIn(来自您的主项目目录)
  • ShowStartPage.dll(来自项目的构建目录;例如 bin\Debug 或 bin\Release)

将这两个文件放在您的 VS 2012 插件目录中,可能位于此处:

C:\Users\[your user name]\Documents\Visual Studio 2012\Addins

然后退出并重新启动 Visual Studio,您应该会看到加载项正常工作。当您转到“工具”>“加载项管理器”时,您还应该看到它列出。

虽然这比仅仅打开宏编辑器并在其中粘贴宏代码有点麻烦,但它确实具有您可以使用任何您想要的语言的优点,而不是被有点片状的类似 VB 的编辑器困在Visual Studio 的过去版本。

于 2012-09-12T19:28:56.707 回答
12

我会坚持将文本剪切成Notepad++并在那里使用宏,然后再粘贴回来。遗憾的是,该功能不再出现在 Visual Studio 2012 中......

于 2012-11-01T17:31:34.170 回答
12

Visual Commander扩展(由我开发)是 Visual Studio 2012/2013/2015 中宏的替代品。您甚至可以在新的 VB 命令中重用现有的 Visual Studio 宏代码。

于 2013-09-19T07:10:17.017 回答
5

Visual Studio有一个加载项VSScript,它替换了缺少的宏功能。虽然它不使用 Visual Basic,但使用Lua脚本语言,您可能想尝试一下。

有一个记录器、带有 IntelliSense 的宏代码编辑器窗口和一个简单的调试器。该加载项还支持早期版本的 Visual Studio,因此如果您更喜欢 Lua 语言而不是 Visual Basic,则可以使用它来代替原始的 Visual Studio 宏。

于 2012-12-08T20:30:24.967 回答
3

I was very sad to see Macros go too. You can get close with substitutions using the regular expression search and replace inside of Visual Studio 2012. In your case:

Find:

(.*) (.*);

Replace with:

private $1 _$2;\npublic $1 $2\n{\n  get {return _$2;}\n  set\n  {\n    if(_$2 = value;\n    RaisePropertyChanged("$2");\n  }\n}\n

That will get you everything except capitalization of property names which Macros would be better for.

But one advantage of the regular expression approach is when the input isn't as simple (e.g. database table DDL statements).

Here are a couple of useful links from MSDN:

Substitutions in Regular Expressions

Using Regular Expressions in Visual Studio

于 2012-12-27T17:58:55.050 回答
2

我将 Notepad++ 与这样的正则表达式一起使用:

寻找:

public (.\*) (.)(.*) \\{ get; set; \\}

代替:

private \1 \l(\2)\3; \r\n public \1 \2\3 \\{ get \\{ return \l(\2)\3; \\} \r\n set \\{ \l(\2)\3 = value; OnPropertyChanged\(para => this\.\2\3\); \\}\\}
于 2012-12-21T02:54:31.903 回答
1

Visual Studio 2012 缺少宏让我很失望,因为我有一些宏,我一直使用它来通过单个按键插入标准的小段文本。因此,我编写了一个非常简单的脚本扩展包VSScripts,它允许从命令行程序操作当前选择。

这并不声称是对旧宏系统的全面替代,并且它不提供键盘宏,但它确实可以重新创建多种类型的文本操作宏。

于 2013-04-08T23:52:13.580 回答
1

查看http://devexpress.com/coderush

模板功能几乎可以满足您的需求。

还有一个免费的“Express”版本。

于 2012-08-22T11:31:02.910 回答
1

这是我为保持宏功能所做的事情......

  1. 在此处下载并安装 Visual Studio 2012 SDK (它包含“Visual Studio 包”模板)
  2. 新项目 -> Installed.Templates.Visual C#.Extensibility.Visual Studio 包

    向导第 1 页,共 7 页

    language = C#
    gen new key is fine, or use another if you have one
    

    向导第 3 页,共 7 页

    check "menu command"
    

    向导第 7 页,共 7 页

    uncheck both integration and unit test project options
    

    点击完成

  3. 在 .cs 文件中:

    using EnvDTE;
    using EnvDTE80;
    
    ...
    private void MenuItemCallback(object sender, EventArgs e)
    {
        MenuCommand cmd = sender as MenuCommand;
    
        // This should start to look like familiar macro code...
        EnvDTE80.DTE2 dte2 = Package.GetGlobalService(typeof(EnvDTE.DTE)) as DTE2;
        TextSelection selection = (TextSelection)dte2.ActiveDocument.Selection;
    
        dte2.UndoContext.Open("macro command replacement");
        selection.Text = "inserted from macro replacement";
        selection.NewLine(1);
        dte2.UndoContext.Close();
        ...
    
  4. 运行项目。一个新的 Visual Studio 实例将从加载的包开始。
  5. 在“工具”菜单顶部找到您的命令作为第一个条目。单击它以查看它是否有效。
  6. 要真正安装,请转到您的 bin\debug(/release) 目录并双击 .vsix 文件
  7. 下次运行时应该安装它
  8. 转到菜单工具->选项... -> environment.keyboard 并将击键映射到您的工具

    Mapping theme : Visual C# 2005
    Command       : Tool.yourFunctionName (functions defined in the .vsct file)
    

如果您需要多个命令,则需要在 PkgCmdID.cs 中添加菜单 id,在 Guids.cs 中添加 Guids,在 .vsct 中添加布局以及在 *package.cs 中添加一个函数(以及在初始化函数)为每一个。这一切都可以在同一个项目中完成。

我用这个项目用我的旧宏代码创建了几个新的“工具”,然后将我的键映射到它们。前面还有很多工作(和头痛),但没有宏所具有的滞后时间。

可能有一种方法可以在不占用工具菜单的情况下做到这一点。我昨晚开始看这个,终于让它工作了,所以我现在已经完成了(至少在微软决定放弃它之前)。

于 2013-07-20T16:02:16.230 回答
0

我个人喜欢这个——Visual Commander扩展允许您在 Visual Studio 中自动执行重复性任务。

于 2016-03-17T07:44:00.447 回答