问题标签 [terminfo]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
ncurses - SIGWINCH、bash、dash、tput 和 terminfo
我对tput
终端大小之间的交互有点困惑。似乎 的行为tput
取决于调用它的外壳程序,或者外壳程序可能负责更改终端设置,或者....某些东西。为了减少问题,请考虑:
在这里,在 bash 中,事情的行为(几乎)符合预期(我说几乎,因为我不太确定 WINCH 处理程序为什么执行两次),并且tput
更改的输出与新的终端大小相匹配。但是,当在 dash 中运行时,tput
即使终端改变了大小,输出也不会改变。另请注意,WINCH 处理程序似乎被破折号延迟,并且直到输入下一个命令之后(但在它执行之前)才执行。这里应该发生什么?tput
以任何方式关心外壳在做什么吗?绞盘是否相关?我想问题是:
怎么tput
知道终端的大小?
此外,我不想过多地混淆输出,但在示例的每个 shell 中,都设置了 TERM 并infocmp $TERM
打印似乎有效的 terminfo 描述。(我认为,它提供任何输出的事实表明它是有效数据!)
perl - 如何使用 Term::Cap 发送清除或重置?
当我输出时tput clear | hexdump -c
,如果我打开kitty
或,我会得到不同的结果xterm
。如何使用Term::Cap
在各个终端上生成这些终端信号?
我尝试的是从带有设置的文档中直接复制粘贴,
然后我认为这应该可行,
但很可惜,它什么也没做。
如果我为该术语提供一个不同的不存在的名称(而不是undef
默认为$ENV{TERM}
,我得到)
所以我知道它正在查找termcap
文件并找到它。
emacs - SLURM交互节点上的Emacs乱屏
当我远程登录 SLURM 交互节点时,emacs 有时会出现屏幕乱码。正如我在下面所描述的,我认为问题在于 SLURM 交互式节点弄乱了查询/确认终端信号,并且一些字符丢失导致故障。
设置
- 我实际与之交互的计算机:MacBook Air (10.13.2)
- 终端:iTerm2 Build 3.1.7
- SSH 到集群
- SLURM 交互节点(即
srun --nodes=1 ... --pty /bin/bash
) - emacs:终端模式下使用的 GNU Emacs 27.1(即
emacs -nw
)
当有许多窗格或移动大量文本时,似乎会发生更多。基于 emacs文档的这一部分,我尝试使用C-l (recenter-top-bottom)
重新绘制屏幕,并暂时修复了当前的故障。
通过设置$TERM=screen
或$TERM=xterm-256color
在我的.bash-profile
我看到不同的配色方案,但故障仍然存在。
请注意,我仅在登录交互式节点时才看到故障,而不是从集群上的头节点。利用在日志节点上没问题的事实,这可以提供有用的诊断信息。这让我怀疑问题是从集群发送的字符的 ENQ/ACK 或填充时间被丢弃了。这在terminfo 诊断程序的文档中进行了讨论。tack
tack
从登录节点和交互节点使用都给出相同的值
Baudrate test
在登录节点上使用:
Baudrate test
在交互式节点上使用每秒字符数会慢约 30%:
并且,test ENQ/ACK handshake
在登录节点上使用给出:
test ENQ/ACK handshake
在交互式节点节点上使用时给出:
有没有什么办法可以更新 terminfo 来修复故障,并与集群管理员支持一起解决这个问题?
ncurses - xterm 在原始输入上报告错误的转义序列
我目前正在尝试在 Linux 中进行原始输入(例如,我通常使用 ncurses 或类似的东西)。
我已经做到了,每一个按键都直接报告给我的应用程序,并作为一系列十六进制代码转储。
如果我按键盘上的“a”键,我会得到以下输出:
这很简单。0x61 是 ASCII 'a' 的十六进制代码,我可以反过来将其打印(char) 0x61
回控制台。
现在我正在尝试进行基本的行编辑。如果我按下左箭头键,例如使用xterm
,我会得到以下输出:
根据这个网站,在“键盘处理”部分,
左箭头 [...] 发送的代码可以给出为
kcub1
。
根据 termcap 文件,顺序应该是x1b O D
:
虽然这发生在xterm和termite中,但它不会在默认的 tty 或urxvt中。
转义序列 [...] 被选为“PC 风格”代码(如 SCO“ansi”),即
对于正常模式,和
用于光标应用模式
我想我必须将 xterm 设置为“正常模式”或将 termcap 文件中的所有 O 替换为“[”?
阅读箭头键以支持 xterm 和非 xterm 终端的最佳方式是什么?
然后,还有cub
能力:
在同一页上,还有一个关于“参数化字符串”的部分。我想这就是%p1%d
in the cub 能力所指的?
%p1
指“push first parm”,%d
指“print pop() as in printf”。
这是什么意思呢?什么被推到哪里?我在任何时候都不会调用 pop() ,第二个选项是什么意思?
感谢您提前提供任何帮助。
编辑:这是一个小 C 程序,演示了我在说什么。如果我使用它编译gcc kilo.c
并运行它,按左箭头键会发出27 91 ('[') 68 ('D')
. 注意左括号而不是预期的O
.
terminal - 使用 terminfo 仅重置前景色
通过Esc[39m
在终端中使用 ANSI 序列,可以在不更改其他属性(如粗体、下划线或背景色)的情况下清除前景色。例如:
我想从 terminfo 功能中检索这个序列,但我找不到它;尝试使用时setaf 9
,它通过给出序列切换到明亮的颜色Esc[91m
:
我发现重置前景色的唯一功能是sgr0
,但它也会重置所有其他属性。
是否可以从 terminfo 访问这些功能?
- 默认前景
Esc[39m
; - 默认背景
Esc[49m
;
shell - 如何仅重置 $(tput bold)?
我正在对日志进行一些后期格式化以提高可读性。
使用正则表达式,我的脚本可以识别流中的一些模式,并通过分别在文本的开头和结尾插入$(tput bold)
和值来使对应的文本变为粗体。$(tput sgr0)
流不是文本的,它已经包含一些特殊的格式转义序列,如颜色等。
问题是我无法弄清楚如何仅关闭粗体模式。使用$(tput sgr0)
会将所有其他当前终端设置降至默认值,包括颜色。
我曾经man terminfo
知道我应该使用什么“capname”。例如,我知道如何将一些文本设置为斜体,因为列表包含两者sitm
——capname toenter_italic_mode
和ritm
capname to exit_italic_mode
。
我想使用相同的方法使文本变为粗体,因为列表terminfo
包含. 但是既没有“exit_bold_name”字符串变量,也没有对应的capname!bold
enter_bold_mode
我错过了什么吗?我应该使用另一种方法吗?在我在 Internet 上找到的所有文章中,它仅使用sgr0
capname 解决方案。
git - 仅当我从某些终端登录时才禁用 git 颜色
问题
我想git
在输出到可以处理颜色的设备时自动为输出着色,而在不能处理的时候不给它着色。如何做到这一点?
背景
我有时会使用机器本身为旧机器开发代码。其中一些可以处理 ANSI 颜色,而另一些则不能。在 UNIX 系统上,我们曾经有一个名为TERMINFO的数据库,其中列出了每个终端的功能。通过检查功能很容易判断终端是否支持颜色colors
。如果是 -1,那么程序绝对不应该发送 ANSI 颜色序列。
理想情况下,git 会使用TERMINFO来自动检测 ANSI 颜色序列是否合适。但它没有并且仅检查isatty()
。我怀疑 git 开发人员添加TERMINFO支持并不是一个高优先级,所以我正在寻找任何能够提供相同功能的解决方法。
我已经知道如何禁用 git color 使用git config
,这不是我要问的。我希望仅在从不支持 ANSI 颜色的终端(例如 Digital VT340)登录时禁用它。
我也已经看到了GIT_CONFIG_PARAMETERS="'color.ui=never'"
环境变量,但是根据@bk2204 和@torek 的说法,该变量很快就会消失。