'less -F'를 termcap 초기화와 효과적으로 결합할 수 있습니까?

'less -F'를 termcap 초기화와 효과적으로 결합할 수 있습니까?

less -F콘텐츠가 한 화면에 맞으면 닫히는 횟수가 줄어듭니다. 그러나 termcap 초기화를 사용하면 즉,아니요사용하면 -X파일이 화면에 맞고 내용이 덜 표시되고 화면에 맞는지 확인하고 초기화 해제 중에 화면을 종료하고 지우므로 아무것도 인쇄되지 않습니다.

이는 다음과 같이 증명할 수 있습니다(빈 LESS변수를 가정).

$ echo foo > new_file
$ cat new_file
foo
$ less -X -F new_file
foo
$ less -F new_file
$

마우스 휠로 스크롤할 수 있는 termcap 기능과 기타 기능이 마음에 들어서 절대 사용하고 싶지 않습니다 -X. 콘텐츠가 화면에 맞으면(그리고 기본적으로 그렇게 작동하는 경우 cat) 종료를 줄이는 방법도 있나요? ?

답변1

관련 발췌문은 다음과 같습니다less' 자주하는 질문:

화면을 변경하지 않고 종료할 수 있나요?

less가 시작되면 "ti" termcap 문자열을 터미널로 보내고, 종료되면 "te" 문자열을 보냅니다. "te" 문자열의 기능은 시스템, 터미널 유형 및 termcap 버전에 따라 다릅니다. 일부 시스템에서는 아무 작업도 수행하지 않습니다. 다른 경우에는 less가 시작되었을 때의 상태로 화면을 복원하고 less가 보고 있던 파일의 마지막 페이지를 화면에서 제거합니다.

시스템에서 "te"의 동작이 마음에 들지 않으면 -X 옵션으로 less를 호출하여 "ti" 및 "te" 문자열 전송을 비활성화할 수 있습니다. 불행하게도 "ti"/"te" 문자열이 원하는 다른 작업을 수행할 수 있기 때문에 이는 때때로 다른 부작용을 낳습니다. 예를 들어, 일부 터미널에서는 "ti" 및 "te"를 비활성화하면 화살표 키 작동이 중지됩니다.

"te"가 다른 작업을 수행하도록 하려면(예를 들어 화면을 아직 수행하지 않은 경우 복원) 시스템 터미널의 termcap 또는 terminfo를 변경하는 방법을 알아내야 합니다. 불행하게도 이 작업은 시스템마다 다르게 수행되므로 시스템 설명서를 확인해야 합니다.

연구 결과 "ti" 및 "te" termcap 함수는 terminfo에서 "smcup" 및 "rmcup"으로 명명되었으며 이는 보다 현대적인 termcap과 동일합니다.

$TERM터미널이 어떻게 구성되어 있는지( 아마도 ) 확인할 수 있습니다 xterm.

infocmp -1  # which will print out capabilites one per line

다음의 도움으로 시퀀스의 의미를 해독할 수 있습니다.VT100 제어 문자 참조.

터미널에서 "smcup" 및 "rmcup" 기능을 제거하는 경우:

infocmp -1 | sed -r '/[sr]mcup.*/d' > new-terminfo-for-$TERM

그런 다음 $TERM에 대한 새로운 기본 기능 사양임을 terminfo 라이브러리에 알립니다.

tic new-terminfo-for-$TERM
# you reverse this with `rm -ri ~/.terminfo`

눈치채실 겁니다 less'대체 화면더 이상 지워지지 않습니다(입력된 적이 없기 때문입니다).하지만 마우스가 더 이상 작동하지 않습니다..

"rmcup" 제어 문자 시퀀스를 가지고 놀다가 알아낸 경우 알려주세요!

고쳐 쓰다:

가능한 대안은 파일이 터미널 높이에 맞을 때 cat을 실행하는 함수로 less를 래핑하는 것입니다(이를.bashrc):

less () {
    # When single file argument, and file small enough, cat it
    if [ $# = 1 ] && [ -f "$1" ] && [ $(wc -l "$1" | cut -d' ' -f1) -le $((${LINES:-0} - 3)) ]; then
        cat "$@"
    else
        command less "$@"
    fi
}

답변2

예를 들어 느린 입력의 경우 다음을 git log -Gregex원합니다.

A) 행이 들어올 때 기본 화면에 표시한 다음 스크롤이 필요할 때 대체 화면으로 전환합니다(따라서 첫 번째 $LINES출력은 항상 스크롤백에 표시됩니다). 그렇다면 두 번째 출력을 선택합니다.비슷한 질문에 대한 Giles의 답변.

B) 행은 대체 화면에 나타나지만 스크롤이 필요하지 않으면 대체 화면이 종료되고 해당 행이 기본 화면에 인쇄됩니다(따라서 스크롤이 필요한 경우 스크롤백에 출력이 표시되지 않습니다). 구경하다비슷한 질문에 대한 내 대답.

답변3

문제에서 보고된 동작이 수정되었습니다.less 버전 5302018년 2월부터:

  • -F를 사용하고 파일이 한 화면에 맞으면 터미널 초기화 시퀀스가 ​​출력되지 않습니다.

이는 가 있든 없든 출력이 화면에 유지된다는 것을 의미합니다 -X.

또한,less 버전 59821/21부터 --redraw-on-quit여러 화면이 있고 대체 화면이 사용되는 경우에도 화면의 마지막 보기를 유지하는 옵션이 도입되었습니다.

--redraw-on-quit
       When quitting, after sending the terminal deinitialization string, redraws
       the entire last screen.   On  terminals  whose  terminal  deinitialization
       string  causes the terminal to switch from an alternate screen, this makes
       the last screenful of the current file remain visible after less has quit.

관련 정보