Alternativa para macros no Visual Studio 2012

Eu uso macros extensivamente para propriedades ViewModel no desenvolvimento de XAML . Eu os uso ainda mais no WCF para gerar propriedades Message e DataContract.

Para minha decepção, as macros que criei não serão utilizáveis ​​no Visual Studio 2012.

Um exemplo do que estou falando, para uma VM, eu poderia inserir algo assim.

int id; string name; 

Selecione as duas linhas, execute uma macro e termine

 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"); } } 

Eu estou procurando idéias de outras soluções lidar com macros perdidas.

A alternativa mais simples para macros é criar suplementos . Eu sei, eu sei, eu também não fiquei animada, mas na verdade é surpreendentemente fácil. Existem três partes simples para isso:

  1. Crie o projeto de macro, percorrendo uma interface do usuário do assistente.
  2. Escreva seu código.
  3. Copie os arquivos .addin e .dll da macro para o diretório Addins Visual Studio.

Vamos pegar uma macro simples que escrevi para mostrar a Página inicial depois de fechar uma solução e transformá-la em um suplemento.

Crie o projeto de macro

  • Execute o VS 2012 e crie um novo projeto.
  • Vá para Modelos> Outros tipos de projeto> Extensibilidade e selecione Visual Studio Add-in .
  • Dê um nome a ele, como ShowStartPage.
  • Clique OK. Isso traz o Assistente de suplemento.
  • Percorra o assistente, escolhendo:
    • Linguagem de programação: usaremos o C #
    • Host do aplicativo: o VS 2012 deve ser selecionado
    • Nome e descrição do seu suplemento
    • Na página de opções do suplemento, marque apenas a segunda opção (“Eu gostaria que meu suplemento fosse carregado quando o aplicativo host fosse iniciado”)
    • Ignore o material do About Box por enquanto e clique em Finish.

Agora você tem um projeto de suplemento. Veja o que você faz com isso:

Escreva o código

Abra o arquivo Connect.cs . (Pode já estar aberto. Algumas das coisas “DTE” devem parecer familiares.)

Adicione este código no nível de class:

 SolutionEvents solutionEvents; 

Adicione esse código ao método OnConnection , logo após o _addInInstance = (AddIn)addInInst; linha:

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

Clique no botão “Executar” para testar seu código. Uma nova instância do Visual Studio 2012 é inicializada, com o seu suplemento carregado. Agora teste o suplemento e verifique se ele funciona. (Abra uma solução e feche-a; a Página Inicial deve retornar quando você fizer isso.)

Implante-o

Depois que o suplemento funcionar, para usá-lo regularmente com o Visual Studio 2012, você só precisará implantar dois arquivos:

  • ShowStartPage.AddIn (do seu diretório principal do projeto)
  • ShowStartPage.dll (do diretório de compilation do seu projeto; por exemplo, bin \ Debug or bin \ Release)

Coloque esses dois arquivos em seu diretório de suplementos do VS 2012, provavelmente localizado aqui:

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

Em seguida, saia e reinicie o Visual Studio, e você deve ver o seu suplemento funcionando. Você também deve vê-lo listado quando você vai para Ferramentas> Gerenciador de suplementos.

Embora isso seja um pouco mais incómodo do que simplesmente abrir o editor de macro e inserir seu código de macro lá, ele tem a vantagem de poder usar qualquer idioma desejado, em vez de ficar preso ao editor parecido com o VB versões anteriores do Visual Studio.

A extensão Visual Commander (desenvolvida por mim) é uma alternativa para macros no Visual Studio 2012/2013/2015. Você pode até mesmo reutilizar seu código de macros existente do Visual Studio em novos comandos do VB.

Vou continuar cortando o texto no Notepad ++ e usando macros lá, depois colando de volta. É uma pena que o recurso não esteja mais no Visual Studio 2012 …

Existe um suplemento, VSScript , para o Visual Studio, que substitui a funcionalidade de macros perdidas. Embora não use o Visual Basic, mas a linguagem de script Lua , convém testá-lo.

Há um gravador, janela do editor de código de macro com o IntelliSense e um depurador simples. O suplemento também oferece suporte a versões anteriores do Visual Studio, portanto, se você preferir a linguagem Lua em vez do Visual Basic, poderá usá-la em vez de macros originais do Visual Studio.

Fiquei muito triste em ver Macros ir também. Você pode chegar perto das substituições usando a pesquisa de expressão regular e replace dentro do Visual Studio 2012. No seu caso:

Encontrar:

 (.*) (.*); 

Substituir com:

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

Isso vai te dar tudo, exceto a capitalização de nomes de propriedades para os quais Macros seria melhor.

Mas uma vantagem da abordagem de expressão regular é quando a input não é tão simples (por exemplo, instruções DDL da tabela de database).

Aqui estão alguns links úteis do MSDN:

Substituições em expressões regulares

Usando expressões regulares no Visual Studio

Eu uso o Notepad ++ com expressões regulares como esta:

Encontrar:

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

Substituir:

 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\); \\}\\} 

Confira http://devexpress.com/coderush

O recurso de modelos faz praticamente o que você deseja.

Há uma versão gratuita “Express” também.

A falta de macros do Visual Studio 2012 estava me deixando para baixo, já que tenho algumas que uso literalmente o tempo todo para inserir pequenos trechos de texto padrão com um único pressionamento de tecla. Então eu escrevi um pacote de extensibilidade de scripts muito simples, o VSScripts , que permite a manipulação da seleção atual de um programa de linha de comando.

Isso não pretende ser uma substituição total abrangente para o antigo sistema de macro e não fornece macros de teclado, mas permite recriar muitos tipos de macro de manipulação de texto.

Veja o que fiz para manter minha funcionalidade macro …

  1. Baixe e instale o Visual Studio 2012 SDK aqui (ele contém o modelo “Pacote do Visual Studio”)
  2. Novo projeto -> Installed.Templates.Visual C # .Extensibility.Visual Studio Package

    Página do assistente 1 de 7

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

    assistente página 3 de 7

     check "menu command" 

    Página do Assistente 7 de 7

     uncheck both integration and unit test project options 

    Clique final

  3. No arquivo .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. Execute o projeto. Uma nova instância do Visual Studio será iniciada com o pacote carregado.
  5. Encontre o seu comando como a primeira input no topo do menu Ferramentas. Clique para ver se funciona.
  6. Para instalar de verdade, vá para o diretório bin \ debug (/ release) e dê um duplo clique no arquivo .vsix
  7. Ele deve ser instalado para a próxima vez que você executar
  8. Vá para o menu Ferramentas -> Opções … -> environment.keyboard e mapeie um pressionamento de tecla para sua ferramenta

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

Se você quiser mais de um comando, precisará adicionar IDs de menu no PkgCmdID.cs, Guids no Guids.cs, layouts no .vsct e uma function no * package.cs (e no botão (MenuCommand) no Inicialize a function) para cada um. Tudo pode ser feito no mesmo projeto.

Eu usei este projeto para criar várias novas ‘ferramentas’ com meu antigo código de macro, então mapeei minhas chaves para elas. É muito mais trabalho (e dores de cabeça) na frente, mas não tem o tempo de atraso que as macros tinham.

Provavelmente, existe uma maneira de fazer isso sem ter que usar os menus de ferramentas. Eu comecei a olhar para esta última noite e finalmente consegui que funcionasse, então estou farta disso por enquanto (pelo menos até a Microsoft decidir abandonar isso também).

Pessoalmente eu gosto deste – Extensão Visual Commander permite automatizar tarefas repetitivas no Visual Studio