termcap 함수의 터미널 상태를 가져옵니다.

termcap 함수의 터미널 상태를 가져옵니다.

smam및 등의 터미널 설정 상태를 어떻게 검색할 수 있나요 rmam?

그 이유는 rmam내가 설정한 것입니다.

tput rmam

스크립트에서 smam이탈 설정을 진행합니다.

tput smam

그러나 스크립트가 시작될 때 터미널이 이미 설정되어 있으면 종료 시 설정 rmam하고 싶지 않습니다 .smam


이것이 어떻게 달성될 수 있습니까?

답변1

이를 지원하는 터미널 에뮬레이터에서는 이스케이프("DEC 개인 모드 요청")를 사용하여 \033[?7$p이 매개변수( => 단어 줄 바꿈 모드)를 쿼리 할 수 있습니다.7

decrqm()(
    exec </dev/tty
    t=$(stty -g)
    trap 'stty "$t"; return' EXIT QUIT INT TERM
    stty -icanon -echo time 1 min 0
    e=$(printf '\033')
    printf "${e}[$1\$p" >/dev/tty
    case $(dd count=1 2>/dev/null) in
    "${e}[$1;1\$y") echo on;;
    "${e}[$1;2\$y") echo off;;
    *) echo unknown;;
    esac
)

$ tput smam  # printf '\033[?7h'
$ decrqm '?7'
on
$ tput rmam  # printf '\033[?7l'
$ decrqm '?7'
off

더 좋은 방법은구하다\033[?7s스크립트 사용 및 실행 시 설정다시 덮다나갈 때 \033[?7r:

save_am(){ printf '\033[?7s'; }
restore_am(){ printf '\033[?7r'; }

save_am
tput rmam
..
restore_am

그러나 많은 터미널 에뮬레이터( 특히 screentmux지원하지 않음탈출한 사람들. 적어도 기본적으로는 아닙니다. 따라서 이것은 모두 순수한 퀴즈입니다. 실제로는 아무것도 할 수 없습니다 ;-)

답변2

매우 보기 흉하지만 탐지 가능함:

#!/bin/bash

# Detect smam / rmam by printing COLUMNS characters and 
# checking cursor line before and after.

smam()
(
    local -i smam r1 r2 cw
    exec </dev/tty
    local t=$(stty -g)
    trap 'stty "$t"; return' EXIT QUIT INT TERM
    stty -icanon -echo time 1 min 0

    # Terminal width + 1
    (( cw = $(tput cols) + 1 ))

    # Create a blank line and go back up (in case we are at bottom)
    printf "\n"
    tput cuu1
    # Get cursor row 1
    printf "\x1b[6n" >/dev/tty
    r1=$(dd count=1 2>/dev/null | sed 's/\x1b\[\(.*\);.*/\1/')
    # Print columns + 1 spaces
    for ((i = 0; i < cw; ++i)); do printf " "; done
    # Get cursor row 2 AND go to start of line
    printf "\x1b[6n\r" >/dev/tty
    r2=$(dd count=1 2>/dev/null | sed 's/\x1b\[\(.*\);.*/\1/')

    # smam is true if we are at a higher line number
    (( smam = r2 - r1 ))
    # Clear line
    tput el
    # If smam clear line we started on as well
    (( smam )) && tput cuu1 && tput el
    # Optional debug check 
    # printf "%d %d\n" $x1 $x2
    return $(( smam ^ 1 ))
)

# example:

smam && echo smam || echo rmam


한 가지 특이한 점은 사람들이 새로운 회선에 전화를 걸려면 대기 상태에 있어야 한다는 것입니다.

관련 정보