kurang --quit-if-one-screen tanpa --no-init

31

Saya berada di terminal yang mendukung layar alternatif yang digunakan oleh less, vim, dll. Untuk mengembalikan tampilan sebelumnya setelah keluar. Itu fitur yang bagus, tetapi itu benar-benar mematahkan --quit-if-one-screensakelar lesskarena dalam kasus itu lebih sedikit beralih ke layar alternatif, menampilkan datanya, angka-angka di luar hanya ada satu layar, dan keluar, dengan mengambil isi layar alternatif dengannya.

Solusi yang umum disarankan adalah menggunakan --no-initsakelar untuk menghindari penggunaan layar alternatif sama sekali. Namun, ini agak jelek karena saya tidak ingin menggunakannya dalam kasus kurang benar-benar bertindak sebagai pager. Karena itu saya mencari solusi untuk menggunakan layar alternatif hanya jika lebih sedikit tidak berhenti secara otomatis.

Saya sebagian besar akan menggunakan ini sebagai pager Git, jadi skrip shell pembungkus yang hanya berjalan kurang jika ada cukup output juga akan baik-baik saja. Setidaknya jika tidak ada cara untuk melakukannya tanpa itu.

Pencuri
sumber
@thieMaster dalam hal ini bagaimana Anda mendefinisikan layar alternatif? Saya mencoba untuk membersihkan beberapa tag dan saya benar-benar tidak mendapatkan artinya di sini
Kiwy

Jawaban:

14

Sejak kurang 530 (dirilis pada Desember 2017), less --quit-if-one-screentidak beralih ke layar alternatif jika terbaca kurang dari satu layar penuh. Jadi Anda tidak akan memiliki masalah ini jika versi Anda kurang cukup baru.

Pada versi sebelumnya, lebih sedikit yang harus memutuskan apakah akan menggunakan layar alternatif ketika dimulai. Anda tidak dapat menunda pilihan itu saat berakhir.

Anda bisa menelepon lebih sedikit, membiarkannya menggunakan layar alternatif, dan memasukkan konten ke layar utama jika kurang otomatis dihentikan. Namun saya tidak tahu cara mendeteksi penghentian otomatis.

Di sisi lain, tidak sulit untuk memanggil cat untuk input pendek dan lebih sedikit untuk input yang lebih besar, bahkan menjaga buffering sehingga Anda tidak perlu menunggu seluruh input untuk mulai melihat barang-barang lebih sedikit (buffer mungkin sedikit lebih besar - Anda tidak akan melihat apa pun sampai Anda memiliki setidaknya satu layar penuh data - tetapi tidak lebih).

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

Anda mungkin lebih suka melihat garis-garis pada layar utama saat mereka masuk, dan beralih ke layar alternatif jika garis-garis itu akan menyebabkan pengguliran.

#!/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
Gilles 'SANGAT berhenti menjadi jahat'
sumber
5
"Less harus memutuskan apakah akan menggunakan layar alternatif ketika dimulai. Anda tidak bisa menunda pilihan itu ketika berakhir." - meskipun tampaknya tidak melakukannya, tetapi tidak dapat hanya menunda output (seperti perintah inisialisasi terminal atau data aktual) sampai telah menerima garis X. Jika stdin habis sementara X <TERMINAL_LINES itu hanya akan membuang semuanya di stdout dan keluar, jika tidak maka akan menginisialisasi layar alternatif dan melakukan apa yang seharusnya dilakukan
ThiefMaster
1
Saya akhirnya menggunakan versi modifikasi dari contoh kode pertama Anda: gist.github.com/ThiefMaster/8331024 ($ LINES kosong ketika dipanggil git-pager dan saya pikir Anda lupa menambahkan $n)
ThiefMaster
@ThiefMaster Terima kasih atas umpan baliknya. Perhatikan bahwa Anda harus memasukkan #!/bin/bashskrip karena Anda menggunakan konstruk spesifik-bash, karena skrip Anda tidak akan berfungsi pada sistem (seperti Ubuntu) di mana /bin/shbukan bash.
Gilles 'SO- stop being evil'
3
Saya sangat menyukai ide ini, dan mengembangkannya sedikit lebih jauh (dengan lebih banyak fitur): github.com/stefanheule/smartless
stefan
1
@ThiefMaster: lessbisa juga (tetapi tidak) memiliki cara opsional untuk berhenti di mana ia mencetak isi layar saat ini setelah mengirim string un-init. Jadi Anda bisa mendapatkan manfaat dari layar alternatif tidak mengacaukan scrollback, tetapi tetap meninggalkan bagian yang relevan dari halaman manual atau apa pun di terminal setelah keluar.
Peter Cordes
9

GNU less v. 530 menggabungkan Fedora-patch yang dirujuk oleh @ paul-antoine-arras dan tidak akan lagi menampilkan urutan inisialisasi terminal saat --quit-if-one-screendigunakan dan input sesuai pada satu layar.

eigengrau82
sumber
4
Pengguna homebrew di Mac OS bisa mendapatkan perilaku ini segera dengan menjalankan brew install less, dan memastikan $LESSmemiliki F dan menghilangkan X.
Ryan Patterson
Ini jawaban favorit saya. Saya segera mengunduh Less 5.3.0 dari GNU dan mengkompilasinya sendiri. Petunjuk bagus!
iBug
5

Untuk input yang lambat, seperti git log -Gregex , Anda ingin:

A) baris untuk muncul di layar utama saat mereka masuk, kemudian beralih ke layar alternatif begitu bergulir diperlukan (sehingga yang pertama $LINESdari output akan selalu muncul di scrollback Anda); jika demikian, pilih jawaban ke-2 dari Gilles .

B) garis muncul di layar alternatif, tetapi keluar dari layar alternatif dan cetak garis ke layar utama jika pengguliran ternyata tidak perlu (jadi tidak ada output akan muncul di gulir balik Anda jika pengguliran diperlukan); jika demikian, gunakan skrip di bawah ini:

Ini teeadalah input ke file sementara, kemudian setelah lesskeluar itu catfile sementara jika mengandung lebih sedikit garis dari tinggi layar:

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

Gunakan dengan export PAGER='/path/to/script'. Itu sudah cukup untuk gitmenggunakannya, kecuali Anda sudah menimpanyacore.pager .

Untuk kemungkinan peningkatan, lihat juga versi skrip saya yang sedikit lebih baik di: https://github.com/johnmellor/scripts/blob/master/bin/least

John Mellor
sumber
3

Ini telah lama dipecahkan di distro berbasis Red Hat dengan memodifikasi perilaku opsi -F dalam lesskode sumber: lihat tambalan ini dari Proyek Fedora, yang versi pertamanya tanggal kembali ke 2008. Idenya adalah hanya untuk mendapatkan ketinggian terminal (yaitu jumlah maksimum garis yang dapat ditampilkan sekaligus) dan untuk menghilangkan urutan inisialisasi dan deinitialisasi ketika file cocok dalam satu layar. Jadi, tidak perlu untuk opsi -X dan -F dapat digunakan secara konsisten berapa pun panjang file.

parras
sumber