Emacs在进程缓冲区中显示^ M.

时间:2010-11-07 22:28:52

标签: windows emacs character-encoding line-endings

目前,我有一个进程缓冲区utf-8-auto(emacs modeline将缓冲区报告为utf-8-auto-dos)并带有CRLF样式换行符。当我通过process-send-regionprocess-send-string将多行文本写入缓冲区时,每行都以^M为后缀。

使这个问题变得奇怪的是,直接从进程写入进程缓冲区的文本不包含^M

源文本来自哪里似乎没有任何区别,实际上,甚至标记和发送的多行区域已经出现在进程缓冲区中(不包含^M)发送时会有它们。

注意 process-send-region的源文本将始终来自Emacs缓冲区,process-send-string,当多行将从Windows剪贴板界面到killring时,或者再次从Emacs缓冲区杀死。)

我还应该补充说,缓冲区的传入文本是由after-change-functions钩子解析的(根据输入进行一些着色)所以最后一点我还需要另外regexp-replace-in-string传入的文本作为该钩子函数的一部分,我想避免这种情况,因为它似乎错误,但如果没有别的办法,我会把它添加为hacky解决方案。

附录

我更新了缓冲区的编码设置,并且使用utf-8-dos代替utf-8-auto^M消失了(switch-to-buffer "sock-buffer") (set-process-coding-system (get-process sock-process) 'utf-8-dos 'utf-8-dos) (set-buffer-file-coding-system 'utf-8-dos nil) (set-buffer-process-coding-system 'utf-8-dos 'utf-8-dos)

所以在我的应用程序的缓冲区设置部分,我做了......

(switch-to-buffer "sock-buffer")
(set-buffer-process-coding-system 'utf-8-dos 'utf-8-dos)

然后把它简化为......

{{1}}

一切正常。

3 个答案:

答案 0 :(得分:2)

这是因为这些文件在DOS / Windows行结尾。您可以使用C-x [Enter] f unix [Enter]将它们转换为Unix编码。

^L是一个分页符。我有时会看到它们将源代码的不同部分(文本打印机中的旧式列表)分开,或者在文本文档中插入实际的“新页面”命令。

自更新here起,您可以看到必须选择set-process-coding-system到正确的编码系统。

答案 1 :(得分:1)

作为dos2unix方法的替代,您可以使用Emacs中的一个MULE命令,或者(我最喜欢的),因为这些字符被错误地视为文本的一部分,您可以使用命令替换它们替换文本中的字符串:M-%Cq CM RETURN

M-%是query-replace命令。

C-q表示“让我输入下一个字符而不将其解释为RETURN键”。

答案 2 :(得分:0)

我相信你看到的是因为你的换行符不一致(例如windows newlines vs * nux),你应该尝试dos2unix