--no-init없이 --quit-if-one-screen


31

less, vim 등이 종료 후 이전 디스플레이를 복원하는 데 사용하는 대체 화면을 지원하는 터미널에 있습니다. 좋은 기능이지만 대체 화면으로 전환하는 스위치가 적고 데이터를 표시하고 화면이 하나만있는 것으로 확인한 다음 종료하여 대체 화면의 내용을 가져 오기 때문에 --quit-if-one-screen스위치가 실제로 중단 less됩니다.

일반적으로 제안되는 해결 방법은 --no-init대체 화면을 함께 사용하지 않도록 스위치를 사용하는 것입니다. 그러나 실제로 페이저 역할을 하지 않는 경우에 사용하고 싶기 때문에 다소 추한 것입니다. 따라서 자동으로 종료되지 않는 경우에만 대체 화면을 사용하는 솔루션을 찾고 있습니다.

나는 이것을 주로 Git의 호출기로 사용하므로 충분한 출력이있는 경우에만 덜 실행되는 래퍼 셸 스크립트도 좋습니다. 적어도 하나없이 할 수있는 방법이 없다면.


이 경우 @thieMaster는 대체 화면을 어떻게 정의합니까? 태그를 정리하려고하는데 여기에 의미가 없습니다.
Kiwy

답변:


14

530 개 미만 (2017 년 12 월에 릴리스 됨)이므로 less --quit-if-one-screen화면이 1 개 미만이면 대체 화면으로 전환되지 않습니다. 따라서 최신 버전이 충분하지 않으면이 문제가 발생하지 않습니다.

이전 버전에서는 대체 화면이 시작될 때 사용할지 여부를 덜 결정했습니다. 선택을 종료 할 때 연기 할 수 없습니다.

덜 전화하면 대체 화면을 사용할 수 있으며 자동으로 덜 종료되면 기본 화면에 내용을 표시 할 수 있습니다. 그러나 자동 종료를 감지하는 방법을 모르겠습니다.

반면에 짧은 입력에 대해서는 cat을 호출하고 더 큰 입력에 대해서는 cat을 호출하는 것이 어렵지 않습니다. 심지어 버퍼링을 유지하여 전체 입력이 더 적은 것을 볼 때까지 기다릴 필요가 없습니다. 약간 더 크면 – 최소한 한 화면 이상의 데이터가있을 때까지는 아무것도 보이지 않지만 그 이상은 아닙니다.

#!/bin/sh
n=3  # number of screen lines that should remain visible in addition to the content
lines=
newline='
'
case $LINES in
  ''|*[!0-9]*) exec less;;
esac
while [ $n -lt $LINES ] && IFS= read -r line; do
  lines="$lines$newline$line"
done
if [ $n -eq $LINES ]; then
  { printf %s "$lines"; exec cat; } | exec less
else
  printf %s "$lines"
fi

기본 화면에 줄이 나오는 것을보고 선이 스크롤되는 경우 대체 화면으로 전환하는 것을 선호 할 수 있습니다.

#!/bin/sh
n=3  # number of screen lines that should remain visible in addition to the content
beginning=
newline='
'
# If we can't determine the terminal height, execute less directly
[ -n "$LINES" ] || LINES=$(tput lines) 2>/dev/null
case $LINES in
  ''|*[!0-9]*) exec less "$@";;
esac
# Read and display enough lines to fill most of the terminal
while [ $n -lt $LINES ] && IFS= read -r line; do
  beginning="$beginning$newline$line"
  printf '%s\n' -- "$line"
  n=$((n + 1))
done
# If the input is longer, run the pager
if [ $n -eq $LINES ]; then
  { printf %s "$beginning"; exec cat; } | exec less "$@"
fi

5
"대체 화면을 시작할 때 사용할지 여부를 결정해야합니다. 종료시 해당 선택을 연기 할 수 없습니다." -분명히하지는 않지만 X 줄을 수신 할 때까지 출력 (예 : 터미널 초기화 명령 또는 실제 데이터)을 지연시킬 수는 없습니다. X <TERMINAL_LINES 동안 stdin이 소진되면 단순히 stdout에서 모든 것을 덤프하고 종료합니다. 그렇지 않으면 대체 화면을 초기화하고 수행해야 할 작업을 수행합니다.
ThiefMaster

