Passo a passo: Obtendo uma lista de trechos de código instalado (estrutura de pacote gerenciado)
Um trecho de código é um trecho de código que pode ser inserido no buffer de origem com um comando de menu (que permite escolher entre uma lista de trechos de código instalado) ou por selecionando um atalho do trecho de uma lista de conclusão de IntelliSense.
O EnumerateExpansions método obtém todos os trechos de código para um idioma específico GUID. Os atalhos para esses trechos podem ser inseridos em uma lista de conclusão de IntelliSense.
Consulte Suporte para trechos de código (estrutura de pacote gerenciado) para obter detalhes sobre a implementação de trechos de código em um serviço de linguagem do framework (MPF) de pacote gerenciado.
Para recuperar uma lista de trechos de código
O código a seguir mostra como obter uma lista de trechos de código para um determinado idioma. Os resultados são armazenados em uma matriz de VsExpansion estruturas. Esse método usa estática GetGlobalService método para obter o IVsTextManager interface da SVsTextManager service. No entanto, você também pode usar o provedor de serviços dado a sua VSPackage e a chamada a QueryService método.
using System; using System.Collections; using System.Runtime.InteropServices; using Microsoft.VisualStudio.Package; using Microsoft.VisualStudio.Shell; using Microsoft.VisualStudio.TextManager.Interop; [Guid("00000000-0000-0000-0000-000000000000")] //create a new GUID for the language service namespace TestLanguage { class TestLanguageService : LanguageService { private void GetSnippets(Guid languageGuid, ref ArrayList expansionsList) { IVsTextManager textManager = (IVsTextManager)Package.GetGlobalService(typeof(SVsTextManager)); if (textManager != null) { IVsTextManager2 textManager2 = (IVsTextManager2)textManager; if (textManager2 != null) { IVsExpansionManager expansionManager = null; textManager2.GetExpansionManager(out expansionManager); if (expansionManager != null) { // Tell the environment to fetch all of our snippets. IVsExpansionEnumeration expansionEnumerator = null; expansionManager.EnumerateExpansions(languageGuid, 0, // return all info null, // return all types 0, // return all types 1, // include snippets without types 0, // do not include duplicates out expansionEnumerator); if (expansionEnumerator != null) { // Cache our expansions in a VsExpansion array uint count = 0; uint fetched = 0; VsExpansion expansionInfo = new VsExpansion(); IntPtr[] pExpansionInfo = new IntPtr[1]; // Allocate enough memory for one VSExpansion structure. This memory is filled in by the Next method. pExpansionInfo[0] = Marshal.AllocCoTaskMem(Marshal.SizeOf(expansionInfo)); expansionEnumerator.GetCount(out count); for (uint i = 0; i < count; i++) { expansionEnumerator.Next(1, pExpansionInfo, out fetched); if (fetched > 0) { // Convert the returned blob of data into a structure that can be read in managed code. expansionInfo = (VsExpansion)Marshal.PtrToStructure(pExpansionInfo[0], typeof(VsExpansion)); if (!String.IsNullOrEmpty(expansionInfo.shortcut)) { expansionsList.Add(expansionInfo); } } } Marshal.FreeCoTaskMem(pExpansionInfo[0]); } } } } } } }
Para chamar o método GetSnippets
- O método a seguir mostra como chamar o GetSnippets método na conclusão de uma operação de análise. O OnParseComplete método é chamado após uma operação de análise que foi iniciada com o motivo Check.
Dica
O expansionsList listis em cache por motivos de desempenho do array.Os trechos de alterações não são refletidas na lista até que o serviço de linguagem é interrompido e recarregado (por exemplo, ao parar e reiniciar Visual Studio).
class TestLanguageService : LanguageService
{
private ArrayList expansionsList;
public override void OnParseComplete(ParseRequest req)
{
if (this.expansionsList == null)
{
this.expansionsList = new ArrayList();
GetSnippets(this.GetLanguageServiceGuid(),
ref this.expansionsList);
}
}
}
Para usar as informações de trecho
O código a seguir mostra como usar as informações do trecho retornadas pela GetSnippets método. O AddSnippets método é chamado de analisador em resposta a qualquer motivo de análise que é usado para preencher uma lista de trechos de código. Isso deve ocorrer após a análise completa pela primeira vez.
O AddDeclaration método cria uma lista de declarações que é exibida posteriormente em uma lista de conclusão.
O TestDeclaration classe contém todas as informações que podem ser exibidas em uma lista de conclusão, bem como o tipo de declaração.
class TestAuthoringScope : AuthoringScope { public void AddDeclarations(TestDeclaration declaration) { if (m_declarations == null) m_declarations = new List<TestDeclaration>(); m_declarations.Add(declaration); } } class TestDeclaration { private string m_name; private string m_description; private string m_type; public TestDeclaration(string name, string desc, string type) { m_name = name; m_description = desc; m_type = type; } class TestLanguageService : LanguageService { internal void AddSnippets(ref TestAuthoringScope scope) { if (this.expansionsList != null && this.expansionsList.Count > 0) { int count = this.expansionsList.Count; for (int i = 0; i < count; i++) { VsExpansion expansionInfo = (VsExpansion)this.expansionsList[i]; scope.AddDeclaration(new TestDeclaration(expansionInfo.title, expansionInfo.description, "snippet")); } } } }
Consulte também
Conceitos
Suporte para trechos de código (estrutura de pacote gerenciado)