Emacs term-mode 中的 Unicode 字符

11

我在正常的终端会话中使用ansi-term。我倾向于在我的提示符中使用Unicode字符,以根据我正在使用的源代码控制类型设置尾随字符。

对于git存储库,我使用字符"±"作为我的提示符。

在Emacs的ansi-term中,我的提示符不会呈现为Unicode,而是显示为"\ 302\ 261"。显示当前编码系统显示它默认为utf-8-unix以供进程输入,但是我得到了原始二进制解码输出。我可以按C-c RET p更改编码和解码编码系统。当我启动终端时,我想自动设置它,但无法做到? 我尝试添加到term-mode-hook以将缓冲区的编码系统设置为无效。 我认为我在term.el中找到了我要找的内容,但是我不想调整分发elisp,而且似乎添加了原始二进制以修复其他地方的错误。

编辑:最初这不清楚。 我在MacOS上使用Cocoa化的Emacs 23.3运行ansi-term时,存在设置默认过程编码系统的问题。 Emacs本身没有在终端中运行,我的终端在Emacs中运行。

3个回答

17
以下方法对我有效:
(add-hook 'term-exec-hook
          (function
           (lambda ()
             (set-buffer-process-coding-system 'utf-8-unix 'utf-8-unix))))

ansi-term 似乎忽略了 default-process-coding-system 变量,因此我不得不在执行我的 shell 后在缓冲区本地设置它。


那不起作用;钩子在通过ansi-term切换缓冲区之前运行。但我已经通过defadvise解决了这个问题。 - Matt Erickson
这个问题在我和@MattErickson的建议之间得到了解决。现在我可以在Emacs中使用zshrinarirails c了! - duma

8

在更好地理解term.el之后,以下工作得以完成:

(defadvice ansi-term (after advise-ansi-term-coding-system)
    (set-buffer-process-coding-system 'utf-8-unix 'utf-8-unix))
(ad-activate 'ansi-term)

尝试使用 term-mode-hook 会出现错误,因为在 term.el 中,term-mode-hook 在切换到终端缓冲区之前被调用,所以 set-buffer-process-coding-system 由于缺少与缓冲区关联的进程而无法正常工作。

我想问一下,术语模式在切换之前执行钩子是否不寻常?也许应该修复一下。 - Joseph Garvin
“‘set-buffer-process-coding-system’ 仅适用于交互式使用;请改用 ‘set-process-coding-system’。”:warning “Compile-Log - Amelio Vazquez-Reina
term-mode-hook运行时,术语缓冲区始终是当前的。 "缺少进程"问题的实际原因是make-termterm-ansi-make-term在创建进程之前调用term-mode。 (termansi-term随后再次调用term-mode,因此当您查看代码时,问题并不像可能那样明显。)正如David Goodlad的答案所示,最好的解决方案是改用term-exec-hook,它在创建进程后运行。 - phils

6

尝试

(set-terminal-coding-system 'utf-8-unix)

正确的快捷键是 C-x RET t 而不是 C-x RET p


所以 C-x RET p 有帮助吗? 除非 C-h v default-process-coding-system(utf-8-unix . utf-8-unix),否则请尝试。

(setq default-process-coding-system '(utf-8-unix . utf-8-unix))

我认为你的意思是“C-x RET t”。 - zev
据我理解,这设置了Emacs用来解释其运行在其中的终端的编码系统。 - Matt Erickson
在MacOS 10.7上的Emacs 23.3中,设置终端编码系统没有任何作用,而设置进程编码系统则可以使其正常工作。我是通过Cocoa运行Emacs而不是作为命令行应用程序-在查看我的原始问题时,这一点并不清楚。 - Matt Erickson
我调整了我的答案,看看是否有帮助。 - Michael Markert
我已经在我的.emacs文件中设置了那个变量。term.el的源代码似乎强制使用原始编码,引用了某个地方的错误。我还尝试添加了一个term-mode-hook,但那似乎只会让终端挂起。 - Matt Erickson
(set-terminal-coding-system 'utf-8-unix) 像魔法一样奏效。emacs 24.5 - userx

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接