【问题标题】:How do I find out what escape sequence my terminal needs to send?如何找出我的终端需要发送的转义序列?
【发布时间】:2026-01-20 02:55:02
【问题描述】:

我正在使用 osX 上的终端应用程序连接到 ubuntu(我认为是 12.04)。我的终端默认设置为 xerm-256。在这种模式下,当按下 F2 时,终端会发送 \033OQ 的序列。但是 Shift-F2 或 Control-F2 没有映射。也没有为 Shift-Left、Shift-Right、Control-Left、Control-Right 等设置序列。我需要其中一些键来不时地在各种程序中操作功能。以byobu为例。 Shift-F2 和 Control-F2 用于垂直和水平分割屏幕。在 tmux 中,箭头键与 shift 和 control 一起用于调整窗格大小。

我的问题是我不知道终端应该发送什么序列。我如何找出这些序列应该是什么?我知道我可以按 Control-v 然后按一个键来获取正在接收的代码,但这不是我需要的。我不需要查看正在发送什么序列。我需要知道我需要发送什么序列。

例如,我的左箭头发送 ^[OD.我的 Control-Left 发送 ^[[5D]。但是我的上下键没有区别。我的向下发送 ^[OB 并且 Control-down 也发送 ^[OB。我的向上键也有同样的问题。无论有无移位都一样。

是否有一个包含所有键和代码的列表,特别是带有 shift、control、alt/option 等修饰符的列表?

我怎样才能知道预期的顺序是什么,以便我可以发送需要的内容?

【问题讨论】:

    标签: bash ubuntu terminal tmux byobu


    【解决方案1】:

    XTerm

    由于您正在宣传您正在使用 xterm(通过您的 TERM 值),您很可能希望安排发送 xterm 将发送的序列这些钥匙。 xtermctlseqs 文档在 PC-Style Function Keys 部分的底部描述了这些特定的修改键序列:

    ... xterm 识别功能键修饰符,这些修饰符是附加在控制序列最后一个字符之前的参数。

        2 Shift
        3 Alt
        4 Shift + Alt
        5 Control
        6 Control + Shift
        ⋮
    

    示例

    F5 发送^[[15~,因此Shift-F5 应该发送^[[15;2~(即在最后一个字符前添加;2

    方向键和前四个功能键有点不同。他们经常使用基于 SS3 的序列(以^[O 开头);这些将需要更改为基于 CSI 的等效项(以 ^[[ 开头),因为 SS3 序列不能有参数。另外,键的正常序列通常没有数字参数,因此还添加了一个占位符(?)1 参数:

    Up 发送^[[A^[OA,所以Shift+Up 应该发送^[[1;2A(即切换到CSI,并且在最后一个字符前添加1;2

    F1发送^[OP,所以Shift+F1应该发送^[[1;2P(即切换到CSI,在前面加上1;2最后一个字符)

    您可能还想查看各种终端仿真器的源代码,了解它们的作用。例如tmux的相关位在其xterm-keys.c file中。

    配置

    由于您的终端仿真器尚未发送您想要支持的所有序列,因此您必须对其进行配置才能这样做。 OS X 附带的内置终端仿真器 Terminal 预先配置了一些键,但您可能必须自己添加其中的大部分。您可以通过调用 Terminal > Preferences... 菜单项,选择* Settings 选项卡,选择适当的个人资料,并切换到其键盘标签。从那里您可以添加和删除键定义。例如,您可以将 F2 定义为 shiftsend string to shell: (原文如此),然后在字符串文本框 (ESC将显示为\033,这没关系)。

    注意:更改 Option-RightOption-Left 的定义可能会影响某些程序(例如 shell 和 Emacs)与这些击键一起工作。默认配置发送 ESC-f 和 ESC-b,它们是 Emacs 样式的键击,用于许多程序在默认情况下会理解的向后单词和向前单词。这种配置对我来说似乎倒退了;外壳(和其他程序)应配置为识别正确修改的箭头键序列。

    您可能还想尝试不同的终端模拟器。 iTerm 2 内置了对大多数这些修改键的支持(可能不是 Control+Fn 变体),因此需要手动配置的更少。

    另外,请注意 OS X 为某些 Control-Fx 组合定义了一些系统范围的快捷方式(请参阅系统偏好设置键盘键盘快捷键键盘和文本输入)。您必须禁用其中一些快捷键,以确保 TerminaliTerm 有机会“看到”您想要的组合键。

    【讨论】:

    • 哇!这正是我所需要的。我看过 xterm 文档,但在你解释之前对我来说没有意义。