标签: terminfo

如何在 tty 中将功能键传递给 htop?

我正在尝试htop在 tty1 中使用。但是,某些功能键似乎无法正常工作。F1F2什么也不做,和F3似乎触发设置(这通常应由被触发F2)。此外,F4F5没有工作。此外,当我尝试按Esc以退出这些屏幕时,我必须按两次。

在普通终端 ( terminator) 中,功能键工作正常。但是,我也必须在Esc这里按两次,所以也许这是一个红鲱鱼。

如何在 tty1 中使用这些功能键?

编辑

在 tty1 中,如果我按Ctrl+ vthen F1toF5等。我得到以下输出:

^[[[A
^[[[B
^[[[C
^[[[D
^[[[E
Run Code Online (Sandbox Code Playgroud)

terminator,我得到

^[OP
^[OQ
^[OR
^[OS
^[[15~
Run Code Online (Sandbox Code Playgroud)

上面的功能键是等效的(例如^[[17~for F6)。

编辑 2

回应 Stéphane Chazelas 的评论

  • $TERM在 tty1 中与在我的“正常”工作终端中相同。它是xterm-256color
  • 我没有使用屏幕或 tmux。
  • 我使用的是htop1.0.3,尽管我的第一次编辑似乎指出它是htop. …

terminal console htop terminfo

10
推荐指数
1
解决办法
4448
查看次数

保存光标位置并在终端中恢复它

我正在使用一些终端功能在bash. 我想得到这样的东西:在输出字符串时PROMPT_COMMAND,保存终端光标位置,打印放置...并执行其他操作(例如打印其他信息);然后一段时间后回到记忆的位置并打印一些新的东西。PS1被设计成命令本身放在换行符上,因此异步输出只是终端中的文本。

我发现cupterminfo 条目将光标移动到给定位置,还有转义码可以获取当前位置(例如,请参阅此问题)。但对我来说,似乎所有这些都在屏幕上使用光标位置,而不是在终端缓冲区中。这意味着在放置新行后,我记住的位置将是错误的。

有没有办法使用终端光标位置来根据缓冲区位置存储和恢复光标位置?您可以假设记住的位置仍然在缓冲区的可见部分(因此您实际上可以将光标放在那里),但它可能会向上移动几行。现在,让我们不考虑竞争条件。如果没有,我会尝试寻找其他技巧。

zsh外壳实际上具有异步提示支持,但我实际上不知道它是否会在输出之前用户按下Enter以转到新行。

shell prompt terminal async terminfo

9
推荐指数
1
解决办法
4525
查看次数

为什么END键没有terminfo条目?

在 Debian 系统上END按键生成^[[F

$ showkey -a

Press any keys - Ctrl-D will terminate this program

^[[F     27 0033 0x1b
         91 0133 0x5b
         70 0106 0x46
Run Code Online (Sandbox Code Playgroud)

但是为什么这个键和弦不在terminfo 中

$ infocmp -1 | grep end
kend=\EOF,
Run Code Online (Sandbox Code Playgroud)

尽管如此,ncurses设法正确地将其识别为KEY_END. 如何?

TERMxterm-256color

顺便说一句,拥有kendandend而不仅仅是背后的动机是end什么?(对于khomehome

编辑

正如 Johan Myréen 的评论中所说,khome字符串是按下 Home 键产生的序列。但是在 Debian 上按 Home 键会产生home. 为什么?

$ showkey -a

Press …
Run Code Online (Sandbox Code Playgroud)

termcap terminal ncurses terminfo

9
推荐指数
2
解决办法
1718
查看次数

如何在 FreeBSD 上使用 terminfo 条目?

在我的本地 Linux 机器上,我使用的是termite (VTE-based)。它带有自己的terminfo文件(xterm-termite ),默认情况下不随 ncurses 一起分发。

我尝试连接到远程 FreeBSD 服务器。不幸的是,FreeBSD 默认只使用旧的 termcap 格式。我一直无法找到将 terminfo 转换为 termcap 的方法。因此,虽然我可以编译包含来自端口 ( devel/ncurses) 的terminfo 支持的 ncurses 版本,但默认情况下,ncurses 应用程序将链接到系统提供的库。这会导致应用程序无法启动:

$ echo $TERM
xterm-termite
$ toe | grep termite
xterm-termite   VTE-based terminal
$ tmux
open terminal failed: can't find terminfo database
$ htop
Error opening terminal: xterm-termite.
Run Code Online (Sandbox Code Playgroud)

toe列出 terminfo 条目)

如何让 FreeBSD 默认使用 terminfo,或者强制应用程序使用端口提供的 ncurses lib,或者至少将 terminfo 转换为 termcap 数据?

(我知道像设置为一个安全值之类的变通方法,但我认为这违背了 terminfo 的目的)TERMxterm-256color

freebsd ncurses terminfo

8
推荐指数
1
解决办法
3117
查看次数

终端转义序列:为什么终端不报告它们支持的功能,而不是依赖于 terminfo?

我最近一直在研究转义序列,我对它们的功能感到惊讶。你甚至可以xterm用它们移动一个X11 窗口(试试printf '\e[3;0;0t'),哇!

了解终端支持哪些功能的最常见方法似乎是使用数据库。这就是ncurses它的作用,99.9% 的依赖转义序列的应用程序都使用它。
Ncurses 读取terminfoshellTERM环境变量的数据库,以确定您的控制台支持哪些功能。
您可以更改TERMshell的环境变量,如果您这样做,大多数应用程序可能会开始使用较少的功能或行为不端(尝试运行nanovim设置后TERM="")。

我已经看到一些转义码会导致终端报告内容。例如<ESC>[6n使终端报告光标位置。( printf '\e[6n')

  • 我们为什么不使用类似的报告机制让控制台报告它支持哪些功能?

TERM每个控制台都可以宣传自己的功能,而不是将功能与 的值耦合在一起,从而使整个事情更加精确和可靠。为什么这不是一回事?


编辑:我之前应该问过的事情...我想创建一个新的转义序列,以破解 konsole 和 gnome-terminal 以支持它并在某些脚本中使用它。
我希望能够查询控制台以了解我正在运行的控制台是否支持此功能 - 建议的方法是什么?

terminal escape-characters terminfo

8
推荐指数
2
解决办法
2319
查看次数

清除终端回滚缓冲区的最简单方法+更深入的解释?

何苦?

清除回滚缓冲区在很多方面都很方便,例如,当我希望运行一些输出较长的命令,并希望快速滚动到此输出的开始时。当回滚缓冲区被清除时,我可以滚动到顶部,然后就完成了。

一些考虑:

clear根据人类的说法,有命令,

如果可能,clear 会清除您的屏幕,包括其回滚缓冲区(如果定义了扩展的“E3”功能)。

在 gnome-terminalclear清除回滚缓冲区。(不过,什么是“E3”功能?)

还有reset, 清除,但它做的比这多一点,而且它真的很慢(在我的系统上它需要超过一秒钟,这对人类来说是明显的延迟)。

还有echo -ne '\ec'or echo -ne '\033c',它可以完成这项工作。而且确实比 快得多reset

问题是,什么是\ec序列,它与什么clearreset做什么有什么不同,以及为什么没有单独的命令?

还有 readline 的C-l键序列,默认情况下绑定到clear-screen命令(我的意思是,readline 命令,而不是 shell 命令)。这是什么命令?它发出哪个转义序列?它实际上是如何工作的?它运行shell命令吗?或者是什么?同样,在 gnome-terminal 中,它似乎只是通过吐出空行直到提示出现在终端的顶行来工作。不确定其他终端模拟器。这是非常麻烦的行为。它会用大量的空白污染回滚,所以你必须向上滚动更多,更多。它就像一个黑客,而不是干净的解决方案。

另一个问题是,上述\ec序列是否有 readline 命令?我想将它绑定到,C-l因为我总是想在清除屏幕时清除回滚缓冲区。

而另一个问题是如何只需要输入这样的转义序列终端,执行所需的操作?然后不必考虑绑定C-l到另一个 readline 命令(如果存在这样的命令)。我尝试输入Escc但是这不起作用。

更新 这个问题主要在这里回答:https : //unix.stackexchange.com/a/375784/257159。这是一个很好的答案,几乎解释了这里提出的所有问题。

termcap terminal-emulator readline escape-characters terminfo

8
推荐指数
2
解决办法
4628
查看次数

解析 terminfo u6 字符串

查看terminfoParameterized Strings

一些例子来自infocmp -1 xterm

  • cud=\E[%p1%dB,给定参数13

    • \E =><ESC>
    • [ => [
    • %p1将参数 1 (13)推入堆栈
    • %d POP 并从堆栈打印为有符号十进制 => 13
      • 结果: <ESC>[13B
  • csr=\E[%i%p1%d;%p2%dr,给定参数13, 16

    • \E =><ESC>
    • [ => [
    • %i 递增参数 1 和 2:++13、++16 给出 14、17
    • %p1将参数 1 (14)推入堆栈。
    • %dPOP 并从堆栈打印为有符号十进制。=>14
    • ; => ;
    • %p2将参数 2 (17)推入堆栈。
    • %dPOP 并从堆栈打印为有符号十进制。=>17
    • r => r
      • 结果: <ESC>14;17r

但是,……怎么读这个?

  • u6=\E[%i%d;%dR

处理后, …

terminal xterm ncurses console terminfo

6
推荐指数
1
解决办法
586
查看次数

Zsh 获取带有修饰符的 terminfo 键

Zsh 上的 Arch Linux Wiki 页面有一个从 terminfo 获取按键序列的示例。

typeset -g -A key

key[Home]="${terminfo[khome]}"
key[End]="${terminfo[kend]}"
...
Run Code Online (Sandbox Code Playgroud)

但是我怎样才能得到带有修饰符的呢?具体来说是 Alt+j 和 Alt+k。

谢谢。

zsh terminfo

4
推荐指数
1
解决办法
1373
查看次数

tput ed 为空

的输出tput ed为空,我不知道为什么。其他功能工作正常。输出中也ed没有丢失,infocmp所以 tput 应该匹配,对吗?

$ printf '%q' "$(tput ed)"
''
Run Code Online (Sandbox Code Playgroud)
$ printf '%q' "$(tput home)"
$'\033'\[H
Run Code Online (Sandbox Code Playgroud)

我在 Mac OS 10.14.6 和 iTerm2 上使用 zsh。术语=xterm-256color。

tput terminfo macos

4
推荐指数
2
解决办法
224
查看次数

TERM=tmux-256color 导致“打开终端时出错”

我想在 tmux 中启用斜体(在 macOS Big Sur 11.3 上的 iTerm2 内)。我通过将其设置为实现了这一点.tmux.conf

set -g default-terminal "tmux-256color"
Run Code Online (Sandbox Code Playgroud)

我已经使用 homebrew 安装了 ncurses 6.2 并将其设置在路径中的第一个位置。.zshrc:

set -g default-terminal "tmux-256color"
Run Code Online (Sandbox Code Playgroud)

进行这些更改后,斜体就可以使用了。

但是,现在几个依赖于 ncurses 的程序无法启动:ncdu(1.15.1) 和nano(2.0.6 ) 都出错:

Error opening terminal: tmux-256color.
Run Code Online (Sandbox Code Playgroud)

我的印象是他们不支持此TERM设置。奇怪的是, 1.12在我的 Raspbian 计算机上ncdu运行。tmux-256color

怎么了?程序不是像ncdu并且nano应该兼容吗tmux-256color

我找到了一个 hacky 解决方法(对于 macOS,在 Raspbian 上不需要)。如果我明确地改回TERM中的变量.zshrc,则所有内容(斜体和程序)都有效:

  export PATH="$HOMEBREW_PREFIX/opt/ncurses/bin:$PATH"
Run Code Online (Sandbox Code Playgroud)

但我的理解是,TERM自我设定是一个很大的禁忌。您应该让环境正确设置它。我很惊讶它竟然能工作——tmux-256colorscreen-256color?这个黑客最终会在我脸上爆炸吗?

terminal tmux ncurses terminfo macos

4
推荐指数
1
解决办法
3999
查看次数