主にプログラミング関連のメモ帳 ♪(✿╹ヮ╹)ノ
書いてあるコードは自己責任でご自由にどうぞ。記事本文の無断転載は禁止です。
2016/05/19
ということで、続きです。
今回は、 *.hsp;*.as
をシンタックスハイライトする機能を作成していきます。
シンタックスハイライトを行う方法には2種類あり、 Classifier
を追加して、
独自の色を定義する方法と、Visual Studio 側の色設定を使用する方法があります。
今回は、特に独自の色設定を追加する必要もないので、後者の方法使用する方法で実装します。
ということで、早速実装。
前回作成した IScanner
を実装したクラス(ここでは HSPScanner
)を変更していきます。
using Microsoft.VisualStudio.Package;
using Microsoft.VisualStudio.TextManager.Interop;
namespace HSPToolsVS.Language
{
internal class HSPScanner : IScanner
{
private readonly HSPLexer _lexer;
private IVsTextBuffer _textBuffer;
public HSPScanner(IVsTextBuffer textBuffer)
{
_textBuffer = textBuffer;
_lexer = new HSPLexer();
}
public void SetSource(string source, int offset)
{
_lexer.SetCurLine(source, offset);
}
public bool ScanTokenAndProvideInfoAboutIt(TokenInfo tokenInfo, ref int state)
{
var token = _lexer.GetNextToken(ref state);
if (token == null)
return false;
tokenInfo.StartIndex = token.StartIndex;
tokenInfo.EndIndex = token.EndIndex;
tokenInfo.Type = token.Type.ToTokenType();
tokenInfo.Color = token.Type.ToColor();
tokenInfo.Token = (int) token.Type;
return true;
}
}
}
ソース内にある HSPLexer
は、行ベースの字句解析器です。
処理の流れとしては、まず初期オープン時には全文が、ファイル変更時には変更された行が
解析対象の文字列となり、 SetSource
にて行ごとに文字列と offset が渡されます。
そして、解析結果を使用して ScanTokenAndProvideInfoAboutIt
にて、範囲と色を設定します。
// また、 ScanTokenAndProvideInfoAboutIt
にて false
を返すと、対象が次の行へと移動します。
例えば以下の様なスクリプトの場合、
; Sample script
mes "Hello, HSP!"
; Sample Script
がはじめに SetSource
にて渡され、この行を解析し、
ScanTokenAndProvideInfoAboutIt
にて結果を設定(この場合は全てコメントと設定)します。
ハイライト対象の色は、 Microsoft.VisualStudio.Package.TokenColor
から設定します。
Text
は通常テキスト、 Keyword
は using
などのキーワード...といった感じで、
必要な物はそろっています。
これで、シンタックスハイライトの実装は完了です。
Visual Studio 2015 Experimental Instance を起動し、 *.hsp
なファイルを D&D させると、
エディタ上に、シンタックスハイライトされたテキストが表示されているはずです。
ということで、シンタックスハイライトの実装方法でした。
Classifier での実装方法だと、YamahaConfigClassifier や、 MS 公式サンプルが参考になります。