语境:
我使用zsh并使用vi编辑模式。要在历史记录中上升,而不是按ESC
进入正常模式并按k
,我按alt+k
发送esc
字符并发送k
后记(根据我的理解)
问题:
它工作正常,直到我启动 ssh 会话,即使关闭会话后它也不起作用。相反,当按下alt+k
它时会插入ë
字符。
目前的理解: 这与终端有关,与 shell 无关。但是,打开 SSH 会话会更改终端的某些运行时属性,这是我无法想到的。
st git 提交:63776c0962874dfab135a595a765b4d3b5fbcb65(当前主版本)
任何有帮助的想法将不胜感激。
PS:我对终端内部的工作原理知之甚少。
答案1
有一种旧的方式来表示“元”,它假设您使用的是 7 位字符集,并且可以自由地修改字符的高位。它实际上不能很好地处理 8 位字符集,更不用说 UTF-8,产生的字符会让外行人感到困惑,正如您所看到的。只有一些终端仿真器支持它,包括 XTerm 和 Simple Terminal,并且它通过 ECMA-48 供应商专用设置/重置模式控制序列(参数 1034)打开和关闭。在 terminfo 术语中,这是“元模式”。
您通过 SSH 访问的远程系统上的程序由于某种原因打开了“元模式”,并且没有再次将其关闭。您可以通过直接打印 DECRST 1034 控制序列来关闭元模式printf
:
printf '\e[?%ul' 1034或使用(terminfo 版本的)
tput
命令:输出功率
顺便说一句:不要指望setmetamode
kbd 包(在 Debian Linux 等操作系统上)中的命令能够工作,因为它使用一种特殊的方式来更改特定于 Linux 内置虚拟终端的模式。