4

我正在编写一个配置文件,我需要定义该过程是否需要 Windows 格式文件或 unix 格式文件。我有一份预期文件的副本 - 有没有办法在不退出 emacs 的情况下检查它是使用 \n 还是 \r\n ?

4

4 回答 4

7

如果在 Unix 上打开文件时模式行上显示 (DOS),则行尾是 Windows 样式的。如果在 Windows 上打开文件时显示 (Unix),则行尾是 Unix 风格的。

来自 Emacs 22.2 手册(节点:模式行):

如果缓冲区的文件使用回车换行,则冒号将更改为反斜杠 ('\') 或 '(DOS)',具体取决于操作系统。如果文件只使用回车,冒号指示符将变为正斜杠 ('/') 或 '(Mac)'。在某些系统上,对于使用换行符作为行分隔符的文件,Emacs 会显示 '(Unix)' 而不是冒号。

这里有一个函数——我认为——展示了如何从 elisp 中检查 Emacs 确定的行尾类型。如果它看起来异常复杂,也许它是。

(defun describe-eol ()
  (interactive)
  (let ((eol-type (coding-system-eol-type buffer-file-coding-system)))
    (when (vectorp eol-type)
      (setq eol-type (coding-system-eol-type (aref eol-type 0))))
    (message "Line endings are of type: %s"
             (case eol-type
               (0 "Unix") (1 "DOS") (2 "Mac") (t "Unknown")))))
于 2008-10-24T17:40:40.117 回答
2

如果您进入 hexl-mode (Mx hexl-mode),您应该会看到行终止字节。

于 2008-10-24T19:39:23.513 回答
0

使用 find-file-literally 在 emacs 中打开文件。如果行末尾有 ^M 符号,则它需要一个 windows 格式的文本文件。

于 2008-10-24T17:30:50.793 回答
0

nil如果文件中没有出现终止符,则以下 Elisp 函数将返回"\r\n"(否则它返回第一次出现的点)。你可以把它放在你的.emacs并用M-x check-eol.

(defun check-eol (FILE)
  (interactive "fFile: ")
  (set-buffer (generate-new-buffer "*check-eol*"))
  (insert-file-contents-literally FILE)
  (let ((point (search-forward "\r\n")))
    (kill-buffer nil)
    point))
于 2008-10-24T18:11:14.377 回答