的备用屏幕用于通过像vim,HTOP,屏幕,alsamixer中,以下,...它像一个不同缓冲液中的终端的内容的,其消失的应用程序退出时,所以整个终端许多"用户交互式"应用终端恢复,看起来应用程序没有输出任何东西.
我想在我自己的shell(bash)脚本中实现完全相同的东西,除了它不必是可移植的.我坚持只使用linux和基于xterm的终端模拟器; 但解决方案应该使用像tput是否可能的东西.但是,我不想使用某些外部脚本语言(甚至是类似C的东西).
虽然我不想使用C(因为它应该是尽可能少的依赖项的bash脚本),但我查看了较少的源代码.它似乎使用terminfo作为数据库,并在其初始化中查找"ti"终端功能.删除行时,它不使用备用的sceen,所以我假设我找到了负责的代码行.
但是,我找不到这样的能力man terminfo.但也许我在错误的道路上寻找解决方案.也许terminfo/tput不是我的朋友.
那么(如何)我可以在bash脚本中使用备用屏幕?有人知道一个简单的应用程序,我可以在其中找到源代码提示吗?(C应用程序或bash脚本或其他......)
当我在搜索,例如,man ls而在tmux会议上,搜索字符串不高亮显示-页面跳转下来,让搜索字符串是在缓冲区的顶部线条,符合市场预期,但它并不突出.
在不在tmux会话中的同一个shell中执行相同的操作会导致突出显示的搜索字符串.
我不知道从哪里开始寻求解决这个问题.任何提示都表示赞赏.
我想更改程序以自动检测终端是否具有颜色功能,所以当我从一个不支持颜色的终端(比如(X)Emacs中的Mx shell)中运行所述程序时,颜色会自动关闭.
我不想硬编码程序来检测TERM = {emacs,dumb}.
我认为termcap/terminfo应该可以帮助解决这个问题,但到目前为止,我只是设法将这个(n)curses - 使用代码片段拼凑在一起,当它无法找到终端时会严重失败:
#include <stdlib.h>
#include <curses.h>
int main(void) {
int colors=0;
initscr();
start_color();
colors=has_colors() ? 1 : 0;
endwin();
printf(colors ? "YES\n" : "NO\n");
exit(0);
}
Run Code Online (Sandbox Code Playgroud)
即我明白了:
$ gcc -Wall -lncurses -o hep hep.c
$ echo $TERM
xterm
$ ./hep
YES
$ export TERM=dumb
$ ./hep
NO
$ export TERM=emacs
$ ./hep
Error opening terminal: emacs.
$
Run Code Online (Sandbox Code Playgroud)
这是......次优的.
在我的新工作中,我需要使用mac,我正在尝试将tmux与iTerm版本2一起使用.
虽然水平边框似乎与正确的ACS框图字符[1]一起显示,但垂直边框是虚线.这在Terminal.app中不是问题,边框显示正确.无论我选择哪种字体,似乎都会出现此问题.
在我可以找到iTerm和tmux的所有屏幕截图中,这似乎也是如此.这仅仅是iTerm的限制,还是我的terminfo或locale有问题?
[1] Tmux边框显示为xq而不是行?
我想在Emacs术语模式缓冲区中运行GNU Screen.当我尝试这样做时,我收到一个错误:
$ screen
Cannot find terminfo entry for 'eterm-color'.
Run Code Online (Sandbox Code Playgroud)
此错误表明我应该安装eterm-color terminfo条目.我试图以两种方式做到这一点,两种方式都失败了.
第一次尝试是使用TERMINFO环境变量.
我的.bashrc:
export TERMINFO=~/.terminfo
Run Code Online (Sandbox Code Playgroud)
然后我做了:
$ mkdir -p ~/.terminfo/e/
$ cp /usr/local/Cellar/emacs/23.3a/share/emacs/23.3/etc/e/* ~/.terminfo/e/
Run Code Online (Sandbox Code Playgroud)
在术语模式缓冲区中,找不到eterm-color条目.它说它从TERMCAP而不是从实际文件中获得eterm-color.
$ infocmp
# Reconstructed via infocmp from file: TERMCAP
eterm-color,
am, mir, xenl,
colors#8, cols#138, it#8, lines#41, pairs#64,
bel=^G, bold=\E[1m, clear=\E[H\E[J, cr=^M,
csr=\E[%i%p1%d;%p2%dr, cub=\E[%p1%dD, cub1=^H,
cud=\E[%p1%dB, cud1=^J, cuf=\E[%p1%dC, cuf1=\E[C,
cup=\E[%i%p1%d;%p2%dH, cuu=\E[%p1%dA, cuu1=\E[A,
dch=\E[%p1%dP, dch1=\E[P, dl=\E[%p1%dM, dl1=\E[M, ed=\E[J,
el=\E[K, el1=\E[1K, home=\E[H, ht=^I, ich=\E[%p1%d@,
il=\E[%p1%dL, il1=\E[L, ind=^J, invis=\E[8m, kbs=\177,
kcub1=\EOD, kcud1=\EOB, kcuf1=\EOC, kcuu1=\EOA,
kdch1=\E[3~, kend=\E[4~, khome=\E[1~, …Run Code Online (Sandbox Code Playgroud) 我正在编写一个shell脚本,我希望在出现时使用256色支持.在一个公正的世界中,xterm只需将TERM环境变量设置为xterm-256color,我将用它tput colors来发现支持.
但我们生活在一个不公正的世界. 即使在推出时也xterm设置TERM为.我可以在shell脚本中做些什么来发现脚本是否运行时stdout连接到运行在256色窗口中的tty ?如果是这样,我可以自己设置环境变量.xtermTERM=xterm-256colorxterm
我正在尝试使用tput以独立于设备的方式在终端中设置前景色和背景色.
如果termcap/terminfo/tput的整个目的是与设备无关,那么为什么两个版本都明确使用ANSI控件(setaf/setab)和那些不应该(不应该)的版本?
这个讨论引用了terminfo(5),它反过来引用了明确表示那些分别用ANSI而不是ANSI实现的标准.
为什么不存在setf/setb,它们总是设置前景色和背景色.我不在乎它是怎么做的,这就是我使用tput的原因!
据我所知terminfo(5),kcuu1 应该是按下向上箭头时终端发送的序列。我从来没有见过除了^[[A(现在谈论cat,搞乱终端设置等)以外的任何东西。那么,鉴于我使用的终端(rxvt、gnome-terminal、iTerm)都默认为 TERM=xterm,为什么不是 kcuu1 \E[A?
我看到 cuu1是 \E[A,但是(再次从手册页),这是我应该发送到终端以移动光标的字符串,而不是终端发送给我的字符串。
顺便说一句,这是 OS X 的情况。
当我远程登录SLURM交互节点时,emacs有时会出现乱码。正如我在下面描述的,我认为问题是 SLURM 交互节点弄乱了查询/确认终端信号,并且一些字符被丢弃导致故障。
设置
srun --nodes=1 ... --pty /bin/bash)emacs -nw)当有很多窗格或移动大量文本时,这种情况似乎会发生得更多。根据 emacs文档的这一部分,我尝试使用C-l (recenter-top-bottom)重新绘制屏幕,这暂时修复了当前的故障。
通过设置$TERM=screen或$TERM=xterm-256color在我的.bash-profile我看到不同的配色方案,但故障仍然存在。
请注意,我仅在登录交互式节点时看到故障,而不是从集群上的头节点看到故障。利用日志节点上正常的事实,这可以提供有用的诊断信息。这让我怀疑问题在于从集群发送的字符的 ENQ/ACK 或 pad-timing 被丢弃。terminfo 诊断程序的文档对此进行了讨论tack。
tack从登录节点和交互节点使用给出相同的值
$ tack
Using terminfo from: /home/maom/opt/miniconda3/share/terminfo/x/xterm-256color
Name: xterm-256color|xterm with 256 colors
\r ^M (cr) = ^M
\n ^J (ind) = ^J
\b ^H …Run Code Online (Sandbox Code Playgroud)