使用AvalonEdit實現WPF的Lua編輯器


原文發布於: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">
      [?,.;()\[\]{}+\-/%*&lt;&gt;^+~!|&amp;]+
    </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看看就知道了嘛:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM