Osnova ve službě starší verze jazyka

Osnova umožňuje sbalit složitý program do přehledu nebo osnovy. Například v jazyce C# lze všechny metody sbalit na jeden řádek a zobrazit pouze signaturu metody. Kromě toho lze struktury a třídy sbalit a zobrazit pouze názvy struktur a tříd. Uvnitř jedné metody lze složitou logiku sbalit a zobrazit tak celkový tok zobrazením pouze prvního řádku příkazů, jako jsou , a foreach if while .

Služby starší verze jazyka jsou implementovány jako součást balíčku VSPackage, ale novější způsob implementace funkcí služby jazyka je použití rozšíření MEF. Další informace najdete v tématu Názorný postup: Osnova.

Poznámka

Doporučujeme, abyste nové rozhraní API editoru začali používat co nejdříve. Tím se zlepší výkon služby jazyka a umožní vám to využívat nové funkce editoru.

Povolení podpory osnovy

Pokud chcete povolit automatické slinování, položka registru je nastavená AutoOutlining na hodnotu 1. Automatické slinování nastaví parsování celého zdroje při načtení nebo změně souboru za účelem identifikace skrytých oblastí a zobrazení okrajových piktogramů. Osnovu může také řídit ručně uživatel.

Hodnotu položky AutoOutlining registru lze získat prostřednictvím AutoOutlining vlastnosti třídy LanguagePreferences . Položku registru je možné inicializovat pomocí pojmenovaného parametru atributu (podrobnosti najdete v tématu Registrace služby starší AutoOutlining ProvideLanguageServiceAttribute verze jazyka).

Skrytá oblast

Aby vaše jazyková služba poskytovala osnovu, musí podporovat skryté oblasti. Jedná se o rozsahy textu, které lze rozbalit nebo sbalit. Skryté oblasti mohou být odděleny standardními symboly jazyka, jako jsou složené závorky nebo vlastní symboly. Například jazyk C# má #region / #endregion pár, který odděluje skrytou oblast.

Skryté oblasti spravuje skrytý správce oblastí, který je vystavený jako IVsHiddenTextSession rozhraní.

Osnova používá skryté oblasti rozhraní a obsahuje rozsah skryté oblasti, aktuální viditelný stav a banner, který se zobrazí, když je rozsah IVsHiddenRegion sbalený.

Analyzátor služby jazyka používá metodu k přidání nové skryté oblasti s výchozím chováním pro skryté oblasti, zatímco metoda umožňuje přizpůsobit vzhled a chování AddHiddenRegion AddHiddenRegion obrysu. Po zobrazení skrytých oblastí relaci skryté oblasti spravuje skryté Visual Studio oblasti pro službu jazyka.

Pokud potřebujete určit, kdy se relace skryté oblasti zničí, změní se skrytá oblast nebo se musíte ujistit, že je skrytá oblast viditelná. Je nutné odvodit třídu z třídy a Source přepsat příslušné metody , a v uvedeném OnBeforeSessionEnd OnHiddenRegionChange MakeBaseSpanVisible pořadí.

Příklad

Tady je zjednodušený příklad vytváření skrytých oblastí pro všechny páry složených závorek. Předpokládá se, že jazyk poskytuje párování závorek a že složené závorky, které se mají spárovat, obsahují alespoň složené závorky ({ a }). Tento přístup je pouze ilustrativní. Úplná implementace by byla kompletním zpracováním případů v ParseSource . Tento příklad také ukazuje, jak nastavit AutoOutlining předvolbu true na dočasně. Alternativou je zadání AutoOutlining pojmenovaného parametru v ProvideLanguageServiceAttribute atributu v jazykovém balíčku.

Tento příklad předpokládá pravidla jazyka C# pro komentáře, řetězce a literály.

using Microsoft.VisualStudio.Package;
using Microsoft.VisualStudio.TextManager.Interop;

namespace MyLanguagePackage
{

    public class MyLanguageService : LanguageService
    {
        private LanguagePreferences m_preferences;

        public override LanguagePreferences  GetLanguagePreferences()
        {
            if (m_preferences == null)
            {
                m_preferences = new LanguagePreferences(this.Site,
                                                        typeof(MyLanguageService).GUID,
                                                        Name);
                m_preferences.Init();
                // Temporarily enabled auto-outlining
                m_preferences.AutoOutlining = true;
            }
            return m_preferences;
        }

        public override AuthoringScope  ParseSource(ParseRequest req)
        {
            Source source = (Source) this.GetSource(req.FileName);
            switch (req.Reason)
            {
               case ParseReason.HighlightBraces:
               case ParseReason.MatchBraces:
               case ParseReason.MemberSelectAndHighlightBraces:
                  if (source.Braces != null)
                  {
                      foreach (TextSpan[] brace in source.Braces)
                      {
                         if (brace.Length == 2)
                         {
                             if (req.Sink.HiddenRegions == true
                                   && source.GetText(brace[0]).Equals("{")
                                   && source.GetText(brace[1]).Equals("}"))
                             {
                                //construct a TextSpan of everything between the braces
                                TextSpan hideSpan = new TextSpan();
                                hideSpan.iStartIndex = brace[0].iStartIndex;
                                hideSpan.iStartLine = brace[0].iStartLine;
                                hideSpan.iEndIndex = brace[1].iEndIndex;
                                hideSpan.iEndLine = brace[1].iEndLine;
                                req.Sink.ProcessHiddenRegions = true;
                                req.Sink.AddHiddenRegion(hideSpan);
                             }
                             req.Sink.MatchPair(brace[0], brace[1], 1);
                         }
                         else if (brace.Length >= 3)
                             req.Sink.MatchTriple(brace[0], brace[1], brace[2], 1);
                  }
        }
                   break;
               default:
                   break;
      }
            // Must always return a valid AuthoringScope object.
            return new MyAuthoringScope();
        }
    }
}

Viz také