【问题标题】:Emacs showing ^M in a process bufferEmacs 在进程缓冲区中显示 ^M
【发布时间】:2011-05-06 10:11:23
【问题描述】:

目前,我有一个进程缓冲区,它是utf-8-auto(emacs 模式将缓冲区报告为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 钩子解析(根据输入进行一些着色)所以最后的手段我会在这个传入的文本上做一个额外的 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)

一切正常。

【问题讨论】:

  • 请注意更新,我已经将问题细化到特定用例,使用进程缓冲区,在这种情况下,dos2unix 方法不相关,但是,我能够处理这个使用 emacs-lisp 插入的文本。

标签: windows emacs character-encoding line-endings


【解决方案1】:

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

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

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

【讨论】:

  • 仅供参考,这是从 Emacs 中的任何缓冲区发送到 process-send-region 或通过 Windows 剪贴板发送到 process-send-string 的文本。
  • 已更新。看来您必须明确设置流程编码。
  • @Diego,我先试试set-process-coding-system
  • 您可以试试utf-8-dosutf-8-unix 看看这是否会改变什么?
  • 我将与进程和缓冲区相关的所有编码更改为utf-8-dos,一切正常,谢谢,我在问题文本中添加了更多细节。
【解决方案2】:

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

M-% 是查询替换命令。

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

【讨论】:

  • @slomojo 如果您不想以交互方式执行此操作,请使用 replace-string 而不是 query-replace。您在复制粘贴评论之前阅读了答案吗?
  • 在我尝试过set-process-coding-system 之后,我会看看replace-string 的方法。
  • 因为进程缓冲区有一个'after-change-functions 钩子,我需要将替换为regexp-replace-in-string - 这是我怀疑我需要做的,我只是希望有我可以用来避免这种开销的编码设置。 - 在标记“正确”答案之前,我会尝试一下 Diego 的编码方法。
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-13
    相关资源
    最近更新 更多