确定Emacs中的线路终止符

确定Emacs中的线路终止符,emacs,elisp,text-files,eol,Emacs,Elisp,Text Files,Eol,我正在编写一个配置文件,我需要定义进程需要的是windows格式文件还是unix格式文件。我已获得所需文件的副本-是否有办法检查它是否使用\n或\r\n而不退出emacs?使用“查找文件”在emacs中打开文件。如果行的末尾有^M个符号,则需要一个windows格式的文本文件。如果在Unix上打开文件时模型行上显示(DOS),则行的结尾为windows样式。如果在Windows上打开文件时显示(Unix),则行尾为Unix样式 从Emacs 22.2手册(节点:模式行): 如果缓冲区的文件使用

我正在编写一个配置文件,我需要定义进程需要的是windows格式文件还是unix格式文件。我已获得所需文件的副本-是否有办法检查它是否使用\n或\r\n而不退出emacs?

使用“查找文件”在emacs中打开文件。如果行的末尾有^M个符号,则需要一个windows格式的文本文件。

如果在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")))))

如果文件中没有出现终止符,则以下Elisp函数将返回
nil
“\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))

如果在hexl模式(M-x hexl模式)下运行,您应该会看到行终止字节。

但Emacs的现代版本在加载时将CRLF转换为LF(保存时返回),因此缓冲区中不会有任何字符。您需要检查缓冲区的编码系统。是的,它会,但您没有提到首先使用“查找文件”。这假设您没有在Windows上运行。在那里,modeline应该是\r\n或(Unix)for\n。OP肯定想要一个编程解决方案,而不是对modeline进行目视检查吗?不!想要一个可视化的,尽管elsip很好。在Emacs的现代版本中,用
cl-case
替换
case
,并加载
cl-lib