每行一句编辑文件


28

有点背景。

我正在尝试对乳胶文档进行版本控制,如果我采用每行一句的方法,该计划的有效性将会大大提高。

例如,以下是我的文档的外观。

Some text here.
New stencence on the same paragraph.
Some more text, still on the same paragraph.

This is another paragraph.

我的问题很简单。
我可以使用Emacs自动化/改善其中的多少?

以下是我要记住的两点。

  1. 我的句子很,因此我需要换行而不实际填充它们。也就是说,一个很长的句子需要在我的屏幕上显示在多行上,但是在“ .tex”文件中必须是一行。最好以不包裹方程式的方式来完成。

    visual-line-mode以窗口宽度包装,该宽度太宽。我需要包装线并将行的宽度限制为80个左右的字符。就像fill-paragraph通常那样,但实际上不会破坏文件中的行。

  2. 我可以在每个句子后面手动换行,但是如果我可以配置fill-paragraph(甚至可以auto-fill-mode)在每行放置一个句子,那将是非常可取的。

1
您到底在进行哪种改进/自动化?您是否想知道如何在这样的文件中进行有效编辑?
林吉angi 2014年

@RangiLin是的。我提到的第一点对我来说是最重要的。但是欢迎采取其他任何措施使其更有效。
马拉巴巴2014年

第一点的描述像visual-line-mode。但是除了换行之外,您还需要在每个句子后自动插入换行符,对吗?
Kaushal Modi 2014年

@kaushalmodi是的,但是每个句子后面的换行符是真实的,应该在文件中。视线模式的问题是默认情况下它太宽了。如果有减少它的方法,那就太好了。
马拉巴巴2014年

@Malabarba:你知道为什么吗?对我来说,这是迄今为止最有用的包装方式...
Tikhon Jelvis

Answers:


11

如果您只想要类似visual-line-mode但可配置的内容,则可以尝试一下longlines-mode,这是我大部分散文所使用的。longlines-mode包裹您的文本,类似于visual-line-mode使用所配置的宽度fill-column

这是fill-column设置为的屏幕截图70(该窗口实际上向右延伸得更多)。

长行模式换行文本的示例。

配置fill-paragraph会很整洁,但是我不确定该怎么做。取而代之的是,这是一个合理的临时技巧:.在TeX模式下使角色变为电动,并插入换行符。这仅涉及以任何适当的模式挂钩重新绑定它:

(defun my-electric-dot ()
  (interactive)
  (insert ".\n"))
