如何使TSynEdit的自动换行与TMemo相同?

7
我正在使用TSynEdit作为更加用户友好的TMemo,主要是因为高级快捷键、撤销/重做等功能。
其他方面都还不错,只是自动换行的行为有些问题,请查看下面附上的截图,SynEdit在最左边显示了奇怪的空格。
如何避免这种情况并使其看起来像TMemo?

enter image description here

TSynEdit的关键属性设置:

    synEdit1.UseCodeFolding := False;
    synEdit1.Options := [eoAutoIndent, eoDragDropEditing, eoEnhanceEndKey, 
eoGroupUndo, eoScrollPastEol, eoSmartTabDelete, 
eoSmartTabs, eoTabsToSpaces];
      synEdit1.ScrollBars := ssVertical;
      synEdit1.TabWidth := 4;
      synEdit1.WantTabs := True;
      synEdit1.WordWrap := True;
      synEdit1.FontSmoothing := fsmNone;

我也找不到方法。 - Jerry Dodge
@RudyVelthuis 对于eoAutoIndent的注释是“将在新行上使用与前一行相同数量的前导空格缩进插入符”,但是这个选项以及其他所有eoXXX选项(包括eoTrimTrailingSpaces)似乎对屏幕截图中的行为没有任何影响:唯一有影响的是SynEdit的WordWrap属性。对于SynMemo也是如此。 - MartynA
@DavidHeffernan,没错,这就是意图。我猜这并不容易,因为你必须理解库的架构并阅读源代码。 - Edwin Yip
好的,这不难。找到控件的Paint方法,然后从那里开始。 - David Heffernan
它将包裹的字符放置在下一行的开头,而不是上一行的结尾。例如,在TMemo中,ofthe之间的空格位于第一行的末尾,在TSynEdit中则位于第二行的开头。 - Brian
显示剩余4条评论
1个回答

4
这不是完整的、经过测试的答案,但可以为决心解决问题的读者提供一个功能性解决方案的起点。
TSynEdit的换行行为取决于其当前的TSynWordWrapPlugin。默认插件定义在SynEditWordWrap.Pas中,并包含从第512行开始的TSynWordWrapPlugin.WrapLines方法,在我使用D10.2.3 GetIt Manager下载的版本中。
从第560行开始,有一段代码块,据我所知,解决了每个换行行开头的空格问题,就像q中所示。
      if Editor.IsWordBreakChar(vRunner^) then
      begin
        vRowEnd := vRunner;
        break;
      end;
      Dec(vRunner);
vRunnervRowEnd是在WrapLines方法中使用的多个PWideChar变量之一。
观察这段代码的行为,它位于一个while循环内(该循环正在寻找执行单词换行的位置),因此当Editor.IsWordBreakChar(vRunner^)返回true时,vRunner指针已经向后移动超过了单词断点字符,这就是为什么空格会出现在下一行上,并导致OP指出的问题的原因。
将代码更改为:
      if Editor.IsWordBreakChar(vRunner^) then
      begin
        {ma} Inc(vRunner);  //  WARNING: not fully tested
        vRowEnd := vRunner;
        break;
      end;
      Dec(vRunner);

强制vRunner指针向前移到单词换行符之后,使空格包含在行末而不是下一行的开头,这样SynEdit就显示其换行文本与标准TMemo相同。

个人而言,我不会使用此更改,而是会尝试说服SynEdit开发人员提供官方解决方案。如果我确实使用了上面显示的更改,我肯定不会通过更改SynEditWordWrap.Pas源代码来进行操作,而是会编写一个替代TSynWordWrapPlugin的程序,并包括检查inc(vRunner)是否超出用于执行单词换行的缓冲区的有效边界的功能。


谢谢提醒!当我在使用TSynEdit不仅仅是作为备忘录时,我一定会进一步研究它。 - Edwin Yip
我确认@MartynA建议的更改第一次尝试就成功了!我会继续监控可能出现的问题,并在此更新。 - Edwin Yip
不可能同时进行包装和折叠,但在高级版本中可能会实现。 - undefined

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