2

ここに示す Lua の構文強調表示スタイルを複製しようとしています。

Delphi で Scintilla をサポートする VLC コンポーネントである DScintilla を使用しています。Dscintilla のすべてのモジュールを読んで関数を確認し、探していたものを取得しました。すでに次のことを行っています。

  • 余白 (色、数、幅など)
  • 色付け =、>、<、など
  • 数字に色を付ける
  • コメントに色を付ける
  • 「...」で文字列に色を付ける

問題は、コメント スタイルを斜体に変更したり、Scintilla が持つ Lua のレクサーから条件 (if、else、then、while など) を色付けしたり、変数を色付けしたりできないことです。

動作する私の現在のコードは次のとおりです。

with EditScript do
begin
  SetScrollWidth(430); //so we don't see it
  Margins.Right := 1;
  Margins.Left := 0;
  Margins.Top := 0;
  Margins.Bottom := 0;
  SetMarginLeft(5);
  SetMarginWidthN(0, 40);
  SetMarginWidthN(1, 0);
  SetExtraAscent(4); //space between lines

  //-----------------------margin line numbers
  StyleSetFont(STYLE_LINENUMBER, 'Default');
  StyleSetBold(STYLE_LINENUMBER, true);
  StyleSetBack(STYLE_LINENUMBER, gray);
  StyleSetFore(STYLE_LINENUMBER, clWebBlack);

  //-----------------------Text
  StyleSetFont(STYLE_DEFAULT, 'Courier New'); 
  //TO DO: variables and comments in cursive
  SetLexerLanguage('Lua');
  SetLexer(SCLEX_LUA);
  SetCodePage(CP_UTF8);

  //-----------------------Colours
  StyleSetFore(SCE_LUA_COMMENTLINE, green_comments);
  StyleSetFore(SCE_LUA_NUMBER, blue_numbers);
  StyleSetFore(SCE_LUA_CHARACTER, red_strings);
  StyleSetFore(SCE_LUA_OPERATOR, green_conditionals);
end;

何がうまくいかないのですか?これ:

//-----------------------Italics
StyleSetItalic(SCE_LUA_DEFAULT, true);
StyleSetItalic(SCE_LUA_COMMENTLINE, true);
StyleSetItalic(SCE_LUA_COMMENTDOC, true);

また

StyleSetFore(SCE_LUA_COMMENT, clGreen);
StyleSetFore(SCE_LUA_COMMENTDOC, clGreen);
StyleSetFore(SCE_LUA_STRING, clGreen);
StyleSetFore(SCE_LUA_LITERALSTRING, clGreen);
StyleSetFore(SCE_LUA_PREPROCESSOR, clGreen);
// StyleSetFore(SCE_LUA_IDENTIFIER, clGreen); //it highlights everything, wtf?
StyleSetFore(SCE_LUA_STRINGEOL, clGreen);
StyleSetFore(SCE_LUA_WORD, clGreen);
StyleSetFore(SCE_LUA_WORD2, clGreen);
StyleSetFore(SCE_LUA_WORD3, clGreen);
StyleSetFore(SCE_LUA_WORD4, clGreen);
StyleSetFore(SCE_LUA_WORD5, clGreen);
StyleSetFore(SCE_LUA_WORD6, clGreen);
StyleSetFore(SCE_LUA_WORD7, clGreen);
StyleSetFore(SCE_LUA_WORD8, clGreen);
StyleSetFore(SCE_LUA_LABEL, clGreen);

を呼び出すとShowMessage(EditScript.DescribeKeyWordSets)、次のようになります。

キーワード
基本機能
文字列、(テーブル) & 数学関数
(コルーチン)、I/O & システム機能
ユーザー1
ユーザー2
ユーザー3
ユーザー4
4

2 に答える 2

1

問題がキーワードと変数名のみにある場合は、次の 2 つのことが原因のようです。

  1. およびグループSetKeyWordsに対応するグループにキーワードを割り当てるには、 callを使用する必要があります。たとえば、.SCE_LUA_WORDSCE_LUA_WORD#editor:SetKeyWords(0,"if then else")
  2. SCE_LUA_IDENTIFIER変数名については、他のすべてを別の色で使用して色付けする必要があるようです。私の場合、editor:StyleSetForeground(wxstc.wxSTC_LUA_IDENTIFIER, wx.wxColour(127, 0, 0))正しく設定すると、使用される変数のみが色付けされます。
于 2013-05-26T20:38:37.957 に答える
0

わかりました、私は多くの組み合わせを試しましたが、最終的にこの「半」作業になりました。setItalic を記述する前に、そのスタイルの SetFont を記述すると、ほとんどの場合、次のように機能します。

  StyleSetFont(SCE_LUA_COMMENTLINE, 'Courier New');
  StyleSetSize(SCE_LUA_COMMENTLINE,10);

  StyleSetItalic(SCE_LUA_COMMENTLINE,true);  // "--..."

したがって、唯一の問題はキーワード変数名です(図の紫色)

@Edited: これが今の様子です: ここに画像の説明を入力

ここに私が使用したコードがあります:

  with EditScript do
  begin
    SetScrollWidth(430); //so we don't see it
    Margins.Right:=1;
    Margins.Left:=0;
    Margins.Top:=0;
    Margins.Bottom:=0;
    SetMarginLeft(5);
    SetMarginWidthN(0,40);
    SetMarginWidthN(1,0);
    SetExtraAscent(4); //space between lines

    //-----------------------margin line numbers
    StyleSetFont(STYLE_LINENUMBER, 'Default');
    StyleSetBold(STYLE_LINENUMBER, true);
    StyleSetBack(STYLE_LINENUMBER, gray);
    StyleSetFore(STYLE_LINENUMBER,clWebBlack);

    //-----------------------Text
    SetLexerLanguage('Lua');  //don't work
      SetLexer(SCLEX_LUA);
      SetCodePage(CP_UTF8);
      StyleSetFont(SCE_LUA_DEFAULT, 'Courier New');
      StyleSetSize(SCE_LUA_DEFAULT,10);
      StyleSetFont(SCE_LUA_IDENTIFIER, 'Courier New');
      StyleSetSize(SCE_LUA_IDENTIFIER,10);
      StyleSetFont(SCE_LUA_COMMENTLINE, 'Courier New');
      StyleSetSize(SCE_LUA_COMMENTLINE,10);
      StyleSetFont(SCE_LUA_WORD, 'Courier New');
      StyleSetSize(SCE_LUA_WORD,10);
      StyleSetFont(SCE_LUA_LITERALSTRING, 'Courier New');
      StyleSetSize(SCE_LUA_LITERALSTRING,10);
      StyleSetFont(SCE_LUA_COMMENTDOC, 'Courier New');

     //-----------------------Italics
      StyleSetItalic(SCE_LUA_COMMENTLINE,true);  // "--..."
      StyleSetItalic(SCE_LUA_LITERALSTRING,true);   // "[[...]]"
      StyleSetItalic(SCE_LUA_IDENTIFIER,true);   // "variables"
      StyleSetBold(SCE_LUA_IDENTIFIER,true);
      StyleSetBold(SCE_LUA_WORD,true);   //init start/end true false
      StyleSetItalic(SCE_LUA_COMMENTDOC,true); //don't work

     //-----------------------KeyWords
      SetKeyWords(0, 'if then else init start end true false');

     //-----------------------Colours
      StyleSetFore(SCE_LUA_COMMENTLINE, green_comments);
      StyleSetFore(SCE_LUA_COMMENTDOC, green_comments);
      StyleSetFore(SCE_LUA_NUMBER, blue_numbers);
      StyleSetFore(SCE_LUA_CHARACTER, red_strings);
      StyleSetFore(SCE_LUA_OPERATOR, green_conditionals);
      StyleSetFore(SCE_LUA_LITERALSTRING, green_comments);
      StyleSetFore(SCE_LUA_IDENTIFIER, purple);
      StyleSetFore(SCE_LUA_WORD, blue_strings);
    end;
于 2013-05-26T18:42:53.240 に答える