共用方式為


舊版語言服務中的比對括號

 

如需 Visual Studio 2017 的最新文件請參閱 Visual Studio 2017 文件

大括號比對,可協助開發人員追蹤需要一起發生,例如括號和大括號的語言項目。 當開發人員輸入右括號時,左括號會反白顯示。

您可以比對兩個或三個共同發生的項目,稱為組和三合一。 三合一是共同發生的三個元素的集合。 比方說,在 C# 中,foreach陳述式構成 triple: 「foreach()","{」,和 「}」。 輸入右括號時,會反白顯示三個項目。

舊版的語言服務會實作成,VSPackage 的一部分,但實作語言服務功能的較新的方法是使用 MEF 延伸模組。 若要了解有關實作括號對稱的新方法的詳細資訊,請參閱逐步解說︰ 顯示對稱的括號

注意

我們建議您開始使用新的編輯器 API 儘速。 這會改善語言服務的效能,並可讓您充分利用新編輯器功能。

AuthoringSink類別支援配對,而且與 triples MatchPairMatchTriple方法。

實作

語言服務需要識別在語言中的所有相符項目,然後找出所有配對成功。 這通常透過實作IScanner偵測相符的語言,然後將ParseSource方法來比對項目。

OnCommand方法呼叫來 token 化列,並傳回之前插入號的語彙基元的掃描程式。 掃描器表示語言項目組已找到的語彙基元的觸發程序將值設定為MatchBraces上目前的語彙基元。 OnCommand方法呼叫MatchBraces接著呼叫的方法BeginParse方法剖析原因值是MatchBraces來尋找相符的語言項目。 找到相符的語言項目時,會反白顯示兩個項目。

輸入一個大括號如何觸發,大括號反白顯示的完整說明,請參閱本主題的 「 範例剖析作業 」 一節舊版語言服務剖析器和掃描器

啟用支援括號對稱

ProvideLanguageServiceAttribute屬性可以設定MatchBracesMatchBracesAtCaret,和ShowMatchingBrace具名參數所設定的對應屬性LanguagePreferences類別。 使用者也可以設定語言喜好設定的屬性。

登錄項目 屬性 描述
MatchBraces EnableMatchBraces 啟用括號對稱
MatchBracesAtCaret EnableMatchBracesAtCaret 啟用插入號移比對括號。
ShowMatchingBrace EnableShowMatchingBrace 反白顯示對稱的括號。

比對的條件陳述式

可以比對條件陳述式,例如ifelse if,和else,或#if#elif#else#endif,做為分隔符號比對相同的方式。 您可以子類別AuthoringSink類別,並提供可以加入文字的方法,跨越以及內部陣列的相符項目分隔符號。

設定觸發程序

下列範例示範如何偵測到相符的括號、 大括號和方括號,以及掃描程式設定它的觸發程序。 OnCommand方法來源類別偵測到觸發程序,並呼叫剖析器來尋找相符的配對 (請參閱本主題的 「 尋找相符項目 」 一節)。 這個範例是僅供示範用途。 它會假設您的掃描器都包含一種方法GetNextToken,識別,並傳回權杖,從一行文字。

using Microsoft.VisualStudio.Package;  
using Microsoft.VisualStudio.TextManager.Interop;  
  
namespace TestLanguagePackage  
{  
    public class TestScanner : IScanner  
    {  
        private const string braces = "()[]{}";  
        private Lexer lex;  
  
        public bool ScanTokenAndProvideInfoAboutIt(TokenInfo tokenInfo,  
                                                   ref int state)  
        {  
            bool foundToken = false;  
            string token = lex.GetNextToken();  
            if (token != null)  
            {  
                foundToken = true;  
                char firstChar = token[0];  
                if (Char.IsPunctuation(firstChar) && token.Length > 0)  
                {  
                    if (braces.IndexOf(firstChar) != -1)  
                    {  
                        tokenInfo.Trigger = TokenTriggers.MatchBraces;  
                    }  
                }  
            }  
            return foundToken;  
        }  

比對大括號

以下是一個簡單的例子,相符的語言項目 {}、 () 和 [],並加入其範圍AuthoringSink物件。 此方法不是建議的方法來剖析程式碼。它是僅供示範用途。

using Microsoft.VisualStudio.Package;  
using Microsoft.VisualStudio.TextManager.Interop;  
  
namespace TestLanguagePackage  
{  
    public class Parser  
    {  
         private IList<TextSpan[]> m_braces;  
         public IList<TextSpan[]> Braces  
         {  
             get { return m_braces; }  
         }  
         private void AddMatchingBraces(TextSpan braceSpan1, TextSpan braceSpan2)  
         {  
             if IsMatch(braceSpan1, braceSpan2)  
                 m_braces.Add(new TextSpan[] { braceSpan1, braceSpan2 });  
         }  
  
         private bool IsMatch(TextSpan braceSpan1, TextSpan braceSpan2)  
         {  
             //definition for matching here  
          }  
    }  
  
    public class TestLanguageService : LanguageService  
    {  
         Parser parser = new Parser();  
         Source source = (Source) this.GetSource(req.FileName);  
  
         private AuthoringScope ParseSource(ParseRequest req)  
         {  
             if (req.Sink.BraceMatching)  
             {  
                 if (req.Reason==ParseReason.MatchBraces)  
                 {  
                     foreach (TextSpan[] brace in parser.Braces)  
                     {  
                         req.Sink.MatchPair(brace[0], brace[1], 1);  
                     }  
                 }  
             }  
             return new TestAuthoringScope();  
         }  
    }  
}  

另請參閱

舊版的語言服務功能
舊版的語言服務剖析器和掃描器