确定 Emacs 中的行终止符

发布于 2024-07-07 11:23:38 字数 115 浏览 8 评论 0原文

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

I'm writing a config file and I need to define if the process expects a windows format file or a unix format file. I've got a copy of the expected file - is there a way I can check if it uses \n or \r\n without exiting emacs?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

好久不见√ 2024-07-14 11:23:38

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

来自 Emacs 22.2 手册(节点:Mode Line):

如果缓冲区的文件使用
回车换行、冒号
更改为反斜杠 ('\') 或
'(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")))))

If it says (DOS) on the modeline when you open the file on Unix, the line endings are Windows-style. If it says (Unix) when you open the file on Windows, the line endings are Unix-style.

From the Emacs 22.2 manual (Node: Mode Line):

If the buffer's file uses
carriage-return linefeed, the colon
changes to either a backslash ('\') or
'(DOS)', depending on the operating
system. If the file uses just
carriage-return, the colon indicator
changes to either a forward slash
('/') or '(Mac)'. On some systems,
Emacs displays '(Unix)' instead of the
colon for files that use newline as
the line separator.

Here's a function that – I think – shows how to check from elisp what Emacs has determined to be the type of line endings. If it looks inordinately complicated, perhaps it is.

(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")))))
丑疤怪 2024-07-14 11:23:38

如果您进入十六进制模式(Mx 十六进制模式),您应该看到行终止字节。

If you go in hexl-mode (M-x hexl-mode), you shoul see the line termination bytes.

呆头 2024-07-14 11:23:38

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

Open the file in emacs using find-file-literally. If lines have ^M symbols at the end, it expects a windows format text file.

梦亿 2024-07-14 11:23:38

如果文件中没有出现 "\r\n" 终止符,以下 Elisp 函数将返回 nil(否则返回第一次出现的点)。 您可以将其放入 .emacs 中并使用 Mx 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))

The following Elisp function will return nil if no "\r\n" terminators appear in a file (otherwise it returns the point of the first occurrence). You can put it in your .emacs and call it with 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))
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文