Colorizing (受管理的封裝架構) 的語法
語法顏色標示是一種功能,會顯示在不同的色彩及樣式的原始程式檔中的程式語言的不同項目。 若要支援這項功能,您必須提供剖析器或掃瞄器可用來辨識語彙項目或檔案中的語彙基元的型別。 許多語言會透過 colorizing 它們以不同方式區分關鍵字、 分隔符號 (例如括號或大括號) 及註解。
實作
若要支援顏色標示,包括管理的套件架構 (MPF) Colorizer類別,就會有哪些實作IVsColorizer介面。 這個類別進行互動IScanner來決定的語彙基元和色彩。 如需有關掃瞄器的詳細資訊,請參閱語言服務剖析及掃描程式 (受管理的封裝架構)。 Colorizer類別接著會標示每個字元的色彩資訊的語彙基元,並回到編輯器] 中顯示原始程式檔中的該項資訊。
返回編輯器] 中的色彩資訊是可設定色彩的項目清單中的索引。 每個可設定色彩的項目指定色彩值和一組字型屬性,如粗體或刪除線。 在編輯器] 會提供一組語言服務可以使用的預設值可設定色彩項目。 您所要做的只是指定適當的色彩索引的每個語彙基元的型別。 不過,您可以為語彙基元,提供一組自訂的可設定色彩項目和您提供的索引,並參考可設定色彩的項目,而非預設清單的清單。 您也必須設定RequestStockColors登錄項目為 0 (或未指定RequestStockColors根本的項目) 以支援自訂的色彩。 您可以設定此登錄項目,以指明的參數,以ProvideLanguageServiceAttribute使用者定義的屬性。 如需有關登錄語言服務,並設定其選項的詳細資訊,請參閱正在註冊語言服務 (管理的套件架構)。
自訂可設定色彩的項目
若要提供您自己自訂的可設定色彩項目,您必須覆寫GetItemCount和GetColorableItem上的方法LanguageService類別。 第一種方法會傳回自訂您的語言服務支援的可設定色彩項目數目,而第二個依索引取得自訂的可設定色彩項目。 您建立自訂的可設定色彩項目預設清單。 在您的語言服務的建構函式,您只需要會提供每個可設定色彩的項目名稱。 Visual Studio 會自動處理使用者選取不同的可設定色彩的項目集的位置的大小寫。 此名稱都會顯示於字型和色彩 上的 [屬性頁 選項 對話方塊 (可從 Visual Studio 工具功能表) 與此名稱將決定哪些使用者的色彩已覆寫。 使用者的選擇會儲存在登錄中的快取,而且色彩名稱來存取。 字型和色彩屬性頁會列出所有的色彩名稱,以字母順序,讓您可以將您的自訂色彩群組前與您的語言名稱 ; 每個色彩名稱 比方說,"TestLanguage 註解"和"TestLanguage 關鍵字"。 您可設定色彩項目類型,您可以將群組或者 「註解 (TestLanguage)"和"關鍵字 (TestLanguage)"。 依語言名稱的群組時,偏好。
警告
強烈建議您在可設定色彩的項目名稱,以避免與現有的可設定色彩的項目名稱發生衝突,包括語言名稱。
注意事項 |
---|
如果您在開發過程中變更其中一個色彩的名稱,您必須重設 Visual Studio 建立色彩可供存取的第一次快取。您可以執行這個動作執行重設實驗登錄區 Visual Studio 的 SDK 程式功能表命令。 |
請注意從未受到參考可設定色彩的項目清單中第一個項目。 Visual Studio 永遠會提供預設的文字色彩及項目的屬性。 如此一來處理的最簡單的方法是提供版面配置區可設定色彩項目做為第一個項目。
高彩可設定色彩的項目
可設定色彩的項目也可以支援 24 位元] 或 [高的色彩值,透過IVsHiColorItem介面。 MPF ColorableItem類別支援IVsHiColorItem介面與 24 位元色彩詳列於建構函式,以及使用一般的色彩。 請參閱ColorableItem如需詳細資訊的類別。 下列範例會示範如何設定為 24 位元的色彩的關鍵字和註解。 使用了 24 位元色彩時 24 位元色彩都支援使用者的桌面。 否則,會使用一般的文字色彩。
請記住,這些都是預設的色彩,您的語言。 使用者可以變更這些色彩任何他們想要的結果。
範例
這個範例示範一種方法宣告,並填入使用自訂的可設定色彩項目的陣列ColorableItem類別。 本範例設定使用 24 位元色彩的關鍵字和註解的色彩。
using Microsoft.VisualStudio.Package;
using Microsoft.VisualStudio.TextManager.Interop;
namespace TestLanguagePackage
{
public class TestLanguageService : LanguageService
{
private ColorableItem[] m_colorableItems;
TestLanguageService() : base()
{
m_colorableItems = new ColorableItem[] {
new ColorableItem("TestLanguage – Text",
"Text",
COLORINDEX.CI_SYSPLAINTEXT_FG,
COLORINDEX.CI_SYSPLAINTEXT_BK,
System.Drawing.Color.Empty,
System.Drawing.Color.Empty,
FONTFLAGS.FF_DEFAULT),
new ColorableItem("TestLanguage – Keyword",
"Keyword",
COLORINDEX.CI_MAROON,
COLORINDEX.CI_SYSPLAINTEXT_BK,
System.Drawing.Color.FromArgb(192,32,32),
System.Drawing.Color.Empty,
FONTFLAGS.FF_BOLD),
new ColorableItem("TestLanguage – Comment",
"Comment",
COLORINDEX.CI_DARKGREEN,
COLORINDEX.CI_LIGHTGRAY,
System.Drawing.Color.FromArgb(32,128,32),
System.Drawing.Color.Empty,
FONTFLAGS.FF_DEFAULT)
// ...
// Add as many colorable items as you want to support.
};
}
}
}
Colorizer 類別並掃瞄器
基底LanguageService類別有GetColorizer方法的 instantiantes Colorizer類別。 傳回從掃瞄器GetScanner方法會傳遞至Colorizer類別建構函式。
您必須實作GetScanner的版本中的方法LanguageService類別。 Colorizer類別會使用掃瞄器取得語彙基元的色彩的所有資訊。
掃描器必須填入TokenInfo結構的每個語彙基元尋找。 這個結構包含的資訊,例如範圍的語彙基元會佔用的色彩索引,若要使用,是什麼類型的語彙基元,和語彙基元的觸發程序 (請參閱TokenTriggers)。 只有範圍和色彩索引所需的顏色標示的Colorizer類別。
色彩索引儲存在TokenInfo結構通常是介於TokenColor列舉型別,提供了數個關鍵字和運算子等的各種語言項目相對應的具名索引。 如果您自訂的可設定色彩項目會列出符合的項目呈現在TokenColor列舉型別,那麼您可以只使用列舉型別做為色彩,每個標記。 不過,如果您有其他可設定色彩的項目,或不想使用現有的值依此順序,您可以排列您的自訂的可設定色彩項目清單,以符合您的需求,並傳回該清單中適當的索引。 請務必轉型為索引TokenColor時儲存在TokenInfo結構。 Visual Studio所看到的索引。
範例
下列範例會示範如何掃描器可能會找出三個語彙基元的型別: 數字、 標點符號、 和識別項 (為簡單的數字或標點符號)。 本範例僅供說明之,並不能代表完整的剖析器與掃瞄器實作。 它假設有Lexer類別與GetNextToken()方法會傳回字串。
using Microsoft.VisualStudio.Package;
using Microsoft.VisualStudio.TextManager.Interop;
namespace TestLanguagePackage
{
private Lexer lex;
public class TestScanner : IScanner
{
public bool ScanTokenAndProvideInfoAboutIt(TokenInfo tokenInfo,
ref int state)
{
bool foundToken = false;
string token = lex.GetNextToken();
if (token != null)
{
char firstChar = token[0];
if (Char.IsPunctuation(firstChar))
{
tokenInfo.Type = TokenType.Operator;
tokenInfo.Color = TokenColor.Keyword;
}
else if (Char.IsNumber)
{
tokenInfo.Type = TokenType.Literal;
tokenInfo.Color = TokenColor.Number;
}
else
{
tokenInfo.Type = TokenType.Identifier;
tokenInfo.Color = TokenColor.Identifier;
}
}
return foundToken;
}