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.
如果文件通常有 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
。