确定Emacs中的行终止符

时间:2008-10-24 17:26:49

标签: emacs elisp text-files eol

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

4 个答案:

答案 0 :(得分: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")))))

答案 1 :(得分:2)

如果你进入hexl模式(M-x hexl-mode),你应该看到行终止字节。

答案 2 :(得分:0)

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

答案 3 :(得分: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))