daha az - -quit-if-one-screen olmadan - no-init


31

Çıktıktan sonra önceki ekranı geri yüklemek için daha az, vim vb. Tarafından kullanılan alternatif ekranı destekleyen bir terminaldeyim. Bu hoş bir özelliktir, ancak bu durumda alternatif ekrana daha az geçiş yapılması, verilerini göstermesi, yalnızca bir ekran olduğunu fark etmesi ve alternatif ekranın içeriğini alarak çıkması nedeniyle --quit-if-one-screenanahtarın gerçekten kesilmesi less.

Genel olarak önerilen geçici çözüm, --no-initalternatif ekranı tamamen kullanmaktan kaçınmak için düğmeyi kullanmaktır. Ben Ancak, bu biraz çirkin do durumda kullanmak isteyen az aslında bir çağrı cihazı olarak işlev görür. Bu nedenle, alternatif ekranı yalnızca daha az otomatik olarak sonlanmazsa kullanacak bir çözüm arıyorum.

Bunu çoğunlukla Git'in çağrı cihazı olarak kullanacağım, bu nedenle de yeterli çıktı olması durumunda yalnızca daha az çalıştırılan bir sarmalayıcı kabuk komut dosyası da iyi olacaktır. En azından bir olmadan yapmanın bir yolu yoksa.


@ thieMaster bu durumda alternatif ekranı nasıl tanımlarsınız? Bazı etiketleri temizlemeye çalışıyorum ve burada gerçekten anlam alamıyorum
Kiwy

Yanıtlar:


14

530'dan az (Aralık 2017'de piyasaya sürüldü), less --quit-if-one-screenbir perdeden az gösteriliyorsa alternatif ekrana geçmiyor. Yani daha az versiyonunuz yeterince yeni ise, bu problemi yaşamayacaksınız.

Önceki sürümlerde, daha az başladığında alternatif ekranın kullanılıp kullanılmayacağına karar vermek zorundadır. Bu seçimi sona erdiğinde erteleyemezsiniz.

Daha az arayabilir, alternatif ekranı kullanmasına izin verebilir ve daha az otomatik olarak sonlanırsa içeriği birincil ekrana getirebilirsiniz. Ancak otomatik sonlandırmayı tespit etmenin bir yolunu bilmiyorum.

Öte yandan, kısa girişler için kedi çağrısı yapmak zor değildir ve daha büyük girişler için daha az giriş, hatta tamponlamayı koruyarak bile tüm girişin daha az şey görmeye başlamasını beklemeniz gerekmez (arabellek biraz daha büyük - en az bir ekran bilgisine sahip olana kadar hiçbir şey göremezsiniz - ama çok fazla değil).

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

Satırları ana ekranda göründükleri gibi görmeyi ve satırlar kaydırmaya neden olacaksa alternatif ekrana geçmeyi tercih edebilirsiniz.

#!/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
"Daha az başladığında alternatif ekranın kullanılıp kullanılmayacağına karar vermek zorunda. Bu seçimi sonlandırıldığında erteleyemezsiniz." - görünüşte yapmasa da, X satırlarını alana kadar herhangi bir çıktıyı (terminal başlatma komutları veya gerçek veriler gibi) erteleyemedi. Eğer X <TERMINAL_LINES iken stdin tükenirse her şey stdout'a çıkar ve çıkar, aksi takdirde alternatif ekranı başlatır ve ne yapması gerekiyorsa onu yapar
ThiefMaster

1
İlk kod örneğinizin değiştirilmiş bir versiyonunu kullandım: gist.github.com/ThiefMaster/8331024 (git-pager olarak çağrıldığında $ LINES boştu ve sanırım $n
artmayı

@ThiefMaster Geri bildiriminiz için teşekkür ederiz. #!/bin/bashBaskına özgü yapıyı kullandığınızdan betiğinize yazmanız gerektiğini unutmayın, çünkü betiğiniz bash olmadığı sistemlerde (Ubuntu gibi) /bin/shçalışmaz.
Gilles 'SO- kötülük'

3
Bu fikri gerçekten beğendim ve biraz daha geliştirdim (daha fazla özelliğe sahip): github.com/stefanheule/smartless
stefan

1
@ThiefMaster: unit inze dizesini gönderdikten sonraless ekranın geçerli içeriğini yazdırdığı yerden çıkmak için isteğe bağlı bir yol da olabilir (ancak yok) . Bu nedenle, alternatif ekranın kaydırma geri tepmesini engellememesinin avantajına sahip olabilirsiniz, ancak çıktıktan sonra man sayfasının ilgili bölümünü veya terminaldeki herhangi bir şeyi bırakın.
Peter Cordes

9

GNU daha az v. 530 @ paul-antoine-arras tarafından belirtilen Fedora yamasını içerir ve --quit-if-one-screenkullanıldığında ve giriş bir ekrana sığdığında artık terminal başlatma sırasını vermeyecektir .


4
Mac OS'deki Homebrew kullanıcıları bu davranışı hemen çalıştırarak brew install lessve $LESSF ve ihmalleri X olduğundan emin olarak alabilirler .
Ryan Patterson

Bu benim en sevdiğim cevap. Hemen GNU’dan daha az 5.3.0 indirdim ve onu kendim derledim. Harika ipucu!
iBug

5

Yavaş girişler için, ister git log -Gregexmisiniz:

A) içeri girerken ana ekranda görünecek çizgiler, daha sonra kaydırma gerektiğinde alternatif ekrana geçin (bu nedenle $LINESçıktının ilki her zaman geri izlemenizde görünecektir); öyleyse, Gilles'in cevapları ile devam edin .

B) alternatif ekranda görünecek satırlar görünür, ancak alternatif ekrandan çıkılır ve kaydırma gerekli olmadığında satırları ana ekrana yazdırır (böylece kaydırma gerekliyse kaydırmada çıktısı görünmez); öyleyse, aşağıdaki betiği kullanın:

Bu teedaha sonra bir kez, geçici bir dosyaya girdi s lesso çıkar cato ekran yüksekliğinin daha az çizgiler içeriyorsa geçici dosya 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"

İle kullanın export PAGER='/path/to/script'. gitGeçersiz kılmadığınız sürece, onu kullanmanız yeterli olacaktır core.pager.

Olası geliştirmeler için, bu betiğin biraz daha tenli versiyonuna da bakın: https://github.com/johnmellor/scripts/blob/master/bin/least


3

Bu, lesskaynak kodunda -F seçeneğinin davranışını değiştirerek Red Hat-bazlı dağıtımlarda uzun süredir çözüldü : bu yamayı , ilk versiyonu 2008'e kadar uzanan Fedora Project'ten görün. uçbirim (yani bir kerede görüntülenebilecek maksimum satır sayısı) ve dosya bir ekrana sığdığında başlatma ve başlatma sırasını atlamak için. Böylece, -X seçeneğine ve -F'ye gerek yoktur, dosya uzunluğu ne olursa olsun tutarlı bir şekilde kullanılabilir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.