进一步阅读

进一步阅读

目前我需要通过 ssh 在远程计算机上进行编码。我从 Cygwin 运行这个程序minttytmux即使在断开连接时也能保持 emacs 运行。tmux报告说,一切都很好TERM=screen,但<end>钥匙坏了。 Emacs 将其报告为<select>.在 tmux 内部的 shell 中,当我执行简单的操作时cat,密钥会被报告为^[[4~。目标机器是 Ubuntu 16.04.6 LTS。结束键按预期工作zsh,所以我认为它一定与 emacs 有关。

当我在 Cygwin 本地运行 emacs 时tmux,一切正常。所以我认为这与目标系统有关。我不想重新绑定,<select>因为这看起来很尴尬。这是 Emacs 中的错误吗?版本是GNU Emacs 26.3.

C-a我可以通过使用and来解决这个问题C-e,但更喜欢一个正确的解决方案。

答案1

部分是应用程序,部分是配置。根据终端描述是否设计为模仿 VT220 或 PC(无论什么),编辑键盘可以为按键指定不同的名称。同时,curses 应用程序只会看到第一个,因此会标记重复项(抽动警告)并通常将其删除。

Emacs 不是一个curses 应用程序,但它使用ncurses 提供的终端描述。因此,您的终端描述将显示结束/选择中的一个或另一个。您可以更改终端描述...

进一步阅读:为什么我的键盘不起作用?

(xterm 中对此有一个较长的评论术语信息文件)。

答案2

emacs 是对的。那键的(原始)控制序列select。但这很可能是通过迂回过程实现的。

DEC VT102 没有编辑键盘。这是随着新型号的出现。这是一个带有编辑键盘的 DEC VT320 键盘,位于光标键盘上方中心右侧。

这是 DEC VT320 键盘

编辑键盘的 DEC VT220 控制序列是所有这些的起源(具有从 DEC VT420 开始添加的对修饰符进行编码的能力):

  • find:DECFNK 1(即 CSI1 ~或 CSI1 ; 模组 ~
  • insert:DECFNK 1(即 CSI2 ~或 CSI2 ; 模组 ~
  • remove又名delete:DECFNK 3(即 CSI3 ~或 CSI3 ; 模组 ~) 或删除
  • select:DECFNK 4(即 CSI4 ~或 CSI4 ; 模组 ~
  • next screen又名PgDn:DECFNK 5(即 CSI5 ~或 CSI5 ; 模组 ~
  • prev screen又名PgUp:DECFNK 6(即 CSI6 ~或 CSI6 ; 模组 ~

SCO XENIX Multiscreen 控制台在配备 IBM Model M 键盘的机器上运行,并定义:

  • home:CUP(即CSIH理论上可扩展为CSI1 ; 模组 H
  • end:CPL(即CSIF理论上可扩展为CSI1 ; 模组 F

DEC VT52x 从 SCO 控制台复制了一些内容,包括这些附加的控制序列。有两种可能安排编辑键盘在 DEC VT52x 上:

  • VT布局,与DEC VT220/320/420相同:
    • find insert remove
    • select prev next
  • 电脑布局,与 IBM Model M 相同:
    • insert home PgUp
    • delete end PgDn

在终端本身固件设置的控制下,这些功能转移到物理上不同的按键排列。但是从函数到其控制序列的映射是不变的

问题是,由于地下出版物和老太太的故事,人们在几个终端中将这些混为一谈。模拟器。例如,Linux 内核中内置的终端仿真器就是两者的混合体。它使用“PC 布局”,但是(尽管在其他地方模仿 SCO Multiscreen)为home和发送了错误的控制序列end。它发送findselect控制序列。

这个错误现在已经被嵌入了。并且它已经从那里传播了。

  • 例如,mintty 通常发送home和 的SCO 序列end。但它有一个“VT220 模式”,使其行为方式与 Linux 终端仿真器相同,即不是 VT220 的行为,尤其是因为它采用“PC”布局VT220 没有。
  • homerxvt 对和使用完全错误的 DECFNK 代码end,重叠了光标键盘的两个 DECFNK 分配,DECFNK 7 和 DECFNK 8。

这会持续引起轻微的打嗝。

最常见的问题是没有使用正确的终端类型。 terminfo 数据库包含以下条目putty,mintty,linux等人。kend///使用这些类型的终端发出的值定义适当的khome功能。但如果一个kfndkslt用途vt220相反,作为薄荷可以选择设置为TERM环境变量,mintty 发送的内容homeend应用程序理解为findselect

这可能就是您的情况所发生的情况。一个小问题是,进行理解的应用程序是 tmux,它将控制序列识别为select,根据TERM它继承的设置为类似 的内容vt220,然后重新编码并传递它。

进一步阅读

相关内容