Jak mogę zachować treść, którą czytałem od człowieka po odejściu?

24

Używamy więc, man whateveraby uzyskać informacje o użyciu i inne informacje dotyczące whateverpolecenia, gdy zostanie znaleziona odpowiednia sekcja informacji, chciałbym zakończyć manpolecenie z informacją pozostawioną na ekranie. Mogę więc wpisać następne polecenie z sędzią powyżej. Ale manpolecenie zamyka cały ekran, aby odzyskać stary ekran podobny do vim. Czy istnieje sposób na osiągnięcie tego?

NathaneilCapital
źródło
Wszystkie sugestie są dobre, ale możesz także otworzyć drugie okno, aby wyświetlić stronę podręcznika. I prawdopodobnie są też przeglądarki stron man GUI.
Barmar

Odpowiedzi:

38

Uważam, że nie chodzi tu tyle o mansamą siebie, co raczej o wybrany pager ( PAGERzmienna środowiskowa) w połączeniu z używanym terminalem.

Domyślam się, że twój pager jest prawdopodobnie less(typowy domyślny pager obecnie i pasuje do opisu).

lessma opcję, -Xktóra może zapewnić ci zachowanie zgodne z tym, czego szukasz.

   -X or --no-init
          Disables sending the termcap initialization and deinitialization
          strings  to  the  terminal.   This is sometimes desirable if the
          deinitialization string does something unnecessary, like  clear‐
          ing the screen.

Np. PAGER="less -X" man manMożna go użyć do przetestowania, a jeśli uznasz, że takie zachowanie jest lepsze, możesz rozważyć ustawienie PAGERtej wartości na stałe.

Håkan Lindqvist
źródło
Niestety psuje historię przewijania.
musiKk
@musiKk Działa dla mnie dobrze na Ubuntu 16.04 z inteligentnym terminalem Unicode (nie konsolą Linuksa) i manem 2.7.5
cat
3
@musiKk: jeśli chcesz móc przewijać stronę podręcznika po wyjściu z pagera, musisz ograniczyć się do przewijania strony podręcznika (liniami lub stronami), a nie zwykłego losowego dostępu.
Peter Cordes
1
Lub możesz użyć LESS=-X, aby uniknąć konieczności zmiany PAGER(nie ufam w 100%, że zadziała we wszystkich programach z taką przestrzenią, chociaż działa na ludzi.)
Random832
11

Jeśli korzystasz z mniejszej ilości stronicowania (co jest bardzo powszechne), nie musisz zajmować się modyfikowaniem pagera, po prostu przekieruj I / O:

man <whatever you want to man> | cat -

Spowoduje to wydrukowanie kopii na terminalu, aby można było przewinąć w górę, gdy jej potrzebujesz.

Brennen Smith
źródło
1
Jednym z problemów związanych z tym podejściem jest to, że w przypadku długich stron podręcznika może być trudno przewinąć do interesującej Cię części i nie zobaczysz zarówno tej części, jak i bieżącego wiersza poleceń.
jlliagre
Żadna z pozostałych sugestii nie rozwiązuje tego problemu - jest po prostu nieodłącznym elementem pojedynczego okna konsoli. Ale po tym powiedziano, że zawsze możesz napisać polecenie, przewinąć nieco w górę, a przewinąć z powrotem do połowy napisanego polecenia.
Brennen Smith
Moja sugestia zdecydowanie rozwiązuje ten problem. Opuszczasz polecenie man, gdy interesująca Cię strona podręcznika znajduje się na ekranie, i możesz wpisać polecenie z tą stroną wciąż widoczną na tym samym ekranie.
jlliagre
2
-oznacza standard, ale catzakłada, że ​​tak czy inaczej
loa_in_
1
Dotyczy to głównie semantyki - zawsze lubię wyrażać się wprost na stdin.
Brennen Smith
5

Ponieważ nie tylko lessinne aplikacje tekstowe, takie jak ta, vimwykazują tę samą irytującą funkcję, to po prostu usuwam zdolność terminalu do obsługi danych poleceń z terminfobazy danych.

