Jestem na terminalu, który obsługuje alternatywny ekran, którego używa less, vim itp., Aby przywrócić poprzedni ekran po wyjściu. To fajna funkcja, ale naprawdę psuje --quit-if-one-screen
przełącznik, less
ponieważ w takim przypadku mniej przełącza się na alternatywny ekran, wyświetla jego dane, domyśla się, że jest tylko jeden ekran i wychodzi, zabierając ze sobą zawartość alternatywnego ekranu.
Często sugerowanym obejściem jest użycie --no-init
przełącznika, aby całkowicie uniknąć korzystania z alternatywnego ekranu. Jest to jednak dość brzydkie bo nie chcą go używać w przypadku mniej rzeczywiście działa jak pager. Dlatego szukam rozwiązania, aby użyć alternatywnego ekranu tylko wtedy, gdy less nie kończy się automatycznie.
Najczęściej używam tego jako pager Gita, więc skrypt powłoki, który działa mniej, na wypadek, gdyby było wystarczająco dużo danych wyjściowych, również byłby w porządku. Przynajmniej jeśli nie da się tego zrobić bez niego.
Odpowiedzi:
Ponieważ mniej 530 (wydanych w grudniu 2017 r.),
less --quit-if-one-screen
Nie przełącza się na alternatywny ekran, jeśli odczytuje mniej niż jeden ekran. Więc nie będziesz mieć tego problemu, jeśli twoja wersja less jest wystarczająco aktualna.We wcześniejszych wersjach mniej musi decydować, czy użyć alternatywnego ekranu podczas uruchamiania. Nie możesz odroczyć tego wyboru do momentu, w którym wygasa.
Możesz zadzwonić mniej, pozwolić użyć alternatywnego ekranu i przenieść zawartość na ekran główny, jeśli less kończy się automatycznie. Jednak nie znam sposobu na wykrycie automatycznego zakończenia.
Z drugiej strony, nie jest tak trudno wywołać cat dla krótkich danych wejściowych, a mniej dla większych danych wejściowych, nawet zachowując buforowanie, dzięki czemu nie musisz czekać, aż całe dane wejściowe zaczną widzieć mniej (bufor może być nieco większy - nic nie zobaczysz, dopóki nie będziesz mieć przynajmniej jednego ekranu danych - ale niewiele więcej).
Możesz zobaczyć linie na ekranie głównym, gdy się pojawią, i przełącz się na ekran alternatywny, jeśli linie spowodują przewijanie.
źródło
$n
)#!/bin/bash
skrypt, ponieważ używasz konstrukcji specyficznej dla bash, ponieważ jest to skrypt, który nie będzie działał na systemach (takich jak Ubuntu), gdzie/bin/sh
nie jest bash.less
może również (ale nie ma) opcjonalnego sposobu wyjścia z miejsca, w którym drukuje bieżącą zawartość ekranu po wysłaniu ciągu un-init. Możesz więc skorzystać z alternatywnego ekranu, który nie zaśmieca przewijania, ale po wyjściu pozostawia odpowiednią część strony podręcznika lub cokolwiek na terminalu.GNU less v. 530 zawiera łatkę Fedory, o której mowa w @ paul-antoine-arras, i nie będzie już wyświetlać sekwencji inicjalizacji terminala, gdy
--quit-if-one-screen
jest używana, a dane wejściowe mieszczą się na jednym ekranie.źródło
brew install less
i upewniając się, że$LESS
ma F i pomija X.W przypadku powolnych wejść, na przykład
git log -Gregex
, czy chcesz:A) wiersze, które pojawią się na ekranie głównym, gdy się pojawią, a następnie przełącz się na ekran alternatywny, gdy przewijanie jest potrzebne (więc pierwszy
$LINES
wynik zawsze będzie pojawiał się w przewijaniu); jeśli tak, przejdź do drugiej odpowiedzi Gillesa .B) linie do pojawienia się na alternatywnym ekranie, ale wyjdź z alternatywnego ekranu i wydrukuj linie na ekranie głównym, jeśli przewijanie okaże się niepotrzebne (więc przewijanie nie pojawi się, jeśli wymagane jest przewijanie); jeśli tak, użyj poniższego skryptu:
Jest
tee
to dane wejściowe do pliku tymczasowego, a poless
wyjściucat
jest to plik tymczasowy, jeśli zawiera mniej linii niż wysokość ekranu:Używaj go z
export PAGER='/path/to/script'
. To powinno wystarczyć, aby zgit
niego skorzystać, chyba że już go zastąpiłeścore.pager
.Aby zapoznać się z możliwymi ulepszeniami, zobacz także moją nieco bardziej rozwiniętą wersję tego skryptu pod adresem : https://github.com/johnmellor/scripts/blob/master/bin/least
źródło
Od dawna rozwiązano to w dystrybucjach opartych na Red Hat, modyfikując zachowanie opcji -F w
less
kodzie źródłowym: zobacz tę łatkę z Projektu Fedora, którego pierwsza wersja pochodzi z 2008 roku. Chodzi o to, aby uzyskać wysokość terminal (tj. maksymalna liczba wierszy, które mogą być wyświetlane jednocześnie) i aby pominąć sekwencje inicjalizacji i deinicjalizacji, gdy plik mieści się na jednym ekranie. Dlatego nie ma potrzeby używania opcji -X i opcji -F można używać konsekwentnie niezależnie od długości pliku.źródło