SynMultiSyn 高亮光标位置

5

我有一个SynMultiSyn高亮插件(synHTMLcomplex),包含HTML(synHTML)和JavaScript(synJScript),如下所示:

synHTML       : TSynHTMLSyn;
synJScript    : TSynJScriptSyn;
synHTMLcomplex: TSynMultiSyn;

// HTML complex
with SynHTMLcomplex do begin
  DefaultLanguageName:= 'HTML complex';
  DefaultFilter      := 'HTML complex (*.html; *.htm)|*.html; *.htm';
  DefaultHighlighter := synHTML;
  with Schemes do begin
    Add.Index:= 0;
    with Items[0] do begin
      Highlighter:= synJScript;
      SchemeName := 'JavaScript';
      StartExpr  := '<script';
      EndExpr    := '</script>';
      with MarkerAttri do
        Background:= clNone;
    end;
  end;
end;

在SynEdit中的一个实例中,有没有办法(属性或方法)知道光标(CaretY)所在的高亮器(synHTML或synJScript)?

请问有人可以帮忙吗?


我以前用过这个组件,但是很久以前了,而且我现在不在我的IDE上,但我肯定答案是肯定的,只是不确定具体是怎么样的。 - Jerry Dodge
1个回答

0

这是可能的,但并不容易实现。

下面的函数是对 Jan Fiala(PSPad编辑器的作者)使用的函数进行了改编。 对我来说,它运行良好。非常感谢 Jan!

function TfrmEditor.GetCurrentHighLighter: TSynCustomHighlighter;
var
  i       : integer;
  seEditor: TSynEdit;

begin
  if (sActiveEditor = 'synEditor') then seEditor:= synEditor
                                   else seEditor:= synEditor2;

  with seEditor do
    if Highlighter is TSynMultiSyn then
    begin
      i:= (Integer(TSynEditStringList(Lines).Ranges[CaretY - 1]) and $F) - 1;

      if (i < 0) then
        result:= TSynMultiSyn(Highlighter).DefaultHighLighter
      else
        result:= TSynMultiSyn(Highlighter).Schemes[i].Highlighter
    end
    else
      result:= Highlighter;
end;

以下是Jan的原始函数,附有解释:

"- 这是我用于返回当前高亮器的函数:

function TPSSynEdit.GetCurrentHighLighter: TSynCustomHighlighter;
var
  i: Integer;
begin
  if Highlighter is TSynMultiSyn then
  begin
    i := (Integer(TSynEditStringList(Lines).Ranges[CaretY - 1]) and $F) - 2;
    if (i > TSynMultiSyn(HighLighter).Schemes.Count - 1) or (i < 0) then
      Result := TSynMultiSyn(Highlighter).DefaultHighLighter
    else
      Result := TSynMultiSyn(Highlighter).Schemes[i].Highlighter
  end
  else
    Result := Highlighter;
end;

我在TSynedit的后代中有这个函数。您需要将高亮显示器替换为Editor.Highlighter,将Lines替换为Editor.Lines或将编辑器作为函数参数发送,并在begin之后添加以下内容:

with Editor do begin ..."

Jan Fiala


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接