发布时间:2025-12-09 12:03:05 浏览次数:1
原文发布于:https://www.chenxublog.com/2019/07/14/use-avalonedit-make-wpf-lua-editor.html
由于LLCOM里面内置了Lua代码的编辑器,所以我就使用了AvalonEdit这个轮子,不过一开始的Lua语言支持让我一顿好找
不过好在找到了网上的资料,我就把整个实现过程贴在下面
先去nuget安装一下AvalonEdit,以备后面使用:
接着把下面的文件内容,保存为Lua.xshd文件名的文件:
<?xml version="1.0"?><SyntaxDefinition name="SharpLua" extensions=".slua;.lua" xmlns="http://icsharpcode.net/sharpdevelop/syntaxdefinition/2008"> <!-- The named colors 'Comment' and 'String' are used in SharpDevelop to detect if a line is inside a multiline string/comment --> <Color name="Comment" foreground="#ff999999" exampleText="-- comment" /> <Color name="String" foreground="#fff99157" /> <Color name="Punctuation" /> <Color name="MethodCall" foreground="#ffffcc66" fontWeight="bold"/> <Color name="NumberLiteral" foreground="#ff99cc99"/> <Color name="NilKeyword" fontWeight="bold"/> <Color name="Keywords" fontWeight="bold" foreground="#ff6699cc" /> <Color name="GotoKeywords" foreground="#ffcc99cc" /> <Color name="Visibility" fontWeight="bold" foreground="#fff99157"/> <Color name="TrueFalse" fontWeight="bold" foreground="#ff66cccc" /> <RuleSet name="CommentMarkerSet"> <Keywords fontWeight="bold" foreground="#fff2777a"> <Word>TODO</Word> <Word>FIXME</Word> </Keywords> <Keywords fontWeight="bold" foreground="#fff2777a"> <Word>HACK</Word> <Word>UNDONE</Word> </Keywords> </RuleSet> <!-- This is the main ruleset. --> <RuleSet> <Span color="Comment"> <Begin color="XmlDoc/DocComment">---</Begin> <RuleSet> <Import ruleSet="XmlDoc/DocCommentSet"/> <Import ruleSet="CommentMarkerSet"/> </RuleSet> </Span> <Span color="Comment" ruleSet="CommentMarkerSet" multiline="true"> <Begin>--\[[=]*\[</Begin> <End>\][=]*]</End> </Span> <Span color="Comment" ruleSet="CommentMarkerSet"> <Begin>--</Begin> </Span> <Span color="String"> <Begin>"</Begin> <End>"</End> <RuleSet> <!-- span for escape sequences --> <Span begin="\\" end="."/> </RuleSet> </Span> <Span color="String"> <Begin>'</Begin> <End>'</End> <RuleSet> <!-- span for escape sequences --> <Span begin="\\" end="."/> </RuleSet> </Span> <Span color="String" multiline="true"> <Begin color="String">\[[=]*\[</Begin> <End>\][=]*]</End> </Span> <Keywords color="TrueFalse"> <Word>true</Word> <Word>false</Word> </Keywords> <Keywords color="Keywords"> <Word>and</Word> <Word>break</Word> <Word>do</Word> <Word>else</Word> <Word>elseif</Word> <Word>end</Word> <Word>false</Word> <Word>for</Word> <Word>function</Word> <Word>if</Word> <Word>in</Word> <Word>local</Word> <!--<Word>nil</Word>--> <Word>not</Word> <Word>or</Word> <Word>repeat</Word> <Word>return</Word> <Word>then</Word> <Word>true</Word> <Word>until</Word> <Word>while</Word> <Word>using</Word> <Word>continue</Word> </Keywords> <Keywords color="GotoKeywords"> <Word>break</Word> <Word>return</Word> </Keywords> <Keywords color="Visibility"> <Word>local</Word> </Keywords> <Keywords color="NilKeyword"> <Word>nil</Word> </Keywords> <!-- Mark previous rule--> <Rule color="MethodCall"> \b [\d\w_]+ # an identifier (?=\s*\() # followed by ( </Rule> <Rule color="MethodCall"> \b [\d\w_]+ # an identifier (?=\s*\") # followed by " </Rule> <Rule color="MethodCall"> \b [\d\w_]+ # an identifier (?=\s*\') # followed by ' </Rule> <Rule color="MethodCall"> \b [\d\w_]+ # an identifier (?=\s*\{) # followed by { </Rule> <Rule color="MethodCall"> \b [\d\w_]+ # an identifier (?=\s*\[) # followed by [ </Rule> <!-- Digits --> <Rule color="NumberLiteral"> \b0[xX][0-9a-fA-F]+ # hex number | ( \b\d+(\.[0-9]+)? #number with optional floating point | \.[0-9]+ #or just starting with floating point ) ([eE][+-]?[0-9]+)? # optional exponent </Rule> <Rule color="Punctuation"> [?,.;()\[\]{}+\-/%*<>^+~!|&]+ </Rule> </RuleSet></SyntaxDefinition>把Lua.xshd放到解决方案资源管理器中,生成操作改为嵌入的资源:
xaml里的代码如下:
<avalonEdit:TextEditor Grid.Row="2" xmlns:avalonEdit="http://icsharpcode.net/sharpdevelop/avalonedit" Name="textEditor" FontFamily="Consolas" FontSize="10pt" ShowLineNumbers="True" LostFocus="TextEditor_LostFocus"/>然后在窗体的loaded事件中运行下面的代码即可:
//快速搜索功能SearchPanel.Install(textEditor.TextArea);//设置语法规则string name = System.Reflection.Assembly.GetExecutingAssembly().GetName().Name + ".Lua.xshd";System.Reflection.Assembly assembly = System.Reflection.Assembly.GetExecutingAssembly();using (System.IO.Stream s = assembly.GetManifestResourceStream(name)){ using (XmlTextReader reader = new XmlTextReader(s)) { var xshd = HighlightingLoader.LoadXshd(reader); textEditor.SyntaxHighlighting = HighlightingLoader.Load(xshd, HighlightingManager.Instance); }}效果什么的。。。自己去下载一个LLCOM看看就知道了嘛: