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

时间:2015-08-01 16:51:13

标签: autocomplete lazarus tex synedit

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

TSynTeXSyn语法高亮显示器很好地突出了TeX语法。

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

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

我尝试将一个以反斜杠开头的所有项目的列表分配给TSynAutoComplete组件的ItemList属性,但是在完成后又给了我一个反斜杠(不计算第一个反斜杠作为未完成前缀的一部分并添加另一个作为列表项的一部分)。

我尝试分配一个没有反斜杠的列表,但它可以完成文本中任何地方的单词,无论反斜杠是否先行。

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

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

您是否看到了实现这一目标的途径?这会怎么复杂?

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

1 个答案:

答案 0 :(得分:2)

为什么这不起作用

TSynCompletion tokenizer不可调整,它基于一个内部过程,根据ASCII标识符字符(az,AZ,_)分隔标识符,因此它排除了应该采取的有问题的反斜杠标识符字符)。

我谈到的功能是

function IsIdentifierChar(p: PChar): boolean; inline; 
来自单位 SynCompletion

分辨率

正如您在Q中所述,某些事件可用,可用于调整完成结果。

第一次分配 OnCodeCompletion 事件。转到为事件生成的空方法,然后键入以下代码。

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