如何修复tmux终端类型切换及Emacs功能键失效问题
我来帮你彻底解决这个问题,分步骤说清楚:
为什么tmux会把TERM改成screen?
tmux作为终端复用器,核心是要给你提供一个跨终端一致的运行环境。不管你用的是xterm、iTerm2还是其他终端,tmux内部都会把终端类型统一设为screen(或者screen-256color)——这是因为早期screen是最普及的终端复用器,很多程序都对它的终端特性做了兼容,tmux沿用这个设定是为了最大化兼容性,避免不同终端的特性差异导致显示错乱或功能失效。
但这就会带来你遇到的问题:Emacs对screen和xterm的颜色渲染、功能键映射逻辑不一样,所以出现颜色变了、F3/F4这类键失效的情况。
从根源解决:阻止tmux修改终端类型
最治本的方法是让tmux直接使用xterm类的终端类型,这样整个环境的TERM都保持一致,不用每次启动Emacs都手动设置。具体操作:
- 编辑tmux的配置文件
~/.tmux.conf(如果没有就新建一个) - 添加以下两行配置:
set -g default-terminal "xterm-256color" set -ga terminal-overrides ',xterm-256color:Tc'
- 第一行:把tmux的默认终端类型设为
xterm-256color,支持256色显示,和你外部终端的类型匹配 - 第二行:开启真彩色支持(如果你的终端支持真彩色的话),避免Emacs里的颜色显示偏色
- 保存配置后,要么关闭所有tmux会话重新打开,要么在tmux里按
Ctrl+B然后输入:source ~/.tmux.conf来加载新配置
这样之后,你在tmux里查看echo $TERM,应该会显示xterm-256color,Emacs的颜色和功能键都会正常工作。
备选方案:只给Emacs单独适配
如果你不想修改全局的tmux终端类型,也可以在Emacs的配置里做针对性处理:
编辑你的Emacs配置文件(比如~/.emacs或者~/.emacs.d/init.el),添加这段Elisp代码:
(when (getenv "TMUX") (setenv "TERM" "xterm-256color") (setq term-setup-hook nil) (term-mode))
这段代码会在Emacs启动时自动检测是否处于tmux环境,如果是,就把TERM改成xterm-256color,同时重置终端相关的钩子,修复功能键映射问题。
额外修复功能键(F3/F4)失效
如果上面的配置后功能键还是有问题,可能是tmux对功能键的转义序列映射不对。你可以先在终端(tmux内外都试试)里输入cat -v,然后按F3/F4,看看输出的转义序列是什么。比如F3可能输出^[[13~,F4输出^[[14~。
然后在~/.tmux.conf里添加:
set -g terminal-overrides ',*:kf3=\E[13~,kf4=\E[14~'
把里面的转义序列换成你刚才用cat -v查到的内容,保存后重新加载tmux配置,功能键就能正常作为宏快捷键使用了。
内容的提问来源于stack exchange,提问作者Ness

