目前,我有一个进程缓冲区utf-8-auto
(emacs modeline将缓冲区报告为utf-8-auto-dos
)并带有CRLF
样式换行符。当我通过process-send-region
或process-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}}
一切正常。
答案 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