ít hơn - muỗi-if-một màn hình mà không có --no-init


31

Tôi đang ở một thiết bị đầu cuối hỗ trợ màn hình thay thế được sử dụng bởi ít hơn, vim, v.v. để khôi phục màn hình trước đó sau khi thoát. Đó là một tính năng hay, nhưng nó thực sự phá vỡ sự --quit-if-one-screenchuyển đổi lessvì trong trường hợp đó, ít chuyển sang màn hình thay thế, hiển thị dữ liệu của nó, chỉ có một màn hình và thoát ra, lấy nội dung của màn hình thay thế với nó.

Cách giải quyết thường được đề xuất là sử dụng công --no-inittắc để tránh sử dụng hoàn toàn màn hình thay thế. Tuy nhiên, điều này là hơi xấu xí vì tôi làm muốn sử dụng nó trong trường hợp ít thực sự hoạt động như một máy nhắn tin. Do đó, tôi đang tìm giải pháp để sử dụng màn hình thay thế chỉ khi ít hơn không tự động chấm dứt.

Tôi chủ yếu sẽ sử dụng điều này như máy nhắn tin của Git, do đó, một kịch bản trình bao bọc chỉ chạy ít hơn trong trường hợp có đủ đầu ra cũng sẽ ổn. Ít nhất là nếu không có cách nào để làm điều đó mà không có một.


@thieMaster trong trường hợp này làm thế nào để bạn xác định màn hình thay thế? Tôi cố gắng làm sạch một số thẻ và tôi thực sự không hiểu ý nghĩa ở đây
Kiwy

Câu trả lời:


14

Vì ít hơn 530 (phát hành vào tháng 12 năm 2017), less --quit-if-one-screenkhông chuyển sang màn hình thay thế nếu nó đọc ít hơn một màn hình. Vì vậy, bạn sẽ không gặp phải vấn đề này nếu phiên bản ít hơn của bạn đủ gần đây.

Trong các phiên bản trước, ít phải quyết định có sử dụng màn hình thay thế khi bắt đầu hay không. Bạn không thể trì hoãn lựa chọn đó khi nó chấm dứt.

Bạn có thể gọi ít hơn, cho phép nó sử dụng màn hình thay thế và đưa nội dung lên màn hình chính nếu ít kết thúc tự động. Tuy nhiên tôi không biết cách phát hiện chấm dứt tự động.

Mặt khác, không khó để gọi cat cho đầu vào ngắn và ít hơn cho đầu vào lớn hơn, thậm chí bảo toàn bộ đệm để bạn không phải đợi toàn bộ đầu vào bắt đầu nhìn thấy ít hơn (bộ đệm có thể lớn hơn một chút - bạn sẽ không thấy bất cứ điều gì cho đến khi bạn có ít nhất một màn hình dữ liệu - nhưng không nhiều hơn nữa).

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

Bạn có thể thích nhìn thấy các dòng trên màn hình chính khi chúng đến và chuyển sang màn hình thay thế nếu các dòng sẽ gây ra cuộn.

#!/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
"Ít hơn phải quyết định có nên sử dụng màn hình thay thế khi màn hình bắt đầu hay không. Bạn không thể trì hoãn lựa chọn đó khi nó kết thúc." - mặc dù nó dường như không làm điều đó, nhưng nó không thể đơn giản trì hoãn bất kỳ đầu ra nào (như các lệnh khởi tạo đầu cuối hoặc dữ liệu thực tế) cho đến khi nhận được các dòng X. Nếu stdin cạn kiệt trong khi X <TERMINAL_LINES, nó chỉ đơn giản là đổ mọi thứ vào thiết bị xuất chuẩn và thoát, nếu không, nó sẽ khởi tạo màn hình thay thế và làm những gì nó phải làm
ThiefMaster

