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

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

是什么让这个问题变得很奇怪:直接从进程写入进程缓冲区的文本不包含^M

源文本的来源似乎没有什么区别,事实上,即使是已经出现在进程缓冲区(不包含^M )的已标记和发送的多行区域,在发送时也会有这些区域。

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

我还应该补充说,传入缓冲区的文本是由一个after-change-functions钩子(根据input做一些着色)来parsing的,所以最后的手段我会在这个传入上做一个额外的正则regexp-replace-in-string文本作为钩函数的一部分,我想避免,因为它似乎是错误的 ,但我会添加它作为一个hacky的解决scheme,如果没有别的作品。

附录

我更新了缓冲区的编码设置,并使用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) 

然后减less到只是…

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

一切正常。

这是因为这些文件在DOS / Windows行尾。 您可以使用Cx [Enter] f unix [Enter]将其转换为Unix编码。

^L是分页符。 我曾多次看到它们将源代码的不同部分(对于文本打印机中的老式列表)分开,或者在文本文档中插入实际的“新页面”命令。

从更新的角度来看, 在这里你可以看到你必须选择set-process-coding-system到正确的编码系统。

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

M-%是query-replace命令。

Cq的意思是“让我键入下一个字符,而不把它解释为RETURN键”。

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