从 Tmux 运行时,Emacs 中的 Home 和 End 键不起作用

Jan*_*rek 2 terminal emacs xterm tmux

当我从 Tmux 运行 Emacs 时,HomeEnd键不起作用(Home键像C-s按下一样运行搜索命令)。当我在我的~/.bashrc文件中添加这个时,问题就开始了:

TERM="xterm"
export TERM
Run Code Online (Sandbox Code Playgroud)

我在某处读到不应手动设置 TERM 变量,但这是我能够解决颜色问题的唯一方法。如果没有这个设置,我在 Emacs 中直接从终端运行时会得到不同的颜色,而从 Tmux 运行时会出现不同的颜色。当 Emacs 从 Tmux 运行时,此选项导致某些键在 Emacs 中不起作用,因此我将此行添加到我的~/.tmux.conf

set-window-option -g xterm-keys on
Run Code Online (Sandbox Code Playgroud)

这解决了除Homeand之外的所有键的问题End。任何想法如何使这些键再次工作?

Chr*_*sen 8

您可以将tmux视为一个终端模拟器,它提供了一个使用screen基于协议的终端(在“内部”),它可以将其转换为其他终端协议(在“外部”),同时提供窗格、窗口、会话等功能,状态栏等。

由于tmux始终screen在“内部”提供类似终端协议,因此您必须始终screentmux 中使用基于 TERM 的值。此外,您必须在“外部”使用适当的 TERM 值,以便tmux知道如何与运行它的终端通信(通常这是您的终端仿真器,因此使用您的终端仿真器配置为提供的任何终端协议;通常是的变体xterm)。

具体来说,您面临的问题是 a screen Homeis ESC [ 1 ~,而它是ESC O Hin xterm

% tput -T screen khome | xxd
0000000: 1b5b 317e                                .[1~
% tput -T xterm khome | xxd
0000000: 1b4f 48                                  .OH
Run Code Online (Sandbox Code Playgroud)

因此,当tmuxHome从您的终端仿真器获取 a时(通过解码khome附加到tmux会话时生效的 TERM 中的任何内容),它会发送screen-Home ESC [ 1 ~(因为tmux始终screen在“内部”使用协议),但是程序(例如 Emacs)期待xterm-Home ESC O H(因为您告诉它xterm通过设置期待值TERM=xterm)。


我不确定是什么颜色问题导致您尝试切换到TERM=xterminside tmux,但您可能应该尝试确保在“inside”和“outside” tmux 的TERM 值中引用支持颜色的 terminfo 条目:例如配置终端模拟器组TERM到xterm-colorxterm-16colorxterm-88color,或xterm-256color作为合适的; 并set-option -g default-terminal screen-256color在您的tmux配置(或screen-16color)中使用。