(defun my-tex-hook ()
  (local-set-key (kbd ".") 'my-electric-dot))
(add-hook 'TeX-mode-hook 'my-tex-hook)

1
非常感谢您指出延线模式!我设法使其不包装方程式,甚至修复了缩进线的外观。这里是要点gist.github.com/c532f77144ddf86b4ea4.git
Malabarba

@Malabarba:好酷。我可能会自己使用其中一些更改!不过,您的链接无法正常运行;这是一个网络友好的版本:gist.github.com/Bruce-Connor/c532f77144ddf86b4ea4
Tikhon Jelvis 2014年

谢谢。另外,忘了提一下,该建议使用了Latex-extra软件包中的功能。
马拉巴巴2014年

顺便说一句,值得注意的是,longlines-mode在24.4中被标记为过时(不是它具有等效的替代方法),
Malabarba 2014年

2
电子圆点不能很好地工作,因为圆点不仅用于结束句子,而且还用于其他各种目的。最好将一个点后跟两个空格替换为一个点后跟换行符。
tmalsburg

13

对于(1),我将使用扩大的边距,以便visual-line-mode将行换成所需的fill-column。但是,这将影响文本行和方程式。

至于(2),可以定义一个自定义的填充命令来绑定M-q并正确填充段落。我尚未设法编写出具有自动填充正确行为的命令。

在次要模式下包装所有内容,如下所示。它不是很漂亮的代码,但是在大多数情况下应该可以使用。(我已经unfill-paragraphinit.el相当长的一段时间内使用了该功能,而没有注意到问题)。

(define-minor-mode ospl-mode
  "One Sentence Per Line"
  :init-value nil
  :lighter " ospl"
  :keymap (let ((map (make-sparse-keymap)))
            (define-key map (kbd "M-q") 'ospl/fill-paragraph)
            map)

  (if ospl-mode
      (progn
        (visual-line-mode 1)
        (setq right-margin-width (- (window-body-width) fill-column)))
    (visual-line-mode -1)
    (setq right-margin-width 0))

  ;; Account for new margin width
  (set-window-buffer (selected-window) (current-buffer)))


(defun ospl/unfill-paragraph ()
  "Unfill the paragraph at point.

This repeatedly calls `join-line' until the whole paragraph does
not contain hard line breaks any more."
  (interactive)
  (forward-paragraph 1)
  (forward-paragraph -1)
  (while (looking-at paragraph-start)
    (forward-line 1))
  (let ((beg (point)))
    (forward-paragraph 1)
    (backward-char 1)
    (while (> (point) beg)
      (join-line)
      (beginning-of-line))))


(defun ospl/fill-paragraph ()
  "Fill the current paragraph until there is one sentence per line.

This unfills the paragraph, and places hard line breaks after each sentence."
  (interactive)
  (save-excursion
    (fill-paragraph)         ; takes care of putting 2 spaces if needed
    (ospl/unfill-paragraph)  ; remove hard line breaks

    ;; insert line breaks again
    (let ((end-of-paragraph (make-marker)))
      (save-excursion
        (forward-paragraph)
        (backward-sentence)
        (forward-sentence)
        (set-marker end-of-paragraph (point)))
      (forward-sentence) 
      (while (< (point) end-of-paragraph)
        (just-one-space)
        (delete-backward-char 1)
        (newline)
        (forward-sentence))
      (set-marker end-of-paragraph nil)))) 

该段的填充效果很好,我希望我可以接受两个答案。只需替换unfill-paragraphospl/unfill-paragraph。边距也有效,但是缩进的文本看起来很糟糕,并且它们还包裹了等式,而我设法破解了下面的延线方法来解决这两个问题。
马拉巴巴2014年

固定,谢谢。就像我说的那样,我已经很长时间了unfill-paragraph(没有前缀)init.el。我昨天刚前缀它的一致性,并引入了错误....
ffevotte

是的,我想是那样的。我还意识到,只需执行类似的操作,我们就可以填充段落(let ((fill-column 1000000)) (fill-pragraph))。尚未测试过。
马拉巴巴2014年

是的,这样的解决方案有效。我只是不喜欢拥有魔术常数(但是我的代码也不是很漂亮,所以有人可以说哪个更好)...
ffevotte 2014年

1
喜欢这个解决方案。有没有一种简单的方法可以避免将注释行分成多行?
Ramprasad

9

如果使用git diff --color-words或latexdiff,是否可以避免/解决版本控制问题?然后,您可以查看更改的单词。


2
着色词确实很高兴!但是,在合并其他人的贡献和还原旧提交时,我仍然需要olps方法来帮助避免冲突。
马拉巴巴2014年

2

一种改进(我有时使用)的方法是,通过使用AUCTeX的一部分来折叠换行符,将换行符显示为彼此tex-fold连续的句子。

这意味着

Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Mauris pellentesque fringilla justo, quis dapibus velit tincidunt quis?
Quisque varius ligula arcu, ut imperdiet risus maximus nec.

折叠到

Lorem ipsum dolor sit amet, consectetur adipiscing elit⁎ Mauris pellentesque fringilla justo, quis dapibus velit tincidunt quis❓  Quisque varius ligula arcu, ut imperdiet risus maximus nec⁎

我最近将其作为次要模式放在了一个包中。也许其他人也会发现这个有用:https : //github.com/andersjohansson/tex-fold-linebreaks

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.