代码之家  ›  专栏  ›  技术社区  ›  Cigydd

如何将TSynCompletion和TSynAutoComplete组件与SynEdit for TeX一起使用?

  •  3
  • Cigydd  · 技术社区  · 10 年前

    我想用Lazarus和SynEdit创建一个简单的TeX/LaTeX编辑器。

    TSynTeXSyn语法高亮显示非常突出TeX语法。

    现在我想完成一些代码。尝试使用TSynCompletion和TSynAutoComplete组件,但它们似乎坚持使用Pascal和其他标准编程语言,这些语言不将非字母(即反斜杠)作为要完成单词的一部分。

    (我计划自动完成列表基本上由用户定义(通过从TeX代码中收集命令/宏并按下快捷键或手动编辑命令列表)。我几乎不可能获取TeX源代码并重新编写它,以便能够在插入点看到所有可用的宏,这将是很好的,但我不打算这么做。)

    我试图为TSynAutoComplete组件的ItemList属性分配一个包含以反斜杠开头的所有项目的列表,但这在完成后又给了我一个反斜杠(不将第一个反斜杠作为未完成前缀的一部分,而将另一个反斜线作为列表项目的一部分)。

    我试图分配一个没有反斜杠的列表,这很有效,但它会在文本中的任何位置完成单词,无论反斜杠是否在前面。

    一种解决方案是破解SynEdit代码,制作一个叉,并在字母中添加反斜杠以完成任务。但我不确定这是我想要的。它甚至需要两个或多个以下命令,并用用户选择的一个命令替换它们。

    我希望SynEdit可以选择键入“\”,以便弹出自动完成窗口,但允许写入反斜杠。然后,当用户键入时,让它搜索正确的术语。然后,当用户选择正确的命令时,覆盖整个单词,包括开头的反斜杠,但不覆盖右侧的任何后续命令。

    你看到实现这一目标的途径了吗?这会有多复杂?

    TSynCompletion外部事件可以帮助我吗?

    1 回复  |  直到 10 年前
        1
  •  3
  •   Community Mohan Dere    6 年前

    为什么这不起作用

    T同步完成 tokenizer是不可调整的,它基于一个内部过程,该过程根据ASCII标识符字符(a-z,a-z,_,因此它排除了应该作为标识符字符的有问题的反斜杠)来分隔标识符。

    我所说的功能是

    function IsIdentifierChar(p: PChar): boolean; inline; 
    

    来自该单元 合成完成

    决议

    正如您在Q中所指出的,一些事件是可用的,可以用来调整完成的结果。

    第一次分配 代码完成时 事件转到为事件生成的空方法并键入以下代码。

    procedure TForm1.SynCompletion1CodeCompletion(var Value: string;
      SourceValue: string; var SourceStart, SourceEnd: TPoint; KeyChar: TUTF8Char;
      Shift: TShiftState);
    begin
      if SourceStart.x > 0 then
      begin
        if SynEdit1.Lines[SourceStart.y - 1][SourceStart.x-1] = '\' then
        begin
          SourceStart.x -= 1;
          SourceValue := '\' + SourceValue;
        end;
      end;
    end;  
    

    如果不清楚:

    • 检查光标前面的标识符之前是否有一些内容。
    • 如果是,则获取位于光标之前的标识符之前的字符。
    • 如果这个字符是反斜杠,那么我们修改默认标记器找到的变量(将反斜杠添加到源代码中,并减小源代码的起始位置)。
    • 一旦我们的价值观得到修补,完成工作就会很顺利:

    hit ctrl + space

    accept proposal