Te polecenia są smcupi rmcup, które zostały zaprojektowane, aby umożliwić włączanie i ruch, w którym cuppolecenie (pozycja kursora) było dozwolone.

Oto funkcja powłoki, której użyłem do automatyzacji zadania, działa ona przynajmniej w systemie Solaris i prawdopodobnie w większości dystrybucji Linuksa:

fixterminfo()
{
  (
    [[ ! -d /tmp/terminfo ]] && { mkdir /tmp/terminfo || return ; }
    cd /tmp/terminfo || return
    TERM=xterm infocmp > xterm.src.org
    sed -e 's/rmcup=[^,]*,//'  -e 's/smcup=[^,]*,//' xterm.src.org > xterm.src
    if diff xterm.src.org xterm.src
    then
      echo xterm terminfo already patched
      return
    fi
    TERMINFO=/tmp/terminfo tic xterm.src
    if [ -f /usr/share/lib/terminfo/x/xterm ] ; then
      XTERM=/usr/share/lib/terminfo/x/xterm
    else
      if [ -f /lib/terminfo/x/xterm ] ; then
        XTERM=/lib/terminfo/x/xterm
      else
        if [ -f /usr/share/terminfo/x/xterm ] ; then
          XTERM=/usr/share/terminfo/x/xterm
        else
          echo xterm terminfo not found ; return
        fi
      fi
    fi
    if [ ! -f ${XTERM}.org ]
    then
      sudo cp ${XTERM} ${XTERM}.org || return
    fi
    cat /tmp/terminfo/x/xterm | sudo dd of=${XTERM}
  )
}

Jeśli pozycja terminala nie jest zastępcza xterm, powinieneś zastąpić xtermwłaściwą nazwą terminala w skrypcie.

jlliagre
źródło
1
Tak, ale potem psuje to inne programy (niekoniecznie pagery lub przekleństwa, ale edytory podobne do readline itp.)
cat
1
@cat Nie sprawdziłem żadnego z nich, ale nigdy nie zauważyłem problemów z innymi programami po użyciu tego obejścia. Czy masz przykłady programów, które zachowywałyby się dziwnie? Podejrzewam też, że jeśli zawiodą, to jest ich problem. Emulator terminala nie powinien obsługiwać wszystkich dostępnych możliwości terminfo. Po prostu reklamuje, które obsługuje i zależy od aplikacji, aby sobie z tym poradzić.
jlliagre
3

Możesz przesłać dane wyjściowe do catpolecenia

man man|cat

lub użyj go zamiast domyślnego pagera, jak w tym przykładzie, który wywołuje człowieka na sobie:

PAGER=cat man man
SimoneLazzaris
źródło
2

Bez modyfikacji pagera, rozwiązanie z rurami, które może działać w większości środowisk:

Przykłady dla man ls

  • Zostaw całego człowieka stronę na ekranieman ls | cat
  • Czytaj stronicowane wyjście mana , z możliwością pozostawienia go w dowolnym momencie za pomocą q :man ls | more
  • filtruj zawartość człowieka za pomocą wzorca i utrzymuj pasujące linie na ekranie:man ls | grep somestring
marcanuy
źródło
-3

jest 2016, wystarczy otworzyć drugi terminal, kartę lub okno albo przeczytać człowieka online ..

użytkownik362328
źródło
I to jest oczywiste praktyczne rozwiązanie.
Braiam
1
@Braiam Niepraktyczne, jeśli terminal znajduje się na ekranie telefonu komórkowego.
NathaneilCapital
@NathaneilCapital Brzmi jak pora na naukę tmux.
Michael Hampton
-3

Nawet na moich serwerach (FreeBSD) instaluję X i Xfce. Następnie przydzielam duży bufor (np. 10 000 wierszy) dla emulatorów terminali, dzięki czemu mogę w pełni przewinąć stronę podręcznika w jednym z nich i użyć osobnej instancji terminala do złożenia polecenia. Działa uczta.

MMacD
źródło