Comment utiliser «moins -F» sans «-X», mais toujours afficher la sortie si une seule page?

11

Je peaufine le pager de Git, mais j'ai des problèmes avec ça.

Ce que je veux c'est:

  1. Sortie toujours colorée
  2. Défilement par pavé tactile ou souris
  3. Quitter-si-un-écran

Et ma configuration actuelle est:

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

Cela fait tout sauf le dernier.

Mais, si je supprime -+F, il n'y aura pas de sortie en cas d'écran unique. Si je supprime -+Xégalement, la sortie est de retour mais je ne peux pas faire défiler le pavé tactile vers l'intérieur less.

Existe-t-il une solution de contournement pouvant répondre à toutes les exigences ci-dessus?

Frederick Zhang
la source
C'est une question très intéressante. Lorsque j'utilise -F(quitter si un écran), je le fais toujours en combinaison avec -X(désactiver termcap init et de-init), mais comme vous le dites, cela ne permettrait pas de faire défiler avec la souris. (Je doute que le défilement soit possible avec -X.) J'ai modifié le titre de la question, mais n'hésitez pas à revenir en arrière si vous pensez qu'il perd trop de sens. :)
Wildcard

Réponses:

8

MISE À JOUR

tl; dr Solution: passer à moins de 530

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

Ne pas sortir la séquence d'initialisation du terminal si vous utilisez -F et que le fichier tient sur un seul écran.

Donc, avec cette correction, nous n'avons même pas besoin de nous soucier de déterminer si nous devons l'utiliser -Xnous-mêmes, nous en prenons less -Fjuste soin.

PS. Quelques autres configurations moins que j'utilise:

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'

J'ai finalement fini par écrire moi-même un emballage.

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

Les utilisateurs BSD / OSX doivent installer manuellement gnu-sed. L'incroyable expression régulière, qui aide à supprimer les codes de couleur, est de /programming//a/18000433/2487227

J'ai enregistré ce script /usr/local/bin/pager, puisgit config --global core.pager /usr/local/bin/pager

Le traitement pour les patients TOC, hourra!

Frederick Zhang
la source
Cela ne fonctionnera pas si votre fichier contient des lignes encapsulées.
Thomas Dickey
@ThomasDickey Je pense que cela folddevrait gérer cela ... mais, oui, des bugs peut-être ... pourriez-vous bien vouloir fournir un exemple?
Frederick Zhang
@ThomasDickey paste.kde.org/ph9vl7es5 celui-ci a fonctionné pour moi
Frederick Zhang
foldne comprend pas vraiment les onglets. Vous pourrez peut-être le réparer en utilisant expand. Cela ne gérera toujours pas les séquences d'échappement intégrées (ce qui est souvent demandé dans le contexte de git).
Thomas Dickey
1
les tabulations ne "fonctionneront" que lorsque la largeur de votre terminal est un multiple des taquets de tabulation. Lorsque j'ai testé cela, j'ai remarqué que les foldlignes enveloppées n'étaient pas ajustées en utilisant des espaces, mais simplement trouvé le point le plus proche pour le découpage. Donc, l'apparence sera trompeuse.
Thomas Dickey
0

J'utilise le wrapper suivant comme téléavertisseur. Ce n'est pas aussi sophistiqué que l'autre wrapper montré ici (car il utilise toujours less -Spour tronquer les longues lignes), mais c'est sacrément simple. Semble fonctionner assez bien avec 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
superbatfish
la source