1
: 나는 수정 첫 번째 코드 예제의 버전을 사용하여 종료 gist.github.com/ThiefMaster/8331024 (자식-호출기로 호출 될 때 $ LINES가 비어을하고 난 당신이 증가 깜빡 생각 $n)
ThiefMaster

@ThiefMaster 피드백에 감사드립니다. #!/bin/bashbash 특정 구문을 사용하고 있으므로 스크립트가 /bin/shbash가 아닌 시스템 (Ubuntu와 같은)에서는 작동하지 않으므로 스크립트에 넣어야 합니다 .
Gilles 'SO- 악한 중지'

3
나는이 아이디어가 정말 마음에 들었고, 더 많은 기능을 추가로 개발했다 : github.com/stefanheule/smartless
stefan

1
@ThiefMaster : less또한 초기화되지 않은 문자열을 보낸 화면의 현재 내용을 인쇄하는 위치를 종료하는 선택적 방법이있을 수도 있습니다 . 따라서 대체 화면이 스크롤 백을 어지럽히 지 않고 맨 페이지의 관련 부분이나 종료 후 터미널에 남겨 두는 이점을 누릴 수 있습니다.
Peter Cordes

9

GNU less v. 530에는 @ paul-antoine-arras가 참조하는 Fedora 패치가 통합되어 있으며 --quit-if-one-screen사용될 때 입력이 한 화면에 맞으면 더 이상 터미널 초기화 시퀀스를 출력하지 않습니다 .


4
Mac OS의 Homebrew 사용자는을 실행하여 즉시이 동작을 얻을 수 있으며 F가 있고 X가 생략 brew install less되어 있는지 확인하십시오.$LESS
Ryan Patterson

이것은 내가 가장 좋아하는 답변입니다. GNU에서 Less 5.3.0을 즉시 다운로드하여 직접 컴파일했습니다. 좋은 힌트!
iBug

5

과 같은 느린 입력의 경우 git log -Gregex다음을 원합니다.

A) 메인 화면에 줄이 나타나고 스크롤이 필요하면 대체 화면으로 전환하십시오 (따라서 첫 번째 $LINES출력은 항상 스크롤 백에 나타납니다). 그렇다면 Gilles의 답변 2로 가십시오 .

B) 라인이 대체 화면에 나타나지만, 스크롤이 불필요하다고 판명되면 대체 화면을 종료하고 라인을 기본 화면에 인쇄하십시오 (스크롤이 필요한 경우에는 스크롤 백에 출력이 나타나지 않습니다). 그렇다면 아래 스크립트를 사용하십시오.

그것은 tee다음 번, 임시 파일에 입력이야 less이 종료 cat는 화면 높이보다 적은 라인이 포함 된 경우 임시 파일을 S :

#!/bin/bash

# Needed so less doesn't prevent trap from working.
set -m
# Keeps this script alive when Ctrl+C is pressed in less,
# so we still cat and rm $TMPFILE afterwards.
trap '' EXIT

TXTFILE=$(mktemp 2>/dev/null || mktemp -t 'tmp')

tee "$TXTFILE" | LESS=-FR command less "$@"

[[ -n $LINES ]] || LINES=$(tput lines)
[[ -n $COLUMNS ]] || COLUMNS=$(tput cols)
# Wrap lines before counting, unless you pass --chop-long-lines to less
# (the perl regex strips ANSI escapes).
if (( $(perl -pe 's/\e\[?.*?[\@-~]//g' "$TXTFILE" | fold -w "$COLUMNS" | wc -l) < $LINES )); then
    cat "$TXTFILE"
fi

rm "$TXTFILE"

와 함께 사용하십시오 export PAGER='/path/to/script'. git이미 재정의하지 않은 한 그것을 사용하기에 충분해야합니다 core.pager.

가능한 개선 사항은 https://github.com/johnmellor/scripts/blob/master/bin/least 에서이 스크립트의 약간 더 많은 버전을 참조하십시오.


3

이는 less소스 코드 에서 -F 옵션의 동작을 수정하여 Red Hat 기반 배포판에서 오랫동안 해결되었습니다 . 첫 번째 버전이 2008 년으로 거슬러 올라간 Fedora Project 의이 패치 를 참조하십시오 . 아이디어는 단순히 터미널 (즉, 한 번에 표시 할 수있는 최대 행 수)과 파일이 한 화면에 맞을 때 초기화 및 초기화 해제 순서를 생략합니다. 따라서 -X 옵션이 필요하지 않으며 파일 길이에 관계없이 -F를 일관되게 사용할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.