1

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

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

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

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

我还应该补充一点,缓冲区的传入文本是由一个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)

一切正常。

4

3 回答 3

2

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

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

截至更新,您可以在此处看到您必须选择set-process-coding-system正确的编码系统。

于 2010-11-07T22:34:27.110 回答
1

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

M-% 是查询替换命令。

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

于 2010-11-07T22:42:19.787 回答
0

我相信您会因为换行符不一致(例如 windows 换行符与 *nux 换行符)而看到这些,您可能应该尝试dos2unix

于 2010-11-07T22:33:17.937 回答