2017-12-15 32 views
0

terminfo의 맨 페이지에 ms에 지연을 지정하는 인코딩에 $<>이 있고 그 안에 꺾쇠 괄호 안에 소수점 이하 1 자리의 소수 자릿수가 있음을 언급합니다.terminfo 매개 변수화 된 문자열의 지연

그리고 다음과 같은 파이썬 스크립트에서 $<은 지연을 지정하는 데만 사용된다는 것을 확인했습니다. 즉, $<이 지연을 지정하지 않는 데 사용 된 매개 변수화 된 문자열이 없음을 확인했습니다.

#!/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") 

그래서 제 질문은 텍스트/시퀀스의 일부가 될 및 지연을 나타내지 $< 여부, 입니까? 예 : $<%p1%d 또는 $<A과 같이 대소 문자가 존재할 수 있습니까 (예 : 현재 또는 미래의 터미널)? $<을 사용하여 지정해야하는 것은 아니며 유효한 terminfo 시퀀스입니까? manual page

답변

2

는 구문에 대한 매우 명시 적이다 :

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. 

가 있다면 더 <, 동봉 된 텍스트 (수 * 및/또는 /포함)하지 유효한 번호가 아닙니다 종료 , tputs은 지연으로 처리해서는 안됩니다.

$<에는 숫자 또는 "." ncurses를의 터미널 데이터베이스,하지만 터미널 데이터베이스 \200가 (8 진수)에 \0와 동일하게 처리됩니다 특별한 경우 제외 (대부분의 문자열을 설명 할 수 있어야하기 때문에 그것이 무효 것 의미하지 않는다 C 언어의 NUL 종료 문자열을 수용합니다.