Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Shell 规范地确定光标键的转义序列_Shell_Terminal_Arrow Keys_Ansi Escape - Fatal编程技术网

Shell 规范地确定光标键的转义序列

Shell 规范地确定光标键的转义序列,shell,terminal,arrow-keys,ansi-escape,Shell,Terminal,Arrow Keys,Ansi Escape,我想对光标键做出反应;为此,我想找出当前终端以规范的方式使用的转义序列。大多数解决方案的源代码中只有字符串“\e[A”等。我理解,如果目标系统使用不同的转义序列,这是不可移植的 我尝试使用tput获取正确的转义序列,但tput kcud1返回的转义序列与向下箭头键使用的转义序列不同:它返回“\eOB”,但该键的结果是”\e[B”。但是没有给tput指定capname会产生此字符串;我能管理的最好方法是tput cud,它返回“\e[%p1%dB”,从中剥离所有参数最终将成为所需字符串。但是剥离参

我想对光标键做出反应;为此,我想找出当前终端以规范的方式使用的转义序列。大多数解决方案的源代码中只有字符串
“\e[A”
等。我理解,如果目标系统使用不同的转义序列,这是不可移植的

我尝试使用
tput
获取正确的转义序列,但
tput kcud1
返回的转义序列与向下箭头键使用的转义序列不同:它返回
“\eOB”
,但该键的结果是
”\e[B”
。但是没有给tput指定capname会产生此字符串;我能管理的最好方法是tput cud,它返回“\e[%p1%dB”,从中剥离所有参数最终将成为所需字符串。但是剥离参数听起来也不太好


找到箭头键按下时将产生的正确转义序列的标准方法是什么?我很乐意使用
tput
诅咒
或甚至完全不同的方法来解决问题。

我想你需要的是
tput cud1
(没有
k
)。您还可以在此处获得
tput
命令列表:

您还可以通过
VAR=$(tput xyz)
将这些序列存储在变量上


所有东西都在
人工终端中。联机:

光标键发送的内容取决于键盘模式

tput
报告其应用程序模式值,但默认情况下,键盘处于标准模式

该命令可用于更改光标键的行为,例如:

printf "\033[?1h"
或者您可以使用
smkx
命令将键盘设置为应用程序模式:

tput smkx
重置为:

printf "\033[?1l"


抱歉,没有。
t输出cud1
仅为我提供一个换行符(0x0a,
“\n”
)而不是所需的
“\e[B”
。我理解文档,因此密钥应该是
kcud1
,因此当前的系统似乎并不符合规范。您提到的文档也没有提供关于此问题的任何更多线索(它们只是说明官方路径,而不是遵循的路径)。
cud
“可以”是转义序列,但终端数据库中的惯例是存储最短/最快的字符序列以完成给定功能。ASCII
^J
会这样做(因为诅咒应用程序初始化终端以允许此行为,这与默认终端设置不同).其传统名称“新线”具有误导性。① 我可以将键盘模式设置为应用程序模式,然后得到类似
“\eOB”
(是的,我检查了)。这是一种最佳做法吗?在终端中运行并对箭头键作出反应的程序通常会这样做吗?它们通常会在退出时重置吗?②
DECCKM
是否广泛存在于当今的终端中?我是否可以假设所报告的按键顺序已经工作,并且正确的是
DECCKM
不存在?③ 难道没有任何方法可以找出在粗略工作模式下的顺序是什么吗?这个开关有什么好处(在我看来,只是多一个)?① 是的,这是大多数基于curses的应用程序的常见做法。这就是为什么它首先被称为应用程序模式的原因。这些应用程序在离开时会重置为标准模式。② DECCKM应该出现在大多数(如果不是所有)与VT100/xterm/ansi等兼容的终端模拟器中。③ 我不认为有一个标准的方法,诅咒抽象终端功能,但DECCKM是特定的/私有的!
tput rmkx