Jak używać „mniej -F” bez „-X”, ale nadal wyświetlać wyjście, jeśli tylko jedna strona?

11

Poprawiam pager Gita, ale mam z tym pewne problemy.

Chcę to:

  1. Zawsze kolorowe wydruki
  2. Przewijanie za pomocą touchpada lub myszy
  3. Quit-if-one-screen

A moja obecna konfiguracja to:

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

Robi to wszystko oprócz ostatniego.

Ale jeśli usunę -+F, nie będzie wyjścia w przypadku jednego ekranu. Jeśli -+Xrównież usunę, dane wyjściowe powrócą, ale nie mogę przewijać panelu dotykowego less.

Czy istnieje obejście, które może spełnić wszystkie powyższe wymagania?

Frederick Zhang
źródło
To bardzo interesujące pytanie. Kiedy używam -F(wychodzę, jeśli jeden ekran) zawsze robię to w połączeniu z -X(wyłącz termcap init i de-init), ale jak mówisz, nie pozwala to na przewijanie za pomocą myszy. (Wątpię, że przewijanie jest w ogóle możliwe -X). Zmodyfikowałem tytuł pytania, ale możesz go cofnąć, jeśli uważasz, że traci on zbyt duże znaczenie. :)
Wildcard,

Odpowiedzi:

8

AKTUALIZACJA

tl; dr Rozwiązanie: uaktualnij do mniej 530

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

Nie wysyłaj sekwencji inicjującej terminala, jeśli używasz -F i plik pasuje na jeden ekran.

Dzięki tej poprawce nie musimy nawet zawracać sobie głowy określeniem, czy korzystać -Xz niego samodzielnie, less -Fpo prostu się tym zajmuje.

PS. Niektóre inne mniej konfiguracje, których używam:

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'

W końcu sam napisałem opakowanie.

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

Użytkownicy BSD / OSX powinni zainstalować ręcznie gnu-sed. Niesamowite wyrażenie regularne, które pomaga usunąć kody kolorów, pochodzi z /programming//a/18000433/2487227

Zapisałem ten skrypt do /usr/local/bin/pagertego czasugit config --global core.pager /usr/local/bin/pager

Leczenie pacjentów z obsesyjno-kompulsyjną chorobą!

Frederick Zhang
źródło
Nie zadziała, jeśli plik ma zawijane linie.
Thomas Dickey,
@ThomasDickey Uważam, że foldpowinienem sobie z tym poradzić ... ale tak, może błędy ... czy mógłbyś proszę podać przykład?
Frederick Zhang,
@ThomasDickey paste.kde.org/ph9vl7es5 ten zadziałał dla mnie
Frederick Zhang,
foldtak naprawdę nie rozumie kart. Możesz go naprawić za pomocą expand. To nadal nie obsłuży osadzonych sekwencji ucieczki (o które często pyta się w kontekście git).
Thomas Dickey,
1
tabulatory będą „działać” tylko wtedy, gdy szerokość terminalu będzie wielokrotnością tabulatorów. Kiedy to przetestowałem, zauważyłem, że foldnie dostosowałem zawiniętych linii za pomocą spacji, ale po prostu znalazłem najbliższy punkt do cięcia. Wygląd będzie więc mylący.
Thomas Dickey,
0

Używam następującego opakowania jako mojego pagera. To nie jest tak fantazyjne, jak pokazane tutaj drugie opakowanie (ponieważ zawsze używa less -Sdo obcinania długich linii), ale jest cholernie proste. Wydaje się, że działa całkiem dobrze z 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
źródło