1
Cuối cùng tôi đã sử dụng một phiên bản sửa đổi của ví dụ mã đầu tiên của bạn: gist.github.com/ThiefMaster/8331024 ($ LINES trống khi được gọi là git-pager và tôi nghĩ rằng bạn đã quên tăng dần $n)
ThiefMaster

@ThiefMaster Cảm ơn bạn đã phản hồi. Lưu ý rằng bạn nên đặt #!/bin/bashtập lệnh của mình vì bạn đang sử dụng cấu trúc dành riêng cho bash, vì tập lệnh của bạn sẽ không hoạt động trên các hệ thống (chẳng hạn như Ubuntu) khi /bin/shkhông có bash.
Gilles 'SO- ngừng trở nên xấu xa'

3
Tôi thực sự thích ý tưởng này và đã phát triển nó thêm một chút (với nhiều tính năng hơn): github.com/stefanheule/smartless
stefan

1
@ThiefMaster: lesscũng có thể (nhưng không) có một cách tùy chọn để thoát khỏi nơi nó in nội dung hiện tại của màn hình sau khi gửi chuỗi un-init. Vì vậy, bạn có thể có lợi ích của màn hình thay thế không làm lộn xộn cuộn, nhưng vẫn để lại phần có liên quan của trang man hoặc bất cứ thứ gì trên thiết bị đầu cuối sau khi thoát.
Peter Cordes

9

GNU less v. 530 kết hợp bản vá Fedora được gọi bởi @ paul-antoine-arras và sẽ không còn xuất trình tự khởi tạo đầu cuối khi --quit-if-one-screenđược sử dụng và đầu vào khớp với một màn hình.


4
Người dùng Homebrew trên Mac OS có thể có hành vi này ngay lập tức bằng cách chạy brew install lessvà đảm bảo $LESScó F và bỏ qua X.
Ryan Patterson

Đây là câu trả lời yêu thích của tôi. Tôi đã ngay lập tức tải xuống Bài 5.3.0 từ GNU và tự biên dịch nó. Gợi ý tuyệt vời!
iBug

5

Đối với đầu vào chậm, như git log -Gregex , bạn có muốn:

A) các dòng xuất hiện trên màn hình chính khi chúng đến, sau đó chuyển sang màn hình thay thế sau khi cần cuộn (vì vậy đầu ra đầu tiên $LINESsẽ luôn xuất hiện trong cuộn ngược của bạn); nếu vậy, hãy đi với câu trả lời thứ 2 của Gilles .

B) các dòng xuất hiện trên màn hình thay thế, nhưng thoát khỏi màn hình thay thế và in các dòng đó sang màn hình chính nếu việc cuộn hóa ra là không cần thiết (vì vậy sẽ không có đầu ra nào xuất hiện trong cuộn ngược của bạn nếu cần cuộn); nếu vậy, hãy sử dụng đoạn script dưới đây:

Đó teelà đầu vào của một tệp tạm thời, sau đó một lần lessthoát nó catlà tệp tạm thời nếu nó chứa ít dòng hơn chiều cao màn hình:

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

Sử dụng nó với export PAGER='/path/to/script' . Điều đó là đủ để gitsử dụng nó, trừ khi bạn đã ghi đècore.pager .

Để biết các cải tiến có thể, hãy xem thêm phiên bản tập lệnh này hơn một chút của tôi tại: https://github.com/johnmellor/scripts/blob/master/bin/least


3

Điều này đã được giải quyết từ lâu trong các bản phát hành dựa trên Red Hat bằng cách sửa đổi hành vi của tùy chọn -F trong lessmã nguồn: xem bản vá này từ Dự án Fedora, phiên bản đầu tiên có từ năm 2008. Ý tưởng đơn giản là để có được chiều cao của thiết bị đầu cuối (tức là số dòng tối đa có thể được hiển thị cùng một lúc) và bỏ qua các chuỗi khởi tạo và khử khử khi tệp vừa trong một màn hình. Do đó, không cần tùy chọn -X và -F có thể được sử dụng một cách nhất quán bất kể chiều dài tệp.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.