如何将段落分成每个句子一行,但仍保持视觉上的包裹?


14

这类似于使用每行一个句子(既有功能又有动机)来编辑文件,但是我希望有一个完整,流畅的段落,而不是每个句子都有视觉中断。

我希望有一个次要模式,该模式处于活动状态时,将在视觉上联接同一段落中的行(不用\n\nor paragraph-separate或... 分隔),然后激活行为(可能是from派生的visual-line-mode),该行为将换行而不实际插入\n

是否存在这种模式?如果不是,我将如何更改段落的显示属性以实现结果?(毕竟,这是这种模式的症结所在,可以从摘要中开发出来。)


[...]将在视觉上加入[...]。您是要保留基础\n(如果存在),还是要它实际上删除换行符以提供每行1个段落?
Jonathan Leech-Pepin 2014年

1
也许您可以使用buffer-display-table来使换行符\n看起来像是空格或其他东西-参见链接中的以下示例: stackoverflow.com/a/24842771/2112489 这样做的好处是,文件没有修改。新行几乎可以是任何内容-例如,笑脸,空格,稻草人符号等。视觉效果是将发生包裹。
法律列表

@ JonathanLeech-Pepin我想将换行符保留在当前位置。实际上,我想将换行符放在句子结尾,但这可以通过单独的钩子来完成。
肖恩·艾瑞德

1
@lawlist的视觉效果是换行符到处都是,不是吗?难道不是所有段落都会合而为一吗?
马拉巴巴

1
我对此请求表示同情,但认为OP描述的次要模式不是正确的解决方案。潜在的问题是,因为diff是为代码设计的,所以它不适用于文本。由于各种原因,在Emacs中解决此问题是可能的,但不是一个干净的解决方案。最好改进diff以更好地处理文本。
tmalsburg

Answers:


3

正如汤姆所说,将显示属性放在换行符上会很不错。

问题是要找出要换行的行。

这是一个入门的示例:

(let ((eol-regexp "[[:graph:]] ?\\(\n\\)[^\t\n ]"))
  (font-lock-add-keywords nil
   `((,eol-regexp 1 '(face default display " ")))))

(visual-line-mode 1)

如果前面有图形字符并且下一行没有缩进或为空,则将“删除”换行符。您将不得不尝试找到适合您的东西。

一些更多的解释:

  1. font-lock-add-keywords在字体锁定中添加规则列表(因此必须启用字体锁定。第一个参数可以是模式(例如text-mode);在我们的示例中为nil,这意味着仅为当前缓冲区添加规则。
  2. 我们的“规则”是(,eol-regexp 1 '(face default display " "))。第一个元素是我们之前构建的正则表达式;第二个是我们感兴趣的子表达式;第三是我们要应用的“面孔”。
  3. 虽然对换行符使用面孔是没有用的,但我们也可以添加文本属性。因此,我们使用默认面孔,然后添加显示属性witch用空格替换子字符串1(即换行符)。
  4. 如果您自己开枪,请删除缓冲区或使用删除关键字font-lock-remove-keywords
  5. 您可能还想添加displayfont-lock-extra-managed-props(我没有尝试过)。
  6. 棘手的部分是正确获取正则表达式。“ \(\ n \)[^ \ n]”会匹配没有紧随其后的任何换行符。“。\ {30,\} \(\ n \)”将仅匹配至少包含30个字符的换行符。


0

如果我对问题的理解正确,那就是您希望将所有换行符原样保留在缓冲区中。但您想将其中一些显示为空格。然后,您需要自动换行。

对于换行,我认为您可以使用visual-line-mode

为了处理换行符,我认为您可以在要显示的换行符上放置一个display属性" "(带有一个由单个空格组成的字符串)作为值。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.