大部分问题都在标题中,但要详细说明一下:
在大多数 Linux 上,我可以find /usr/share/terminfo -type f。但是在我附近的 Solaris 机器上 - 这个目录甚至不存在。
我可以遍历终端列表,并执行以下操作:
for TERM in xterm xtermc xterm-color xterm-256color screen rxvt
do
tput cols >/dev/null 2>/dev/null && echo "$TERM available"
done
Run Code Online (Sandbox Code Playgroud)
但它很慢。发现tput终端定义使用的路径并自己运行“查找”的任何选项?
像 Vim 这样的命令行应用程序如何工作?具体来说,他们如何以他们的方式控制终端?另外,为了将来参考,对于像 Vim 那样控制终端的应用程序是否有一个特定的术语?
我目前正在我的家庭服务器上的 tmux 会话中运行 mcabber 作为我的 Jabber 客户端(使用 ncurses)。在本地,我将 iTerm2 作为终端模拟器运行,它支持通过字符转义序列触发咆哮通知。
注意:echo此问题中的所有内容都适用于printf %b, 或echo -e在 bash 和 GNU 中echo。
例如,echo "\e]9;foobar\007"使 iTerm2 发送带有文本“foobar”的 Growl 消息。
但是,在 tmux 会话中,转义序列会被吃掉。因此,\Ptmux可以像这样使用专有字符转义序列:
echo "\ePtmux;\e\e]9;foobar\007\e\\"
Run Code Online (Sandbox Code Playgroud)
这会在 tmux 会话中触发咆哮消息。
但是,当我在收到新消息时触发的 mcabber 事件脚本中使用它时,不会触发任何通知,就像将回声发送到错误的终端一样。
我想这与触发脚本的 mcabber 是一个 ncurses 应用程序有关,因此我的普通 bash 脚本的输出丢失了,而 iTerm 2 永远看不到它。
我也尝试调用 smcup 没有成功,然后根据我发现的一些想法进行回应
tput smcup
echo "\ePtmux;\e\e]9;$FROM: $MSG\007\e\\"
tput rmcup
Run Code Online (Sandbox Code Playgroud)
我想这不起作用,因为问题不是切换回“真实终端窗口”,而是更多地将输出定向到 ncurses 窗口。
关于这个有什么想法吗?
我想我以前已经注意到这一点,但从未想太多;现在我很好奇。
> ldd /bin/bash
linux-vdso.so.1 => (0x00007fff2f781000)
libtinfo.so.5 => /lib64/libtinfo.so.5 (0x00007f0fdd9a9000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007f0fdd7a5000)
libc.so.6 => /lib64/libc.so.6 (0x00007f0fdd3e6000)
/lib64/ld-linux-x86-64.so.2 (0x00007f0fddbf6000)
Run Code Online (Sandbox Code Playgroud)
libtinfo 是 ncurses 的一部分。这是一个 Fedora 系统,但它在 ubuntu 上是一样的,我注意到在 raspbian(一个 debian 变体)上它也链接到 libncurses 本身。
这是什么原因?我认为 bash 所做的一切都可以用 libreadline 来完成(奇怪的是,它没有链接到)。这只是一个替代品吗?
我该怎么做呢?我想要一个终端菜单,其中shift+up或shift+down选择多行。
ncurses似乎有问题。
我不一定需要高级终端库。我只想处理这个,除此之外,我的 IO 应该非常简单。
有什么建议吗?
在 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
顺便说一句,拥有kendandend而不仅仅是背后的动机是end什么?(对于khome和home)
编辑
正如 Johan Myréen 的评论中所说,khome字符串是按下 Home 键产生的序列。但是在 Debian 上按 Home 键会产生home. 为什么?
$ showkey -a
Press …Run Code Online (Sandbox Code Playgroud) 我在 html 表中有一些文档。我想将表转换为 ascii 表,就像您在返回 mysql 命令行结果时看到的那样,如下所示:
+------------+------------+
| header | header |
+------------+------------+
| cell data | cell data |
+------------+------------+
| cell data | cell data |
+------------+------------+
Run Code Online (Sandbox Code Playgroud)
...所以我可以将它包含在一些代码注释中。
我怎么能轻松做到这一点?我正在考虑将 lynx 的输出传输到一个文件中,但 lynx 不会在表格周围放置 ascii 边框:P
我还想控制单元格宽度,以便内容单元格不会溢出到代码可接受的屏幕宽度之外。
在我的本地 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
我在 github 上有我的 dotfiles版本(其他人的好作品的无耻分支)。在工作中,我将它们放在中央 linux 服务器 (SuSE Enterprise Linux 10) 上。我将它们从中央管理服务器同步到目标服务器(它们通常没有外部 http 访问)。
我们已经推出了 SuSE Enterprise Linux 11,我注意到我的配置文件设置中的“红色”或洋红色 bash 提示颜色在这些服务器上似乎不起作用。同样,我的 vim 颜色方案设置不起作用 - 例如,该词消失而不是搜索词突出显示。红色和黄色不受欢迎。
有人可以指出我在这些 SLES 11 盒子上可能不同的环境变量或设置吗?下面是我的 SLES10 与 SLES11 登录的屏幕截图,点文件同步(例如 .bash_profile、.bash_prompt、.vimrc 等)。
$TERM在两台服务器上都是xterm-256color. **见更新说明
从 SLES10 服务器:

相同的点文件,但在 SLES11 服务器上:

更新
$TERM基础上的输出infocmp这是从ncurses-devel我已经确认包是不是SLES11服务器图像。如果infocmp不运行或不可用,$TERM则保持未设置或脚本运行之前的任何内容。$TERM继承(已设置)的事件中,.bash_prompt脚本条件逻辑当前在infocmp …所以我们都diff默认安装了命令。我当然不知道如何很好地使用它。但我希望有一些合理的默认用法。但是当我打字时,diff file1 file2我得到了……一个文本……我必须在脑子里解析……这无济于事,因为这是两个文本的奇怪组合,而这两个文本本身又非常复杂。
所以我寻找了一个图形解决方案,例如meld. 开箱即用的效果要好得多。
然而,我更愿意一直保持在命令行上。是否有一个相当标准的命令:
libncursesvim,emacs也不依赖于IDE如果没有,为什么不呢?我看了看,colordiff但它并没有完全削减它。