Wie verwende ich "weniger -F" ohne "-X" und zeige trotzdem die Ausgabe an, wenn nur eine Seite?

11

Ich optimiere den Pager von Git, aber ich habe einige Probleme damit.

Was ich will ist:

  1. Immer farbige Ausgabe
  2. Scrollen mit Touchpad oder Maus
  3. Beenden Sie den Bildschirm

Und meine aktuelle Konfiguration ist:

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

Dies macht alles außer dem letzten.

Wenn ich jedoch entferne -+F, erfolgt bei einem Bildschirm keine Ausgabe. Wenn ich auch entferne -+X, ist die Ausgabe zurück, aber ich kann nicht per Touchpad hinein scrollen less.

Gibt es eine Problemumgehung, die alle oben genannten Anforderungen erfüllt?

Frederick Zhang
quelle
Dies ist eine sehr interessante Frage. Wenn ich benutze -F(beenden, wenn ein Bildschirm angezeigt wird), mache ich das immer in Kombination mit -X(Deaktivieren von Termcap Init und De-Init), aber wie Sie sagen, würde das Scrollen mit der Maus nicht zulassen. (Ich bezweifle, dass Scrollen überhaupt möglich ist -X.) Ich habe den Fragentitel geändert, kann ihn aber jederzeit zurücksetzen, wenn Sie der Meinung sind, dass er zu viel Bedeutung verliert. :)
Wildcard

Antworten:

8

AKTUALISIEREN

tl; dr Lösung: Upgrade auf weniger als 530

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

Geben Sie keine Terminal-Init-Sequenz aus, wenn Sie -F verwenden und die Datei auf einen Bildschirm passt.

Mit diesem Fix müssen wir uns also nicht einmal darum kümmern , ob -Xwir es alleine verwenden sollen, less -Fsondern kümmern uns nur darum.

PS. Einige andere weniger Konfigurationen, die ich benutze:

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'

Am Ende schrieb ich selbst einen Wrapper.

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

BSD / OSX-Benutzer sollten manuell installieren gnu-sed. Der erstaunliche reguläre Ausdruck, mit dem Farbcodes entfernt werden können, stammt von /programming//a/18000433/2487227

Ich habe dieses Skript in /usr/local/bin/pagerund dann gespeichertgit config --global core.pager /usr/local/bin/pager

Die Behandlung für Zwangsstörungen, Hurra!

Frederick Zhang
quelle
Es funktioniert nicht, wenn Ihre Datei Zeilen umbrochen hat.
Thomas Dickey
@ThomasDickey Ich denke, das foldsollte damit umgehen ... aber ja, Fehler vielleicht ... könnten Sie uns bitte ein Beispiel geben?
Frederick Zhang
@ ThomasDickey paste.kde.org/ph9vl7es5 dieses arbeitete für mich
Frederick Zhang
foldversteht Tabs nicht wirklich. Möglicherweise können Sie es mit reparieren expand. Damit werden eingebettete Escape-Sequenzen (die im Kontext von häufig angefordert werden) immer noch nicht behandelt git.
Thomas Dickey
1
Tabs "funktionieren" nur, wenn Ihre Terminalbreite ein Vielfaches der Tabulatoren ist. Als ich dies testete, bemerkte ich, dass foldumbrochene Linien nicht mit Leerzeichen angepasst wurden, sondern lediglich der nächstgelegene Punkt zum Hacken gefunden wurde. Das Erscheinungsbild wird also irreführend sein.
Thomas Dickey
0

Ich verwende den folgenden Wrapper als Pager. Es ist nicht so schick wie der andere hier gezeigte Wrapper (weil es immer less -Sdazu dient, lange Zeilen abzuschneiden), aber es ist verdammt einfach. Scheint ziemlich gut mit iTerm2 zu funktionieren.

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