关于emacs:如何制作一个让段落中的每个句子占一行的功能?

How to make a function that makes each sentence in a paragraph occupy one line?

我使用 emacs 进行创意写作。为了更好地分析我的句子结构,我希望我的段落显示为每行一个句子。所以我需要一个可以采用正常的自动填充段落并执行以下操作的函数:1)将所有句子拉伸成一行,2)每行只放一个句子。

想象一下我写了以下段落(来自 Suzanne Vega 的歌词)

My name is Luka. I live on the second floor. I live upstairs from you. Yes I think you've seen me before. If you hear something late at night. Some kind of trouble. Some kind of fight.

使用我想要的功能,段落将如下所示:

My name is Luka.
I live on the second floor.
I live upstairs from you.
Yes I think you've seen me before.
If you hear something late at night.
Some kind of trouble.
Some kind of fight.

由于我想在这样显示句子时进行一些写作,所以该功能除了拉伸句子之外还应该关闭自动填充模式。

理想情况下,我想要一个功能,它可以在自动填充模式(所有句子都被包裹)和这种新模式(自动填充关闭并且所有句子被拉伸)之间切换显示。

提前感谢各种建议或帮助制作这样一个功能!

@Drew:这是我无法与您的代码分开的文本:

有两种方法可以启用它:第一种是使用 Mx visual-line-mode(对于那些有真实菜单的人,显然是 Options->Line Wrapping in this Buffer->Word Wrap),它会给你一个次要模式一个€?wrapa€?在模式行。正如 Ch f visual-line-mode 中所解释的,该命令的效果之一是巧妙地改变了处理 a€?linesa€? 的命令的效果:Ca、Ce 不再走到行尾(如在 \\\\
),但转到行尾(如显示行)。 M-a,M-e 仍然可以正常工作。此外,垂直分割窗口保证不会被截断,并在改变宽度时适当调整大小。效果非常好,特别是如果您有自由格式的文本,并且您在版本控制中保留(如 Latex 中的论文),而硬package不能很好地工作。它还使垂直拆分更加有用,尤其是对于巨大的窗口。根据我的经验,它会稍微减慢重绘速度,但值得。


我想这就是你想要的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
(defun split-para-at-sentence-ends ()
 "Split current paragraph into lines with one sentence each.
Then turn off `auto-fill-mode'."
  (interactive)
  (let ((mode  major-mode))
    (unwind-protect
         (progn (text-mode)
                (save-excursion
                  (let ((emacs-lisp-docstring-fill-column  t)
                        (fill-column                       (point-max)))
                    (fill-paragraph))
                  (let ((bop  (copy-marker (progn (backward-paragraph) (point))))
                        (eop  (copy-marker (progn (forward-paragraph)  (point)))))
                    (goto-char bop)
                    (while (< (point) eop)
                      (forward-sentence)
                      (forward-whitespace 1)
                      (unless (>= (point) eop)
                        (delete-horizontal-space)
                        (insert"\
"))))))
      (funcall mode)))
  (auto-fill-mode -1))

(define-minor-mode split-para-mode
   "Toggle between a filled paragraph and one split into sentences."
  nil nil nil
  (if (not split-para-mode)
      (split-para-at-sentence-ends)
    (auto-fill-mode 1)
    (fill-paragraph)))

(global-set-key"\\C-o" 'split-para-mode) ; Or some other key.