首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >打印出包括capname描述的terminfo条目?

打印出包括capname描述的terminfo条目?
EN

Stack Overflow用户
提问于 2018-12-20 14:20:36
回答 1查看 234关注 0票数 0

要打印出包括terminfo手册页中每个capname的简短描述的terminfo条目(例如,对于我当前的终端: xterm-256color),最直接的方法是什么?

我知道如何使用以下命令打印出我的终端的terminfo条目(每行一个capname ):

代码语言:javascript
复制
infocmp -1

生成:

代码语言:javascript
复制
#   Reconstructed via infocmp from file: /usr/share/terminfo/78/xterm-256color
xterm-256color|xterm with 256 colors,
    am,
    bce,
    ccc,
    km,
    mc5i

Etc.

我可以在terminfo手册页中手动查找每个capname的描述(例如,ccc表示“终端可以重新定义现有的颜色”),但是有没有一种方法可以显示每个capname的描述,而不必手动查找每个capname?

所以,举个例子,我希望看到这样的东西:

代码语言:javascript
复制
xterm-256color|xterm with 256 colors
am         terminal has automatic margins
bce        screen erased with background color
ccc        terminal can redefine existing colors
km         Has a meta key (i.e., sets 8th bit)
mc5i       printer will not echo on screen

Etc.

infocmp的输出始终是有分隔符的,并且相对容易解析,但是在terminfo手册页上列出的终端功能的表,以及跨越多行的不同列宽和capname描述,则不是这样的。如果是这样的话,生成我描述的输出会更简单。也许还有另一种来源可以替代terminfo手册页中的内容,它在编程上更易于操作?

我正在运行GNU bash,版本4.4.23(1)-release (x86_64-apple-darwin18.0.0)。

EN

回答 1

Stack Overflow用户

发布于 2018-12-21 05:55:09

可能不会。实际上,manual page和其他文件是使用scriptsdata file构造的,但这不是安装的

因为它是生成的,所以您可以编写一个脚本来提取信息,尽管您会发现像bash脚本(perl yes,awk yes,sed...maybe)这样做很有挑战性。下面是一小段文本(安装在您的系统上):

代码语言:javascript
复制
.TS H
center expand;
c l l c
c l l c
lw25 lw6 lw2 lw20.
\fBVariable     Cap-    TCap    Description\fR
\fBBooleans     name    Code\fR
auto_left_margin        bw      bw      T{
cub1 wraps from column 0 to last column
T}
auto_right_margin       am      am      T{
terminal has automatic margins
T}
back_color_erase        bce     ut      T{
screen erased with background color
T}
can_change      ccc     cc     

您始终可以使用infocmp,列出长名称,如果顺序与(默认)短名称相同,则可以组合它们。但是长名称的列表是按字母顺序排序的(布尔值、数字和字符串的分组,就像短名称一样),而短名称默认情况下是排序的,以匹配SVr4 terminfo数据。您可能会看到如下所示:

代码语言:javascript
复制
xterm-256color|xterm with 256 colors
        am      auto_right_margin
        bce     back_color_erase
        ccc     backspaces_with_bs
        km      can_change
        mc5i    eat_newline_glitch
        mir     has_meta_key
        msgr    move_insert_mode
        npc     move_standout_mode
        xenl    no_pad_char
        colors  prtr_silent
        cols    columns 
        it      init_tabs 
        lines   lines
        pairs   max_colors
        acsc    max_pairs
        bel     acs_chars  
        blink   back_tab
        bold    bell

实际上,ncurses有一个允许对名称进行排序的选项,因此您可以使用-sl选项(几乎)匹配右列的顺序。您可能会看到如下所示:

代码语言:javascript
复制
xterm-256color|xterm with 256 colors
        am      auto_right_margin
        bce     back_color_erase
        ccc     backspaces_with_bs
        xenl    can_change
        km      eat_newline_glitch
        mir     has_meta_key
        msgr    move_insert_mode
        npc     move_standout_mode
        mc5i    no_pad_char
        cols    prtr_silent
        it      columns
        lines   init_tabs
        colors  lines
        pairs   max_colors
        acsc    max_pairs
        cbt     acs_chars
        bel     back_tab
        cr      bell

这是“几乎”,因为列不会将xenleat_newline_glitch对齐,因为ncurses有一个通常不会显示的backspaces_with_bs的内部名称。对ncurses源代码进行更改以显示以下内容:

代码语言:javascript
复制
xterm-256color|xterm with 256 colors
        am      auto_right_margin
        bce     back_color_erase
        OTbs    backspaces_with_bs
        ccc     can_change 
        xenl    eat_newline_glitch

下面是我用来生成示例的perl脚本:

代码语言:javascript
复制
#!/usr/bin/env perl
# $Id: infocmp2col,v 1.1 2018/12/20 22:35:57 tom Exp $

use strict;
use warnings;

sub infocmp($$) {
    my $term = shift;
    my $opts = shift;
    my @data;
    if ( open FP, "infocmp -1 $opts $term |" ) {
        @data = <FP>;
        close FP;
        for my $n ( 0 .. $#data ) {
            chomp $data[$n];
            $data[$n] =~ s/,\s*$//;
            $data[$n] =~ s/[#=].*//;
        }
    }
    return \@data;
}

sub doit($) {
    my $term       = shift;
    my @short_term = @{ &infocmp( $term, "-sl" ) };
    my @long_term  = @{ &infocmp( $term, "-L" ) };
    for my $n ( 0 .. $#short_term ) {
        if ( $short_term[$n] =~ /^\s/ ) {
            printf "%s%s\n", $short_term[$n], $long_term[$n];
        }
        else {
            printf "%s\n", $short_term[$n];
        }
    }
}

if ( $#ARGV >= 0 ) {
    while ( $#ARGV >= 0 ) {
        &doit( pop @ARGV );
    }
}
else {
    &doit( $ENV{TERM} );
}

1;

我提到的次要修复是在ncurse6.2中(请参阅changes),所以这对大多数用户“应该是有效的”。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53863396

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档