(分享)重新排版固定宽度下的文本

有些比较古老的 txt 文本里,使用固定宽度换行,在复制和粘贴的时候,往往需要多几步操作,以让它们符合正常的格式,很麻烦。

举个例子:

这是一个很长的
句子,但是如果
不换行,就会截
断

这是另外一个句
子

理想情况下, 要将这个句子复制,就要将这个被截断的句子,合并成在一个行里:

这是一个很长的句子,但是如果不换行,就会截断

这里是另外一个句子

所以,如下这个简单的脚本是用于应付这个情况的:

(defun my/merge-lines ()
  "将同一段落内的行合并成一行,用一个空格连接,保留空行作为段落分隔。"
  (interactive)
  (save-excursion
    ;; 从缓冲区起始或光标所在位置向后都可以
    (goto-char (point-min))
    ;; 匹配:一个非空白字符、紧跟换行、再跟一个非空白字符
    (while (re-search-forward "\\([^[:space:]\n]\\)\n\\([^[:space:]\n]\\)" nil t)
      ;; 用“字符1 + 空格 + 字符2”替换掉这段
      (replace-match "\\1 \\2"))))
3 个赞

C-x h M-q 也可以,

可能要 C-x ffill-column 设置为较大的值

1 个赞

Emacswiki上抄来的,unfill-paragraph。

(defun unfill-paragraph (&optional region)
  "Make a multi-paragraph REGION into a single line of text."
  (interactive (progn (barf-if-buffer-read-only) '(t)))
  (let ((fill-column (point-max))
        ;; This would override `fill-column' if it's an integer.
        (emacs-lisp-docstring-fill-column t))
    (fill-paragraph nil region)))
2 个赞

试了一下,它的原理是,将固定宽度给设置更长一点,但因为每一个句子,它的字数不是固定的,这么设计…没能满足我的目的。

不过如果有人喜欢阅读固定宽度的文本,这个命令很不错,非常快。

试了一下,只能针对光标所在的这一段连续的文本进行处理。

不能自动对所有段落进行重排,实用性还是我的比较好,一次性能够弄完。

1 个赞

一次性拷贝多个段落的话,给每个段落都跑一下这个函数就行了。

;;; DeepAI produced code

(defun map-paragraph (func &optional beg end)
  "Call FUNC on each paragraph in the region.
If BEG and END are not specified, the entire buffer is used.
BEG and END should be integers or markers, and they default to
the beginning and end of the buffer, respectively."
  (save-excursion
    (let ((start (or beg (point-min)))
          (end (or end (point-max))))
      (goto-char start)
      (while (and (< (point) end)
                  (re-search-forward paragraph-start end t))
        (let ((para-start (match-beginning 0))
              (para-end (save-excursion
                          (goto-char para-start)
                          (forward-paragraph)
                          (min (point) end)))) ; don't go past the end of the region
          (funcall func para-start para-end))))))


(require 'embark)

(defun embark-map-paragraph (func &rest _)
  "Call FUNC on each paragraph in the region or buffer."
  (map-paragraph func (region-beginning) (region-end)))

(embark-define-action map-paragraph embark-map-paragraph
  "Call a function on each paragraph in the region or buffer.")

(embark-bind-action map-paragraph)

哦哦,我的目的其实不是拷贝,而是排版。

主要是,刚才那种固定宽度会截断整个句子,实际上是两个方面的麻烦:阅读、编辑。

所以,还是我自己的方式比较好,你也可以试一试,我觉得挺好用的。

这个是只考虑中文的情况吧,如果是英文呢?

英文也可以,通用的