【问题标题】:Delay in terminfo parameterized stringsterminfo 参数化字符串的延迟
【发布时间】:2017-12-16 01:02:02
【问题描述】:

在terminfo的手册页中,提到$<>ms中指定延迟的编码中,在它的尖括号内是一个数字,精度至多小数点后一位。

通过以下 python 脚本,我确认 $< 仅用于指定延迟,即没有参数化字符串 $< 用于不指定延迟。

#!/usr/bin/env python3
# './test/data/stressTestTerms.txt' contains contains terminal names
# and directory './test/data/mirror' contains terminal databases of 2718 terminals

import subprocess
import re


def check_dollar_angular(caps):
    string_caps = [cap for cap in caps.split(',') if '=' in cap]

    # search for $<..> type delays in string caps
    delay = r"\$<(\d+(\.(\d)+)?\*?/?|(\.(\d)+)?\*?/?)>"

    caps_with_dollar = 0
    delay_matches = 0

    for cap in string_caps:
        matches = list(re.finditer(delay, cap))
        dollar_idx = cap.find('$<')

        if dollar_idx != -1:
            caps_with_dollar += 1
            if any([True if match.start() == dollar_idx else False for match in matches]):
                delay_matches += 1

    if caps_with_dollar == delay_matches:
        return True
    else:
        return False


if __name__ == "__main__":

    with open('./test/data/stressTestTerms.txt') as terminal_names:
        res = []

        for each_terminal in terminal_names:
            output = subprocess.run(
                ['infocmp', '-0', '-A', './test/data/mirror', each_terminal.strip()], stdout=subprocess.PIPE)

            try:
                output.check_returncode()
                caps = output.stdout.decode('utf-8')

                res.append(check_dollar_angular(caps))

            except subprocess.CalledProcessError as e:
                print(e)

        if (not all(res)):
            print(
                "We have a terminal where in one of it's caps there is a dollar-angular but it doesn't signify delay")
        else:
            print(
                "Success! no terminal found where '$<' is used for anything else other than specifying delay")

所以我的问题是,$&lt; 是否是文本/序列的一部分而不代表延迟?例如。是否有这样的情况(现在或将来的终端),例如:$&lt;%p1%d$&lt;A,其中没有结束尖括号,并且延迟并不意味着使用 $&lt; 指定并且仍然是有效的 terminfo 序列?

【问题讨论】:

    标签: python terminal ncurses terminfo termcap


    【解决方案1】:

    manual page 的语法非常明确:

       A  delay  in  milliseconds  may appear anywhere in a string capability,
       enclosed in $<..> brackets, as in el=\EK$<5>,  and  padding  characters
       are supplied by tputs(3x) to provide this delay.
    
       o   The delay must be a number with at most one decimal place of preci-
           sion; it may be followed by suffixes "*" or "/" or both.
    
       o   A "*" indicates that the padding required is  proportional  to  the
           number  of lines affected by the operation, and the amount given is
           the per-affected-unit padding required.  (In  the  case  of  insert
           character, the factor is still the number of lines affected.)
    
           Normally, padding is advisory if the device has the xon capability;
           it is used for cost computation but does not trigger delays.
    
       o   A "/" suffix indicates that the padding is mandatory and  forces  a
           delay of the given number of milliseconds even on devices for which
           xon is present to indicate flow control.
    

    如果没有结尾 &lt;,并且所附文本不是有效数字(可能有 * 和/或 /),那么tputs 不应将其视为延迟。

    没有$&lt; 后面不跟数字或“。”的例子。在 ncurses 的终端数据库中,但这并不意味着它会无效,因为终端数据库应该能够描述大多数字符串(除了 \200 的特殊情况(八进制)被视为与 \0 相同,以适应 C 语言的 NUL 终止字符串。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-21
      • 2012-01-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多