น้อยกว่า - ได้รับถ้าหากหนึ่งหน้าจอโดยไม่ต้อง - no-init


31

ฉันอยู่บนหน้าจอเทอร์มินัลที่รองรับหน้าจอทางเลือกที่ใช้น้อยกว่าเป็นกลุ่มเป็นต้นเพื่อเรียกคืนหน้าจอก่อนหน้าหลังจากออกจาก นั่นเป็นคุณสมบัติที่ดี แต่จริง ๆ แล้วแบ่ง--quit-if-one-screenสวิตช์lessเนื่องจากในกรณีนั้นน้อยสลับไปยังหน้าจออื่นแสดงข้อมูลตัวเลขมีเพียงหน้าจอเดียวและออกจากการใช้เนื้อหาของหน้าจออื่นด้วย

วิธีแก้ปัญหาที่แนะนำโดยทั่วไปคือการใช้--no-initสวิตช์เพื่อหลีกเลี่ยงการใช้หน้าจออื่นโดยสิ้นเชิง แต่นี้ค่อนข้างน่าเกลียดเพราะผมไม่ต้องการที่จะใช้ในกรณีที่น้อยจริงทำหน้าที่เป็นเพจเจอร์ ดังนั้นฉันกำลังมองหาวิธีแก้ปัญหาที่จะใช้หน้าจอทางเลือกเฉพาะในกรณีที่น้อยกว่าจะไม่สิ้นสุดโดยอัตโนมัติ

ส่วนใหญ่ฉันจะใช้สิ่งนี้เป็นเพจเจอร์ของ Git ดังนั้นสคริปต์ shell wrapper ที่ทำงานน้อยลงในกรณีที่มีเอาต์พุตมากพอที่จะใช้ได้เช่นกัน อย่างน้อยถ้าไม่มีวิธีที่จะทำโดยไม่มีใคร


@thieMaster ในกรณีนี้คุณจะกำหนดหน้าจอทางเลือกได้อย่างไร ฉันพยายามทำความสะอาดแท็กและฉันก็ไม่เข้าใจความหมายที่นี่
Kiwy

คำตอบ:


14

ตั้งแต่ 530 น้อยกว่า (เปิดตัวในเดือนธันวาคม 2017) less --quit-if-one-screenอย่าเปลี่ยนไปที่หน้าจอทางเลือกหากอ่านน้อยกว่าหนึ่งหน้าจอ ดังนั้นคุณจะไม่มีปัญหานี้หากรุ่นที่น้อยกว่าของคุณเป็นรุ่นล่าสุด

ในรุ่นก่อนหน้าน้อยกว่าจะต้องตัดสินใจว่าจะใช้หน้าจอทางเลือกเมื่อมันเริ่ม คุณไม่สามารถเลื่อนตัวเลือกนั้นไปเมื่อสิ้นสุดได้

คุณสามารถโทรได้น้อยลงปล่อยให้มันใช้หน้าจอทางเลือกและจัดเนื้อหาลงบนหน้าจอหลักหากน้อยลงโดยอัตโนมัติ อย่างไรก็ตามฉันไม่รู้วิธีตรวจสอบการเลิกจ้างอัตโนมัติ

ในทางกลับกันก็ไม่ยากที่จะเรียกว่า 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 หาก stdin หมดแรงในขณะที่ X <TERMINAL_LINES มันจะทิ้งทุกอย่างไว้ที่ stdout และ exit มิฉะนั้นจะเริ่มต้นหน้าจอทางเลือกและทำสิ่งที่ควรจะทำ
ThiefMaster

1
ฉันลงเอยด้วยการใช้ตัวอย่างโค้ดแรกที่แก้ไขแล้วของคุณ: gist.github.com/ThiefMaster/8331024 ($ LINES ว่างเปล่าเมื่อถูกเรียกว่า git-pager และฉันคิดว่าคุณลืมการเพิ่ม$n)
ThiefMaster

@ThiefMaster ขอบคุณสำหรับคำติชม โปรดทราบว่าคุณควรใส่#!/bin/bashสคริปต์ของคุณเนื่องจากคุณใช้โครงสร้างเฉพาะของ bash เนื่องจากสคริปต์ของคุณจะไม่ทำงานบนระบบ (เช่น Ubuntu) ที่/bin/shไม่มีการทุบตี
Gilles 'หยุดความชั่วร้าย'

