共114行

windows 下配置emacs

2026-02-07 02:22:58

你在Windows下使用Emacs的shell(如eshell、shell-mode)时出现了乱码问题,这是Windows系统编码与Emacs编码不兼容导致的,以下是针对性的完整解决方案,从核心配置到分场景优化逐一说明:

一、核心配置:统一Emacs与Windows shell编码

在你的 init.el 配置文件中添加以下代码,优先解决编码不匹配的核心问题:

;; 1. 全局UTF-8编码(基础,确保Emacs自身编码统一)
(set-language-environment "UTF-8")
(set-default-coding-systems 'utf-8)
(set-buffer-file-coding-system 'utf-8)
(set-clipboard-coding-system 'utf-8)
(set-file-name-coding-system 'utf-8)
(set-keyboard-coding-system 'utf-8)
(set-terminal-coding-system 'utf-8)
(prefer-coding-system 'utf-8)

;; 2. Windows shell 编码适配(核心解决shell乱码)
;; 针对 cmd.exe / PowerShell 的编码映射
(setq process-coding-system-alist
      (append '(("cmd" . (utf-8 . gbk))
                ("powershell" . (utf-8 . gbk))
                ("pwsh" . (utf-8 . gbk))
                (eshell . (utf-8 . utf-8)))
              process-coding-system-alist))

;; 3. 强制设置shell输出编码为GBK(Windows默认控制台编码)
(setq default-process-coding-system '(utf-8 . gbk))

关键说明:

Windows的 cmd.exePowerShell 默认使用 GBK/GB2312 编码(中文系统),而Emacs默认使用UTF-8编码,两者编码不匹配是乱码的根本原因。上述配置通过 process-coding-system-alistdefault-process-coding-system 建立了Emacs与Windows shell的编码映射,实现双向兼容。

二、分场景针对性优化

场景1:Eshell(Emacs内置shell)乱码

Eshell是Emacs原生shell,额外添加以下配置确保无乱码:

;; Eshell 专属编码配置
(defun eshell-mode-setup ()
  (set-buffer-process-coding-system 'utf-8 'utf-8)
  (setq eshell-output-encoding 'utf-8)
  (setq eshell-input-encoding 'utf-8))
(add-hook 'eshell-mode-hook 'eshell-mode-setup)

;; 可选:Eshell 中文显示优化
(setq eshell-prefer-lisp-functions nil) ; 避免部分命令输出异常

场景2:Shell-Mode(调用外部cmd/PowerShell)乱码

如果使用 M-x shell 调用外部终端出现乱码,添加以下钩子配置:

;; Shell-Mode 启动时自动配置编码
(defun shell-mode-setup ()
  (set-buffer-process-coding-system 'utf-8 'gbk)
  (setq comint-output-filter-functions
        (remove 'comint-postoutput-scroll-to-bottom
                comint-output-filter-functions)))
(add-hook 'shell-mode-hook 'shell-mode-setup)

;; 解决Windows下shell命令输出换行异常(附带优化)
(setq comint-process-echoes t)
(setq comint-scroll-to-bottom-on-output t)

场景3:PowerShell(pwsh)专属优化

若优先使用PowerShell 7+(pwsh),补充以下配置:

;; 设置默认shell为pwsh(可选,优先使用新版PowerShell)
(setq explicit-shell-file-name "C:/Program Files/PowerShell/7/pwsh.exe")
(setq shell-file-name explicit-shell-file-name)

;; pwsh 编码强制适配
(defun pwsh-mode-setup ()
  (set-buffer-process-coding-system 'utf-8 'gbk))
(add-hook 'powershell-mode-hook 'pwsh-mode-setup)

三、系统层面辅助配置(可选,彻底根治编码问题)

如果上述Emacs配置仍无法解决乱码,可修改Windows系统控制台编码,从根源上统一编码:

  1. 管理员身份打开 cmd.exe

  2. 执行以下命令,设置控制台默认编码为UTF-8:

    chcp 65001
  3. (永久生效)修改注册表(谨慎操作):

四、配置生效与验证

  1. 保存 init.el 文件(C-x C-s
  2. 使配置生效(二选一):
  3. 验证:

总结

  1. Windows Emacs shell乱码的根本原因是Emacs(UTF-8)与Windows控制台(GBK)编码不匹配;
  2. 核心解决方案是通过 process-coding-system-alistdefault-process-coding-system 建立编码映射;
  3. 分Eshell、Shell-Mode、PowerShell场景优化,可针对性解决不同shell的乱码问题;
  4. 系统层面执行 chcp 65001 并修改注册表,可永久统一控制台编码,彻底根治乱码。