我正在尝试htop
在 tty1 中使用。但是,某些功能键似乎无法正常工作。F1和F2什么也不做,和F3似乎触发设置(这通常应由被触发F2)。此外,F4并F5没有工作。此外,当我尝试按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)。
回应 Stéphane Chazelas 的评论。
$TERM
在 tty1 中与在我的“正常”工作终端中相同。它是xterm-256color
。htop
1.0.3,尽管我的第一次编辑似乎指出它是htop
. …我正在使用一些终端功能在bash
. 我想得到这样的东西:在输出字符串时PROMPT_COMMAND
,保存终端光标位置,打印放置...
并执行其他操作(例如打印其他信息);然后一段时间后回到记忆的位置并打印一些新的东西。PS1
被设计成命令本身放在换行符上,因此异步输出只是终端中的文本。
我发现cup
terminfo 条目将光标移动到给定位置,还有转义码可以获取当前位置(例如,请参阅此问题)。但对我来说,似乎所有这些都在屏幕上使用光标位置,而不是在终端缓冲区中。这意味着在放置新行后,我记住的位置将是错误的。
有没有办法使用终端光标位置来根据缓冲区位置存储和恢复光标位置?您可以假设记住的位置仍然在缓冲区的可见部分(因此您实际上可以将光标放在那里),但它可能会向上移动几行。现在,让我们不考虑竞争条件。如果没有,我会尝试寻找其他技巧。
有zsh
外壳实际上具有异步提示支持,但我实际上不知道它是否会在输出之前用户按下Enter以转到新行。
在 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
. 如何?
TERM
是 xterm-256color
顺便说一句,拥有kend
andend
而不仅仅是背后的动机是end
什么?(对于khome
和home
)
编辑
正如 Johan Myréen 的评论中所说,khome
字符串是按下 Home 键产生的序列。但是在 Debian 上按 Home 键会产生home
. 为什么?
$ showkey -a
Press …
Run Code Online (Sandbox Code Playgroud) 在我的本地 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 的目的)TERM
xterm-256color
我最近一直在研究转义序列,我对它们的功能感到惊讶。你甚至可以xterm
用它们移动一个X11 窗口(试试printf '\e[3;0;0t'
),哇!
了解终端支持哪些功能的最常见方法似乎是使用数据库。这就是ncurses
它的作用,99.9% 的依赖转义序列的应用程序都使用它。
Ncurses 读取terminfo
shellTERM
环境变量的数据库,以确定您的控制台支持哪些功能。
您可以更改TERM
shell的环境变量,如果您这样做,大多数应用程序可能会开始使用较少的功能或行为不端(尝试运行nano
或vim
设置后TERM=""
)。
我已经看到一些转义码会导致终端报告内容。例如<ESC>[6n
使终端报告光标位置。( printf '\e[6n'
)
TERM
每个控制台都可以宣传自己的功能,而不是将功能与 的值耦合在一起,从而使整个事情更加精确和可靠。为什么这不是一回事?
编辑:我之前应该问过的事情...我想创建一个新的转义序列,以破解 konsole 和 gnome-terminal 以支持它并在某些脚本中使用它。
我希望能够查询控制台以了解我正在运行的控制台是否支持此功能 - 建议的方法是什么?
何苦?
清除回滚缓冲区在很多方面都很方便,例如,当我希望运行一些输出较长的命令,并希望快速滚动到此输出的开始时。当回滚缓冲区被清除时,我可以滚动到顶部,然后就完成了。
一些考虑:
clear
根据人类的说法,有命令,
如果可能,clear 会清除您的屏幕,包括其回滚缓冲区(如果定义了扩展的“E3”功能)。
在 gnome-terminalclear
中不清除回滚缓冲区。(不过,什么是“E3”功能?)
还有reset
, 清除,但它做的比这多一点,而且它真的很慢(在我的系统上它需要超过一秒钟,这对人类来说是明显的延迟)。
还有echo -ne '\ec'
or echo -ne '\033c'
,它可以完成这项工作。而且确实比 快得多reset
。
问题是,什么是\ec
序列,它与什么clear
和reset
做什么有什么不同,以及为什么没有单独的命令?
还有 readline 的C-l
键序列,默认情况下绑定到clear-screen
命令(我的意思是,readline 命令,而不是 shell 命令)。这是什么命令?它发出哪个转义序列?它实际上是如何工作的?它运行shell命令吗?或者是什么?同样,在 gnome-terminal 中,它似乎只是通过吐出空行直到提示出现在终端的顶行来工作。不确定其他终端模拟器。这是非常麻烦的行为。它会用大量的空白污染回滚,所以你必须向上滚动更多,更多。它就像一个黑客,而不是干净的解决方案。
另一个问题是,上述\ec
序列是否有 readline 命令?我想将它绑定到,C-l
因为我总是想在清除屏幕时清除回滚缓冲区。
而另一个问题是如何只需要输入这样的转义序列终端,执行所需的操作?然后不必考虑绑定C-l
到另一个 readline 命令(如果存在这样的命令)。我尝试输入Esc
,c
但是这不起作用。
更新 这个问题主要在这里回答:https : //unix.stackexchange.com/a/375784/257159。这是一个很好的答案,几乎解释了这里提出的所有问题。
termcap terminal-emulator readline escape-characters terminfo
查看terminfo和Parameterized 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)推入堆栈。%d
POP 并从堆栈打印为有符号十进制。=>14
;
=> ;
%p2
将参数 2 (17)推入堆栈。%d
POP 并从堆栈打印为有符号十进制。=>17
r
=> r
<ESC>14;17r
但是,……怎么读这个?
u6=\E[%i%d;%dR
处理后, …
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。
谢谢。
的输出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。
我想在 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-256color
与screen-256color
?这个黑客最终会在我脸上爆炸吗?