Come usare "meno -F" senza "-X", ma visualizzare comunque l'output se solo una pagina?


11

Sto modificando il cercapersone di Git, ma ho qualche problema con esso.

Quello che voglio è:

  1. Uscita sempre colorata
  2. Scorrimento tramite touchpad o mouse
  3. Uscire da-se-un-schermo

E la mia configurazione attuale è:

$ git config --global core.pager
less -+F -+X -+S

Questo fa tutto tranne l'ultimo.

Ma, se rimuovo -+F, non ci sarà output in caso di una schermata. Se rimuovo -+Xanche, l'output è tornato ma non riesco a scorrere con il touchpad less.

Esiste una soluzione alternativa che può soddisfare tutti i requisiti di cui sopra?


Questa è una domanda molto interessante Quando uso -F(esci da una schermata) lo faccio sempre in combinazione con -X(disabilita termcap init e de-init), ma come dici tu, ciò non consentirebbe lo scorrimento con il mouse. (Dubito che lo scorrimento sia possibile affatto -X.) Ho modificato il titolo della domanda, ma sentiti libero di tornare indietro se ritieni che perde troppo significato. :)
Wildcard il

Risposte:


8

AGGIORNARE

tl; dr Soluzione: passa a meno 530

Da http://www.greenwoodsoftware.com/less/news.530.html :

Non generare la sequenza di inizializzazione del terminale se si utilizza -F e il file si adatta a una schermata.

Quindi con questa correzione non abbiamo nemmeno bisogno di preoccuparci di decidere se usare -Xda soli, ci pensiamo less -Fsolo.

PS. Alcune altre configurazioni meno che uso:

export PAGER='less -F -S -R -M -i'
export MANPAGER='less -R -M -i +Gg'
git config --global core.pager 'less -F -S -R -i'
#alias less='less -F -S -R -M -i'

Alla fine ho finito per scrivere un wrapper per conto mio.

#!/usr/local/bin/bash

# BSD/OSX compatibility
[[ $(type -p gsed) ]] && SED=$(type -p gsed) || SED=$(type -p sed)
CONTEXT=$(expand <&0)
[[ ${#CONTEXT} -eq 0 ]] && exit 0
CONTEXT_NONCOLOR=$( $SED -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[mGK]//g" <<< "$CONTEXT")
LINE_COUNT=$( (fold -w $(tput cols) | wc -l) <<< "$CONTEXT_NONCOLOR" )

[[ $LINE_COUNT -ge $(tput lines) ]] && less -+X -+S -R <<< "$CONTEXT" || echo "$CONTEXT"

Gli utenti BSD / OSX devono installare manualmente gnu-sed. L'incredibile regexp, che aiuta a rimuovere i codici colore, proviene da /programming//a/18000433/2487227

Ho salvato questo script in /usr/local/bin/pagere poigit config --global core.pager /usr/local/bin/pager

Il trattamento per i pazienti con DOC, evviva!


Non funzionerà se il tuo file ha delle linee a capo.
Thomas Dickey,

@ThomasDickey Ritengo che folddovrebbe gestirlo ... ma, sì, forse i bug ... potresti gentilmente fornire un esempio?
Frederick Zhang,

@ThomasDickey paste.kde.org/ph9vl7es5 questo ha funzionato per me
Frederick Zhang,

foldnon capisce davvero le schede. Potresti riuscire a ripararlo usando expand. Ciò non gestirà ancora le sequenze di escape incorporate (che spesso viene richiesto nel contesto di git).
Thomas Dickey,

1
le schede "funzionano" solo quando la larghezza del terminale è un multiplo dei punti di tabulazione. Quando ho provato questo, ho notato che foldnon regolava le linee avvolte usando gli spazi, ma ho semplicemente trovato il punto più vicino per tagliare. Quindi l'apparenza sarà fuorviante.
Thomas Dickey,

0

Uso il seguente wrapper come mio cercapersone. Non è elegante come l'altro wrapper mostrato qui (perché usa sempre less -Sper troncare le linee lunghe), ma è dannatamente semplice. Sembra funzionare abbastanza bene con iTerm2.

#!/bin/bash
set -e

text=$(</dev/stdin)
text_lines=$(echo "${text}" | wc -l)
term_lines=$(tput lines)

if [[ $text_lines -lt $term_lines ]]; then
    echo "${text}"
else
    echo "${text}" | less -S -R
fi
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.