为什么 emacs elisp 函数“向前搜索”不能再找到回车符?

问题描述 投票:0回答:1

emacs 缓冲区中的 dos2unix 转换代码在某个时候停止工作。我从 90 年代 (emacs 19) 就开始使用它,但我不知道它什么时候停止工作。

;;; Dos to Unix conversion in buffer
(defun dos2unix ()
  "convert <CR><LF> characters in buffer to <LF>."
  (interactive)
  (save-excursion
    (goto-char (point-min))
    (while (search-forward "\015\012" nil t)
      (replace-match "\012" nil t))))

对于 Windows emacs 27.2 或 25.3,在具有已知 DOS 行终止符 (0x0d 0x0a) 的文件中,它根本找不到回车符。

我试过分别搜索回车符和换行符。它发现换行符很好,但不是回车符。 我尝试了其他语法变体: ,\x0d, , \C-m, (string ?\C-m) 只是找不到它们。 我也尝试使用 re-search-forward 或 search-forward-regexp 代替 search-forward.

emacs elisp dos2unix
1个回答
0
投票

如果文件通常有 CRLF 行结尾,那么 Emacs 会识别并无缝地使用该格式而不显示 CR 字符。同样,如果只有 CR 而没有 LF,它会将其识别为旧的 MacOS 格式,并无缝显示文件,就像使用 LF 一样,而不是一长行。

模式行显示识别的语法。在您的情况下,您会在模式行的左下方看到

(DOS)
。如果您用鼠标单击它,它将循环显示三个选项(为简洁起见,典型的 Unix 样式显示为
:
)。

如果切换到 Unix 行尾,缓冲区将被修改,因为 CR 将被删除(您可以通过 M-x

diff-buffer-with-file
确认),因此您可以保存缓冲区。

像这样点击模式行就是调用这个命令:

(defun mode-line-change-eol (event)
  "Cycle through the various possible kinds of end-of-line styles."
  (interactive "e")
  (with-selected-window (posn-window (event-start event))
    (let ((eol (coding-system-eol-type buffer-file-coding-system)))
      (set-buffer-file-coding-system
       (cond ((eq eol 0) 'dos) ((eq eol 1) 'mac) (t 'unix))))))

因此直接执行此操作的代码为:

(set-buffer-file-coding-system 'unix)

请注意,如果文件内容 不明确 关于行尾,那么不一致将是可见的,并以您的原始代码为准。

例如,如果在其他类似 Unix 的文件中有一个 CRLF 案例,您会看到 CR 和您的函数将能够替换它。

因此我建议您通过first调用

set-buffer-file-coding-system
然后像以前一样继续更新您的功能。

有关更多信息,请参见C-hig

(emacs)Text Coding

© www.soinside.com 2019 - 2024. All rights reserved.