确定Emacs中的线路终止符
我正在编写一个配置文件,我需要定义进程需要的是windows格式文件还是unix格式文件。我已获得所需文件的副本-是否有办法检查它是否使用\n或\r\n而不退出emacs?使用“查找文件”在emacs中打开文件。如果行的末尾有^M个符号,则需要一个windows格式的文本文件。如果在Unix上打开文件时模型行上显示(DOS),则行的结尾为windows样式。如果在Windows上打开文件时显示(Unix),则行尾为Unix样式 从Emacs 22.2手册(节点:模式行): 如果缓冲区的文件使用 回车换行符,冒号 对反斜杠(“\”)或 “(DOS)”,具体取决于操作系统 系统。如果文件仅使用 回车,冒号指示器 更改为正斜杠或正斜杠 (“/”)或“(Mac)”。在一些制度上,, Emacs显示“(Unix)”而不是 冒号,用于将换行符用作 行分隔符 我认为,这里有一个函数显示了如何从elisp检查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手册(节点:模式行): 如果缓冲区的文件使用
(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
。