如何制作一个直截了当的段落中的每个句子占据一行的功能?

时间:2017-01-13 14:53:02

标签: emacs

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

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

  

我的名字是卢卡。我住在二楼。我住在你楼上。是的,我想你以前见过我。如果你听到深夜的事情。有点麻烦。某种打架。

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

  

我的名字是卢卡   我住在二楼   我住在你楼上。
  是的,我想你以前见过我   如果你在深夜听到的话   某种麻烦。
  某种打架。

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

理想情况下,我想要一个可以在自动填充模式与所有句子包裹之间切换显示的功能,并且这个新模式会自动填充并关闭所有句子。

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

@Drew:这是我无法用你的代码拆分的文字:

有两种方法可以启用它:第一种是使用Mx视线模式(对于那些带有真实菜单的人,显然是选项 - >在此缓冲区中包裹线条 - > Word Wrap),这将给你一个模式行中的次模式“换行”。正如在Ch f视线模式中所解释的,该命令的一个效果是巧妙地改变处理“线”的命令的效果:Ca,Ce不再到达行的末尾(如在\ n中) ),但转到行尾(如显示行)。 M-a,M-e仍然可以正常工作。此外,保证垂直分割窗口不会被截断,并在更改宽度时正确调整大小。非常有效,特别是如果你有自由格式文本,你保持版本控制(如Latex中的论文),其中硬包装不能很好地工作。它还使垂直分割更有用,特别是对于巨大的窗户。根据我的经验,它会减慢重绘速度,但这是值得的。

1 个答案:

答案 0 :(得分:2)

我想这样的事情就是你要求的。

(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 "\n"))))))
      (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.