AvalonEditを使って、SQL文にSyntaxHighlightつけたい
自作ツールにFirebirdのSQL文を入力した際に、SyntaxHighlightできるようにしたい!
ということで、AvalonEditを使ってみました。
目次
環境
AvalonEditとは
WPFベースのテキストエディターコンポーネントです。
SharpDevelop というOSSのIDEでテキストエディタとして使われているものです。
そのため、SyntaxHighlight のみならずコード補完等も出来るようです。
AvalonEditの詳しい解説は下記のDocumentを参照。
* AvalonEdit - Table of Content
実装
ライブラリの取得
公式ページにあるように nuget から Install 可能です。
Install-Package AvalonEdit
エディタの配置
名前空間設定して、TextEditorを配置すればよし。
<Window x:Class="AvalonEditSample.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:avalon="http://icsharpcode.net/sharpdevelop/avalonedit" xmlns:local="clr-namespace:AvalonEditSample" mc:Ignorable="d" Title="MainWindow" Height="350" Width="525"> <avalon:TextEditor /> </Window>
SyntaxHighlight の設定
AvalonEdit では、SyntaxHighlightingプロパティで指定できる言語がいくつかあります。
C#, PowerShell, HTML, CSS, VB, C++, Java ,その他諸々が対応しています。
以下のコードを確認すると、対応状況が分かります。
AvalonEdit/Resources.cs at master · icsharpcode/AvalonEdit · GitHub
AvalonEdit/ICSharpCode.AvalonEdit/Highlighting/Resources at master · icsharpcode/AvalonEdit · GitHub
C#の設定をする場合はこんな感じでOKです。
<avalon:TextEditor SyntaxHighlighting="C#"/>
SyntaxHighlight のカスタマイズ
下記に従って、任意の設定が可能です。
AvalonEdit - Table of Content
適当にFirebirdのキーワードを突っ込んだ xshdファイルを作成します。
<SyntaxDefinition name="SQL" extensions=".sql" xmlns="http://icsharpcode.net/sharpdevelop/syntaxdefinition/2008"> ... <Color name="Keyword" foreground="#FF0000FF" fontWeight="bold" exampleText="SELECT" /> <Keywords color="Keyword"> ... <Word>INDEX</Word> <Word>INNER</Word> <Word>INPUT_TYPE</Word> <Word>INSENSITIVE</Word> <Word>INSERT</Word> <Word>INSERTING</Word> <Word>INT</Word> <Word>INTEGER</Word> <Word>INTO</Word> <Word>IS</Word> <Word>ISOLATION</Word> <Word>JOIN</Word> <Word>KEY</Word> <Word>LAST</Word> ...
長いのでGistに上げました。
Firebird 用xshd · GitHub
SyntaxHighlight のカスタマイズ2
コードビハインドに、読み込み処理を書いておきます。
public MainWindow() { InitializeComponent(); using (var reader = new XmlTextReader("sql.xshd")) { Editor.SyntaxHighlighting = HighlightingLoader.Load(reader, HighlightingManager.Instance); } }
結果
上記の通り、概ね思った通りになります。