目前,我有一个进程缓冲区是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缓冲区移至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