Comment puis-je garder le contenu que je lisais de l'homme après avoir arrêté?

24

Donc, nous utilisons man whateverpour obtenir l'utilisation et d'autres informations concernant la whatevercommande, lorsque la section d'informations pertinente est trouvée, je voudrais quitter la mancommande avec les informations laissées à l'écran. Je peux donc taper la commande suivante avec l'arbitre ci-dessus. Mais la mancommande quitte tout l'écran pour récupérer l'ancien écran similaire à vim. Existe-t-il un moyen d'y parvenir?

NathaneilCapital
la source
Toutes les suggestions sont bonnes, mais vous pouvez également ouvrir une deuxième fenêtre pour afficher la page de manuel. Et il y a probablement aussi des visualiseurs de pages de manuel GUI.
Barmar

Réponses:

38

Je crois que ce n'est pas tellement sur manlui-même mais plutôt sur votre pager de choix ( PAGERvariable d'environnement) combiné avec le terminal utilisé.

Je suppose que votre pager est probablement less(pager par défaut typique de nos jours et correspond à la description).

lessa une option -Xqui peut vous amener à un comportement dans le sens de ce que vous recherchez.

   -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.

Par exemple, PAGER="less -X" man manpourrait être utilisé pour le tester, et si vous trouvez ce comportement préférable, vous pourriez envisager de définir PAGERcette valeur de manière permanente.

Håkan Lindqvist
la source
Malheureusement, cela gâche l'historique du défilement.
musiKk
@musiKk Fonctionne très bien pour moi sur Ubuntu 16.04 avec un terminal unicode intelligent (pas la console Linux) et man 2.7.5
cat
3
@musiKk: si vous voulez pouvoir faire défiler la page de manuel après avoir quitté le pager, vous devez vous limiter à faire défiler la page de manuel (par lignes ou pages), pas l'accès aléatoire habituel.
Peter Cordes
1
Ou vous pouvez utiliser LESS=-X, pour éviter d'avoir à changer PAGER(je ne lui fais pas 100% confiance pour fonctionner dans tous les programmes avec un espace comme celui-ci, bien que cela fonctionne chez l'homme.)
Random832
11

Si vous utilisez moins votre téléavertisseur (ce qui est très courant), vous n'avez pas besoin de modifier votre téléavertisseur, faites simplement la redirection d'E / S:

man <whatever you want to man> | cat -

Cela imprimera une copie sur le terminal afin que vous puissiez faire défiler vers le haut lorsque vous en avez besoin.

Brennen Smith
la source
1
Un problème avec cette approche est qu'avec de longues pages de manuel, il peut être difficile de revenir à la partie qui vous intéresse et vous ne verrez pas à la fois cette partie et la ligne de commande actuelle.
jlliagre
Aucune des autres suggestions ne résout ce problème - elle est juste inhérente à une seule fenêtre de console. Mais cela dit, vous pouvez toujours écrire votre commande, faire défiler un peu et revenir à votre commande à moitié écrite.
Brennen Smith
Ma suggestion a définitivement surmonté ce problème. Vous quittez la commande man lorsque la page de manuel qui vous intéresse est à l'écran et vous pouvez taper votre commande avec cette page toujours visible sur le même écran.
jlliagre
2
-signifie standard dans mais catsuppose que de toute façon
loa_in_
1
C'est surtout pour la sémantique - j'aime toujours être explicite avec stdin.
Brennen Smith
5

Comme non seulement lessmais aussi d'autres applications de texte comme vimprésentent la même fonctionnalité extrêmement ennuyeuse, ce que je fais est simplement de supprimer la capacité du terminal à prendre en charge les commandes impliquées de la terminfobase de données.

Ces commandes sont smcupet rmcup, qui ont été conçues pour permettre l'activation et le déplacement où la cupcommande (position du curseur) était autorisée.

Voici une fonction shell que j'ai utilisée pour automatiser la tâche, elle fonctionne au moins avec Solaris et probablement la plupart des distributions Linux:

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}
  )
}

Si votre entrée de terminal ne revient pas xterm, vous devez la remplacer xtermpar le bon nom de terminal dans le script.

jlliagre
la source
1
Oui, mais cela interrompt les autres programmes (pas nécessairement les pagers ou les malédictions, mais les éditeurs de type readline, etc.)
cat
1
@cat Ce n'est pas que j'en ai vérifié un, mais je n'ai jamais remarqué de problème avec d'autres programmes après avoir utilisé cette solution. Avez-vous des exemples de programmes qui se comporteraient bizarrement? Je soupçonne également que s'ils échouent, c'est un problème de leur côté. Un émulateur de terminal n'est pas censé prendre en charge toutes les capacités terminfo disponibles. Il annonce simplement ceux qu'il prend en charge et c'est à l'application de s'en occuper.
jlliagre
3

Vous pouvez diriger la sortie vers la catcommande

man man|cat

ou utilisez-le à la place du pager par défaut, comme dans cet exemple qui invoque l'homme sur lui-même:

PAGER=cat man man
SimoneLazzaris
la source
2

Sans modifier le pager, une solution avec des canalisations pouvant fonctionner dans la plupart des environnements:

Exemples pour man ls

  • Laisser la page de manuel entière à l'écranman ls | cat
  • Lire une sortie homme paginée , avec la possibilité de la laisser à tout moment avec q :man ls | more
  • filtrer le contenu de l' homme avec un motif et garder les lignes correspondantes à l'écran:man ls | grep somestring
marcanuy
la source
-3

c'est 2016, il suffit d'ouvrir un deuxième terminal ou onglet ou fenêtre ou de lire l'homme en ligne ..

user362328
la source
Et c'est la solution pratique évidente.
Braiam
1
@Braiam Pas pratique si le terminal est sur l'écran du téléphone portable.
NathaneilCapital
@NathaneilCapital On dirait qu'il est temps d'apprendre tmux.
Michael Hampton
-3

Même sur mes serveurs (FreeBSD) j'installe X et xfce. Ensuite, j'alloue un grand tampon (par exemple 10 000 lignes) pour les émulateurs de terminal afin que je puisse entièrement faire défiler la page de manuel dans l'un d'eux et utiliser une instance de terminal distincte pour assembler la commande. Fonctionne un régal.

MMacD
la source