meno --quit-if-one-screen senza --no-init


31

Sono su un terminale che supporta lo schermo alternativo che viene utilizzato da less, vim, ecc. Per ripristinare il display precedente dopo essere uscito. Questa è una bella funzionalità, ma interrompe davvero il --quit-if-one-screenpassaggio lesspoiché in quel caso meno passa alla schermata alternativa, visualizza i suoi dati, capisce che c'è solo una schermata ed esce, portando con sé il contenuto della schermata alternativa.

La soluzione alternativa comunemente suggerita è utilizzare l' --no-initinterruttore per evitare di utilizzare del tutto lo schermo alternativo. Tuttavia, questo è un po 'brutto perché io non voglio usare in caso di meno in realtà si comporta come un cercapersone. Pertanto sto cercando una soluzione per utilizzare lo schermo alternativo solo se less non termina automaticamente.

Lo userò principalmente come cercapersone di Git, quindi uno script shell wrapper che gira meno nel caso in cui ci sia abbastanza output andrebbe bene. Almeno se non c'è modo di farlo senza uno.


@thieMaster in questo caso come si definisce lo schermo alternativo? Provo a ripulire alcuni tag e non capisco davvero il significato qui
Kiwy,

Risposte:


14

Poiché meno 530 (rilasciato a dicembre 2017), less --quit-if-one-screennon passa alla schermata alternativa se legge meno di una schermata. Quindi non avrai questo problema se la tua versione di less è abbastanza recente.

Nelle versioni precedenti, less deve decidere se utilizzare la schermata alternativa all'avvio. Non puoi rimandare quella scelta a quando termina.

Potresti chiamare meno, lasciarlo utilizzare lo schermo alternativo e inserire il contenuto sullo schermo principale se less termina automaticamente. Tuttavia non conosco un modo per rilevare la terminazione automatica.

D'altra parte, non è così difficile chiamare cat per input brevi e meno per input più grandi, anche preservando il buffering in modo da non dover aspettare che l'intero input inizi a vedere cose in meno (il buffer potrebbe essere leggermente più grande - non vedrai nulla finché non avrai almeno una schermata di dati - ma non molto di più).

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

Potresti preferire vedere le linee nella schermata principale quando entrano e passare alla schermata alternativa se le linee causano lo scorrimento.

#!/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
"Meno deve decidere se utilizzare la schermata alternativa quando si avvia. Non è possibile rinviare quella scelta a quando termina." - sebbene apparentemente non lo faccia, ma non potrebbe semplicemente rinviare qualsiasi output (come comandi di inizializzazione del terminale o dati effettivi) fino a quando non riceve X linee. Se stdin si esaurisce mentre X <TERMINAL_LINES scarica semplicemente tutto su stdout ed esce, altrimenti inizializza lo schermo alternativo e fa quello che dovrebbe fare
ThiefMaster

1
Ho finito per usare una versione modificata del tuo primo esempio di codice: gist.github.com/ThiefMaster/8331024 ($ LINES era vuoto quando chiamato come git-pager e penso che tu abbia dimenticato di incrementare $n)
ThiefMaster

@ThiefMaster Grazie per il feedback. Nota che dovresti inserire il #!/bin/bashtuo script dal momento che stai usando un costrutto specifico per bash, dato che lo script non funzionerà su sistemi (come Ubuntu) dove /bin/shnon è bash.
Gilles 'SO- smetti di essere malvagio' il

3
Questa idea mi è piaciuta molto e l'ho sviluppata un po 'di più (con più funzioni): github.com/stefanheule/smartless
stefan

1
@ThiefMaster: lesspotrebbe anche (ma non) avere un modo opzionale per uscire da dove stampa il contenuto corrente dello schermo dopo aver inviato la stringa un-init. Quindi potresti avere il vantaggio di una schermata alternativa che non ingombra lo scrollback, ma lascia comunque la parte rilevante della pagina man o qualunque altra cosa sul terminale dopo essere uscito.
Peter Cordes,

9

GNU less v. 530 incorpora la patch Fedora a cui fa riferimento @ paul-antoine-arras e non emetterà più la sequenza di inizializzazione del terminale quando --quit-if-one-screenviene utilizzata e l'ingresso si adatta su una schermata.


4
Gli utenti homebrew su Mac OS possono ottenere immediatamente questo comportamento eseguendo brew install lesse assicurandosi che $LESSabbia F e ometta X.
Ryan Patterson

Questa è la mia risposta preferita Ho immediatamente scaricato Less 5.3.0 da GNU e l'ho compilato da solo. Ottimo suggerimento!
iBug

5

Per input lenti, come git log -Gregex, vuoi:

A) le linee appaiono sulla schermata principale quando entrano, quindi passano alla schermata alternativa quando è necessario lo scorrimento (quindi il primo $LINESdell'output apparirà sempre nel tuo scrollback); in tal caso, vai con la seconda delle risposte di Gilles .

B) le linee vengono visualizzate sulla schermata alternativa, ma si esce dalla schermata alternativa e si stampano le linee sulla schermata principale se lo scorrimento risulta non necessario (quindi non verrà visualizzato alcun output nello scorrimento se era necessario lo scorrimento); in tal caso, utilizzare lo script seguente:

È teel'input in un file temporaneo, quindi una volta lessuscito è catil file temporaneo se contiene meno righe dell'altezza dello schermo:

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

Usalo con export PAGER='/path/to/script'. Dovrebbe essere sufficiente per gitutilizzarlo, a meno che tu non abbia già eseguito l'override core.pager.

Per possibili miglioramenti, vedi anche la mia versione leggermente più raffinata di questo script su: https://github.com/johnmellor/scripts/blob/master/bin/least


3

Questo è stato a lungo risolto nelle distro basate su Red Hat modificando il comportamento dell'opzione -F nel lesscodice sorgente: vedere questa patch dal Progetto Fedora, la cui prima versione risale al 2008. L'idea è semplicemente quella di ottenere l'altezza del terminale (ovvero il numero massimo di righe che possono essere visualizzate contemporaneamente) e di omettere le sequenze di inizializzazione e deinizializzazione quando il file si adatta a una schermata. Pertanto, non è necessario utilizzare l'opzione -X e -F in modo coerente, indipendentemente dalla lunghezza del file.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.