运行跨平台shell(如Bash或zsh)的最大好处是可以在多个平台上使用相同的语法和脚本。在Windows上设置(替换)shell很麻烦,但回报远远超过这一小小的努力。Windows上Emacs中的zshshellMSYS2子系统允许您在Windows上运行Bash或zsh等shell。使用MSYS2确保搜索路径都指向MSYS2子系统本身很重要:依赖项太多。安装MSYS2后,默认shell为Bash;zsh可以通过包管理器安装:pacman-Syzsh可以通过修改etc/passwd文件来设置zsh为默认shell,例如:mkpasswd-c|sed-e's/bash/zsh/'|tee-a/etc/passwd这会将默认shell从bash更改为zsh。要在Windows上的Emacs中运行zsh,请修改shell-file-name变量以指向MSYS2子系统中的zsh二进制文件。该二进制shell位于Emacsexec-path变量中的某处。(setqshell-file-name(executable-find"zsh.exe"))不要忘记修改EmacsPATH环境变量,因为MSYS2路径应该在Windows路径之前。继续前面的例子,假设MSYS2安装在c:\programs\msys2,那么执行:(setenv"PATH""C:\\programs\\msys2\\mingw64\\bin;C:\\programs\\msys2\\usr\\local\\bin;C:\\programs\\msys2\\usr\\bin;C:\\Windows\\System32;C:\\Windows")在Emacs配置文件中设置这两个变量,在Emacs中运行:M-xshell应该可以看到熟悉的zsh提示符。Emacs的终端设置(eterm)不同于MSYS2的标准终端设置(xterm-256color)。这意味着某些插件和主题(提示)可能无法正常工作——尤其是在使用oh-my-zsh时。检测在Emacs中运行的zsh很简单,使用变量$INSIDE_EMACS。以下片段取自.zshrc(在交互式shell模式下启动时加载),当zsh在Emacs中运行时启动git插件并更改主题:#DisablesomepluginswhilerunninginEmacsif[[-n"$INSIDE_EMACS"]];然后plugins=(git)ZSH_THEME="simple"elseZSH_THEME="compact-grey"fi通过将INSIDE_EMACS变量设置为本地~/.ssh/config文件中的SendEnv变量...主机myhostSendEnvINSIDE_EMACS...也设置到ssh服务器的/etc/ssh/sshd_config中的AcceptEnv变量...AcceptEnvLANGLC_*INSIDE_EMACS...这使得在Emacsshell会话中通过ssh登录到另一个运行zsh的ssh服务器也非常有效。Windows下的Emacs在zsh上通过ssh远程登录时,记得使用参数-t,-t参数会强制分配一个伪终端(这是需要的,因为Windows下的Emacs没有真正的tty)。跨平台、开源真是好东西……