3
ฉันชอบความคิดนี้มากและพัฒนาขึ้นอีกเล็กน้อย (พร้อมคุณสมบัติเพิ่มเติม): github.com/stefanheule/smartless
stefan

1
@ThiefMaster: lessอาจมี (แต่ไม่มี) มีตัวเลือกในการออกจากที่ซึ่งจะพิมพ์เนื้อหาปัจจุบันของหน้าจอหลังจากส่งสตริง un-init ดังนั้นคุณสามารถได้รับประโยชน์จากหน้าจอทางเลือกที่ไม่ยุ่งเหยิง scrollback แต่ยังคงปล่อยส่วนที่เกี่ยวข้องของ man-man หรืออะไรก็ตามที่เทอร์มินัลหลังจากออกจาก
Peter Cordes

9

GNU น้อยกว่า v. 530 ประกอบด้วย Fedora-patch ที่อ้างถึงโดย @ paul-antoine-arras และจะไม่ส่งออกลำดับการเริ่มต้นของเทอร์มินัลอีกต่อไปเมื่อ--quit-if-one-screenมีการใช้งานและอินพุตนั้นพอดีกับหน้าจอเดียว


4
ผู้ใช้ Homebrew บน Mac OS สามารถรับพฤติกรรมนี้ได้ทันทีโดยเรียกใช้brew install lessและทำให้แน่ใจว่า$LESSมี F และละเว้น X.
Ryan Patterson

นี่คือคำตอบที่ฉันโปรดปราน ฉันดาวน์โหลด Less 5.3.0 จาก GNU ทันทีและรวบรวมด้วยตัวเอง คำใบ้ยอดเยี่ยม!
iBug

5

สำหรับอินพุทที่ช้าเช่นgit log -Gregexคุณต้องการ:

A) บรรทัดที่ปรากฏบนหน้าจอหลักเมื่อเข้ามาแล้วสลับไปที่หน้าจออื่นเมื่อจำเป็นต้องเลื่อน (ดังนั้น$LINESผลลัพธ์แรกจะปรากฏใน scrollback ของคุณเสมอ); ถ้าเป็นเช่นนั้นไปกับที่ 2 ของคำตอบของกิลส์

B) บรรทัดที่จะปรากฏบนหน้าจอทางเลือก แต่ออกจากหน้าจอทางเลือกและพิมพ์บรรทัดไปที่หน้าจอหลักหากการเลื่อนกลายเป็นสิ่งที่ไม่จำเป็น (ดังนั้นผลลัพธ์จะไม่ปรากฏใน scrollback ของคุณหากจำเป็นต้องเลื่อน); ถ้าเป็นเช่นนั้นใช้สคริปต์ด้านล่าง:

มันteeคืออินพุตไปยังไฟล์ชั่วคราวจากนั้นเมื่อlessออกcatจากไฟล์ชั่วคราวหากมันมีบรรทัดน้อยกว่าความสูงของหน้าจอ:

#!/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'ใช้กับ ซึ่งควรจะเพียงพอที่จะทำให้การใช้งานได้นอกจากว่าคุณได้แล้วแทนที่gitcore.pager

สำหรับการปรับปรุงที่เป็นไปได้โปรดดูสคริปต์นี้ในเวอร์ชั่นที่มีเนื้อหาเพิ่มขึ้นเล็กน้อยที่: https://github.com/johnmellor/scripts/blob/master/bin/least


3

สิ่งนี้ได้รับการแก้ไขใน Distros ที่ใช้ Red Hat เป็นเวลานานโดยการปรับเปลี่ยนพฤติกรรมของตัวเลือก -F ในlessซอร์สโค้ด: ดูแพทช์นี้จากโครงการ Fedora ซึ่งมีรุ่นแรกที่ย้อนกลับไปในปี 2008 ความคิดนั้นง่ายมาก เทอร์มินัล (นั่นคือจำนวนบรรทัดสูงสุดที่สามารถแสดงได้ในครั้งเดียว) และเพื่อละเว้นลำดับการกำหนดค่าเริ่มต้นและลำดับขั้นตอนเมื่อไฟล์พอดีในหน้าจอเดียว ดังนั้นไม่จำเป็นต้องใช้ตัวเลือก -X และ -F สามารถใช้งานได้อย่างสม่ำเสมอไม่ว่าไฟล์จะมีความยาวเท่าใดก็ตาม

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.